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

index ab4d886..a03e3a3 100644 (file)
@@ -182,6 +182,7 @@ openbox_openbox_SOURCES = \
        openbox/actions/move.c \
        openbox/actions/moverelative.c \
        openbox/actions/moveto.c \
+       openbox/actions/movetofromedge.c \
        openbox/actions/omnipresent.c \
        openbox/actions/raise.c \
        openbox/actions/raiselower.c \
index 9dd4965..d0953cc 100644 (file)
 
 
 
-void setup_action_movefromedge_north(ObAction **a, ObUserAction uact)
-{
-    (*a)->data.diraction.any.client_action = OB_CLIENT_ACTION_ALWAYS;
-    (*a)->data.diraction.direction = OB_DIRECTION_NORTH;
-    (*a)->data.diraction.hang = TRUE;
-}
-
-void setup_action_movefromedge_south(ObAction **a, ObUserAction uact)
-{
-    (*a)->data.diraction.any.client_action = OB_CLIENT_ACTION_ALWAYS;
-    (*a)->data.diraction.direction = OB_DIRECTION_SOUTH;
-    (*a)->data.diraction.hang = TRUE;
-}
-
-void setup_action_movefromedge_east(ObAction **a, ObUserAction uact)
-{
-    (*a)->data.diraction.any.client_action = OB_CLIENT_ACTION_ALWAYS;
-    (*a)->data.diraction.direction = OB_DIRECTION_EAST;
-    (*a)->data.diraction.hang = TRUE;
-}
-
-void setup_action_movefromedge_west(ObAction **a, ObUserAction uact)
-{
-    (*a)->data.diraction.any.client_action = OB_CLIENT_ACTION_ALWAYS;
-    (*a)->data.diraction.direction = OB_DIRECTION_WEST;
-    (*a)->data.diraction.hang = TRUE;
-}
-
-void setup_action_movetoedge_north(ObAction **a, ObUserAction uact)
-{
-    (*a)->data.diraction.any.client_action = OB_CLIENT_ACTION_ALWAYS;
-    (*a)->data.diraction.direction = OB_DIRECTION_NORTH;
-    (*a)->data.diraction.hang = FALSE;
-}
-
-void setup_action_movetoedge_south(ObAction **a, ObUserAction uact)
-{
-    (*a)->data.diraction.any.client_action = OB_CLIENT_ACTION_ALWAYS;
-    (*a)->data.diraction.direction = OB_DIRECTION_SOUTH;
-    (*a)->data.diraction.hang = FALSE;
-}
-
-void setup_action_movetoedge_east(ObAction **a, ObUserAction uact)
-{
-    (*a)->data.diraction.any.client_action = OB_CLIENT_ACTION_ALWAYS;
-    (*a)->data.diraction.direction = OB_DIRECTION_EAST;
-    (*a)->data.diraction.hang = FALSE;
-}
-
-void setup_action_movetoedge_west(ObAction **a, ObUserAction uact)
-{
-    (*a)->data.diraction.any.client_action = OB_CLIENT_ACTION_ALWAYS;
-    (*a)->data.diraction.direction = OB_DIRECTION_WEST;
-    (*a)->data.diraction.hang = FALSE;
-}
-
 void setup_action_growtoedge_north(ObAction **a, ObUserAction uact)
 {
     (*a)->data.diraction.any.client_action = OB_CLIENT_ACTION_ALWAYS;
@@ -158,71 +102,6 @@ ActionString actionstrings[] =
         setup_client_action
     },
     {
-        "sendtotoplayer",
-        action_send_to_layer,
-        setup_action_top_layer
-    },
-    {
-        "togglealwaysontop",
-        action_toggle_layer,
-        setup_action_top_layer
-    },
-    {
-        "sendtonormallayer",
-        action_send_to_layer,
-        setup_action_normal_layer
-    },
-    {
-        "sendtobottomlayer",
-        action_send_to_layer,
-        setup_action_bottom_layer
-    },
-    {
-        "togglealwaysonbottom",
-        action_toggle_layer,
-        setup_action_bottom_layer
-    },
-    {
-        "movefromedgenorth",
-        action_movetoedge,
-        setup_action_movefromedge_north
-    },
-    {
-        "movefromedgesouth",
-        action_movetoedge,
-        setup_action_movefromedge_south
-    },
-    {
-        "movefromedgewest",
-        action_movetoedge,
-        setup_action_movefromedge_west
-    },
-    {
-        "movefromedgeeast",
-        action_movetoedge,
-        setup_action_movefromedge_east
-    },
-    {
-        "movetoedgenorth",
-        action_movetoedge,
-        setup_action_movetoedge_north
-    },
-    {
-        "movetoedgesouth",
-        action_movetoedge,
-        setup_action_movetoedge_south
-    },
-    {
-        "movetoedgewest",
-        action_movetoedge,
-        setup_action_movetoedge_west
-    },
-    {
-        "movetoedgeeast",
-        action_movetoedge,
-        setup_action_movetoedge_east
-    },
-    {
         "growtoedgenorth",
         action_growtoedge,
         setup_action_growtoedge_north
@@ -265,44 +144,6 @@ void action_shadelower(union ActionData *data)
         action_shade(data);
 }
 
