diff --git a/bin/key-mapper-service b/bin/key-mapper-service index 2635e715..326f40d9 100755 --- a/bin/key-mapper-service +++ b/bin/key-mapper-service @@ -32,7 +32,7 @@ from gi.repository import GLib from pydbus import SessionBus from keymapper.logger import update_verbosity, log_info, \ - add_filehandler + add_filehandler, logger from keymapper.daemon import Daemon, BUS_NAME from keymapper.dev.permissions import can_read_devices @@ -61,8 +61,15 @@ if __name__ == '__main__': bus = SessionBus() loop = GLib.MainLoop() - daemon = Daemon(True, loop) - bus.publish(BUS_NAME, daemon) + daemon = Daemon(loop) + + try: + bus.publish(BUS_NAME, daemon) + except RuntimeError: + logger.error('The service is already running') + sys.exit(1) + + daemon.autoload() atexit.register(lambda: daemon.stop(True)) diff --git a/keymapper/daemon.py b/keymapper/daemon.py index 04ea0933..ad2cd1aa 100644 --- a/keymapper/daemon.py +++ b/keymapper/daemon.py @@ -26,6 +26,7 @@ https://github.com/LEW21/pydbus/tree/cc407c8b1d25b7e28a6d661a29f9e661b1c9b964/ex import subprocess +import sys from pydbus import SessionBus @@ -54,7 +55,7 @@ def get_dbus_interface(): 'The daemon "key-mapper-service" is not running, mapping keys ' 'only works as long as the window is open.' ) - return Daemon(autoload=False) + return Daemon() bus = SessionBus() interface = bus.get(BUS_NAME) @@ -99,21 +100,23 @@ class Daemon: """ - def __init__(self, autoload=True, loop=None): + def __init__(self, loop=None): """Constructs the daemon. You still need to run the GLib mainloop.""" logger.debug('Creating daemon') self.injectors = {} self.loop = loop - if autoload: - for device, preset in config.iterate_autoload_presets(): - mapping = Mapping() - mapping.load(device, preset) - try: - injector = KeycodeInjector(device, mapping) - injector.start_injecting() - self.injectors[device] = injector - except OSError as error: - logger.error(error) + + def autoload(self): + """Runs all autoloaded presets.""" + for device, preset in config.iterate_autoload_presets(): + mapping = Mapping() + mapping.load(device, preset) + try: + injector = KeycodeInjector(device, mapping) + injector.start_injecting() + self.injectors[device] = injector + except OSError as error: + logger.error(error) def stop_injecting(self, device): """Stop injecting the mapping for a single device.""" diff --git a/keymapper/gtk/window.py b/keymapper/gtk/window.py index dabddd08..cb9c6161 100755 --- a/keymapper/gtk/window.py +++ b/keymapper/gtk/window.py @@ -136,9 +136,7 @@ class Window: GLib.source_remove(timeout) self.timeouts = [] keycode_reader.stop_reading() - self.window.destroy() - gtk_iteration() - sys.exit(0) + Gtk.main_quit() def check_add_row(self): """Ensure that one empty row is available at all times.""" diff --git a/tests/testcases/test_daemon.py b/tests/testcases/test_daemon.py index 9d0bd7e5..700ddcf3 100644 --- a/tests/testcases/test_daemon.py +++ b/tests/testcases/test_daemon.py @@ -101,7 +101,7 @@ class TestDaemon(unittest.TestCase): ] self.daemon = Daemon() - # starts mapping right after creation + self.daemon.autoload() self.assertTrue(self.daemon.is_injecting('device 2')) self.assertFalse(self.daemon.is_injecting('device 1'))