Merge branch 'backport' into 3.4-working
authorDana Jansens <danakj@orodu.net>
Fri, 22 Feb 2008 15:53:12 +0000 (10:53 -0500)
committerDana Jansens <danakj@orodu.net>
Fri, 22 Feb 2008 15:53:12 +0000 (10:53 -0500)
openbox/client.c
openbox/prompt.c
openbox/prompt.h
openbox/prop.c
openbox/prop.h

index 9fa311c..fbe728d 100644 (file)
@@ -1621,7 +1621,7 @@ void client_update_normal_hints(ObClient *self)
     self->min_ratio = 0.0f;
     self->max_ratio = 0.0f;
     SIZE_SET(self->size_inc, 1, 1);
-    SIZE_SET(self->base_size, 0, 0);
+    SIZE_SET(self->base_size, -1, -1);
     SIZE_SET(self->min_size, 0, 0);
     SIZE_SET(self->max_size, G_MAXINT, G_MAXINT);
 
@@ -2895,7 +2895,7 @@ void client_try_configure(ObClient *self, gint *x, gint *y, gint *w, gint *h,
             0 : self->max_ratio;
 
         /* base size is substituted with min size if not specified */
-        if (self->base_size.width || self->base_size.height) {
+        if (self->base_size.width >= 0 || self->base_size.height >= 0) {
             basew = self->base_size.width;
             baseh = self->base_size.height;
         } else {
@@ -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 9a18c88..fd5d6c1 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 */