summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSadrul Habib Chowdhury <sadrul@chromium.org>2011-03-28 17:24:59 -0400
committerSadrul Habib Chowdhury <sadrul@chromium.org>2011-03-28 17:24:59 -0400
commite5b296e8af899e199d8c416da7b6e7204824ed1b (patch)
tree30473b3ec30b87f9508b2060100bfaee5016866c
parent5a74e3d9022a1426023429aed0f679c9fc2147a4 (diff)
downloadscreen-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.c46
-rw-r--r--src/layout.h3
-rw-r--r--src/process.c77
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");