fix overflow bug, try2
[wmaker-crm.git] / WINGs / widgets.c
blob282c36eb59e0027532aafa2b4dc646d7fec2a517
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->fontSetCache = WMCreateHashTable(WMStringPointerHashCallbacks);
627 #ifdef XFT
628 scrPtr->xftdraw = XftDrawCreate(scrPtr->display, W_DRAWABLE(scrPtr),
629 scrPtr->visual, scrPtr->colormap);
630 #endif
632 /* create input method stuff */
633 W_InitIMStuff(scrPtr);
635 /* Create missing CUT_BUFFERs */
637 Atom *rootWinProps;
638 int exists[8] = {0, 0, 0, 0, 0, 0, 0, 0};
639 int count;
641 rootWinProps = XListProperties(display, scrPtr->rootWin, &count);
642 for (i=0; i<count; i++) {
643 switch(rootWinProps[i]) {
644 case XA_CUT_BUFFER0:
645 exists[0] = 1; break;
646 case XA_CUT_BUFFER1:
647 exists[1] = 1; break;
648 case XA_CUT_BUFFER2:
649 exists[2] = 1; break;
650 case XA_CUT_BUFFER3:
651 exists[3] = 1; break;
652 case XA_CUT_BUFFER4:
653 exists[4] = 1; break;
654 case XA_CUT_BUFFER5:
655 exists[5] = 1; break;
656 case XA_CUT_BUFFER6:
657 exists[6] = 1; break;
658 case XA_CUT_BUFFER7:
659 exists[7] = 1; break;
660 default:
661 break;
664 if (rootWinProps) {
665 XFree(rootWinProps);
667 for (i=0; i<8; i++) {
668 if (!exists[i]) {
669 XStoreBuffer(display, "", 0, i);
674 scrPtr->ignoredModifierMask = 0;
676 int i;
677 XModifierKeymap *modmap;
678 KeyCode nlock, slock;
679 static int mask_table[8] = {
680 ShiftMask,LockMask,ControlMask,Mod1Mask,
681 Mod2Mask, Mod3Mask, Mod4Mask, Mod5Mask
683 unsigned int numLockMask, scrollLockMask;
685 nlock = XKeysymToKeycode(display, XK_Num_Lock);
686 slock = XKeysymToKeycode(display, XK_Scroll_Lock);
689 * Find out the masks for the NumLock and ScrollLock modifiers,
690 * so that we can bind the grabs for when they are enabled too.
692 modmap = XGetModifierMapping(display);
694 if (modmap!=NULL && modmap->max_keypermod>0) {
695 for (i=0; i<8*modmap->max_keypermod; i++) {
696 if (modmap->modifiermap[i]==nlock && nlock!=0)
697 numLockMask = mask_table[i/modmap->max_keypermod];
698 else if (modmap->modifiermap[i]==slock && slock!=0)
699 scrollLockMask = mask_table[i/modmap->max_keypermod];
703 if (modmap)
704 XFreeModifiermap(modmap);
707 scrPtr->ignoredModifierMask = numLockMask|scrollLockMask|LockMask;
710 /* initially allocate some colors */
711 WMWhiteColor(scrPtr);
712 WMBlackColor(scrPtr);
713 WMGrayColor(scrPtr);
714 WMDarkGrayColor(scrPtr);
716 gcv.graphics_exposures = False;
718 gcv.function = GXxor;
719 gcv.foreground = W_PIXEL(scrPtr->white);
720 if (gcv.foreground == 0) gcv.foreground = 1;
721 scrPtr->xorGC = XCreateGC(display, W_DRAWABLE(scrPtr), GCFunction
722 |GCGraphicsExposures|GCForeground, &gcv);
724 gcv.function = GXxor;
725 gcv.foreground = W_PIXEL(scrPtr->gray);
726 gcv.subwindow_mode = IncludeInferiors;
727 scrPtr->ixorGC = XCreateGC(display, W_DRAWABLE(scrPtr), GCFunction
728 |GCGraphicsExposures|GCForeground
729 |GCSubwindowMode, &gcv);
731 gcv.function = GXcopy;
732 scrPtr->copyGC = XCreateGC(display, W_DRAWABLE(scrPtr), GCFunction
733 |GCGraphicsExposures, &gcv);
735 scrPtr->clipGC = XCreateGC(display, W_DRAWABLE(scrPtr), GCFunction
736 |GCGraphicsExposures, &gcv);
738 stipple = XCreateBitmapFromData(display, W_DRAWABLE(scrPtr),
739 STIPPLE_BITS, STIPPLE_WIDTH, STIPPLE_HEIGHT);
740 gcv.foreground = W_PIXEL(scrPtr->darkGray);
741 gcv.background = W_PIXEL(scrPtr->gray);
742 gcv.fill_style = FillStippled;
743 gcv.stipple = stipple;
744 scrPtr->stippleGC = XCreateGC(display, W_DRAWABLE(scrPtr),
745 GCForeground|GCBackground|GCStipple
746 |GCFillStyle|GCGraphicsExposures, &gcv);
748 scrPtr->drawStringGC = XCreateGC(display, W_DRAWABLE(scrPtr),
749 GCGraphicsExposures, &gcv);
750 scrPtr->drawImStringGC = XCreateGC(display, W_DRAWABLE(scrPtr),
751 GCGraphicsExposures, &gcv);
753 /* we need a 1bpp drawable for the monoGC, so borrow this one */
754 scrPtr->monoGC = XCreateGC(display, stipple, 0, NULL);
756 scrPtr->stipple = stipple;
758 scrPtr->useMultiByte = WINGsConfiguration.useMultiByte;
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 void
1056 WMRaiseWidget(WMWidget *w)
1058 W_RaiseView(W_VIEW(w));
1062 void
1063 WMLowerWidget(WMWidget *w)
1065 W_LowerView(W_VIEW(w));
1069 void
1070 WMMoveWidget(WMWidget *w, int x, int y)
1072 W_MoveView(W_VIEW(w), x, y);
1076 void
1077 WMResizeWidget(WMWidget *w, unsigned int width, unsigned int height)
1079 W_ResizeView(W_VIEW(w), width, height);
1084 W_Class
1085 W_RegisterUserWidget(void)
1087 userWidgetCount++;
1089 return userWidgetCount + WC_UserWidget - 1;
1094 RContext*
1095 WMScreenRContext(WMScreen *scr)
1097 return scr->rcontext;
1102 unsigned int
1103 WMWidgetWidth(WMWidget *w)
1105 return W_VIEW(w)->size.width;
1109 unsigned int
1110 WMWidgetHeight(WMWidget *w)
1112 return W_VIEW(w)->size.height;
1116 Window
1117 WMWidgetXID(WMWidget *w)
1119 return W_VIEW(w)->window;
1123 WMScreen*
1124 WMWidgetScreen(WMWidget *w)
1126 return W_VIEW(w)->screen;
1131 void
1132 WMScreenMainLoop(WMScreen *scr)
1134 XEvent event;
1136 while (1) {
1137 WMNextEvent(scr->display, &event);
1138 WMHandleEvent(&event);
1143 void
1144 WMBreakModalLoop(WMScreen *scr)
1146 scr->modalLoop = 0;
1150 void
1151 WMRunModalLoop(WMScreen *scr, WMView *view)
1153 /* why is scr passed if is determined from the view? */
1154 /*WMScreen *scr = view->screen;*/
1155 int oldModalLoop = scr->modalLoop;
1156 WMView *oldModalView = scr->modalView;
1158 scr->modalView = view;
1160 scr->modalLoop = 1;
1161 while (scr->modalLoop) {
1162 XEvent event;
1164 WMNextEvent(scr->display, &event);
1165 WMHandleEvent(&event);
1168 scr->modalView = oldModalView;
1169 scr->modalLoop = oldModalLoop;
1173 Display*
1174 WMScreenDisplay(WMScreen *scr)
1176 return scr->display;
1180 int
1181 WMScreenDepth(WMScreen *scr)
1183 return scr->depth;
1187 unsigned int
1188 WMScreenWidth(WMScreen *scr)
1190 return scr->rootView->size.width;
1194 unsigned int
1195 WMScreenHeight(WMScreen *scr)
1197 return scr->rootView->size.height;
1201 void
1202 WMRedisplayWidget(WMWidget *w)
1204 W_RedisplayView(W_VIEW(w));