- put back wmksize(), wmkrange() and wmkpoint() as functions instead of macros
[wmaker-crm.git] / WINGs / widgets.c
blobdda50776b1f22af3641d96a6b6f76c117fbd6234
3 #include "WINGsP.h"
5 #include <X11/Xutil.h>
6 #include <X11/keysym.h>
7 #include <X11/cursorfont.h>
9 /********** data ************/
12 #define CHECK_BUTTON_ON_WIDTH 16
13 #define CHECK_BUTTON_ON_HEIGHT 16
15 static char *CHECK_BUTTON_ON[] = {
16 " %",
17 " .............%#",
18 " ........... .%#",
19 " .......... #.%#",
20 " ......... #%.%#",
21 " ........ #%..%#",
22 " ... #.. #%...%#",
23 " ... #% #%....%#",
24 " ... % #%.....%#",
25 " ... #%......%#",
26 " ... #%.......%#",
27 " ...#%........%#",
28 " .............%#",
29 " .............%#",
30 " %%%%%%%%%%%%%%#",
31 "%###############"};
33 #define CHECK_BUTTON_OFF_WIDTH 16
34 #define CHECK_BUTTON_OFF_HEIGHT 16
36 static char *CHECK_BUTTON_OFF[] = {
37 " %",
38 " .............%#",
39 " .............%#",
40 " .............%#",
41 " .............%#",
42 " .............%#",
43 " .............%#",
44 " .............%#",
45 " .............%#",
46 " .............%#",
47 " .............%#",
48 " .............%#",
49 " .............%#",
50 " .............%#",
51 " %%%%%%%%%%%%%%#",
52 "%###############"};
54 #define RADIO_BUTTON_ON_WIDTH 15
55 #define RADIO_BUTTON_ON_HEIGHT 15
56 static char *RADIO_BUTTON_ON[] = {
57 ".....%%%%%.....",
58 "...%%#####%%...",
59 "..%##.....%.%..",
60 ".%#%.. .....",
61 ".%#. ...",
62 "%#.. .. ",
63 "%#. . ",
64 "%#. . ",
65 "%#. . ",
66 "%#. . ",
67 ".%%. . .",
68 ".%.. . .",
69 "..%... .. ..",
70 ".... ..... ...",
71 "..... .....",
74 #define RADIO_BUTTON_OFF_WIDTH 15
75 #define RADIO_BUTTON_OFF_HEIGHT 15
76 static char *RADIO_BUTTON_OFF[] = {
77 ".....%%%%%.....",
78 "...%%#####%%...",
79 "..%##.......%..",
80 ".%#%...........",
81 ".%#............",
82 "%#............ ",
83 "%#............ ",
84 "%#............ ",
85 "%#............ ",
86 "%#............ ",
87 ".%%.......... .",
88 ".%........... .",
89 "..%......... ..",
90 ".... ..... ...",
91 "..... .....",
95 static char *BUTTON_ARROW[] = {
96 "..................",
97 "....##....#### ...",
98 "...#.%....#... ...",
99 "..#..%#####... ...",
100 ".#............ ...",
101 "#............. ...",
102 ".#............ ...",
103 "..#.. ...",
104 "...#. ............",
105 "....# ............"
108 #define BUTTON_ARROW_WIDTH 18
109 #define BUTTON_ARROW_HEIGHT 10
112 static char *BUTTON_ARROW2[] = {
113 " ",
114 " ## ####. ",
115 " # % # . ",
116 " # %##### . ",
117 " # . ",
118 "# . ",
119 " # . ",
120 " # .......... ",
121 " # . ",
122 " #. "
125 #define BUTTON_ARROW2_WIDTH 18
126 #define BUTTON_ARROW2_HEIGHT 10
129 static char *SCROLLER_DIMPLE[] = {
130 ".%###.",
131 "%#%%%%",
132 "#%%...",
133 "#%.. ",
134 "#%. ",
135 ".%. ."
138 #define SCROLLER_DIMPLE_WIDTH 6
139 #define SCROLLER_DIMPLE_HEIGHT 6
142 static char *SCROLLER_ARROW_UP[] = {
143 "....%....",
144 "....#....",
145 "...%#%...",
146 "...###...",
147 "..%###%..",
148 "..#####..",
149 ".%#####%.",
150 ".#######.",
151 "%#######%"
154 static char *HI_SCROLLER_ARROW_UP[] = {
155 " % ",
156 " % ",
157 " %%% ",
158 " %%% ",
159 " %%%%% ",
160 " %%%%% ",
161 " %%%%%%% ",
162 " %%%%%%% ",
163 "%%%%%%%%%"
166 #define SCROLLER_ARROW_UP_WIDTH 9
167 #define SCROLLER_ARROW_UP_HEIGHT 9
170 static char *SCROLLER_ARROW_DOWN[] = {
171 "%#######%",
172 ".#######.",
173 ".%#####%.",
174 "..#####..",
175 "..%###%..",
176 "...###...",
177 "...%#%...",
178 "....#....",
179 "....%...."
182 static char *HI_SCROLLER_ARROW_DOWN[] = {
183 "%%%%%%%%%",
184 " %%%%%%% ",
185 " %%%%%%% ",
186 " %%%%% ",
187 " %%%%% ",
188 " %%% ",
189 " %%% ",
190 " % ",
191 " % "
194 #define SCROLLER_ARROW_DOWN_WIDTH 9
195 #define SCROLLER_ARROW_DOWN_HEIGHT 9
199 static char *SCROLLER_ARROW_LEFT[] = {
200 "........%",
201 "......%##",
202 "....%####",
203 "..%######",
204 "%########",
205 "..%######",
206 "....%####",
207 "......%##",
208 "........%"
211 static char *HI_SCROLLER_ARROW_LEFT[] = {
212 " %",
213 " %%%",
214 " %%%%%",
215 " %%%%%%%",
216 "%%%%%%%%%",
217 " %%%%%%%",
218 " %%%%%",
219 " %%%",
220 " %"
223 #define SCROLLER_ARROW_LEFT_WIDTH 9
224 #define SCROLLER_ARROW_LEFT_HEIGHT 9
227 static char *SCROLLER_ARROW_RIGHT[] = {
228 "%........",
229 "##%......",
230 "####%....",
231 "######%..",
232 "########%",
233 "######%..",
234 "####%....",
235 "##%......",
236 "%........"
239 static char *HI_SCROLLER_ARROW_RIGHT[] = {
240 "% ",
241 "%%% ",
242 "%%%%% ",
243 "%%%%%%% ",
244 "%%%%%%%%%",
245 "%%%%%%% ",
246 "%%%%% ",
247 "%%% ",
248 "% "
251 #define SCROLLER_ARROW_RIGHT_WIDTH 9
252 #define SCROLLER_ARROW_RIGHT_HEIGHT 9
255 static char *POPUP_INDICATOR[] = {
256 " #==",
257 " ......%#==",
258 " ......%#%%",
259 " ......%#%%",
260 " %%%%%%%#%%",
261 "#########%%",
262 "==%%%%%%%%%",
263 "==%%%%%%%%%"
266 #define POPUP_INDICATOR_WIDTH 11
267 #define POPUP_INDICATOR_HEIGHT 8
271 static char *PULLDOWN_INDICATOR[] = {
272 "=#######=",
273 "=%===== =",
274 "==%=== ==",
275 "==%=== ==",
276 "===%= ===",
277 "===%= ===",
278 "====%===="
280 #define PULLDOWN_INDICATOR_WIDTH 9
281 #define PULLDOWN_INDICATOR_HEIGHT 7
284 #define CHECK_MARK_WIDTH 8
285 #define CHECK_MARK_HEIGHT 10
287 static char *CHECK_MARK[] = {
288 "======== ",
289 "======= #",
290 "====== #%",
291 "===== #%=",
292 " #== #%==",
293 " #% #%===",
294 " % #%====",
295 " #%=====",
296 " #%======",
297 "#%======="};
300 #define STIPPLE_WIDTH 8
301 #define STIPPLE_HEIGHT 8
302 static unsigned char STIPPLE_BITS[] = {
303 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa
309 extern void W_ReadConfigurations(void);
312 static int userWidgetCount=0;
315 /***** end data ******/
318 static void
319 renderPixmap(W_Screen *screen, Pixmap d, Pixmap mask, char **data,
320 int width, int height)
322 int x, y;
323 GC whiteGC = WMColorGC(screen->white);
324 GC blackGC = WMColorGC(screen->black);
325 GC lightGC = WMColorGC(screen->gray);
326 GC darkGC = WMColorGC(screen->darkGray);
329 if (mask)
330 XSetForeground(screen->display, screen->monoGC, 0);
332 for (y = 0; y < height; y++) {
333 for (x = 0; x < width; x++) {
334 switch (data[y][x]) {
335 case ' ':
336 case 'w':
337 XDrawPoint(screen->display, d, whiteGC, x, y);
338 break;
340 case '=':
341 if (mask)
342 XDrawPoint(screen->display, mask, screen->monoGC, x, y);
344 case '.':
345 case 'l':
346 XDrawPoint(screen->display, d, lightGC, x, y);
347 break;
349 case '%':
350 case 'd':
351 XDrawPoint(screen->display, d, darkGC, x, y);
352 break;
354 case '#':
355 case 'b':
356 default:
357 XDrawPoint(screen->display, d, blackGC, x, y);
358 break;
366 static WMPixmap*
367 makePixmap(W_Screen *sPtr, char **data, int width, int height, int masked)
369 Pixmap pixmap, mask = None;
371 pixmap = XCreatePixmap(sPtr->display, W_DRAWABLE(sPtr), width, height,
372 sPtr->depth);
374 if (masked) {
375 mask = XCreatePixmap(sPtr->display, W_DRAWABLE(sPtr), width, height, 1);
376 XSetForeground(sPtr->display, sPtr->monoGC, 1);
377 XFillRectangle(sPtr->display, mask, sPtr->monoGC, 0, 0, width, height);
380 renderPixmap(sPtr, pixmap, mask, data, width, height);
382 return WMCreatePixmapFromXPixmaps(sPtr, pixmap, mask, width, height,
383 sPtr->depth);
387 #define T_WINGS_IMAGES_FILE RESOURCE_PATH"/Images.tiff"
388 #define T_DEFAULT_OBJECT_ICON_FILE RESOURCE_PATH"/defaultIcon.tiff"
390 #define X_WINGS_IMAGES_FILE RESOURCE_PATH"/Images.xpm"
391 #define X_DEFAULT_OBJECT_ICON_FILE RESOURCE_PATH"/defaultIcon.xpm"
394 static Bool
395 loadPixmaps(WMScreen *scr)
397 RImage *image, *tmp;
398 RColor gray;
399 RColor white;
401 gray.red = 0xae;
402 gray.green = 0xaa;
403 gray.blue = 0xae;
405 white.red = 0xff;
406 white.green = 0xff;
407 white.blue = 0xff;
409 image = RLoadImage(scr->rcontext, T_WINGS_IMAGES_FILE, 0);
410 if (!image)
411 image = RLoadImage(scr->rcontext, X_WINGS_IMAGES_FILE, 0);
412 if (!image) {
413 wwarning("WINGs: could not load widget images file: %s",
414 RMessageForError(RErrorCode));
415 return False;
417 /* home icon */
418 /* make it have a gray background */
419 tmp = RGetSubImage(image, 0, 0, 24, 24);
420 RCombineImageWithColor(tmp, &gray);
421 scr->homeIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
422 RDestroyImage(tmp);
423 /* make it have a white background */
424 tmp = RGetSubImage(image, 0, 0, 24, 24);
425 RCombineImageWithColor(tmp, &white);
426 scr->altHomeIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
427 RDestroyImage(tmp);
429 /* trash can */
430 tmp = RGetSubImage(image, 104, 0, 24, 24);
431 RCombineImageWithColor(tmp, &white);
432 scr->trashcanIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
433 RDestroyImage(tmp);
434 tmp = RGetSubImage(image, 104, 0, 24, 24);
435 RCombineImageWithColor(tmp, &white);
436 scr->altTrashcanIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
437 RDestroyImage(tmp);
438 /* create dir */
439 tmp = RGetSubImage(image, 104, 24, 24, 24);
440 RCombineImageWithColor(tmp, &white);
441 scr->createDirIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
442 RDestroyImage(tmp);
443 tmp = RGetSubImage(image, 104, 24, 24, 24);
444 RCombineImageWithColor(tmp, &white);
445 scr->altCreateDirIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
446 RDestroyImage(tmp);
447 /* diskettes */
448 tmp = RGetSubImage(image, 24, 80, 24, 24);
449 RCombineImageWithColor(tmp, &white);
450 scr->disketteIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
451 RDestroyImage(tmp);
452 tmp = RGetSubImage(image, 24, 80, 24, 24);
453 RCombineImageWithColor(tmp, &white);
454 scr->altDisketteIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
455 RDestroyImage(tmp);
456 /* unmount */
457 tmp = RGetSubImage(image, 0, 80, 24, 24);
458 RCombineImageWithColor(tmp, &white);
459 scr->unmountIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
460 RDestroyImage(tmp);
461 tmp = RGetSubImage(image, 0, 80, 24, 24);
462 RCombineImageWithColor(tmp, &white);
463 scr->altUnmountIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
464 RDestroyImage(tmp);
466 /* Magnifying Glass Icon for ColorPanel */
467 tmp = RGetSubImage(image, 24, 0, 40, 32);
468 RCombineImageWithColor(tmp, &gray);
469 scr->magnifyIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
470 RDestroyImage(tmp);
471 /* ColorWheel Icon for ColorPanel */
472 tmp = RGetSubImage(image, 0, 25, 24, 24);
473 scr->wheelIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
474 RDestroyImage(tmp);
475 /* GrayScale Icon for ColorPanel */
476 tmp = RGetSubImage(image, 65, 0, 40, 24);
477 scr->grayIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
478 RDestroyImage(tmp);
479 /* RGB Icon for ColorPanel */
480 tmp = RGetSubImage(image, 25, 33, 40, 24);
481 scr->rgbIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
482 RDestroyImage(tmp);
483 /* CMYK Icon for ColorPanel */
484 tmp = RGetSubImage(image, 65, 25, 40, 24);
485 scr->cmykIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
486 RDestroyImage(tmp);
487 /* HSB Icon for ColorPanel */
488 tmp = RGetSubImage(image, 0, 57, 40, 24);
489 scr->hsbIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
490 RDestroyImage(tmp);
491 /* CustomColorPalette Icon for ColorPanel */
492 tmp = RGetSubImage(image, 81, 57, 40, 24);
493 scr->customPaletteIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
494 RDestroyImage(tmp);
495 /* ColorList Icon for ColorPanel */
496 tmp = RGetSubImage(image, 41, 57, 40, 24);
497 scr->colorListIcon = WMCreatePixmapFromRImage(scr, tmp, 128);
498 RDestroyImage(tmp);
500 RDestroyImage(image);
502 #if 0
503 scr->defaultObjectIcon =
504 WMCreatePixmapFromFile(scr, T_DEFAULT_OBJECT_ICON_FILE);
505 if (!scr->defaultObjectIcon) {
506 scr->defaultObjectIcon =
507 WMCreatePixmapFromFile(scr, X_DEFAULT_OBJECT_ICON_FILE);
509 if (!scr->defaultObjectIcon) {
510 wwarning("WINGs: could not load default icon file");
511 return False;
513 #endif
514 return True;
518 WMScreen*
519 WMOpenScreen(const char *display)
521 Display *dpy = XOpenDisplay(display);
523 if (!dpy) {
524 wwarning("WINGs: could not open display %s",
525 XDisplayName(display));
526 return NULL;
529 return WMCreateSimpleApplicationScreen(dpy);
533 WMScreen*
534 WMCreateSimpleApplicationScreen(Display *display)
536 WMScreen *scr;
538 scr = WMCreateScreen(display, DefaultScreen(display));
540 scr->aflags.hasAppIcon = 0;
541 scr->aflags.simpleApplication = 1;
543 return scr;
548 WMScreen*
549 WMCreateScreen(Display *display, int screen)
551 return WMCreateScreenWithRContext(display, screen,
552 RCreateContext(display, screen, NULL));
556 WMScreen*
557 WMCreateScreenWithRContext(Display *display, int screen, RContext *context)
559 W_Screen *scrPtr;
560 XGCValues gcv;
561 Pixmap stipple;
562 static int initialized = 0;
563 static char *atomNames[] = {
564 "_GNUSTEP_WM_ATTR",
565 "WM_DELETE_WINDOW",
566 "WM_PROTOCOLS",
567 "CLIPBOARD",
568 "XdndAware",
569 "XdndSelection",
570 "XdndEnter",
571 "XdndLeave",
572 "XdndPosition",
573 "XdndDrop",
574 "XdndFinished",
575 "XdndTypeList",
576 "XdndActionCopy",
577 "XdndActionMove",
578 "XdndActionLink",
579 "XdndActionAsk",
580 "XdndActionPrivate",
581 "XdndStatus",
582 "_WINGS_DND_MOUSE_OFFSET",
583 "WM_STATE"
585 Atom atoms[sizeof(atomNames)/sizeof(char*)];
586 int i = 0;
588 if (!initialized) {
590 initialized = 1;
592 W_ReadConfigurations();
594 assert(W_ApplicationInitialized());
597 scrPtr = malloc(sizeof(W_Screen));
598 if (!scrPtr)
599 return NULL;
600 memset(scrPtr, 0, sizeof(W_Screen));
602 scrPtr->aflags.hasAppIcon = 1;
604 scrPtr->display = display;
605 scrPtr->screen = screen;
606 scrPtr->rcontext = context;
608 scrPtr->depth = context->depth;
610 scrPtr->visual = context->visual;
611 scrPtr->lastEventTime = 0;
613 scrPtr->colormap = context->cmap;
615 scrPtr->rootWin = RootWindow(display, screen);
617 scrPtr->fontCache = WMCreateHashTable(WMStringPointerHashCallbacks);
619 scrPtr->ignoredModifierMask = 0;
621 int i;
622 XModifierKeymap *modmap;
623 KeyCode nlock, slock;
624 static int mask_table[8] = {
625 ShiftMask,LockMask,ControlMask,Mod1Mask,
626 Mod2Mask, Mod3Mask, Mod4Mask, Mod5Mask
628 unsigned int numLockMask, scrollLockMask;
630 nlock = XKeysymToKeycode(display, XK_Num_Lock);
631 slock = XKeysymToKeycode(display, XK_Scroll_Lock);
634 * Find out the masks for the NumLock and ScrollLock modifiers,
635 * so that we can bind the grabs for when they are enabled too.
637 modmap = XGetModifierMapping(display);
639 if (modmap!=NULL && modmap->max_keypermod>0) {
640 for (i=0; i<8*modmap->max_keypermod; i++) {
641 if (modmap->modifiermap[i]==nlock && nlock!=0)
642 numLockMask = mask_table[i/modmap->max_keypermod];
643 else if (modmap->modifiermap[i]==slock && slock!=0)
644 scrollLockMask = mask_table[i/modmap->max_keypermod];
648 if (modmap)
649 XFreeModifiermap(modmap);
652 scrPtr->ignoredModifierMask = numLockMask|scrollLockMask|LockMask;
655 /* initially allocate some colors */
656 WMWhiteColor(scrPtr);
657 WMBlackColor(scrPtr);
658 WMGrayColor(scrPtr);
659 WMDarkGrayColor(scrPtr);
661 gcv.graphics_exposures = False;
663 gcv.function = GXxor;
664 gcv.foreground = W_PIXEL(scrPtr->white);
665 if (gcv.foreground == 0) gcv.foreground = 1;
666 scrPtr->xorGC = XCreateGC(display, W_DRAWABLE(scrPtr), GCFunction
667 |GCGraphicsExposures|GCForeground, &gcv);
669 gcv.function = GXxor;
670 gcv.foreground = W_PIXEL(scrPtr->gray);
671 gcv.subwindow_mode = IncludeInferiors;
672 scrPtr->ixorGC = XCreateGC(display, W_DRAWABLE(scrPtr), GCFunction
673 |GCGraphicsExposures|GCForeground
674 |GCSubwindowMode, &gcv);
676 gcv.function = GXcopy;
677 scrPtr->copyGC = XCreateGC(display, W_DRAWABLE(scrPtr), GCFunction
678 |GCGraphicsExposures, &gcv);
680 scrPtr->clipGC = XCreateGC(display, W_DRAWABLE(scrPtr), GCFunction
681 |GCGraphicsExposures, &gcv);
684 stipple = XCreateBitmapFromData(display, W_DRAWABLE(scrPtr),
685 STIPPLE_BITS, STIPPLE_WIDTH, STIPPLE_HEIGHT);
686 gcv.foreground = W_PIXEL(scrPtr->darkGray);
687 gcv.background = W_PIXEL(scrPtr->gray);
688 gcv.fill_style = FillStippled;
689 gcv.stipple = stipple;
690 scrPtr->stippleGC = XCreateGC(display, W_DRAWABLE(scrPtr),
691 GCForeground|GCBackground|GCStipple
692 |GCFillStyle|GCGraphicsExposures, &gcv);
694 gcv.foreground = W_PIXEL(scrPtr->black);
695 gcv.background = W_PIXEL(scrPtr->white);
696 scrPtr->textFieldGC = XCreateGC(display, W_DRAWABLE(scrPtr),
697 GCForeground|GCBackground, &gcv);
699 /* we need a 1bpp drawable for the monoGC, so borrow this one */
700 scrPtr->monoGC = XCreateGC(display, stipple, 0, NULL);
702 scrPtr->stipple = stipple;
704 scrPtr->useMultiByte = WINGsConfiguration.useMultiByte;
706 scrPtr->normalFont = WMSystemFontOfSize(scrPtr,
707 WINGsConfiguration.defaultFontSize);
709 scrPtr->boldFont = WMBoldSystemFontOfSize(scrPtr,
710 WINGsConfiguration.defaultFontSize);
712 if (!scrPtr->boldFont)
713 scrPtr->boldFont = scrPtr->normalFont;
715 if (!scrPtr->normalFont) {
716 wwarning("could not load any fonts. Make sure your font installation"
717 "and locale settings are correct.");
719 return NULL;
722 scrPtr->checkButtonImageOn = makePixmap(scrPtr, CHECK_BUTTON_ON,
723 CHECK_BUTTON_ON_WIDTH,
724 CHECK_BUTTON_ON_HEIGHT, False);
726 scrPtr->checkButtonImageOff = makePixmap(scrPtr, CHECK_BUTTON_OFF,
727 CHECK_BUTTON_OFF_WIDTH,
728 CHECK_BUTTON_OFF_HEIGHT, False);
730 scrPtr->radioButtonImageOn = makePixmap(scrPtr, RADIO_BUTTON_ON,
731 RADIO_BUTTON_ON_WIDTH,
732 RADIO_BUTTON_ON_HEIGHT, False);
734 scrPtr->radioButtonImageOff = makePixmap(scrPtr, RADIO_BUTTON_OFF,
735 RADIO_BUTTON_OFF_WIDTH,
736 RADIO_BUTTON_OFF_HEIGHT, False);
738 scrPtr->buttonArrow = makePixmap(scrPtr, BUTTON_ARROW,
739 BUTTON_ARROW_WIDTH, BUTTON_ARROW_HEIGHT,
740 False);
742 scrPtr->pushedButtonArrow = makePixmap(scrPtr, BUTTON_ARROW2,
743 BUTTON_ARROW2_WIDTH, BUTTON_ARROW2_HEIGHT,
744 False);
747 scrPtr->scrollerDimple = makePixmap(scrPtr, SCROLLER_DIMPLE,
748 SCROLLER_DIMPLE_WIDTH,
749 SCROLLER_DIMPLE_HEIGHT, False);
752 scrPtr->upArrow = makePixmap(scrPtr, SCROLLER_ARROW_UP,
753 SCROLLER_ARROW_UP_WIDTH,
754 SCROLLER_ARROW_UP_HEIGHT, True);
756 scrPtr->downArrow = makePixmap(scrPtr, SCROLLER_ARROW_DOWN,
757 SCROLLER_ARROW_DOWN_WIDTH,
758 SCROLLER_ARROW_DOWN_HEIGHT, True);
760 scrPtr->leftArrow = makePixmap(scrPtr, SCROLLER_ARROW_LEFT,
761 SCROLLER_ARROW_LEFT_WIDTH,
762 SCROLLER_ARROW_LEFT_HEIGHT, True);
764 scrPtr->rightArrow = makePixmap(scrPtr, SCROLLER_ARROW_RIGHT,
765 SCROLLER_ARROW_RIGHT_WIDTH,
766 SCROLLER_ARROW_RIGHT_HEIGHT, True);
768 scrPtr->hiUpArrow = makePixmap(scrPtr, HI_SCROLLER_ARROW_UP,
769 SCROLLER_ARROW_UP_WIDTH,
770 SCROLLER_ARROW_UP_HEIGHT, True);
772 scrPtr->hiDownArrow = makePixmap(scrPtr, HI_SCROLLER_ARROW_DOWN,
773 SCROLLER_ARROW_DOWN_WIDTH,
774 SCROLLER_ARROW_DOWN_HEIGHT, True);
776 scrPtr->hiLeftArrow = makePixmap(scrPtr, HI_SCROLLER_ARROW_LEFT,
777 SCROLLER_ARROW_LEFT_WIDTH,
778 SCROLLER_ARROW_LEFT_HEIGHT, True);
780 scrPtr->hiRightArrow = makePixmap(scrPtr, HI_SCROLLER_ARROW_RIGHT,
781 SCROLLER_ARROW_RIGHT_WIDTH,
782 SCROLLER_ARROW_RIGHT_HEIGHT, True);
784 scrPtr->popUpIndicator = makePixmap(scrPtr, POPUP_INDICATOR,
785 POPUP_INDICATOR_WIDTH,
786 POPUP_INDICATOR_HEIGHT, True);
788 scrPtr->pullDownIndicator = makePixmap(scrPtr, PULLDOWN_INDICATOR,
789 PULLDOWN_INDICATOR_WIDTH,
790 PULLDOWN_INDICATOR_HEIGHT, True);
792 scrPtr->checkMark = makePixmap(scrPtr, CHECK_MARK,
793 CHECK_MARK_WIDTH,
794 CHECK_MARK_HEIGHT, True);
796 loadPixmaps(scrPtr);
798 scrPtr->defaultCursor = XCreateFontCursor(display, XC_left_ptr);
800 scrPtr->textCursor = XCreateFontCursor(display, XC_xterm);
803 XColor bla;
804 Pixmap blank;
806 blank = XCreatePixmap(display, scrPtr->stipple, 1, 1, 1);
807 XSetForeground(display, scrPtr->monoGC, 0);
808 XFillRectangle(display, blank, scrPtr->monoGC, 0, 0, 1, 1);
810 scrPtr->invisibleCursor = XCreatePixmapCursor(display, blank, blank,
811 &bla, &bla, 0, 0);
812 XFreePixmap(display, blank);
815 #ifdef HAVE_XINTERNATOMS
816 XInternAtoms(display, atomNames, sizeof(atomNames)/sizeof(char*), False,
817 atoms);
818 #else
820 int i;
821 for (i = 0; i < sizeof(atomNames)/sizeof(char*); i++) {
822 atoms[i] = XInternAtom(display, atomNames[i], False);
825 #endif
827 i = 0;
828 scrPtr->attribsAtom = atoms[i++];
830 scrPtr->deleteWindowAtom = atoms[i++];
832 scrPtr->protocolsAtom = atoms[i++];
834 scrPtr->clipboardAtom = atoms[i++];
836 scrPtr->xdndAwareAtom = atoms[i++];
837 scrPtr->xdndSelectionAtom = atoms[i++];
838 scrPtr->xdndEnterAtom = atoms[i++];
839 scrPtr->xdndLeaveAtom = atoms[i++];
840 scrPtr->xdndPositionAtom = atoms[i++];
841 scrPtr->xdndDropAtom = atoms[i++];
842 scrPtr->xdndFinishedAtom = atoms[i++];
843 scrPtr->xdndTypeListAtom = atoms[i++];
844 scrPtr->xdndStatusAtom = atoms[i++];
846 scrPtr->xdndActionCopy = atoms[i++];
847 scrPtr->xdndActionMove = atoms[i++];
848 scrPtr->xdndActionLink = atoms[i++];
849 scrPtr->xdndActionAsk = atoms[i++];
850 scrPtr->xdndActionPrivate = atoms[i++];
852 scrPtr->wmIconDragOffsetAtom = atoms[i++];
854 scrPtr->wmStateAtom = atoms[i++];
856 scrPtr->rootView = W_CreateRootView(scrPtr);
859 scrPtr->balloon = W_CreateBalloon(scrPtr);
862 W_InitApplication(scrPtr);
864 return scrPtr;
869 void
870 WMSetWidgetDefaultFont(WMScreen *scr, WMFont *font)
872 WMReleaseFont(scr->normalFont);
873 scr->normalFont = WMRetainFont(font);
877 void
878 WMSetWidgetDefaultBoldFont(WMScreen *scr, WMFont *font)
880 WMReleaseFont(scr->boldFont);
881 scr->boldFont = WMRetainFont(font);
886 void
887 WMHangData(WMWidget *widget, void *data)
889 W_VIEW(widget)->hangedData = data;
893 void*
894 WMGetHangedData(WMWidget *widget)
896 return W_VIEW(widget)->hangedData;
901 void
902 WMDestroyWidget(WMWidget *widget)
904 W_UnmapView(W_VIEW(widget));
905 W_DestroyView(W_VIEW(widget));
909 void
910 WMSetFocusToWidget(WMWidget *widget)
912 W_SetFocusOfTopLevel(W_TopLevelOfView(W_VIEW(widget)), W_VIEW(widget));
917 * WMRealizeWidget-
918 * Realizes the widget and all it's children.
921 void
922 WMRealizeWidget(WMWidget *w)
924 W_RealizeView(W_VIEW(w));
927 void
928 WMMapWidget(WMWidget *w)
930 W_MapView(W_VIEW(w));
934 void
935 WMReparentWidget(WMWidget *w, WMWidget *newParent, int x, int y)
937 W_ReparentView(W_VIEW(w), newParent, x, y);
941 static void
942 makeChildrenAutomap(W_View *view, int flag)
944 view = view->childrenList;
946 while (view) {
947 view->flags.mapWhenRealized = flag;
948 makeChildrenAutomap(view, flag);
950 view = view->nextSister;
955 void
956 WMMapSubwidgets(WMWidget *w)
958 /* make sure that subwidgets created after the parent was realized
959 * are mapped too */
960 if (!W_VIEW(w)->flags.realized) {
961 makeChildrenAutomap(W_VIEW(w), True);
962 } else {
963 W_MapSubviews(W_VIEW(w));
968 void
969 WMUnmapSubwidgets(WMWidget *w)
971 if (!W_VIEW(w)->flags.realized) {
972 makeChildrenAutomap(W_VIEW(w), False);
973 } else {
974 W_UnmapSubviews(W_VIEW(w));
980 void
981 WMUnmapWidget(WMWidget *w)
983 W_UnmapView(W_VIEW(w));
987 Bool
988 WMWidgetIsMapped(WMWidget *w)
990 return W_VIEW(w)->flags.mapped;
994 void
995 WMSetWidgetBackgroundColor(WMWidget *w, WMColor *color)
997 W_SetViewBackgroundColor(W_VIEW(w), color);
998 if (W_VIEW(w)->flags.mapped)
999 WMRedisplayWidget(w);
1003 void
1004 WMRaiseWidget(WMWidget *w)
1006 W_RaiseView(W_VIEW(w));
1010 void
1011 WMLowerWidget(WMWidget *w)
1013 W_LowerView(W_VIEW(w));
1017 void
1018 WMMoveWidget(WMWidget *w, int x, int y)
1020 W_MoveView(W_VIEW(w), x, y);
1024 void
1025 WMResizeWidget(WMWidget *w, unsigned int width, unsigned int height)
1027 W_ResizeView(W_VIEW(w), width, height);
1032 W_Class
1033 W_RegisterUserWidget(void)
1035 userWidgetCount++;
1037 return userWidgetCount + WC_UserWidget - 1;
1042 RContext*
1043 WMScreenRContext(WMScreen *scr)
1045 return scr->rcontext;
1050 unsigned int
1051 WMWidgetWidth(WMWidget *w)
1053 return W_VIEW(w)->size.width;
1057 unsigned int
1058 WMWidgetHeight(WMWidget *w)
1060 return W_VIEW(w)->size.height;
1064 Window
1065 WMWidgetXID(WMWidget *w)
1067 return W_VIEW(w)->window;
1071 WMScreen*
1072 WMWidgetScreen(WMWidget *w)
1074 return W_VIEW(w)->screen;
1079 void
1080 WMScreenMainLoop(WMScreen *scr)
1082 XEvent event;
1084 while (1) {
1085 WMNextEvent(scr->display, &event);
1086 WMHandleEvent(&event);
1091 void
1092 WMBreakModalLoop(WMScreen *scr)
1094 scr->modalLoop = 0;
1098 void
1099 WMRunModalLoop(WMScreen *scr, WMView *view)
1101 /* why is scr passed if is determined from the view? */
1102 /*WMScreen *scr = view->screen;*/
1103 int oldModalLoop = scr->modalLoop;
1104 WMView *oldModalView = scr->modalView;
1106 scr->modalView = view;
1108 scr->modalLoop = 1;
1109 while (scr->modalLoop) {
1110 XEvent event;
1112 WMNextEvent(scr->display, &event);
1113 WMHandleEvent(&event);
1116 scr->modalView = oldModalView;
1117 scr->modalLoop = oldModalLoop;
1121 Display*
1122 WMScreenDisplay(WMScreen *scr)
1124 return scr->display;
1128 int
1129 WMScreenDepth(WMScreen *scr)
1131 return scr->depth;
1135 unsigned int
1136 WMScreenWidth(WMScreen *scr)
1138 return scr->rootView->size.width;
1142 unsigned int
1143 WMScreenHeight(WMScreen *scr)
1145 return scr->rootView->size.height;
1149 void
1150 WMRedisplayWidget(WMWidget *w)
1152 W_RedisplayView(W_VIEW(w));