]> git.sur5r.net Git - i3/i3/commitdiff
GET_TREE: serialize container type into a string
authorMichael Stapelberg <michael@stapelberg.de>
Sat, 14 Dec 2013 13:50:44 +0000 (14:50 +0100)
committerMichael Stapelberg <michael@stapelberg.de>
Sun, 22 Dec 2013 20:52:49 +0000 (21:52 +0100)
So far, this was blessed for internal use only (by virtue of not being
in the documentation), but we want to expose it for the stored layouts.

docs/ipc
src/ipc.c
src/load_layout.c
testcases/lib/i3test.pm
testcases/t/100-fullscreen.t
testcases/t/116-nestedcons.t
testcases/t/117-workspace.t
testcases/t/122-split.t
testcases/t/185-scratchpad.t
testcases/t/504-move-workspace-to-output.t
testcases/t/513-move-workspace.t

index 85e5e77e3e7966122f2835c716ac31d07ee35aef..e4f1e80c48f76a1f5ef984a5af9d9dff6d6f959f 100644 (file)
--- a/docs/ipc
+++ b/docs/ipc
@@ -277,7 +277,12 @@ name (string)::
        The internal name of this container. For all containers which are part
        of the tree structure down to the workspace contents, this is set to a
        nice human-readable name of the container.
+       For containers that have an X11 window, the content is the title
+       (_NET_WM_NAME property) of that window.
        For all other containers, the content is not defined (yet).
+type (string)::
+       Type of this container. Can be one of "root", "output", "con",
+       "floating_con", "workspace" or "dockarea".
 border (string)::
        Can be either "normal", "none" or "1pixel", dependending on the
        container’s border style.
@@ -670,12 +675,12 @@ but will still be present in the "old" property.
  "change": "focus",
  "current": {
   "id": 28489712,
-  "type":4,
+  "type": "workspace",
   ...
  }
  "old": {
   "id": 28489715,
-  "type": 4,
+  "type": "workspace",
   ...
  }
 }
@@ -722,7 +727,7 @@ window title as "urxvt").
  "change": "new",
  "container": {
   "id": 35569536,
-  "type": 2,
+  "type": "con",
   ...
  }
 }
