When pane ids were added to the custom layout strings, the parsing
was adjusted to be backwards compatible. However, a bug prevents
this code from correctly parsing custom layout strings that describe
a layout with at least one split.
Here is an example new-style (with pane ids) custom layout string
for a split window (the leading checksum has been omitted):
80x40,0,0[80x20,0,0,75,80x19,0,21,76]]
-------------------
And the equivalent old-style string (again, without checksum):
80x40,0,0[80x20,0,0,80x19,0,21]
-------------------
The underlined portions of the strings are parsed correctly. In the
new-style string, the next bit of the string (",75") will be
correctly consumed as a pane id (the value itself is not used). In
the old-style string, the next bit of the string (",80") is also
consumed as a pane id, but this is an error because it is actually
the width of the next pane. The old-style string will ultimately be
rejected because the code is not expecting to see an 'x' immediately
after a pane description has ended (only a comma, brace, bracket, or
the end of the string is expected).
To decide whether the next number is a pane id or the width of the
next pane, look at the following separator (if any). If it is an
'x', then there is no pane id; let the parsing resume at the
previous comma.
---
This bug will probably bite anyone using previously extracted custom
layout strings with 1.6 when they upgrade to 1.7. A fix would
probably be appropriate for a 1.7 maintenance release, if there are
any plans for one.
For testing purposes, here is a old-style three-pane layout (it also
has a "short" checksum):
5ff,318x64,0,0{189x64,0,0,128x64,190,0[128x32,190,0,128x31,190,33]}
---
layout-custom.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/layout-custom.c b/layout-custom.c
index aa70e16..a386434 100644
--- a/layout-custom.c
+++ b/layout-custom.c
@@ -210,8 +210,7 @@ layout_construct(struct layout_cell *lcparent, const char
**layout)
if (!isdigit((u_char) **layout))
return (NULL);
- if (sscanf(*layout, "%ux%u,%u,%u,%*u", &sx, &sy, &xoff, &yoff) != 4 &&
- sscanf(*layout, "%ux%u,%u,%u", &sx, &sy, &xoff, &yoff) != 4)
+ if (sscanf(*layout, "%ux%u,%u,%u", &sx, &sy, &xoff, &yoff) != 4)
return (NULL);
while (isdigit((u_char) **layout))
@@ -232,9 +231,12 @@ layout_construct(struct layout_cell *lcparent, const char
**layout)
while (isdigit((u_char) **layout))
(*layout)++;
if (**layout == ',') {
+ const char *before_pane_id = *layout;
(*layout)++;
while (isdigit((u_char) **layout))
(*layout)++;
+ if (**layout == 'x')
+ *layout = before_pane_id;
}
lc = layout_create_cell(lcparent);
--
1.8.1.3
------------------------------------------------------------------------------
Symantec Endpoint Protection 12 positioned as A LEADER in The Forrester
Wave(TM): Endpoint Security, Q1 2013 and "remains a good choice" in the
endpoint security space. For insight on selecting the right partner to
tackle endpoint security challenges, access the full report.
http://p.sf.net/sfu/symantec-dev2dev
_______________________________________________
tmux-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/tmux-users