gtk: Implement per-focus implicit grabs

Unlike GTK+ grabs which are global to all/one device, the implicit grab
is per focus, which means each may have implicit grabs on different or
the same widget.
This commit is contained in:
Carlos Garnacho 2017-03-31 17:55:49 +02:00
parent 79e267a330
commit 3dfab962fa
3 changed files with 27 additions and 0 deletions

View File

@ -1505,6 +1505,9 @@ handle_pointing_event (GdkEvent *event)
if (event->type == GDK_MOTION_NOTIFY || event->type == GDK_ENTER_NOTIFY)
update_cursor (toplevel, device, target);
if (event->type == GDK_TOUCH_BEGIN)
gtk_window_set_pointer_focus_grab (toplevel, device, sequence, target);
/* Let it take the effective pointer focus anyway, as it may change due
* to implicit grabs.
*/
@ -1512,6 +1515,13 @@ handle_pointing_event (GdkEvent *event)
break;
case GDK_BUTTON_PRESS:
case GDK_BUTTON_RELEASE:
target = gtk_window_lookup_effective_pointer_focus_widget (toplevel,
device,
sequence);
gtk_window_set_pointer_focus_grab (toplevel, device, sequence,
event->type == GDK_BUTTON_PRESS ?
target : NULL);
break;
case GDK_SCROLL:
case GDK_TOUCHPAD_PINCH:
case GDK_TOUCHPAD_SWIPE:

View File

@ -11484,3 +11484,16 @@ gtk_window_update_pointer_focus_on_state_change (GtkWindow *window,
}
}
}
void
gtk_window_set_pointer_focus_grab (GtkWindow *window,
GdkDevice *device,
GdkEventSequence *sequence,
GtkWidget *grab_widget)
{
GtkPointerFocus *focus;
focus = gtk_window_lookup_pointer_focus (window, device, sequence);
g_assert (focus != NULL);
gtk_pointer_focus_set_implicit_grab (focus, grab_widget);
}

View File

@ -153,6 +153,10 @@ void gtk_window_update_pointer_focus (GtkWindow *window,
GtkWidget *target,
gdouble x,
gdouble y);
void gtk_window_set_pointer_focus_grab (GtkWindow *window,
GdkDevice *device,
GdkEventSequence *sequence,
GtkWidget *grab_widget);
void gtk_window_update_pointer_focus_on_state_change (GtkWindow *window,
GtkWidget *widget);