menu: For consistency, use appearance.menu for English-language menus.
[wmaker-crm.git] / WINGs / widgets.c
blob177ad3cab476c7d5a23a31df807227a1d8f2e551
2 #include "WINGsP.h"
3 #include "wconfig.h"
5 #include <X11/Xft/Xft.h>
7 #include <X11/Xutil.h>
8 #include <X11/Xatom.h>
9 #include <X11/keysym.h>
10 #include <X11/cursorfont.h>
12 #include <X11/Xlocale.h>
14 /********** data ************/
16 #define CHECK_BUTTON_ON_WIDTH 16
17 #define CHECK_BUTTON_ON_HEIGHT 16
19 static char *CHECK_BUTTON_ON[] = {
20 " %",
21 " .............%#",
22 " ........... .%#",
23 " .......... #.%#",
24 " ......... #%.%#",
25 " ........ #%..%#",
26 " ... #.. #%...%#",
27 " ... #% #%....%#",
28 " ... % #%.....%#",
29 " ... #%......%#",
30 " ... #%.......%#",
31 " ...#%........%#",
32 " .............%#",
33 " .............%#",
34 " %%%%%%%%%%%%%%#",
35 "%###############"
38 #define CHECK_BUTTON_OFF_WIDTH 16
39 #define CHECK_BUTTON_OFF_HEIGHT 16
41 static char *CHECK_BUTTON_OFF[] = {
42 " %",
43 " .............%#",
44 " .............%#",
45 " .............%#",
46 " .............%#",
47 " .............%#",
48 " .............%#",
49 " .............%#",
50 " .............%#",
51 " .............%#",
52 " .............%#",
53 " .............%#",
54 " .............%#",
55 " .............%#",
56 " %%%%%%%%%%%%%%#",
57 "%###############"
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 "..... .....",
100 #define TRISTATE_BUTTON_ON_WIDTH 15
101 #define TRISTATE_BUTTON_ON_HEIGHT 15
102 static char *TRISTATE_BUTTON_ON[] = {
103 "%%%%%%%%%%%%%%.",
104 "%%%%%%%%%%%%%. ",
105 "%% . ",
106 "%% ## ## . ",
107 "%% ### ### . ",
108 "%% ### ### . ",
109 "%% ##### . ",
110 "%% ### . ",
111 "%% ##### . ",
112 "%% ### ### . ",
113 "%% ### ### . ",
114 "%% ## ## . ",
115 "%% . ",
116 "%............. ",
117 ". ",
120 #define TRISTATE_BUTTON_OFF_WIDTH 15
121 #define TRISTATE_BUTTON_OFF_HEIGHT 15
122 static char *TRISTATE_BUTTON_OFF[] = {
123 "%%%%%%%%%%%%%%.",
124 "%%%%%%%%%%%%%. ",
125 "%% . ",
126 "%% . ",
127 "%% . ",
128 "%% . ",
129 "%% . ",
130 "%% . ",
131 "%% . ",
132 "%% . ",
133 "%% . ",
134 "%% . ",
135 "%% . ",
136 "%............. ",
137 ". ",
140 #define TRISTATE_BUTTON_TRI_WIDTH 15
141 #define TRISTATE_BUTTON_TRI_HEIGHT 15
142 static char *TRISTATE_BUTTON_TRI[] = {
143 "%%%%%%%%%%%%%%.",
144 "%%%%%%%%%%%%%. ",
145 "%% . ",
146 "%% # # # # # . ",
147 "%% # # # # . ",
148 "%% # # # # # . ",
149 "%% # # # # . ",
150 "%% # # # # # . ",
151 "%% # # # # . ",
152 "%% # # # # # . ",
153 "%% # # # # . ",
154 "%% # # # # # . ",
155 "%% . ",
156 "%............. ",
157 ". ",
160 static char *BUTTON_ARROW[] = {
161 "..................",
162 "....##....#### ...",
163 "...#.%....#... ...",
164 "..#..%#####... ...",
165 ".#............ ...",
166 "#............. ...",
167 ".#............ ...",
168 "..#.. ...",
169 "...#. ............",
170 "....# ............"
173 #define BUTTON_ARROW_WIDTH 18
174 #define BUTTON_ARROW_HEIGHT 10
176 static char *BUTTON_ARROW2[] = {
177 " ",
178 " ## ####. ",
179 " # % # . ",
180 " # %##### . ",
181 " # . ",
182 "# . ",
183 " # . ",
184 " # .......... ",
185 " # . ",
186 " #. "
189 #define BUTTON_ARROW2_WIDTH 18
190 #define BUTTON_ARROW2_HEIGHT 10
192 static char *SCROLLER_DIMPLE[] = {
193 ".%###.",
194 "%#%%%%",
195 "#%%...",
196 "#%.. ",
197 "#%. ",
198 ".%. ."
201 #define SCROLLER_DIMPLE_WIDTH 6
202 #define SCROLLER_DIMPLE_HEIGHT 6
204 static char *SCROLLER_ARROW_UP[] = {
205 "....%....",
206 "....#....",
207 "...%#%...",
208 "...###...",
209 "..%###%..",
210 "..#####..",
211 ".%#####%.",
212 ".#######.",
213 "%#######%"
216 static char *HI_SCROLLER_ARROW_UP[] = {
217 " % ",
218 " % ",
219 " %%% ",
220 " %%% ",
221 " %%%%% ",
222 " %%%%% ",
223 " %%%%%%% ",
224 " %%%%%%% ",
225 "%%%%%%%%%"
228 #define SCROLLER_ARROW_UP_WIDTH 9
229 #define SCROLLER_ARROW_UP_HEIGHT 9
231 static char *SCROLLER_ARROW_DOWN[] = {
232 "%#######%",
233 ".#######.",
234 ".%#####%.",
235 "..#####..",
236 "..%###%..",
237 "...###...",
238 "...%#%...",
239 "....#....",
240 "....%...."
243 static char *HI_SCROLLER_ARROW_DOWN[] = {
244 "%%%%%%%%%",
245 " %%%%%%% ",
246 " %%%%%%% ",
247 " %%%%% ",
248 " %%%%% ",
249 " %%% ",
250 " %%% ",
251 " % ",
252 " % "
255 #define SCROLLER_ARROW_DOWN_WIDTH 9
256 #define SCROLLER_ARROW_DOWN_HEIGHT 9
258 static char *SCROLLER_ARROW_LEFT[] = {
259 "........%",
260 "......%##",
261 "....%####",
262 "..%######",
263 "%########",
264 "..%######",
265 "....%####",
266 "......%##",
267 "........%"
270 static char *HI_SCROLLER_ARROW_LEFT[] = {
271 " %",
272 " %%%",
273 " %%%%%",
274 " %%%%%%%",
275 "%%%%%%%%%",
276 " %%%%%%%",
277 " %%%%%",
278 " %%%",
279 " %"
282 #define SCROLLER_ARROW_LEFT_WIDTH 9
283 #define SCROLLER_ARROW_LEFT_HEIGHT 9
285 static char *SCROLLER_ARROW_RIGHT[] = {
286 "%........",
287 "##%......",
288 "####%....",
289 "######%..",
290 "########%",
291 "######%..",
292 "####%....",
293 "##%......",
294 "%........"
297 static char *HI_SCROLLER_ARROW_RIGHT[] = {
298 "% ",
299 "%%% ",
300 "%%%%% ",
301 "%%%%%%% ",
302 "%%%%%%%%%",
303 "%%%%%%% ",
304 "%%%%% ",
305 "%%% ",
306 "% "
309 #define SCROLLER_ARROW_RIGHT_WIDTH 9
310 #define SCROLLER_ARROW_RIGHT_HEIGHT 9
312 static char *POPUP_INDICATOR[] = {
313 " #==",
314 " ......%#==",
315 " ......%#%%",
316 " ......%#%%",
317 " %%%%%%%#%%",
318 "#########%%",
319 "==%%%%%%%%%",
320 "==%%%%%%%%%"
323 #define POPUP_INDICATOR_WIDTH 11
324 #define POPUP_INDICATOR_HEIGHT 8
326 static char *PULLDOWN_INDICATOR[] = {
327 "=#######=",
328 "=%===== =",
329 "==%=== ==",
330 "==%=== ==",
331 "===%= ===",
332 "===%= ===",
333 "====%===="
336 #define PULLDOWN_INDICATOR_WIDTH 9
337 #define PULLDOWN_INDICATOR_HEIGHT 7
339 #define CHECK_MARK_WIDTH 8
340 #define CHECK_MARK_HEIGHT 10
342 static char *CHECK_MARK[] = {
343 "======== ",
344 "======= #",
345 "====== #%",
346 "===== #%=",
347 " #== #%==",
348 " #% #%===",
349 " % #%====",
350 " #%=====",
351 " #%======",
352 "#%======="
355 #define STIPPLE_WIDTH 8
356 #define STIPPLE_HEIGHT 8
357 static char STIPPLE_BITS[] = {
358 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55
361 static int userWidgetCount = 0;
363 /***** end data ******/
365 static void renderPixmap(W_Screen * screen, Pixmap d, Pixmap mask, char **data, int width, int height)
367 int x, y;
368 GC whiteGC = WMColorGC(screen->white);
369 GC blackGC = WMColorGC(screen->black);
370 GC lightGC = WMColorGC(screen->gray);
371 GC darkGC = WMColorGC(screen->darkGray);
373 if (mask)
374 XSetForeground(screen->display, screen->monoGC, 0);
376 for (y = 0; y < height; y++) {
377 for (x = 0; x < width; x++) {
378 switch (data[y][x]) {
379 case ' ':
380 case 'w':
381 XDrawPoint(screen->display, d, whiteGC, x, y);
382 break;
384 case '=':
385 if (mask)
386 XDrawPoint(screen->display, mask, screen->monoGC, x, y);
388 case '.':
389 case 'l':
390 XDrawPoint(screen->display, d, lightGC, x, y);
391 break;
393 case '%':
394 case 'd':
395 XDrawPoint(screen->display, d, darkGC, x, y);
396 break;
398 case '#':
399 case 'b':
400 default:
401 XDrawPoint(screen->display, d, blackGC, x, y);
402 break;
408 static WMPixmap *makePixmap(W_Screen * sPtr, char **data, int width, int height, int masked)
410 Pixmap pixmap, mask = None;
412 pixmap = XCreatePixmap(sPtr->display, W_DRAWABLE(sPtr), width, height, sPtr->depth);
414 if (masked) {
415 mask = XCreatePixmap(sPtr->display, W_DRAWABLE(sPtr), width, height, 1);
416 XSetForeground(sPtr->display, sPtr->monoGC, 1);
417 XFillRectangle(sPtr->display, mask, sPtr->monoGC, 0, 0, width, height);
420 renderPixmap(sPtr, pixmap, mask, data, width, height);
422 return WMCreatePixmapFromXPixmaps(sPtr, pixmap, mask, width, height, sPtr->depth);
425 #define T_WINGS_IMAGES_FILE RESOURCE_PATH"/Images.tiff"
426 #define X_WINGS_IMAGES_FILE RESOURCE_PATH"/Images.xpm"
428 static Bool loadPixmaps(WMScreen * scr)
430 RImage *image, *tmp;
431 RColor gray;
432 RColor white;
434 gray.red = 0xae;
435 gray.green = 0xaa;
436 gray.blue = 0xae;
438 white.red = 0xff;
439 white.green = 0xff;
440 white.blue = 0xff;
442 image = RLoadImage(scr->rcontext, T_WINGS_IMAGES_FILE, 0);
443 if (!image)
444 image = RLoadImage(scr->rcontext, X_WINGS_IMAGES_FILE, 0);
445 if (!image) {
446 wwarning(_("WINGs: could not load widget images file: %s"), RMessageForError(RErrorCode));
447 return False;
449 /* home icon */
450 /* make it have a gray background */
451 tmp = RGetSubImage(image, 0, 0, 24, 24);
452 RCombineImageWithColor(tmp, &gray);
453 scr->homeIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
454 RReleaseImage(tmp);
455 /* make it have a white background */
456 tmp = RGetSubImage(image, 0, 0, 24, 24);
457 RCombineImageWithColor(tmp, &white);
458 scr->altHomeIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
459 RReleaseImage(tmp);
461 /* trash can */
462 tmp = RGetSubImage(image, 104, 0, 24, 24);
463 RCombineImageWithColor(tmp, &white);
464 scr->trashcanIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
465 RReleaseImage(tmp);
466 tmp = RGetSubImage(image, 104, 0, 24, 24);
467 RCombineImageWithColor(tmp, &white);
468 scr->altTrashcanIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
469 RReleaseImage(tmp);
470 /* create dir */
471 tmp = RGetSubImage(image, 104, 24, 24, 24);
472 RCombineImageWithColor(tmp, &white);
473 scr->createDirIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
474 RReleaseImage(tmp);
475 tmp = RGetSubImage(image, 104, 24, 24, 24);
476 RCombineImageWithColor(tmp, &white);
477 scr->altCreateDirIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
478 RReleaseImage(tmp);
479 /* diskettes */
480 tmp = RGetSubImage(image, 24, 80, 24, 24);
481 RCombineImageWithColor(tmp, &white);
482 scr->disketteIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
483 RReleaseImage(tmp);
484 tmp = RGetSubImage(image, 24, 80, 24, 24);
485 RCombineImageWithColor(tmp, &white);
486 scr->altDisketteIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
487 RReleaseImage(tmp);
488 /* unmount */
489 tmp = RGetSubImage(image, 0, 80, 24, 24);
490 RCombineImageWithColor(tmp, &white);
491 scr->unmountIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
492 RReleaseImage(tmp);
493 tmp = RGetSubImage(image, 0, 80, 24, 24);
494 RCombineImageWithColor(tmp, &white);
495 scr->altUnmountIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
496 RReleaseImage(tmp);
498 /* Magnifying Glass Icon for ColorPanel */
499 tmp = RGetSubImage(image, 24, 0, 40, 32);
500 RCombineImageWithColor(tmp, &gray);
501 scr->magnifyIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
502 RReleaseImage(tmp);
503 /* ColorWheel Icon for ColorPanel */
504 tmp = RGetSubImage(image, 0, 25, 24, 24);
505 scr->wheelIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
506 RReleaseImage(tmp);
507 /* GrayScale Icon for ColorPanel */
508 tmp = RGetSubImage(image, 65, 0, 40, 24);
509 scr->grayIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
510 RReleaseImage(tmp);
511 /* RGB Icon for ColorPanel */
512 tmp = RGetSubImage(image, 25, 33, 40, 24);
513 scr->rgbIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
514 RReleaseImage(tmp);
515 /* CMYK Icon for ColorPanel */
516 tmp = RGetSubImage(image, 65, 25, 40, 24);
517 scr->cmykIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
518 RReleaseImage(tmp);
519 /* HSB Icon for ColorPanel */
520 tmp = RGetSubImage(image, 0, 57, 40, 24);
521 scr->hsbIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
522 RReleaseImage(tmp);
523 /* CustomColorPalette Icon for ColorPanel */
524 tmp = RGetSubImage(image, 81, 57, 40, 24);
525 scr->customPaletteIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
526 RReleaseImage(tmp);
527 /* ColorList Icon for ColorPanel */
528 tmp = RGetSubImage(image, 41, 57, 40, 24);
529 scr->colorListIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
530 RReleaseImage(tmp);
532 RReleaseImage(image);
534 return True;
537 WMScreen *WMOpenScreen(const char *display)
539 Display *dpy = XOpenDisplay(display);
541 if (!dpy) {
542 wwarning(_("WINGs: could not open display %s"), XDisplayName(display));
543 return NULL;
546 return WMCreateSimpleApplicationScreen(dpy);
549 WMScreen *WMCreateSimpleApplicationScreen(Display * display)
551 WMScreen *scr;
553 scr = WMCreateScreen(display, DefaultScreen(display));
555 scr->aflags.hasAppIcon = 0;
556 scr->aflags.simpleApplication = 1;
558 return scr;
561 WMScreen *WMCreateScreen(Display * display, int screen)
563 return WMCreateScreenWithRContext(display, screen, RCreateContext(display, screen, NULL));
566 WMScreen *WMCreateScreenWithRContext(Display * display, int screen, RContext * context)
568 W_Screen *scrPtr;
569 XGCValues gcv;
570 Pixmap stipple;
571 static int initialized = 0;
572 static char *atomNames[] = {
573 "_GNUSTEP_WM_ATTR",
574 "WM_DELETE_WINDOW",
575 "WM_PROTOCOLS",
576 "CLIPBOARD",
577 "XdndAware",
578 "XdndSelection",
579 "XdndEnter",
580 "XdndLeave",
581 "XdndPosition",
582 "XdndDrop",
583 "XdndFinished",
584 "XdndTypeList",
585 "XdndActionList",
586 "XdndActionDescription",
587 "XdndStatus",
588 "XdndActionCopy",
589 "XdndActionMove",
590 "XdndActionLink",
591 "XdndActionAsk",
592 "XdndActionPrivate",
593 "_WINGS_DND_MOUSE_OFFSET",
594 "WM_STATE",
595 "UTF8_STRING",
596 "_NET_WM_NAME",
597 "_NET_WM_ICON_NAME",
598 "_NET_WM_ICON",
600 Atom atoms[wlengthof(atomNames)];
601 int i;
603 if (!initialized) {
605 initialized = 1;
607 W_ReadConfigurations();
609 assert(W_ApplicationInitialized());
612 scrPtr = malloc(sizeof(W_Screen));
613 if (!scrPtr)
614 return NULL;
615 memset(scrPtr, 0, sizeof(W_Screen));
617 scrPtr->aflags.hasAppIcon = 1;
619 scrPtr->display = display;
620 scrPtr->screen = screen;
621 scrPtr->rcontext = context;
623 scrPtr->depth = context->depth;
625 scrPtr->visual = context->visual;
626 scrPtr->lastEventTime = 0;
628 scrPtr->colormap = context->cmap;
630 scrPtr->rootWin = RootWindow(display, screen);
632 scrPtr->fontCache = WMCreateHashTable(WMStringPointerHashCallbacks);
634 scrPtr->xftdraw = XftDrawCreate(scrPtr->display, W_DRAWABLE(scrPtr), scrPtr->visual, scrPtr->colormap);
636 /* Create missing CUT_BUFFERs */
638 Atom *rootWinProps;
639 int exists[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
640 int count;
642 rootWinProps = XListProperties(display, scrPtr->rootWin, &count);
643 for (i = 0; i < count; i++) {
644 switch (rootWinProps[i]) {
645 case XA_CUT_BUFFER0:
646 exists[0] = 1;
647 break;
648 case XA_CUT_BUFFER1:
649 exists[1] = 1;
650 break;
651 case XA_CUT_BUFFER2:
652 exists[2] = 1;
653 break;
654 case XA_CUT_BUFFER3:
655 exists[3] = 1;
656 break;
657 case XA_CUT_BUFFER4:
658 exists[4] = 1;
659 break;
660 case XA_CUT_BUFFER5:
661 exists[5] = 1;
662 break;
663 case XA_CUT_BUFFER6:
664 exists[6] = 1;
665 break;
666 case XA_CUT_BUFFER7:
667 exists[7] = 1;
668 break;
669 default:
670 break;
673 if (rootWinProps) {
674 XFree(rootWinProps);
676 for (i = 0; i < 8; i++) {
677 if (!exists[i]) {
678 XStoreBuffer(display, "", 0, i);
683 scrPtr->ignoredModifierMask = 0;
685 int i;
686 XModifierKeymap *modmap;
687 KeyCode nlock, slock;
688 static int mask_table[8] = {
689 ShiftMask, LockMask, ControlMask, Mod1Mask,
690 Mod2Mask, Mod3Mask, Mod4Mask, Mod5Mask
692 unsigned int numLockMask = 0, scrollLockMask = 0;
694 nlock = XKeysymToKeycode(display, XK_Num_Lock);
695 slock = XKeysymToKeycode(display, XK_Scroll_Lock);
698 * Find out the masks for the NumLock and ScrollLock modifiers,
699 * so that we can bind the grabs for when they are enabled too.
701 modmap = XGetModifierMapping(display);
703 if (modmap != NULL && modmap->max_keypermod > 0) {
704 for (i = 0; i < 8 * modmap->max_keypermod; i++) {
705 if (modmap->modifiermap[i] == nlock && nlock != 0)
706 numLockMask = mask_table[i / modmap->max_keypermod];
707 else if (modmap->modifiermap[i] == slock && slock != 0)
708 scrollLockMask = mask_table[i / modmap->max_keypermod];
712 if (modmap)
713 XFreeModifiermap(modmap);
715 scrPtr->ignoredModifierMask = numLockMask | scrollLockMask | LockMask;
718 /* initially allocate some colors */
719 WMWhiteColor(scrPtr);
720 WMBlackColor(scrPtr);
721 WMGrayColor(scrPtr);
722 WMDarkGrayColor(scrPtr);
724 gcv.graphics_exposures = False;
726 gcv.function = GXxor;
727 gcv.foreground = W_PIXEL(scrPtr->white);
728 if (gcv.foreground == 0)
729 gcv.foreground = 1;
730 scrPtr->xorGC = XCreateGC(display, W_DRAWABLE(scrPtr), GCFunction
731 | GCGraphicsExposures | GCForeground, &gcv);
733 gcv.function = GXxor;
734 gcv.foreground = W_PIXEL(scrPtr->gray);
735 gcv.subwindow_mode = IncludeInferiors;
736 scrPtr->ixorGC = XCreateGC(display, W_DRAWABLE(scrPtr), GCFunction
737 | GCGraphicsExposures | GCForeground | GCSubwindowMode, &gcv);
739 gcv.function = GXcopy;
740 scrPtr->copyGC = XCreateGC(display, W_DRAWABLE(scrPtr), GCFunction | GCGraphicsExposures, &gcv);
742 scrPtr->clipGC = XCreateGC(display, W_DRAWABLE(scrPtr), GCFunction | GCGraphicsExposures, &gcv);
744 stipple = XCreateBitmapFromData(display, W_DRAWABLE(scrPtr), STIPPLE_BITS, STIPPLE_WIDTH, STIPPLE_HEIGHT);
745 gcv.foreground = W_PIXEL(scrPtr->darkGray);
746 gcv.background = W_PIXEL(scrPtr->gray);
747 gcv.fill_style = FillStippled;
748 gcv.stipple = stipple;
749 scrPtr->stippleGC = XCreateGC(display, W_DRAWABLE(scrPtr),
750 GCForeground | GCBackground | GCStipple
751 | GCFillStyle | GCGraphicsExposures, &gcv);
753 scrPtr->drawStringGC = XCreateGC(display, W_DRAWABLE(scrPtr), GCGraphicsExposures, &gcv);
754 scrPtr->drawImStringGC = XCreateGC(display, W_DRAWABLE(scrPtr), 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->antialiasedText = WINGsConfiguration.antialiasedText;
763 scrPtr->normalFont = WMSystemFontOfSize(scrPtr, 0);
765 scrPtr->boldFont = WMBoldSystemFontOfSize(scrPtr, 0);
767 if (!scrPtr->boldFont)
768 scrPtr->boldFont = scrPtr->normalFont;
770 if (!scrPtr->normalFont) {
771 wwarning(_("could not load any fonts. Make sure your font installation"
772 " and locale settings are correct."));
774 return NULL;
777 /* create input method stuff */
778 W_InitIM(scrPtr);
780 scrPtr->checkButtonImageOn = makePixmap(scrPtr, CHECK_BUTTON_ON,
781 CHECK_BUTTON_ON_WIDTH, CHECK_BUTTON_ON_HEIGHT, False);
783 scrPtr->checkButtonImageOff = makePixmap(scrPtr, CHECK_BUTTON_OFF,
784 CHECK_BUTTON_OFF_WIDTH, CHECK_BUTTON_OFF_HEIGHT, False);
786 scrPtr->radioButtonImageOn = makePixmap(scrPtr, RADIO_BUTTON_ON,
787 RADIO_BUTTON_ON_WIDTH, RADIO_BUTTON_ON_HEIGHT, False);
789 scrPtr->radioButtonImageOff = makePixmap(scrPtr, RADIO_BUTTON_OFF,
790 RADIO_BUTTON_OFF_WIDTH, RADIO_BUTTON_OFF_HEIGHT, False);
792 scrPtr->tristateButtonImageOn = makePixmap(scrPtr, TRISTATE_BUTTON_ON,
793 TRISTATE_BUTTON_ON_WIDTH, TRISTATE_BUTTON_ON_HEIGHT, False);
795 scrPtr->tristateButtonImageOff = makePixmap(scrPtr, TRISTATE_BUTTON_OFF,
796 TRISTATE_BUTTON_OFF_WIDTH, TRISTATE_BUTTON_OFF_HEIGHT, False);
798 scrPtr->tristateButtonImageTri = makePixmap(scrPtr, TRISTATE_BUTTON_TRI,
799 TRISTATE_BUTTON_TRI_WIDTH, TRISTATE_BUTTON_TRI_HEIGHT, False);
801 scrPtr->buttonArrow = makePixmap(scrPtr, BUTTON_ARROW, BUTTON_ARROW_WIDTH, BUTTON_ARROW_HEIGHT, False);
803 scrPtr->pushedButtonArrow = makePixmap(scrPtr, BUTTON_ARROW2,
804 BUTTON_ARROW2_WIDTH, BUTTON_ARROW2_HEIGHT, False);
806 scrPtr->scrollerDimple = makePixmap(scrPtr, SCROLLER_DIMPLE,
807 SCROLLER_DIMPLE_WIDTH, SCROLLER_DIMPLE_HEIGHT, False);
809 scrPtr->upArrow = makePixmap(scrPtr, SCROLLER_ARROW_UP,
810 SCROLLER_ARROW_UP_WIDTH, SCROLLER_ARROW_UP_HEIGHT, True);
812 scrPtr->downArrow = makePixmap(scrPtr, SCROLLER_ARROW_DOWN,
813 SCROLLER_ARROW_DOWN_WIDTH, SCROLLER_ARROW_DOWN_HEIGHT, True);
815 scrPtr->leftArrow = makePixmap(scrPtr, SCROLLER_ARROW_LEFT,
816 SCROLLER_ARROW_LEFT_WIDTH, SCROLLER_ARROW_LEFT_HEIGHT, True);
818 scrPtr->rightArrow = makePixmap(scrPtr, SCROLLER_ARROW_RIGHT,
819 SCROLLER_ARROW_RIGHT_WIDTH, SCROLLER_ARROW_RIGHT_HEIGHT, True);
821 scrPtr->hiUpArrow = makePixmap(scrPtr, HI_SCROLLER_ARROW_UP,
822 SCROLLER_ARROW_UP_WIDTH, SCROLLER_ARROW_UP_HEIGHT, True);
824 scrPtr->hiDownArrow = makePixmap(scrPtr, HI_SCROLLER_ARROW_DOWN,
825 SCROLLER_ARROW_DOWN_WIDTH, SCROLLER_ARROW_DOWN_HEIGHT, True);
827 scrPtr->hiLeftArrow = makePixmap(scrPtr, HI_SCROLLER_ARROW_LEFT,
828 SCROLLER_ARROW_LEFT_WIDTH, SCROLLER_ARROW_LEFT_HEIGHT, True);
830 scrPtr->hiRightArrow = makePixmap(scrPtr, HI_SCROLLER_ARROW_RIGHT,
831 SCROLLER_ARROW_RIGHT_WIDTH, SCROLLER_ARROW_RIGHT_HEIGHT, True);
833 scrPtr->popUpIndicator = makePixmap(scrPtr, POPUP_INDICATOR,
834 POPUP_INDICATOR_WIDTH, POPUP_INDICATOR_HEIGHT, True);
836 scrPtr->pullDownIndicator = makePixmap(scrPtr, PULLDOWN_INDICATOR,
837 PULLDOWN_INDICATOR_WIDTH, PULLDOWN_INDICATOR_HEIGHT, True);
839 scrPtr->checkMark = makePixmap(scrPtr, CHECK_MARK, CHECK_MARK_WIDTH, CHECK_MARK_HEIGHT, True);
841 loadPixmaps(scrPtr);
843 scrPtr->defaultCursor = XCreateFontCursor(display, XC_left_ptr);
845 scrPtr->textCursor = XCreateFontCursor(display, XC_xterm);
848 XColor bla;
849 Pixmap blank;
851 blank = XCreatePixmap(display, scrPtr->stipple, 1, 1, 1);
852 XSetForeground(display, scrPtr->monoGC, 0);
853 XFillRectangle(display, blank, scrPtr->monoGC, 0, 0, 1, 1);
855 scrPtr->invisibleCursor = XCreatePixmapCursor(display, blank, blank, &bla, &bla, 0, 0);
856 XFreePixmap(display, blank);
859 #ifdef HAVE_XINTERNATOMS
860 XInternAtoms(display, atomNames, wlengthof(atomNames), False, atoms);
861 #else
862 for (i = 0; i < wlengthof(atomNames); i++) {
863 atoms[i] = XInternAtom(display, atomNames[i], False);
865 #endif
867 i = 0;
868 scrPtr->attribsAtom = atoms[i++];
870 scrPtr->deleteWindowAtom = atoms[i++];
872 scrPtr->protocolsAtom = atoms[i++];
874 scrPtr->clipboardAtom = atoms[i++];
876 scrPtr->xdndAwareAtom = atoms[i++];
877 scrPtr->xdndSelectionAtom = atoms[i++];
878 scrPtr->xdndEnterAtom = atoms[i++];
879 scrPtr->xdndLeaveAtom = atoms[i++];
880 scrPtr->xdndPositionAtom = atoms[i++];
881 scrPtr->xdndDropAtom = atoms[i++];
882 scrPtr->xdndFinishedAtom = atoms[i++];
883 scrPtr->xdndTypeListAtom = atoms[i++];
884 scrPtr->xdndActionListAtom = atoms[i++];
885 scrPtr->xdndActionDescriptionAtom = atoms[i++];
886 scrPtr->xdndStatusAtom = atoms[i++];
888 scrPtr->xdndActionCopy = atoms[i++];
889 scrPtr->xdndActionMove = atoms[i++];
890 scrPtr->xdndActionLink = atoms[i++];
891 scrPtr->xdndActionAsk = atoms[i++];
892 scrPtr->xdndActionPrivate = atoms[i++];
894 scrPtr->wmIconDragOffsetAtom = atoms[i++];
896 scrPtr->wmStateAtom = atoms[i++];
898 scrPtr->utf8String = atoms[i++];
899 scrPtr->netwmName = atoms[i++];
900 scrPtr->netwmIconName = atoms[i++];
901 scrPtr->netwmIcon = atoms[i++];
903 scrPtr->rootView = W_CreateRootView(scrPtr);
905 scrPtr->balloon = W_CreateBalloon(scrPtr);
907 W_InitApplication(scrPtr);
909 return scrPtr;
912 void WMSetWidgetDefaultFont(WMScreen * scr, WMFont * font)
914 WMReleaseFont(scr->normalFont);
915 scr->normalFont = WMRetainFont(font);
918 void WMSetWidgetDefaultBoldFont(WMScreen * scr, WMFont * font)
920 WMReleaseFont(scr->boldFont);
921 scr->boldFont = WMRetainFont(font);
924 void WMHangData(WMWidget * widget, void *data)
926 W_VIEW(widget)->hangedData = data;
929 void *WMGetHangedData(WMWidget * widget)
931 return W_VIEW(widget)->hangedData;
934 void WMDestroyWidget(WMWidget * widget)
936 W_UnmapView(W_VIEW(widget));
937 W_DestroyView(W_VIEW(widget));
940 void WMSetFocusToWidget(WMWidget * widget)
942 W_SetFocusOfTopLevel(W_TopLevelOfView(W_VIEW(widget)), W_VIEW(widget));
946 * WMRealizeWidget-
947 * Realizes the widget and all it's children.
950 void WMRealizeWidget(WMWidget * w)
952 W_RealizeView(W_VIEW(w));
955 void WMMapWidget(WMWidget * w)
957 W_MapView(W_VIEW(w));
960 void WMReparentWidget(WMWidget * w, WMWidget * newParent, int x, int y)
962 W_ReparentView(W_VIEW(w), W_VIEW(newParent), x, y);
965 static void makeChildrenAutomap(W_View * view, int flag)
967 view = view->childrenList;
969 while (view) {
970 view->flags.mapWhenRealized = flag;
971 makeChildrenAutomap(view, flag);
973 view = view->nextSister;
977 void WMMapSubwidgets(WMWidget * w)
979 /* make sure that subwidgets created after the parent was realized
980 * are mapped too */
981 if (!W_VIEW(w)->flags.realized) {
982 makeChildrenAutomap(W_VIEW(w), True);
983 } else {
984 W_MapSubviews(W_VIEW(w));
988 void WMUnmapSubwidgets(WMWidget * w)
990 if (!W_VIEW(w)->flags.realized) {
991 makeChildrenAutomap(W_VIEW(w), False);
992 } else {
993 W_UnmapSubviews(W_VIEW(w));
997 void WMUnmapWidget(WMWidget * w)
999 W_UnmapView(W_VIEW(w));
1002 Bool WMWidgetIsMapped(WMWidget * w)
1004 return W_VIEW(w)->flags.mapped;
1007 void WMSetWidgetBackgroundColor(WMWidget * w, WMColor * color)
1009 W_SetViewBackgroundColor(W_VIEW(w), color);
1010 if (W_VIEW(w)->flags.mapped)
1011 WMRedisplayWidget(w);
1014 WMColor *WMGetWidgetBackgroundColor(WMWidget * w)
1016 return W_VIEW(w)->backColor;
1019 void WMSetWidgetBackgroundPixmap(WMWidget *w, WMPixmap *pix)
1021 if (!pix)
1022 return;
1024 W_SetViewBackgroundPixmap(W_VIEW(w), pix);
1025 if (W_VIEW(w)->flags.mapped)
1026 WMRedisplayWidget(w);
1029 WMPixmap *WMGetWidgetBackgroundPixmap(WMWidget *w)
1031 return W_VIEW(w)->backImage;
1034 void WMRaiseWidget(WMWidget * w)
1036 W_RaiseView(W_VIEW(w));
1039 void WMLowerWidget(WMWidget * w)
1041 W_LowerView(W_VIEW(w));
1044 void WMMoveWidget(WMWidget * w, int x, int y)
1046 W_MoveView(W_VIEW(w), x, y);
1049 void WMResizeWidget(WMWidget * w, unsigned int width, unsigned int height)
1051 W_ResizeView(W_VIEW(w), width, height);
1054 W_Class W_RegisterUserWidget(void)
1056 userWidgetCount++;
1058 return userWidgetCount + WC_UserWidget - 1;
1061 RContext *WMScreenRContext(WMScreen * scr)
1063 return scr->rcontext;
1066 unsigned int WMWidgetWidth(WMWidget * w)
1068 return W_VIEW(w)->size.width;
1071 unsigned int WMWidgetHeight(WMWidget * w)
1073 return W_VIEW(w)->size.height;
1076 Window WMWidgetXID(WMWidget * w)
1078 return W_VIEW(w)->window;
1081 WMScreen *WMWidgetScreen(WMWidget * w)
1083 return W_VIEW(w)->screen;
1086 void WMScreenMainLoop(WMScreen * scr)
1088 XEvent event;
1090 while (1) {
1091 WMNextEvent(scr->display, &event);
1092 WMHandleEvent(&event);
1096 void WMBreakModalLoop(WMScreen * scr)
1098 scr->modalLoop = 0;
1101 void WMRunModalLoop(WMScreen * scr, WMView * view)
1103 /* why is scr passed if is determined from the view? */
1104 /*WMScreen *scr = view->screen; */
1105 int oldModalLoop = scr->modalLoop;
1106 WMView *oldModalView = scr->modalView;
1108 scr->modalView = view;
1110 scr->modalLoop = 1;
1111 while (scr->modalLoop) {
1112 XEvent event;
1114 WMNextEvent(scr->display, &event);
1115 WMHandleEvent(&event);
1118 scr->modalView = oldModalView;
1119 scr->modalLoop = oldModalLoop;
1122 Display *WMScreenDisplay(WMScreen * scr)
1124 return scr->display;
1127 int WMScreenDepth(WMScreen * scr)
1129 return scr->depth;
1132 unsigned int WMScreenWidth(WMScreen * scr)
1134 return scr->rootView->size.width;
1137 unsigned int WMScreenHeight(WMScreen * scr)
1139 return scr->rootView->size.height;
1142 void WMRedisplayWidget(WMWidget * w)
1144 W_RedisplayView(W_VIEW(w));