let you send windows with the desktop and directionaldesktop actions
[dana/openbox-history.git] / openbox / actions / desktop.c
index 6da4774..4489f81 100644 (file)
@@ -1,10 +1,13 @@
 #include "openbox/actions.h"
 #include "openbox/screen.h"
+#include "openbox/client.h"
 #include <glib.h>
 
 typedef struct {
     gboolean last;
     guint desktop;
+    gboolean send;
+    gboolean follow;
 } Options;
 
 static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node);
@@ -26,6 +29,7 @@ static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node)
     Options *o;
 
     o = g_new0(Options, 1);
+    o->follow = TRUE;
 
     if ((n = parse_find_node("desktop", node))) {
         gchar *s = parse_string(doc, n);
@@ -35,6 +39,11 @@ static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node)
             o->desktop = parse_int(doc, n) - 1;
         g_free(s);
     }
+    if ((n = parse_find_node("send", node)))
+        o->send = parse_bool(doc, n);
+    if ((n = parse_find_node("follow", node)))
+        o->follow = parse_bool(doc, n);
+
     return o;
 }
 
@@ -56,8 +65,16 @@ static gboolean run_func(ObActionsData *data, gpointer options)
     else
         d = o->desktop;
 
-    if (d < screen_num_desktops)
-        screen_set_desktop(d, TRUE);
-
+    if (d < screen_num_desktops && d != screen_desktop) {
+        gboolean go = !o->send;
+        if (o->send) {
+            if (data->client && client_normal(data->client)) {
+                client_set_desktop(data->client, d, o->follow, FALSE);
+                go = TRUE;
+            }
+        }
+        if (go)
+            screen_set_desktop(d, TRUE);
+    }
     return FALSE;
 }