diff --git a/keymapper/reader.py b/keymapper/reader.py index a8e5cf6b..84041b5b 100644 --- a/keymapper/reader.py +++ b/keymapper/reader.py @@ -28,7 +28,7 @@ from keymapper.logger import logger from keymapper.getdevices import get_devices -class KeycodeReader: +class _KeycodeReader: """Keeps reading keycodes in the background for the UI to use. When a button was pressed, the newest keycode can be obtained from this @@ -73,6 +73,12 @@ class KeycodeReader: event = virtual_device.read_one() if event is None: break + + logger.spam( + 'got code:%s value:%s', + event.code + 8, event.value + ) + if event.type == evdev.ecodes.EV_KEY and event.value == 1: # value: 1 for down, 0 for up, 2 for hold. # this happens to report key codes that are 8 lower @@ -81,4 +87,4 @@ class KeycodeReader: return newest_keycode -keycode_reader = KeycodeReader() +keycode_reader = _KeycodeReader() diff --git a/tests/testcases/injector.py b/tests/testcases/injector.py index 52b63d6f..d898292e 100644 --- a/tests/testcases/injector.py +++ b/tests/testcases/injector.py @@ -53,6 +53,7 @@ class TestInjector(unittest.TestCase): self.injector.stop_injecting() self.injector = None evdev.InputDevice.grab = self.grab + pending_events['device 2'] = [] def test_modify_capabilities(self): class FakeDevice: @@ -99,10 +100,9 @@ class TestInjector(unittest.TestCase): self.assertEqual(before, is_numlock_on()) def test_injector_constructor(self): - global pending_events # this buys some time to test if the process is alive. 2 (20ms) would # already be enough - pending_events['device 2'] = [Event(1, 1, 1)] * 10 + pending_events['device 2'] = [Event(1, 31, 1)] * 10 injector2 = None try: diff --git a/tests/testcases/reader.py b/tests/testcases/reader.py new file mode 100644 index 00000000..bfe57f7f --- /dev/null +++ b/tests/testcases/reader.py @@ -0,0 +1,81 @@ +#!/usr/bin/python3 +# -*- coding: utf-8 -*- +# key-mapper - GUI for device specific keyboard mappings +# Copyright (C) 2020 sezanzeb +# +# 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 . + + +import unittest + +import evdev + +from keymapper.reader import keycode_reader + +from test import Event, pending_events + + +CODE_1 = 100 +CODE_2 = 101 +CODE_3 = 102 + + +class TestReader(unittest.TestCase): + def tearDown(self): + keycode_reader.clear() + + def test_reading(self): + keycode_reader.start_reading('device 1') + pending_events['device 1'] = [ + Event(evdev.events.EV_KEY, CODE_1, 1), + Event(evdev.events.EV_KEY, CODE_2, 1), + Event(evdev.events.EV_KEY, CODE_3, 1) + ] + self.assertEqual(keycode_reader.read(), CODE_3 + 8) + self.assertIsNone(keycode_reader.read()) + + def test_specific_device(self): + keycode_reader.start_reading('device 2') + pending_events['device 1'] = [ + Event(evdev.events.EV_KEY, CODE_1, 1), + Event(evdev.events.EV_KEY, CODE_2, 1), + Event(evdev.events.EV_KEY, CODE_3, 1) + ] + self.assertIsNone(keycode_reader.read()) + + def test_clear(self): + keycode_reader.start_reading('device 1') + pending_events['device 1'] = [ + Event(evdev.events.EV_KEY, CODE_1, 1), + Event(evdev.events.EV_KEY, CODE_2, 1), + Event(evdev.events.EV_KEY, CODE_3, 1) + ] + keycode_reader.clear() + self.assertIsNone(keycode_reader.read()) + + def test_switch_device(self): + keycode_reader.start_reading('device 2') + pending_events['device 2'] = [Event(evdev.events.EV_KEY, CODE_1, 1)] + + keycode_reader.start_reading('device 1') + pending_events['device 1'] = [Event(evdev.events.EV_KEY, CODE_3, 1)] + + self.assertEqual(keycode_reader.read(), CODE_3 + 8) + self.assertIsNone(keycode_reader.read()) + + +if __name__ == "__main__": + unittest.main()