1 /* dialog.c - dialog windows for internal use
3 * Window Maker window manager
5 * Copyright (c) 1997, 1998 Alfredo K. Kojima
6 * Copyright (c) 1999 Dan Pascu
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
27 #include <X11/Xutil.h>
28 #include <X11/keysym.h>
34 #include <sys/types.h>
45 #include <sys/signal.h>
50 #define PATH_MAX DEFAULT_PATH_MAX
53 #include "WindowMaker.h"
65 extern WPreferences wPreferences
;
70 wMessageDialog(WScreen
*scr
, char *title
, char *message
,
71 char *defBtn
, char *altBtn
, char *othBtn
)
78 panel
= WMCreateAlertPanel(scr
->wmscreen
, NULL
, title
, message
,
79 defBtn
, altBtn
, othBtn
);
81 parent
= XCreateSimpleWindow(dpy
, scr
->root_win
, 0, 0, 400, 180, 0, 0, 0);
83 XReparentWindow(dpy
, WMWidgetXID(panel
->win
), parent
, 0, 0);
85 wwin
= wManageInternalWindow(scr
, parent
, None
, NULL
,
86 (scr
->scr_width
- 400)/2,
87 (scr
->scr_height
- 180)/2, 400, 180);
88 wwin
->client_leader
= WMWidgetXID(panel
->win
);
90 WMMapWidget(panel
->win
);
94 WMRunModalLoop(WMWidgetScreen(panel
->win
), WMWidgetView(panel
->win
));
96 result
= panel
->result
;
98 WMUnmapWidget(panel
->win
);
100 wUnmanageWindow(wwin
, False
, False
);
102 WMDestroyAlertPanel(panel
);
104 XDestroyWindow(dpy
, parent
);
112 wInputDialog(WScreen
*scr
, char *title
, char *message
, char **text
)
120 panel
= WMCreateInputPanel(scr
->wmscreen
, NULL
, title
, message
, *text
,
121 _("OK"), _("Cancel"));
124 parent
= XCreateSimpleWindow(dpy
, scr
->root_win
, 0, 0, 320, 160, 0, 0, 0);
125 XSelectInput(dpy
, parent
, KeyPressMask
|KeyReleaseMask
);
127 XReparentWindow(dpy
, WMWidgetXID(panel
->win
), parent
, 0, 0);
129 wwin
= wManageInternalWindow(scr
, parent
, None
, NULL
,
130 (scr
->scr_width
- 320)/2,
131 (scr
->scr_height
- 160)/2, 320, 160);
133 wwin
->client_leader
= WMWidgetXID(panel
->win
);
135 WMMapWidget(panel
->win
);
139 WMRunModalLoop(WMWidgetScreen(panel
->win
), WMWidgetView(panel
->win
));
141 if (panel
->result
== WAPRDefault
)
142 result
= WMGetTextFieldText(panel
->text
);
146 wUnmanageWindow(wwin
, False
, False
);
148 WMDestroyInputPanel(panel
);
150 XDestroyWindow(dpy
, parent
);
165 *****************************************************************
166 * Icon Selection Panel
167 *****************************************************************
170 typedef struct IconPanel
{
183 WMButton
*previewButton
;
188 WMTextField
*fileField
;
191 WMButton
*cancelButton
;
193 WMButton
*chooseButton
;
203 listPixmaps(WScreen
*scr
, WMList
*lPtr
, char *path
)
205 struct dirent
*dentry
;
207 char pbuf
[PATH_MAX
+16];
209 IconPanel
*panel
= WMGetHangedData(lPtr
);
211 panel
->preview
= False
;
213 apath
= wexpandpath(path
);
214 dir
= opendir(apath
);
219 tmp
= _("Could not open directory ");
220 msg
= wmalloc(strlen(tmp
)+strlen(path
)+6);
224 wMessageDialog(scr
, _("Error"), msg
, _("OK"), NULL
, NULL
);
230 /* list contents in the column */
231 while ((dentry
= readdir(dir
))) {
234 if (strcmp(dentry
->d_name
, ".")==0 ||
235 strcmp(dentry
->d_name
, "..")==0)
240 strcat(pbuf
, dentry
->d_name
);
242 if (stat(pbuf
, &statb
)<0)
245 if (statb
.st_mode
& (S_IRUSR
|S_IRGRP
|S_IROTH
)
246 && statb
.st_mode
& (S_IFREG
|S_IFLNK
)) {
247 WMAddListItem(lPtr
, dentry
->d_name
);
250 WMSortListItems(lPtr
);
254 panel
->preview
= True
;
260 setViewedImage(IconPanel
*panel
, char *file
)
269 pixmap
= WMCreateBlendedPixmapFromFile(WMWidgetScreen(panel
->win
),
272 WMSetButtonEnabled(panel
->okButton
, False
);
274 WMSetLabelText(panel
->iconView
, _("Could not load image file "));
276 WMSetLabelImage(panel
->iconView
, NULL
);
278 WMSetButtonEnabled(panel
->okButton
, True
);
280 WMSetLabelText(panel
->iconView
, NULL
);
281 WMSetLabelImage(panel
->iconView
, pixmap
);
282 WMReleasePixmap(pixmap
);
288 listCallback(void *self
, void *data
)
290 WMList
*lPtr
= (WMList
*)self
;
291 IconPanel
*panel
= (IconPanel
*)data
;
294 if (lPtr
==panel
->dirList
) {
295 WMListItem
*item
= WMGetListSelectedItem(lPtr
);
301 WMSetTextFieldText(panel
->fileField
, path
);
303 WMSetLabelImage(panel
->iconView
, NULL
);
305 WMSetButtonEnabled(panel
->okButton
, False
);
307 WMClearList(panel
->iconList
);
308 listPixmaps(panel
->scr
, panel
->iconList
, path
);
310 char *tmp
, *iconFile
;
311 WMListItem
*item
= WMGetListSelectedItem(panel
->dirList
);
316 tmp
= wexpandpath(path
);
318 item
= WMGetListSelectedItem(panel
->iconList
);
321 iconFile
= item
->text
;
323 path
= wmalloc(strlen(tmp
)+strlen(iconFile
)+4);
326 strcat(path
, iconFile
);
328 WMSetTextFieldText(panel
->fileField
, path
);
329 setViewedImage(panel
, path
);
336 listIconPaths(WMList
*lPtr
)
341 paths
= wstrdup(wPreferences
.icon_path
);
343 path
= strtok(paths
, ":");
348 tmp
= wexpandpath(path
);
349 /* do not sort, because the order implies the order of
350 * directories searched */
351 if (access(tmp
, X_OK
)==0)
352 WMAddListItem(lPtr
, path
);
354 } while ((path
=strtok(NULL
, ":"))!=NULL
);
361 drawIconProc(WMList
*lPtr
, int index
, Drawable d
, char *text
,
362 int state
, WMRect
*rect
)
364 IconPanel
*panel
= WMGetHangedData(lPtr
);
365 GC gc
= panel
->scr
->draw_gc
;
366 GC copygc
= panel
->scr
->copy_gc
;
367 char *file
, *dirfile
;
372 WMScreen
*wmscr
= WMWidgetScreen(panel
->win
);
376 if(!panel
->preview
) return;
378 width
= rect
->size
.width
;
380 blackcolor
= WMBlackColor(wmscr
);
381 whitecolor
= WMWhiteColor(wmscr
);
383 dirfile
= wexpandpath(WMGetListSelectedItem(panel
->dirList
)->text
);
384 file
= wmalloc(strlen(dirfile
)+strlen(text
)+4);
385 sprintf(file
, "%s/%s", dirfile
, text
);
388 gray
.red
= 0xae; gray
.green
= 0xaa;
389 gray
.blue
= 0xae; gray
.alpha
= 0;
390 pixmap
= WMCreateBlendedPixmapFromFile(wmscr
, file
, &gray
);
394 WMRemoveListItem(lPtr
, index
);
398 XClearArea(dpy
, d
, rect
->pos
.x
, rect
->pos
.y
, width
, rect
->size
.height
,
400 XSetClipMask(dpy
, gc
, None
);
402 XDrawRectangle(dpy, d, WMColorGC(whitecolor), rect->pos.x + 5,
403 rect->pos.y +5, width - 10, 54);
405 XDrawLine(dpy
, d
, WMColorGC(whitecolor
), rect
->pos
.x
,
406 rect
->pos
.y
+rect
->size
.height
-1, rect
->pos
.x
+width
,
407 rect
->pos
.y
+rect
->size
.height
-1);
410 if (state
&WLDSSelected
) {
411 XFillRectangle(dpy
, d
, WMColorGC(whitecolor
), rect
->pos
.x
,
412 rect
->pos
.y
, width
, rect
->size
.height
);
415 size
= WMGetPixmapSize(pixmap
);
417 XSetClipMask(dpy
, copygc
, WMGetPixmapMaskXID(pixmap
));
418 XSetClipOrigin(dpy
, copygc
, rect
->pos
.x
+ (width
-size
.width
)/2,
420 XCopyArea(dpy
, WMGetPixmapXID(pixmap
), d
, copygc
, 0, 0,
421 size
.width
>100?100:size
.width
, size
.height
>64?64:size
.height
,
422 rect
->pos
.x
+ (width
-size
.width
)/2, rect
->pos
.y
+2);
426 int fheight
= WMFontHeight(panel
->normalfont
);
427 int tlen
= strlen(text
);
428 int twidth
= WMWidthOfString(panel
->normalfont
, text
, tlen
);
431 ofx
= rect
->pos
.x
+ (width
- twidth
)/2;
432 ofy
= rect
->pos
.y
+ 64 - fheight
;
436 WMDrawString(wmscr
, d
, WMColorGC(whitecolor
),
437 panel
->normalfont
, ofx
+i
, ofy
+j
,
440 WMDrawString(wmscr
, d
, WMColorGC(blackcolor
), panel
->normalfont
,
441 ofx
, ofy
, text
, tlen
);
444 WMReleasePixmap(pixmap
);
445 /* I hope it is better to do not use cache / on my box it is fast nuff */
448 WMReleaseColor(blackcolor
);
449 WMReleaseColor(whitecolor
);
454 buttonCallback(void *self
, void *clientData
)
456 WMButton
*bPtr
= (WMButton
*)self
;
457 IconPanel
*panel
= (IconPanel
*)clientData
;
460 if (bPtr
==panel
->okButton
) {
462 panel
->result
= True
;
463 } else if (bPtr
==panel
->cancelButton
) {
465 panel
->result
= False
;
466 } else if (bPtr
==panel
->previewButton
) {
467 /**** Previewer ****/
468 WMSetButtonEnabled(bPtr
, False
);
469 WMSetListUserDrawItemHeight(panel
->iconList
, 68);
470 WMSetListUserDrawProc(panel
->iconList
, drawIconProc
);
471 WMRedisplayWidget(panel
->iconList
);
472 /* for draw proc to access screen/gc */
473 /*** end preview ***/
476 else if (bPtr
==panel
->chooseButton
) {
479 op
= WMCreateOpenPanel(WMWidgetScreen(bPtr
));
481 if (WMRunModalFilePanelForDirectory(op
, NULL
, "/usr/local", NULL
, NULL
)) {
483 path
= WMGetFilePanelFile(op
);
484 WMSetTextFieldText(panel
->fileField
, path
);
485 setViewedImage(panel
, path
);
488 WMDestroyFilePanel(op
);
495 keyPressHandler(XEvent
*event
, void *data
)
497 IconPanel
*panel
= (IconPanel
*)data
;
498 Display
*dpy
= event
->xany
.display
;
507 if (event
->type
== KeyRelease
)
511 count
= XLookupString(&event
->xkey
, buffer
, sizeof(buffer
), &ksym
, NULL
);
514 iidx
= WMGetListSelectedItemRow(panel
->iconList
);
515 didx
= WMGetListSelectedItemRow(panel
->dirList
);
523 list
= panel
->iconList
;
526 if (iidx
< WMGetListNumberOfRows(panel
->iconList
) - 1)
530 list
= panel
->iconList
;
534 list
= panel
->iconList
;
537 item
= WMGetListNumberOfRows(panel
->iconList
) - 1;
538 list
= panel
->iconList
;
541 if (didx
< WMGetListNumberOfRows(panel
->dirList
) - 1)
545 list
= panel
->dirList
;
552 list
= panel
->dirList
;
555 WMPerformButtonClick(panel
->okButton
);
558 WMPerformButtonClick(panel
->cancelButton
);
563 WMSelectListItem(list
, item
);
564 WMSetListPosition(list
, item
- 5);
565 listCallback(list
, panel
);
572 wIconChooserDialog(WScreen
*scr
, char **file
, char *instance
, char *class)
580 panel
= wmalloc(sizeof(IconPanel
));
581 memset(panel
, 0, sizeof(IconPanel
));
585 panel
->win
= WMCreateWindow(scr
->wmscreen
, "iconChooser");
586 WMResizeWidget(panel
->win
, 450, 280);
588 WMCreateEventHandler(WMWidgetView(panel
->win
), KeyPressMask
|KeyReleaseMask
,
589 keyPressHandler
, panel
);
592 boldFont
= WMBoldSystemFontOfSize(scr
->wmscreen
, 12);
593 panel
->normalfont
= WMSystemFontOfSize(WMWidgetScreen(panel
->win
), 12);
595 panel
->dirLabel
= WMCreateLabel(panel
->win
);
596 WMResizeWidget(panel
->dirLabel
, 200, 20);
597 WMMoveWidget(panel
->dirLabel
, 10, 7);
598 WMSetLabelText(panel
->dirLabel
, _("Directories"));
599 WMSetLabelFont(panel
->dirLabel
, boldFont
);
600 WMSetLabelTextAlignment(panel
->dirLabel
, WACenter
);
602 WMSetLabelRelief(panel
->dirLabel
, WRSunken
);
604 panel
->iconLabel
= WMCreateLabel(panel
->win
);
605 WMResizeWidget(panel
->iconLabel
, 140, 20);
606 WMMoveWidget(panel
->iconLabel
, 215, 7);
607 WMSetLabelText(panel
->iconLabel
, _("Icons"));
608 WMSetLabelFont(panel
->iconLabel
, boldFont
);
609 WMSetLabelTextAlignment(panel
->iconLabel
, WACenter
);
611 WMReleaseFont(boldFont
);
613 color
= WMWhiteColor(scr
->wmscreen
);
614 WMSetLabelTextColor(panel
->dirLabel
, color
);
615 WMSetLabelTextColor(panel
->iconLabel
, color
);
616 WMReleaseColor(color
);
618 color
= WMDarkGrayColor(scr
->wmscreen
);
619 WMSetWidgetBackgroundColor(panel
->iconLabel
, color
);
620 WMSetWidgetBackgroundColor(panel
->dirLabel
, color
);
621 WMReleaseColor(color
);
623 WMSetLabelRelief(panel
->iconLabel
, WRSunken
);
625 panel
->dirList
= WMCreateList(panel
->win
);
626 WMResizeWidget(panel
->dirList
, 200, 170);
627 WMMoveWidget(panel
->dirList
, 10, 30);
628 WMSetListAction(panel
->dirList
, listCallback
, panel
);
630 panel
->iconList
= WMCreateList(panel
->win
);
631 WMResizeWidget(panel
->iconList
, 140, 170);
632 WMMoveWidget(panel
->iconList
, 215, 30);
633 WMSetListAction(panel
->iconList
, listCallback
, panel
);
635 WMHangData(panel
->iconList
,panel
);
637 panel
->previewButton
= WMCreateCommandButton(panel
->win
);
638 WMResizeWidget(panel
->previewButton
, 75, 26);
639 WMMoveWidget(panel
->previewButton
, 365, 130);
640 WMSetButtonText(panel
->previewButton
, _("Preview"));
641 WMSetButtonAction(panel
->previewButton
, buttonCallback
, panel
);
643 panel
->iconView
= WMCreateLabel(panel
->win
);
644 WMResizeWidget(panel
->iconView
, 75, 75);
645 WMMoveWidget(panel
->iconView
, 365, 40);
646 WMSetLabelImagePosition(panel
->iconView
, WIPOverlaps
);
647 WMSetLabelRelief(panel
->iconView
, WRSunken
);
648 WMSetLabelTextAlignment(panel
->iconView
, WACenter
);
650 panel
->fileLabel
= WMCreateLabel(panel
->win
);
651 WMResizeWidget(panel
->fileLabel
, 80, 20);
652 WMMoveWidget(panel
->fileLabel
, 10, 210);
653 WMSetLabelText(panel
->fileLabel
, _("File Name:"));
655 panel
->fileField
= WMCreateTextField(panel
->win
);
656 WMSetViewNextResponder(WMWidgetView(panel
->fileField
), WMWidgetView(panel
->win
));
657 WMResizeWidget(panel
->fileField
, 345, 20);
658 WMMoveWidget(panel
->fileField
, 95, 210);
659 WMSetTextFieldEditable(panel
->fileField
, False
);
661 panel
->okButton
= WMCreateCommandButton(panel
->win
);
662 WMResizeWidget(panel
->okButton
, 80, 26);
663 WMMoveWidget(panel
->okButton
, 360, 240);
664 WMSetButtonText(panel
->okButton
, _("OK"));
665 WMSetButtonEnabled(panel
->okButton
, False
);
666 WMSetButtonAction(panel
->okButton
, buttonCallback
, panel
);
668 panel
->cancelButton
= WMCreateCommandButton(panel
->win
);
669 WMResizeWidget(panel
->cancelButton
, 80, 26);
670 WMMoveWidget(panel
->cancelButton
, 270, 240);
671 WMSetButtonText(panel
->cancelButton
, _("Cancel"));
672 WMSetButtonAction(panel
->cancelButton
, buttonCallback
, panel
);
674 panel
->chooseButton
= WMCreateCommandButton(panel
->win
);
675 WMResizeWidget(panel
->chooseButton
, 110, 26);
676 WMMoveWidget(panel
->chooseButton
, 150, 240);
677 WMSetButtonText(panel
->chooseButton
, _("Choose File"));
678 WMSetButtonAction(panel
->chooseButton
, buttonCallback
, panel
);
680 WMRealizeWidget(panel
->win
);
681 WMMapSubwidgets(panel
->win
);
683 parent
= XCreateSimpleWindow(dpy
, scr
->root_win
, 0, 0, 450, 280, 0, 0, 0);
685 XReparentWindow(dpy
, WMWidgetXID(panel
->win
), parent
, 0, 0);
690 tmp
= wmalloc((instance
? strlen(instance
) : 0)
691 + (class ? strlen(class) : 0) + 32);
693 if (tmp
&& (instance
|| class))
694 sprintf(tmp
, "%s [%s.%s]", _("Icon Chooser"), instance
, class);
696 strcpy(tmp
, _("Icon Chooser"));
698 wwin
= wManageInternalWindow(scr
, parent
, None
, tmp
,
699 (scr
->scr_width
- 450)/2,
700 (scr
->scr_height
- 280)/2, 450, 280);
704 /* put icon paths in the list */
705 listIconPaths(panel
->dirList
);
707 WMMapWidget(panel
->win
);
711 while (!panel
->done
) {
714 WMNextEvent(dpy
, &event
);
715 WMHandleEvent(&event
);
719 char *defaultPath
, *wantedPath
;
721 /* check if the file the user selected is not the one that
722 * would be loaded by default with the current search path */
723 *file
= WMGetListSelectedItem(panel
->iconList
)->text
;
728 defaultPath
= FindImage(wPreferences
.icon_path
, *file
);
729 wantedPath
= WMGetTextFieldText(panel
->fileField
);
730 /* if the file is not the default, use full path */
731 if (strcmp(wantedPath
, defaultPath
)!=0) {
734 *file
= wstrdup(*file
);
743 WMReleaseFont(panel
->normalfont
);
745 WMUnmapWidget(panel
->win
);
747 WMDestroyWidget(panel
->win
);
749 wUnmanageWindow(wwin
, False
, False
);
753 XDestroyWindow(dpy
, parent
);
755 return panel
->result
;
760 ***********************************************************************
762 ***********************************************************************
797 #define COPYRIGHT_TEXT \
798 "Copyright \xa9 1997~2001 Alfredo K. Kojima <kojima@windowmaker.org>\n"\
799 "Copyright \xa9 1998~2001 Dan Pascu <dan@windowmaker.org>"
803 static InfoPanel
*thePanel
= NULL
;
806 destroyInfoPanel(WCoreWindow
*foo
, void *data
, XEvent
*event
)
809 if (thePanel
->timer
) {
810 WMDeleteTimerHandler(thePanel
->timer
);
812 if (thePanel
->oldPix
) {
813 WMReleasePixmap(thePanel
->oldPix
);
815 if (thePanel
->oldFont
) {
816 WMReleaseFont(thePanel
->oldFont
);
818 if (thePanel
->icon
) {
819 RReleaseImage(thePanel
->icon
);
822 RReleaseImage(thePanel
->pic
);
824 #endif /* SILLYNESS */
825 WMUnmapWidget(thePanel
);
827 wUnmanageWindow(thePanel
->wwin
, False
, False
);
829 WMDestroyWidget(thePanel
->win
);
838 renderText(WMScreen
*scr
, char *text
, char *font
, RColor
*from
, RColor
*to
)
840 WMPixmap
*wpix
= NULL
;
843 RContext
*rc
= WMScreenRContext(scr
);
844 XFontStruct
*f
= NULL
;
848 f
= XLoadQueryFont(dpy
, font
);
852 w
= XTextWidth(f
, text
, strlen(text
));
853 h
= f
->ascent
+f
->descent
;
855 mask
= XCreatePixmap(dpy
, rc
->drawable
, w
, h
, 1);
856 gc
= XCreateGC(dpy
, mask
, 0, NULL
);
857 XSetForeground(dpy
, gc
, 0);
858 XSetFont(dpy
, gc
, f
->fid
);
859 XFillRectangle(dpy
, mask
, gc
, 0, 0, w
, h
);
861 XSetForeground(dpy
, gc
, 1);
862 XDrawString(dpy
, mask
, gc
, 0, f
->ascent
, text
, strlen(text
));
863 XSetLineAttributes(dpy
, gc
, 3, LineSolid
, CapRound
, JoinMiter
);
864 XDrawLine(dpy
, mask
, gc
, 0, h
-2, w
, h
-2);
866 grad
= XCreatePixmap(dpy
, rc
->drawable
, w
, h
, rc
->depth
);
870 color
= WMBlackColor(scr
);
871 XFillRectangle(dpy
, grad
, WMColorGC(color
), 0, 0, w
, h
);
872 WMReleaseColor(color
);
875 wpix
= WMCreatePixmapFromXPixmaps(scr
, grad
, mask
, w
, h
, rc
->depth
);
886 extern WMPixmap
*DoXThing();
887 extern Bool
InitXThing();
890 logoPushCallback(void *data
)
892 InfoPanel
*panel
= (InfoPanel
*)data
;
897 static int jingobeu
[] = {
898 329, 150, -1, 100, 329, 150, -1, 100, 329, 300, -1, 250,
899 329, 150, -1, 100, 329, 150, -1, 100, 329, 300, -1, 250,
900 329, 150, 392, 150, 261, 150, 293, 150, 329, 400, -1, 400, 0
908 if(jingobeu
[panel
->x
-1]==0){panel
->x
=-1;}else if(jingobeu
[panel
->x
909 -1]<0){panel
->x
++;c
=jingobeu
[panel
->x
-1]/50;panel
->x
++;}else if(c
==0){
910 kc
.bell_pitch
=jingobeu
[panel
->x
-1];panel
->x
++;kc
.bell_percent
=50;c
=
911 jingobeu
[panel
->x
-1]/50;kc
.bell_duration
=jingobeu
[panel
->x
-1];panel
->x
++;
912 XChangeKeyboardControl(dpy
,KBBellPitch
|KBBellDuration
|KBBellPercent
,&kc
);
913 XBell(dpy
,50);XFlush(dpy
);}else{c
--;}}
914 if (!(panel
->cycle
% 4)) {
917 p
= DoXThing(panel
->wwin
);
918 WMSetLabelImage(panel
->logoL
, p
);
920 } else if (panel
->cycle
< 30) {
925 gray
.red
= 0xae; gray
.green
= 0xaa;
926 gray
.blue
= 0xae; gray
.alpha
= 0;
928 image
= RScaleImage(panel
->icon
, panel
->pic
->width
, panel
->pic
->height
);
929 RCombineImagesWithOpaqueness(image
, panel
->pic
, panel
->cycle
*255/30);
930 pix
= WMCreateBlendedPixmapFromRImage(panel
->scr
->wmscreen
, image
, &gray
);
931 RReleaseImage(image
);
932 WMSetLabelImage(panel
->logoL
, pix
);
933 WMReleasePixmap(pix
);
936 /* slow down text a little */
937 i
= (int)(panel
->cycle
* 50.0/85.0)%200;
940 len
= strlen(panel
->str
);
942 strncpy(buffer
, panel
->str
, i
<len
? i
: len
);
944 memset(&buffer
[len
], ' ', i
-len
);
946 strncpy(buffer
, panel
->str
, i
<len
? i
: len
);
948 memset(&buffer
[len
], ' ', i
-len
);
951 WMSetLabelText(panel
->versionL
, buffer
);
953 XFlush(WMScreenDisplay(WMWidgetScreen(panel
->versionL
)));
958 panel
->timer
= WMAddTimerHandler(50, logoPushCallback
, panel
);
964 handleLogoPush(XEvent
*event
, void *data
)
966 InfoPanel
*panel
= (InfoPanel
*)data
;
967 static int broken
= 0;
968 static int clicks
= 0;
969 static char *pic_data
[] = {
1028 " ............... ",
1029 " ....XoO+@##+O$%.... ",
1030 " ...%X&*========-;;:o... ",
1031 " ...>.>,<122222222222134@... ",
1032 " ..>5678912222222222222220q%.. ",
1033 " ..$.&-w2222222222222222222er>.. ",
1034 " ..O.t31222222222222222222222y4>.. ",
1035 " ...O5u3222222222222222222222222yri... ",
1036 " ..>p&a22222222222222222222222222wso.. ",
1037 " ..ids91222222222222222222222222222wfi.. ",
1038 " ..X.7w222222wgs-w2222222213=g0222222<hi.. ",
1039 " ..Xuj2222222<@X5=222222229k@l:022222y4i.. ",
1040 " .Xdz22222222*X%.s22222222axo%$-222222<c>.. ",
1041 " ..o7y22222222v...r222222223hX.i82222221si.. ",
1042 "..io*222222222&...u22222222yt..%*22222220:%. ",
1043 "..>k02222222227...f222222222v..X=222222229t. ",
1044 "..dz12222222220ui:y2222222223d%qw222222221g. ",
1045 ".%vw222222222221y2222222222219*y2222222222wd.",
1046 ".X;2222222222222222222222222222222222222222b.",
1047 ".i*2222222222222222222222222222222222222222v.",
1048 ".i*2222222222222222222222222222222222222222;.",
1049 ".i*22222222222222222222222222222222222222228.",
1050 ".>*2222222222222222222222222222222222222222=.",
1051 ".i*22222222222222222222222222222222222222228.",
1052 ".i*2222222222222222222222222222222222222222;.",
1053 ".X*222222222222222222222222222222we12222222r.",
1054 ".Xs12222222w3aw22222222222222222y8s0222222wk.",
1055 ".Xq02222222a,na22222222222222222zm6zwy2222gi.",
1056 "..>*22222y<:Xcj22222222222222222-o$k;;02228..",
1057 "..i7y2220rhX.:y22222222222222222jtiXd,a220,..",
1058 " .X@z222a,do%kj2222222222222222wMX5q;gw228%..",
1059 " ..58222wagsh6ry222222222222221;>Of0w222y:...",
1060 " ...:e2222218mdz22222222222222a&$vw222220@...",
1061 " ...O-122222y:.u02222222222229q$uj222221r... ",
1062 " ..%&a1222223&573w2222222219NOxz122221z>... ",
1063 " ...t3222221-l$nr8ay1222yzbo,=12222w-5... ",
1064 " ..X:022222w-k+>o,7s**s7xOn=12221<f5... ",
1065 " ..o:9222221j8:&Bl>>>>ihv<12221=dX... ",
1066 " ..Xb9122222109g-****;<y22221zn%... ",
1067 " ..X&801222222222222222222w-h.... ",
1068 " ...o:=022222222222222221=lX... ",
1069 " ..X@:;3w2222222222210fO... ",
1070 " ...XX&v8<30000003-N@... ",
1071 " .....XmnbN:q&Bo.... ",
1073 static char *msgs
[] = {
1075 "Focus follow mouse users will burn in hell!!!",
1077 "Hi! My name is bobby...",
1078 "AHH! The neurotic monkeys are after me!",
1081 "SOMEBODY SET UP US THE BOMB",
1082 "ALL YOUR BASE ARE BELONG TO US!",
1083 "Oh My God!!! Larry is back!"
1089 if (!panel
->timer
&& !broken
&& clicks
> 0) {
1095 panel
->icon
= WMGetApplicationIconImage(panel
->scr
->wmscreen
);
1102 color
.red
= 0xae; color
.green
= 0xaa;
1103 color
.blue
= 0xae; color
.alpha
= 0;
1105 panel
->icon
= RCloneImage(panel
->icon
);
1106 RCombineImageWithColor(panel
->icon
, &color
);
1110 panel
->pic
= RGetImageFromXPMData(panel
->scr
->rcontext
, pic_data
);
1113 RReleaseImage(panel
->icon
);
1119 panel
->str
= msgs
[rand()%(sizeof(msgs
)/sizeof(char*))];
1121 panel
->timer
= WMAddTimerHandler(50, logoPushCallback
, panel
);
1123 panel
->oldPix
= WMRetainPixmap(WMGetLabelImage(panel
->logoL
));
1124 /* If we don't use a fixed font, scrolling will be jumpy */
1125 /* Alternatively we can draw text in a pixmap and scroll it smoothly */
1126 if ((panel
->oldFont
= WMGetLabelFont(panel
->versionL
))!=NULL
)
1127 WMRetainFont(panel
->oldFont
);
1128 font
= WMCreateFont(WMWidgetScreen(panel
->versionL
), "-*-fixed-*-*-*-*-14-*-*-*-*-*-*-*");
1130 WMSetLabelFont(panel
->versionL
, font
);
1131 WMReleaseFont(font
);
1133 WMSetLabelText(panel
->versionL
, "");
1134 } else if (panel
->timer
) {
1139 WMSetLabelImage(panel
->logoL
, panel
->oldPix
);
1140 WMReleasePixmap(panel
->oldPix
);
1141 panel
->oldPix
= NULL
;
1143 WMDeleteTimerHandler(panel
->timer
);
1144 panel
->timer
= NULL
;
1146 WMSetLabelFont(panel
->versionL
, panel
->oldFont
);
1147 if (panel
->oldFont
) {
1148 WMReleaseFont(panel
->oldFont
);
1149 panel
->oldFont
= NULL
;
1151 sprintf(version
, _("Version %s"), VERSION
);
1152 WMSetLabelText(panel
->versionL
, version
);
1153 XFlush(WMScreenDisplay(WMWidgetScreen(panel
->versionL
)));
1158 while (XCheckTypedWindowEvent(dpy
, WMWidgetXID(panel
->versionL
),
1162 #endif /* SILLYNESS */
1166 wShowInfoPanel(WScreen
*scr
)
1176 RColor color1
, color2
;
1190 if (thePanel
->scr
== scr
) {
1191 wRaiseFrame(thePanel
->wwin
->frame
->core
);
1192 wSetFocusTo(scr
, thePanel
->wwin
);
1197 panel
= wmalloc(sizeof(InfoPanel
));
1198 memset(panel
, 0, sizeof(InfoPanel
));
1202 panel
->win
= WMCreateWindow(scr
->wmscreen
, "info");
1203 WMResizeWidget(panel
->win
, 382, 230);
1205 logo
= WMGetApplicationIconBlendedPixmap(scr
->wmscreen
, (RColor
*)NULL
);
1207 logo
= WMRetainPixmap(WMGetApplicationIconPixmap(scr
->wmscreen
));
1210 size
= WMGetPixmapSize(logo
);
1211 panel
->logoL
= WMCreateLabel(panel
->win
);
1212 WMResizeWidget(panel
->logoL
, 64, 64);
1213 WMMoveWidget(panel
->logoL
, 30, 20);
1214 WMSetLabelImagePosition(panel
->logoL
, WIPImageOnly
);
1215 WMSetLabelImage(panel
->logoL
, logo
);
1217 WMCreateEventHandler(WMWidgetView(panel
->logoL
), ButtonPressMask
,
1218 handleLogoPush
, panel
);
1220 WMReleasePixmap(logo
);
1223 panel
->name1L
= WMCreateLabel(panel
->win
);
1224 WMResizeWidget(panel
->name1L
, 240, 30);
1225 WMMoveWidget(panel
->name1L
, 100, 30);
1230 color2
.green
= 0x50;
1232 logo
= renderText(scr
->wmscreen
, "GNU Window Maker",
1233 "-*-utopia-*-r-*-*-25-*", &color1
, &color2
);
1235 WMSetLabelImagePosition(panel
->name1L
, WIPImageOnly
);
1236 WMSetLabelImage(panel
->name1L
, logo
);
1237 WMReleasePixmap(logo
);
1239 font
= WMBoldSystemFontOfSize(scr
->wmscreen
, 20);
1241 WMSetLabelFont(panel
->name1L
, font
);
1242 WMReleaseFont(font
);
1244 WMSetLabelTextAlignment(panel
->name1L
, WACenter
);
1245 WMSetLabelText(panel
->name1L
, "GNU Window Maker");
1248 panel
->name2L
= WMCreateLabel(panel
->win
);
1249 WMResizeWidget(panel
->name2L
, 240, 24);
1250 WMMoveWidget(panel
->name2L
, 100, 60);
1251 font
= WMBoldSystemFontOfSize(scr
->wmscreen
, 18);
1253 WMSetLabelFont(panel
->name2L
, font
);
1254 WMReleaseFont(font
);
1257 WMSetLabelTextAlignment(panel
->name2L
, WACenter
);
1258 WMSetLabelText(panel
->name2L
, _("Window Manager for X"));
1261 sprintf(version
, _("Version %s"), VERSION
);
1262 panel
->versionL
= WMCreateLabel(panel
->win
);
1263 WMResizeWidget(panel
->versionL
, 310, 16);
1264 WMMoveWidget(panel
->versionL
, 30, 95);
1265 WMSetLabelTextAlignment(panel
->versionL
, WARight
);
1266 WMSetLabelText(panel
->versionL
, version
);
1267 WMSetLabelWraps(panel
->versionL
, False
);
1269 panel
->copyrL
= WMCreateLabel(panel
->win
);
1270 WMResizeWidget(panel
->copyrL
, 340, 40);
1271 WMMoveWidget(panel
->copyrL
, 15, 185);
1272 WMSetLabelTextAlignment(panel
->copyrL
, WALeft
);
1273 WMSetLabelText(panel
->copyrL
, COPYRIGHT_TEXT
);
1274 /* we want the (c) character in the helvetica font */
1275 font
= WMCreateNormalFont(scr
->wmscreen
, HELVETICA10_FONT
);
1277 WMSetLabelFont(panel
->copyrL
, font
);
1280 switch (scr
->w_depth
) {
1282 strcpy(version
, _("32 thousand"));
1285 strcpy(version
, _("64 thousand"));
1289 strcpy(version
, _("16 million"));
1292 sprintf(version
, "%d", 1<<scr
->w_depth
);
1296 sprintf(buffer
, _("Using visual 0x%x: %s %ibpp (%s colors)\n"),
1297 (unsigned)scr
->w_visual
->visualid
,
1298 visuals
[scr
->w_visual
->class], scr
->w_depth
, version
);
1300 #if defined(HAVE_MALLOC_H) && defined(HAVE_MALLINFO)
1302 struct mallinfo ma
= mallinfo();
1303 sprintf(buffer
+strlen(buffer
),
1304 _("Total allocated memory: %i kB. Total memory in use: %i kB.\n"),
1305 (ma
.arena
+ma
.hblkhd
)/1024, (ma
.uordblks
+ma
.hblkhd
)/1024);
1310 strcat(buffer
, _("Supported image formats: "));
1311 strl
= RSupportedFileFormats();
1312 for (i
=0; strl
[i
]!=NULL
; i
++) {
1313 strcat(buffer
, strl
[i
]);
1314 strcat(buffer
, " ");
1317 strcat(buffer
, _("\nAdditional Support For: "));
1330 list
[j
++] = "GNOME";
1336 list
[j
++] = _("Sound");
1340 for (i
= 0; i
< j
; i
++) {
1343 strcat(buf
, _(" and "));
1347 strcat(buf
, list
[i
]);
1349 strcat(buffer
, buf
);
1353 panel
->infoL
= WMCreateLabel(panel
->win
);
1354 WMResizeWidget(panel
->infoL
, 350, 75);
1355 WMMoveWidget(panel
->infoL
, 15, 115);
1356 WMSetLabelText(panel
->infoL
, buffer
);
1358 WMSetLabelFont(panel
->infoL
, font
);
1359 WMReleaseFont(font
);
1363 WMRealizeWidget(panel
->win
);
1364 WMMapSubwidgets(panel
->win
);
1366 parent
= XCreateSimpleWindow(dpy
, scr
->root_win
, 0, 0, 382, 230, 0, 0, 0);
1368 XReparentWindow(dpy
, WMWidgetXID(panel
->win
), parent
, 0, 0);
1370 WMMapWidget(panel
->win
);
1372 wwin
= wManageInternalWindow(scr
, parent
, None
, _("Info"),
1373 (scr
->scr_width
- 382)/2,
1374 (scr
->scr_height
- 230)/2, 382, 230);
1376 WSETUFLAG(wwin
, no_closable
, 0);
1377 WSETUFLAG(wwin
, no_close_button
, 0);
1378 #ifdef XKB_BUTTON_HINT
1379 wFrameWindowHideButton(wwin
->frame
, WFF_LANGUAGE_BUTTON
);
1381 wWindowUpdateButtonImages(wwin
);
1382 wFrameWindowShowButton(wwin
->frame
, WFF_RIGHT_BUTTON
);
1383 wwin
->frame
->on_click_right
= destroyInfoPanel
;
1391 if (InitXThing(panel
->scr
)) {
1392 panel
->timer
= WMAddTimerHandler(100, logoPushCallback
, panel
);
1395 panel
->str
= _("Merry X'mas!");
1396 panel
->oldPix
= WMRetainPixmap(WMGetLabelImage(panel
->logoL
));
1403 ***********************************************************************
1405 ***********************************************************************
1419 static LegalPanel
*legalPanel
= NULL
;
1422 destroyLegalPanel(WCoreWindow
*foo
, void *data
, XEvent
*event
)
1424 WMUnmapWidget(legalPanel
->win
);
1426 WMDestroyWidget(legalPanel
->win
);
1428 wUnmanageWindow(legalPanel
->wwin
, False
, False
);
1437 wShowLegalPanel(WScreen
*scr
)
1444 if (legalPanel
->scr
== scr
) {
1445 wRaiseFrame(legalPanel
->wwin
->frame
->core
);
1446 wSetFocusTo(scr
, legalPanel
->wwin
);
1451 panel
= wmalloc(sizeof(LegalPanel
));
1455 panel
->win
= WMCreateWindow(scr
->wmscreen
, "legal");
1456 WMResizeWidget(panel
->win
, 420, 250);
1459 panel
->licenseL
= WMCreateLabel(panel
->win
);
1460 WMSetLabelWraps(panel
->licenseL
, True
);
1461 WMResizeWidget(panel
->licenseL
, 400, 230);
1462 WMMoveWidget(panel
->licenseL
, 10, 10);
1463 WMSetLabelTextAlignment(panel
->licenseL
, WALeft
);
1464 WMSetLabelText(panel
->licenseL
,
1465 _(" Window Maker is free software; you can redistribute it and/or\n"
1466 "modify it under the terms of the GNU General Public License as\n"
1467 "published by the Free Software Foundation; either version 2 of the\n"
1468 "License, or (at your option) any later version.\n\n\n"
1469 " Window Maker is distributed in the hope that it will be useful,\n"
1470 "but WITHOUT ANY WARRANTY; without even the implied warranty\n"
1471 "of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
1472 "See the GNU General Public License for more details.\n\n\n"
1473 " You should have received a copy of the GNU General Public\n"
1474 "License along with this program; if not, write to the Free Software\n"
1475 "Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA\n"
1476 "02111-1307, USA."));
1477 WMSetLabelRelief(panel
->licenseL
, WRGroove
);
1479 WMRealizeWidget(panel
->win
);
1480 WMMapSubwidgets(panel
->win
);
1482 parent
= XCreateSimpleWindow(dpy
, scr
->root_win
, 0, 0, 420, 250, 0, 0, 0);
1484 XReparentWindow(dpy
, WMWidgetXID(panel
->win
), parent
, 0, 0);
1486 wwin
= wManageInternalWindow(scr
, parent
, None
, _("Legal"),
1487 (scr
->scr_width
- 420)/2,
1488 (scr
->scr_height
- 250)/2, 420, 250);
1490 WSETUFLAG(wwin
, no_closable
, 0);
1491 WSETUFLAG(wwin
, no_close_button
, 0);
1492 wWindowUpdateButtonImages(wwin
);
1493 wFrameWindowShowButton(wwin
->frame
, WFF_RIGHT_BUTTON
);
1494 #ifdef XKB_BUTTON_HINT
1495 wFrameWindowHideButton(wwin
->frame
, WFF_LANGUAGE_BUTTON
);
1497 wwin
->frame
->on_click_right
= destroyLegalPanel
;
1501 WMMapWidget(panel
->win
);
1510 ***********************************************************************
1511 * Crashing Dialog Panel
1512 ***********************************************************************
1515 extern WDDomain
*WDWindowAttributes
;
1518 typedef struct _CrashPanel
{
1519 WMWindow
*win
; /* main window */
1521 WMLabel
*iconL
; /* application icon */
1522 WMLabel
*nameL
; /* title of panel */
1524 WMFrame
*sepF
; /* separator frame */
1526 WMLabel
*noteL
; /* Title of note */
1527 WMLabel
*note2L
; /* body of note with what happened */
1529 WMFrame
*whatF
; /* "what to do next" frame */
1530 WMPopUpButton
*whatP
; /* action selection popup button */
1532 WMButton
*okB
; /* ok button */
1534 Bool done
; /* if finished with this dialog */
1535 int action
; /* what to do after */
1543 handleKeyPress(XEvent
*event
, void *clientData
)
1545 CrashPanel
*panel
= (CrashPanel
*)clientData
;
1547 if (event
->xkey
.keycode
== panel
->retKey
) {
1548 WMPerformButtonClick(panel
->okB
);
1554 okButtonCallback(void *self
, void *clientData
)
1556 CrashPanel
*panel
= (CrashPanel
*)clientData
;
1563 setCrashAction(void *self
, void *clientData
)
1565 WMPopUpButton
*pop
= (WMPopUpButton
*)self
;
1566 CrashPanel
*panel
= (CrashPanel
*)clientData
;
1568 panel
->action
= WMGetPopUpButtonSelectedItem(pop
);
1573 getWindowMakerIconImage(WMScreen
*scr
)
1575 proplist_t dict
, key
, option
, value
=NULL
;
1579 PLSetStringCmpHook(NULL
);
1581 key
= PLMakeString("Logo.WMPanel");
1582 option
= PLMakeString("Icon");
1584 dict
= PLGetDictionaryEntry(WDWindowAttributes
->dictionary
, key
);
1587 value
= PLGetDictionaryEntry(dict
, option
);
1593 PLSetStringCmpHook(StringCompareHook
);
1595 if (value
&& PLIsString(value
)) {
1596 path
= FindImage(wPreferences
.icon_path
, PLGetString(value
));
1601 gray
.red
= 0xae; gray
.green
= 0xaa;
1602 gray
.blue
= 0xae; gray
.alpha
= 0;
1604 pix
= WMCreateBlendedPixmapFromFile(scr
, path
, &gray
);
1618 wShowCrashingDialogPanel(int whatSig
)
1624 int screen_no
, scr_width
, scr_height
;
1628 panel
= wmalloc(sizeof(CrashPanel
));
1629 memset(panel
, 0, sizeof(CrashPanel
));
1631 screen_no
= DefaultScreen(dpy
);
1632 scr_width
= WidthOfScreen(ScreenOfDisplay(dpy
, screen_no
));
1633 scr_height
= HeightOfScreen(ScreenOfDisplay(dpy
, screen_no
));
1635 scr
= WMCreateScreen(dpy
, screen_no
);
1637 wsyserror(_("cannot open connection for crashing dialog panel. Aborting."));
1641 panel
->retKey
= XKeysymToKeycode(dpy
, XK_Return
);
1643 panel
->win
= WMCreateWindow(scr
, "crashingDialog");
1644 WMResizeWidget(panel
->win
, PWIDTH
, PHEIGHT
);
1645 WMMoveWidget(panel
->win
, (scr_width
- PWIDTH
)/2, (scr_height
- PHEIGHT
)/2);
1647 logo
= getWindowMakerIconImage(scr
);
1649 panel
->iconL
= WMCreateLabel(panel
->win
);
1650 WMResizeWidget(panel
->iconL
, 64, 64);
1651 WMMoveWidget(panel
->iconL
, 10, 10);
1652 WMSetLabelImagePosition(panel
->iconL
, WIPImageOnly
);
1653 WMSetLabelImage(panel
->iconL
, logo
);
1656 panel
->nameL
= WMCreateLabel(panel
->win
);
1657 WMResizeWidget(panel
->nameL
, 190, 18);
1658 WMMoveWidget(panel
->nameL
, 80, 35);
1659 WMSetLabelTextAlignment(panel
->nameL
, WALeft
);
1660 font
= WMBoldSystemFontOfSize(scr
, 18);
1661 WMSetLabelFont(panel
->nameL
, font
);
1662 WMReleaseFont(font
);
1663 WMSetLabelText(panel
->nameL
, _("Fatal error"));
1665 panel
->sepF
= WMCreateFrame(panel
->win
);
1666 WMResizeWidget(panel
->sepF
, PWIDTH
+4, 2);
1667 WMMoveWidget(panel
->sepF
, -2, 80);
1669 panel
->noteL
= WMCreateLabel(panel
->win
);
1670 WMResizeWidget(panel
->noteL
, PWIDTH
-20, 40);
1671 WMMoveWidget(panel
->noteL
, 10, 90);
1672 WMSetLabelTextAlignment(panel
->noteL
, WAJustified
);
1673 #ifdef SYS_SIGLIST_DECLARED
1674 sprintf(buf
, _("Window Maker received signal %i\n(%s)."),
1675 whatSig
, sys_siglist
[whatSig
]);
1677 sprintf(buf
, _("Window Maker received signal %i."), whatSig
);
1679 WMSetLabelText(panel
->noteL
, buf
);
1681 panel
->note2L
= WMCreateLabel(panel
->win
);
1682 WMResizeWidget(panel
->note2L
, PWIDTH
-20, 100);
1683 WMMoveWidget(panel
->note2L
, 10, 130);
1684 WMSetLabelTextAlignment(panel
->note2L
, WALeft
);
1685 WMSetLabelText(panel
->note2L
,
1686 _(" This fatal error occured probably due to a bug."
1687 " Please fill the included BUGFORM and "
1688 "report it to bugs@windowmaker.org."));
1689 WMSetLabelWraps(panel
->note2L
, True
);
1692 panel
->whatF
= WMCreateFrame(panel
->win
);
1693 WMResizeWidget(panel
->whatF
, PWIDTH
-20, 50);
1694 WMMoveWidget(panel
->whatF
, 10, 240);
1695 WMSetFrameTitle(panel
->whatF
, _("What do you want to do now?"));
1697 panel
->whatP
= WMCreatePopUpButton(panel
->whatF
);
1698 WMResizeWidget(panel
->whatP
, PWIDTH
-20-70, 20);
1699 WMMoveWidget(panel
->whatP
, 35, 20);
1700 WMSetPopUpButtonPullsDown(panel
->whatP
, False
);
1701 WMSetPopUpButtonText(panel
->whatP
, _("Select action"));
1702 WMAddPopUpButtonItem(panel
->whatP
, _("Abort and leave a core file"));
1703 WMAddPopUpButtonItem(panel
->whatP
, _("Restart Window Maker"));
1704 WMAddPopUpButtonItem(panel
->whatP
, _("Start alternate window manager"));
1705 WMSetPopUpButtonAction(panel
->whatP
, setCrashAction
, panel
);
1706 WMSetPopUpButtonSelectedItem(panel
->whatP
, WMRestart
);
1707 panel
->action
= WMRestart
;
1709 WMMapSubwidgets(panel
->whatF
);
1711 panel
->okB
= WMCreateCommandButton(panel
->win
);
1712 WMResizeWidget(panel
->okB
, 80, 26);
1713 WMMoveWidget(panel
->okB
, 205, 309);
1714 WMSetButtonText(panel
->okB
, _("OK"));
1715 WMSetButtonImage(panel
->okB
, WMGetSystemPixmap(scr
, WSIReturnArrow
));
1716 WMSetButtonAltImage(panel
->okB
, WMGetSystemPixmap(scr
, WSIHighlightedReturnArrow
));
1717 WMSetButtonImagePosition(panel
->okB
, WIPRight
);
1718 WMSetButtonAction(panel
->okB
, okButtonCallback
, panel
);
1722 WMCreateEventHandler(WMWidgetView(panel
->win
), KeyPressMask
,
1723 handleKeyPress
, panel
);
1725 WMRealizeWidget(panel
->win
);
1726 WMMapSubwidgets(panel
->win
);
1728 WMMapWidget(panel
->win
);
1730 XSetInputFocus(dpy
, WMWidgetXID(panel
->win
), RevertToParent
, CurrentTime
);
1732 while (!panel
->done
) {
1735 WMNextEvent(dpy
, &event
);
1736 WMHandleEvent(&event
);
1739 action
= panel
->action
;
1741 WMUnmapWidget(panel
->win
);
1742 WMDestroyWidget(panel
->win
);
1751 /*****************************************************************************
1752 * About GNUstep Panel
1753 *****************************************************************************/
1757 drawGNUstepLogo(Display
*dpy
, Drawable d
, int width
, int height
,
1758 unsigned long blackPixel
, unsigned long whitePixel
)
1762 XRectangle rects
[3];
1764 gcv
.foreground
= blackPixel
;
1765 gc
= XCreateGC(dpy
, d
, GCForeground
, &gcv
);
1767 XFillArc(dpy
, d
, gc
, width
/45, height
/45,
1768 width
- 2*width
/45, height
- 2*height
/45, 0, 360*64);
1771 rects
[0].y
= 37*height
/45;
1772 rects
[0].width
= width
/3;
1773 rects
[0].height
= height
- rects
[0].y
;
1775 rects
[1].x
= rects
[0].width
;
1776 rects
[1].y
= height
/2;
1777 rects
[1].width
= width
- 2*width
/3;
1778 rects
[1].height
= height
- rects
[1].y
;
1780 rects
[2].x
= 2*width
/3;
1781 rects
[2].y
= height
- 37*height
/45;
1782 rects
[2].width
= width
/3;
1783 rects
[2].height
= height
- rects
[2].y
;
1785 XSetClipRectangles(dpy
, gc
, 0, 0, rects
, 3, Unsorted
);
1786 XFillRectangle(dpy
, d
, gc
, 0, 0, width
, height
);
1788 XSetForeground(dpy
, gc
, whitePixel
);
1789 XFillArc(dpy
, d
, gc
, width
/45, height
/45,
1790 width
- 2*width
/45, height
- 2*height
/45, 0, 360*64);
1808 static GNUstepPanel
*gnustepPanel
= NULL
;
1811 destroyGNUstepPanel(WCoreWindow
*foo
, void *data
, XEvent
*event
)
1813 WMUnmapWidget(gnustepPanel
->win
);
1815 WMDestroyWidget(gnustepPanel
->win
);
1817 wUnmanageWindow(gnustepPanel
->wwin
, False
, False
);
1819 wfree(gnustepPanel
);
1821 gnustepPanel
= NULL
;
1826 wShowGNUstepPanel(WScreen
*scr
)
1828 GNUstepPanel
*panel
;
1835 if (gnustepPanel
->scr
== scr
) {
1836 wRaiseFrame(gnustepPanel
->wwin
->frame
->core
);
1837 wSetFocusTo(scr
, gnustepPanel
->wwin
);
1842 panel
= wmalloc(sizeof(GNUstepPanel
));
1846 panel
->win
= WMCreateWindow(scr
->wmscreen
, "About GNUstep");
1847 WMResizeWidget(panel
->win
, 325, 200);
1849 pixmap
= WMCreatePixmap(scr
->wmscreen
, 130, 130,
1850 WMScreenDepth(scr
->wmscreen
), True
);
1852 color
= WMCreateNamedColor(scr
->wmscreen
, "gray50", True
);
1854 drawGNUstepLogo(dpy
, WMGetPixmapXID(pixmap
), 130, 130,
1855 WMColorPixel(color
), scr
->white_pixel
);
1857 WMReleaseColor(color
);
1859 XSetForeground(dpy
, scr
->mono_gc
, 0);
1860 XFillRectangle(dpy
, WMGetPixmapMaskXID(pixmap
), scr
->mono_gc
, 0, 0,
1862 drawGNUstepLogo(dpy
, WMGetPixmapMaskXID(pixmap
), 130, 130, 1, 1);
1864 panel
->gstepL
= WMCreateLabel(panel
->win
);
1865 WMResizeWidget(panel
->gstepL
, 285, 64);
1866 WMMoveWidget(panel
->gstepL
, 20, 0);
1867 WMSetLabelTextAlignment(panel
->gstepL
, WARight
);
1868 WMSetLabelText(panel
->gstepL
, "GNUstep");
1870 WMFont
*font
= WMBoldSystemFontOfSize(scr
->wmscreen
, 24);
1872 WMSetLabelFont(panel
->gstepL
, font
);
1873 WMReleaseFont(font
);
1876 panel
->textL
= WMCreateLabel(panel
->win
);
1877 WMResizeWidget(panel
->textL
, 275, 130);
1878 WMMoveWidget(panel
->textL
, 30, 50);
1879 WMSetLabelTextAlignment(panel
->textL
, WARight
);
1880 WMSetLabelImagePosition(panel
->textL
, WIPOverlaps
);
1881 WMSetLabelText(panel
->textL
,
1882 _("Window Maker is part of the GNUstep project.\n"\
1883 "The GNUstep project aims to create a free\n"\
1884 "implementation of the OpenStep(tm) specification\n"\
1885 "which is a object-oriented framework for\n"\
1886 "creating advanced graphical, multi-platform\n"\
1887 "applications. Additionally, a development and\n"\
1888 "user desktop enviroment will be created on top\n"\
1889 "of the framework. For more information about\n"\
1890 "GNUstep, please visit: www.gnustep.org"));
1891 WMSetLabelImage(panel
->textL
, pixmap
);
1893 WMReleasePixmap(pixmap
);
1895 WMRealizeWidget(panel
->win
);
1896 WMMapSubwidgets(panel
->win
);
1898 parent
= XCreateSimpleWindow(dpy
, scr
->root_win
, 0, 0, 325, 200, 0, 0, 0);
1900 XReparentWindow(dpy
, WMWidgetXID(panel
->win
), parent
, 0, 0);
1902 wwin
= wManageInternalWindow(scr
, parent
, None
, _("About GNUstep"),
1903 (scr
->scr_width
- 325)/2,
1904 (scr
->scr_height
- 200)/2, 325, 200);
1906 WSETUFLAG(wwin
, no_closable
, 0);
1907 WSETUFLAG(wwin
, no_close_button
, 0);
1908 wWindowUpdateButtonImages(wwin
);
1909 wFrameWindowShowButton(wwin
->frame
, WFF_RIGHT_BUTTON
);
1910 #ifdef XKB_BUTTON_HINT
1911 wFrameWindowHideButton(wwin
->frame
, WFF_LANGUAGE_BUTTON
);
1913 wwin
->frame
->on_click_right
= destroyGNUstepPanel
;
1917 WMMapWidget(panel
->win
);
1921 gnustepPanel
= panel
;