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