added proposed fixes
[hildon] / hildon-widgets / hildon-dialoghelp.c
index 178647b..fa5a1bb 100644 (file)
@@ -77,10 +77,16 @@ handle_xevent(GdkXEvent * xevent, GdkEvent * event, gpointer data)
  **/
 void gtk_dialog_help_enable(GtkDialog * dialog)
 {
-    Atom help_atom;
-    Display *disp;
     GdkWindow *window;
-
+    GdkDisplay *display;
+    Atom *protocols;
+    Atom *list;
+    Atom helpatom;
+    int amount = 0;
+    int n = 0;
+    int i = 0;
+    int help_enabled = -1;
+    
     if (help_signal == 0) {
         help_signal = g_signal_new("help", GTK_TYPE_DIALOG,
                                    G_SIGNAL_ACTION, (guint) - 1, NULL,
@@ -92,9 +98,79 @@ void gtk_dialog_help_enable(GtkDialog * dialog)
 
     gtk_widget_realize(GTK_WIDGET(dialog));
     window = GTK_WIDGET(dialog)->window;
-    disp = GDK_WINDOW_XDISPLAY(window);
+    display = gdk_drawable_get_display (window);
+
+    XGetWMProtocols(GDK_DISPLAY_XDISPLAY (display), GDK_WINDOW_XID (window),
+                   &list, &amount);
+    
+    protocols = (Atom *) malloc (amount * sizeof (Atom));
+    helpatom = gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_CONTEXT_HELP");
+
+    for (i=0; i<amount; i++)
+    {
+           protocols[n++] = list[i];
+           if (list[i] == helpatom)
+           {
+                   help_enabled = 1;
+           }
+    }
+    XFree (list);
+
+    if (!help_enabled)
+    {
+           protocols[n++] = gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_CONTEXT_HELP");
+    }
+    
+    XSetWMProtocols (GDK_DISPLAY_XDISPLAY (display), GDK_WINDOW_XID (window), protocols, n);
+    free (protocols);
+    
+    gdk_window_add_filter(window, handle_xevent, dialog);
+}
+
+
+/*
+ * gtk_dialog_help_disable:
+ * @dialog: The dialog of which help is to be disabled.
+ * 
+ */
+void gtk_dialog_help_disable(GtkDialog * dialog)
+{
+    GdkWindow *window=NULL;
+    GdkDisplay *display;
+    Atom *protocols;
+    Atom *list;
+    Atom helpatom;
+    int amount = 0;
+    int n = 0;
+    int i = 0;
+    
+    g_return_if_fail(GTK_IS_DIALOG(dialog));
+
+    gtk_widget_realize(GTK_WIDGET(dialog));
+    window = GTK_WIDGET(dialog)->window;
+    display = gdk_drawable_get_display (window);
+
+    XGetWMProtocols(GDK_DISPLAY_XDISPLAY (display), GDK_WINDOW_XID (window),
+                   &list, &amount);
+    
+    helpatom = gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_CONTEXT_HELP");
+    protocols = (Atom *) malloc (amount * sizeof (Atom));
+
+    for (i=0; i<amount; i++)
+    {
+           if (list[i] != helpatom)
+           {
+                   protocols[n++] = list[i];
+           }
+    }
+    XFree (list);
+    
+    XSetWMProtocols (GDK_DISPLAY_XDISPLAY (display), GDK_WINDOW_XID (window), protocols, n);
+    free (protocols);
 
-    help_atom = XInternAtom(disp, "_NET_WM_CONTEXT_HELP", False);
-    XSetWMProtocols(disp, GDK_WINDOW_XID(window), &help_atom, 1);
     gdk_window_add_filter(window, handle_xevent, dialog);
 }
+
+
+
+