Let ObPrompts be modal dialogs, and when they are transient for a window, make it...
authorDana Jansens <danakj@orodu.net>
Fri, 22 Feb 2008 15:38:14 +0000 (10:38 -0500)
committerDana Jansens <danakj@orodu.net>
Fri, 22 Feb 2008 15:38:14 +0000 (10:38 -0500)
openbox/client.c
openbox/prompt.c
openbox/prompt.h
openbox/prop.c
openbox/prop.h

index 9fa311c..32daf66 100644 (file)
@@ -3442,7 +3442,7 @@ static void client_prompt_kill(ObClient *self)
         g_free(m);
     }
 
-    prompt_show(self->kill_prompt, self);
+    prompt_show(self->kill_prompt, self, TRUE);
 }
 
 void client_kill(ObClient *self)
index 84fe2d0..d3a1ab7 100644 (file)
@@ -21,6 +21,7 @@
 #include "screen.h"
 #include "openbox.h"
 #include "client.h"
+#include "group.h"
 #include "prop.h"
 #include "modkeys.h"
 #include "event.h"
@@ -435,7 +436,7 @@ static void render_all(ObPrompt *self)
         render_button(self, &self->button[i]);
 }
 
-void prompt_show(ObPrompt *self, ObClient *parent)
+void prompt_show(ObPrompt *self, ObClient *parent, gboolean modal)
 {
     gint i;
 
@@ -457,8 +458,33 @@ void prompt_show(ObPrompt *self, ObClient *parent)
             break;
         }
 
-    XSetTransientForHint(ob_display, self->super.window,
-                         (parent ? parent->window : 0));
+    if (parent) {
+        Atom states[1];
+        gint nstates;
+        Window p;
+        XWMHints h;
+
+        if (parent->group) {
+            /* make it transient for the window's group */
+            h.flags = WindowGroupHint;
+            h.window_group = parent->group->leader;
+            p = RootWindow(ob_display, ob_screen);
+        }
+        else {
+            /* make it transient for the window directly */
+            h.flags = 0;
+            p = parent->window;
+        }
+
+        XSetWMHints(ob_display, self->super.window, &h);
+        PROP_SET32(self->super.window, wm_transient_for, window, p);
+
+        states[0] = prop_atoms.net_wm_state_modal;
+        nstates = (modal ? 1 : 0);
+        PROP_SETA32(self->super.window, net_wm_state, atom, states, nstates);
+    }
+    else
+        PROP_ERASE(self->super.window, wm_transient_for);
 
     /* set up the dialog and render it */
     prompt_layout(self);
index c24f044..89d3d59 100644 (file)
@@ -100,7 +100,7 @@ void prompt_ref(ObPrompt *self);
 void prompt_unref(ObPrompt *self);
 
 /*! Show the prompt.  It will be centered within the given area rectangle */
-void prompt_show(ObPrompt *self, struct _ObClient *parent);
+void prompt_show(ObPrompt *self, struct _ObClient *parent, gboolean modal);
 void prompt_hide(ObPrompt *self);
 
 gboolean prompt_key_event(ObPrompt *self, XEvent *e);
index 695e441..5dc4a2f 100644 (file)
@@ -51,6 +51,7 @@ void prop_startup(void)
     CREATE(wm_client_machine, "WM_CLIENT_MACHINE");
     CREATE(wm_command, "WM_COMMAND");
     CREATE(wm_client_leader, "WM_CLIENT_LEADER");
+    CREATE(wm_transient_for, "WM_TRANSIENT_FOR");
     CREATE(motif_wm_hints, "_MOTIF_WM_HINTS");
 
     CREATE(sm_client_id, "SM_CLIENT_ID");
index ae42327..46c9301 100644 (file)
@@ -53,6 +53,7 @@ typedef struct Atoms {
     Atom wm_client_machine;
     Atom wm_command;
     Atom wm_client_leader;
+    Atom wm_transient_for;
     Atom motif_wm_hints;
 
     /* SM atoms */