- Fixed userdefaults in WINGs not to synchronize on exit a domain that is
[wmaker-crm.git] / WINGs / widgets.c
blob25578a1710ff108406e518a7774042a4042654ea
3 #include "WINGsP.h"
4 #include "wconfig.h"
6 #ifdef XFT
7 # include <X11/Xft/Xft.h>
8 #endif
10 #include <X11/Xutil.h>
11 #include <X11/Xatom.h>
12 #include <X11/keysym.h>
13 #include <X11/cursorfont.h>
15 /********** data ************/
18 #define CHECK_BUTTON_ON_WIDTH 16
19 #define CHECK_BUTTON_ON_HEIGHT 16
21 static char *CHECK_BUTTON_ON[] = {
22 " %",
23 " .............%#",
24 " ........... .%#",
25 " .......... #.%#",
26 " ......... #%.%#",
27 " ........ #%..%#",
28 " ... #.. #%...%#",
29 " ... #% #%....%#",
30 " ... % #%.....%#",
31 " ... #%......%#",
32 " ... #%.......%#",
33 " ...#%........%#",
34 " .............%#",
35 " .............%#",
36 " %%%%%%%%%%%%%%#",
37 "%###############"};
39 #define CHECK_BUTTON_OFF_WIDTH 16
40 #define CHECK_BUTTON_OFF_HEIGHT 16
42 static char *CHECK_BUTTON_OFF[] = {
43 " %",
44 " .............%#",
45 " .............%#",
46 " .............%#",
47 " .............%#",
48 " .............%#",
49 " .............%#",
50 " .............%#",
51 " .............%#",
52 " .............%#",
53 " .............%#",
54 " .............%#",
55 " .............%#",
56 " .............%#",
57 " %%%%%%%%%%%%%%#",
58 "%###############"};
60 #define RADIO_BUTTON_ON_WIDTH 15
61 #define RADIO_BUTTON_ON_HEIGHT 15
62 static char *RADIO_BUTTON_ON[] = {
63 ".....%%%%%.....",
64 "...%%#####%%...",
65 "..%##.....%.%..",
66 ".%#%.. .....",
67 ".%#. ...",
68 "%#.. .. ",
69 "%#. . ",
70 "%#. . ",
71 "%#. . ",
72 "%#. . ",
73 ".%%. . .",
74 ".%.. . .",
75 "..%... .. ..",
76 ".... ..... ...",
77 "..... .....",
80 #define RADIO_BUTTON_OFF_WIDTH 15
81 #define RADIO_BUTTON_OFF_HEIGHT 15
82 static char *RADIO_BUTTON_OFF[] = {
83 ".....%%%%%.....",
84 "...%%#####%%...",
85 "..%##.......%..",
86 ".%#%...........",
87 ".%#............",
88 "%#............ ",
89 "%#............ ",
90 "%#............ ",
91 "%#............ ",
92 "%#............ ",
93 ".%%.......... .",
94 ".%........... .",
95 "..%......... ..",
96 ".... ..... ...",
97 "..... .....",
101 static char *BUTTON_ARROW[] = {
102 "..................",
103 "....##....#### ...",
104 "...#.%....#... ...",
105 "..#..%#####... ...",
106 ".#............ ...",
107 "#............. ...",
108 ".#............ ...",
109 "..#.. ...",
110 "...#. ............",
111 "....# ............"
114 #define BUTTON_ARROW_WIDTH 18
115 #define BUTTON_ARROW_HEIGHT 10
118 static char *BUTTON_ARROW2[] = {
119 " ",
120 " ## ####. ",
121 " # % # . ",
122 " # %##### . ",
123 " # . ",
124 "# . ",
125 " # . ",
126 " # .......... ",
127 " # . ",
128 " #. "
131 #define BUTTON_ARROW2_WIDTH 18
132 #define BUTTON_ARROW2_HEIGHT 10
135 static char *SCROLLER_DIMPLE[] = {
136 ".%###.",
137 "%#%%%%",
138 "#%%...",
139 "#%.. ",
140 "#%. ",
141 ".%. ."
144 #define SCROLLER_DIMPLE_WIDTH 6
145 #define SCROLLER_DIMPLE_HEIGHT 6
148 static char *SCROLLER_ARROW_UP[] = {
149 "....%....",
150 "....#....",
151 "...%#%...",
152 "...###...",
153 "..%###%..",
154 "..#####..",
155 ".%#####%.",
156 ".#######.",
157 "%#######%"
160 static char *HI_SCROLLER_ARROW_UP[] = {
161 " % ",
162 " % ",
163 " %%% ",
164 " %%% ",
165 " %%%%% ",
166 " %%%%% ",
167 " %%%%%%% ",
168 " %%%%%%% ",
169 "%%%%%%%%%"
172 #define SCROLLER_ARROW_UP_WIDTH 9
173 #define SCROLLER_ARROW_UP_HEIGHT 9
176 static char *SCROLLER_ARROW_DOWN[] = {
177 "%#######%",
178 ".#######.",
179 ".%#####%.",
180 "..#####..",
181 "..%###%..",
182 "...###...",
183 "...%#%...",
184 "....#....",
185 "....%...."
188 static char *HI_SCROLLER_ARROW_DOWN[] = {
189 "%%%%%%%%%",
190 " %%%%%%% ",
191 " %%%%%%% ",
192 " %%%%% ",
193 " %%%%% ",
194 " %%% ",
195 " %%% ",
196 " % ",
197 " % "
200 #define SCROLLER_ARROW_DOWN_WIDTH 9
201 #define SCROLLER_ARROW_DOWN_HEIGHT 9
205 static char *SCROLLER_ARROW_LEFT[] = {
206 "........%",
207 "......%##",
208 "....%####",
209 "..%######",
210 "%########",
211 "..%######",
212 "....%####",
213 "......%##",
214 "........%"
217 static char *HI_SCROLLER_ARROW_LEFT[] = {
218 " %",
219 " %%%",
220 " %%%%%",
221 " %%%%%%%",
222 "%%%%%%%%%",
223 " %%%%%%%",
224 " %%%%%",
225 " %%%",
226 " %"
229 #define SCROLLER_ARROW_LEFT_WIDTH 9
230 #define SCROLLER_ARROW_LEFT_HEIGHT 9
233 static char *SCROLLER_ARROW_RIGHT[] = {
234 "%........",
235 "##%......",
236 "####%....",
237 "######%..",
238 "########%",
239 "######%..",
240 "####%....",
241 "##%......",
242 "%........"
245 static char *HI_SCROLLER_ARROW_RIGHT[] = {
246 "% ",
247 "%%% ",
248 "%%%%% ",
249 "%%%%%%% ",
250 "%%%%%%%%%",
251 "%%%%%%% ",
252 "%%%%% ",
253 "%%% ",
254 "% "
257 #define SCROLLER_ARROW_RIGHT_WIDTH 9
258 #define SCROLLER_ARROW_RIGHT_HEIGHT 9
261 static char *POPUP_INDICATOR[] = {
262 " #==",
263 " ......%#==",
264 " ......%#%%",
265 " ......%#%%",
266 " %%%%%%%#%%",
267 "#########%%",
268 "==%%%%%%%%%",
269 "==%%%%%%%%%"
272 #define POPUP_INDICATOR_WIDTH 11
273 #define POPUP_INDICATOR_HEIGHT 8
277 static char *PULLDOWN_INDICATOR[] = {
278 "=#######=",
279 "=%===== =",
280 "==%=== ==",
281 "==%=== ==",
282 "===%= ===",
283 "===%= ===",
284 "====%===="
286 #define PULLDOWN_INDICATOR_WIDTH 9
287 #define PULLDOWN_INDICATOR_HEIGHT 7
290 #define CHECK_MARK_WIDTH 8
291 #define CHECK_MARK_HEIGHT 10
293 static char *CHECK_MARK[] = {
294 "======== ",
295 "======= #",
296 "====== #%",
297 "===== #%=",
298 " #== #%==",
299 " #% #%===",
300 " % #%====",
301 " #%=====",
302 " #%======",
303 "#%======="};
306 #define STIPPLE_WIDTH 8
307 #define STIPPLE_HEIGHT 8
308 static unsigned char STIPPLE_BITS[] = {
309 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55
315 extern void W_ReadConfigurations(void);
318 static int userWidgetCount=0;
321 /***** end data ******/
324 static void
325 renderPixmap(W_Screen *screen, Pixmap d, Pixmap mask, char **data,
326 int width, int height)
328 int x, y;
329 GC whiteGC = WMColorGC(screen->white);
330 GC blackGC = WMColorGC(screen->black);
331 GC lightGC = WMColorGC(screen->gray);
332 GC darkGC = WMColorGC(screen->darkGray);
335 if (mask)
336 XSetForeground(screen->display, screen->monoGC, 0);
338 for (y = 0; y < height; y++) {
339 for (x = 0; x < width; x++) {
340 switch (data[y][x]) {
341 case ' ':
342 case 'w':
343 XDrawPoint(screen->display, d, whiteGC, x, y);
344 break;
346 case '=':
347 if (mask)
348 XDrawPoint(screen->display, mask, screen->monoGC, x, y);
350 case '.':
351 case 'l':
352 XDrawPoint(screen->display, d, lightGC, x, y);
353 break;
355 case '%':
356 case 'd':
357 XDrawPoint(screen->display, d, darkGC, x, y);
358 break;
360 case '#':
361 case 'b':
362 default:
363 XDrawPoint(screen->display, d, blackGC, x, y);
364 break;
372 static WMPixmap*
373 makePixmap(W_Screen *sPtr, char **data, int width, int height, int masked)
375 Pixmap pixmap, mask = None;
377 pixmap = XCreatePixmap(sPtr->display, W_DRAWABLE(sPtr), width, height,
378 sPtr->depth);
380 if (masked) {
381 mask = XCreatePixmap(sPtr->display, W_DRAWABLE(sPtr), width, height, 1);
382 XSetForeground(sPtr->display, sPtr->monoGC, 1);
383 XFillRectangle(sPtr->display, mask, sPtr->monoGC, 0, 0, width, height);
386 renderPixmap(sPtr, pixmap, mask, data, width, height);
388 return WMCreatePixmapFromXPixmaps(sPtr, pixmap, mask, width, height,
389 sPtr->depth);
393 #define T_WINGS_IMAGES_FILE RESOURCE_PATH"/Images.tiff"
394 #define T_DEFAULT_OBJECT_ICON_FILE RESOURCE_PATH"/defaultIcon.tiff"
396 #define X_WINGS_IMAGES_FILE RESOURCE_PATH"/Images.xpm"
397 #define X_DEFAULT_OBJECT_ICON_FILE RESOURCE_PATH"/defaultIcon.xpm"
400 static Bool
401 loadPixmaps(WMScreen *scr)
403 RImage *image, *tmp;
404 RColor gray;
405 RColor white;
407 gray.red = 0xae;
408 gray.green = 0xaa;
409 gray.blue = 0xae;
411 white.red = 0xff;
412 white.green = 0xff;
413 white.blue = 0xff;
415 image = RLoadImage(scr->rcontext, T_WINGS_IMAGES_FILE, 0);
416 if (!image)
417 image = RLoadImage(scr->rcontext, X_WINGS_IMAGES_FILE, 0);
418 if (!image) {
419 wwarning(_("WINGs: could not load widget images file: %s"),
420 RMessageForError(RErrorCode));
421 return False;
423 /* home icon */
424 /* make it have a gray background */
425 tmp = RGetSubImage(image, 0, 0, 24, 24);
426 RCombineImageWithColor(tmp, &gray);
427 scr->homeIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
428 RReleaseImage(tmp);
429 /* make it have a white background */
430 tmp = RGetSubImage(image, 0, 0, 24, 24);
431 RCombineImageWithColor(tmp, &white);
432 scr->altHomeIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
433 RReleaseImage(tmp);
435 /* trash can */
436 tmp = RGetSubImage(image, 104, 0, 24, 24);
437 RCombineImageWithColor(tmp, &white);
438 scr->trashcanIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
439 RReleaseImage(tmp);
440 tmp = RGetSubImage(image, 104, 0, 24, 24);
441 RCombineImageWithColor(tmp, &white);
442 scr->altTrashcanIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
443 RReleaseImage(tmp);
444 /* create dir */
445 tmp = RGetSubImage(image, 104, 24, 24, 24);
446 RCombineImageWithColor(tmp, &white);
447 scr->createDirIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
448 RReleaseImage(tmp);
449 tmp = RGetSubImage(image, 104, 24, 24, 24);
450 RCombineImageWithColor(tmp, &white);
451 scr->altCreateDirIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
452 RReleaseImage(tmp);
453 /* diskettes */
454 tmp = RGetSubImage(image, 24, 80, 24, 24);
455 RCombineImageWithColor(tmp, &white);
456 scr->disketteIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
457 RReleaseImage(tmp);
458 tmp = RGetSubImage(image, 24, 80, 24, 24);
459 RCombineImageWithColor(tmp, &white);
460 scr->altDisketteIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
461 RReleaseImage(tmp);
462 /* unmount */
463 tmp = RGetSubImage(image, 0, 80, 24, 24);
464 RCombineImageWithColor(tmp, &white);
465 scr->unmountIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
466 RReleaseImage(tmp);
467 tmp = RGetSubImage(image, 0, 80, 24, 24);
468 RCombineImageWithColor(tmp, &white);
469 scr->altUnmountIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
470 RReleaseImage(tmp);
472 /* Magnifying Glass Icon for ColorPanel */
473 tmp = RGetSubImage(image, 24, 0, 40, 32);
474 RCombineImageWithColor(tmp, &gray);
475 scr->magnifyIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
476 RReleaseImage(tmp);
477 /* ColorWheel Icon for ColorPanel */
478 tmp = RGetSubImage(image, 0, 25, 24, 24);
479 scr->wheelIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
480 RReleaseImage(tmp);
481 /* GrayScale Icon for ColorPanel */
482 tmp = RGetSubImage(image, 65, 0, 40, 24);
483 scr->grayIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
484 RReleaseImage(tmp);
485 /* RGB Icon for ColorPanel */
486 tmp = RGetSubImage(image, 25, 33, 40, 24);
487 scr->rgbIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
488 RReleaseImage(tmp);
489 /* CMYK Icon for ColorPanel */
490 tmp = RGetSubImage(image, 65, 25, 40, 24);
491 scr->cmykIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
492 RReleaseImage(tmp);
493 /* HSB Icon for ColorPanel */
494 tmp = RGetSubImage(image, 0, 57, 40, 24);
495 scr->hsbIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
496 RReleaseImage(tmp);
497 /* CustomColorPalette Icon for ColorPanel */
498 tmp = RGetSubImage(image, 81, 57, 40, 24);
499 scr->customPaletteIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
500 RReleaseImage(tmp);
501 /* ColorList Icon for ColorPanel */
502 tmp = RGetSubImage(image, 41, 57, 40, 24);
503 scr->colorListIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
504 RReleaseImage(tmp);
506 RReleaseImage(image);
508 #if 0
509 scr->defaultObjectIcon =
510 WMCreatePixmapFromFile(scr, T_DEFAULT_OBJECT_ICON_FILE);
511 if (!scr->defaultObjectIcon) {
512 scr->defaultObjectIcon =
513 WMCreatePixmapFromFile(scr, X_DEFAULT_OBJECT_ICON_FILE);
515 if (!scr->defaultObjectIcon) {
516 wwarning("WINGs: could not load default icon file");
517 return False;
519 #endif
520 return True;
524 WMScreen*
525 WMOpenScreen(const char *display)
527 Display *dpy = XOpenDisplay(display);
529 if (!dpy) {
530 wwarning("WINGs: could not open display %s",
531 XDisplayName(display));
532 return NULL;
535 return WMCreateSimpleApplicationScreen(dpy);
539 WMScreen*
540 WMCreateSimpleApplicationScreen(Display *display)
542 WMScreen *scr;
544 scr = WMCreateScreen(display, DefaultScreen(display));
546 scr->aflags.hasAppIcon = 0;
547 scr->aflags.simpleApplication = 1;
549 return scr;
554 WMScreen*
555 WMCreateScreen(Display *display, int screen)
557 return WMCreateScreenWithRContext(display, screen,
558 RCreateContext(display, screen, NULL));
562 WMScreen*
563 WMCreateScreenWithRContext(Display *display, int screen, RContext *context)
565 W_Screen *scrPtr;
566 XGCValues gcv;
567 Pixmap stipple;
568 static int initialized = 0;
569 static char *atomNames[] = {
570 "_GNUSTEP_WM_ATTR",
571 "WM_DELETE_WINDOW",
572 "WM_PROTOCOLS",
573 "CLIPBOARD",
574 "XdndAware",
575 "XdndSelection",
576 "XdndEnter",
577 "XdndLeave",
578 "XdndPosition",
579 "XdndDrop",
580 "XdndFinished",
581 "XdndTypeList",
582 "XdndActionCopy",
583 "XdndActionMove",
584 "XdndActionLink",
585 "XdndActionAsk",
586 "XdndActionPrivate",
587 "XdndStatus",
588 "_WINGS_DND_MOUSE_OFFSET",
589 "WM_STATE"
591 Atom atoms[sizeof(atomNames)/sizeof(char*)];
592 int i;
594 if (!initialized) {
596 initialized = 1;
598 W_ReadConfigurations();
600 assert(W_ApplicationInitialized());
603 scrPtr = malloc(sizeof(W_Screen));
604 if (!scrPtr)
605 return NULL;
606 memset(scrPtr, 0, sizeof(W_Screen));
608 scrPtr->aflags.hasAppIcon = 1;
610 scrPtr->display = display;
611 scrPtr->screen = screen;
612 scrPtr->rcontext = context;
614 scrPtr->depth = context->depth;
616 scrPtr->visual = context->visual;
617 scrPtr->lastEventTime = 0;
619 scrPtr->colormap = context->cmap;
621 scrPtr->rootWin = RootWindow(display, screen);
623 scrPtr->fontCache = WMCreateHashTable(WMStringPointerHashCallbacks);
625 scrPtr->xftFontCache = WMCreateHashTable(WMStringPointerHashCallbacks);
627 scrPtr->fontSetCache = WMCreateHashTable(WMStringPointerHashCallbacks);
629 #ifdef XFT
630 scrPtr->hasXftSupport = XftDefaultHasRender(scrPtr->display);
632 scrPtr->xftdraw = XftDrawCreate(scrPtr->display, W_DRAWABLE(scrPtr),
633 scrPtr->visual, scrPtr->colormap);
634 #endif
636 /* create input method stuff */
637 W_InitIMStuff(scrPtr);
639 /* Create missing CUT_BUFFERs */
641 Atom *rootWinProps;
642 int exists[8] = {0, 0, 0, 0, 0, 0, 0, 0};
643 int count;
645 rootWinProps = XListProperties(display, scrPtr->rootWin, &count);
646 for (i=0; i<count; i++) {
647 switch(rootWinProps[i]) {
648 case XA_CUT_BUFFER0:
649 exists[0] = 1; break;
650 case XA_CUT_BUFFER1:
651 exists[1] = 1; break;
652 case XA_CUT_BUFFER2:
653 exists[2] = 1; break;
654 case XA_CUT_BUFFER3:
655 exists[3] = 1; break;
656 case XA_CUT_BUFFER4:
657 exists[4] = 1; break;
658 case XA_CUT_BUFFER5:
659 exists[5] = 1; break;
660 case XA_CUT_BUFFER6:
661 exists[6] = 1; break;
662 case XA_CUT_BUFFER7:
663 exists[7] = 1; break;
664 default:
665 break;
668 if (rootWinProps) {
669 XFree(rootWinProps);
671 for (i=0; i<8; i++) {
672 if (!exists[i]) {
673 XStoreBuffer(display, "", 0, i);
678 scrPtr->ignoredModifierMask = 0;
680 int i;
681 XModifierKeymap *modmap;
682 KeyCode nlock, slock;
683 static int mask_table[8] = {
684 ShiftMask,LockMask,ControlMask,Mod1Mask,
685 Mod2Mask, Mod3Mask, Mod4Mask, Mod5Mask
687 unsigned int numLockMask=0, scrollLockMask=0;
689 nlock = XKeysymToKeycode(display, XK_Num_Lock);
690 slock = XKeysymToKeycode(display, XK_Scroll_Lock);
693 * Find out the masks for the NumLock and ScrollLock modifiers,
694 * so that we can bind the grabs for when they are enabled too.
696 modmap = XGetModifierMapping(display);
698 if (modmap!=NULL && modmap->max_keypermod>0) {
699 for (i=0; i<8*modmap->max_keypermod; i++) {
700 if (modmap->modifiermap[i]==nlock && nlock!=0)
701 numLockMask = mask_table[i/modmap->max_keypermod];
702 else if (modmap->modifiermap[i]==slock && slock!=0)
703 scrollLockMask = mask_table[i/modmap->max_keypermod];
707 if (modmap)
708 XFreeModifiermap(modmap);
711 scrPtr->ignoredModifierMask = numLockMask|scrollLockMask|LockMask;
714 /* initially allocate some colors */
715 WMWhiteColor(scrPtr);
716 WMBlackColor(scrPtr);
717 WMGrayColor(scrPtr);
718 WMDarkGrayColor(scrPtr);
720 gcv.graphics_exposures = False;
722 gcv.function = GXxor;
723 gcv.foreground = W_PIXEL(scrPtr->white);
724 if (gcv.foreground == 0) gcv.foreground = 1;
725 scrPtr->xorGC = XCreateGC(display, W_DRAWABLE(scrPtr), GCFunction
726 |GCGraphicsExposures|GCForeground, &gcv);
728 gcv.function = GXxor;
729 gcv.foreground = W_PIXEL(scrPtr->gray);
730 gcv.subwindow_mode = IncludeInferiors;
731 scrPtr->ixorGC = XCreateGC(display, W_DRAWABLE(scrPtr), GCFunction
732 |GCGraphicsExposures|GCForeground
733 |GCSubwindowMode, &gcv);
735 gcv.function = GXcopy;
736 scrPtr->copyGC = XCreateGC(display, W_DRAWABLE(scrPtr), GCFunction
737 |GCGraphicsExposures, &gcv);
739 scrPtr->clipGC = XCreateGC(display, W_DRAWABLE(scrPtr), GCFunction
740 |GCGraphicsExposures, &gcv);
742 stipple = XCreateBitmapFromData(display, W_DRAWABLE(scrPtr),
743 STIPPLE_BITS, STIPPLE_WIDTH, STIPPLE_HEIGHT);
744 gcv.foreground = W_PIXEL(scrPtr->darkGray);
745 gcv.background = W_PIXEL(scrPtr->gray);
746 gcv.fill_style = FillStippled;
747 gcv.stipple = stipple;
748 scrPtr->stippleGC = XCreateGC(display, W_DRAWABLE(scrPtr),
749 GCForeground|GCBackground|GCStipple
750 |GCFillStyle|GCGraphicsExposures, &gcv);
752 scrPtr->drawStringGC = XCreateGC(display, W_DRAWABLE(scrPtr),
753 GCGraphicsExposures, &gcv);
754 scrPtr->drawImStringGC = XCreateGC(display, W_DRAWABLE(scrPtr),
755 GCGraphicsExposures, &gcv);
757 /* we need a 1bpp drawable for the monoGC, so borrow this one */
758 scrPtr->monoGC = XCreateGC(display, stipple, 0, NULL);
760 scrPtr->stipple = stipple;
762 scrPtr->useMultiByte = WINGsConfiguration.useMultiByte;
764 if (scrPtr->hasXftSupport) {
765 scrPtr->antialiasedText = WINGsConfiguration.antialiasedText;
766 } else {
767 if (WINGsConfiguration.antialiasedText) {
768 wwarning(_("Text antialiasing is enabled in the configuration but"
769 " the X server doesn't have the required capabilities "
770 "(missing RENDER extension). Disabling text antialiasing."));
772 scrPtr->antialiasedText = False;
775 scrPtr->normalFont = WMSystemFontOfSize(scrPtr,
776 WINGsConfiguration.defaultFontSize);
778 scrPtr->boldFont = WMBoldSystemFontOfSize(scrPtr,
779 WINGsConfiguration.defaultFontSize);
781 if (!scrPtr->boldFont)
782 scrPtr->boldFont = scrPtr->normalFont;
784 if (!scrPtr->normalFont) {
785 wwarning(_("could not load any fonts. Make sure your font installation"
786 " and locale settings are correct."));
788 return NULL;
791 scrPtr->checkButtonImageOn = makePixmap(scrPtr, CHECK_BUTTON_ON,
792 CHECK_BUTTON_ON_WIDTH,
793 CHECK_BUTTON_ON_HEIGHT, False);
795 scrPtr->checkButtonImageOff = makePixmap(scrPtr, CHECK_BUTTON_OFF,
796 CHECK_BUTTON_OFF_WIDTH,
797 CHECK_BUTTON_OFF_HEIGHT, False);
799 scrPtr->radioButtonImageOn = makePixmap(scrPtr, RADIO_BUTTON_ON,
800 RADIO_BUTTON_ON_WIDTH,
801 RADIO_BUTTON_ON_HEIGHT, False);
803 scrPtr->radioButtonImageOff = makePixmap(scrPtr, RADIO_BUTTON_OFF,
804 RADIO_BUTTON_OFF_WIDTH,
805 RADIO_BUTTON_OFF_HEIGHT, False);
807 scrPtr->buttonArrow = makePixmap(scrPtr, BUTTON_ARROW,
808 BUTTON_ARROW_WIDTH, BUTTON_ARROW_HEIGHT,
809 False);
811 scrPtr->pushedButtonArrow = makePixmap(scrPtr, BUTTON_ARROW2,
812 BUTTON_ARROW2_WIDTH, BUTTON_ARROW2_HEIGHT,
813 False);
816 scrPtr->scrollerDimple = makePixmap(scrPtr, SCROLLER_DIMPLE,
817 SCROLLER_DIMPLE_WIDTH,
818 SCROLLER_DIMPLE_HEIGHT, False);
821 scrPtr->upArrow = makePixmap(scrPtr, SCROLLER_ARROW_UP,
822 SCROLLER_ARROW_UP_WIDTH,
823 SCROLLER_ARROW_UP_HEIGHT, True);
825 scrPtr->downArrow = makePixmap(scrPtr, SCROLLER_ARROW_DOWN,
826 SCROLLER_ARROW_DOWN_WIDTH,
827 SCROLLER_ARROW_DOWN_HEIGHT, True);
829 scrPtr->leftArrow = makePixmap(scrPtr, SCROLLER_ARROW_LEFT,
830 SCROLLER_ARROW_LEFT_WIDTH,
831 SCROLLER_ARROW_LEFT_HEIGHT, True);
833 scrPtr->rightArrow = makePixmap(scrPtr, SCROLLER_ARROW_RIGHT,
834 SCROLLER_ARROW_RIGHT_WIDTH,
835 SCROLLER_ARROW_RIGHT_HEIGHT, True);
837 scrPtr->hiUpArrow = makePixmap(scrPtr, HI_SCROLLER_ARROW_UP,
838 SCROLLER_ARROW_UP_WIDTH,
839 SCROLLER_ARROW_UP_HEIGHT, True);
841 scrPtr->hiDownArrow = makePixmap(scrPtr, HI_SCROLLER_ARROW_DOWN,
842 SCROLLER_ARROW_DOWN_WIDTH,
843 SCROLLER_ARROW_DOWN_HEIGHT, True);
845 scrPtr->hiLeftArrow = makePixmap(scrPtr, HI_SCROLLER_ARROW_LEFT,
846 SCROLLER_ARROW_LEFT_WIDTH,
847 SCROLLER_ARROW_LEFT_HEIGHT, True);
849 scrPtr->hiRightArrow = makePixmap(scrPtr, HI_SCROLLER_ARROW_RIGHT,
850 SCROLLER_ARROW_RIGHT_WIDTH,
851 SCROLLER_ARROW_RIGHT_HEIGHT, True);
853 scrPtr->popUpIndicator = makePixmap(scrPtr, POPUP_INDICATOR,
854 POPUP_INDICATOR_WIDTH,
855 POPUP_INDICATOR_HEIGHT, True);
857 scrPtr->pullDownIndicator = makePixmap(scrPtr, PULLDOWN_INDICATOR,
858 PULLDOWN_INDICATOR_WIDTH,
859 PULLDOWN_INDICATOR_HEIGHT, True);
861 scrPtr->checkMark = makePixmap(scrPtr, CHECK_MARK,
862 CHECK_MARK_WIDTH,
863 CHECK_MARK_HEIGHT, True);
865 loadPixmaps(scrPtr);
867 scrPtr->defaultCursor = XCreateFontCursor(display, XC_left_ptr);
869 scrPtr->textCursor = XCreateFontCursor(display, XC_xterm);
872 XColor bla;
873 Pixmap blank;
875 blank = XCreatePixmap(display, scrPtr->stipple, 1, 1, 1);
876 XSetForeground(display, scrPtr->monoGC, 0);
877 XFillRectangle(display, blank, scrPtr->monoGC, 0, 0, 1, 1);
879 scrPtr->invisibleCursor = XCreatePixmapCursor(display, blank, blank,
880 &bla, &bla, 0, 0);
881 XFreePixmap(display, blank);
884 #ifdef HAVE_XINTERNATOMS
885 XInternAtoms(display, atomNames, sizeof(atomNames)/sizeof(char*), False,
886 atoms);
887 #else
888 for (i = 0; i < sizeof(atomNames)/sizeof(char*); i++) {
889 atoms[i] = XInternAtom(display, atomNames[i], False);
891 #endif
893 i = 0;
894 scrPtr->attribsAtom = atoms[i++];
896 scrPtr->deleteWindowAtom = atoms[i++];
898 scrPtr->protocolsAtom = atoms[i++];
900 scrPtr->clipboardAtom = atoms[i++];
902 scrPtr->xdndAwareAtom = atoms[i++];
903 scrPtr->xdndSelectionAtom = atoms[i++];
904 scrPtr->xdndEnterAtom = atoms[i++];
905 scrPtr->xdndLeaveAtom = atoms[i++];
906 scrPtr->xdndPositionAtom = atoms[i++];
907 scrPtr->xdndDropAtom = atoms[i++];
908 scrPtr->xdndFinishedAtom = atoms[i++];
909 scrPtr->xdndTypeListAtom = atoms[i++];
910 scrPtr->xdndStatusAtom = atoms[i++];
912 scrPtr->xdndActionCopy = atoms[i++];
913 scrPtr->xdndActionMove = atoms[i++];
914 scrPtr->xdndActionLink = atoms[i++];
915 scrPtr->xdndActionAsk = atoms[i++];
916 scrPtr->xdndActionPrivate = atoms[i++];
918 scrPtr->wmIconDragOffsetAtom = atoms[i++];
920 scrPtr->wmStateAtom = atoms[i++];
922 scrPtr->rootView = W_CreateRootView(scrPtr);
924 scrPtr->balloon = W_CreateBalloon(scrPtr);
927 W_InitApplication(scrPtr);
929 return scrPtr;
934 void
935 WMSetWidgetDefaultFont(WMScreen *scr, WMFont *font)
937 WMReleaseFont(scr->normalFont);
938 scr->normalFont = WMRetainFont(font);
942 void
943 WMSetWidgetDefaultBoldFont(WMScreen *scr, WMFont *font)
945 WMReleaseFont(scr->boldFont);
946 scr->boldFont = WMRetainFont(font);
951 void
952 WMHangData(WMWidget *widget, void *data)
954 W_VIEW(widget)->hangedData = data;
958 void*
959 WMGetHangedData(WMWidget *widget)
961 return W_VIEW(widget)->hangedData;
966 void
967 WMDestroyWidget(WMWidget *widget)
969 W_UnmapView(W_VIEW(widget));
970 W_DestroyView(W_VIEW(widget));
974 void
975 WMSetFocusToWidget(WMWidget *widget)
977 W_SetFocusOfTopLevel(W_TopLevelOfView(W_VIEW(widget)), W_VIEW(widget));
982 * WMRealizeWidget-
983 * Realizes the widget and all it's children.
986 void
987 WMRealizeWidget(WMWidget *w)
989 W_RealizeView(W_VIEW(w));
992 void
993 WMMapWidget(WMWidget *w)
995 W_MapView(W_VIEW(w));
999 void
1000 WMReparentWidget(WMWidget *w, WMWidget *newParent, int x, int y)
1002 W_ReparentView(W_VIEW(w), W_VIEW(newParent), x, y);
1006 static void
1007 makeChildrenAutomap(W_View *view, int flag)
1009 view = view->childrenList;
1011 while (view) {
1012 view->flags.mapWhenRealized = flag;
1013 makeChildrenAutomap(view, flag);
1015 view = view->nextSister;
1020 void
1021 WMMapSubwidgets(WMWidget *w)
1023 /* make sure that subwidgets created after the parent was realized
1024 * are mapped too */
1025 if (!W_VIEW(w)->flags.realized) {
1026 makeChildrenAutomap(W_VIEW(w), True);
1027 } else {
1028 W_MapSubviews(W_VIEW(w));
1033 void
1034 WMUnmapSubwidgets(WMWidget *w)
1036 if (!W_VIEW(w)->flags.realized) {
1037 makeChildrenAutomap(W_VIEW(w), False);
1038 } else {
1039 W_UnmapSubviews(W_VIEW(w));
1045 void
1046 WMUnmapWidget(WMWidget *w)
1048 W_UnmapView(W_VIEW(w));
1052 Bool
1053 WMWidgetIsMapped(WMWidget *w)
1055 return W_VIEW(w)->flags.mapped;
1059 void
1060 WMSetWidgetBackgroundColor(WMWidget *w, WMColor *color)
1062 W_SetViewBackgroundColor(W_VIEW(w), color);
1063 if (W_VIEW(w)->flags.mapped)
1064 WMRedisplayWidget(w);
1068 void
1069 WMRaiseWidget(WMWidget *w)
1071 W_RaiseView(W_VIEW(w));
1075 void
1076 WMLowerWidget(WMWidget *w)
1078 W_LowerView(W_VIEW(w));
1082 void
1083 WMMoveWidget(WMWidget *w, int x, int y)
1085 W_MoveView(W_VIEW(w), x, y);
1089 void
1090 WMResizeWidget(WMWidget *w, unsigned int width, unsigned int height)
1092 W_ResizeView(W_VIEW(w), width, height);
1097 W_Class
1098 W_RegisterUserWidget(void)
1100 userWidgetCount++;
1102 return userWidgetCount + WC_UserWidget - 1;
1107 RContext*
1108 WMScreenRContext(WMScreen *scr)
1110 return scr->rcontext;
1115 unsigned int
1116 WMWidgetWidth(WMWidget *w)
1118 return W_VIEW(w)->size.width;
1122 unsigned int
1123 WMWidgetHeight(WMWidget *w)
1125 return W_VIEW(w)->size.height;
1129 Window
1130 WMWidgetXID(WMWidget *w)
1132 return W_VIEW(w)->window;
1136 WMScreen*
1137 WMWidgetScreen(WMWidget *w)
1139 return W_VIEW(w)->screen;
1144 void
1145 WMScreenMainLoop(WMScreen *scr)
1147 XEvent event;
1149 while (1) {
1150 WMNextEvent(scr->display, &event);
1151 WMHandleEvent(&event);
1156 void
1157 WMBreakModalLoop(WMScreen *scr)
1159 scr->modalLoop = 0;
1163 void
1164 WMRunModalLoop(WMScreen *scr, WMView *view)
1166 /* why is scr passed if is determined from the view? */
1167 /*WMScreen *scr = view->screen;*/
1168 int oldModalLoop = scr->modalLoop;
1169 WMView *oldModalView = scr->modalView;
1171 scr->modalView = view;
1173 scr->modalLoop = 1;
1174 while (scr->modalLoop) {
1175 XEvent event;
1177 WMNextEvent(scr->display, &event);
1178 WMHandleEvent(&event);
1181 scr->modalView = oldModalView;
1182 scr->modalLoop = oldModalLoop;
1186 Display*
1187 WMScreenDisplay(WMScreen *scr)
1189 return scr->display;
1193 int
1194 WMScreenDepth(WMScreen *scr)
1196 return scr->depth;
1200 unsigned int
1201 WMScreenWidth(WMScreen *scr)
1203 return scr->rootView->size.width;
1207 unsigned int
1208 WMScreenHeight(WMScreen *scr)
1210 return scr->rootView->size.height;
1214 void
1215 WMRedisplayWidget(WMWidget *w)
1217 W_RedisplayView(W_VIEW(w));