add the "if" action
authorDana Jansens <danakj@orodu.net>
Sat, 23 Jun 2007 15:43:35 +0000 (15:43 +0000)
committerDana Jansens <danakj@orodu.net>
Sat, 23 Jun 2007 15:43:35 +0000 (15:43 +0000)
Makefile.am
openbox/action.c
openbox/actions/all.c
openbox/actions/all.h
openbox/actions/if.c [new file with mode: 0644]

index 3181ef8..798422b 100644 (file)
@@ -173,6 +173,7 @@ openbox_openbox_SOURCES = \
        openbox/actions/fullscreen.c \
        openbox/actions/growtoedge.c \
        openbox/actions/iconify.c \
+       openbox/actions/if.c \
        openbox/actions/kill.c \
        openbox/actions/layer.c \
        openbox/actions/lower.c \
index 04a2f9d..3786feb 100644 (file)
    See the COPYING file for a copy of the GNU General Public License.
 */
 
-#include "debug.h"
-#include "client.h"
-#include "focus.h"
-#include "focus_cycle.h"
-#include "moveresize.h"
-#include "menu.h"
-#include "prop.h"
-#include "stacking.h"
-#include "screen.h"
-#include "action.h"
-#include "openbox.h"
-#include "grab.h"
-#include "keyboard.h"
-#include "event.h"
-#include "dock.h"
-#include "config.h"
-#include "mainloop.h"
-#include "startupnotify.h"
-#include "gettext.h"
-
-#include <glib.h>
-
-
-
-
-void setup_action_growtoedge_north(ObAction **a, ObUserAction uact)
-{
-    (*a)->data.diraction.any.client_action = OB_CLIENT_ACTION_ALWAYS;
-    (*a)->data.diraction.direction = OB_DIRECTION_NORTH;
-}
-
-void setup_action_growtoedge_south(ObAction **a, ObUserAction uact)
-{
-    (*a)->data.diraction.any.client_action = OB_CLIENT_ACTION_ALWAYS;
-    (*a)->data.diraction.direction = OB_DIRECTION_SOUTH;
-}
-
-void setup_action_growtoedge_east(ObAction **a, ObUserAction uact)
-{
-    (*a)->data.diraction.any.client_action = OB_CLIENT_ACTION_ALWAYS;
-    (*a)->data.diraction.direction = OB_DIRECTION_EAST;
-}
-
-void setup_action_growtoedge_west(ObAction **a, ObUserAction uact)
-{
-    (*a)->data.diraction.any.client_action = OB_CLIENT_ACTION_ALWAYS;
-    (*a)->data.diraction.direction = OB_DIRECTION_WEST;
-}
-
-void setup_action_top_layer(ObAction **a, ObUserAction uact)
-{
-    (*a)->data.layer.any.client_action = OB_CLIENT_ACTION_ALWAYS;
-    (*a)->data.layer.layer = 1;
-}
-
-void setup_action_normal_layer(ObAction **a, ObUserAction uact)
-{
-    (*a)->data.layer.any.client_action = OB_CLIENT_ACTION_ALWAYS;
-    (*a)->data.layer.layer = 0;
-}
-
-void setup_action_bottom_layer(ObAction **a, ObUserAction uact)
-{
-    (*a)->data.layer.any.client_action = OB_CLIENT_ACTION_ALWAYS;
-    (*a)->data.layer.layer = -1;
-}
-
-void setup_client_action(ObAction **a, ObUserAction uact)
-{
-    (*a)->data.any.client_action = OB_CLIENT_ACTION_ALWAYS;
-}
-
 ActionString actionstrings[] =
 {
     {
@@ -102,26 +30,6 @@ ActionString actionstrings[] =
         setup_client_action
     },
     {
-        "growtoedgenorth",
-        action_growtoedge,
-        setup_action_growtoedge_north
-    },
-    {
-        "growtoedgesouth",
-        action_growtoedge,
-        setup_action_growtoedge_south
-    },
-    {
-        "growtoedgewest",
-        action_growtoedge,
-        setup_action_growtoedge_west
-    },
-    {
-        "growtoedgeeast",
-        action_growtoedge,
-        setup_action_growtoedge_east
-    },
-    {
         NULL,
         NULL,
         NULL
@@ -143,7 +51,3 @@ void action_shadelower(union ActionData *data)
     else
         action_shade(data);
 }
-
-void action_growtoedge(union ActionData *data)
-{
-}
index b9b0a79..51996de 100644 (file)
@@ -40,4 +40,5 @@ void action_all_startup()
     action_layer_startup();
     action_movetofromedge_startup();
     action_growtoedge_startup();
+    action_if_startup();
 }
