diff options
author | Sadrul Habib Chowdhury <sadrul@chromium.org> | 2011-03-28 17:24:59 -0400 |
---|---|---|
committer | Sadrul Habib Chowdhury <sadrul@chromium.org> | 2011-03-28 17:24:59 -0400 |
commit | e5b296e8af899e199d8c416da7b6e7204824ed1b (patch) | |
tree | 30473b3ec30b87f9508b2060100bfaee5016866c | |
parent | 5a74e3d9022a1426023429aed0f679c9fc2147a4 (diff) | |
download | screen-e5b296e8af899e199d8c416da7b6e7204824ed1b.tar.gz |
Make 'layout' subcommands work when detached.
Ideally, splits and layouts should be allowed when there's no display. At this
moment, you can just create a few layouts and name them when detached.
BUG=28386
-rw-r--r-- | src/layout.c | 46 | ||||
-rw-r--r-- | src/layout.h | 3 | ||||
-rw-r--r-- | src/process.c | 77 |
3 files changed, 103 insertions, 23 deletions
diff --git a/src/layout.c b/src/layout.c index 196d10b..fa06865 100644 --- a/src/layout.c +++ b/src/layout.c @@ -189,12 +189,21 @@ int startat; lay = CreateLayout(title, startat); if (!lay) return; - LoadLayout(0, &D_canvas); - fcv = D_forecv; - DupLayoutCv(&D_canvas, &lay->lay_canvas, 1); - lay->lay_forecv = D_forecv; - D_forecv = fcv; - D_layout = lay; + + if (display) + { + LoadLayout(0, &D_canvas); + fcv = D_forecv; + DupLayoutCv(&D_canvas, &lay->lay_canvas, 1); + lay->lay_forecv = D_forecv; + D_forecv = fcv; + D_layout = lay; + } + else + { + /* TODO: Setup lay->lay_forecv somehow */ + layout_attach = lay; + } lay->lay_autosave = 1; } @@ -369,3 +378,28 @@ char *filename; return 1; } +void RenameLayout(layout, name) +struct layout *layout; +const char *name; +{ + free(layout->lay_title); + layout->lay_title = SaveStr(name); +} + +int RenumberLayout(layout, number) +struct layout *layout; +int number; +{ + int old; + struct layout *lay; + old = layout->lay_number; + if (number < 0 || number >= MAXLAY) + return 0; + lay = laytab[number]; + laytab[number] = layout; + layout->lay_number = number; + laytab[old] = lay; + if (lay) + lay->lay_number = old; + return 1; +} diff --git a/src/layout.h b/src/layout.h index 065edb7..1814226 100644 --- a/src/layout.h +++ b/src/layout.h @@ -53,5 +53,8 @@ extern void ShowLayouts __P((int)); extern struct layout *FindLayout __P((char *)); extern void UpdateLayoutCanvas __P((struct canvas *, struct win *)); +extern void RenameLayout __P((struct layout *, const char *)); +extern int RenumberLayout __P((struct layout *, int)); + #endif /* SCREEN_LAYOUT_H */ diff --git a/src/process.c b/src/process.c index da9188d..dfa7c82 100644 --- a/src/process.c +++ b/src/process.c @@ -1154,6 +1154,7 @@ int key; char ch; struct display *odisplay = display; struct acluser *user; + struct layout *layout; user = display ? D_user : users; if (nr == RC_ILLEGAL) @@ -4246,8 +4247,22 @@ int key; } break; case RC_LAYOUT: + // A number of the subcommands for "layout" are ignored, or not processed correctly when there + // is no attached display. + if (!strcmp(args[0], "title")) { + if (!display) + { + if (!args[1]) // There is no display, and there is no new title. Ignore. + break; + if (!layout_attach || layout_attach == &layout_last_marker) + layout_attach = CreateLayout(args[1], 0); + else + RenameLayout(layout_attach, args[1]); + break; + } + if (!D_layout) { OutputMsg(0, "not on a layout"); @@ -4258,13 +4273,17 @@ int key; OutputMsg(0, "current layout is %d (%s)", D_layout->lay_number, D_layout->lay_title); break; } - free(D_layout->lay_title); - D_layout->lay_title= SaveStr(args[1]); + RenameLayout(D_layout, args[1]); } else if (!strcmp(args[0], "number")) { - int old; - struct layout *lay; + if (!display) + { + if (args[1] && layout_attach && layout_attach != &layout_last_marker) + RenumberLayout(layout_attach, atoi(args[1])); + break; + } + if (!D_layout) { OutputMsg(0, "not on a layout"); @@ -4275,20 +4294,23 @@ int key; OutputMsg(0, "This is layout %d (%s).\n", D_layout->lay_number, D_layout->lay_title); break; } - old = D_layout->lay_number; - n = atoi(args[1]); - if (n < 0 || n >= MAXLAY) - break; - lay = laytab[n]; - laytab[n] = D_layout; - D_layout->lay_number = n; - laytab[old] = lay; - if (lay) - lay->lay_number = old; + RenumberLayout(D_layout, atoi(args[1])); break; } else if (!strcmp(args[0], "autosave")) { + if (!display) + { + if (args[1] && layout_attach && layout_attach != &layout_last_marker) + { + if (!strcmp(args[1], "on")) + layout_attach->lay_autosave = 1; + else if (!strcmp(args[1], "off")) + layout_attach->lay_autosave = 0; + } + break; + } + if (!D_layout) { OutputMsg(0, "not on a layout"); @@ -4338,10 +4360,17 @@ int key; OutputMsg(0, "usage: layout save <name>"); break; } - SaveLayout(args[1], &D_canvas); + if (display) + SaveLayout(args[1], &D_canvas); } else if (!strcmp(args[0], "select")) { + if (!display) + { + if (args[1]) + layout_attach = FindLayout(args[1]); + break; + } if (!args[1]) { Input("Switch to layout: ", 20, INP_COOKED, SelectLayoutFin, NULL, 0); @@ -4351,6 +4380,12 @@ int key; } else if (!strcmp(args[0], "next")) { + if (!display) + { + if (layout_attach && layout_attach != &layout_last_marker) + layout_attach = layout_attach->lay_next ? layout_attach->lay_next : layouts;; + break; + } struct layout *lay = D_layout; if (lay) lay = lay->lay_next ? lay->lay_next : layouts; @@ -4368,14 +4403,22 @@ int key; } else if (!strcmp(args[0], "prev")) { - struct layout *lay = D_layout; + struct layout *lay = display ? D_layout : layout_attach; + struct layout *target = lay; if (lay) { - for (lay = layouts; lay->lay_next && lay->lay_next != D_layout; lay = lay->lay_next) + for (lay = layouts; lay->lay_next && lay->lay_next != target; lay = lay->lay_next) ; } else lay = layouts; + + if (!display) + { + layout_attach = lay; + break; + } + if (!lay) { OutputMsg(0, "no layout defined"); |