Better error reporting when applying custom layouts.

This commit is contained in:
nicm 2022-05-30 12:52:02 +00:00
parent cd692b5a68
commit 4ae2c64657
2 changed files with 21 additions and 9 deletions

View File

@ -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;

View File

@ -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);