1 /* dialog.c - dialog windows for internal use
3 * Window Maker window manager
5 * Copyright (c) 1997-2002 Alfredo K. Kojima
6 * Copyright (c) 1998-2002 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
;
68 static WMPoint
getCenter(WScreen
*scr
, int width
, int height
)
75 rect
= wGetRectForHead(scr
, wGetHeadForPointerLocation(scr
));
77 pt
.x
= rect
.pos
.x
+ (rect
.size
.width
- width
)/2;
78 pt
.y
= rect
.pos
.y
+ (rect
.size
.height
- height
)/2;
80 pt
.x
= (scr
->scr_width
- width
) / 2;
81 pt
.y
= (scr
->scr_height
- height
) / 2;
90 wMessageDialog(WScreen
*scr
, char *title
, char *message
,
91 char *defBtn
, char *altBtn
, char *othBtn
)
99 panel
= WMCreateAlertPanel(scr
->wmscreen
, NULL
, title
, message
,
100 defBtn
, altBtn
, othBtn
);
102 parent
= XCreateSimpleWindow(dpy
, scr
->root_win
, 0, 0, 400, 180, 0, 0, 0);
104 XReparentWindow(dpy
, WMWidgetXID(panel
->win
), parent
, 0, 0);
107 center
= getCenter(scr
, 400, 180);
108 wwin
= wManageInternalWindow(scr
, parent
, None
, NULL
, center
.x
, center
.y
,
110 wwin
->client_leader
= WMWidgetXID(panel
->win
);
112 WMMapWidget(panel
->win
);
116 WMRunModalLoop(WMWidgetScreen(panel
->win
), WMWidgetView(panel
->win
));
118 result
= panel
->result
;
120 WMUnmapWidget(panel
->win
);
122 wUnmanageWindow(wwin
, False
, False
);
124 WMDestroyAlertPanel(panel
);
126 XDestroyWindow(dpy
, parent
);
133 toggleSaveSession(WMWidget
*w
, void *data
)
135 wPreferences
.save_session_on_exit
= WMGetButtonSelected((WMButton
*) w
);
140 wExitDialog(WScreen
*scr
, char *title
, char *message
,
141 char *defBtn
, char *altBtn
, char *othBtn
)
144 WMButton
*saveSessionBtn
;
149 panel
= WMCreateAlertPanel(scr
->wmscreen
, NULL
, title
, message
,
150 defBtn
, altBtn
, othBtn
);
152 /* add save session button */
153 saveSessionBtn
= WMCreateSwitchButton(panel
->hbox
);
154 WMSetButtonAction(saveSessionBtn
, toggleSaveSession
, NULL
);
155 WMAddBoxSubview(panel
->hbox
, WMWidgetView(saveSessionBtn
),
156 False
, True
, 200, 0, 0);
157 WMSetButtonText(saveSessionBtn
, _("Save workspace state"));
158 WMSetButtonSelected(saveSessionBtn
, wPreferences
.save_session_on_exit
);
159 WMRealizeWidget(saveSessionBtn
);
160 WMMapWidget(saveSessionBtn
);
162 parent
= XCreateSimpleWindow(dpy
, scr
->root_win
, 0, 0, 400, 180, 0, 0, 0);
164 XReparentWindow(dpy
, WMWidgetXID(panel
->win
), parent
, 0, 0);
166 wwin
= wManageInternalWindow(scr
, parent
, None
, NULL
,
167 (scr
->scr_width
- 400)/2,
168 (scr
->scr_height
- 180)/2, 400, 180);
169 wwin
->client_leader
= WMWidgetXID(panel
->win
);
171 WMMapWidget(panel
->win
);
175 WMRunModalLoop(WMWidgetScreen(panel
->win
), WMWidgetView(panel
->win
));
177 result
= panel
->result
;
179 WMUnmapWidget(panel
->win
);
181 wUnmanageWindow(wwin
, False
, False
);
183 WMDestroyAlertPanel(panel
);
185 XDestroyWindow(dpy
, parent
);
192 wInputDialog(WScreen
*scr
, char *title
, char *message
, char **text
)
200 panel
= WMCreateInputPanel(scr
->wmscreen
, NULL
, title
, message
, *text
,
201 _("OK"), _("Cancel"));
204 parent
= XCreateSimpleWindow(dpy
, scr
->root_win
, 0, 0, 320, 160, 0, 0, 0);
205 XSelectInput(dpy
, parent
, KeyPressMask
|KeyReleaseMask
);
207 XReparentWindow(dpy
, WMWidgetXID(panel
->win
), parent
, 0, 0);
209 center
= getCenter(scr
, 320, 160);
210 wwin
= wManageInternalWindow(scr
, parent
, None
, NULL
, center
.x
, center
.y
,
213 wwin
->client_leader
= WMWidgetXID(panel
->win
);
215 WMMapWidget(panel
->win
);
219 WMRunModalLoop(WMWidgetScreen(panel
->win
), WMWidgetView(panel
->win
));
221 if (panel
->result
== WAPRDefault
)
222 result
= WMGetTextFieldText(panel
->text
);
226 wUnmanageWindow(wwin
, False
, False
);
228 WMDestroyInputPanel(panel
);
230 XDestroyWindow(dpy
, parent
);
245 *****************************************************************
246 * Icon Selection Panel
247 *****************************************************************
250 typedef struct IconPanel
{
263 WMButton
*previewButton
;
268 WMTextField
*fileField
;
271 WMButton
*cancelButton
;
273 WMButton
*chooseButton
;
283 listPixmaps(WScreen
*scr
, WMList
*lPtr
, char *path
)
285 struct dirent
*dentry
;
287 char pbuf
[PATH_MAX
+16];
289 IconPanel
*panel
= WMGetHangedData(lPtr
);
291 panel
->preview
= False
;
293 apath
= wexpandpath(path
);
294 dir
= opendir(apath
);
299 tmp
= _("Could not open directory ");
300 msg
= wmalloc(strlen(tmp
)+strlen(path
)+6);
304 wMessageDialog(scr
, _("Error"), msg
, _("OK"), NULL
, NULL
);
310 /* list contents in the column */
311 while ((dentry
= readdir(dir
))) {
314 if (strcmp(dentry
->d_name
, ".")==0 ||
315 strcmp(dentry
->d_name
, "..")==0)
320 strcat(pbuf
, dentry
->d_name
);
322 if (stat(pbuf
, &statb
)<0)
325 if (statb
.st_mode
& (S_IRUSR
|S_IRGRP
|S_IROTH
)
326 && statb
.st_mode
& (S_IFREG
|S_IFLNK
)) {
327 WMAddListItem(lPtr
, dentry
->d_name
);
330 WMSortListItems(lPtr
);
334 panel
->preview
= True
;
340 setViewedImage(IconPanel
*panel
, char *file
)
349 pixmap
= WMCreateBlendedPixmapFromFile(WMWidgetScreen(panel
->win
),
352 WMSetButtonEnabled(panel
->okButton
, False
);
354 WMSetLabelText(panel
->iconView
, _("Could not load image file "));
356 WMSetLabelImage(panel
->iconView
, NULL
);
358 WMSetButtonEnabled(panel
->okButton
, True
);
360 WMSetLabelText(panel
->iconView
, NULL
);
361 WMSetLabelImage(panel
->iconView
, pixmap
);
362 WMReleasePixmap(pixmap
);
368 listCallback(void *self
, void *data
)
370 WMList
*lPtr
= (WMList
*)self
;
371 IconPanel
*panel
= (IconPanel
*)data
;
374 if (lPtr
==panel
->dirList
) {
375 WMListItem
*item
= WMGetListSelectedItem(lPtr
);
381 WMSetTextFieldText(panel
->fileField
, path
);
383 WMSetLabelImage(panel
->iconView
, NULL
);
385 WMSetButtonEnabled(panel
->okButton
, False
);
387 WMClearList(panel
->iconList
);
388 listPixmaps(panel
->scr
, panel
->iconList
, path
);
390 char *tmp
, *iconFile
;
391 WMListItem
*item
= WMGetListSelectedItem(panel
->dirList
);
396 tmp
= wexpandpath(path
);
398 item
= WMGetListSelectedItem(panel
->iconList
);
401 iconFile
= item
->text
;
403 path
= wmalloc(strlen(tmp
)+strlen(iconFile
)+4);
406 strcat(path
, iconFile
);
408 WMSetTextFieldText(panel
->fileField
, path
);
409 setViewedImage(panel
, path
);
416 listIconPaths(WMList
*lPtr
)
421 paths
= wstrdup(wPreferences
.icon_path
);
423 path
= strtok(paths
, ":");
428 tmp
= wexpandpath(path
);
429 /* do not sort, because the order implies the order of
430 * directories searched */
431 if (access(tmp
, X_OK
)==0)
432 WMAddListItem(lPtr
, path
);
434 } while ((path
=strtok(NULL
, ":"))!=NULL
);
441 drawIconProc(WMList
*lPtr
, int index
, Drawable d
, char *text
,
442 int state
, WMRect
*rect
)
444 IconPanel
*panel
= WMGetHangedData(lPtr
);
445 GC gc
= panel
->scr
->draw_gc
;
446 GC copygc
= panel
->scr
->copy_gc
;
447 char *file
, *dirfile
;
452 WMScreen
*wmscr
= WMWidgetScreen(panel
->win
);
456 if(!panel
->preview
) return;
458 width
= rect
->size
.width
;
460 blackcolor
= WMBlackColor(wmscr
);
461 whitecolor
= WMWhiteColor(wmscr
);
463 dirfile
= wexpandpath(WMGetListSelectedItem(panel
->dirList
)->text
);
465 int len
= strlen(dirfile
)+strlen(text
)+4;
467 snprintf(file
, len
, "%s/%s", dirfile
, text
);
471 if ((state
& WLDSSelected
) != 0) {
472 color
.red
= color
.green
= color
.blue
= 0xff;
475 color
.red
= color
.blue
= 0xae;
476 color
.green
= 0xaa; color
.alpha
= 0;
478 pixmap
= WMCreateBlendedPixmapFromFile(wmscr
, file
, &color
);
482 WMRemoveListItem(lPtr
, index
);
486 XClearArea(dpy
, d
, rect
->pos
.x
, rect
->pos
.y
, width
, rect
->size
.height
,
488 XSetClipMask(dpy
, gc
, None
);
490 XDrawRectangle(dpy, d, WMColorGC(whitecolor), rect->pos.x + 5,
491 rect->pos.y +5, width - 10, 54);
493 XDrawLine(dpy
, d
, WMColorGC(whitecolor
), rect
->pos
.x
,
494 rect
->pos
.y
+rect
->size
.height
-1, rect
->pos
.x
+width
,
495 rect
->pos
.y
+rect
->size
.height
-1);
498 if (state
&WLDSSelected
) {
499 XFillRectangle(dpy
, d
, WMColorGC(whitecolor
), rect
->pos
.x
,
500 rect
->pos
.y
, width
, rect
->size
.height
);
503 size
= WMGetPixmapSize(pixmap
);
505 XSetClipMask(dpy
, copygc
, WMGetPixmapMaskXID(pixmap
));
506 XSetClipOrigin(dpy
, copygc
, rect
->pos
.x
+ (width
-size
.width
)/2,
508 XCopyArea(dpy
, WMGetPixmapXID(pixmap
), d
, copygc
, 0, 0,
509 size
.width
>100?100:size
.width
, size
.height
>64?64:size
.height
,
510 rect
->pos
.x
+ (width
-size
.width
)/2, rect
->pos
.y
+2);
514 int fheight
= WMFontHeight(panel
->normalfont
);
515 int tlen
= strlen(text
);
516 int twidth
= WMWidthOfString(panel
->normalfont
, text
, tlen
);
519 ofx
= rect
->pos
.x
+ (width
- twidth
)/2;
520 ofy
= rect
->pos
.y
+ 64 - fheight
;
524 WMDrawString(wmscr
, d
, whitecolor
, panel
->normalfont
,
525 ofx
+i
, ofy
+j
, text
, tlen
);
527 WMDrawString(wmscr
, d
, blackcolor
, panel
->normalfont
, ofx
, ofy
,
531 WMReleasePixmap(pixmap
);
532 /* I hope it is better to do not use cache / on my box it is fast nuff */
535 WMReleaseColor(blackcolor
);
536 WMReleaseColor(whitecolor
);
541 buttonCallback(void *self
, void *clientData
)
543 WMButton
*bPtr
= (WMButton
*)self
;
544 IconPanel
*panel
= (IconPanel
*)clientData
;
547 if (bPtr
==panel
->okButton
) {
549 panel
->result
= True
;
550 } else if (bPtr
==panel
->cancelButton
) {
552 panel
->result
= False
;
553 } else if (bPtr
==panel
->previewButton
) {
554 /**** Previewer ****/
555 WMSetButtonEnabled(bPtr
, False
);
556 WMSetListUserDrawItemHeight(panel
->iconList
, 68);
557 WMSetListUserDrawProc(panel
->iconList
, drawIconProc
);
558 WMRedisplayWidget(panel
->iconList
);
559 /* for draw proc to access screen/gc */
560 /*** end preview ***/
563 else if (bPtr
==panel
->chooseButton
) {
566 op
= WMCreateOpenPanel(WMWidgetScreen(bPtr
));
568 if (WMRunModalFilePanelForDirectory(op
, NULL
, "/usr/local", NULL
, NULL
)) {
570 path
= WMGetFilePanelFile(op
);
571 WMSetTextFieldText(panel
->fileField
, path
);
572 setViewedImage(panel
, path
);
575 WMDestroyFilePanel(op
);
582 keyPressHandler(XEvent
*event
, void *data
)
584 IconPanel
*panel
= (IconPanel
*)data
;
593 if (event
->type
== KeyRelease
)
597 count
= XLookupString(&event
->xkey
, buffer
, sizeof(buffer
), &ksym
, NULL
);
600 iidx
= WMGetListSelectedItemRow(panel
->iconList
);
601 didx
= WMGetListSelectedItemRow(panel
->dirList
);
609 list
= panel
->iconList
;
612 if (iidx
< WMGetListNumberOfRows(panel
->iconList
) - 1)
616 list
= panel
->iconList
;
620 list
= panel
->iconList
;
623 item
= WMGetListNumberOfRows(panel
->iconList
) - 1;
624 list
= panel
->iconList
;
627 if (didx
< WMGetListNumberOfRows(panel
->dirList
) - 1)
631 list
= panel
->dirList
;
638 list
= panel
->dirList
;
641 WMPerformButtonClick(panel
->okButton
);
644 WMPerformButtonClick(panel
->cancelButton
);
649 WMSelectListItem(list
, item
);
650 WMSetListPosition(list
, item
- 5);
651 listCallback(list
, panel
);
658 wIconChooserDialog(WScreen
*scr
, char **file
, char *instance
, char *class)
666 panel
= wmalloc(sizeof(IconPanel
));
667 memset(panel
, 0, sizeof(IconPanel
));
671 panel
->win
= WMCreateWindow(scr
->wmscreen
, "iconChooser");
672 WMResizeWidget(panel
->win
, 450, 280);
674 WMCreateEventHandler(WMWidgetView(panel
->win
), KeyPressMask
|KeyReleaseMask
,
675 keyPressHandler
, panel
);
678 boldFont
= WMBoldSystemFontOfSize(scr
->wmscreen
, 12);
679 panel
->normalfont
= WMSystemFontOfSize(WMWidgetScreen(panel
->win
), 12);
681 panel
->dirLabel
= WMCreateLabel(panel
->win
);
682 WMResizeWidget(panel
->dirLabel
, 200, 20);
683 WMMoveWidget(panel
->dirLabel
, 10, 7);
684 WMSetLabelText(panel
->dirLabel
, _("Directories"));
685 WMSetLabelFont(panel
->dirLabel
, boldFont
);
686 WMSetLabelTextAlignment(panel
->dirLabel
, WACenter
);
688 WMSetLabelRelief(panel
->dirLabel
, WRSunken
);
690 panel
->iconLabel
= WMCreateLabel(panel
->win
);
691 WMResizeWidget(panel
->iconLabel
, 140, 20);
692 WMMoveWidget(panel
->iconLabel
, 215, 7);
693 WMSetLabelText(panel
->iconLabel
, _("Icons"));
694 WMSetLabelFont(panel
->iconLabel
, boldFont
);
695 WMSetLabelTextAlignment(panel
->iconLabel
, WACenter
);
697 WMReleaseFont(boldFont
);
699 color
= WMWhiteColor(scr
->wmscreen
);
700 WMSetLabelTextColor(panel
->dirLabel
, color
);
701 WMSetLabelTextColor(panel
->iconLabel
, color
);
702 WMReleaseColor(color
);
704 color
= WMDarkGrayColor(scr
->wmscreen
);
705 WMSetWidgetBackgroundColor(panel
->iconLabel
, color
);
706 WMSetWidgetBackgroundColor(panel
->dirLabel
, color
);
707 WMReleaseColor(color
);
709 WMSetLabelRelief(panel
->iconLabel
, WRSunken
);
711 panel
->dirList
= WMCreateList(panel
->win
);
712 WMResizeWidget(panel
->dirList
, 200, 170);
713 WMMoveWidget(panel
->dirList
, 10, 30);
714 WMSetListAction(panel
->dirList
, listCallback
, panel
);
716 panel
->iconList
= WMCreateList(panel
->win
);
717 WMResizeWidget(panel
->iconList
, 140, 170);
718 WMMoveWidget(panel
->iconList
, 215, 30);
719 WMSetListAction(panel
->iconList
, listCallback
, panel
);
721 WMHangData(panel
->iconList
,panel
);
723 panel
->previewButton
= WMCreateCommandButton(panel
->win
);
724 WMResizeWidget(panel
->previewButton
, 75, 26);
725 WMMoveWidget(panel
->previewButton
, 365, 130);
726 WMSetButtonText(panel
->previewButton
, _("Preview"));
727 WMSetButtonAction(panel
->previewButton
, buttonCallback
, panel
);
729 panel
->iconView
= WMCreateLabel(panel
->win
);
730 WMResizeWidget(panel
->iconView
, 75, 75);
731 WMMoveWidget(panel
->iconView
, 365, 40);
732 WMSetLabelImagePosition(panel
->iconView
, WIPOverlaps
);
733 WMSetLabelRelief(panel
->iconView
, WRSunken
);
734 WMSetLabelTextAlignment(panel
->iconView
, WACenter
);
736 panel
->fileLabel
= WMCreateLabel(panel
->win
);
737 WMResizeWidget(panel
->fileLabel
, 80, 20);
738 WMMoveWidget(panel
->fileLabel
, 10, 210);
739 WMSetLabelText(panel
->fileLabel
, _("File Name:"));
741 panel
->fileField
= WMCreateTextField(panel
->win
);
742 WMSetViewNextResponder(WMWidgetView(panel
->fileField
), WMWidgetView(panel
->win
));
743 WMResizeWidget(panel
->fileField
, 345, 20);
744 WMMoveWidget(panel
->fileField
, 95, 210);
745 WMSetTextFieldEditable(panel
->fileField
, False
);
747 panel
->okButton
= WMCreateCommandButton(panel
->win
);
748 WMResizeWidget(panel
->okButton
, 80, 26);
749 WMMoveWidget(panel
->okButton
, 360, 240);
750 WMSetButtonText(panel
->okButton
, _("OK"));
751 WMSetButtonEnabled(panel
->okButton
, False
);
752 WMSetButtonAction(panel
->okButton
, buttonCallback
, panel
);
754 panel
->cancelButton
= WMCreateCommandButton(panel
->win
);
755 WMResizeWidget(panel
->cancelButton
, 80, 26);
756 WMMoveWidget(panel
->cancelButton
, 270, 240);
757 WMSetButtonText(panel
->cancelButton
, _("Cancel"));
758 WMSetButtonAction(panel
->cancelButton
, buttonCallback
, panel
);
760 panel
->chooseButton
= WMCreateCommandButton(panel
->win
);
761 WMResizeWidget(panel
->chooseButton
, 110, 26);
762 WMMoveWidget(panel
->chooseButton
, 150, 240);
763 WMSetButtonText(panel
->chooseButton
, _("Choose File"));
764 WMSetButtonAction(panel
->chooseButton
, buttonCallback
, panel
);
766 WMRealizeWidget(panel
->win
);
767 WMMapSubwidgets(panel
->win
);
769 parent
= XCreateSimpleWindow(dpy
, scr
->root_win
, 0, 0, 450, 280, 0, 0, 0);
771 XReparentWindow(dpy
, WMWidgetXID(panel
->win
), parent
, 0, 0);
775 int len
= (instance
? strlen(instance
) : 0)
776 + (class ? strlen(class) : 0) + 32;
781 if (tmp
&& (instance
|| class))
782 snprintf(tmp
, len
, "%s [%s.%s]", _("Icon Chooser"), instance
, class);
784 strcpy(tmp
, _("Icon Chooser"));
786 center
= getCenter(scr
, 450, 280);
788 wwin
= wManageInternalWindow(scr
, parent
, None
, tmp
, center
.x
,center
.y
,
793 /* put icon paths in the list */
794 listIconPaths(panel
->dirList
);
796 WMMapWidget(panel
->win
);
800 while (!panel
->done
) {
803 WMNextEvent(dpy
, &event
);
804 WMHandleEvent(&event
);
808 char *defaultPath
, *wantedPath
;
810 /* check if the file the user selected is not the one that
811 * would be loaded by default with the current search path */
812 *file
= WMGetListSelectedItem(panel
->iconList
)->text
;
817 defaultPath
= FindImage(wPreferences
.icon_path
, *file
);
818 wantedPath
= WMGetTextFieldText(panel
->fileField
);
819 /* if the file is not the default, use full path */
820 if (strcmp(wantedPath
, defaultPath
)!=0) {
823 *file
= wstrdup(*file
);
832 WMReleaseFont(panel
->normalfont
);
834 WMUnmapWidget(panel
->win
);
836 WMDestroyWidget(panel
->win
);
838 wUnmanageWindow(wwin
, False
, False
);
842 XDestroyWindow(dpy
, parent
);
844 return panel
->result
;
849 ***********************************************************************
851 ***********************************************************************
886 #define COPYRIGHT_TEXT \
887 "Copyright \xa9 1997-2002 Alfredo K. Kojima <kojima@windowmaker.org>\n"\
888 "Copyright \xa9 1998-2002 Dan Pascu <dan@windowmaker.org>"
892 static InfoPanel
*thePanel
= NULL
;
895 destroyInfoPanel(WCoreWindow
*foo
, void *data
, XEvent
*event
)
898 if (thePanel
->timer
) {
899 WMDeleteTimerHandler(thePanel
->timer
);
901 if (thePanel
->oldPix
) {
902 WMReleasePixmap(thePanel
->oldPix
);
904 if (thePanel
->oldFont
) {
905 WMReleaseFont(thePanel
->oldFont
);
907 if (thePanel
->icon
) {
908 RReleaseImage(thePanel
->icon
);
911 RReleaseImage(thePanel
->pic
);
913 #endif /* SILLYNESS */
914 WMUnmapWidget(thePanel
);
916 wUnmanageWindow(thePanel
->wwin
, False
, False
);
918 WMDestroyWidget(thePanel
->win
);
927 renderText(WMScreen
*scr
, char *text
, char *font
, RColor
*from
, RColor
*to
)
929 WMPixmap
*wpix
= NULL
;
932 RContext
*rc
= WMScreenRContext(scr
);
933 XFontStruct
*f
= NULL
;
937 f
= XLoadQueryFont(dpy
, font
);
941 w
= XTextWidth(f
, text
, strlen(text
));
942 h
= f
->ascent
+f
->descent
;
944 mask
= XCreatePixmap(dpy
, rc
->drawable
, w
, h
, 1);
945 gc
= XCreateGC(dpy
, mask
, 0, NULL
);
946 XSetForeground(dpy
, gc
, 0);
947 XSetFont(dpy
, gc
, f
->fid
);
948 XFillRectangle(dpy
, mask
, gc
, 0, 0, w
, h
);
950 XSetForeground(dpy
, gc
, 1);
951 XDrawString(dpy
, mask
, gc
, 0, f
->ascent
, text
, strlen(text
));
952 XSetLineAttributes(dpy
, gc
, 3, LineSolid
, CapRound
, JoinMiter
);
953 XDrawLine(dpy
, mask
, gc
, 0, h
-2, w
, h
-2);
955 grad
= XCreatePixmap(dpy
, rc
->drawable
, w
, h
, rc
->depth
);
959 color
= WMBlackColor(scr
);
960 XFillRectangle(dpy
, grad
, WMColorGC(color
), 0, 0, w
, h
);
961 WMReleaseColor(color
);
964 wpix
= WMCreatePixmapFromXPixmaps(scr
, grad
, mask
, w
, h
, rc
->depth
);
975 extern WMPixmap
*DoXThing();
976 extern Bool
InitXThing();
979 logoPushCallback(void *data
)
981 InfoPanel
*panel
= (InfoPanel
*)data
;
986 static int jingobeu
[] = {
987 329, 150, -1, 100, 329, 150, -1, 100, 329, 300, -1, 250,
988 329, 150, -1, 100, 329, 150, -1, 100, 329, 300, -1, 250,
989 329, 150, 392, 150, 261, 150, 293, 150, 329, 400, -1, 400, 0
995 XKeyboardState ksave
;
996 unsigned long mask
= KBBellPitch
|KBBellDuration
|KBBellPercent
;
998 XGetKeyboardControl(dpy
, &ksave
);
1001 if(jingobeu
[panel
->x
-1]==0) {
1003 } else if (jingobeu
[panel
->x
-1]<0) {
1005 c
=jingobeu
[panel
->x
-1]/50;
1009 kc
.bell_pitch
=jingobeu
[panel
->x
-1];
1011 kc
.bell_duration
=jingobeu
[panel
->x
-1];
1012 c
=jingobeu
[panel
->x
-1]/50;
1014 XChangeKeyboardControl(dpy
, mask
, &kc
);
1021 if (!(panel
->cycle
% 4)) {
1024 p
= DoXThing(panel
->wwin
);
1025 WMSetLabelImage(panel
->logoL
, p
);
1027 kc
.bell_pitch
= ksave
.bell_pitch
;
1028 kc
.bell_percent
= ksave
.bell_percent
;
1029 kc
.bell_duration
= ksave
.bell_duration
;
1030 XChangeKeyboardControl(dpy
, mask
, &kc
);
1031 } else if (panel
->cycle
< 30) {
1036 gray
.red
= 0xae; gray
.green
= 0xaa;
1037 gray
.blue
= 0xae; gray
.alpha
= 0;
1039 image
= RScaleImage(panel
->icon
, panel
->pic
->width
, panel
->pic
->height
);
1040 RCombineImagesWithOpaqueness(image
, panel
->pic
, panel
->cycle
*255/30);
1041 pix
= WMCreateBlendedPixmapFromRImage(panel
->scr
->wmscreen
, image
, &gray
);
1042 RReleaseImage(image
);
1043 WMSetLabelImage(panel
->logoL
, pix
);
1044 WMReleasePixmap(pix
);
1047 /* slow down text a little */
1048 i
= (int)(panel
->cycle
* 50.0/85.0)%200;
1051 len
= strlen(panel
->str
);
1053 strncpy(buffer
, panel
->str
, i
<len
? i
: len
);
1055 memset(&buffer
[len
], ' ', i
-len
);
1057 strncpy(buffer
, panel
->str
, i
<len
? i
: len
);
1059 memset(&buffer
[len
], ' ', i
-len
);
1062 WMSetLabelText(panel
->versionL
, buffer
);
1064 XFlush(WMScreenDisplay(WMWidgetScreen(panel
->versionL
)));
1069 panel
->timer
= WMAddTimerHandler(50, logoPushCallback
, panel
);
1075 handleLogoPush(XEvent
*event
, void *data
)
1077 InfoPanel
*panel
= (InfoPanel
*)data
;
1078 static int broken
= 0;
1079 static int clicks
= 0;
1080 static char *pic_data
[] = {
1139 " ............... ",
1140 " ....XoO+@##+O$%.... ",
1141 " ...%X&*========-;;:o... ",
1142 " ...>.>,<122222222222134@... ",
1143 " ..>5678912222222222222220q%.. ",
1144 " ..$.&-w2222222222222222222er>.. ",
1145 " ..O.t31222222222222222222222y4>.. ",
1146 " ...O5u3222222222222222222222222yri... ",
1147 " ..>p&a22222222222222222222222222wso.. ",
1148 " ..ids91222222222222222222222222222wfi.. ",
1149 " ..X.7w222222wgs-w2222222213=g0222222<hi.. ",
1150 " ..Xuj2222222<@X5=222222229k@l:022222y4i.. ",
1151 " .Xdz22222222*X%.s22222222axo%$-222222<c>.. ",
1152 " ..o7y22222222v...r222222223hX.i82222221si.. ",
1153 "..io*222222222&...u22222222yt..%*22222220:%. ",
1154 "..>k02222222227...f222222222v..X=222222229t. ",
1155 "..dz12222222220ui:y2222222223d%qw222222221g. ",
1156 ".%vw222222222221y2222222222219*y2222222222wd.",
1157 ".X;2222222222222222222222222222222222222222b.",
1158 ".i*2222222222222222222222222222222222222222v.",
1159 ".i*2222222222222222222222222222222222222222;.",
1160 ".i*22222222222222222222222222222222222222228.",
1161 ".>*2222222222222222222222222222222222222222=.",
1162 ".i*22222222222222222222222222222222222222228.",
1163 ".i*2222222222222222222222222222222222222222;.",
1164 ".X*222222222222222222222222222222we12222222r.",
1165 ".Xs12222222w3aw22222222222222222y8s0222222wk.",
1166 ".Xq02222222a,na22222222222222222zm6zwy2222gi.",
1167 "..>*22222y<:Xcj22222222222222222-o$k;;02228..",
1168 "..i7y2220rhX.:y22222222222222222jtiXd,a220,..",
1169 " .X@z222a,do%kj2222222222222222wMX5q;gw228%..",
1170 " ..58222wagsh6ry222222222222221;>Of0w222y:...",
1171 " ...:e2222218mdz22222222222222a&$vw222220@...",
1172 " ...O-122222y:.u02222222222229q$uj222221r... ",
1173 " ..%&a1222223&573w2222222219NOxz122221z>... ",
1174 " ...t3222221-l$nr8ay1222yzbo,=12222w-5... ",
1175 " ..X:022222w-k+>o,7s**s7xOn=12221<f5... ",
1176 " ..o:9222221j8:&Bl>>>>ihv<12221=dX... ",
1177 " ..Xb9122222109g-****;<y22221zn%... ",
1178 " ..X&801222222222222222222w-h.... ",
1179 " ...o:=022222222222222221=lX... ",
1180 " ..X@:;3w2222222222210fO... ",
1181 " ...XX&v8<30000003-N@... ",
1182 " .....XmnbN:q&Bo.... ",
1185 static char *msgs
[] = {
1187 "Focus follow mouse users will burn in hell!!!",
1189 "Hi! My name is bobby...",
1190 "AHH! The neurotic monkeys are after me!",
1192 "HOW ARE YOU GENTLEMEN?",
1194 "SOMEBODY SET UP US THE BOMB",
1195 "ALL YOUR BASE ARE BELONG TO US!",
1196 "Oh My God!!! Larry is back!"
1202 if (!panel
->timer
&& !broken
&& clicks
> 0) {
1208 panel
->icon
= WMGetApplicationIconImage(panel
->scr
->wmscreen
);
1215 color
.red
= 0xae; color
.green
= 0xaa;
1216 color
.blue
= 0xae; color
.alpha
= 0;
1218 panel
->icon
= RCloneImage(panel
->icon
);
1219 RCombineImageWithColor(panel
->icon
, &color
);
1223 panel
->pic
= RGetImageFromXPMData(panel
->scr
->rcontext
, pic_data
);
1226 RReleaseImage(panel
->icon
);
1232 panel
->str
= msgs
[rand()%(sizeof(msgs
)/sizeof(char*))];
1234 panel
->timer
= WMAddTimerHandler(50, logoPushCallback
, panel
);
1236 panel
->oldPix
= WMRetainPixmap(WMGetLabelImage(panel
->logoL
));
1237 /* If we don't use a fixed font, scrolling will be jumpy */
1238 /* Alternatively we can draw text in a pixmap and scroll it smoothly */
1239 if ((panel
->oldFont
= WMGetLabelFont(panel
->versionL
))!=NULL
)
1240 WMRetainFont(panel
->oldFont
);
1241 font
= WMCreateFont(WMWidgetScreen(panel
->versionL
), "-*-fixed-*-*-*-*-14-*-*-*-*-*-*-*");
1243 WMSetLabelFont(panel
->versionL
, font
);
1244 WMReleaseFont(font
);
1246 WMSetLabelText(panel
->versionL
, "");
1247 } else if (panel
->timer
) {
1252 WMSetLabelImage(panel
->logoL
, panel
->oldPix
);
1253 WMReleasePixmap(panel
->oldPix
);
1254 panel
->oldPix
= NULL
;
1256 WMDeleteTimerHandler(panel
->timer
);
1257 panel
->timer
= NULL
;
1259 WMSetLabelFont(panel
->versionL
, panel
->oldFont
);
1260 if (panel
->oldFont
) {
1261 WMReleaseFont(panel
->oldFont
);
1262 panel
->oldFont
= NULL
;
1264 snprintf(version
, sizeof(version
), _("Version %s"), VERSION
);
1265 WMSetLabelText(panel
->versionL
, version
);
1266 XFlush(WMScreenDisplay(WMWidgetScreen(panel
->versionL
)));
1271 while (XCheckTypedWindowEvent(dpy
, WMWidgetXID(panel
->versionL
),
1275 #endif /* SILLYNESS */
1279 wShowInfoPanel(WScreen
*scr
)
1285 char *strbuf
= NULL
;
1289 RColor color1
, color2
;
1303 if (thePanel
->scr
== scr
) {
1304 wRaiseFrame(thePanel
->wwin
->frame
->core
);
1305 wSetFocusTo(scr
, thePanel
->wwin
);
1310 panel
= wmalloc(sizeof(InfoPanel
));
1311 memset(panel
, 0, sizeof(InfoPanel
));
1315 panel
->win
= WMCreateWindow(scr
->wmscreen
, "info");
1316 WMResizeWidget(panel
->win
, 382, 230);
1318 logo
= WMCreateApplicationIconBlendedPixmap(scr
->wmscreen
, (RColor
*)NULL
);
1320 logo
= WMRetainPixmap(WMGetApplicationIconPixmap(scr
->wmscreen
));
1323 size
= WMGetPixmapSize(logo
);
1324 panel
->logoL
= WMCreateLabel(panel
->win
);
1325 WMResizeWidget(panel
->logoL
, 64, 64);
1326 WMMoveWidget(panel
->logoL
, 30, 20);
1327 WMSetLabelImagePosition(panel
->logoL
, WIPImageOnly
);
1328 WMSetLabelImage(panel
->logoL
, logo
);
1330 WMCreateEventHandler(WMWidgetView(panel
->logoL
), ButtonPressMask
,
1331 handleLogoPush
, panel
);
1333 WMReleasePixmap(logo
);
1336 panel
->name1L
= WMCreateLabel(panel
->win
);
1337 WMResizeWidget(panel
->name1L
, 240, 30);
1338 WMMoveWidget(panel
->name1L
, 100, 30);
1343 color2
.green
= 0x50;
1345 logo
= renderText(scr
->wmscreen
, "Window Maker",
1346 "-*-utopia-*-r-*-*-25-*", &color1
, &color2
);
1348 WMSetLabelImagePosition(panel
->name1L
, WIPImageOnly
);
1349 WMSetLabelImage(panel
->name1L
, logo
);
1350 WMReleasePixmap(logo
);
1352 font
= WMBoldSystemFontOfSize(scr
->wmscreen
, 20);
1354 WMSetLabelFont(panel
->name1L
, font
);
1355 WMReleaseFont(font
);
1357 WMSetLabelTextAlignment(panel
->name1L
, WACenter
);
1358 WMSetLabelText(panel
->name1L
, "Window Maker");
1361 panel
->name2L
= WMCreateLabel(panel
->win
);
1362 WMResizeWidget(panel
->name2L
, 240, 24);
1363 WMMoveWidget(panel
->name2L
, 100, 60);
1364 font
= WMBoldSystemFontOfSize(scr
->wmscreen
, 18);
1366 WMSetLabelFont(panel
->name2L
, font
);
1367 WMReleaseFont(font
);
1370 WMSetLabelTextAlignment(panel
->name2L
, WACenter
);
1371 WMSetLabelText(panel
->name2L
, _("Window Manager for X"));
1374 snprintf(buffer
, sizeof(buffer
), _("Version %s"), VERSION
);
1375 panel
->versionL
= WMCreateLabel(panel
->win
);
1376 WMResizeWidget(panel
->versionL
, 310, 16);
1377 WMMoveWidget(panel
->versionL
, 30, 95);
1378 WMSetLabelTextAlignment(panel
->versionL
, WARight
);
1379 WMSetLabelText(panel
->versionL
, buffer
);
1380 WMSetLabelWraps(panel
->versionL
, False
);
1382 panel
->copyrL
= WMCreateLabel(panel
->win
);
1383 WMResizeWidget(panel
->copyrL
, 340, 40);
1384 WMMoveWidget(panel
->copyrL
, 15, 185);
1385 WMSetLabelTextAlignment(panel
->copyrL
, WALeft
);
1386 WMSetLabelText(panel
->copyrL
, COPYRIGHT_TEXT
);
1387 /* we want the (c) character in the helvetica font */
1388 font
= WMCreateNormalFont(scr
->wmscreen
, HELVETICA10_FONT
);
1390 WMSetLabelFont(panel
->copyrL
, font
);
1391 WMReleaseFont(font
);
1396 snprintf(buffer
, sizeof(buffer
), _("Using visual 0x%x: %s %ibpp "),
1397 (unsigned)scr
->w_visual
->visualid
,
1398 visuals
[scr
->w_visual
->class], scr
->w_depth
);
1400 strbuf
= wstrappend(strbuf
, buffer
);
1402 switch (scr
->w_depth
) {
1404 strbuf
= wstrappend(strbuf
, _("(32 thousand colors)\n"));
1407 strbuf
= wstrappend(strbuf
, _("(64 thousand colors)\n"));
1411 strbuf
= wstrappend(strbuf
, _("(16 million colors)\n"));
1414 snprintf(buffer
, sizeof(buffer
), _("(%d colors)\n"), 1<<scr
->w_depth
);
1415 strbuf
= wstrappend(strbuf
, buffer
);
1420 #if defined(HAVE_MALLOC_H) && defined(HAVE_MALLINFO)
1422 struct mallinfo ma
= mallinfo();
1423 snprintf(buffer
, sizeof(buffer
),
1424 _("Total allocated memory: %i kB. Total memory in use: %i kB.\n"),
1425 (ma
.arena
+ma
.hblkhd
)/1024, (ma
.uordblks
+ma
.hblkhd
)/1024);
1427 strbuf
= wstrappend(strbuf
, buffer
);
1431 strbuf
= wstrappend(strbuf
, _("Supported image formats: "));
1432 strl
= RSupportedFileFormats();
1433 for (i
=0; strl
[i
]!=NULL
; i
++) {
1434 strbuf
= wstrappend(strbuf
, strl
[i
]);
1435 strbuf
= wstrappend(strbuf
, " ");
1438 strbuf
= wstrappend(strbuf
, _("\nAdditional support for: "));
1451 list
[j
++] = "GNOME";
1458 for (i
= 0; i
< j
; i
++) {
1461 strcat(buf
, _(" and "));
1465 strcat(buf
, list
[i
]);
1467 strbuf
= wstrappend(strbuf
, buf
);
1470 if (wPreferences
.no_sound
) {
1471 strbuf
= wstrappend(strbuf
, _("\nSound disabled"));
1473 strbuf
= wstrappend(strbuf
, _("\nSound enabled"));
1477 panel
->infoL
= WMCreateLabel(panel
->win
);
1478 WMResizeWidget(panel
->infoL
, 350, 75);
1479 WMMoveWidget(panel
->infoL
, 15, 115);
1480 WMSetLabelText(panel
->infoL
, strbuf
);
1481 font
= WMCreateFont(scr
->wmscreen
, HELVETICA10_FONT
);
1483 WMSetLabelFont(panel
->infoL
, font
);
1484 WMReleaseFont(font
);
1490 WMRealizeWidget(panel
->win
);
1491 WMMapSubwidgets(panel
->win
);
1493 parent
= XCreateSimpleWindow(dpy
, scr
->root_win
, 0, 0, 382, 230, 0, 0, 0);
1495 XReparentWindow(dpy
, WMWidgetXID(panel
->win
), parent
, 0, 0);
1497 WMMapWidget(panel
->win
);
1500 WMPoint center
= getCenter(scr
, 382, 230);
1502 wwin
= wManageInternalWindow(scr
, parent
, None
, _("Info"),
1507 WSETUFLAG(wwin
, no_closable
, 0);
1508 WSETUFLAG(wwin
, no_close_button
, 0);
1509 #ifdef XKB_BUTTON_HINT
1510 wFrameWindowHideButton(wwin
->frame
, WFF_LANGUAGE_BUTTON
);
1512 wWindowUpdateButtonImages(wwin
);
1513 wFrameWindowShowButton(wwin
->frame
, WFF_RIGHT_BUTTON
);
1514 wwin
->frame
->on_click_right
= destroyInfoPanel
;
1522 if (InitXThing(panel
->scr
)) {
1523 panel
->timer
= WMAddTimerHandler(100, logoPushCallback
, panel
);
1526 panel
->str
= _("Merry Christmas!");
1527 panel
->oldPix
= WMRetainPixmap(WMGetLabelImage(panel
->logoL
));
1534 ***********************************************************************
1536 ***********************************************************************
1550 static LegalPanel
*legalPanel
= NULL
;
1553 destroyLegalPanel(WCoreWindow
*foo
, void *data
, XEvent
*event
)
1555 WMUnmapWidget(legalPanel
->win
);
1557 WMDestroyWidget(legalPanel
->win
);
1559 wUnmanageWindow(legalPanel
->wwin
, False
, False
);
1568 wShowLegalPanel(WScreen
*scr
)
1575 if (legalPanel
->scr
== scr
) {
1576 wRaiseFrame(legalPanel
->wwin
->frame
->core
);
1577 wSetFocusTo(scr
, legalPanel
->wwin
);
1582 panel
= wmalloc(sizeof(LegalPanel
));
1586 panel
->win
= WMCreateWindow(scr
->wmscreen
, "legal");
1587 WMResizeWidget(panel
->win
, 420, 250);
1590 panel
->licenseL
= WMCreateLabel(panel
->win
);
1591 WMSetLabelWraps(panel
->licenseL
, True
);
1592 WMResizeWidget(panel
->licenseL
, 400, 230);
1593 WMMoveWidget(panel
->licenseL
, 10, 10);
1594 WMSetLabelTextAlignment(panel
->licenseL
, WALeft
);
1595 WMSetLabelText(panel
->licenseL
,
1596 _(" Window Maker is free software; you can redistribute it and/or\n"
1597 "modify it under the terms of the GNU General Public License as\n"
1598 "published by the Free Software Foundation; either version 2 of the\n"
1599 "License, or (at your option) any later version.\n\n"
1600 " Window Maker is distributed in the hope that it will be useful,\n"
1601 "but WITHOUT ANY WARRANTY; without even the implied warranty\n"
1602 "of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
1603 "See the GNU General Public License for more details.\n\n"
1604 " You should have received a copy of the GNU General Public\n"
1605 "License along with this program; if not, write to the Free Software\n"
1606 "Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA\n"
1607 "02111-1307, USA."));
1608 WMSetLabelRelief(panel
->licenseL
, WRGroove
);
1610 WMRealizeWidget(panel
->win
);
1611 WMMapSubwidgets(panel
->win
);
1613 parent
= XCreateSimpleWindow(dpy
, scr
->root_win
, 0, 0, 420, 250, 0, 0, 0);
1615 XReparentWindow(dpy
, WMWidgetXID(panel
->win
), parent
, 0, 0);
1618 WMPoint center
= getCenter(scr
, 420, 250);
1620 wwin
= wManageInternalWindow(scr
, parent
, None
, _("Legal"),
1625 WSETUFLAG(wwin
, no_closable
, 0);
1626 WSETUFLAG(wwin
, no_close_button
, 0);
1627 wWindowUpdateButtonImages(wwin
);
1628 wFrameWindowShowButton(wwin
->frame
, WFF_RIGHT_BUTTON
);
1629 #ifdef XKB_BUTTON_HINT
1630 wFrameWindowHideButton(wwin
->frame
, WFF_LANGUAGE_BUTTON
);
1632 wwin
->frame
->on_click_right
= destroyLegalPanel
;
1636 WMMapWidget(panel
->win
);
1645 ***********************************************************************
1646 * Crashing Dialog Panel
1647 ***********************************************************************
1650 extern WDDomain
*WDWindowAttributes
;
1653 typedef struct _CrashPanel
{
1654 WMWindow
*win
; /* main window */
1656 WMLabel
*iconL
; /* application icon */
1657 WMLabel
*nameL
; /* title of panel */
1659 WMFrame
*sepF
; /* separator frame */
1661 WMLabel
*noteL
; /* Title of note */
1662 WMLabel
*note2L
; /* body of note with what happened */
1664 WMFrame
*whatF
; /* "what to do next" frame */
1665 WMPopUpButton
*whatP
; /* action selection popup button */
1667 WMButton
*okB
; /* ok button */
1669 Bool done
; /* if finished with this dialog */
1670 int action
; /* what to do after */
1678 handleKeyPress(XEvent
*event
, void *clientData
)
1680 CrashPanel
*panel
= (CrashPanel
*)clientData
;
1682 if (event
->xkey
.keycode
== panel
->retKey
) {
1683 WMPerformButtonClick(panel
->okB
);
1689 okButtonCallback(void *self
, void *clientData
)
1691 CrashPanel
*panel
= (CrashPanel
*)clientData
;
1698 setCrashAction(void *self
, void *clientData
)
1700 WMPopUpButton
*pop
= (WMPopUpButton
*)self
;
1701 CrashPanel
*panel
= (CrashPanel
*)clientData
;
1703 panel
->action
= WMGetPopUpButtonSelectedItem(pop
);
1708 getWindowMakerIconImage(WMScreen
*scr
)
1710 WMPropList
*dict
, *key
, *option
, *value
=NULL
;
1714 WMPLSetCaseSensitive(True
);
1716 key
= WMCreatePLString("Logo.WMPanel");
1717 option
= WMCreatePLString("Icon");
1719 dict
= WMGetFromPLDictionary(WDWindowAttributes
->dictionary
, key
);
1722 value
= WMGetFromPLDictionary(dict
, option
);
1725 WMReleasePropList(key
);
1726 WMReleasePropList(option
);
1728 WMPLSetCaseSensitive(False
);
1730 if (value
&& WMIsPLString(value
)) {
1731 path
= FindImage(wPreferences
.icon_path
, WMGetFromPLString(value
));
1736 gray
.red
= 0xae; gray
.green
= 0xaa;
1737 gray
.blue
= 0xae; gray
.alpha
= 0;
1739 pix
= WMCreateBlendedPixmapFromFile(scr
, path
, &gray
);
1753 wShowCrashingDialogPanel(int whatSig
)
1759 int screen_no
, scr_width
, scr_height
;
1763 panel
= wmalloc(sizeof(CrashPanel
));
1764 memset(panel
, 0, sizeof(CrashPanel
));
1766 screen_no
= DefaultScreen(dpy
);
1767 scr_width
= WidthOfScreen(ScreenOfDisplay(dpy
, screen_no
));
1768 scr_height
= HeightOfScreen(ScreenOfDisplay(dpy
, screen_no
));
1770 scr
= WMCreateScreen(dpy
, screen_no
);
1772 wsyserror(_("cannot open connection for crashing dialog panel. Aborting."));
1776 panel
->retKey
= XKeysymToKeycode(dpy
, XK_Return
);
1778 panel
->win
= WMCreateWindow(scr
, "crashingDialog");
1779 WMResizeWidget(panel
->win
, PWIDTH
, PHEIGHT
);
1780 WMMoveWidget(panel
->win
, (scr_width
- PWIDTH
)/2, (scr_height
- PHEIGHT
)/2);
1782 logo
= getWindowMakerIconImage(scr
);
1784 panel
->iconL
= WMCreateLabel(panel
->win
);
1785 WMResizeWidget(panel
->iconL
, 64, 64);
1786 WMMoveWidget(panel
->iconL
, 10, 10);
1787 WMSetLabelImagePosition(panel
->iconL
, WIPImageOnly
);
1788 WMSetLabelImage(panel
->iconL
, logo
);
1791 panel
->nameL
= WMCreateLabel(panel
->win
);
1792 WMResizeWidget(panel
->nameL
, 190, 18);
1793 WMMoveWidget(panel
->nameL
, 80, 35);
1794 WMSetLabelTextAlignment(panel
->nameL
, WALeft
);
1795 font
= WMBoldSystemFontOfSize(scr
, 18);
1796 WMSetLabelFont(panel
->nameL
, font
);
1797 WMReleaseFont(font
);
1798 WMSetLabelText(panel
->nameL
, _("Fatal error"));
1800 panel
->sepF
= WMCreateFrame(panel
->win
);
1801 WMResizeWidget(panel
->sepF
, PWIDTH
+4, 2);
1802 WMMoveWidget(panel
->sepF
, -2, 80);
1804 panel
->noteL
= WMCreateLabel(panel
->win
);
1805 WMResizeWidget(panel
->noteL
, PWIDTH
-20, 40);
1806 WMMoveWidget(panel
->noteL
, 10, 90);
1807 WMSetLabelTextAlignment(panel
->noteL
, WAJustified
);
1808 #ifdef SYS_SIGLIST_DECLARED
1809 snprintf(buf
, sizeof(buf
), _("Window Maker received signal %i\n(%s)."),
1810 whatSig
, sys_siglist
[whatSig
]);
1812 snprintf(buf
, sizeof(buf
), _("Window Maker received signal %i."), whatSig
);
1814 WMSetLabelText(panel
->noteL
, buf
);
1816 panel
->note2L
= WMCreateLabel(panel
->win
);
1817 WMResizeWidget(panel
->note2L
, PWIDTH
-20, 100);
1818 WMMoveWidget(panel
->note2L
, 10, 130);
1819 WMSetLabelTextAlignment(panel
->note2L
, WALeft
);
1820 WMSetLabelText(panel
->note2L
,
1821 _(" This fatal error occured probably due to a bug."
1822 " Please fill the included BUGFORM and "
1823 "report it to bugs@windowmaker.org."));
1824 WMSetLabelWraps(panel
->note2L
, True
);
1827 panel
->whatF
= WMCreateFrame(panel
->win
);
1828 WMResizeWidget(panel
->whatF
, PWIDTH
-20, 50);
1829 WMMoveWidget(panel
->whatF
, 10, 240);
1830 WMSetFrameTitle(panel
->whatF
, _("What do you want to do now?"));
1832 panel
->whatP
= WMCreatePopUpButton(panel
->whatF
);
1833 WMResizeWidget(panel
->whatP
, PWIDTH
-20-70, 20);
1834 WMMoveWidget(panel
->whatP
, 35, 20);
1835 WMSetPopUpButtonPullsDown(panel
->whatP
, False
);
1836 WMSetPopUpButtonText(panel
->whatP
, _("Select action"));
1837 WMAddPopUpButtonItem(panel
->whatP
, _("Abort and leave a core file"));
1838 WMAddPopUpButtonItem(panel
->whatP
, _("Restart Window Maker"));
1839 WMAddPopUpButtonItem(panel
->whatP
, _("Start alternate window manager"));
1840 WMSetPopUpButtonAction(panel
->whatP
, setCrashAction
, panel
);
1841 WMSetPopUpButtonSelectedItem(panel
->whatP
, WMRestart
);
1842 panel
->action
= WMRestart
;
1844 WMMapSubwidgets(panel
->whatF
);
1846 panel
->okB
= WMCreateCommandButton(panel
->win
);
1847 WMResizeWidget(panel
->okB
, 80, 26);
1848 WMMoveWidget(panel
->okB
, 205, 309);
1849 WMSetButtonText(panel
->okB
, _("OK"));
1850 WMSetButtonImage(panel
->okB
, WMGetSystemPixmap(scr
, WSIReturnArrow
));
1851 WMSetButtonAltImage(panel
->okB
, WMGetSystemPixmap(scr
, WSIHighlightedReturnArrow
));
1852 WMSetButtonImagePosition(panel
->okB
, WIPRight
);
1853 WMSetButtonAction(panel
->okB
, okButtonCallback
, panel
);
1857 WMCreateEventHandler(WMWidgetView(panel
->win
), KeyPressMask
,
1858 handleKeyPress
, panel
);
1860 WMRealizeWidget(panel
->win
);
1861 WMMapSubwidgets(panel
->win
);
1863 WMMapWidget(panel
->win
);
1865 XSetInputFocus(dpy
, WMWidgetXID(panel
->win
), RevertToParent
, CurrentTime
);
1867 while (!panel
->done
) {
1870 WMNextEvent(dpy
, &event
);
1871 WMHandleEvent(&event
);
1874 action
= panel
->action
;
1876 WMUnmapWidget(panel
->win
);
1877 WMDestroyWidget(panel
->win
);
1886 /*****************************************************************************
1887 * About GNUstep Panel
1888 *****************************************************************************/
1892 drawGNUstepLogo(Display
*dpy
, Drawable d
, int width
, int height
,
1893 unsigned long blackPixel
, unsigned long whitePixel
)
1897 XRectangle rects
[3];
1899 gcv
.foreground
= blackPixel
;
1900 gc
= XCreateGC(dpy
, d
, GCForeground
, &gcv
);
1902 XFillArc(dpy
, d
, gc
, width
/45, height
/45,
1903 width
- 2*width
/45, height
- 2*height
/45, 0, 360*64);
1906 rects
[0].y
= 37*height
/45;
1907 rects
[0].width
= width
/3;
1908 rects
[0].height
= height
- rects
[0].y
;
1910 rects
[1].x
= rects
[0].width
;
1911 rects
[1].y
= height
/2;
1912 rects
[1].width
= width
- 2*width
/3;
1913 rects
[1].height
= height
- rects
[1].y
;
1915 rects
[2].x
= 2*width
/3;
1916 rects
[2].y
= height
- 37*height
/45;
1917 rects
[2].width
= width
/3;
1918 rects
[2].height
= height
- rects
[2].y
;
1920 XSetClipRectangles(dpy
, gc
, 0, 0, rects
, 3, Unsorted
);
1921 XFillRectangle(dpy
, d
, gc
, 0, 0, width
, height
);
1923 XSetForeground(dpy
, gc
, whitePixel
);
1924 XFillArc(dpy
, d
, gc
, width
/45, height
/45,
1925 width
- 2*width
/45, height
- 2*height
/45, 0, 360*64);
1943 static GNUstepPanel
*gnustepPanel
= NULL
;
1946 destroyGNUstepPanel(WCoreWindow
*foo
, void *data
, XEvent
*event
)
1948 WMUnmapWidget(gnustepPanel
->win
);
1950 WMDestroyWidget(gnustepPanel
->win
);
1952 wUnmanageWindow(gnustepPanel
->wwin
, False
, False
);
1954 wfree(gnustepPanel
);
1956 gnustepPanel
= NULL
;
1961 wShowGNUstepPanel(WScreen
*scr
)
1963 GNUstepPanel
*panel
;
1970 if (gnustepPanel
->scr
== scr
) {
1971 wRaiseFrame(gnustepPanel
->wwin
->frame
->core
);
1972 wSetFocusTo(scr
, gnustepPanel
->wwin
);
1977 panel
= wmalloc(sizeof(GNUstepPanel
));
1981 panel
->win
= WMCreateWindow(scr
->wmscreen
, "About GNUstep");
1982 WMResizeWidget(panel
->win
, 325, 200);
1984 pixmap
= WMCreatePixmap(scr
->wmscreen
, 130, 130,
1985 WMScreenDepth(scr
->wmscreen
), True
);
1987 color
= WMCreateNamedColor(scr
->wmscreen
, "gray50", True
);
1989 drawGNUstepLogo(dpy
, WMGetPixmapXID(pixmap
), 130, 130,
1990 WMColorPixel(color
), scr
->white_pixel
);
1992 WMReleaseColor(color
);
1994 XSetForeground(dpy
, scr
->mono_gc
, 0);
1995 XFillRectangle(dpy
, WMGetPixmapMaskXID(pixmap
), scr
->mono_gc
, 0, 0,
1997 drawGNUstepLogo(dpy
, WMGetPixmapMaskXID(pixmap
), 130, 130, 1, 1);
1999 panel
->gstepL
= WMCreateLabel(panel
->win
);
2000 WMResizeWidget(panel
->gstepL
, 285, 64);
2001 WMMoveWidget(panel
->gstepL
, 20, 0);
2002 WMSetLabelTextAlignment(panel
->gstepL
, WARight
);
2003 WMSetLabelText(panel
->gstepL
, "GNUstep");
2005 WMFont
*font
= WMBoldSystemFontOfSize(scr
->wmscreen
, 24);
2007 WMSetLabelFont(panel
->gstepL
, font
);
2008 WMReleaseFont(font
);
2011 panel
->textL
= WMCreateLabel(panel
->win
);
2012 WMResizeWidget(panel
->textL
, 275, 130);
2013 WMMoveWidget(panel
->textL
, 30, 50);
2014 WMSetLabelTextAlignment(panel
->textL
, WARight
);
2015 WMSetLabelImagePosition(panel
->textL
, WIPOverlaps
);
2016 WMSetLabelText(panel
->textL
,
2017 _("Window Maker is part of the GNUstep project.\n"\
2018 "The GNUstep project aims to create a free\n"\
2019 "implementation of the OpenStep(tm) specification\n"\
2020 "which is a object-oriented framework for\n"\
2021 "creating advanced graphical, multi-platform\n"\
2022 "applications. Additionally, a development and\n"\
2023 "user desktop enviroment will be created on top\n"\
2024 "of the framework. For more information about\n"\
2025 "GNUstep, please visit: www.gnustep.org"));
2026 WMSetLabelImage(panel
->textL
, pixmap
);
2028 WMReleasePixmap(pixmap
);
2030 WMRealizeWidget(panel
->win
);
2031 WMMapSubwidgets(panel
->win
);
2033 parent
= XCreateSimpleWindow(dpy
, scr
->root_win
, 0, 0, 325, 200, 0, 0, 0);
2035 XReparentWindow(dpy
, WMWidgetXID(panel
->win
), parent
, 0, 0);
2038 WMPoint center
= getCenter(scr
, 325, 200);
2040 wwin
= wManageInternalWindow(scr
, parent
, None
, _("About GNUstep"),
2045 WSETUFLAG(wwin
, no_closable
, 0);
2046 WSETUFLAG(wwin
, no_close_button
, 0);
2047 wWindowUpdateButtonImages(wwin
);
2048 wFrameWindowShowButton(wwin
->frame
, WFF_RIGHT_BUTTON
);
2049 #ifdef XKB_BUTTON_HINT
2050 wFrameWindowHideButton(wwin
->frame
, WFF_LANGUAGE_BUTTON
);
2052 wwin
->frame
->on_click_right
= destroyGNUstepPanel
;
2056 WMMapWidget(panel
->win
);
2060 gnustepPanel
= panel
;