]> git.decadent.org.uk Git - ion3.git/blobdiff - mod_dock/dock.c
Imported Upstream version 20090110
[ion3.git] / mod_dock / dock.c
index 3b18513a830288a684254c7684123cb7c61e9881..174942c3656f3c9ed39188f206b9d00eeb5bb544 100644 (file)
@@ -2,7 +2,7 @@
  * Ion dock module
  * Copyright (C) 2003 Tom Payne
  * Copyright (C) 2003 Per Olofsson
- * Copyright (C) 2004-2006 Tuomo Valkonen
+ * Copyright (C) 2004-2009 Tuomo Valkonen
  *
  * by Tom Payne <ion@tompayne.org>
  * based on code by Per Olofsson <pelle@dsv.su.se>
@@ -611,34 +611,6 @@ static void dock_arrange_dockapps(WDock *dock, const WRectangle *bd_dockg,
 }
 
 
-static void calc_dock_pos(WRectangle *dg, const WRectangle *pg, int pos)
-{
-    switch(pos&DOCK_HPOS_MASK){
-    case DOCK_HPOS_LEFT:
-        dg->x=pg->x;
-        break;
-    case DOCK_HPOS_CENTER:
-        dg->x=pg->x+(pg->w-dg->w)/2;
-        break;
-    case DOCK_HPOS_RIGHT:
-        dg->x=pg->x+(pg->w-dg->w);
-        break;
-    }
-    
-    switch(pos&DOCK_VPOS_MASK){
-    case DOCK_VPOS_TOP:
-        dg->y=pg->y;
-        break;
-    case DOCK_VPOS_MIDDLE:
-        dg->y=pg->y+(pg->h-dg->h)/2;
-        break;
-    case DOCK_VPOS_BOTTOM:
-        dg->y=pg->y+(pg->h-dg->h);
-        break;
-    }
-}
-
-    
 static void dock_set_minmax(WDock *dock, int grow, const WRectangle *g)
 {
     dock->min_w=g->w;
@@ -799,11 +771,12 @@ static void dock_managed_rqgeom_(WDock *dock, WRegion *reg, int flags,
         dock_geom.w=tile_size.w;
         dock_geom.h=tile_size.h;
     }
+    
+    border_dock_geom.x=REGION_GEOM(dock).x;
+    border_dock_geom.y=REGION_GEOM(dock).y;
     border_dock_geom.w=dock_bdw.left+dock_geom.w+dock_bdw.right;
     border_dock_geom.h=dock_bdw.top+dock_geom.h+dock_bdw.bottom;
     
-    calc_dock_pos(&border_dock_geom, &parent_geom, pos);
-    
     /* Fit dock to new geom if required */
     if(!(flags&REGION_RQGEOM_TRYONLY)){
         WRQGeomParams rq=RQGEOMPARAMS_INIT;
@@ -905,7 +878,7 @@ static void dock_draw(WDock *dock, bool complete)
         {
             WRectangle geom=REGION_GEOM(dock);
             geom.x=geom.y=0;
-            grbrush_draw_border(dock->brush, &geom, "dock");
+            grbrush_draw_border(dock->brush, &geom);
         }
         break;
     case DOCK_OUTLINE_STYLE_EACH:
@@ -913,8 +886,7 @@ static void dock_draw(WDock *dock, bool complete)
             WDockApp *dockapp;
             for(dockapp=dock->dockapps; dockapp!=NULL;
                 dockapp=dockapp->next){
-                grbrush_draw_border(dock->brush, &dockapp->tile_geom, 
-                                    "dock");
+                grbrush_draw_border(dock->brush, &dockapp->tile_geom);
             }
         }
         break;
@@ -992,6 +964,33 @@ static void mplexpos(int pos, int *mpos)
     else
         *mpos=p;
 }
