summaryrefslogtreecommitdiff
path: root/gdk/gdkevents.c
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2016-02-22 22:40:50 +0100
committerMatthias Clasen <mclasen@redhat.com>2016-02-23 20:35:01 -0500
commit4ff3d5b7a6410272471f8216e87d1b87607f973e (patch)
tree44b34d1a3af56b62c3dcbd2132203d1d79c5f299 /gdk/gdkevents.c
parent3d700515e191986dddb4e5675ef41af8695a472f (diff)
downloadgtk+-4ff3d5b7a6410272471f8216e87d1b87607f973e.tar.gz
gdk: Avoid 2/3BUTTON event generation if the source device changes
Remember the last source device we're generating multiple clicks for, just so we can bail out if the device changed. That will just reset the counting. https://bugzilla.gnome.org/show_bug.cgi?id=723659
Diffstat (limited to 'gdk/gdkevents.c')
-rw-r--r--gdk/gdkevents.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/gdk/gdkevents.c b/gdk/gdkevents.c
index c6bb43e3ce..f6ab55fd54 100644
--- a/gdk/gdkevents.c
+++ b/gdk/gdkevents.c
@@ -2106,9 +2106,11 @@ _gdk_event_button_generate (GdkDisplay *display,
GdkEvent *event)
{
GdkMultipleClickInfo *info;
+ GdkDevice *source_device;
g_return_if_fail (event->type == GDK_BUTTON_PRESS);
+ source_device = gdk_event_get_source_device (event);
info = g_hash_table_lookup (display->multiple_click_info, event->button.device);
if (G_UNLIKELY (!info))
@@ -2123,6 +2125,7 @@ _gdk_event_button_generate (GdkDisplay *display,
if ((event->button.time < (info->button_click_time[1] + 2 * display->double_click_time)) &&
(event->button.window == info->button_window[1]) &&
(event->button.button == info->button_number[1]) &&
+ (source_device == info->last_slave) &&
(ABS (event->button.x - info->button_x[1]) <= display->double_click_distance) &&
(ABS (event->button.y - info->button_y[1]) <= display->double_click_distance))
{
@@ -2136,10 +2139,12 @@ _gdk_event_button_generate (GdkDisplay *display,
info->button_number[0] = -1;
info->button_x[0] = info->button_x[1] = 0;
info->button_y[0] = info->button_y[1] = 0;
+ info->last_slave = NULL;
}
else if ((event->button.time < (info->button_click_time[0] + display->double_click_time)) &&
(event->button.window == info->button_window[0]) &&
(event->button.button == info->button_number[0]) &&
+ (source_device == info->last_slave) &&
(ABS (event->button.x - info->button_x[0]) <= display->double_click_distance) &&
(ABS (event->button.y - info->button_y[0]) <= display->double_click_distance))
{
@@ -2155,6 +2160,7 @@ _gdk_event_button_generate (GdkDisplay *display,
info->button_x[0] = event->button.x;
info->button_y[1] = info->button_y[0];
info->button_y[0] = event->button.y;
+ info->last_slave = source_device;
}
else
{
@@ -2168,6 +2174,7 @@ _gdk_event_button_generate (GdkDisplay *display,
info->button_x[0] = event->button.x;
info->button_y[1] = 0;
info->button_y[0] = event->button.y;
+ info->last_slave = source_device;
}
}