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 #include "../libAfterStep/session.h"
32 #include "../libAfterStep/freestor.h"
33
34 #include "afterconf.h"
35
36 SyntaxDef DummyFuncSyntax = {
37 '\0', '\n', NULL,
38 0, ' ', "", "\t",
39 "AfterStep Function",
40 "Functions",
41 "built in AfterStep functions",
42 NULL, 0
43 };
44
45 SyntaxDef DummyPopupFuncSyntax = {
46 '\n', '\0', NULL,
47 0, ' ', "\t", "\t",
48 "Popup/Complex function definition",
49 "Popup",
50 "",
51 NULL, 0
52 };
53
54 TermDef DummyTerms[] = {
55 {0, NULL, 0, 0, 0}
56 };
57
58
59 SyntaxDef ArrangeSyntax = {
60 '\n',
61 '\0',
62 DummyTerms,
63 0, /* use default hash size */
64 ' ',
65 "",
66 "\t",
67 "Module:Arrange",
68 "Arrange",
69 "AfterStep module for arranging windows in a tiling or cascading order",
70 NULL,
71 0
72 };
73
74
75 SyntaxDef WinCommandSyntax = {
76 '\n',
77 '\0',
78 DummyTerms,
79 0, /* use default hash size */
80 ' ',
81 "",
82 "\t",
83 "Module:WinCommand",
84 "WinCommand",
85 "AfterStep module for choosing and manipulating windows based on patterns",
86 NULL,
87 0
88 };
89
90
91 TermDef SupportedHintsTerms[] = {
92 {TF_NO_MYNAME_PREPENDING, "ICCCM", 5, TT_FLAG, HINTS_ICCCM_ID, NULL}
93 ,
94 {TF_NO_MYNAME_PREPENDING, "GroupLead", 9, TT_FLAG, HINTS_GroupLead_ID,
95 NULL}
96 ,
97 {TF_NO_MYNAME_PREPENDING, "Transient", 9, TT_FLAG, HINTS_Transient_ID,
98 NULL}
99 ,
100 {TF_NO_MYNAME_PREPENDING, "Motif", 5, TT_FLAG, HINTS_Motif_ID, NULL}
101 ,
102 {TF_NO_MYNAME_PREPENDING, "Gnome", 5, TT_FLAG, HINTS_Gnome_ID, NULL}
103 ,
104 {TF_NO_MYNAME_PREPENDING, "KDE", 10, TT_FLAG, HINTS_KDE_ID, NULL}
105 ,
106 {TF_NO_MYNAME_PREPENDING, "ExtendedWM", 10, TT_FLAG, HINTS_ExtendedWM_ID,
107 NULL}
108 ,
109 {TF_NO_MYNAME_PREPENDING, "Xresources", 10, TT_FLAG, HINTS_XResources_ID,
110 NULL}
111 ,
112 {TF_NO_MYNAME_PREPENDING, "AfterStepDB", 11, TT_FLAG,
113 HINTS_ASDatabase_ID, NULL}
114 ,
115 {0, NULL, 0, 0, 0}
116 };
117
118 SyntaxDef SupportedHintsSyntax =
119 { ',', '\n', SupportedHintsTerms, 7, ' ', " ", "\t",
120 "Look Supported hints list", "SupportedHints", "", NULL, 0 };
121
122 TermDef PlacementStrategyTerms[] = {
123 {TF_NO_MYNAME_PREPENDING, "SmartPlacement", 14, TT_FLAG,
124 FEEL_SmartPlacement_ID, NULL}
125 ,
126 {TF_NO_MYNAME_PREPENDING, "RandomPlacement", 15, TT_FLAG,
127 FEEL_RandomPlacement_ID, NULL}
128 ,
129 {TF_NO_MYNAME_PREPENDING, "Tile", 5, TT_FLAG, FEEL_Tile_ID, NULL}
130 ,
131 {TF_NO_MYNAME_PREPENDING, "Cascade", 7, TT_FLAG, FEEL_Cascade_ID, NULL}
132 ,
133 {TF_NO_MYNAME_PREPENDING, "UnderPointer", 12, TT_FLAG,
134 FEEL_UnderPointer_ID, NULL}
135 ,
136 {TF_NO_MYNAME_PREPENDING, "Manual", 6, TT_FLAG, FEEL_Manual_ID, NULL}
137 ,
138 {0, NULL, 0, 0, 0}
139 };
140
141 SyntaxDef PlacementStrategySyntax =
142 { ',', '\n', PlacementStrategyTerms, 7, ' ', " ", "\t",
143 "Window Placement types", "Placement",
144 "AfterStep supports several different window placement policies."
145 " Some of them designed to fill free space, and some allowing for windows to be placed on top of others.",
146 NULL,
147 0
148 };
149
150
151 extern SyntaxDef MyBackgroundSyntax; /* see ASetRoot.c */
152
153 /**************************************************************************
154 * WindowBox terms :
155 *************************************************************************/
156 TermDef WindowBoxTerms[] = {
157 {TF_NO_MYNAME_PREPENDING | TF_SYNTAX_START, "WindowBox", 9,
158 TT_QUOTED_TEXT, WINDOWBOX_START_ID, NULL},
159 {TF_NO_MYNAME_PREPENDING, "Area", 4, TT_GEOMETRY, WINDOWBOX_Area_ID,
160 NULL},
161 {TF_NO_MYNAME_PREPENDING, "Virtual", 7, TT_FLAG, WINDOWBOX_Virtual_ID,
162 NULL},
163 {TF_NO_MYNAME_PREPENDING, "MinWidth", 8, TT_INTEGER,
164 WINDOWBOX_MinWidth_ID, NULL},
165 {TF_NO_MYNAME_PREPENDING, "MinHeight", 9, TT_INTEGER,
166 WINDOWBOX_MinHeight_ID, NULL},
167 {TF_NO_MYNAME_PREPENDING, "MaxWidth", 8, TT_INTEGER,
168 WINDOWBOX_MaxWidth_ID, NULL},
169 {TF_NO_MYNAME_PREPENDING, "MaxHeight", 9, TT_INTEGER,
170 WINDOWBOX_MaxHeight_ID, NULL},
171 {TF_NO_MYNAME_PREPENDING, "FirstTry", 8, TT_INTEGER,
172 WINDOWBOX_FirstTry_ID, &PlacementStrategySyntax},
173 {TF_NO_MYNAME_PREPENDING, "ThenTry", 7, TT_INTEGER, WINDOWBOX_ThenTry_ID,
174 &PlacementStrategySyntax},
175 {TF_NO_MYNAME_PREPENDING, "Desk", 4, TT_INTEGER, WINDOWBOX_Desk_ID,
176 NULL},
177 {TF_NO_MYNAME_PREPENDING, "MinLayer", 8, TT_INTEGER,
178 WINDOWBOX_MinLayer_ID, NULL},
179 {TF_NO_MYNAME_PREPENDING, "MaxLayer", 8, TT_INTEGER,
180 WINDOWBOX_MaxLayer_ID, NULL},
181 {TF_NO_MYNAME_PREPENDING, "VerticalPriority", 16, TT_FLAG,
182 WINDOWBOX_VerticalPriority_ID, NULL},
183 {TF_NO_MYNAME_PREPENDING, "ReverseOrder", 12, TT_FLAG,
184 WINDOWBOX_ReverseOrder_ID, NULL},
185 {TF_NO_MYNAME_PREPENDING, "ReverseOrderHorizontal", 22, TT_FLAG,
186 WINDOWBOX_ReverseOrderHorizontal_ID, NULL},
187 {TF_NO_MYNAME_PREPENDING, "ReverseOrderVertical", 20, TT_FLAG,
188 WINDOWBOX_ReverseOrderVertical_ID, NULL},
189 {TF_NO_MYNAME_PREPENDING, "XSpacing", 8, TT_INTEGER,
190 WINDOWBOX_XSpacing_ID, NULL},
191 {TF_NO_MYNAME_PREPENDING, "YSpacing", 8, TT_INTEGER,
192 WINDOWBOX_YSpacing_ID, NULL},
193 {TF_NO_MYNAME_PREPENDING | TF_SYNTAX_TERMINATOR, "~WindowBox", 10,
194 TT_FLAG, WINDOWBOX_DONE_ID, NULL},
195 {0, NULL, 0, 0, 0}
196 };
197
198 SyntaxDef WindowBoxSyntax = {
199 '\n',
200 '\0',
201 WindowBoxTerms,
202 7, /* hash size */
203 '\t',
204 "",
205 "\t",
206 "Feel WindowBox definition",
207 "FeelWindowBox",
208 "defines placement policy for certain type of windows, based on desk, window attributes, window size, etc."
209 " Useful for xinerama configurations, where windows should not be placed in between screens.",
210 NULL,
211 0
212 };
213
214 /**************************************************************************
215 * .include file terms :
216 *************************************************************************/
217
218 TermDef includeTerms[] = {
219 /* focus : */
220 {TF_NO_MYNAME_PREPENDING, "include", 12, TT_FUNCTION, INCLUDE_include_ID,
221 NULL},
222 {TF_NO_MYNAME_PREPENDING, "keepname", 12, TT_FLAG, INCLUDE_keepname_ID,
223 NULL},
224 {TF_NO_MYNAME_PREPENDING, "extension", 12, TT_TEXT, INCLUDE_extension_ID,
225 NULL},
226 {TF_NO_MYNAME_PREPENDING, "miniextension", 12, TT_TEXT,
227 INCLUDE_miniextension_ID, NULL},
228 {TF_NO_MYNAME_PREPENDING, "minipixmap", 12, TT_FILENAME,
229 INCLUDE_minipixmap_ID, NULL},
230 {TF_NO_MYNAME_PREPENDING, "command", 12, TT_FLAG, INCLUDE_command_ID,
231 &DummyFuncSyntax},
232 {TF_NO_MYNAME_PREPENDING, "order", 12, TT_INTEGER, INCLUDE_order_ID,
233 NULL},
234 {TF_NO_MYNAME_PREPENDING, "RecentSubmenuItems", 12, TT_INTEGER,
235 INCLUDE_RecentSubmenuItems_ID, NULL},
236 {TF_NO_MYNAME_PREPENDING, "name", 12, TT_TEXT, INCLUDE_name_ID, NULL},
237 {0, NULL, 0, 0, 0}
238 };
239
240 SyntaxDef includeSyntax = {
241 '\n',
242 '\0',
243 includeTerms,
244 0, /* use default hash size */
245 '\t',
246 "",
247 "\t",
248 "include",
249 "include",
250 "include file for Popups",
251 NULL,
252 0
253 };
254
255 /**************************************************************************
256 * LOOK terms :
257 **************************************************************************/
258
259 /* depreciated options : */
260 #define OBSOLETE_AFTERSTEP_LOOK_TERMS \
261 {TF_OBSOLETE |TF_NO_MYNAME_PREPENDING, "Font", 4, TT_FONT, LOOK_Font_ID, NULL}, \
262 {TF_OBSOLETE |TF_NO_MYNAME_PREPENDING, "WindowFont", 10, TT_FONT, LOOK_WindowFont_ID, NULL}, \
263 {TF_OBSOLETE |TF_NO_MYNAME_PREPENDING, "MTitleForeColor", 15, TT_COLOR, LOOK_MTitleForeColor_ID, NULL}, \
264 {TF_OBSOLETE |TF_NO_MYNAME_PREPENDING, "MTitleBackColor", 15, TT_COLOR, LOOK_MTitleBackColor_ID, NULL}, \
265 {TF_OBSOLETE |TF_NO_MYNAME_PREPENDING, "MenuForeColor", 13, TT_COLOR, LOOK_MenuForeColor_ID, NULL}, \
266 {TF_OBSOLETE |TF_NO_MYNAME_PREPENDING, "MenuBackColor", 13, TT_COLOR, LOOK_MenuBackColor_ID, NULL}, \
267 {TF_OBSOLETE |TF_NO_MYNAME_PREPENDING, "MenuHiForeColor", 15, TT_COLOR, LOOK_MenuHiForeColor_ID, NULL}, \
268 {TF_OBSOLETE |TF_NO_MYNAME_PREPENDING, "MenuHiBackColor", 15, TT_COLOR, LOOK_MenuHiBackColor_ID, NULL}, \
269 {TF_OBSOLETE |TF_NO_MYNAME_PREPENDING, "MenuStippleColor", 16, TT_COLOR, LOOK_MenuStippleColor_ID, NULL}, \
270 {TF_OBSOLETE |TF_NO_MYNAME_PREPENDING, "StdForeColor", 12, TT_COLOR, LOOK_StdForeColor_ID, NULL}, \
271 {TF_OBSOLETE |TF_NO_MYNAME_PREPENDING, "StdBackColor", 12, TT_COLOR, LOOK_StdBackColor_ID, NULL}, \
272 {TF_OBSOLETE |TF_NO_MYNAME_PREPENDING, "StickyForeColor", 15, TT_COLOR, LOOK_StickyForeColor_ID, NULL}, \
273 {TF_OBSOLETE |TF_NO_MYNAME_PREPENDING, "StickyBackColor", 15, TT_COLOR, LOOK_StickyBackColor_ID, NULL}, \
274 {TF_OBSOLETE |TF_NO_MYNAME_PREPENDING, "HiForeColor", 11, TT_COLOR, LOOK_HiForeColor_ID, NULL}, \
275 {TF_OBSOLETE |TF_NO_MYNAME_PREPENDING, "HiBackColor", 11, TT_COLOR, LOOK_HiBackColor_ID, NULL}, \
276 {TF_OBSOLETE |TF_NO_MYNAME_PREPENDING, "IconFont", 8, TT_FONT, LOOK_IconFont_ID, NULL}, \
277 {TF_OBSOLETE |TF_NO_MYNAME_PREPENDING, "TextureTypes", 12, TT_INTARRAY, LOOK_TextureTypes_ID, NULL}, \
278 {TF_OBSOLETE |TF_NO_MYNAME_PREPENDING, "TextureMaxColors", 16, TT_INTARRAY, LOOK_TextureMaxColors_ID, NULL}, \
279 {TF_OBSOLETE |TF_NO_MYNAME_PREPENDING, "TitleTextureColor", 17, TT_COLOR, LOOK_TitleTextureColor_ID, NULL}, \
280 {TF_OBSOLETE |TF_NO_MYNAME_PREPENDING, "UTitleTextureColor", 18, TT_COLOR, LOOK_UTitleTextureColor_ID, NULL}, \
281 {TF_OBSOLETE |TF_NO_MYNAME_PREPENDING, "STitleTextureColor", 18, TT_COLOR, LOOK_STitleTextureColor_ID, NULL}, \
282 {TF_OBSOLETE |TF_NO_MYNAME_PREPENDING, "MTitleTextureColor", 18, TT_COLOR, LOOK_MTitleTextureColor_ID, NULL}, \
283 {TF_OBSOLETE |TF_NO_MYNAME_PREPENDING, "MenuTextureColor", 16, TT_COLOR, LOOK_MenuTextureColor_ID, NULL}, \
284 {TF_OBSOLETE |TF_NO_MYNAME_PREPENDING, "MenuHiTextureColor", 18, TT_COLOR, LOOK_MenuHiTextureColor_ID, NULL}, \
285 {TF_OBSOLETE |TF_NO_MYNAME_PREPENDING, "MenuPixmap", 10, TT_FILENAME, LOOK_MenuPixmap_ID, NULL}, \
286 {TF_OBSOLETE |TF_NO_MYNAME_PREPENDING, "MenuHiPixmap", 12, TT_FILENAME, LOOK_MenuHiPixmap_ID, NULL}, \
287 {TF_OBSOLETE |TF_NO_MYNAME_PREPENDING, "MTitlePixmap", 12, TT_FILENAME, LOOK_MTitlePixmap_ID, NULL}, \
288 {TF_OBSOLETE |TF_NO_MYNAME_PREPENDING, "TitlePixmap", 11, TT_FILENAME, LOOK_TitlePixmap_ID, NULL}, \
289 {TF_OBSOLETE |TF_NO_MYNAME_PREPENDING, "UTitlePixmap", 12, TT_FILENAME, LOOK_UTitlePixmap_ID, NULL}, \
290 {TF_OBSOLETE |TF_NO_MYNAME_PREPENDING, "STitlePixmap", 12, TT_FILENAME, LOOK_STitlePixmap_ID, NULL}, \
291 {TF_OBSOLETE |TF_NO_MYNAME_PREPENDING, "ButtonTextureType", 17, TT_UINTEGER, LOOK_ButtonTextureType_ID, NULL}, \
292 {TF_OBSOLETE |TF_NO_MYNAME_PREPENDING, "ButtonBgColor", 13, TT_COLOR, LOOK_ButtonBgColor_ID, NULL}, \
293 {TF_OBSOLETE |TF_NO_MYNAME_PREPENDING, "ButtonTextureColor", 18, TT_COLOR, LOOK_ButtonTextureColor_ID, NULL}, \
294 {TF_OBSOLETE |TF_NO_MYNAME_PREPENDING, "ButtonMaxColors", 15, TT_UINTEGER, LOOK_ButtonMaxColors_ID, NULL}, \
295 {TF_OBSOLETE |TF_NO_MYNAME_PREPENDING, "ButtonPixmap", 12, TT_FILENAME, LOOK_ButtonPixmap_ID, NULL}, \
296 {TF_OBSOLETE |TF_NO_MYNAME_PREPENDING, "TitleTextMode", 13, TT_UINTEGER, LOOK_TitleTextMode_ID, NULL}
297
298
299 #define AFTERSTEP_LOOK_TERMS \
300 {TF_NO_MYNAME_PREPENDING, "IconBox", 7, TT_BOX, LOOK_IconBox_ID, NULL}, \
301 {TF_NO_MYNAME_PREPENDING, "IconsGrowVertically", 18, TT_FLAG, LOOK_IconsGrowVertically_ID, NULL}, \
302 {TF_NO_MYNAME_PREPENDING, "MArrowPixmap", 12, TT_FILENAME, LOOK_MArrowPixmap_ID, NULL}, \
303 {TF_NO_MYNAME_PREPENDING, "MenuPinOn", 9, TT_FILENAME, LOOK_MenuPinOn_ID, NULL}, \
304 {TF_NO_MYNAME_PREPENDING, "MenuMiniPixmaps", 15, TT_FLAG, LOOK_MenuMiniPixmaps_ID, NULL}, \
305 {TF_NO_MYNAME_PREPENDING, "TitlebarNoPush", 14, TT_FLAG, LOOK_TitlebarNoPush_ID, NULL}, \
306 {TF_NO_MYNAME_PREPENDING, "TitleTextAlign", 14, TT_UINTEGER, LOOK_TitleTextAlign_ID, NULL}, \
307 {TF_NO_MYNAME_PREPENDING, "ResizeMoveGeometry", 18, TT_GEOMETRY, LOOK_ResizeMoveGeometry_ID, NULL}, \
308 {TF_NO_MYNAME_PREPENDING, "StartMenuSortMode", 17, TT_UINTEGER, LOOK_StartMenuSortMode_ID, NULL}, \
309 {TF_NO_MYNAME_PREPENDING, "DrawMenuBorders", 15, TT_UINTEGER, LOOK_DrawMenuBorders_ID, NULL}, \
310 {TF_NO_MYNAME_PREPENDING, "ButtonSize", 10, TT_BOX, LOOK_ButtonSize_ID, NULL}, \
311 {TF_NO_MYNAME_PREPENDING, "ButtonIconSpacing", 17, TT_UINTEGER, LOOK_ButtonIconSpacing_ID, NULL}, \
312 {TF_NO_MYNAME_PREPENDING, "ButtonBevel", 11, TT_FLAG, LOOK_ButtonBevel_ID, &BevelSyntax}, \
313 {TF_NO_MYNAME_PREPENDING, "ButtonAlign", 11, TT_FLAG, LOOK_ButtonAlign_ID, &AlignSyntax}, \
314 {TF_NO_MYNAME_PREPENDING, "MinipixmapSize", 14, TT_BOX, LOOK_MinipixmapSize_ID, NULL}, \
315 {TF_NO_MYNAME_PREPENDING, "SeparateButtonTitle", 19, TT_FLAG, LOOK_SeparateButtonTitle_ID, NULL}, \
316 {TF_NO_MYNAME_PREPENDING, "RubberBand", 10, TT_UINTEGER, LOOK_RubberBand_ID, NULL}, \
317 {TF_NO_MYNAME_PREPENDING, "DefaultStyle", 12, TT_QUOTED_TEXT, LOOK_DefaultStyle_ID, NULL}, \
318 {TF_NO_MYNAME_PREPENDING, "FWindowStyle", 12, TT_QUOTED_TEXT, LOOK_FWindowStyle_ID, NULL}, \
319 {TF_NO_MYNAME_PREPENDING, "UWindowStyle", 12, TT_QUOTED_TEXT, LOOK_UWindowStyle_ID, NULL}, \
320 {TF_NO_MYNAME_PREPENDING, "SWindowStyle", 12, TT_QUOTED_TEXT, LOOK_SWindowStyle_ID, NULL}, \
321 {TF_NO_MYNAME_PREPENDING, "MenuItemStyle", 13, TT_QUOTED_TEXT, LOOK_MenuItemStyle_ID, NULL}, \
322 {TF_NO_MYNAME_PREPENDING, "MenuTitleStyle", 14, TT_QUOTED_TEXT, LOOK_MenuTitleStyle_ID, NULL}, \
323 {TF_NO_MYNAME_PREPENDING, "MenuHiliteStyle", 15, TT_QUOTED_TEXT, LOOK_MenuHiliteStyle_ID, NULL}, \
324 {TF_NO_MYNAME_PREPENDING, "MenuStippleStyle", 16, TT_QUOTED_TEXT, LOOK_MenuStippleStyle_ID, NULL}, \
325 {TF_NO_MYNAME_PREPENDING, "MenuSubItemStyle", 16, TT_QUOTED_TEXT, LOOK_MenuSubItemStyle_ID, NULL}, \
326 {TF_NO_MYNAME_PREPENDING, "MenuHiTitleStyle", 16, TT_QUOTED_TEXT, LOOK_MenuHiTitleStyle_ID, NULL}, \
327 {TF_NO_MYNAME_PREPENDING, "MenuItemCompositionMethod", 25, TT_INTEGER, LOOK_MenuItemCompositionMethod_ID, NULL}, \
328 {TF_NO_MYNAME_PREPENDING, "MenuHiliteCompositionMethod", 27, TT_INTEGER, LOOK_MenuHiliteCompositionMethod_ID, NULL}, \
329 {TF_NO_MYNAME_PREPENDING, "MenuStippleCompositionMethod", 28, TT_INTEGER, LOOK_MenuStippleCompositionMethod_ID, NULL}, \
330 {TF_NO_MYNAME_PREPENDING, "SupportedHints", 14, TT_FLAG, LOOK_SupportedHints_ID, &SupportedHintsSyntax}, \
331 {TF_NO_MYNAME_PREPENDING|TF_INDEXED|TF_DONT_SPLIT, "DeskBack", 8, TT_QUOTED_TEXT, LOOK_DeskBack_ID, NULL}, \
332 {TF_NO_MYNAME_PREPENDING, "DefaultFrame", 12, TT_QUOTED_TEXT, LOOK_DefaultFrame_ID, NULL}, \
333 {TF_NO_MYNAME_PREPENDING, "CursorFore", 10, TT_COLOR, LOOK_CursorFore_ID, NULL}, \
334 {TF_NO_MYNAME_PREPENDING, "CursorBack", 10, TT_COLOR, LOOK_CursorFore_ID, NULL}
335
336 #define AFTERSTEP_MYBACK_TERMS \
337 {TF_NO_MYNAME_PREPENDING, "MyBackground", 12, TT_QUOTED_TEXT,BGR_MYBACKGROUND, &MyBackgroundSyntax}, \
338 {TF_NO_MYNAME_PREPENDING, "KillBackgroundThreshold", 23, TT_INTEGER, LOOK_KillBackgroundThreshold_ID, NULL}, \
339 {TF_NO_MYNAME_PREPENDING, "DontAnimateBackground", 21, TT_INTEGER, LOOK_DontAnimateBackground_ID, NULL}, \
340 {TF_NO_MYNAME_PREPENDING, "DontDrawBackground", 18, TT_FLAG, LOOK_DontDrawBackground_ID, NULL}
341
342 #define AFTERSTEP_BALLOON_TERMS TITLE_BALLOON_TERMS, MENU_BALLOON_TERMS
343
344 #define AFTERSTEP_TITLEBUTTON_TERMS \
345 {TF_NO_MYNAME_PREPENDING, "TitleButtonSpacingLeft", 22, TT_INTEGER, LOOK_TitleButtonSpacingLeft_ID, NULL}, \
346 {TF_NO_MYNAME_PREPENDING, "TitleButtonSpacingRight", 23, TT_INTEGER, LOOK_TitleButtonSpacingRight_ID, NULL}, \
347 {TF_NO_MYNAME_PREPENDING, "TitleButtonSpacing", 18, TT_INTEGER, LOOK_TitleButtonSpacing_ID, NULL}, \
348 {TF_NO_MYNAME_PREPENDING, "TitleButtonXOffsetLeft", 22, TT_INTEGER, LOOK_TitleButtonXOffsetLeft_ID, NULL}, \
349 {TF_NO_MYNAME_PREPENDING, "TitleButtonXOffsetRight", 23, TT_INTEGER, LOOK_TitleButtonXOffsetRight_ID, NULL}, \
350 {TF_NO_MYNAME_PREPENDING, "TitleButtonXOffset", 18, TT_INTEGER, LOOK_TitleButtonXOffset_ID, NULL}, \
351 {TF_NO_MYNAME_PREPENDING, "TitleButtonYOffsetLeft", 22, TT_INTEGER, LOOK_TitleButtonYOffsetLeft_ID, NULL}, \
352 {TF_NO_MYNAME_PREPENDING, "TitleButtonYOffsetRight", 23, TT_INTEGER, LOOK_TitleButtonYOffsetRight_ID, NULL}, \
353 {TF_NO_MYNAME_PREPENDING, "TitleButtonYOffset", 18, TT_INTEGER, LOOK_TitleButtonYOffset_ID, NULL}, \
354 {TF_NO_MYNAME_PREPENDING, "TitleButtonStyle", 16, TT_INTEGER, LOOK_TitleButtonStyle_ID, NULL}, \
355 {TF_NO_MYNAME_PREPENDING, "TitleButtonOrder", 16, TT_TEXT, LOOK_TitleButtonOrder_ID, NULL}, \
356 {TF_INDEXED|TF_NO_MYNAME_PREPENDING, "TitleButton", 11, TT_BUTTON, LOOK_TitleButton_ID, NULL}
357
358 /**************************************************************************
359 * FEEL terms :
360 **************************************************************************/
361
362 #define POPUP_TERM {TF_NO_MYNAME_PREPENDING|TF_SYNTAX_START, "Popup",5 , TT_QUOTED_TEXT, FEEL_Popup_ID , &DummyPopupFuncSyntax}
363 #define FUNCTION_TERM {TF_NO_MYNAME_PREPENDING|TF_SYNTAX_START, "Function",8 , TT_QUOTED_TEXT, FEEL_Function_ID , &DummyPopupFuncSyntax}
364
365 #define AFTERSTEP_FEEL_TERMS \
366 {TF_NO_MYNAME_PREPENDING, "ClickToFocus",12 , TT_FLAG , FEEL_ClickToFocus_ID , NULL}, \
367 {TF_NO_MYNAME_PREPENDING, "SloppyFocus",11 , TT_FLAG , FEEL_SloppyFocus_ID , NULL}, \
368 {TF_NO_MYNAME_PREPENDING, "AutoFocus",9 , TT_FLAG , FEEL_AutoFocus_ID , NULL}, \
369 {TF_NO_MYNAME_PREPENDING, "DecorateTransients",18 , TT_FLAG , FEEL_DecorateTransients_ID , NULL}, \
370 {TF_NO_MYNAME_PREPENDING, "DontMoveOff",11 , TT_FLAG , FEEL_DontMoveOff_ID , NULL}, \
371 {TF_NO_MYNAME_PREPENDING|TF_DEPRECIATED, "NoPPosition",11 , TT_FLAG , FEEL_NoPPosition_ID , NULL}, \
372 {TF_NO_MYNAME_PREPENDING, "SmartPlacement",14 , TT_FLAG , FEEL_SmartPlacement_ID , NULL}, \
373 {TF_NO_MYNAME_PREPENDING, "RandomPlacement",15 , TT_FLAG , FEEL_RandomPlacement_ID , NULL}, \
374 {TF_NO_MYNAME_PREPENDING, "StubbornPlacement",17 , TT_FLAG , FEEL_StubbornPlacement_ID , NULL}, \
375 {TF_NO_MYNAME_PREPENDING, "MenusHigh",9 , TT_FLAG , FEEL_MenusHigh_ID , NULL}, \
376 {TF_NO_MYNAME_PREPENDING, "CenterOnCirculate",17 , TT_FLAG , FEEL_CenterOnCirculate_ID , NULL}, \
377 {TF_NO_MYNAME_PREPENDING, "SuppressIcons",13 , TT_FLAG , FEEL_SuppressIcons_ID , NULL}, \
378 {TF_NO_MYNAME_PREPENDING, "IconTitle",9 , TT_FLAG , FEEL_IconTitle_ID , NULL}, \
379 {TF_NO_MYNAME_PREPENDING, "KeepIconWindows",15 , TT_FLAG , FEEL_KeepIconWindows_ID , NULL}, \
380 {TF_NO_MYNAME_PREPENDING, "StickyIcons",11 , TT_FLAG , FEEL_StickyIcons_ID , NULL}, \
381 {TF_NO_MYNAME_PREPENDING, "StubbornIcons",13 , TT_FLAG , FEEL_StubbornIcons_ID , NULL}, \
382 {TF_NO_MYNAME_PREPENDING, "StubbornIconPlacement",21 , TT_FLAG , FEEL_StubbornIconPlacement_ID , NULL}, \
383 {TF_NO_MYNAME_PREPENDING, "CirculateSkipIcons",18 , TT_FLAG , FEEL_CirculateSkipIcons_ID , NULL}, \
384 {TF_NO_MYNAME_PREPENDING, "BackingStore",12 , TT_FLAG , FEEL_BackingStore_ID , NULL}, \
385 {TF_NO_MYNAME_PREPENDING, "AppsBackingStore",16 , TT_FLAG , FEEL_AppsBackingStore_ID , NULL}, \
386 {TF_NO_MYNAME_PREPENDING, "SaveUnders",10 , TT_FLAG , FEEL_SaveUnders_ID , NULL}, \
387 {TF_NO_MYNAME_PREPENDING, "PagingDefault",13 , TT_FLAG , FEEL_PagingDefault_ID , NULL}, \
388 {TF_NO_MYNAME_PREPENDING, "AutoTabThroughDesks",19 , TT_FLAG , FEEL_AutoTabThroughDesks_ID , NULL}, \
389 {TF_NO_MYNAME_PREPENDING, "WarpPointer",11 , TT_FLAG , FEEL_WarpPointer_ID , NULL}, \
390 {TF_NO_MYNAME_PREPENDING, "ClickTime",9 , TT_UINTEGER , FEEL_ClickTime_ID , NULL}, \
391 {TF_NO_MYNAME_PREPENDING, "OpaqueMove",10 , TT_UINTEGER , FEEL_OpaqueMove_ID , NULL}, \
392 {TF_NO_MYNAME_PREPENDING, "OpaqueResize",12 , TT_UINTEGER , FEEL_OpaqueResize_ID , NULL}, \
393 {TF_NO_MYNAME_PREPENDING, "AutoRaise",9 , TT_UINTEGER , FEEL_AutoRaise_ID , NULL}, \
394 {TF_NO_MYNAME_PREPENDING, "AutoReverse",11 , TT_UINTEGER , FEEL_AutoReverse_ID , NULL}, \
395 {TF_NO_MYNAME_PREPENDING, "DeskAnimationType",17 , TT_UINTEGER , FEEL_DeskAnimationType_ID , NULL}, \
396 {TF_NO_MYNAME_PREPENDING, "ShadeAnimationSteps",19 , TT_UINTEGER , FEEL_ShadeAnimationSteps_ID , NULL}, \
397 {TF_NO_MYNAME_PREPENDING, "DeskAnimationSteps",18 , TT_UINTEGER , FEEL_DeskAnimationSteps_ID , NULL}, \
398 {TF_NO_MYNAME_PREPENDING, "XorValue",8 , TT_INTEGER , FEEL_XorValue_ID , NULL}, \
399 {TF_NO_MYNAME_PREPENDING, "Xzap",4 , TT_INTEGER , FEEL_Xzap_ID , NULL}, \
400 {TF_NO_MYNAME_PREPENDING, "Yzap",4 , TT_INTEGER , FEEL_Yzap_ID , NULL}, \
401 {TF_NO_MYNAME_PREPENDING, "ClickToRaise",12 , TT_BITLIST , FEEL_ClickToRaise_ID , NULL}, \
402 {TF_NO_MYNAME_PREPENDING, "EdgeScroll",10 , TT_INTARRAY , FEEL_EdgeScroll_ID , NULL}, \
403 {TF_NO_MYNAME_PREPENDING, "EdgeResistance",14 , TT_INTARRAY , FEEL_EdgeResistance_ID , NULL}, \
404 {TF_NO_MYNAME_PREPENDING, "ShadeAnimationSteps", 19, TT_UINTEGER, FEEL_ShadeAnimationSteps_ID , NULL}, \
405 {TF_NO_MYNAME_PREPENDING, "CoverAnimationSteps", 19, TT_UINTEGER, FEEL_CoverAnimationSteps_ID , NULL}, \
406 {TF_NO_MYNAME_PREPENDING, "CoverAnimationType", 18, TT_UINTEGER, FEEL_CoverAnimationType_ID , NULL}, \
407 {TF_NO_MYNAME_PREPENDING, "FollowTitleChanges", 18, TT_FLAG, FEEL_FollowTitleChanges_ID , NULL}, \
408 {TF_NO_MYNAME_PREPENDING, "PersistentMenus", 15, TT_FLAG, FEEL_PersistentMenus_ID , NULL}, \
409 {TF_NO_MYNAME_PREPENDING, "NoSnapKey", 9, TT_BITLIST, FEEL_NoSnapKey_ID , NULL}, \
410 {TF_NO_MYNAME_PREPENDING, "ScreenEdgeAttraction", 20, TT_INTEGER, FEEL_EdgeAttractionScreen_ID , NULL}, \
411 {TF_NO_MYNAME_PREPENDING, "WindowEdgeAttraction", 20, TT_INTEGER, FEEL_EdgeAttractionWindow_ID , NULL}, \
412 {TF_NO_MYNAME_PREPENDING, "DontRestoreFocus", 16, TT_FLAG, FEEL_DontRestoreFocus_ID , NULL}, \
413 {TF_NO_MYNAME_PREPENDING, "DefaultWindowBox", 16, TT_QUOTED_TEXT, FEEL_DefaultWindowBox_ID , NULL}, \
414 {TF_NO_MYNAME_PREPENDING, "RecentSubmenuItems", 18, TT_INTEGER, FEEL_RecentSubmenuItems_ID , NULL}, \
415 {TF_NO_MYNAME_PREPENDING, "WinListSortOrder", 16, TT_INTEGER, FEEL_WinListSortOrder_ID , NULL}, \
416 {TF_NO_MYNAME_PREPENDING, "WinListHideIcons", 16, TT_FLAG, FEEL_WinListHideIcons_ID , NULL}, \
417 {TF_NO_MYNAME_PREPENDING, "AnimateDeskChange", 17, TT_FLAG, FEEL_AnimateDeskChange_ID , NULL}
418
419
420 #define AFTERSTEP_CURSOR_TERMS \
421 {TF_INDEXED|TF_NO_MYNAME_PREPENDING, "Cursor",6 , TT_INTEGER , FEEL_Cursor_ID , NULL}, \
422 {TF_INDEXED|TF_NO_MYNAME_PREPENDING, "CustomCursor",12 , TT_CURSOR , FEEL_CustomCursor_ID , NULL}
423
424 #define AFTERSTEP_MOUSE_TERMS \
425 {TF_SPECIAL_PROCESSING|TF_NO_MYNAME_PREPENDING, "Mouse",5, TT_BINDING , FEEL_Mouse_ID , &DummyFuncSyntax}
426
427 #define AFTERSTEP_KEYBOARD_TERMS \
428 {TF_SPECIAL_PROCESSING|TF_NO_MYNAME_PREPENDING, "Key",3 , TT_BINDING , FEEL_Key_ID , &DummyFuncSyntax}
429
430 #define AFTERSTEP_WINDOWBOX_TERMS \
431 {TF_NO_MYNAME_PREPENDING, "WindowBox", 9, TT_QUOTED_TEXT, FEEL_WindowBox_ID , &WindowBoxSyntax}
432
433 /* obsolete stuff : */
434 #define OBSOLETE_AFTERSTEP_FEEL_TERMS \
435 {TF_OBSOLETE|TF_NO_MYNAME_PREPENDING, "MWMFunctionHints",16 , TT_FLAG , FEEL_MWMFunctionHints_ID , NULL}, \
436 {TF_OBSOLETE|TF_NO_MYNAME_PREPENDING, "MWMDecorHints",13 , TT_FLAG , FEEL_MWMDecorHints_ID , NULL}, \
437 {TF_OBSOLETE|TF_NO_MYNAME_PREPENDING, "MWMHintOverride",15 , TT_FLAG , FEEL_MWMHintOverride_ID , NULL}
438
439
440
441 /**************************************************************************
442 * Different compilations to be used in parsing :
443 **************************************************************************/
444
445 TermDef LookTerms[] = {
446 OBSOLETE_AFTERSTEP_LOOK_TERMS,
447 /* {TF_OBSOLETE |TF_NO_MYNAME_PREPENDING, "MenuPinOff", 10, TT_FILENAME, LOOK_MenuPinOff_ID, NULL},
448 {TF_NO_MYNAME_PREPENDING, "TextureMenuItemsIndividually", 28, TT_FLAG, LOOK_TxtrMenuItmInd_ID, NULL},
449
450 {TF_NO_MYNAME_PREPENDING, "TextGradientColor", 17, TT_CUSTOM, LOOK_TextGradientColor_ID, NULL},
451 {TF_NO_MYNAME_PREPENDING, "GradientText", 12, TT_FLAG, LOOK_GradientText_ID, NULL},
452 {TF_NO_MYNAME_PREPENDING, "ButtonNoBorder", 14, TT_FLAG, LOOK_ButtonNoBorder_ID, NULL},
453 {TF_INDEXED|TF_NO_MYNAME_PREPENDING, "IconTitleButton", 15, TT_BUTTON, LOOK_IconTitleButton_ID, NULL},
454 {TF_NO_MYNAME_PREPENDING, "MenuFrame", 16, TT_QUOTED_TEXT, LOOK_MenuFrame_ID, NULL},
455 {TF_NO_MYNAME_PREPENDING|TF_INDEXED|TF_DONT_SPLIT, "DeskLayout", 8, TT_QUOTED_TEXT, LOOK_DeskLayout_ID, NULL},
456 */
457
458 /* non depreciated options : */
459 AFTERSTEP_LOOK_TERMS,
460 /* including MyStyles definitions processing */
461 INCLUDE_MYSTYLE,
462 INCLUDE_MYFRAME,
463 AFTERSTEP_MYBACK_TERMS,
464 AFTERSTEP_BALLOON_TERMS,
465 AFTERSTEP_TITLEBUTTON_TERMS,
466
467 {0, NULL, 0, 0, 0}
468 };
469
470 TermDef AfterStepLookTerms[] = {
471 AFTERSTEP_LOOK_TERMS,
472 {0, NULL, 0, 0, 0}
473 };
474
475 TermDef ModuleMyStyleTerms[] = {
476 INCLUDE_MYSTYLE,
477 {0, NULL, 0, 0, 0}
478 };
479
480 TermDef AfterStepMyFrameTerms[] = {
481 INCLUDE_MYFRAME,
482 {0, NULL, 0, 0, 0}
483 };
484
485 TermDef AfterStepMyBackgroundTerms[] = {
486 AFTERSTEP_MYBACK_TERMS,
487 {0, NULL, 0, 0, 0}
488 };
489
490 TermDef AfterStepTitleButtonTerms[] = {
491 AFTERSTEP_TITLEBUTTON_TERMS,
492 {0, NULL, 0, 0, 0}
493 };
494
495 TermDef FeelTerms[] = {
496 POPUP_TERM,
497 FUNCTION_TERM,
498 AFTERSTEP_FEEL_TERMS,
499 AFTERSTEP_CURSOR_TERMS,
500 AFTERSTEP_MOUSE_TERMS,
501 AFTERSTEP_KEYBOARD_TERMS,
502 AFTERSTEP_WINDOWBOX_TERMS,
503 OBSOLETE_AFTERSTEP_FEEL_TERMS,
504 {0, NULL, 0, 0, 0}
505 };
506
507 TermDef AfterStepFeelTerms[] = {
508 AFTERSTEP_FEEL_TERMS,
509 {0, NULL, 0, 0, 0}
510 };
511
512 TermDef AfterStepCursorTerms[] = {
513 AFTERSTEP_CURSOR_TERMS,
514 {0, NULL, 0, 0, 0}
515 };
516
517 TermDef MouseBindingTerms[] = {
518 AFTERSTEP_MOUSE_TERMS,
519 {0, NULL, 0, 0, 0}
520 };
521
522 TermDef KeyboardBindingTerms[] = {
523 AFTERSTEP_KEYBOARD_TERMS,
524 {0, NULL, 0, 0, 0}
525 };
526
527 TermDef AfterStepWindowBoxTerms[] = {
528 AFTERSTEP_WINDOWBOX_TERMS,
529 {0, NULL, 0, 0, 0}
530 };
531
532 TermDef PopupTerms[] = {
533 POPUP_TERM,
534 {0, NULL, 0, 0, 0}
535 };
536
537 TermDef FunctionTerms[] = {
538 FUNCTION_TERM,
539 {0, NULL, 0, 0, 0}
540 };
541
542 extern TermDef WharfTerms[];
543 extern TermDef WharfFolderTerms[];
544
545 TermDef AfterStepTerms[] = {
546 POPUP_TERM,
547 FUNCTION_TERM,
548 AFTERSTEP_FEEL_TERMS,
549 AFTERSTEP_CURSOR_TERMS,
550 AFTERSTEP_MOUSE_TERMS,
551 AFTERSTEP_KEYBOARD_TERMS,
552 AFTERSTEP_WINDOWBOX_TERMS,
553 AFTERSTEP_LOOK_TERMS,
554 /* including MyStyles definitions processing */
555 INCLUDE_MYSTYLE,
556 INCLUDE_MYFRAME,
557 AFTERSTEP_MYBACK_TERMS,
558 AFTERSTEP_BALLOON_TERMS,
559 AFTERSTEP_TITLEBUTTON_TERMS,
560 {0, NULL, 0, 0, 0}
561 };
562
563 /**************************************************************************
564 * Syntaxes :
565 *************************************************************************/
566 SyntaxDef LookSyntax =
567 { '\n', '\0', LookTerms, 0, '\t', "", "\t", "Look", "Look",
568 "AfterStep look", NULL, 0 };
569 SyntaxDef FeelSyntax =
570 { '\n', '\0', FeelTerms, 0, '\t', "", "\t", "Feel", "Feel",
571 "AfterStep feel configuration", NULL, 0 };
572 SyntaxDef FunctionSyntax =
573 { '\n', '\0', FunctionTerms, 0, ' ', "", "\t",
574 "AfterStep Complex/Builtin Function", "Function",
575 "functions that can be executed by AfterStep", NULL, 0
576 };
577
578 SyntaxDef PopupSyntax =
579 { '\n', '\0', PopupTerms, 0, ' ', "", "\t", "AfterStep Popups",
580 "Popups", "Definitions for AfterStep Popups", NULL,
581 0
582 };
583
584 SyntaxDef AutoExecSyntax =
585 { '\n', '\0', FunctionTerms, 0, ' ', "", "\t",
586 "AfterStep Autoexec (startup/restart sequences)", "AutoExec",
587 "functions to be executed by AfterStep on startup/shutdown", NULL, 0
588 };
589
590 SyntaxDef ThemeSyntax =
591 { '\n', '\0', FunctionTerms, 0, ' ', "", "\t",
592 "theme installation script", "Theme", "AfterStep theme file", NULL,
593 0
594 };
595
596 SyntaxDef AfterStepSyntax =
597 { '\n', '\0', AfterStepTerms, 0, '\t', "", "\t", "AfterStep proper",
598 "Look/Feel", "AfterStep proper", NULL, 0 };
599
600 SyntaxDef AfterStepLookSyntax =
601 { '\n', '\0', AfterStepLookTerms, 0, '\t', "", "\t", "Look", "Look",
602 "AfterStep look", NULL, 0 };
603 SyntaxDef ModuleMyStyleSyntax =
604 { '\n', '\0', ModuleMyStyleTerms, 0, '\t', "", "\t", "MyStyles",
605 "MyStyles", "AfterStep MyStyle definitions", NULL,
606 0
607 };
608
609 SyntaxDef AfterStepMyFrameSyntax =
610 { '\n', '\0', AfterStepMyFrameTerms, 0, '\t', "", "\t", "MyFrames",
611 "MyFrames", "AfterStep MyFrame definitions",
612 NULL, 0
613 };
614
615 SyntaxDef AfterStepMyBackSyntax =
616 { '\n', '\0', AfterStepMyBackgroundTerms, 0, '\t', "", "\t",
617 "MyBackgrounds", "MyBackgrounds",
618 "AfterStep MyBackground definitions", NULL, 0
619 };
620
621 SyntaxDef AfterStepTitleButtonSyntax =
622 { '\n', '\0', AfterStepTitleButtonTerms, 0, '\t', "", "\t",
623 "TitleButtons", "TitleButtons",
624 "AfterStep TitleButton definitions", NULL, 0
625 };
626
627 SyntaxDef AfterStepFeelSyntax =
628 { '\n', '\0', AfterStepFeelTerms, 0, '\t', "", "\t", "Feel", "Feel",
629 "AfterStep feel configuration", NULL, 0 };
630 SyntaxDef AfterStepCursorSyntax =
631 { '\n', '\0', AfterStepCursorTerms, 0, '\t', "", "\t", "Cursors",
632 "Cursors", "AfterStep Cursor configuration", NULL,
633 0
634 };
635
636 SyntaxDef AfterStepMouseSyntax =
637 { '\n', '\0', MouseBindingTerms, 0, '\t', "", "\t", "MouseBindings",
638 "MouseBindings",
639 "AfterStep MouseBinding configuration", NULL, 0
640 };
641
642 SyntaxDef AfterStepKeySyntax =
643 { '\n', '\0', KeyboardBindingTerms, 0, '\t', "", "\t",
644 "KeyboardBindings", "KeyboardBindings",
645 "AfterStep KeyboardBinding configuration", NULL, 0
646 };
647
648 SyntaxDef AfterStepWindowBoxSyntax =
649 { '\n', '\0', AfterStepWindowBoxTerms, 0, '\t', "", "\t",
650 "WindowBoxes", "WindowBoxes",
651 "AfterStep WindowBox configuration", NULL, 0
652 };
653
654
LinkAfterStepConfig()655 void LinkAfterStepConfig ()
656 {
657 int i = 0;
658
659 TermDef *termsets[] = { includeTerms,
660 FeelTerms,
661 MouseBindingTerms,
662 KeyboardBindingTerms,
663 PopupTerms,
664 FunctionTerms,
665 WharfTerms,
666 WharfFolderTerms,
667 NULL
668 };
669 while (termsets[i]) {
670 TermDef *terms = termsets[i];
671 int k = 0;
672
673 while (terms[k].keyword != NULL) {
674 if (terms[k].sub_syntax == &DummyFuncSyntax)
675 terms[k].sub_syntax = pFuncSyntax;
676 else if (terms[k].sub_syntax == &DummyPopupFuncSyntax)
677 terms[k].sub_syntax = pPopupFuncSyntax;
678 ++k;
679 }
680 ++i;
681 }
682
683 pFuncSyntax->terms[F_Folder].sub_syntax = &WharfFolderSyntax;
684 }
685
init_asmodule_config(ASModuleConfig * config,Bool free_resources)686 void init_asmodule_config (ASModuleConfig * config, Bool free_resources)
687 {
688 if (config) {
689 if (free_resources) {
690 if (config->style_defs)
691 DestroyMyStyleDefinitions (&(config->style_defs));
692 if (config->balloon_configs) {
693 int i;
694
695 for (i = 0; config->balloon_configs[i] != NULL; ++i)
696 Destroy_balloonConfig (config->balloon_configs[i]);
697 free (config->balloon_configs);
698 }
699 if (config->more_stuff)
700 DestroyFreeStorage (&config->more_stuff);
701 }
702 config->type = 0; /* make it invalid type */
703 config->class = NULL; /* make it invalid type */
704 config->style_defs = NULL;
705 config->balloon_configs = NULL;
706 config->more_stuff = NULL;
707 }
708 }
709
710 #define ASModuleConfig_HandleDisabled (0x01<<0)
711 #define ASModuleConfig_DiscardDisabled (0x01<<1)
712 #define ASModuleConfig_HandleMyStyles (0x01<<2)
713 #define ASModuleConfig_HandleBalloons (0x01<<3)
714 #define ASModuleConfig_HandleDefaults (0x01<<4)
715 #define ASModuleConfig_HandleFlags (0x01<<5)
716 #define ASModuleConfig_HandleScalars (0x01<<6)
717
718 #define ASModuleConfig_HandleEverything (ASModuleConfig_HandleDisabled| \
719 ASModuleConfig_DiscardDisabled| \
720 ASModuleConfig_HandleMyStyles| \
721 ASModuleConfig_HandleBalloons| \
722 ASModuleConfig_HandleDefaults| \
723 ASModuleConfig_HandleFlags| \
724 ASModuleConfig_HandleScalars )
725
726 #define ASModuleConfig_HandleAllButDefaults (ASModuleConfig_DiscardDisabled| \
727 ASModuleConfig_HandleMyStyles| \
728 ASModuleConfig_HandleBalloons| \
729 ASModuleConfig_HandleDefaults| \
730 ASModuleConfig_HandleFlags| \
731 ASModuleConfig_HandleScalars )
732
create_ASModule_config(ASModuleConfigClass * class)733 ASModuleConfig *create_ASModule_config (ASModuleConfigClass * class)
734 {
735 ASModuleConfig *config = NULL;
736
737 if (class && class->config_struct_size > 0 && class->type != 0) {
738 config = safecalloc (1, class->config_struct_size);
739 init_asmodule_config (config, False);
740 config->type = class->type;
741 config->class = class;
742 if (class->balloon_types != NULL) {
743 int count = 0;
744
745 while (class->balloon_types[count] > 0)
746 ++count;
747 if (count > 0)
748 config->balloon_configs =
749 safecalloc (count + 1, sizeof (struct balloonConfig *));
750 }
751 if (class->init_config_func)
752 class->init_config_func (config, False);
753 }
754 return config;
755 }
756
destroy_ASModule_config(ASModuleConfig * config)757 void destroy_ASModule_config (ASModuleConfig * config)
758 {
759 if (config) {
760 ASModuleConfigClass *class = config->class;
761
762 if (class && class->init_config_func)
763 class->init_config_func (config, True);
764 init_asmodule_config (config, True);
765 free (config);
766 }
767 }
768
free_storage_elem2MyStyleDefinition(FreeStorageElem * fs,const char * default_name)769 MyStyleDefinition *free_storage_elem2MyStyleDefinition (FreeStorageElem *
770 fs,
771 const char
772 *default_name)
773 {
774 MyStyleDefinition *msd = NULL;
775
776 if (fs == NULL)
777 return NULL;
778
779 msd = safecalloc (1, sizeof (MyStyleDefinition));
780 msd->type = CONFIG_MyStyles_ID;
781
782 if (fs->sub)
783 fs = fs->sub;
784 for (; fs; fs = fs->next) {
785 TermDef *T = fs->term;
786
787 if (T->id < MYSTYLE_ID_START || T->id > MYSTYLE_ID_END) /* just in case */
788 continue;
789
790 if (T->struct_field_offset != 0) {
791 ReadConfigItemToStruct (msd, offsetof (MyStyleDefinition, set_flags),
792 fs);
793 /* fprintf (stderr, "$$$$ name = %s, offset=%d,keyword =%s,flags_on=0x%X, set_flags = 0x%X\n",msd->Name, offsetof(MyStyleDefinition,set_flags), T->keyword, T->flags_on, msd->set_flags); */
794 } else if (T->type == TT_FLAG) {
795 ReadFlagItemAuto (msd, offsetof (MyStyleDefinition, set_flags), fs,
796 MyStyleFlags);
797 } else
798 HandleMyStyleSpecialTerm (msd, fs);
799 }
800
801 if (msd->Name == NULL && default_name)
802 msd->Name = mystrdup (default_name);
803
804 if (!CheckMyStyleDefinitionSanity (msd))
805 DestroyMyStyleDefinitions (&msd);
806
807 return msd;
808 }
809
MyStyleDefinition2free_storage_elem(MyStyleDefinition * msd,SyntaxDef * syntax)810 FreeStorageElem *MyStyleDefinition2free_storage_elem (MyStyleDefinition *
811 msd,
812 SyntaxDef * syntax)
813 {
814 FreeStorageElem *fs = NULL;
815
816 if (msd == NULL || syntax == NULL)
817 return NULL;
818
819 if (msd->Name == NULL)
820 return NULL;
821
822 QuotedString2FreeStorage (syntax, &fs, NULL, msd->Name,
823 MYSTYLE_MyStyle_ID);
824 if (fs) {
825 FreeStorageElem **tail = &(fs->sub);
826 ASFlagType auto_handled = 0, auto_handled_flags = 0;
827 TermDef *T = fs->term;
828
829 fs->sub =
830 StructToFreeStorage (msd, offsetof (MyStyleDefinition, set_flags),
831 T->sub_syntax, &auto_handled);
832 ADVANCE_LINKED_LIST_TAIL (tail);
833
834 /* now we need to handle some flags : */
835 *tail =
836 StructFlags2FreeStorage (msd,
837 offsetof (MyStyleDefinition, set_flags),
838 T->sub_syntax, MyStyleFlags,
839 &auto_handled_flags);
840 ADVANCE_LINKED_LIST_TAIL (tail);
841
842 /* now we need to handle some special items : */
843 *tail = MyStyleSpecialTerms2FreeStorage (msd, T->sub_syntax);
844 }
845 return fs;
846 }
847
848
free_storage2MyStyleDefinitionsList(FreeStorageElem * fs)849 MyStyleDefinition *free_storage2MyStyleDefinitionsList (FreeStorageElem *
850 fs)
851 {
852 MyStyleDefinition *head = NULL;
853 MyStyleDefinition **tail = &head;
854
855 for (; fs; fs = fs->next) {
856 if (fs->term->id == MYSTYLE_MyStyle_ID) {
857 *tail = free_storage_elem2MyStyleDefinition (fs->sub, NULL);
858 ADVANCE_LINKED_LIST_TAIL (tail);
859 }
860 }
861 return head;
862 }
863
MyStyleDefinitionsList2free_storage(MyStyleDefinition * msd,SyntaxDef * syntax)864 FreeStorageElem *MyStyleDefinitionsList2free_storage (MyStyleDefinition *
865 msd,
866 SyntaxDef * syntax)
867 {
868 FreeStorageElem *head = NULL;
869 FreeStorageElem **tail = &head;
870
871 for (; msd; msd = msd->next) {
872 *tail = MyStyleDefinition2free_storage_elem (msd, syntax);
873 ADVANCE_LINKED_LIST_TAIL (tail);
874 }
875 return head;
876 }
877
878
free_storage2ASModule_config(ASModuleConfigClass * class,ASModuleConfig * config,FreeStorageElem * Storage,ASFlagType flags)879 ASModuleConfig *free_storage2ASModule_config (ASModuleConfigClass * class,
880 ASModuleConfig * config,
881 FreeStorageElem * Storage,
882 ASFlagType flags)
883 {
884 if (Storage != NULL) {
885 MyStyleDefinition **styles_tail = NULL;
886 FreeStorageElem **more_stuff_tail, *pCurr;
887
888 if (config == NULL)
889 config = create_ASModule_config (class);
890
891 if (get_flags (flags, ASModuleConfig_HandleDisabled)) {
892 more_stuff_tail = &(config->more_stuff);
893 while (*more_stuff_tail)
894 more_stuff_tail = &(*more_stuff_tail)->next;
895 StorageCleanUp (&Storage, more_stuff_tail, CF_DISABLED_OPTION);
896 } else if (get_flags (flags, ASModuleConfig_DiscardDisabled)) {
897 FreeStorageElem *tmp = NULL;
898
899 StorageCleanUp (&Storage, &tmp, CF_DISABLED_OPTION);
900 if (tmp)
901 DestroyFreeStorage (&tmp);
902 }
903
904 if (get_flags (flags, ASModuleConfig_HandleMyStyles)) {
905 styles_tail = &(config->style_defs);
906 while (*styles_tail)
907 styles_tail = &(*styles_tail)->next;
908 }
909
910 if (get_flags (flags, ASModuleConfig_HandleBalloons) && class != NULL) {
911 int i = 0;
912
913 while (class->balloon_types[i] > 0) {
914 LOCAL_DEBUG_OUT ("handling balloons type %d, base_ID = %d", i,
915 class->balloon_types[i]);
916 config->balloon_configs[i] =
917 Process_balloonOptions (Storage, config->balloon_configs[i],
918 class->balloon_types[i]);
919 ++i;
920 }
921 }
922
923 for (pCurr = Storage; pCurr; pCurr = pCurr->next) {
924 TermDef *T = pCurr->term;
925
926 if (T != NULL) {
927 if (T->id == MODULE_Defaults_ID && class != NULL) {
928 if (pCurr->sub
929 && get_flags (flags, ASModuleConfig_HandleDefaults)) {
930 ASModuleConfig *defaults =
931 free_storage2ASModule_config (class, NULL, pCurr->sub,
932 ASModuleConfig_DiscardDisabled
933 | ASModuleConfig_HandleFlags
934 | ASModuleConfig_HandleScalars
935 | ASModuleConfig_HandleBalloons);
936 if (defaults) {
937 class->free_storage2config_func (defaults, pCurr->sub);
938 class->merge_config_func (defaults, config);
939 /* our stuff does not get merged - handle manually : */
940 if (defaults->style_defs)
941 DestroyMyStyleDefinitions (&(defaults->style_defs));
942 defaults->style_defs = config->style_defs;
943
944 MergeBalloonOptions (defaults, config);
945
946 destroy_ASModule_config (config);
947 config = defaults;
948 }
949 }
950 } else if (T->id == MYSTYLE_MyStyle_ID
951 && get_flags (flags, ASModuleConfig_HandleMyStyles)) {
952 *styles_tail =
953 free_storage_elem2MyStyleDefinition (pCurr->sub, NULL);
954 if (*styles_tail)
955 styles_tail = &((*styles_tail)->next);
956 } else if (T->struct_field_offset != 0
957 && get_flags (flags, ASModuleConfig_HandleScalars)) {
958 ReadConfigItemToStruct (config, class->set_flags_field_offset,
959 pCurr);
960 } else if (T->type == TT_FLAG && class && class->flags_xref != NULL
961 && get_flags (flags, ASModuleConfig_HandleFlags)) {
962 ReadFlagItemAuto (config, class->set_flags_field_offset, pCurr,
963 class->flags_xref);
964 }
965 }
966 }
967 }
968 return config;
969 }
970
971 void
merge_ASModule_config(ASModuleConfigClass * class,ASModuleConfig * to,ASModuleConfig * from)972 merge_ASModule_config (ASModuleConfigClass * class, ASModuleConfig * to,
973 ASModuleConfig * from)
974 {
975 MergeBalloonOptions (to, from);
976 /* TODO: also need to merge MyStyle defs */
977
978 if (class->merge_config_func)
979 class->merge_config_func (to, from);
980
981 if (class->set_flags_field_offset > 0) {
982 ASFlagType *set_flags_ptr_to =
983 (void *)to + class->set_flags_field_offset;
984 ASFlagType *set_flags_ptr_from =
985 (void *)from + class->set_flags_field_offset;
986
987 set_flags (*set_flags_ptr_to, *set_flags_ptr_from);
988 }
989 }
990
991
parse_asmodule_config_file(ASModuleConfigClass * class,ASModuleConfig * config,const char * filename,SyntaxDef * syntax,ASFlagType parser_flags,ASFlagType handling_flags)992 static ASModuleConfig *parse_asmodule_config_file (ASModuleConfigClass *
993 class,
994 ASModuleConfig * config,
995 const char *filename,
996 SyntaxDef * syntax,
997 ASFlagType parser_flags,
998 ASFlagType
999 handling_flags)
1000 {
1001 ConfigData cd;
1002 ConfigDef *ConfigReader;
1003
1004 cd.filename = filename;
1005 ConfigReader = InitConfigReader (MyName, syntax, CDT_Filename, cd, NULL);
1006 if (ConfigReader != NULL) {
1007 FreeStorageElem *Storage = NULL;
1008
1009 set_flags (ConfigReader->flags, parser_flags);
1010 ParseConfig (ConfigReader, &Storage);
1011 config =
1012 free_storage2ASModule_config (class, config, Storage,
1013 handling_flags);
1014 class->free_storage2config_func (config, Storage);
1015 DestroyFreeStorage (&Storage);
1016 DestroyConfig (ConfigReader);
1017 show_progress ("configuration loaded from \"%s\" ...", filename);
1018 }
1019
1020 /* PrintMyStyleDefinitions( config->style_defs ); */
1021 return config;
1022 }
1023
parse_asmodule_look(ASModuleConfigClass * class,ASModuleConfig * module_config)1024 ASModuleConfig *parse_asmodule_look (ASModuleConfigClass * class,
1025 ASModuleConfig * module_config)
1026 {
1027 const char *const_configfile =
1028 get_session_file (Session, 0, F_CHANGE_LOOK, False);
1029
1030 if (const_configfile != NULL && class->look_syntax != NULL) {
1031 ASFlagType parser_flags = CP_IgnoreForeign;
1032 ASFlagType handling_flags = ASModuleConfig_DiscardDisabled |
1033 ASModuleConfig_HandleBalloons | ASModuleConfig_HandleFlags |
1034 ASModuleConfig_HandleScalars;
1035 if (!get_flags (class->flags, ASMC_HandlePublicLookOptions))
1036 set_flags (parser_flags, CP_IgnorePublic);
1037 if (get_flags (class->flags, ASMC_HandleLookMyStyles))
1038 set_flags (handling_flags, ASModuleConfig_HandleMyStyles);
1039 return parse_asmodule_config_file (class, module_config,
1040 const_configfile,
1041 class->look_syntax, parser_flags,
1042 handling_flags);
1043 }
1044 return module_config;
1045 }
1046
parse_asmodule_feel(ASModuleConfigClass * class,ASModuleConfig * module_config)1047 ASModuleConfig *parse_asmodule_feel (ASModuleConfigClass * class,
1048 ASModuleConfig * module_config)
1049 {
1050 const char *const_configfile =
1051 get_session_file (Session, 0, F_CHANGE_FEEL, False);
1052
1053 if (const_configfile != NULL && class->feel_syntax != NULL) {
1054 ASFlagType parser_flags = CP_IgnoreForeign;
1055 ASFlagType handling_flags = ASModuleConfig_DiscardDisabled |
1056 ASModuleConfig_HandleBalloons | ASModuleConfig_HandleFlags |
1057 ASModuleConfig_HandleScalars;
1058 if (!get_flags (class->flags, ASMC_HandlePublicFeelOptions))
1059 set_flags (parser_flags, CP_IgnorePublic);
1060 return parse_asmodule_config_file (class, module_config,
1061 const_configfile,
1062 class->feel_syntax, parser_flags,
1063 handling_flags);
1064 }
1065 return module_config;
1066 }
1067
parse_asmodule_private_config(ASModuleConfigClass * class,ASModuleConfig * module_config)1068 ASModuleConfig *parse_asmodule_private_config (ASModuleConfigClass * class,
1069 ASModuleConfig *
1070 module_config)
1071 {
1072 if (class->private_config_file && class->module_syntax) {
1073 char *configfile =
1074 make_session_file (Session, class->private_config_file, False);
1075
1076 if (configfile != NULL)
1077 return parse_asmodule_config_file (class, module_config, configfile,
1078 class->module_syntax,
1079 CP_IgnoreForeign,
1080 ASModuleConfig_DiscardDisabled |
1081 ASModuleConfig_HandleMyStyles |
1082 ASModuleConfig_HandleBalloons |
1083 ASModuleConfig_HandleDefaults |
1084 ASModuleConfig_HandleFlags |
1085 ASModuleConfig_HandleScalars);
1086 }
1087 return module_config;
1088 }
1089
1090
parse_asmodule_config_all(ASModuleConfigClass * class)1091 ASModuleConfig *parse_asmodule_config_all (ASModuleConfigClass * class)
1092 {
1093 ASModuleConfig *config = NULL;
1094
1095 LOCAL_DEBUG_CALLER_OUT ("class = %p, private_file = \"%s\"", class,
1096 class ? class->private_config_file : "(none)");
1097 config = parse_asmodule_look (class, config);
1098 config = parse_asmodule_feel (class, config);
1099 config = parse_asmodule_private_config (class, config);
1100
1101 if (config == NULL)
1102 config = create_ASModule_config (class);
1103
1104 return config;
1105 }
1106
1107 /******************************************************************************
1108 * Test cases and utilities
1109 ******************************************************************************/
1110