- Fixed crashing bug in menu.c
[wmaker-crm.git] / WPrefs.app / Configurations.c
blobe27ae7270f29eb9bcd23afc4fb74ccf9f393b136
1 /* Configurations.c- misc. configurations
2 *
3 * WPrefs - Window Maker Preferences Program
4 *
5 * Copyright (c) 1998-2003 Alfredo K. Kojima
6 *
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,
20 * USA.
24 #include "WPrefs.h"
26 typedef struct _Panel {
27 WMBox *box;
28 char *sectionName;
30 char *description;
32 CallbackRec callbacks;
34 WMWidget *parent;
36 WMFrame *icoF;
37 WMButton *icoB[5];
39 WMFrame *shaF;
40 WMButton *shaB[5];
42 WMFrame *titlF;
43 WMButton *oldsB;
44 WMButton *newsB;
46 WMFrame *animF;
47 WMButton *animB;
48 WMButton *supB;
49 WMButton *sfxB;
50 WMLabel *noteL;
52 WMFrame *smoF;
53 WMButton *smoB;
55 WMFrame *dithF;
56 WMButton *dithB;
57 WMSlider *dithS;
58 WMLabel *dithL;
59 WMLabel *dith1L;
60 WMLabel *dith2L;
62 int cmapSize;
63 } _Panel;
67 #define ICON_FILE "configs"
69 #define OLDS_IMAGE "oldstyle"
70 #define NEWS_IMAGE "newstyle"
72 #define ANIM_IMAGE "animations"
73 #define SUPERF_IMAGE "moreanim"
74 #define SOUND_IMAGE "sound"
75 #define SMOOTH_IMAGE "smooth"
77 #define SPEED_IMAGE "speed%i"
78 #define SPEED_IMAGE_S "speed%is"
80 #define ARQUIVO_XIS "xis"
83 static void updateLabel(WMWidget *self, void *data);
86 static void
87 showData(_Panel *panel)
89 WMPerformButtonClick(panel->icoB[GetSpeedForKey("IconSlideSpeed")]);
91 WMPerformButtonClick(panel->shaB[GetSpeedForKey("ShadeSpeed")]);
93 if (GetBoolForKey("NewStyle")) {
94 WMPerformButtonClick(panel->newsB);
95 } else {
96 WMPerformButtonClick(panel->oldsB);
99 WMSetButtonSelected(panel->animB, !GetBoolForKey("DisableAnimations"));
101 WMSetButtonSelected(panel->supB, GetBoolForKey("Superfluous"));
103 WMSetButtonSelected(panel->sfxB, !GetBoolForKey("DisableSound"));
105 WMSetButtonSelected(panel->smoB, GetBoolForKey("SmoothWorkspaceBack"));
107 WMSetButtonSelected(panel->dithB, GetBoolForKey("DisableDithering"));
109 WMSetSliderValue(panel->dithS, GetIntegerForKey("ColormapSize"));
111 updateLabel(panel->dithS, panel);
115 static void
116 updateLabel(WMWidget *self, void *data)
118 WMSlider *sPtr = (WMSlider*)self;
119 _Panel *panel = (_Panel*)data;
120 char buffer[64];
121 float fl;
123 fl = WMGetSliderValue(sPtr);
125 panel->cmapSize = (int)fl;
127 sprintf(buffer, "%i", panel->cmapSize*panel->cmapSize*panel->cmapSize);
128 WMSetLabelText(panel->dithL, buffer);
132 static void
133 createImages(WMScreen *scr, RContext *rc, RImage *xis, char *file,
134 WMPixmap **icon1, WMPixmap **icon2)
136 RImage *icon;
137 char *path;
138 RColor gray = {0xae,0xaa,0xae};
140 *icon1 = NULL;
141 *icon2 = NULL;
143 path = LocateImage(file);
144 if (!path) {
145 return;
148 *icon1 = WMCreatePixmapFromFile(scr, path);
149 if (!*icon1) {
150 wwarning(_("could not load icon %s"), path);
151 wfree(path);
152 return;
154 icon = RLoadImage(rc, path, 0);
155 if (!icon) {
156 wwarning(_("could not load icon %s"), path);
157 wfree(path);
158 return;
160 RCombineImageWithColor(icon, &gray);
161 if (xis) {
162 RCombineImagesWithOpaqueness(icon, xis, 180);
163 if (!(*icon2 = WMCreatePixmapFromRImage(scr, icon, 127)))
164 wwarning(_("could not process icon %s:"), file, RMessageForError(RErrorCode));
166 RReleaseImage(icon);
167 wfree(path);
172 static void
173 createPanel(Panel *p)
175 _Panel *panel = (_Panel*)p;
176 WMScreen *scr = WMWidgetScreen(panel->parent);
177 char *buf1, *buf2;
178 WMPixmap *icon, *altIcon;
179 RImage *xis = NULL;
180 int i;
181 RContext *rc = WMScreenRContext(scr);
182 WMFont *font = WMSystemFontOfSize(scr, 10);
183 char *path;
185 path = LocateImage(ARQUIVO_XIS);
186 if (path) {
187 xis = RLoadImage(rc, path, 0);
188 if (!xis) {
189 wwarning(_("could not load image file %s"), path);
191 wfree(path);
195 panel->box = WMCreateBox(panel->parent);
196 WMSetViewExpandsToParent(WMWidgetView(panel->box), 2, 2, 2, 2);
198 /*********** Icon Slide Speed **********/
200 panel->icoF = WMCreateFrame(panel->box);
201 WMResizeWidget(panel->icoF, 230, 45);
202 WMMoveWidget(panel->icoF, 15, 10);
203 WMSetFrameTitle(panel->icoF, _("Icon Slide Speed"));
205 /*********** Shade Animation Speed **********/
206 panel->shaF = WMCreateFrame(panel->box);
207 WMResizeWidget(panel->shaF, 230, 45);
208 WMMoveWidget(panel->shaF, 15, 60);
209 WMSetFrameTitle(panel->shaF, _("Shade Animation Speed"));
212 buf1 = wmalloc(strlen(SPEED_IMAGE)+1);
213 buf2 = wmalloc(strlen(SPEED_IMAGE_S)+1);
215 for (i = 0; i < 5; i++) {
216 panel->icoB[i] = WMCreateCustomButton(panel->icoF, WBBStateChangeMask);
217 panel->shaB[i] = WMCreateCustomButton(panel->shaF, WBBStateChangeMask);
218 WMResizeWidget(panel->icoB[i], 40, 24);
219 WMMoveWidget(panel->icoB[i], 10+(40*i), 15);
220 WMResizeWidget(panel->shaB[i], 40, 24);
221 WMMoveWidget(panel->shaB[i], 10+(40*i), 15);
222 WMSetButtonBordered(panel->icoB[i], False);
223 WMSetButtonImagePosition(panel->icoB[i], WIPImageOnly);
224 if (i > 0) {
225 WMGroupButtons(panel->icoB[0], panel->icoB[i]);
227 WMSetButtonBordered(panel->shaB[i], False);
228 WMSetButtonImagePosition(panel->shaB[i], WIPImageOnly);
229 if (i > 0) {
230 WMGroupButtons(panel->shaB[0], panel->shaB[i]);
232 sprintf(buf1, SPEED_IMAGE, i);
233 sprintf(buf2, SPEED_IMAGE_S, i);
234 path = LocateImage(buf1);
235 if (path) {
236 icon = WMCreatePixmapFromFile(scr, path);
237 if (icon) {
238 WMSetButtonImage(panel->icoB[i], icon);
239 WMSetButtonImage(panel->shaB[i], icon);
240 WMReleasePixmap(icon);
241 } else {
242 wwarning(_("could not load icon file %s"), path);
244 wfree(path);
246 path = LocateImage(buf2);
247 if (path) {
248 icon = WMCreatePixmapFromFile(scr, path);
249 if (icon) {
250 WMSetButtonAltImage(panel->icoB[i], icon);
251 WMSetButtonAltImage(panel->shaB[i], icon);
252 WMReleasePixmap(icon);
253 } else {
254 wwarning(_("could not load icon file %s"), path);
256 wfree(path);
259 wfree(buf1);
260 wfree(buf2);
263 WMMapSubwidgets(panel->icoF);
264 WMMapSubwidgets(panel->shaF);
267 /***************** Smoothed Scaling *****************/
268 panel->smoF = WMCreateFrame(panel->box);
269 WMResizeWidget(panel->smoF, 115, 110);
270 WMMoveWidget(panel->smoF, 18, 115);
271 WMSetFrameTitle(panel->smoF, _("Smooth Scaling"));
272 WMSetBalloonTextForView(_("Smooth scaled background images, neutralizing\n"
273 "the `pixelization' effect. This will slow\n"
274 "down loading of background images considerably."),
275 WMWidgetView(panel->smoF));
277 panel->smoB = WMCreateButton(panel->smoF, WBTToggle);
278 WMResizeWidget(panel->smoB, 64, 64);
279 WMMoveWidget(panel->smoB, 25, 25);
280 WMSetButtonImagePosition(panel->smoB, WIPImageOnly);
281 path = LocateImage(SMOOTH_IMAGE);
282 if (path) {
283 RImage *image, *scaled;
285 image = RLoadImage(WMScreenRContext(scr), path, 0);
286 wfree(path);
288 scaled = RScaleImage(image, 61, 61);
289 icon = WMCreatePixmapFromRImage(scr, scaled, 128);
290 RReleaseImage(scaled);
291 if (icon) {
292 WMSetButtonImage(panel->smoB, icon);
293 WMReleasePixmap(icon);
296 scaled = RSmoothScaleImage(image, 61, 61);
297 icon = WMCreatePixmapFromRImage(scr, scaled, 128);
298 RReleaseImage(scaled);
299 if (icon) {
300 WMSetButtonAltImage(panel->smoB, icon);
301 WMReleasePixmap(icon);
304 RReleaseImage(image);
307 WMMapSubwidgets(panel->smoF);
309 /***************** Titlebar Style Size ****************/
310 panel->titlF = WMCreateFrame(panel->box);
311 WMResizeWidget(panel->titlF, 105, 110);
312 WMMoveWidget(panel->titlF, 140, 115);
313 WMSetFrameTitle(panel->titlF, _("Titlebar Style"));
315 panel->newsB = WMCreateButton(panel->titlF, WBTOnOff);
316 WMResizeWidget(panel->newsB, 74, 40);
317 WMMoveWidget(panel->newsB, 15, 20);
318 WMSetButtonImagePosition(panel->newsB, WIPImageOnly);
319 path = LocateImage(NEWS_IMAGE);
320 if (path) {
321 icon = WMCreatePixmapFromFile(scr, path);
322 if (icon) {
323 WMSetButtonImage(panel->newsB, icon);
324 WMReleasePixmap(icon);
328 panel->oldsB = WMCreateButton(panel->titlF, WBTOnOff);
329 WMResizeWidget(panel->oldsB, 74, 40);
330 WMMoveWidget(panel->oldsB, 15, 60);
331 WMSetButtonImagePosition(panel->oldsB, WIPImageOnly);
332 path = LocateImage(OLDS_IMAGE);
333 if (path) {
334 icon = WMCreatePixmapFromFile(scr, path);
335 if (icon) {
336 WMSetButtonImage(panel->oldsB, icon);
337 WMReleasePixmap(icon);
339 wfree(path);
342 WMGroupButtons(panel->newsB, panel->oldsB);
344 WMMapSubwidgets(panel->titlF);
346 /**************** Features ******************/
348 panel->animF = WMCreateFrame(panel->box);
349 WMResizeWidget(panel->animF, 255, 115);
350 WMMoveWidget(panel->animF, 255, 10);
351 WMSetFrameTitle(panel->animF, _("Animations and Sound"));
353 panel->animB = WMCreateButton(panel->animF, WBTToggle);
354 WMResizeWidget(panel->animB, 64, 64);
355 WMMoveWidget(panel->animB, 15, 20);
356 WMSetButtonFont(panel->animB, font);
357 WMSetButtonText(panel->animB, _("Animations"));
358 WMSetButtonImagePosition(panel->animB, WIPAbove);
359 createImages(scr, rc, xis, ANIM_IMAGE, &altIcon, &icon);
360 if (icon) {
361 WMSetButtonImage(panel->animB, icon);
362 WMReleasePixmap(icon);
364 if (altIcon) {
365 WMSetButtonAltImage(panel->animB, altIcon);
366 WMReleasePixmap(altIcon);
368 WMSetBalloonTextForView(_("Disable/enable animations such as those shown\n"
369 "for window miniaturization, shading etc."),
370 WMWidgetView(panel->animB));
372 panel->supB = WMCreateButton(panel->animF, WBTToggle);
373 WMResizeWidget(panel->supB, 64, 64);
374 WMMoveWidget(panel->supB, 95, 20);
375 WMSetButtonFont(panel->supB, font);
376 WMSetButtonText(panel->supB, _("Superfluous"));
377 WMSetButtonImagePosition(panel->supB, WIPAbove);
378 createImages(scr, rc, xis, SUPERF_IMAGE, &altIcon, &icon);
379 if (icon) {
380 WMSetButtonImage(panel->supB, icon);
381 WMReleasePixmap(icon);
383 if (altIcon) {
384 WMSetButtonAltImage(panel->supB, altIcon);
385 WMReleasePixmap(altIcon);
387 WMSetBalloonTextForView(_("Disable/enable `superfluous' features and\n"
388 "animations. These include the `ghosting' of the\n"
389 "dock when it's being moved to another side and\n"
390 "the explosion animation when undocking icons."),
391 WMWidgetView(panel->supB));
393 panel->sfxB = WMCreateButton(panel->animF, WBTToggle);
394 WMResizeWidget(panel->sfxB, 64, 64);
395 WMMoveWidget(panel->sfxB, 175, 20);
396 WMSetButtonFont(panel->sfxB, font);
397 WMSetButtonText(panel->sfxB, _("Sounds"));
398 WMSetButtonImagePosition(panel->sfxB, WIPAbove);
399 createImages(scr, rc, xis, SOUND_IMAGE, &altIcon, &icon);
400 if (icon) {
401 WMSetButtonImage(panel->sfxB, icon);
402 WMReleasePixmap(icon);
404 if (altIcon) {
405 WMSetButtonAltImage(panel->sfxB, altIcon);
406 WMReleasePixmap(altIcon);
408 WMSetBalloonTextForView(_("Disable/enable support for sound effects played\n"
409 "for actions like shading and closing a window.\n"
410 "You will need a module distributed separately\n"
411 "for this. You can get it at:\n"
412 "http://shadowmere.student.utwente.nl/"),
413 WMWidgetView(panel->sfxB));
415 panel->noteL = WMCreateLabel(panel->animF);
416 WMResizeWidget(panel->noteL, 235, 28);
417 WMMoveWidget(panel->noteL, 10, 85);
418 WMSetLabelFont(panel->noteL, font);
419 WMSetLabelText(panel->noteL, _("Note: sound requires a module distributed\nseparately"));
421 WMMapSubwidgets(panel->animF);
423 /*********** Dithering **********/
424 panel->cmapSize = 4;
426 panel->dithF = WMCreateFrame(panel->box);
427 WMResizeWidget(panel->dithF, 255, 95);
428 WMMoveWidget(panel->dithF, 255, 130);
429 WMSetFrameTitle(panel->dithF, _("Dithering colormap for 8bpp"));
431 WMSetBalloonTextForView(_("Number of colors to reserve for Window Maker\n"
432 "on displays that support only 8bpp (PseudoColor)."),
433 WMWidgetView(panel->dithF));
435 panel->dithB = WMCreateSwitchButton(panel->dithF);
436 WMResizeWidget(panel->dithB, 235, 32);
437 WMMoveWidget(panel->dithB, 15, 15);
438 WMSetButtonText(panel->dithB, _("Disable dithering in any visual/depth"));
440 panel->dithL = WMCreateLabel(panel->dithF);
441 WMResizeWidget(panel->dithL, 75, 16);
442 WMMoveWidget(panel->dithL, 90, 50);
443 WMSetLabelTextAlignment(panel->dithL, WACenter);
444 WMSetLabelText(panel->dithL, "64");
446 panel->dithS = WMCreateSlider(panel->dithF);
447 WMResizeWidget(panel->dithS, 95, 16);
448 WMMoveWidget(panel->dithS, 80, 65);
449 WMSetSliderMinValue(panel->dithS, 2);
450 WMSetSliderMaxValue(panel->dithS, 6);
451 WMSetSliderContinuous(panel->dithS, True);
452 WMSetSliderAction(panel->dithS, updateLabel, panel);
454 panel->dith1L = WMCreateLabel(panel->dithF);
455 WMResizeWidget(panel->dith1L, 70, 35);
456 WMMoveWidget(panel->dith1L, 5, 50);
457 WMSetLabelTextAlignment(panel->dith1L, WACenter);
458 WMSetLabelFont(panel->dith1L, font);
459 WMSetLabelText(panel->dith1L, _("More colors for\napplications"));
461 panel->dith2L = WMCreateLabel(panel->dithF);
462 WMResizeWidget(panel->dith2L, 70, 35);
463 WMMoveWidget(panel->dith2L, 180, 50);
464 WMSetLabelTextAlignment(panel->dith2L, WACenter);
465 WMSetLabelFont(panel->dith2L, font);
466 WMSetLabelText(panel->dith2L, _("More colors for\nWindow Maker"));
468 WMMapSubwidgets(panel->dithF);
470 WMRealizeWidget(panel->box);
471 WMMapSubwidgets(panel->box);
473 if (xis)
474 RReleaseImage(xis);
475 WMReleaseFont(font);
477 showData(panel);
481 static void
482 storeData(_Panel *panel)
484 int i;
486 for (i=0; i<5; i++) {
487 if (WMGetButtonSelected(panel->icoB[i]))
488 break;
490 SetSpeedForKey(i, "IconSlideSpeed");
493 for (i=0; i<5; i++) {
494 if (WMGetButtonSelected(panel->shaB[i]))
495 break;
497 SetSpeedForKey(i, "ShadeSpeed");
499 SetBoolForKey(WMGetButtonSelected(panel->newsB), "NewStyle");
501 SetBoolForKey(!WMGetButtonSelected(panel->animB), "DisableAnimations");
502 SetBoolForKey(WMGetButtonSelected(panel->supB), "Superfluous");
503 SetBoolForKey(!WMGetButtonSelected(panel->sfxB), "DisableSound");
505 SetBoolForKey(WMGetButtonSelected(panel->smoB), "SmoothWorkspaceBack");
507 SetBoolForKey(WMGetButtonSelected(panel->dithB), "DisableDithering");
508 SetIntegerForKey(WMGetSliderValue(panel->dithS), "ColormapSize");
513 Panel*
514 InitConfigurations(WMScreen *scr, WMWidget *parent)
516 _Panel *panel;
518 panel = wmalloc(sizeof(_Panel));
519 memset(panel, 0, sizeof(_Panel));
521 panel->sectionName = _("Other Configurations");
523 panel->description = _("Animation speeds, titlebar styles, various option\n"
524 "toggling and number of colors to reserve for\n"
525 "Window Maker on 8bit displays.");
527 panel->parent = parent;
529 panel->callbacks.createWidgets = createPanel;
530 panel->callbacks.updateDomain = storeData;
532 AddSection(panel, ICON_FILE);
534 return panel;