-void action_movetoedge(union ActionData *data)
-{
-    gint x, y;
-    ObClient *c = data->diraction.any.c;
-
-    x = c->frame->area.x;
-    y = c->frame->area.y;
-    
-    switch(data->diraction.direction) {
-    case OB_DIRECTION_NORTH:
-        y = client_directional_edge_search(c, OB_DIRECTION_NORTH,
-                                           data->diraction.hang)
-            - (data->diraction.hang ? c->frame->area.height : 0);
-        break;
-    case OB_DIRECTION_WEST:
-        x = client_directional_edge_search(c, OB_DIRECTION_WEST,
-                                           data->diraction.hang)
-            - (data->diraction.hang ? c->frame->area.width : 0);
-        break;
-    case OB_DIRECTION_SOUTH:
-        y = client_directional_edge_search(c, OB_DIRECTION_SOUTH,
-                                           data->diraction.hang)
-            - (data->diraction.hang ? 0 : c->frame->area.height);
-        break;
-    case OB_DIRECTION_EAST:
-        x = client_directional_edge_search(c, OB_DIRECTION_EAST,
-                                           data->diraction.hang)
-            - (data->diraction.hang ? 0 : c->frame->area.width);
-        break;
-    default:
-        g_assert_not_reached();
-    }
-    frame_frame_gravity(c->frame, &x, &y, c->area.width, c->area.height);
-    client_action_start(data);
-    client_move(c, x, y);
-    client_action_end(data, FALSE);
-}
-
 void action_growtoedge(union ActionData *data)
 {
     gint x, y, width, height, dest;
@@ -370,17 +211,3 @@ void action_growtoedge(union ActionData *data)
     client_action_end(data, FALSE);
     g_free(a);
 }
-
-void action_send_to_layer(union ActionData *data)
-{
-    client_set_layer(data->layer.any.c, data->layer.layer);
-}
-
-void action_toggle_layer(union ActionData *data)
-{
-    ObClient *c = data->layer.any.c;
-
-    client_action_start(data);
-    client_action_end(data, config_focus_under_mouse);
-}
-
index 8219325..d22a25f 100644 (file)
@@ -38,4 +38,5 @@ void action_all_startup()
     action_addremovedesktop_startup();
     action_dockautohide_startup();
     action_layer_startup();
+    action_movetofromedge_startup();
 }
index 7d4a68a..9b318c0 100644 (file)
@@ -39,5 +39,6 @@ void action_resizerelative_startup();
 void action_addremovedesktop_startup();
 void action_dockautohide_startup();
 void action_layer_startup();
+void action_movetofromedge_startup();
 
 #endif
diff --git a/openbox/actions/movetofromedge.c b/openbox/actions/movetofromedge.c
new file mode 100644 (file)
index 0000000..72a89c1
--- /dev/null
@@ -0,0 +1,125 @@
+#include "openbox/actions.h"
+#include "openbox/misc.h"
+#include "openbox/client.h"
+#include "openbox/frame.h"
+#include <glib.h>
+
+typedef struct {
+    ObDirection dir;
+    gboolean hang;
+} Options;
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node);
+static gpointer setup_to_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node);
+static gpointer setup_from_func(ObParseInst *i,xmlDocPtr doc, xmlNodePtr node);
+static void     free_func(gpointer options);
+static gboolean run_func(ObActionsData *data, gpointer options);
+
+void action_movetofromedge_startup()
+{
+    actions_register("MoveToEdge",
+                     setup_to_func,
+                     free_func,
+                     run_func,
+                     NULL, NULL);
+    actions_register("MoveFromEdge",
+                     setup_from_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->dir = OB_DIRECTION_NORTH;
+
+    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->dir = OB_DIRECTION_NORTH;
+        else if (!g_ascii_strcasecmp(s, "south") ||
+                 !g_ascii_strcasecmp(s, "down"))
+            o->dir = OB_DIRECTION_SOUTH;
+        else if (!g_ascii_strcasecmp(s, "west") ||
+                 !g_ascii_strcasecmp(s, "left"))
+            o->dir = OB_DIRECTION_WEST;
+        else if (!g_ascii_strcasecmp(s, "east") ||
+                 !g_ascii_strcasecmp(s, "right"))
+            o->dir = OB_DIRECTION_EAST;
+        g_free(s);
+    }
+
+    return o;
+}
+
+static gpointer setup_to_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node)
+{
+    Options *o = setup_func(i, doc, node);
+    o->hang = FALSE;
+    return o;
+}
+
+static gpointer setup_from_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node)
+{
+    Options *o = setup_func(i, doc, node);
+    o->hang = TRUE;
+    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;
+
+    if (data->client) {
+        gint x, y;
+        ObClient *c = data->client;
+
+        x = c->frame->area.x;
+        y = c->frame->area.y;
+    
+        switch(o->dir) {
+        case OB_DIRECTION_NORTH:
+            y = client_directional_edge_search(c, OB_DIRECTION_NORTH,
+                                               o->hang)
+                - (o->hang ? c->frame->area.height : 0);
+            break;
+        case OB_DIRECTION_WEST:
+            x = client_directional_edge_search(c, OB_DIRECTION_WEST,
+                                               o->hang)
+                - (o->hang ? c->frame->area.width : 0);
+            break;
+        case OB_DIRECTION_SOUTH:
+            y = client_directional_edge_search(c, OB_DIRECTION_SOUTH,
+                                               o->hang)
+                - (o->hang ? 0 : c->frame->area.height);
+            break;
+        case OB_DIRECTION_EAST:
+            x = client_directional_edge_search(c, OB_DIRECTION_EAST,
+                                               o->hang)
+                - (o->hang ? 0 : c->frame->area.width);
+            break;
+        default:
+            g_assert_not_reached();
+        }
+        frame_frame_gravity(c->frame, &x, &y);
+
+        actions_client_move(data, FALSE);
+        client_move(c, x, y);
+        actions_client_move(data, TRUE);
+    }
+
+    return FALSE;
+}