summaryrefslogtreecommitdiff
path: root/gdk
diff options
context:
space:
mode:
authorMatthias Clasen <maclas@gmx.de>2003-12-16 00:56:48 +0000
committerMatthias Clasen <matthiasc@src.gnome.org>2003-12-16 00:56:48 +0000
commitfbb0ba1a3b4fc044247a8597678f283b28bc6e91 (patch)
tree10455f458c533efed9dfbbf1dbdde7ec8766183a /gdk
parent69c2585f0d78c5c00b0dff296b28eddea964ed1f (diff)
downloadgtk+-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.c3
-rw-r--r--gdk/gdkdisplay.h11
-rw-r--r--gdk/gdkevents.c57
-rw-r--r--gdk/x11/gdkevents-x11.c6
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" },