From ce7e99ca5e9930a37bb3dd2e642ce41b2fa61fc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nelson=20Ben=C3=ADtez=20Le=C3=B3n?= Date: Tue, 3 Sep 2019 18:37:31 -0400 Subject: [PATCH] tooltips: hide tooltips before showing popups because if there's a tooltip visible then popups fail to show with the following warning: "Gdk-WARNING **: Tried to map a popup with a non-top most parent" This bug affect popups of the form: 1) popups from gtk_menu_popup_{at_widget|at_rect|for_device}() This can be reproduce with a normal GtkComboBox that has a tooltip attached (eg. via GtkBuilder 'tooltip_text' attribute). Also see GtkLabel reproducer from gtk3-demo mentioned in #1785 2) custom popups created with gtk_window_new (GTK_WINDOW_POPUP) A reproducer that shows this case is a GtkComboBox with the property 'appears-as-list'[1] set to TRUE (default is FALSE). Fixes issue #1785 [1] https://developer.gnome.org/gtk3/stable/GtkComboBox.html#GtkComboBox--s-appears-as-list --- gtk/gtkcombobox.c | 2 ++ gtk/gtkmenu.c | 2 ++ gtk/gtktooltip.c | 16 ++++++++++++++++ gtk/gtktooltipprivate.h | 1 + 4 files changed, 21 insertions(+) diff --git a/gtk/gtkcombobox.c b/gtk/gtkcombobox.c index 93f912b969..ef4996c027 100644 --- a/gtk/gtkcombobox.c +++ b/gtk/gtkcombobox.c @@ -44,6 +44,7 @@ #include "gtkwindow.h" #include "gtktypebuiltins.h" #include "gtkprivate.h" +#include "gtktooltipprivate.h" #include "gtkcomboboxprivate.h" #include @@ -2315,6 +2316,7 @@ gtk_combo_box_popup_for_device (GtkComboBox *combo_box, return; } + _gtk_tooltip_hide (GTK_WIDGET (combo_box)); toplevel = gtk_widget_get_toplevel (GTK_WIDGET (combo_box)); if (GTK_IS_WINDOW (toplevel)) { diff --git a/gtk/gtkmenu.c b/gtk/gtkmenu.c index e8928ec843..1be93d2b5e 100644 --- a/gtk/gtkmenu.c +++ b/gtk/gtkmenu.c @@ -133,6 +133,7 @@ #include "gtkcssnodeprivate.h" #include "gtkstylecontextprivate.h" #include "gtkcssstylepropertyprivate.h" +#include "gtktooltipprivate.h" #include "deprecated/gtktearoffmenuitem.h" @@ -1824,6 +1825,7 @@ gtk_menu_popup_internal (GtkMenu *menu, g_return_if_fail (GTK_IS_MENU (menu)); g_return_if_fail (device == NULL || GDK_IS_DEVICE (device)); + _gtk_tooltip_hide_in_display (gtk_widget_get_display (GTK_WIDGET (menu))); display = gtk_widget_get_display (GTK_WIDGET (menu)); if (device == NULL) diff --git a/gtk/gtktooltip.c b/gtk/gtktooltip.c index e5fc5dbdaa..f0f4e8b547 100644 --- a/gtk/gtktooltip.c +++ b/gtk/gtktooltip.c @@ -1280,6 +1280,22 @@ _gtk_tooltip_hide (GtkWidget *widget) gtk_tooltip_hide_tooltip (tooltip); } +void +_gtk_tooltip_hide_in_display (GdkDisplay *display) +{ + GtkTooltip *tooltip; + + if (!display) + return; + + tooltip = g_object_get_qdata (G_OBJECT (display), quark_current_tooltip); + + if (!tooltip || !GTK_TOOLTIP_VISIBLE (tooltip)) + return; + + gtk_tooltip_hide_tooltip (tooltip); +} + static gboolean tooltips_enabled (GdkEvent *event) { diff --git a/gtk/gtktooltipprivate.h b/gtk/gtktooltipprivate.h index 427015e007..41e2bc1aef 100644 --- a/gtk/gtktooltipprivate.h +++ b/gtk/gtktooltipprivate.h @@ -36,6 +36,7 @@ void _gtk_tooltip_focus_out (GtkWidget *widget); void _gtk_tooltip_toggle_keyboard_mode (GtkWidget *widget); void _gtk_tooltip_handle_event (GdkEvent *event); void _gtk_tooltip_hide (GtkWidget *widget); +void _gtk_tooltip_hide_in_display (GdkDisplay *display); GtkWidget * _gtk_widget_find_at_coords (GdkWindow *window, gint window_x,