]> Dogcows Code - chaz/openbox/commitdiff
allow noninteractive directional focus.
authorDana Jansens <danakj@orodu.net>
Sun, 10 Jun 2007 17:58:52 +0000 (17:58 +0000)
committerDana Jansens <danakj@orodu.net>
Sun, 10 Jun 2007 17:58:52 +0000 (17:58 +0000)
make keybinds noninteractive when the last key in the chain has no modifiers (i think this is what the code was supposed to do but failed.)

don't reset key chains during an interactive action. reset them after an interactive action finishes (honoring chroot)
so you can <C-t><C-Up>Stuff<//> and it'll do stuff as you hit C-Up, you dont have to keep hitting C-t

openbox/action.c
openbox/focus_cycle.c
openbox/keyboard.c

index bf675233d58e40306bf22d321feb5659b6d13262..661ab09fe3b6023abbede3b7d223edd61eab15f7 100644 (file)
@@ -1831,6 +1831,7 @@ void action_directional_focus(union ActionData *data)
        on us */
     event_halt_focus_delay();
 
+    g_print("action\n");
     focus_directional_cycle(data->interdiraction.direction,
                             data->interdiraction.dock_windows,
                             data->interdiraction.desktop_windows,
index ca299c6711833802493aebe64b57a468d0e84e6a..f8ba8285f3d2341035351ff81afd66d1af5892fd 100644 (file)
@@ -358,13 +358,13 @@ void focus_directional_cycle(ObDirection dir, gboolean dock_windows,
     static ObClient *first = NULL;
     ObClient *ft = NULL;
 
-    if (!interactive)
-        return;
+    g_print("interactive %d dialog %d done %d cancel %d\n",
+            interactive, dialog, done, cancel);
 
     if (cancel) {
         focus_cycle_target = NULL;
         goto done_cycle;
-    } else if (done)
+    } else if (done && interactive)
         goto done_cycle;
 
     if (!focus_order)
@@ -396,11 +396,11 @@ void focus_directional_cycle(ObDirection dir, gboolean dock_windows,
                 ft = it->data;
     }
         
-    if (ft) {
-        if (ft != focus_cycle_target) {/* prevents flicker */
-            focus_cycle_target = ft;
-            focus_cycle_draw_indicator(ft);
-        }
+    if (ft && ft != focus_cycle_target) {/* prevents flicker */
+        focus_cycle_target = ft;
+        if (!interactive)
+            goto done_cycle;
+        focus_cycle_draw_indicator(ft);
     }
     if (focus_cycle_target && dialog)
         /* same arguments as focus_target_valid */
index 06cd7525bf9fd5c4d6de32eb8be94b462a0e7e51..e62f5011292a21456533ce6777cb482a9af65d76 100644 (file)
@@ -145,7 +145,6 @@ gboolean keyboard_bind(GList *keylist, ObAction *action)
 {
     KeyBindingTree *tree, *t;
     gboolean conflict;
-    gboolean mods = TRUE;
 
     g_assert(keylist != NULL);
     g_assert(action != NULL);
@@ -166,17 +165,13 @@ gboolean keyboard_bind(GList *keylist, ObAction *action)
         return FALSE;
     }
 
-    /* find if every key in this chain has modifiers, and also find the
-       bottom node of the tree */
-    while (t->first_child) {
-        if (!t->state)
-            mods = FALSE;
-        t = t->first_child;
-    }
+    /* find the bottom node */
+    for (; t->first_child; t = t->first_child);
 
     /* when there are no modifiers in the binding, then the action cannot
        be interactive */
-    if (!mods && action->data.any.interactive) {
+    if (!t->state && action->data.any.interactive) {
+        g_print("not interactive\n");
         action->data.any.interactive = FALSE;
         action->data.inter.final = TRUE;
     }
@@ -208,6 +203,8 @@ static void keyboard_interactive_end(guint state, gboolean cancel, Time time,
     alist = g_slist_append(NULL, istate.action);
     action_run_interactive(alist, istate.client, state, time, cancel, TRUE);
     g_slist_free(alist);
+
+    keyboard_reset_chains(0);
 }
 
 static void keyboard_interactive_end_client(ObClient *client, gpointer data)
@@ -311,7 +308,14 @@ void keyboard_event(ObClient *client, const XEvent *e)
             } else if (p->chroot)         /* an empty chroot */
                 set_curpos(p);
             else {
-                keyboard_reset_chains(0);
+                GSList *it;
+                gboolean inter = FALSE;
+
+                for (it = p->actions; it && !inter; it = g_slist_next(it))
+                    if (((ObAction*)it->data)->data.any.interactive)
+                        inter = TRUE;
+                if (!inter) /* don't reset if the action is interactive */
+                    keyboard_reset_chains(0);
 
                 action_run_key(p->actions, client, e->xkey.state,
                                e->xkey.x_root, e->xkey.y_root,
This page took 0.031765 seconds and 4 git commands to generate.