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 GC gc
= panel
->scr
->draw_gc
;
446 GC copygc
= panel
->scr
->copy_gc
;
447 char *file
, *dirfile
;
449 WMColor
*black
, *white
, *gray
, *back
;
451 WMScreen
*wmscr
= WMWidgetScreen(panel
->win
);
453 int x
, y
, width
, height
, len
;
455 if(!panel
->preview
) return;
459 width
= rect
->size
.width
;
460 height
= rect
->size
.height
;
462 black
= WMBlackColor(wmscr
);
463 white
= WMWhiteColor(wmscr
);
464 gray
= WMGrayColor(wmscr
);
465 back
= (state
& WLDSSelected
) ? white
: gray
;
467 dirfile
= wexpandpath(WMGetListSelectedItem(panel
->dirList
)->text
);
468 len
= strlen(dirfile
)+strlen(text
)+4;
470 snprintf(file
, len
, "%s/%s", dirfile
, text
);
473 color
.red
= WMRedComponentOfColor(back
) >> 8;
474 color
.green
= WMGreenComponentOfColor(back
) >> 8;
475 color
.blue
= WMBlueComponentOfColor(back
) >> 8;
476 color
.alpha
= WMGetColorAlpha(back
) >> 8;
478 pixmap
= WMCreateBlendedPixmapFromFile(wmscr
, file
, &color
);
482 /*WMRemoveListItem(lPtr, index);*/
483 WMReleaseColor(black
);
484 WMReleaseColor(white
);
485 WMReleaseColor(gray
);
489 XFillRectangle(dpy
, d
, WMColorGC(back
), x
, y
, width
, height
);
491 XSetClipMask(dpy
, gc
, None
);
492 /*XDrawRectangle(dpy, d, WMColorGC(white), x+5, y+5, width-10, 54);*/
493 XDrawLine(dpy
, d
, WMColorGC(white
), x
, y
+height
-1, x
+width
, y
+height
-1);
495 size
= WMGetPixmapSize(pixmap
);
497 XSetClipMask(dpy
, copygc
, WMGetPixmapMaskXID(pixmap
));
498 XSetClipOrigin(dpy
, copygc
, x
+ (width
-size
.width
)/2, y
+2);
499 XCopyArea(dpy
, WMGetPixmapXID(pixmap
), d
, copygc
, 0, 0,
500 size
.width
>100?100:size
.width
, size
.height
>64?64:size
.height
,
501 x
+ (width
-size
.width
)/2, y
+2);
505 int fheight
= WMFontHeight(panel
->normalfont
);
506 int tlen
= strlen(text
);
507 int twidth
= WMWidthOfString(panel
->normalfont
, text
, tlen
);
510 ofx
= x
+ (width
- twidth
)/2;
511 ofy
= y
+ 64 - fheight
;
515 WMDrawString(wmscr
, d
, white
, panel
->normalfont
,
516 ofx
+i
, ofy
+j
, text
, tlen
);
518 WMDrawString(wmscr
, d
, black
, panel
->normalfont
, ofx
, ofy
,
522 WMReleasePixmap(pixmap
);
523 /* I hope it is better to do not use cache / on my box it is fast nuff */
526 WMReleaseColor(black
);
527 WMReleaseColor(white
);
528 WMReleaseColor(gray
);
533 buttonCallback(void *self
, void *clientData
)
535 WMButton
*bPtr
= (WMButton
*)self
;
536 IconPanel
*panel
= (IconPanel
*)clientData
;
539 if (bPtr
==panel
->okButton
) {
541 panel
->result
= True
;
542 } else if (bPtr
==panel
->cancelButton
) {
544 panel
->result
= False
;
545 } else if (bPtr
==panel
->previewButton
) {
546 /**** Previewer ****/
547 WMSetButtonEnabled(bPtr
, False
);
548 WMSetListUserDrawItemHeight(panel
->iconList
, 68);
549 WMSetListUserDrawProc(panel
->iconList
, drawIconProc
);
550 WMRedisplayWidget(panel
->iconList
);
551 /* for draw proc to access screen/gc */
552 /*** end preview ***/
555 else if (bPtr
==panel
->chooseButton
) {
558 op
= WMCreateOpenPanel(WMWidgetScreen(bPtr
));
560 if (WMRunModalFilePanelForDirectory(op
, NULL
, "/usr/local", NULL
, NULL
)) {
562 path
= WMGetFilePanelFile(op
);
563 WMSetTextFieldText(panel
->fileField
, path
);
564 setViewedImage(panel
, path
);
567 WMDestroyFilePanel(op
);
574 keyPressHandler(XEvent
*event
, void *data
)
576 IconPanel
*panel
= (IconPanel
*)data
;
585 if (event
->type
== KeyRelease
)
589 count
= XLookupString(&event
->xkey
, buffer
, sizeof(buffer
), &ksym
, NULL
);
592 iidx
= WMGetListSelectedItemRow(panel
->iconList
);
593 didx
= WMGetListSelectedItemRow(panel
->dirList
);
601 list
= panel
->iconList
;
604 if (iidx
< WMGetListNumberOfRows(panel
->iconList
) - 1)
608 list
= panel
->iconList
;
612 list
= panel
->iconList
;
615 item
= WMGetListNumberOfRows(panel
->iconList
) - 1;
616 list
= panel
->iconList
;
619 if (didx
< WMGetListNumberOfRows(panel
->dirList
) - 1)
623 list
= panel
->dirList
;
630 list
= panel
->dirList
;
633 WMPerformButtonClick(panel
->okButton
);
636 WMPerformButtonClick(panel
->cancelButton
);
641 WMSelectListItem(list
, item
);
642 WMSetListPosition(list
, item
- 5);
643 listCallback(list
, panel
);
650 wIconChooserDialog(WScreen
*scr
, char **file
, char *instance
, char *class)
658 panel
= wmalloc(sizeof(IconPanel
));
659 memset(panel
, 0, sizeof(IconPanel
));
663 panel
->win
= WMCreateWindow(scr
->wmscreen
, "iconChooser");
664 WMResizeWidget(panel
->win
, 450, 280);
666 WMCreateEventHandler(WMWidgetView(panel
->win
), KeyPressMask
|KeyReleaseMask
,
667 keyPressHandler
, panel
);
670 boldFont
= WMBoldSystemFontOfSize(scr
->wmscreen
, 12);
671 panel
->normalfont
= WMSystemFontOfSize(WMWidgetScreen(panel
->win
), 12);
673 panel
->dirLabel
= WMCreateLabel(panel
->win
);
674 WMResizeWidget(panel
->dirLabel
, 200, 20);
675 WMMoveWidget(panel
->dirLabel
, 10, 7);
676 WMSetLabelText(panel
->dirLabel
, _("Directories"));
677 WMSetLabelFont(panel
->dirLabel
, boldFont
);
678 WMSetLabelTextAlignment(panel
->dirLabel
, WACenter
);
680 WMSetLabelRelief(panel
->dirLabel
, WRSunken
);
682 panel
->iconLabel
= WMCreateLabel(panel
->win
);
683 WMResizeWidget(panel
->iconLabel
, 140, 20);
684 WMMoveWidget(panel
->iconLabel
, 215, 7);
685 WMSetLabelText(panel
->iconLabel
, _("Icons"));
686 WMSetLabelFont(panel
->iconLabel
, boldFont
);
687 WMSetLabelTextAlignment(panel
->iconLabel
, WACenter
);
689 WMReleaseFont(boldFont
);
691 color
= WMWhiteColor(scr
->wmscreen
);
692 WMSetLabelTextColor(panel
->dirLabel
, color
);
693 WMSetLabelTextColor(panel
->iconLabel
, color
);
694 WMReleaseColor(color
);
696 color
= WMDarkGrayColor(scr
->wmscreen
);
697 WMSetWidgetBackgroundColor(panel
->iconLabel
, color
);
698 WMSetWidgetBackgroundColor(panel
->dirLabel
, color
);
699 WMReleaseColor(color
);
701 WMSetLabelRelief(panel
->iconLabel
, WRSunken
);
703 panel
->dirList
= WMCreateList(panel
->win
);
704 WMResizeWidget(panel
->dirList
, 200, 170);
705 WMMoveWidget(panel
->dirList
, 10, 30);
706 WMSetListAction(panel
->dirList
, listCallback
, panel
);
708 panel
->iconList
= WMCreateList(panel
->win
);
709 WMResizeWidget(panel
->iconList
, 140, 170);
710 WMMoveWidget(panel
->iconList
, 215, 30);
711 WMSetListAction(panel
->iconList
, listCallback
, panel
);
713 WMHangData(panel
->iconList
,panel
);
715 panel
->previewButton
= WMCreateCommandButton(panel
->win
);
716 WMResizeWidget(panel
->previewButton
, 75, 26);
717 WMMoveWidget(panel
->previewButton
, 365, 130);
718 WMSetButtonText(panel
->previewButton
, _("Preview"));
719 WMSetButtonAction(panel
->previewButton
, buttonCallback
, panel
);
721 panel
->iconView
= WMCreateLabel(panel
->win
);
722 WMResizeWidget(panel
->iconView
, 75, 75);
723 WMMoveWidget(panel
->iconView
, 365, 40);
724 WMSetLabelImagePosition(panel
->iconView
, WIPOverlaps
);
725 WMSetLabelRelief(panel
->iconView
, WRSunken
);
726 WMSetLabelTextAlignment(panel
->iconView
, WACenter
);
728 panel
->fileLabel
= WMCreateLabel(panel
->win
);
729 WMResizeWidget(panel
->fileLabel
, 80, 20);
730 WMMoveWidget(panel
->fileLabel
, 10, 210);
731 WMSetLabelText(panel
->fileLabel
, _("File Name:"));
733 panel
->fileField
= WMCreateTextField(panel
->win
);
734 WMSetViewNextResponder(WMWidgetView(panel
->fileField
), WMWidgetView(panel
->win
));
735 WMResizeWidget(panel
->fileField
, 345, 20);
736 WMMoveWidget(panel
->fileField
, 95, 210);
737 WMSetTextFieldEditable(panel
->fileField
, False
);
739 panel
->okButton
= WMCreateCommandButton(panel
->win
);
740 WMResizeWidget(panel
->okButton
, 80, 26);
741 WMMoveWidget(panel
->okButton
, 360, 240);
742 WMSetButtonText(panel
->okButton
, _("OK"));
743 WMSetButtonEnabled(panel
->okButton
, False
);
744 WMSetButtonAction(panel
->okButton
, buttonCallback
, panel
);
746 panel
->cancelButton
= WMCreateCommandButton(panel
->win
);
747 WMResizeWidget(panel
->cancelButton
, 80, 26);
748 WMMoveWidget(panel
->cancelButton
, 270, 240);
749 WMSetButtonText(panel
->cancelButton
, _("Cancel"));
750 WMSetButtonAction(panel
->cancelButton
, buttonCallback
, panel
);
752 panel
->chooseButton
= WMCreateCommandButton(panel
->win
);
753 WMResizeWidget(panel
->chooseButton
, 110, 26);
754 WMMoveWidget(panel
->chooseButton
, 150, 240);
755 WMSetButtonText(panel
->chooseButton
, _("Choose File"));
756 WMSetButtonAction(panel
->chooseButton
, buttonCallback
, panel
);
758 WMRealizeWidget(panel
->win
);
759 WMMapSubwidgets(panel
->win
);
761 parent
= XCreateSimpleWindow(dpy
, scr
->root_win
, 0, 0, 450, 280, 0, 0, 0);
763 XReparentWindow(dpy
, WMWidgetXID(panel
->win
), parent
, 0, 0);
767 int len
= (instance
? strlen(instance
) : 0)
768 + (class ? strlen(class) : 0) + 32;
773 if (tmp
&& (instance
|| class))
774 snprintf(tmp
, len
, "%s [%s.%s]", _("Icon Chooser"), instance
, class);
776 strcpy(tmp
, _("Icon Chooser"));
778 center
= getCenter(scr
, 450, 280);
780 wwin
= wManageInternalWindow(scr
, parent
, None
, tmp
, center
.x
,center
.y
,
785 /* put icon paths in the list */
786 listIconPaths(panel
->dirList
);
788 WMMapWidget(panel
->win
);
792 while (!panel
->done
) {
795 WMNextEvent(dpy
, &event
);
796 WMHandleEvent(&event
);
800 char *defaultPath
, *wantedPath
;
802 /* check if the file the user selected is not the one that
803 * would be loaded by default with the current search path */
804 *file
= WMGetListSelectedItem(panel
->iconList
)->text
;
809 defaultPath
= FindImage(wPreferences
.icon_path
, *file
);
810 wantedPath
= WMGetTextFieldText(panel
->fileField
);
811 /* if the file is not the default, use full path */
812 if (strcmp(wantedPath
, defaultPath
)!=0) {
815 *file
= wstrdup(*file
);
824 WMReleaseFont(panel
->normalfont
);
826 WMUnmapWidget(panel
->win
);
828 WMDestroyWidget(panel
->win
);
830 wUnmanageWindow(wwin
, False
, False
);
834 XDestroyWindow(dpy
, parent
);
836 return panel
->result
;
841 ***********************************************************************
843 ***********************************************************************
878 #define COPYRIGHT_TEXT \
879 "Copyright \xa9 1997-2002 Alfredo K. Kojima <kojima@windowmaker.org>\n"\
880 "Copyright \xa9 1998-2002 Dan Pascu <dan@windowmaker.org>"
884 static InfoPanel
*thePanel
= NULL
;
887 destroyInfoPanel(WCoreWindow
*foo
, void *data
, XEvent
*event
)
890 if (thePanel
->timer
) {
891 WMDeleteTimerHandler(thePanel
->timer
);
893 if (thePanel
->oldPix
) {
894 WMReleasePixmap(thePanel
->oldPix
);
896 if (thePanel
->oldFont
) {
897 WMReleaseFont(thePanel
->oldFont
);
899 if (thePanel
->icon
) {
900 RReleaseImage(thePanel
->icon
);
903 RReleaseImage(thePanel
->pic
);
905 #endif /* SILLYNESS */
906 WMUnmapWidget(thePanel
);
908 wUnmanageWindow(thePanel
->wwin
, False
, False
);
910 WMDestroyWidget(thePanel
->win
);
919 renderText(WMScreen
*scr
, char *text
, char *font
, RColor
*from
, RColor
*to
)
921 WMPixmap
*wpix
= NULL
;
924 RContext
*rc
= WMScreenRContext(scr
);
925 XFontStruct
*f
= NULL
;
929 f
= XLoadQueryFont(dpy
, font
);
933 w
= XTextWidth(f
, text
, strlen(text
));
934 h
= f
->ascent
+f
->descent
;
936 mask
= XCreatePixmap(dpy
, rc
->drawable
, w
, h
, 1);
937 gc
= XCreateGC(dpy
, mask
, 0, NULL
);
938 XSetForeground(dpy
, gc
, 0);
939 XSetFont(dpy
, gc
, f
->fid
);
940 XFillRectangle(dpy
, mask
, gc
, 0, 0, w
, h
);
942 XSetForeground(dpy
, gc
, 1);
943 XDrawString(dpy
, mask
, gc
, 0, f
->ascent
, text
, strlen(text
));
944 XSetLineAttributes(dpy
, gc
, 3, LineSolid
, CapRound
, JoinMiter
);
945 XDrawLine(dpy
, mask
, gc
, 0, h
-2, w
, h
-2);
947 grad
= XCreatePixmap(dpy
, rc
->drawable
, w
, h
, rc
->depth
);
951 color
= WMBlackColor(scr
);
952 XFillRectangle(dpy
, grad
, WMColorGC(color
), 0, 0, w
, h
);
953 WMReleaseColor(color
);
956 wpix
= WMCreatePixmapFromXPixmaps(scr
, grad
, mask
, w
, h
, rc
->depth
);
967 extern WMPixmap
*DoXThing();
968 extern Bool
InitXThing();
971 logoPushCallback(void *data
)
973 InfoPanel
*panel
= (InfoPanel
*)data
;
978 static int jingobeu
[] = {
979 329, 150, -1, 100, 329, 150, -1, 100, 329, 300, -1, 250,
980 329, 150, -1, 100, 329, 150, -1, 100, 329, 300, -1, 250,
981 329, 150, 392, 150, 261, 150, 293, 150, 329, 400, -1, 400, 0
987 XKeyboardState ksave
;
988 unsigned long mask
= KBBellPitch
|KBBellDuration
|KBBellPercent
;
990 XGetKeyboardControl(dpy
, &ksave
);
993 if(jingobeu
[panel
->x
-1]==0) {
995 } else if (jingobeu
[panel
->x
-1]<0) {
997 c
=jingobeu
[panel
->x
-1]/50;
1001 kc
.bell_pitch
=jingobeu
[panel
->x
-1];
1003 kc
.bell_duration
=jingobeu
[panel
->x
-1];
1004 c
=jingobeu
[panel
->x
-1]/50;
1006 XChangeKeyboardControl(dpy
, mask
, &kc
);
1013 if (!(panel
->cycle
% 4)) {
1016 p
= DoXThing(panel
->wwin
);
1017 WMSetLabelImage(panel
->logoL
, p
);
1019 kc
.bell_pitch
= ksave
.bell_pitch
;
1020 kc
.bell_percent
= ksave
.bell_percent
;
1021 kc
.bell_duration
= ksave
.bell_duration
;
1022 XChangeKeyboardControl(dpy
, mask
, &kc
);
1023 } else if (panel
->cycle
< 30) {
1028 gray
.red
= 0xae; gray
.green
= 0xaa;
1029 gray
.blue
= 0xae; gray
.alpha
= 0;
1031 image
= RScaleImage(panel
->icon
, panel
->pic
->width
, panel
->pic
->height
);
1032 RCombineImagesWithOpaqueness(image
, panel
->pic
, panel
->cycle
*255/30);
1033 pix
= WMCreateBlendedPixmapFromRImage(panel
->scr
->wmscreen
, image
, &gray
);
1034 RReleaseImage(image
);
1035 WMSetLabelImage(panel
->logoL
, pix
);
1036 WMReleasePixmap(pix
);
1039 /* slow down text a little */
1040 i
= (int)(panel
->cycle
* 50.0/85.0)%200;
1043 len
= strlen(panel
->str
);
1045 strncpy(buffer
, panel
->str
, i
<len
? i
: len
);
1047 memset(&buffer
[len
], ' ', i
-len
);
1049 strncpy(buffer
, panel
->str
, i
<len
? i
: len
);
1051 memset(&buffer
[len
], ' ', i
-len
);
1054 WMSetLabelText(panel
->versionL
, buffer
);
1056 XFlush(WMScreenDisplay(WMWidgetScreen(panel
->versionL
)));
1061 panel
->timer
= WMAddTimerHandler(50, logoPushCallback
, panel
);
1067 handleLogoPush(XEvent
*event
, void *data
)
1069 InfoPanel
*panel
= (InfoPanel
*)data
;
1070 static int broken
= 0;
1071 static int clicks
= 0;
1072 static char *pic_data
[] = {
1131 " ............... ",
1132 " ....XoO+@##+O$%.... ",
1133 " ...%X&*========-;;:o... ",
1134 " ...>.>,<122222222222134@... ",
1135 " ..>5678912222222222222220q%.. ",
1136 " ..$.&-w2222222222222222222er>.. ",
1137 " ..O.t31222222222222222222222y4>.. ",
1138 " ...O5u3222222222222222222222222yri... ",
1139 " ..>p&a22222222222222222222222222wso.. ",
1140 " ..ids91222222222222222222222222222wfi.. ",
1141 " ..X.7w222222wgs-w2222222213=g0222222<hi.. ",
1142 " ..Xuj2222222<@X5=222222229k@l:022222y4i.. ",
1143 " .Xdz22222222*X%.s22222222axo%$-222222<c>.. ",
1144 " ..o7y22222222v...r222222223hX.i82222221si.. ",
1145 "..io*222222222&...u22222222yt..%*22222220:%. ",
1146 "..>k02222222227...f222222222v..X=222222229t. ",
1147 "..dz12222222220ui:y2222222223d%qw222222221g. ",
1148 ".%vw222222222221y2222222222219*y2222222222wd.",
1149 ".X;2222222222222222222222222222222222222222b.",
1150 ".i*2222222222222222222222222222222222222222v.",
1151 ".i*2222222222222222222222222222222222222222;.",
1152 ".i*22222222222222222222222222222222222222228.",
1153 ".>*2222222222222222222222222222222222222222=.",
1154 ".i*22222222222222222222222222222222222222228.",
1155 ".i*2222222222222222222222222222222222222222;.",
1156 ".X*222222222222222222222222222222we12222222r.",
1157 ".Xs12222222w3aw22222222222222222y8s0222222wk.",
1158 ".Xq02222222a,na22222222222222222zm6zwy2222gi.",
1159 "..>*22222y<:Xcj22222222222222222-o$k;;02228..",
1160 "..i7y2220rhX.:y22222222222222222jtiXd,a220,..",
1161 " .X@z222a,do%kj2222222222222222wMX5q;gw228%..",
1162 " ..58222wagsh6ry222222222222221;>Of0w222y:...",
1163 " ...:e2222218mdz22222222222222a&$vw222220@...",
1164 " ...O-122222y:.u02222222222229q$uj222221r... ",
1165 " ..%&a1222223&573w2222222219NOxz122221z>... ",
1166 " ...t3222221-l$nr8ay1222yzbo,=12222w-5... ",
1167 " ..X:022222w-k+>o,7s**s7xOn=12221<f5... ",
1168 " ..o:9222221j8:&Bl>>>>ihv<12221=dX... ",
1169 " ..Xb9122222109g-****;<y22221zn%... ",
1170 " ..X&801222222222222222222w-h.... ",
1171 " ...o:=022222222222222221=lX... ",
1172 " ..X@:;3w2222222222210fO... ",
1173 " ...XX&v8<30000003-N@... ",
1174 " .....XmnbN:q&Bo.... ",
1177 static char *msgs
[] = {
1179 "Focus follow mouse users will burn in hell!!!",
1181 "Hi! My name is bobby...",
1182 "AHH! The neurotic monkeys are after me!",
1184 "HOW ARE YOU GENTLEMEN?",
1186 "SOMEBODY SET UP US THE BOMB",
1187 "ALL YOUR BASE ARE BELONG TO US!",
1188 "Oh My God!!! Larry is back!"
1194 if (!panel
->timer
&& !broken
&& clicks
> 0) {
1200 panel
->icon
= WMGetApplicationIconImage(panel
->scr
->wmscreen
);
1207 color
.red
= 0xae; color
.green
= 0xaa;
1208 color
.blue
= 0xae; color
.alpha
= 0;
1210 panel
->icon
= RCloneImage(panel
->icon
);
1211 RCombineImageWithColor(panel
->icon
, &color
);
1215 panel
->pic
= RGetImageFromXPMData(panel
->scr
->rcontext
, pic_data
);
1218 RReleaseImage(panel
->icon
);
1224 panel
->str
= msgs
[rand()%(sizeof(msgs
)/sizeof(char*))];
1226 panel
->timer
= WMAddTimerHandler(50, logoPushCallback
, panel
);
1228 panel
->oldPix
= WMRetainPixmap(WMGetLabelImage(panel
->logoL
));
1229 /* If we don't use a fixed font, scrolling will be jumpy */
1230 /* Alternatively we can draw text in a pixmap and scroll it smoothly */
1231 if ((panel
->oldFont
= WMGetLabelFont(panel
->versionL
))!=NULL
)
1232 WMRetainFont(panel
->oldFont
);
1233 font
= WMCreateFont(WMWidgetScreen(panel
->versionL
), "-*-fixed-*-*-*-*-14-*-*-*-*-*-*-*");
1235 WMSetLabelFont(panel
->versionL
, font
);
1236 WMReleaseFont(font
);
1238 WMSetLabelText(panel
->versionL
, "");
1239 } else if (panel
->timer
) {
1244 WMSetLabelImage(panel
->logoL
, panel
->oldPix
);
1245 WMReleasePixmap(panel
->oldPix
);
1246 panel
->oldPix
= NULL
;
1248 WMDeleteTimerHandler(panel
->timer
);
1249 panel
->timer
= NULL
;
1251 WMSetLabelFont(panel
->versionL
, panel
->oldFont
);
1252 if (panel
->oldFont
) {
1253 WMReleaseFont(panel
->oldFont
);
1254 panel
->oldFont
= NULL
;
1256 snprintf(version
, sizeof(version
), _("Version %s"), VERSION
);
1257 WMSetLabelText(panel
->versionL
, version
);
1258 XFlush(WMScreenDisplay(WMWidgetScreen(panel
->versionL
)));
1263 while (XCheckTypedWindowEvent(dpy
, WMWidgetXID(panel
->versionL
),
1267 #endif /* SILLYNESS */
1271 wShowInfoPanel(WScreen
*scr
)
1277 char *strbuf
= NULL
;
1281 RColor color1
, color2
;
1295 if (thePanel
->scr
== scr
) {
1296 wRaiseFrame(thePanel
->wwin
->frame
->core
);
1297 wSetFocusTo(scr
, thePanel
->wwin
);
1302 panel
= wmalloc(sizeof(InfoPanel
));
1303 memset(panel
, 0, sizeof(InfoPanel
));
1307 panel
->win
= WMCreateWindow(scr
->wmscreen
, "info");
1308 WMResizeWidget(panel
->win
, 382, 230);
1310 logo
= WMCreateApplicationIconBlendedPixmap(scr
->wmscreen
, (RColor
*)NULL
);
1312 logo
= WMRetainPixmap(WMGetApplicationIconPixmap(scr
->wmscreen
));
1315 size
= WMGetPixmapSize(logo
);
1316 panel
->logoL
= WMCreateLabel(panel
->win
);
1317 WMResizeWidget(panel
->logoL
, 64, 64);
1318 WMMoveWidget(panel
->logoL
, 30, 20);
1319 WMSetLabelImagePosition(panel
->logoL
, WIPImageOnly
);
1320 WMSetLabelImage(panel
->logoL
, logo
);
1322 WMCreateEventHandler(WMWidgetView(panel
->logoL
), ButtonPressMask
,
1323 handleLogoPush
, panel
);
1325 WMReleasePixmap(logo
);
1328 panel
->name1L
= WMCreateLabel(panel
->win
);
1329 WMResizeWidget(panel
->name1L
, 240, 30);
1330 WMMoveWidget(panel
->name1L
, 100, 30);
1335 color2
.green
= 0x50;
1337 logo
= renderText(scr
->wmscreen
, "Window Maker",
1338 "-*-utopia-*-r-*-*-25-*", &color1
, &color2
);
1340 WMSetLabelImagePosition(panel
->name1L
, WIPImageOnly
);
1341 WMSetLabelImage(panel
->name1L
, logo
);
1342 WMReleasePixmap(logo
);
1344 font
= WMBoldSystemFontOfSize(scr
->wmscreen
, 20);
1346 WMSetLabelFont(panel
->name1L
, font
);
1347 WMReleaseFont(font
);
1349 WMSetLabelTextAlignment(panel
->name1L
, WACenter
);
1350 WMSetLabelText(panel
->name1L
, "Window Maker");
1353 panel
->name2L
= WMCreateLabel(panel
->win
);
1354 WMResizeWidget(panel
->name2L
, 240, 24);
1355 WMMoveWidget(panel
->name2L
, 100, 60);
1356 font
= WMBoldSystemFontOfSize(scr
->wmscreen
, 18);
1358 WMSetLabelFont(panel
->name2L
, font
);
1359 WMReleaseFont(font
);
1362 WMSetLabelTextAlignment(panel
->name2L
, WACenter
);
1363 WMSetLabelText(panel
->name2L
, _("Window Manager for X"));
1366 snprintf(buffer
, sizeof(buffer
), _("Version %s"), VERSION
);
1367 panel
->versionL
= WMCreateLabel(panel
->win
);
1368 WMResizeWidget(panel
->versionL
, 310, 16);
1369 WMMoveWidget(panel
->versionL
, 30, 95);
1370 WMSetLabelTextAlignment(panel
->versionL
, WARight
);
1371 WMSetLabelText(panel
->versionL
, buffer
);
1372 WMSetLabelWraps(panel
->versionL
, False
);
1374 panel
->copyrL
= WMCreateLabel(panel
->win
);
1375 WMResizeWidget(panel
->copyrL
, 340, 40);
1376 WMMoveWidget(panel
->copyrL
, 15, 185);
1377 WMSetLabelTextAlignment(panel
->copyrL
, WALeft
);
1378 WMSetLabelText(panel
->copyrL
, COPYRIGHT_TEXT
);
1379 /* we want the (c) character in the helvetica font */
1380 font
= WMCreateNormalFont(scr
->wmscreen
, HELVETICA10_FONT
);
1382 WMSetLabelFont(panel
->copyrL
, font
);
1383 WMReleaseFont(font
);
1388 snprintf(buffer
, sizeof(buffer
), _("Using visual 0x%x: %s %ibpp "),
1389 (unsigned)scr
->w_visual
->visualid
,
1390 visuals
[scr
->w_visual
->class], scr
->w_depth
);
1392 strbuf
= wstrappend(strbuf
, buffer
);
1394 switch (scr
->w_depth
) {
1396 strbuf
= wstrappend(strbuf
, _("(32 thousand colors)\n"));
1399 strbuf
= wstrappend(strbuf
, _("(64 thousand colors)\n"));
1403 strbuf
= wstrappend(strbuf
, _("(16 million colors)\n"));
1406 snprintf(buffer
, sizeof(buffer
), _("(%d colors)\n"), 1<<scr
->w_depth
);
1407 strbuf
= wstrappend(strbuf
, buffer
);
1412 #if defined(HAVE_MALLOC_H) && defined(HAVE_MALLINFO)
1414 struct mallinfo ma
= mallinfo();
1415 snprintf(buffer
, sizeof(buffer
),
1416 _("Total allocated memory: %i kB. Total memory in use: %i kB.\n"),
1417 (ma
.arena
+ma
.hblkhd
)/1024, (ma
.uordblks
+ma
.hblkhd
)/1024);
1419 strbuf
= wstrappend(strbuf
, buffer
);
1423 strbuf
= wstrappend(strbuf
, _("Supported image formats: "));
1424 strl
= RSupportedFileFormats();
1425 for (i
=0; strl
[i
]!=NULL
; i
++) {
1426 strbuf
= wstrappend(strbuf
, strl
[i
]);
1427 strbuf
= wstrappend(strbuf
, " ");
1430 strbuf
= wstrappend(strbuf
, _("\nAdditional support for: "));
1443 list
[j
++] = "GNOME";
1450 for (i
= 0; i
< j
; i
++) {
1453 strcat(buf
, _(" and "));
1457 strcat(buf
, list
[i
]);
1459 strbuf
= wstrappend(strbuf
, buf
);
1462 if (wPreferences
.no_sound
) {
1463 strbuf
= wstrappend(strbuf
, _("\nSound disabled"));
1465 strbuf
= wstrappend(strbuf
, _("\nSound enabled"));
1469 panel
->infoL
= WMCreateLabel(panel
->win
);
1470 WMResizeWidget(panel
->infoL
, 350, 75);
1471 WMMoveWidget(panel
->infoL
, 15, 115);
1472 WMSetLabelText(panel
->infoL
, strbuf
);
1473 font
= WMCreateFont(scr
->wmscreen
, HELVETICA10_FONT
);
1475 WMSetLabelFont(panel
->infoL
, font
);
1476 WMReleaseFont(font
);
1482 WMRealizeWidget(panel
->win
);
1483 WMMapSubwidgets(panel
->win
);
1485 parent
= XCreateSimpleWindow(dpy
, scr
->root_win
, 0, 0, 382, 230, 0, 0, 0);
1487 XReparentWindow(dpy
, WMWidgetXID(panel
->win
), parent
, 0, 0);
1489 WMMapWidget(panel
->win
);
1492 WMPoint center
= getCenter(scr
, 382, 230);
1494 wwin
= wManageInternalWindow(scr
, parent
, None
, _("Info"),
1499 WSETUFLAG(wwin
, no_closable
, 0);
1500 WSETUFLAG(wwin
, no_close_button
, 0);
1501 #ifdef XKB_BUTTON_HINT
1502 wFrameWindowHideButton(wwin
->frame
, WFF_LANGUAGE_BUTTON
);
1504 wWindowUpdateButtonImages(wwin
);
1505 wFrameWindowShowButton(wwin
->frame
, WFF_RIGHT_BUTTON
);
1506 wwin
->frame
->on_click_right
= destroyInfoPanel
;
1514 if (InitXThing(panel
->scr
)) {
1515 panel
->timer
= WMAddTimerHandler(100, logoPushCallback
, panel
);
1518 panel
->str
= _("Merry Christmas!");
1519 panel
->oldPix
= WMRetainPixmap(WMGetLabelImage(panel
->logoL
));
1526 ***********************************************************************
1528 ***********************************************************************
1542 static LegalPanel
*legalPanel
= NULL
;
1545 destroyLegalPanel(WCoreWindow
*foo
, void *data
, XEvent
*event
)
1547 WMUnmapWidget(legalPanel
->win
);
1549 WMDestroyWidget(legalPanel
->win
);
1551 wUnmanageWindow(legalPanel
->wwin
, False
, False
);
1560 wShowLegalPanel(WScreen
*scr
)
1567 if (legalPanel
->scr
== scr
) {
1568 wRaiseFrame(legalPanel
->wwin
->frame
->core
);
1569 wSetFocusTo(scr
, legalPanel
->wwin
);
1574 panel
= wmalloc(sizeof(LegalPanel
));
1578 panel
->win
= WMCreateWindow(scr
->wmscreen
, "legal");
1579 WMResizeWidget(panel
->win
, 420, 250);
1582 panel
->licenseL
= WMCreateLabel(panel
->win
);
1583 WMSetLabelWraps(panel
->licenseL
, True
);
1584 WMResizeWidget(panel
->licenseL
, 400, 230);
1585 WMMoveWidget(panel
->licenseL
, 10, 10);
1586 WMSetLabelTextAlignment(panel
->licenseL
, WALeft
);
1587 WMSetLabelText(panel
->licenseL
,
1588 _(" Window Maker is free software; you can redistribute it and/or\n"
1589 "modify it under the terms of the GNU General Public License as\n"
1590 "published by the Free Software Foundation; either version 2 of the\n"
1591 "License, or (at your option) any later version.\n\n"
1592 " Window Maker is distributed in the hope that it will be useful,\n"
1593 "but WITHOUT ANY WARRANTY; without even the implied warranty\n"
1594 "of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
1595 "See the GNU General Public License for more details.\n\n"
1596 " You should have received a copy of the GNU General Public\n"
1597 "License along with this program; if not, write to the Free Software\n"
1598 "Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA\n"
1599 "02111-1307, USA."));
1600 WMSetLabelRelief(panel
->licenseL
, WRGroove
);
1602 WMRealizeWidget(panel
->win
);
1603 WMMapSubwidgets(panel
->win
);
1605 parent
= XCreateSimpleWindow(dpy
, scr
->root_win
, 0, 0, 420, 250, 0, 0, 0);
1607 XReparentWindow(dpy
, WMWidgetXID(panel
->win
), parent
, 0, 0);
1610 WMPoint center
= getCenter(scr
, 420, 250);
1612 wwin
= wManageInternalWindow(scr
, parent
, None
, _("Legal"),
1617 WSETUFLAG(wwin
, no_closable
, 0);
1618 WSETUFLAG(wwin
, no_close_button
, 0);
1619 wWindowUpdateButtonImages(wwin
);
1620 wFrameWindowShowButton(wwin
->frame
, WFF_RIGHT_BUTTON
);
1621 #ifdef XKB_BUTTON_HINT
1622 wFrameWindowHideButton(wwin
->frame
, WFF_LANGUAGE_BUTTON
);
1624 wwin
->frame
->on_click_right
= destroyLegalPanel
;
1628 WMMapWidget(panel
->win
);
1637 ***********************************************************************
1638 * Crashing Dialog Panel
1639 ***********************************************************************
1642 extern WDDomain
*WDWindowAttributes
;
1645 typedef struct _CrashPanel
{
1646 WMWindow
*win
; /* main window */
1648 WMLabel
*iconL
; /* application icon */
1649 WMLabel
*nameL
; /* title of panel */
1651 WMFrame
*sepF
; /* separator frame */
1653 WMLabel
*noteL
; /* Title of note */
1654 WMLabel
*note2L
; /* body of note with what happened */
1656 WMFrame
*whatF
; /* "what to do next" frame */
1657 WMPopUpButton
*whatP
; /* action selection popup button */
1659 WMButton
*okB
; /* ok button */
1661 Bool done
; /* if finished with this dialog */
1662 int action
; /* what to do after */
1670 handleKeyPress(XEvent
*event
, void *clientData
)
1672 CrashPanel
*panel
= (CrashPanel
*)clientData
;
1674 if (event
->xkey
.keycode
== panel
->retKey
) {
1675 WMPerformButtonClick(panel
->okB
);
1681 okButtonCallback(void *self
, void *clientData
)
1683 CrashPanel
*panel
= (CrashPanel
*)clientData
;
1690 setCrashAction(void *self
, void *clientData
)
1692 WMPopUpButton
*pop
= (WMPopUpButton
*)self
;
1693 CrashPanel
*panel
= (CrashPanel
*)clientData
;
1695 panel
->action
= WMGetPopUpButtonSelectedItem(pop
);
1700 getWindowMakerIconImage(WMScreen
*scr
)
1702 WMPropList
*dict
, *key
, *option
, *value
=NULL
;
1706 WMPLSetCaseSensitive(True
);
1708 key
= WMCreatePLString("Logo.WMPanel");
1709 option
= WMCreatePLString("Icon");
1711 dict
= WMGetFromPLDictionary(WDWindowAttributes
->dictionary
, key
);
1714 value
= WMGetFromPLDictionary(dict
, option
);
1717 WMReleasePropList(key
);
1718 WMReleasePropList(option
);
1720 WMPLSetCaseSensitive(False
);
1722 if (value
&& WMIsPLString(value
)) {
1723 path
= FindImage(wPreferences
.icon_path
, WMGetFromPLString(value
));
1728 gray
.red
= 0xae; gray
.green
= 0xaa;
1729 gray
.blue
= 0xae; gray
.alpha
= 0;
1731 pix
= WMCreateBlendedPixmapFromFile(scr
, path
, &gray
);
1745 wShowCrashingDialogPanel(int whatSig
)
1751 int screen_no
, scr_width
, scr_height
;
1755 panel
= wmalloc(sizeof(CrashPanel
));
1756 memset(panel
, 0, sizeof(CrashPanel
));
1758 screen_no
= DefaultScreen(dpy
);
1759 scr_width
= WidthOfScreen(ScreenOfDisplay(dpy
, screen_no
));
1760 scr_height
= HeightOfScreen(ScreenOfDisplay(dpy
, screen_no
));
1762 scr
= WMCreateScreen(dpy
, screen_no
);
1764 wsyserror(_("cannot open connection for crashing dialog panel. Aborting."));
1768 panel
->retKey
= XKeysymToKeycode(dpy
, XK_Return
);
1770 panel
->win
= WMCreateWindow(scr
, "crashingDialog");
1771 WMResizeWidget(panel
->win
, PWIDTH
, PHEIGHT
);
1772 WMMoveWidget(panel
->win
, (scr_width
- PWIDTH
)/2, (scr_height
- PHEIGHT
)/2);
1774 logo
= getWindowMakerIconImage(scr
);
1776 panel
->iconL
= WMCreateLabel(panel
->win
);
1777 WMResizeWidget(panel
->iconL
, 64, 64);
1778 WMMoveWidget(panel
->iconL
, 10, 10);
1779 WMSetLabelImagePosition(panel
->iconL
, WIPImageOnly
);
1780 WMSetLabelImage(panel
->iconL
, logo
);
1783 panel
->nameL
= WMCreateLabel(panel
->win
);
1784 WMResizeWidget(panel
->nameL
, 190, 18);
1785 WMMoveWidget(panel
->nameL
, 80, 35);
1786 WMSetLabelTextAlignment(panel
->nameL
, WALeft
);
1787 font
= WMBoldSystemFontOfSize(scr
, 18);
1788 WMSetLabelFont(panel
->nameL
, font
);
1789 WMReleaseFont(font
);
1790 WMSetLabelText(panel
->nameL
, _("Fatal error"));
1792 panel
->sepF
= WMCreateFrame(panel
->win
);
1793 WMResizeWidget(panel
->sepF
, PWIDTH
+4, 2);
1794 WMMoveWidget(panel
->sepF
, -2, 80);
1796 panel
->noteL
= WMCreateLabel(panel
->win
);
1797 WMResizeWidget(panel
->noteL
, PWIDTH
-20, 40);
1798 WMMoveWidget(panel
->noteL
, 10, 90);
1799 WMSetLabelTextAlignment(panel
->noteL
, WAJustified
);
1800 #ifdef SYS_SIGLIST_DECLARED
1801 snprintf(buf
, sizeof(buf
), _("Window Maker received signal %i\n(%s)."),
1802 whatSig
, sys_siglist
[whatSig
]);
1804 snprintf(buf
, sizeof(buf
), _("Window Maker received signal %i."), whatSig
);
1806 WMSetLabelText(panel
->noteL
, buf
);
1808 panel
->note2L
= WMCreateLabel(panel
->win
);
1809 WMResizeWidget(panel
->note2L
, PWIDTH
-20, 100);
1810 WMMoveWidget(panel
->note2L
, 10, 130);
1811 WMSetLabelTextAlignment(panel
->note2L
, WALeft
);
1812 WMSetLabelText(panel
->note2L
,
1813 _(" This fatal error occured probably due to a bug."
1814 " Please fill the included BUGFORM and "
1815 "report it to bugs@windowmaker.org."));
1816 WMSetLabelWraps(panel
->note2L
, True
);
1819 panel
->whatF
= WMCreateFrame(panel
->win
);
1820 WMResizeWidget(panel
->whatF
, PWIDTH
-20, 50);
1821 WMMoveWidget(panel
->whatF
, 10, 240);
1822 WMSetFrameTitle(panel
->whatF
, _("What do you want to do now?"));
1824 panel
->whatP
= WMCreatePopUpButton(panel
->whatF
);
1825 WMResizeWidget(panel
->whatP
, PWIDTH
-20-70, 20);
1826 WMMoveWidget(panel
->whatP
, 35, 20);
1827 WMSetPopUpButtonPullsDown(panel
->whatP
, False
);
1828 WMSetPopUpButtonText(panel
->whatP
, _("Select action"));
1829 WMAddPopUpButtonItem(panel
->whatP
, _("Abort and leave a core file"));
1830 WMAddPopUpButtonItem(panel
->whatP
, _("Restart Window Maker"));
1831 WMAddPopUpButtonItem(panel
->whatP
, _("Start alternate window manager"));
1832 WMSetPopUpButtonAction(panel
->whatP
, setCrashAction
, panel
);
1833 WMSetPopUpButtonSelectedItem(panel
->whatP
, WMRestart
);
1834 panel
->action
= WMRestart
;
1836 WMMapSubwidgets(panel
->whatF
);
1838 panel
->okB
= WMCreateCommandButton(panel
->win
);
1839 WMResizeWidget(panel
->okB
, 80, 26);
1840 WMMoveWidget(panel
->okB
, 205, 309);
1841 WMSetButtonText(panel
->okB
, _("OK"));
1842 WMSetButtonImage(panel
->okB
, WMGetSystemPixmap(scr
, WSIReturnArrow
));
1843 WMSetButtonAltImage(panel
->okB
, WMGetSystemPixmap(scr
, WSIHighlightedReturnArrow
));
1844 WMSetButtonImagePosition(panel
->okB
, WIPRight
);
1845 WMSetButtonAction(panel
->okB
, okButtonCallback
, panel
);
1849 WMCreateEventHandler(WMWidgetView(panel
->win
), KeyPressMask
,
1850 handleKeyPress
, panel
);
1852 WMRealizeWidget(panel
->win
);
1853 WMMapSubwidgets(panel
->win
);
1855 WMMapWidget(panel
->win
);
1857 XSetInputFocus(dpy
, WMWidgetXID(panel
->win
), RevertToParent
, CurrentTime
);
1859 while (!panel
->done
) {
1862 WMNextEvent(dpy
, &event
);
1863 WMHandleEvent(&event
);
1866 action
= panel
->action
;
1868 WMUnmapWidget(panel
->win
);
1869 WMDestroyWidget(panel
->win
);
1878 /*****************************************************************************
1879 * About GNUstep Panel
1880 *****************************************************************************/
1884 drawGNUstepLogo(Display
*dpy
, Drawable d
, int width
, int height
,
1885 unsigned long blackPixel
, unsigned long whitePixel
)
1889 XRectangle rects
[3];
1891 gcv
.foreground
= blackPixel
;
1892 gc
= XCreateGC(dpy
, d
, GCForeground
, &gcv
);
1894 XFillArc(dpy
, d
, gc
, width
/45, height
/45,
1895 width
- 2*width
/45, height
- 2*height
/45, 0, 360*64);
1898 rects
[0].y
= 37*height
/45;
1899 rects
[0].width
= width
/3;
1900 rects
[0].height
= height
- rects
[0].y
;
1902 rects
[1].x
= rects
[0].width
;
1903 rects
[1].y
= height
/2;
1904 rects
[1].width
= width
- 2*width
/3;
1905 rects
[1].height
= height
- rects
[1].y
;
1907 rects
[2].x
= 2*width
/3;
1908 rects
[2].y
= height
- 37*height
/45;
1909 rects
[2].width
= width
/3;
1910 rects
[2].height
= height
- rects
[2].y
;
1912 XSetClipRectangles(dpy
, gc
, 0, 0, rects
, 3, Unsorted
);
1913 XFillRectangle(dpy
, d
, gc
, 0, 0, width
, height
);
1915 XSetForeground(dpy
, gc
, whitePixel
);
1916 XFillArc(dpy
, d
, gc
, width
/45, height
/45,
1917 width
- 2*width
/45, height
- 2*height
/45, 0, 360*64);
1935 static GNUstepPanel
*gnustepPanel
= NULL
;
1938 destroyGNUstepPanel(WCoreWindow
*foo
, void *data
, XEvent
*event
)
1940 WMUnmapWidget(gnustepPanel
->win
);
1942 WMDestroyWidget(gnustepPanel
->win
);
1944 wUnmanageWindow(gnustepPanel
->wwin
, False
, False
);
1946 wfree(gnustepPanel
);
1948 gnustepPanel
= NULL
;
1953 wShowGNUstepPanel(WScreen
*scr
)
1955 GNUstepPanel
*panel
;
1962 if (gnustepPanel
->scr
== scr
) {
1963 wRaiseFrame(gnustepPanel
->wwin
->frame
->core
);
1964 wSetFocusTo(scr
, gnustepPanel
->wwin
);
1969 panel
= wmalloc(sizeof(GNUstepPanel
));
1973 panel
->win
= WMCreateWindow(scr
->wmscreen
, "About GNUstep");
1974 WMResizeWidget(panel
->win
, 325, 200);
1976 pixmap
= WMCreatePixmap(scr
->wmscreen
, 130, 130,
1977 WMScreenDepth(scr
->wmscreen
), True
);
1979 color
= WMCreateNamedColor(scr
->wmscreen
, "gray50", True
);
1981 drawGNUstepLogo(dpy
, WMGetPixmapXID(pixmap
), 130, 130,
1982 WMColorPixel(color
), scr
->white_pixel
);
1984 WMReleaseColor(color
);
1986 XSetForeground(dpy
, scr
->mono_gc
, 0);
1987 XFillRectangle(dpy
, WMGetPixmapMaskXID(pixmap
), scr
->mono_gc
, 0, 0,
1989 drawGNUstepLogo(dpy
, WMGetPixmapMaskXID(pixmap
), 130, 130, 1, 1);
1991 panel
->gstepL
= WMCreateLabel(panel
->win
);
1992 WMResizeWidget(panel
->gstepL
, 285, 64);
1993 WMMoveWidget(panel
->gstepL
, 20, 0);
1994 WMSetLabelTextAlignment(panel
->gstepL
, WARight
);
1995 WMSetLabelText(panel
->gstepL
, "GNUstep");
1997 WMFont
*font
= WMBoldSystemFontOfSize(scr
->wmscreen
, 24);
1999 WMSetLabelFont(panel
->gstepL
, font
);
2000 WMReleaseFont(font
);
2003 panel
->textL
= WMCreateLabel(panel
->win
);
2004 WMResizeWidget(panel
->textL
, 275, 130);
2005 WMMoveWidget(panel
->textL
, 30, 50);
2006 WMSetLabelTextAlignment(panel
->textL
, WARight
);
2007 WMSetLabelImagePosition(panel
->textL
, WIPOverlaps
);
2008 WMSetLabelText(panel
->textL
,
2009 _("Window Maker is part of the GNUstep project.\n"\
2010 "The GNUstep project aims to create a free\n"\
2011 "implementation of the OpenStep(tm) specification\n"\
2012 "which is a object-oriented framework for\n"\
2013 "creating advanced graphical, multi-platform\n"\
2014 "applications. Additionally, a development and\n"\
2015 "user desktop enviroment will be created on top\n"\
2016 "of the framework. For more information about\n"\
2017 "GNUstep, please visit: www.gnustep.org"));
2018 WMSetLabelImage(panel
->textL
, pixmap
);
2020 WMReleasePixmap(pixmap
);
2022 WMRealizeWidget(panel
->win
);
2023 WMMapSubwidgets(panel
->win
);
2025 parent
= XCreateSimpleWindow(dpy
, scr
->root_win
, 0, 0, 325, 200, 0, 0, 0);
2027 XReparentWindow(dpy
, WMWidgetXID(panel
->win
), parent
, 0, 0);
2030 WMPoint center
= getCenter(scr
, 325, 200);
2032 wwin
= wManageInternalWindow(scr
, parent
, None
, _("About GNUstep"),
2037 WSETUFLAG(wwin
, no_closable
, 0);
2038 WSETUFLAG(wwin
, no_close_button
, 0);
2039 wWindowUpdateButtonImages(wwin
);
2040 wFrameWindowShowButton(wwin
->frame
, WFF_RIGHT_BUTTON
);
2041 #ifdef XKB_BUTTON_HINT
2042 wFrameWindowHideButton(wwin
->frame
, WFF_LANGUAGE_BUTTON
);
2044 wwin
->frame
->on_click_right
= destroyGNUstepPanel
;
2048 WMMapWidget(panel
->win
);
2052 gnustepPanel
= panel
;