1 /*
2  * Copyright (c) 2000 Andrew Ferguson <andrew@owsla.cjb.net>
3  * Copyright (c) 1998 Sasha Vasko <sasha at aftercode.net>
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.   See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18  *
19  */
20 
21 #define LOCAL_DEBUG
22 
23 #include "../configure.h"
24 #include "../libAfterStep/asapp.h"
25 #include "../libAfterStep/afterstep.h"
26 #include "../libAfterStep/parser.h"
27 #include "../libAfterStep/hints.h"
28 #include "../libAfterStep/mystyle.h"
29 #include "../libAfterStep/screen.h"
30 #include "../libAfterStep/mylook.h"
31 
32 #include "afterconf.h"
33 
34 
35 TermDef TbarLayoutTerms[] = {
36 	{TF_NO_MYNAME_PREPENDING, "Buttons", 7, TT_FLAG, TBAR_LAYOUT_Buttons_ID,
37 	 NULL}
38 	,
39 	{TF_NO_MYNAME_PREPENDING, "Spacer", 6, TT_FLAG, TBAR_LAYOUT_Spacer_ID,
40 	 NULL}
41 	,
42 	{TF_NO_MYNAME_PREPENDING, "TitleSpacer", 11, TT_FLAG,
43 	 TBAR_LAYOUT_TitleSpacer_ID, NULL}
44 	,
45 	{0, NULL, 0, 0, 0}
46 };
47 
48 SyntaxDef TbarLayoutSyntax = {
49 	',',
50 	'\n',
51 	TbarLayoutTerms,
52 	0,														/* use default hash size */
53 	' ',
54 	" ",
55 	"\t",
56 	"Look Titlebar Layout Flags",
57 	"TbarLayout",
58 	"",
59 	NULL,
60 	0
61 };
62 
63 struct SyntaxDef *TbarLayoutSyntaxPtr = &TbarLayoutSyntax;
64 
65 
66 TermDef MyFrameTerms[] = {
67 	{TF_NO_MYNAME_PREPENDING | TF_SYNTAX_START, "MyFrame", 7, TT_QUOTED_TEXT,
68 	 MYFRAME_START_ID, NULL},
69 	{TF_NO_MYNAME_PREPENDING, "North", 5, TT_OPTIONAL_PATHNAME,
70 	 MYFRAME_North_ID, NULL},
71 	{TF_NO_MYNAME_PREPENDING, "East", 4, TT_OPTIONAL_PATHNAME,
72 	 MYFRAME_East_ID, NULL},
73 	{TF_NO_MYNAME_PREPENDING, "South", 5, TT_OPTIONAL_PATHNAME,
74 	 MYFRAME_South_ID, NULL},
75 	{TF_NO_MYNAME_PREPENDING, "West", 4, TT_OPTIONAL_PATHNAME,
76 	 MYFRAME_West_ID, NULL},
77 	{TF_NO_MYNAME_PREPENDING, "NorthWest", 9, TT_OPTIONAL_PATHNAME,
78 	 MYFRAME_NorthWest_ID, NULL},
79 	{TF_NO_MYNAME_PREPENDING, "NorthEast", 9, TT_OPTIONAL_PATHNAME,
80 	 MYFRAME_NorthEast_ID, NULL},
81 	{TF_NO_MYNAME_PREPENDING, "SouthWest", 9, TT_OPTIONAL_PATHNAME,
82 	 MYFRAME_SouthWest_ID, NULL},
83 	{TF_NO_MYNAME_PREPENDING, "SouthEast", 9, TT_OPTIONAL_PATHNAME,
84 	 MYFRAME_SouthEast_ID, NULL},
85 	{TF_NO_MYNAME_PREPENDING | TF_DIRECTION_INDEXED, "Side", 4,
86 	 TT_OPTIONAL_PATHNAME, MYFRAME_Side_ID, NULL},
87 	{TF_NO_MYNAME_PREPENDING | TF_DIRECTION_INDEXED, "NoSide", 6, TT_FLAG,
88 	 MYFRAME_NoSide_ID, NULL},
89 	{TF_NO_MYNAME_PREPENDING | TF_DIRECTION_INDEXED, "Corner", 6,
90 	 TT_OPTIONAL_PATHNAME, MYFRAME_Corner_ID, NULL},
91 	{TF_NO_MYNAME_PREPENDING | TF_DIRECTION_INDEXED, "NoCorner", 8, TT_FLAG,
92 	 MYFRAME_NoCorner_ID, NULL},
93 	{TF_NO_MYNAME_PREPENDING, "TitleUnfocusedStyle", 19, TT_QUOTED_TEXT,
94 	 MYFRAME_TitleUnfocusedStyle_ID, NULL},
95 	{TF_NO_MYNAME_PREPENDING, "TitleUStyle", 11, TT_QUOTED_TEXT,
96 	 MYFRAME_TitleUnfocusedStyle_ID, NULL},
97 	{TF_NO_MYNAME_PREPENDING, "TitleFocusedStyle", 17, TT_QUOTED_TEXT,
98 	 MYFRAME_TitleFocusedStyle_ID, NULL},
99 	{TF_NO_MYNAME_PREPENDING, "TitleFStyle", 11, TT_QUOTED_TEXT,
100 	 MYFRAME_TitleFocusedStyle_ID, NULL},
101 	{TF_NO_MYNAME_PREPENDING, "TitleStickyStyle", 16, TT_QUOTED_TEXT,
102 	 MYFRAME_TitleStickyStyle_ID, NULL},
103 	{TF_NO_MYNAME_PREPENDING, "TitleSStyle", 11, TT_QUOTED_TEXT,
104 	 MYFRAME_TitleStickyStyle_ID, NULL},
105 	{TF_NO_MYNAME_PREPENDING, "FrameUnfocusedStyle", 19, TT_QUOTED_TEXT,
106 	 MYFRAME_FrameUnfocusedStyle_ID, NULL},
107 	{TF_NO_MYNAME_PREPENDING, "FrameUStyle", 11, TT_QUOTED_TEXT,
108 	 MYFRAME_FrameUnfocusedStyle_ID, NULL},
109 	{TF_NO_MYNAME_PREPENDING, "FrameFocusedStyle", 17, TT_QUOTED_TEXT,
110 	 MYFRAME_FrameFocusedStyle_ID, NULL},
111 	{TF_NO_MYNAME_PREPENDING, "FrameFStyle", 11, TT_QUOTED_TEXT,
112 	 MYFRAME_FrameFocusedStyle_ID, NULL},
113 	{TF_NO_MYNAME_PREPENDING, "FrameStickyStyle", 16, TT_QUOTED_TEXT,
114 	 MYFRAME_FrameStickyStyle_ID, NULL},
115 	{TF_NO_MYNAME_PREPENDING, "FrameSStyle", 11, TT_QUOTED_TEXT,
116 	 MYFRAME_FrameStickyStyle_ID, NULL},
117 	{TF_NO_MYNAME_PREPENDING | TF_DIRECTION_INDEXED, "SideSize", 8,
118 	 TT_GEOMETRY, MYFRAME_SideSize_ID, NULL},
119 	{TF_NO_MYNAME_PREPENDING | TF_DIRECTION_INDEXED | TF_NAMED, "SideAlign",
120 	 9, TT_FLAG, MYFRAME_SideAlign_ID,
121 	 &AlignSyntax},
122 	{TF_NO_MYNAME_PREPENDING | TF_DIRECTION_INDEXED | TF_NAMED, "SideBevel",
123 	 9, TT_FLAG, MYFRAME_SideBevel_ID,
124 	 &BevelSyntax},
125 	{TF_NO_MYNAME_PREPENDING | TF_DIRECTION_INDEXED | TF_NAMED, "SideFBevel",
126 	 10, TT_FLAG, MYFRAME_SideFBevel_ID,
127 	 &BevelSyntax},
128 	{TF_NO_MYNAME_PREPENDING | TF_DIRECTION_INDEXED | TF_NAMED, "SideUBevel",
129 	 10, TT_FLAG, MYFRAME_SideUBevel_ID,
130 	 &BevelSyntax},
131 	{TF_NO_MYNAME_PREPENDING | TF_DIRECTION_INDEXED | TF_NAMED, "SideSBevel",
132 	 10, TT_FLAG, MYFRAME_SideSBevel_ID,
133 	 &BevelSyntax},
134 	{TF_NO_MYNAME_PREPENDING | TF_DIRECTION_INDEXED | TF_NAMED,
135 	 "SideFocusedBevel", 16, TT_FLAG, MYFRAME_SideFBevel_ID,
136 	 &BevelSyntax},
137 	{TF_NO_MYNAME_PREPENDING | TF_DIRECTION_INDEXED | TF_NAMED,
138 	 "SideUnfocusedBevel", 18, TT_FLAG,
139 	 MYFRAME_SideUBevel_ID, &BevelSyntax},
140 	{TF_NO_MYNAME_PREPENDING | TF_DIRECTION_INDEXED | TF_NAMED,
141 	 "SideStickyBevel", 15, TT_FLAG, MYFRAME_SideSBevel_ID,
142 	 &BevelSyntax},
143 	{TF_NO_MYNAME_PREPENDING | TF_DIRECTION_INDEXED, "CornerSize", 10,
144 	 TT_GEOMETRY, MYFRAME_CornerSize_ID, NULL},
145 	{TF_NO_MYNAME_PREPENDING | TF_DIRECTION_INDEXED | TF_NAMED,
146 	 "CornerAlign", 11, TT_FLAG, MYFRAME_CornerAlign_ID,
147 	 &AlignSyntax},
148 	{TF_NO_MYNAME_PREPENDING | TF_DIRECTION_INDEXED | TF_NAMED,
149 	 "CornerBevel", 11, TT_FLAG, MYFRAME_CornerBevel_ID,
150 	 &BevelSyntax},
151 	{TF_NO_MYNAME_PREPENDING | TF_DIRECTION_INDEXED | TF_NAMED,
152 	 "CornerFBevel", 12, TT_FLAG, MYFRAME_CornerFBevel_ID,
153 	 &BevelSyntax},
154 	{TF_NO_MYNAME_PREPENDING | TF_DIRECTION_INDEXED | TF_NAMED,
155 	 "CornerUBevel", 12, TT_FLAG, MYFRAME_CornerUBevel_ID,
156 	 &BevelSyntax},
157 	{TF_NO_MYNAME_PREPENDING | TF_DIRECTION_INDEXED | TF_NAMED,
158 	 "CornerSBevel", 12, TT_FLAG, MYFRAME_CornerSBevel_ID,
159 	 &BevelSyntax},
160 	{TF_NO_MYNAME_PREPENDING | TF_DIRECTION_INDEXED | TF_NAMED,
161 	 "CornerFocusedBevel", 18, TT_FLAG,
162 	 MYFRAME_CornerFBevel_ID, &BevelSyntax},
163 	{TF_NO_MYNAME_PREPENDING | TF_DIRECTION_INDEXED | TF_NAMED,
164 	 "CornerUnfocusedBevel", 20, TT_FLAG,
165 	 MYFRAME_CornerUBevel_ID, &BevelSyntax},
166 	{TF_NO_MYNAME_PREPENDING | TF_DIRECTION_INDEXED | TF_NAMED,
167 	 "CornerStickyBevel", 17, TT_FLAG,
168 	 MYFRAME_CornerSBevel_ID, &BevelSyntax},
169 	{TF_NO_MYNAME_PREPENDING, "TitleBevel", 10, TT_FLAG,
170 	 MYFRAME_TitleBevel_ID, &BevelSyntax},
171 	{TF_NO_MYNAME_PREPENDING, "TitleFBevel", 11, TT_FLAG,
172 	 MYFRAME_TitleFBevel_ID, &BevelSyntax},
173 	{TF_NO_MYNAME_PREPENDING, "TitleUBevel", 11, TT_FLAG,
174 	 MYFRAME_TitleUBevel_ID, &BevelSyntax},
175 	{TF_NO_MYNAME_PREPENDING, "TitleSBevel", 11, TT_FLAG,
176 	 MYFRAME_TitleSBevel_ID, &BevelSyntax},
177 	{TF_NO_MYNAME_PREPENDING, "TitleFocusedBevel", 17, TT_FLAG,
178 	 MYFRAME_TitleFBevel_ID, &BevelSyntax},
179 	{TF_NO_MYNAME_PREPENDING, "TitleUnfocusedBevel", 19, TT_FLAG,
180 	 MYFRAME_TitleUBevel_ID, &BevelSyntax},
181 	{TF_NO_MYNAME_PREPENDING, "TitleStickyBevel", 16, TT_FLAG,
182 	 MYFRAME_TitleSBevel_ID, &BevelSyntax},
183 	{TF_NO_MYNAME_PREPENDING, "TitleAlign", 10, TT_FLAG,
184 	 MYFRAME_TitleAlign_ID, &AlignSyntax},
185 	{TF_NO_MYNAME_PREPENDING, "TitleCompositionMethod", 22, TT_UINTEGER,
186 	 MYFRAME_TitleCM_ID, NULL},
187 	{TF_NO_MYNAME_PREPENDING, "TitleFCompositionMethod", 22, TT_UINTEGER,
188 	 MYFRAME_TitleFCM_ID, NULL},
189 	{TF_NO_MYNAME_PREPENDING, "TitleUCompositionMethod", 22, TT_UINTEGER,
190 	 MYFRAME_TitleUCM_ID, NULL},
191 	{TF_NO_MYNAME_PREPENDING, "TitleSCompositionMethod", 22, TT_UINTEGER,
192 	 MYFRAME_TitleSCM_ID, NULL},
193 	{TF_NO_MYNAME_PREPENDING, "TitleFocusedCompositionMethod", 28,
194 	 TT_UINTEGER, MYFRAME_TitleFCM_ID, NULL},
195 	{TF_NO_MYNAME_PREPENDING, "TitleUnfocusedCompositionMethod", 30,
196 	 TT_UINTEGER, MYFRAME_TitleUCM_ID, NULL},
197 	{TF_NO_MYNAME_PREPENDING, "TitleStickyCompositionMethod", 27,
198 	 TT_UINTEGER, MYFRAME_TitleSCM_ID, NULL},
199 	{TF_NO_MYNAME_PREPENDING, "TitleFHue", 9, TT_COLOR, MYFRAME_TitleFHue_ID,
200 	 NULL},
201 	{TF_NO_MYNAME_PREPENDING, "TitleUHue", 9, TT_COLOR, MYFRAME_TitleUHue_ID,
202 	 NULL},
203 	{TF_NO_MYNAME_PREPENDING, "TitleSHue", 9, TT_COLOR, MYFRAME_TitleSHue_ID,
204 	 NULL},
205 	{TF_NO_MYNAME_PREPENDING, "TitleFocusedHue", 15, TT_COLOR,
206 	 MYFRAME_TitleFHue_ID, NULL},
207 	{TF_NO_MYNAME_PREPENDING, "TitleUnfocusedHue", 17, TT_COLOR,
208 	 MYFRAME_TitleUHue_ID, NULL},
209 	{TF_NO_MYNAME_PREPENDING, "TitleStickyHue", 14, TT_COLOR,
210 	 MYFRAME_TitleSHue_ID, NULL},
211 	{TF_NO_MYNAME_PREPENDING, "TitleFSaturation", 16, TT_UINTEGER,
212 	 MYFRAME_TitleFSat_ID, NULL},
213 	{TF_NO_MYNAME_PREPENDING, "TitleUSaturation", 16, TT_UINTEGER,
214 	 MYFRAME_TitleUSat_ID, NULL},
215 	{TF_NO_MYNAME_PREPENDING, "TitleSSaturation", 16, TT_UINTEGER,
216 	 MYFRAME_TitleSSat_ID, NULL},
217 	{TF_NO_MYNAME_PREPENDING, "TitleFocusedSaturation", 22, TT_UINTEGER,
218 	 MYFRAME_TitleFSat_ID, NULL},
219 	{TF_NO_MYNAME_PREPENDING, "TitleUnfocusedSaturation", 24, TT_UINTEGER,
220 	 MYFRAME_TitleUSat_ID, NULL},
221 	{TF_NO_MYNAME_PREPENDING, "TitleStickySaturation", 21, TT_UINTEGER,
222 	 MYFRAME_TitleSSat_ID, NULL},
223 	{TF_NO_MYNAME_PREPENDING, "TitleHSpacing", 13, TT_INTEGER,
224 	 MYFRAME_TitleHSpacing_ID, NULL},
225 	{TF_NO_MYNAME_PREPENDING, "TitleVSpacing", 13, TT_INTEGER,
226 	 MYFRAME_TitleVSpacing_ID, NULL},
227 	{TF_NO_MYNAME_PREPENDING, "InheritDefaults", 15, TT_FLAG,
228 	 MYFRAME_InheritDefaults_ID, NULL},
229 	{TF_NO_MYNAME_PREPENDING | TF_NONUNIQUE, "Inherit", 7, TT_QUOTED_TEXT,
230 	 MYFRAME_Inherit_ID, NULL},
231 	{TF_NO_MYNAME_PREPENDING | TF_SYNTAX_TERMINATOR, "~MyFrame", 8, TT_FLAG,
232 	 MYFRAME_DONE_ID, NULL},
233 	{TF_NO_MYNAME_PREPENDING, "LeftBtnBackground", 17, TT_FILENAME,
234 	 MYFRAME_LeftBtnBackground_ID, NULL},
235 	{TF_NO_MYNAME_PREPENDING, "LeftSpacerBackground", 20, TT_FILENAME,
236 	 MYFRAME_LeftSpacerBackground_ID, NULL},
237 	{TF_NO_MYNAME_PREPENDING, "LeftTitleSpacerBackground", 25, TT_FILENAME,
238 	 MYFRAME_LTitleSpacerBackground_ID, NULL},
239 	{TF_NO_MYNAME_PREPENDING, "TitleBackground", 15, TT_FILENAME,
240 	 MYFRAME_TitleBackground_ID, NULL},
241 	{TF_NO_MYNAME_PREPENDING, "RightTitleSpacerBackground", 26, TT_FILENAME,
242 	 MYFRAME_RTitleSpacerBackground_ID, NULL},
243 	{TF_NO_MYNAME_PREPENDING, "RightSpacerBackground", 21, TT_FILENAME,
244 	 MYFRAME_RightSpacerBackground_ID, NULL},
245 	{TF_NO_MYNAME_PREPENDING, "RightBtnBackground", 18, TT_FILENAME,
246 	 MYFRAME_RightBtnBackground_ID, NULL},
247 	{TF_NO_MYNAME_PREPENDING, "LeftBtnBackAlign", 16, TT_FLAG,
248 	 MYFRAME_LeftBtnBackAlign_ID, &AlignSyntax},
249 	{TF_NO_MYNAME_PREPENDING, "LeftSpacerBackAlign", 19, TT_FLAG,
250 	 MYFRAME_LeftSpacerBackAlign_ID, &AlignSyntax},
251 	{TF_NO_MYNAME_PREPENDING, "LeftTitleSpacerBackAlign", 24, TT_FLAG,
252 	 MYFRAME_LTitleSpacerBackAlign_ID, &AlignSyntax},
253 	{TF_NO_MYNAME_PREPENDING, "TitleBackgroundAlign", 20, TT_FLAG,
254 	 MYFRAME_TitleBackgroundAlign_ID, &AlignSyntax},
255 	{TF_NO_MYNAME_PREPENDING, "RightTitleSpacerBackAlign", 25, TT_FLAG,
256 	 MYFRAME_RTitleSpacerBackAlign_ID, &AlignSyntax},
257 	{TF_NO_MYNAME_PREPENDING, "RightSpacerBackAlign", 20, TT_FLAG,
258 	 MYFRAME_RightSpacerBackAlign_ID, &AlignSyntax},
259 	{TF_NO_MYNAME_PREPENDING, "RightBtnBackAlign", 17, TT_FLAG,
260 	 MYFRAME_RightBtnBackAlign_ID, &AlignSyntax},
261 	{TF_NO_MYNAME_PREPENDING, "CondenseTitlebar", 16, TT_FLAG,
262 	 MYFRAME_CondenseTitlebar_ID, &AlignSyntax},
263 	{TF_NO_MYNAME_PREPENDING, "LeftTitlebarLayout", 18, TT_FLAG,
264 	 MYFRAME_LeftTitlebarLayout_ID, &TbarLayoutSyntax},
265 	{TF_NO_MYNAME_PREPENDING, "RightTitlebarLayout", 19, TT_FLAG,
266 	 MYFRAME_RightTitlebarLayout_ID, &TbarLayoutSyntax},
267 	{TF_NO_MYNAME_PREPENDING, "NoBorder", 8, TT_FLAG, MYFRAME_NoBorder_ID,
268 	 NULL},
269 	{TF_NO_MYNAME_PREPENDING, "AllowBorder", 11, TT_FLAG,
270 	 MYFRAME_AllowBorder_ID, NULL},
271 	{TF_NO_MYNAME_PREPENDING, "LeftBtnAlign", 12, TT_FLAG,
272 	 MYFRAME_LeftBtnAlign_ID, &AlignSyntax},
273 	{TF_NO_MYNAME_PREPENDING, "RightBtnAlign", 13, TT_FLAG,
274 	 MYFRAME_RightBtnAlign_ID, &AlignSyntax},
275 	{TF_NO_MYNAME_PREPENDING | TF_DIRECTION_INDEXED | TF_NAMED,
276 	 "SideSlicing", 11, TT_GEOMETRY, MYFRAME_SideSlicing_ID,
277 	 NULL},
278 	{TF_NO_MYNAME_PREPENDING, "LeftBtnBackSlicing", 18, TT_GEOMETRY,
279 	 MYFRAME_LeftBtnBackSlicing_ID, NULL},
280 	{TF_NO_MYNAME_PREPENDING, "LeftSpacerBackSlicing", 21, TT_GEOMETRY,
281 	 MYFRAME_LeftSpacerBackSlicing_ID, NULL},
282 	{TF_NO_MYNAME_PREPENDING, "LeftTitleSpacerBackSlicing", 26, TT_GEOMETRY,
283 	 MYFRAME_LTitleSpacerBackSlicing_ID, NULL},
284 	{TF_NO_MYNAME_PREPENDING, "TitleBackgroundSlicing", 22, TT_GEOMETRY,
285 	 MYFRAME_TitleBackSlicing_ID, NULL},
286 	{TF_NO_MYNAME_PREPENDING, "RightTitleSpacerBackSlicing", 27, TT_GEOMETRY,
287 	 MYFRAME_RTitleSpacerBackSlicing_ID, NULL},
288 	{TF_NO_MYNAME_PREPENDING, "RightSpacerBackSlicing", 22, TT_GEOMETRY,
289 	 MYFRAME_RightSpacerBackSlicing_ID, NULL},
290 	{TF_NO_MYNAME_PREPENDING, "RightBtnBackSlicing", 19, TT_GEOMETRY,
291 	 MYFRAME_RightBtnBackSlicing_ID, NULL},
292 
293 	{0, NULL, 0, 0, 0}
294 };
295 
296 SyntaxDef MyFrameSyntax = {
297 	'\n',
298 	'\0',
299 	MyFrameTerms,
300 	7,														/* hash size */
301 	'\t',
302 	"",
303 	"\t",
304 	"Look MyFrame",
305 	"MyFrame",
306 	"defines how AfterStep should construct window's frame",
307 	NULL,
308 	0
309 };
310 
frame_side_idx2name(int idx)311 const char *frame_side_idx2name (int idx)
312 {
313 	if (idx >= 0 && idx < FRAME_PARTS)
314 		return MyFrameTerms[1 + idx].keyword;
315 	return NULL;
316 }
317 
318 /********************************************************************/
319 /* First MyFrame processing code				    */
320 /********************************************************************/
AddMyFrameDefinition(MyFrameDefinition ** tail)321 MyFrameDefinition *AddMyFrameDefinition (MyFrameDefinition ** tail)
322 {
323 	MyFrameDefinition *new_def = safecalloc (1, sizeof (MyFrameDefinition));
324 
325 	*tail = new_def;
326 	return new_def;
327 }
328 
DestroyMyFrameDefinitions(MyFrameDefinition ** list)329 void DestroyMyFrameDefinitions (MyFrameDefinition ** list)
330 {
331 	if (*list) {
332 		register int i;
333 		MyFrameDefinition *fd = *list;
334 
335 		DestroyMyFrameDefinitions (&(fd->next));
336 		if (fd->name)
337 			free (fd->name);
338 		for (i = 0; i < FRAME_PARTS; i++)
339 			if (fd->parts[i])
340 				free (fd->parts[i]);
341 
342 		for (i = 0; i < BACK_STYLES; ++i) {
343 			if (fd->title_styles[i])
344 				free (fd->title_styles[i]);
345 			if (fd->frame_styles[i])
346 				free (fd->frame_styles[i]);
347 		}
348 		for (i = 0; i < MYFRAME_TITLE_BACKS; ++i) {
349 			if (fd->title_backs[i])
350 				free (fd->title_backs[i]);
351 		}
352 		if (fd->inheritance_list) {
353 			i = fd->inheritance_num - 1;
354 			while (--i >= 0)
355 				if (fd->inheritance_list[i])
356 					free (fd->inheritance_list[i]);
357 			free (fd->inheritance_list);
358 		}
359 		free (fd);
360 		*list = NULL;
361 	}
362 }
363 
PrintMyFrameDefinitions(MyFrameDefinition * list,int index)364 void PrintMyFrameDefinitions (MyFrameDefinition * list, int index)
365 {
366 	if (list) {
367 		register int i;
368 
369 		if (list->name)
370 			fprintf (stderr, "MyFrame[%d].name = \"%s\";\n", index, list->name);
371 		fprintf (stderr, "MyFrame[%d].set_parts = 0x%lX;\n", index,
372 						 list->set_parts);
373 		fprintf (stderr, "MyFrame[%d].parts_mask = 0x%lX;\n", index,
374 						 list->parts_mask);
375 		for (i = 0; i < FRAME_PARTS; i++)
376 			if (list->parts[i])
377 				fprintf (stderr, "MyFrame[%d].Side[%d] = \"%s\";\n", index, i,
378 								 list->parts[i]);
379 		for (i = 0; i < BACK_STYLES; ++i)
380 			if (list->title_styles[i])
381 				fprintf (stderr, "MyFrame[%d].TitleStyle[%d] = \"%s\";\n", index,
382 								 i, list->title_styles[i]);
383 		for (i = 0; i < BACK_STYLES; ++i)
384 			if (list->frame_styles[i])
385 				fprintf (stderr, "MyFrame[%d].FrameStyle[%d] = \"%s\";\n", index,
386 								 i, list->frame_styles[i]);
387 		for (i = 0; i < MYFRAME_TITLE_BACKS; ++i) {
388 			if (list->title_backs[i])
389 				fprintf (stderr, "MyFrame[%d].TitleBack[%d] = \"%s\";\n", index, i,
390 								 list->title_backs[i]);
391 		}
392 		fprintf (stderr, "MyFrame[%d].set_part_size = 0x%lX;\n", index,
393 						 list->set_part_size);
394 		fprintf (stderr, "MyFrame[%d].set_part_bevel = 0x%lX;\n", index,
395 						 list->set_part_bevel);
396 		fprintf (stderr, "MyFrame[%d].set_part_align = 0x%lX;\n", index,
397 						 list->set_part_align);
398 		for (i = 0; i < FRAME_PARTS; ++i) {
399 			fprintf (stderr, "MyFrame[%d].Part[%d].width = %d;\n", index, i,
400 							 list->part_width[i]);
401 			fprintf (stderr, "MyFrame[%d].Part[%d].length = %d;\n", index, i,
402 							 list->part_length[i]);
403 			fprintf (stderr, "MyFrame[%d].Part[%d].fbevel = 0x%lX;\n", index, i,
404 							 list->part_fbevel[i]);
405 			fprintf (stderr, "MyFrame[%d].Part[%d].ubevel = 0x%lX;\n", index, i,
406 							 list->part_ubevel[i]);
407 			fprintf (stderr, "MyFrame[%d].Part[%d].sbevel = 0x%lX;\n", index, i,
408 							 list->part_sbevel[i]);
409 			fprintf (stderr, "MyFrame[%d].Part[%d].align = 0x%lX;\n", index, i,
410 							 list->part_align[i]);
411 		}
412 		fprintf (stderr, "MyFrame[%d].set_title_attr = 0x%lX;\n", index,
413 						 list->set_title_attr);
414 		fprintf (stderr, "MyFrame[%d].title_fbevel = 0x%lX;\n", index,
415 						 list->title_fbevel);
416 		fprintf (stderr, "MyFrame[%d].title_ubevel = 0x%lX;\n", index,
417 						 list->title_ubevel);
418 		fprintf (stderr, "MyFrame[%d].title_sbevel = 0x%lX;\n", index,
419 						 list->title_sbevel);
420 		fprintf (stderr, "MyFrame[%d].title_align = 0x%lX;\n", index,
421 						 list->title_align);
422 		for (i = 0; i < MYFRAME_TITLE_BACKS; ++i) {
423 			fprintf (stderr, "MyFrame[%d].title_backs_align[%d] = 0x%lX;\n",
424 							 index, i, list->title_backs_align[i]);
425 		}
426 		for (i = 0; i < MYFRAME_TITLE_BACKS; ++i) {
427 			if (list->title_backs_slicing[i].flags != 0)
428 				fprintf (stderr,
429 								 "MyFrame[%d].title_backs_slicing[%d] = 0x%X, %dx%d%+d%+d;\n",
430 								 index, i, list->title_backs_slicing[i].flags,
431 								 list->title_backs_slicing[i].width,
432 								 list->title_backs_slicing[i].height,
433 								 list->title_backs_slicing[i].x,
434 								 list->title_backs_slicing[i].y);
435 		}
436 		fprintf (stderr, "MyFrame[%d].title_fcm = %d;\n", index,
437 						 list->title_fcm);
438 		fprintf (stderr, "MyFrame[%d].title_ucm = %d;\n", index,
439 						 list->title_ucm);
440 		fprintf (stderr, "MyFrame[%d].title_scm = %d;\n", index,
441 						 list->title_scm);
442 		for (i = 0; i < FRAME_SIDES; ++i)
443 			if (list->side_slicing[i].flags != 0)
444 				fprintf (stderr,
445 								 "MyFrame[%d].side_slicing[%d] = 0x%X, %dx%d%+d%+d;\n",
446 								 index, i, list->side_slicing[i].flags,
447 								 list->side_slicing[i].width, list->side_slicing[i].height,
448 								 list->side_slicing[i].x, list->side_slicing[i].y);
449 
450 		if (list->inheritance_list)
451 			for (i = 0; i < list->inheritance_num; ++i)
452 				fprintf (stderr, "MyFrame[%d].Inherit[%d] = \"%s\";\n", index, i,
453 								 list->inheritance_list[i]);
454 		PrintMyFrameDefinitions (list->next, index + 1);
455 	}
456 }
457 
458 
ParseTbarLayoutOptions(FreeStorageElem * options)459 unsigned long ParseTbarLayoutOptions (FreeStorageElem * options)
460 {
461 	unsigned long layout = 0;
462 	int count = 0;
463 
464 	while (options) {
465 		LOCAL_DEBUG_OUT ("options(%p)->keyword(\"%s\")", options,
466 										 options->term->keyword);
467 		if (options->term != NULL) {
468 			int elem = options->term->id - TBAR_LAYOUT_ID_START;
469 			int i;
470 
471 			if (elem >= 0 && elem <= MYFRAME_TITLE_SIDE_ELEMS) {
472 				for (i = 0; i < count; ++i)
473 					if (MYFRAME_GetTbarLayoutElem (layout, i) == elem)
474 						break;
475 				if (i >= count) {
476 					MYFRAME_SetTbarLayoutElem (layout, count, elem);
477 					++count;
478 				}
479 			}
480 		}
481 		options = options->next;
482 	}
483 	while (count < MYFRAME_TITLE_SIDE_ELEMS) {
484 		MYFRAME_SetTbarLayoutElem (layout, count, MYFRAME_TITLE_BACK_INVALID);
485 		++count;
486 	}
487 	return layout;
488 }
489 
490 void
tbar_layout_parse(char * tline,FILE * fd,char ** myname,int * playout)491 tbar_layout_parse (char *tline, FILE * fd, char **myname, int *playout)
492 {
493 	FreeStorageElem *Storage =
494 			tline_subsyntax_parse (NULL, tline, fd, (char *)myname, &BevelSyntax,
495 														 NULL, NULL);
496 
497 	if (Storage) {
498 		*playout = ParseTbarLayoutOptions (Storage);
499 		DestroyFreeStorage (&Storage);
500 	}
501 }
502 
503 
ProcessMyFrameOptions(FreeStorageElem * options,MyFrameDefinition ** tail)504 MyFrameDefinition **ProcessMyFrameOptions (FreeStorageElem * options,
505 																					 MyFrameDefinition ** tail)
506 {
507 	ConfigItem item;
508 	int rel_id;
509 	MyFrameDefinition *fd = NULL;
510 
511 	item.memory = NULL;
512 
513 	for (; options; options = options->next) {
514 		if (options->term == NULL)
515 			continue;
516 		LOCAL_DEBUG_OUT ("MyFrame(%p)->options(%p)->keyword(\"%s\")", fd,
517 										 options, options->term->keyword);
518 		if (options->term->id < MYFRAME_ID_START
519 				|| options->term->id > MYFRAME_ID_END)
520 			continue;
521 
522 		if (options->term->type == TT_FLAG) {
523 			if (fd != NULL) {
524 				if (options->term->id == MYFRAME_DONE_ID)
525 					break;								/* for loop */
526 				if (options->term->id == MYFRAME_InheritDefaults_ID) {
527 					set_flags (fd->flags, MYFRAME_INHERIT_DEFAULTS);
528 					set_flags (fd->set_flags, MYFRAME_INHERIT_DEFAULTS);
529 					continue;
530 				}
531 				if (options->term->id >= MYFRAME_TitleBackgroundAlign_ID_START) {
532 					int index =
533 							options->term->id - MYFRAME_TitleBackgroundAlign_ID_START;
534 
535 					if (index < MYFRAME_TITLE_BACKS) {
536 						fd->title_backs_align[index] =
537 								ParseAlignOptions (options->sub);
538 						set_flags (fd->set_title_attr,
539 											 MYFRAME_TitleBackAlignSet_Start << index);
540 						continue;
541 					}
542 				}
543 				if (options->term->id >= MYFRAME_TitleBackSlicing_ID_START) {
544 					int index =
545 							options->term->id - MYFRAME_TitleBackSlicing_ID_START;
546 
547 					if (index < MYFRAME_TITLE_BACKS) {
548 						if (!ReadConfigItem (&item, options))
549 							continue;
550 						fd->title_backs_slicing[index] = item.data.geometry;
551 					}
552 				}
553 				switch (options->term->id) {
554 				case MYFRAME_TitleBevel_ID:
555 					fd->title_fbevel = ParseBevelOptions (options->sub);
556 					fd->title_ubevel = fd->title_fbevel;
557 					fd->title_sbevel = fd->title_fbevel;
558 					set_flags (fd->set_title_attr, MYFRAME_TitleBevelSet);
559 					break;
560 				case MYFRAME_TitleFBevel_ID:
561 					fd->title_fbevel = ParseBevelOptions (options->sub);
562 					set_flags (fd->set_title_attr, MYFRAME_TitleBevelSet);
563 					break;
564 				case MYFRAME_TitleUBevel_ID:
565 					fd->title_ubevel = ParseBevelOptions (options->sub);
566 					set_flags (fd->set_title_attr, MYFRAME_TitleBevelSet);
567 					break;
568 				case MYFRAME_TitleSBevel_ID:
569 					fd->title_sbevel = ParseBevelOptions (options->sub);
570 					set_flags (fd->set_title_attr, MYFRAME_TitleBevelSet);
571 					break;
572 				case MYFRAME_TitleAlign_ID:
573 					fd->title_align = ParseAlignOptions (options->sub);
574 					set_flags (fd->set_title_attr, MYFRAME_TitleAlignSet);
575 					break;
576 				case MYFRAME_LeftBtnAlign_ID:
577 					fd->left_btn_align = ParseAlignOptions (options->sub);
578 					set_flags (fd->set_title_attr, MYFRAME_LeftBtnAlignSet);
579 					break;
580 				case MYFRAME_RightBtnAlign_ID:
581 					fd->right_btn_align = ParseAlignOptions (options->sub);
582 					set_flags (fd->set_title_attr, MYFRAME_RightBtnAlignSet);
583 					break;
584 				case MYFRAME_CondenseTitlebar_ID:
585 					fd->condense_titlebar = ParseAlignOptions (options->sub);
586 					set_flags (fd->set_title_attr, MYFRAME_CondenseTitlebarSet);
587 					break;
588 				case MYFRAME_LeftTitlebarLayout_ID:
589 					fd->left_layout = ParseTbarLayoutOptions (options->sub);
590 					set_flags (fd->set_title_attr, MYFRAME_LeftTitlebarLayoutSet);
591 					break;
592 				case MYFRAME_RightTitlebarLayout_ID:
593 					fd->right_layout = ParseTbarLayoutOptions (options->sub);
594 					set_flags (fd->set_title_attr, MYFRAME_RightTitlebarLayoutSet);
595 					break;
596 				case MYFRAME_NoBorder_ID:
597 					set_flags (fd->flags, MYFRAME_NOBORDER);
598 					set_flags (fd->set_flags, MYFRAME_NOBORDER);
599 					break;
600 				case MYFRAME_AllowBorder_ID:
601 					clear_flags (fd->flags, MYFRAME_NOBORDER);
602 					set_flags (fd->set_flags, MYFRAME_NOBORDER);
603 					break;
604 				default:
605 					if (!ReadConfigItem (&item, options))
606 						continue;
607 					LOCAL_DEBUG_OUT ("item.index = %d", item.index);
608 					if (item.index < 0 || item.index >= FRAME_PARTS) {
609 						item.ok_to_free = 1;
610 						continue;
611 					}
612 					switch (options->term->id) {
613 					case MYFRAME_NoSide_ID:
614 					case MYFRAME_NoCorner_ID:
615 						clear_flags (fd->parts_mask, 0x01 << item.index);
616 						set_flags (fd->set_parts, 0x01 << item.index);
617 						break;
618 					case MYFRAME_SideAlign_ID:
619 					case MYFRAME_CornerAlign_ID:
620 						fd->part_align[item.index] = ParseAlignOptions (options->sub);
621 						set_flags (fd->set_part_align, 0x01 << item.index);
622 						break;
623 					case MYFRAME_SideBevel_ID:
624 					case MYFRAME_CornerBevel_ID:
625 						fd->part_fbevel[item.index] = ParseBevelOptions (options->sub);
626 						fd->part_ubevel[item.index] = fd->part_fbevel[item.index];
627 						fd->part_sbevel[item.index] = fd->part_fbevel[item.index];
628 						SetPartFBevelSet (fd, item.index);
629 						SetPartUBevelSet (fd, item.index);
630 						SetPartSBevelSet (fd, item.index);
631 						break;
632 					case MYFRAME_SideFBevel_ID:
633 					case MYFRAME_CornerFBevel_ID:
634 						fd->part_fbevel[item.index] = ParseBevelOptions (options->sub);
635 						SetPartFBevelSet (fd, item.index);
636 						break;
637 					case MYFRAME_SideUBevel_ID:
638 					case MYFRAME_CornerUBevel_ID:
639 						fd->part_ubevel[item.index] = ParseBevelOptions (options->sub);
640 						SetPartUBevelSet (fd, item.index);
641 						break;
642 					case MYFRAME_SideSBevel_ID:
643 					case MYFRAME_CornerSBevel_ID:
644 						fd->part_sbevel[item.index] = ParseBevelOptions (options->sub);
645 						SetPartSBevelSet (fd, item.index);
646 						break;
647 					case MYFRAME_SideSlicing_ID:
648 						fd->side_slicing[item.index] = item.data.geometry;
649 						break;
650 					default:
651 						show_warning
652 								("Unexpected MyFrame definition keyword \"%s\" . Ignoring.",
653 								 options->term->keyword);
654 						item.ok_to_free = 1;
655 					}
656 				}
657 			}
658 			continue;
659 		}
660 
661 		if (!ReadConfigItem (&item, options)) {
662 			LOCAL_DEBUG_OUT ("ReadConfigItem has failed%s", "");
663 			continue;
664 		}
665 		if (*tail == NULL)
666 			fd = AddMyFrameDefinition (tail);
667 
668 		rel_id = options->term->id - MYFRAME_START_ID;
669 		if (fd) {
670 			if (rel_id == 0) {
671 				if (fd->name != NULL) {
672 					show_error
673 							("MyFrame \"%s\": Previous MyFrame definition [%s] was not terminated correctly, and will be ignored.",
674 							 item.data.string, fd->name);
675 					DestroyMyFrameDefinitions (tail);
676 					fd = AddMyFrameDefinition (tail);
677 				}
678 				set_string (&(fd->name), item.data.string);
679 			} else if (rel_id <= FRAME_PARTS) {
680 				--rel_id;
681 				set_string_value (&(fd->parts[rel_id]), item.data.string,
682 													&(fd->set_parts), (0x01 << rel_id));
683 				set_flags (fd->parts_mask, (0x01 << rel_id));
684 			} else {
685 				rel_id = item.index;
686 				LOCAL_DEBUG_OUT ("item.index = %d", item.index);
687 				if (rel_id < 0 || rel_id >= FRAME_PARTS)
688 					rel_id = 0;
689 				switch (options->term->id) {
690 				case MYFRAME_Side_ID:
691 				case MYFRAME_Corner_ID:
692 					set_string_value (&(fd->parts[rel_id]), item.data.string,
693 														&(fd->set_parts), (0x01 << rel_id));
694 					set_flags (fd->parts_mask, (0x01 << rel_id));
695 					break;
696 				case MYFRAME_TitleUnfocusedStyle_ID:
697 					set_string (&(fd->title_styles[BACK_UNFOCUSED]),
698 											item.data.string);
699 					break;
700 				case MYFRAME_TitleFocusedStyle_ID:
701 					set_string (&(fd->title_styles[BACK_FOCUSED]), item.data.string);
702 					break;
703 				case MYFRAME_TitleStickyStyle_ID:
704 					set_string (&(fd->title_styles[BACK_STICKY]), item.data.string);
705 					break;
706 				case MYFRAME_FrameUnfocusedStyle_ID:
707 					set_string (&(fd->frame_styles[BACK_UNFOCUSED]),
708 											item.data.string);
709 					break;
710 				case MYFRAME_FrameFocusedStyle_ID:
711 					set_string (&(fd->frame_styles[BACK_FOCUSED]), item.data.string);
712 					break;
713 				case MYFRAME_FrameStickyStyle_ID:
714 					set_string (&(fd->frame_styles[BACK_STICKY]), item.data.string);
715 					break;
716 				case MYFRAME_SideSize_ID:
717 				case MYFRAME_CornerSize_ID:
718 					if (get_flags (item.data.geometry.flags, WidthValue))
719 						fd->part_width[rel_id] = item.data.geometry.width;
720 					else
721 						fd->part_width[rel_id] = 0;
722 					if (get_flags (item.data.geometry.flags, HeightValue))
723 						fd->part_length[rel_id] = item.data.geometry.height;
724 					else
725 						fd->part_length[rel_id] = 0;
726 					set_flags (fd->set_part_size, (0x01 << rel_id));
727 					break;
728 				case MYFRAME_TitleCM_ID:
729 					fd->title_fcm = item.data.integer;
730 					fd->title_ucm = item.data.integer;
731 					fd->title_scm = item.data.integer;
732 					set_flags (fd->set_title_attr, MYFRAME_TitleCMSet);
733 					break;
734 				case MYFRAME_TitleFCM_ID:
735 					fd->title_fcm = item.data.integer;
736 					set_flags (fd->set_title_attr, MYFRAME_TitleFCMSet);
737 					break;
738 				case MYFRAME_TitleUCM_ID:
739 					fd->title_ucm = item.data.integer;
740 					set_flags (fd->set_title_attr, MYFRAME_TitleUCMSet);
741 					break;
742 				case MYFRAME_TitleSCM_ID:
743 					fd->title_scm = item.data.integer;
744 					set_flags (fd->set_title_attr, MYFRAME_TitleSCMSet);
745 					break;
746 				case MYFRAME_TitleFHue_ID:
747 					set_string_value (&(fd->title_fhue), item.data.string,
748 														&(fd->set_title_attr), MYFRAME_TitleFHueSet);
749 					break;
750 				case MYFRAME_TitleUHue_ID:
751 					set_string_value (&(fd->title_uhue), item.data.string,
752 														&(fd->set_title_attr), MYFRAME_TitleUHueSet);
753 					break;
754 				case MYFRAME_TitleSHue_ID:
755 					set_string_value (&(fd->title_shue), item.data.string,
756 														&(fd->set_title_attr), MYFRAME_TitleSHueSet);
757 					break;
758 				case MYFRAME_TitleFSat_ID:
759 					fd->title_fsat = item.data.integer;
760 					set_flags (fd->set_title_attr, MYFRAME_TitleFSatSet);
761 					break;
762 				case MYFRAME_TitleUSat_ID:
763 					fd->title_usat = item.data.integer;
764 					set_flags (fd->set_title_attr, MYFRAME_TitleUSatSet);
765 					break;
766 				case MYFRAME_TitleSSat_ID:
767 					fd->title_ssat = item.data.integer;
768 					set_flags (fd->set_title_attr, MYFRAME_TitleSSatSet);
769 					break;
770 				case MYFRAME_TitleHSpacing_ID:
771 					fd->title_h_spacing = item.data.integer;
772 					set_flags (fd->set_title_attr, MYFRAME_TitleHSpacingSet);
773 					break;
774 				case MYFRAME_TitleVSpacing_ID:
775 					fd->title_v_spacing = item.data.integer;
776 					set_flags (fd->set_title_attr, MYFRAME_TitleVSpacingSet);
777 					break;
778 
779 				case MYFRAME_Inherit_ID:
780 					{
781 						fd->inheritance_list =
782 								realloc (fd->inheritance_list,
783 												 (fd->inheritance_num + 1) * sizeof (char *));
784 						fd->inheritance_list[fd->inheritance_num] = item.data.string;
785 						++(fd->inheritance_num);
786 					}
787 					break;
788 				default:
789 					{
790 						int index =
791 								options->term->id - MYFRAME_TitleBackground_ID_START;
792 
793 						if (index >= 0 && index < MYFRAME_TITLE_BACKS) {
794 							set_string (&(fd->title_backs[index]), item.data.string);
795 						} else {
796 							item.ok_to_free = 1;
797 							show_warning
798 									("Unexpected MyFrame definition keyword \"%s\" . Ignoring.",
799 									 options->term->keyword);
800 						}
801 					}
802 				}
803 			}
804 		}
805 	}
806 	if (fd != NULL) {
807 		if (fd->name == NULL) {
808 			show_warning ("MyFrame with no name encoutered. Discarding.");
809 			DestroyMyFrameDefinitions (tail);
810 		} else {
811 			LOCAL_DEBUG_OUT ("done parsing myframe: [%s]", fd->name);
812 			while (*tail)
813 				tail = &((*tail)->next);	/* just in case */
814 		}
815 	}
816 	ReadConfigItem (&item, NULL);
817 	return tail;
818 }
819 
MyFrameDef2FreeStorage(SyntaxDef * syntax,FreeStorageElem ** tail,MyFrameDefinition * def)820 static FreeStorageElem **MyFrameDef2FreeStorage (SyntaxDef * syntax,
821 																								 FreeStorageElem ** tail,
822 																								 MyFrameDefinition * def)
823 {
824 	register int i;
825 	FreeStorageElem **new_tail;
826 
827 	if (def == NULL)
828 		return tail;
829 
830 	new_tail =
831 			QuotedString2FreeStorage (syntax, tail, NULL, def->name,
832 																MYFRAME_START_ID);
833 	if (new_tail == tail)
834 		return tail;
835 
836 	tail = &((*tail)->sub);
837 
838 	for (i = 0; i < FRAME_PARTS; i++)
839 		tail =
840 				Path2FreeStorage (&MyFrameSyntax, tail, NULL, def->parts[i],
841 													MYFRAME_START_ID + i + 1);
842 
843 	tail = Flag2FreeStorage (&MyFrameSyntax, tail, MYFRAME_DONE_ID);
844 	/* TODO: implement the rest of the MyFrame writing : */
845 
846 	return new_tail;
847 }
848 
MyFrameDefs2FreeStorage(SyntaxDef * syntax,FreeStorageElem ** tail,MyFrameDefinition * defs)849 FreeStorageElem **MyFrameDefs2FreeStorage (SyntaxDef * syntax,
850 																					 FreeStorageElem ** tail,
851 																					 MyFrameDefinition * defs)
852 {
853 	while (defs) {
854 		tail = MyFrameDef2FreeStorage (syntax, tail, defs);
855 		defs = defs->next;
856 	}
857 	return tail;
858 }
859 
860 void
myframe_parse(char * tline,FILE * fd,char ** myname,int * myframe_list)861 myframe_parse (char *tline, FILE * fd, char **myname, int *myframe_list)
862 {
863 	FreeStorageElem *Storage = NULL;
864 	MyFrameDefinition **list = (MyFrameDefinition **) myframe_list, **tail;
865 
866 	if (list == NULL)
867 		return;
868 	for (tail = list; *tail != NULL; tail = &((*tail)->next)) ;
869 
870 	Storage =
871 			tline_subsyntax_parse ("MyFrame", tline, fd, (char *)myname,
872 														 &MyFrameSyntax, NULL, NULL);
873 	if (Storage) {
874 		ProcessMyFrameOptions (Storage, tail);
875 		DestroyFreeStorage (&Storage);
876 	}
877 }
878