Fix motion event handling in GTK treeview

svn path=/trunk/netsurf/; revision=12622
This commit is contained in:
John Mark Bell 2011-07-24 11:38:26 +00:00
parent b0aeeb1e78
commit f75b0fca43
2 changed files with 29 additions and 24 deletions

View File

@ -40,6 +40,7 @@ struct nsgtk_treeview {
GtkWindow *window;
GtkScrolledWindow *scrolled;
GtkDrawingArea *drawing_area;
bool mouse_pressed;
int mouse_pressed_x;
int mouse_pressed_y;
int last_x, last_y;
@ -220,8 +221,8 @@ gboolean nsgtk_tree_window_button_press_event(GtkWidget *widget,
struct tree *tree = tw->tree;
gtk_widget_grab_focus(GTK_WIDGET(tw->drawing_area));
tw->mouse_pressed = true;
tw->mouse_pressed_x = event->x;
tw->mouse_pressed_y = event->y;
@ -279,35 +280,35 @@ gboolean nsgtk_tree_window_button_release_event(GtkWidget *widget,
tw->mouse_state ^= (BROWSER_MOUSE_PRESS_2 |
BROWSER_MOUSE_CLICK_2);
/* Handle modifiers being removed */
if (tw->mouse_state & BROWSER_MOUSE_MOD_1 && !shift)
tw->mouse_state ^= BROWSER_MOUSE_MOD_1;
if (tw->mouse_state & BROWSER_MOUSE_MOD_2 && !ctrl)
tw->mouse_state ^= BROWSER_MOUSE_MOD_2;
if (tw->mouse_state & BROWSER_MOUSE_MOD_3 && !alt)
tw->mouse_state ^= BROWSER_MOUSE_MOD_3;
/* Handle modifiers being removed */
if (tw->mouse_state & BROWSER_MOUSE_MOD_1 && !shift)
tw->mouse_state ^= BROWSER_MOUSE_MOD_1;
if (tw->mouse_state & BROWSER_MOUSE_MOD_2 && !ctrl)
tw->mouse_state ^= BROWSER_MOUSE_MOD_2;
if (tw->mouse_state & BROWSER_MOUSE_MOD_3 && !alt)
tw->mouse_state ^= BROWSER_MOUSE_MOD_3;
if (tw->mouse_state &
(BROWSER_MOUSE_CLICK_1 | BROWSER_MOUSE_CLICK_2
| BROWSER_MOUSE_DOUBLE_CLICK))
tree_mouse_action(tree, tw->mouse_state,
event->x, event->y);
else
tree_drag_end(tree, tw->mouse_state,
tw->mouse_pressed_x,
tw->mouse_pressed_y,
event->x, event->y);
if (tw->mouse_state &
(BROWSER_MOUSE_CLICK_1 | BROWSER_MOUSE_CLICK_2
| BROWSER_MOUSE_DOUBLE_CLICK))
tree_mouse_action(tree, tw->mouse_state,
event->x, event->y);
else
tree_drag_end(tree, tw->mouse_state,
tw->mouse_pressed_x,
tw->mouse_pressed_y,
event->x, event->y);
tw->mouse_state = 0;
tw->mouse_state = 0;
tw->mouse_pressed = false;
return TRUE;
return TRUE;
}
gboolean nsgtk_tree_window_motion_notify_event(GtkWidget *widget,
GdkEventButton *event, gpointer g)
GdkEventMotion *event, gpointer g)
{
bool shift = event->state & GDK_SHIFT_MASK;
bool ctrl = event->state & GDK_CONTROL_MASK;
@ -315,6 +316,9 @@ gboolean nsgtk_tree_window_motion_notify_event(GtkWidget *widget,
struct nsgtk_treeview *tw = (struct nsgtk_treeview *) g;
struct tree *tree = tw->tree;
if (tw->mouse_pressed == false)
return TRUE;
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
@ -503,6 +507,7 @@ struct nsgtk_treeview *nsgtk_treeview_create(unsigned int flags,
tv->drawing_area = drawing_area;
tv->tree = tree_create(flags, &nsgtk_tree_callbacks, tv);
tv->mouse_state = 0;
tv->mouse_pressed = false;
gtk_widget_modify_bg(GTK_WIDGET(drawing_area), GTK_STATE_NORMAL,
&((GdkColor) { 0, 0xffff, 0xffff, 0xffff } ));

View File

@ -47,7 +47,7 @@ gboolean nsgtk_tree_window_button_press_event(GtkWidget *widget,
gboolean nsgtk_tree_window_button_release_event(GtkWidget *widget,
GdkEventButton *event, gpointer g);
gboolean nsgtk_tree_window_motion_notify_event(GtkWidget *widget,
GdkEventButton *event, gpointer g);
GdkEventMotion *event, gpointer g);
gboolean nsgtk_tree_window_keypress_event(GtkWidget *widget, GdkEventKey *event,
gpointer g);