X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;ds=sidebyside;f=ioncore%2Fpholder.c;fp=ioncore%2Fpholder.c;h=5fdb7b8aae991f5520bf2515ae445e109b63eea4;hb=803afbc1cd633f6c025bcd9537e9b7e9aedadd0d;hp=4aed2ccd05159bcf58cb4e5801290355d5b22c0c;hpb=8366314611bf30a0f31d25bf5f5023186fa87692;p=ion3.git diff --git a/ioncore/pholder.c b/ioncore/pholder.c index 4aed2cc..5fdb7b8 100644 --- a/ioncore/pholder.c +++ b/ioncore/pholder.c @@ -1,7 +1,7 @@ /* * ion/ioncore/pholder.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 @@ -13,6 +13,7 @@ #include "common.h" #include "attach.h" #include "pholder.h" +#include "focus.h" bool pholder_init(WPHolder *ph) @@ -53,10 +54,15 @@ static WRegion *add_fn_reparent(WWindow *par, const WFitParams *fp, WRegion *pholder_attach_(WPHolder *ph, int flags, WRegionAttachData *data) { - if(ph->redirect!=NULL) - return pholder_attach_(ph->redirect, flags, data); - else - return pholder_do_attach(ph, flags, data); + WPHolder *root=pholder_root(ph); + + /* Use the root, so that extra containers are not added from + * stale chains. + */ + + return (root==NULL + ? NULL + : pholder_do_attach(root, flags, data)); } @@ -71,6 +77,20 @@ bool pholder_attach(WPHolder *ph, int flags, WRegion *reg) } +bool pholder_attach_mcfgoto(WPHolder *ph, int flags, WRegion *reg) +{ + bool cf=region_may_control_focus(reg); + + if(!pholder_attach(ph, flags, reg)) + return FALSE; + + if(cf) + region_goto(reg); + + return TRUE; +} + + WRegion *pholder_do_target(WPHolder *ph) { WRegion *ret=NULL; @@ -81,10 +101,9 @@ WRegion *pholder_do_target(WPHolder *ph) WRegion *pholder_target(WPHolder *ph) { - if(ph->redirect!=NULL) - return pholder_target(ph->redirect); - else - return pholder_do_target(ph); + return (ph->redirect!=NULL + ? pholder_target(ph->redirect) + : pholder_do_target(ph)); } @@ -126,13 +145,39 @@ bool pholder_do_goto(WPHolder *ph) bool pholder_goto(WPHolder *ph) { - if(ph->redirect!=NULL) - return pholder_goto(ph->redirect); - else - return pholder_do_goto(ph); + return (ph->redirect!=NULL + ? pholder_goto(ph->redirect) + : pholder_do_goto(ph)); } +WPHolder *pholder_do_root_default(WPHolder *ph) +{ + return ph; +} + + +WPHolder *pholder_do_root(WPHolder *ph) +{ + WPHolder *ret=NULL; + CALL_DYN_RET(ret, WPHolder*, pholder_do_root, ph, (ph)); + return ret; +} + + +WPHolder *pholder_root(WPHolder *ph) +{ + return (ph->redirect!=NULL + ? pholder_root(ph->redirect) + : pholder_do_root(ph)); +} + + +bool pholder_stale(WPHolder *ph) +{ + return (pholder_root(ph)!=ph); +} + bool pholder_redirect(WPHolder *ph, WRegion *old_target) { @@ -201,6 +246,9 @@ WPHolder *pholder_either(WPHolder *a, WPHolder *b) static DynFunTab pholder_dynfuntab[]={ {(DynFun*)pholder_do_check_reparent, (DynFun*)pholder_do_check_reparent_default}, + + {(DynFun*)pholder_do_root, + (DynFun*)pholder_do_root_default}, END_DYNFUNTAB };