]> git.decadent.org.uk Git - ion3.git/blobdiff - ioncore/framedpholder.c
[svn-upgrade] Integrating new upstream version, ion3 (20070203)
[ion3.git] / ioncore / framedpholder.c
index 43375f2d2a51cb1f7c2a3c770999e426653b602c..6ef378bf3fd0d4b299ed79db1809b778a463c60b 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ion/ioncore/framedpholder.c
  *
- * Copyright (c) Tuomo Valkonen 2005-2006
+ * Copyright (c) Tuomo Valkonen 2005-2007
  *
  * Ion is free software; you can redistribute it and/or modify it under
  * the terms of the GNU Lesser General Public License as published by
@@ -65,37 +65,13 @@ typedef struct{
 } AP;
 
 
-WRegion *framed_handler(WWindow *par, 
-                        const WFitParams *fp, 
-                        void *ap_)
+void frame_adjust_to_initial(WFrame *frame, const WFitParams *fp, 
+                             const WFramedParam *param, WRegion *reg)
 {
-    AP *ap=(AP*)ap_;
-    WMPlexAttachParams mp=MPLEXATTACHPARAMS_INIT;
-    WFramedParam *param=ap->param;
     WRectangle rqg, mg;
-    WFrame *frame;
-    WRegion *reg;
-    
-    if(param->mkframe!=NULL)
-        frame=(WFrame*)(param->mkframe)(par, fp);
-    else
-        frame=create_frame(par, fp, FRAME_MODE_FLOATING);
-    
-    if(frame==NULL)
-        return NULL;
-    
-    if(fp->mode&(REGION_FIT_BOUNDS|REGION_FIT_WHATEVER))
-        mp.flags|=MPLEX_ATTACH_WHATEVER;
-
-    reg=mplex_do_attach(&frame->mplex, &mp, ap->data);
-    
-    if(reg==NULL){
-        destroy_obj((Obj*)frame);
-        return NULL;
-    }
-
     if(!(fp->mode&(REGION_FIT_BOUNDS|REGION_FIT_WHATEVER)))
-        return (WRegion*)frame;
+        return;
 
     mplex_managed_geom((WMPlex*)frame, &mg);
 
@@ -111,9 +87,9 @@ WRegion *framed_handler(WWindow *par,
         int bt=mg.y;
         int bb=REGION_GEOM(frame).h-(mg.y+mg.h);
         
-        rqg.x=(fp->g.x+param->inner_geom.x+
+        rqg.x=(/*fp->g.x+*/param->inner_geom.x+
                xgravity_deltax(param->gravity, bl, br));
-        rqg.y=(fp->g.y+param->inner_geom.y+
+        rqg.y=(/*fp->g.y+*/param->inner_geom.y+
                xgravity_deltay(param->gravity, bt, bb));
         rqg.w=maxof(1, param->inner_geom.w+(REGION_GEOM(frame).w-mg.w));
         rqg.h=maxof(1, param->inner_geom.h+(REGION_GEOM(frame).h-mg.h));
@@ -123,6 +99,35 @@ WRegion *framed_handler(WWindow *par,
         rectangle_constrain(&rqg, &fp->g);
     
     region_fit((WRegion*)frame, &rqg, REGION_FIT_EXACT);
+}
+
+
+WRegion *framed_handler(WWindow *par, 
+                        const WFitParams *fp, 
+                        void *ap_)
+{
+    AP *ap=(AP*)ap_;
+    WMPlexAttachParams mp=MPLEXATTACHPARAMS_INIT;
+    WFramedParam *param=ap->param;
+    WFrame *frame;
+    WRegion *reg;
+    
+    frame=create_frame(par, fp, param->mode);
+    
+    if(frame==NULL)
+        return NULL;
+    
+    if(fp->mode&(REGION_FIT_BOUNDS|REGION_FIT_WHATEVER))
+        mp.flags|=MPLEX_ATTACH_WHATEVER;
+
+    reg=mplex_do_attach(&frame->mplex, &mp, ap->data);
+    
+    if(reg==NULL){
+        destroy_obj((Obj*)frame);
+        return NULL;
+    }
+    
+    frame_adjust_to_initial(frame, fp, param, reg);
     
     return (WRegion*)frame;
 }
@@ -162,7 +167,7 @@ WRegion *framedpholder_do_attach(WFramedPHolder *ph, int flags,
     ap.data=data;
     ap.param=&ph->param;
         
-    return pholder_attach_(ph->cont, flags, &data2);
+    return pholder_do_attach(ph->cont, flags, &data2);
 }
 
 
@@ -174,19 +179,32 @@ WRegion *framedpholder_do_attach(WFramedPHolder *ph, int flags,
 
 bool framedpholder_do_goto(WFramedPHolder *ph)
 {
-    if(ph->cont!=NULL)
-        return pholder_goto(ph->cont);
-    
-    return FALSE;
+    return (ph->cont!=NULL
+            ? pholder_goto(ph->cont)
+            : FALSE);
 }
 
 
 WRegion *framedpholder_do_target(WFramedPHolder *ph)
 {
-    if(ph->cont!=NULL)
-        return pholder_target(ph->cont);
+    return (ph->cont!=NULL
+            ? pholder_target(ph->cont)
+            : NULL);
+}
+
+
+WPHolder *framedpholder_do_root(WFramedPHolder *ph)
+{
+    WPHolder *root;
+    
+    if(ph->cont==NULL)
+        return NULL;
+    
+    root=pholder_root(ph->cont);
     
-    return NULL;
+    return (root!=ph->cont 
+            ? root
+            : &ph->ph);
 }
 
 
@@ -205,6 +223,9 @@ static DynFunTab framedpholder_dynfuntab[]={
 
     {(DynFun*)pholder_do_target, 
      (DynFun*)framedpholder_do_target},
+     
+    {(DynFun*)pholder_do_root, 
+     (DynFun*)framedpholder_do_root},
     
     END_DYNFUNTAB
 };