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
, int state
,
444 IconPanel
*panel
= WMGetHangedData(lPtr
);
445 WScreen
*scr
= panel
->scr
;
446 GC gc
= scr
->draw_gc
;
447 GC copygc
= scr
->copy_gc
;
448 char *file
, *dirfile
;
452 WMScreen
*wmscr
= WMWidgetScreen(panel
->win
);
454 int x
, y
, width
, height
, len
;
456 if(!panel
->preview
) return;
460 width
= rect
->size
.width
;
461 height
= rect
->size
.height
;
463 back
= (state
& WLDSSelected
) ? scr
->white
: scr
->gray
;
465 dirfile
= wexpandpath(WMGetListSelectedItem(panel
->dirList
)->text
);
466 len
= strlen(dirfile
)+strlen(text
)+4;
468 snprintf(file
, len
, "%s/%s", dirfile
, text
);
471 color
.red
= WMRedComponentOfColor(back
) >> 8;
472 color
.green
= WMGreenComponentOfColor(back
) >> 8;
473 color
.blue
= WMBlueComponentOfColor(back
) >> 8;
474 color
.alpha
= WMGetColorAlpha(back
) >> 8;
476 pixmap
= WMCreateBlendedPixmapFromFile(wmscr
, file
, &color
);
480 /*WMRemoveListItem(lPtr, index);*/
484 XFillRectangle(dpy
, d
, WMColorGC(back
), x
, y
, width
, height
);
486 XSetClipMask(dpy
, gc
, None
);
487 /*XDrawRectangle(dpy, d, WMColorGC(white), x+5, y+5, width-10, 54);*/
488 XDrawLine(dpy
, d
, WMColorGC(scr
->white
), x
, y
+height
-1, x
+width
, y
+height
-1);
490 size
= WMGetPixmapSize(pixmap
);
492 XSetClipMask(dpy
, copygc
, WMGetPixmapMaskXID(pixmap
));
493 XSetClipOrigin(dpy
, copygc
, x
+ (width
-size
.width
)/2, y
+2);
494 XCopyArea(dpy
, WMGetPixmapXID(pixmap
), d
, copygc
, 0, 0,
495 size
.width
>100?100:size
.width
, size
.height
>64?64:size
.height
,
496 x
+ (width
-size
.width
)/2, y
+2);
500 int fheight
= WMFontHeight(panel
->normalfont
);
501 int tlen
= strlen(text
);
502 int twidth
= WMWidthOfString(panel
->normalfont
, text
, tlen
);
505 ofx
= x
+ (width
- twidth
)/2;
506 ofy
= y
+ 64 - fheight
;
510 WMDrawString(wmscr
, d
, scr
->white
, panel
->normalfont
,
511 ofx
+i
, ofy
+j
, text
, tlen
);
513 WMDrawString(wmscr
, d
, scr
->black
, panel
->normalfont
, ofx
, ofy
,
517 WMReleasePixmap(pixmap
);
518 /* I hope it is better to do not use cache / on my box it is fast nuff */
524 buttonCallback(void *self
, void *clientData
)
526 WMButton
*bPtr
= (WMButton
*)self
;
527 IconPanel
*panel
= (IconPanel
*)clientData
;
530 if (bPtr
==panel
->okButton
) {
532 panel
->result
= True
;
533 } else if (bPtr
==panel
->cancelButton
) {
535 panel
->result
= False
;
536 } else if (bPtr
==panel
->previewButton
) {
537 /**** Previewer ****/
538 WMSetButtonEnabled(bPtr
, False
);
539 WMSetListUserDrawItemHeight(panel
->iconList
, 68);
540 WMSetListUserDrawProc(panel
->iconList
, drawIconProc
);
541 WMRedisplayWidget(panel
->iconList
);
542 /* for draw proc to access screen/gc */
543 /*** end preview ***/
546 else if (bPtr
==panel
->chooseButton
) {
549 op
= WMCreateOpenPanel(WMWidgetScreen(bPtr
));
551 if (WMRunModalFilePanelForDirectory(op
, NULL
, "/usr/local", NULL
, NULL
)) {
553 path
= WMGetFilePanelFile(op
);
554 WMSetTextFieldText(panel
->fileField
, path
);
555 setViewedImage(panel
, path
);
558 WMDestroyFilePanel(op
);
565 keyPressHandler(XEvent
*event
, void *data
)
567 IconPanel
*panel
= (IconPanel
*)data
;
576 if (event
->type
== KeyRelease
)
580 count
= XLookupString(&event
->xkey
, buffer
, sizeof(buffer
), &ksym
, NULL
);
583 iidx
= WMGetListSelectedItemRow(panel
->iconList
);
584 didx
= WMGetListSelectedItemRow(panel
->dirList
);
592 list
= panel
->iconList
;
595 if (iidx
< WMGetListNumberOfRows(panel
->iconList
) - 1)
599 list
= panel
->iconList
;
603 list
= panel
->iconList
;
606 item
= WMGetListNumberOfRows(panel
->iconList
) - 1;
607 list
= panel
->iconList
;
610 if (didx
< WMGetListNumberOfRows(panel
->dirList
) - 1)
614 list
= panel
->dirList
;
621 list
= panel
->dirList
;
624 WMPerformButtonClick(panel
->okButton
);
627 WMPerformButtonClick(panel
->cancelButton
);
632 WMSelectListItem(list
, item
);
633 WMSetListPosition(list
, item
- 5);
634 listCallback(list
, panel
);
641 wIconChooserDialog(WScreen
*scr
, char **file
, char *instance
, char *class)
649 panel
= wmalloc(sizeof(IconPanel
));
650 memset(panel
, 0, sizeof(IconPanel
));
654 panel
->win
= WMCreateWindow(scr
->wmscreen
, "iconChooser");
655 WMResizeWidget(panel
->win
, 450, 280);
657 WMCreateEventHandler(WMWidgetView(panel
->win
), KeyPressMask
|KeyReleaseMask
,
658 keyPressHandler
, panel
);
661 boldFont
= WMBoldSystemFontOfSize(scr
->wmscreen
, 12);
662 panel
->normalfont
= WMSystemFontOfSize(WMWidgetScreen(panel
->win
), 12);
664 panel
->dirLabel
= WMCreateLabel(panel
->win
);
665 WMResizeWidget(panel
->dirLabel
, 200, 20);
666 WMMoveWidget(panel
->dirLabel
, 10, 7);
667 WMSetLabelText(panel
->dirLabel
, _("Directories"));
668 WMSetLabelFont(panel
->dirLabel
, boldFont
);
669 WMSetLabelTextAlignment(panel
->dirLabel
, WACenter
);
671 WMSetLabelRelief(panel
->dirLabel
, WRSunken
);
673 panel
->iconLabel
= WMCreateLabel(panel
->win
);
674 WMResizeWidget(panel
->iconLabel
, 140, 20);
675 WMMoveWidget(panel
->iconLabel
, 215, 7);
676 WMSetLabelText(panel
->iconLabel
, _("Icons"));
677 WMSetLabelFont(panel
->iconLabel
, boldFont
);
678 WMSetLabelTextAlignment(panel
->iconLabel
, WACenter
);
680 WMReleaseFont(boldFont
);
682 color
= WMWhiteColor(scr
->wmscreen
);
683 WMSetLabelTextColor(panel
->dirLabel
, color
);
684 WMSetLabelTextColor(panel
->iconLabel
, color
);
685 WMReleaseColor(color
);
687 color
= WMDarkGrayColor(scr
->wmscreen
);
688 WMSetWidgetBackgroundColor(panel
->iconLabel
, color
);
689 WMSetWidgetBackgroundColor(panel
->dirLabel
, color
);
690 WMReleaseColor(color
);
692 WMSetLabelRelief(panel
->iconLabel
, WRSunken
);
694 panel
->dirList
= WMCreateList(panel
->win
);
695 WMResizeWidget(panel
->dirList
, 200, 170);
696 WMMoveWidget(panel
->dirList
, 10, 30);
697 WMSetListAction(panel
->dirList
, listCallback
, panel
);
699 panel
->iconList
= WMCreateList(panel
->win
);
700 WMResizeWidget(panel
->iconList
, 140, 170);
701 WMMoveWidget(panel
->iconList
, 215, 30);
702 WMSetListAction(panel
->iconList
, listCallback
, panel
);
704 WMHangData(panel
->iconList
,panel
);
706 panel
->previewButton
= WMCreateCommandButton(panel
->win
);
707 WMResizeWidget(panel
->previewButton
, 75, 26);
708 WMMoveWidget(panel
->previewButton
, 365, 130);
709 WMSetButtonText(panel
->previewButton
, _("Preview"));
710 WMSetButtonAction(panel
->previewButton
, buttonCallback
, panel
);
712 panel
->iconView
= WMCreateLabel(panel
->win
);
713 WMResizeWidget(panel
->iconView
, 75, 75);
714 WMMoveWidget(panel
->iconView
, 365, 40);
715 WMSetLabelImagePosition(panel
->iconView
, WIPOverlaps
);
716 WMSetLabelRelief(panel
->iconView
, WRSunken
);
717 WMSetLabelTextAlignment(panel
->iconView
, WACenter
);
719 panel
->fileLabel
= WMCreateLabel(panel
->win
);
720 WMResizeWidget(panel
->fileLabel
, 80, 20);
721 WMMoveWidget(panel
->fileLabel
, 10, 210);
722 WMSetLabelText(panel
->fileLabel
, _("File Name:"));
724 panel
->fileField
= WMCreateTextField(panel
->win
);
725 WMSetViewNextResponder(WMWidgetView(panel
->fileField
), WMWidgetView(panel
->win
));
726 WMResizeWidget(panel
->fileField
, 345, 20);
727 WMMoveWidget(panel
->fileField
, 95, 210);
728 WMSetTextFieldEditable(panel
->fileField
, False
);
730 panel
->okButton
= WMCreateCommandButton(panel
->win
);
731 WMResizeWidget(panel
->okButton
, 80, 26);
732 WMMoveWidget(panel
->okButton
, 360, 240);
733 WMSetButtonText(panel
->okButton
, _("OK"));
734 WMSetButtonEnabled(panel
->okButton
, False
);
735 WMSetButtonAction(panel
->okButton
, buttonCallback
, panel
);
737 panel
->cancelButton
= WMCreateCommandButton(panel
->win
);
738 WMResizeWidget(panel
->cancelButton
, 80, 26);
739 WMMoveWidget(panel
->cancelButton
, 270, 240);
740 WMSetButtonText(panel
->cancelButton
, _("Cancel"));
741 WMSetButtonAction(panel
->cancelButton
, buttonCallback
, panel
);
743 panel
->chooseButton
= WMCreateCommandButton(panel
->win
);
744 WMResizeWidget(panel
->chooseButton
, 110, 26);
745 WMMoveWidget(panel
->chooseButton
, 150, 240);
746 WMSetButtonText(panel
->chooseButton
, _("Choose File"));
747 WMSetButtonAction(panel
->chooseButton
, buttonCallback
, panel
);
749 WMRealizeWidget(panel
->win
);
750 WMMapSubwidgets(panel
->win
);
752 parent
= XCreateSimpleWindow(dpy
, scr
->root_win
, 0, 0, 450, 280, 0, 0, 0);
754 XReparentWindow(dpy
, WMWidgetXID(panel
->win
), parent
, 0, 0);
758 int len
= (instance
? strlen(instance
) : 0)
759 + (class ? strlen(class) : 0) + 32;
764 if (tmp
&& (instance
|| class))
765 snprintf(tmp
, len
, "%s [%s.%s]", _("Icon Chooser"), instance
, class);
767 strcpy(tmp
, _("Icon Chooser"));
769 center
= getCenter(scr
, 450, 280);
771 wwin
= wManageInternalWindow(scr
, parent
, None
, tmp
, center
.x
,center
.y
,
776 /* put icon paths in the list */
777 listIconPaths(panel
->dirList
);
779 WMMapWidget(panel
->win
);
783 while (!panel
->done
) {
786 WMNextEvent(dpy
, &event
);
787 WMHandleEvent(&event
);
791 char *defaultPath
, *wantedPath
;
793 /* check if the file the user selected is not the one that
794 * would be loaded by default with the current search path */
795 *file
= WMGetListSelectedItem(panel
->iconList
)->text
;
800 defaultPath
= FindImage(wPreferences
.icon_path
, *file
);
801 wantedPath
= WMGetTextFieldText(panel
->fileField
);
802 /* if the file is not the default, use full path */
803 if (strcmp(wantedPath
, defaultPath
)!=0) {
806 *file
= wstrdup(*file
);
815 WMReleaseFont(panel
->normalfont
);
817 WMUnmapWidget(panel
->win
);
819 WMDestroyWidget(panel
->win
);
821 wUnmanageWindow(wwin
, False
, False
);
825 XDestroyWindow(dpy
, parent
);
827 return panel
->result
;
832 ***********************************************************************
834 ***********************************************************************
869 #define COPYRIGHT_TEXT \
870 "Copyright \xa9 1997-2002 Alfredo K. Kojima <kojima@windowmaker.org>\n"\
871 "Copyright \xa9 1998-2002 Dan Pascu <dan@windowmaker.org>"
875 static InfoPanel
*thePanel
= NULL
;
878 destroyInfoPanel(WCoreWindow
*foo
, void *data
, XEvent
*event
)
881 if (thePanel
->timer
) {
882 WMDeleteTimerHandler(thePanel
->timer
);
884 if (thePanel
->oldPix
) {
885 WMReleasePixmap(thePanel
->oldPix
);
887 if (thePanel
->oldFont
) {
888 WMReleaseFont(thePanel
->oldFont
);
890 if (thePanel
->icon
) {
891 RReleaseImage(thePanel
->icon
);
894 RReleaseImage(thePanel
->pic
);
896 #endif /* SILLYNESS */
897 WMUnmapWidget(thePanel
);
899 wUnmanageWindow(thePanel
->wwin
, False
, False
);
901 WMDestroyWidget(thePanel
->win
);
910 renderText(WMScreen
*scr
, char *text
, char *font
, RColor
*from
, RColor
*to
)
912 WMPixmap
*wpix
= NULL
;
915 RContext
*rc
= WMScreenRContext(scr
);
916 XFontStruct
*f
= NULL
;
920 f
= XLoadQueryFont(dpy
, font
);
924 w
= XTextWidth(f
, text
, strlen(text
));
925 h
= f
->ascent
+f
->descent
;
927 mask
= XCreatePixmap(dpy
, rc
->drawable
, w
, h
, 1);
928 gc
= XCreateGC(dpy
, mask
, 0, NULL
);
929 XSetForeground(dpy
, gc
, 0);
930 XSetFont(dpy
, gc
, f
->fid
);
931 XFillRectangle(dpy
, mask
, gc
, 0, 0, w
, h
);
933 XSetForeground(dpy
, gc
, 1);
934 XDrawString(dpy
, mask
, gc
, 0, f
->ascent
, text
, strlen(text
));
935 XSetLineAttributes(dpy
, gc
, 3, LineSolid
, CapRound
, JoinMiter
);
936 XDrawLine(dpy
, mask
, gc
, 0, h
-2, w
, h
-2);
938 grad
= XCreatePixmap(dpy
, rc
->drawable
, w
, h
, rc
->depth
);
942 color
= WMBlackColor(scr
);
943 XFillRectangle(dpy
, grad
, WMColorGC(color
), 0, 0, w
, h
);
944 WMReleaseColor(color
);
947 wpix
= WMCreatePixmapFromXPixmaps(scr
, grad
, mask
, w
, h
, rc
->depth
);
958 extern WMPixmap
*DoXThing();
959 extern Bool
InitXThing();
962 logoPushCallback(void *data
)
964 InfoPanel
*panel
= (InfoPanel
*)data
;
969 static int jingobeu
[] = {
970 329, 150, -1, 100, 329, 150, -1, 100, 329, 300, -1, 250,
971 329, 150, -1, 100, 329, 150, -1, 100, 329, 300, -1, 250,
972 329, 150, 392, 150, 261, 150, 293, 150, 329, 400, -1, 400, 0
978 XKeyboardState ksave
;
979 unsigned long mask
= KBBellPitch
|KBBellDuration
|KBBellPercent
;
981 XGetKeyboardControl(dpy
, &ksave
);
984 if(jingobeu
[panel
->x
-1]==0) {
986 } else if (jingobeu
[panel
->x
-1]<0) {
988 c
=jingobeu
[panel
->x
-1]/50;
992 kc
.bell_pitch
=jingobeu
[panel
->x
-1];
994 kc
.bell_duration
=jingobeu
[panel
->x
-1];
995 c
=jingobeu
[panel
->x
-1]/50;
997 XChangeKeyboardControl(dpy
, mask
, &kc
);
1004 if (!(panel
->cycle
% 4)) {
1007 p
= DoXThing(panel
->wwin
);
1008 WMSetLabelImage(panel
->logoL
, p
);
1010 kc
.bell_pitch
= ksave
.bell_pitch
;
1011 kc
.bell_percent
= ksave
.bell_percent
;
1012 kc
.bell_duration
= ksave
.bell_duration
;
1013 XChangeKeyboardControl(dpy
, mask
, &kc
);
1014 } else if (panel
->cycle
< 30) {
1019 gray
.red
= 0xae; gray
.green
= 0xaa;
1020 gray
.blue
= 0xae; gray
.alpha
= 0;
1022 image
= RScaleImage(panel
->icon
, panel
->pic
->width
, panel
->pic
->height
);
1023 RCombineImagesWithOpaqueness(image
, panel
->pic
, panel
->cycle
*255/30);
1024 pix
= WMCreateBlendedPixmapFromRImage(panel
->scr
->wmscreen
, image
, &gray
);
1025 RReleaseImage(image
);
1026 WMSetLabelImage(panel
->logoL
, pix
);
1027 WMReleasePixmap(pix
);
1030 /* slow down text a little */
1031 i
= (int)(panel
->cycle
* 50.0/85.0)%200;
1034 len
= strlen(panel
->str
);
1036 strncpy(buffer
, panel
->str
, i
<len
? i
: len
);
1038 memset(&buffer
[len
], ' ', i
-len
);
1040 strncpy(buffer
, panel
->str
, i
<len
? i
: len
);
1042 memset(&buffer
[len
], ' ', i
-len
);
1045 WMSetLabelText(panel
->versionL
, buffer
);
1047 XFlush(WMScreenDisplay(WMWidgetScreen(panel
->versionL
)));
1052 panel
->timer
= WMAddTimerHandler(50, logoPushCallback
, panel
);
1058 handleLogoPush(XEvent
*event
, void *data
)
1060 InfoPanel
*panel
= (InfoPanel
*)data
;
1061 static int broken
= 0;
1062 static int clicks
= 0;
1063 static char *pic_data
[] = {
1122 " ............... ",
1123 " ....XoO+@##+O$%.... ",
1124 " ...%X&*========-;;:o... ",
1125 " ...>.>,<122222222222134@... ",
1126 " ..>5678912222222222222220q%.. ",
1127 " ..$.&-w2222222222222222222er>.. ",
1128 " ..O.t31222222222222222222222y4>.. ",
1129 " ...O5u3222222222222222222222222yri... ",
1130 " ..>p&a22222222222222222222222222wso.. ",
1131 " ..ids91222222222222222222222222222wfi.. ",
1132 " ..X.7w222222wgs-w2222222213=g0222222<hi.. ",
1133 " ..Xuj2222222<@X5=222222229k@l:022222y4i.. ",
1134 " .Xdz22222222*X%.s22222222axo%$-222222<c>.. ",
1135 " ..o7y22222222v...r222222223hX.i82222221si.. ",
1136 "..io*222222222&...u22222222yt..%*22222220:%. ",
1137 "..>k02222222227...f222222222v..X=222222229t. ",
1138 "..dz12222222220ui:y2222222223d%qw222222221g. ",
1139 ".%vw222222222221y2222222222219*y2222222222wd.",
1140 ".X;2222222222222222222222222222222222222222b.",
1141 ".i*2222222222222222222222222222222222222222v.",
1142 ".i*2222222222222222222222222222222222222222;.",
1143 ".i*22222222222222222222222222222222222222228.",
1144 ".>*2222222222222222222222222222222222222222=.",
1145 ".i*22222222222222222222222222222222222222228.",
1146 ".i*2222222222222222222222222222222222222222;.",
1147 ".X*222222222222222222222222222222we12222222r.",
1148 ".Xs12222222w3aw22222222222222222y8s0222222wk.",
1149 ".Xq02222222a,na22222222222222222zm6zwy2222gi.",
1150 "..>*22222y<:Xcj22222222222222222-o$k;;02228..",
1151 "..i7y2220rhX.:y22222222222222222jtiXd,a220,..",
1152 " .X@z222a,do%kj2222222222222222wMX5q;gw228%..",
1153 " ..58222wagsh6ry222222222222221;>Of0w222y:...",
1154 " ...:e2222218mdz22222222222222a&$vw222220@...",
1155 " ...O-122222y:.u02222222222229q$uj222221r... ",
1156 " ..%&a1222223&573w2222222219NOxz122221z>... ",
1157 " ...t3222221-l$nr8ay1222yzbo,=12222w-5... ",
1158 " ..X:022222w-k+>o,7s**s7xOn=12221<f5... ",
1159 " ..o:9222221j8:&Bl>>>>ihv<12221=dX... ",
1160 " ..Xb9122222109g-****;<y22221zn%... ",
1161 " ..X&801222222222222222222w-h.... ",
1162 " ...o:=022222222222222221=lX... ",
1163 " ..X@:;3w2222222222210fO... ",
1164 " ...XX&v8<30000003-N@... ",
1165 " .....XmnbN:q&Bo.... ",
1168 static char *msgs
[] = {
1170 "Focus follow mouse users will burn in hell!!!",
1172 "Hi! My name is bobby...",
1173 "AHH! The neurotic monkeys are after me!",
1175 "HOW ARE YOU GENTLEMEN?",
1177 "SOMEBODY SET UP US THE BOMB",
1178 "ALL YOUR BASE ARE BELONG TO US!",
1179 "Oh My God!!! Larry is back!"
1185 if (!panel
->timer
&& !broken
&& clicks
> 0) {
1191 panel
->icon
= WMGetApplicationIconImage(panel
->scr
->wmscreen
);
1198 color
.red
= 0xae; color
.green
= 0xaa;
1199 color
.blue
= 0xae; color
.alpha
= 0;
1201 panel
->icon
= RCloneImage(panel
->icon
);
1202 RCombineImageWithColor(panel
->icon
, &color
);
1206 panel
->pic
= RGetImageFromXPMData(panel
->scr
->rcontext
, pic_data
);
1209 RReleaseImage(panel
->icon
);
1215 panel
->str
= msgs
[rand()%(sizeof(msgs
)/sizeof(char*))];
1217 panel
->timer
= WMAddTimerHandler(50, logoPushCallback
, panel
);
1219 panel
->oldPix
= WMRetainPixmap(WMGetLabelImage(panel
->logoL
));
1220 /* If we don't use a fixed font, scrolling will be jumpy */
1221 /* Alternatively we can draw text in a pixmap and scroll it smoothly */
1222 if ((panel
->oldFont
= WMGetLabelFont(panel
->versionL
))!=NULL
)
1223 WMRetainFont(panel
->oldFont
);
1224 font
= WMCreateFont(WMWidgetScreen(panel
->versionL
), "-*-fixed-*-*-*-*-14-*-*-*-*-*-*-*");
1226 WMSetLabelFont(panel
->versionL
, font
);
1227 WMReleaseFont(font
);
1229 WMSetLabelText(panel
->versionL
, "");
1230 } else if (panel
->timer
) {
1235 WMSetLabelImage(panel
->logoL
, panel
->oldPix
);
1236 WMReleasePixmap(panel
->oldPix
);
1237 panel
->oldPix
= NULL
;
1239 WMDeleteTimerHandler(panel
->timer
);
1240 panel
->timer
= NULL
;
1242 WMSetLabelFont(panel
->versionL
, panel
->oldFont
);
1243 if (panel
->oldFont
) {
1244 WMReleaseFont(panel
->oldFont
);
1245 panel
->oldFont
= NULL
;
1247 snprintf(version
, sizeof(version
), _("Version %s"), VERSION
);
1248 WMSetLabelText(panel
->versionL
, version
);
1249 XFlush(WMScreenDisplay(WMWidgetScreen(panel
->versionL
)));
1254 while (XCheckTypedWindowEvent(dpy
, WMWidgetXID(panel
->versionL
),
1258 #endif /* SILLYNESS */
1262 wShowInfoPanel(WScreen
*scr
)
1268 char *strbuf
= NULL
;
1272 RColor color1
, color2
;
1286 if (thePanel
->scr
== scr
) {
1287 wRaiseFrame(thePanel
->wwin
->frame
->core
);
1288 wSetFocusTo(scr
, thePanel
->wwin
);
1293 panel
= wmalloc(sizeof(InfoPanel
));
1294 memset(panel
, 0, sizeof(InfoPanel
));
1298 panel
->win
= WMCreateWindow(scr
->wmscreen
, "info");
1299 WMResizeWidget(panel
->win
, 382, 230);
1301 logo
= WMCreateApplicationIconBlendedPixmap(scr
->wmscreen
, (RColor
*)NULL
);
1303 logo
= WMRetainPixmap(WMGetApplicationIconPixmap(scr
->wmscreen
));
1306 size
= WMGetPixmapSize(logo
);
1307 panel
->logoL
= WMCreateLabel(panel
->win
);
1308 WMResizeWidget(panel
->logoL
, 64, 64);
1309 WMMoveWidget(panel
->logoL
, 30, 20);
1310 WMSetLabelImagePosition(panel
->logoL
, WIPImageOnly
);
1311 WMSetLabelImage(panel
->logoL
, logo
);
1313 WMCreateEventHandler(WMWidgetView(panel
->logoL
), ButtonPressMask
,
1314 handleLogoPush
, panel
);
1316 WMReleasePixmap(logo
);
1319 panel
->name1L
= WMCreateLabel(panel
->win
);
1320 WMResizeWidget(panel
->name1L
, 240, 30);
1321 WMMoveWidget(panel
->name1L
, 100, 30);
1326 color2
.green
= 0x50;
1328 logo
= renderText(scr
->wmscreen
, "Window Maker",
1329 "-*-utopia-*-r-*-*-25-*", &color1
, &color2
);
1331 WMSetLabelImagePosition(panel
->name1L
, WIPImageOnly
);
1332 WMSetLabelImage(panel
->name1L
, logo
);
1333 WMReleasePixmap(logo
);
1335 font
= WMBoldSystemFontOfSize(scr
->wmscreen
, 20);
1337 WMSetLabelFont(panel
->name1L
, font
);
1338 WMReleaseFont(font
);
1340 WMSetLabelTextAlignment(panel
->name1L
, WACenter
);
1341 WMSetLabelText(panel
->name1L
, "Window Maker");
1344 panel
->name2L
= WMCreateLabel(panel
->win
);
1345 WMResizeWidget(panel
->name2L
, 240, 24);
1346 WMMoveWidget(panel
->name2L
, 100, 60);
1347 font
= WMBoldSystemFontOfSize(scr
->wmscreen
, 18);
1349 WMSetLabelFont(panel
->name2L
, font
);
1350 WMReleaseFont(font
);
1353 WMSetLabelTextAlignment(panel
->name2L
, WACenter
);
1354 WMSetLabelText(panel
->name2L
, _("Window Manager for X"));
1357 snprintf(buffer
, sizeof(buffer
), _("Version %s"), VERSION
);
1358 panel
->versionL
= WMCreateLabel(panel
->win
);
1359 WMResizeWidget(panel
->versionL
, 310, 16);
1360 WMMoveWidget(panel
->versionL
, 30, 95);
1361 WMSetLabelTextAlignment(panel
->versionL
, WARight
);
1362 WMSetLabelText(panel
->versionL
, buffer
);
1363 WMSetLabelWraps(panel
->versionL
, False
);
1365 panel
->copyrL
= WMCreateLabel(panel
->win
);
1366 WMResizeWidget(panel
->copyrL
, 340, 40);
1367 WMMoveWidget(panel
->copyrL
, 15, 185);
1368 WMSetLabelTextAlignment(panel
->copyrL
, WALeft
);
1369 WMSetLabelText(panel
->copyrL
, COPYRIGHT_TEXT
);
1370 /* we want the (c) character in the helvetica font */
1371 font
= WMCreateNormalFont(scr
->wmscreen
, HELVETICA10_FONT
);
1373 WMSetLabelFont(panel
->copyrL
, font
);
1374 WMReleaseFont(font
);
1379 snprintf(buffer
, sizeof(buffer
), _("Using visual 0x%x: %s %ibpp "),
1380 (unsigned)scr
->w_visual
->visualid
,
1381 visuals
[scr
->w_visual
->class], scr
->w_depth
);
1383 strbuf
= wstrappend(strbuf
, buffer
);
1385 switch (scr
->w_depth
) {
1387 strbuf
= wstrappend(strbuf
, _("(32 thousand colors)\n"));
1390 strbuf
= wstrappend(strbuf
, _("(64 thousand colors)\n"));
1394 strbuf
= wstrappend(strbuf
, _("(16 million colors)\n"));
1397 snprintf(buffer
, sizeof(buffer
), _("(%d colors)\n"), 1<<scr
->w_depth
);
1398 strbuf
= wstrappend(strbuf
, buffer
);
1403 #if defined(HAVE_MALLOC_H) && defined(HAVE_MALLINFO)
1405 struct mallinfo ma
= mallinfo();
1406 snprintf(buffer
, sizeof(buffer
),
1407 _("Total allocated memory: %i kB. Total memory in use: %i kB.\n"),
1408 (ma
.arena
+ma
.hblkhd
)/1024, (ma
.uordblks
+ma
.hblkhd
)/1024);
1410 strbuf
= wstrappend(strbuf
, buffer
);
1414 strbuf
= wstrappend(strbuf
, _("Supported image formats: "));
1415 strl
= RSupportedFileFormats();
1416 for (i
=0; strl
[i
]!=NULL
; i
++) {
1417 strbuf
= wstrappend(strbuf
, strl
[i
]);
1418 strbuf
= wstrappend(strbuf
, " ");
1421 strbuf
= wstrappend(strbuf
, _("\nAdditional support for: "));
1434 list
[j
++] = "GNOME";
1441 for (i
= 0; i
< j
; i
++) {
1444 strcat(buf
, _(" and "));
1448 strcat(buf
, list
[i
]);
1450 strbuf
= wstrappend(strbuf
, buf
);
1453 if (wPreferences
.no_sound
) {
1454 strbuf
= wstrappend(strbuf
, _("\nSound disabled"));
1456 strbuf
= wstrappend(strbuf
, _("\nSound enabled"));
1460 panel
->infoL
= WMCreateLabel(panel
->win
);
1461 WMResizeWidget(panel
->infoL
, 350, 75);
1462 WMMoveWidget(panel
->infoL
, 15, 115);
1463 WMSetLabelText(panel
->infoL
, strbuf
);
1464 font
= WMCreateFont(scr
->wmscreen
, HELVETICA10_FONT
);
1466 WMSetLabelFont(panel
->infoL
, font
);
1467 WMReleaseFont(font
);
1473 WMRealizeWidget(panel
->win
);
1474 WMMapSubwidgets(panel
->win
);
1476 parent
= XCreateSimpleWindow(dpy
, scr
->root_win
, 0, 0, 382, 230, 0, 0, 0);
1478 XReparentWindow(dpy
, WMWidgetXID(panel
->win
), parent
, 0, 0);
1480 WMMapWidget(panel
->win
);
1483 WMPoint center
= getCenter(scr
, 382, 230);
1485 wwin
= wManageInternalWindow(scr
, parent
, None
, _("Info"),
1490 WSETUFLAG(wwin
, no_closable
, 0);
1491 WSETUFLAG(wwin
, no_close_button
, 0);
1492 #ifdef XKB_BUTTON_HINT
1493 wFrameWindowHideButton(wwin
->frame
, WFF_LANGUAGE_BUTTON
);
1495 wWindowUpdateButtonImages(wwin
);
1496 wFrameWindowShowButton(wwin
->frame
, WFF_RIGHT_BUTTON
);
1497 wwin
->frame
->on_click_right
= destroyInfoPanel
;
1505 if (InitXThing(panel
->scr
)) {
1506 panel
->timer
= WMAddTimerHandler(100, logoPushCallback
, panel
);
1509 panel
->str
= _("Merry Christmas!");
1510 panel
->oldPix
= WMRetainPixmap(WMGetLabelImage(panel
->logoL
));
1517 ***********************************************************************
1519 ***********************************************************************
1533 static LegalPanel
*legalPanel
= NULL
;
1536 destroyLegalPanel(WCoreWindow
*foo
, void *data
, XEvent
*event
)
1538 WMUnmapWidget(legalPanel
->win
);
1540 WMDestroyWidget(legalPanel
->win
);
1542 wUnmanageWindow(legalPanel
->wwin
, False
, False
);
1551 wShowLegalPanel(WScreen
*scr
)
1558 if (legalPanel
->scr
== scr
) {
1559 wRaiseFrame(legalPanel
->wwin
->frame
->core
);
1560 wSetFocusTo(scr
, legalPanel
->wwin
);
1565 panel
= wmalloc(sizeof(LegalPanel
));
1569 panel
->win
= WMCreateWindow(scr
->wmscreen
, "legal");
1570 WMResizeWidget(panel
->win
, 420, 250);
1573 panel
->licenseL
= WMCreateLabel(panel
->win
);
1574 WMSetLabelWraps(panel
->licenseL
, True
);
1575 WMResizeWidget(panel
->licenseL
, 400, 230);
1576 WMMoveWidget(panel
->licenseL
, 10, 10);
1577 WMSetLabelTextAlignment(panel
->licenseL
, WALeft
);
1578 WMSetLabelText(panel
->licenseL
,
1579 _(" Window Maker is free software; you can redistribute it and/or\n"
1580 "modify it under the terms of the GNU General Public License as\n"
1581 "published by the Free Software Foundation; either version 2 of the\n"
1582 "License, or (at your option) any later version.\n\n"
1583 " Window Maker is distributed in the hope that it will be useful,\n"
1584 "but WITHOUT ANY WARRANTY; without even the implied warranty\n"
1585 "of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
1586 "See the GNU General Public License for more details.\n\n"
1587 " You should have received a copy of the GNU General Public\n"
1588 "License along with this program; if not, write to the Free Software\n"
1589 "Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA\n"
1590 "02111-1307, USA."));
1591 WMSetLabelRelief(panel
->licenseL
, WRGroove
);
1593 WMRealizeWidget(panel
->win
);
1594 WMMapSubwidgets(panel
->win
);
1596 parent
= XCreateSimpleWindow(dpy
, scr
->root_win
, 0, 0, 420, 250, 0, 0, 0);
1598 XReparentWindow(dpy
, WMWidgetXID(panel
->win
), parent
, 0, 0);
1601 WMPoint center
= getCenter(scr
, 420, 250);
1603 wwin
= wManageInternalWindow(scr
, parent
, None
, _("Legal"),
1608 WSETUFLAG(wwin
, no_closable
, 0);
1609 WSETUFLAG(wwin
, no_close_button
, 0);
1610 wWindowUpdateButtonImages(wwin
);
1611 wFrameWindowShowButton(wwin
->frame
, WFF_RIGHT_BUTTON
);
1612 #ifdef XKB_BUTTON_HINT
1613 wFrameWindowHideButton(wwin
->frame
, WFF_LANGUAGE_BUTTON
);
1615 wwin
->frame
->on_click_right
= destroyLegalPanel
;
1619 WMMapWidget(panel
->win
);
1628 ***********************************************************************
1629 * Crashing Dialog Panel
1630 ***********************************************************************
1633 extern WDDomain
*WDWindowAttributes
;
1636 typedef struct _CrashPanel
{
1637 WMWindow
*win
; /* main window */
1639 WMLabel
*iconL
; /* application icon */
1640 WMLabel
*nameL
; /* title of panel */
1642 WMFrame
*sepF
; /* separator frame */
1644 WMLabel
*noteL
; /* Title of note */
1645 WMLabel
*note2L
; /* body of note with what happened */
1647 WMFrame
*whatF
; /* "what to do next" frame */
1648 WMPopUpButton
*whatP
; /* action selection popup button */
1650 WMButton
*okB
; /* ok button */
1652 Bool done
; /* if finished with this dialog */
1653 int action
; /* what to do after */
1661 handleKeyPress(XEvent
*event
, void *clientData
)
1663 CrashPanel
*panel
= (CrashPanel
*)clientData
;
1665 if (event
->xkey
.keycode
== panel
->retKey
) {
1666 WMPerformButtonClick(panel
->okB
);
1672 okButtonCallback(void *self
, void *clientData
)
1674 CrashPanel
*panel
= (CrashPanel
*)clientData
;
1681 setCrashAction(void *self
, void *clientData
)
1683 WMPopUpButton
*pop
= (WMPopUpButton
*)self
;
1684 CrashPanel
*panel
= (CrashPanel
*)clientData
;
1686 panel
->action
= WMGetPopUpButtonSelectedItem(pop
);
1691 getWindowMakerIconImage(WMScreen
*scr
)
1693 WMPropList
*dict
, *key
, *option
, *value
=NULL
;
1697 WMPLSetCaseSensitive(True
);
1699 key
= WMCreatePLString("Logo.WMPanel");
1700 option
= WMCreatePLString("Icon");
1702 dict
= WMGetFromPLDictionary(WDWindowAttributes
->dictionary
, key
);
1705 value
= WMGetFromPLDictionary(dict
, option
);
1708 WMReleasePropList(key
);
1709 WMReleasePropList(option
);
1711 WMPLSetCaseSensitive(False
);
1713 if (value
&& WMIsPLString(value
)) {
1714 path
= FindImage(wPreferences
.icon_path
, WMGetFromPLString(value
));
1719 gray
.red
= 0xae; gray
.green
= 0xaa;
1720 gray
.blue
= 0xae; gray
.alpha
= 0;
1722 pix
= WMCreateBlendedPixmapFromFile(scr
, path
, &gray
);
1736 wShowCrashingDialogPanel(int whatSig
)
1742 int screen_no
, scr_width
, scr_height
;
1746 panel
= wmalloc(sizeof(CrashPanel
));
1747 memset(panel
, 0, sizeof(CrashPanel
));
1749 screen_no
= DefaultScreen(dpy
);
1750 scr_width
= WidthOfScreen(ScreenOfDisplay(dpy
, screen_no
));
1751 scr_height
= HeightOfScreen(ScreenOfDisplay(dpy
, screen_no
));
1753 scr
= WMCreateScreen(dpy
, screen_no
);
1755 wsyserror(_("cannot open connection for crashing dialog panel. Aborting."));
1759 panel
->retKey
= XKeysymToKeycode(dpy
, XK_Return
);
1761 panel
->win
= WMCreateWindow(scr
, "crashingDialog");
1762 WMResizeWidget(panel
->win
, PWIDTH
, PHEIGHT
);
1763 WMMoveWidget(panel
->win
, (scr_width
- PWIDTH
)/2, (scr_height
- PHEIGHT
)/2);
1765 logo
= getWindowMakerIconImage(scr
);
1767 panel
->iconL
= WMCreateLabel(panel
->win
);
1768 WMResizeWidget(panel
->iconL
, 64, 64);
1769 WMMoveWidget(panel
->iconL
, 10, 10);
1770 WMSetLabelImagePosition(panel
->iconL
, WIPImageOnly
);
1771 WMSetLabelImage(panel
->iconL
, logo
);
1774 panel
->nameL
= WMCreateLabel(panel
->win
);
1775 WMResizeWidget(panel
->nameL
, 190, 18);
1776 WMMoveWidget(panel
->nameL
, 80, 35);
1777 WMSetLabelTextAlignment(panel
->nameL
, WALeft
);
1778 font
= WMBoldSystemFontOfSize(scr
, 18);
1779 WMSetLabelFont(panel
->nameL
, font
);
1780 WMReleaseFont(font
);
1781 WMSetLabelText(panel
->nameL
, _("Fatal error"));
1783 panel
->sepF
= WMCreateFrame(panel
->win
);
1784 WMResizeWidget(panel
->sepF
, PWIDTH
+4, 2);
1785 WMMoveWidget(panel
->sepF
, -2, 80);
1787 panel
->noteL
= WMCreateLabel(panel
->win
);
1788 WMResizeWidget(panel
->noteL
, PWIDTH
-20, 40);
1789 WMMoveWidget(panel
->noteL
, 10, 90);
1790 WMSetLabelTextAlignment(panel
->noteL
, WAJustified
);
1791 #ifdef SYS_SIGLIST_DECLARED
1792 snprintf(buf
, sizeof(buf
), _("Window Maker received signal %i\n(%s)."),
1793 whatSig
, sys_siglist
[whatSig
]);
1795 snprintf(buf
, sizeof(buf
), _("Window Maker received signal %i."), whatSig
);
1797 WMSetLabelText(panel
->noteL
, buf
);
1799 panel
->note2L
= WMCreateLabel(panel
->win
);
1800 WMResizeWidget(panel
->note2L
, PWIDTH
-20, 100);
1801 WMMoveWidget(panel
->note2L
, 10, 130);
1802 WMSetLabelTextAlignment(panel
->note2L
, WALeft
);
1803 WMSetLabelText(panel
->note2L
,
1804 _(" This fatal error occured probably due to a bug."
1805 " Please fill the included BUGFORM and "
1806 "report it to bugs@windowmaker.org."));
1807 WMSetLabelWraps(panel
->note2L
, True
);
1810 panel
->whatF
= WMCreateFrame(panel
->win
);
1811 WMResizeWidget(panel
->whatF
, PWIDTH
-20, 50);
1812 WMMoveWidget(panel
->whatF
, 10, 240);
1813 WMSetFrameTitle(panel
->whatF
, _("What do you want to do now?"));
1815 panel
->whatP
= WMCreatePopUpButton(panel
->whatF
);
1816 WMResizeWidget(panel
->whatP
, PWIDTH
-20-70, 20);
1817 WMMoveWidget(panel
->whatP
, 35, 20);
1818 WMSetPopUpButtonPullsDown(panel
->whatP
, False
);
1819 WMSetPopUpButtonText(panel
->whatP
, _("Select action"));
1820 WMAddPopUpButtonItem(panel
->whatP
, _("Abort and leave a core file"));
1821 WMAddPopUpButtonItem(panel
->whatP
, _("Restart Window Maker"));
1822 WMAddPopUpButtonItem(panel
->whatP
, _("Start alternate window manager"));
1823 WMSetPopUpButtonAction(panel
->whatP
, setCrashAction
, panel
);
1824 WMSetPopUpButtonSelectedItem(panel
->whatP
, WMRestart
);
1825 panel
->action
= WMRestart
;
1827 WMMapSubwidgets(panel
->whatF
);
1829 panel
->okB
= WMCreateCommandButton(panel
->win
);
1830 WMResizeWidget(panel
->okB
, 80, 26);
1831 WMMoveWidget(panel
->okB
, 205, 309);
1832 WMSetButtonText(panel
->okB
, _("OK"));
1833 WMSetButtonImage(panel
->okB
, WMGetSystemPixmap(scr
, WSIReturnArrow
));
1834 WMSetButtonAltImage(panel
->okB
, WMGetSystemPixmap(scr
, WSIHighlightedReturnArrow
));
1835 WMSetButtonImagePosition(panel
->okB
, WIPRight
);
1836 WMSetButtonAction(panel
->okB
, okButtonCallback
, panel
);
1840 WMCreateEventHandler(WMWidgetView(panel
->win
), KeyPressMask
,
1841 handleKeyPress
, panel
);
1843 WMRealizeWidget(panel
->win
);
1844 WMMapSubwidgets(panel
->win
);
1846 WMMapWidget(panel
->win
);
1848 XSetInputFocus(dpy
, WMWidgetXID(panel
->win
), RevertToParent
, CurrentTime
);
1850 while (!panel
->done
) {
1853 WMNextEvent(dpy
, &event
);
1854 WMHandleEvent(&event
);
1857 action
= panel
->action
;
1859 WMUnmapWidget(panel
->win
);
1860 WMDestroyWidget(panel
->win
);
1869 /*****************************************************************************
1870 * About GNUstep Panel
1871 *****************************************************************************/
1875 drawGNUstepLogo(Display
*dpy
, Drawable d
, int width
, int height
,
1876 unsigned long blackPixel
, unsigned long whitePixel
)
1880 XRectangle rects
[3];
1882 gcv
.foreground
= blackPixel
;
1883 gc
= XCreateGC(dpy
, d
, GCForeground
, &gcv
);
1885 XFillArc(dpy
, d
, gc
, width
/45, height
/45,
1886 width
- 2*width
/45, height
- 2*height
/45, 0, 360*64);
1889 rects
[0].y
= 37*height
/45;
1890 rects
[0].width
= width
/3;
1891 rects
[0].height
= height
- rects
[0].y
;
1893 rects
[1].x
= rects
[0].width
;
1894 rects
[1].y
= height
/2;
1895 rects
[1].width
= width
- 2*width
/3;
1896 rects
[1].height
= height
- rects
[1].y
;
1898 rects
[2].x
= 2*width
/3;
1899 rects
[2].y
= height
- 37*height
/45;
1900 rects
[2].width
= width
/3;
1901 rects
[2].height
= height
- rects
[2].y
;
1903 XSetClipRectangles(dpy
, gc
, 0, 0, rects
, 3, Unsorted
);
1904 XFillRectangle(dpy
, d
, gc
, 0, 0, width
, height
);
1906 XSetForeground(dpy
, gc
, whitePixel
);
1907 XFillArc(dpy
, d
, gc
, width
/45, height
/45,
1908 width
- 2*width
/45, height
- 2*height
/45, 0, 360*64);
1926 static GNUstepPanel
*gnustepPanel
= NULL
;
1929 destroyGNUstepPanel(WCoreWindow
*foo
, void *data
, XEvent
*event
)
1931 WMUnmapWidget(gnustepPanel
->win
);
1933 WMDestroyWidget(gnustepPanel
->win
);
1935 wUnmanageWindow(gnustepPanel
->wwin
, False
, False
);
1937 wfree(gnustepPanel
);
1939 gnustepPanel
= NULL
;
1944 wShowGNUstepPanel(WScreen
*scr
)
1946 GNUstepPanel
*panel
;
1953 if (gnustepPanel
->scr
== scr
) {
1954 wRaiseFrame(gnustepPanel
->wwin
->frame
->core
);
1955 wSetFocusTo(scr
, gnustepPanel
->wwin
);
1960 panel
= wmalloc(sizeof(GNUstepPanel
));
1964 panel
->win
= WMCreateWindow(scr
->wmscreen
, "About GNUstep");
1965 WMResizeWidget(panel
->win
, 325, 200);
1967 pixmap
= WMCreatePixmap(scr
->wmscreen
, 130, 130,
1968 WMScreenDepth(scr
->wmscreen
), True
);
1970 color
= WMCreateNamedColor(scr
->wmscreen
, "gray50", True
);
1972 drawGNUstepLogo(dpy
, WMGetPixmapXID(pixmap
), 130, 130,
1973 WMColorPixel(color
), scr
->white_pixel
);
1975 WMReleaseColor(color
);
1977 XSetForeground(dpy
, scr
->mono_gc
, 0);
1978 XFillRectangle(dpy
, WMGetPixmapMaskXID(pixmap
), scr
->mono_gc
, 0, 0,
1980 drawGNUstepLogo(dpy
, WMGetPixmapMaskXID(pixmap
), 130, 130, 1, 1);
1982 panel
->gstepL
= WMCreateLabel(panel
->win
);
1983 WMResizeWidget(panel
->gstepL
, 285, 64);
1984 WMMoveWidget(panel
->gstepL
, 20, 0);
1985 WMSetLabelTextAlignment(panel
->gstepL
, WARight
);
1986 WMSetLabelText(panel
->gstepL
, "GNUstep");
1988 WMFont
*font
= WMBoldSystemFontOfSize(scr
->wmscreen
, 24);
1990 WMSetLabelFont(panel
->gstepL
, font
);
1991 WMReleaseFont(font
);
1994 panel
->textL
= WMCreateLabel(panel
->win
);
1995 WMResizeWidget(panel
->textL
, 275, 130);
1996 WMMoveWidget(panel
->textL
, 30, 50);
1997 WMSetLabelTextAlignment(panel
->textL
, WARight
);
1998 WMSetLabelImagePosition(panel
->textL
, WIPOverlaps
);
1999 WMSetLabelText(panel
->textL
,
2000 _("Window Maker is part of the GNUstep project.\n"\
2001 "The GNUstep project aims to create a free\n"\
2002 "implementation of the OpenStep(tm) specification\n"\
2003 "which is a object-oriented framework for\n"\
2004 "creating advanced graphical, multi-platform\n"\
2005 "applications. Additionally, a development and\n"\
2006 "user desktop enviroment will be created on top\n"\
2007 "of the framework. For more information about\n"\
2008 "GNUstep, please visit: www.gnustep.org"));
2009 WMSetLabelImage(panel
->textL
, pixmap
);
2011 WMReleasePixmap(pixmap
);
2013 WMRealizeWidget(panel
->win
);
2014 WMMapSubwidgets(panel
->win
);
2016 parent
= XCreateSimpleWindow(dpy
, scr
->root_win
, 0, 0, 325, 200, 0, 0, 0);
2018 XReparentWindow(dpy
, WMWidgetXID(panel
->win
), parent
, 0, 0);
2021 WMPoint center
= getCenter(scr
, 325, 200);
2023 wwin
= wManageInternalWindow(scr
, parent
, None
, _("About GNUstep"),
2028 WSETUFLAG(wwin
, no_closable
, 0);
2029 WSETUFLAG(wwin
, no_close_button
, 0);
2030 wWindowUpdateButtonImages(wwin
);
2031 wFrameWindowShowButton(wwin
->frame
, WFF_RIGHT_BUTTON
);
2032 #ifdef XKB_BUTTON_HINT
2033 wFrameWindowHideButton(wwin
->frame
, WFF_LANGUAGE_BUTTON
);
2035 wwin
->frame
->on_click_right
= destroyGNUstepPanel
;
2039 WMMapWidget(panel
->win
);
2043 gnustepPanel
= panel
;