[gtk+] gdk: Avoid 2/3BUTTON event generation if the source device changes
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] gdk: Avoid 2/3BUTTON event generation if the source device changes
- Date: Wed, 24 Feb 2016 01:38:44 +0000 (UTC)
commit 4ff3d5b7a6410272471f8216e87d1b87607f973e
Author: Carlos Garnacho <carlosg gnome org>
Date: Mon Feb 22 22:40:50 2016 +0100
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
gdk/gdkdisplayprivate.h | 1 +
gdk/gdkevents.c | 7 +++++++
2 files changed, 8 insertions(+), 0 deletions(-)
---
diff --git a/gdk/gdkdisplayprivate.h b/gdk/gdkdisplayprivate.h
index 702d6cf..f4d2716 100644
--- a/gdk/gdkdisplayprivate.h
+++ b/gdk/gdkdisplayprivate.h
@@ -88,6 +88,7 @@ typedef struct
gint button_number[2]; /* last 2 buttons to be pressed */
gint button_x[2]; /* last 2 button click positions */
gint button_y[2];
+ GdkDevice *last_slave;
} GdkMultipleClickInfo;
struct _GdkDisplay
diff --git a/gdk/gdkevents.c b/gdk/gdkevents.c
index c6bb43e..f6ab55f 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;
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]