- Converted functions in wfont.c to use xft semantics in place of old X core
[wmaker-crm.git] / WINGs / widgets.c
blob108fafd02d3e4a8a1c77111340d603f121d087f5
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 #ifdef XFT
626 scrPtr->xftdraw = XftDrawCreate(scrPtr->display, W_DRAWABLE(scrPtr),
627 scrPtr->visual, scrPtr->colormap);
628 #endif
630 /* create input method stuff */
631 W_InitIMStuff(scrPtr);
633 /* Create missing CUT_BUFFERs */
635 Atom *rootWinProps;
636 int exists[8] = {0, 0, 0, 0, 0, 0, 0, 0};
637 int count;
639 rootWinProps = XListProperties(display, scrPtr->rootWin, &count);
640 for (i=0; i<count; i++) {
641 switch(rootWinProps[i]) {
642 case XA_CUT_BUFFER0:
643 exists[0] = 1; break;
644 case XA_CUT_BUFFER1:
645 exists[1] = 1; break;
646 case XA_CUT_BUFFER2:
647 exists[2] = 1; break;
648 case XA_CUT_BUFFER3:
649 exists[3] = 1; break;
650 case XA_CUT_BUFFER4:
651 exists[4] = 1; break;
652 case XA_CUT_BUFFER5:
653 exists[5] = 1; break;
654 case XA_CUT_BUFFER6:
655 exists[6] = 1; break;
656 case XA_CUT_BUFFER7:
657 exists[7] = 1; break;
658 default:
659 break;
662 if (rootWinProps) {
663 XFree(rootWinProps);
665 for (i=0; i<8; i++) {
666 if (!exists[i]) {
667 XStoreBuffer(display, "", 0, i);
672 scrPtr->ignoredModifierMask = 0;
674 int i;
675 XModifierKeymap *modmap;
676 KeyCode nlock, slock;
677 static int mask_table[8] = {
678 ShiftMask,LockMask,ControlMask,Mod1Mask,
679 Mod2Mask, Mod3Mask, Mod4Mask, Mod5Mask
681 unsigned int numLockMask=0, scrollLockMask=0;
683 nlock = XKeysymToKeycode(display, XK_Num_Lock);
684 slock = XKeysymToKeycode(display, XK_Scroll_Lock);
687 * Find out the masks for the NumLock and ScrollLock modifiers,
688 * so that we can bind the grabs for when they are enabled too.
690 modmap = XGetModifierMapping(display);
692 if (modmap!=NULL && modmap->max_keypermod>0) {
693 for (i=0; i<8*modmap->max_keypermod; i++) {
694 if (modmap->modifiermap[i]==nlock && nlock!=0)
695 numLockMask = mask_table[i/modmap->max_keypermod];
696 else if (modmap->modifiermap[i]==slock && slock!=0)
697 scrollLockMask = mask_table[i/modmap->max_keypermod];
701 if (modmap)
702 XFreeModifiermap(modmap);
705 scrPtr->ignoredModifierMask = numLockMask|scrollLockMask|LockMask;
708 /* initially allocate some colors */
709 WMWhiteColor(scrPtr);
710 WMBlackColor(scrPtr);
711 WMGrayColor(scrPtr);
712 WMDarkGrayColor(scrPtr);
714 gcv.graphics_exposures = False;
716 gcv.function = GXxor;
717 gcv.foreground = W_PIXEL(scrPtr->white);
718 if (gcv.foreground == 0) gcv.foreground = 1;
719 scrPtr->xorGC = XCreateGC(display, W_DRAWABLE(scrPtr), GCFunction
720 |GCGraphicsExposures|GCForeground, &gcv);
722 gcv.function = GXxor;
723 gcv.foreground = W_PIXEL(scrPtr->gray);
724 gcv.subwindow_mode = IncludeInferiors;
725 scrPtr->ixorGC = XCreateGC(display, W_DRAWABLE(scrPtr), GCFunction
726 |GCGraphicsExposures|GCForeground
727 |GCSubwindowMode, &gcv);
729 gcv.function = GXcopy;
730 scrPtr->copyGC = XCreateGC(display, W_DRAWABLE(scrPtr), GCFunction
731 |GCGraphicsExposures, &gcv);
733 scrPtr->clipGC = XCreateGC(display, W_DRAWABLE(scrPtr), GCFunction
734 |GCGraphicsExposures, &gcv);
736 stipple = XCreateBitmapFromData(display, W_DRAWABLE(scrPtr),
737 STIPPLE_BITS, STIPPLE_WIDTH, STIPPLE_HEIGHT);
738 gcv.foreground = W_PIXEL(scrPtr->darkGray);
739 gcv.background = W_PIXEL(scrPtr->gray);
740 gcv.fill_style = FillStippled;
741 gcv.stipple = stipple;
742 scrPtr->stippleGC = XCreateGC(display, W_DRAWABLE(scrPtr),
743 GCForeground|GCBackground|GCStipple
744 |GCFillStyle|GCGraphicsExposures, &gcv);
746 scrPtr->drawStringGC = XCreateGC(display, W_DRAWABLE(scrPtr),
747 GCGraphicsExposures, &gcv);
748 scrPtr->drawImStringGC = XCreateGC(display, W_DRAWABLE(scrPtr),
749 GCGraphicsExposures, &gcv);
751 /* we need a 1bpp drawable for the monoGC, so borrow this one */
752 scrPtr->monoGC = XCreateGC(display, stipple, 0, NULL);
754 scrPtr->stipple = stipple;
756 scrPtr->useMultiByte = WINGsConfiguration.useMultiByte;
758 scrPtr->useWideChar = 1;
760 scrPtr->antialiasedText = WINGsConfiguration.antialiasedText;
762 scrPtr->normalFont = WMSystemFontOfSize(scrPtr,
763 WINGsConfiguration.defaultFontSize);
765 scrPtr->boldFont = WMBoldSystemFontOfSize(scrPtr,
766 WINGsConfiguration.defaultFontSize);
768 if (!scrPtr->boldFont)
769 scrPtr->boldFont = scrPtr->normalFont;
771 if (!scrPtr->normalFont) {
772 wwarning(_("could not load any fonts. Make sure your font installation"
773 " and locale settings are correct."));
775 return NULL;
778 scrPtr->checkButtonImageOn = makePixmap(scrPtr, CHECK_BUTTON_ON,
779 CHECK_BUTTON_ON_WIDTH,
780 CHECK_BUTTON_ON_HEIGHT, False);
782 scrPtr->checkButtonImageOff = makePixmap(scrPtr, CHECK_BUTTON_OFF,
783 CHECK_BUTTON_OFF_WIDTH,
784 CHECK_BUTTON_OFF_HEIGHT, False);
786 scrPtr->radioButtonImageOn = makePixmap(scrPtr, RADIO_BUTTON_ON,
787 RADIO_BUTTON_ON_WIDTH,
788 RADIO_BUTTON_ON_HEIGHT, False);
790 scrPtr->radioButtonImageOff = makePixmap(scrPtr, RADIO_BUTTON_OFF,
791 RADIO_BUTTON_OFF_WIDTH,
792 RADIO_BUTTON_OFF_HEIGHT, False);
794 scrPtr->buttonArrow = makePixmap(scrPtr, BUTTON_ARROW,
795 BUTTON_ARROW_WIDTH, BUTTON_ARROW_HEIGHT,
796 False);
798 scrPtr->pushedButtonArrow = makePixmap(scrPtr, BUTTON_ARROW2,
799 BUTTON_ARROW2_WIDTH, BUTTON_ARROW2_HEIGHT,
800 False);
803 scrPtr->scrollerDimple = makePixmap(scrPtr, SCROLLER_DIMPLE,
804 SCROLLER_DIMPLE_WIDTH,
805 SCROLLER_DIMPLE_HEIGHT, False);
808 scrPtr->upArrow = makePixmap(scrPtr, SCROLLER_ARROW_UP,
809 SCROLLER_ARROW_UP_WIDTH,
810 SCROLLER_ARROW_UP_HEIGHT, True);
812 scrPtr->downArrow = makePixmap(scrPtr, SCROLLER_ARROW_DOWN,
813 SCROLLER_ARROW_DOWN_WIDTH,
814 SCROLLER_ARROW_DOWN_HEIGHT, True);
816 scrPtr->leftArrow = makePixmap(scrPtr, SCROLLER_ARROW_LEFT,
817 SCROLLER_ARROW_LEFT_WIDTH,
818 SCROLLER_ARROW_LEFT_HEIGHT, True);
820 scrPtr->rightArrow = makePixmap(scrPtr, SCROLLER_ARROW_RIGHT,
821 SCROLLER_ARROW_RIGHT_WIDTH,
822 SCROLLER_ARROW_RIGHT_HEIGHT, True);
824 scrPtr->hiUpArrow = makePixmap(scrPtr, HI_SCROLLER_ARROW_UP,
825 SCROLLER_ARROW_UP_WIDTH,
826 SCROLLER_ARROW_UP_HEIGHT, True);
828 scrPtr->hiDownArrow = makePixmap(scrPtr, HI_SCROLLER_ARROW_DOWN,
829 SCROLLER_ARROW_DOWN_WIDTH,
830 SCROLLER_ARROW_DOWN_HEIGHT, True);
832 scrPtr->hiLeftArrow = makePixmap(scrPtr, HI_SCROLLER_ARROW_LEFT,
833 SCROLLER_ARROW_LEFT_WIDTH,
834 SCROLLER_ARROW_LEFT_HEIGHT, True);
836 scrPtr->hiRightArrow = makePixmap(scrPtr, HI_SCROLLER_ARROW_RIGHT,
837 SCROLLER_ARROW_RIGHT_WIDTH,
838 SCROLLER_ARROW_RIGHT_HEIGHT, True);
840 scrPtr->popUpIndicator = makePixmap(scrPtr, POPUP_INDICATOR,
841 POPUP_INDICATOR_WIDTH,
842 POPUP_INDICATOR_HEIGHT, True);
844 scrPtr->pullDownIndicator = makePixmap(scrPtr, PULLDOWN_INDICATOR,
845 PULLDOWN_INDICATOR_WIDTH,
846 PULLDOWN_INDICATOR_HEIGHT, True);
848 scrPtr->checkMark = makePixmap(scrPtr, CHECK_MARK,
849 CHECK_MARK_WIDTH,
850 CHECK_MARK_HEIGHT, True);
852 loadPixmaps(scrPtr);
854 scrPtr->defaultCursor = XCreateFontCursor(display, XC_left_ptr);
856 scrPtr->textCursor = XCreateFontCursor(display, XC_xterm);
859 XColor bla;
860 Pixmap blank;
862 blank = XCreatePixmap(display, scrPtr->stipple, 1, 1, 1);
863 XSetForeground(display, scrPtr->monoGC, 0);
864 XFillRectangle(display, blank, scrPtr->monoGC, 0, 0, 1, 1);
866 scrPtr->invisibleCursor = XCreatePixmapCursor(display, blank, blank,
867 &bla, &bla, 0, 0);
868 XFreePixmap(display, blank);
871 #ifdef HAVE_XINTERNATOMS
872 XInternAtoms(display, atomNames, sizeof(atomNames)/sizeof(char*), False,
873 atoms);
874 #else
875 for (i = 0; i < sizeof(atomNames)/sizeof(char*); i++) {
876 atoms[i] = XInternAtom(display, atomNames[i], False);
878 #endif
880 i = 0;
881 scrPtr->attribsAtom = atoms[i++];
883 scrPtr->deleteWindowAtom = atoms[i++];
885 scrPtr->protocolsAtom = atoms[i++];
887 scrPtr->clipboardAtom = atoms[i++];
889 scrPtr->xdndAwareAtom = atoms[i++];
890 scrPtr->xdndSelectionAtom = atoms[i++];
891 scrPtr->xdndEnterAtom = atoms[i++];
892 scrPtr->xdndLeaveAtom = atoms[i++];
893 scrPtr->xdndPositionAtom = atoms[i++];
894 scrPtr->xdndDropAtom = atoms[i++];
895 scrPtr->xdndFinishedAtom = atoms[i++];
896 scrPtr->xdndTypeListAtom = atoms[i++];
897 scrPtr->xdndStatusAtom = atoms[i++];
899 scrPtr->xdndActionCopy = atoms[i++];
900 scrPtr->xdndActionMove = atoms[i++];
901 scrPtr->xdndActionLink = atoms[i++];
902 scrPtr->xdndActionAsk = atoms[i++];
903 scrPtr->xdndActionPrivate = atoms[i++];
905 scrPtr->wmIconDragOffsetAtom = atoms[i++];
907 scrPtr->wmStateAtom = atoms[i++];
909 scrPtr->rootView = W_CreateRootView(scrPtr);
911 scrPtr->balloon = W_CreateBalloon(scrPtr);
914 W_InitApplication(scrPtr);
916 return scrPtr;
921 void
922 WMSetWidgetDefaultFont(WMScreen *scr, WMFont *font)
924 WMReleaseFont(scr->normalFont);
925 scr->normalFont = WMRetainFont(font);
929 void
930 WMSetWidgetDefaultBoldFont(WMScreen *scr, WMFont *font)
932 WMReleaseFont(scr->boldFont);
933 scr->boldFont = WMRetainFont(font);
938 void
939 WMHangData(WMWidget *widget, void *data)
941 W_VIEW(widget)->hangedData = data;
945 void*
946 WMGetHangedData(WMWidget *widget)
948 return W_VIEW(widget)->hangedData;
953 void
954 WMDestroyWidget(WMWidget *widget)
956 W_UnmapView(W_VIEW(widget));
957 W_DestroyView(W_VIEW(widget));
961 void
962 WMSetFocusToWidget(WMWidget *widget)
964 W_SetFocusOfTopLevel(W_TopLevelOfView(W_VIEW(widget)), W_VIEW(widget));
969 * WMRealizeWidget-
970 * Realizes the widget and all it's children.
973 void
974 WMRealizeWidget(WMWidget *w)
976 W_RealizeView(W_VIEW(w));
979 void
980 WMMapWidget(WMWidget *w)
982 W_MapView(W_VIEW(w));
986 void
987 WMReparentWidget(WMWidget *w, WMWidget *newParent, int x, int y)
989 W_ReparentView(W_VIEW(w), W_VIEW(newParent), x, y);
993 static void
994 makeChildrenAutomap(W_View *view, int flag)
996 view = view->childrenList;
998 while (view) {
999 view->flags.mapWhenRealized = flag;
1000 makeChildrenAutomap(view, flag);
1002 view = view->nextSister;
1007 void
1008 WMMapSubwidgets(WMWidget *w)
1010 /* make sure that subwidgets created after the parent was realized
1011 * are mapped too */
1012 if (!W_VIEW(w)->flags.realized) {
1013 makeChildrenAutomap(W_VIEW(w), True);
1014 } else {
1015 W_MapSubviews(W_VIEW(w));
1020 void
1021 WMUnmapSubwidgets(WMWidget *w)
1023 if (!W_VIEW(w)->flags.realized) {
1024 makeChildrenAutomap(W_VIEW(w), False);
1025 } else {
1026 W_UnmapSubviews(W_VIEW(w));
1032 void
1033 WMUnmapWidget(WMWidget *w)
1035 W_UnmapView(W_VIEW(w));
1039 Bool
1040 WMWidgetIsMapped(WMWidget *w)
1042 return W_VIEW(w)->flags.mapped;
1046 void
1047 WMSetWidgetBackgroundColor(WMWidget *w, WMColor *color)
1049 W_SetViewBackgroundColor(W_VIEW(w), color);
1050 if (W_VIEW(w)->flags.mapped)
1051 WMRedisplayWidget(w);
1055 WMColor*
1056 WMGetWidgetBackgroundColor(WMWidget *w)
1058 return W_VIEW(w)->backColor;
1062 void
1063 WMRaiseWidget(WMWidget *w)
1065 W_RaiseView(W_VIEW(w));
1069 void
1070 WMLowerWidget(WMWidget *w)
1072 W_LowerView(W_VIEW(w));
1076 void
1077 WMMoveWidget(WMWidget *w, int x, int y)
1079 W_MoveView(W_VIEW(w), x, y);
1083 void
1084 WMResizeWidget(WMWidget *w, unsigned int width, unsigned int height)
1086 W_ResizeView(W_VIEW(w), width, height);
1091 W_Class
1092 W_RegisterUserWidget(void)
1094 userWidgetCount++;
1096 return userWidgetCount + WC_UserWidget - 1;
1101 RContext*
1102 WMScreenRContext(WMScreen *scr)
1104 return scr->rcontext;
1109 unsigned int
1110 WMWidgetWidth(WMWidget *w)
1112 return W_VIEW(w)->size.width;
1116 unsigned int
1117 WMWidgetHeight(WMWidget *w)
1119 return W_VIEW(w)->size.height;
1123 Window
1124 WMWidgetXID(WMWidget *w)
1126 return W_VIEW(w)->window;
1130 WMScreen*
1131 WMWidgetScreen(WMWidget *w)
1133 return W_VIEW(w)->screen;
1138 void
1139 WMScreenMainLoop(WMScreen *scr)
1141 XEvent event;
1143 while (1) {
1144 WMNextEvent(scr->display, &event);
1145 WMHandleEvent(&event);
1150 void
1151 WMBreakModalLoop(WMScreen *scr)
1153 scr->modalLoop = 0;
1157 void
1158 WMRunModalLoop(WMScreen *scr, WMView *view)
1160 /* why is scr passed if is determined from the view? */
1161 /*WMScreen *scr = view->screen;*/
1162 int oldModalLoop = scr->modalLoop;
1163 WMView *oldModalView = scr->modalView;
1165 scr->modalView = view;
1167 scr->modalLoop = 1;
1168 while (scr->modalLoop) {
1169 XEvent event;
1171 WMNextEvent(scr->display, &event);
1172 WMHandleEvent(&event);
1175 scr->modalView = oldModalView;
1176 scr->modalLoop = oldModalLoop;
1180 Display*
1181 WMScreenDisplay(WMScreen *scr)
1183 return scr->display;
1187 int
1188 WMScreenDepth(WMScreen *scr)
1190 return scr->depth;
1194 unsigned int
1195 WMScreenWidth(WMScreen *scr)
1197 return scr->rootView->size.width;
1201 unsigned int
1202 WMScreenHeight(WMScreen *scr)
1204 return scr->rootView->size.height;
1208 void
1209 WMRedisplayWidget(WMWidget *w)
1211 W_RedisplayView(W_VIEW(w));