+
+
+static void mplexszplcy(int pos, WSizePolicy *szplcy)
+{
+    int hp=pos&DOCK_HPOS_MASK, vp=pos&DOCK_VPOS_MASK;
+    WSizePolicy p;
+    
+    p=(vp!=DOCK_VPOS_MIDDLE
+       ? (vp==DOCK_VPOS_TOP
+          ? (hp!=DOCK_HPOS_CENTER
+             ? (hp==DOCK_HPOS_RIGHT
+                ? SIZEPOLICY_GRAVITY_NORTHEAST
+                : SIZEPOLICY_GRAVITY_NORTHWEST)
+             : SIZEPOLICY_GRAVITY_NORTH)
+          : (hp!=DOCK_HPOS_CENTER
+             ? (hp==DOCK_HPOS_RIGHT
+                ? SIZEPOLICY_GRAVITY_SOUTHEAST
+                : SIZEPOLICY_GRAVITY_SOUTHWEST)
+             : SIZEPOLICY_GRAVITY_SOUTH))
+       : (hp!=DOCK_HPOS_CENTER
+          ? (hp==DOCK_HPOS_RIGHT
+             ? SIZEPOLICY_GRAVITY_EAST
+             : SIZEPOLICY_GRAVITY_WEST)
+          : SIZEPOLICY_GRAVITY_CENTER));
+    
+    *szplcy=p;
+}
     
 
 static void dock_do_set(WDock *dock, ExtlTab conftab, bool resize)
@@ -1037,6 +1036,10 @@ static void dock_do_set(WDock *dock, ExtlTab conftab, bool resize)
                     dock_managed_rqgeom_(dock, NULL, 0, NULL, NULL, TRUE);
                 }
                 mplex_set_stdisp(par, (WRegion*)dock, &din);
+            }else if((WRegion*)par==REGION_MANAGER(dock)){
+                WSizePolicy szplcy;
+                mplexszplcy(dock->pos, &szplcy);
+                mplex_set_szplcy(par, (WRegion*)dock, szplcy);
             }
         }
         
@@ -1125,8 +1128,6 @@ static bool dock_init(WDock *dock, WWindow *parent, const WFitParams *fp)
     
     region_add_bindmap((WRegion*)dock, dock_bindmap);
 
-    ((WRegion*)dock)->flags|=REGION_SKIP_FOCUS;
-
     window_select_input(&(dock->win), IONCORE_EVENTMASK_CWINMGR);
 
     dock_brush_get(dock);
@@ -1156,18 +1157,6 @@ static void dock_deinit(WDock *dock)
 }
 
 
