added proposed fixes
[hildon] / hildon-widgets / hildon-dialoghelp.c
index a3a9738..fa5a1bb 100644 (file)
  */
 
 /*
-   @file hildon-dialoghelp.c
-
-   This file provides API for the help dialog with
-   the optional icon.
-*/
+ *  @file hildon-dialoghelp.c
+ *
+ *  This file provides API for the help dialog with
+ *  the optional icon.
+ *
+ */
 
 #include <gdk/gdkx.h>
 #include "hildon-dialoghelp.h"
@@ -69,17 +70,25 @@ handle_xevent(GdkXEvent * xevent, GdkEvent * event, gpointer data)
  * Enables context help button for given dialog. The signal "help" can be
  * connected to handler by normal gtk methods. Note that this function
  * has to be called before the dialog is shown.
+ *
+ * The "help" signal itself has no other parameters than the dialog where
+ * it is connected to, ie.:
+ * void user_function(GtkDialog *, gpointer user_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",
-                                   G_TYPE_FROM_INSTANCE(GTK_OBJECT
-                                                        (dialog)),
+        help_signal = g_signal_new("help", GTK_TYPE_DIALOG,
                                    G_SIGNAL_ACTION, (guint) - 1, NULL,
                                    NULL, g_cclosure_marshal_VOID__VOID,
                                    G_TYPE_NONE, 0);
@@ -89,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);
 
-    help_atom = XInternAtom(disp, "_NET_WM_CONTEXT_HELP", False);
-    XSetWMProtocols(disp, GDK_WINDOW_XID(window), &help_atom, 1);
+    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);
+
+    gdk_window_add_filter(window, handle_xevent, dialog);
+}
+
+
+
+