summaryrefslogtreecommitdiff
path: root/openbox/keyboard.c
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2007-04-26 01:25:52 +0000
committerDana Jansens <danakj@orodu.net>2007-04-26 01:25:52 +0000
commitb6d2529acb6e31efbf8c7791e44905a1712da891 (patch)
tree752bd615f53234488500bdc655d08ad26f4f2647 /openbox/keyboard.c
parent1ee98f4a47e67b653057a62171a0993b80f81f8e (diff)
add chrooting. use chroot="true" on the chroot location
Diffstat (limited to 'openbox/keyboard.c')
-rw-r--r--openbox/keyboard.c39
1 files changed, 30 insertions, 9 deletions
diff --git a/openbox/keyboard.c b/openbox/keyboard.c
index 86d4f432..d041a35a 100644
--- a/openbox/keyboard.c
+++ b/openbox/keyboard.c
@@ -106,10 +106,18 @@ static void set_curpos(KeyBindingTree *newpos)
}
}
-void keyboard_reset_chains()
+void keyboard_reset_chains(gint break_chroots)
{
- if (curpos)
- set_curpos(NULL);
+ KeyBindingTree *p;
+
+ for (p = curpos; p; p = p->parent) {
+ if (p->chroot) {
+ if (break_chroots == 0) break; /* stop here */
+ if (break_chroots > 0)
+ --break_chroots;
+ }
+ }
+ set_curpos(p);
}
void keyboard_unbind_all()
@@ -118,6 +126,19 @@ void keyboard_unbind_all()
keyboard_firstnode = NULL;
}
+void keyboard_chroot(GList *keylist)
+{
+ /* try do it in the existing tree. if we can't that means it is an empty
+ chroot binding. so add it to the tree then. */
+ if (!tree_chroot(keyboard_firstnode, keylist)) {
+ KeyBindingTree *tree;
+ if (!(tree = tree_build(keylist)))
+ return;
+ tree_chroot(tree, keylist);
+ tree_assimilate(tree);
+ }
+}
+
gboolean keyboard_bind(GList *keylist, ObAction *action)
{
KeyBindingTree *tree, *t;
@@ -206,7 +227,6 @@ void keyboard_interactive_end(ObInteractiveState *s,
if (!interactive_states) {
grab_keyboard(FALSE);
grab_pointer(FALSE, FALSE, OB_CURSOR_NONE);
- keyboard_reset_chains();
}
}
@@ -267,7 +287,7 @@ void keyboard_event(ObClient *client, const XEvent *e)
if (e->xkey.keycode == config_keyboard_reset_keycode &&
e->xkey.state == config_keyboard_reset_state)
{
- keyboard_reset_chains();
+ keyboard_reset_chains(-1);
return;
}
@@ -279,11 +299,12 @@ void keyboard_event(ObClient *client, const XEvent *e)
if (p->key == e->xkey.keycode &&
p->state == e->xkey.state)
{
- if (p->first_child != NULL) { /* part of a chain */
+ if (p->first_child != NULL) /* part of a chain */
set_curpos(p);
- } else {
-
- keyboard_reset_chains();
+ else if (p->chroot) /* an empty chroot */
+ set_curpos(p);
+ else {
+ keyboard_reset_chains(0);
action_run_key(p->actions, client, e->xkey.state,
e->xkey.x_root, e->xkey.y_root,