add moverelative action
authorDana Jansens <danakj@orodu.net>
Fri, 22 Jun 2007 15:26:12 +0000 (15:26 +0000)
committerDana Jansens <danakj@orodu.net>
Fri, 22 Jun 2007 15:26:12 +0000 (15:26 +0000)
Makefile.am
openbox/action.c
openbox/actions/all.c
openbox/actions/all.h
openbox/actions/moverelative.c [new file with mode: 0644]
openbox/actions/moveto.c

index 1b94d4f..82cdfed 100644 (file)
@@ -168,6 +168,7 @@ openbox_openbox_SOURCES = \
        openbox/actions/lower.c \
        openbox/actions/maximize.c \
        openbox/actions/move.c \
+       openbox/actions/moverelative.c \
        openbox/actions/moveto.c \
        openbox/actions/raise.c \
        openbox/actions/raiselower.c \
index 61f346b..dca4ede 100644 (file)
@@ -495,26 +495,11 @@ ActionString actionstrings[] =
         setup_client_action
     },
     {
-        "moverelativevert",
-        action_move_relative_vert,
-        setup_client_action
-    },
-    {
-        "resizerelativehorz",
-        action_resize_relative_horz,
-        setup_client_action
-    },
-    {
         "resizerelativevert",
         action_resize_relative_vert,
         setup_client_action
     },
     {
-        "moverelative",
-        action_move_relative,
-        setup_client_action
-    },
-    {
         "resizerelative",
         action_resize_relative,
         setup_client_action
@@ -762,17 +747,6 @@ ObAction *action_parse(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
 
     if (parse_attr_string("name", node, &actname)) {
         if ((act = action_from_string(actname, uact))) {
-            } else if (act->func == action_move_relative_horz ||
-                       act->func == action_move_relative_vert ||
-                       act->func == action_resize_relative_horz ||
-                       act->func == action_resize_relative_vert) {
-                if ((n = parse_find_node("delta", node->xmlChildrenNode)))
-                    act->data.relative.deltax = parse_int(doc, n);
-            } else if (act->func == action_move_relative) {
-                if ((n = parse_find_node("x", node->xmlChildrenNode)))
-                    act->data.relative.deltax = parse_int(doc, n);
-                if ((n = parse_find_node("y", node->xmlChildrenNode)))
-                    act->data.relative.deltay = parse_int(doc, n);
             } else if (act->func == action_resize_relative) {
                 if ((n = parse_find_node("left", node->xmlChildrenNode)))
                     act->data.relative.deltaxl = parse_int(doc, n);
@@ -1004,22 +978,6 @@ void action_toggle_omnipresent(union ActionData *data)
                        screen_desktop : DESKTOP_ALL, FALSE, TRUE);
 }
 
-void action_move_relative_horz(union ActionData *data)
-{
-    ObClient *c = data->relative.any.c;
-    client_action_start(data);
-    client_move(c, c->area.x + data->relative.deltax, c->area.y);
-    client_action_end(data, FALSE);
-}
-
-void action_move_relative_vert(union ActionData *data)
-{
-    ObClient *c = data->relative.any.c;
-    client_action_start(data);
-    client_move(c, c->area.x, c->area.y + data->relative.deltax);
-    client_action_end(data, FALSE);
-}
-
 void action_resize_relative_horz(union ActionData *data)
 {
     ObClient *c = data->relative.any.c;
index e6f5ab0..cbd9f13 100644 (file)
@@ -22,4 +22,5 @@ void action_all_startup()
     action_fullscreen_startup();
     action_maximize_startup();
     action_moveto_startup();
+    action_moverelative_startup();
 }
index 846ec6c..f026106 100644 (file)
@@ -23,5 +23,6 @@ void action_iconify_startup();
 void action_fullscreen_startup();
 void action_maximize_startup();
 void action_moveto_startup();
+void action_moverelative_startup();
 
 #endif
diff --git a/openbox/actions/moverelative.c b/openbox/actions/moverelative.c
new file mode 100644 (file)
index 0000000..f3a3064
--- /dev/null
@@ -0,0 +1,68 @@
+#include "openbox/actions.h"
+#include "openbox/client.h"
+#include "openbox/screen.h"
+#include "openbox/frame.h"
+#include <stdlib.h> /* for atoi */
+
+typedef struct {
+    gint x;
+    gint y;
+} 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_moverelative_startup()
+{
+    actions_register("MoveRelative",
+                     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("x", node)))
+        o->x = parse_int(doc, n);
+    if ((n = parse_find_node("y", node)))
+        o->y = parse_int(doc, n);
+
+    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) {
+        ObClient *c;
+        gint x, y, lw, lh, w, h;
+
+        c = data->client;
+        x = data->client->area.x + o->x;
+        y = data->client->area.y + o->y;
+        w = data->client->area.width;
+        h = data->client->area.height;
+        client_try_configure(data->client, &x, &y, &w, &h, &lw, &lh, TRUE);
+        client_find_onscreen(data->client, &x, &y, w, h, FALSE);
+
+        client_configure(data->client, x, y, w, h, TRUE, TRUE, FALSE);
+    }
+
+    return FALSE;
+}
index 7cc6541..a8ba426 100644 (file)
@@ -99,9 +99,7 @@ static gboolean run_func(ObActionsData *data, gpointer options)
         /* force it on screen if its moving to another monitor */
         client_find_onscreen(c, &x, &y, w, h, mon != cmon);
 
-        actions_client_move(data, TRUE);
         client_configure(c, x, y, w, h, TRUE, TRUE, FALSE);
-        actions_client_move(data, FALSE);
 
         g_free(area);
         g_free(carea);