started working on the daemon
parent
437cb533aa
commit
7f1d26aee7
@ -0,0 +1,78 @@
|
||||
#!/usr/bin/python3
|
||||
# -*- coding: utf-8 -*-
|
||||
# key-mapper - GUI for device specific keyboard mappings
|
||||
# Copyright (C) 2020 sezanzeb <proxima@hip70890b.de>
|
||||
#
|
||||
# This file is part of key-mapper.
|
||||
#
|
||||
# key-mapper is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# key-mapper is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with key-mapper. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
|
||||
"""Starts injecting keycodes based on the configuration."""
|
||||
|
||||
|
||||
from dbus import service
|
||||
import dbus.mainloop.glib
|
||||
|
||||
from keymapper.logger import logger
|
||||
from keymapper.config import config
|
||||
from keymapper.injector import KeycodeInjector
|
||||
from keymapper.mapping import Mapping
|
||||
|
||||
|
||||
class Daemon(service.Object):
|
||||
def __init__(self, *args, **kwargs):
|
||||
"""Constructs the daemon. You still need to run the GLib mainloop."""
|
||||
self.injectors = {}
|
||||
for device, preset in config.iterate_autoload_presets():
|
||||
mapping = Mapping()
|
||||
mapping.load(device, preset)
|
||||
self.injectors[device] = KeycodeInjector(device, mapping)
|
||||
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
@dbus.service.method(
|
||||
'com.keymapper.control',
|
||||
in_signature='s'
|
||||
)
|
||||
def stop_injecting(self, device):
|
||||
"""Stop injecting the mapping for a single device."""
|
||||
if self.injectors.get(device) is None:
|
||||
logger.error('No injector running for device %s', device)
|
||||
return
|
||||
|
||||
self.injectors[device].stop_injecting()
|
||||
|
||||
# TODO if ss is the correct signature for multiple parameters, add an
|
||||
# example to https://gitlab.freedesktop.org/dbus/dbus-python/-/blob/master/doc/tutorial.txt # noqa
|
||||
@dbus.service.method(
|
||||
'com.keymapper.control',
|
||||
in_signature='ss'
|
||||
)
|
||||
def start_injecting(self, device, preset):
|
||||
"""Start injecting the preset for the device."""
|
||||
if self.injectors.get(device) is not None:
|
||||
self.injectors[device].stop_injecting()
|
||||
|
||||
mapping = Mapping()
|
||||
mapping.load(device, preset)
|
||||
self.injectors[device] = KeycodeInjector(device, mapping)
|
||||
|
||||
@dbus.service.method(
|
||||
'com.keymapper.control'
|
||||
)
|
||||
def stop(self):
|
||||
"""Properly stop the daemon."""
|
||||
for injector in self.injectors.values():
|
||||
injector.stop_injecting()
|
@ -0,0 +1,91 @@
|
||||
#!/usr/bin/python3
|
||||
# -*- coding: utf-8 -*-
|
||||
# key-mapper - GUI for device specific keyboard mappings
|
||||
# Copyright (C) 2020 sezanzeb <proxima@hip70890b.de>
|
||||
#
|
||||
# This file is part of key-mapper.
|
||||
#
|
||||
# key-mapper is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# key-mapper is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with key-mapper. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
|
||||
import unittest
|
||||
import time
|
||||
|
||||
import evdev
|
||||
|
||||
from keymapper.state import custom_mapping, system_mapping
|
||||
from keymapper.config import config
|
||||
from keymapper.daemon import Daemon
|
||||
|
||||
from test import uinput_write_history_pipe, Event, pending_events
|
||||
|
||||
|
||||
class TestDaemon(unittest.TestCase):
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
cls.grab = evdev.InputDevice.grab
|
||||
cls.daemon = None
|
||||
|
||||
def tearDown(self):
|
||||
# avoid race conditions with other tests, daemon may run processes
|
||||
if self.daemon is not None:
|
||||
self.daemon.stop()
|
||||
self.daemon = None
|
||||
evdev.InputDevice.grab = self.grab
|
||||
|
||||
def test_daemon(self):
|
||||
custom_mapping.change(9, 'a')
|
||||
# one mapping that is unknown in the system_mapping on purpose
|
||||
custom_mapping.change(10, 'b')
|
||||
|
||||
system_mapping.empty()
|
||||
system_mapping.change(100, 'a')
|
||||
|
||||
custom_mapping.save('device 2', 'foo')
|
||||
config.set_autoload_preset('device 2', 'foo')
|
||||
|
||||
pending_events['device 2'] = [
|
||||
Event(evdev.events.EV_KEY, 1, 0),
|
||||
Event(evdev.events.EV_KEY, 1, 1),
|
||||
# ignored because unknown to the system
|
||||
Event(evdev.events.EV_KEY, 2, 0),
|
||||
Event(evdev.events.EV_KEY, 2, 1),
|
||||
# just pass those over without modifying
|
||||
Event(3124, 3564, 6542),
|
||||
]
|
||||
|
||||
self.daemon = Daemon()
|
||||
|
||||
time.sleep(0.5)
|
||||
|
||||
write_history = []
|
||||
pipe = uinput_write_history_pipe[0]
|
||||
while pipe.poll():
|
||||
write_history.append(pipe.recv())
|
||||
|
||||
self.assertEqual(write_history[0].type, evdev.events.EV_KEY)
|
||||
self.assertEqual(write_history[0].code, 92)
|
||||
self.assertEqual(write_history[0].value, 0)
|
||||
|
||||
self.assertEqual(write_history[1].type, evdev.events.EV_KEY)
|
||||
self.assertEqual(write_history[1].code, 92)
|
||||
self.assertEqual(write_history[1].value, 1)
|
||||
|
||||
self.assertEqual(write_history[2].type, 3124)
|
||||
self.assertEqual(write_history[2].code, 3564)
|
||||
self.assertEqual(write_history[2].value, 6542)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
Loading…
Reference in New Issue