]> Dogcows Code - chaz/openbox/commitdiff
move directionalcycling actions into the same .c file. make interactive actions all...
authorDana Jansens <danakj@orodu.net>
Fri, 13 Jul 2007 21:12:40 +0000 (17:12 -0400)
committerDana Jansens <danakj@orodu.net>
Fri, 13 Jul 2007 21:12:40 +0000 (17:12 -0400)
Makefile.am
openbox/actions.c
openbox/actions/all.c
openbox/actions/all.h
openbox/actions/cyclewindows.c
openbox/actions/directionaltargetwindow.c [deleted file]
openbox/actions/directionalwindows.c [moved from openbox/actions/directionalcyclewindows.c with 67% similarity]

index 0c5d7cc8edfffec28e5b8afb9bb2a10cf6167630..c6c5dfb399a0f80fbbf117337f1ad8e1fae3d641 100644 (file)
@@ -158,8 +158,7 @@ openbox_openbox_SOURCES = \
        openbox/actions/decorations.c \
        openbox/actions/desktop.c \
        openbox/actions/dockautohide.c \
-       openbox/actions/directionalcyclewindows.c \
-       openbox/actions/directionaltargetwindow.c \
+       openbox/actions/directionalwindows.c \
        openbox/actions/execute.c \
        openbox/actions/exit.c \
        openbox/actions/focus.c \
index 0f37526773efd88199e24a29a236f2545889199f..3f1c34ccc9c4e44e5c75275094566fafb3b04da1 100644 (file)
@@ -293,6 +293,11 @@ static gboolean actions_interactive_begin_act(ObActionsAct *act, guint state)
         actions_act_ref(interactive_act);
 
         interactive_initial_state = state;
+
+        /* if using focus_delay, stop the timer now so that focus doesn't go
+           moving on us, which would kill the action */
+        event_halt_focus_delay();
+    
         return TRUE;
     }
     else
index c4d7982ca9b3ec7f56a8e432a2567d5e5d6bcaa3..f1ae5be2dddd929eb9ee8ec0ff237509e09c345e 100644 (file)
@@ -26,8 +26,7 @@ void action_all_startup()
     action_shade_startup();
     action_kill_startup();
     action_omnipresent_startup();
-    action_directionalcyclewindows_startup();
-    action_directionaltargetwindow_startup();
+    action_directionalwindows_startup();
     action_resize_startup();
     action_decorations_startup();
     action_desktop_startup();
index 5ab6f3667a56cac28d3ff841cec7381605c39639..eb465e5fad5b547f23aa17a7498412ba2571b9bc 100644 (file)
@@ -27,8 +27,7 @@ void action_moverelative_startup();
 void action_shade_startup();
 void action_kill_startup();
 void action_omnipresent_startup();
-void action_directionalcyclewindows_startup();
-void action_directionaltargetwindow_startup();
+void action_directionalwindows_startup();
 void action_resize_startup();
 void action_decorations_startup();
 void action_desktop_startup();
index a8c0c22c912a0bb5b468051943d762c529849a96..7b4bd11e29e58e3875206afcf2bde4ec2b323612 100644 (file)
@@ -112,10 +112,6 @@ static gboolean run_func(ObActionsData *data, gpointer options)
 {
     Options *o = options;
 
-    /* if using focus_delay, stop the timer now so that focus doesn't go moving
-       on us */
-    event_halt_focus_delay();
-    
     focus_cycle(o->forward,
                 o->all_desktops,
                 o->dock_windows,
@@ -180,10 +176,10 @@ static void end_cycle(gboolean cancel, guint state, Options *o)
                      TRUE,
                      o->dialog,
                      TRUE, cancel);
+    cycling = FALSE;
 
     if (ft) {
         actions_run_acts(o->actions, OB_USER_ACTION_KEYBOARD_KEY,
                          state, -1, -1, 0, OB_FRAME_CONTEXT_NONE, ft);
     }
-    cycling = FALSE;
 }
