]> git.sur5r.net Git - i3/i3/commitdiff
parser: implement move
authorMichael Stapelberg <michael@stapelberg.de>
Wed, 30 Jun 2010 20:23:32 +0000 (22:23 +0200)
committerMichael Stapelberg <michael@stapelberg.de>
Wed, 30 Jun 2010 20:23:32 +0000 (22:23 +0200)
include/con.h
src/cmdparse.y
src/con.c

index 076a5cf5c31977a012f541533392d313d8c2d0a5..5a6f0c155b5edb0841e08bfda7b5b5ea041392b2 100644 (file)
@@ -19,4 +19,6 @@ enum { WINDOW_ADD = 0, WINDOW_REMOVE = 1 };
 void con_fix_percent(Con *con, int action);
 void con_toggle_fullscreen(Con *con);
 
+void con_move_to_workspace(Con *con, Con *workspace);
+
 #endif
index 9925bd7c45b4cc7d766ea103ec3c9ab70b21a137..f4ad6e078a105b810f85152be8516832ac90bb83 100644 (file)
@@ -495,6 +495,24 @@ move:
          * we should not need any of both */
         tree_move(($<number>3 == TOK_BEFORE ? 'p' : 'n'), ($<chr>5 == 'v' ? VERT : HORIZ));
     }
+    | TOK_MOVE WHITESPACE TOK_WORKSPACE WHITESPACE STR
+    {
+        owindow *current;
+
+        printf("should move window to workspace %s\n", $<string>5);
+        /* get the workspace */
+        Con *ws = workspace_get($<string>5);
+
+        /* check if the match is empty, not if the result is empty */
+        if (match_is_empty(&current_match))
+            con_move_to_workspace(focused, ws);
+        else {
+            TAILQ_FOREACH(current, &owindows, owindows) {
+                printf("matching: %p / %s\n", current->con, current->con->name);
+                con_move_to_workspace(current->con, ws);
+            }
+        }
+    }
     ;
 
 before_after:
index 8aa1608cfc52f298e0912e0794091002f8fe25c8..c7c1c9036c6501c7f352bd935193597fcb00d9bd 100644 (file)
--- a/src/con.c
+++ b/src/con.c
@@ -315,3 +315,25 @@ void con_toggle_fullscreen(Con *con) {
     xcb_change_property(conn, XCB_PROP_MODE_REPLACE, con->window->id,
                         atoms[_NET_WM_STATE], ATOM, 32, num, values);
 }
+
+/*
+ * TODO: is there a better place for this function?
+ *
+ */
+void con_move_to_workspace(Con *con, Con *workspace) {
+    /* 1: get the focused container of this workspace by going down as far as
+     * possible */
+    Con *next = workspace;
+
+    while (!TAILQ_EMPTY(&(next->focus_head)))
+        next = TAILQ_FIRST(&(next->focus_head));
+
+    /* 2: we go up one level, but only when next is a normal container */
+    if (next->type != CT_WORKSPACE)
+        next = next->parent;
+
+    DLOG("Re-attaching container to %p / %s\n", next, next->name);
+    /* 3: re-attach the con to the parent of this focused container */
+    con_detach(con);
+    con_attach(con, next);
+}