[mousetweaks] Cancel dwell click if mouse receives input - bgo#580174
- From: Gerd Kohlberger <gerdk src gnome org>
- To: svn-commits-list gnome org
- Subject: [mousetweaks] Cancel dwell click if mouse receives input - bgo#580174
- Date: Sat, 2 May 2009 10:07:08 -0400 (EDT)
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]