diff options
author | Michael Drake <tlsa@netsurf-browser.org> | 2010-12-16 20:30:10 +0000 |
---|---|---|
committer | Michael Drake <tlsa@netsurf-browser.org> | 2010-12-16 20:30:10 +0000 |
commit | ad7283780d5f6a6949d53530ea36f0cbe6e390fb (patch) | |
tree | 1cd79ccc6b7c6677c45b942792dcf5403b5d95cb | |
parent | b067265bd39d0dc0542ba3099a8c33ce8a6aa701 (diff) | |
download | netsurf-ad7283780d5f6a6949d53530ea36f0cbe6e390fb.tar.gz netsurf-ad7283780d5f6a6949d53530ea36f0cbe6e390fb.tar.bz2 |
When we get a motion notify event, only set of a drag in the core if the mouse has moved at least 5px from where it was pressed.
svn path=/trunk/netsurf/; revision=11076
-rw-r--r-- | gtk/gtk_treeview.c | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/gtk/gtk_treeview.c b/gtk/gtk_treeview.c index 13b8c426e..c896fc7e6 100644 --- a/gtk/gtk_treeview.c +++ b/gtk/gtk_treeview.c @@ -25,6 +25,7 @@ #include <gdk/gdkkeysyms.h> #include <gtk/gtk.h> #include <stdio.h> +#include <limits.h> #include "desktop/tree.h" #include "desktop/tree_url_node.h" @@ -41,6 +42,7 @@ struct nsgtk_treeview { GtkDrawingArea *drawing_area; int mouse_pressed_x; int mouse_pressed_y; + int last_x, last_y; browser_mouse_state mouse_state; struct tree *tree; }; @@ -263,8 +265,13 @@ gboolean nsgtk_tree_window_button_press_event(GtkWidget *widget, if (event->state & GDK_CONTROL_MASK) tw->mouse_state |= BROWSER_MOUSE_MOD_2; if (event->state & GDK_MOD1_MASK) - tw->mouse_state |= BROWSER_MOUSE_MOD_3; - + tw->mouse_state |= BROWSER_MOUSE_MOD_3; + + /* Record where we pressed, for use when determining whether to start + * a drag in motion notify events. */ + tw->last_x = event->x; + tw->last_y = event->y; + tree_mouse_action(tree, tw->mouse_state, event->x, event->y); return TRUE; @@ -334,8 +341,19 @@ gboolean nsgtk_tree_window_motion_notify_event(GtkWidget *widget, bool alt = event->state & GDK_MOD1_MASK; struct nsgtk_treeview *tw = (struct nsgtk_treeview *) g; struct tree *tree = tw->tree; - - + + if ((abs(event->x - tw->last_x) < 5) && + (abs(event->y - tw->last_y) < 5)) { + /* Mouse hasn't moved far enough from press coordinate for this + * to be considered a drag. */ + return FALSE; + } else { + /* This is a drag, ensure it's always treated as such, even if + * we drag back over the press location */ + tw->last_x = INT_MIN; + tw->last_y = INT_MIN; + } + /* Handle modifiers being removed */ if (tw->mouse_state & BROWSER_MOUSE_MOD_1 && !shift) tw->mouse_state ^= BROWSER_MOUSE_MOD_1; |