changed indentation to use spaces only
[wmaker-crm.git] / WINGs / widgets.c
blob100ad4adcaad078f0cbe20e7d3a1c98aab4c679f
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 #include <X11/Xlocale.h>
17 /********** data ************/
20 #define CHECK_BUTTON_ON_WIDTH 16
21 #define CHECK_BUTTON_ON_HEIGHT 16
23 static char *CHECK_BUTTON_ON[] = {
24 " %",
25 " .............%#",
26 " ........... .%#",
27 " .......... #.%#",
28 " ......... #%.%#",
29 " ........ #%..%#",
30 " ... #.. #%...%#",
31 " ... #% #%....%#",
32 " ... % #%.....%#",
33 " ... #%......%#",
34 " ... #%.......%#",
35 " ...#%........%#",
36 " .............%#",
37 " .............%#",
38 " %%%%%%%%%%%%%%#",
39 "%###############"};
41 #define CHECK_BUTTON_OFF_WIDTH 16
42 #define CHECK_BUTTON_OFF_HEIGHT 16
44 static char *CHECK_BUTTON_OFF[] = {
45 " %",
46 " .............%#",
47 " .............%#",
48 " .............%#",
49 " .............%#",
50 " .............%#",
51 " .............%#",
52 " .............%#",
53 " .............%#",
54 " .............%#",
55 " .............%#",
56 " .............%#",
57 " .............%#",
58 " .............%#",
59 " %%%%%%%%%%%%%%#",
60 "%###############"};
62 #define RADIO_BUTTON_ON_WIDTH 15
63 #define RADIO_BUTTON_ON_HEIGHT 15
64 static char *RADIO_BUTTON_ON[] = {
65 ".....%%%%%.....",
66 "...%%#####%%...",
67 "..%##.....%.%..",
68 ".%#%.. .....",
69 ".%#. ...",
70 "%#.. .. ",
71 "%#. . ",
72 "%#. . ",
73 "%#. . ",
74 "%#. . ",
75 ".%%. . .",
76 ".%.. . .",
77 "..%... .. ..",
78 ".... ..... ...",
79 "..... .....",
82 #define RADIO_BUTTON_OFF_WIDTH 15
83 #define RADIO_BUTTON_OFF_HEIGHT 15
84 static char *RADIO_BUTTON_OFF[] = {
85 ".....%%%%%.....",
86 "...%%#####%%...",
87 "..%##.......%..",
88 ".%#%...........",
89 ".%#............",
90 "%#............ ",
91 "%#............ ",
92 "%#............ ",
93 "%#............ ",
94 "%#............ ",
95 ".%%.......... .",
96 ".%........... .",
97 "..%......... ..",
98 ".... ..... ...",
99 "..... .....",
103 static char *BUTTON_ARROW[] = {
104 "..................",
105 "....##....#### ...",
106 "...#.%....#... ...",
107 "..#..%#####... ...",
108 ".#............ ...",
109 "#............. ...",
110 ".#............ ...",
111 "..#.. ...",
112 "...#. ............",
113 "....# ............"
116 #define BUTTON_ARROW_WIDTH 18
117 #define BUTTON_ARROW_HEIGHT 10
120 static char *BUTTON_ARROW2[] = {
121 " ",
122 " ## ####. ",
123 " # % # . ",
124 " # %##### . ",
125 " # . ",
126 "# . ",
127 " # . ",
128 " # .......... ",
129 " # . ",
130 " #. "
133 #define BUTTON_ARROW2_WIDTH 18
134 #define BUTTON_ARROW2_HEIGHT 10
137 static char *SCROLLER_DIMPLE[] = {
138 ".%###.",
139 "%#%%%%",
140 "#%%...",
141 "#%.. ",
142 "#%. ",
143 ".%. ."
146 #define SCROLLER_DIMPLE_WIDTH 6
147 #define SCROLLER_DIMPLE_HEIGHT 6
150 static char *SCROLLER_ARROW_UP[] = {
151 "....%....",
152 "....#....",
153 "...%#%...",
154 "...###...",
155 "..%###%..",
156 "..#####..",
157 ".%#####%.",
158 ".#######.",
159 "%#######%"
162 static char *HI_SCROLLER_ARROW_UP[] = {
163 " % ",
164 " % ",
165 " %%% ",
166 " %%% ",
167 " %%%%% ",
168 " %%%%% ",
169 " %%%%%%% ",
170 " %%%%%%% ",
171 "%%%%%%%%%"
174 #define SCROLLER_ARROW_UP_WIDTH 9
175 #define SCROLLER_ARROW_UP_HEIGHT 9
178 static char *SCROLLER_ARROW_DOWN[] = {
179 "%#######%",
180 ".#######.",
181 ".%#####%.",
182 "..#####..",
183 "..%###%..",
184 "...###...",
185 "...%#%...",
186 "....#....",
187 "....%...."
190 static char *HI_SCROLLER_ARROW_DOWN[] = {
191 "%%%%%%%%%",
192 " %%%%%%% ",
193 " %%%%%%% ",
194 " %%%%% ",
195 " %%%%% ",
196 " %%% ",
197 " %%% ",
198 " % ",
199 " % "
202 #define SCROLLER_ARROW_DOWN_WIDTH 9
203 #define SCROLLER_ARROW_DOWN_HEIGHT 9
207 static char *SCROLLER_ARROW_LEFT[] = {
208 "........%",
209 "......%##",
210 "....%####",
211 "..%######",
212 "%########",
213 "..%######",
214 "....%####",
215 "......%##",
216 "........%"
219 static char *HI_SCROLLER_ARROW_LEFT[] = {
220 " %",
221 " %%%",
222 " %%%%%",
223 " %%%%%%%",
224 "%%%%%%%%%",
225 " %%%%%%%",
226 " %%%%%",
227 " %%%",
228 " %"
231 #define SCROLLER_ARROW_LEFT_WIDTH 9
232 #define SCROLLER_ARROW_LEFT_HEIGHT 9
235 static char *SCROLLER_ARROW_RIGHT[] = {
236 "%........",
237 "##%......",
238 "####%....",
239 "######%..",
240 "########%",
241 "######%..",
242 "####%....",
243 "##%......",
244 "%........"
247 static char *HI_SCROLLER_ARROW_RIGHT[] = {
248 "% ",
249 "%%% ",
250 "%%%%% ",
251 "%%%%%%% ",
252 "%%%%%%%%%",
253 "%%%%%%% ",
254 "%%%%% ",
255 "%%% ",
256 "% "
259 #define SCROLLER_ARROW_RIGHT_WIDTH 9
260 #define SCROLLER_ARROW_RIGHT_HEIGHT 9
263 static char *POPUP_INDICATOR[] = {
264 " #==",
265 " ......%#==",
266 " ......%#%%",
267 " ......%#%%",
268 " %%%%%%%#%%",
269 "#########%%",
270 "==%%%%%%%%%",
271 "==%%%%%%%%%"
274 #define POPUP_INDICATOR_WIDTH 11
275 #define POPUP_INDICATOR_HEIGHT 8
279 static char *PULLDOWN_INDICATOR[] = {
280 "=#######=",
281 "=%===== =",
282 "==%=== ==",
283 "==%=== ==",
284 "===%= ===",
285 "===%= ===",
286 "====%===="
288 #define PULLDOWN_INDICATOR_WIDTH 9
289 #define PULLDOWN_INDICATOR_HEIGHT 7
292 #define CHECK_MARK_WIDTH 8
293 #define CHECK_MARK_HEIGHT 10
295 static char *CHECK_MARK[] = {
296 "======== ",
297 "======= #",
298 "====== #%",
299 "===== #%=",
300 " #== #%==",
301 " #% #%===",
302 " % #%====",
303 " #%=====",
304 " #%======",
305 "#%======="};
308 #define STIPPLE_WIDTH 8
309 #define STIPPLE_HEIGHT 8
310 static unsigned char STIPPLE_BITS[] = {
311 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55
317 extern void W_ReadConfigurations(void);
320 static int userWidgetCount=0;
323 /***** end data ******/
326 static void
327 renderPixmap(W_Screen *screen, Pixmap d, Pixmap mask, char **data,
328 int width, int height)
330 int x, y;
331 GC whiteGC = WMColorGC(screen->white);
332 GC blackGC = WMColorGC(screen->black);
333 GC lightGC = WMColorGC(screen->gray);
334 GC darkGC = WMColorGC(screen->darkGray);
337 if (mask)
338 XSetForeground(screen->display, screen->monoGC, 0);
340 for (y = 0; y < height; y++) {
341 for (x = 0; x < width; x++) {
342 switch (data[y][x]) {
343 case ' ':
344 case 'w':
345 XDrawPoint(screen->display, d, whiteGC, x, y);
346 break;
348 case '=':
349 if (mask)
350 XDrawPoint(screen->display, mask, screen->monoGC, x, y);
352 case '.':
353 case 'l':
354 XDrawPoint(screen->display, d, lightGC, x, y);
355 break;
357 case '%':
358 case 'd':
359 XDrawPoint(screen->display, d, darkGC, x, y);
360 break;
362 case '#':
363 case 'b':
364 default:
365 XDrawPoint(screen->display, d, blackGC, x, y);
366 break;
374 static WMPixmap*
375 makePixmap(W_Screen *sPtr, char **data, int width, int height, int masked)
377 Pixmap pixmap, mask = None;
379 pixmap = XCreatePixmap(sPtr->display, W_DRAWABLE(sPtr), width, height,
380 sPtr->depth);
382 if (masked) {
383 mask = XCreatePixmap(sPtr->display, W_DRAWABLE(sPtr), width, height, 1);
384 XSetForeground(sPtr->display, sPtr->monoGC, 1);
385 XFillRectangle(sPtr->display, mask, sPtr->monoGC, 0, 0, width, height);
388 renderPixmap(sPtr, pixmap, mask, data, width, height);
390 return WMCreatePixmapFromXPixmaps(sPtr, pixmap, mask, width, height,
391 sPtr->depth);
395 #define T_WINGS_IMAGES_FILE RESOURCE_PATH"/Images.tiff"
396 #define T_DEFAULT_OBJECT_ICON_FILE RESOURCE_PATH"/defaultIcon.tiff"
398 #define X_WINGS_IMAGES_FILE RESOURCE_PATH"/Images.xpm"
399 #define X_DEFAULT_OBJECT_ICON_FILE RESOURCE_PATH"/defaultIcon.xpm"
402 static Bool
403 loadPixmaps(WMScreen *scr)
405 RImage *image, *tmp;
406 RColor gray;
407 RColor white;
409 gray.red = 0xae;
410 gray.green = 0xaa;
411 gray.blue = 0xae;
413 white.red = 0xff;
414 white.green = 0xff;
415 white.blue = 0xff;
417 image = RLoadImage(scr->rcontext, T_WINGS_IMAGES_FILE, 0);
418 if (!image)
419 image = RLoadImage(scr->rcontext, X_WINGS_IMAGES_FILE, 0);
420 if (!image) {
421 wwarning(_("WINGs: could not load widget images file: %s"),
422 RMessageForError(RErrorCode));
423 return False;
425 /* home icon */
426 /* make it have a gray background */
427 tmp = RGetSubImage(image, 0, 0, 24, 24);
428 RCombineImageWithColor(tmp, &gray);
429 scr->homeIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
430 RReleaseImage(tmp);
431 /* make it have a white background */
432 tmp = RGetSubImage(image, 0, 0, 24, 24);
433 RCombineImageWithColor(tmp, &white);
434 scr->altHomeIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
435 RReleaseImage(tmp);
437 /* trash can */
438 tmp = RGetSubImage(image, 104, 0, 24, 24);
439 RCombineImageWithColor(tmp, &white);
440 scr->trashcanIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
441 RReleaseImage(tmp);
442 tmp = RGetSubImage(image, 104, 0, 24, 24);
443 RCombineImageWithColor(tmp, &white);
444 scr->altTrashcanIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
445 RReleaseImage(tmp);
446 /* create dir */
447 tmp = RGetSubImage(image, 104, 24, 24, 24);
448 RCombineImageWithColor(tmp, &white);
449 scr->createDirIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
450 RReleaseImage(tmp);
451 tmp = RGetSubImage(image, 104, 24, 24, 24);
452 RCombineImageWithColor(tmp, &white);
453 scr->altCreateDirIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
454 RReleaseImage(tmp);
455 /* diskettes */
456 tmp = RGetSubImage(image, 24, 80, 24, 24);
457 RCombineImageWithColor(tmp, &white);
458 scr->disketteIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
459 RReleaseImage(tmp);
460 tmp = RGetSubImage(image, 24, 80, 24, 24);
461 RCombineImageWithColor(tmp, &white);
462 scr->altDisketteIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
463 RReleaseImage(tmp);
464 /* unmount */
465 tmp = RGetSubImage(image, 0, 80, 24, 24);
466 RCombineImageWithColor(tmp, &white);
467 scr->unmountIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
468 RReleaseImage(tmp);
469 tmp = RGetSubImage(image, 0, 80, 24, 24);
470 RCombineImageWithColor(tmp, &white);
471 scr->altUnmountIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
472 RReleaseImage(tmp);
474 /* Magnifying Glass Icon for ColorPanel */
475 tmp = RGetSubImage(image, 24, 0, 40, 32);
476 RCombineImageWithColor(tmp, &gray);
477 scr->magnifyIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
478 RReleaseImage(tmp);
479 /* ColorWheel Icon for ColorPanel */
480 tmp = RGetSubImage(image, 0, 25, 24, 24);
481 scr->wheelIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
482 RReleaseImage(tmp);
483 /* GrayScale Icon for ColorPanel */
484 tmp = RGetSubImage(image, 65, 0, 40, 24);
485 scr->grayIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
486 RReleaseImage(tmp);
487 /* RGB Icon for ColorPanel */
488 tmp = RGetSubImage(image, 25, 33, 40, 24);
489 scr->rgbIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
490 RReleaseImage(tmp);
491 /* CMYK Icon for ColorPanel */
492 tmp = RGetSubImage(image, 65, 25, 40, 24);
493 scr->cmykIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
494 RReleaseImage(tmp);
495 /* HSB Icon for ColorPanel */
496 tmp = RGetSubImage(image, 0, 57, 40, 24);
497 scr->hsbIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
498 RReleaseImage(tmp);
499 /* CustomColorPalette Icon for ColorPanel */
500 tmp = RGetSubImage(image, 81, 57, 40, 24);
501 scr->customPaletteIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
502 RReleaseImage(tmp);
503 /* ColorList Icon for ColorPanel */
504 tmp = RGetSubImage(image, 41, 57, 40, 24);
505 scr->colorListIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
506 RReleaseImage(tmp);
508 RReleaseImage(image);
510 #if 0
511 scr->defaultObjectIcon =
512 WMCreatePixmapFromFile(scr, T_DEFAULT_OBJECT_ICON_FILE);
513 if (!scr->defaultObjectIcon) {
514 scr->defaultObjectIcon =
515 WMCreatePixmapFromFile(scr, X_DEFAULT_OBJECT_ICON_FILE);
517 if (!scr->defaultObjectIcon) {
518 wwarning("WINGs: could not load default icon file");
519 return False;
521 #endif
522 return True;
526 WMScreen*
527 WMOpenScreen(const char *display)
529 Display *dpy = XOpenDisplay(display);
531 if (!dpy) {
532 wwarning("WINGs: could not open display %s",
533 XDisplayName(display));
534 return NULL;
537 return WMCreateSimpleApplicationScreen(dpy);
541 WMScreen*
542 WMCreateSimpleApplicationScreen(Display *display)
544 WMScreen *scr;
546 scr = WMCreateScreen(display, DefaultScreen(display));
548 scr->aflags.hasAppIcon = 0;
549 scr->aflags.simpleApplication = 1;
551 return scr;
556 WMScreen*
557 WMCreateScreen(Display *display, int screen)
559 return WMCreateScreenWithRContext(display, screen,
560 RCreateContext(display, screen, NULL));
564 WMScreen*
565 WMCreateScreenWithRContext(Display *display, int screen, RContext *context)
567 W_Screen *scrPtr;
568 XGCValues gcv;
569 Pixmap stipple;
570 static int initialized = 0;
571 static char *atomNames[] = {
572 "_GNUSTEP_WM_ATTR",
573 "WM_DELETE_WINDOW",
574 "WM_PROTOCOLS",
575 "CLIPBOARD",
576 "XdndAware",
577 "XdndSelection",
578 "XdndEnter",
579 "XdndLeave",
580 "XdndPosition",
581 "XdndDrop",
582 "XdndFinished",
583 "XdndTypeList",
584 "XdndActionList",
585 "XdndActionDescription",
586 "XdndStatus",
587 "XdndActionCopy",
588 "XdndActionMove",
589 "XdndActionLink",
590 "XdndActionAsk",
591 "XdndActionPrivate",
592 "_WINGS_DND_MOUSE_OFFSET",
593 "WM_STATE"
595 Atom atoms[sizeof(atomNames)/sizeof(char*)];
596 char *locale;
597 int i;
599 if (!initialized) {
601 initialized = 1;
603 W_ReadConfigurations();
605 assert(W_ApplicationInitialized());
608 scrPtr = malloc(sizeof(W_Screen));
609 if (!scrPtr)
610 return NULL;
611 memset(scrPtr, 0, sizeof(W_Screen));
613 scrPtr->aflags.hasAppIcon = 1;
615 scrPtr->display = display;
616 scrPtr->screen = screen;
617 scrPtr->rcontext = context;
619 scrPtr->depth = context->depth;
621 scrPtr->visual = context->visual;
622 scrPtr->lastEventTime = 0;
624 scrPtr->colormap = context->cmap;
626 scrPtr->rootWin = RootWindow(display, screen);
628 scrPtr->fontCache = WMCreateHashTable(WMStringPointerHashCallbacks);
630 #ifdef XFT
631 scrPtr->xftdraw = XftDrawCreate(scrPtr->display, W_DRAWABLE(scrPtr),
632 scrPtr->visual, scrPtr->colormap);
633 #endif
635 /* create input method stuff */
636 W_InitIMStuff(scrPtr);
638 /* Create missing CUT_BUFFERs */
640 Atom *rootWinProps;
641 int exists[8] = {0, 0, 0, 0, 0, 0, 0, 0};
642 int count;
644 rootWinProps = XListProperties(display, scrPtr->rootWin, &count);
645 for (i=0; i<count; i++) {
646 switch(rootWinProps[i]) {
647 case XA_CUT_BUFFER0:
648 exists[0] = 1; break;
649 case XA_CUT_BUFFER1:
650 exists[1] = 1; break;
651 case XA_CUT_BUFFER2:
652 exists[2] = 1; break;
653 case XA_CUT_BUFFER3:
654 exists[3] = 1; break;
655 case XA_CUT_BUFFER4:
656 exists[4] = 1; break;
657 case XA_CUT_BUFFER5:
658 exists[5] = 1; break;
659 case XA_CUT_BUFFER6:
660 exists[6] = 1; break;
661 case XA_CUT_BUFFER7:
662 exists[7] = 1; break;
663 default:
664 break;
667 if (rootWinProps) {
668 XFree(rootWinProps);
670 for (i=0; i<8; i++) {
671 if (!exists[i]) {
672 XStoreBuffer(display, "", 0, i);
677 scrPtr->ignoredModifierMask = 0;
679 int i;
680 XModifierKeymap *modmap;
681 KeyCode nlock, slock;
682 static int mask_table[8] = {
683 ShiftMask,LockMask,ControlMask,Mod1Mask,
684 Mod2Mask, Mod3Mask, Mod4Mask, Mod5Mask
686 unsigned int numLockMask=0, scrollLockMask=0;
688 nlock = XKeysymToKeycode(display, XK_Num_Lock);
689 slock = XKeysymToKeycode(display, XK_Scroll_Lock);
692 * Find out the masks for the NumLock and ScrollLock modifiers,
693 * so that we can bind the grabs for when they are enabled too.
695 modmap = XGetModifierMapping(display);
697 if (modmap!=NULL && modmap->max_keypermod>0) {
698 for (i=0; i<8*modmap->max_keypermod; i++) {
699 if (modmap->modifiermap[i]==nlock && nlock!=0)
700 numLockMask = mask_table[i/modmap->max_keypermod];
701 else if (modmap->modifiermap[i]==slock && slock!=0)
702 scrollLockMask = mask_table[i/modmap->max_keypermod];
706 if (modmap)
707 XFreeModifiermap(modmap);
710 scrPtr->ignoredModifierMask = numLockMask|scrollLockMask|LockMask;
713 /* initially allocate some colors */
714 WMWhiteColor(scrPtr);
715 WMBlackColor(scrPtr);
716 WMGrayColor(scrPtr);
717 WMDarkGrayColor(scrPtr);
719 gcv.graphics_exposures = False;
721 gcv.function = GXxor;
722 gcv.foreground = W_PIXEL(scrPtr->white);
723 if (gcv.foreground == 0) gcv.foreground = 1;
724 scrPtr->xorGC = XCreateGC(display, W_DRAWABLE(scrPtr), GCFunction
725 |GCGraphicsExposures|GCForeground, &gcv);
727 gcv.function = GXxor;
728 gcv.foreground = W_PIXEL(scrPtr->gray);
729 gcv.subwindow_mode = IncludeInferiors;
730 scrPtr->ixorGC = XCreateGC(display, W_DRAWABLE(scrPtr), GCFunction
731 |GCGraphicsExposures|GCForeground
732 |GCSubwindowMode, &gcv);
734 gcv.function = GXcopy;
735 scrPtr->copyGC = XCreateGC(display, W_DRAWABLE(scrPtr), GCFunction
736 |GCGraphicsExposures, &gcv);
738 scrPtr->clipGC = XCreateGC(display, W_DRAWABLE(scrPtr), GCFunction
739 |GCGraphicsExposures, &gcv);
741 stipple = XCreateBitmapFromData(display, W_DRAWABLE(scrPtr),
742 STIPPLE_BITS, STIPPLE_WIDTH, STIPPLE_HEIGHT);
743 gcv.foreground = W_PIXEL(scrPtr->darkGray);
744 gcv.background = W_PIXEL(scrPtr->gray);
745 gcv.fill_style = FillStippled;
746 gcv.stipple = stipple;
747 scrPtr->stippleGC = XCreateGC(display, W_DRAWABLE(scrPtr),
748 GCForeground|GCBackground|GCStipple
749 |GCFillStyle|GCGraphicsExposures, &gcv);
751 scrPtr->drawStringGC = XCreateGC(display, W_DRAWABLE(scrPtr),
752 GCGraphicsExposures, &gcv);
753 scrPtr->drawImStringGC = XCreateGC(display, W_DRAWABLE(scrPtr),
754 GCGraphicsExposures, &gcv);
756 /* we need a 1bpp drawable for the monoGC, so borrow this one */
757 scrPtr->monoGC = XCreateGC(display, stipple, 0, NULL);
759 scrPtr->stipple = stipple;
761 scrPtr->useMultiByte = WINGsConfiguration.useMultiByte;
762 scrPtr->useMultiByte = 0;
764 locale = setlocale(LC_CTYPE, NULL);
765 //printf("LC_CTYPE=%s\n", locale);
766 if (!locale || strcmp(locale, "C")==0 || strcmp(locale, "POSIX")==0)
767 scrPtr->useWideChar = 0;
768 else
769 scrPtr->useWideChar = 1;
771 scrPtr->antialiasedText = WINGsConfiguration.antialiasedText;
773 scrPtr->normalFont = WMSystemFontOfSize(scrPtr, 0);
775 scrPtr->boldFont = WMBoldSystemFontOfSize(scrPtr, 0);
777 if (!scrPtr->boldFont)
778 scrPtr->boldFont = scrPtr->normalFont;
780 if (!scrPtr->normalFont) {
781 wwarning(_("could not load any fonts. Make sure your font installation"
782 " and locale settings are correct."));
784 return NULL;
787 scrPtr->checkButtonImageOn = makePixmap(scrPtr, CHECK_BUTTON_ON,
788 CHECK_BUTTON_ON_WIDTH,
789 CHECK_BUTTON_ON_HEIGHT, False);
791 scrPtr->checkButtonImageOff = makePixmap(scrPtr, CHECK_BUTTON_OFF,
792 CHECK_BUTTON_OFF_WIDTH,
793 CHECK_BUTTON_OFF_HEIGHT, False);
795 scrPtr->radioButtonImageOn = makePixmap(scrPtr, RADIO_BUTTON_ON,
796 RADIO_BUTTON_ON_WIDTH,
797 RADIO_BUTTON_ON_HEIGHT, False);
799 scrPtr->radioButtonImageOff = makePixmap(scrPtr, RADIO_BUTTON_OFF,
800 RADIO_BUTTON_OFF_WIDTH,
801 RADIO_BUTTON_OFF_HEIGHT, False);
803 scrPtr->buttonArrow = makePixmap(scrPtr, BUTTON_ARROW,
804 BUTTON_ARROW_WIDTH, BUTTON_ARROW_HEIGHT,
805 False);
807 scrPtr->pushedButtonArrow = makePixmap(scrPtr, BUTTON_ARROW2,
808 BUTTON_ARROW2_WIDTH, BUTTON_ARROW2_HEIGHT,
809 False);
812 scrPtr->scrollerDimple = makePixmap(scrPtr, SCROLLER_DIMPLE,
813 SCROLLER_DIMPLE_WIDTH,
814 SCROLLER_DIMPLE_HEIGHT, False);
817 scrPtr->upArrow = makePixmap(scrPtr, SCROLLER_ARROW_UP,
818 SCROLLER_ARROW_UP_WIDTH,
819 SCROLLER_ARROW_UP_HEIGHT, True);
821 scrPtr->downArrow = makePixmap(scrPtr, SCROLLER_ARROW_DOWN,
822 SCROLLER_ARROW_DOWN_WIDTH,
823 SCROLLER_ARROW_DOWN_HEIGHT, True);
825 scrPtr->leftArrow = makePixmap(scrPtr, SCROLLER_ARROW_LEFT,
826 SCROLLER_ARROW_LEFT_WIDTH,
827 SCROLLER_ARROW_LEFT_HEIGHT, True);
829 scrPtr->rightArrow = makePixmap(scrPtr, SCROLLER_ARROW_RIGHT,
830 SCROLLER_ARROW_RIGHT_WIDTH,
831 SCROLLER_ARROW_RIGHT_HEIGHT, True);
833 scrPtr->hiUpArrow = makePixmap(scrPtr, HI_SCROLLER_ARROW_UP,
834 SCROLLER_ARROW_UP_WIDTH,
835 SCROLLER_ARROW_UP_HEIGHT, True);
837 scrPtr->hiDownArrow = makePixmap(scrPtr, HI_SCROLLER_ARROW_DOWN,
838 SCROLLER_ARROW_DOWN_WIDTH,
839 SCROLLER_ARROW_DOWN_HEIGHT, True);
841 scrPtr->hiLeftArrow = makePixmap(scrPtr, HI_SCROLLER_ARROW_LEFT,
842 SCROLLER_ARROW_LEFT_WIDTH,
843 SCROLLER_ARROW_LEFT_HEIGHT, True);
845 scrPtr->hiRightArrow = makePixmap(scrPtr, HI_SCROLLER_ARROW_RIGHT,
846 SCROLLER_ARROW_RIGHT_WIDTH,
847 SCROLLER_ARROW_RIGHT_HEIGHT, True);
849 scrPtr->popUpIndicator = makePixmap(scrPtr, POPUP_INDICATOR,
850 POPUP_INDICATOR_WIDTH,
851 POPUP_INDICATOR_HEIGHT, True);
853 scrPtr->pullDownIndicator = makePixmap(scrPtr, PULLDOWN_INDICATOR,
854 PULLDOWN_INDICATOR_WIDTH,
855 PULLDOWN_INDICATOR_HEIGHT, True);
857 scrPtr->checkMark = makePixmap(scrPtr, CHECK_MARK,
858 CHECK_MARK_WIDTH,
859 CHECK_MARK_HEIGHT, True);
861 loadPixmaps(scrPtr);
863 scrPtr->defaultCursor = XCreateFontCursor(display, XC_left_ptr);
865 scrPtr->textCursor = XCreateFontCursor(display, XC_xterm);
868 XColor bla;
869 Pixmap blank;
871 blank = XCreatePixmap(display, scrPtr->stipple, 1, 1, 1);
872 XSetForeground(display, scrPtr->monoGC, 0);
873 XFillRectangle(display, blank, scrPtr->monoGC, 0, 0, 1, 1);
875 scrPtr->invisibleCursor = XCreatePixmapCursor(display, blank, blank,
876 &bla, &bla, 0, 0);
877 XFreePixmap(display, blank);
880 #ifdef HAVE_XINTERNATOMS
881 XInternAtoms(display, atomNames, sizeof(atomNames)/sizeof(char*), False,
882 atoms);
883 #else
884 for (i = 0; i < sizeof(atomNames)/sizeof(char*); i++) {
885 atoms[i] = XInternAtom(display, atomNames[i], False);
887 #endif
889 i = 0;
890 scrPtr->attribsAtom = atoms[i++];
892 scrPtr->deleteWindowAtom = atoms[i++];
894 scrPtr->protocolsAtom = atoms[i++];
896 scrPtr->clipboardAtom = atoms[i++];
898 scrPtr->xdndAwareAtom = atoms[i++];
899 scrPtr->xdndSelectionAtom = atoms[i++];
900 scrPtr->xdndEnterAtom = atoms[i++];
901 scrPtr->xdndLeaveAtom = atoms[i++];
902 scrPtr->xdndPositionAtom = atoms[i++];
903 scrPtr->xdndDropAtom = atoms[i++];
904 scrPtr->xdndFinishedAtom = atoms[i++];
905 scrPtr->xdndTypeListAtom = atoms[i++];
906 scrPtr->xdndActionListAtom = atoms[i++];
907 scrPtr->xdndActionDescriptionAtom = atoms[i++];
908 scrPtr->xdndStatusAtom = atoms[i++];
910 scrPtr->xdndActionCopy = atoms[i++];
911 scrPtr->xdndActionMove = atoms[i++];
912 scrPtr->xdndActionLink = atoms[i++];
913 scrPtr->xdndActionAsk = atoms[i++];
914 scrPtr->xdndActionPrivate = atoms[i++];
916 scrPtr->wmIconDragOffsetAtom = atoms[i++];
918 scrPtr->wmStateAtom = atoms[i++];
920 scrPtr->rootView = W_CreateRootView(scrPtr);
922 scrPtr->balloon = W_CreateBalloon(scrPtr);
925 W_InitApplication(scrPtr);
927 return scrPtr;
932 void
933 WMSetWidgetDefaultFont(WMScreen *scr, WMFont *font)
935 WMReleaseFont(scr->normalFont);
936 scr->normalFont = WMRetainFont(font);
940 void
941 WMSetWidgetDefaultBoldFont(WMScreen *scr, WMFont *font)
943 WMReleaseFont(scr->boldFont);
944 scr->boldFont = WMRetainFont(font);
949 void
950 WMHangData(WMWidget *widget, void *data)
952 W_VIEW(widget)->hangedData = data;
956 void*
957 WMGetHangedData(WMWidget *widget)
959 return W_VIEW(widget)->hangedData;
964 void
965 WMDestroyWidget(WMWidget *widget)
967 W_UnmapView(W_VIEW(widget));
968 W_DestroyView(W_VIEW(widget));
972 void
973 WMSetFocusToWidget(WMWidget *widget)
975 W_SetFocusOfTopLevel(W_TopLevelOfView(W_VIEW(widget)), W_VIEW(widget));
980 * WMRealizeWidget-
981 * Realizes the widget and all it's children.
984 void
985 WMRealizeWidget(WMWidget *w)
987 W_RealizeView(W_VIEW(w));
990 void
991 WMMapWidget(WMWidget *w)
993 W_MapView(W_VIEW(w));
997 void
998 WMReparentWidget(WMWidget *w, WMWidget *newParent, int x, int y)
1000 W_ReparentView(W_VIEW(w), W_VIEW(newParent), x, y);
1004 static void
1005 makeChildrenAutomap(W_View *view, int flag)
1007 view = view->childrenList;
1009 while (view) {
1010 view->flags.mapWhenRealized = flag;
1011 makeChildrenAutomap(view, flag);
1013 view = view->nextSister;
1018 void
1019 WMMapSubwidgets(WMWidget *w)
1021 /* make sure that subwidgets created after the parent was realized
1022 * are mapped too */
1023 if (!W_VIEW(w)->flags.realized) {
1024 makeChildrenAutomap(W_VIEW(w), True);
1025 } else {
1026 W_MapSubviews(W_VIEW(w));
1031 void
1032 WMUnmapSubwidgets(WMWidget *w)
1034 if (!W_VIEW(w)->flags.realized) {
1035 makeChildrenAutomap(W_VIEW(w), False);
1036 } else {
1037 W_UnmapSubviews(W_VIEW(w));
1043 void
1044 WMUnmapWidget(WMWidget *w)
1046 W_UnmapView(W_VIEW(w));
1050 Bool
1051 WMWidgetIsMapped(WMWidget *w)
1053 return W_VIEW(w)->flags.mapped;
1057 void
1058 WMSetWidgetBackgroundColor(WMWidget *w, WMColor *color)
1060 W_SetViewBackgroundColor(W_VIEW(w), color);
1061 if (W_VIEW(w)->flags.mapped)
1062 WMRedisplayWidget(w);
1066 WMColor*
1067 WMGetWidgetBackgroundColor(WMWidget *w)
1069 return W_VIEW(w)->backColor;
1073 void
1074 WMRaiseWidget(WMWidget *w)
1076 W_RaiseView(W_VIEW(w));
1080 void
1081 WMLowerWidget(WMWidget *w)
1083 W_LowerView(W_VIEW(w));
1087 void
1088 WMMoveWidget(WMWidget *w, int x, int y)
1090 W_MoveView(W_VIEW(w), x, y);
1094 void
1095 WMResizeWidget(WMWidget *w, unsigned int width, unsigned int height)
1097 W_ResizeView(W_VIEW(w), width, height);
1102 W_Class
1103 W_RegisterUserWidget(void)
1105 userWidgetCount++;
1107 return userWidgetCount + WC_UserWidget - 1;
1112 RContext*
1113 WMScreenRContext(WMScreen *scr)
1115 return scr->rcontext;
1120 unsigned int
1121 WMWidgetWidth(WMWidget *w)
1123 return W_VIEW(w)->size.width;
1127 unsigned int
1128 WMWidgetHeight(WMWidget *w)
1130 return W_VIEW(w)->size.height;
1134 Window
1135 WMWidgetXID(WMWidget *w)
1137 return W_VIEW(w)->window;
1141 WMScreen*
1142 WMWidgetScreen(WMWidget *w)
1144 return W_VIEW(w)->screen;
1149 void
1150 WMScreenMainLoop(WMScreen *scr)
1152 XEvent event;
1154 while (1) {
1155 WMNextEvent(scr->display, &event);
1156 WMHandleEvent(&event);
1161 void
1162 WMBreakModalLoop(WMScreen *scr)
1164 scr->modalLoop = 0;
1168 void
1169 WMRunModalLoop(WMScreen *scr, WMView *view)
1171 /* why is scr passed if is determined from the view? */
1172 /*WMScreen *scr = view->screen;*/
1173 int oldModalLoop = scr->modalLoop;
1174 WMView *oldModalView = scr->modalView;
1176 scr->modalView = view;
1178 scr->modalLoop = 1;
1179 while (scr->modalLoop) {
1180 XEvent event;
1182 WMNextEvent(scr->display, &event);
1183 WMHandleEvent(&event);
1186 scr->modalView = oldModalView;
1187 scr->modalLoop = oldModalLoop;
1191 Display*
1192 WMScreenDisplay(WMScreen *scr)
1194 return scr->display;
1199 WMScreenDepth(WMScreen *scr)
1201 return scr->depth;
1205 unsigned int
1206 WMScreenWidth(WMScreen *scr)
1208 return scr->rootView->size.width;
1212 unsigned int
1213 WMScreenHeight(WMScreen *scr)
1215 return scr->rootView->size.height;
1219 void
1220 WMRedisplayWidget(WMWidget *w)
1222 W_RedisplayView(W_VIEW(w));