bgo#529908 - Sanitize handling of motion events in GtkNotebook
GtkNotebook used gdk_window_get_pointer() incorrectly, as it already had coordinates from various GdkEvents. Using get_pointer() means that you get pointer positions *after* the event has happened, which leads to visual out-of-sync results, or inadvertently detached tabs if you click on them while your machine is being slow. Signed-off-by: Federico Mena Quintero <federico@novell.com>
This commit is contained in:

committed by
Federico Mena Quintero

parent
b436f5b8a3
commit
a39b2dcee4
@ -2532,10 +2532,8 @@ gtk_notebook_button_press (GtkWidget *widget,
|
|||||||
priv->during_reorder = FALSE;
|
priv->during_reorder = FALSE;
|
||||||
priv->pressed_button = event->button;
|
priv->pressed_button = event->button;
|
||||||
|
|
||||||
gdk_window_get_pointer (widget->window,
|
priv->mouse_x = x;
|
||||||
&priv->mouse_x,
|
priv->mouse_y = y;
|
||||||
&priv->mouse_y,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
priv->drag_begin_x = priv->mouse_x;
|
priv->drag_begin_x = priv->mouse_x;
|
||||||
priv->drag_begin_y = priv->mouse_y;
|
priv->drag_begin_y = priv->mouse_y;
|
||||||
@ -2969,6 +2967,7 @@ gtk_notebook_motion_notify (GtkWidget *widget,
|
|||||||
GtkNotebookPointerPosition pointer_position;
|
GtkNotebookPointerPosition pointer_position;
|
||||||
GtkSettings *settings;
|
GtkSettings *settings;
|
||||||
guint timeout;
|
guint timeout;
|
||||||
|
gint x_win, y_win;
|
||||||
|
|
||||||
page = notebook->cur_page;
|
page = notebook->cur_page;
|
||||||
|
|
||||||
@ -2986,10 +2985,14 @@ gtk_notebook_motion_notify (GtkWidget *widget,
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
priv->timestamp = event->time;
|
priv->timestamp = event->time;
|
||||||
gdk_window_get_pointer (widget->window,
|
|
||||||
&priv->mouse_x,
|
/* While animating the move, event->x is relative to the flying tab
|
||||||
&priv->mouse_y,
|
* (priv->drag_window has a pointer grab), but we need coordinates relative to
|
||||||
NULL);
|
* the notebook widget.
|
||||||
|
*/
|
||||||
|
gdk_window_get_origin (widget->window, &x_win, &y_win);
|
||||||
|
priv->mouse_x = event->x_root - x_win;
|
||||||
|
priv->mouse_y = event->y_root - y_win;
|
||||||
|
|
||||||
arrow = gtk_notebook_get_arrow (notebook, priv->mouse_x, priv->mouse_y);
|
arrow = gtk_notebook_get_arrow (notebook, priv->mouse_x, priv->mouse_y);
|
||||||
if (arrow != notebook->in_child)
|
if (arrow != notebook->in_child)
|
||||||
|
Reference in New Issue
Block a user