1 /* dialog.c - dialog windows for internal use
3 * Window Maker window manager
5 * Copyright (c) 1997-2003 Alfredo K. Kojima
6 * Copyright (c) 1998-2003 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"
67 extern WPreferences wPreferences
;
70 static WMPoint
getCenter(WScreen
*scr
, int width
, int height
)
72 return wGetPointToCenterRectInHead(scr
,
73 wGetHeadForPointerLocation(scr
),
79 wMessageDialog(WScreen
*scr
, char *title
, char *message
,
80 char *defBtn
, char *altBtn
, char *othBtn
)
88 panel
= WMCreateAlertPanel(scr
->wmscreen
, NULL
, title
, message
,
89 defBtn
, altBtn
, othBtn
);
91 parent
= XCreateSimpleWindow(dpy
, scr
->root_win
, 0, 0, 400, 180, 0, 0, 0);
93 XReparentWindow(dpy
, WMWidgetXID(panel
->win
), parent
, 0, 0);
96 center
= getCenter(scr
, 400, 180);
97 wwin
= wManageInternalWindow(scr
, parent
, None
, NULL
, center
.x
, center
.y
,
99 wwin
->client_leader
= WMWidgetXID(panel
->win
);
101 WMMapWidget(panel
->win
);
105 WMRunModalLoop(WMWidgetScreen(panel
->win
), WMWidgetView(panel
->win
));
107 result
= panel
->result
;
109 WMUnmapWidget(panel
->win
);
111 wUnmanageWindow(wwin
, False
, False
);
113 WMDestroyAlertPanel(panel
);
115 XDestroyWindow(dpy
, parent
);
122 toggleSaveSession(WMWidget
*w
, void *data
)
124 wPreferences
.save_session_on_exit
= WMGetButtonSelected((WMButton
*) w
);
129 wExitDialog(WScreen
*scr
, char *title
, char *message
,
130 char *defBtn
, char *altBtn
, char *othBtn
)
133 WMButton
*saveSessionBtn
;
139 panel
= WMCreateAlertPanel(scr
->wmscreen
, NULL
, title
, message
,
140 defBtn
, altBtn
, othBtn
);
142 /* add save session button */
143 saveSessionBtn
= WMCreateSwitchButton(panel
->hbox
);
144 WMSetButtonAction(saveSessionBtn
, toggleSaveSession
, NULL
);
145 WMAddBoxSubview(panel
->hbox
, WMWidgetView(saveSessionBtn
),
146 False
, True
, 200, 0, 0);
147 WMSetButtonText(saveSessionBtn
, _("Save workspace state"));
148 WMSetButtonSelected(saveSessionBtn
, wPreferences
.save_session_on_exit
);
149 WMRealizeWidget(saveSessionBtn
);
150 WMMapWidget(saveSessionBtn
);
152 parent
= XCreateSimpleWindow(dpy
, scr
->root_win
, 0, 0, 400, 180, 0, 0, 0);
154 XReparentWindow(dpy
, WMWidgetXID(panel
->win
), parent
, 0, 0);
156 center
= getCenter(scr
, 400, 180);
157 wwin
= wManageInternalWindow(scr
, parent
, None
, NULL
,
158 center
.x
, center
.y
, 400, 180);
160 wwin
->client_leader
= WMWidgetXID(panel
->win
);
162 WMMapWidget(panel
->win
);
166 WMRunModalLoop(WMWidgetScreen(panel
->win
), WMWidgetView(panel
->win
));
168 result
= panel
->result
;
170 WMUnmapWidget(panel
->win
);
172 wUnmanageWindow(wwin
, False
, False
);
174 WMDestroyAlertPanel(panel
);
176 XDestroyWindow(dpy
, parent
);
183 wInputDialog(WScreen
*scr
, char *title
, char *message
, char **text
)
191 panel
= WMCreateInputPanel(scr
->wmscreen
, NULL
, title
, message
, *text
,
192 _("OK"), _("Cancel"));
195 parent
= XCreateSimpleWindow(dpy
, scr
->root_win
, 0, 0, 320, 160, 0, 0, 0);
196 XSelectInput(dpy
, parent
, KeyPressMask
|KeyReleaseMask
);
198 XReparentWindow(dpy
, WMWidgetXID(panel
->win
), parent
, 0, 0);
200 center
= getCenter(scr
, 320, 160);
201 wwin
= wManageInternalWindow(scr
, parent
, None
, NULL
, center
.x
, center
.y
,
204 wwin
->client_leader
= WMWidgetXID(panel
->win
);
206 WMMapWidget(panel
->win
);
210 WMRunModalLoop(WMWidgetScreen(panel
->win
), WMWidgetView(panel
->win
));
212 if (panel
->result
== WAPRDefault
)
213 result
= WMGetTextFieldText(panel
->text
);
217 wUnmanageWindow(wwin
, False
, False
);
219 WMDestroyInputPanel(panel
);
221 XDestroyWindow(dpy
, parent
);
236 *****************************************************************
237 * Icon Selection Panel
238 *****************************************************************
241 typedef struct IconPanel
{
254 WMButton
*previewButton
;
259 WMTextField
*fileField
;
262 WMButton
*cancelButton
;
264 WMButton
*chooseButton
;
274 listPixmaps(WScreen
*scr
, WMList
*lPtr
, char *path
)
276 struct dirent
*dentry
;
278 char pbuf
[PATH_MAX
+16];
280 IconPanel
*panel
= WMGetHangedData(lPtr
);
282 panel
->preview
= False
;
284 apath
= wexpandpath(path
);
285 dir
= opendir(apath
);
290 tmp
= _("Could not open directory ");
291 msg
= wmalloc(strlen(tmp
)+strlen(path
)+6);
295 wMessageDialog(scr
, _("Error"), msg
, _("OK"), NULL
, NULL
);
301 /* list contents in the column */
302 while ((dentry
= readdir(dir
))) {
305 if (strcmp(dentry
->d_name
, ".")==0 ||
306 strcmp(dentry
->d_name
, "..")==0)
311 strcat(pbuf
, dentry
->d_name
);
313 if (stat(pbuf
, &statb
)<0)
316 if (statb
.st_mode
& (S_IRUSR
|S_IRGRP
|S_IROTH
)
317 && statb
.st_mode
& (S_IFREG
|S_IFLNK
)) {
318 WMAddListItem(lPtr
, dentry
->d_name
);
321 WMSortListItems(lPtr
);
325 panel
->preview
= True
;
331 setViewedImage(IconPanel
*panel
, char *file
)
340 pixmap
= WMCreateBlendedPixmapFromFile(WMWidgetScreen(panel
->win
),
343 WMSetButtonEnabled(panel
->okButton
, False
);
345 WMSetLabelText(panel
->iconView
, _("Could not load image file "));
347 WMSetLabelImage(panel
->iconView
, NULL
);
349 WMSetButtonEnabled(panel
->okButton
, True
);
351 WMSetLabelText(panel
->iconView
, NULL
);
352 WMSetLabelImage(panel
->iconView
, pixmap
);
353 WMReleasePixmap(pixmap
);
359 listCallback(void *self
, void *data
)
361 WMList
*lPtr
= (WMList
*)self
;
362 IconPanel
*panel
= (IconPanel
*)data
;
365 if (lPtr
==panel
->dirList
) {
366 WMListItem
*item
= WMGetListSelectedItem(lPtr
);
372 WMSetTextFieldText(panel
->fileField
, path
);
374 WMSetLabelImage(panel
->iconView
, NULL
);
376 WMSetButtonEnabled(panel
->okButton
, False
);
378 WMClearList(panel
->iconList
);
379 listPixmaps(panel
->scr
, panel
->iconList
, path
);
381 char *tmp
, *iconFile
;
382 WMListItem
*item
= WMGetListSelectedItem(panel
->dirList
);
387 tmp
= wexpandpath(path
);
389 item
= WMGetListSelectedItem(panel
->iconList
);
392 iconFile
= item
->text
;
394 path
= wmalloc(strlen(tmp
)+strlen(iconFile
)+4);
397 strcat(path
, iconFile
);
399 WMSetTextFieldText(panel
->fileField
, path
);
400 setViewedImage(panel
, path
);
407 listIconPaths(WMList
*lPtr
)
412 paths
= wstrdup(wPreferences
.icon_path
);
414 path
= strtok(paths
, ":");
419 tmp
= wexpandpath(path
);
420 /* do not sort, because the order implies the order of
421 * directories searched */
422 if (access(tmp
, X_OK
)==0)
423 WMAddListItem(lPtr
, path
);
425 } while ((path
=strtok(NULL
, ":"))!=NULL
);
432 drawIconProc(WMList
*lPtr
, int index
, Drawable d
, char *text
, int state
,
435 IconPanel
*panel
= WMGetHangedData(lPtr
);
436 WScreen
*scr
= panel
->scr
;
437 GC gc
= scr
->draw_gc
;
438 GC copygc
= scr
->copy_gc
;
439 char *file
, *dirfile
;
443 WMScreen
*wmscr
= WMWidgetScreen(panel
->win
);
445 int x
, y
, width
, height
, len
;
447 if(!panel
->preview
) return;
451 width
= rect
->size
.width
;
452 height
= rect
->size
.height
;
454 back
= (state
& WLDSSelected
) ? scr
->white
: scr
->gray
;
456 dirfile
= wexpandpath(WMGetListSelectedItem(panel
->dirList
)->text
);
457 len
= strlen(dirfile
)+strlen(text
)+4;
459 snprintf(file
, len
, "%s/%s", dirfile
, text
);
462 color
.red
= WMRedComponentOfColor(back
) >> 8;
463 color
.green
= WMGreenComponentOfColor(back
) >> 8;
464 color
.blue
= WMBlueComponentOfColor(back
) >> 8;
465 color
.alpha
= WMGetColorAlpha(back
) >> 8;
467 pixmap
= WMCreateBlendedPixmapFromFile(wmscr
, file
, &color
);
471 /*WMRemoveListItem(lPtr, index);*/
475 XFillRectangle(dpy
, d
, WMColorGC(back
), x
, y
, width
, height
);
477 XSetClipMask(dpy
, gc
, None
);
478 /*XDrawRectangle(dpy, d, WMColorGC(white), x+5, y+5, width-10, 54);*/
479 XDrawLine(dpy
, d
, WMColorGC(scr
->white
), x
, y
+height
-1, x
+width
, y
+height
-1);
481 size
= WMGetPixmapSize(pixmap
);
483 XSetClipMask(dpy
, copygc
, WMGetPixmapMaskXID(pixmap
));
484 XSetClipOrigin(dpy
, copygc
, x
+ (width
-size
.width
)/2, y
+2);
485 XCopyArea(dpy
, WMGetPixmapXID(pixmap
), d
, copygc
, 0, 0,
486 size
.width
>100?100:size
.width
, size
.height
>64?64:size
.height
,
487 x
+ (width
-size
.width
)/2, y
+2);
491 int fheight
= WMFontHeight(panel
->normalfont
);
492 int tlen
= strlen(text
);
493 int twidth
= WMWidthOfString(panel
->normalfont
, text
, tlen
);
496 ofx
= x
+ (width
- twidth
)/2;
497 ofy
= y
+ 64 - fheight
;
501 WMDrawString(wmscr
, d
, scr
->white
, panel
->normalfont
,
502 ofx
+i
, ofy
+j
, text
, tlen
);
504 WMDrawString(wmscr
, d
, scr
->black
, panel
->normalfont
, ofx
, ofy
,
508 WMReleasePixmap(pixmap
);
509 /* I hope it is better to do not use cache / on my box it is fast nuff */
515 buttonCallback(void *self
, void *clientData
)
517 WMButton
*bPtr
= (WMButton
*)self
;
518 IconPanel
*panel
= (IconPanel
*)clientData
;
521 if (bPtr
==panel
->okButton
) {
523 panel
->result
= True
;
524 } else if (bPtr
==panel
->cancelButton
) {
526 panel
->result
= False
;
527 } else if (bPtr
==panel
->previewButton
) {
528 /**** Previewer ****/
529 WMSetButtonEnabled(bPtr
, False
);
530 WMSetListUserDrawItemHeight(panel
->iconList
, 68);
531 WMSetListUserDrawProc(panel
->iconList
, drawIconProc
);
532 WMRedisplayWidget(panel
->iconList
);
533 /* for draw proc to access screen/gc */
534 /*** end preview ***/
537 else if (bPtr
==panel
->chooseButton
) {
540 op
= WMCreateOpenPanel(WMWidgetScreen(bPtr
));
542 if (WMRunModalFilePanelForDirectory(op
, NULL
, "/usr/local", NULL
, NULL
)) {
544 path
= WMGetFilePanelFile(op
);
545 WMSetTextFieldText(panel
->fileField
, path
);
546 setViewedImage(panel
, path
);
549 WMDestroyFilePanel(op
);
556 keyPressHandler(XEvent
*event
, void *data
)
558 IconPanel
*panel
= (IconPanel
*)data
;
567 if (event
->type
== KeyRelease
)
571 count
= XLookupString(&event
->xkey
, buffer
, sizeof(buffer
), &ksym
, NULL
);
574 iidx
= WMGetListSelectedItemRow(panel
->iconList
);
575 didx
= WMGetListSelectedItemRow(panel
->dirList
);
583 list
= panel
->iconList
;
586 if (iidx
< WMGetListNumberOfRows(panel
->iconList
) - 1)
590 list
= panel
->iconList
;
594 list
= panel
->iconList
;
597 item
= WMGetListNumberOfRows(panel
->iconList
) - 1;
598 list
= panel
->iconList
;
601 if (didx
< WMGetListNumberOfRows(panel
->dirList
) - 1)
605 list
= panel
->dirList
;
612 list
= panel
->dirList
;
615 WMPerformButtonClick(panel
->okButton
);
618 WMPerformButtonClick(panel
->cancelButton
);
623 WMSelectListItem(list
, item
);
624 WMSetListPosition(list
, item
- 5);
625 listCallback(list
, panel
);
632 wIconChooserDialog(WScreen
*scr
, char **file
, char *instance
, char *class)
640 panel
= wmalloc(sizeof(IconPanel
));
641 memset(panel
, 0, sizeof(IconPanel
));
645 panel
->win
= WMCreateWindow(scr
->wmscreen
, "iconChooser");
646 WMResizeWidget(panel
->win
, 450, 280);
648 WMCreateEventHandler(WMWidgetView(panel
->win
), KeyPressMask
|KeyReleaseMask
,
649 keyPressHandler
, panel
);
652 boldFont
= WMBoldSystemFontOfSize(scr
->wmscreen
, 12);
653 panel
->normalfont
= WMSystemFontOfSize(WMWidgetScreen(panel
->win
), 12);
655 panel
->dirLabel
= WMCreateLabel(panel
->win
);
656 WMResizeWidget(panel
->dirLabel
, 200, 20);
657 WMMoveWidget(panel
->dirLabel
, 10, 7);
658 WMSetLabelText(panel
->dirLabel
, _("Directories"));
659 WMSetLabelFont(panel
->dirLabel
, boldFont
);
660 WMSetLabelTextAlignment(panel
->dirLabel
, WACenter
);
662 WMSetLabelRelief(panel
->dirLabel
, WRSunken
);
664 panel
->iconLabel
= WMCreateLabel(panel
->win
);
665 WMResizeWidget(panel
->iconLabel
, 140, 20);
666 WMMoveWidget(panel
->iconLabel
, 215, 7);
667 WMSetLabelText(panel
->iconLabel
, _("Icons"));
668 WMSetLabelFont(panel
->iconLabel
, boldFont
);
669 WMSetLabelTextAlignment(panel
->iconLabel
, WACenter
);
671 WMReleaseFont(boldFont
);
673 color
= WMWhiteColor(scr
->wmscreen
);
674 WMSetLabelTextColor(panel
->dirLabel
, color
);
675 WMSetLabelTextColor(panel
->iconLabel
, color
);
676 WMReleaseColor(color
);
678 color
= WMDarkGrayColor(scr
->wmscreen
);
679 WMSetWidgetBackgroundColor(panel
->iconLabel
, color
);
680 WMSetWidgetBackgroundColor(panel
->dirLabel
, color
);
681 WMReleaseColor(color
);
683 WMSetLabelRelief(panel
->iconLabel
, WRSunken
);
685 panel
->dirList
= WMCreateList(panel
->win
);
686 WMResizeWidget(panel
->dirList
, 200, 170);
687 WMMoveWidget(panel
->dirList
, 10, 30);
688 WMSetListAction(panel
->dirList
, listCallback
, panel
);
690 panel
->iconList
= WMCreateList(panel
->win
);
691 WMResizeWidget(panel
->iconList
, 140, 170);
692 WMMoveWidget(panel
->iconList
, 215, 30);
693 WMSetListAction(panel
->iconList
, listCallback
, panel
);
695 WMHangData(panel
->iconList
,panel
);
697 panel
->previewButton
= WMCreateCommandButton(panel
->win
);
698 WMResizeWidget(panel
->previewButton
, 75, 26);
699 WMMoveWidget(panel
->previewButton
, 365, 130);
700 WMSetButtonText(panel
->previewButton
, _("Preview"));
701 WMSetButtonAction(panel
->previewButton
, buttonCallback
, panel
);
703 panel
->iconView
= WMCreateLabel(panel
->win
);
704 WMResizeWidget(panel
->iconView
, 75, 75);
705 WMMoveWidget(panel
->iconView
, 365, 40);
706 WMSetLabelImagePosition(panel
->iconView
, WIPOverlaps
);
707 WMSetLabelRelief(panel
->iconView
, WRSunken
);
708 WMSetLabelTextAlignment(panel
->iconView
, WACenter
);
710 panel
->fileLabel
= WMCreateLabel(panel
->win
);
711 WMResizeWidget(panel
->fileLabel
, 80, 20);
712 WMMoveWidget(panel
->fileLabel
, 10, 210);
713 WMSetLabelText(panel
->fileLabel
, _("File Name:"));
715 panel
->fileField
= WMCreateTextField(panel
->win
);
716 WMSetViewNextResponder(WMWidgetView(panel
->fileField
), WMWidgetView(panel
->win
));
717 WMResizeWidget(panel
->fileField
, 345, 20);
718 WMMoveWidget(panel
->fileField
, 95, 210);
719 WMSetTextFieldEditable(panel
->fileField
, False
);
721 panel
->okButton
= WMCreateCommandButton(panel
->win
);
722 WMResizeWidget(panel
->okButton
, 80, 26);
723 WMMoveWidget(panel
->okButton
, 360, 240);
724 WMSetButtonText(panel
->okButton
, _("OK"));
725 WMSetButtonEnabled(panel
->okButton
, False
);
726 WMSetButtonAction(panel
->okButton
, buttonCallback
, panel
);
728 panel
->cancelButton
= WMCreateCommandButton(panel
->win
);
729 WMResizeWidget(panel
->cancelButton
, 80, 26);
730 WMMoveWidget(panel
->cancelButton
, 270, 240);
731 WMSetButtonText(panel
->cancelButton
, _("Cancel"));
732 WMSetButtonAction(panel
->cancelButton
, buttonCallback
, panel
);
734 panel
->chooseButton
= WMCreateCommandButton(panel
->win
);
735 WMResizeWidget(panel
->chooseButton
, 110, 26);
736 WMMoveWidget(panel
->chooseButton
, 150, 240);
737 WMSetButtonText(panel
->chooseButton
, _("Choose File"));
738 WMSetButtonAction(panel
->chooseButton
, buttonCallback
, panel
);
740 WMRealizeWidget(panel
->win
);
741 WMMapSubwidgets(panel
->win
);
743 parent
= XCreateSimpleWindow(dpy
, scr
->root_win
, 0, 0, 450, 280, 0, 0, 0);
745 XReparentWindow(dpy
, WMWidgetXID(panel
->win
), parent
, 0, 0);
749 int len
= (instance
? strlen(instance
) : 0)
750 + (class ? strlen(class) : 0) + 32;
755 if (tmp
&& (instance
|| class))
756 snprintf(tmp
, len
, "%s [%s.%s]", _("Icon Chooser"), instance
, class);
758 strcpy(tmp
, _("Icon Chooser"));
760 center
= getCenter(scr
, 450, 280);
762 wwin
= wManageInternalWindow(scr
, parent
, None
, tmp
, center
.x
,center
.y
,
767 /* put icon paths in the list */
768 listIconPaths(panel
->dirList
);
770 WMMapWidget(panel
->win
);
774 while (!panel
->done
) {
777 WMNextEvent(dpy
, &event
);
778 WMHandleEvent(&event
);
782 char *defaultPath
, *wantedPath
;
784 /* check if the file the user selected is not the one that
785 * would be loaded by default with the current search path */
786 *file
= WMGetListSelectedItem(panel
->iconList
)->text
;
791 defaultPath
= FindImage(wPreferences
.icon_path
, *file
);
792 wantedPath
= WMGetTextFieldText(panel
->fileField
);
793 /* if the file is not the default, use full path */
794 if (strcmp(wantedPath
, defaultPath
)!=0) {
797 *file
= wstrdup(*file
);
806 WMReleaseFont(panel
->normalfont
);
808 WMUnmapWidget(panel
->win
);
810 WMDestroyWidget(panel
->win
);
812 wUnmanageWindow(wwin
, False
, False
);
816 XDestroyWindow(dpy
, parent
);
818 return panel
->result
;
823 ***********************************************************************
825 ***********************************************************************
861 #define COPYRIGHT_TEXT \
862 "Copyright \xa9 1997-2003 Alfredo K. Kojima <kojima@windowmaker.org>\n"\
863 "Copyright \xa9 1998-2003 Dan Pascu <dan@windowmaker.org>"
867 static InfoPanel
*thePanel
= NULL
;
870 destroyInfoPanel(WCoreWindow
*foo
, void *data
, XEvent
*event
)
873 if (thePanel
->timer
) {
874 WMDeleteTimerHandler(thePanel
->timer
);
876 if (thePanel
->oldPix
) {
877 WMReleasePixmap(thePanel
->oldPix
);
879 if (thePanel
->oldFont
) {
880 WMReleaseFont(thePanel
->oldFont
);
882 if (thePanel
->icon
) {
883 RReleaseImage(thePanel
->icon
);
886 RReleaseImage(thePanel
->pic
);
888 #endif /* SILLYNESS */
889 WMUnmapWidget(thePanel
);
891 wUnmanageWindow(thePanel
->wwin
, False
, False
);
893 WMDestroyWidget(thePanel
->win
);
903 extern WMPixmap
*DoXThing();
904 extern Bool
InitXThing();
907 logoPushCallback(void *data
)
909 InfoPanel
*panel
= (InfoPanel
*)data
;
914 static int jingobeu
[] = {
915 329, 150, -1, 100, 329, 150, -1, 100, 329, 300, -1, 250,
916 329, 150, -1, 100, 329, 150, -1, 100, 329, 300, -1, 250,
917 329, 150, 392, 150, 261, 150, 293, 150, 329, 400, -1, 400, 0
923 XKeyboardState ksave
;
924 unsigned long mask
= KBBellPitch
|KBBellDuration
|KBBellPercent
;
926 XGetKeyboardControl(dpy
, &ksave
);
929 if(jingobeu
[panel
->x
-1]==0) {
931 } else if (jingobeu
[panel
->x
-1]<0) {
933 c
=jingobeu
[panel
->x
-1]/50;
937 kc
.bell_pitch
=jingobeu
[panel
->x
-1];
939 kc
.bell_duration
=jingobeu
[panel
->x
-1];
940 c
=jingobeu
[panel
->x
-1]/50;
942 XChangeKeyboardControl(dpy
, mask
, &kc
);
949 if (!(panel
->cycle
% 4)) {
952 p
= DoXThing(panel
->wwin
);
953 WMSetLabelImage(panel
->logoL
, p
);
955 kc
.bell_pitch
= ksave
.bell_pitch
;
956 kc
.bell_percent
= ksave
.bell_percent
;
957 kc
.bell_duration
= ksave
.bell_duration
;
958 XChangeKeyboardControl(dpy
, mask
, &kc
);
959 } else if (panel
->cycle
< 30) {
964 gray
.red
= 0xae; gray
.green
= 0xaa;
965 gray
.blue
= 0xae; gray
.alpha
= 0;
967 image
= RScaleImage(panel
->icon
, panel
->pic
->width
, panel
->pic
->height
);
968 RCombineImagesWithOpaqueness(image
, panel
->pic
, panel
->cycle
*255/30);
969 pix
= WMCreateBlendedPixmapFromRImage(panel
->scr
->wmscreen
, image
, &gray
);
970 RReleaseImage(image
);
971 WMSetLabelImage(panel
->logoL
, pix
);
972 WMReleasePixmap(pix
);
975 /* slow down text a little */
976 i
= (int)(panel
->cycle
* 50.0/85.0)%200;
979 len
= strlen(panel
->str
);
981 strncpy(buffer
, panel
->str
, i
<len
? i
: len
);
983 memset(&buffer
[len
], ' ', i
-len
);
985 strncpy(buffer
, panel
->str
, i
<len
? i
: len
);
987 memset(&buffer
[len
], ' ', i
-len
);
990 WMSetLabelText(panel
->versionL
, buffer
);
992 XFlush(WMScreenDisplay(WMWidgetScreen(panel
->versionL
)));
997 panel
->timer
= WMAddTimerHandler(50, logoPushCallback
, panel
);
1003 handleLogoPush(XEvent
*event
, void *data
)
1005 InfoPanel
*panel
= (InfoPanel
*)data
;
1006 static int broken
= 0;
1007 static int clicks
= 0;
1008 static char *pic_data
[] = {
1067 " ............... ",
1068 " ....XoO+@##+O$%.... ",
1069 " ...%X&*========-;;:o... ",
1070 " ...>.>,<122222222222134@... ",
1071 " ..>5678912222222222222220q%.. ",
1072 " ..$.&-w2222222222222222222er>.. ",
1073 " ..O.t31222222222222222222222y4>.. ",
1074 " ...O5u3222222222222222222222222yri... ",
1075 " ..>p&a22222222222222222222222222wso.. ",
1076 " ..ids91222222222222222222222222222wfi.. ",
1077 " ..X.7w222222wgs-w2222222213=g0222222<hi.. ",
1078 " ..Xuj2222222<@X5=222222229k@l:022222y4i.. ",
1079 " .Xdz22222222*X%.s22222222axo%$-222222<c>.. ",
1080 " ..o7y22222222v...r222222223hX.i82222221si.. ",
1081 "..io*222222222&...u22222222yt..%*22222220:%. ",
1082 "..>k02222222227...f222222222v..X=222222229t. ",
1083 "..dz12222222220ui:y2222222223d%qw222222221g. ",
1084 ".%vw222222222221y2222222222219*y2222222222wd.",
1085 ".X;2222222222222222222222222222222222222222b.",
1086 ".i*2222222222222222222222222222222222222222v.",
1087 ".i*2222222222222222222222222222222222222222;.",
1088 ".i*22222222222222222222222222222222222222228.",
1089 ".>*2222222222222222222222222222222222222222=.",
1090 ".i*22222222222222222222222222222222222222228.",
1091 ".i*2222222222222222222222222222222222222222;.",
1092 ".X*222222222222222222222222222222we12222222r.",
1093 ".Xs12222222w3aw22222222222222222y8s0222222wk.",
1094 ".Xq02222222a,na22222222222222222zm6zwy2222gi.",
1095 "..>*22222y<:Xcj22222222222222222-o$k;;02228..",
1096 "..i7y2220rhX.:y22222222222222222jtiXd,a220,..",
1097 " .X@z222a,do%kj2222222222222222wMX5q;gw228%..",
1098 " ..58222wagsh6ry222222222222221;>Of0w222y:...",
1099 " ...:e2222218mdz22222222222222a&$vw222220@...",
1100 " ...O-122222y:.u02222222222229q$uj222221r... ",
1101 " ..%&a1222223&573w2222222219NOxz122221z>... ",
1102 " ...t3222221-l$nr8ay1222yzbo,=12222w-5... ",
1103 " ..X:022222w-k+>o,7s**s7xOn=12221<f5... ",
1104 " ..o:9222221j8:&Bl>>>>ihv<12221=dX... ",
1105 " ..Xb9122222109g-****;<y22221zn%... ",
1106 " ..X&801222222222222222222w-h.... ",
1107 " ...o:=022222222222222221=lX... ",
1108 " ..X@:;3w2222222222210fO... ",
1109 " ...XX&v8<30000003-N@... ",
1110 " .....XmnbN:q&Bo.... ",
1113 static char *msgs
[] = {
1115 "Focus follow mouse users will burn in hell!!!",
1117 "Hi! My name is bobby...",
1118 "AHH! The neurotic monkeys are after me!",
1120 "HOW ARE YOU GENTLEMEN?",
1122 "SOMEBODY SET UP US THE BOMB",
1123 "ALL YOUR BASE ARE BELONG TO US!",
1124 "Oh My God!!! Larry is back!"
1130 if (!panel
->timer
&& !broken
&& clicks
> 0) {
1136 panel
->icon
= WMGetApplicationIconImage(panel
->scr
->wmscreen
);
1143 color
.red
= 0xae; color
.green
= 0xaa;
1144 color
.blue
= 0xae; color
.alpha
= 0;
1146 panel
->icon
= RCloneImage(panel
->icon
);
1147 RCombineImageWithColor(panel
->icon
, &color
);
1151 panel
->pic
= RGetImageFromXPMData(panel
->scr
->rcontext
, pic_data
);
1154 RReleaseImage(panel
->icon
);
1160 panel
->str
= msgs
[rand()%(sizeof(msgs
)/sizeof(char*))];
1162 panel
->timer
= WMAddTimerHandler(50, logoPushCallback
, panel
);
1164 panel
->oldPix
= WMRetainPixmap(WMGetLabelImage(panel
->logoL
));
1165 /* If we don't use a fixed font, scrolling will be jumpy */
1166 /* Alternatively we can draw text in a pixmap and scroll it smoothly */
1167 if ((panel
->oldFont
= WMGetLabelFont(panel
->versionL
))!=NULL
)
1168 WMRetainFont(panel
->oldFont
);
1169 font
= WMCreateFont(WMWidgetScreen(panel
->versionL
), "-*-fixed-medium-r-*-*-13-*-*-*-*-*-*-*");
1171 WMSetLabelFont(panel
->versionL
, font
);
1172 WMReleaseFont(font
);
1174 WMSetLabelText(panel
->versionL
, "");
1175 } else if (panel
->timer
) {
1180 WMSetLabelImage(panel
->logoL
, panel
->oldPix
);
1181 WMReleasePixmap(panel
->oldPix
);
1182 panel
->oldPix
= NULL
;
1184 WMDeleteTimerHandler(panel
->timer
);
1185 panel
->timer
= NULL
;
1187 WMSetLabelFont(panel
->versionL
, panel
->oldFont
);
1188 if (panel
->oldFont
) {
1189 WMReleaseFont(panel
->oldFont
);
1190 panel
->oldFont
= NULL
;
1192 snprintf(version
, sizeof(version
), _("Version %s"), VERSION
);
1193 WMSetLabelText(panel
->versionL
, version
);
1194 XFlush(WMScreenDisplay(WMWidgetScreen(panel
->versionL
)));
1199 while (XCheckTypedWindowEvent(dpy
, WMWidgetXID(panel
->versionL
),
1203 #endif /* SILLYNESS */
1207 wShowInfoPanel(WScreen
*scr
)
1213 char *strbuf
= NULL
;
1218 int i
, width
, sepWidth
;
1230 if (thePanel
->scr
== scr
) {
1231 wRaiseFrame(thePanel
->wwin
->frame
->core
);
1232 wSetFocusTo(scr
, thePanel
->wwin
);
1237 panel
= wmalloc(sizeof(InfoPanel
));
1238 memset(panel
, 0, sizeof(InfoPanel
));
1242 panel
->win
= WMCreateWindow(scr
->wmscreen
, "info");
1243 WMResizeWidget(panel
->win
, 390, 230);
1245 logo
= WMCreateApplicationIconBlendedPixmap(scr
->wmscreen
, (RColor
*)NULL
);
1247 logo
= WMRetainPixmap(WMGetApplicationIconPixmap(scr
->wmscreen
));
1250 size
= WMGetPixmapSize(logo
);
1251 panel
->logoL
= WMCreateLabel(panel
->win
);
1252 WMResizeWidget(panel
->logoL
, 64, 64);
1253 WMMoveWidget(panel
->logoL
, 30, 20);
1254 WMSetLabelImagePosition(panel
->logoL
, WIPImageOnly
);
1255 WMSetLabelImage(panel
->logoL
, logo
);
1257 WMCreateEventHandler(WMWidgetView(panel
->logoL
), ButtonPressMask
,
1258 handleLogoPush
, panel
);
1260 WMReleasePixmap(logo
);
1264 panel
->name1L
= WMCreateLabel(panel
->win
);
1265 WMResizeWidget(panel
->name1L
, 240, 30 - sepWidth
);
1266 WMMoveWidget(panel
->name1L
, 100, 30);
1268 if (WMIsAntialiasingEnabled(scr
->wmscreen
)) {
1269 font
= WMBoldSystemFontOfSize(scr
->wmscreen
, 24);
1271 font
= WMCreateFont(scr
->wmscreen
, "-*-utopia-*-r-*-*-25-*");
1272 font
= font
? font
: WMBoldSystemFontOfSize(scr
->wmscreen
, 24);
1274 strbuf
= "Window Maker";
1276 width
= WMWidthOfString(font
, strbuf
, strlen(strbuf
));
1277 WMSetLabelFont(panel
->name1L
, font
);
1278 WMReleaseFont(font
);
1280 WMSetLabelTextAlignment(panel
->name1L
, WACenter
);
1281 WMSetLabelText(panel
->name1L
, strbuf
);
1283 panel
->lineF
= WMCreateFrame(panel
->win
);
1284 WMResizeWidget(panel
->lineF
, width
, sepWidth
);
1285 WMMoveWidget(panel
->lineF
, 100+(240-width
)/2, 60 - sepWidth
);
1286 WMSetFrameRelief(panel
->lineF
, WRSimple
);
1287 WMSetWidgetBackgroundColor(panel
->lineF
, scr
->black
);
1289 panel
->name2L
= WMCreateLabel(panel
->win
);
1290 WMResizeWidget(panel
->name2L
, 240, 24);
1291 WMMoveWidget(panel
->name2L
, 100, 60);
1292 font
= WMBoldSystemFontOfSize(scr
->wmscreen
, 18);
1294 WMSetLabelFont(panel
->name2L
, font
);
1295 WMReleaseFont(font
);
1298 WMSetLabelTextAlignment(panel
->name2L
, WACenter
);
1299 WMSetLabelText(panel
->name2L
, _("Window Manager for X"));
1301 snprintf(buffer
, sizeof(buffer
), _("Version %s"), VERSION
);
1302 panel
->versionL
= WMCreateLabel(panel
->win
);
1303 WMResizeWidget(panel
->versionL
, 310, 16);
1304 WMMoveWidget(panel
->versionL
, 30, 95);
1305 WMSetLabelTextAlignment(panel
->versionL
, WARight
);
1306 WMSetLabelText(panel
->versionL
, buffer
);
1307 WMSetLabelWraps(panel
->versionL
, False
);
1309 panel
->copyrL
= WMCreateLabel(panel
->win
);
1310 WMResizeWidget(panel
->copyrL
, 360, 40);
1311 WMMoveWidget(panel
->copyrL
, 15, 185);
1312 WMSetLabelTextAlignment(panel
->copyrL
, WALeft
);
1313 WMSetLabelText(panel
->copyrL
, COPYRIGHT_TEXT
);
1314 /* we want the (c) character in the font, so don't use a FontSet here */
1315 font
= WMCreateFontWithFlags(scr
->wmscreen
, "SystemFont-11", WFNormalFont
);
1317 WMSetLabelFont(panel
->copyrL
, font
);
1318 WMReleaseFont(font
);
1323 snprintf(buffer
, sizeof(buffer
), _("Using visual 0x%x: %s %ibpp "),
1324 (unsigned)scr
->w_visual
->visualid
,
1325 visuals
[scr
->w_visual
->class], scr
->w_depth
);
1327 strbuf
= wstrappend(strbuf
, buffer
);
1329 switch (scr
->w_depth
) {
1331 strbuf
= wstrappend(strbuf
, _("(32 thousand colors)\n"));
1334 strbuf
= wstrappend(strbuf
, _("(64 thousand colors)\n"));
1338 strbuf
= wstrappend(strbuf
, _("(16 million colors)\n"));
1341 snprintf(buffer
, sizeof(buffer
), _("(%d colors)\n"), 1<<scr
->w_depth
);
1342 strbuf
= wstrappend(strbuf
, buffer
);
1347 #if defined(HAVE_MALLOC_H) && defined(HAVE_MALLINFO)
1349 struct mallinfo ma
= mallinfo();
1350 snprintf(buffer
, sizeof(buffer
),
1351 _("Total allocated memory: %i kB. Total memory in use: %i kB.\n"),
1352 (ma
.arena
+ma
.hblkhd
)/1024, (ma
.uordblks
+ma
.hblkhd
)/1024);
1354 strbuf
= wstrappend(strbuf
, buffer
);
1358 strbuf
= wstrappend(strbuf
, _("Supported image formats: "));
1359 strl
= RSupportedFileFormats();
1360 for (i
=0; strl
[i
]!=NULL
; i
++) {
1361 strbuf
= wstrappend(strbuf
, strl
[i
]);
1362 strbuf
= wstrappend(strbuf
, " ");
1365 strbuf
= wstrappend(strbuf
, _("\nAdditional support for: "));
1378 list
[j
++] = "GNOME";
1385 for (i
= 0; i
< j
; i
++) {
1388 strcat(buf
, _(" and "));
1392 strcat(buf
, list
[i
]);
1394 strbuf
= wstrappend(strbuf
, buf
);
1397 if (wPreferences
.no_sound
) {
1398 strbuf
= wstrappend(strbuf
, _("\nSound disabled"));
1400 strbuf
= wstrappend(strbuf
, _("\nSound enabled"));
1404 strbuf
= wstrappend(strbuf
, _("; Antialiased text"));
1408 panel
->infoL
= WMCreateLabel(panel
->win
);
1409 WMResizeWidget(panel
->infoL
, 350, 75);
1410 WMMoveWidget(panel
->infoL
, 15, 115);
1411 WMSetLabelText(panel
->infoL
, strbuf
);
1412 font
= WMSystemFontOfSize(scr
->wmscreen
, 11);
1414 WMSetLabelFont(panel
->infoL
, font
);
1415 WMReleaseFont(font
);
1421 WMRealizeWidget(panel
->win
);
1422 WMMapSubwidgets(panel
->win
);
1424 parent
= XCreateSimpleWindow(dpy
, scr
->root_win
, 0, 0, 382, 230, 0, 0, 0);
1426 XReparentWindow(dpy
, WMWidgetXID(panel
->win
), parent
, 0, 0);
1428 WMMapWidget(panel
->win
);
1431 WMPoint center
= getCenter(scr
, 382, 230);
1433 wwin
= wManageInternalWindow(scr
, parent
, None
, _("Info"),
1438 WSETUFLAG(wwin
, no_closable
, 0);
1439 WSETUFLAG(wwin
, no_close_button
, 0);
1440 #ifdef XKB_BUTTON_HINT
1441 wFrameWindowHideButton(wwin
->frame
, WFF_LANGUAGE_BUTTON
);
1443 wWindowUpdateButtonImages(wwin
);
1444 wFrameWindowShowButton(wwin
->frame
, WFF_RIGHT_BUTTON
);
1445 wwin
->frame
->on_click_right
= destroyInfoPanel
;
1453 if (InitXThing(panel
->scr
)) {
1454 panel
->timer
= WMAddTimerHandler(100, logoPushCallback
, panel
);
1457 panel
->str
= _("Merry Christmas!");
1458 panel
->oldPix
= WMRetainPixmap(WMGetLabelImage(panel
->logoL
));
1465 ***********************************************************************
1467 ***********************************************************************
1481 static LegalPanel
*legalPanel
= NULL
;
1484 destroyLegalPanel(WCoreWindow
*foo
, void *data
, XEvent
*event
)
1486 WMUnmapWidget(legalPanel
->win
);
1488 WMDestroyWidget(legalPanel
->win
);
1490 wUnmanageWindow(legalPanel
->wwin
, False
, False
);
1499 wShowLegalPanel(WScreen
*scr
)
1506 if (legalPanel
->scr
== scr
) {
1507 wRaiseFrame(legalPanel
->wwin
->frame
->core
);
1508 wSetFocusTo(scr
, legalPanel
->wwin
);
1513 panel
= wmalloc(sizeof(LegalPanel
));
1517 panel
->win
= WMCreateWindow(scr
->wmscreen
, "legal");
1518 WMResizeWidget(panel
->win
, 420, 250);
1521 panel
->licenseL
= WMCreateLabel(panel
->win
);
1522 WMSetLabelWraps(panel
->licenseL
, True
);
1523 WMResizeWidget(panel
->licenseL
, 400, 230);
1524 WMMoveWidget(panel
->licenseL
, 10, 10);
1525 WMSetLabelTextAlignment(panel
->licenseL
, WALeft
);
1526 WMSetLabelText(panel
->licenseL
,
1527 _(" Window Maker is free software; you can redistribute it and/or\n"
1528 "modify it under the terms of the GNU General Public License as\n"
1529 "published by the Free Software Foundation; either version 2 of the\n"
1530 "License, or (at your option) any later version.\n\n"
1531 " Window Maker is distributed in the hope that it will be useful,\n"
1532 "but WITHOUT ANY WARRANTY; without even the implied warranty\n"
1533 "of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
1534 "See the GNU General Public License for more details.\n\n"
1535 " You should have received a copy of the GNU General Public\n"
1536 "License along with this program; if not, write to the Free Software\n"
1537 "Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA\n"
1538 "02111-1307, USA."));
1539 WMSetLabelRelief(panel
->licenseL
, WRGroove
);
1541 WMRealizeWidget(panel
->win
);
1542 WMMapSubwidgets(panel
->win
);
1544 parent
= XCreateSimpleWindow(dpy
, scr
->root_win
, 0, 0, 420, 250, 0, 0, 0);
1546 XReparentWindow(dpy
, WMWidgetXID(panel
->win
), parent
, 0, 0);
1549 WMPoint center
= getCenter(scr
, 420, 250);
1551 wwin
= wManageInternalWindow(scr
, parent
, None
, _("Legal"),
1556 WSETUFLAG(wwin
, no_closable
, 0);
1557 WSETUFLAG(wwin
, no_close_button
, 0);
1558 wWindowUpdateButtonImages(wwin
);
1559 wFrameWindowShowButton(wwin
->frame
, WFF_RIGHT_BUTTON
);
1560 #ifdef XKB_BUTTON_HINT
1561 wFrameWindowHideButton(wwin
->frame
, WFF_LANGUAGE_BUTTON
);
1563 wwin
->frame
->on_click_right
= destroyLegalPanel
;
1567 WMMapWidget(panel
->win
);
1576 ***********************************************************************
1577 * Crashing Dialog Panel
1578 ***********************************************************************
1581 extern WDDomain
*WDWindowAttributes
;
1584 typedef struct _CrashPanel
{
1585 WMWindow
*win
; /* main window */
1587 WMLabel
*iconL
; /* application icon */
1588 WMLabel
*nameL
; /* title of panel */
1590 WMFrame
*sepF
; /* separator frame */
1592 WMLabel
*noteL
; /* Title of note */
1593 WMLabel
*note2L
; /* body of note with what happened */
1595 WMFrame
*whatF
; /* "what to do next" frame */
1596 WMPopUpButton
*whatP
; /* action selection popup button */
1598 WMButton
*okB
; /* ok button */
1600 Bool done
; /* if finished with this dialog */
1601 int action
; /* what to do after */
1609 handleKeyPress(XEvent
*event
, void *clientData
)
1611 CrashPanel
*panel
= (CrashPanel
*)clientData
;
1613 if (event
->xkey
.keycode
== panel
->retKey
) {
1614 WMPerformButtonClick(panel
->okB
);
1620 okButtonCallback(void *self
, void *clientData
)
1622 CrashPanel
*panel
= (CrashPanel
*)clientData
;
1629 setCrashAction(void *self
, void *clientData
)
1631 WMPopUpButton
*pop
= (WMPopUpButton
*)self
;
1632 CrashPanel
*panel
= (CrashPanel
*)clientData
;
1634 panel
->action
= WMGetPopUpButtonSelectedItem(pop
);
1639 getWindowMakerIconImage(WMScreen
*scr
)
1641 WMPropList
*dict
, *key
, *option
, *value
=NULL
;
1645 WMPLSetCaseSensitive(True
);
1647 key
= WMCreatePLString("Logo.WMPanel");
1648 option
= WMCreatePLString("Icon");
1650 dict
= WMGetFromPLDictionary(WDWindowAttributes
->dictionary
, key
);
1653 value
= WMGetFromPLDictionary(dict
, option
);
1656 WMReleasePropList(key
);
1657 WMReleasePropList(option
);
1659 WMPLSetCaseSensitive(False
);
1661 if (value
&& WMIsPLString(value
)) {
1662 path
= FindImage(wPreferences
.icon_path
, WMGetFromPLString(value
));
1667 gray
.red
= 0xae; gray
.green
= 0xaa;
1668 gray
.blue
= 0xae; gray
.alpha
= 0;
1670 pix
= WMCreateBlendedPixmapFromFile(scr
, path
, &gray
);
1684 wShowCrashingDialogPanel(int whatSig
)
1690 int screen_no
, scr_width
, scr_height
;
1694 panel
= wmalloc(sizeof(CrashPanel
));
1695 memset(panel
, 0, sizeof(CrashPanel
));
1697 screen_no
= DefaultScreen(dpy
);
1698 scr_width
= WidthOfScreen(ScreenOfDisplay(dpy
, screen_no
));
1699 scr_height
= HeightOfScreen(ScreenOfDisplay(dpy
, screen_no
));
1701 scr
= WMCreateScreen(dpy
, screen_no
);
1703 wsyserror(_("cannot open connection for crashing dialog panel. Aborting."));
1707 panel
->retKey
= XKeysymToKeycode(dpy
, XK_Return
);
1709 panel
->win
= WMCreateWindow(scr
, "crashingDialog");
1710 WMResizeWidget(panel
->win
, PWIDTH
, PHEIGHT
);
1711 WMMoveWidget(panel
->win
, (scr_width
- PWIDTH
)/2, (scr_height
- PHEIGHT
)/2);
1713 logo
= getWindowMakerIconImage(scr
);
1715 panel
->iconL
= WMCreateLabel(panel
->win
);
1716 WMResizeWidget(panel
->iconL
, 64, 64);
1717 WMMoveWidget(panel
->iconL
, 10, 10);
1718 WMSetLabelImagePosition(panel
->iconL
, WIPImageOnly
);
1719 WMSetLabelImage(panel
->iconL
, logo
);
1722 panel
->nameL
= WMCreateLabel(panel
->win
);
1723 WMResizeWidget(panel
->nameL
, 190, 18);
1724 WMMoveWidget(panel
->nameL
, 80, 35);
1725 WMSetLabelTextAlignment(panel
->nameL
, WALeft
);
1726 font
= WMBoldSystemFontOfSize(scr
, 18);
1727 WMSetLabelFont(panel
->nameL
, font
);
1728 WMReleaseFont(font
);
1729 WMSetLabelText(panel
->nameL
, _("Fatal error"));
1731 panel
->sepF
= WMCreateFrame(panel
->win
);
1732 WMResizeWidget(panel
->sepF
, PWIDTH
+4, 2);
1733 WMMoveWidget(panel
->sepF
, -2, 80);
1735 panel
->noteL
= WMCreateLabel(panel
->win
);
1736 WMResizeWidget(panel
->noteL
, PWIDTH
-20, 40);
1737 WMMoveWidget(panel
->noteL
, 10, 90);
1738 WMSetLabelTextAlignment(panel
->noteL
, WAJustified
);
1739 #ifdef SYS_SIGLIST_DECLARED
1740 snprintf(buf
, sizeof(buf
), _("Window Maker received signal %i\n(%s)."),
1741 whatSig
, sys_siglist
[whatSig
]);
1743 snprintf(buf
, sizeof(buf
), _("Window Maker received signal %i."), whatSig
);
1745 WMSetLabelText(panel
->noteL
, buf
);
1747 panel
->note2L
= WMCreateLabel(panel
->win
);
1748 WMResizeWidget(panel
->note2L
, PWIDTH
-20, 100);
1749 WMMoveWidget(panel
->note2L
, 10, 130);
1750 WMSetLabelTextAlignment(panel
->note2L
, WALeft
);
1751 WMSetLabelText(panel
->note2L
,
1752 _(" This fatal error occured probably due to a bug."
1753 " Please fill the included BUGFORM and "
1754 "report it to bugs@windowmaker.org."));
1755 WMSetLabelWraps(panel
->note2L
, True
);
1758 panel
->whatF
= WMCreateFrame(panel
->win
);
1759 WMResizeWidget(panel
->whatF
, PWIDTH
-20, 50);
1760 WMMoveWidget(panel
->whatF
, 10, 240);
1761 WMSetFrameTitle(panel
->whatF
, _("What do you want to do now?"));
1763 panel
->whatP
= WMCreatePopUpButton(panel
->whatF
);
1764 WMResizeWidget(panel
->whatP
, PWIDTH
-20-70, 20);
1765 WMMoveWidget(panel
->whatP
, 35, 20);
1766 WMSetPopUpButtonPullsDown(panel
->whatP
, False
);
1767 WMSetPopUpButtonText(panel
->whatP
, _("Select action"));
1768 WMAddPopUpButtonItem(panel
->whatP
, _("Abort and leave a core file"));
1769 WMAddPopUpButtonItem(panel
->whatP
, _("Restart Window Maker"));
1770 WMAddPopUpButtonItem(panel
->whatP
, _("Start alternate window manager"));
1771 WMSetPopUpButtonAction(panel
->whatP
, setCrashAction
, panel
);
1772 WMSetPopUpButtonSelectedItem(panel
->whatP
, WMRestart
);
1773 panel
->action
= WMRestart
;
1775 WMMapSubwidgets(panel
->whatF
);
1777 panel
->okB
= WMCreateCommandButton(panel
->win
);
1778 WMResizeWidget(panel
->okB
, 80, 26);
1779 WMMoveWidget(panel
->okB
, 205, 309);
1780 WMSetButtonText(panel
->okB
, _("OK"));
1781 WMSetButtonImage(panel
->okB
, WMGetSystemPixmap(scr
, WSIReturnArrow
));
1782 WMSetButtonAltImage(panel
->okB
, WMGetSystemPixmap(scr
, WSIHighlightedReturnArrow
));
1783 WMSetButtonImagePosition(panel
->okB
, WIPRight
);
1784 WMSetButtonAction(panel
->okB
, okButtonCallback
, panel
);
1788 WMCreateEventHandler(WMWidgetView(panel
->win
), KeyPressMask
,
1789 handleKeyPress
, panel
);
1791 WMRealizeWidget(panel
->win
);
1792 WMMapSubwidgets(panel
->win
);
1794 WMMapWidget(panel
->win
);
1796 XSetInputFocus(dpy
, WMWidgetXID(panel
->win
), RevertToParent
, CurrentTime
);
1798 while (!panel
->done
) {
1801 WMNextEvent(dpy
, &event
);
1802 WMHandleEvent(&event
);
1805 action
= panel
->action
;
1807 WMUnmapWidget(panel
->win
);
1808 WMDestroyWidget(panel
->win
);
1817 /*****************************************************************************
1818 * About GNUstep Panel
1819 *****************************************************************************/
1823 drawGNUstepLogo(Display
*dpy
, Drawable d
, int width
, int height
,
1824 unsigned long blackPixel
, unsigned long whitePixel
)
1828 XRectangle rects
[3];
1830 gcv
.foreground
= blackPixel
;
1831 gc
= XCreateGC(dpy
, d
, GCForeground
, &gcv
);
1833 XFillArc(dpy
, d
, gc
, width
/45, height
/45,
1834 width
- 2*width
/45, height
- 2*height
/45, 0, 360*64);
1837 rects
[0].y
= 37*height
/45;
1838 rects
[0].width
= width
/3;
1839 rects
[0].height
= height
- rects
[0].y
;
1841 rects
[1].x
= rects
[0].width
;
1842 rects
[1].y
= height
/2;
1843 rects
[1].width
= width
- 2*width
/3;
1844 rects
[1].height
= height
- rects
[1].y
;
1846 rects
[2].x
= 2*width
/3;
1847 rects
[2].y
= height
- 37*height
/45;
1848 rects
[2].width
= width
/3;
1849 rects
[2].height
= height
- rects
[2].y
;
1851 XSetClipRectangles(dpy
, gc
, 0, 0, rects
, 3, Unsorted
);
1852 XFillRectangle(dpy
, d
, gc
, 0, 0, width
, height
);
1854 XSetForeground(dpy
, gc
, whitePixel
);
1855 XFillArc(dpy
, d
, gc
, width
/45, height
/45,
1856 width
- 2*width
/45, height
- 2*height
/45, 0, 360*64);
1874 static GNUstepPanel
*gnustepPanel
= NULL
;
1877 destroyGNUstepPanel(WCoreWindow
*foo
, void *data
, XEvent
*event
)
1879 WMUnmapWidget(gnustepPanel
->win
);
1881 WMDestroyWidget(gnustepPanel
->win
);
1883 wUnmanageWindow(gnustepPanel
->wwin
, False
, False
);
1885 wfree(gnustepPanel
);
1887 gnustepPanel
= NULL
;
1892 wShowGNUstepPanel(WScreen
*scr
)
1894 GNUstepPanel
*panel
;
1901 if (gnustepPanel
->scr
== scr
) {
1902 wRaiseFrame(gnustepPanel
->wwin
->frame
->core
);
1903 wSetFocusTo(scr
, gnustepPanel
->wwin
);
1908 panel
= wmalloc(sizeof(GNUstepPanel
));
1912 panel
->win
= WMCreateWindow(scr
->wmscreen
, "About GNUstep");
1913 WMResizeWidget(panel
->win
, 325, 205);
1915 pixmap
= WMCreatePixmap(scr
->wmscreen
, 130, 130,
1916 WMScreenDepth(scr
->wmscreen
), True
);
1918 color
= WMCreateNamedColor(scr
->wmscreen
, "gray50", True
);
1920 drawGNUstepLogo(dpy
, WMGetPixmapXID(pixmap
), 130, 130,
1921 WMColorPixel(color
), scr
->white_pixel
);
1923 WMReleaseColor(color
);
1925 XSetForeground(dpy
, scr
->mono_gc
, 0);
1926 XFillRectangle(dpy
, WMGetPixmapMaskXID(pixmap
), scr
->mono_gc
, 0, 0,
1928 drawGNUstepLogo(dpy
, WMGetPixmapMaskXID(pixmap
), 130, 130, 1, 1);
1930 panel
->gstepL
= WMCreateLabel(panel
->win
);
1931 WMResizeWidget(panel
->gstepL
, 285, 64);
1932 WMMoveWidget(panel
->gstepL
, 20, 0);
1933 WMSetLabelTextAlignment(panel
->gstepL
, WARight
);
1934 WMSetLabelText(panel
->gstepL
, "GNUstep");
1936 WMFont
*font
= WMBoldSystemFontOfSize(scr
->wmscreen
, 24);
1938 WMSetLabelFont(panel
->gstepL
, font
);
1939 WMReleaseFont(font
);
1942 panel
->textL
= WMCreateLabel(panel
->win
);
1943 WMResizeWidget(panel
->textL
, 305, 140);
1944 WMMoveWidget(panel
->textL
, 10, 50);
1945 WMSetLabelTextAlignment(panel
->textL
, WARight
);
1946 WMSetLabelImagePosition(panel
->textL
, WIPOverlaps
);
1947 WMSetLabelText(panel
->textL
,
1948 _("Window Maker is part of the GNUstep project.\n"\
1949 "The GNUstep project aims to create a free\n"\
1950 "implementation of the OpenStep(tm) specification\n"\
1951 "which is a object-oriented framework for\n"\
1952 "creating advanced graphical, multi-platform\n"\
1953 "applications. Additionally, a development and\n"\
1954 "user desktop enviroment will be created on top\n"\
1955 "of the framework. For more information about\n"\
1956 "GNUstep, please visit: www.gnustep.org"));
1957 WMSetLabelImage(panel
->textL
, pixmap
);
1959 WMReleasePixmap(pixmap
);
1961 WMRealizeWidget(panel
->win
);
1962 WMMapSubwidgets(panel
->win
);
1964 parent
= XCreateSimpleWindow(dpy
, scr
->root_win
, 0, 0, 325, 200, 0, 0, 0);
1966 XReparentWindow(dpy
, WMWidgetXID(panel
->win
), parent
, 0, 0);
1969 WMPoint center
= getCenter(scr
, 325, 200);
1971 wwin
= wManageInternalWindow(scr
, parent
, None
, _("About GNUstep"),
1976 WSETUFLAG(wwin
, no_closable
, 0);
1977 WSETUFLAG(wwin
, no_close_button
, 0);
1978 wWindowUpdateButtonImages(wwin
);
1979 wFrameWindowShowButton(wwin
->frame
, WFF_RIGHT_BUTTON
);
1980 #ifdef XKB_BUTTON_HINT
1981 wFrameWindowHideButton(wwin
->frame
, WFF_LANGUAGE_BUTTON
);
1983 wwin
->frame
->on_click_right
= destroyGNUstepPanel
;
1987 WMMapWidget(panel
->win
);
1991 gnustepPanel
= panel
;