1 /* wdefaults.c - window specific defaults
3 * Window Maker window manager
5 * Copyright (c) 1997, 1998 Alfredo K. Kojima
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
32 #include <X11/Xutil.h>
33 #include <X11/keysym.h>
38 #include "WindowMaker.h"
42 #include "workspace.h"
49 extern WPreferences wPreferences
;
51 extern WMPropList
*wAttributeDomainName
;
53 extern WDDomain
*WDWindowAttributes
;
60 static int getBool(WMPropList
*, WMPropList
*);
62 static char* getString(WMPropList
*, WMPropList
*);
65 static WMPropList
*ANoTitlebar
= NULL
;
66 static WMPropList
*ANoResizebar
;
67 static WMPropList
*ANoMiniaturizeButton
;
68 static WMPropList
*ANoCloseButton
;
69 static WMPropList
*ANoBorder
;
70 static WMPropList
*ANoHideOthers
;
71 static WMPropList
*ANoMouseBindings
;
72 static WMPropList
*ANoKeyBindings
;
73 static WMPropList
*ANoAppIcon
; /* app */
74 static WMPropList
*AKeepOnTop
;
75 static WMPropList
*AKeepOnBottom
;
76 static WMPropList
*AOmnipresent
;
77 static WMPropList
*ASkipWindowList
;
78 static WMPropList
*AKeepInsideScreen
;
79 static WMPropList
*AUnfocusable
;
80 static WMPropList
*AAlwaysUserIcon
;
81 static WMPropList
*AStartMiniaturized
;
82 static WMPropList
*AStartMaximized
;
83 static WMPropList
*AStartHidden
; /* app */
84 static WMPropList
*ADontSaveSession
; /* app */
85 static WMPropList
*AEmulateAppIcon
;
86 static WMPropList
*AFullMaximize
;
87 static WMPropList
*ACollapseAppIcons
; /* app */
88 #ifdef XKB_BUTTON_HINT
89 static WMPropList
*ANoLanguageButton
;
92 static WMPropList
*AStartWorkspace
;
94 static WMPropList
*AIcon
;
97 static WMPropList
*AnyWindow
;
98 static WMPropList
*No
;
102 init_wdefaults(WScreen
*scr
)
104 AIcon
= WMCreatePLString("Icon");
106 ANoTitlebar
= WMCreatePLString("NoTitlebar");
107 ANoResizebar
= WMCreatePLString("NoResizebar");
108 ANoMiniaturizeButton
= WMCreatePLString("NoMiniaturizeButton");
109 ANoCloseButton
= WMCreatePLString("NoCloseButton");
110 ANoBorder
= WMCreatePLString("NoBorder");
111 ANoHideOthers
= WMCreatePLString("NoHideOthers");
112 ANoMouseBindings
= WMCreatePLString("NoMouseBindings");
113 ANoKeyBindings
= WMCreatePLString("NoKeyBindings");
114 ANoAppIcon
= WMCreatePLString("NoAppIcon");
115 AKeepOnTop
= WMCreatePLString("KeepOnTop");
116 AKeepOnBottom
= WMCreatePLString("KeepOnBottom");
117 AOmnipresent
= WMCreatePLString("Omnipresent");
118 ASkipWindowList
= WMCreatePLString("SkipWindowList");
119 AKeepInsideScreen
= WMCreatePLString("KeepInsideScreen");
120 AUnfocusable
= WMCreatePLString("Unfocusable");
121 AAlwaysUserIcon
= WMCreatePLString("AlwaysUserIcon");
122 AStartMiniaturized
= WMCreatePLString("StartMiniaturized");
123 AStartHidden
= WMCreatePLString("StartHidden");
124 AStartMaximized
= WMCreatePLString("StartMaximized");
125 ADontSaveSession
= WMCreatePLString("DontSaveSession");
126 AEmulateAppIcon
= WMCreatePLString("EmulateAppIcon");
127 AFullMaximize
= WMCreatePLString("FullMaximize");
128 ACollapseAppIcons
= WMCreatePLString("CollapseAppIcons");
129 #ifdef XKB_BUTTON_HINT
130 ANoLanguageButton
= WMCreatePLString("NoLanguageButton");
133 AStartWorkspace
= WMCreatePLString("StartWorkspace");
135 AnyWindow
= WMCreatePLString("*");
136 No
= WMCreatePLString("No");
138 if (!scr->wattribs) {
139 scr->wattribs = PLGetDomain(wAttributeDomainName);
146 get_value(WMPropList
*dict_win
, WMPropList
*dict_class
, WMPropList
*dict_name
,
147 WMPropList
*dict_any
, WMPropList
*option
, WMPropList
*default_value
,
148 Bool useGlobalDefault
)
154 value
= WMGetFromPLDictionary(dict_win
, option
);
160 value
= WMGetFromPLDictionary(dict_name
, option
);
166 value
= WMGetFromPLDictionary(dict_class
, option
);
171 if (!useGlobalDefault
)
175 value
= WMGetFromPLDictionary(dict_any
, option
);
180 return default_value
;
185 *----------------------------------------------------------------------
186 * wDefaultFillAttributes--
187 * Retrieves attributes for the specified instance/class and
188 * fills attr with it. Values that are actually defined are also
189 * set in mask. If useGlobalDefault is True, the default for
190 * all windows ("*") will be used for when no values are found
191 * for that instance/class.
193 *----------------------------------------------------------------------
196 wDefaultFillAttributes(WScreen
*scr
, char *instance
, char *class,
197 WWindowAttributes
*attr
,
198 WWindowAttributes
*mask
,
199 Bool useGlobalDefault
)
201 WMPropList
*value
, *key1
, *key2
, *key3
, *dw
, *dc
, *dn
, *da
;
204 if (class && instance
) {
206 buffer
= wmalloc(strlen(class)+strlen(instance
)+4);
207 key1
= WMCreatePLString(strcat(strcat(strcpy(buffer
,instance
),"."),class));
213 key2
= WMCreatePLString(instance
);
218 key3
= WMCreatePLString(class);
226 WMPLSetCaseSensitive(True
);
228 if (WDWindowAttributes
->dictionary
) {
229 dw
= key1
? WMGetFromPLDictionary(WDWindowAttributes
->dictionary
, key1
) : NULL
;
230 dn
= key2
? WMGetFromPLDictionary(WDWindowAttributes
->dictionary
, key2
) : NULL
;
231 dc
= key3
? WMGetFromPLDictionary(WDWindowAttributes
->dictionary
, key3
) : NULL
;
232 if (useGlobalDefault
)
233 da
= WMGetFromPLDictionary(WDWindowAttributes
->dictionary
, AnyWindow
);
243 WMReleasePropList(key1
);
245 WMReleasePropList(key2
);
247 WMReleasePropList(key3
);
249 #define APPLY_VAL(value, flag, attrib) \
250 if (value) {attr->flag = getBool(attrib, value); \
251 if (mask) mask->flag = 1;}
254 value
= get_value(dw
, dc
, dn
, da
, ANoTitlebar
, No
, useGlobalDefault
);
255 APPLY_VAL(value
, no_titlebar
, ANoTitlebar
);
257 value
= get_value(dw
, dc
, dn
, da
, ANoResizebar
, No
, useGlobalDefault
);
258 APPLY_VAL(value
, no_resizebar
, ANoResizebar
);
260 value
= get_value(dw
, dc
, dn
, da
, ANoMiniaturizeButton
, No
, useGlobalDefault
);
261 APPLY_VAL(value
, no_miniaturize_button
, ANoMiniaturizeButton
);
263 value
= get_value(dw
, dc
, dn
, da
, ANoCloseButton
, No
, useGlobalDefault
);
264 APPLY_VAL(value
, no_close_button
, ANoCloseButton
);
266 value
= get_value(dw
, dc
, dn
, da
, ANoBorder
, No
, useGlobalDefault
);
267 APPLY_VAL(value
, no_border
, ANoBorder
);
269 value
= get_value(dw
, dc
, dn
, da
, ANoHideOthers
, No
, useGlobalDefault
);
270 APPLY_VAL(value
, no_hide_others
, ANoHideOthers
);
272 value
= get_value(dw
, dc
, dn
, da
, ANoMouseBindings
, No
, useGlobalDefault
);
273 APPLY_VAL(value
, no_bind_mouse
, ANoMouseBindings
);
275 value
= get_value(dw
, dc
, dn
, da
, ANoKeyBindings
, No
, useGlobalDefault
);
276 APPLY_VAL(value
, no_bind_keys
, ANoKeyBindings
);
278 value
= get_value(dw
, dc
, dn
, da
, ANoAppIcon
, No
, useGlobalDefault
);
279 APPLY_VAL(value
, no_appicon
, ANoAppIcon
);
281 value
= get_value(dw
, dc
, dn
, da
, ACollapseAppIcons
, No
, useGlobalDefault
);
282 APPLY_VAL(value
, collapse_appicons
, ACollapseAppIcons
);
284 value
= get_value(dw
, dc
, dn
, da
, AKeepOnTop
, No
, useGlobalDefault
);
285 APPLY_VAL(value
, floating
, AKeepOnTop
);
287 value
= get_value(dw
, dc
, dn
, da
, AKeepOnBottom
, No
, useGlobalDefault
);
288 APPLY_VAL(value
, sunken
, AKeepOnBottom
);
290 value
= get_value(dw
, dc
, dn
, da
, AOmnipresent
, No
, useGlobalDefault
);
291 APPLY_VAL(value
, omnipresent
, AOmnipresent
);
293 value
= get_value(dw
, dc
, dn
, da
, ASkipWindowList
, No
, useGlobalDefault
);
294 APPLY_VAL(value
, skip_window_list
, ASkipWindowList
);
296 value
= get_value(dw
, dc
, dn
, da
, AKeepInsideScreen
, No
, useGlobalDefault
);
297 APPLY_VAL(value
, dont_move_off
, AKeepInsideScreen
);
299 value
= get_value(dw
, dc
, dn
, da
, AUnfocusable
, No
, useGlobalDefault
);
300 APPLY_VAL(value
, no_focusable
, AUnfocusable
);
302 value
= get_value(dw
, dc
, dn
, da
, AAlwaysUserIcon
, No
, useGlobalDefault
);
303 APPLY_VAL(value
, always_user_icon
, AAlwaysUserIcon
);
305 value
= get_value(dw
, dc
, dn
, da
, AStartMiniaturized
, No
, useGlobalDefault
);
306 APPLY_VAL(value
, start_miniaturized
, AStartMiniaturized
);
308 value
= get_value(dw
, dc
, dn
, da
, AStartHidden
, No
, useGlobalDefault
);
309 APPLY_VAL(value
, start_hidden
, AStartHidden
);
311 value
= get_value(dw
, dc
, dn
, da
, AStartMaximized
, No
, useGlobalDefault
);
312 APPLY_VAL(value
, start_maximized
, AStartMaximized
);
314 value
= get_value(dw
, dc
, dn
, da
, ADontSaveSession
, No
, useGlobalDefault
);
315 APPLY_VAL(value
, dont_save_session
, ADontSaveSession
);
317 value
= get_value(dw
, dc
, dn
, da
, AEmulateAppIcon
, No
, useGlobalDefault
);
318 APPLY_VAL(value
, emulate_appicon
, AEmulateAppIcon
);
320 value
= get_value(dw
, dc
, dn
, da
, AFullMaximize
, No
, useGlobalDefault
);
321 APPLY_VAL(value
, full_maximize
, AFullMaximize
);
323 #ifdef XKB_BUTTON_HINT
324 value
= get_value(dw
, dc
, dn
, da
, ANoLanguageButton
, No
, useGlobalDefault
);
325 APPLY_VAL(value
, no_language_button
, ANoLanguageButton
);
329 WMPLSetCaseSensitive(False
);
335 get_generic_value(WScreen
*scr
, char *instance
, char *class, WMPropList
*option
,
338 WMPropList
*value
, *key
, *dict
;
342 WMPLSetCaseSensitive(True
);
344 if (class && instance
) {
346 buffer
= wmalloc(strlen(class)+strlen(instance
)+4);
347 key
= WMCreatePLString(strcat(strcat(strcpy(buffer
,instance
),"."),class));
349 dict
= WMGetFromPLDictionary(WDWindowAttributes
->dictionary
, key
);
350 WMReleasePropList(key
);
354 value
= WMGetFromPLDictionary(dict
, option
);
358 if (!value
&& instance
) {
359 key
= WMCreatePLString(instance
);
361 dict
= WMGetFromPLDictionary(WDWindowAttributes
->dictionary
, key
);
362 WMReleasePropList(key
);
364 value
= WMGetFromPLDictionary(dict
, option
);
368 if (!value
&& class) {
369 key
= WMCreatePLString(class);
371 dict
= WMGetFromPLDictionary(WDWindowAttributes
->dictionary
, key
);
372 WMReleasePropList(key
);
375 value
= WMGetFromPLDictionary(dict
, option
);
379 if (!value
&& !noDefault
) {
380 dict
= WMGetFromPLDictionary(WDWindowAttributes
->dictionary
, AnyWindow
);
383 value
= WMGetFromPLDictionary(dict
, option
);
387 WMPLSetCaseSensitive(False
);
394 wDefaultGetIconFile(WScreen
*scr
, char *instance
, char *class,
404 if (!WDWindowAttributes
->dictionary
)
407 value
= get_generic_value(scr
, instance
, class, AIcon
, noDefault
);
412 tmp
= getString(AIcon
, value
);
419 wDefaultGetImage(WScreen
*scr
, char *winstance
, char *wclass
)
425 file_name
= wDefaultGetIconFile(scr
, winstance
, wclass
, False
);
429 path
= FindImage(wPreferences
.icon_path
, file_name
);
432 wwarning(_("could not find icon file \"%s\""), file_name
);
436 image
= RLoadImage(scr
->rcontext
, path
, 0);
438 wwarning(_("error loading image file \"%s\""), path
, RMessageForError(RErrorCode
));
442 image
= wIconValidateIconSize(scr
, image
);
449 wDefaultGetStartWorkspace(WScreen
*scr
, char *instance
, char *class)
459 if (!WDWindowAttributes
->dictionary
)
462 value
= get_generic_value(scr
, instance
, class, AStartWorkspace
,
468 tmp
= getString(AStartWorkspace
, value
);
470 if (!tmp
|| strlen(tmp
)==0)
473 if (sscanf(tmp
, "%i", &w
)!=1) {
475 for (i
=0; i
< scr
->workspace_count
; i
++) {
476 if (strcmp(scr
->workspaces
[i
]->name
, tmp
)==0) {
490 wDefaultChangeIcon(WScreen
*scr
, char *instance
, char* class, char *file
)
492 WDDomain
*db
= WDWindowAttributes
;
493 WMPropList
*icon_value
=NULL
, *value
, *attr
, *key
, *def_win
, *def_icon
=NULL
;
494 WMPropList
*dict
= db
->dictionary
;
498 dict
= WMCreatePLDictionary(NULL
, NULL
, NULL
);
500 db
->dictionary
= dict
;
506 WMPLSetCaseSensitive(True
);
508 if (instance
&& class) {
510 buffer
= wmalloc(strlen(instance
) + strlen(class) + 2);
511 strcat(strcat(strcpy(buffer
, instance
), "."), class);
512 key
= WMCreatePLString(buffer
);
514 } else if (instance
) {
515 key
= WMCreatePLString(instance
);
517 key
= WMCreatePLString(class);
519 key
= WMRetainPropList(AnyWindow
);
523 value
= WMCreatePLString(file
);
524 icon_value
= WMCreatePLDictionary(AIcon
, value
, NULL
);
525 WMReleasePropList(value
);
527 if ((def_win
= WMGetFromPLDictionary(dict
, AnyWindow
)) != NULL
) {
528 def_icon
= WMGetFromPLDictionary(def_win
, AIcon
);
531 if (def_icon
&& !strcmp(WMGetFromPLString(def_icon
), file
))
535 if ((attr
= WMGetFromPLDictionary(dict
, key
)) != NULL
) {
536 if (WMIsPLDictionary(attr
)) {
537 if (icon_value
!=NULL
&& !same
)
538 WMMergePLDictionaries(attr
, icon_value
);
540 WMRemoveFromPLDictionary(attr
, AIcon
);
542 } else if (icon_value
!=NULL
&& !same
) {
543 WMPutInPLDictionary(dict
, key
, icon_value
);
545 if (!wPreferences
.flags
.noupdates
)
546 WMWritePropListToFile(dict
, db
->path
, True
);
548 WMReleasePropList(key
);
550 WMReleasePropList(icon_value
);
552 WMPLSetCaseSensitive(False
);
557 /* --------------------------- Local ----------------------- */
560 getBool(WMPropList
*key
, WMPropList
*value
)
564 if (!WMIsPLString(value
)) {
565 wwarning(_("Wrong option format for key \"%s\". Should be %s."),
566 WMGetFromPLString(key
), "Boolean");
569 val
= WMGetFromPLString(value
);
571 if ((val
[1]=='\0' && (val
[0]=='y' || val
[0]=='Y' || val
[0]=='T'
572 || val
[0]=='t' || val
[0]=='1'))
573 || (strcasecmp(val
, "YES")==0 || strcasecmp(val
, "TRUE")==0)) {
576 } else if ((val
[1]=='\0'
577 && (val
[0]=='n' || val
[0]=='N' || val
[0]=='F'
578 || val
[0]=='f' || val
[0]=='0'))
579 || (strcasecmp(val
, "NO")==0 || strcasecmp(val
, "FALSE")==0)) {
583 wwarning(_("can't convert \"%s\" to boolean"), val
);
584 /* We return False if we can't convert to BOOLEAN.
585 * This is because all options defaults to False.
586 * -1 is not checked and thus is interpreted as True,
587 * which is not good.*/
595 * WARNING: Do not free value returned by this!!
598 getString(WMPropList
*key
, WMPropList
*value
)
600 if (!WMIsPLString(value
)) {
601 wwarning(_("Wrong option format for key \"%s\". Should be %s."),
602 WMGetFromPLString(key
), "String");
606 return WMGetFromPLString(value
);