summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJasper St. Pierre <jstpierre@mecheye.net>2013-10-07 12:13:41 -0400
committerJasper St. Pierre <jstpierre@mecheye.net>2013-11-11 13:35:16 -0500
commitfbe2d5167ecd91730d7298704a3c3c3c5dbcb8c5 (patch)
tree619e3f3e9ed555e23195164a49144403a8d950b5
parent3b4540cb5d4ff15a2ae8181ea634a35a6b1fa0d2 (diff)
downloadclutter-fbe2d5167ecd91730d7298704a3c3c3c5dbcb8c5.tar.gz
device-manager-xi2: Clamp coordinates of events to the stage coordinates
The X server can sometimes send us coordinates in the negatives or above our window in extreme cases. Ensure that the user never sees this.
-rw-r--r--clutter/x11/clutter-device-manager-xi2.c41
1 files changed, 19 insertions, 22 deletions
diff --git a/clutter/x11/clutter-device-manager-xi2.c b/clutter/x11/clutter-device-manager-xi2.c
index 3b55e269d..8bedbd47e 100644
--- a/clutter/x11/clutter-device-manager-xi2.c
+++ b/clutter/x11/clutter-device-manager-xi2.c
@@ -642,6 +642,17 @@ translate_axes (ClutterInputDevice *device,
return retval;
}
+static void
+translate_coords (ClutterStageX11 *stage_x11,
+ gdouble event_x,
+ gdouble event_y,
+ gfloat *x_out,
+ gfloat *y_out)
+{
+ *x_out = CLAMP (event_x, 0, stage_x11->xwin_width) / stage_x11->scale_factor;
+ *y_out = CLAMP (event_y, 0, stage_x11->xwin_height) / stage_x11->scale_factor;
+}
+
static gdouble
scroll_valuators_changed (ClutterInputDevice *device,
XIValuatorState *valuators,
@@ -744,7 +755,6 @@ clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator,
XGenericEventCookie *cookie;
XIEvent *xi_event;
XEvent *xevent;
- int window_scale;
backend_x11 = CLUTTER_BACKEND_X11 (clutter_get_default_backend ());
@@ -773,11 +783,6 @@ clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator,
event->any.stage = stage;
- if (stage_x11 != NULL)
- window_scale = stage_x11->scale_factor;
- else
- window_scale = 1;
-
switch (xi_event->evtype)
{
case XI_HierarchyChanged:
@@ -932,8 +937,7 @@ clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator,
event->scroll.stage = stage;
event->scroll.time = xev->time;
- event->scroll.x = xev->event_x / window_scale;
- event->scroll.y = xev->event_y / window_scale;
+ translate_coords (stage_x11, xev->event_x, xev->event_y, &event->scroll.x, &event->scroll.y);
_clutter_input_device_xi2_translate_state (event,
&xev->mods,
&xev->buttons,
@@ -979,8 +983,7 @@ clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator,
event->button.stage = stage;
event->button.time = xev->time;
- event->button.x = xev->event_x / window_scale;
- event->button.y = xev->event_y / window_scale;
+ translate_coords (stage_x11, xev->event_x, xev->event_y, &event->button.x, &event->button.y);
event->button.button = xev->detail;
_clutter_input_device_xi2_translate_state (event,
&xev->mods,
@@ -1061,8 +1064,7 @@ clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator,
event->scroll.stage = stage;
event->scroll.time = xev->time;
- event->scroll.x = xev->event_x / window_scale;
- event->scroll.y = xev->event_y / window_scale;
+ translate_coords (stage_x11, xev->event_x, xev->event_y, &event->scroll.x, &event->scroll.y);
_clutter_input_device_xi2_translate_state (event,
&xev->mods,
&xev->buttons,
@@ -1090,8 +1092,7 @@ clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator,
event->motion.stage = stage;
event->motion.time = xev->time;
- event->motion.x = xev->event_x / window_scale;
- event->motion.y = xev->event_y / window_scale;
+ translate_coords (stage_x11, xev->event_x, xev->event_y, &event->motion.x, &event->motion.y);
_clutter_input_device_xi2_translate_state (event,
&xev->mods,
&xev->buttons,
@@ -1141,8 +1142,7 @@ clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator,
event->touch.stage = stage;
event->touch.time = xev->time;
- event->touch.x = xev->event_x / window_scale;
- event->touch.y = xev->event_y / window_scale;
+ translate_coords (stage_x11, xev->event_x, xev->event_y, &event->touch.x, &event->touch.y);
_clutter_input_device_xi2_translate_state (event,
&xev->mods,
&xev->buttons,
@@ -1196,8 +1196,7 @@ clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator,
event->touch.stage = stage;
event->touch.time = xev->time;
event->touch.sequence = GUINT_TO_POINTER (xev->detail);
- event->touch.x = xev->event_x / window_scale;
- event->touch.y = xev->event_y / window_scale;
+ translate_coords (stage_x11, xev->event_x, xev->event_y, &event->touch.x, &event->touch.y);
clutter_event_set_source_device (event, source_device);
@@ -1253,8 +1252,7 @@ clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator,
event->crossing.related = NULL;
event->crossing.time = xev->time;
- event->crossing.x = xev->event_x / window_scale;
- event->crossing.y = xev->event_y / window_scale;
+ translate_coords (stage_x11, xev->event_x, xev->event_y, &event->crossing.x, &event->crossing.y);
_clutter_input_device_set_stage (device, stage);
}
@@ -1277,8 +1275,7 @@ clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator,
event->crossing.related = NULL;
event->crossing.time = xev->time;
- event->crossing.x = xev->event_x / window_scale;
- event->crossing.y = xev->event_y / window_scale;
+ translate_coords (stage_x11, xev->event_x, xev->event_y, &event->crossing.x, &event->crossing.y);
_clutter_input_device_set_stage (device, NULL);
}