0e661c4303199297385abf476aa47f22cb9550a0
[mono.git] / bockbuild / mac-sdk / patches / gtk / 0070-tooltips-focus.patch
1 diff --git a/gtk/gtktooltip.c b/gtk/gtktooltip.c
2 index 9918165..0efe4ff 100644
3 --- a/gtk/gtktooltip.c
4 +++ b/gtk/gtktooltip.c
5 @@ -98,6 +98,9 @@ static void       gtk_tooltip_display_closed       (GdkDisplay      *display,
6  static void       gtk_tooltip_set_last_window      (GtkTooltip      *tooltip,
7                                                     GdkWindow       *window);
8  static void       update_shape                     (GtkTooltip      *tooltip);
9 +static void       toplevel_focus_out               (GtkWidget       *widget,
10 +                                                    GdkEventFocus   *event,
11 +                                                    GtkTooltip      *tooltip);
12
13
14  G_DEFINE_TYPE (GtkTooltip, gtk_tooltip, G_TYPE_OBJECT);
15 @@ -1169,6 +1172,7 @@ gtk_tooltip_show_tooltip (GdkDisplay *display)
16    GdkScreen *screen;
17
18    GdkWindow *window;
19 +  GtkWidget *toplevel;
20    GtkWidget *tooltip_widget;
21    GtkWidget *pointer_widget;
22    GtkTooltip *tooltip;
23 @@ -1220,6 +1224,11 @@ gtk_tooltip_show_tooltip (GdkDisplay *display)
24         tooltip->current_window = GTK_WINDOW (GTK_TOOLTIP (tooltip)->window);
25      }
26
27 +  toplevel = gtk_widget_get_toplevel (GTK_WIDGET (tooltip_widget));
28 +  g_signal_connect (toplevel, "focus-out-event",
29 +                    G_CALLBACK (toplevel_focus_out),
30 +                    tooltip);
31 +
32    screen = gtk_widget_get_screen (tooltip_widget);
33
34    /* FIXME: should use tooltip->current_window iso tooltip->window */
35 @@ -1251,6 +1260,8 @@ gtk_tooltip_show_tooltip (GdkDisplay *display)
36  static void
37  gtk_tooltip_hide_tooltip (GtkTooltip *tooltip)
38  {
39 +  GtkWidget *toplevel;
40 +
41    if (!tooltip)
42      return;
43
44 @@ -1263,6 +1274,10 @@ gtk_tooltip_hide_tooltip (GtkTooltip *tooltip)
45    if (!GTK_TOOLTIP_VISIBLE (tooltip))
46      return;
47
48 +  toplevel = gtk_widget_get_toplevel (tooltip->tooltip_widget);
49 +  if (toplevel)
50 +    g_signal_handlers_disconnect_by_func (toplevel, G_CALLBACK (toplevel_focus_out), tooltip);
51 +
52    tooltip->tooltip_widget = NULL;
53
54    if (!tooltip->keyboard_mode_enabled)
55 @@ -1302,6 +1317,14 @@ gtk_tooltip_hide_tooltip (GtkTooltip *tooltip)
56      }
57  }
58
59 +static void
60 +toplevel_focus_out (GtkWidget    *widget,
61 +                    GdkEventFocus *event,
62 +                    GtkTooltip    *tooltip)
63 +{
64 +  gtk_tooltip_hide_tooltip (tooltip);
65 +}
66 +
67  static gint
68  tooltip_popup_timeout (gpointer data)
69  {