parse_be.c revision 0bbfda8a
10bbfda8aSnia/*
20bbfda8aSnia * Parser backend routines.
30bbfda8aSnia *
40bbfda8aSnia * Roughly, these are the routines that the lex/yacc output calls to do
50bbfda8aSnia * its work.
60bbfda8aSnia *
70bbfda8aSnia * This is very similar to the meaning of parse_yacc.c; the two may be
80bbfda8aSnia * merged at some point.
90bbfda8aSnia */
100bbfda8aSnia
110bbfda8aSnia#include "ctwm.h"
120bbfda8aSnia
130bbfda8aSnia#include <stdio.h>
140bbfda8aSnia#include <stdlib.h>
150bbfda8aSnia#include <string.h>
160bbfda8aSnia#include <strings.h>
170bbfda8aSnia
180bbfda8aSnia#include <X11/Xatom.h>
190bbfda8aSnia
200bbfda8aSnia#include "ctwm_atoms.h"
210bbfda8aSnia#include "screen.h"
220bbfda8aSnia#include "util.h"
230bbfda8aSnia#include "animate.h"
240bbfda8aSnia#include "functions_defs.h"
250bbfda8aSnia#include "image.h"
260bbfda8aSnia#include "list.h"
270bbfda8aSnia#include "occupation.h"
280bbfda8aSnia#include "parse.h"
290bbfda8aSnia#include "parse_be.h"
300bbfda8aSnia#include "parse_yacc.h"
310bbfda8aSnia#ifdef SOUNDS
320bbfda8aSnia#  include "sound.h"
330bbfda8aSnia#endif
340bbfda8aSnia
350bbfda8aSnia#include "gram.tab.h"
360bbfda8aSnia
370bbfda8aSnia
380bbfda8aSniastatic int ParseRandomPlacement(const char *s);
390bbfda8aSniastatic int ParseButtonStyle(const char *s);
400bbfda8aSniastatic int ParseUsePPosition(const char *s);
410bbfda8aSniastatic int ParseIconifyStyle(const char *s);
420bbfda8aSnia
430bbfda8aSnia
440bbfda8aSnia
450bbfda8aSnia/**********************************************************************
460bbfda8aSnia *
470bbfda8aSnia *  Parsing table and routines
480bbfda8aSnia *
490bbfda8aSnia ***********************************************************************/
500bbfda8aSnia
510bbfda8aSniatypedef struct _TwmKeyword {
520bbfda8aSnia	const char *name;
530bbfda8aSnia	int value;
540bbfda8aSnia	int subnum;
550bbfda8aSnia} TwmKeyword;
560bbfda8aSnia
570bbfda8aSnia#define kw0_NoDefaults                  1
580bbfda8aSnia#define kw0_AutoRelativeResize          2
590bbfda8aSnia#define kw0_ForceIcons                  3
600bbfda8aSnia#define kw0_NoIconManagers              4
610bbfda8aSnia#define kw0_InterpolateMenuColors       6
620bbfda8aSnia//#define kw0_NoVersion                 7
630bbfda8aSnia#define kw0_SortIconManager             8
640bbfda8aSnia#define kw0_NoGrabServer                9
650bbfda8aSnia#define kw0_NoMenuShadows               10
660bbfda8aSnia#define kw0_NoRaiseOnMove               11
670bbfda8aSnia#define kw0_NoRaiseOnResize             12
680bbfda8aSnia#define kw0_NoRaiseOnDeiconify          13
690bbfda8aSnia#define kw0_DontMoveOff                 14
700bbfda8aSnia#define kw0_NoBackingStore              15
710bbfda8aSnia#define kw0_NoSaveUnders                16
720bbfda8aSnia#define kw0_RestartPreviousState        17
730bbfda8aSnia#define kw0_ClientBorderWidth           18
740bbfda8aSnia#define kw0_NoTitleFocus                19
750bbfda8aSnia#define kw0_DecorateTransients          21
760bbfda8aSnia#define kw0_ShowIconManager             22
770bbfda8aSnia#define kw0_NoCaseSensitive             23
780bbfda8aSnia#define kw0_NoRaiseOnWarp               24
790bbfda8aSnia#define kw0_WarpUnmapped                25
800bbfda8aSnia#define kw0_ShowWorkspaceManager        27
810bbfda8aSnia#define kw0_StartInMapState             28
820bbfda8aSnia#define kw0_NoShowOccupyAll             29
830bbfda8aSnia#define kw0_AutoOccupy                  30
840bbfda8aSnia#define kw0_TransientHasOccupation      31
850bbfda8aSnia#define kw0_DontPaintRootWindow         32
860bbfda8aSnia#define kw0_Use3DMenus                  33
870bbfda8aSnia#define kw0_Use3DTitles                 34
880bbfda8aSnia#define kw0_Use3DIconManagers           35
890bbfda8aSnia#define kw0_Use3DBorders                36
900bbfda8aSnia#define kw0_SunkFocusWindowTitle        37
910bbfda8aSnia#define kw0_BeNiceToColormap            38
920bbfda8aSnia#define kw0_WarpRingOnScreen            40
930bbfda8aSnia#define kw0_NoIconManagerFocus          41
940bbfda8aSnia#define kw0_StayUpMenus                 42
950bbfda8aSnia#define kw0_ClickToFocus                43
960bbfda8aSnia#define kw0_BorderResizeCursors         44
970bbfda8aSnia#define kw0_ReallyMoveInWorkspaceManager 45
980bbfda8aSnia#define kw0_ShowWinWhenMovingInWmgr     46
990bbfda8aSnia#define kw0_Use3DWMap                   47
1000bbfda8aSnia#define kw0_ReverseCurrentWorkspace     48
1010bbfda8aSnia#define kw0_DontWarpCursorInWMap        49
1020bbfda8aSnia#define kw0_CenterFeedbackWindow        50
1030bbfda8aSnia#define kw0_WarpToDefaultMenuEntry      51
1040bbfda8aSnia#define kw0_ShrinkIconTitles            52
1050bbfda8aSnia#define kw0_AutoRaiseIcons              53
1060bbfda8aSnia//#define kw0_use3DIconBorders            54
1070bbfda8aSnia#define kw0_UseSunkTitlePixmap          55
1080bbfda8aSnia#define kw0_ShortAllWindowsMenus        56
1090bbfda8aSnia#define kw0_RaiseWhenAutoUnSqueeze      57
1100bbfda8aSnia#define kw0_RaiseOnClick                58
1110bbfda8aSnia#define kw0_IgnoreLockModifier          59
1120bbfda8aSnia#define kw0_AutoFocusToTransients       60 /* kai */
1130bbfda8aSnia#define kw0_PackNewWindows              61
1140bbfda8aSnia#define kw0_IgnoreCaseInMenuSelection   62
1150bbfda8aSnia#define kw0_SloppyFocus                 63
1160bbfda8aSnia#define kw0_NoImagesInWorkSpaceManager  64
1170bbfda8aSnia#define kw0_NoWarpToMenuTitle           65
1180bbfda8aSnia#define kw0_SaveWorkspaceFocus          66 /* blais */
1190bbfda8aSnia#define kw0_RaiseOnWarp                 67
1200bbfda8aSnia#define kw0_DontShowWelcomeWindow       68
1210bbfda8aSnia#define kw0_AutoPriority                69
1220bbfda8aSnia#define kw0_DontToggleWorkspacemanagerState 70
1230bbfda8aSnia#define kw0_BackingStore                71
1240bbfda8aSnia#define kw0_StartInButtonState          72
1250bbfda8aSnia#define kw0_NoSortIconManager           73
1260bbfda8aSnia#define kw0_NoRestartPreviousState      74
1270bbfda8aSnia#define kw0_NoDecorateTransients        75
1280bbfda8aSnia#define kw0_GrabServer                  76
1290bbfda8aSnia#define kw0_DontNameDecorations         77
1300bbfda8aSnia#define kw0_StrictWinNameEncoding       78
1310bbfda8aSnia
1320bbfda8aSnia#define kws_UsePPosition                1
1330bbfda8aSnia#define kws_IconFont                    2
1340bbfda8aSnia#define kws_ResizeFont                  3
1350bbfda8aSnia#define kws_MenuFont                    4
1360bbfda8aSnia#define kws_TitleFont                   5
1370bbfda8aSnia#define kws_IconManagerFont             6
1380bbfda8aSnia#define kws_UnknownIcon                 7
1390bbfda8aSnia#define kws_IconDirectory               8
1400bbfda8aSnia#define kws_MaxWindowSize               9
1410bbfda8aSnia#define kws_PixmapDirectory             10
1420bbfda8aSnia/* RandomPlacement moved because it's now a string string keyword */
1430bbfda8aSnia#define kws_IconJustification           12
1440bbfda8aSnia#define kws_TitleJustification          13
1450bbfda8aSnia#define kws_IconRegionJustification     14
1460bbfda8aSnia#define kws_IconRegionAlignement        15
1470bbfda8aSnia#define kws_SoundHost                   16
1480bbfda8aSnia#define kws_WMgrButtonStyle             17
1490bbfda8aSnia#define kws_WorkSpaceFont               18
1500bbfda8aSnia#define kws_IconifyStyle                19
1510bbfda8aSnia#define kws_IconSize                    20
1520bbfda8aSnia#define kws_RplaySoundHost              21
1530bbfda8aSnia
1540bbfda8aSnia#define kwss_RandomPlacement            1
1550bbfda8aSnia
1560bbfda8aSnia#define kwn_ConstrainedMoveTime         1
1570bbfda8aSnia#define kwn_MoveDelta                   2
1580bbfda8aSnia#define kwn_XorValue                    3
1590bbfda8aSnia#define kwn_FramePadding                4
1600bbfda8aSnia#define kwn_TitlePadding                5
1610bbfda8aSnia#define kwn_ButtonIndent                6
1620bbfda8aSnia#define kwn_BorderWidth                 7
1630bbfda8aSnia#define kwn_IconBorderWidth             8
1640bbfda8aSnia#define kwn_TitleButtonBorderWidth      9
1650bbfda8aSnia#define kwn_RaiseDelay                  10
1660bbfda8aSnia#define kwn_TransientOnTop              11
1670bbfda8aSnia#define kwn_OpaqueMoveThreshold         12
1680bbfda8aSnia#define kwn_OpaqueResizeThreshold       13
1690bbfda8aSnia#define kwn_WMgrVertButtonIndent        14
1700bbfda8aSnia#define kwn_WMgrHorizButtonIndent       15
1710bbfda8aSnia#define kwn_ClearShadowContrast         16
1720bbfda8aSnia#define kwn_DarkShadowContrast          17
1730bbfda8aSnia#define kwn_WMgrButtonShadowDepth       18
1740bbfda8aSnia#define kwn_MaxIconTitleWidth           19
1750bbfda8aSnia#define kwn_AnimationSpeed              20
1760bbfda8aSnia#define kwn_ThreeDBorderWidth           21
1770bbfda8aSnia#define kwn_MoveOffResistance           22
1780bbfda8aSnia#define kwn_BorderShadowDepth           23
1790bbfda8aSnia#define kwn_TitleShadowDepth            24
1800bbfda8aSnia#define kwn_TitleButtonShadowDepth      25
1810bbfda8aSnia#define kwn_MenuShadowDepth             26
1820bbfda8aSnia#define kwn_IconManagerShadowDepth      27
1830bbfda8aSnia#define kwn_MovePackResistance          28
1840bbfda8aSnia#define kwn_XMoveGrid                   29
1850bbfda8aSnia#define kwn_YMoveGrid                   30
1860bbfda8aSnia#define kwn_OpenWindowTimeout           31
1870bbfda8aSnia#define kwn_RaiseOnClickButton          32
1880bbfda8aSnia
1890bbfda8aSnia#define kwn_BorderTop                   33
1900bbfda8aSnia#define kwn_BorderBottom                34
1910bbfda8aSnia#define kwn_BorderLeft                  35
1920bbfda8aSnia#define kwn_BorderRight                 36
1930bbfda8aSnia
1940bbfda8aSnia#define kwcl_BorderColor                1
1950bbfda8aSnia#define kwcl_IconManagerHighlight       2
1960bbfda8aSnia#define kwcl_BorderTileForeground       3
1970bbfda8aSnia#define kwcl_BorderTileBackground       4
1980bbfda8aSnia#define kwcl_TitleForeground            5
1990bbfda8aSnia#define kwcl_TitleBackground            6
2000bbfda8aSnia#define kwcl_IconForeground             7
2010bbfda8aSnia#define kwcl_IconBackground             8
2020bbfda8aSnia#define kwcl_IconBorderColor            9
2030bbfda8aSnia#define kwcl_IconManagerForeground      10
2040bbfda8aSnia#define kwcl_IconManagerBackground      11
2050bbfda8aSnia#define kwcl_MapWindowBackground        12
2060bbfda8aSnia#define kwcl_MapWindowForeground        13
2070bbfda8aSnia
2080bbfda8aSnia#define kwc_DefaultForeground           1
2090bbfda8aSnia#define kwc_DefaultBackground           2
2100bbfda8aSnia#define kwc_MenuForeground              3
2110bbfda8aSnia#define kwc_MenuBackground              4
2120bbfda8aSnia#define kwc_MenuTitleForeground         5
2130bbfda8aSnia#define kwc_MenuTitleBackground         6
2140bbfda8aSnia#define kwc_MenuShadowColor             7
2150bbfda8aSnia
2160bbfda8aSnia
2170bbfda8aSnia/*
2180bbfda8aSnia * The following is sorted alphabetically according to name (which must be
2190bbfda8aSnia * in lowercase and only contain the letters a-z).  It is fed to a binary
2200bbfda8aSnia * search to parse keywords.
2210bbfda8aSnia */
2220bbfda8aSniastatic const TwmKeyword keytable[] = {
2230bbfda8aSnia	{ "a",                      ALTER, 0 },
2240bbfda8aSnia	{ "all",                    ALL, 0 },
2250bbfda8aSnia	{ "alter",                  ALTER, 0 },
2260bbfda8aSnia	{ "alwaysontop",            ALWAYS_ON_TOP, 0 },
2270bbfda8aSnia	{ "alwaysshowwindowwhenmovingfromworkspacemanager", KEYWORD, kw0_ShowWinWhenMovingInWmgr },
2280bbfda8aSnia	{ "alwayssqueezetogravity", ALWAYSSQUEEZETOGRAVITY, 0 },
2290bbfda8aSnia	{ "animationspeed",         NKEYWORD, kwn_AnimationSpeed },
2300bbfda8aSnia	{ "autofocustotransients",  KEYWORD, kw0_AutoFocusToTransients }, /* kai */
2310bbfda8aSnia	{ "autolower",              AUTO_LOWER, 0 },
2320bbfda8aSnia	{ "autooccupy",             KEYWORD, kw0_AutoOccupy },
2330bbfda8aSnia	{ "autopopup",              AUTO_POPUP, 0 },
2340bbfda8aSnia	{ "autopriority",           KEYWORD, kw0_AutoPriority },
2350bbfda8aSnia	{ "autoraise",              AUTO_RAISE, 0 },
2360bbfda8aSnia	{ "autoraiseicons",         KEYWORD, kw0_AutoRaiseIcons },
2370bbfda8aSnia	{ "autorelativeresize",     KEYWORD, kw0_AutoRelativeResize },
2380bbfda8aSnia	{ "autosqueeze",            AUTOSQUEEZE, 0 },
2390bbfda8aSnia	{ "backingstore",           KEYWORD, kw0_BackingStore },
2400bbfda8aSnia	{ "benicetocolormap",       KEYWORD, kw0_BeNiceToColormap },
2410bbfda8aSnia	{ "borderbottom",           NKEYWORD, kwn_BorderBottom },
2420bbfda8aSnia	{ "bordercolor",            CLKEYWORD, kwcl_BorderColor },
2430bbfda8aSnia	{ "borderleft",             NKEYWORD, kwn_BorderLeft },
2440bbfda8aSnia	{ "borderresizecursors",    KEYWORD, kw0_BorderResizeCursors },
2450bbfda8aSnia	{ "borderright",            NKEYWORD, kwn_BorderRight },
2460bbfda8aSnia	{ "bordershadowdepth",      NKEYWORD, kwn_BorderShadowDepth },
2470bbfda8aSnia	{ "bordertilebackground",   CLKEYWORD, kwcl_BorderTileBackground },
2480bbfda8aSnia	{ "bordertileforeground",   CLKEYWORD, kwcl_BorderTileForeground },
2490bbfda8aSnia	{ "bordertop",              NKEYWORD, kwn_BorderTop },
2500bbfda8aSnia	{ "borderwidth",            NKEYWORD, kwn_BorderWidth },
2510bbfda8aSnia	{ "button",                 BUTTON, 0 },
2520bbfda8aSnia	{ "buttonindent",           NKEYWORD, kwn_ButtonIndent },
2530bbfda8aSnia	{ "c",                      CONTROL, 0 },
2540bbfda8aSnia	{ "center",                 SIJENUM, SIJ_CENTER },
2550bbfda8aSnia	{ "centerfeedbackwindow",   KEYWORD, kw0_CenterFeedbackWindow },
2560bbfda8aSnia	{ "changeworkspacefunction", CHANGE_WORKSPACE_FUNCTION, 0 },
2570bbfda8aSnia	{ "clearshadowcontrast",    NKEYWORD, kwn_ClearShadowContrast },
2580bbfda8aSnia	{ "clicktofocus",           KEYWORD, kw0_ClickToFocus },
2590bbfda8aSnia	{ "clientborderwidth",      KEYWORD, kw0_ClientBorderWidth },
2600bbfda8aSnia	{ "color",                  COLOR, 0 },
2610bbfda8aSnia	{ "constrainedmovetime",    NKEYWORD, kwn_ConstrainedMoveTime },
2620bbfda8aSnia	{ "control",                CONTROL, 0 },
2630bbfda8aSnia	{ "cursors",                CURSORS, 0 },
2640bbfda8aSnia	{ "darkshadowcontrast",     NKEYWORD, kwn_DarkShadowContrast },
2650bbfda8aSnia	{ "decoratetransients",     KEYWORD, kw0_DecorateTransients },
2660bbfda8aSnia	{ "defaultbackground",      CKEYWORD, kwc_DefaultBackground },
2670bbfda8aSnia	{ "defaultforeground",      CKEYWORD, kwc_DefaultForeground },
2680bbfda8aSnia	{ "defaultfunction",        DEFAULT_FUNCTION, 0 },
2690bbfda8aSnia	{ "deiconifyfunction",      DEICONIFY_FUNCTION, 0 },
2700bbfda8aSnia	{ "destroy",                KILL, 0 },
2710bbfda8aSnia	{ "donticonifybyunmapping", DONT_ICONIFY_BY_UNMAPPING, 0 },
2720bbfda8aSnia	{ "dontmoveoff",            KEYWORD, kw0_DontMoveOff },
2730bbfda8aSnia	{ "dontnamedecorations",    KEYWORD, kw0_DontNameDecorations },
2740bbfda8aSnia	{ "dontpaintrootwindow",    KEYWORD, kw0_DontPaintRootWindow },
2750bbfda8aSnia	{ "dontsave",               DONT_SAVE, 0 },
2760bbfda8aSnia	{ "dontsetinactive",        DONTSETINACTIVE, 0 },
2770bbfda8aSnia	{ "dontshowwelcomewindow",  KEYWORD, kw0_DontShowWelcomeWindow },
2780bbfda8aSnia	{ "dontsqueezetitle",       DONT_SQUEEZE_TITLE, 0 },
2790bbfda8aSnia	{ "donttoggleworkspacemanagerstate", KEYWORD, kw0_DontToggleWorkspacemanagerState},
2800bbfda8aSnia	{ "dontwarpcursorinwmap",   KEYWORD, kw0_DontWarpCursorInWMap },
2810bbfda8aSnia	{ "east",                   GRAVITY, GRAV_EAST },
2820bbfda8aSnia	{ "ewmhignore",             EWMH_IGNORE, 0 },
2830bbfda8aSnia	{ "f",                      FRAME, 0 },
2840bbfda8aSnia	{ "forcefocus",             FORCE_FOCUS, 0 },
2850bbfda8aSnia	{ "forceicons",             KEYWORD, kw0_ForceIcons },
2860bbfda8aSnia	{ "frame",                  FRAME, 0 },
2870bbfda8aSnia	{ "framepadding",           NKEYWORD, kwn_FramePadding },
2880bbfda8aSnia	{ "function",               FUNCTION, 0 },
2890bbfda8aSnia	{ "grabserver",             KEYWORD, kw0_GrabServer },
2900bbfda8aSnia	{ "i",                      ICON, 0 },
2910bbfda8aSnia	{ "icon",                   ICON, 0 },
2920bbfda8aSnia	{ "iconbackground",         CLKEYWORD, kwcl_IconBackground },
2930bbfda8aSnia	{ "iconbordercolor",        CLKEYWORD, kwcl_IconBorderColor },
2940bbfda8aSnia	{ "iconborderwidth",        NKEYWORD, kwn_IconBorderWidth },
2950bbfda8aSnia	{ "icondirectory",          SKEYWORD, kws_IconDirectory },
2960bbfda8aSnia	{ "iconfont",               SKEYWORD, kws_IconFont },
2970bbfda8aSnia	{ "iconforeground",         CLKEYWORD, kwcl_IconForeground },
2980bbfda8aSnia	{ "iconifybyunmapping",     ICONIFY_BY_UNMAPPING, 0 },
2990bbfda8aSnia	{ "iconifyfunction",        ICONIFY_FUNCTION, 0 },
3000bbfda8aSnia	{ "iconifystyle",           SKEYWORD, kws_IconifyStyle },
3010bbfda8aSnia	{ "iconjustification",      SKEYWORD, kws_IconJustification },
3020bbfda8aSnia	{ "iconmanagerbackground",  CLKEYWORD, kwcl_IconManagerBackground },
3030bbfda8aSnia	{ "iconmanagerdontshow",    ICONMGR_NOSHOW, 0 },
3040bbfda8aSnia	{ "iconmanagerfont",        SKEYWORD, kws_IconManagerFont },
3050bbfda8aSnia	{ "iconmanagerforeground",  CLKEYWORD, kwcl_IconManagerForeground },
3060bbfda8aSnia	{ "iconmanagergeometry",    ICONMGR_GEOMETRY, 0 },
3070bbfda8aSnia	{ "iconmanagerhighlight",   CLKEYWORD, kwcl_IconManagerHighlight },
3080bbfda8aSnia	{ "iconmanagers",           ICONMGRS, 0 },
3090bbfda8aSnia	{ "iconmanagershadowdepth", NKEYWORD, kwn_IconManagerShadowDepth },
3100bbfda8aSnia	{ "iconmanagershow",        ICONMGR_SHOW, 0 },
3110bbfda8aSnia	{ "iconmenudontshow",       ICONMENU_DONTSHOW, 0 },
3120bbfda8aSnia	{ "iconmgr",                ICONMGR, 0 },
3130bbfda8aSnia	{ "iconregion",             ICON_REGION, 0 },
3140bbfda8aSnia	{ "iconregionalignement",   SKEYWORD, kws_IconRegionAlignement },
3150bbfda8aSnia	{ "iconregionjustification", SKEYWORD, kws_IconRegionJustification },
3160bbfda8aSnia	{ "icons",                  ICONS, 0 },
3170bbfda8aSnia	{ "iconsize",               SKEYWORD, kws_IconSize },
3180bbfda8aSnia	{ "ignorecaseinmenuselection",      KEYWORD, kw0_IgnoreCaseInMenuSelection },
3190bbfda8aSnia	{ "ignorelockmodifier",     KEYWORD, kw0_IgnoreLockModifier },
3200bbfda8aSnia	{ "ignoremodifier",         IGNOREMODIFIER, 0 },
3210bbfda8aSnia	{ "ignoretransient",        IGNORE_TRANSIENT, 0 },
3220bbfda8aSnia	{ "interpolatemenucolors",  KEYWORD, kw0_InterpolateMenuColors },
3230bbfda8aSnia	{ "l",                      LOCK, 0 },
3240bbfda8aSnia	{ "left",                   SIJENUM, SIJ_LEFT },
3250bbfda8aSnia	{ "lefttitlebutton",        LEFT_TITLEBUTTON, 0 },
3260bbfda8aSnia	{ "lock",                   LOCK, 0 },
3270bbfda8aSnia	{ "m",                      META, 0 },
3280bbfda8aSnia	{ "maketitle",              MAKE_TITLE, 0 },
3290bbfda8aSnia	{ "mapwindowbackground",    CLKEYWORD, kwcl_MapWindowBackground },
3300bbfda8aSnia	{ "mapwindowcurrentworkspace", MAPWINDOWCURRENTWORKSPACE, 0},
3310bbfda8aSnia	{ "mapwindowdefaultworkspace", MAPWINDOWDEFAULTWORKSPACE, 0},
3320bbfda8aSnia	{ "mapwindowforeground",    CLKEYWORD, kwcl_MapWindowForeground },
3330bbfda8aSnia	{ "maxicontitlewidth",      NKEYWORD, kwn_MaxIconTitleWidth },
3340bbfda8aSnia	{ "maxwindowsize",          SKEYWORD, kws_MaxWindowSize },
3350bbfda8aSnia	{ "menu",                   MENU, 0 },
3360bbfda8aSnia	{ "menubackground",         CKEYWORD, kwc_MenuBackground },
3370bbfda8aSnia	{ "menufont",               SKEYWORD, kws_MenuFont },
3380bbfda8aSnia	{ "menuforeground",         CKEYWORD, kwc_MenuForeground },
3390bbfda8aSnia	{ "menushadowcolor",        CKEYWORD, kwc_MenuShadowColor },
3400bbfda8aSnia	{ "menushadowdepth",        NKEYWORD, kwn_MenuShadowDepth },
3410bbfda8aSnia	{ "menutitlebackground",    CKEYWORD, kwc_MenuTitleBackground },
3420bbfda8aSnia	{ "menutitleforeground",    CKEYWORD, kwc_MenuTitleForeground },
3430bbfda8aSnia	{ "meta",                   META, 0 },
3440bbfda8aSnia	{ "mod",                    META, 0 },  /* fake it */
3450bbfda8aSnia	{ "monochrome",             MONOCHROME, 0 },
3460bbfda8aSnia	{ "move",                   MOVE, 0 },
3470bbfda8aSnia	{ "movedelta",              NKEYWORD, kwn_MoveDelta },
3480bbfda8aSnia	{ "moveoffresistance",      NKEYWORD, kwn_MoveOffResistance },
3490bbfda8aSnia	{ "movepackresistance",     NKEYWORD, kwn_MovePackResistance },
3500bbfda8aSnia	{ "mwmignore",              MWM_IGNORE, 0 },
3510bbfda8aSnia	{ "nobackingstore",         KEYWORD, kw0_NoBackingStore },
3520bbfda8aSnia	{ "noborder",               NO_BORDER, 0 },
3530bbfda8aSnia	{ "nocasesensitive",        KEYWORD, kw0_NoCaseSensitive },
3540bbfda8aSnia	{ "nodecoratetransients",   KEYWORD, kw0_NoDecorateTransients },
3550bbfda8aSnia	{ "nodefaults",             KEYWORD, kw0_NoDefaults },
3560bbfda8aSnia	{ "nograbserver",           KEYWORD, kw0_NoGrabServer },
3570bbfda8aSnia	{ "nohighlight",            NO_HILITE, 0 },
3580bbfda8aSnia	{ "noiconmanagerfocus",     KEYWORD, kw0_NoIconManagerFocus },
3590bbfda8aSnia	{ "noiconmanagers",         KEYWORD, kw0_NoIconManagers },
3600bbfda8aSnia	{ "noicontitle",            NO_ICON_TITLE, 0  },
3610bbfda8aSnia	{ "noimagesinworkspacemanager", KEYWORD, kw0_NoImagesInWorkSpaceManager },
3620bbfda8aSnia	{ "nomenushadows",          KEYWORD, kw0_NoMenuShadows },
3630bbfda8aSnia	{ "noopaquemove",           NOOPAQUEMOVE, 0 },
3640bbfda8aSnia	{ "noopaqueresize",         NOOPAQUERESIZE, 0 },
3650bbfda8aSnia	{ "noraiseondeiconify",     KEYWORD, kw0_NoRaiseOnDeiconify },
3660bbfda8aSnia	{ "noraiseonmove",          KEYWORD, kw0_NoRaiseOnMove },
3670bbfda8aSnia	{ "noraiseonresize",        KEYWORD, kw0_NoRaiseOnResize },
3680bbfda8aSnia	{ "noraiseonwarp",          KEYWORD, kw0_NoRaiseOnWarp },
3690bbfda8aSnia	{ "norestartpreviousstate", KEYWORD, kw0_NoRestartPreviousState },
3700bbfda8aSnia	{ "north",                  GRAVITY, GRAV_NORTH },
3710bbfda8aSnia	{ "nosaveunders",           KEYWORD, kw0_NoSaveUnders },
3720bbfda8aSnia	{ "noshowoccupyall",        KEYWORD, kw0_NoShowOccupyAll },
3730bbfda8aSnia	{ "nosorticonmanager",      KEYWORD, kw0_NoSortIconManager },
3740bbfda8aSnia	{ "nostackmode",            NO_STACKMODE, 0 },
3750bbfda8aSnia	{ "notitle",                NO_TITLE, 0 },
3760bbfda8aSnia	{ "notitlefocus",           KEYWORD, kw0_NoTitleFocus },
3770bbfda8aSnia	{ "notitlehighlight",       NO_TITLE_HILITE, 0 },
3780bbfda8aSnia	{ "nowarptomenutitle",      KEYWORD, kw0_NoWarpToMenuTitle },
3790bbfda8aSnia	{ "occupy",                 OCCUPYLIST, 0 },
3800bbfda8aSnia	{ "occupyall",              OCCUPYALL, 0 },
3810bbfda8aSnia	{ "ontoppriority",          ON_TOP_PRIORITY, 0 },
3820bbfda8aSnia	{ "opaquemove",             OPAQUEMOVE, 0 },
3830bbfda8aSnia	{ "opaquemovethreshold",    NKEYWORD, kwn_OpaqueMoveThreshold },
3840bbfda8aSnia	{ "opaqueresize",           OPAQUERESIZE, 0 },
3850bbfda8aSnia	{ "opaqueresizethreshold",  NKEYWORD, kwn_OpaqueResizeThreshold },
3860bbfda8aSnia	{ "openwindowtimeout",      NKEYWORD, kwn_OpenWindowTimeout },
3870bbfda8aSnia	{ "packnewwindows",         KEYWORD, kw0_PackNewWindows },
3880bbfda8aSnia	{ "pixmapdirectory",        SKEYWORD, kws_PixmapDirectory },
3890bbfda8aSnia	{ "pixmaps",                PIXMAPS, 0 },
3900bbfda8aSnia	{ "prioritynotswitching",   PRIORITY_NOT_SWITCHING, 0 },
3910bbfda8aSnia	{ "priorityswitching",      PRIORITY_SWITCHING, 0 },
3920bbfda8aSnia	{ "r",                      ROOT, 0 },
3930bbfda8aSnia	{ "raisedelay",             NKEYWORD, kwn_RaiseDelay },
3940bbfda8aSnia	{ "raiseonclick",           KEYWORD, kw0_RaiseOnClick },
3950bbfda8aSnia	{ "raiseonclickbutton",     NKEYWORD, kwn_RaiseOnClickButton },
3960bbfda8aSnia	{ "raiseonwarp",            KEYWORD, kw0_RaiseOnWarp },
3970bbfda8aSnia	{ "raisewhenautounsqueeze", KEYWORD, kw0_RaiseWhenAutoUnSqueeze },
3980bbfda8aSnia	{ "randomplacement",        SSKEYWORD, kwss_RandomPlacement },
3990bbfda8aSnia	{ "reallymoveinworkspacemanager",   KEYWORD, kw0_ReallyMoveInWorkspaceManager },
4000bbfda8aSnia	{ "resize",                 RESIZE, 0 },
4010bbfda8aSnia	{ "resizefont",             SKEYWORD, kws_ResizeFont },
4020bbfda8aSnia	{ "restartpreviousstate",   KEYWORD, kw0_RestartPreviousState },
4030bbfda8aSnia	{ "reversecurrentworkspace", KEYWORD, kw0_ReverseCurrentWorkspace },
4040bbfda8aSnia	{ "right",                  SIJENUM, SIJ_RIGHT },
4050bbfda8aSnia	{ "righttitlebutton",       RIGHT_TITLEBUTTON, 0 },
4060bbfda8aSnia	{ "root",                   ROOT, 0 },
4070bbfda8aSnia	{ "rplaysoundhost",         SKEYWORD, kws_RplaySoundHost },
4080bbfda8aSnia	{ "rplaysounds",            RPLAY_SOUNDS, 0 },
4090bbfda8aSnia	{ "s",                      SHIFT, 0 },
4100bbfda8aSnia	{ "savecolor",              SAVECOLOR, 0},
4110bbfda8aSnia	{ "saveworkspacefocus",     KEYWORD, kw0_SaveWorkspaceFocus },
4120bbfda8aSnia	{ "schrinkicontitles",      KEYWORD, kw0_ShrinkIconTitles },
4130bbfda8aSnia	{ "select",                 SELECT, 0 },
4140bbfda8aSnia	{ "shift",                  SHIFT, 0 },
4150bbfda8aSnia	{ "shortallwindowsmenus",   KEYWORD, kw0_ShortAllWindowsMenus },
4160bbfda8aSnia	{ "showiconmanager",        KEYWORD, kw0_ShowIconManager },
4170bbfda8aSnia	{ "showworkspacemanager",   KEYWORD, kw0_ShowWorkspaceManager },
4180bbfda8aSnia	{ "shrinkicontitles",       KEYWORD, kw0_ShrinkIconTitles },
4190bbfda8aSnia	{ "sloppyfocus",            KEYWORD, kw0_SloppyFocus },
4200bbfda8aSnia	{ "sorticonmanager",        KEYWORD, kw0_SortIconManager },
4210bbfda8aSnia	{ "soundhost",              SKEYWORD, kws_SoundHost },
4220bbfda8aSnia	{ "south",                  GRAVITY, GRAV_SOUTH },
4230bbfda8aSnia	{ "squeezetitle",           SQUEEZE_TITLE, 0 },
4240bbfda8aSnia	{ "starticonified",         START_ICONIFIED, 0 },
4250bbfda8aSnia	{ "startinbuttonstate",     KEYWORD, kw0_StartInButtonState },
4260bbfda8aSnia	{ "startinmapstate",        KEYWORD, kw0_StartInMapState },
4270bbfda8aSnia	{ "startsqueezed",          STARTSQUEEZED, 0 },
4280bbfda8aSnia	{ "stayupmenus",            KEYWORD, kw0_StayUpMenus },
4290bbfda8aSnia	{ "strictwinnameencoding",  KEYWORD, kw0_StrictWinNameEncoding  },
4300bbfda8aSnia	{ "sunkfocuswindowtitle",   KEYWORD, kw0_SunkFocusWindowTitle },
4310bbfda8aSnia	{ "t",                      TITLE, 0 },
4320bbfda8aSnia	{ "threedborderwidth",      NKEYWORD, kwn_ThreeDBorderWidth },
4330bbfda8aSnia	{ "title",                  TITLE, 0 },
4340bbfda8aSnia	{ "titlebackground",        CLKEYWORD, kwcl_TitleBackground },
4350bbfda8aSnia	{ "titlebuttonborderwidth", NKEYWORD, kwn_TitleButtonBorderWidth },
4360bbfda8aSnia	{ "titlebuttonshadowdepth", NKEYWORD, kwn_TitleButtonShadowDepth },
4370bbfda8aSnia	{ "titlefont",              SKEYWORD, kws_TitleFont },
4380bbfda8aSnia	{ "titleforeground",        CLKEYWORD, kwcl_TitleForeground },
4390bbfda8aSnia	{ "titlehighlight",         TITLE_HILITE, 0 },
4400bbfda8aSnia	{ "titlejustification",     SKEYWORD, kws_TitleJustification },
4410bbfda8aSnia	{ "titlepadding",           NKEYWORD, kwn_TitlePadding },
4420bbfda8aSnia	{ "titleshadowdepth",       NKEYWORD, kwn_TitleShadowDepth },
4430bbfda8aSnia	{ "transienthasoccupation", KEYWORD, kw0_TransientHasOccupation },
4440bbfda8aSnia	{ "transientontop",         NKEYWORD, kwn_TransientOnTop },
4450bbfda8aSnia	{ "unknownicon",            SKEYWORD, kws_UnknownIcon },
4460bbfda8aSnia	{ "unmapbymovingfaraway",   UNMAPBYMOVINGFARAWAY, 0 },
4470bbfda8aSnia	{ "usepposition",           SKEYWORD, kws_UsePPosition },
4480bbfda8aSnia	{ "usesunktitlepixmap",     KEYWORD, kw0_UseSunkTitlePixmap },
4490bbfda8aSnia	{ "usethreedborders",       KEYWORD, kw0_Use3DBorders },
4500bbfda8aSnia	{ "usethreediconmanagers",  KEYWORD, kw0_Use3DIconManagers },
4510bbfda8aSnia	{ "usethreedmenus",         KEYWORD, kw0_Use3DMenus },
4520bbfda8aSnia	{ "usethreedtitles",        KEYWORD, kw0_Use3DTitles },
4530bbfda8aSnia	{ "usethreedwmap",          KEYWORD, kw0_Use3DWMap },
4540bbfda8aSnia	{ "virtualscreens",         VIRTUAL_SCREENS, 0 },
4550bbfda8aSnia	{ "w",                      WINDOW, 0 },
4560bbfda8aSnia	{ "wait",                   WAITC, 0 },
4570bbfda8aSnia	{ "warpcursor",             WARP_CURSOR, 0 },
4580bbfda8aSnia	{ "warpondeiconify",        WARP_ON_DEICONIFY, 0 },
4590bbfda8aSnia	{ "warpringonscreen",       KEYWORD, kw0_WarpRingOnScreen },
4600bbfda8aSnia	{ "warptodefaultmenuentry", KEYWORD, kw0_WarpToDefaultMenuEntry },
4610bbfda8aSnia	{ "warpunmapped",           KEYWORD, kw0_WarpUnmapped },
4620bbfda8aSnia	{ "west",                   GRAVITY, GRAV_WEST },
4630bbfda8aSnia	{ "window",                 WINDOW, 0 },
4640bbfda8aSnia	{ "windowbox",              WINDOW_BOX, 0 },
4650bbfda8aSnia	{ "windowfunction",         WINDOW_FUNCTION, 0 },
4660bbfda8aSnia	{ "windowgeometries",       WINDOW_GEOMETRIES, 0 },
4670bbfda8aSnia	{ "windowregion",           WINDOW_REGION, 0 },
4680bbfda8aSnia	{ "windowring",             WINDOW_RING, 0 },
4690bbfda8aSnia	{ "windowringexclude",      WINDOW_RING_EXCLUDE, 0},
4700bbfda8aSnia	{ "wmgrbuttonshadowdepth",  NKEYWORD, kwn_WMgrButtonShadowDepth },
4710bbfda8aSnia	{ "wmgrbuttonstyle",        SKEYWORD, kws_WMgrButtonStyle },
4720bbfda8aSnia	{ "wmgrhorizbuttonindent",  NKEYWORD, kwn_WMgrHorizButtonIndent },
4730bbfda8aSnia	{ "wmgrvertbuttonindent",   NKEYWORD, kwn_WMgrVertButtonIndent },
4740bbfda8aSnia	{ "workspace",              WORKSPACE, 0 },
4750bbfda8aSnia	{ "workspacefont",          SKEYWORD, kws_WorkSpaceFont },
4760bbfda8aSnia	{ "workspacemanagergeometry", WORKSPCMGR_GEOMETRY, 0 },
4770bbfda8aSnia	{ "workspaces",             WORKSPACES, 0},
4780bbfda8aSnia	{ "xmovegrid",              NKEYWORD, kwn_XMoveGrid },
4790bbfda8aSnia	{ "xorvalue",               NKEYWORD, kwn_XorValue },
4800bbfda8aSnia	{ "xpmicondirectory",       SKEYWORD, kws_PixmapDirectory },
4810bbfda8aSnia	{ "ymovegrid",              NKEYWORD, kwn_YMoveGrid },
4820bbfda8aSnia	{ "zoom",                   ZOOM, 0 },
4830bbfda8aSnia};
4840bbfda8aSnia
4850bbfda8aSniastatic const size_t numkeywords = (sizeof(keytable) / sizeof(keytable[0]));
4860bbfda8aSnia
4870bbfda8aSnia
4880bbfda8aSnia/*
4890bbfda8aSnia * The lookup table for functions is generated.
4900bbfda8aSnia */
4910bbfda8aSnia#include "functions_parse_table.h"
4920bbfda8aSnia
4930bbfda8aSnia
4940bbfda8aSnia
4950bbfda8aSniastatic int
4960bbfda8aSniakt_compare(const void *lhs, const void *rhs)
4970bbfda8aSnia{
4980bbfda8aSnia	const TwmKeyword *l = lhs;
4990bbfda8aSnia	const TwmKeyword *r = rhs;
5000bbfda8aSnia	return strcasecmp(l->name, r->name);
5010bbfda8aSnia}
5020bbfda8aSnia
5030bbfda8aSniaint
5040bbfda8aSniaparse_keyword(const char *s, int *nump)
5050bbfda8aSnia{
5060bbfda8aSnia	const TwmKeyword srch = { .name = s };
5070bbfda8aSnia	TwmKeyword *ret;
5080bbfda8aSnia	const TwmKeyword *srchtab;
5090bbfda8aSnia	size_t nstab;
5100bbfda8aSnia
5110bbfda8aSnia	/* Guard; nothing can't be a valid keyword */
5120bbfda8aSnia	if(s == NULL || strlen(s) < 1) {
5130bbfda8aSnia		return ERRORTOKEN;
5140bbfda8aSnia	}
5150bbfda8aSnia
5160bbfda8aSnia	/*
5170bbfda8aSnia	 * Functions are in their own table, so check for them there.
5180bbfda8aSnia	 *
5190bbfda8aSnia	 * This is safe as long as (strlen >= 1), which we already checked.
5200bbfda8aSnia	 */
5210bbfda8aSnia	if(s[0] == 'f' && s[1] == '.') {
5220bbfda8aSnia		srchtab = funckeytable;
5230bbfda8aSnia		nstab = numfunckeywords;
5240bbfda8aSnia	}
5250bbfda8aSnia	else {
5260bbfda8aSnia		srchtab = keytable;
5270bbfda8aSnia		nstab = numkeywords;
5280bbfda8aSnia	}
5290bbfda8aSnia
5300bbfda8aSnia	/* Find it */
5310bbfda8aSnia	ret = bsearch(&srch, srchtab, nstab, sizeof(TwmKeyword), kt_compare);
5320bbfda8aSnia	if(ret) {
5330bbfda8aSnia		*nump = ret->subnum;
5340bbfda8aSnia		return ret->value;
5350bbfda8aSnia	}
5360bbfda8aSnia
5370bbfda8aSnia	return ERRORTOKEN;
5380bbfda8aSnia}
5390bbfda8aSnia
5400bbfda8aSnia
5410bbfda8aSnia/*
5420bbfda8aSnia * Simple tester function
5430bbfda8aSnia */
5440bbfda8aSniavoid
5450bbfda8aSniachk_keytable_order(void)
5460bbfda8aSnia{
5470bbfda8aSnia	int i;
5480bbfda8aSnia
5490bbfda8aSnia	for(i = 0 ; i < (numkeywords - 1) ; i++) {
5500bbfda8aSnia		if(strcasecmp(keytable[i].name, keytable[i + 1].name) >= 0) {
5510bbfda8aSnia			fprintf(stderr, "%s: INTERNAL ERROR: keytable sorting: "
5520bbfda8aSnia			        "'%s' >= '%s'\n", ProgramName,
5530bbfda8aSnia			        keytable[i].name, keytable[i + 1].name);
5540bbfda8aSnia		}
5550bbfda8aSnia	}
5560bbfda8aSnia
5570bbfda8aSnia	for(i = 0 ; i < (numfunckeywords - 1) ; i++) {
5580bbfda8aSnia		if(strcasecmp(funckeytable[i].name, funckeytable[i + 1].name) >= 0) {
5590bbfda8aSnia			fprintf(stderr, "%s: INTERNAL ERROR: funckeytable sorting: "
5600bbfda8aSnia			        "'%s' >= '%s'\n", ProgramName,
5610bbfda8aSnia			        funckeytable[i].name, funckeytable[i + 1].name);
5620bbfda8aSnia		}
5630bbfda8aSnia	}
5640bbfda8aSnia}
5650bbfda8aSnia
5660bbfda8aSnia
5670bbfda8aSnia
5680bbfda8aSnia/*
5690bbfda8aSnia * action routines called by grammar
5700bbfda8aSnia */
5710bbfda8aSnia
5720bbfda8aSniabool
5730bbfda8aSniado_single_keyword(int keyword)
5740bbfda8aSnia{
5750bbfda8aSnia	switch(keyword) {
5760bbfda8aSnia		case kw0_NoDefaults:
5770bbfda8aSnia			Scr->NoDefaults = true;
5780bbfda8aSnia			return true;
5790bbfda8aSnia
5800bbfda8aSnia		case kw0_AutoRelativeResize:
5810bbfda8aSnia			Scr->AutoRelativeResize = true;
5820bbfda8aSnia			return true;
5830bbfda8aSnia
5840bbfda8aSnia		case kw0_ForceIcons:
5850bbfda8aSnia			if(Scr->FirstTime) {
5860bbfda8aSnia				Scr->ForceIcon = true;
5870bbfda8aSnia			}
5880bbfda8aSnia			return true;
5890bbfda8aSnia
5900bbfda8aSnia		case kw0_NoIconManagers:
5910bbfda8aSnia			Scr->NoIconManagers = true;
5920bbfda8aSnia			return true;
5930bbfda8aSnia
5940bbfda8aSnia		case kw0_InterpolateMenuColors:
5950bbfda8aSnia			if(Scr->FirstTime) {
5960bbfda8aSnia				Scr->InterpolateMenuColors = true;
5970bbfda8aSnia			}
5980bbfda8aSnia			return true;
5990bbfda8aSnia
6000bbfda8aSnia		case kw0_SortIconManager:
6010bbfda8aSnia			if(Scr->FirstTime) {
6020bbfda8aSnia				Scr->SortIconMgr = true;
6030bbfda8aSnia			}
6040bbfda8aSnia			return true;
6050bbfda8aSnia
6060bbfda8aSnia		case kw0_NoSortIconManager:
6070bbfda8aSnia			if(Scr->FirstTime) {
6080bbfda8aSnia				Scr->SortIconMgr = false;
6090bbfda8aSnia			}
6100bbfda8aSnia			return true;
6110bbfda8aSnia
6120bbfda8aSnia		case kw0_GrabServer:
6130bbfda8aSnia			Scr->NoGrabServer = false;
6140bbfda8aSnia			return true;
6150bbfda8aSnia
6160bbfda8aSnia		case kw0_NoGrabServer:
6170bbfda8aSnia			Scr->NoGrabServer = true;
6180bbfda8aSnia			return true;
6190bbfda8aSnia
6200bbfda8aSnia		case kw0_NoMenuShadows:
6210bbfda8aSnia			if(Scr->FirstTime) {
6220bbfda8aSnia				Scr->Shadow = false;
6230bbfda8aSnia			}
6240bbfda8aSnia			return true;
6250bbfda8aSnia
6260bbfda8aSnia		case kw0_NoRaiseOnMove:
6270bbfda8aSnia			if(Scr->FirstTime) {
6280bbfda8aSnia				Scr->NoRaiseMove = true;
6290bbfda8aSnia			}
6300bbfda8aSnia			return true;
6310bbfda8aSnia
6320bbfda8aSnia		case kw0_NoRaiseOnResize:
6330bbfda8aSnia			if(Scr->FirstTime) {
6340bbfda8aSnia				Scr->NoRaiseResize = true;
6350bbfda8aSnia			}
6360bbfda8aSnia			return true;
6370bbfda8aSnia
6380bbfda8aSnia		case kw0_NoRaiseOnDeiconify:
6390bbfda8aSnia			if(Scr->FirstTime) {
6400bbfda8aSnia				Scr->NoRaiseDeicon = true;
6410bbfda8aSnia			}
6420bbfda8aSnia			return true;
6430bbfda8aSnia
6440bbfda8aSnia		case kw0_DontMoveOff:
6450bbfda8aSnia			Scr->DontMoveOff = true;
6460bbfda8aSnia			return true;
6470bbfda8aSnia
6480bbfda8aSnia		case kw0_NoBackingStore:
6490bbfda8aSnia			Scr->BackingStore = false;
6500bbfda8aSnia			return true;
6510bbfda8aSnia
6520bbfda8aSnia		case kw0_BackingStore:
6530bbfda8aSnia			Scr->BackingStore = true;
6540bbfda8aSnia			return true;
6550bbfda8aSnia
6560bbfda8aSnia		case kw0_NoSaveUnders:
6570bbfda8aSnia			Scr->SaveUnder = false;
6580bbfda8aSnia			return true;
6590bbfda8aSnia
6600bbfda8aSnia		// XXX Shouldn't these be in Scr too?
6610bbfda8aSnia		case kw0_RestartPreviousState:
6620bbfda8aSnia			RestartPreviousState = true;
6630bbfda8aSnia			return true;
6640bbfda8aSnia
6650bbfda8aSnia		case kw0_NoRestartPreviousState:
6660bbfda8aSnia			RestartPreviousState = false;
6670bbfda8aSnia			return true;
6680bbfda8aSnia
6690bbfda8aSnia		case kw0_ClientBorderWidth:
6700bbfda8aSnia			if(Scr->FirstTime) {
6710bbfda8aSnia				Scr->ClientBorderWidth = true;
6720bbfda8aSnia			}
6730bbfda8aSnia			return true;
6740bbfda8aSnia
6750bbfda8aSnia		case kw0_NoTitleFocus:
6760bbfda8aSnia			Scr->TitleFocus = false;
6770bbfda8aSnia			return true;
6780bbfda8aSnia
6790bbfda8aSnia		case kw0_DecorateTransients:
6800bbfda8aSnia			Scr->DecorateTransients = true;
6810bbfda8aSnia			return true;
6820bbfda8aSnia
6830bbfda8aSnia		case kw0_NoDecorateTransients:
6840bbfda8aSnia			Scr->DecorateTransients = false;
6850bbfda8aSnia			return true;
6860bbfda8aSnia
6870bbfda8aSnia		case kw0_ShowIconManager:
6880bbfda8aSnia			Scr->ShowIconManager = true;
6890bbfda8aSnia			return true;
6900bbfda8aSnia
6910bbfda8aSnia		case kw0_ShowWorkspaceManager:
6920bbfda8aSnia			Scr->ShowWorkspaceManager = true;
6930bbfda8aSnia			return true;
6940bbfda8aSnia
6950bbfda8aSnia		case kw0_StartInButtonState:
6960bbfda8aSnia			Scr->workSpaceMgr.initialstate = WMS_buttons;
6970bbfda8aSnia			return true;
6980bbfda8aSnia
6990bbfda8aSnia		case kw0_StartInMapState:
7000bbfda8aSnia			Scr->workSpaceMgr.initialstate = WMS_map;
7010bbfda8aSnia			return true;
7020bbfda8aSnia
7030bbfda8aSnia		case kw0_NoShowOccupyAll:
7040bbfda8aSnia			Scr->workSpaceMgr.noshowoccupyall = true;
7050bbfda8aSnia			return true;
7060bbfda8aSnia
7070bbfda8aSnia		case kw0_AutoOccupy:
7080bbfda8aSnia			Scr->AutoOccupy = true;
7090bbfda8aSnia			return true;
7100bbfda8aSnia
7110bbfda8aSnia		case kw0_AutoPriority:
7120bbfda8aSnia			Scr->AutoPriority = true;
7130bbfda8aSnia			return true;
7140bbfda8aSnia
7150bbfda8aSnia		case kw0_TransientHasOccupation:
7160bbfda8aSnia			Scr->TransientHasOccupation = true;
7170bbfda8aSnia			return true;
7180bbfda8aSnia
7190bbfda8aSnia		case kw0_DontPaintRootWindow:
7200bbfda8aSnia			Scr->DontPaintRootWindow = true;
7210bbfda8aSnia			return true;
7220bbfda8aSnia
7230bbfda8aSnia		case kw0_UseSunkTitlePixmap:
7240bbfda8aSnia			Scr->UseSunkTitlePixmap = true;
7250bbfda8aSnia			return true;
7260bbfda8aSnia
7270bbfda8aSnia		case kw0_Use3DBorders:
7280bbfda8aSnia			Scr->use3Dborders = true;
7290bbfda8aSnia			return true;
7300bbfda8aSnia
7310bbfda8aSnia		case kw0_Use3DIconManagers:
7320bbfda8aSnia			Scr->use3Diconmanagers = true;
7330bbfda8aSnia			return true;
7340bbfda8aSnia
7350bbfda8aSnia		case kw0_Use3DMenus:
7360bbfda8aSnia			Scr->use3Dmenus = true;
7370bbfda8aSnia			return true;
7380bbfda8aSnia
7390bbfda8aSnia		case kw0_Use3DTitles:
7400bbfda8aSnia			Scr->use3Dtitles = true;
7410bbfda8aSnia			return true;
7420bbfda8aSnia
7430bbfda8aSnia		case kw0_Use3DWMap:
7440bbfda8aSnia			Scr->use3Dwmap = true;
7450bbfda8aSnia			return true;
7460bbfda8aSnia
7470bbfda8aSnia		case kw0_SunkFocusWindowTitle:
7480bbfda8aSnia			Scr->SunkFocusWindowTitle = true;
7490bbfda8aSnia			return true;
7500bbfda8aSnia
7510bbfda8aSnia		case kw0_BeNiceToColormap:
7520bbfda8aSnia			Scr->BeNiceToColormap = true;
7530bbfda8aSnia			return true;
7540bbfda8aSnia
7550bbfda8aSnia		case kw0_BorderResizeCursors:
7560bbfda8aSnia			Scr->BorderCursors = true;
7570bbfda8aSnia			return true;
7580bbfda8aSnia
7590bbfda8aSnia		case kw0_NoCaseSensitive:
7600bbfda8aSnia			Scr->CaseSensitive = false;
7610bbfda8aSnia			return true;
7620bbfda8aSnia
7630bbfda8aSnia		case kw0_NoRaiseOnWarp:
7640bbfda8aSnia			Scr->RaiseOnWarp = false;
7650bbfda8aSnia			return true;
7660bbfda8aSnia
7670bbfda8aSnia		case kw0_RaiseOnWarp:
7680bbfda8aSnia			Scr->RaiseOnWarp = true;
7690bbfda8aSnia			return true;
7700bbfda8aSnia
7710bbfda8aSnia		case kw0_WarpUnmapped:
7720bbfda8aSnia			Scr->WarpUnmapped = true;
7730bbfda8aSnia			return true;
7740bbfda8aSnia
7750bbfda8aSnia		case kw0_WarpRingOnScreen:
7760bbfda8aSnia			Scr->WarpRingAnyWhere = false;
7770bbfda8aSnia			return true;
7780bbfda8aSnia
7790bbfda8aSnia		case kw0_NoIconManagerFocus:
7800bbfda8aSnia			Scr->IconManagerFocus = false;
7810bbfda8aSnia			return true;
7820bbfda8aSnia
7830bbfda8aSnia		case kw0_StayUpMenus:
7840bbfda8aSnia			Scr->StayUpMenus = true;
7850bbfda8aSnia			return true;
7860bbfda8aSnia
7870bbfda8aSnia		case kw0_ClickToFocus:
7880bbfda8aSnia			Scr->ClickToFocus = true;
7890bbfda8aSnia			return true;
7900bbfda8aSnia
7910bbfda8aSnia		case kw0_ReallyMoveInWorkspaceManager:
7920bbfda8aSnia			Scr->ReallyMoveInWorkspaceManager = true;
7930bbfda8aSnia			return true;
7940bbfda8aSnia
7950bbfda8aSnia		case kw0_ShowWinWhenMovingInWmgr:
7960bbfda8aSnia			Scr->ShowWinWhenMovingInWmgr = true;
7970bbfda8aSnia			return true;
7980bbfda8aSnia
7990bbfda8aSnia		case kw0_ReverseCurrentWorkspace:
8000bbfda8aSnia			Scr->ReverseCurrentWorkspace = true;
8010bbfda8aSnia			return true;
8020bbfda8aSnia
8030bbfda8aSnia		case kw0_DontWarpCursorInWMap:
8040bbfda8aSnia			Scr->DontWarpCursorInWMap = true;
8050bbfda8aSnia			return true;
8060bbfda8aSnia
8070bbfda8aSnia		case kw0_CenterFeedbackWindow:
8080bbfda8aSnia			Scr->CenterFeedbackWindow = true;
8090bbfda8aSnia			return true;
8100bbfda8aSnia
8110bbfda8aSnia		case kw0_WarpToDefaultMenuEntry:
8120bbfda8aSnia			Scr->WarpToDefaultMenuEntry = true;
8130bbfda8aSnia			return true;
8140bbfda8aSnia
8150bbfda8aSnia		case kw0_ShrinkIconTitles:
8160bbfda8aSnia			Scr->ShrinkIconTitles = true;
8170bbfda8aSnia			return true;
8180bbfda8aSnia
8190bbfda8aSnia		case kw0_AutoRaiseIcons:
8200bbfda8aSnia			Scr->AutoRaiseIcons = true;
8210bbfda8aSnia			return true;
8220bbfda8aSnia
8230bbfda8aSnia		/* kai */
8240bbfda8aSnia		case kw0_AutoFocusToTransients:
8250bbfda8aSnia			Scr->AutoFocusToTransients = true;
8260bbfda8aSnia			return true;
8270bbfda8aSnia
8280bbfda8aSnia		case kw0_ShortAllWindowsMenus:
8290bbfda8aSnia			Scr->ShortAllWindowsMenus = true;
8300bbfda8aSnia			return true;
8310bbfda8aSnia
8320bbfda8aSnia		case kw0_RaiseWhenAutoUnSqueeze:
8330bbfda8aSnia			Scr->RaiseWhenAutoUnSqueeze = true;
8340bbfda8aSnia			return true;
8350bbfda8aSnia
8360bbfda8aSnia		case kw0_RaiseOnClick:
8370bbfda8aSnia			Scr->RaiseOnClick = true;
8380bbfda8aSnia			return true;
8390bbfda8aSnia
8400bbfda8aSnia		case kw0_IgnoreLockModifier:
8410bbfda8aSnia			Scr->IgnoreModifier |= LockMask;
8420bbfda8aSnia			return true;
8430bbfda8aSnia
8440bbfda8aSnia		case kw0_PackNewWindows:
8450bbfda8aSnia			Scr->PackNewWindows = true;
8460bbfda8aSnia			return true;
8470bbfda8aSnia
8480bbfda8aSnia		case kw0_IgnoreCaseInMenuSelection:
8490bbfda8aSnia			Scr->IgnoreCaseInMenuSelection = true;
8500bbfda8aSnia			return true;
8510bbfda8aSnia
8520bbfda8aSnia		case kw0_SloppyFocus:
8530bbfda8aSnia			Scr->SloppyFocus = true;
8540bbfda8aSnia			return true;
8550bbfda8aSnia
8560bbfda8aSnia		case kw0_SaveWorkspaceFocus:
8570bbfda8aSnia			Scr->SaveWorkspaceFocus = true;
8580bbfda8aSnia			return true;
8590bbfda8aSnia
8600bbfda8aSnia		case kw0_NoImagesInWorkSpaceManager:
8610bbfda8aSnia			Scr->NoImagesInWorkSpaceManager = true;
8620bbfda8aSnia			return true;
8630bbfda8aSnia
8640bbfda8aSnia		case kw0_NoWarpToMenuTitle:
8650bbfda8aSnia			Scr->NoWarpToMenuTitle = true;
8660bbfda8aSnia			return true;
8670bbfda8aSnia
8680bbfda8aSnia		case kw0_DontShowWelcomeWindow:
8690bbfda8aSnia			Scr->ShowWelcomeWindow = false;
8700bbfda8aSnia			return true;
8710bbfda8aSnia
8720bbfda8aSnia		case kw0_DontToggleWorkspacemanagerState:
8730bbfda8aSnia			Scr->DontToggleWorkspaceManagerState = true;
8740bbfda8aSnia			return true;
8750bbfda8aSnia
8760bbfda8aSnia		case kw0_DontNameDecorations:
8770bbfda8aSnia			Scr->NameDecorations = false;
8780bbfda8aSnia			return true;
8790bbfda8aSnia
8800bbfda8aSnia		case kw0_StrictWinNameEncoding:
8810bbfda8aSnia			Scr->StrictWinNameEncoding = true;
8820bbfda8aSnia			return true;
8830bbfda8aSnia
8840bbfda8aSnia	}
8850bbfda8aSnia	return false;
8860bbfda8aSnia}
8870bbfda8aSnia
8880bbfda8aSnia
8890bbfda8aSniabool
8900bbfda8aSniado_string_string_keyword(int keyword, const char *s1, const char *s2)
8910bbfda8aSnia{
8920bbfda8aSnia	switch(keyword) {
8930bbfda8aSnia		case kwss_RandomPlacement: {
8940bbfda8aSnia			/* RandomPlacement {on,off,all,unmapped} [displacement geom] */
8950bbfda8aSnia			int rp;
8960bbfda8aSnia			int gmask, gx, gy;     // Geometry mask/x/y values
8970bbfda8aSnia			unsigned int gjw, gjh; // width/height (ignored)
8980bbfda8aSnia			int exmask = (XValue | YValue); // Bits we need in the mask
8990bbfda8aSnia
9000bbfda8aSnia			rp = ParseRandomPlacement(s1);
9010bbfda8aSnia			if(rp < 0) {
9020bbfda8aSnia				twmrc_error_prefix();
9030bbfda8aSnia				fprintf(stderr,
9040bbfda8aSnia				        "ignoring invalid RandomPlacement argument 1 \"%s\"\n",
9050bbfda8aSnia				        s1);
9060bbfda8aSnia			}
9070bbfda8aSnia			else {
9080bbfda8aSnia				Scr->RandomPlacement = rp;
9090bbfda8aSnia			}
9100bbfda8aSnia
9110bbfda8aSnia			/* If no geom, we're done */
9120bbfda8aSnia			if(s2 == NULL) {
9130bbfda8aSnia				return true;
9140bbfda8aSnia			}
9150bbfda8aSnia
9160bbfda8aSnia			/*
9170bbfda8aSnia			 * Figure what the geom means.  We actually don't care about
9180bbfda8aSnia			 * the size (it probably won't even be provided), so the
9190bbfda8aSnia			 * width/height are junk.  The X/Y offsets are what we need.
9200bbfda8aSnia			 * But we do need them.
9210bbfda8aSnia			 */
9220bbfda8aSnia			gmask = XParseGeometry(s2, &gx, &gy, &gjw, &gjh);
9230bbfda8aSnia#ifdef DEBUG
9240bbfda8aSnia			fprintf(stderr, "DEBUG:: Mask = %x, Width = %d, Height = %d\n",
9250bbfda8aSnia			        gmask, gjw, gjh);
9260bbfda8aSnia			fprintf(stderr, "DEBUG:: X = %d, Y = %d\n", gx, gy);
9270bbfda8aSnia#endif
9280bbfda8aSnia			if((gmask & exmask) != exmask) {
9290bbfda8aSnia				/* Didn't get X and Y */
9300bbfda8aSnia				twmrc_error_prefix();
9310bbfda8aSnia				fprintf(stderr,
9320bbfda8aSnia				        "ignoring invalid RandomPlacement displacement \"%s\"\n", s2);
9330bbfda8aSnia			}
9340bbfda8aSnia			else {
9350bbfda8aSnia				Scr->RandomDisplacementX = gx;
9360bbfda8aSnia				Scr->RandomDisplacementY = gy;
9370bbfda8aSnia			}
9380bbfda8aSnia
9390bbfda8aSnia			/* Done */
9400bbfda8aSnia			return true;
9410bbfda8aSnia		}
9420bbfda8aSnia	}
9430bbfda8aSnia	return false;
9440bbfda8aSnia}
9450bbfda8aSnia
9460bbfda8aSnia
9470bbfda8aSniabool
9480bbfda8aSniado_string_keyword(int keyword, char *s)
9490bbfda8aSnia{
9500bbfda8aSnia	switch(keyword) {
9510bbfda8aSnia		case kws_UsePPosition: {
9520bbfda8aSnia			int ppos = ParseUsePPosition(s);
9530bbfda8aSnia			if(ppos < 0) {
9540bbfda8aSnia				twmrc_error_prefix();
9550bbfda8aSnia				fprintf(stderr,
9560bbfda8aSnia				        "ignoring invalid UsePPosition argument \"%s\"\n", s);
9570bbfda8aSnia			}
9580bbfda8aSnia			else {
9590bbfda8aSnia				Scr->UsePPosition = ppos;
9600bbfda8aSnia			}
9610bbfda8aSnia			return true;
9620bbfda8aSnia		}
9630bbfda8aSnia
9640bbfda8aSnia		case kws_IconFont:
9650bbfda8aSnia			if(!Scr->HaveFonts) {
9660bbfda8aSnia				Scr->IconFont.basename = s;
9670bbfda8aSnia			}
9680bbfda8aSnia			return true;
9690bbfda8aSnia
9700bbfda8aSnia		case kws_ResizeFont:
9710bbfda8aSnia			if(!Scr->HaveFonts) {
9720bbfda8aSnia				Scr->SizeFont.basename = s;
9730bbfda8aSnia			}
9740bbfda8aSnia			return true;
9750bbfda8aSnia
9760bbfda8aSnia		case kws_MenuFont:
9770bbfda8aSnia			if(!Scr->HaveFonts) {
9780bbfda8aSnia				Scr->MenuFont.basename = s;
9790bbfda8aSnia			}
9800bbfda8aSnia			return true;
9810bbfda8aSnia
9820bbfda8aSnia		case kws_WorkSpaceFont:
9830bbfda8aSnia			if(!Scr->HaveFonts) {
9840bbfda8aSnia				Scr->workSpaceMgr.windowFont.basename = s;
9850bbfda8aSnia			}
9860bbfda8aSnia			return true;
9870bbfda8aSnia
9880bbfda8aSnia		case kws_TitleFont:
9890bbfda8aSnia			if(!Scr->HaveFonts) {
9900bbfda8aSnia				Scr->TitleBarFont.basename = s;
9910bbfda8aSnia			}
9920bbfda8aSnia			return true;
9930bbfda8aSnia
9940bbfda8aSnia		case kws_IconManagerFont:
9950bbfda8aSnia			if(!Scr->HaveFonts) {
9960bbfda8aSnia				Scr->IconManagerFont.basename = s;
9970bbfda8aSnia			}
9980bbfda8aSnia			return true;
9990bbfda8aSnia
10000bbfda8aSnia		case kws_UnknownIcon:
10010bbfda8aSnia			if(Scr->FirstTime) {
10020bbfda8aSnia				Scr->UnknownImage = GetImage(s, Scr->IconC);
10030bbfda8aSnia			}
10040bbfda8aSnia			return true;
10050bbfda8aSnia
10060bbfda8aSnia		case kws_IconDirectory:
10070bbfda8aSnia			if(Scr->FirstTime) {
10080bbfda8aSnia				Scr->IconDirectory = ExpandFilePath(s);
10090bbfda8aSnia			}
10100bbfda8aSnia			return true;
10110bbfda8aSnia
10120bbfda8aSnia		case kws_PixmapDirectory:
10130bbfda8aSnia			if(Scr->FirstTime) {
10140bbfda8aSnia				Scr->PixmapDirectory = ExpandFilePath(s);
10150bbfda8aSnia			}
10160bbfda8aSnia			return true;
10170bbfda8aSnia
10180bbfda8aSnia		case kws_MaxWindowSize: {
10190bbfda8aSnia			int gmask;
10200bbfda8aSnia			int exmask = (WidthValue | HeightValue);
10210bbfda8aSnia			unsigned int gw, gh; // Stuff we care about
10220bbfda8aSnia			int gjx, gjy;        // Stuff we don't
10230bbfda8aSnia
10240bbfda8aSnia			gmask = XParseGeometry(s, &gjx, &gjy, &gw, &gh);
10250bbfda8aSnia			if((gmask & exmask) != exmask) {
10260bbfda8aSnia				twmrc_error_prefix();
10270bbfda8aSnia				fprintf(stderr, "bad MaxWindowSize \"%s\"\n", s);
10280bbfda8aSnia				return false;
10290bbfda8aSnia			}
10300bbfda8aSnia			if(gw == 0 || gh == 0) {
10310bbfda8aSnia				twmrc_error_prefix();
10320bbfda8aSnia				fprintf(stderr, "MaxWindowSize \"%s\" must be non-zero\n", s);
10330bbfda8aSnia				return false;
10340bbfda8aSnia			}
10350bbfda8aSnia			Scr->MaxWindowWidth = gw;
10360bbfda8aSnia			Scr->MaxWindowHeight = gh;
10370bbfda8aSnia			return true;
10380bbfda8aSnia		}
10390bbfda8aSnia
10400bbfda8aSnia		case kws_IconJustification: {
10410bbfda8aSnia			int just = ParseTitleJustification(s);
10420bbfda8aSnia
10430bbfda8aSnia			if((just < 0) || (just == TJ_UNDEF)) {
10440bbfda8aSnia				twmrc_error_prefix();
10450bbfda8aSnia				fprintf(stderr,
10460bbfda8aSnia				        "ignoring invalid IconJustification argument \"%s\"\n", s);
10470bbfda8aSnia			}
10480bbfda8aSnia			else {
10490bbfda8aSnia				Scr->IconJustification = just;
10500bbfda8aSnia			}
10510bbfda8aSnia			return true;
10520bbfda8aSnia		}
10530bbfda8aSnia		case kws_IconRegionJustification: {
10540bbfda8aSnia			int just = ParseIRJustification(s);
10550bbfda8aSnia
10560bbfda8aSnia			if(just < 0 || (just == IRJ_UNDEF)) {
10570bbfda8aSnia				twmrc_error_prefix();
10580bbfda8aSnia				fprintf(stderr,
10590bbfda8aSnia				        "ignoring invalid IconRegionJustification argument \"%s\"\n", s);
10600bbfda8aSnia			}
10610bbfda8aSnia			else {
10620bbfda8aSnia				Scr->IconRegionJustification = just;
10630bbfda8aSnia			}
10640bbfda8aSnia			return true;
10650bbfda8aSnia		}
10660bbfda8aSnia		case kws_IconRegionAlignement: {
10670bbfda8aSnia			int just = ParseAlignement(s);
10680bbfda8aSnia
10690bbfda8aSnia			if(just < 0) {
10700bbfda8aSnia				twmrc_error_prefix();
10710bbfda8aSnia				fprintf(stderr,
10720bbfda8aSnia				        "ignoring invalid IconRegionAlignement argument \"%s\"\n", s);
10730bbfda8aSnia			}
10740bbfda8aSnia			else {
10750bbfda8aSnia				Scr->IconRegionAlignement = just;
10760bbfda8aSnia			}
10770bbfda8aSnia			return true;
10780bbfda8aSnia		}
10790bbfda8aSnia
10800bbfda8aSnia		case kws_TitleJustification: {
10810bbfda8aSnia			int just = ParseTitleJustification(s);
10820bbfda8aSnia
10830bbfda8aSnia			if((just < 0) || (just == TJ_UNDEF)) {
10840bbfda8aSnia				twmrc_error_prefix();
10850bbfda8aSnia				fprintf(stderr,
10860bbfda8aSnia				        "ignoring invalid TitleJustification argument \"%s\"\n", s);
10870bbfda8aSnia			}
10880bbfda8aSnia			else {
10890bbfda8aSnia				Scr->TitleJustification = just;
10900bbfda8aSnia			}
10910bbfda8aSnia			return true;
10920bbfda8aSnia		}
10930bbfda8aSnia		case kws_RplaySoundHost:
10940bbfda8aSnia		case kws_SoundHost:
10950bbfda8aSnia			if(Scr->FirstTime) {
10960bbfda8aSnia				/* Warning to be enabled in the future before removal */
10970bbfda8aSnia				if(0 && keyword == kws_SoundHost) {
10980bbfda8aSnia					twmrc_error_prefix();
10990bbfda8aSnia					fprintf(stderr, "SoundHost is deprecated, please "
11000bbfda8aSnia					        "use RplaySoundHost instead.\n");
11010bbfda8aSnia				}
11020bbfda8aSnia#ifdef SOUNDS
11030bbfda8aSnia				set_sound_host(s);
11040bbfda8aSnia#else
11050bbfda8aSnia				twmrc_error_prefix();
11060bbfda8aSnia				fprintf(stderr, "Ignoring %sSoundHost; rplay not ronfigured.\n",
11070bbfda8aSnia				        (keyword == kws_RplaySoundHost ? "Rplay" : ""));
11080bbfda8aSnia#endif
11090bbfda8aSnia			}
11100bbfda8aSnia			return true;
11110bbfda8aSnia
11120bbfda8aSnia		case kws_WMgrButtonStyle: {
11130bbfda8aSnia			int style = ParseButtonStyle(s);
11140bbfda8aSnia
11150bbfda8aSnia			if(style < 0) {
11160bbfda8aSnia				twmrc_error_prefix();
11170bbfda8aSnia				fprintf(stderr,
11180bbfda8aSnia				        "ignoring invalid WMgrButtonStyle argument \"%s\"\n", s);
11190bbfda8aSnia			}
11200bbfda8aSnia			else {
11210bbfda8aSnia				Scr->workSpaceMgr.buttonStyle = style;
11220bbfda8aSnia			}
11230bbfda8aSnia			return true;
11240bbfda8aSnia		}
11250bbfda8aSnia
11260bbfda8aSnia		case kws_IconifyStyle: {
11270bbfda8aSnia			int style = ParseIconifyStyle(s);
11280bbfda8aSnia
11290bbfda8aSnia			if(style < 0) {
11300bbfda8aSnia				twmrc_error_prefix();
11310bbfda8aSnia				fprintf(stderr, "ignoring invalid IconifyStyle argument \"%s\"\n", s);
11320bbfda8aSnia			}
11330bbfda8aSnia			else {
11340bbfda8aSnia				Scr->IconifyStyle = style;
11350bbfda8aSnia			}
11360bbfda8aSnia			return true;
11370bbfda8aSnia		}
11380bbfda8aSnia
11390bbfda8aSnia#ifdef EWMH
11400bbfda8aSnia		case kws_IconSize:
11410bbfda8aSnia			if(sscanf(s, "%dx%d", &Scr->PreferredIconWidth,
11420bbfda8aSnia			                &Scr->PreferredIconHeight) == 2) {
11430bbfda8aSnia				/* ok */
11440bbfda8aSnia			}
11450bbfda8aSnia			else if(sscanf(s, "%d", &Scr->PreferredIconWidth) == 1) {
11460bbfda8aSnia				Scr->PreferredIconHeight = Scr->PreferredIconWidth;
11470bbfda8aSnia			}
11480bbfda8aSnia			else {
11490bbfda8aSnia				Scr->PreferredIconHeight = Scr->PreferredIconWidth = 48;
11500bbfda8aSnia			}
11510bbfda8aSnia			return true;
11520bbfda8aSnia#endif
11530bbfda8aSnia	}
11540bbfda8aSnia	return false;
11550bbfda8aSnia}
11560bbfda8aSnia
11570bbfda8aSnia
11580bbfda8aSniabool
11590bbfda8aSniado_number_keyword(int keyword, int num)
11600bbfda8aSnia{
11610bbfda8aSnia	switch(keyword) {
11620bbfda8aSnia		case kwn_ConstrainedMoveTime:
11630bbfda8aSnia			ConstrainedMoveTime = num;
11640bbfda8aSnia			return true;
11650bbfda8aSnia
11660bbfda8aSnia		case kwn_MoveDelta:
11670bbfda8aSnia			Scr->MoveDelta = num;
11680bbfda8aSnia			return true;
11690bbfda8aSnia
11700bbfda8aSnia		case kwn_MoveOffResistance:
11710bbfda8aSnia			Scr->MoveOffResistance = num;
11720bbfda8aSnia			return true;
11730bbfda8aSnia
11740bbfda8aSnia		case kwn_MovePackResistance:
11750bbfda8aSnia			if(num < 0) {
11760bbfda8aSnia				num = 20;
11770bbfda8aSnia			}
11780bbfda8aSnia			Scr->MovePackResistance = num;
11790bbfda8aSnia			return true;
11800bbfda8aSnia
11810bbfda8aSnia		case kwn_XMoveGrid:
11820bbfda8aSnia			if(num < 1) {
11830bbfda8aSnia				num = 1;
11840bbfda8aSnia			}
11850bbfda8aSnia			if(num > 100) {
11860bbfda8aSnia				num = 100;
11870bbfda8aSnia			}
11880bbfda8aSnia			Scr->XMoveGrid = num;
11890bbfda8aSnia			return true;
11900bbfda8aSnia
11910bbfda8aSnia		case kwn_YMoveGrid:
11920bbfda8aSnia			if(num < 1) {
11930bbfda8aSnia				num = 1;
11940bbfda8aSnia			}
11950bbfda8aSnia			if(num > 100) {
11960bbfda8aSnia				num = 100;
11970bbfda8aSnia			}
11980bbfda8aSnia			Scr->YMoveGrid = num;
11990bbfda8aSnia			return true;
12000bbfda8aSnia
12010bbfda8aSnia		case kwn_XorValue:
12020bbfda8aSnia			if(Scr->FirstTime) {
12030bbfda8aSnia				Scr->XORvalue = num;
12040bbfda8aSnia			}
12050bbfda8aSnia			return true;
12060bbfda8aSnia
12070bbfda8aSnia		case kwn_FramePadding:
12080bbfda8aSnia			if(Scr->FirstTime) {
12090bbfda8aSnia				Scr->FramePadding = num;
12100bbfda8aSnia			}
12110bbfda8aSnia			return true;
12120bbfda8aSnia
12130bbfda8aSnia		case kwn_TitlePadding:
12140bbfda8aSnia			if(Scr->FirstTime) {
12150bbfda8aSnia				Scr->TitlePadding = num;
12160bbfda8aSnia			}
12170bbfda8aSnia			return true;
12180bbfda8aSnia
12190bbfda8aSnia		case kwn_ButtonIndent:
12200bbfda8aSnia			if(Scr->FirstTime) {
12210bbfda8aSnia				Scr->ButtonIndent = num;
12220bbfda8aSnia			}
12230bbfda8aSnia			return true;
12240bbfda8aSnia
12250bbfda8aSnia		case kwn_ThreeDBorderWidth:
12260bbfda8aSnia			if(Scr->FirstTime) {
12270bbfda8aSnia				Scr->ThreeDBorderWidth = num;
12280bbfda8aSnia			}
12290bbfda8aSnia			return true;
12300bbfda8aSnia
12310bbfda8aSnia		case kwn_BorderWidth:
12320bbfda8aSnia			if(Scr->FirstTime) {
12330bbfda8aSnia				Scr->BorderWidth = num;
12340bbfda8aSnia			}
12350bbfda8aSnia			return true;
12360bbfda8aSnia
12370bbfda8aSnia		case kwn_IconBorderWidth:
12380bbfda8aSnia			if(Scr->FirstTime) {
12390bbfda8aSnia				Scr->IconBorderWidth = num;
12400bbfda8aSnia			}
12410bbfda8aSnia			return true;
12420bbfda8aSnia
12430bbfda8aSnia		case kwn_TitleButtonBorderWidth:
12440bbfda8aSnia			if(Scr->FirstTime) {
12450bbfda8aSnia				Scr->TBInfo.border = num;
12460bbfda8aSnia			}
12470bbfda8aSnia			return true;
12480bbfda8aSnia
12490bbfda8aSnia		case kwn_RaiseDelay:
12500bbfda8aSnia			RaiseDelay = num;
12510bbfda8aSnia			return true;
12520bbfda8aSnia
12530bbfda8aSnia		case kwn_TransientOnTop:
12540bbfda8aSnia			if(Scr->FirstTime) {
12550bbfda8aSnia				Scr->TransientOnTop = num;
12560bbfda8aSnia			}
12570bbfda8aSnia			return true;
12580bbfda8aSnia
12590bbfda8aSnia		case kwn_OpaqueMoveThreshold:
12600bbfda8aSnia			if(Scr->FirstTime) {
12610bbfda8aSnia				Scr->OpaqueMoveThreshold = num;
12620bbfda8aSnia			}
12630bbfda8aSnia			return true;
12640bbfda8aSnia
12650bbfda8aSnia		case kwn_OpaqueResizeThreshold:
12660bbfda8aSnia			if(Scr->FirstTime) {
12670bbfda8aSnia				Scr->OpaqueResizeThreshold = num;
12680bbfda8aSnia			}
12690bbfda8aSnia			return true;
12700bbfda8aSnia
12710bbfda8aSnia		case kwn_WMgrVertButtonIndent:
12720bbfda8aSnia			if(Scr->FirstTime) {
12730bbfda8aSnia				Scr->WMgrVertButtonIndent = num;
12740bbfda8aSnia			}
12750bbfda8aSnia			if(Scr->WMgrVertButtonIndent < 0) {
12760bbfda8aSnia				Scr->WMgrVertButtonIndent = 0;
12770bbfda8aSnia			}
12780bbfda8aSnia			Scr->workSpaceMgr.vspace = Scr->WMgrVertButtonIndent;
12790bbfda8aSnia			Scr->workSpaceMgr.occupyWindow->vspace = Scr->WMgrVertButtonIndent;
12800bbfda8aSnia			return true;
12810bbfda8aSnia
12820bbfda8aSnia		case kwn_WMgrHorizButtonIndent:
12830bbfda8aSnia			if(Scr->FirstTime) {
12840bbfda8aSnia				Scr->WMgrHorizButtonIndent = num;
12850bbfda8aSnia			}
12860bbfda8aSnia			if(Scr->WMgrHorizButtonIndent < 0) {
12870bbfda8aSnia				Scr->WMgrHorizButtonIndent = 0;
12880bbfda8aSnia			}
12890bbfda8aSnia			Scr->workSpaceMgr.hspace = Scr->WMgrHorizButtonIndent;
12900bbfda8aSnia			Scr->workSpaceMgr.occupyWindow->hspace = Scr->WMgrHorizButtonIndent;
12910bbfda8aSnia			return true;
12920bbfda8aSnia
12930bbfda8aSnia		case kwn_WMgrButtonShadowDepth:
12940bbfda8aSnia			if(Scr->FirstTime) {
12950bbfda8aSnia				Scr->WMgrButtonShadowDepth = num;
12960bbfda8aSnia			}
12970bbfda8aSnia			if(Scr->WMgrButtonShadowDepth < 1) {
12980bbfda8aSnia				Scr->WMgrButtonShadowDepth = 1;
12990bbfda8aSnia			}
13000bbfda8aSnia			return true;
13010bbfda8aSnia
13020bbfda8aSnia		case kwn_MaxIconTitleWidth:
13030bbfda8aSnia			if(Scr->FirstTime) {
13040bbfda8aSnia				Scr->MaxIconTitleWidth = num;
13050bbfda8aSnia			}
13060bbfda8aSnia			return true;
13070bbfda8aSnia
13080bbfda8aSnia		case kwn_ClearShadowContrast:
13090bbfda8aSnia			if(Scr->FirstTime) {
13100bbfda8aSnia				Scr->ClearShadowContrast = num;
13110bbfda8aSnia			}
13120bbfda8aSnia			if(Scr->ClearShadowContrast < 0) {
13130bbfda8aSnia				Scr->ClearShadowContrast = 0;
13140bbfda8aSnia			}
13150bbfda8aSnia			if(Scr->ClearShadowContrast > 100) {
13160bbfda8aSnia				Scr->ClearShadowContrast = 100;
13170bbfda8aSnia			}
13180bbfda8aSnia			return true;
13190bbfda8aSnia
13200bbfda8aSnia		case kwn_DarkShadowContrast:
13210bbfda8aSnia			if(Scr->FirstTime) {
13220bbfda8aSnia				Scr->DarkShadowContrast = num;
13230bbfda8aSnia			}
13240bbfda8aSnia			if(Scr->DarkShadowContrast < 0) {
13250bbfda8aSnia				Scr->DarkShadowContrast = 0;
13260bbfda8aSnia			}
13270bbfda8aSnia			if(Scr->DarkShadowContrast > 100) {
13280bbfda8aSnia				Scr->DarkShadowContrast = 100;
13290bbfda8aSnia			}
13300bbfda8aSnia			return true;
13310bbfda8aSnia
13320bbfda8aSnia		case kwn_AnimationSpeed:
13330bbfda8aSnia			if(num < 0) {
13340bbfda8aSnia				num = 0;
13350bbfda8aSnia			}
13360bbfda8aSnia			SetAnimationSpeed(num);
13370bbfda8aSnia			return true;
13380bbfda8aSnia
13390bbfda8aSnia		case kwn_BorderShadowDepth:
13400bbfda8aSnia			if(Scr->FirstTime) {
13410bbfda8aSnia				Scr->BorderShadowDepth = num;
13420bbfda8aSnia			}
13430bbfda8aSnia			if(Scr->BorderShadowDepth < 0) {
13440bbfda8aSnia				Scr->BorderShadowDepth = 2;
13450bbfda8aSnia			}
13460bbfda8aSnia			return true;
13470bbfda8aSnia
13480bbfda8aSnia		case kwn_BorderLeft:
13490bbfda8aSnia			if(Scr->FirstTime) {
13500bbfda8aSnia				Scr->BorderLeft = num;
13510bbfda8aSnia			}
13520bbfda8aSnia			if(Scr->BorderLeft < 0) {
13530bbfda8aSnia				Scr->BorderLeft = 0;
13540bbfda8aSnia			}
13550bbfda8aSnia			return true;
13560bbfda8aSnia
13570bbfda8aSnia		case kwn_BorderRight:
13580bbfda8aSnia			if(Scr->FirstTime) {
13590bbfda8aSnia				Scr->BorderRight = num;
13600bbfda8aSnia			}
13610bbfda8aSnia			if(Scr->BorderRight < 0) {
13620bbfda8aSnia				Scr->BorderRight = 0;
13630bbfda8aSnia			}
13640bbfda8aSnia			return true;
13650bbfda8aSnia
13660bbfda8aSnia		case kwn_BorderTop:
13670bbfda8aSnia			if(Scr->FirstTime) {
13680bbfda8aSnia				Scr->BorderTop = num;
13690bbfda8aSnia			}
13700bbfda8aSnia			if(Scr->BorderTop < 0) {
13710bbfda8aSnia				Scr->BorderTop = 0;
13720bbfda8aSnia			}
13730bbfda8aSnia			return true;
13740bbfda8aSnia
13750bbfda8aSnia		case kwn_BorderBottom:
13760bbfda8aSnia			if(Scr->FirstTime) {
13770bbfda8aSnia				Scr->BorderBottom = num;
13780bbfda8aSnia			}
13790bbfda8aSnia			if(Scr->BorderBottom < 0) {
13800bbfda8aSnia				Scr->BorderBottom = 0;
13810bbfda8aSnia			}
13820bbfda8aSnia			return true;
13830bbfda8aSnia
13840bbfda8aSnia		case kwn_TitleButtonShadowDepth:
13850bbfda8aSnia			if(Scr->FirstTime) {
13860bbfda8aSnia				Scr->TitleButtonShadowDepth = num;
13870bbfda8aSnia			}
13880bbfda8aSnia			if(Scr->TitleButtonShadowDepth < 0) {
13890bbfda8aSnia				Scr->TitleButtonShadowDepth = 2;
13900bbfda8aSnia			}
13910bbfda8aSnia			return true;
13920bbfda8aSnia
13930bbfda8aSnia		case kwn_TitleShadowDepth:
13940bbfda8aSnia			if(Scr->FirstTime) {
13950bbfda8aSnia				Scr->TitleShadowDepth = num;
13960bbfda8aSnia			}
13970bbfda8aSnia			if(Scr->TitleShadowDepth < 0) {
13980bbfda8aSnia				Scr->TitleShadowDepth = 2;
13990bbfda8aSnia			}
14000bbfda8aSnia			return true;
14010bbfda8aSnia
14020bbfda8aSnia		case kwn_IconManagerShadowDepth:
14030bbfda8aSnia			if(Scr->FirstTime) {
14040bbfda8aSnia				Scr->IconManagerShadowDepth = num;
14050bbfda8aSnia			}
14060bbfda8aSnia			if(Scr->IconManagerShadowDepth < 0) {
14070bbfda8aSnia				Scr->IconManagerShadowDepth = 2;
14080bbfda8aSnia			}
14090bbfda8aSnia			return true;
14100bbfda8aSnia
14110bbfda8aSnia		case kwn_MenuShadowDepth:
14120bbfda8aSnia			if(Scr->FirstTime) {
14130bbfda8aSnia				Scr->MenuShadowDepth = num;
14140bbfda8aSnia			}
14150bbfda8aSnia			if(Scr->MenuShadowDepth < 0) {
14160bbfda8aSnia				Scr->MenuShadowDepth = 2;
14170bbfda8aSnia			}
14180bbfda8aSnia			return true;
14190bbfda8aSnia
14200bbfda8aSnia		case kwn_OpenWindowTimeout:
14210bbfda8aSnia			if(Scr->FirstTime) {
14220bbfda8aSnia				Scr->OpenWindowTimeout = num;
14230bbfda8aSnia			}
14240bbfda8aSnia			if(Scr->OpenWindowTimeout < 0) {
14250bbfda8aSnia				Scr->OpenWindowTimeout = 0;
14260bbfda8aSnia			}
14270bbfda8aSnia			return true;
14280bbfda8aSnia
14290bbfda8aSnia		case kwn_RaiseOnClickButton:
14300bbfda8aSnia			if(Scr->FirstTime) {
14310bbfda8aSnia				Scr->RaiseOnClickButton = num;
14320bbfda8aSnia			}
14330bbfda8aSnia			if(Scr->RaiseOnClickButton < 1) {
14340bbfda8aSnia				Scr->RaiseOnClickButton = 1;
14350bbfda8aSnia			}
14360bbfda8aSnia			if(Scr->RaiseOnClickButton > MAX_BUTTONS) {
14370bbfda8aSnia				Scr->RaiseOnClickButton = MAX_BUTTONS;
14380bbfda8aSnia			}
14390bbfda8aSnia			return true;
14400bbfda8aSnia
14410bbfda8aSnia
14420bbfda8aSnia	}
14430bbfda8aSnia
14440bbfda8aSnia	return false;
14450bbfda8aSnia}
14460bbfda8aSnia
14470bbfda8aSnianame_list **
14480bbfda8aSniado_colorlist_keyword(int keyword, int colormode, char *s)
14490bbfda8aSnia{
14500bbfda8aSnia	switch(keyword) {
14510bbfda8aSnia		case kwcl_BorderColor:
14520bbfda8aSnia			GetColor(colormode, &Scr->BorderColorC.back, s);
14530bbfda8aSnia			return &Scr->BorderColorL;
14540bbfda8aSnia
14550bbfda8aSnia		case kwcl_IconManagerHighlight:
14560bbfda8aSnia			GetColor(colormode, &Scr->IconManagerHighlight, s);
14570bbfda8aSnia			return &Scr->IconManagerHighlightL;
14580bbfda8aSnia
14590bbfda8aSnia		case kwcl_BorderTileForeground:
14600bbfda8aSnia			GetColor(colormode, &Scr->BorderTileC.fore, s);
14610bbfda8aSnia			return &Scr->BorderTileForegroundL;
14620bbfda8aSnia
14630bbfda8aSnia		case kwcl_BorderTileBackground:
14640bbfda8aSnia			GetColor(colormode, &Scr->BorderTileC.back, s);
14650bbfda8aSnia			return &Scr->BorderTileBackgroundL;
14660bbfda8aSnia
14670bbfda8aSnia		case kwcl_TitleForeground:
14680bbfda8aSnia			GetColor(colormode, &Scr->TitleC.fore, s);
14690bbfda8aSnia			return &Scr->TitleForegroundL;
14700bbfda8aSnia
14710bbfda8aSnia		case kwcl_TitleBackground:
14720bbfda8aSnia			GetColor(colormode, &Scr->TitleC.back, s);
14730bbfda8aSnia			return &Scr->TitleBackgroundL;
14740bbfda8aSnia
14750bbfda8aSnia		case kwcl_IconForeground:
14760bbfda8aSnia			GetColor(colormode, &Scr->IconC.fore, s);
14770bbfda8aSnia			return &Scr->IconForegroundL;
14780bbfda8aSnia
14790bbfda8aSnia		case kwcl_IconBackground:
14800bbfda8aSnia			GetColor(colormode, &Scr->IconC.back, s);
14810bbfda8aSnia			return &Scr->IconBackgroundL;
14820bbfda8aSnia
14830bbfda8aSnia		case kwcl_IconBorderColor:
14840bbfda8aSnia			GetColor(colormode, &Scr->IconBorderColor, s);
14850bbfda8aSnia			return &Scr->IconBorderColorL;
14860bbfda8aSnia
14870bbfda8aSnia		case kwcl_IconManagerForeground:
14880bbfda8aSnia			GetColor(colormode, &Scr->IconManagerC.fore, s);
14890bbfda8aSnia			return &Scr->IconManagerFL;
14900bbfda8aSnia
14910bbfda8aSnia		case kwcl_IconManagerBackground:
14920bbfda8aSnia			GetColor(colormode, &Scr->IconManagerC.back, s);
14930bbfda8aSnia			return &Scr->IconManagerBL;
14940bbfda8aSnia
14950bbfda8aSnia		case kwcl_MapWindowBackground:
14960bbfda8aSnia			GetColor(colormode, &Scr->workSpaceMgr.windowcp.back, s);
14970bbfda8aSnia			Scr->workSpaceMgr.windowcpgiven = true;
14980bbfda8aSnia			return &Scr->workSpaceMgr.windowBackgroundL;
14990bbfda8aSnia
15000bbfda8aSnia		case kwcl_MapWindowForeground:
15010bbfda8aSnia			GetColor(colormode, &Scr->workSpaceMgr.windowcp.fore, s);
15020bbfda8aSnia			Scr->workSpaceMgr.windowcpgiven = true;
15030bbfda8aSnia			return &Scr->workSpaceMgr.windowForegroundL;
15040bbfda8aSnia	}
15050bbfda8aSnia	return NULL;
15060bbfda8aSnia}
15070bbfda8aSnia
15080bbfda8aSniabool
15090bbfda8aSniado_color_keyword(int keyword, int colormode, char *s)
15100bbfda8aSnia{
15110bbfda8aSnia	switch(keyword) {
15120bbfda8aSnia		case kwc_DefaultForeground:
15130bbfda8aSnia			GetColor(colormode, &Scr->DefaultC.fore, s);
15140bbfda8aSnia			return true;
15150bbfda8aSnia
15160bbfda8aSnia		case kwc_DefaultBackground:
15170bbfda8aSnia			GetColor(colormode, &Scr->DefaultC.back, s);
15180bbfda8aSnia			return true;
15190bbfda8aSnia
15200bbfda8aSnia		case kwc_MenuForeground:
15210bbfda8aSnia			GetColor(colormode, &Scr->MenuC.fore, s);
15220bbfda8aSnia			return true;
15230bbfda8aSnia
15240bbfda8aSnia		case kwc_MenuBackground:
15250bbfda8aSnia			GetColor(colormode, &Scr->MenuC.back, s);
15260bbfda8aSnia			return true;
15270bbfda8aSnia
15280bbfda8aSnia		case kwc_MenuTitleForeground:
15290bbfda8aSnia			GetColor(colormode, &Scr->MenuTitleC.fore, s);
15300bbfda8aSnia			return true;
15310bbfda8aSnia
15320bbfda8aSnia		case kwc_MenuTitleBackground:
15330bbfda8aSnia			GetColor(colormode, &Scr->MenuTitleC.back, s);
15340bbfda8aSnia			return true;
15350bbfda8aSnia
15360bbfda8aSnia		case kwc_MenuShadowColor:
15370bbfda8aSnia			GetColor(colormode, &Scr->MenuShadowColor, s);
15380bbfda8aSnia			return true;
15390bbfda8aSnia
15400bbfda8aSnia	}
15410bbfda8aSnia
15420bbfda8aSnia	return false;
15430bbfda8aSnia}
15440bbfda8aSnia
15450bbfda8aSnia/*
15460bbfda8aSnia * put_pixel_on_root() Save a pixel value in twm root window color property.
15470bbfda8aSnia */
15480bbfda8aSniastatic void
15490bbfda8aSniaput_pixel_on_root(Pixel pixel)
15500bbfda8aSnia{
15510bbfda8aSnia	int           i, addPixel = 1;
15520bbfda8aSnia	Atom          retAtom;
15530bbfda8aSnia	int           retFormat;
15540bbfda8aSnia	unsigned long nPixels, retAfter;
15550bbfda8aSnia	Pixel        *retProp;
15560bbfda8aSnia
15570bbfda8aSnia	if(XGetWindowProperty(dpy, Scr->Root, XA__MIT_PRIORITY_COLORS, 0, 8192,
15580bbfda8aSnia	                      False, XA_CARDINAL, &retAtom,
15590bbfda8aSnia	                      &retFormat, &nPixels, &retAfter,
15600bbfda8aSnia	                      (unsigned char **)&retProp) != Success || !retProp) {
15610bbfda8aSnia		return;
15620bbfda8aSnia	}
15630bbfda8aSnia
15640bbfda8aSnia	for(i = 0; i < nPixels; i++)
15650bbfda8aSnia		if(pixel == retProp[i]) {
15660bbfda8aSnia			addPixel = 0;
15670bbfda8aSnia		}
15680bbfda8aSnia
15690bbfda8aSnia	XFree(retProp);
15700bbfda8aSnia
15710bbfda8aSnia	if(addPixel)
15720bbfda8aSnia		XChangeProperty(dpy, Scr->Root, XA__MIT_PRIORITY_COLORS,
15730bbfda8aSnia		                XA_CARDINAL, 32, PropModeAppend,
15740bbfda8aSnia		                (unsigned char *)&pixel, 1);
15750bbfda8aSnia}
15760bbfda8aSnia
15770bbfda8aSnia/*
15780bbfda8aSnia * do_string_savecolor() save a color from a string in the twmrc file.
15790bbfda8aSnia */
15800bbfda8aSniavoid
15810bbfda8aSniado_string_savecolor(int colormode, char *s)
15820bbfda8aSnia{
15830bbfda8aSnia	Pixel p;
15840bbfda8aSnia	GetColor(colormode, &p, s);
15850bbfda8aSnia	put_pixel_on_root(p);
15860bbfda8aSnia	return;
15870bbfda8aSnia}
15880bbfda8aSnia
15890bbfda8aSnia/*
15900bbfda8aSnia * do_var_savecolor() save a color from a var in the twmrc file.
15910bbfda8aSnia */
15920bbfda8aSniatypedef struct _cnode {
15930bbfda8aSnia	int i;
15940bbfda8aSnia	struct _cnode *next;
15950bbfda8aSnia} Cnode, *Cptr;
15960bbfda8aSniastatic Cptr chead = NULL;
15970bbfda8aSnia
15980bbfda8aSniavoid
15990bbfda8aSniado_var_savecolor(int key)
16000bbfda8aSnia{
16010bbfda8aSnia	Cptr cptrav, cpnew;
16020bbfda8aSnia	if(!chead) {
16030bbfda8aSnia		chead = malloc(sizeof(Cnode));
16040bbfda8aSnia		chead->i = key;
16050bbfda8aSnia		chead->next = NULL;
16060bbfda8aSnia	}
16070bbfda8aSnia	else {
16080bbfda8aSnia		cptrav = chead;
16090bbfda8aSnia		while(cptrav->next != NULL) {
16100bbfda8aSnia			cptrav = cptrav->next;
16110bbfda8aSnia		}
16120bbfda8aSnia		cpnew = malloc(sizeof(Cnode));
16130bbfda8aSnia		cpnew->i = key;
16140bbfda8aSnia		cpnew->next = NULL;
16150bbfda8aSnia		cptrav->next = cpnew;
16160bbfda8aSnia	}
16170bbfda8aSnia	return;
16180bbfda8aSnia}
16190bbfda8aSnia
16200bbfda8aSnia/*
16210bbfda8aSnia * assign_var_savecolor() traverse the var save color list placeing the pixels
16220bbfda8aSnia *                        in the root window property.
16230bbfda8aSnia */
16240bbfda8aSniavoid
16250bbfda8aSniaassign_var_savecolor(void)
16260bbfda8aSnia{
16270bbfda8aSnia	Cptr cp = chead;
16280bbfda8aSnia	while(cp != NULL) {
16290bbfda8aSnia		switch(cp->i) {
16300bbfda8aSnia			case kwcl_BorderColor:
16310bbfda8aSnia				put_pixel_on_root(Scr->BorderColorC.back);
16320bbfda8aSnia				break;
16330bbfda8aSnia			case kwcl_IconManagerHighlight:
16340bbfda8aSnia				put_pixel_on_root(Scr->IconManagerHighlight);
16350bbfda8aSnia				break;
16360bbfda8aSnia			case kwcl_BorderTileForeground:
16370bbfda8aSnia				put_pixel_on_root(Scr->BorderTileC.fore);
16380bbfda8aSnia				break;
16390bbfda8aSnia			case kwcl_BorderTileBackground:
16400bbfda8aSnia				put_pixel_on_root(Scr->BorderTileC.back);
16410bbfda8aSnia				break;
16420bbfda8aSnia			case kwcl_TitleForeground:
16430bbfda8aSnia				put_pixel_on_root(Scr->TitleC.fore);
16440bbfda8aSnia				break;
16450bbfda8aSnia			case kwcl_TitleBackground:
16460bbfda8aSnia				put_pixel_on_root(Scr->TitleC.back);
16470bbfda8aSnia				break;
16480bbfda8aSnia			case kwcl_IconForeground:
16490bbfda8aSnia				put_pixel_on_root(Scr->IconC.fore);
16500bbfda8aSnia				break;
16510bbfda8aSnia			case kwcl_IconBackground:
16520bbfda8aSnia				put_pixel_on_root(Scr->IconC.back);
16530bbfda8aSnia				break;
16540bbfda8aSnia			case kwcl_IconBorderColor:
16550bbfda8aSnia				put_pixel_on_root(Scr->IconBorderColor);
16560bbfda8aSnia				break;
16570bbfda8aSnia			case kwcl_IconManagerForeground:
16580bbfda8aSnia				put_pixel_on_root(Scr->IconManagerC.fore);
16590bbfda8aSnia				break;
16600bbfda8aSnia			case kwcl_IconManagerBackground:
16610bbfda8aSnia				put_pixel_on_root(Scr->IconManagerC.back);
16620bbfda8aSnia				break;
16630bbfda8aSnia			case kwcl_MapWindowForeground:
16640bbfda8aSnia				put_pixel_on_root(Scr->workSpaceMgr.windowcp.fore);
16650bbfda8aSnia				break;
16660bbfda8aSnia			case kwcl_MapWindowBackground:
16670bbfda8aSnia				put_pixel_on_root(Scr->workSpaceMgr.windowcp.back);
16680bbfda8aSnia				break;
16690bbfda8aSnia		}
16700bbfda8aSnia		cp = cp->next;
16710bbfda8aSnia	}
16720bbfda8aSnia	if(chead) {
16730bbfda8aSnia		free(chead);
16740bbfda8aSnia		chead = NULL;
16750bbfda8aSnia	}
16760bbfda8aSnia}
16770bbfda8aSnia
16780bbfda8aSnia
16790bbfda8aSnia/*
16800bbfda8aSnia * RandomPlacement [...] parse
16810bbfda8aSnia */
16820bbfda8aSniastatic int
16830bbfda8aSniaParseRandomPlacement(const char *s)
16840bbfda8aSnia{
16850bbfda8aSnia	/* No first arg -> 'all' */
16860bbfda8aSnia	if(s == NULL) {
16870bbfda8aSnia		return RP_ALL;
16880bbfda8aSnia	}
16890bbfda8aSnia	if(strlen(s) == 0) {
16900bbfda8aSnia		return RP_ALL;
16910bbfda8aSnia	}
16920bbfda8aSnia
16930bbfda8aSnia#define CHK(str, ret) if(strcasecmp(s, str) == 0) { return RP_##ret; }
16940bbfda8aSnia	CHK(DEFSTRING,  ALL);
16950bbfda8aSnia	CHK("on",       ALL);
16960bbfda8aSnia	CHK("all",      ALL);
16970bbfda8aSnia	CHK("off",      OFF);
16980bbfda8aSnia	CHK("unmapped", UNMAPPED);
16990bbfda8aSnia#undef CHK
17000bbfda8aSnia
17010bbfda8aSnia	return -1;
17020bbfda8aSnia}
17030bbfda8aSnia
17040bbfda8aSnia
17050bbfda8aSnia/*
17060bbfda8aSnia * Parse out IconRegionJustification string.
17070bbfda8aSnia *
17080bbfda8aSnia * X-ref comment on ParseAlignement about return value.
17090bbfda8aSnia */
17100bbfda8aSniaint
17110bbfda8aSniaParseIRJustification(const char *s)
17120bbfda8aSnia{
17130bbfda8aSnia	if(strlen(s) == 0) {
17140bbfda8aSnia		return -1;
17150bbfda8aSnia	}
17160bbfda8aSnia
17170bbfda8aSnia#define CHK(str, ret) if(strcasecmp(s, str) == 0) { return IRJ_##ret; }
17180bbfda8aSnia	CHK(DEFSTRING, CENTER);
17190bbfda8aSnia	CHK("undef",   UNDEF);
17200bbfda8aSnia	CHK("left",    LEFT);
17210bbfda8aSnia	CHK("center",  CENTER);
17220bbfda8aSnia	CHK("right",   RIGHT);
17230bbfda8aSnia	CHK("border",  BORDER);
17240bbfda8aSnia#undef CHK
17250bbfda8aSnia
17260bbfda8aSnia	return -1;
17270bbfda8aSnia}
17280bbfda8aSnia
17290bbfda8aSnia
17300bbfda8aSnia/*
17310bbfda8aSnia * Parse out string for title justification.  From TitleJustification,
17320bbfda8aSnia * IconJustification, iconjust arg to IconRegion.
17330bbfda8aSnia *
17340bbfda8aSnia * X-ref comment on ParseAlignement about return value.
17350bbfda8aSnia */
17360bbfda8aSniaint
17370bbfda8aSniaParseTitleJustification(const char *s)
17380bbfda8aSnia{
17390bbfda8aSnia	if(strlen(s) == 0) {
17400bbfda8aSnia		return -1;
17410bbfda8aSnia	}
17420bbfda8aSnia
17430bbfda8aSnia#define CHK(str, ret) if(strcasecmp(s, str) == 0) { return TJ_##ret; }
17440bbfda8aSnia	/* XXX Different uses really have different defaults... */
17450bbfda8aSnia	CHK(DEFSTRING, CENTER);
17460bbfda8aSnia	CHK("undef",   UNDEF);
17470bbfda8aSnia	CHK("left",    LEFT);
17480bbfda8aSnia	CHK("center",  CENTER);
17490bbfda8aSnia	CHK("right",   RIGHT);
17500bbfda8aSnia#undef CHK
17510bbfda8aSnia
17520bbfda8aSnia	return -1;
17530bbfda8aSnia}
17540bbfda8aSnia
17550bbfda8aSnia
17560bbfda8aSnia/*
17570bbfda8aSnia * Parse out the string specifier for IconRegion Alignement[sic].
17580bbfda8aSnia * Strictly speaking, this [almost always] returns an IRAlignement enum
17590bbfda8aSnia * value.  However, it's specified as int to allow the -1 return for
17600bbfda8aSnia * invalid values.  enum's start numbering from 0 (unless specific values
17610bbfda8aSnia * are given), so that's a safe out-of-bounds value.  And making an
17620bbfda8aSnia * IRA_INVALID value would just add unnecessary complication, since
17630bbfda8aSnia * during parsing is the only time it makes sense.
17640bbfda8aSnia */
17650bbfda8aSniaint
17660bbfda8aSniaParseAlignement(const char *s)
17670bbfda8aSnia{
17680bbfda8aSnia	if(strlen(s) == 0) {
17690bbfda8aSnia		return -1;
17700bbfda8aSnia	}
17710bbfda8aSnia
17720bbfda8aSnia#define CHK(str, ret) if(strcasecmp(s, str) == 0) { return IRA_##ret; }
17730bbfda8aSnia	CHK(DEFSTRING, CENTER);
17740bbfda8aSnia	CHK("center",  CENTER);
17750bbfda8aSnia	CHK("top",     TOP);
17760bbfda8aSnia	CHK("bottom",  BOTTOM);
17770bbfda8aSnia	CHK("border",  BORDER);
17780bbfda8aSnia	CHK("undef",   UNDEF);
17790bbfda8aSnia#undef CHK
17800bbfda8aSnia
17810bbfda8aSnia	return -1;
17820bbfda8aSnia}
17830bbfda8aSnia
17840bbfda8aSniastatic int
17850bbfda8aSniaParseUsePPosition(const char *s)
17860bbfda8aSnia{
17870bbfda8aSnia	if(strlen(s) == 0) {
17880bbfda8aSnia		return -1;
17890bbfda8aSnia	}
17900bbfda8aSnia
17910bbfda8aSnia#define CHK(str, ret) if(strcasecmp(s, str) == 0) { return PPOS_##ret; }
17920bbfda8aSnia	CHK(DEFSTRING,  OFF);
17930bbfda8aSnia	CHK("off",      OFF);
17940bbfda8aSnia	CHK("on",       ON);
17950bbfda8aSnia	CHK("non-zero", NON_ZERO);
17960bbfda8aSnia	CHK("nonzero",  NON_ZERO);
17970bbfda8aSnia#undef CHK
17980bbfda8aSnia
17990bbfda8aSnia	return -1;
18000bbfda8aSnia}
18010bbfda8aSnia
18020bbfda8aSniastatic int
18030bbfda8aSniaParseButtonStyle(const char *s)
18040bbfda8aSnia{
18050bbfda8aSnia	if(s == NULL || strlen(s) == 0) {
18060bbfda8aSnia		return -1;
18070bbfda8aSnia	}
18080bbfda8aSnia
18090bbfda8aSnia#define CHK(str, ret) if(strcasecmp(s, str) == 0) { return STYLE_##ret; }
18100bbfda8aSnia	CHK(DEFSTRING, NORMAL);
18110bbfda8aSnia	CHK("normal",  NORMAL);
18120bbfda8aSnia	CHK("style1",  STYLE1);
18130bbfda8aSnia	CHK("style2",  STYLE2);
18140bbfda8aSnia	CHK("style3",  STYLE3);
18150bbfda8aSnia#undef CHK
18160bbfda8aSnia
18170bbfda8aSnia	return -1;
18180bbfda8aSnia}
18190bbfda8aSnia
18200bbfda8aSniastatic int
18210bbfda8aSniaParseIconifyStyle(const char *s)
18220bbfda8aSnia{
18230bbfda8aSnia	if(s == NULL || strlen(s) == 0) {
18240bbfda8aSnia		return -1;
18250bbfda8aSnia	}
18260bbfda8aSnia
18270bbfda8aSnia#define CHK(str, ret) if(strcasecmp(s, str) == 0) { return ICONIFY_##ret; }
18280bbfda8aSnia	CHK(DEFSTRING, NORMAL);
18290bbfda8aSnia	CHK("normal",  NORMAL);
18300bbfda8aSnia	CHK("mosaic",  MOSAIC);
18310bbfda8aSnia	CHK("zoomin",  ZOOMIN);
18320bbfda8aSnia	CHK("zoomout", ZOOMOUT);
18330bbfda8aSnia	CHK("fade",    FADE);
18340bbfda8aSnia	CHK("sweep",   SWEEP);
18350bbfda8aSnia#undef CHK
18360bbfda8aSnia
18370bbfda8aSnia	return -1;
18380bbfda8aSnia}
18390bbfda8aSnia
18400bbfda8aSniavoid
18410bbfda8aSniado_squeeze_entry(name_list **slist, // squeeze or dont-squeeze list
18420bbfda8aSnia                 const char *name,  // window name
18430bbfda8aSnia                 SIJust justify,    // left, center, right
18440bbfda8aSnia                 int num,           // signed num
18450bbfda8aSnia                 int denom)         // 0 or indicates fraction denom
18460bbfda8aSnia{
18470bbfda8aSnia	int absnum = (num < 0 ? -num : num);
18480bbfda8aSnia
18490bbfda8aSnia	if(denom < 0) {
18500bbfda8aSnia		twmrc_error_prefix();
18510bbfda8aSnia		fprintf(stderr, "negative SqueezeTitle denominator %d\n", denom);
18520bbfda8aSnia		ParseError = true;
18530bbfda8aSnia		return;
18540bbfda8aSnia	}
18550bbfda8aSnia	if(absnum > denom && denom != 0) {
18560bbfda8aSnia		twmrc_error_prefix();
18570bbfda8aSnia		fprintf(stderr, "SqueezeTitle fraction %d/%d outside window\n",
18580bbfda8aSnia		        num, denom);
18590bbfda8aSnia		ParseError = true;
18600bbfda8aSnia		return;
18610bbfda8aSnia	}
18620bbfda8aSnia	/* Process the special cases from the manual here rather than
18630bbfda8aSnia	 * each time we calculate the position of the title bar
18640bbfda8aSnia	 * in ComputeTitleLocation().
18650bbfda8aSnia	 * In fact, it's better to get rid of them entirely, but we
18660bbfda8aSnia	 * probably should not do that for compatibility's sake.
18670bbfda8aSnia	 * By using a non-zero denominator the position will be relative.
18680bbfda8aSnia	 */
18690bbfda8aSnia	if(denom == 0 && num == 0) {
18700bbfda8aSnia		if(justify == SIJ_CENTER) {
18710bbfda8aSnia			num = 1;
18720bbfda8aSnia			denom = 2;
18730bbfda8aSnia		}
18740bbfda8aSnia		else if(justify == SIJ_RIGHT) {
18750bbfda8aSnia			num = 2;
18760bbfda8aSnia			denom = 2;
18770bbfda8aSnia		}
18780bbfda8aSnia		twmrc_error_prefix();
18790bbfda8aSnia		fprintf(stderr, "deprecated SqueezeTitle faction 0/0, assuming %d/%d\n",
18800bbfda8aSnia		        num, denom);
18810bbfda8aSnia	}
18820bbfda8aSnia
18830bbfda8aSnia	if(HasShape) {
18840bbfda8aSnia		SqueezeInfo *sinfo;
18850bbfda8aSnia		sinfo = malloc(sizeof(SqueezeInfo));
18860bbfda8aSnia
18870bbfda8aSnia		if(!sinfo) {
18880bbfda8aSnia			twmrc_error_prefix();
18890bbfda8aSnia			fprintf(stderr, "unable to allocate %lu bytes for squeeze info\n",
18900bbfda8aSnia			        (unsigned long) sizeof(SqueezeInfo));
18910bbfda8aSnia			ParseError = true;
18920bbfda8aSnia			return;
18930bbfda8aSnia		}
18940bbfda8aSnia		sinfo->justify = justify;
18950bbfda8aSnia		sinfo->num = num;
18960bbfda8aSnia		sinfo->denom = denom;
18970bbfda8aSnia		AddToList(slist, name, sinfo);
18980bbfda8aSnia	}
18990bbfda8aSnia	return;
19000bbfda8aSnia}
19010bbfda8aSnia
19020bbfda8aSnia
19030bbfda8aSnia/*
19040bbfda8aSnia * Parsing for EWMHIgnore { } lists
19050bbfda8aSnia */
19060bbfda8aSniavoid
19070bbfda8aSniaproc_ewmh_ignore(void)
19080bbfda8aSnia{
19090bbfda8aSnia#ifndef EWMH
19100bbfda8aSnia	twmrc_error_prefix();
19110bbfda8aSnia	fprintf(stderr, "EWMH not enabled, EWMHIgnore { } ignored.\n");
19120bbfda8aSnia	ParseError = true;
19130bbfda8aSnia	return;
19140bbfda8aSnia#endif
19150bbfda8aSnia	/* else nada */
19160bbfda8aSnia	return;
19170bbfda8aSnia}
19180bbfda8aSniavoid
19190bbfda8aSniaadd_ewmh_ignore(char *s)
19200bbfda8aSnia{
19210bbfda8aSnia#ifndef EWMH
19220bbfda8aSnia	return;
19230bbfda8aSnia#else
19240bbfda8aSnia
19250bbfda8aSnia#define HANDLE(x) \
19260bbfda8aSnia        if(strcasecmp(s, (x)) == 0) { \
19270bbfda8aSnia                AddToList(&Scr->EWMHIgnore, (x), ""); \
19280bbfda8aSnia                return; \
19290bbfda8aSnia        }
19300bbfda8aSnia	HANDLE("STATE_MAXIMIZED_VERT");
19310bbfda8aSnia	HANDLE("STATE_MAXIMIZED_HORZ");
19320bbfda8aSnia	HANDLE("STATE_FULLSCREEN");
19330bbfda8aSnia	HANDLE("STATE_SHADED");
19340bbfda8aSnia	HANDLE("STATE_ABOVE");
19350bbfda8aSnia	HANDLE("STATE_BELOW");
19360bbfda8aSnia#undef HANDLE
19370bbfda8aSnia
19380bbfda8aSnia	twmrc_error_prefix();
19390bbfda8aSnia	fprintf(stderr, "Unexpected EWMHIgnore value '%s'\n", s);
19400bbfda8aSnia	ParseError = true;
19410bbfda8aSnia	return;
19420bbfda8aSnia#endif /* EWMH */
19430bbfda8aSnia}
19440bbfda8aSnia
19450bbfda8aSnia
19460bbfda8aSnia/*
19470bbfda8aSnia * Parsing for MWMIgnore { } lists
19480bbfda8aSnia */
19490bbfda8aSniavoid
19500bbfda8aSniaproc_mwm_ignore(void)
19510bbfda8aSnia{
19520bbfda8aSnia	/* Nothing to do */
19530bbfda8aSnia	return;
19540bbfda8aSnia}
19550bbfda8aSniavoid
19560bbfda8aSniaadd_mwm_ignore(char *s)
19570bbfda8aSnia{
19580bbfda8aSnia#define HANDLE(x) \
19590bbfda8aSnia        if(strcasecmp(s, (x)) == 0) { \
19600bbfda8aSnia                AddToList(&Scr->MWMIgnore, (x), ""); \
19610bbfda8aSnia                return; \
19620bbfda8aSnia        }
19630bbfda8aSnia	HANDLE("DECOR_BORDER");
19640bbfda8aSnia	HANDLE("DECOR_TITLE");
19650bbfda8aSnia#undef HANDLE
19660bbfda8aSnia
19670bbfda8aSnia	twmrc_error_prefix();
19680bbfda8aSnia	fprintf(stderr, "Unexpected MWMIgnore value '%s'\n", s);
19690bbfda8aSnia	ParseError = true;
19700bbfda8aSnia	return;
19710bbfda8aSnia}
1972