mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-12-29 15:01:23 +00:00
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:
parent
79e267a330
commit
3dfab962fa
@ -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:
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user