mapped a D-Pad button

pull/14/head
sezanzeb 4 years ago
parent 0757b4a4e8
commit ebe0115ad0

@ -689,7 +689,7 @@
"Shift_L", "Shift_R" "Shift_L", "Shift_R"
"Alt_L", "Alt_R" "Alt_L", "Alt_R"
"Control_R" "Control_R"
"Mouse_1" - "Mouse_5"</property> "BTN_LEFT"</property>
<property name="margin_top">5</property> <property name="margin_top">5</property>
<property name="margin_bottom">5</property> <property name="margin_bottom">5</property>
<property name="label" translatable="yes">Mapping</property> <property name="label" translatable="yes">Mapping</property>

@ -45,7 +45,6 @@ JOYSTICK = [
def _write(device, ev_type, keycode, value): def _write(device, ev_type, keycode, value):
"""Inject.""" """Inject."""
print('move mouse', ev_type, keycode, value)
device.write(ev_type, keycode, value) device.write(ev_type, keycode, value)
device.syn() device.syn()

@ -202,10 +202,13 @@ class KeycodeInjector:
if len(self.mapping) > 0 and capabilities.get(ecodes.EV_KEY) is None: if len(self.mapping) > 0 and capabilities.get(ecodes.EV_KEY) is None:
capabilities[ecodes.EV_KEY] = [] capabilities[ecodes.EV_KEY] = []
for (ev_type, _), character in self.mapping: for (ev_type, keycode), character in self.mapping:
if not should_map_event_as_btn(ev_type, keycode):
continue
keycode = system_mapping.get(character) keycode = system_mapping.get(character)
if keycode is not None: if keycode is not None:
capabilities[ev_type].append(keycode - KEYCODE_OFFSET) capabilities[EV_KEY].append(keycode - KEYCODE_OFFSET)
if abs_to_rel: if abs_to_rel:
del capabilities[ecodes.EV_ABS] del capabilities[ecodes.EV_ABS]
@ -215,6 +218,12 @@ class KeycodeInjector:
# for my system to recognize it as mouse, WHEEL is also needed: # for my system to recognize it as mouse, WHEEL is also needed:
evdev.ecodes.REL_WHEEL, evdev.ecodes.REL_WHEEL,
] ]
if capabilities.get(ecodes.EV_KEY) is None:
capabilities[ecodes.EV_KEY] = []
# for reasons I don't know, it is required to have a capability
# for any keyboard key present to enable mouse movements.
# TODO test
capabilities[ecodes.EV_KEY].append(ecodes.KEY_0)
# just like what python-evdev does in from_device # just like what python-evdev does in from_device
if ecodes.EV_SYN in capabilities: if ecodes.EV_SYN in capabilities:
@ -222,8 +231,6 @@ class KeycodeInjector:
if ecodes.EV_FF in capabilities: if ecodes.EV_FF in capabilities:
del capabilities[ecodes.EV_FF] del capabilities[ecodes.EV_FF]
print(capabilities)
return capabilities return capabilities
async def _msg_listener(self, loop): async def _msg_listener(self, loop):
@ -363,7 +370,7 @@ class KeycodeInjector:
self.abs_state[1] = event.value self.abs_state[1] = event.value
continue continue
if should_map_event_as_btn(event): if should_map_event_as_btn(event.type, event.code):
handle_keycode(code_code_mapping, macros, event, uinput) handle_keycode(code_code_mapping, macros, event, uinput)
continue continue

@ -30,7 +30,7 @@ from keymapper.logger import logger
from keymapper.state import KEYCODE_OFFSET from keymapper.state import KEYCODE_OFFSET
def should_map_event_as_btn(event): def should_map_event_as_btn(type, code):
"""Does this event describe a button. """Does this event describe a button.
Especially important for gamepad events, some of the buttons Especially important for gamepad events, some of the buttons
@ -38,13 +38,16 @@ def should_map_event_as_btn(event):
Parameters Parameters
---------- ----------
event : evdev.events.InputEvent type : int
one of evdev.events
code : int
linux keycode
""" """
# TODO test # TODO test
if event.type == evdev.events.EV_KEY: if type == evdev.events.EV_KEY:
return True return True
if event.type == evdev.events.EV_ABS and event.code > 5: if type == evdev.events.EV_ABS and code > 5:
# 1 - 5 seem to be joystick events # 1 - 5 seem to be joystick events
return True return True
@ -67,6 +70,7 @@ def handle_keycode(code_code_mapping, macros, event, uinput):
return return
input_keycode = event.code input_keycode = event.code
input_type = event.type
# for logging purposes. It should log the same keycode as xev and gtk, # for logging purposes. It should log the same keycode as xev and gtk,
# which is also displayed in the UI. # which is also displayed in the UI.
@ -89,8 +93,9 @@ def handle_keycode(code_code_mapping, macros, event, uinput):
if input_keycode in code_code_mapping: if input_keycode in code_code_mapping:
target_keycode = code_code_mapping[input_keycode] target_keycode = code_code_mapping[input_keycode]
target_type = evdev.events.EV_KEY
logger.spam( logger.spam(
'got code:%s value:%s event:%s, maps to code:%s', 'got code:%s value:%s event:%s, maps to EV_KEY:%s',
xkb_keycode, xkb_keycode,
event.value, event.value,
evdev.ecodes.EV[event.type], evdev.ecodes.EV[event.type],
@ -103,7 +108,8 @@ def handle_keycode(code_code_mapping, macros, event, uinput):
event.value, event.value,
) )
target_keycode = input_keycode target_keycode = input_keycode
target_type = input_type
print('write', event.type, target_keycode, event.value) print('write', target_type, target_keycode, event.value)
uinput.write(event.type, target_keycode, event.value) uinput.write(target_type, target_keycode, event.value)
uinput.syn() uinput.syn()

@ -111,7 +111,7 @@ class _KeycodeReader:
# TODO write a test to map event `type 3 (EV_ABS), code 16 # TODO write a test to map event `type 3 (EV_ABS), code 16
# (ABS_HAT0X), value 0` to a button # (ABS_HAT0X), value 0` to a button
if should_map_event_as_btn(event): if should_map_event_as_btn(event.type, event.code):
logger.spam( logger.spam(
'got code:%s value:%s type:%s', 'got code:%s value:%s type:%s',
event.code + KEYCODE_OFFSET, event.code + KEYCODE_OFFSET,

@ -27,8 +27,6 @@ gi.require_version('Gtk', '3.0')
gi.require_version('GLib', '2.0') gi.require_version('GLib', '2.0')
from gi.repository import Gtk, GLib from gi.repository import Gtk, GLib
from evdev.ecodes import EV_KEY
from keymapper.state import custom_mapping from keymapper.state import custom_mapping
from keymapper.logger import logger from keymapper.logger import logger
@ -36,6 +34,11 @@ from keymapper.logger import logger
CTX_KEYCODE = 2 CTX_KEYCODE = 2
# TODO display the constant name instead of numbers.
# displaying the event type won't be needed anymore then.
# and the whole offset thing probably drops away
class Row(Gtk.ListBoxRow): class Row(Gtk.ListBoxRow):
"""A single, configurable key mapping.""" """A single, configurable key mapping."""
__gtype_name__ = 'ListBoxRow' __gtype_name__ = 'ListBoxRow'

Loading…
Cancel
Save