]> git.sur5r.net Git - i3/i3/commitdiff
Implement 'move [container|window] to workspace number <number>'
authorMichael Stapelberg <michael@stapelberg.de>
Sun, 8 Apr 2012 18:33:46 +0000 (20:33 +0200)
committerMichael Stapelberg <michael@stapelberg.de>
Sun, 8 Apr 2012 18:33:46 +0000 (20:33 +0200)
include/commands.h
parser-specs/commands.spec
src/commands.c
testcases/t/132-move-workspace.t

index 273f32a820f223b3a8f8351315eb8a809c041a5e..942007416bd29c88468e0ef9c7bb50e51240103d 100644 (file)
@@ -61,6 +61,12 @@ void cmd_move_con_to_workspace(I3_CMD, char *which);
  */
 void cmd_move_con_to_workspace_name(I3_CMD, char *name);
 
+/**
+ * Implementation of 'move [window|container] [to] workspace number <number>'.
+ *
+ */
+void cmd_move_con_to_workspace_number(I3_CMD, char *which);
+
 /**
  * Implementation of 'resize grow|shrink <direction> [<px> px] [or <ppt> ppt]'.
  *
index 9ea1c55e593a7dd4422ffe9a4977c285804689b5..aab5529da47eb199dd74453c083cd9405ff29911 100644 (file)
@@ -217,9 +217,15 @@ state MOVE_WORKSPACE:
       -> MOVE_WORKSPACE_TO_OUTPUT
   workspace = 'next', 'prev', 'next_on_output', 'prev_on_output'
       -> call cmd_move_con_to_workspace($workspace)
+  'number'
+      -> MOVE_WORKSPACE_NUMBER
   workspace = string
       -> call cmd_move_con_to_workspace_name($workspace)
 
+state MOVE_WORKSPACE_NUMBER:
+  number = string
+      -> call cmd_move_con_to_workspace_number($number)
+
 state MOVE_TO_OUTPUT:
   output = string
       -> call cmd_move_con_to_output($output)
index 6c36c256fe8758aad00895e3d89368c7a6240967..1eff73909eb219579a48179d77f4cb7c017484d8 100644 (file)
@@ -391,6 +391,58 @@ void cmd_move_con_to_workspace_name(I3_CMD, char *name) {
     cmd_output->json_output = sstrdup("{\"success\": true}");
 }
 
+/*
+ * Implementation of 'move [window|container] [to] workspace number <number>'.
+ *
+ */
+void cmd_move_con_to_workspace_number(I3_CMD, char *which) {
+    owindow *current;
+
+    /* Error out early to not create a non-existing workspace (in
+     * workspace_get()) if we are not actually able to move anything. */
+    if (match_is_empty(current_match) && focused->type == CT_WORKSPACE) {
+        cmd_output->json_output = sstrdup("{\"sucess\": false}");
+        return;
+    }
+
+    LOG("should move window to workspace with number %d\n", which);
+    /* get the workspace */
+    Con *output, *workspace;
+
+    char *endptr = NULL;
+    long parsed_num = strtol(which, &endptr, 10);
+    if (parsed_num == LONG_MIN ||
+        parsed_num == LONG_MAX ||
+        parsed_num < 0 ||
+        *endptr != '\0') {
+        LOG("Could not parse \"%s\" as a number.\n", which);
+        cmd_output->json_output = sstrdup("{\"success\": false, "
+                "\"error\": \"Could not parse number\"}");
+        return;
+    }
+
+    TAILQ_FOREACH(output, &(croot->nodes_head), nodes)
+        GREP_FIRST(workspace, output_get_content(output),
+            child->num == parsed_num);
+
+    if (!workspace) {
+        cmd_output->json_output = sstrdup("{\"success\": false, "
+                "\"error\": \"No such workspace\"}");
+        return;
+    }
+
+    HANDLE_EMPTY_MATCH;
+
+    TAILQ_FOREACH(current, &owindows, owindows) {
+        DLOG("matching: %p / %s\n", current->con, current->con->name);
+        con_move_to_workspace(current->con, workspace, true, false);
+    }
+
+    cmd_output->needs_tree_render = true;
+    // XXX: default reply for now, make this a better reply
+    cmd_output->json_output = sstrdup("{\"success\": true}");
+}
+
 static void cmd_resize_floating(I3_CMD, char *way, char *direction, Con *floating_con, int px) {
     LOG("floating resize\n");
     if (strcmp(direction, "up") == 0) {
index a7c5544bd5c1b408ea273e4c016c1973ea0ece4a..3f00428c035739cabf9f6f21a04b68cb226bb592 100644 (file)
@@ -46,6 +46,26 @@ move_workspace_test('move to workspace');
 move_workspace_test('move window to workspace');
 move_workspace_test('move container to workspace');
 
+################################################################################
+# Check that 'move to workspace number <number>' works to move a window to
+# named workspaces which start with <number>.
+################################################################################
+
+cmd 'workspace 13: meh';
+cmd 'open';
+ok(@{get_ws_content('13: meh')} == 1, 'one container on 13: meh');
+
+ok(!workspace_exists('13'), 'workspace 13 does not exist yet');
+
+cmd 'workspace 12';
+cmd 'open';
+
+cmd 'move to workspace number 13';
+ok(@{get_ws_content('13: meh')} == 2, 'two containers on 13: meh');
+ok(@{get_ws_content('12')} == 0, 'no container on 12 anymore');
+
+ok(!workspace_exists('13'), 'workspace 13 does still not exist');
+
 ###################################################################
 # check if 'move workspace next' and 'move workspace prev' work
 ###################################################################