static void emoticon_tool_button_popdown (EEmoticonToolButton *button) { GtkToggleToolButton *tool_button; if (!gtk_widget_get_realized (GTK_WIDGET (button))) return; if (!button->priv->popup_shown) return; /* Hide the pop-up. */ gtk_device_grab_remove (button->priv->window, button->priv->grab_mouse); gtk_widget_hide (button->priv->window); /* Deactivate the tool button. */ tool_button = GTK_TOGGLE_TOOL_BUTTON (button); gtk_toggle_tool_button_set_active (tool_button, FALSE); if (button->priv->grab_keyboard) gdk_device_ungrab (button->priv->grab_keyboard, GDK_CURRENT_TIME); if (button->priv->grab_mouse) gdk_device_ungrab (button->priv->grab_mouse, GDK_CURRENT_TIME); button->priv->grab_keyboard = NULL; button->priv->grab_mouse = NULL; }
/* * gtk_bubble_window_ungrab: * @window: a #GtkBubbleWindow * * This functions undoes a grab added through gtk_bubble_window_grab() * in this @window, * * Since: 3.8 */ void _gtk_bubble_window_ungrab (GtkBubbleWindow *window) { GtkBubbleWindowPrivate *priv; g_return_if_fail (GTK_IS_BUBBLE_WINDOW (window)); priv = window->priv; if (!priv->device) return; gdk_device_ungrab (priv->device, GDK_CURRENT_TIME); gdk_device_ungrab (gdk_device_get_associated_device (priv->device), GDK_CURRENT_TIME); gtk_device_grab_remove (GTK_WIDGET (window), priv->device); priv->device = NULL; }
static void gtk_popup_button_popdown_real (GtkPopupButton *popup_button) { GtkPopupButtonPrivate *priv = popup_button->priv; g_return_if_fail (GTK_IS_POPUP_BUTTON (popup_button)); if (!gtk_widget_get_realized (GTK_WIDGET (popup_button))) return; gdk_device_ungrab (priv->grab_keyboard, GDK_CURRENT_TIME); gdk_device_ungrab (priv->grab_pointer, GDK_CURRENT_TIME); gtk_device_grab_remove (priv->dock, priv->grab_pointer); gtk_widget_hide (priv->dock); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (popup_button), FALSE); priv->grab_pointer = NULL; priv->grab_keyboard = NULL; }
static gboolean ungrab_keyboard (GtkWidget *win, GdkEvent *event, gpointer data) { #if GTK_CHECK_VERSION (3,0,0) if (grabbed_device) { g_signal_handler_disconnect (win, grab_broken_id); gdk_device_ungrab (grabbed_device, grabbed_at); gtk_device_grab_remove (win, grabbed_device); grabbed_device = NULL; grabbed_at = 0; grab_broken_id = 0; } #else if (keyboard_grabbed) gdk_keyboard_ungrab (gdk_event_get_time (event)); keyboard_grabbed = FALSE; #endif /* Always return false, so event is handled elsewhere */ return FALSE; }
static void gtk_button_finish_activate (GtkButton *button, gboolean do_it) { GtkWidget *widget = GTK_WIDGET (button); GtkButtonPrivate *priv = button->priv; g_source_remove (priv->activate_timeout); priv->activate_timeout = 0; if (priv->grab_keyboard) { gdk_seat_ungrab (gdk_device_get_seat (priv->grab_keyboard)); gtk_device_grab_remove (widget, priv->grab_keyboard); priv->grab_keyboard = NULL; } priv->button_down = FALSE; gtk_button_update_state (button); if (do_it) gtk_button_clicked (button); }
static void gtk_popup_button_popup_real (GtkPopupButton *popup_button, GdkDevice *device) { GtkPopupButtonPrivate *priv = popup_button->priv; GtkAllocation button_allocation, dock_allocation; GdkScreen *screen; gint monitor_num; GdkRectangle monitor; GtkWidget *toplevel; GdkDevice *keyboard, *pointer; guint32 time; gint x, y; g_return_if_fail (GTK_IS_POPUP_BUTTON (popup_button)); g_return_if_fail (GDK_IS_DEVICE (device)); if (!gtk_widget_get_realized (GTK_WIDGET (popup_button))) return; if (gtk_widget_get_mapped (priv->dock)) return; if (priv->grab_pointer && priv->grab_keyboard) return; time = gtk_get_current_event_time (); if (gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD) { keyboard = device; pointer = gdk_device_get_associated_device (device); } else { pointer = device; keyboard = gdk_device_get_associated_device (device); } toplevel = gtk_widget_get_toplevel (GTK_WIDGET (popup_button)); if (GTK_IS_WINDOW (toplevel)) gtk_window_group_add_window (gtk_window_get_group (GTK_WINDOW (toplevel)), GTK_WINDOW (priv->dock)); /* positioning */ gtk_widget_show (priv->dock); gtk_widget_get_allocation (GTK_WIDGET (popup_button), &button_allocation); gdk_window_get_root_coords (gtk_widget_get_window (GTK_WIDGET (popup_button)), button_allocation.x, button_allocation.y, &x, &y); gtk_widget_get_allocation (GTK_WIDGET (priv->dock), &dock_allocation); x = (x + button_allocation.width / 2) - (dock_allocation.width / 2); y = y - dock_allocation.height; GdkWindow *window = window = gtk_widget_get_window (GTK_WIDGET (popup_button)); screen = gtk_widget_get_screen (GTK_WIDGET (priv->dock)); monitor_num = gdk_screen_get_monitor_at_window (screen, window); gdk_screen_get_monitor_workarea (screen, monitor_num, &monitor); if (x < monitor.x) x = monitor.x; else if (x + dock_allocation.width > monitor.x + monitor.width) x = monitor.x + monitor.width - dock_allocation.width; gtk_window_move (GTK_WINDOW (priv->dock), x, y); /* grabbing */ gtk_widget_grab_focus (priv->dock); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (popup_button), TRUE); if (gdk_device_grab (pointer, gtk_widget_get_window (priv->dock), GDK_OWNERSHIP_WINDOW, TRUE, GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK, NULL, time) != GDK_GRAB_SUCCESS) { gtk_device_grab_remove (priv->dock, pointer); gtk_widget_hide (priv->dock); return; } if (gdk_device_grab (keyboard, gtk_widget_get_window (priv->dock), GDK_OWNERSHIP_WINDOW, TRUE, GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK, NULL, time) != GDK_GRAB_SUCCESS) { gdk_device_ungrab (pointer, time); gtk_device_grab_remove (priv->dock, pointer); gtk_widget_hide (priv->dock); return; } gtk_device_grab_add (priv->dock, pointer, TRUE); priv->grab_pointer = pointer; priv->grab_keyboard = keyboard; }