diff --git a/openbox/actions/directionaltargetwindow.c b/openbox/actions/directionaltargetwindow.c
deleted file mode 100644 (file)
index 9cebda2..0000000
+++ /dev/null
@@ -1,109 +0,0 @@
-#include "openbox/actions.h"
-#include "openbox/event.h"
-#include "openbox/focus_cycle.h"
-#include "openbox/openbox.h"
-#include "openbox/misc.h"
-#include "gettext.h"
-
-typedef struct {
-    gboolean dialog;
-    gboolean dock_windows;
-    gboolean desktop_windows;
-    ObDirection direction;
-    GSList *actions;
-} Options;
-
-static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node);
-static void     free_func(gpointer options);
-static gboolean run_func(ObActionsData *data, gpointer options);
-
-void action_directionaltargetwindow_startup()
-{
-    actions_register("DirectionalTargetWindow",
-                     setup_func,
-                     free_func,
-                     run_func,
-                     NULL, NULL);
-}
-
-static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node)
-{
-    xmlNodePtr n;
-    Options *o;
-
-    o = g_new0(Options, 1);
-    o->dialog = TRUE;
-
-    if ((n = parse_find_node("dialog", node)))
-        o->dialog = parse_bool(doc, n);
-    if ((n = parse_find_node("panels", node)))
-        o->dock_windows = parse_bool(doc, n);
-    if ((n = parse_find_node("desktop", node)))
-        o->desktop_windows = parse_bool(doc, n);
-    if ((n = parse_find_node("direction", node))) {
-        gchar *s = parse_string(doc, n);
-        if (!g_ascii_strcasecmp(s, "north") ||
-            !g_ascii_strcasecmp(s, "up"))
-            o->direction = OB_DIRECTION_NORTH;
-        else if (!g_ascii_strcasecmp(s, "northwest"))
-            o->direction = OB_DIRECTION_NORTHWEST;
-        else if (!g_ascii_strcasecmp(s, "northeast"))
-            o->direction = OB_DIRECTION_NORTHEAST;
-        else if (!g_ascii_strcasecmp(s, "west") ||
-                 !g_ascii_strcasecmp(s, "left"))
-            o->direction = OB_DIRECTION_WEST;
-        else if (!g_ascii_strcasecmp(s, "east") ||
-                 !g_ascii_strcasecmp(s, "right"))
-            o->direction = OB_DIRECTION_EAST;
-        else if (!g_ascii_strcasecmp(s, "south") ||
-                 !g_ascii_strcasecmp(s, "down"))
-            o->direction = OB_DIRECTION_NORTH;
-        else if (!g_ascii_strcasecmp(s, "southwest"))
-            o->direction = OB_DIRECTION_NORTHWEST;
-        else if (!g_ascii_strcasecmp(s, "southeast"))
-            o->direction = OB_DIRECTION_NORTHEAST;
-        g_free(s);
-    }
-
-    if ((n = parse_find_node("finalactions", node))) {
-        xmlNodePtr m;
-
-        m = parse_find_node("action", n->xmlChildrenNode);
-        while (m) {
-            ObActionsAct *action = actions_parse(i, doc, m);
-            if (action) o->actions = g_slist_prepend(o->actions, action);
-            m = parse_find_node("action", m->next);
-        }
-    }
-    return o;
-}
-
-static void free_func(gpointer options)
-{
-    Options *o = options;
-
-    g_free(o);
-}
-
-static gboolean run_func(ObActionsData *data, gpointer options)
-{
-    Options *o = options;
-    struct _ObClient *ft;
-
-    /* if using focus_delay, stop the timer now so that focus doesn't go moving
-       on us */
-    event_halt_focus_delay();
-    
-    ft = focus_directional_cycle(o->direction,
-                                 o->dock_windows,
-                                 o->desktop_windows,
-                                 FALSE,
-                                 o->dialog,
-                                 TRUE, FALSE);
-
-    if (ft)
-        actions_run_acts(o->actions, data->uact, data->state,
-                         data->x, data->y, data->button, data->context, ft);
-
-    return FALSE;
-}
similarity index 67%
rename from openbox/actions/directionalcyclewindows.c
rename to openbox/actions/directionalwindows.c
index 3eea00d1bd01c7deefaa7615183662a766100959..66c1a1628ff967187c53fa85567436f27b387033 100644 (file)
@@ -6,6 +6,7 @@
 #include "gettext.h"
 
 typedef struct {
+    gboolean interactive;
     gboolean dialog;
     gboolean dock_windows;
     gboolean desktop_windows;
@@ -13,7 +14,13 @@ typedef struct {
     GSList *actions;
 } Options;
 
+static gboolean cycling = FALSE;
+
 static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node);
