diff --git a/gtk/gtktooltip.c b/gtk/gtktooltip.c index 9918165..0efe4ff 100644 --- a/gtk/gtktooltip.c +++ b/gtk/gtktooltip.c @@ -98,6 +98,9 @@ static void gtk_tooltip_display_closed (GdkDisplay *display, static void gtk_tooltip_set_last_window (GtkTooltip *tooltip, GdkWindow *window); static void update_shape (GtkTooltip *tooltip); +static void toplevel_focus_out (GtkWidget *widget, + GdkEventFocus *event, + GtkTooltip *tooltip); G_DEFINE_TYPE (GtkTooltip, gtk_tooltip, G_TYPE_OBJECT); @@ -1169,6 +1172,7 @@ gtk_tooltip_show_tooltip (GdkDisplay *display) GdkScreen *screen; GdkWindow *window; + GtkWidget *toplevel; GtkWidget *tooltip_widget; GtkWidget *pointer_widget; GtkTooltip *tooltip; @@ -1220,6 +1224,11 @@ gtk_tooltip_show_tooltip (GdkDisplay *display) tooltip->current_window = GTK_WINDOW (GTK_TOOLTIP (tooltip)->window); } + toplevel = gtk_widget_get_toplevel (GTK_WIDGET (tooltip_widget)); + g_signal_connect (toplevel, "focus-out-event", + G_CALLBACK (toplevel_focus_out), + tooltip); + screen = gtk_widget_get_screen (tooltip_widget); /* FIXME: should use tooltip->current_window iso tooltip->window */ @@ -1251,6 +1260,8 @@ gtk_tooltip_show_tooltip (GdkDisplay *display) static void gtk_tooltip_hide_tooltip (GtkTooltip *tooltip) { + GtkWidget *toplevel; + if (!tooltip) return; @@ -1263,6 +1274,10 @@ gtk_tooltip_hide_tooltip (GtkTooltip *tooltip) if (!GTK_TOOLTIP_VISIBLE (tooltip)) return; + toplevel = gtk_widget_get_toplevel (tooltip->tooltip_widget); + if (toplevel) + g_signal_handlers_disconnect_by_func (toplevel, G_CALLBACK (toplevel_focus_out), tooltip); + tooltip->tooltip_widget = NULL; if (!tooltip->keyboard_mode_enabled) @@ -1302,6 +1317,14 @@ gtk_tooltip_hide_tooltip (GtkTooltip *tooltip) } } +static void +toplevel_focus_out (GtkWidget *widget, + GdkEventFocus *event, + GtkTooltip *tooltip) +{ + gtk_tooltip_hide_tooltip (tooltip); +} + static gint tooltip_popup_timeout (gpointer data) {