+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".
+
2003-12-15 Federico Mena Quintero <federico@ximian.com>
* gtk/gtkdialog.c: Sigh, revert the change.
+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".
+
2003-12-15 Federico Mena Quintero <federico@ximian.com>
* gtk/gtkdialog.c: Sigh, revert the change.
+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".
+
2003-12-15 Federico Mena Quintero <federico@ximian.com>
* gtk/gtkdialog.c: Sigh, revert the change.
+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".
+
2003-12-15 Federico Mena Quintero <federico@ximian.com>
* gtk/gtkdialog.c: Sigh, revert the change.
+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".
+
2003-12-15 Federico Mena Quintero <federico@ximian.com>
* gtk/gtkdialog.c: Sigh, revert the change.
+Tue Dec 16 01:57:13 2003 Matthias Clasen <maclas@gmx.de>
+
+ * gdk/gdk-sections.txt: Add gdk_display_set_double_click_distance.
+
Mon Dec 15 01:03:08 2003 Matthias Clasen <maclas@gmx.de>
* gtk/gtk-sections.txt: Add gtk_button_[sg]et_alignment.
gdk_display_put_event
gdk_display_add_client_message_filter
gdk_display_set_double_click_time
+gdk_display_set_double_click_distance
gdk_display_get_pointer
gdk_display_get_window_at_pointer
GdkDisplayPointerHooks
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;
}
#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;
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
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);
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 *
*********************************************/
_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);
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
{
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;
}
}
*
* 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
**/
* @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)
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)
{
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;
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" },
enum {
PROP_0,
PROP_DOUBLE_CLICK_TIME,
+ PROP_DOUBLE_CLICK_DISTANCE,
PROP_CURSOR_BLINK,
PROP_CURSOR_BLINK_TIME,
PROP_SPLIT_CURSOR,
static guint settings_install_property_parser (GtkSettingsClass *class,
GParamSpec *pspec,
GtkRcPropertyParser parser);
-static void settings_update_double_click_time (GtkSettings *settings);
+static void settings_update_double_click (GtkSettings *settings);
/* --- variables --- */
G_PARAM_READWRITE),
NULL);
g_assert (result == PROP_DOUBLE_CLICK_TIME);
+ result = settings_install_property_parser (class,
+ g_param_spec_int ("gtk-double-click-distance",
+ _("Double Click Distance"),
+ _("Maximum distance allowed between two clicks for them to be considered a double click (in pixels)"),
+ 0, G_MAXINT, 5,
+ G_PARAM_READWRITE),
+ NULL);
+ g_assert (result == PROP_DOUBLE_CLICK_DISTANCE);
result = settings_install_property_parser (class,
g_param_spec_boolean ("gtk-cursor-blink",
_("Cursor Blink"),
settings->screen = screen;
g_object_set_data (G_OBJECT (screen), "gtk-settings", settings);
gtk_rc_reparse_all_for_settings (settings, TRUE);
- settings_update_double_click_time (settings);
+ settings_update_double_click (settings);
}
return settings;
switch (property_id)
{
case PROP_DOUBLE_CLICK_TIME:
- settings_update_double_click_time (settings);
+ case PROP_DOUBLE_CLICK_DISTANCE:
+ settings_update_double_click (settings);
break;
}
}
}
static void
-settings_update_double_click_time (GtkSettings *settings)
+settings_update_double_click (GtkSettings *settings)
{
if (gdk_screen_get_number (settings->screen) == 0)
{
GdkDisplay *display = gdk_screen_get_display (settings->screen);
gint double_click_time;
+ gint double_click_distance;
- g_object_get (settings, "gtk-double-click-time",
- &double_click_time, NULL);
+ g_object_get (settings,
+ "gtk-double-click-time", &double_click_time,
+ "gtk-double-click-distance", &double_click_distance,
+ NULL);
gdk_display_set_double_click_time (display, double_click_time);
+ gdk_display_set_double_click_distance (display, double_click_distance);
}
}