index a928dba9007a8c0cd79d56417d60dc8b332e6051..b5d17ba40bdf5d6f9b14ee31dbd8e85c9b98a389 100644 (file)
--- a/src/ipc.c
+++ b/src/ipc.c
@@ -153,7 +153,30 @@ void dump_node(yajl_gen gen, struct Con *con, bool inplace_restart) {
     y(integer, (long int)con);
 
     ystr("type");
-    y(integer, con->type);
+    switch (con->type) {
+        case CT_ROOT:
+            ystr("root");
+            break;
+        case CT_OUTPUT:
+            ystr("output");
+            break;
+        case CT_CON:
+            ystr("con");
+            break;
+        case CT_FLOATING_CON:
+            ystr("floating_con");
+            break;
+        case CT_WORKSPACE:
+            ystr("workspace");
+            break;
+        case CT_DOCKAREA:
+            ystr("dockarea");
+            break;
+        default:
+            DLOG("About to dump unknown container type=%d. This is a bug.\n", con->type);
+            assert(false);
+            break;
+    }
 
     /* provided for backwards compatibility only. */
     ystr("orientation");
index d0c5a3b1d3ab63c90e66969279bc6aa6b1e13399..d31c230a6ed3931b452dcbcab8639daaf8492678 100644 (file)
@@ -203,6 +203,23 @@ static int json_string(void *ctx, const unsigned char *val, unsigned int len) {
                 json_node->border_style = BS_NORMAL;
             else LOG("Unhandled \"border\": %s\n", buf);
             free(buf);
+        } else if (strcasecmp(last_key, "type") == 0) {
+            char *buf = NULL;
+            sasprintf(&buf, "%.*s", (int)len, val);
+            if (strcasecmp(buf, "root") == 0)
+                json_node->type = CT_ROOT;
+            else if (strcasecmp(buf, "output") == 0)
+                json_node->type = CT_OUTPUT;
+            else if (strcasecmp(buf, "con") == 0)
+                json_node->type = CT_CON;
+            else if (strcasecmp(buf, "floating_con") == 0)
+                json_node->type = CT_FLOATING_CON;
+            else if (strcasecmp(buf, "workspace") == 0)
+                json_node->type = CT_WORKSPACE;
+            else if (strcasecmp(buf, "dockarea") == 0)
+                json_node->type = CT_DOCKAREA;
+            else LOG("Unhandled \"type\": %s\n", buf);
+            free(buf);
         } else if (strcasecmp(last_key, "layout") == 0) {
             char *buf = NULL;
             sasprintf(&buf, "%.*s", (int)len, val);
@@ -281,6 +298,7 @@ static int json_int(void *ctx, long long val) {
 static int json_int(void *ctx, long val) {
     LOG("int %ld for key %s\n", val, last_key);
 #endif
+    /* For backwards compatibility with i3 < 4.8 */
     if (strcasecmp(last_key, "type") == 0)
         json_node->type = val;
 
index 414362ae1be8414e3f1a75e15a1de46e9734cc0a..d71a6e86cb9ece155cf90a67093cfb7b2aeb6567 100644 (file)
@@ -391,7 +391,7 @@ sub get_workspace_names {
     for my $output (@outputs) {
         next if $output->{name} eq '__i3';
         # get the first CT_CON of each output
-        my $content = first { $_->{type} == 2 } @{$output->{nodes}};
+        my $content = first { $_->{type} eq 'con' } @{$output->{nodes}};
         @cons = (@cons, @{$content->{nodes}});
     }
     [ map { $_->{name} } @cons ]
@@ -434,7 +434,7 @@ sub fresh_workspace {
                         @{$tree->{nodes}};
         die "BUG: Could not find output $args{output}" unless defined($output);
         # Get the focused workspace on that output and switch to it.
-        my $content = first { $_->{type} == 2 } @{$output->{nodes}};
+        my $content = first { $_->{type} eq 'con' } @{$output->{nodes}};
         my $focused = $content->{focus}->[0];
         my $workspace = first { $_->{id} == $focused } @{$content->{nodes}};
         $workspace = $workspace->{name};
@@ -479,7 +479,7 @@ sub get_ws {
     my @workspaces;
     for my $output (@outputs) {
         # get the first CT_CON of each output
-        my $content = first { $_->{type} == 2 } @{$output->{nodes}};
+        my $content = first { $_->{type} eq 'con' } @{$output->{nodes}};
         @workspaces = (@workspaces, @{$content->{nodes}});
     }
 
@@ -589,13 +589,13 @@ sub get_dock_clients {
     for my $output (@outputs) {
         if (!defined($which)) {
             @docked = (@docked, map { @{$_->{nodes}} }
-                                grep { $_->{type} == 5 }
+                                grep { $_->{type} eq 'dockarea' }
                                 @{$output->{nodes}});
         } elsif ($which eq 'top') {
-            my $first = first { $_->{type} == 5 } @{$output->{nodes}};
+            my $first = first { $_->{type} eq 'dockarea' } @{$output->{nodes}};
             @docked = (@docked, @{$first->{nodes}}) if defined($first);
         } elsif ($which eq 'bottom') {
-            my @matching = grep { $_->{type} == 5 } @{$output->{nodes}};
+            my @matching = grep { $_->{type} eq 'dockarea' } @{$output->{nodes}};
             my $last = $matching[-1];
             @docked = (@docked, @{$last->{nodes}}) if defined($last);
         }
@@ -645,7 +645,7 @@ sub focused_ws {
     my $tree = $i3->get_tree->recv;
     my $focused = $tree->{focus}->[0];
     my $output = first { $_->{id} == $focused } @{$tree->{nodes}};
-    my $content = first { $_->{type} == 2 } @{$output->{nodes}};
+    my $content = first { $_->{type} eq 'con' } @{$output->{nodes}};
     my $first = first { $_->{fullscreen_mode} == 1 } @{$content->{nodes}};
     return $first->{name}
 }
index 54b29c9de331e33ed0b1c348689bff361e2f7a68..206116ee171eed08091e3900ed30331c783a1a1f 100644 (file)
@@ -34,7 +34,7 @@ my @outputs = @{$tree->{nodes}};
 my $output;
 for my $o (@outputs) {
     # get the first CT_CON of each output
-    my $content = first { $_->{type} == 2 } @{$o->{nodes}};
+    my $content = first { $_->{type} eq 'con' } @{$o->{nodes}};
     if (defined(first { $_->{name} eq $tmp } @{$content->{nodes}})) {
         $output = $o;
         last;
index 84e86879753b1821262e785ae1ae045c6112878e..eb2fe1447007508c6f18c0b22674c60e1b584bfc 100644 (file)
@@ -51,7 +51,7 @@ my $expected = {
     window => undef,
     name => 'root',
     orientation => $ignore,
-    type => 0,
+    type => 'root',
     id => $ignore,
     rect => $ignore,
     window_rect => $ignore,
@@ -90,16 +90,16 @@ my @nodes = @{$tree->{nodes}};
 
 ok(@nodes > 0, 'root node has at least one leaf');
 
-ok((all { $_->{type} == 1 } @nodes), 'all nodes are of type CT_OUTPUT');
+ok((all { $_->{type} eq 'output' } @nodes), 'all nodes are of type CT_OUTPUT');
 ok((none { defined($_->{window}) } @nodes), 'no CT_OUTPUT contains a window');
 ok((all { @{$_->{nodes}} > 0 } @nodes), 'all nodes have at least one leaf (workspace)');
 my @workspaces;
 for my $ws (@nodes) {
-    my $content = first { $_->{type} == 2 } @{$ws->{nodes}};
+    my $content = first { $_->{type} eq 'con' } @{$ws->{nodes}};
     @workspaces = (@workspaces, @{$content->{nodes}});
 }
 
-ok((all { $_->{type} == 4 } @workspaces), 'all workspaces are of type CT_WORKSPACE');
+ok((all { $_->{type} eq 'workspace' } @workspaces), 'all workspaces are of type CT_WORKSPACE');
 #ok((all { @{$_->{nodes}} == 0 } @workspaces), 'all workspaces are empty yet');
 ok((none { defined($_->{window}) } @workspaces), 'no CT_OUTPUT contains a window');
 
index d8a8733ba1cfb3111733a193df87ef401090a47c..04d9b9dd3a58a51ec7acddacfd27aa777d2ad644 100644 (file)
@@ -196,8 +196,7 @@ sub workspace_numbers_sorted {
     my @outputs = @{$tree->{nodes}};
     my @workspaces;
     for my $output (@outputs) {
-        # get the first CT_CON of each output
-        my $content = first { $_->{type} == 2 } @{$output->{nodes}};
+        my $content = first { $_->{type} eq 'con' } @{$output->{nodes}};
         @workspaces = (@workspaces, @{$content->{nodes}});
     }
 
index 361716c14d449f534e880d96c0c95b83b25d13d8..6afdd806fc52bbcd82b48430d33b35b50ab55f28 100644 (file)
@@ -145,7 +145,7 @@ sub get_output_content {
     is(scalar @outputs, 1, 'exactly one output (testcase not multi-monitor capable)');
     my $output = $outputs[0];
     # get the first (and only) CT_CON
-    return first { $_->{type} == 2 } @{$output->{nodes}};
+    return first { $_->{type} eq 'con' } @{$output->{nodes}};
 }
 
 $tmp = fresh_workspace;
index 5901f99cfb6538fc273ac0ccf5ceb404c23eb656..edfc46e0374158eab1eba96380de55f2da92bc3f 100644 (file)
@@ -35,7 +35,7 @@ is($tree->{name}, 'root', 'root node is the first thing we get');
 my @__i3 = grep { $_->{name} eq '__i3' } @{$tree->{nodes}};
 is(scalar @__i3, 1, 'output __i3 found');
 
-my $content = first { $_->{type} == 2 } @{$__i3[0]->{nodes}};
+my $content = first { $_->{type} eq 'con' } @{$__i3[0]->{nodes}};
 my @workspaces = @{$content->{nodes}};
 my @workspace_names = map { $_->{name} } @workspaces;
 ok('__i3_scratch' ~~ @workspace_names, '__i3_scratch workspace found');
index 018707e6cf5e522a8527b8b6db57b5e4acc2a600..efe0d6e7ab76f0587d429d82dac16cd2233a17e1 100644 (file)
@@ -77,10 +77,10 @@ sub workspaces_per_screen {
     my @outputs = @{$tree->{nodes}};
 
     my $fake0 = first { $_->{name} eq 'fake-0' } @outputs;
-    my $fake0_content = first { $_->{type} == 2 } @{$fake0->{nodes}};
+    my $fake0_content = first { $_->{type} eq 'con' } @{$fake0->{nodes}};
 
     my $fake1 = first { $_->{name} eq 'fake-1' } @outputs;
-    my $fake1_content = first { $_->{type} == 2 } @{$fake1->{nodes}};
+    my $fake1_content = first { $_->{type} eq 'con' } @{$fake1->{nodes}};
 
     my @fake0_workspaces = map { $_->{name} } @{$fake0_content->{nodes}};
     my @fake1_workspaces = map { $_->{name} } @{$fake1_content->{nodes}};
index 17c8de71eb6d143288e7931036dbe116f9c450e1..3e27a6c09f070560a26a9902de592ee559f53cb7 100644 (file)
@@ -37,10 +37,10 @@ sub workspaces_per_screen {
     my @outputs = @{$tree->{nodes}};
 
     my $fake0 = first { $_->{name} eq 'fake-0' } @outputs;
-    my $fake0_content = first { $_->{type} == 2 } @{$fake0->{nodes}};
+    my $fake0_content = first { $_->{type} eq 'con' } @{$fake0->{nodes}};
 
     my $fake1 = first { $_->{name} eq 'fake-1' } @outputs;
-    my $fake1_content = first { $_->{type} == 2 } @{$fake1->{nodes}};
+    my $fake1_content = first { $_->{type} eq 'con' } @{$fake1->{nodes}};
 
     my @fake0_workspaces = map { $_->{name} } @{$fake0_content->{nodes}};
     my @fake1_workspaces = map { $_->{name} } @{$fake1_content->{nodes}};