]> git.decadent.org.uk Git - ion3.git/blobdiff - ioncore/bindmaps.c
Imported Upstream version 20090110
[ion3.git] / ioncore / bindmaps.c
index 9c6bd4689b0483cd7de598508b9049a899c0c616..f22a5ea38a127c0f2cd7b6272b4d30fe822396d3 100644 (file)
@@ -1,21 +1,20 @@
 /*
  * ion/ioncore/bindmaps.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2007
+ * Copyright (c) Tuomo Valkonen 1999-2009
  *
- * 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/rb.h>
+#include <libextl/extl.h>
 #include "common.h"
 #include "conf-bindings.h"
 #include "binding.h"
-#include <libextl/extl.h>
 #include "framep.h"
 #include "bindmaps.h"
+#include "global.h"
+#include "regbind.h"
 
 
 /* 
@@ -198,3 +197,53 @@ ExtlTab ioncore_do_getbindings()
     return tab;
 }
 
+
+WBindmap *ioncore_create_cycle_bindmap(uint kcb, uint state, 
+                                       ExtlFn cycle, ExtlFn bcycle)
+{
+    WBindmap *bindmap=create_bindmap();
+    WBinding b;
+    
+    if(bindmap==NULL)
+        return NULL;
+        
+    b.ksb=XKeycodeToKeysym(ioncore_g.dpy, kcb, 0);
+    b.kcb=kcb;
+    b.state=state;
+    b.act=BINDING_KEYPRESS;
+    b.area=0;
+    b.wait=FALSE;
+    b.submap=NULL;
+    b.func=extl_ref_fn(cycle);
+    
+    if(!bindmap_add_binding(bindmap, &b)){
+        extl_unref_fn(b.func);
+        bindmap_destroy(bindmap);
+        return NULL;
+    }
+    
+    if((b.state&ShiftMask)==0 && bcycle!=extl_fn_none()){
+        b.func=extl_ref_fn(bcycle);
+        b.state|=ShiftMask;
+        bindmap_add_binding(bindmap, &b);
+    }
+    
+    return bindmap;
+}
+
+
+WBindmap *region_add_cycle_bindmap(WRegion *reg, uint kcb, uint state, 
+                                   ExtlFn cycle, ExtlFn bcycle)
+{
+    WBindmap *bindmap=ioncore_create_cycle_bindmap(kcb, state, cycle, bcycle);
+    
+    if(bindmap!=NULL){
+        if(!region_add_bindmap(reg, bindmap)){
+            bindmap_destroy(bindmap);
+            return NULL;
+        }
+    }
+    
+    return bindmap;
+}
+