/*
* ion/ioncore/framedpholder.c
*
- * Copyright (c) Tuomo Valkonen 2005-2006.
+ * Copyright (c) Tuomo Valkonen 2005-2008.
*
- * 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
- * the Free Software Foundation; either version 2.1 of the License, or
- * (at your option) any later version.
+ * See the included file LICENSE for details.
*/
#include <libtu/objp.h>
ph->cont=cont;
ph->param=*param;
+ watch_init(&ph->frame_watch);
+
return TRUE;
}
}
pholder_deinit(&(ph->ph));
+ watch_reset(&ph->frame_watch);
}
typedef struct{
WRegionAttachData *data;
WFramedParam *param;
+ WRegion *reg_ret;
} 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);
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));
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);
+
+ ap->reg_ret=reg;
+
+ if(reg==NULL){
+ destroy_obj((Obj*)frame);
+ return NULL;
+ }
+
+ frame_adjust_to_initial(frame, fp, param, reg);
return (WRegion*)frame;
}
ap.data=data;
ap.param=param;
+ ap.reg_ret=NULL;
return fn(reg, fn_param, &data2);
}
WRegionAttachData *data)
{
WRegionAttachData data2;
+ WFrame *frame;
AP ap;
+ frame=(WFrame*)ph->frame_watch.obj;
+
+ if(frame!=NULL){
+ WMPlexAttachParams mp=MPLEXATTACHPARAMS_INIT;
+ return mplex_do_attach(&frame->mplex, &mp, data);
+ }
+
if(ph->cont==NULL)
return FALSE;
ap.data=data;
ap.param=&ph->param;
+ ap.reg_ret=NULL;
- return pholder_attach_(ph->cont, flags, &data2);
+ frame=(WFrame*)pholder_do_attach(ph->cont, flags, &data2);
+
+ if(frame!=NULL){
+ assert(OBJ_IS(frame, WFrame));
+ watch_setup(&ph->frame_watch, (Obj*)frame, NULL);
+ }
+
+ return ap.reg_ret;
}
bool framedpholder_do_goto(WFramedPHolder *ph)
{
- if(ph->cont!=NULL)
- return pholder_goto(ph->cont);
+ WRegion *frame=(WRegion*)ph->frame_watch.obj;
- return FALSE;
+ if(frame!=NULL)
+ return region_goto((WRegion*)frame);
+ else if(ph->cont!=NULL)
+ return pholder_goto(ph->cont);
+ else
+ return FALSE;
}
WRegion *framedpholder_do_target(WFramedPHolder *ph)
{
- if(ph->cont!=NULL)
- return pholder_target(ph->cont);
+ WRegion *frame=(WRegion*)ph->frame_watch.obj;
+
+ return (frame!=NULL
+ ? frame
+ : (ph->cont!=NULL
+ ? pholder_target(ph->cont)
+ : NULL));
+}
+
+
+bool framedpholder_stale(WFramedPHolder *ph)
+{
+ WRegion *frame=(WRegion*)ph->frame_watch.obj;
- return NULL;
+ return (frame==NULL && (ph->cont==NULL || pholder_stale(ph->cont)));
}
{(DynFun*)pholder_do_target,
(DynFun*)framedpholder_do_target},
+
+ {(DynFun*)pholder_stale,
+ (DynFun*)framedpholder_stale},
END_DYNFUNTAB
};