]> git.decadent.org.uk Git - ion3.git/blobdiff - ioncore/detach.c
Imported Upstream version 20090110
[ion3.git] / ioncore / detach.c
index 2d24fee42c70d7fc31db0200e30a6e01c5cbb717..e175759e7d231d0d1681da036f5280b7746ac594 100644 (file)
@@ -1,11 +1,13 @@
 /*
  * ion/ioncore/detach.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2007
+ * Copyright (c) Tuomo Valkonen 1999-2009
  *
  * See the included file LICENSE for details.
  */
 
+#include <string.h>
+
 #include <libtu/objp.h>
 #include <libtu/setparam.h>
 #include <libtu/minmax.h>
@@ -61,6 +63,7 @@ static bool ioncore_do_detach(WRegion *reg, WGroup *grp, WFrameMode framemode,
     }
     
     if(framemode!=FRAME_MODE_UNKNOWN){
+        /* TODO: remove/obsolete this special case */
         WFramedParam fpa=FRAMEDPARAM_INIT;
         
         fpa.mode=framemode;
@@ -81,12 +84,18 @@ static bool ioncore_do_detach(WRegion *reg, WGroup *grp, WFrameMode framemode,
     }else{
         WStacking *st=ioncore_find_stacking(reg);
         
+        ap.level_set=TRUE;
+        ap.level=framelevel+1;
+
         if(st!=NULL){
             ap.szplcy=st->szplcy;
             ap.szplcy_set=TRUE;
             
-            ap.level_set=TRUE;
-            ap.level=maxof(st->level, STACKING_LEVEL_NORMAL);
+            /* Hack for modal detached queries, while transients become
+             * non-modal detached.
+             */
+            if(st->level>STACKING_LEVEL_MODAL1)
+                ap.level=st->level;
         }
         
         ap.geom_set=TRUE;
@@ -115,9 +124,10 @@ static WRegion *check_mplex(WRegion *reg, WFrameMode *mode)
         
     *mode=FRAME_MODE_FLOATING;
     
-    if(OBJ_IS(mplex, WFrame)
-       && frame_mode((WFrame*)mplex)==FRAME_MODE_TRANSIENT){
-        *mode=FRAME_MODE_TRANSIENT;
+    if(OBJ_IS(mplex, WFrame)){
+        WFrameMode mode2=frame_mode((WFrame*)mplex);
+        if(framemode_unalt(mode2)==FRAME_MODE_TRANSIENT)
+            *mode=mode2;
     }
     
     return (WRegion*)mplex;
@@ -212,7 +222,6 @@ bool ioncore_detach_extl(WRegion *reg, const char *how)
 void do_unsqueeze(WRegion *reg)
 {
     WSizeHints h;
-    WRegion *mgr=REGION_MANAGER(reg);
     
     if(OBJ_IS(reg, WScreen))
         return;
@@ -228,11 +237,6 @@ void do_unsqueeze(WRegion *reg)
     }
     
     ioncore_detach(reg, SETPARAM_SET);
-        
-    if(REGION_MANAGER(reg)==mgr)
-        return;
-    
-    do_unsqueeze(reg);
 }
 
 
@@ -246,7 +250,7 @@ EXTL_EXPORT
 void ioncore_unsqueeze(WRegion *reg, bool override)
 {
     if(ioncore_g.unsqueeze_enabled || override)
-        do_unsqueeze(region_groupleader_of(reg));
+        do_unsqueeze(reg);
 }