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".
This commit is contained in:
Matthias Clasen
2003-12-16 00:56:48 +00:00
committed by Matthias Clasen
parent 69c2585f0d
commit fbb0ba1a3b
12 changed files with 187 additions and 26 deletions

View File

@ -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)
{