support for compiling with xft2
[wmaker-crm.git] / WINGs / widgets.c
bloba9ddc8882f12f0c9b538df17f675350c3a4656ff
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 scrPtr->xftFontSetCache = WMCreateHashTable(WMStringPointerHashCallbacks);
631 #ifdef XFT
633 # ifdef XFT2
634 scrPtr->hasXftSupport = 1;
635 # else
636 scrPtr->hasXftSupport = XftDefaultHasRender(scrPtr->display);
637 # endif
639 scrPtr->xftdraw = XftDrawCreate(scrPtr->display, W_DRAWABLE(scrPtr),
640 scrPtr->visual, scrPtr->colormap);
641 #endif
643 /* create input method stuff */
644 W_InitIMStuff(scrPtr);
646 /* Create missing CUT_BUFFERs */
648 Atom *rootWinProps;
649 int exists[8] = {0, 0, 0, 0, 0, 0, 0, 0};
650 int count;
652 rootWinProps = XListProperties(display, scrPtr->rootWin, &count);
653 for (i=0; i<count; i++) {
654 switch(rootWinProps[i]) {
655 case XA_CUT_BUFFER0:
656 exists[0] = 1; break;
657 case XA_CUT_BUFFER1:
658 exists[1] = 1; break;
659 case XA_CUT_BUFFER2:
660 exists[2] = 1; break;
661 case XA_CUT_BUFFER3:
662 exists[3] = 1; break;
663 case XA_CUT_BUFFER4:
664 exists[4] = 1; break;
665 case XA_CUT_BUFFER5:
666 exists[5] = 1; break;
667 case XA_CUT_BUFFER6:
668 exists[6] = 1; break;
669 case XA_CUT_BUFFER7:
670 exists[7] = 1; break;
671 default:
672 break;
675 if (rootWinProps) {
676 XFree(rootWinProps);
678 for (i=0; i<8; i++) {
679 if (!exists[i]) {
680 XStoreBuffer(display, "", 0, i);
685 scrPtr->ignoredModifierMask = 0;
687 int i;
688 XModifierKeymap *modmap;
689 KeyCode nlock, slock;
690 static int mask_table[8] = {
691 ShiftMask,LockMask,ControlMask,Mod1Mask,
692 Mod2Mask, Mod3Mask, Mod4Mask, Mod5Mask
694 unsigned int numLockMask=0, scrollLockMask=0;
696 nlock = XKeysymToKeycode(display, XK_Num_Lock);
697 slock = XKeysymToKeycode(display, XK_Scroll_Lock);
700 * Find out the masks for the NumLock and ScrollLock modifiers,
701 * so that we can bind the grabs for when they are enabled too.
703 modmap = XGetModifierMapping(display);
705 if (modmap!=NULL && modmap->max_keypermod>0) {
706 for (i=0; i<8*modmap->max_keypermod; i++) {
707 if (modmap->modifiermap[i]==nlock && nlock!=0)
708 numLockMask = mask_table[i/modmap->max_keypermod];
709 else if (modmap->modifiermap[i]==slock && slock!=0)
710 scrollLockMask = mask_table[i/modmap->max_keypermod];
714 if (modmap)
715 XFreeModifiermap(modmap);
718 scrPtr->ignoredModifierMask = numLockMask|scrollLockMask|LockMask;
721 /* initially allocate some colors */
722 WMWhiteColor(scrPtr);
723 WMBlackColor(scrPtr);
724 WMGrayColor(scrPtr);
725 WMDarkGrayColor(scrPtr);
727 gcv.graphics_exposures = False;
729 gcv.function = GXxor;
730 gcv.foreground = W_PIXEL(scrPtr->white);
731 if (gcv.foreground == 0) gcv.foreground = 1;
732 scrPtr->xorGC = XCreateGC(display, W_DRAWABLE(scrPtr), GCFunction
733 |GCGraphicsExposures|GCForeground, &gcv);
735 gcv.function = GXxor;
736 gcv.foreground = W_PIXEL(scrPtr->gray);
737 gcv.subwindow_mode = IncludeInferiors;
738 scrPtr->ixorGC = XCreateGC(display, W_DRAWABLE(scrPtr), GCFunction
739 |GCGraphicsExposures|GCForeground
740 |GCSubwindowMode, &gcv);
742 gcv.function = GXcopy;
743 scrPtr->copyGC = XCreateGC(display, W_DRAWABLE(scrPtr), GCFunction
744 |GCGraphicsExposures, &gcv);
746 scrPtr->clipGC = XCreateGC(display, W_DRAWABLE(scrPtr), GCFunction
747 |GCGraphicsExposures, &gcv);
749 stipple = XCreateBitmapFromData(display, W_DRAWABLE(scrPtr),
750 STIPPLE_BITS, STIPPLE_WIDTH, STIPPLE_HEIGHT);
751 gcv.foreground = W_PIXEL(scrPtr->darkGray);
752 gcv.background = W_PIXEL(scrPtr->gray);
753 gcv.fill_style = FillStippled;
754 gcv.stipple = stipple;
755 scrPtr->stippleGC = XCreateGC(display, W_DRAWABLE(scrPtr),
756 GCForeground|GCBackground|GCStipple
757 |GCFillStyle|GCGraphicsExposures, &gcv);
759 scrPtr->drawStringGC = XCreateGC(display, W_DRAWABLE(scrPtr),
760 GCGraphicsExposures, &gcv);
761 scrPtr->drawImStringGC = XCreateGC(display, W_DRAWABLE(scrPtr),
762 GCGraphicsExposures, &gcv);
764 /* we need a 1bpp drawable for the monoGC, so borrow this one */
765 scrPtr->monoGC = XCreateGC(display, stipple, 0, NULL);
767 scrPtr->stipple = stipple;
769 scrPtr->useMultiByte = WINGsConfiguration.useMultiByte;
771 if (scrPtr->hasXftSupport) {
772 scrPtr->antialiasedText = WINGsConfiguration.antialiasedText;
773 } else {
774 if (WINGsConfiguration.antialiasedText) {
775 wwarning(_("Text antialiasing is enabled in the configuration but"
776 " the X server doesn't have the required capabilities "
777 "(missing RENDER extension). Disabling text antialiasing."));
779 scrPtr->antialiasedText = False;
782 scrPtr->normalFont = WMSystemFontOfSize(scrPtr,
783 WINGsConfiguration.defaultFontSize);
785 scrPtr->boldFont = WMBoldSystemFontOfSize(scrPtr,
786 WINGsConfiguration.defaultFontSize);
788 if (!scrPtr->boldFont)
789 scrPtr->boldFont = scrPtr->normalFont;
791 if (!scrPtr->normalFont) {
792 wwarning(_("could not load any fonts. Make sure your font installation"
793 " and locale settings are correct."));
795 return NULL;
798 scrPtr->checkButtonImageOn = makePixmap(scrPtr, CHECK_BUTTON_ON,
799 CHECK_BUTTON_ON_WIDTH,
800 CHECK_BUTTON_ON_HEIGHT, False);
802 scrPtr->checkButtonImageOff = makePixmap(scrPtr, CHECK_BUTTON_OFF,
803 CHECK_BUTTON_OFF_WIDTH,
804 CHECK_BUTTON_OFF_HEIGHT, False);
806 scrPtr->radioButtonImageOn = makePixmap(scrPtr, RADIO_BUTTON_ON,
807 RADIO_BUTTON_ON_WIDTH,
808 RADIO_BUTTON_ON_HEIGHT, False);
810 scrPtr->radioButtonImageOff = makePixmap(scrPtr, RADIO_BUTTON_OFF,
811 RADIO_BUTTON_OFF_WIDTH,
812 RADIO_BUTTON_OFF_HEIGHT, False);
814 scrPtr->buttonArrow = makePixmap(scrPtr, BUTTON_ARROW,
815 BUTTON_ARROW_WIDTH, BUTTON_ARROW_HEIGHT,
816 False);
818 scrPtr->pushedButtonArrow = makePixmap(scrPtr, BUTTON_ARROW2,
819 BUTTON_ARROW2_WIDTH, BUTTON_ARROW2_HEIGHT,
820 False);
823 scrPtr->scrollerDimple = makePixmap(scrPtr, SCROLLER_DIMPLE,
824 SCROLLER_DIMPLE_WIDTH,
825 SCROLLER_DIMPLE_HEIGHT, False);
828 scrPtr->upArrow = makePixmap(scrPtr, SCROLLER_ARROW_UP,
829 SCROLLER_ARROW_UP_WIDTH,
830 SCROLLER_ARROW_UP_HEIGHT, True);
832 scrPtr->downArrow = makePixmap(scrPtr, SCROLLER_ARROW_DOWN,
833 SCROLLER_ARROW_DOWN_WIDTH,
834 SCROLLER_ARROW_DOWN_HEIGHT, True);
836 scrPtr->leftArrow = makePixmap(scrPtr, SCROLLER_ARROW_LEFT,
837 SCROLLER_ARROW_LEFT_WIDTH,
838 SCROLLER_ARROW_LEFT_HEIGHT, True);
840 scrPtr->rightArrow = makePixmap(scrPtr, SCROLLER_ARROW_RIGHT,
841 SCROLLER_ARROW_RIGHT_WIDTH,
842 SCROLLER_ARROW_RIGHT_HEIGHT, True);
844 scrPtr->hiUpArrow = makePixmap(scrPtr, HI_SCROLLER_ARROW_UP,
845 SCROLLER_ARROW_UP_WIDTH,
846 SCROLLER_ARROW_UP_HEIGHT, True);
848 scrPtr->hiDownArrow = makePixmap(scrPtr, HI_SCROLLER_ARROW_DOWN,
849 SCROLLER_ARROW_DOWN_WIDTH,
850 SCROLLER_ARROW_DOWN_HEIGHT, True);
852 scrPtr->hiLeftArrow = makePixmap(scrPtr, HI_SCROLLER_ARROW_LEFT,
853 SCROLLER_ARROW_LEFT_WIDTH,
854 SCROLLER_ARROW_LEFT_HEIGHT, True);
856 scrPtr->hiRightArrow = makePixmap(scrPtr, HI_SCROLLER_ARROW_RIGHT,
857 SCROLLER_ARROW_RIGHT_WIDTH,
858 SCROLLER_ARROW_RIGHT_HEIGHT, True);
860 scrPtr->popUpIndicator = makePixmap(scrPtr, POPUP_INDICATOR,
861 POPUP_INDICATOR_WIDTH,
862 POPUP_INDICATOR_HEIGHT, True);
864 scrPtr->pullDownIndicator = makePixmap(scrPtr, PULLDOWN_INDICATOR,
865 PULLDOWN_INDICATOR_WIDTH,
866 PULLDOWN_INDICATOR_HEIGHT, True);
868 scrPtr->checkMark = makePixmap(scrPtr, CHECK_MARK,
869 CHECK_MARK_WIDTH,
870 CHECK_MARK_HEIGHT, True);
872 loadPixmaps(scrPtr);
874 scrPtr->defaultCursor = XCreateFontCursor(display, XC_left_ptr);
876 scrPtr->textCursor = XCreateFontCursor(display, XC_xterm);
879 XColor bla;
880 Pixmap blank;
882 blank = XCreatePixmap(display, scrPtr->stipple, 1, 1, 1);
883 XSetForeground(display, scrPtr->monoGC, 0);
884 XFillRectangle(display, blank, scrPtr->monoGC, 0, 0, 1, 1);
886 scrPtr->invisibleCursor = XCreatePixmapCursor(display, blank, blank,
887 &bla, &bla, 0, 0);
888 XFreePixmap(display, blank);
891 #ifdef HAVE_XINTERNATOMS
892 XInternAtoms(display, atomNames, sizeof(atomNames)/sizeof(char*), False,
893 atoms);
894 #else
895 for (i = 0; i < sizeof(atomNames)/sizeof(char*); i++) {
896 atoms[i] = XInternAtom(display, atomNames[i], False);
898 #endif
900 i = 0;
901 scrPtr->attribsAtom = atoms[i++];
903 scrPtr->deleteWindowAtom = atoms[i++];
905 scrPtr->protocolsAtom = atoms[i++];
907 scrPtr->clipboardAtom = atoms[i++];
909 scrPtr->xdndAwareAtom = atoms[i++];
910 scrPtr->xdndSelectionAtom = atoms[i++];
911 scrPtr->xdndEnterAtom = atoms[i++];
912 scrPtr->xdndLeaveAtom = atoms[i++];
913 scrPtr->xdndPositionAtom = atoms[i++];
914 scrPtr->xdndDropAtom = atoms[i++];
915 scrPtr->xdndFinishedAtom = atoms[i++];
916 scrPtr->xdndTypeListAtom = atoms[i++];
917 scrPtr->xdndStatusAtom = atoms[i++];
919 scrPtr->xdndActionCopy = atoms[i++];
920 scrPtr->xdndActionMove = atoms[i++];
921 scrPtr->xdndActionLink = atoms[i++];
922 scrPtr->xdndActionAsk = atoms[i++];
923 scrPtr->xdndActionPrivate = atoms[i++];
925 scrPtr->wmIconDragOffsetAtom = atoms[i++];
927 scrPtr->wmStateAtom = atoms[i++];
929 scrPtr->rootView = W_CreateRootView(scrPtr);
931 scrPtr->balloon = W_CreateBalloon(scrPtr);
934 W_InitApplication(scrPtr);
936 return scrPtr;
941 void
942 WMSetWidgetDefaultFont(WMScreen *scr, WMFont *font)
944 WMReleaseFont(scr->normalFont);
945 scr->normalFont = WMRetainFont(font);
949 void
950 WMSetWidgetDefaultBoldFont(WMScreen *scr, WMFont *font)
952 WMReleaseFont(scr->boldFont);
953 scr->boldFont = WMRetainFont(font);
958 void
959 WMHangData(WMWidget *widget, void *data)
961 W_VIEW(widget)->hangedData = data;
965 void*
966 WMGetHangedData(WMWidget *widget)
968 return W_VIEW(widget)->hangedData;
973 void
974 WMDestroyWidget(WMWidget *widget)
976 W_UnmapView(W_VIEW(widget));
977 W_DestroyView(W_VIEW(widget));
981 void
982 WMSetFocusToWidget(WMWidget *widget)
984 W_SetFocusOfTopLevel(W_TopLevelOfView(W_VIEW(widget)), W_VIEW(widget));
989 * WMRealizeWidget-
990 * Realizes the widget and all it's children.
993 void
994 WMRealizeWidget(WMWidget *w)
996 W_RealizeView(W_VIEW(w));
999 void
1000 WMMapWidget(WMWidget *w)
1002 W_MapView(W_VIEW(w));
1006 void
1007 WMReparentWidget(WMWidget *w, WMWidget *newParent, int x, int y)
1009 W_ReparentView(W_VIEW(w), W_VIEW(newParent), x, y);
1013 static void
1014 makeChildrenAutomap(W_View *view, int flag)
1016 view = view->childrenList;
1018 while (view) {
1019 view->flags.mapWhenRealized = flag;
1020 makeChildrenAutomap(view, flag);
1022 view = view->nextSister;
1027 void
1028 WMMapSubwidgets(WMWidget *w)
1030 /* make sure that subwidgets created after the parent was realized
1031 * are mapped too */
1032 if (!W_VIEW(w)->flags.realized) {
1033 makeChildrenAutomap(W_VIEW(w), True);
1034 } else {
1035 W_MapSubviews(W_VIEW(w));
1040 void
1041 WMUnmapSubwidgets(WMWidget *w)
1043 if (!W_VIEW(w)->flags.realized) {
1044 makeChildrenAutomap(W_VIEW(w), False);
1045 } else {
1046 W_UnmapSubviews(W_VIEW(w));
1052 void
1053 WMUnmapWidget(WMWidget *w)
1055 W_UnmapView(W_VIEW(w));
1059 Bool
1060 WMWidgetIsMapped(WMWidget *w)
1062 return W_VIEW(w)->flags.mapped;
1066 void
1067 WMSetWidgetBackgroundColor(WMWidget *w, WMColor *color)
1069 W_SetViewBackgroundColor(W_VIEW(w), color);
1070 if (W_VIEW(w)->flags.mapped)
1071 WMRedisplayWidget(w);
1075 WMColor*
1076 WMGetWidgetBackgroundColor(WMWidget *w)
1078 return W_VIEW(w)->backColor;
1082 void
1083 WMRaiseWidget(WMWidget *w)
1085 W_RaiseView(W_VIEW(w));
1089 void
1090 WMLowerWidget(WMWidget *w)
1092 W_LowerView(W_VIEW(w));
1096 void
1097 WMMoveWidget(WMWidget *w, int x, int y)
1099 W_MoveView(W_VIEW(w), x, y);
1103 void
1104 WMResizeWidget(WMWidget *w, unsigned int width, unsigned int height)
1106 W_ResizeView(W_VIEW(w), width, height);
1111 W_Class
1112 W_RegisterUserWidget(void)
1114 userWidgetCount++;
1116 return userWidgetCount + WC_UserWidget - 1;
1121 RContext*
1122 WMScreenRContext(WMScreen *scr)
1124 return scr->rcontext;
1129 unsigned int
1130 WMWidgetWidth(WMWidget *w)
1132 return W_VIEW(w)->size.width;
1136 unsigned int
1137 WMWidgetHeight(WMWidget *w)
1139 return W_VIEW(w)->size.height;
1143 Window
1144 WMWidgetXID(WMWidget *w)
1146 return W_VIEW(w)->window;
1150 WMScreen*
1151 WMWidgetScreen(WMWidget *w)
1153 return W_VIEW(w)->screen;
1158 void
1159 WMScreenMainLoop(WMScreen *scr)
1161 XEvent event;
1163 while (1) {
1164 WMNextEvent(scr->display, &event);
1165 WMHandleEvent(&event);
1170 void
1171 WMBreakModalLoop(WMScreen *scr)
1173 scr->modalLoop = 0;
1177 void
1178 WMRunModalLoop(WMScreen *scr, WMView *view)
1180 /* why is scr passed if is determined from the view? */
1181 /*WMScreen *scr = view->screen;*/
1182 int oldModalLoop = scr->modalLoop;
1183 WMView *oldModalView = scr->modalView;
1185 scr->modalView = view;
1187 scr->modalLoop = 1;
1188 while (scr->modalLoop) {
1189 XEvent event;
1191 WMNextEvent(scr->display, &event);
1192 WMHandleEvent(&event);
1195 scr->modalView = oldModalView;
1196 scr->modalLoop = oldModalLoop;
1200 Display*
1201 WMScreenDisplay(WMScreen *scr)
1203 return scr->display;
1207 int
1208 WMScreenDepth(WMScreen *scr)
1210 return scr->depth;
1214 unsigned int
1215 WMScreenWidth(WMScreen *scr)
1217 return scr->rootView->size.width;
1221 unsigned int
1222 WMScreenHeight(WMScreen *scr)
1224 return scr->rootView->size.height;
1228 void
1229 WMRedisplayWidget(WMWidget *w)
1231 W_RedisplayView(W_VIEW(w));