diff options
author | Matthias Clasen <maclas@gmx.de> | 2003-12-16 00:56:48 +0000 |
---|---|---|
committer | Matthias Clasen <matthiasc@src.gnome.org> | 2003-12-16 00:56:48 +0000 |
commit | fbb0ba1a3b4fc044247a8597678f283b28bc6e91 (patch) | |
tree | 10455f458c533efed9dfbbf1dbdde7ec8766183a /gdk | |
parent | 69c2585f0d78c5c00b0dff296b28eddea964ed1f (diff) | |
download | gtk+-fbb0ba1a3b4fc044247a8597678f283b28bc6e91.tar.gz |
Do not interpret distant clicks as double-clicks (#116541, Bernhard
Tue Dec 16 01:46:46 2003 Matthias Clasen <maclas@gmx.de>
Do not interpret distant clicks as double-clicks (#116541,
Bernhard Walle):
* gdk/gdkdisplay.h (struct GdkDisplay): Add new fields
double_click_distance, button_x and button_y.
* gdk/gdkdisplay.c (gdk_display_init): Initialize the new fields.
* gdk/gdkdisplay.h:
* gdk/gdkevents.c (gdk_display_set_double_click_distance):
New function to set the double click distance on a display.
* gdk/gdkevents.c: Take double click distance into account
when generating single, double or triple clicks.
* gtk/gtksettings.c: Add new setting "gtk-double-click-distance".
* gdk/x11/gdkevents-x11.c: Add the XSetting
"Net/DoubleClickDistance" and map it to "gtk-double-click-distance".
Diffstat (limited to 'gdk')
-rw-r--r-- | gdk/gdkdisplay.c | 3 | ||||
-rw-r--r-- | gdk/gdkdisplay.h | 11 | ||||
-rw-r--r-- | gdk/gdkevents.c | 57 | ||||
-rw-r--r-- | gdk/x11/gdkevents-x11.c | 6 |
4 files changed, 57 insertions, 20 deletions
diff --git a/gdk/gdkdisplay.c b/gdk/gdkdisplay.c index 5dfeb77ec6..04b8e32887 100644 --- a/gdk/gdkdisplay.c +++ b/gdk/gdkdisplay.c @@ -151,8 +151,11 @@ gdk_display_init (GdkDisplay *display) display->button_click_time[0] = display->button_click_time[1] = 0; display->button_window[0] = display->button_window[1] = NULL; display->button_number[0] = display->button_number[1] = -1; + display->button_x[0] = display->button_x[1] = 0; + display->button_y[0] = display->button_y[1] = 0; display->double_click_time = 250; + display->double_click_distance = 5; display->pointer_hooks = &default_pointer_hooks; } diff --git a/gdk/gdkdisplay.h b/gdk/gdkdisplay.h index bbf0d7591c..2bbc7eb8e8 100644 --- a/gdk/gdkdisplay.h +++ b/gdk/gdkdisplay.h @@ -40,7 +40,6 @@ typedef struct _GdkDisplayPointerHooks GdkDisplayPointerHooks; #define GDK_IS_DISPLAY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GDK_TYPE_DISPLAY)) #define GDK_DISPLAY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GDK_TYPE_DISPLAY, GdkDisplayClass)) - struct _GdkDisplay { GObject parent_instance; @@ -62,6 +61,10 @@ struct _GdkDisplay const GdkDisplayPointerHooks *pointer_hooks; /* Current hooks for querying pointer */ guint closed : 1; /* Whether this display has been closed */ + + guint double_click_distance; /* Maximum distance between clicks in pixels */ + gint button_x[2]; /* The last 2 button click positions. */ + gint button_y[2]; }; struct _GdkDisplayClass @@ -129,8 +132,10 @@ void gdk_display_add_client_message_filter (GdkDisplay *display, GdkFilterFunc func, gpointer data); -void gdk_display_set_double_click_time (GdkDisplay *display, - guint msec); +void gdk_display_set_double_click_time (GdkDisplay *display, + guint msec); +void gdk_display_set_double_click_distance (GdkDisplay *display, + guint distance); GdkDisplay *gdk_display_get_default (void); diff --git a/gdk/gdkevents.c b/gdk/gdkevents.c index a299d2ce2b..7ecc2102eb 100644 --- a/gdk/gdkevents.c +++ b/gdk/gdkevents.c @@ -46,10 +46,6 @@ GdkEventFunc _gdk_event_func = NULL; /* Callback for events */ gpointer _gdk_event_data = NULL; GDestroyNotify _gdk_event_notify = NULL; -#define TRIPLE_CLICK_TIME(display) (2*display->double_click_time) -#define DOUBLE_CLICK_DIST 5 -#define TRIPLE_CLICK_DIST 5 - /********************************************* * Functions for maintaining the event queue * *********************************************/ @@ -1031,22 +1027,28 @@ void _gdk_event_button_generate (GdkDisplay *display, GdkEvent *event) { - if ((event->button.time < (display->button_click_time[1] + TRIPLE_CLICK_TIME (display))) && + if ((event->button.time < (display->button_click_time[1] + 2*display->double_click_time)) && (event->button.window == display->button_window[1]) && - (event->button.button == display->button_number[1])) - { + (event->button.button == display->button_number[1]) && + (ABS (event->button.x - display->button_x[1]) <= display->double_click_distance) && + (ABS (event->button.y - display->button_y[1]) <= display->double_click_distance)) +{ gdk_synthesize_click (display, event, 3); - + display->button_click_time[1] = 0; display->button_click_time[0] = 0; display->button_window[1] = NULL; display->button_window[0] = 0; display->button_number[1] = -1; display->button_number[0] = -1; + display->button_x[0] = display->button_x[1] = 0; + display->button_y[0] = display->button_y[1] = 0; } else if ((event->button.time < (display->button_click_time[0] + display->double_click_time)) && (event->button.window == display->button_window[0]) && - (event->button.button == display->button_number[0])) + (event->button.button == display->button_number[0]) && + (ABS (event->button.x - display->button_x[0]) <= display->double_click_distance) && + (ABS (event->button.y - display->button_y[0]) <= display->double_click_distance)) { gdk_synthesize_click (display, event, 2); @@ -1056,6 +1058,10 @@ _gdk_event_button_generate (GdkDisplay *display, display->button_window[0] = event->button.window; display->button_number[1] = display->button_number[0]; display->button_number[0] = event->button.button; + display->button_x[1] = display->button_x[0]; + display->button_x[0] = event->button.x; + display->button_y[1] = display->button_y[0]; + display->button_y[0] = event->button.y; } else { @@ -1065,6 +1071,10 @@ _gdk_event_button_generate (GdkDisplay *display, display->button_window[0] = event->button.window; display->button_number[1] = -1; display->button_number[0] = event->button.button; + display->button_x[1] = 0; + display->button_x[0] = event->button.x; + display->button_y[1] = 0; + display->button_y[0] = event->button.y; } } @@ -1126,7 +1136,8 @@ gdk_synthesize_window_state (GdkWindow *window, * * Sets the double click time (two clicks within this time interval * count as a double click and result in a #GDK_2BUTTON_PRESS event). - * Applications should NOT set this, it is a global user-configured setting. + * Applications should <emphasis>not</emphasis> set this, it is a global + * user-configured setting. * * Since: 2.2 **/ @@ -1142,8 +1153,10 @@ gdk_display_set_double_click_time (GdkDisplay *display, * @msec: double click time in milliseconds (thousandths of a second) * * Set the double click time for the default display. See - * gdk_display_set_double_click_time(). Applications should NOT - * set this, it is a global user-configured setting. + * gdk_display_set_double_click_time(). + * See also gdk_display_set_double_click_distance(). + * Applications should <emphasis>not</emphasis> set this, it is a + * global user-configured setting. **/ void gdk_set_double_click_time (guint msec) @@ -1151,6 +1164,26 @@ gdk_set_double_click_time (guint msec) gdk_display_set_double_click_time (gdk_display_get_default (), msec); } +/** + * gdk_display_set_double_click_distance: + * @display: a #GdkDisplay + * @distance: distance in pixels + * + * Sets the double click distance (two clicks within this distance + * count as a double click and result in a #GDK_2BUTTON_PRESS event). + * See also gdk_display_set_double_click_time(). + * Applications should <emphasis>not</emphasis> set this, it is a global + * user-configured setting. + * + * Since: 2.4 + **/ +void +gdk_display_set_double_click_distance (GdkDisplay *display, + guint distance) +{ + display->double_click_distance = distance; +} + GType gdk_event_get_type (void) { diff --git a/gdk/x11/gdkevents-x11.c b/gdk/x11/gdkevents-x11.c index f19a7ff56a..a52890aa5a 100644 --- a/gdk/x11/gdkevents-x11.c +++ b/gdk/x11/gdkevents-x11.c @@ -55,11 +55,6 @@ typedef struct _GdkIOClosure GdkIOClosure; typedef struct _GdkDisplaySource GdkDisplaySource; typedef struct _GdkEventTypeX11 GdkEventTypeX11; -#define DOUBLE_CLICK_TIME 250 -#define TRIPLE_CLICK_TIME 500 -#define DOUBLE_CLICK_DIST 5 -#define TRIPLE_CLICK_DIST 5 - struct _GdkIOClosure { GdkInputFunction function; @@ -2591,6 +2586,7 @@ static struct const char *gdk_name; } settings_map[] = { { "Net/DoubleClickTime", "gtk-double-click-time" }, + { "Net/DoubleClickDistance", "gtk-double-click-distance" }, { "Net/DndDragThreshold", "gtk-dnd-drag-threshold" }, { "Gtk/CanChangeAccels", "gtk-can-change-accels" }, { "Gtk/ColorPalette", "gtk-color-palette" }, |