]> git.decadent.org.uk Git - ion3.git/blobdiff - ioncore/pholder.c
[svn-upgrade] Integrating new upstream version, ion3 (20070203)
[ion3.git] / ioncore / pholder.c
index 4aed2ccd05159bcf58cb4e5801290355d5b22c0c..5fdb7b8aae991f5520bf2515ae445e109b63eea4 100644 (file)
@@ -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
 };