mirror of
https://github.com/brl/mutter.git
synced 2024-11-25 09:30:45 -05:00
virtual-input/evdev: Translate from button codes internal to evdev
Sending button events to a ClutterVirtualInputDevice, the API expects button codes to be of the internal clutter type. The evdev implementation incorrectly assumed it was already prepared evdev event codes, which was not the case. Fix the evdev implementation to translate from the internal representation to evdev before passing it along to ClutterSeatEvdev.
This commit is contained in:
parent
6d7bbeddd7
commit
b9614f0797
@ -185,6 +185,22 @@ clutter_virtual_input_device_evdev_notify_absolute_motion (ClutterVirtualInputDe
|
|||||||
NULL);
|
NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
translate_to_evdev_button (int button)
|
||||||
|
{
|
||||||
|
switch (button)
|
||||||
|
{
|
||||||
|
case CLUTTER_BUTTON_PRIMARY:
|
||||||
|
return BTN_LEFT;
|
||||||
|
case CLUTTER_BUTTON_SECONDARY:
|
||||||
|
return BTN_RIGHT;
|
||||||
|
case CLUTTER_BUTTON_MIDDLE:
|
||||||
|
return BTN_MIDDLE;
|
||||||
|
default:
|
||||||
|
return button + (BTN_LEFT - 1) - 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
clutter_virtual_input_device_evdev_notify_button (ClutterVirtualInputDevice *virtual_device,
|
clutter_virtual_input_device_evdev_notify_button (ClutterVirtualInputDevice *virtual_device,
|
||||||
uint64_t time_us,
|
uint64_t time_us,
|
||||||
@ -194,30 +210,33 @@ clutter_virtual_input_device_evdev_notify_button (ClutterVirtualInputDevice *vir
|
|||||||
ClutterVirtualInputDeviceEvdev *virtual_evdev =
|
ClutterVirtualInputDeviceEvdev *virtual_evdev =
|
||||||
CLUTTER_VIRTUAL_INPUT_DEVICE_EVDEV (virtual_device);
|
CLUTTER_VIRTUAL_INPUT_DEVICE_EVDEV (virtual_device);
|
||||||
int button_count;
|
int button_count;
|
||||||
|
int evdev_button;
|
||||||
|
|
||||||
if (time_us == CLUTTER_CURRENT_TIME)
|
if (time_us == CLUTTER_CURRENT_TIME)
|
||||||
time_us = g_get_monotonic_time ();
|
time_us = g_get_monotonic_time ();
|
||||||
|
|
||||||
if (get_button_type (button) != EVDEV_BUTTON_TYPE_BUTTON)
|
evdev_button = translate_to_evdev_button (button);
|
||||||
|
|
||||||
|
if (get_button_type (evdev_button) != EVDEV_BUTTON_TYPE_BUTTON)
|
||||||
{
|
{
|
||||||
g_warning ("Unknown/invalid virtual device button 0x%x pressed",
|
g_warning ("Unknown/invalid virtual device button 0x%x pressed",
|
||||||
button);
|
evdev_button);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
button_count = update_button_count (virtual_evdev, button, button_state);
|
button_count = update_button_count (virtual_evdev, evdev_button, button_state);
|
||||||
if (button_count < 0 || button_count > 1)
|
if (button_count < 0 || button_count > 1)
|
||||||
{
|
{
|
||||||
g_warning ("Received multiple virtual 0x%x button %s (ignoring)", button,
|
g_warning ("Received multiple virtual 0x%x button %s (ignoring)", evdev_button,
|
||||||
button_state == CLUTTER_BUTTON_STATE_PRESSED ? "presses" : "releases");
|
button_state == CLUTTER_BUTTON_STATE_PRESSED ? "presses" : "releases");
|
||||||
update_button_count (virtual_evdev, button, 1 - button_state);
|
update_button_count (virtual_evdev, evdev_button, 1 - button_state);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
clutter_seat_evdev_notify_button (virtual_evdev->seat,
|
clutter_seat_evdev_notify_button (virtual_evdev->seat,
|
||||||
virtual_evdev->device,
|
virtual_evdev->device,
|
||||||
time_us,
|
time_us,
|
||||||
button,
|
evdev_button,
|
||||||
button_state);
|
button_state);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user