summaryrefslogtreecommitdiff
path: root/gtk/gtkcombobox.c
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@lanedo.com>2013-03-06 13:16:12 +0100
committerMatthias Clasen <mclasen@redhat.com>2013-03-12 07:23:17 -0400
commit24fa27732942b074e5a0c5872944cb3ba2fde1aa (patch)
tree250af0f33d00edeea9b03a7ba016bb2e8701e0bb /gtk/gtkcombobox.c
parentd1de6c322b96d100ae37be92b5d5890897190661 (diff)
downloadgtk+-24fa27732942b074e5a0c5872944cb3ba2fde1aa.tar.gz
combobox: popdown the combobox when on 'grab-broken-event'
And also explicitly remove pointer/keyboard grabs from the display. Whenever the grab is reported lost, we should popdown the combobox, so that the GDK_WINDOW_TEMP window is hidden and removed from the toplevel, as done with the menu for example. Leaving the GDK_WINDOW_TEMP window open when re-activating the application triggers several issues in the win32 backend, due to restacking windows of the non-toplevel group into the toplevel group: https://bugzilla.gnome.org/show_bug.cgi?id=695200
Diffstat (limited to 'gtk/gtkcombobox.c')
-rw-r--r--gtk/gtkcombobox.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/gtk/gtkcombobox.c b/gtk/gtkcombobox.c
index e7ef489f61..794cd00dd3 100644
--- a/gtk/gtkcombobox.c
+++ b/gtk/gtkcombobox.c
@@ -2331,6 +2331,19 @@ popup_grab_on_window (GdkWindow *window,
return TRUE;
}
+static gboolean
+gtk_combo_box_grab_broken_event (GtkWidget *widget,
+ GdkEventGrabBroken *event,
+ gpointer user_data)
+{
+ GtkComboBox *combo_box = GTK_COMBO_BOX (user_data);
+
+ if (event->grab_window == NULL)
+ gtk_combo_box_popdown (combo_box);
+
+ return TRUE;
+}
+
/**
* gtk_combo_box_popup:
* @combo_box: a #GtkComboBox
@@ -2455,6 +2468,11 @@ gtk_combo_box_popup_for_device (GtkComboBox *combo_box,
gtk_device_grab_add (priv->popup_window, pointer, TRUE);
priv->grab_pointer = pointer;
priv->grab_keyboard = keyboard;
+
+ g_signal_connect (priv->popup_window,
+ "grab-broken-event",
+ G_CALLBACK (gtk_combo_box_grab_broken_event),
+ combo_box);
}
static void
@@ -2521,6 +2539,10 @@ gtk_combo_box_popdown (GtkComboBox *combo_box)
if (!gtk_widget_get_realized (GTK_WIDGET (combo_box)))
return;
+ if (priv->grab_keyboard)
+ gdk_device_ungrab (priv->grab_keyboard, GDK_CURRENT_TIME);
+ gdk_device_ungrab (priv->grab_pointer, GDK_CURRENT_TIME);
+
gtk_device_grab_remove (priv->popup_window, priv->grab_pointer);
gtk_widget_hide (priv->popup_window);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->button),