mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-12-26 13:41:07 +00:00
GtkMenuShell: take a single device for grabs.
The other device will always be the associated device.
This commit is contained in:
parent
dfc9c87a46
commit
404f4c5d40
@ -1528,7 +1528,7 @@ gtk_menu_popup_for_device (GtkMenu *menu,
|
||||
{
|
||||
if (popup_grab_on_window (xgrab_shell->window, keyboard, pointer, activate_time))
|
||||
{
|
||||
_gtk_menu_shell_set_grab_devices (GTK_MENU_SHELL (xgrab_shell), keyboard, pointer);
|
||||
_gtk_menu_shell_set_grab_device (GTK_MENU_SHELL (xgrab_shell), pointer);
|
||||
GTK_MENU_SHELL (xgrab_shell)->have_xgrab = TRUE;
|
||||
}
|
||||
}
|
||||
@ -1540,7 +1540,7 @@ gtk_menu_popup_for_device (GtkMenu *menu,
|
||||
transfer_window = menu_grab_transfer_window_get (menu);
|
||||
if (popup_grab_on_window (transfer_window, keyboard, pointer, activate_time))
|
||||
{
|
||||
_gtk_menu_shell_set_grab_devices (GTK_MENU_SHELL (xgrab_shell), keyboard, pointer);
|
||||
_gtk_menu_shell_set_grab_device (GTK_MENU_SHELL (xgrab_shell), pointer);
|
||||
GTK_MENU_SHELL (xgrab_shell)->have_xgrab = TRUE;
|
||||
}
|
||||
}
|
||||
@ -1556,7 +1556,7 @@ gtk_menu_popup_for_device (GtkMenu *menu,
|
||||
return;
|
||||
}
|
||||
|
||||
_gtk_menu_shell_set_grab_devices (GTK_MENU_SHELL (menu), keyboard, pointer);
|
||||
_gtk_menu_shell_set_grab_device (GTK_MENU_SHELL (menu), pointer);
|
||||
menu_shell->active = TRUE;
|
||||
menu_shell->button = button;
|
||||
|
||||
@ -1771,6 +1771,8 @@ gtk_menu_popdown (GtkMenu *menu)
|
||||
gtk_widget_hide (menu->toplevel);
|
||||
gtk_window_set_transient_for (GTK_WINDOW (menu->toplevel), NULL);
|
||||
|
||||
pointer = _gtk_menu_shell_get_grab_device (menu_shell);
|
||||
|
||||
if (menu->torn_off)
|
||||
{
|
||||
gtk_widget_set_size_request (menu->tearoff_window, -1, -1);
|
||||
@ -1781,17 +1783,19 @@ gtk_menu_popdown (GtkMenu *menu)
|
||||
}
|
||||
else
|
||||
{
|
||||
GdkDevice *keyboard, *pointer;
|
||||
|
||||
/* We popped up the menu from the tearoff, so we need to
|
||||
* release the grab - we aren't actually hiding the menu.
|
||||
*/
|
||||
if (menu_shell->have_xgrab &&
|
||||
_gtk_menu_shell_get_grab_devices (menu_shell, &keyboard, &pointer))
|
||||
{
|
||||
gdk_device_ungrab (keyboard, GDK_CURRENT_TIME);
|
||||
gdk_device_ungrab (pointer, GDK_CURRENT_TIME);
|
||||
}
|
||||
if (menu_shell->have_xgrab && pointer)
|
||||
{
|
||||
GdkDevice *keyboard;
|
||||
|
||||
gdk_device_ungrab (pointer, GDK_CURRENT_TIME);
|
||||
keyboard = gdk_device_get_associated_device (pointer);
|
||||
|
||||
if (keyboard)
|
||||
gdk_device_ungrab (keyboard, GDK_CURRENT_TIME);
|
||||
}
|
||||
}
|
||||
|
||||
/* gtk_menu_popdown is called each time a menu item is selected from
|
||||
@ -1807,12 +1811,10 @@ gtk_menu_popdown (GtkMenu *menu)
|
||||
|
||||
menu_shell->have_xgrab = FALSE;
|
||||
|
||||
_gtk_menu_shell_get_grab_devices (menu_shell, NULL, &pointer);
|
||||
|
||||
if (pointer)
|
||||
gtk_device_grab_remove (GTK_WIDGET (menu), pointer);
|
||||
|
||||
_gtk_menu_shell_set_grab_devices (menu_shell, NULL, NULL);
|
||||
_gtk_menu_shell_set_grab_device (menu_shell, NULL);
|
||||
|
||||
menu_grab_transfer_window_destroy (menu);
|
||||
}
|
||||
@ -4333,7 +4335,7 @@ gtk_menu_position (GtkMenu *menu)
|
||||
widget = GTK_WIDGET (menu);
|
||||
|
||||
screen = gtk_widget_get_screen (widget);
|
||||
_gtk_menu_shell_get_grab_devices (GTK_MENU_SHELL (menu), NULL, &pointer);
|
||||
pointer = _gtk_menu_shell_get_grab_device (GTK_MENU_SHELL (menu));
|
||||
gdk_display_get_device_state (gdk_screen_get_display (screen),
|
||||
pointer, &pointer_screen, &x, &y, NULL);
|
||||
|
||||
@ -5452,7 +5454,7 @@ gtk_menu_grab_notify (GtkWidget *widget,
|
||||
GtkWidget *grab;
|
||||
GdkDevice *pointer;
|
||||
|
||||
_gtk_menu_shell_get_grab_devices (GTK_MENU_SHELL (widget), NULL, &pointer);
|
||||
pointer = _gtk_menu_shell_get_grab_device (GTK_MENU_SHELL (widget));
|
||||
|
||||
if (!pointer ||
|
||||
!gtk_widget_device_is_shadowed (widget, pointer))
|
||||
|
@ -135,7 +135,6 @@ struct _GtkMenuShellPrivate
|
||||
GtkMnemonicHash *mnemonic_hash;
|
||||
GtkKeyHash *key_hash;
|
||||
|
||||
GdkDevice *grab_keyboard;
|
||||
GdkDevice *grab_pointer;
|
||||
|
||||
guint take_focus : 1;
|
||||
@ -1097,12 +1096,16 @@ gtk_real_menu_shell_deactivate (GtkMenuShell *menu_shell)
|
||||
}
|
||||
if (menu_shell->have_xgrab)
|
||||
{
|
||||
gdk_device_ungrab (priv->grab_pointer, GDK_CURRENT_TIME);
|
||||
gdk_device_ungrab (priv->grab_keyboard, GDK_CURRENT_TIME);
|
||||
GdkDevice *keyboard;
|
||||
|
||||
menu_shell->have_xgrab = FALSE;
|
||||
priv->grab_pointer = NULL;
|
||||
priv->grab_keyboard = NULL;
|
||||
gdk_device_ungrab (priv->grab_pointer, GDK_CURRENT_TIME);
|
||||
keyboard = gdk_device_get_associated_device (priv->grab_pointer);
|
||||
|
||||
if (keyboard)
|
||||
gdk_device_ungrab (keyboard, GDK_CURRENT_TIME);
|
||||
|
||||
menu_shell->have_xgrab = FALSE;
|
||||
_gtk_menu_shell_set_grab_device (menu_shell, NULL);
|
||||
}
|
||||
|
||||
menu_shell->keyboard_mode = FALSE;
|
||||
@ -1752,36 +1755,34 @@ _gtk_menu_shell_remove_mnemonic (GtkMenuShell *menu_shell,
|
||||
}
|
||||
|
||||
void
|
||||
_gtk_menu_shell_set_grab_devices (GtkMenuShell *menu_shell,
|
||||
GdkDevice *keyboard,
|
||||
GdkDevice *pointer)
|
||||
_gtk_menu_shell_set_grab_device (GtkMenuShell *menu_shell,
|
||||
GdkDevice *device)
|
||||
{
|
||||
GtkMenuShellPrivate *priv = GTK_MENU_SHELL_GET_PRIVATE (menu_shell);
|
||||
GtkMenuShellPrivate *priv;
|
||||
|
||||
g_return_if_fail (GTK_IS_MENU_SHELL (menu_shell));
|
||||
g_return_if_fail (!keyboard || GDK_IS_DEVICE (keyboard));
|
||||
g_return_if_fail (!pointer || GDK_IS_DEVICE (pointer));
|
||||
g_return_if_fail (!device || GDK_IS_DEVICE (device));
|
||||
|
||||
priv->grab_keyboard = keyboard;
|
||||
priv->grab_pointer = pointer;
|
||||
priv = GTK_MENU_SHELL_GET_PRIVATE (menu_shell);
|
||||
|
||||
if (!device)
|
||||
priv->grab_pointer = NULL;
|
||||
else if (device->source == GDK_SOURCE_KEYBOARD)
|
||||
priv->grab_pointer = gdk_device_get_associated_device (device);
|
||||
else
|
||||
priv->grab_pointer = device;
|
||||
}
|
||||
|
||||
gboolean
|
||||
_gtk_menu_shell_get_grab_devices (GtkMenuShell *menu_shell,
|
||||
GdkDevice **keyboard,
|
||||
GdkDevice **pointer)
|
||||
GdkDevice *
|
||||
_gtk_menu_shell_get_grab_device (GtkMenuShell *menu_shell)
|
||||
{
|
||||
GtkMenuShellPrivate *priv = GTK_MENU_SHELL_GET_PRIVATE (menu_shell);
|
||||
GtkMenuShellPrivate *priv;
|
||||
|
||||
g_return_val_if_fail (GTK_IS_MENU_SHELL (menu_shell), FALSE);
|
||||
|
||||
if (keyboard)
|
||||
*keyboard = priv->grab_keyboard;
|
||||
priv = GTK_MENU_SHELL_GET_PRIVATE (menu_shell);
|
||||
|
||||
if (pointer)
|
||||
*pointer = priv->grab_pointer;
|
||||
|
||||
return TRUE;
|
||||
return priv->grab_pointer;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -119,12 +119,9 @@ void _gtk_menu_shell_select_last (GtkMenuShell *menu_shell,
|
||||
void _gtk_menu_shell_activate (GtkMenuShell *menu_shell);
|
||||
gint _gtk_menu_shell_get_popup_delay (GtkMenuShell *menu_shell);
|
||||
|
||||
void _gtk_menu_shell_set_grab_devices (GtkMenuShell *menu_shell,
|
||||
GdkDevice *keyboard,
|
||||
GdkDevice *pointer);
|
||||
gboolean _gtk_menu_shell_get_grab_devices (GtkMenuShell *menu_shell,
|
||||
GdkDevice **keyboard,
|
||||
GdkDevice **pointer);
|
||||
void _gtk_menu_shell_set_grab_device (GtkMenuShell *menu_shell,
|
||||
GdkDevice *device);
|
||||
GdkDevice * _gtk_menu_shell_get_grab_device (GtkMenuShell *menu_shell);
|
||||
|
||||
void gtk_menu_shell_cancel (GtkMenuShell *menu_shell);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user