#197 Using timeouts for calls to the daemon in key-mapper-control

xkb
sezanzeb 3 years ago
parent f9e7ef1445
commit 1d79ad369b

@ -133,10 +133,12 @@ def communicate(options, daemon):
# if device was specified, autoload for that one. if None autoload
# for all devices.
if options.device is None:
daemon.autoload()
# timeout is not documented, for more info see
# https://github.com/LEW21/pydbus/blob/master/pydbus/proxy_method.py
daemon.autoload(timeout=10)
else:
group = require_group()
daemon.autoload_single(group.key)
daemon.autoload_single(group.key, timeout=2)
if options.command == START:
group = require_group()

@ -0,0 +1,7 @@
# helpful commands:
# udevadm monitor --property
# udevadm info --query=all --name=/dev/input/event3
# to test changes:
# sudo udevadm control --reload-rules
# journalctl -f
ACTION=="add", SUBSYSTEM=="input", RUN+="/bin/key-mapper-control --command autoload --device $env{DEVNAME}"

@ -1,3 +0,0 @@
# udevadm monitor --property
# udevadm info --query=all --name=/dev/input/event3
ACTION=="add", SUBSYSTEM=="input", RUN+="/bin/key-mapper-control --command autoload --device $env{DEVNAME}"

@ -98,6 +98,19 @@ class AutoloadHistory:
return False
def remove_timeout(func):
"""Remove timeout to ensure the call works if the daemon is not a proxy."""
# the timeout kwarg is a feature of pydbus. This is needed to make tests work
# that create a Daemon by calling its constructor instead of using pydbus.
def wrapped(*args, **kwargs):
if "timeout" in kwargs:
del kwargs["timeout"]
return func(*args, **kwargs)
return wrapped
class Daemon:
"""Starts injecting keycodes based on the configuration.
@ -150,7 +163,7 @@ class Daemon:
self.config_dir = None
if USER != 'root':
if USER != "root":
self.set_config_dir(get_config_path())
self.autoload_history = AutoloadHistory()
@ -326,6 +339,7 @@ class Daemon:
self.start_injecting(group.key, preset)
self.autoload_history.remember(group.key, preset)
@remove_timeout
def autoload_single(self, group_key):
"""Inject the configured autoload preset for the device.
@ -353,6 +367,7 @@ class Daemon:
self._autoload(group_key)
@remove_timeout
def autoload(self):
"""Load all autoloaded presets for the current config_dir.

@ -409,15 +409,19 @@ class Injector(multiprocessing.Process):
# stopped event loop most likely
pass
except OSError as error:
logger.error(str(error))
logger.error("Failed to run injector coroutines: %s", str(error))
if len(coroutines) > 0:
# expected when stop_injecting is called,
# during normal operation as well as tests this point is not
# reached otherwise.
logger.debug("asyncio coroutines ended")
logger.debug("Injector coroutines ended")
for source in sources:
# ungrab at the end to make the next injection process not fail
# its grabs
source.ungrab()
try:
source.ungrab()
except OSError as error:
# it might have disappeared
logger.debug("OSError for ungrab on %s: %s", source.path, str(error))

@ -17,7 +17,7 @@
<text x="22.0" y="14">pylint</text>
</g>
<g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="11">
<text x="63.0" y="15" fill="#010101" fill-opacity=".3">9.65</text>
<text x="62.0" y="14">9.65</text>
<text x="63.0" y="15" fill="#010101" fill-opacity=".3">9.66</text>
<text x="62.0" y="14">9.66</text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

@ -113,7 +113,7 @@ setup(
('/usr/lib/systemd/system', ['data/key-mapper.service']),
('/etc/dbus-1/system.d/', ['data/keymapper.Control.conf']),
('/etc/xdg/autostart/', ['data/key-mapper-autoload.desktop']),
('/usr/lib/udev/rules.d', ['data/key-mapper.rules']),
('/usr/lib/udev/rules.d', ['data/99-key-mapper.rules']),
('/usr/bin/', ['bin/key-mapper-gtk']),
('/usr/bin/', ['bin/key-mapper-service']),
('/usr/bin/', ['bin/key-mapper-control']),

@ -222,15 +222,15 @@ class TestDaemon(unittest.TestCase):
self.assertEqual(event.value, 1)
def test_config_dir(self):
config.set('foo', 'bar')
self.assertEqual(config.get('foo'), 'bar')
config.set("foo", "bar")
self.assertEqual(config.get("foo"), "bar")
# freshly loads the config and therefore removes the previosly added key.
# This is important so that if the service is started via sudo or pkexec
# it knows where to look for configuration files.
self.daemon = Daemon()
self.assertEqual(self.daemon.config_dir, get_config_path())
self.assertIsNone(config.get('foo'))
self.assertIsNone(config.get("foo"))
def test_refresh_on_start(self):
if os.path.exists(get_config_path("xmodmap.json")):

Loading…
Cancel
Save