index 156633f..fd71e4b 100644 (file)
@@ -41,5 +41,6 @@ void action_dockautohide_startup();
 void action_layer_startup();
 void action_movetofromedge_startup();
 void action_growtoedge_startup();
+void action_if_startup();
 
 #endif
diff --git a/openbox/actions/if.c b/openbox/actions/if.c
new file mode 100644 (file)
index 0000000..08f543b
--- /dev/null
@@ -0,0 +1,133 @@
+#include "openbox/actions.h"
+#include "openbox/misc.h"
+#include "openbox/client.h"
+#include "openbox/frame.h"
+#include "openbox/screen.h"
+#include <glib.h>
+
+typedef struct {
+    gboolean shaded_on;
+    gboolean shaded_off;
+    gboolean maxvert_on;
+    gboolean maxvert_off;
+    gboolean maxhorz_on;
+    gboolean maxhorz_off;
+    gboolean maxfull_on;
+    gboolean maxfull_off;
+    gboolean iconic_on;
+    gboolean iconic_off;
+    GSList *thenacts;
+    GSList *elseacts;
+} 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_if_startup()
+{
+    actions_register("If",
+                     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);
+
+    if ((n = parse_find_node("shaded", node))) {
+        if (parse_bool(doc, n))
+            o->shaded_on = TRUE;
+        else
+            o->shaded_off = TRUE;
+    }
+    if ((n = parse_find_node("maximized", node))) {
+        if (parse_bool(doc, n))
+            o->maxfull_on = TRUE;
+        else
+            o->maxfull_off = TRUE;
+    }
+    if ((n = parse_find_node("maximizedhorizontal", node))) {
+        if (parse_bool(doc, n))
+            o->maxhorz_on = TRUE;
+        else
+            o->maxhorz_off = TRUE;
+    }
+    if ((n = parse_find_node("maximizedvertical", node))) {
+        if (parse_bool(doc, n))
+            o->maxvert_on = TRUE;
+        else
+            o->maxvert_off = TRUE;
+    }
+    if ((n = parse_find_node("iconified", node))) {
+        if (parse_bool(doc, n))
+            o->iconic_on = TRUE;
+        else
+            o->iconic_off = TRUE;
+    }
+
+    if ((n = parse_find_node("then", node))) {
+        xmlNodePtr m;
+
+        m = parse_find_node("action", n->xmlChildrenNode);
+        while (m) {
+            ObActionsAct *action = actions_parse(i, doc, m);
+            if (action) o->thenacts = g_slist_prepend(o->thenacts, action);
+            m = parse_find_node("action", m->next);
+        }
+    }
+    if ((n = parse_find_node("else", node))) {
+        xmlNodePtr m;
+
+        m = parse_find_node("action", n->xmlChildrenNode);
+        while (m) {
+            ObActionsAct *action = actions_parse(i, doc, m);
+            if (action) o->elseacts = g_slist_prepend(o->elseacts, action);
+            m = parse_find_node("action", m->next);
+        }
+    }
+
+    return o;
+}
+
+static void free_func(gpointer options)
+{
+    Options *o = options;
+
+    g_free(o);
+}
+
+/* Always return FALSE because its not interactive */
+static gboolean run_func(ObActionsData *data, gpointer options)
+{
+    Options *o = options;
+    GSList *acts;
+    ObClient *c = data->client;
+
+    if ((!o->shaded_on || (c && c->shaded)) &&
+        (!o->shaded_off || (c && !c->shaded)) &&
+        (!o->iconic_on || (c && c->iconic)) &&
+        (!o->iconic_off || (c && !c->iconic)) &&
+        (!o->maxhorz_on || (c && c->max_horz)) &&
+        (!o->maxhorz_off || (c && !c->max_horz)) &&
+        (!o->maxvert_on || (c && c->max_vert)) &&
+        (!o->maxvert_off || (c && !c->max_vert)) &&
+        (!o->maxfull_on || (c && c->max_vert && c->max_horz)) &&
+        (!o->maxfull_off || (c && !(c->max_vert && c->max_horz))))
+    {
+        acts = o->thenacts;
+    }
+    else
+        acts = o->elseacts;
+
+    actions_run_acts(acts, data->uact, data->state,
+                     data->x, data->y, data->button,
+                     data->context, data->client);
+
+    return FALSE;
+}