Port WM2 branch onto next
[wmaker-crm.git] / WINGs / widgets.c
blob3dc3ca7d6e9d8a0568d4c468558ea138e5e06149
2 #include "WINGsP.h"
3 #include "wconfig.h"
5 #include <cairo-xlib.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 static char *BUTTON_ARROW[] = {
101 "..................",
102 "....##....#### ...",
103 "...#.%....#... ...",
104 "..#..%#####... ...",
105 ".#............ ...",
106 "#............. ...",
107 ".#............ ...",
108 "..#.. ...",
109 "...#. ............",
110 "....# ............"
113 #define BUTTON_ARROW_WIDTH 18
114 #define BUTTON_ARROW_HEIGHT 10
116 static char *BUTTON_ARROW2[] = {
117 " ",
118 " ## ####. ",
119 " # % # . ",
120 " # %##### . ",
121 " # . ",
122 "# . ",
123 " # . ",
124 " # .......... ",
125 " # . ",
126 " #. "
129 #define BUTTON_ARROW2_WIDTH 18
130 #define BUTTON_ARROW2_HEIGHT 10
132 static char *SCROLLER_DIMPLE[] = {
133 ".%###.",
134 "%#%%%%",
135 "#%%...",
136 "#%.. ",
137 "#%. ",
138 ".%. ."
141 #define SCROLLER_DIMPLE_WIDTH 6
142 #define SCROLLER_DIMPLE_HEIGHT 6
144 static char *SCROLLER_ARROW_UP[] = {
145 "....%....",
146 "....#....",
147 "...%#%...",
148 "...###...",
149 "..%###%..",
150 "..#####..",
151 ".%#####%.",
152 ".#######.",
153 "%#######%"
156 static char *HI_SCROLLER_ARROW_UP[] = {
157 " % ",
158 " % ",
159 " %%% ",
160 " %%% ",
161 " %%%%% ",
162 " %%%%% ",
163 " %%%%%%% ",
164 " %%%%%%% ",
165 "%%%%%%%%%"
168 #define SCROLLER_ARROW_UP_WIDTH 9
169 #define SCROLLER_ARROW_UP_HEIGHT 9
171 static char *SCROLLER_ARROW_DOWN[] = {
172 "%#######%",
173 ".#######.",
174 ".%#####%.",
175 "..#####..",
176 "..%###%..",
177 "...###...",
178 "...%#%...",
179 "....#....",
180 "....%...."
183 static char *HI_SCROLLER_ARROW_DOWN[] = {
184 "%%%%%%%%%",
185 " %%%%%%% ",
186 " %%%%%%% ",
187 " %%%%% ",
188 " %%%%% ",
189 " %%% ",
190 " %%% ",
191 " % ",
192 " % "
195 #define SCROLLER_ARROW_DOWN_WIDTH 9
196 #define SCROLLER_ARROW_DOWN_HEIGHT 9
198 static char *SCROLLER_ARROW_LEFT[] = {
199 "........%",
200 "......%##",
201 "....%####",
202 "..%######",
203 "%########",
204 "..%######",
205 "....%####",
206 "......%##",
207 "........%"
210 static char *HI_SCROLLER_ARROW_LEFT[] = {
211 " %",
212 " %%%",
213 " %%%%%",
214 " %%%%%%%",
215 "%%%%%%%%%",
216 " %%%%%%%",
217 " %%%%%",
218 " %%%",
219 " %"
222 #define SCROLLER_ARROW_LEFT_WIDTH 9
223 #define SCROLLER_ARROW_LEFT_HEIGHT 9
225 static char *SCROLLER_ARROW_RIGHT[] = {
226 "%........",
227 "##%......",
228 "####%....",
229 "######%..",
230 "########%",
231 "######%..",
232 "####%....",
233 "##%......",
234 "%........"
237 static char *HI_SCROLLER_ARROW_RIGHT[] = {
238 "% ",
239 "%%% ",
240 "%%%%% ",
241 "%%%%%%% ",
242 "%%%%%%%%%",
243 "%%%%%%% ",
244 "%%%%% ",
245 "%%% ",
246 "% "
249 #define SCROLLER_ARROW_RIGHT_WIDTH 9
250 #define SCROLLER_ARROW_RIGHT_HEIGHT 9
252 static char *POPUP_INDICATOR[] = {
253 " #==",
254 " ......%#==",
255 " ......%#%%",
256 " ......%#%%",
257 " %%%%%%%#%%",
258 "#########%%",
259 "==%%%%%%%%%",
260 "==%%%%%%%%%"
263 #define POPUP_INDICATOR_WIDTH 11
264 #define POPUP_INDICATOR_HEIGHT 8
266 static char *PULLDOWN_INDICATOR[] = {
267 "=#######=",
268 "=%===== =",
269 "==%=== ==",
270 "==%=== ==",
271 "===%= ===",
272 "===%= ===",
273 "====%===="
276 #define PULLDOWN_INDICATOR_WIDTH 9
277 #define PULLDOWN_INDICATOR_HEIGHT 7
279 #define CHECK_MARK_WIDTH 8
280 #define CHECK_MARK_HEIGHT 10
282 static char *CHECK_MARK[] = {
283 "======== ",
284 "======= #",
285 "====== #%",
286 "===== #%=",
287 " #== #%==",
288 " #% #%===",
289 " % #%====",
290 " #%=====",
291 " #%======",
292 "#%======="
295 #define STIPPLE_WIDTH 8
296 #define STIPPLE_HEIGHT 8
297 static char STIPPLE_BITS[] = {
298 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55
301 extern void W_ReadConfigurations(void);
303 static int userWidgetCount = 0;
305 /***** end data ******/
307 static void renderImage(W_Screen *screen, cairo_surface_t *image, char **data,
308 int width, int height)
310 int x, y, stride, offs;
311 unsigned char *buffer= cairo_image_surface_get_data(image);
312 WMColorSpec white= WMWhiteColorSpec();
313 WMColorSpec black= WMBlackColorSpec();
314 WMColorSpec light= WMGrayColorSpec();
315 WMColorSpec dark= WMDarkGrayColorSpec();
316 WMColorSpec trans= {0, 0, 0, 0};
318 #define PUTPIXEL(buffer, offs, color)\
319 buffer[offs++]= color.alpha, buffer[offs]= color.red, buffer[offs++]= color.green, buffer[offs++]= color.blue
321 stride= cairo_image_surface_get_stride(image);
322 offs= 0;
323 for (y = 0; y < height; y++) {
324 offs= height * stride;
325 for (x = 0; x < width; x++) {
326 switch (data[y][x]) {
327 case ' ':
328 case 'w':
329 PUTPIXEL(buffer, offs, white);
330 break;
332 case '=':
333 PUTPIXEL(buffer, offs, trans);
334 break;
335 case '.':
336 case 'l':
337 PUTPIXEL(buffer, offs, light);
338 break;
340 case '%':
341 case 'd':
342 PUTPIXEL(buffer, offs, dark);
343 break;
345 case '#':
346 case 'b':
347 default:
348 PUTPIXEL(buffer, offs, black);
349 break;
355 static WMImage* makeImage(W_Screen *sPtr, char **data, int width, int height, int masked)
357 cairo_surface_t *image;
359 image= cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height);
361 renderImage(sPtr, image, data, width, height);
363 return image;
366 #define T_WINGS_IMAGES_FILE RESOURCE_PATH"/Images.tiff"
367 #define T_DEFAULT_OBJECT_ICON_FILE RESOURCE_PATH"/defaultIcon.tiff"
369 #define X_WINGS_IMAGES_FILE RESOURCE_PATH"/Images.xpm"
370 #define X_DEFAULT_OBJECT_ICON_FILE RESOURCE_PATH"/defaultIcon.xpm"
372 static Bool loadPixmaps(WMScreen * scr)
374 #ifdef obsolete
375 RImage *image, *tmp;
376 RColor gray;
377 RColor white;
379 gray.red = 0xae;
380 gray.green = 0xaa;
381 gray.blue = 0xae;
383 white.red = 0xff;
384 white.green = 0xff;
385 white.blue = 0xff;
387 image = RLoadImage(scr->rcontext, T_WINGS_IMAGES_FILE, 0);
388 if (!image)
389 image = RLoadImage(scr->rcontext, X_WINGS_IMAGES_FILE, 0);
390 if (!image) {
391 wwarning(_("WINGs: could not load widget images file: %s"), RMessageForError(RErrorCode));
392 return False;
394 /* home icon */
395 /* make it have a gray background */
396 tmp = RGetSubImage(image, 0, 0, 24, 24);
397 RCombineImageWithColor(tmp, &gray);
398 scr->homeIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
399 RReleaseImage(tmp);
400 /* make it have a white background */
401 tmp = RGetSubImage(image, 0, 0, 24, 24);
402 RCombineImageWithColor(tmp, &white);
403 scr->altHomeIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
404 RReleaseImage(tmp);
406 /* trash can */
407 tmp = RGetSubImage(image, 104, 0, 24, 24);
408 RCombineImageWithColor(tmp, &white);
409 scr->trashcanIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
410 RReleaseImage(tmp);
411 tmp = RGetSubImage(image, 104, 0, 24, 24);
412 RCombineImageWithColor(tmp, &white);
413 scr->altTrashcanIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
414 RReleaseImage(tmp);
415 /* create dir */
416 tmp = RGetSubImage(image, 104, 24, 24, 24);
417 RCombineImageWithColor(tmp, &white);
418 scr->createDirIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
419 RReleaseImage(tmp);
420 tmp = RGetSubImage(image, 104, 24, 24, 24);
421 RCombineImageWithColor(tmp, &white);
422 scr->altCreateDirIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
423 RReleaseImage(tmp);
424 /* diskettes */
425 tmp = RGetSubImage(image, 24, 80, 24, 24);
426 RCombineImageWithColor(tmp, &white);
427 scr->disketteIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
428 RReleaseImage(tmp);
429 tmp = RGetSubImage(image, 24, 80, 24, 24);
430 RCombineImageWithColor(tmp, &white);
431 scr->altDisketteIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
432 RReleaseImage(tmp);
433 /* unmount */
434 tmp = RGetSubImage(image, 0, 80, 24, 24);
435 RCombineImageWithColor(tmp, &white);
436 scr->unmountIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
437 RReleaseImage(tmp);
438 tmp = RGetSubImage(image, 0, 80, 24, 24);
439 RCombineImageWithColor(tmp, &white);
440 scr->altUnmountIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
441 RReleaseImage(tmp);
443 /* Magnifying Glass Icon for ColorPanel */
444 tmp = RGetSubImage(image, 24, 0, 40, 32);
445 RCombineImageWithColor(tmp, &gray);
446 scr->magnifyIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
447 RReleaseImage(tmp);
448 /* ColorWheel Icon for ColorPanel */
449 tmp = RGetSubImage(image, 0, 25, 24, 24);
450 scr->wheelIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
451 RReleaseImage(tmp);
452 /* GrayScale Icon for ColorPanel */
453 tmp = RGetSubImage(image, 65, 0, 40, 24);
454 scr->grayIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
455 RReleaseImage(tmp);
456 /* RGB Icon for ColorPanel */
457 tmp = RGetSubImage(image, 25, 33, 40, 24);
458 scr->rgbIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
459 RReleaseImage(tmp);
460 /* CMYK Icon for ColorPanel */
461 tmp = RGetSubImage(image, 65, 25, 40, 24);
462 scr->cmykIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
463 RReleaseImage(tmp);
464 /* HSB Icon for ColorPanel */
465 tmp = RGetSubImage(image, 0, 57, 40, 24);
466 scr->hsbIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
467 RReleaseImage(tmp);
468 /* CustomColorPalette Icon for ColorPanel */
469 tmp = RGetSubImage(image, 81, 57, 40, 24);
470 scr->customPaletteIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
471 RReleaseImage(tmp);
472 /* ColorList Icon for ColorPanel */
473 tmp = RGetSubImage(image, 41, 57, 40, 24);
474 scr->colorListIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
475 RReleaseImage(tmp);
477 RReleaseImage(image);
478 #endif
480 #if 0
481 scr->defaultObjectIcon = WMCreatePixmapFromFile(scr, T_DEFAULT_OBJECT_ICON_FILE);
482 if (!scr->defaultObjectIcon) {
483 scr->defaultObjectIcon = WMCreatePixmapFromFile(scr, X_DEFAULT_OBJECT_ICON_FILE);
485 if (!scr->defaultObjectIcon) {
486 wwarning("WINGs: could not load default icon file");
487 return False;
489 #endif
490 return True;
493 WMScreen *WMOpenScreen(const char *display)
495 Display *dpy = XOpenDisplay(display);
497 if (!dpy) {
498 wwarning("WINGs: could not open display %s", XDisplayName(display));
499 return NULL;
502 return WMCreateSimpleApplicationScreen(dpy);
505 WMScreen *WMCreateSimpleApplicationScreen(Display * display)
507 WMScreen *scr;
509 scr = WMCreateScreen(display, DefaultScreen(display));
511 scr->aflags.hasAppIcon = 0;
512 scr->aflags.simpleApplication = 1;
514 return scr;
517 WMScreen *WMCreateScreen(Display * display, int screen)
519 W_Screen *scrPtr;
520 XGCValues gcv;
521 Pixmap stipple;
522 static int initialized = 0;
523 static char *atomNames[] = {
524 "_GNUSTEP_WM_ATTR",
525 "WM_DELETE_WINDOW",
526 "WM_PROTOCOLS",
527 "CLIPBOARD",
528 "XdndAware",
529 "XdndSelection",
530 "XdndEnter",
531 "XdndLeave",
532 "XdndPosition",
533 "XdndDrop",
534 "XdndFinished",
535 "XdndTypeList",
536 "XdndActionList",
537 "XdndActionDescription",
538 "XdndStatus",
539 "XdndActionCopy",
540 "XdndActionMove",
541 "XdndActionLink",
542 "XdndActionAsk",
543 "XdndActionPrivate",
544 "_WINGS_DND_MOUSE_OFFSET",
545 "WM_STATE",
546 "UTF8_STRING",
547 "_NET_WM_NAME",
548 "_NET_WM_ICON_NAME",
549 "_NET_WM_ICON",
551 Atom atoms[sizeof(atomNames) / sizeof(char *)];
552 int i;
554 if (!initialized) {
556 initialized = 1;
558 W_ReadConfigurations();
560 assert(W_ApplicationInitialized());
563 scrPtr = malloc(sizeof(W_Screen));
564 if (!scrPtr)
565 return NULL;
566 memset(scrPtr, 0, sizeof(W_Screen));
568 scrPtr->aflags.hasAppIcon = 1;
570 scrPtr->display = display;
571 scrPtr->screen = screen;
573 //XXX may want to check if there's a better visual than the default
574 scrPtr->depth = DefaultDepth(display, screen);
575 scrPtr->visual = DefaultVisual(display, screen);
577 scrPtr->lastEventTime = 0;
579 scrPtr->colormap = DefaultColormap(display, screen);
581 scrPtr->rootWin = RootWindow(display, screen);
583 /* Create missing CUT_BUFFERs */
585 Atom *rootWinProps;
586 int exists[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
587 int count;
589 rootWinProps = XListProperties(display, scrPtr->rootWin, &count);
590 for (i = 0; i < count; i++) {
591 switch (rootWinProps[i]) {
592 case XA_CUT_BUFFER0:
593 exists[0] = 1;
594 break;
595 case XA_CUT_BUFFER1:
596 exists[1] = 1;
597 break;
598 case XA_CUT_BUFFER2:
599 exists[2] = 1;
600 break;
601 case XA_CUT_BUFFER3:
602 exists[3] = 1;
603 break;
604 case XA_CUT_BUFFER4:
605 exists[4] = 1;
606 break;
607 case XA_CUT_BUFFER5:
608 exists[5] = 1;
609 break;
610 case XA_CUT_BUFFER6:
611 exists[6] = 1;
612 break;
613 case XA_CUT_BUFFER7:
614 exists[7] = 1;
615 break;
616 default:
617 break;
620 if (rootWinProps) {
621 XFree(rootWinProps);
623 for (i = 0; i < 8; i++) {
624 if (!exists[i]) {
625 XStoreBuffer(display, "", 0, i);
630 scrPtr->ignoredModifierMask = 0;
632 int i;
633 XModifierKeymap *modmap;
634 KeyCode nlock, slock;
635 static int mask_table[8] = {
636 ShiftMask, LockMask, ControlMask, Mod1Mask,
637 Mod2Mask, Mod3Mask, Mod4Mask, Mod5Mask
639 unsigned int numLockMask = 0, scrollLockMask = 0;
641 nlock = XKeysymToKeycode(display, XK_Num_Lock);
642 slock = XKeysymToKeycode(display, XK_Scroll_Lock);
645 * Find out the masks for the NumLock and ScrollLock modifiers,
646 * so that we can bind the grabs for when they are enabled too.
648 modmap = XGetModifierMapping(display);
650 if (modmap != NULL && modmap->max_keypermod > 0) {
651 for (i = 0; i < 8 * modmap->max_keypermod; i++) {
652 if (modmap->modifiermap[i] == nlock && nlock != 0)
653 numLockMask = mask_table[i / modmap->max_keypermod];
654 else if (modmap->modifiermap[i] == slock && slock != 0)
655 scrollLockMask = mask_table[i / modmap->max_keypermod];
659 if (modmap)
660 XFreeModifiermap(modmap);
662 scrPtr->ignoredModifierMask = numLockMask | scrollLockMask | LockMask;
665 #ifdef obsolete //XXX
666 /* initially allocate some colors */
667 WMWhiteColor(scrPtr);
668 WMBlackColor(scrPtr);
669 WMGrayColor(scrPtr);
670 WMDarkGrayColor(scrPtr);
671 #endif
672 gcv.graphics_exposures = False;
674 gcv.function = GXxor;
675 // gcv.foreground = W_PIXEL(scrPtr->white);
676 if (gcv.foreground == 0) gcv.foreground = 1;
677 scrPtr->xorGC = XCreateGC(display, DefaultRootWindow(scrPtr->display), GCFunction
678 |GCGraphicsExposures|GCForeground, &gcv);
680 gcv.function = GXxor;
681 // gcv.foreground = W_PIXEL(scrPtr->gray);
682 gcv.subwindow_mode = IncludeInferiors;
683 scrPtr->ixorGC = XCreateGC(display, DefaultRootWindow(scrPtr->display), GCFunction
684 |GCGraphicsExposures|GCForeground
685 |GCSubwindowMode, &gcv);
687 gcv.function = GXcopy;
688 scrPtr->copyGC = XCreateGC(display, DefaultRootWindow(scrPtr->display), GCFunction
689 |GCGraphicsExposures, &gcv);
691 scrPtr->clipGC = XCreateGC(display, DefaultRootWindow(scrPtr->display), GCFunction
692 |GCGraphicsExposures, &gcv);
694 stipple = XCreateBitmapFromData(display, DefaultRootWindow(scrPtr->display),
695 STIPPLE_BITS, STIPPLE_WIDTH, STIPPLE_HEIGHT);
696 // gcv.foreground = W_PIXEL(scrPtr->darkGray);
697 // gcv.background = W_PIXEL(scrPtr->gray);
698 gcv.fill_style = FillStippled;
699 gcv.stipple = stipple;
700 scrPtr->stippleGC = XCreateGC(display, DefaultRootWindow(scrPtr->display),
701 GCForeground|GCBackground|GCStipple
702 |GCFillStyle|GCGraphicsExposures, &gcv);
704 scrPtr->drawStringGC = XCreateGC(display, DefaultRootWindow(scrPtr->display),
705 GCGraphicsExposures, &gcv);
706 scrPtr->drawImStringGC = XCreateGC(display, DefaultRootWindow(scrPtr->display),
707 GCGraphicsExposures, &gcv);
709 /* we need a 1bpp drawable for the monoGC, so borrow this one */
710 scrPtr->monoGC = XCreateGC(display, stipple, 0, NULL);
712 scrPtr->stipple = stipple;
714 scrPtr->antialiasedText = WINGsConfiguration.antialiasedText;
716 scrPtr->normalFont = WMSystemFontOfSize(scrPtr, 0);
718 scrPtr->boldFont = WMBoldSystemFontOfSize(scrPtr, 0);
720 if (!scrPtr->boldFont)
721 scrPtr->boldFont = scrPtr->normalFont;
723 if (!scrPtr->normalFont) {
724 wwarning(_("could not load any fonts. Make sure your font installation"
725 " and locale settings are correct."));
727 return NULL;
730 /* create input method stuff */
731 W_InitIM(scrPtr);
733 scrPtr->checkButtonImageOn = makeImage(scrPtr, CHECK_BUTTON_ON,
734 CHECK_BUTTON_ON_WIDTH,
735 CHECK_BUTTON_ON_HEIGHT, False);
737 scrPtr->checkButtonImageOff = makeImage(scrPtr, CHECK_BUTTON_OFF,
738 CHECK_BUTTON_OFF_WIDTH,
739 CHECK_BUTTON_OFF_HEIGHT, False);
741 scrPtr->radioButtonImageOn = makeImage(scrPtr, RADIO_BUTTON_ON,
742 RADIO_BUTTON_ON_WIDTH,
743 RADIO_BUTTON_ON_HEIGHT, False);
745 scrPtr->radioButtonImageOff = makeImage(scrPtr, RADIO_BUTTON_OFF,
746 RADIO_BUTTON_OFF_WIDTH,
747 RADIO_BUTTON_OFF_HEIGHT, False);
749 scrPtr->buttonArrow = makeImage(scrPtr, BUTTON_ARROW,
750 BUTTON_ARROW_WIDTH, BUTTON_ARROW_HEIGHT,
751 False);
753 scrPtr->pushedButtonArrow = makeImage(scrPtr, BUTTON_ARROW2,
754 BUTTON_ARROW2_WIDTH, BUTTON_ARROW2_HEIGHT,
755 False);
758 scrPtr->scrollerDimple = makeImage(scrPtr, SCROLLER_DIMPLE,
759 SCROLLER_DIMPLE_WIDTH,
760 SCROLLER_DIMPLE_HEIGHT, False);
763 scrPtr->upArrow = makeImage(scrPtr, SCROLLER_ARROW_UP,
764 SCROLLER_ARROW_UP_WIDTH,
765 SCROLLER_ARROW_UP_HEIGHT, True);
767 scrPtr->downArrow = makeImage(scrPtr, SCROLLER_ARROW_DOWN,
768 SCROLLER_ARROW_DOWN_WIDTH,
769 SCROLLER_ARROW_DOWN_HEIGHT, True);
771 scrPtr->leftArrow = makeImage(scrPtr, SCROLLER_ARROW_LEFT,
772 SCROLLER_ARROW_LEFT_WIDTH,
773 SCROLLER_ARROW_LEFT_HEIGHT, True);
775 scrPtr->rightArrow = makeImage(scrPtr, SCROLLER_ARROW_RIGHT,
776 SCROLLER_ARROW_RIGHT_WIDTH,
777 SCROLLER_ARROW_RIGHT_HEIGHT, True);
779 scrPtr->hiUpArrow = makeImage(scrPtr, HI_SCROLLER_ARROW_UP,
780 SCROLLER_ARROW_UP_WIDTH,
781 SCROLLER_ARROW_UP_HEIGHT, True);
783 scrPtr->hiDownArrow = makeImage(scrPtr, HI_SCROLLER_ARROW_DOWN,
784 SCROLLER_ARROW_DOWN_WIDTH,
785 SCROLLER_ARROW_DOWN_HEIGHT, True);
787 scrPtr->hiLeftArrow = makeImage(scrPtr, HI_SCROLLER_ARROW_LEFT,
788 SCROLLER_ARROW_LEFT_WIDTH,
789 SCROLLER_ARROW_LEFT_HEIGHT, True);
791 scrPtr->hiRightArrow = makeImage(scrPtr, HI_SCROLLER_ARROW_RIGHT,
792 SCROLLER_ARROW_RIGHT_WIDTH,
793 SCROLLER_ARROW_RIGHT_HEIGHT, True);
795 scrPtr->popUpIndicator = makeImage(scrPtr, POPUP_INDICATOR,
796 POPUP_INDICATOR_WIDTH,
797 POPUP_INDICATOR_HEIGHT, True);
799 scrPtr->pullDownIndicator = makeImage(scrPtr, PULLDOWN_INDICATOR,
800 PULLDOWN_INDICATOR_WIDTH,
801 PULLDOWN_INDICATOR_HEIGHT, True);
803 scrPtr->checkMark = makeImage(scrPtr, CHECK_MARK,
804 CHECK_MARK_WIDTH,
805 CHECK_MARK_HEIGHT, True);
807 loadPixmaps(scrPtr);
809 scrPtr->defaultCursor = XCreateFontCursor(display, XC_left_ptr);
811 scrPtr->textCursor = XCreateFontCursor(display, XC_xterm);
814 XColor bla;
815 Pixmap blank;
817 blank = XCreatePixmap(display, scrPtr->stipple, 1, 1, 1);
818 XSetForeground(display, scrPtr->monoGC, 0);
819 XFillRectangle(display, blank, scrPtr->monoGC, 0, 0, 1, 1);
821 scrPtr->invisibleCursor = XCreatePixmapCursor(display, blank, blank, &bla, &bla, 0, 0);
822 XFreePixmap(display, blank);
825 #ifdef HAVE_XINTERNATOMS
826 XInternAtoms(display, atomNames, sizeof(atomNames) / sizeof(char *), False, atoms);
827 #else
828 for (i = 0; i < sizeof(atomNames) / sizeof(char *); i++) {
829 atoms[i] = XInternAtom(display, atomNames[i], False);
831 #endif
833 i = 0;
834 scrPtr->attribsAtom = atoms[i++];
836 scrPtr->deleteWindowAtom = atoms[i++];
838 scrPtr->protocolsAtom = atoms[i++];
840 scrPtr->clipboardAtom = atoms[i++];
842 scrPtr->xdndAwareAtom = atoms[i++];
843 scrPtr->xdndSelectionAtom = atoms[i++];
844 scrPtr->xdndEnterAtom = atoms[i++];
845 scrPtr->xdndLeaveAtom = atoms[i++];
846 scrPtr->xdndPositionAtom = atoms[i++];
847 scrPtr->xdndDropAtom = atoms[i++];
848 scrPtr->xdndFinishedAtom = atoms[i++];
849 scrPtr->xdndTypeListAtom = atoms[i++];
850 scrPtr->xdndActionListAtom = atoms[i++];
851 scrPtr->xdndActionDescriptionAtom = atoms[i++];
852 scrPtr->xdndStatusAtom = atoms[i++];
854 scrPtr->xdndActionCopy = atoms[i++];
855 scrPtr->xdndActionMove = atoms[i++];
856 scrPtr->xdndActionLink = atoms[i++];
857 scrPtr->xdndActionAsk = atoms[i++];
858 scrPtr->xdndActionPrivate = atoms[i++];
860 scrPtr->wmIconDragOffsetAtom = atoms[i++];
862 scrPtr->wmStateAtom = atoms[i++];
864 scrPtr->utf8String = atoms[i++];
865 scrPtr->netwmName = atoms[i++];
866 scrPtr->netwmIconName = atoms[i++];
867 scrPtr->netwmIcon = atoms[i++];
869 scrPtr->rootView = W_CreateRootView(scrPtr);
871 scrPtr->balloon = W_CreateBalloon(scrPtr);
873 W_InitApplication(scrPtr);
875 return scrPtr;
878 void WMSetWidgetDefaultFont(WMScreen * scr, WMFont * font)
880 WMReleaseFont(scr->normalFont);
881 scr->normalFont = WMRetainFont(font);
884 void WMSetWidgetDefaultBoldFont(WMScreen * scr, WMFont * font)
886 WMReleaseFont(scr->boldFont);
887 scr->boldFont = WMRetainFont(font);
890 void WMHangData(WMWidget * widget, void *data)
892 W_VIEW(widget)->hangedData = data;
895 void *WMGetHangedData(WMWidget * widget)
897 return W_VIEW(widget)->hangedData;
900 void WMDestroyWidget(WMWidget * widget)
902 W_UnmapView(W_VIEW(widget));
903 W_DestroyView(W_VIEW(widget));
906 void WMSetFocusToWidget(WMWidget * widget)
908 W_SetFocusOfTopLevel(W_TopLevelOfView(W_VIEW(widget)), W_VIEW(widget));
912 * WMRealizeWidget-
913 * Realizes the widget and all it's children.
916 void WMRealizeWidget(WMWidget * w)
918 W_RealizeView(W_VIEW(w));
921 void WMMapWidget(WMWidget * w)
923 W_MapView(W_VIEW(w));
926 void WMReparentWidget(WMWidget * w, WMWidget * newParent, int x, int y)
928 W_ReparentView(W_VIEW(w), W_VIEW(newParent), x, y);
931 static void makeChildrenAutomap(W_View * view, int flag)
933 view = view->childrenList;
935 while (view) {
936 view->flags.mapWhenRealized = flag;
937 makeChildrenAutomap(view, flag);
939 view = view->nextSister;
943 void WMMapSubwidgets(WMWidget * w)
945 /* make sure that subwidgets created after the parent was realized
946 * are mapped too */
947 if (!W_VIEW(w)->flags.realized) {
948 makeChildrenAutomap(W_VIEW(w), True);
949 } else {
950 W_MapSubviews(W_VIEW(w));
954 void WMUnmapSubwidgets(WMWidget * w)
956 if (!W_VIEW(w)->flags.realized) {
957 makeChildrenAutomap(W_VIEW(w), False);
958 } else {
959 W_UnmapSubviews(W_VIEW(w));
963 void WMUnmapWidget(WMWidget * w)
965 W_UnmapView(W_VIEW(w));
968 Bool WMWidgetIsMapped(WMWidget * w)
970 return W_VIEW(w)->flags.mapped;
973 void WMSetWidgetBackgroundColor(WMWidget * w, WMColorSpec * color)
975 W_SetViewBackgroundColor(W_VIEW(w), color);
976 if (W_VIEW(w)->flags.mapped)
977 WMRedisplayWidget(w);
980 WMColorSpec WMGetWidgetBackgroundColor(WMWidget * w)
982 return W_VIEW(w)->backColor;
985 void WMRaiseWidget(WMWidget * w)
987 W_RaiseView(W_VIEW(w));
990 void WMLowerWidget(WMWidget * w)
992 W_LowerView(W_VIEW(w));
995 void WMMoveWidget(WMWidget * w, int x, int y)
997 W_MoveView(W_VIEW(w), x, y);
1000 void WMResizeWidget(WMWidget * w, unsigned int width, unsigned int height)
1002 W_ResizeView(W_VIEW(w), width, height);
1005 W_Class W_RegisterUserWidget(void)
1007 userWidgetCount++;
1009 return userWidgetCount + WC_UserWidget - 1;
1012 unsigned int WMWidgetWidth(WMWidget * w)
1014 return W_VIEW(w)->size.width;
1017 unsigned int WMWidgetHeight(WMWidget * w)
1019 return W_VIEW(w)->size.height;
1022 Window WMWidgetXID(WMWidget * w)
1024 return W_VIEW(w)->window;
1027 WMScreen *WMWidgetScreen(WMWidget * w)
1029 return W_VIEW(w)->screen;
1032 void WMScreenMainLoop(WMScreen * scr)
1034 XEvent event;
1036 while (1) {
1037 WMNextEvent(scr->display, &event);
1038 WMHandleEvent(&event);
1042 void WMBreakModalLoop(WMScreen * scr)
1044 scr->modalLoop = 0;
1047 void WMRunModalLoop(WMScreen * scr, WMView * view)
1049 /* why is scr passed if is determined from the view? */
1050 /*WMScreen *scr = view->screen; */
1051 int oldModalLoop = scr->modalLoop;
1052 WMView *oldModalView = scr->modalView;
1054 scr->modalView = view;
1056 scr->modalLoop = 1;
1057 while (scr->modalLoop) {
1058 XEvent event;
1060 WMNextEvent(scr->display, &event);
1061 WMHandleEvent(&event);
1064 scr->modalView = oldModalView;
1065 scr->modalLoop = oldModalLoop;
1068 Display *WMScreenDisplay(WMScreen * scr)
1070 return scr->display;
1073 int WMScreenDepth(WMScreen * scr)
1075 return scr->depth;
1078 unsigned int WMScreenWidth(WMScreen * scr)
1080 return scr->rootView->size.width;
1083 unsigned int WMScreenHeight(WMScreen * scr)
1085 return scr->rootView->size.height;
1088 void WMRedisplayWidget(WMWidget * w)
1090 W_RedisplayView(W_VIEW(w));