diff options
Diffstat (limited to 'clutter/clutter/evdev')
-rw-r--r-- | clutter/clutter/evdev/clutter-device-manager-evdev.c | 7 | ||||
-rw-r--r-- | clutter/clutter/evdev/clutter-evdev.h | 8 | ||||
-rw-r--r-- | clutter/clutter/evdev/clutter-input-device-tool-evdev.c | 96 | ||||
-rw-r--r-- | clutter/clutter/evdev/clutter-input-device-tool-evdev.h | 7 | ||||
-rw-r--r-- | clutter/clutter/evdev/clutter-seat-evdev.c | 16 |
5 files changed, 129 insertions, 5 deletions
diff --git a/clutter/clutter/evdev/clutter-device-manager-evdev.c b/clutter/clutter/evdev/clutter-device-manager-evdev.c index eeddc22f4..732f0a301 100644 --- a/clutter/clutter/evdev/clutter-device-manager-evdev.c +++ b/clutter/clutter/evdev/clutter-device-manager-evdev.c @@ -1219,7 +1219,8 @@ input_device_update_tool (ClutterInputDevice *input_device, } static gdouble * -translate_tablet_axes (struct libinput_event_tablet_tool *tablet_event) +translate_tablet_axes (struct libinput_event_tablet_tool *tablet_event, + ClutterInputDeviceTool *tool) { GArray *axes = g_array_new (FALSE, FALSE, sizeof (gdouble)); struct libinput_tablet_tool *libinput_tool; @@ -1241,6 +1242,7 @@ translate_tablet_axes (struct libinput_event_tablet_tool *tablet_event) if (libinput_tablet_tool_has_pressure (libinput_tool)) { value = libinput_event_tablet_tool_get_pressure (tablet_event); + value = clutter_input_device_tool_evdev_translate_pressure (tool, value); g_array_append_val (axes, value); } @@ -1718,7 +1720,8 @@ process_device_event (ClutterDeviceManagerEvdev *manager_evdev, if (!stage) break; - axes = translate_tablet_axes (tablet_event); + axes = translate_tablet_axes (tablet_event, + evdev_device->last_tool); if (!axes) break; diff --git a/clutter/clutter/evdev/clutter-evdev.h b/clutter/clutter/evdev/clutter-evdev.h index 1f5485c17..8e8f8d94c 100644 --- a/clutter/clutter/evdev/clutter-evdev.h +++ b/clutter/clutter/evdev/clutter-evdev.h @@ -150,6 +150,14 @@ gboolean clutter_evdev_event_get_relative_motion (const ClutterEvent *event, double *dx_unaccel, double *dy_unaccel); +CLUTTER_AVAILABLE_IN_ALL +void clutter_evdev_input_device_tool_set_pressure_curve (ClutterInputDeviceTool *tool, + gdouble curve[4]); +CLUTTER_AVAILABLE_IN_ALL +void clutter_evdev_input_device_tool_set_button_code (ClutterInputDeviceTool *tool, + guint button, + guint evcode); + G_END_DECLS #endif /* __CLUTTER_EVDEV_H__ */ diff --git a/clutter/clutter/evdev/clutter-input-device-tool-evdev.c b/clutter/clutter/evdev/clutter-input-device-tool-evdev.c index e0cdb31a4..12106069a 100644 --- a/clutter/clutter/evdev/clutter-input-device-tool-evdev.c +++ b/clutter/clutter/evdev/clutter-input-device-tool-evdev.c @@ -26,6 +26,7 @@ #endif #include "clutter-input-device-tool-evdev.h" +#include "clutter-evdev.h" G_DEFINE_TYPE (ClutterInputDeviceToolEvdev, clutter_input_device_tool_evdev, CLUTTER_TYPE_INPUT_DEVICE_TOOL) @@ -35,6 +36,7 @@ clutter_input_device_tool_evdev_finalize (GObject *object) { ClutterInputDeviceToolEvdev *tool = CLUTTER_INPUT_DEVICE_TOOL_EVDEV (object); + g_hash_table_unref (tool->button_map); libinput_tablet_tool_unref (tool->tool); G_OBJECT_CLASS (clutter_input_device_tool_evdev_parent_class)->finalize (object); @@ -51,6 +53,7 @@ clutter_input_device_tool_evdev_class_init (ClutterInputDeviceToolEvdevClass *kl static void clutter_input_device_tool_evdev_init (ClutterInputDeviceToolEvdev *tool) { + tool->button_map = g_hash_table_new (NULL, NULL); } ClutterInputDeviceTool * @@ -70,3 +73,96 @@ clutter_input_device_tool_evdev_new (struct libinput_tablet_tool *tool, return CLUTTER_INPUT_DEVICE_TOOL (evdev_tool); } + +void +clutter_evdev_input_device_tool_set_pressure_curve (ClutterInputDeviceTool *tool, + gdouble curve[4]) +{ + ClutterInputDeviceToolEvdev *evdev_tool; + + g_return_if_fail (CLUTTER_IS_INPUT_DEVICE_TOOL_EVDEV (tool)); + g_return_if_fail (curve[0] >= 0 && curve[0] <= 1 && + curve[1] >= 0 && curve[1] <= 1 && + curve[2] >= 0 && curve[2] <= 1 && + curve[3] >= 0 && curve[3] <= 1); + + evdev_tool = CLUTTER_INPUT_DEVICE_TOOL_EVDEV (tool); + evdev_tool->pressure_curve[0] = curve[0]; + evdev_tool->pressure_curve[1] = curve[1]; + evdev_tool->pressure_curve[2] = curve[2]; + evdev_tool->pressure_curve[3] = curve[3]; +} + +void +clutter_evdev_input_device_tool_set_button_code (ClutterInputDeviceTool *tool, + guint button, + guint evcode) +{ + ClutterInputDeviceToolEvdev *evdev_tool; + + g_return_if_fail (CLUTTER_IS_INPUT_DEVICE_TOOL_EVDEV (tool)); + + evdev_tool = CLUTTER_INPUT_DEVICE_TOOL_EVDEV (tool); + + if (evcode == 0) + { + g_hash_table_remove (evdev_tool->button_map, GUINT_TO_POINTER (button)); + } + else + { + g_hash_table_insert (evdev_tool->button_map, GUINT_TO_POINTER (button), + GUINT_TO_POINTER (evcode)); + } +} + +static gdouble +calculate_bezier_position (gdouble pos, + gdouble x1, + gdouble y1, + gdouble x2, + gdouble y2) +{ + gdouble int1_y, int2_y; + + pos = CLAMP (pos, 0, 1); + + /* Intersection between 0,0 and x1,y1 */ + int1_y = pos * y1; + + /* Intersection between x2,y2 and 1,1 */ + int2_y = (pos * (1 - y2)) + y2; + + /* Find the new position in the line traced by the previous points */ + return (pos * (int2_y - int1_y)) + int1_y; +} + +gdouble +clutter_input_device_tool_evdev_translate_pressure (ClutterInputDeviceTool *tool, + gdouble pressure) +{ + ClutterInputDeviceToolEvdev *evdev_tool; + + g_return_val_if_fail (CLUTTER_IS_INPUT_DEVICE_TOOL (tool), pressure); + + evdev_tool = CLUTTER_INPUT_DEVICE_TOOL_EVDEV (tool); + + return calculate_bezier_position (CLAMP (pressure, 0, 1), + evdev_tool->pressure_curve[0], + evdev_tool->pressure_curve[1], + evdev_tool->pressure_curve[2], + evdev_tool->pressure_curve[3]); +} + +guint +clutter_input_device_tool_evdev_get_button_code (ClutterInputDeviceTool *tool, + guint button) +{ + ClutterInputDeviceToolEvdev *evdev_tool; + + g_return_val_if_fail (CLUTTER_IS_INPUT_DEVICE_TOOL (tool), 0); + + evdev_tool = CLUTTER_INPUT_DEVICE_TOOL_EVDEV (tool); + + return GPOINTER_TO_UINT (g_hash_table_lookup (evdev_tool->button_map, + GUINT_TO_POINTER (button))); +} diff --git a/clutter/clutter/evdev/clutter-input-device-tool-evdev.h b/clutter/clutter/evdev/clutter-input-device-tool-evdev.h index c92a2ca6b..91eaf8e04 100644 --- a/clutter/clutter/evdev/clutter-input-device-tool-evdev.h +++ b/clutter/clutter/evdev/clutter-input-device-tool-evdev.h @@ -59,6 +59,8 @@ struct _ClutterInputDeviceToolEvdev { ClutterInputDeviceTool parent_instance; struct libinput_tablet_tool *tool; + GHashTable *button_map; + gdouble pressure_curve[4]; }; struct _ClutterInputDeviceToolEvdevClass @@ -72,6 +74,11 @@ ClutterInputDeviceTool * clutter_input_device_tool_evdev_new (struct libinp guint64 serial, ClutterInputDeviceToolType type); +gdouble clutter_input_device_tool_evdev_translate_pressure (ClutterInputDeviceTool *tool, + gdouble pressure); +guint clutter_input_device_tool_evdev_get_button_code (ClutterInputDeviceTool *tool, + guint button); + G_END_DECLS #endif /* __CLUTTER_INPUT_DEVICE_EVDEV_TOOL_H__ */ diff --git a/clutter/clutter/evdev/clutter-seat-evdev.c b/clutter/clutter/evdev/clutter-seat-evdev.c index f5ae1dd46..b803286c2 100644 --- a/clutter/clutter/evdev/clutter-seat-evdev.c +++ b/clutter/clutter/evdev/clutter-seat-evdev.c @@ -32,6 +32,7 @@ #include "clutter-event-private.h" #include "clutter-input-device-evdev.h" +#include "clutter-input-device-tool-evdev.h" #include "clutter-main.h" /* Try to keep the pointer inside the stage. Hopefully no one is using @@ -433,6 +434,7 @@ clutter_seat_evdev_notify_button (ClutterSeatEvdev *seat, uint32_t button, uint32_t state) { + ClutterInputDeviceEvdev *device_evdev = (ClutterInputDeviceEvdev *) input_device; ClutterStage *stage; ClutterEvent *event = NULL; gint button_nr; @@ -528,13 +530,21 @@ clutter_seat_evdev_notify_button (ClutterSeatEvdev *seat, clutter_event_set_device (event, seat->core_pointer); clutter_event_set_source_device (event, input_device); + if (device_evdev->last_tool) + { + /* Apply the button event code as per the tool mapping */ + guint mapped_button; + + mapped_button = clutter_input_device_tool_evdev_get_button_code (device_evdev->last_tool, + button_nr); + if (mapped_button != 0) + button = mapped_button; + } + _clutter_evdev_event_set_event_code (event, button); if (clutter_input_device_get_device_type (input_device) == CLUTTER_TABLET_DEVICE) { - ClutterInputDeviceEvdev *device_evdev = - CLUTTER_INPUT_DEVICE_EVDEV (input_device); - clutter_event_set_device_tool (event, device_evdev->last_tool); clutter_event_set_device (event, input_device); } |