[mousetweaks] Cancel dwell click if mouse receives input - bgo#580174



commit c96eb4cf21d4228b15852041c2550d7df55a3e40
Author: Gerd Kohlberger <gerdk src gnome org>
Date:   Sat May 2 15:59:19 2009 +0200

    Cancel dwell click if mouse receives input - bgo#580174
    
    Stops a dwell click in progress if a physical mouse button is
    pressed. At the moment this only works with left, middle and
    right mouse buttons. AT-SPI doesn't report any scroll-wheel
    events (usually button 4/5).
---
 src/mt-listener.c |   13 +++++++++----
 src/mt-listener.h |    1 +
 src/mt-main.c     |   38 +++++++++++++++++++++++++++++++-------
 3 files changed, 41 insertions(+), 11 deletions(-)

diff --git a/src/mt-listener.c b/src/mt-listener.c
index 1673c86..3d5d701 100644
--- a/src/mt-listener.c
+++ b/src/mt-listener.c
@@ -95,8 +95,7 @@ mt_listener_init (MtListener *listener)
 
     priv->button = SPI_createAccessibleEventListener (mt_listener_button_event,
 						      listener);
-    SPI_registerGlobalEventListener (priv->button, "mouse:button:1p");
-    SPI_registerGlobalEventListener (priv->button, "mouse:button:1r");
+    SPI_registerGlobalEventListener (priv->button, "mouse:button:");
 
     priv->focus = SPI_createAccessibleEventListener (mt_listener_focus_event,
 						     listener);
@@ -163,6 +162,7 @@ mt_listener_motion_event (const AccessibleEvent *event, gpointer data)
     ev.type = EV_MOTION;
     ev.x = (gint) event->detail1;
     ev.y = (gint) event->detail2;
+    ev.button = 0;
 
     g_signal_emit (data, signals[MOTION_EVENT], 0, &ev);
 }
@@ -172,10 +172,15 @@ mt_listener_button_event (const AccessibleEvent *event, gpointer data)
 {
     MtEvent ev;
 
-    ev.type = g_str_equal (event->type, "mouse:button:1p")
-	      ? EV_BUTTON_PRESS : EV_BUTTON_RELEASE;
+    /*
+     * This is obviously dangerous, but it should be
+     * guarantied that event-type strings will always
+     * be in the form of "mouse:button:[1,2,3][p,r]"
+     */
+    ev.type = event->type[14] == 'p' ? EV_BUTTON_PRESS : EV_BUTTON_RELEASE;
     ev.x = (gint) event->detail1;
     ev.y = (gint) event->detail2;
+    ev.button = event->type[13] == '1' ? 1 : (event->type[13] == '2' ? 2 : 3);
 
     g_signal_emit (data, signals[BUTTON_EVENT], 0, &ev);
 }
diff --git a/src/mt-listener.h b/src/mt-listener.h
index 74df20d..e000835 100644
--- a/src/mt-listener.h
+++ b/src/mt-listener.h
@@ -57,6 +57,7 @@ struct _MtEvent {
     MtEventType type;
     gint        x;
     gint        y;
+    gint        button;
 };
 
 GType     mt_event_get_type (void) G_GNUC_CONST;
diff --git a/src/mt-main.c b/src/mt-main.c
index 8b15f4b..48cd14a 100644
--- a/src/mt-main.c
+++ b/src/mt-main.c
@@ -414,6 +414,26 @@ delay_timer_finished (MtTimer *timer, gpointer data)
     g_timeout_add (100, right_click_timeout, data);
 }
 
+static void
+mt_dwell_click_cancel (MtData *mt)
+{
+    if (mt->dwell_gesture_started) {
+	dwell_stop_gesture (mt);
+	return;
+    }
+
+    mt_timer_stop (mt->dwell_timer);
+    mt_cursor_manager_restore_all (mt_cursor_manager_get_default ());
+
+    if (mt->dwell_drag_started) {
+	g_print ("stop drag\n");
+	mt_main_set_cursor (mt, GDK_LEFT_PTR);
+	mt->dwell_drag_started = FALSE;
+    }
+
+    dwell_restore_single_click (mt);
+}
+
 /* at-spi listener callbacks */
 static void
 global_motion_event (MtListener *listener,
@@ -459,21 +479,25 @@ global_button_event (MtListener *listener,
 {
     MtData *mt = data;
 
-    if (event->type == EV_BUTTON_PRESS) {
-	if (mt->delay_enabled) {
+    if (mt->delay_enabled && event->button == 1) {
+	if (event->type == EV_BUTTON_PRESS) {
 	    mt->pointer_x = event->x;
 	    mt->pointer_y = event->y;
 	    mt_timer_start (mt->delay_timer);
 	}
-	if (mt->dwell_gesture_started)
-	    dwell_stop_gesture (mt);
-    }
-    else {
-	if (mt->delay_enabled) {
+	else {
 	    mt_timer_stop (mt->delay_timer);
 	    mt_cursor_manager_restore_all (mt_cursor_manager_get_default ());
 	}
     }
+    /*
+     * cancel a dwell-click in progress if a physical button
+     * is pressed - useful for mixed use-cases and testing
+     */
+    if ((event->type == EV_BUTTON_PRESS && mt_timer_is_running (mt->dwell_timer)) ||
+        (event->type == EV_BUTTON_RELEASE && mt->dwell_drag_started)) {
+	mt_dwell_click_cancel (mt);
+    }
 }
 
 static void



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]