+static gpointer setup_cycle_func(ObParseInst *i, xmlDocPtr doc,
+                                 xmlNodePtr node);
+static gpointer setup_target_func(ObParseInst *i, xmlDocPtr doc,
+                                  xmlNodePtr node);
 static void     free_func(gpointer options);
 static gboolean run_func(ObActionsData *data, gpointer options);
 static gboolean i_input_func(guint initial_state,
@@ -24,14 +31,12 @@ static void     i_cancel_func(gpointer options);
 
 static void     end_cycle(gboolean cancel, guint state, Options *o);
 
-void action_directionalcyclewindows_startup()
+void action_directionalwindows_startup()
 {
-    actions_register("DirectionalCycleWindows",
-                     setup_func,
-                     free_func,
-                     run_func,
-                     i_input_func,
-                     i_cancel_func);
+    actions_register("DirectionalCycleWindows", setup_cycle_func, free_func,
+                     run_func, i_input_func, i_cancel_func);
+    actions_register("DirectionalTargetWindow", setup_target_func, free_func,
+                     run_func, NULL, NULL);
 }
 
 static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node)
@@ -83,6 +88,31 @@ static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node)
             m = parse_find_node("action", m->next);
         }
     }
+    else {
+        o->actions = g_slist_prepend(o->actions,
+                                     actions_parse_string("Focus"));
+        o->actions = g_slist_prepend(o->actions,
+                                     actions_parse_string("Raise"));
+        o->actions = g_slist_prepend(o->actions,
+                                     actions_parse_string("Unshade"));
+    }
+
+    return o;
+}
+
+static gpointer setup_cycle_func(ObParseInst *i, xmlDocPtr doc,
+                                 xmlNodePtr node)
+{
+    Options *o = setup_func(i, doc, node);
+    o->interactive = TRUE;
+    return o;
+}
+
+static gpointer setup_target_func(ObParseInst *i, xmlDocPtr doc,
+                                  xmlNodePtr node)
+{
+    Options *o = setup_func(i, doc, node);
+    o->interactive = FALSE;
     return o;
 }
 
@@ -90,6 +120,11 @@ static void free_func(gpointer options)
 {
     Options *o = options;
 
+    while (o->actions) {
+        actions_act_unref(o->actions->data);
+        o->actions = g_slist_delete_link(o->actions, o->actions);
+    }
+
     g_free(o);
 }
 
@@ -97,18 +132,19 @@ static gboolean run_func(ObActionsData *data, gpointer options)
 {
     Options *o = options;
 
-    /* if using focus_delay, stop the timer now so that focus doesn't go moving
-       on us */
-    event_halt_focus_delay();
-    
-    focus_directional_cycle(o->direction,
-                            o->dock_windows,
-                            o->desktop_windows,
-                            TRUE,
-                            o->dialog,
-                            FALSE, FALSE);
+    if (o->interactive)
+        end_cycle(FALSE, data->state, o);
+    else {
+        focus_directional_cycle(o->direction,
+                                o->dock_windows,
+                                o->desktop_windows,
+                                TRUE,
+                                o->dialog,
+                                FALSE, FALSE);
+        cycling = TRUE;
+    }
 
-    return TRUE;
+    return o->interactive;
 }
 
 static gboolean i_input_func(guint initial_state,
@@ -144,7 +180,10 @@ static gboolean i_input_func(guint initial_state,
 
 static void i_cancel_func(gpointer options)
 {
-    end_cycle(TRUE, 0, options);
+    /* we get cancelled when we move focus, but we're not cycling anymore, so
+       just ignore that */
+    if (cycling)
+        end_cycle(TRUE, 0, options);
 }
 
 static void end_cycle(gboolean cancel, guint state, Options *o)
@@ -157,6 +196,7 @@ static void end_cycle(gboolean cancel, guint state, Options *o)
                                  TRUE,
                                  o->dialog,
                                  TRUE, cancel);
+    cycling = FALSE;
 
     if (ft) {
         actions_run_acts(o->actions, OB_USER_ACTION_KEYBOARD_KEY,
This page took 0.037678 seconds and 4 git commands to generate.