Radio and Check buttons now work
[wmaker-crm.git] / WINGs / widgets.c
blob0ffc09982287abbd4f26eabdc945ad49f8eca8d2
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 if (buffer == NULL) {
313 printf("problem");
314 fflush(0);
316 WMColorSpec white = WMWhiteColorSpec();
317 WMColorSpec black = WMBlackColorSpec();
318 WMColorSpec light = WMGrayColorSpec();
319 WMColorSpec dark = WMDarkGrayColorSpec();
320 WMColorSpec trans = {0, 0, 0, 0};
322 #ifdef __BIG_ENDIAN__
323 #define PUTPIXEL(buffer, offs, color)\
324 buffer[offs++]= color.alpha, buffer[offs++]= color.red, buffer[offs++]= color.green, buffer[offs++]= color.blue
325 #else
326 #define PUTPIXEL(buffer, offs, color)\
327 buffer[offs++]= color.blue, buffer[offs++]= color.green, buffer[offs++]= color.red, buffer[offs++]= color.alpha
328 #endif
330 stride = cairo_image_surface_get_stride(image);
331 cairo_surface_flush(image);
332 offs = 0;
333 for (y = 0; y < height; y++) {
334 offs = y * stride;
335 for (x = 0; x < width; x++) {
336 switch (data[y][x]) {
337 case ' ':
338 case 'w':
339 PUTPIXEL(buffer, offs, white);
340 break;
342 case '=':
343 PUTPIXEL(buffer, offs, trans);
344 break;
345 case '.':
346 case 'l':
347 PUTPIXEL(buffer, offs, trans);
348 break;
350 case '%':
351 case 'd':
352 PUTPIXEL(buffer, offs, dark);
353 break;
355 case '#':
356 case 'b':
357 PUTPIXEL(buffer, offs, black);
358 break;
360 default:
361 PUTPIXEL(buffer, offs, trans);
362 break;
366 cairo_surface_mark_dirty(image);
369 static WMImage* makeImage(W_Screen *sPtr, char **data, int width, int height, int masked)
371 cairo_surface_t *image;
373 image = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height);
375 renderImage(sPtr, image, data, width, height);
377 return image;
380 #define T_WINGS_IMAGES_FILE RESOURCE_PATH"/Images.tiff"
381 #define T_DEFAULT_OBJECT_ICON_FILE RESOURCE_PATH"/defaultIcon.tiff"
383 #define X_WINGS_IMAGES_FILE RESOURCE_PATH"/Images.xpm"
384 #define X_DEFAULT_OBJECT_ICON_FILE RESOURCE_PATH"/defaultIcon.xpm"
386 static Bool loadPixmaps(WMScreen * scr)
388 #ifdef obsolete
389 RImage *image, *tmp;
390 RColor gray;
391 RColor white;
393 gray.red = 0xae;
394 gray.green = 0xaa;
395 gray.blue = 0xae;
397 white.red = 0xff;
398 white.green = 0xff;
399 white.blue = 0xff;
401 image = RLoadImage(scr->rcontext, T_WINGS_IMAGES_FILE, 0);
402 if (!image)
403 image = RLoadImage(scr->rcontext, X_WINGS_IMAGES_FILE, 0);
404 if (!image) {
405 wwarning(_("WINGs: could not load widget images file: %s"), RMessageForError(RErrorCode));
406 return False;
408 /* home icon */
409 /* make it have a gray background */
410 tmp = RGetSubImage(image, 0, 0, 24, 24);
411 RCombineImageWithColor(tmp, &gray);
412 scr->homeIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
413 RReleaseImage(tmp);
414 /* make it have a white background */
415 tmp = RGetSubImage(image, 0, 0, 24, 24);
416 RCombineImageWithColor(tmp, &white);
417 scr->altHomeIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
418 RReleaseImage(tmp);
420 /* trash can */
421 tmp = RGetSubImage(image, 104, 0, 24, 24);
422 RCombineImageWithColor(tmp, &white);
423 scr->trashcanIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
424 RReleaseImage(tmp);
425 tmp = RGetSubImage(image, 104, 0, 24, 24);
426 RCombineImageWithColor(tmp, &white);
427 scr->altTrashcanIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
428 RReleaseImage(tmp);
429 /* create dir */
430 tmp = RGetSubImage(image, 104, 24, 24, 24);
431 RCombineImageWithColor(tmp, &white);
432 scr->createDirIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
433 RReleaseImage(tmp);
434 tmp = RGetSubImage(image, 104, 24, 24, 24);
435 RCombineImageWithColor(tmp, &white);
436 scr->altCreateDirIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
437 RReleaseImage(tmp);
438 /* diskettes */
439 tmp = RGetSubImage(image, 24, 80, 24, 24);
440 RCombineImageWithColor(tmp, &white);
441 scr->disketteIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
442 RReleaseImage(tmp);
443 tmp = RGetSubImage(image, 24, 80, 24, 24);
444 RCombineImageWithColor(tmp, &white);
445 scr->altDisketteIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
446 RReleaseImage(tmp);
447 /* unmount */
448 tmp = RGetSubImage(image, 0, 80, 24, 24);
449 RCombineImageWithColor(tmp, &white);
450 scr->unmountIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
451 RReleaseImage(tmp);
452 tmp = RGetSubImage(image, 0, 80, 24, 24);
453 RCombineImageWithColor(tmp, &white);
454 scr->altUnmountIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
455 RReleaseImage(tmp);
457 /* Magnifying Glass Icon for ColorPanel */
458 tmp = RGetSubImage(image, 24, 0, 40, 32);
459 RCombineImageWithColor(tmp, &gray);
460 scr->magnifyIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
461 RReleaseImage(tmp);
462 /* ColorWheel Icon for ColorPanel */
463 tmp = RGetSubImage(image, 0, 25, 24, 24);
464 scr->wheelIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
465 RReleaseImage(tmp);
466 /* GrayScale Icon for ColorPanel */
467 tmp = RGetSubImage(image, 65, 0, 40, 24);
468 scr->grayIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
469 RReleaseImage(tmp);
470 /* RGB Icon for ColorPanel */
471 tmp = RGetSubImage(image, 25, 33, 40, 24);
472 scr->rgbIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
473 RReleaseImage(tmp);
474 /* CMYK Icon for ColorPanel */
475 tmp = RGetSubImage(image, 65, 25, 40, 24);
476 scr->cmykIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
477 RReleaseImage(tmp);
478 /* HSB Icon for ColorPanel */
479 tmp = RGetSubImage(image, 0, 57, 40, 24);
480 scr->hsbIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
481 RReleaseImage(tmp);
482 /* CustomColorPalette Icon for ColorPanel */
483 tmp = RGetSubImage(image, 81, 57, 40, 24);
484 scr->customPaletteIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
485 RReleaseImage(tmp);
486 /* ColorList Icon for ColorPanel */
487 tmp = RGetSubImage(image, 41, 57, 40, 24);
488 scr->colorListIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
489 RReleaseImage(tmp);
491 RReleaseImage(image);
492 #endif
494 #if 0
495 scr->defaultObjectIcon = WMCreatePixmapFromFile(scr, T_DEFAULT_OBJECT_ICON_FILE);
496 if (!scr->defaultObjectIcon) {
497 scr->defaultObjectIcon = WMCreatePixmapFromFile(scr, X_DEFAULT_OBJECT_ICON_FILE);
499 if (!scr->defaultObjectIcon) {
500 wwarning("WINGs: could not load default icon file");
501 return False;
503 #endif
504 return True;
507 WMScreen *WMOpenScreen(const char *display)
509 Display *dpy = XOpenDisplay(display);
511 if (!dpy) {
512 wwarning("WINGs: could not open display %s", XDisplayName(display));
513 return NULL;
516 return WMCreateSimpleApplicationScreen(dpy);
519 WMScreen *WMCreateSimpleApplicationScreen(Display * display)
521 WMScreen *scr;
523 scr = WMCreateScreen(display, DefaultScreen(display));
525 scr->aflags.hasAppIcon = 0;
526 scr->aflags.simpleApplication = 1;
528 return scr;
531 WMScreen *WMCreateScreen(Display * display, int screen)
533 W_Screen *scrPtr;
534 XGCValues gcv;
535 Pixmap stipple;
536 static int initialized = 0;
537 static char *atomNames[] = {
538 "_GNUSTEP_WM_ATTR",
539 "WM_DELETE_WINDOW",
540 "WM_PROTOCOLS",
541 "CLIPBOARD",
542 "XdndAware",
543 "XdndSelection",
544 "XdndEnter",
545 "XdndLeave",
546 "XdndPosition",
547 "XdndDrop",
548 "XdndFinished",
549 "XdndTypeList",
550 "XdndActionList",
551 "XdndActionDescription",
552 "XdndStatus",
553 "XdndActionCopy",
554 "XdndActionMove",
555 "XdndActionLink",
556 "XdndActionAsk",
557 "XdndActionPrivate",
558 "_WINGS_DND_MOUSE_OFFSET",
559 "WM_STATE",
560 "UTF8_STRING",
561 "_NET_WM_NAME",
562 "_NET_WM_ICON_NAME",
563 "_NET_WM_ICON",
565 Atom atoms[sizeof(atomNames) / sizeof(char *)];
566 int i;
568 if (!initialized) {
570 initialized = 1;
572 W_ReadConfigurations();
574 assert(W_ApplicationInitialized());
577 scrPtr = malloc(sizeof(W_Screen));
578 if (!scrPtr)
579 return NULL;
580 memset(scrPtr, 0, sizeof(W_Screen));
582 scrPtr->aflags.hasAppIcon = 1;
584 scrPtr->display = display;
585 scrPtr->screen = screen;
587 //XXX may want to check if there's a better visual than the default
588 scrPtr->depth = DefaultDepth(display, screen);
589 scrPtr->visual = DefaultVisual(display, screen);
591 scrPtr->lastEventTime = 0;
593 scrPtr->colormap = DefaultColormap(display, screen);
595 scrPtr->rootWin = RootWindow(display, screen);
597 /* Create missing CUT_BUFFERs */
599 Atom *rootWinProps;
600 int exists[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
601 int count;
603 rootWinProps = XListProperties(display, scrPtr->rootWin, &count);
604 for (i = 0; i < count; i++) {
605 switch (rootWinProps[i]) {
606 case XA_CUT_BUFFER0:
607 exists[0] = 1;
608 break;
609 case XA_CUT_BUFFER1:
610 exists[1] = 1;
611 break;
612 case XA_CUT_BUFFER2:
613 exists[2] = 1;
614 break;
615 case XA_CUT_BUFFER3:
616 exists[3] = 1;
617 break;
618 case XA_CUT_BUFFER4:
619 exists[4] = 1;
620 break;
621 case XA_CUT_BUFFER5:
622 exists[5] = 1;
623 break;
624 case XA_CUT_BUFFER6:
625 exists[6] = 1;
626 break;
627 case XA_CUT_BUFFER7:
628 exists[7] = 1;
629 break;
630 default:
631 break;
634 if (rootWinProps) {
635 XFree(rootWinProps);
637 for (i = 0; i < 8; i++) {
638 if (!exists[i]) {
639 XStoreBuffer(display, "", 0, i);
644 scrPtr->ignoredModifierMask = 0;
646 int i;
647 XModifierKeymap *modmap;
648 KeyCode nlock, slock;
649 static int mask_table[8] = {
650 ShiftMask, LockMask, ControlMask, Mod1Mask,
651 Mod2Mask, Mod3Mask, Mod4Mask, Mod5Mask
653 unsigned int numLockMask = 0, scrollLockMask = 0;
655 nlock = XKeysymToKeycode(display, XK_Num_Lock);
656 slock = XKeysymToKeycode(display, XK_Scroll_Lock);
659 * Find out the masks for the NumLock and ScrollLock modifiers,
660 * so that we can bind the grabs for when they are enabled too.
662 modmap = XGetModifierMapping(display);
664 if (modmap != NULL && modmap->max_keypermod > 0) {
665 for (i = 0; i < 8 * modmap->max_keypermod; i++) {
666 if (modmap->modifiermap[i] == nlock && nlock != 0)
667 numLockMask = mask_table[i / modmap->max_keypermod];
668 else if (modmap->modifiermap[i] == slock && slock != 0)
669 scrollLockMask = mask_table[i / modmap->max_keypermod];
673 if (modmap)
674 XFreeModifiermap(modmap);
676 scrPtr->ignoredModifierMask = numLockMask | scrollLockMask | LockMask;
679 #ifdef obsolete //XXX
680 /* initially allocate some colors */
681 WMWhiteColor(scrPtr);
682 WMBlackColor(scrPtr);
683 WMGrayColor(scrPtr);
684 WMDarkGrayColor(scrPtr);
685 #endif
686 gcv.graphics_exposures = False;
688 gcv.function = GXxor;
689 // gcv.foreground = W_PIXEL(scrPtr->white);
690 if (gcv.foreground == 0) gcv.foreground = 1;
691 scrPtr->xorGC = XCreateGC(display, DefaultRootWindow(scrPtr->display), GCFunction
692 |GCGraphicsExposures|GCForeground, &gcv);
694 gcv.function = GXxor;
695 // gcv.foreground = W_PIXEL(scrPtr->gray);
696 gcv.subwindow_mode = IncludeInferiors;
697 scrPtr->ixorGC = XCreateGC(display, DefaultRootWindow(scrPtr->display), GCFunction
698 |GCGraphicsExposures|GCForeground
699 |GCSubwindowMode, &gcv);
701 gcv.function = GXcopy;
702 scrPtr->copyGC = XCreateGC(display, DefaultRootWindow(scrPtr->display), GCFunction
703 |GCGraphicsExposures, &gcv);
705 scrPtr->clipGC = XCreateGC(display, DefaultRootWindow(scrPtr->display), GCFunction
706 |GCGraphicsExposures, &gcv);
708 stipple = XCreateBitmapFromData(display, DefaultRootWindow(scrPtr->display),
709 STIPPLE_BITS, STIPPLE_WIDTH, STIPPLE_HEIGHT);
710 // gcv.foreground = W_PIXEL(scrPtr->darkGray);
711 // gcv.background = W_PIXEL(scrPtr->gray);
712 gcv.fill_style = FillStippled;
713 gcv.stipple = stipple;
714 scrPtr->stippleGC = XCreateGC(display, DefaultRootWindow(scrPtr->display),
715 GCForeground|GCBackground|GCStipple
716 |GCFillStyle|GCGraphicsExposures, &gcv);
718 scrPtr->drawStringGC = XCreateGC(display, DefaultRootWindow(scrPtr->display),
719 GCGraphicsExposures, &gcv);
720 scrPtr->drawImStringGC = XCreateGC(display, DefaultRootWindow(scrPtr->display),
721 GCGraphicsExposures, &gcv);
723 /* we need a 1bpp drawable for the monoGC, so borrow this one */
724 scrPtr->monoGC = XCreateGC(display, stipple, 0, NULL);
726 scrPtr->stipple = stipple;
728 scrPtr->antialiasedText = WINGsConfiguration.antialiasedText;
730 scrPtr->normalFont = WMSystemFontOfSize(scrPtr, 0);
732 scrPtr->boldFont = WMBoldSystemFontOfSize(scrPtr, 0);
734 if (!scrPtr->boldFont)
735 scrPtr->boldFont = scrPtr->normalFont;
737 if (!scrPtr->normalFont) {
738 wwarning(_("could not load any fonts. Make sure your font installation"
739 " and locale settings are correct."));
741 return NULL;
744 /* create input method stuff */
745 W_InitIM(scrPtr);
747 //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXxx
748 //FIXME
749 //makeImage seems to cause apps to segfault if I uncomment the lines below.
750 //I think it is because the data are allocated on the stack and it gets blown
751 //I have traced the segfault to cairo_image_surface_create which works when
752 //stuff gets allocated on the heap
755 scrPtr->checkButtonImageOn = makeImage(scrPtr, CHECK_BUTTON_ON,
756 CHECK_BUTTON_ON_WIDTH,
757 CHECK_BUTTON_ON_HEIGHT, False);
759 scrPtr->checkButtonImageOff = makeImage(scrPtr, CHECK_BUTTON_OFF,
760 CHECK_BUTTON_OFF_WIDTH,
761 CHECK_BUTTON_OFF_HEIGHT, False);
763 scrPtr->radioButtonImageOn = makeImage(scrPtr, RADIO_BUTTON_ON,
764 RADIO_BUTTON_ON_WIDTH,
765 RADIO_BUTTON_ON_HEIGHT, False);
767 scrPtr->radioButtonImageOff = makeImage(scrPtr, RADIO_BUTTON_OFF,
768 RADIO_BUTTON_OFF_WIDTH,
769 RADIO_BUTTON_OFF_HEIGHT, False);
771 // scrPtr->buttonArrow = makeImage(scrPtr, BUTTON_ARROW,
772 // BUTTON_ARROW_WIDTH, BUTTON_ARROW_HEIGHT,
773 // False);
775 // scrPtr->pushedButtonArrow = makeImage(scrPtr, BUTTON_ARROW2,
776 // BUTTON_ARROW2_WIDTH, BUTTON_ARROW2_HEIGHT,
777 // False);
780 // scrPtr->scrollerDimple = makeImage(scrPtr, SCROLLER_DIMPLE,
781 // SCROLLER_DIMPLE_WIDTH,
782 // SCROLLER_DIMPLE_HEIGHT, False);
785 // scrPtr->upArrow = makeImage(scrPtr, SCROLLER_ARROW_UP,
786 // SCROLLER_ARROW_UP_WIDTH,
787 // SCROLLER_ARROW_UP_HEIGHT, True);
789 // scrPtr->downArrow = makeImage(scrPtr, SCROLLER_ARROW_DOWN,
790 // SCROLLER_ARROW_DOWN_WIDTH,
791 // SCROLLER_ARROW_DOWN_HEIGHT, True);
793 // scrPtr->leftArrow = makeImage(scrPtr, SCROLLER_ARROW_LEFT,
794 // SCROLLER_ARROW_LEFT_WIDTH,
795 // SCROLLER_ARROW_LEFT_HEIGHT, True);
797 // scrPtr->rightArrow = makeImage(scrPtr, SCROLLER_ARROW_RIGHT,
798 // SCROLLER_ARROW_RIGHT_WIDTH,
799 // SCROLLER_ARROW_RIGHT_HEIGHT, True);
801 // scrPtr->hiUpArrow = makeImage(scrPtr, HI_SCROLLER_ARROW_UP,
802 // SCROLLER_ARROW_UP_WIDTH,
803 // SCROLLER_ARROW_UP_HEIGHT, True);
805 // scrPtr->hiDownArrow = makeImage(scrPtr, HI_SCROLLER_ARROW_DOWN,
806 // SCROLLER_ARROW_DOWN_WIDTH,
807 // SCROLLER_ARROW_DOWN_HEIGHT, True);
809 // scrPtr->hiLeftArrow = makeImage(scrPtr, HI_SCROLLER_ARROW_LEFT,
810 // SCROLLER_ARROW_LEFT_WIDTH,
811 // SCROLLER_ARROW_LEFT_HEIGHT, True);
813 // scrPtr->hiRightArrow = makeImage(scrPtr, HI_SCROLLER_ARROW_RIGHT,
814 // SCROLLER_ARROW_RIGHT_WIDTH,
815 // SCROLLER_ARROW_RIGHT_HEIGHT, True);
817 // scrPtr->popUpIndicator = makeImage(scrPtr, POPUP_INDICATOR,
818 // POPUP_INDICATOR_WIDTH,
819 // POPUP_INDICATOR_HEIGHT, True);
821 // scrPtr->pullDownIndicator = makeImage(scrPtr, PULLDOWN_INDICATOR,
822 // PULLDOWN_INDICATOR_WIDTH,
823 // PULLDOWN_INDICATOR_HEIGHT, True);
825 scrPtr->checkMark = makeImage(scrPtr, CHECK_MARK,
826 CHECK_MARK_WIDTH,
827 CHECK_MARK_HEIGHT, True);
829 // loadPixmaps(scrPtr);
831 scrPtr->defaultCursor = XCreateFontCursor(display, XC_left_ptr);
833 scrPtr->textCursor = XCreateFontCursor(display, XC_xterm);
835 #ifdef HAVE_XINTERNATOMS
836 XInternAtoms(display, atomNames, sizeof(atomNames) / sizeof(char *), False, atoms);
837 #else
838 for (i = 0; i < sizeof(atomNames) / sizeof(char *); i++) {
839 atoms[i] = XInternAtom(display, atomNames[i], False);
841 #endif
843 i = 0;
844 scrPtr->attribsAtom = atoms[i++];
846 scrPtr->deleteWindowAtom = atoms[i++];
848 scrPtr->protocolsAtom = atoms[i++];
850 scrPtr->clipboardAtom = atoms[i++];
852 scrPtr->xdndAwareAtom = atoms[i++];
853 scrPtr->xdndSelectionAtom = atoms[i++];
854 scrPtr->xdndEnterAtom = atoms[i++];
855 scrPtr->xdndLeaveAtom = atoms[i++];
856 scrPtr->xdndPositionAtom = atoms[i++];
857 scrPtr->xdndDropAtom = atoms[i++];
858 scrPtr->xdndFinishedAtom = atoms[i++];
859 scrPtr->xdndTypeListAtom = atoms[i++];
860 scrPtr->xdndActionListAtom = atoms[i++];
861 scrPtr->xdndActionDescriptionAtom = atoms[i++];
862 scrPtr->xdndStatusAtom = atoms[i++];
864 scrPtr->xdndActionCopy = atoms[i++];
865 scrPtr->xdndActionMove = atoms[i++];
866 scrPtr->xdndActionLink = atoms[i++];
867 scrPtr->xdndActionAsk = atoms[i++];
868 scrPtr->xdndActionPrivate = atoms[i++];
870 scrPtr->wmIconDragOffsetAtom = atoms[i++];
872 scrPtr->wmStateAtom = atoms[i++];
874 scrPtr->utf8String = atoms[i++];
875 scrPtr->netwmName = atoms[i++];
876 scrPtr->netwmIconName = atoms[i++];
877 scrPtr->netwmIcon = atoms[i++];
879 scrPtr->rootView = W_CreateRootView(scrPtr);
881 scrPtr->balloon = W_CreateBalloon(scrPtr);
883 W_InitApplication(scrPtr);
885 return scrPtr;
888 void WMSetWidgetDefaultFont(WMScreen * scr, WMFont * font)
890 WMReleaseFont(scr->normalFont);
891 scr->normalFont = WMRetainFont(font);
894 void WMSetWidgetDefaultBoldFont(WMScreen * scr, WMFont * font)
896 WMReleaseFont(scr->boldFont);
897 scr->boldFont = WMRetainFont(font);
900 void WMHangData(WMWidget * widget, void *data)
902 W_VIEW(widget)->hangedData = data;
905 void *WMGetHangedData(WMWidget * widget)
907 return W_VIEW(widget)->hangedData;
910 void WMDestroyWidget(WMWidget * widget)
912 W_UnmapView(W_VIEW(widget));
913 W_DestroyView(W_VIEW(widget));
916 void WMSetFocusToWidget(WMWidget * widget)
918 W_SetFocusOfTopLevel(W_TopLevelOfView(W_VIEW(widget)), W_VIEW(widget));
922 * WMRealizeWidget-
923 * Realizes the widget and all it's children.
926 void WMRealizeWidget(WMWidget * w)
928 W_RealizeView(W_VIEW(w));
931 void WMMapWidget(WMWidget * w)
933 W_MapView(W_VIEW(w));
936 void WMReparentWidget(WMWidget * w, WMWidget * newParent, int x, int y)
938 W_ReparentView(W_VIEW(w), W_VIEW(newParent), x, y);
941 static void makeChildrenAutomap(W_View * view, int flag)
943 view = view->childrenList;
945 while (view) {
946 view->flags.mapWhenRealized = flag;
947 makeChildrenAutomap(view, flag);
949 view = view->nextSister;
953 void WMMapSubwidgets(WMWidget * w)
955 /* make sure that subwidgets created after the parent was realized
956 * are mapped too */
957 if (!W_VIEW(w)->flags.realized) {
958 makeChildrenAutomap(W_VIEW(w), True);
959 } else {
960 W_MapSubviews(W_VIEW(w));
964 void WMUnmapSubwidgets(WMWidget * w)
966 if (!W_VIEW(w)->flags.realized) {
967 makeChildrenAutomap(W_VIEW(w), False);
968 } else {
969 W_UnmapSubviews(W_VIEW(w));
973 void WMUnmapWidget(WMWidget * w)
975 W_UnmapView(W_VIEW(w));
978 Bool WMWidgetIsMapped(WMWidget * w)
980 return W_VIEW(w)->flags.mapped;
983 void WMSetWidgetBackgroundColor(WMWidget * w, WMColorSpec * color)
985 W_SetViewBackgroundColor(W_VIEW(w), color);
986 if (W_VIEW(w)->flags.mapped)
987 WMRedisplayWidget(w);
990 WMColorSpec WMGetWidgetBackgroundColor(WMWidget * w)
992 return W_VIEW(w)->backColor;
995 void WMRaiseWidget(WMWidget * w)
997 W_RaiseView(W_VIEW(w));
1000 void WMLowerWidget(WMWidget * w)
1002 W_LowerView(W_VIEW(w));
1005 void WMMoveWidget(WMWidget * w, int x, int y)
1007 W_MoveView(W_VIEW(w), x, y);
1010 void WMResizeWidget(WMWidget * w, unsigned int width, unsigned int height)
1012 W_ResizeView(W_VIEW(w), width, height);
1015 W_Class W_RegisterUserWidget(void)
1017 userWidgetCount++;
1019 return userWidgetCount + WC_UserWidget - 1;
1022 unsigned int WMWidgetWidth(WMWidget * w)
1024 return W_VIEW(w)->size.width;
1027 unsigned int WMWidgetHeight(WMWidget * w)
1029 return W_VIEW(w)->size.height;
1032 Window WMWidgetXID(WMWidget * w)
1034 return W_VIEW(w)->window;
1037 WMScreen *WMWidgetScreen(WMWidget * w)
1039 return W_VIEW(w)->screen;
1042 void WMScreenMainLoop(WMScreen * scr)
1044 XEvent event;
1046 while (1) {
1047 WMNextEvent(scr->display, &event);
1048 WMHandleEvent(&event);
1052 void WMBreakModalLoop(WMScreen * scr)
1054 scr->modalLoop = 0;
1057 void WMRunModalLoop(WMScreen * scr, WMView * view)
1059 /* why is scr passed if is determined from the view? */
1060 /*WMScreen *scr = view->screen; */
1061 int oldModalLoop = scr->modalLoop;
1062 WMView *oldModalView = scr->modalView;
1064 scr->modalView = view;
1066 scr->modalLoop = 1;
1067 while (scr->modalLoop) {
1068 XEvent event;
1070 WMNextEvent(scr->display, &event);
1071 WMHandleEvent(&event);
1074 scr->modalView = oldModalView;
1075 scr->modalLoop = oldModalLoop;
1078 Display *WMScreenDisplay(WMScreen * scr)
1080 return scr->display;
1083 int WMScreenDepth(WMScreen * scr)
1085 return scr->depth;
1088 unsigned int WMScreenWidth(WMScreen * scr)
1090 return scr->rootView->size.width;
1093 unsigned int WMScreenHeight(WMScreen * scr)
1095 return scr->rootView->size.height;
1098 void WMRedisplayWidget(WMWidget * w)
1100 W_RedisplayView(W_VIEW(w));