-bool dock_may_destroy(WDock *dock)
-{
-    if(dock->dockapps!=NULL){
-        warn_obj(modname, "Dock \"%s\" is still managing other objects "
-                " -- refusing to close.", region_name((WRegion*)dock));
-        return FALSE;
-    }
-
-    return TRUE;
-}
-
-
 EXTL_EXPORT
 WDock *mod_dock_create(ExtlTab tab)
 {
@@ -1178,6 +1167,7 @@ WDock *mod_dock_create(ExtlTab tab)
     WDock *dock=NULL;
     WRegion *stdisp=NULL;
     WMPlexSTDispInfo din;
+    WFitParams fp;
     
     if(extl_table_gets_s(tab, "mode", &mode)){
         if(strcmp(mode, "floating")==0){
@@ -1215,62 +1205,53 @@ WDock *mod_dock_create(ExtlTab tab)
     }
 
     /* Create the dock */
-    
-    if(floating){
-        WMPlexAttachParams par;
-        
-        par.flags=(MPLEX_ATTACH_UNNUMBERED
-                   |MPLEX_ATTACH_SIZEPOLICY
-                   |MPLEX_ATTACH_GEOM);
-        
-        par.szplcy=SIZEPOLICY_FREE;
-        par.geom.x=0;
-        par.geom.y=0;
-        par.geom.w=1;
-        par.geom.h=1;
-        
-        if(extl_table_is_bool_set(tab, "floating_hidden"))
-            par.flags|=MPLEX_ATTACH_HIDDEN;
-        
-        dock=(WDock*)mplex_do_attach_new((WMPlex*)screen, &par,
-                                         (WRegionCreateFn*)create_dock, 
-                                         NULL);
-    }else{
-        WFitParams fp;
-        
-        fp.mode=REGION_FIT_BOUNDS|REGION_FIT_WHATEVER;
-        fp.g.x=0;
-        fp.g.y=0;
-        fp.g.w=1;
-        fp.g.h=1;
+    fp.mode=REGION_FIT_BOUNDS|REGION_FIT_WHATEVER;
+    fp.g.x=0;
+    fp.g.y=0;
+    fp.g.w=1;
+    fp.g.h=1;
         
-        dock=create_dock((WWindow*)screen, &fp);
-    }
+    dock=create_dock((WWindow*)screen, &fp);
 
     if(dock==NULL){
         warn("Failed to create dock.");
         return NULL;
     }
     
+        
     /* Get parameters */
     dock->save=FALSE;
     dock_do_set(dock, tab, FALSE);
     
+    /* Calculate min/max size */
+    dock_managed_rqgeom_(dock, NULL, 0, NULL, NULL, TRUE);
+
     /* Final setup */    
     if(floating){
-        WRQGeomParams rq=RQGEOMPARAMS_INIT;
         const WRectangle *pg=&REGION_GEOM(screen);
+        WMPlexAttachParams par=MPLEXATTACHPARAMS_INIT;
+        WRegionAttachData data;
         
-        /* Just calculate real min/max size */
-        dock_managed_rqgeom_(dock, NULL, 0, NULL, NULL, TRUE);
+        par.flags=(MPLEX_ATTACH_UNNUMBERED
+                   |MPLEX_ATTACH_SIZEPOLICY
+                   |MPLEX_ATTACH_GEOM
+                   |MPLEX_ATTACH_PASSIVE);
         
-        rq.geom.w=minof(dock->min_w, pg->w);
-        rq.geom.h=minof(dock->min_h, pg->h);
-        calc_dock_pos(&rq.geom, pg, dock->pos);
+        par.geom.w=dock->min_w;
+        par.geom.h=dock->min_h;
+        par.geom.x=0;
+        par.geom.y=0;
         
-        region_rqgeom((WRegion*)dock, &rq, NULL);
+        mplexszplcy(dock->pos, &par.szplcy);
+        
+        if(extl_table_is_bool_set(tab, "floating_hidden"))
+            par.flags|=MPLEX_ATTACH_HIDDEN;
         
-        return dock;
+        data.type=REGION_ATTACH_REPARENT;
+        data.u.reg=(WRegion*)dock;
+        
+        if(mplex_do_attach((WMPlex*)screen, &par, &data))
+            return dock;
     }else{
         mplexpos(dock->pos, &din.pos);
         din.fullsize=FALSE; /* not supported */
@@ -1450,9 +1431,9 @@ static WPHolder *dock_managed_get_pholder(WDock *dock, WRegion *mgd)
 
 static WPHolder *dock_prepare_manage(WDock *dock, const WClientWin *cwin,
                                      const WManageParams *param UNUSED,
-                                     int redir)
+                                     int priority)
 {
-    if(redir==MANAGE_REDIR_STRICT_YES)
+    if(!MANAGE_PRIORITY_OK(priority, MANAGE_PRIORITY_LOW))
         return NULL;
 
     return (WPHolder*)create_basicpholder((WRegion*)dock,
@@ -1596,7 +1577,7 @@ static bool clientwin_do_manage_hook(WClientWin *cwin, const WManageParams *para
     }
 
     return region_manage_clientwin((WRegion*)dock, cwin, param,
-                                   MANAGE_REDIR_PREFER_NO);
+                                   MANAGE_PRIORITY_NONE);
 }
 
 
@@ -1684,7 +1665,6 @@ static DynFunTab dock_dynfuntab[]={
     {region_size_hints, dock_size_hints},
     {(DynFun*)region_fitrep, (DynFun*)dock_fitrep},
     {(DynFun*)region_orientation, (DynFun*)dock_orientation},
-    {(DynFun*)region_may_destroy, (DynFun*)dock_may_destroy},
     {(DynFun*)region_handle_drop, (DynFun*)dock_handle_drop},
 
     {(DynFun*)region_managed_get_pholder,