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