mirror of
https://github.com/tmux/tmux.git
synced 2024-12-25 02:48:47 +00:00
Better error reporting when applying custom layouts.
This commit is contained in:
parent
cd692b5a68
commit
4ae2c64657
@ -77,7 +77,7 @@ cmd_select_layout_exec(struct cmd *self, struct cmdq_item *item)
|
|||||||
struct window *w = wl->window;
|
struct window *w = wl->window;
|
||||||
struct window_pane *wp = target->wp;
|
struct window_pane *wp = target->wp;
|
||||||
const char *layoutname;
|
const char *layoutname;
|
||||||
char *oldlayout;
|
char *oldlayout, *cause;
|
||||||
int next, previous, layout;
|
int next, previous, layout;
|
||||||
|
|
||||||
server_unzoom_window(w);
|
server_unzoom_window(w);
|
||||||
@ -124,8 +124,9 @@ cmd_select_layout_exec(struct cmd *self, struct cmdq_item *item)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (layoutname != NULL) {
|
if (layoutname != NULL) {
|
||||||
if (layout_parse(w, layoutname) == -1) {
|
if (layout_parse(w, layoutname, &cause) == -1) {
|
||||||
cmdq_error(item, "can't set layout: %s", layoutname);
|
cmdq_error(item, "%s: %s", cause, layoutname);
|
||||||
|
free(cause);
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
goto changed;
|
goto changed;
|
||||||
|
@ -154,7 +154,7 @@ layout_check(struct layout_cell *lc)
|
|||||||
|
|
||||||
/* Parse a layout string and arrange window as layout. */
|
/* Parse a layout string and arrange window as layout. */
|
||||||
int
|
int
|
||||||
layout_parse(struct window *w, const char *layout)
|
layout_parse(struct window *w, const char *layout, char **cause)
|
||||||
{
|
{
|
||||||
struct layout_cell *lc, *lcchild;
|
struct layout_cell *lc, *lcchild;
|
||||||
struct window_pane *wp;
|
struct window_pane *wp;
|
||||||
@ -165,22 +165,31 @@ layout_parse(struct window *w, const char *layout)
|
|||||||
if (sscanf(layout, "%hx,", &csum) != 1)
|
if (sscanf(layout, "%hx,", &csum) != 1)
|
||||||
return (-1);
|
return (-1);
|
||||||
layout += 5;
|
layout += 5;
|
||||||
if (csum != layout_checksum(layout))
|
if (csum != layout_checksum(layout)) {
|
||||||
|
*cause = xstrdup("invalid layout");
|
||||||
return (-1);
|
return (-1);
|
||||||
|
}
|
||||||
|
|
||||||
/* Build the layout. */
|
/* Build the layout. */
|
||||||
lc = layout_construct(NULL, &layout);
|
lc = layout_construct(NULL, &layout);
|
||||||
if (lc == NULL)
|
if (lc == NULL) {
|
||||||
|
*cause = xstrdup("invalid layout");
|
||||||
return (-1);
|
return (-1);
|
||||||
if (*layout != '\0')
|
}
|
||||||
|
if (*layout != '\0') {
|
||||||
|
*cause = xstrdup("invalid layout");
|
||||||
goto fail;
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
/* Check this window will fit into the layout. */
|
/* Check this window will fit into the layout. */
|
||||||
for (;;) {
|
for (;;) {
|
||||||
npanes = window_count_panes(w);
|
npanes = window_count_panes(w);
|
||||||
ncells = layout_count_cells(lc);
|
ncells = layout_count_cells(lc);
|
||||||
if (npanes > ncells)
|
if (npanes > ncells) {
|
||||||
|
xasprintf(cause, "have %u panes but need %u", npanes,
|
||||||
|
ncells);
|
||||||
goto fail;
|
goto fail;
|
||||||
|
}
|
||||||
if (npanes == ncells)
|
if (npanes == ncells)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -217,8 +226,10 @@ layout_parse(struct window *w, const char *layout)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Check the new layout. */
|
/* Check the new layout. */
|
||||||
if (!layout_check(lc))
|
if (!layout_check(lc)) {
|
||||||
|
*cause = xstrdup("size mismatch after applying layout");
|
||||||
return (-1);
|
return (-1);
|
||||||
|
}
|
||||||
|
|
||||||
/* Resize to the layout size. */
|
/* Resize to the layout size. */
|
||||||
window_resize(w, lc->sx, lc->sy, -1, -1);
|
window_resize(w, lc->sx, lc->sy, -1, -1);
|
||||||
|
Loading…
Reference in New Issue
Block a user