fixed a memleak in the font panel in WINGs
[wmaker-crm.git] / WINGs / widgets.c
blobd5ee4267c9f06ef7854dfd4a4c7ef0a125a02c9d
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
632 scrPtr->hasXftSupport = XftDefaultHasRender(scrPtr->display);
634 scrPtr->xftdraw = XftDrawCreate(scrPtr->display, W_DRAWABLE(scrPtr),
635 scrPtr->visual, scrPtr->colormap);
636 #endif
638 /* create input method stuff */
639 W_InitIMStuff(scrPtr);
641 /* Create missing CUT_BUFFERs */
643 Atom *rootWinProps;
644 int exists[8] = {0, 0, 0, 0, 0, 0, 0, 0};
645 int count;
647 rootWinProps = XListProperties(display, scrPtr->rootWin, &count);
648 for (i=0; i<count; i++) {
649 switch(rootWinProps[i]) {
650 case XA_CUT_BUFFER0:
651 exists[0] = 1; break;
652 case XA_CUT_BUFFER1:
653 exists[1] = 1; break;
654 case XA_CUT_BUFFER2:
655 exists[2] = 1; break;
656 case XA_CUT_BUFFER3:
657 exists[3] = 1; break;
658 case XA_CUT_BUFFER4:
659 exists[4] = 1; break;
660 case XA_CUT_BUFFER5:
661 exists[5] = 1; break;
662 case XA_CUT_BUFFER6:
663 exists[6] = 1; break;
664 case XA_CUT_BUFFER7:
665 exists[7] = 1; break;
666 default:
667 break;
670 if (rootWinProps) {
671 XFree(rootWinProps);
673 for (i=0; i<8; i++) {
674 if (!exists[i]) {
675 XStoreBuffer(display, "", 0, i);
680 scrPtr->ignoredModifierMask = 0;
682 int i;
683 XModifierKeymap *modmap;
684 KeyCode nlock, slock;
685 static int mask_table[8] = {
686 ShiftMask,LockMask,ControlMask,Mod1Mask,
687 Mod2Mask, Mod3Mask, Mod4Mask, Mod5Mask
689 unsigned int numLockMask=0, scrollLockMask=0;
691 nlock = XKeysymToKeycode(display, XK_Num_Lock);
692 slock = XKeysymToKeycode(display, XK_Scroll_Lock);
695 * Find out the masks for the NumLock and ScrollLock modifiers,
696 * so that we can bind the grabs for when they are enabled too.
698 modmap = XGetModifierMapping(display);
700 if (modmap!=NULL && modmap->max_keypermod>0) {
701 for (i=0; i<8*modmap->max_keypermod; i++) {
702 if (modmap->modifiermap[i]==nlock && nlock!=0)
703 numLockMask = mask_table[i/modmap->max_keypermod];
704 else if (modmap->modifiermap[i]==slock && slock!=0)
705 scrollLockMask = mask_table[i/modmap->max_keypermod];
709 if (modmap)
710 XFreeModifiermap(modmap);
713 scrPtr->ignoredModifierMask = numLockMask|scrollLockMask|LockMask;
716 /* initially allocate some colors */
717 WMWhiteColor(scrPtr);
718 WMBlackColor(scrPtr);
719 WMGrayColor(scrPtr);
720 WMDarkGrayColor(scrPtr);
722 gcv.graphics_exposures = False;
724 gcv.function = GXxor;
725 gcv.foreground = W_PIXEL(scrPtr->white);
726 if (gcv.foreground == 0) gcv.foreground = 1;
727 scrPtr->xorGC = XCreateGC(display, W_DRAWABLE(scrPtr), GCFunction
728 |GCGraphicsExposures|GCForeground, &gcv);
730 gcv.function = GXxor;
731 gcv.foreground = W_PIXEL(scrPtr->gray);
732 gcv.subwindow_mode = IncludeInferiors;
733 scrPtr->ixorGC = XCreateGC(display, W_DRAWABLE(scrPtr), GCFunction
734 |GCGraphicsExposures|GCForeground
735 |GCSubwindowMode, &gcv);
737 gcv.function = GXcopy;
738 scrPtr->copyGC = XCreateGC(display, W_DRAWABLE(scrPtr), GCFunction
739 |GCGraphicsExposures, &gcv);
741 scrPtr->clipGC = XCreateGC(display, W_DRAWABLE(scrPtr), GCFunction
742 |GCGraphicsExposures, &gcv);
744 stipple = XCreateBitmapFromData(display, W_DRAWABLE(scrPtr),
745 STIPPLE_BITS, STIPPLE_WIDTH, STIPPLE_HEIGHT);
746 gcv.foreground = W_PIXEL(scrPtr->darkGray);
747 gcv.background = W_PIXEL(scrPtr->gray);
748 gcv.fill_style = FillStippled;
749 gcv.stipple = stipple;
750 scrPtr->stippleGC = XCreateGC(display, W_DRAWABLE(scrPtr),
751 GCForeground|GCBackground|GCStipple
752 |GCFillStyle|GCGraphicsExposures, &gcv);
754 scrPtr->drawStringGC = XCreateGC(display, W_DRAWABLE(scrPtr),
755 GCGraphicsExposures, &gcv);
756 scrPtr->drawImStringGC = XCreateGC(display, W_DRAWABLE(scrPtr),
757 GCGraphicsExposures, &gcv);
759 /* we need a 1bpp drawable for the monoGC, so borrow this one */
760 scrPtr->monoGC = XCreateGC(display, stipple, 0, NULL);
762 scrPtr->stipple = stipple;
764 scrPtr->useMultiByte = WINGsConfiguration.useMultiByte;
766 if (scrPtr->hasXftSupport) {
767 scrPtr->antialiasedText = WINGsConfiguration.antialiasedText;
768 } else {
769 if (WINGsConfiguration.antialiasedText) {
770 wwarning(_("Text antialiasing is enabled in the configuration but"
771 " the X server doesn't have the required capabilities "
772 "(missing RENDER extension). Disabling text antialiasing."));
774 scrPtr->antialiasedText = False;
777 scrPtr->normalFont = WMSystemFontOfSize(scrPtr,
778 WINGsConfiguration.defaultFontSize);
780 scrPtr->boldFont = WMBoldSystemFontOfSize(scrPtr,
781 WINGsConfiguration.defaultFontSize);
783 if (!scrPtr->boldFont)
784 scrPtr->boldFont = scrPtr->normalFont;
786 if (!scrPtr->normalFont) {
787 wwarning(_("could not load any fonts. Make sure your font installation"
788 " and locale settings are correct."));
790 return NULL;
793 scrPtr->checkButtonImageOn = makePixmap(scrPtr, CHECK_BUTTON_ON,
794 CHECK_BUTTON_ON_WIDTH,
795 CHECK_BUTTON_ON_HEIGHT, False);
797 scrPtr->checkButtonImageOff = makePixmap(scrPtr, CHECK_BUTTON_OFF,
798 CHECK_BUTTON_OFF_WIDTH,
799 CHECK_BUTTON_OFF_HEIGHT, False);
801 scrPtr->radioButtonImageOn = makePixmap(scrPtr, RADIO_BUTTON_ON,
802 RADIO_BUTTON_ON_WIDTH,
803 RADIO_BUTTON_ON_HEIGHT, False);
805 scrPtr->radioButtonImageOff = makePixmap(scrPtr, RADIO_BUTTON_OFF,
806 RADIO_BUTTON_OFF_WIDTH,
807 RADIO_BUTTON_OFF_HEIGHT, False);
809 scrPtr->buttonArrow = makePixmap(scrPtr, BUTTON_ARROW,
810 BUTTON_ARROW_WIDTH, BUTTON_ARROW_HEIGHT,
811 False);
813 scrPtr->pushedButtonArrow = makePixmap(scrPtr, BUTTON_ARROW2,
814 BUTTON_ARROW2_WIDTH, BUTTON_ARROW2_HEIGHT,
815 False);
818 scrPtr->scrollerDimple = makePixmap(scrPtr, SCROLLER_DIMPLE,
819 SCROLLER_DIMPLE_WIDTH,
820 SCROLLER_DIMPLE_HEIGHT, False);
823 scrPtr->upArrow = makePixmap(scrPtr, SCROLLER_ARROW_UP,
824 SCROLLER_ARROW_UP_WIDTH,
825 SCROLLER_ARROW_UP_HEIGHT, True);
827 scrPtr->downArrow = makePixmap(scrPtr, SCROLLER_ARROW_DOWN,
828 SCROLLER_ARROW_DOWN_WIDTH,
829 SCROLLER_ARROW_DOWN_HEIGHT, True);
831 scrPtr->leftArrow = makePixmap(scrPtr, SCROLLER_ARROW_LEFT,
832 SCROLLER_ARROW_LEFT_WIDTH,
833 SCROLLER_ARROW_LEFT_HEIGHT, True);
835 scrPtr->rightArrow = makePixmap(scrPtr, SCROLLER_ARROW_RIGHT,
836 SCROLLER_ARROW_RIGHT_WIDTH,
837 SCROLLER_ARROW_RIGHT_HEIGHT, True);
839 scrPtr->hiUpArrow = makePixmap(scrPtr, HI_SCROLLER_ARROW_UP,
840 SCROLLER_ARROW_UP_WIDTH,
841 SCROLLER_ARROW_UP_HEIGHT, True);
843 scrPtr->hiDownArrow = makePixmap(scrPtr, HI_SCROLLER_ARROW_DOWN,
844 SCROLLER_ARROW_DOWN_WIDTH,
845 SCROLLER_ARROW_DOWN_HEIGHT, True);
847 scrPtr->hiLeftArrow = makePixmap(scrPtr, HI_SCROLLER_ARROW_LEFT,
848 SCROLLER_ARROW_LEFT_WIDTH,
849 SCROLLER_ARROW_LEFT_HEIGHT, True);
851 scrPtr->hiRightArrow = makePixmap(scrPtr, HI_SCROLLER_ARROW_RIGHT,
852 SCROLLER_ARROW_RIGHT_WIDTH,
853 SCROLLER_ARROW_RIGHT_HEIGHT, True);
855 scrPtr->popUpIndicator = makePixmap(scrPtr, POPUP_INDICATOR,
856 POPUP_INDICATOR_WIDTH,
857 POPUP_INDICATOR_HEIGHT, True);
859 scrPtr->pullDownIndicator = makePixmap(scrPtr, PULLDOWN_INDICATOR,
860 PULLDOWN_INDICATOR_WIDTH,
861 PULLDOWN_INDICATOR_HEIGHT, True);
863 scrPtr->checkMark = makePixmap(scrPtr, CHECK_MARK,
864 CHECK_MARK_WIDTH,
865 CHECK_MARK_HEIGHT, True);
867 loadPixmaps(scrPtr);
869 scrPtr->defaultCursor = XCreateFontCursor(display, XC_left_ptr);
871 scrPtr->textCursor = XCreateFontCursor(display, XC_xterm);
874 XColor bla;
875 Pixmap blank;
877 blank = XCreatePixmap(display, scrPtr->stipple, 1, 1, 1);
878 XSetForeground(display, scrPtr->monoGC, 0);
879 XFillRectangle(display, blank, scrPtr->monoGC, 0, 0, 1, 1);
881 scrPtr->invisibleCursor = XCreatePixmapCursor(display, blank, blank,
882 &bla, &bla, 0, 0);
883 XFreePixmap(display, blank);
886 #ifdef HAVE_XINTERNATOMS
887 XInternAtoms(display, atomNames, sizeof(atomNames)/sizeof(char*), False,
888 atoms);
889 #else
890 for (i = 0; i < sizeof(atomNames)/sizeof(char*); i++) {
891 atoms[i] = XInternAtom(display, atomNames[i], False);
893 #endif
895 i = 0;
896 scrPtr->attribsAtom = atoms[i++];
898 scrPtr->deleteWindowAtom = atoms[i++];
900 scrPtr->protocolsAtom = atoms[i++];
902 scrPtr->clipboardAtom = atoms[i++];
904 scrPtr->xdndAwareAtom = atoms[i++];
905 scrPtr->xdndSelectionAtom = atoms[i++];
906 scrPtr->xdndEnterAtom = atoms[i++];
907 scrPtr->xdndLeaveAtom = atoms[i++];
908 scrPtr->xdndPositionAtom = atoms[i++];
909 scrPtr->xdndDropAtom = atoms[i++];
910 scrPtr->xdndFinishedAtom = atoms[i++];
911 scrPtr->xdndTypeListAtom = atoms[i++];
912 scrPtr->xdndStatusAtom = atoms[i++];
914 scrPtr->xdndActionCopy = atoms[i++];
915 scrPtr->xdndActionMove = atoms[i++];
916 scrPtr->xdndActionLink = atoms[i++];
917 scrPtr->xdndActionAsk = atoms[i++];
918 scrPtr->xdndActionPrivate = atoms[i++];
920 scrPtr->wmIconDragOffsetAtom = atoms[i++];
922 scrPtr->wmStateAtom = atoms[i++];
924 scrPtr->rootView = W_CreateRootView(scrPtr);
926 scrPtr->balloon = W_CreateBalloon(scrPtr);
929 W_InitApplication(scrPtr);
931 return scrPtr;
936 void
937 WMSetWidgetDefaultFont(WMScreen *scr, WMFont *font)
939 WMReleaseFont(scr->normalFont);
940 scr->normalFont = WMRetainFont(font);
944 void
945 WMSetWidgetDefaultBoldFont(WMScreen *scr, WMFont *font)
947 WMReleaseFont(scr->boldFont);
948 scr->boldFont = WMRetainFont(font);
953 void
954 WMHangData(WMWidget *widget, void *data)
956 W_VIEW(widget)->hangedData = data;
960 void*
961 WMGetHangedData(WMWidget *widget)
963 return W_VIEW(widget)->hangedData;
968 void
969 WMDestroyWidget(WMWidget *widget)
971 W_UnmapView(W_VIEW(widget));
972 W_DestroyView(W_VIEW(widget));
976 void
977 WMSetFocusToWidget(WMWidget *widget)
979 W_SetFocusOfTopLevel(W_TopLevelOfView(W_VIEW(widget)), W_VIEW(widget));
984 * WMRealizeWidget-
985 * Realizes the widget and all it's children.
988 void
989 WMRealizeWidget(WMWidget *w)
991 W_RealizeView(W_VIEW(w));
994 void
995 WMMapWidget(WMWidget *w)
997 W_MapView(W_VIEW(w));
1001 void
1002 WMReparentWidget(WMWidget *w, WMWidget *newParent, int x, int y)
1004 W_ReparentView(W_VIEW(w), W_VIEW(newParent), x, y);
1008 static void
1009 makeChildrenAutomap(W_View *view, int flag)
1011 view = view->childrenList;
1013 while (view) {
1014 view->flags.mapWhenRealized = flag;
1015 makeChildrenAutomap(view, flag);
1017 view = view->nextSister;
1022 void
1023 WMMapSubwidgets(WMWidget *w)
1025 /* make sure that subwidgets created after the parent was realized
1026 * are mapped too */
1027 if (!W_VIEW(w)->flags.realized) {
1028 makeChildrenAutomap(W_VIEW(w), True);
1029 } else {
1030 W_MapSubviews(W_VIEW(w));
1035 void
1036 WMUnmapSubwidgets(WMWidget *w)
1038 if (!W_VIEW(w)->flags.realized) {
1039 makeChildrenAutomap(W_VIEW(w), False);
1040 } else {
1041 W_UnmapSubviews(W_VIEW(w));
1047 void
1048 WMUnmapWidget(WMWidget *w)
1050 W_UnmapView(W_VIEW(w));
1054 Bool
1055 WMWidgetIsMapped(WMWidget *w)
1057 return W_VIEW(w)->flags.mapped;
1061 void
1062 WMSetWidgetBackgroundColor(WMWidget *w, WMColor *color)
1064 W_SetViewBackgroundColor(W_VIEW(w), color);
1065 if (W_VIEW(w)->flags.mapped)
1066 WMRedisplayWidget(w);
1070 WMColor*
1071 WMGetWidgetBackgroundColor(WMWidget *w)
1073 // should retain?
1074 return W_VIEW(w)->backColor;
1078 void
1079 WMRaiseWidget(WMWidget *w)
1081 W_RaiseView(W_VIEW(w));
1085 void
1086 WMLowerWidget(WMWidget *w)
1088 W_LowerView(W_VIEW(w));
1092 void
1093 WMMoveWidget(WMWidget *w, int x, int y)
1095 W_MoveView(W_VIEW(w), x, y);
1099 void
1100 WMResizeWidget(WMWidget *w, unsigned int width, unsigned int height)
1102 W_ResizeView(W_VIEW(w), width, height);
1107 W_Class
1108 W_RegisterUserWidget(void)
1110 userWidgetCount++;
1112 return userWidgetCount + WC_UserWidget - 1;
1117 RContext*
1118 WMScreenRContext(WMScreen *scr)
1120 return scr->rcontext;
1125 unsigned int
1126 WMWidgetWidth(WMWidget *w)
1128 return W_VIEW(w)->size.width;
1132 unsigned int
1133 WMWidgetHeight(WMWidget *w)
1135 return W_VIEW(w)->size.height;
1139 Window
1140 WMWidgetXID(WMWidget *w)
1142 return W_VIEW(w)->window;
1146 WMScreen*
1147 WMWidgetScreen(WMWidget *w)
1149 return W_VIEW(w)->screen;
1154 void
1155 WMScreenMainLoop(WMScreen *scr)
1157 XEvent event;
1159 while (1) {
1160 WMNextEvent(scr->display, &event);
1161 WMHandleEvent(&event);
1166 void
1167 WMBreakModalLoop(WMScreen *scr)
1169 scr->modalLoop = 0;
1173 void
1174 WMRunModalLoop(WMScreen *scr, WMView *view)
1176 /* why is scr passed if is determined from the view? */
1177 /*WMScreen *scr = view->screen;*/
1178 int oldModalLoop = scr->modalLoop;
1179 WMView *oldModalView = scr->modalView;
1181 scr->modalView = view;
1183 scr->modalLoop = 1;
1184 while (scr->modalLoop) {
1185 XEvent event;
1187 WMNextEvent(scr->display, &event);
1188 WMHandleEvent(&event);
1191 scr->modalView = oldModalView;
1192 scr->modalLoop = oldModalLoop;
1196 Display*
1197 WMScreenDisplay(WMScreen *scr)
1199 return scr->display;
1203 int
1204 WMScreenDepth(WMScreen *scr)
1206 return scr->depth;
1210 unsigned int
1211 WMScreenWidth(WMScreen *scr)
1213 return scr->rootView->size.width;
1217 unsigned int
1218 WMScreenHeight(WMScreen *scr)
1220 return scr->rootView->size.height;
1224 void
1225 WMRedisplayWidget(WMWidget *w)
1227 W_RedisplayView(W_VIEW(w));