]> git.sur5r.net Git - i3/i3/commitdiff
Merge branch 'master' into next
authorMichael Stapelberg <michael@stapelberg.de>
Sat, 31 Jan 2015 21:42:54 +0000 (22:42 +0100)
committerMichael Stapelberg <michael@stapelberg.de>
Sat, 31 Jan 2015 21:42:54 +0000 (22:42 +0100)
1  2 
src/load_layout.c
testcases/t/234-layout-restore-output.t

diff --combined src/load_layout.c
index 3835589f58defad34a92ee08e294b526f8b941b6,5a66828d26eaab0233a5d3e7c6006a947b52dd97..ccd71c3736db139623305628fdc40694847ba4b1
@@@ -24,7 -24,6 +24,7 @@@ static Con *json_node
  static Con *to_focus;
  static bool parsing_swallows;
  static bool parsing_rect;
 +static bool parsing_deco_rect;
  static bool parsing_window_rect;
  static bool parsing_geometry;
  static bool parsing_focus;
@@@ -48,7 -47,7 +48,7 @@@ static int json_start_map(void *ctx) 
          match_init(current_swallow);
          TAILQ_INSERT_TAIL(&(json_node->swallow_head), current_swallow, matches);
      } else {
 -        if (!parsing_rect && !parsing_window_rect && !parsing_geometry) {
 +        if (!parsing_rect && !parsing_deco_rect && !parsing_window_rect && !parsing_geometry) {
              if (last_key && strcasecmp(last_key, "floating_nodes") == 0) {
                  DLOG("New floating_node\n");
                  Con *ws = con_get_workspace(json_node);
@@@ -69,7 -68,7 +69,7 @@@
  
  static int json_end_map(void *ctx) {
      LOG("end of map\n");
 -    if (!parsing_swallows && !parsing_rect && !parsing_window_rect && !parsing_geometry) {
 +    if (!parsing_swallows && !parsing_rect && !parsing_deco_rect && !parsing_window_rect && !parsing_geometry) {
          /* Set a few default values to simplify manually crafted layout files. */
          if (json_node->layout == L_DEFAULT) {
              DLOG("Setting layout = L_SPLITH\n");
               * workspace called “1”. */
              Con *output;
              Con *workspace = NULL;
 -            TAILQ_FOREACH (output, &(croot->nodes_head), nodes)
 -                GREP_FIRST(workspace, output_get_content(output), !strcasecmp(child->name, json_node->name));
 +            TAILQ_FOREACH(output, &(croot->nodes_head), nodes)
 +            GREP_FIRST(workspace, output_get_content(output), !strcasecmp(child->name, json_node->name));
              char *base = sstrdup(json_node->name);
              int cnt = 1;
              while (workspace != NULL) {
                  FREE(json_node->name);
                  asprintf(&(json_node->name), "%s_%d", base, cnt++);
                  workspace = NULL;
 -                TAILQ_FOREACH (output, &(croot->nodes_head), nodes)
 -                    GREP_FIRST(workspace, output_get_content(output), !strcasecmp(child->name, json_node->name));
 +                TAILQ_FOREACH(output, &(croot->nodes_head), nodes)
 +                GREP_FIRST(workspace, output_get_content(output), !strcasecmp(child->name, json_node->name));
              }
              free(base);
  
              /* Set num accordingly so that i3bar will properly sort it. */
              json_node->num = ws_name_to_number(json_node->name);
 -        } else {
 -            // TODO: remove this in the “next” branch.
 -            if (json_node->name == NULL || strcmp(json_node->name, "") == 0) {
 -                json_node->name = sstrdup("#ff0000");
 -            }
          }
  
          LOG("attaching\n");
          x_con_init(json_node, json_node->depth);
          json_node = json_node->parent;
      }
 -    if (parsing_rect)
 -        parsing_rect = false;
 -    if (parsing_window_rect)
 -        parsing_window_rect = false;
 -    if (parsing_geometry)
 -        parsing_geometry = false;
 +
 +    parsing_rect = false;
 +    parsing_deco_rect = false;
 +    parsing_window_rect = false;
 +    parsing_geometry = false;
      return 1;
  }
  
@@@ -141,10 -146,10 +141,10 @@@ static int json_end_array(void *ctx) 
      if (parsing_focus) {
          /* Clear the list of focus mappings */
          struct focus_mapping *mapping;
 -        TAILQ_FOREACH_REVERSE (mapping, &focus_mappings, focus_mappings_head, focus_mappings) {
 +        TAILQ_FOREACH_REVERSE(mapping, &focus_mappings, focus_mappings_head, focus_mappings) {
              LOG("focus (reverse) %d\n", mapping->old_id);
              Con *con;
 -            TAILQ_FOREACH (con, &(json_node->focus_head), focused) {
 +            TAILQ_FOREACH(con, &(json_node->focus_head), focused) {
                  if (con->old_id != mapping->old_id)
                      continue;
                  LOG("got it! %p\n", con);
@@@ -175,9 -180,6 +175,9 @@@ static int json_key(void *ctx, const un
      if (strcasecmp(last_key, "rect") == 0)
          parsing_rect = true;
  
 +    if (strcasecmp(last_key, "deco_rect") == 0)
 +        parsing_deco_rect = true;
 +
      if (strcasecmp(last_key, "window_rect") == 0)
          parsing_window_rect = true;
  
@@@ -425,9 -427,20 +425,20 @@@ static int json_double(void *ctx, doubl
  }
  
  static json_content_t content_result;
+ static int content_level;
+ static int json_determine_content_deeper(void *ctx) {
+     content_level++;
+     return 1;
+ }
+ static int json_determine_content_shallower(void *ctx) {
+     content_level--;
+     return 1;
+ }
  
  static int json_determine_content_string(void *ctx, const unsigned char *val, size_t len) {
-     if (strcasecmp(last_key, "type") != 0)
+     if (strcasecmp(last_key, "type") != 0 || content_level > 1)
          return 1;
  
      DLOG("string = %.*s, last_key = %s\n", (int)len, val, last_key);
@@@ -463,11 -476,16 +474,16 @@@ json_content_t json_determine_content(c
      // We default to JSON_CONTENT_CON because it is legal to not include
      // “"type": "con"” in the JSON files for better readability.
      content_result = JSON_CONTENT_CON;
+     content_level = 0;
      yajl_gen g;
      yajl_handle hand;
      static yajl_callbacks callbacks = {
          .yajl_string = json_determine_content_string,
          .yajl_map_key = json_key,
+         .yajl_start_array = json_determine_content_deeper,
+         .yajl_start_map = json_determine_content_deeper,
+         .yajl_end_map = json_determine_content_shallower,
+         .yajl_end_array = json_determine_content_shallower,
      };
      g = yajl_gen_alloc(NULL);
      hand = yajl_alloc(&callbacks, NULL, (void *)g);
@@@ -535,7 -553,6 +551,7 @@@ void tree_append_json(Con *con, const c
      to_focus = NULL;
      parsing_swallows = false;
      parsing_rect = false;
 +    parsing_deco_rect = false;
      parsing_window_rect = false;
      parsing_geometry = false;
      parsing_focus = false;
index 12d04b87c3c5cd62cfe34cd3082e835f6b1c0dac,d407289aea8f61e060b642a05e65f624e65219eb..bc90131d76c73e8023ebc9988ce61572254049c0
@@@ -19,6 -19,7 +19,6 @@@
  # Bug still in: 4.8-26-gf96ec19
  use i3test;
  use File::Temp qw(tempfile);
 -use List::MoreUtils qw(uniq);
  use IO::Handle;
  
  my $ws = fresh_workspace;
@@@ -179,7 -180,56 +179,56 @@@ $fh->flush
  cmd "append_layout $filename";
  
  ok(workspace_exists('4'), 'workspace "4" exists now');
my $ws = get_ws("4");
+ $ws = get_ws("4");
  is($ws->{num}, 4, 'workspace number is 4');
  
+ ################################################################################
+ # Append a workspace with a numeric name, with the “type” property at the end
+ # of the JSON blurb (which is valid and sometimes happens).
+ ################################################################################
+ ok(!workspace_exists('5'), 'workspace "5" does not exist yet');
+ ($fh, $filename) = tempfile(UNLINK => 1);
+ print $fh <<'EOT';
+ // vim:ts=4:sw=4:et
+ {
+     // workspace with 1 children
+     "border": "pixel",
+     "floating": "auto_off",
+     "layout": "splith",
+     "percent": null,
+     "name": "5",
+     "nodes": [
+         {
+             "border": "pixel",
+             "floating": "auto_off",
+             "geometry": {
+                "height": 268,
+                "width": 484,
+                "x": 0,
+                "y": 0
+             },
+             "name": "vals@w00t: ~",
+             "percent": 1,
+             "swallows": [
+                {
+                // "class": "^URxvt$",
+                // "instance": "^urxvt$",
+                // "title": "^vals\\@w00t\\:\\ \\~$"
+                }
+             ],
+             "type": "con"
+         }
+     ],
+     "type": "workspace"
+ }
+ EOT
+ $fh->flush;
+ cmd "append_layout $filename";
+ ok(workspace_exists('5'), 'workspace "5" exists now');
+ $ws = get_ws("5");
+ is($ws->{num}, 5, 'workspace number is 5');
  done_testing;