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)
641 panel
= wmalloc(sizeof(IconPanel
));
642 memset(panel
, 0, sizeof(IconPanel
));
646 panel
->win
= WMCreateWindow(scr
->wmscreen
, "iconChooser");
647 WMResizeWidget(panel
->win
, 450, 280);
649 WMCreateEventHandler(WMWidgetView(panel
->win
), KeyPressMask
|KeyReleaseMask
,
650 keyPressHandler
, panel
);
653 boldFont
= WMBoldSystemFontOfSize(scr
->wmscreen
, 12);
654 panel
->normalfont
= WMSystemFontOfSize(WMWidgetScreen(panel
->win
), 12);
656 panel
->dirLabel
= WMCreateLabel(panel
->win
);
657 WMResizeWidget(panel
->dirLabel
, 200, 20);
658 WMMoveWidget(panel
->dirLabel
, 10, 7);
659 WMSetLabelText(panel
->dirLabel
, _("Directories"));
660 WMSetLabelFont(panel
->dirLabel
, boldFont
);
661 WMSetLabelTextAlignment(panel
->dirLabel
, WACenter
);
663 WMSetLabelRelief(panel
->dirLabel
, WRSunken
);
665 panel
->iconLabel
= WMCreateLabel(panel
->win
);
666 WMResizeWidget(panel
->iconLabel
, 140, 20);
667 WMMoveWidget(panel
->iconLabel
, 215, 7);
668 WMSetLabelText(panel
->iconLabel
, _("Icons"));
669 WMSetLabelFont(panel
->iconLabel
, boldFont
);
670 WMSetLabelTextAlignment(panel
->iconLabel
, WACenter
);
672 WMReleaseFont(boldFont
);
674 color
= WMWhiteColor(scr
->wmscreen
);
675 WMSetLabelTextColor(panel
->dirLabel
, color
);
676 WMSetLabelTextColor(panel
->iconLabel
, color
);
677 WMReleaseColor(color
);
679 color
= WMDarkGrayColor(scr
->wmscreen
);
680 WMSetWidgetBackgroundColor(panel
->iconLabel
, color
);
681 WMSetWidgetBackgroundColor(panel
->dirLabel
, color
);
682 WMReleaseColor(color
);
684 WMSetLabelRelief(panel
->iconLabel
, WRSunken
);
686 panel
->dirList
= WMCreateList(panel
->win
);
687 WMResizeWidget(panel
->dirList
, 200, 170);
688 WMMoveWidget(panel
->dirList
, 10, 30);
689 WMSetListAction(panel
->dirList
, listCallback
, panel
);
691 panel
->iconList
= WMCreateList(panel
->win
);
692 WMResizeWidget(panel
->iconList
, 140, 170);
693 WMMoveWidget(panel
->iconList
, 215, 30);
694 WMSetListAction(panel
->iconList
, listCallback
, panel
);
696 WMHangData(panel
->iconList
,panel
);
698 panel
->previewButton
= WMCreateCommandButton(panel
->win
);
699 WMResizeWidget(panel
->previewButton
, 75, 26);
700 WMMoveWidget(panel
->previewButton
, 365, 130);
701 WMSetButtonText(panel
->previewButton
, _("Preview"));
702 WMSetButtonAction(panel
->previewButton
, buttonCallback
, panel
);
704 panel
->iconView
= WMCreateLabel(panel
->win
);
705 WMResizeWidget(panel
->iconView
, 75, 75);
706 WMMoveWidget(panel
->iconView
, 365, 40);
707 WMSetLabelImagePosition(panel
->iconView
, WIPOverlaps
);
708 WMSetLabelRelief(panel
->iconView
, WRSunken
);
709 WMSetLabelTextAlignment(panel
->iconView
, WACenter
);
711 panel
->fileLabel
= WMCreateLabel(panel
->win
);
712 WMResizeWidget(panel
->fileLabel
, 80, 20);
713 WMMoveWidget(panel
->fileLabel
, 10, 210);
714 WMSetLabelText(panel
->fileLabel
, _("File Name:"));
716 panel
->fileField
= WMCreateTextField(panel
->win
);
717 WMSetViewNextResponder(WMWidgetView(panel
->fileField
), WMWidgetView(panel
->win
));
718 WMResizeWidget(panel
->fileField
, 345, 20);
719 WMMoveWidget(panel
->fileField
, 95, 210);
720 WMSetTextFieldEditable(panel
->fileField
, False
);
722 panel
->okButton
= WMCreateCommandButton(panel
->win
);
723 WMResizeWidget(panel
->okButton
, 80, 26);
724 WMMoveWidget(panel
->okButton
, 360, 240);
725 WMSetButtonText(panel
->okButton
, _("OK"));
726 WMSetButtonEnabled(panel
->okButton
, False
);
727 WMSetButtonAction(panel
->okButton
, buttonCallback
, panel
);
729 panel
->cancelButton
= WMCreateCommandButton(panel
->win
);
730 WMResizeWidget(panel
->cancelButton
, 80, 26);
731 WMMoveWidget(panel
->cancelButton
, 270, 240);
732 WMSetButtonText(panel
->cancelButton
, _("Cancel"));
733 WMSetButtonAction(panel
->cancelButton
, buttonCallback
, panel
);
735 panel
->chooseButton
= WMCreateCommandButton(panel
->win
);
736 WMResizeWidget(panel
->chooseButton
, 110, 26);
737 WMMoveWidget(panel
->chooseButton
, 150, 240);
738 WMSetButtonText(panel
->chooseButton
, _("Choose File"));
739 WMSetButtonAction(panel
->chooseButton
, buttonCallback
, panel
);
741 WMRealizeWidget(panel
->win
);
742 WMMapSubwidgets(panel
->win
);
744 parent
= XCreateSimpleWindow(dpy
, scr
->root_win
, 0, 0, 450, 280, 0, 0, 0);
746 XReparentWindow(dpy
, WMWidgetXID(panel
->win
), parent
, 0, 0);
750 int len
= (instance
? strlen(instance
) : 0)
751 + (class ? strlen(class) : 0) + 32;
756 if (tmp
&& (instance
|| class))
757 snprintf(tmp
, len
, "%s [%s.%s]", _("Icon Chooser"), instance
, class);
759 strcpy(tmp
, _("Icon Chooser"));
761 center
= getCenter(scr
, 450, 280);
763 wwin
= wManageInternalWindow(scr
, parent
, None
, tmp
, center
.x
,center
.y
,
768 /* put icon paths in the list */
769 listIconPaths(panel
->dirList
);
771 WMMapWidget(panel
->win
);
775 while (!panel
->done
) {
778 WMNextEvent(dpy
, &event
);
779 WMHandleEvent(&event
);
783 char *defaultPath
, *wantedPath
;
785 /* check if the file the user selected is not the one that
786 * would be loaded by default with the current search path */
787 *file
= WMGetListSelectedItem(panel
->iconList
)->text
;
792 defaultPath
= FindImage(wPreferences
.icon_path
, *file
);
793 wantedPath
= WMGetTextFieldText(panel
->fileField
);
794 /* if the file is not the default, use full path */
795 if (strcmp(wantedPath
, defaultPath
)!=0) {
798 *file
= wstrdup(*file
);
807 WMReleaseFont(panel
->normalfont
);
809 WMUnmapWidget(panel
->win
);
811 WMDestroyWidget(panel
->win
);
813 wUnmanageWindow(wwin
, False
, False
);
815 result
= panel
->result
;
819 XDestroyWindow(dpy
, parent
);
826 ***********************************************************************
828 ***********************************************************************
864 #define COPYRIGHT_TEXT \
865 "Copyright © 1997-2004 Alfredo K. Kojima <kojima@windowmaker.org>\n"\
866 "Copyright © 1998-2004 Dan Pascu <dan@windowmaker.org>"
870 static InfoPanel
*thePanel
= NULL
;
873 destroyInfoPanel(WCoreWindow
*foo
, void *data
, XEvent
*event
)
876 if (thePanel
->timer
) {
877 WMDeleteTimerHandler(thePanel
->timer
);
879 if (thePanel
->oldPix
) {
880 WMReleasePixmap(thePanel
->oldPix
);
882 if (thePanel
->oldFont
) {
883 WMReleaseFont(thePanel
->oldFont
);
885 if (thePanel
->icon
) {
886 RReleaseImage(thePanel
->icon
);
889 RReleaseImage(thePanel
->pic
);
891 #endif /* SILLYNESS */
892 WMUnmapWidget(thePanel
);
894 wUnmanageWindow(thePanel
->wwin
, False
, False
);
896 WMDestroyWidget(thePanel
->win
);
906 extern WMPixmap
*DoXThing();
907 extern Bool
InitXThing();
910 logoPushCallback(void *data
)
912 InfoPanel
*panel
= (InfoPanel
*)data
;
917 static int jingobeu
[] = {
918 329, 150, -1, 100, 329, 150, -1, 100, 329, 300, -1, 250,
919 329, 150, -1, 100, 329, 150, -1, 100, 329, 300, -1, 250,
920 329, 150, 392, 150, 261, 150, 293, 150, 329, 400, -1, 400, 0
926 XKeyboardState ksave
;
927 unsigned long mask
= KBBellPitch
|KBBellDuration
|KBBellPercent
;
929 XGetKeyboardControl(dpy
, &ksave
);
932 if(jingobeu
[panel
->x
-1]==0) {
934 } else if (jingobeu
[panel
->x
-1]<0) {
936 c
=jingobeu
[panel
->x
-1]/50;
940 kc
.bell_pitch
=jingobeu
[panel
->x
-1];
942 kc
.bell_duration
=jingobeu
[panel
->x
-1];
943 c
=jingobeu
[panel
->x
-1]/50;
945 XChangeKeyboardControl(dpy
, mask
, &kc
);
952 if (!(panel
->cycle
% 4)) {
955 p
= DoXThing(panel
->wwin
);
956 WMSetLabelImage(panel
->logoL
, p
);
958 kc
.bell_pitch
= ksave
.bell_pitch
;
959 kc
.bell_percent
= ksave
.bell_percent
;
960 kc
.bell_duration
= ksave
.bell_duration
;
961 XChangeKeyboardControl(dpy
, mask
, &kc
);
962 } else if (panel
->cycle
< 30) {
967 gray
.red
= 0xae; gray
.green
= 0xaa;
968 gray
.blue
= 0xae; gray
.alpha
= 0;
970 image
= RScaleImage(panel
->icon
, panel
->pic
->width
, panel
->pic
->height
);
971 RCombineImagesWithOpaqueness(image
, panel
->pic
, panel
->cycle
*255/30);
972 pix
= WMCreateBlendedPixmapFromRImage(panel
->scr
->wmscreen
, image
, &gray
);
973 RReleaseImage(image
);
974 WMSetLabelImage(panel
->logoL
, pix
);
975 WMReleasePixmap(pix
);
978 /* slow down text a little */
979 i
= (int)(panel
->cycle
* 50.0/85.0)%200;
982 len
= strlen(panel
->str
);
984 strncpy(buffer
, panel
->str
, i
<len
? i
: len
);
986 memset(&buffer
[len
], ' ', i
-len
);
988 strncpy(buffer
, panel
->str
, i
<len
? i
: len
);
990 memset(&buffer
[len
], ' ', i
-len
);
993 WMSetLabelText(panel
->versionL
, buffer
);
995 XFlush(WMScreenDisplay(WMWidgetScreen(panel
->versionL
)));
1000 panel
->timer
= WMAddTimerHandler(50, logoPushCallback
, panel
);
1006 handleLogoPush(XEvent
*event
, void *data
)
1008 InfoPanel
*panel
= (InfoPanel
*)data
;
1009 static int broken
= 0;
1010 static int clicks
= 0;
1011 static char *pic_data
[] = {
1070 " ............... ",
1071 " ....XoO+@##+O$%.... ",
1072 " ...%X&*========-;;:o... ",
1073 " ...>.>,<122222222222134@... ",
1074 " ..>5678912222222222222220q%.. ",
1075 " ..$.&-w2222222222222222222er>.. ",
1076 " ..O.t31222222222222222222222y4>.. ",
1077 " ...O5u3222222222222222222222222yri... ",
1078 " ..>p&a22222222222222222222222222wso.. ",
1079 " ..ids91222222222222222222222222222wfi.. ",
1080 " ..X.7w222222wgs-w2222222213=g0222222<hi.. ",
1081 " ..Xuj2222222<@X5=222222229k@l:022222y4i.. ",
1082 " .Xdz22222222*X%.s22222222axo%$-222222<c>.. ",
1083 " ..o7y22222222v...r222222223hX.i82222221si.. ",
1084 "..io*222222222&...u22222222yt..%*22222220:%. ",
1085 "..>k02222222227...f222222222v..X=222222229t. ",
1086 "..dz12222222220ui:y2222222223d%qw222222221g. ",
1087 ".%vw222222222221y2222222222219*y2222222222wd.",
1088 ".X;2222222222222222222222222222222222222222b.",
1089 ".i*2222222222222222222222222222222222222222v.",
1090 ".i*2222222222222222222222222222222222222222;.",
1091 ".i*22222222222222222222222222222222222222228.",
1092 ".>*2222222222222222222222222222222222222222=.",
1093 ".i*22222222222222222222222222222222222222228.",
1094 ".i*2222222222222222222222222222222222222222;.",
1095 ".X*222222222222222222222222222222we12222222r.",
1096 ".Xs12222222w3aw22222222222222222y8s0222222wk.",
1097 ".Xq02222222a,na22222222222222222zm6zwy2222gi.",
1098 "..>*22222y<:Xcj22222222222222222-o$k;;02228..",
1099 "..i7y2220rhX.:y22222222222222222jtiXd,a220,..",
1100 " .X@z222a,do%kj2222222222222222wMX5q;gw228%..",
1101 " ..58222wagsh6ry222222222222221;>Of0w222y:...",
1102 " ...:e2222218mdz22222222222222a&$vw222220@...",
1103 " ...O-122222y:.u02222222222229q$uj222221r... ",
1104 " ..%&a1222223&573w2222222219NOxz122221z>... ",
1105 " ...t3222221-l$nr8ay1222yzbo,=12222w-5... ",
1106 " ..X:022222w-k+>o,7s**s7xOn=12221<f5... ",
1107 " ..o:9222221j8:&Bl>>>>ihv<12221=dX... ",
1108 " ..Xb9122222109g-****;<y22221zn%... ",
1109 " ..X&801222222222222222222w-h.... ",
1110 " ...o:=022222222222222221=lX... ",
1111 " ..X@:;3w2222222222210fO... ",
1112 " ...XX&v8<30000003-N@... ",
1113 " .....XmnbN:q&Bo.... ",
1116 static char *msgs
[] = {
1118 "Focus follow mouse users will burn in hell!!!",
1120 "Hi! My name is bobby...",
1121 "AHH! The neurotic monkeys are after me!",
1123 "HOW ARE YOU GENTLEMEN?",
1125 "SOMEBODY SET UP US THE BOMB",
1126 "ALL YOUR BASE ARE BELONG TO US!",
1127 "Oh My God!!! Larry is back!"
1133 if (!panel
->timer
&& !broken
&& clicks
> 0) {
1139 panel
->icon
= WMGetApplicationIconImage(panel
->scr
->wmscreen
);
1146 color
.red
= 0xae; color
.green
= 0xaa;
1147 color
.blue
= 0xae; color
.alpha
= 0;
1149 panel
->icon
= RCloneImage(panel
->icon
);
1150 RCombineImageWithColor(panel
->icon
, &color
);
1154 panel
->pic
= RGetImageFromXPMData(panel
->scr
->rcontext
, pic_data
);
1157 RReleaseImage(panel
->icon
);
1163 panel
->str
= msgs
[rand()%(sizeof(msgs
)/sizeof(char*))];
1165 panel
->timer
= WMAddTimerHandler(50, logoPushCallback
, panel
);
1167 panel
->oldPix
= WMRetainPixmap(WMGetLabelImage(panel
->logoL
));
1168 /* If we don't use a fixed font, scrolling will be jumpy */
1169 /* Alternatively we can draw text in a pixmap and scroll it smoothly */
1170 if ((panel
->oldFont
= WMGetLabelFont(panel
->versionL
))!=NULL
)
1171 WMRetainFont(panel
->oldFont
);
1172 font
= WMCreateFont(WMWidgetScreen(panel
->versionL
), "-*-fixed-medium-r-*-*-13-*-*-*-*-*-*-*");
1174 WMSetLabelFont(panel
->versionL
, font
);
1175 WMReleaseFont(font
);
1177 WMSetLabelText(panel
->versionL
, "");
1178 } else if (panel
->timer
) {
1183 WMSetLabelImage(panel
->logoL
, panel
->oldPix
);
1184 WMReleasePixmap(panel
->oldPix
);
1185 panel
->oldPix
= NULL
;
1187 WMDeleteTimerHandler(panel
->timer
);
1188 panel
->timer
= NULL
;
1190 WMSetLabelFont(panel
->versionL
, panel
->oldFont
);
1191 if (panel
->oldFont
) {
1192 WMReleaseFont(panel
->oldFont
);
1193 panel
->oldFont
= NULL
;
1195 snprintf(version
, sizeof(version
), _("Version %s"), VERSION
);
1196 WMSetLabelText(panel
->versionL
, version
);
1197 XFlush(WMScreenDisplay(WMWidgetScreen(panel
->versionL
)));
1202 while (XCheckTypedWindowEvent(dpy
, WMWidgetXID(panel
->versionL
),
1206 #endif /* SILLYNESS */
1210 wShowInfoPanel(WScreen
*scr
)
1216 char *strbuf
= NULL
;
1221 int i
, width
, sepWidth
;
1233 if (thePanel
->scr
== scr
) {
1234 wRaiseFrame(thePanel
->wwin
->frame
->core
);
1235 wSetFocusTo(scr
, thePanel
->wwin
);
1240 panel
= wmalloc(sizeof(InfoPanel
));
1241 memset(panel
, 0, sizeof(InfoPanel
));
1245 panel
->win
= WMCreateWindow(scr
->wmscreen
, "info");
1246 WMResizeWidget(panel
->win
, 390, 230);
1248 logo
= WMCreateApplicationIconBlendedPixmap(scr
->wmscreen
, (RColor
*)NULL
);
1250 logo
= WMRetainPixmap(WMGetApplicationIconPixmap(scr
->wmscreen
));
1253 size
= WMGetPixmapSize(logo
);
1254 panel
->logoL
= WMCreateLabel(panel
->win
);
1255 WMResizeWidget(panel
->logoL
, 64, 64);
1256 WMMoveWidget(panel
->logoL
, 30, 20);
1257 WMSetLabelImagePosition(panel
->logoL
, WIPImageOnly
);
1258 WMSetLabelImage(panel
->logoL
, logo
);
1260 WMCreateEventHandler(WMWidgetView(panel
->logoL
), ButtonPressMask
,
1261 handleLogoPush
, panel
);
1263 WMReleasePixmap(logo
);
1267 panel
->name1L
= WMCreateLabel(panel
->win
);
1268 WMResizeWidget(panel
->name1L
, 240, 30 - sepWidth
);
1269 WMMoveWidget(panel
->name1L
, 100, 30);
1271 if (WMIsAntialiasingEnabled(scr
->wmscreen
)) {
1272 font
= WMBoldSystemFontOfSize(scr
->wmscreen
, 24);
1274 font
= WMCreateFont(scr
->wmscreen
, "-*-utopia-*-r-*-*-25-*");
1275 font
= font
? font
: WMBoldSystemFontOfSize(scr
->wmscreen
, 24);
1277 strbuf
= "Window Maker";
1279 width
= WMWidthOfString(font
, strbuf
, strlen(strbuf
));
1280 WMSetLabelFont(panel
->name1L
, font
);
1281 WMReleaseFont(font
);
1283 WMSetLabelTextAlignment(panel
->name1L
, WACenter
);
1284 WMSetLabelText(panel
->name1L
, strbuf
);
1286 panel
->lineF
= WMCreateFrame(panel
->win
);
1287 WMResizeWidget(panel
->lineF
, width
, sepWidth
);
1288 WMMoveWidget(panel
->lineF
, 100+(240-width
)/2, 60 - sepWidth
);
1289 WMSetFrameRelief(panel
->lineF
, WRSimple
);
1290 WMSetWidgetBackgroundColor(panel
->lineF
, scr
->black
);
1292 panel
->name2L
= WMCreateLabel(panel
->win
);
1293 WMResizeWidget(panel
->name2L
, 240, 24);
1294 WMMoveWidget(panel
->name2L
, 100, 60);
1295 font
= WMBoldSystemFontOfSize(scr
->wmscreen
, 18);
1297 WMSetLabelFont(panel
->name2L
, font
);
1298 WMReleaseFont(font
);
1301 WMSetLabelTextAlignment(panel
->name2L
, WACenter
);
1302 WMSetLabelText(panel
->name2L
, _("Window Manager for X"));
1304 snprintf(buffer
, sizeof(buffer
), _("Version %s"), VERSION
);
1305 panel
->versionL
= WMCreateLabel(panel
->win
);
1306 WMResizeWidget(panel
->versionL
, 310, 16);
1307 WMMoveWidget(panel
->versionL
, 30, 95);
1308 WMSetLabelTextAlignment(panel
->versionL
, WARight
);
1309 WMSetLabelText(panel
->versionL
, buffer
);
1310 WMSetLabelWraps(panel
->versionL
, False
);
1312 panel
->copyrL
= WMCreateLabel(panel
->win
);
1313 WMResizeWidget(panel
->copyrL
, 360, 40);
1314 WMMoveWidget(panel
->copyrL
, 15, 185);
1315 WMSetLabelTextAlignment(panel
->copyrL
, WALeft
);
1316 WMSetLabelText(panel
->copyrL
, COPYRIGHT_TEXT
);
1317 /* we want the (c) character in the font, so don't use a FontSet here */
1318 // fix this -Dan font = WMCreateFontWithFlags(scr->wmscreen, "SystemFont-11", WFNormalFont);
1319 font
= WMSystemFontOfSize(scr
->wmscreen
, 11);
1321 WMSetLabelFont(panel
->copyrL
, font
);
1322 WMReleaseFont(font
);
1327 snprintf(buffer
, sizeof(buffer
), _("Using visual 0x%x: %s %ibpp "),
1328 (unsigned)scr
->w_visual
->visualid
,
1329 visuals
[scr
->w_visual
->class], scr
->w_depth
);
1331 strbuf
= wstrappend(strbuf
, buffer
);
1333 switch (scr
->w_depth
) {
1335 strbuf
= wstrappend(strbuf
, _("(32 thousand colors)\n"));
1338 strbuf
= wstrappend(strbuf
, _("(64 thousand colors)\n"));
1342 strbuf
= wstrappend(strbuf
, _("(16 million colors)\n"));
1345 snprintf(buffer
, sizeof(buffer
), _("(%d colors)\n"), 1<<scr
->w_depth
);
1346 strbuf
= wstrappend(strbuf
, buffer
);
1351 #if defined(HAVE_MALLOC_H) && defined(HAVE_MALLINFO)
1353 struct mallinfo ma
= mallinfo();
1354 snprintf(buffer
, sizeof(buffer
),
1355 _("Total allocated memory: %i kB. Total memory in use: %i kB.\n"),
1356 (ma
.arena
+ma
.hblkhd
)/1024, (ma
.uordblks
+ma
.hblkhd
)/1024);
1358 strbuf
= wstrappend(strbuf
, buffer
);
1362 strbuf
= wstrappend(strbuf
, _("Supported image formats: "));
1363 strl
= RSupportedFileFormats();
1364 for (i
=0; strl
[i
]!=NULL
; i
++) {
1365 strbuf
= wstrappend(strbuf
, strl
[i
]);
1366 strbuf
= wstrappend(strbuf
, " ");
1369 strbuf
= wstrappend(strbuf
, _("\nAdditional support for: "));
1382 list
[j
++] = "GNOME";
1389 for (i
= 0; i
< j
; i
++) {
1392 strcat(buf
, _(" and "));
1396 strcat(buf
, list
[i
]);
1398 strbuf
= wstrappend(strbuf
, buf
);
1401 if (wPreferences
.no_sound
) {
1402 strbuf
= wstrappend(strbuf
, _("\nSound disabled"));
1404 strbuf
= wstrappend(strbuf
, _("\nSound enabled"));
1408 strbuf
= wstrappend(strbuf
, _("; Antialiased text"));
1412 panel
->infoL
= WMCreateLabel(panel
->win
);
1413 WMResizeWidget(panel
->infoL
, 350, 75);
1414 WMMoveWidget(panel
->infoL
, 15, 115);
1415 WMSetLabelText(panel
->infoL
, strbuf
);
1416 font
= WMSystemFontOfSize(scr
->wmscreen
, 11);
1418 WMSetLabelFont(panel
->infoL
, font
);
1419 WMReleaseFont(font
);
1425 WMRealizeWidget(panel
->win
);
1426 WMMapSubwidgets(panel
->win
);
1428 parent
= XCreateSimpleWindow(dpy
, scr
->root_win
, 0, 0, 382, 230, 0, 0, 0);
1430 XReparentWindow(dpy
, WMWidgetXID(panel
->win
), parent
, 0, 0);
1432 WMMapWidget(panel
->win
);
1435 WMPoint center
= getCenter(scr
, 382, 230);
1437 wwin
= wManageInternalWindow(scr
, parent
, None
, _("Info"),
1442 WSETUFLAG(wwin
, no_closable
, 0);
1443 WSETUFLAG(wwin
, no_close_button
, 0);
1444 #ifdef XKB_BUTTON_HINT
1445 wFrameWindowHideButton(wwin
->frame
, WFF_LANGUAGE_BUTTON
);
1447 wWindowUpdateButtonImages(wwin
);
1448 wFrameWindowShowButton(wwin
->frame
, WFF_RIGHT_BUTTON
);
1449 wwin
->frame
->on_click_right
= destroyInfoPanel
;
1457 if (InitXThing(panel
->scr
)) {
1458 panel
->timer
= WMAddTimerHandler(100, logoPushCallback
, panel
);
1461 panel
->str
= _("Merry Christmas!");
1462 panel
->oldPix
= WMRetainPixmap(WMGetLabelImage(panel
->logoL
));
1469 ***********************************************************************
1471 ***********************************************************************
1485 static LegalPanel
*legalPanel
= NULL
;
1488 destroyLegalPanel(WCoreWindow
*foo
, void *data
, XEvent
*event
)
1490 WMUnmapWidget(legalPanel
->win
);
1492 WMDestroyWidget(legalPanel
->win
);
1494 wUnmanageWindow(legalPanel
->wwin
, False
, False
);
1503 wShowLegalPanel(WScreen
*scr
)
1510 if (legalPanel
->scr
== scr
) {
1511 wRaiseFrame(legalPanel
->wwin
->frame
->core
);
1512 wSetFocusTo(scr
, legalPanel
->wwin
);
1517 panel
= wmalloc(sizeof(LegalPanel
));
1521 panel
->win
= WMCreateWindow(scr
->wmscreen
, "legal");
1522 WMResizeWidget(panel
->win
, 420, 250);
1525 panel
->licenseL
= WMCreateLabel(panel
->win
);
1526 WMSetLabelWraps(panel
->licenseL
, True
);
1527 WMResizeWidget(panel
->licenseL
, 400, 230);
1528 WMMoveWidget(panel
->licenseL
, 10, 10);
1529 WMSetLabelTextAlignment(panel
->licenseL
, WALeft
);
1530 WMSetLabelText(panel
->licenseL
,
1531 _(" Window Maker is free software; you can redistribute it and/or\n"
1532 "modify it under the terms of the GNU General Public License as\n"
1533 "published by the Free Software Foundation; either version 2 of the\n"
1534 "License, or (at your option) any later version.\n\n"
1535 " Window Maker is distributed in the hope that it will be useful,\n"
1536 "but WITHOUT ANY WARRANTY; without even the implied warranty\n"
1537 "of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
1538 "See the GNU General Public License for more details.\n\n"
1539 " You should have received a copy of the GNU General Public\n"
1540 "License along with this program; if not, write to the Free Software\n"
1541 "Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA\n"
1542 "02111-1307, USA."));
1543 WMSetLabelRelief(panel
->licenseL
, WRGroove
);
1545 WMRealizeWidget(panel
->win
);
1546 WMMapSubwidgets(panel
->win
);
1548 parent
= XCreateSimpleWindow(dpy
, scr
->root_win
, 0, 0, 420, 250, 0, 0, 0);
1550 XReparentWindow(dpy
, WMWidgetXID(panel
->win
), parent
, 0, 0);
1553 WMPoint center
= getCenter(scr
, 420, 250);
1555 wwin
= wManageInternalWindow(scr
, parent
, None
, _("Legal"),
1560 WSETUFLAG(wwin
, no_closable
, 0);
1561 WSETUFLAG(wwin
, no_close_button
, 0);
1562 wWindowUpdateButtonImages(wwin
);
1563 wFrameWindowShowButton(wwin
->frame
, WFF_RIGHT_BUTTON
);
1564 #ifdef XKB_BUTTON_HINT
1565 wFrameWindowHideButton(wwin
->frame
, WFF_LANGUAGE_BUTTON
);
1567 wwin
->frame
->on_click_right
= destroyLegalPanel
;
1571 WMMapWidget(panel
->win
);
1580 ***********************************************************************
1581 * Crashing Dialog Panel
1582 ***********************************************************************
1585 extern WDDomain
*WDWindowAttributes
;
1588 typedef struct _CrashPanel
{
1589 WMWindow
*win
; /* main window */
1591 WMLabel
*iconL
; /* application icon */
1592 WMLabel
*nameL
; /* title of panel */
1594 WMFrame
*sepF
; /* separator frame */
1596 WMLabel
*noteL
; /* Title of note */
1597 WMLabel
*note2L
; /* body of note with what happened */
1599 WMFrame
*whatF
; /* "what to do next" frame */
1600 WMPopUpButton
*whatP
; /* action selection popup button */
1602 WMButton
*okB
; /* ok button */
1604 Bool done
; /* if finished with this dialog */
1605 int action
; /* what to do after */
1613 handleKeyPress(XEvent
*event
, void *clientData
)
1615 CrashPanel
*panel
= (CrashPanel
*)clientData
;
1617 if (event
->xkey
.keycode
== panel
->retKey
) {
1618 WMPerformButtonClick(panel
->okB
);
1624 okButtonCallback(void *self
, void *clientData
)
1626 CrashPanel
*panel
= (CrashPanel
*)clientData
;
1633 setCrashAction(void *self
, void *clientData
)
1635 WMPopUpButton
*pop
= (WMPopUpButton
*)self
;
1636 CrashPanel
*panel
= (CrashPanel
*)clientData
;
1638 panel
->action
= WMGetPopUpButtonSelectedItem(pop
);
1643 getWindowMakerIconImage(WMScreen
*scr
)
1645 WMPropList
*dict
, *key
, *option
, *value
=NULL
;
1649 WMPLSetCaseSensitive(True
);
1651 key
= WMCreatePLString("Logo.WMPanel");
1652 option
= WMCreatePLString("Icon");
1654 dict
= WMGetFromPLDictionary(WDWindowAttributes
->dictionary
, key
);
1657 value
= WMGetFromPLDictionary(dict
, option
);
1660 WMReleasePropList(key
);
1661 WMReleasePropList(option
);
1663 WMPLSetCaseSensitive(False
);
1665 if (value
&& WMIsPLString(value
)) {
1666 path
= FindImage(wPreferences
.icon_path
, WMGetFromPLString(value
));
1671 gray
.red
= 0xae; gray
.green
= 0xaa;
1672 gray
.blue
= 0xae; gray
.alpha
= 0;
1674 pix
= WMCreateBlendedPixmapFromFile(scr
, path
, &gray
);
1688 wShowCrashingDialogPanel(int whatSig
)
1694 int screen_no
, scr_width
, scr_height
;
1698 panel
= wmalloc(sizeof(CrashPanel
));
1699 memset(panel
, 0, sizeof(CrashPanel
));
1701 screen_no
= DefaultScreen(dpy
);
1702 scr_width
= WidthOfScreen(ScreenOfDisplay(dpy
, screen_no
));
1703 scr_height
= HeightOfScreen(ScreenOfDisplay(dpy
, screen_no
));
1705 scr
= WMCreateScreen(dpy
, screen_no
);
1707 wsyserror(_("cannot open connection for crashing dialog panel. Aborting."));
1711 panel
->retKey
= XKeysymToKeycode(dpy
, XK_Return
);
1713 panel
->win
= WMCreateWindow(scr
, "crashingDialog");
1714 WMResizeWidget(panel
->win
, PWIDTH
, PHEIGHT
);
1715 WMMoveWidget(panel
->win
, (scr_width
- PWIDTH
)/2, (scr_height
- PHEIGHT
)/2);
1717 logo
= getWindowMakerIconImage(scr
);
1719 panel
->iconL
= WMCreateLabel(panel
->win
);
1720 WMResizeWidget(panel
->iconL
, 64, 64);
1721 WMMoveWidget(panel
->iconL
, 10, 10);
1722 WMSetLabelImagePosition(panel
->iconL
, WIPImageOnly
);
1723 WMSetLabelImage(panel
->iconL
, logo
);
1726 panel
->nameL
= WMCreateLabel(panel
->win
);
1727 WMResizeWidget(panel
->nameL
, 190, 18);
1728 WMMoveWidget(panel
->nameL
, 80, 35);
1729 WMSetLabelTextAlignment(panel
->nameL
, WALeft
);
1730 font
= WMBoldSystemFontOfSize(scr
, 18);
1731 WMSetLabelFont(panel
->nameL
, font
);
1732 WMReleaseFont(font
);
1733 WMSetLabelText(panel
->nameL
, _("Fatal error"));
1735 panel
->sepF
= WMCreateFrame(panel
->win
);
1736 WMResizeWidget(panel
->sepF
, PWIDTH
+4, 2);
1737 WMMoveWidget(panel
->sepF
, -2, 80);
1739 panel
->noteL
= WMCreateLabel(panel
->win
);
1740 WMResizeWidget(panel
->noteL
, PWIDTH
-20, 40);
1741 WMMoveWidget(panel
->noteL
, 10, 90);
1742 WMSetLabelTextAlignment(panel
->noteL
, WAJustified
);
1743 #ifdef SYS_SIGLIST_DECLARED
1744 snprintf(buf
, sizeof(buf
), _("Window Maker received signal %i\n(%s)."),
1745 whatSig
, sys_siglist
[whatSig
]);
1747 snprintf(buf
, sizeof(buf
), _("Window Maker received signal %i."), whatSig
);
1749 WMSetLabelText(panel
->noteL
, buf
);
1751 panel
->note2L
= WMCreateLabel(panel
->win
);
1752 WMResizeWidget(panel
->note2L
, PWIDTH
-20, 100);
1753 WMMoveWidget(panel
->note2L
, 10, 130);
1754 WMSetLabelTextAlignment(panel
->note2L
, WALeft
);
1755 WMSetLabelText(panel
->note2L
,
1756 _(" This fatal error occured probably due to a bug."
1757 " Please fill the included BUGFORM and "
1758 "report it to bugs@windowmaker.org."));
1759 WMSetLabelWraps(panel
->note2L
, True
);
1762 panel
->whatF
= WMCreateFrame(panel
->win
);
1763 WMResizeWidget(panel
->whatF
, PWIDTH
-20, 50);
1764 WMMoveWidget(panel
->whatF
, 10, 240);
1765 WMSetFrameTitle(panel
->whatF
, _("What do you want to do now?"));
1767 panel
->whatP
= WMCreatePopUpButton(panel
->whatF
);
1768 WMResizeWidget(panel
->whatP
, PWIDTH
-20-70, 20);
1769 WMMoveWidget(panel
->whatP
, 35, 20);
1770 WMSetPopUpButtonPullsDown(panel
->whatP
, False
);
1771 WMSetPopUpButtonText(panel
->whatP
, _("Select action"));
1772 WMAddPopUpButtonItem(panel
->whatP
, _("Abort and leave a core file"));
1773 WMAddPopUpButtonItem(panel
->whatP
, _("Restart Window Maker"));
1774 WMAddPopUpButtonItem(panel
->whatP
, _("Start alternate window manager"));
1775 WMSetPopUpButtonAction(panel
->whatP
, setCrashAction
, panel
);
1776 WMSetPopUpButtonSelectedItem(panel
->whatP
, WMRestart
);
1777 panel
->action
= WMRestart
;
1779 WMMapSubwidgets(panel
->whatF
);
1781 panel
->okB
= WMCreateCommandButton(panel
->win
);
1782 WMResizeWidget(panel
->okB
, 80, 26);
1783 WMMoveWidget(panel
->okB
, 205, 309);
1784 WMSetButtonText(panel
->okB
, _("OK"));
1785 WMSetButtonImage(panel
->okB
, WMGetSystemPixmap(scr
, WSIReturnArrow
));
1786 WMSetButtonAltImage(panel
->okB
, WMGetSystemPixmap(scr
, WSIHighlightedReturnArrow
));
1787 WMSetButtonImagePosition(panel
->okB
, WIPRight
);
1788 WMSetButtonAction(panel
->okB
, okButtonCallback
, panel
);
1792 WMCreateEventHandler(WMWidgetView(panel
->win
), KeyPressMask
,
1793 handleKeyPress
, panel
);
1795 WMRealizeWidget(panel
->win
);
1796 WMMapSubwidgets(panel
->win
);
1798 WMMapWidget(panel
->win
);
1800 XSetInputFocus(dpy
, WMWidgetXID(panel
->win
), RevertToParent
, CurrentTime
);
1802 while (!panel
->done
) {
1805 WMNextEvent(dpy
, &event
);
1806 WMHandleEvent(&event
);
1809 action
= panel
->action
;
1811 WMUnmapWidget(panel
->win
);
1812 WMDestroyWidget(panel
->win
);
1821 /*****************************************************************************
1822 * About GNUstep Panel
1823 *****************************************************************************/
1827 drawGNUstepLogo(Display
*dpy
, Drawable d
, int width
, int height
,
1828 unsigned long blackPixel
, unsigned long whitePixel
)
1832 XRectangle rects
[3];
1834 gcv
.foreground
= blackPixel
;
1835 gc
= XCreateGC(dpy
, d
, GCForeground
, &gcv
);
1837 XFillArc(dpy
, d
, gc
, width
/45, height
/45,
1838 width
- 2*width
/45, height
- 2*height
/45, 0, 360*64);
1841 rects
[0].y
= 37*height
/45;
1842 rects
[0].width
= width
/3;
1843 rects
[0].height
= height
- rects
[0].y
;
1845 rects
[1].x
= rects
[0].width
;
1846 rects
[1].y
= height
/2;
1847 rects
[1].width
= width
- 2*width
/3;
1848 rects
[1].height
= height
- rects
[1].y
;
1850 rects
[2].x
= 2*width
/3;
1851 rects
[2].y
= height
- 37*height
/45;
1852 rects
[2].width
= width
/3;
1853 rects
[2].height
= height
- rects
[2].y
;
1855 XSetClipRectangles(dpy
, gc
, 0, 0, rects
, 3, Unsorted
);
1856 XFillRectangle(dpy
, d
, gc
, 0, 0, width
, height
);
1858 XSetForeground(dpy
, gc
, whitePixel
);
1859 XFillArc(dpy
, d
, gc
, width
/45, height
/45,
1860 width
- 2*width
/45, height
- 2*height
/45, 0, 360*64);
1878 static GNUstepPanel
*gnustepPanel
= NULL
;
1881 destroyGNUstepPanel(WCoreWindow
*foo
, void *data
, XEvent
*event
)
1883 WMUnmapWidget(gnustepPanel
->win
);
1885 WMDestroyWidget(gnustepPanel
->win
);
1887 wUnmanageWindow(gnustepPanel
->wwin
, False
, False
);
1889 wfree(gnustepPanel
);
1891 gnustepPanel
= NULL
;
1896 wShowGNUstepPanel(WScreen
*scr
)
1898 GNUstepPanel
*panel
;
1905 if (gnustepPanel
->scr
== scr
) {
1906 wRaiseFrame(gnustepPanel
->wwin
->frame
->core
);
1907 wSetFocusTo(scr
, gnustepPanel
->wwin
);
1912 panel
= wmalloc(sizeof(GNUstepPanel
));
1916 panel
->win
= WMCreateWindow(scr
->wmscreen
, "About GNUstep");
1917 WMResizeWidget(panel
->win
, 325, 205);
1919 pixmap
= WMCreatePixmap(scr
->wmscreen
, 130, 130,
1920 WMScreenDepth(scr
->wmscreen
), True
);
1922 color
= WMCreateNamedColor(scr
->wmscreen
, "gray50", True
);
1924 drawGNUstepLogo(dpy
, WMGetPixmapXID(pixmap
), 130, 130,
1925 WMColorPixel(color
), scr
->white_pixel
);
1927 WMReleaseColor(color
);
1929 XSetForeground(dpy
, scr
->mono_gc
, 0);
1930 XFillRectangle(dpy
, WMGetPixmapMaskXID(pixmap
), scr
->mono_gc
, 0, 0,
1932 drawGNUstepLogo(dpy
, WMGetPixmapMaskXID(pixmap
), 130, 130, 1, 1);
1934 panel
->gstepL
= WMCreateLabel(panel
->win
);
1935 WMResizeWidget(panel
->gstepL
, 285, 64);
1936 WMMoveWidget(panel
->gstepL
, 20, 0);
1937 WMSetLabelTextAlignment(panel
->gstepL
, WARight
);
1938 WMSetLabelText(panel
->gstepL
, "GNUstep");
1940 WMFont
*font
= WMBoldSystemFontOfSize(scr
->wmscreen
, 24);
1942 WMSetLabelFont(panel
->gstepL
, font
);
1943 WMReleaseFont(font
);
1946 panel
->textL
= WMCreateLabel(panel
->win
);
1947 WMResizeWidget(panel
->textL
, 305, 140);
1948 WMMoveWidget(panel
->textL
, 10, 50);
1949 WMSetLabelTextAlignment(panel
->textL
, WARight
);
1950 WMSetLabelImagePosition(panel
->textL
, WIPOverlaps
);
1951 WMSetLabelText(panel
->textL
,
1952 _("Window Maker is part of the GNUstep project.\n"\
1953 "The GNUstep project aims to create a free\n"\
1954 "implementation of the OpenStep(tm) specification\n"\
1955 "which is a object-oriented framework for\n"\
1956 "creating advanced graphical, multi-platform\n"\
1957 "applications. Additionally, a development and\n"\
1958 "user desktop enviroment will be created on top\n"\
1959 "of the framework. For more information about\n"\
1960 "GNUstep, please visit: www.gnustep.org"));
1961 WMSetLabelImage(panel
->textL
, pixmap
);
1963 WMReleasePixmap(pixmap
);
1965 WMRealizeWidget(panel
->win
);
1966 WMMapSubwidgets(panel
->win
);
1968 parent
= XCreateSimpleWindow(dpy
, scr
->root_win
, 0, 0, 325, 200, 0, 0, 0);
1970 XReparentWindow(dpy
, WMWidgetXID(panel
->win
), parent
, 0, 0);
1973 WMPoint center
= getCenter(scr
, 325, 200);
1975 wwin
= wManageInternalWindow(scr
, parent
, None
, _("About GNUstep"),
1980 WSETUFLAG(wwin
, no_closable
, 0);
1981 WSETUFLAG(wwin
, no_close_button
, 0);
1982 wWindowUpdateButtonImages(wwin
);
1983 wFrameWindowShowButton(wwin
->frame
, WFF_RIGHT_BUTTON
);
1984 #ifdef XKB_BUTTON_HINT
1985 wFrameWindowHideButton(wwin
->frame
, WFF_LANGUAGE_BUTTON
);
1987 wwin
->frame
->on_click_right
= destroyGNUstepPanel
;
1991 WMMapWidget(panel
->win
);
1995 gnustepPanel
= panel
;