1 /* Copyright (c) 2008, 2009
2 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
3 * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
4 * Micah Cowan (micah@cowan.name)
5 * Sadrul Habib Chowdhury (sadrul@users.sourceforge.net)
6 * Copyright (c) 1993-2002, 2003, 2005, 2006, 2007
7 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
8 * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
9 * Copyright (c) 1987 Oliver Laumann
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 3, or (at your option)
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
21 * You should have received a copy of the GNU General Public License
22 * along with this program (see the file COPYING); if not, see
23 * http://www.gnu.org/licenses/, or contact Free Software Foundation, Inc.,
24 * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
26 ****************************************************************
34 extern struct display
*display
;
35 extern int captionalways
;
37 struct layout
*layouts
;
38 struct layout
*laytab
[MAXLAY
];
39 struct layout
*layout_last
, layout_last_marker
;
40 struct layout
*layout_attach
= &layout_last_marker
;
46 struct canvas
*cnext
, *c
= cv
;
47 for (; cv
; cv
= cnext
)
51 FreeLayoutCv(cv
->c_slperp
);
63 CreateLayout(title
, startat
)
70 if (startat
>= MAXLAY
|| startat
< 0)
80 Msg(0, "No more layouts\n");
84 lay
= (struct layout
*)calloc(1, sizeof(*lay
));
85 lay
->lay_title
= SaveStr(title
);
86 lay
->lay_autosave
= 1;
89 lay
->lay_next
= layouts
;
101 for (lay
= layouts
; lay
; lay
= lay
->lay_next
)
102 if (!strcmp(lay
->lay_title
, name
))
105 FreeLayoutCv(&lay
->lay_canvas
);
107 lay
= CreateLayout(name
, 0);
111 DupLayoutCv(cv
, &lay
->lay_canvas
, 1);
112 lay
->lay_forecv
= D_forecv
;
122 if (!lay
|| !lay
->lay_autosave
)
124 FreeLayoutCv(&lay
->lay_canvas
);
126 DupLayoutCv(&D_canvas
, &lay
->lay_canvas
, 1);
127 lay
->lay_forecv
= D_forecv
;
138 for (i
= 0, s
= name
; *s
>= '0' && *s
<= '9'; s
++)
139 i
= i
* 10 + (*s
- '0');
140 if (!*s
&& s
!= name
&& i
>= 0 && i
< MAXLAY
)
142 for (lay
= layouts
; lay
; lay
= lay
->lay_next
)
143 if (!strcmp(lay
->lay_title
, name
))
153 AutosaveLayout(D_layout
);
156 while (D_canvas
.c_slperp
)
157 FreeCanvas(D_canvas
.c_slperp
);
159 SetCanvasWindow(D_forecv
, 0);
163 while (D_canvas
.c_slperp
)
164 FreeCanvas(D_canvas
.c_slperp
);
166 D_forecv
= lay
->lay_forecv
;
167 DupLayoutCv(&lay
->lay_canvas
, &D_canvas
, 0);
168 D_canvas
.c_ye
= D_height
- 1 - ((D_canvas
.c_slperp
&& D_canvas
.c_slperp
->c_slnext
) || captionalways
) - (D_has_hstatus
== HSTATUS_LASTLINE
);
169 ResizeCanvas(&D_canvas
);
170 RecreateCanvasChain();
171 RethinkDisplayViewports();
172 PutWindowCv(&D_canvas
);
173 ResizeLayersToCanvases();
178 NewLayout(title
, startat
)
185 lay
= CreateLayout(title
, startat
);
188 LoadLayout(0, &D_canvas
);
190 DupLayoutCv(&D_canvas
, &lay
->lay_canvas
, 1);
191 lay
->lay_forecv
= D_forecv
;
194 lay
->lay_autosave
= 1;
199 AddLayoutsInfo(buf
, len
, where
)
205 struct layout
*p
, **pp
;
209 for (pp
= laytab
; pp
< laytab
+ MAXLAY
; pp
++)
211 if (pp
- laytab
== where
&& ss
== buf
)
219 if (s
- buf
+ l
> len
- 24)
226 sprintf(s
, "%d", p
->lay_number
);
227 if (p
->lay_number
== where
)
230 if (display
&& p
== D_layout
)
251 Msg(0, "No layouts defined\n");
254 if (where
== -1 && D_layout
)
255 where
= D_layout
->lay_number
;
256 ss
= AddLayoutsInfo(buf
, sizeof(buf
), where
);
257 s
= buf
+ strlen(buf
);
258 if (ss
- buf
> D_width
/ 2)
261 if (s
- ss
< D_width
)
277 struct layout
**layp
= &layouts
;
279 for (; *layp
; layp
= &(*layp
)->lay_next
)
283 *layp
= lay
->lay_next
;
287 laytab
[lay
->lay_number
] = (struct layout
*)0;
289 if (display
&& D_layout
== lay
)
290 D_layout
= (struct layout
*)0;
292 FreeLayoutCv(&lay
->lay_canvas
);
295 free(lay
->lay_title
);
299 LoadLayout((display
&& D_layout
) ? D_layout
: *layp
? *layp
: layouts
,
300 display
? &D_canvas
: (struct canvas
*)0);
305 UpdateLayoutCanvas(cv
, wi
)
309 for (; cv
; cv
= cv
->c_slnext
)
311 if (cv
->c_layer
&& Layer2Window(cv
->c_layer
) == wi
)
313 /* A simplistic version of SetCanvasWindow(cv, 0) */
314 struct layer
*l
= cv
->c_layer
;
316 if (l
->l_cvlist
== 0 && (wi
== 0 || l
!= wi
->w_savelayer
))
320 if (l
->l_cvlist
!= cv
)
322 cv
->c_lnext
= l
->l_cvlist
;
326 /* Do not end here. Multiple canvases can have the same window */
330 UpdateLayoutCanvas(cv
->c_slperp
, wi
);
336 dump_canvas(cv
, file
)
341 for (c
= cv
->c_slperp
; c
&& c
->c_slnext
; c
= c
->c_slnext
)
343 fprintf(file
, "split%s\n", c
->c_slorient
== SLICE_HORI
? " -v" : "");
346 for (c
= cv
->c_slperp
; c
; c
= c
->c_slnext
)
349 dump_canvas(c
, file
);
351 fprintf(file
, "focus\n");
356 LayoutDumpCanvas(cv
, filename
)
360 FILE *file
= secfopen(filename
, "a");
363 dump_canvas(cv
, file
);