Got WINGs/Tests/wtest.c to build and run
[wmaker-crm.git] / WINGs / widgets.c
bloba7488b1c3730226ddf49a40e490359072856d013
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 //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXxx
734 //FIXME
735 //makeImage seems to cause apps to segfault if I uncomment the lines below.
736 //I think it is because the data are allocated on the stack and it gets blown
737 //I have traced the segfault to cairo_image_surface_create which works when
738 //stuff gets allocated on the heap
741 // scrPtr->checkButtonImageOn = makeImage(scrPtr, CHECK_BUTTON_ON,
742 // CHECK_BUTTON_ON_WIDTH,
743 // CHECK_BUTTON_ON_HEIGHT, False);
745 // scrPtr->checkButtonImageOff = makeImage(scrPtr, CHECK_BUTTON_OFF,
746 // CHECK_BUTTON_OFF_WIDTH,
747 // CHECK_BUTTON_OFF_HEIGHT, False);
749 // scrPtr->radioButtonImageOn = makeImage(scrPtr, RADIO_BUTTON_ON,
750 // RADIO_BUTTON_ON_WIDTH,
751 // RADIO_BUTTON_ON_HEIGHT, False);
753 // scrPtr->radioButtonImageOff = makeImage(scrPtr, RADIO_BUTTON_OFF,
754 // RADIO_BUTTON_OFF_WIDTH,
755 // RADIO_BUTTON_OFF_HEIGHT, False);
757 // scrPtr->buttonArrow = makeImage(scrPtr, BUTTON_ARROW,
758 // BUTTON_ARROW_WIDTH, BUTTON_ARROW_HEIGHT,
759 // False);
761 // scrPtr->pushedButtonArrow = makeImage(scrPtr, BUTTON_ARROW2,
762 // BUTTON_ARROW2_WIDTH, BUTTON_ARROW2_HEIGHT,
763 // False);
766 // scrPtr->scrollerDimple = makeImage(scrPtr, SCROLLER_DIMPLE,
767 // SCROLLER_DIMPLE_WIDTH,
768 // SCROLLER_DIMPLE_HEIGHT, False);
771 // scrPtr->upArrow = makeImage(scrPtr, SCROLLER_ARROW_UP,
772 // SCROLLER_ARROW_UP_WIDTH,
773 // SCROLLER_ARROW_UP_HEIGHT, True);
775 // scrPtr->downArrow = makeImage(scrPtr, SCROLLER_ARROW_DOWN,
776 // SCROLLER_ARROW_DOWN_WIDTH,
777 // SCROLLER_ARROW_DOWN_HEIGHT, True);
779 // scrPtr->leftArrow = makeImage(scrPtr, SCROLLER_ARROW_LEFT,
780 // SCROLLER_ARROW_LEFT_WIDTH,
781 // SCROLLER_ARROW_LEFT_HEIGHT, True);
783 // scrPtr->rightArrow = makeImage(scrPtr, SCROLLER_ARROW_RIGHT,
784 // SCROLLER_ARROW_RIGHT_WIDTH,
785 // SCROLLER_ARROW_RIGHT_HEIGHT, True);
787 // scrPtr->hiUpArrow = makeImage(scrPtr, HI_SCROLLER_ARROW_UP,
788 // SCROLLER_ARROW_UP_WIDTH,
789 // SCROLLER_ARROW_UP_HEIGHT, True);
791 // scrPtr->hiDownArrow = makeImage(scrPtr, HI_SCROLLER_ARROW_DOWN,
792 // SCROLLER_ARROW_DOWN_WIDTH,
793 // SCROLLER_ARROW_DOWN_HEIGHT, True);
795 // scrPtr->hiLeftArrow = makeImage(scrPtr, HI_SCROLLER_ARROW_LEFT,
796 // SCROLLER_ARROW_LEFT_WIDTH,
797 // SCROLLER_ARROW_LEFT_HEIGHT, True);
799 // scrPtr->hiRightArrow = makeImage(scrPtr, HI_SCROLLER_ARROW_RIGHT,
800 // SCROLLER_ARROW_RIGHT_WIDTH,
801 // SCROLLER_ARROW_RIGHT_HEIGHT, True);
803 // scrPtr->popUpIndicator = makeImage(scrPtr, POPUP_INDICATOR,
804 // POPUP_INDICATOR_WIDTH,
805 // POPUP_INDICATOR_HEIGHT, True);
807 // scrPtr->pullDownIndicator = makeImage(scrPtr, PULLDOWN_INDICATOR,
808 // PULLDOWN_INDICATOR_WIDTH,
809 // PULLDOWN_INDICATOR_HEIGHT, True);
811 // scrPtr->checkMark = makeImage(scrPtr, CHECK_MARK,
812 // CHECK_MARK_WIDTH,
813 // CHECK_MARK_HEIGHT, True);
815 // loadPixmaps(scrPtr);
817 scrPtr->defaultCursor = XCreateFontCursor(display, XC_left_ptr);
819 scrPtr->textCursor = XCreateFontCursor(display, XC_xterm);
821 #ifdef HAVE_XINTERNATOMS
822 XInternAtoms(display, atomNames, sizeof(atomNames) / sizeof(char *), False, atoms);
823 #else
824 for (i = 0; i < sizeof(atomNames) / sizeof(char *); i++) {
825 atoms[i] = XInternAtom(display, atomNames[i], False);
827 #endif
829 i = 0;
830 scrPtr->attribsAtom = atoms[i++];
832 scrPtr->deleteWindowAtom = atoms[i++];
834 scrPtr->protocolsAtom = atoms[i++];
836 scrPtr->clipboardAtom = atoms[i++];
838 scrPtr->xdndAwareAtom = atoms[i++];
839 scrPtr->xdndSelectionAtom = atoms[i++];
840 scrPtr->xdndEnterAtom = atoms[i++];
841 scrPtr->xdndLeaveAtom = atoms[i++];
842 scrPtr->xdndPositionAtom = atoms[i++];
843 scrPtr->xdndDropAtom = atoms[i++];
844 scrPtr->xdndFinishedAtom = atoms[i++];
845 scrPtr->xdndTypeListAtom = atoms[i++];
846 scrPtr->xdndActionListAtom = atoms[i++];
847 scrPtr->xdndActionDescriptionAtom = atoms[i++];
848 scrPtr->xdndStatusAtom = atoms[i++];
850 scrPtr->xdndActionCopy = atoms[i++];
851 scrPtr->xdndActionMove = atoms[i++];
852 scrPtr->xdndActionLink = atoms[i++];
853 scrPtr->xdndActionAsk = atoms[i++];
854 scrPtr->xdndActionPrivate = atoms[i++];
856 scrPtr->wmIconDragOffsetAtom = atoms[i++];
858 scrPtr->wmStateAtom = atoms[i++];
860 scrPtr->utf8String = atoms[i++];
861 scrPtr->netwmName = atoms[i++];
862 scrPtr->netwmIconName = atoms[i++];
863 scrPtr->netwmIcon = atoms[i++];
865 scrPtr->rootView = W_CreateRootView(scrPtr);
867 scrPtr->balloon = W_CreateBalloon(scrPtr);
869 W_InitApplication(scrPtr);
871 return scrPtr;
874 void WMSetWidgetDefaultFont(WMScreen * scr, WMFont * font)
876 WMReleaseFont(scr->normalFont);
877 scr->normalFont = WMRetainFont(font);
880 void WMSetWidgetDefaultBoldFont(WMScreen * scr, WMFont * font)
882 WMReleaseFont(scr->boldFont);
883 scr->boldFont = WMRetainFont(font);
886 void WMHangData(WMWidget * widget, void *data)
888 W_VIEW(widget)->hangedData = data;
891 void *WMGetHangedData(WMWidget * widget)
893 return W_VIEW(widget)->hangedData;
896 void WMDestroyWidget(WMWidget * widget)
898 W_UnmapView(W_VIEW(widget));
899 W_DestroyView(W_VIEW(widget));
902 void WMSetFocusToWidget(WMWidget * widget)
904 W_SetFocusOfTopLevel(W_TopLevelOfView(W_VIEW(widget)), W_VIEW(widget));
908 * WMRealizeWidget-
909 * Realizes the widget and all it's children.
912 void WMRealizeWidget(WMWidget * w)
914 W_RealizeView(W_VIEW(w));
917 void WMMapWidget(WMWidget * w)
919 W_MapView(W_VIEW(w));
922 void WMReparentWidget(WMWidget * w, WMWidget * newParent, int x, int y)
924 W_ReparentView(W_VIEW(w), W_VIEW(newParent), x, y);
927 static void makeChildrenAutomap(W_View * view, int flag)
929 view = view->childrenList;
931 while (view) {
932 view->flags.mapWhenRealized = flag;
933 makeChildrenAutomap(view, flag);
935 view = view->nextSister;
939 void WMMapSubwidgets(WMWidget * w)
941 /* make sure that subwidgets created after the parent was realized
942 * are mapped too */
943 if (!W_VIEW(w)->flags.realized) {
944 makeChildrenAutomap(W_VIEW(w), True);
945 } else {
946 W_MapSubviews(W_VIEW(w));
950 void WMUnmapSubwidgets(WMWidget * w)
952 if (!W_VIEW(w)->flags.realized) {
953 makeChildrenAutomap(W_VIEW(w), False);
954 } else {
955 W_UnmapSubviews(W_VIEW(w));
959 void WMUnmapWidget(WMWidget * w)
961 W_UnmapView(W_VIEW(w));
964 Bool WMWidgetIsMapped(WMWidget * w)
966 return W_VIEW(w)->flags.mapped;
969 void WMSetWidgetBackgroundColor(WMWidget * w, WMColorSpec * color)
971 W_SetViewBackgroundColor(W_VIEW(w), color);
972 if (W_VIEW(w)->flags.mapped)
973 WMRedisplayWidget(w);
976 WMColorSpec WMGetWidgetBackgroundColor(WMWidget * w)
978 return W_VIEW(w)->backColor;
981 void WMRaiseWidget(WMWidget * w)
983 W_RaiseView(W_VIEW(w));
986 void WMLowerWidget(WMWidget * w)
988 W_LowerView(W_VIEW(w));
991 void WMMoveWidget(WMWidget * w, int x, int y)
993 W_MoveView(W_VIEW(w), x, y);
996 void WMResizeWidget(WMWidget * w, unsigned int width, unsigned int height)
998 W_ResizeView(W_VIEW(w), width, height);
1001 W_Class W_RegisterUserWidget(void)
1003 userWidgetCount++;
1005 return userWidgetCount + WC_UserWidget - 1;
1008 unsigned int WMWidgetWidth(WMWidget * w)
1010 return W_VIEW(w)->size.width;
1013 unsigned int WMWidgetHeight(WMWidget * w)
1015 return W_VIEW(w)->size.height;
1018 Window WMWidgetXID(WMWidget * w)
1020 return W_VIEW(w)->window;
1023 WMScreen *WMWidgetScreen(WMWidget * w)
1025 return W_VIEW(w)->screen;
1028 void WMScreenMainLoop(WMScreen * scr)
1030 XEvent event;
1032 while (1) {
1033 WMNextEvent(scr->display, &event);
1034 WMHandleEvent(&event);
1038 void WMBreakModalLoop(WMScreen * scr)
1040 scr->modalLoop = 0;
1043 void WMRunModalLoop(WMScreen * scr, WMView * view)
1045 /* why is scr passed if is determined from the view? */
1046 /*WMScreen *scr = view->screen; */
1047 int oldModalLoop = scr->modalLoop;
1048 WMView *oldModalView = scr->modalView;
1050 scr->modalView = view;
1052 scr->modalLoop = 1;
1053 while (scr->modalLoop) {
1054 XEvent event;
1056 WMNextEvent(scr->display, &event);
1057 WMHandleEvent(&event);
1060 scr->modalView = oldModalView;
1061 scr->modalLoop = oldModalLoop;
1064 Display *WMScreenDisplay(WMScreen * scr)
1066 return scr->display;
1069 int WMScreenDepth(WMScreen * scr)
1071 return scr->depth;
1074 unsigned int WMScreenWidth(WMScreen * scr)
1076 return scr->rootView->size.width;
1079 unsigned int WMScreenHeight(WMScreen * scr)
1081 return scr->rootView->size.height;
1084 void WMRedisplayWidget(WMWidget * w)
1086 W_RedisplayView(W_VIEW(w));