evdev: implement wheel events

Mouse wheel events come as EV_REL/REL_WHEEL, and we can convert
them to clutter events on the assumption that scrolling with
the wheel is always vertical.

https://bugzilla.gnome.org/show_bug.cgi?id=705710
This commit is contained in:
Giovanni Campagna 2013-08-09 18:43:19 +02:00
parent 7b780b0c38
commit 0e519e2b3b

View File

@ -274,6 +274,41 @@ notify_relative_motion (ClutterEventSource *source,
queue_event (event);
}
static void
notify_scroll (ClutterEventSource *source,
guint32 time_,
gint32 value)
{
ClutterInputDevice *input_device = (ClutterInputDevice *) source->device;
ClutterDeviceManagerEvdev *manager_evdev;
ClutterStage *stage;
ClutterEvent *event = NULL;
ClutterPoint point;
/* We can drop the event on the floor if no stage has been
* associated with the device yet. */
stage = _clutter_input_device_get_stage (input_device);
if (!stage)
return;
manager_evdev = CLUTTER_DEVICE_MANAGER_EVDEV (input_device->device_manager);
event = clutter_event_new (CLUTTER_SCROLL);
event->scroll.time = time_;
event->scroll.stage = CLUTTER_STAGE (stage);
event->scroll.device = manager_evdev->priv->core_pointer;
event->motion.modifier_state = xkb_state_serialize_mods (manager_evdev->priv->xkb, XKB_STATE_EFFECTIVE);
event->scroll.modifier_state |= manager_evdev->priv->button_state;
event->scroll.direction = value < 0 ? CLUTTER_SCROLL_DOWN : CLUTTER_SCROLL_UP;
clutter_input_device_get_coords (manager_evdev->priv->core_pointer, NULL, &point);
event->scroll.x = point.x;
event->scroll.y = point.y;
clutter_event_set_source_device (event, (ClutterInputDevice*) source->device);
queue_event (event);
}
static void
notify_button (ClutterEventSource *source,
guint32 time_,
@ -469,6 +504,14 @@ clutter_event_dispatch (GSource *g_source,
case REL_Y:
dy += e->value;
break;
/* Note: we assume that REL_WHEEL is for *vertical* scroll wheels.
To implement horizontal scroll, we'll need a different enum
value.
*/
case REL_WHEEL:
notify_scroll (source, _time, e->value);
break;
}
break;