1 /* dialog.c - dialog windows for internal use
3 * Window Maker window manager
5 * Copyright (c) 1997, 1998 Alfredo K. Kojima
6 * Copyright (c) 1999 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
;
70 wMessageDialog(WScreen
*scr
, char *title
, char *message
,
71 char *defBtn
, char *altBtn
, char *othBtn
)
78 panel
= WMCreateAlertPanel(scr
->wmscreen
, NULL
, title
, message
,
79 defBtn
, altBtn
, othBtn
);
81 parent
= XCreateSimpleWindow(dpy
, scr
->root_win
, 0, 0, 400, 180, 0, 0, 0);
83 XReparentWindow(dpy
, WMWidgetXID(panel
->win
), parent
, 0, 0);
85 wwin
= wManageInternalWindow(scr
, parent
, None
, NULL
,
86 (scr
->scr_width
- 400)/2,
87 (scr
->scr_height
- 180)/2, 400, 180);
88 wwin
->client_leader
= WMWidgetXID(panel
->win
);
90 WMMapWidget(panel
->win
);
94 WMRunModalLoop(WMWidgetScreen(panel
->win
), WMWidgetView(panel
->win
));
96 result
= panel
->result
;
98 WMUnmapWidget(panel
->win
);
100 wUnmanageWindow(wwin
, False
, False
);
102 WMDestroyAlertPanel(panel
);
104 XDestroyWindow(dpy
, parent
);
112 wInputDialog(WScreen
*scr
, char *title
, char *message
, char **text
)
120 panel
= WMCreateInputPanel(scr
->wmscreen
, NULL
, title
, message
, *text
,
121 _("OK"), _("Cancel"));
124 parent
= XCreateSimpleWindow(dpy
, scr
->root_win
, 0, 0, 320, 160, 0, 0, 0);
125 XSelectInput(dpy
, parent
, KeyPressMask
|KeyReleaseMask
);
127 XReparentWindow(dpy
, WMWidgetXID(panel
->win
), parent
, 0, 0);
129 wwin
= wManageInternalWindow(scr
, parent
, None
, NULL
,
130 (scr
->scr_width
- 320)/2,
131 (scr
->scr_height
- 160)/2, 320, 160);
133 wwin
->client_leader
= WMWidgetXID(panel
->win
);
135 WMMapWidget(panel
->win
);
139 WMRunModalLoop(WMWidgetScreen(panel
->win
), WMWidgetView(panel
->win
));
141 if (panel
->result
== WAPRDefault
)
142 result
= WMGetTextFieldText(panel
->text
);
146 wUnmanageWindow(wwin
, False
, False
);
148 WMDestroyInputPanel(panel
);
150 XDestroyWindow(dpy
, parent
);
165 *****************************************************************
166 * Icon Selection Panel
167 *****************************************************************
170 typedef struct IconPanel
{
183 WMButton
*previewButton
;
188 WMTextField
*fileField
;
191 WMButton
*cancelButton
;
193 WMButton
*chooseButton
;
203 listPixmaps(WScreen
*scr
, WMList
*lPtr
, char *path
)
205 struct dirent
*dentry
;
207 char pbuf
[PATH_MAX
+16];
209 IconPanel
*panel
= WMGetHangedData(lPtr
);
211 panel
->preview
= False
;
213 apath
= wexpandpath(path
);
214 dir
= opendir(apath
);
219 tmp
= _("Could not open directory ");
220 msg
= wmalloc(strlen(tmp
)+strlen(path
)+6);
224 wMessageDialog(scr
, _("Error"), msg
, _("OK"), NULL
, NULL
);
230 /* list contents in the column */
231 while ((dentry
= readdir(dir
))) {
234 if (strcmp(dentry
->d_name
, ".")==0 ||
235 strcmp(dentry
->d_name
, "..")==0)
240 strcat(pbuf
, dentry
->d_name
);
242 if (stat(pbuf
, &statb
)<0)
245 if (statb
.st_mode
& (S_IRUSR
|S_IRGRP
|S_IROTH
)
246 && statb
.st_mode
& (S_IFREG
|S_IFLNK
)) {
247 WMAddListItem(lPtr
, dentry
->d_name
);
250 WMSortListItems(lPtr
);
254 panel
->preview
= True
;
260 setViewedImage(IconPanel
*panel
, char *file
)
269 pixmap
= WMCreateBlendedPixmapFromFile(WMWidgetScreen(panel
->win
),
272 WMSetButtonEnabled(panel
->okButton
, False
);
274 WMSetLabelText(panel
->iconView
, _("Could not load image file "));
276 WMSetLabelImage(panel
->iconView
, NULL
);
278 WMSetButtonEnabled(panel
->okButton
, True
);
280 WMSetLabelText(panel
->iconView
, NULL
);
281 WMSetLabelImage(panel
->iconView
, pixmap
);
282 WMReleasePixmap(pixmap
);
288 listCallback(void *self
, void *data
)
290 WMList
*lPtr
= (WMList
*)self
;
291 IconPanel
*panel
= (IconPanel
*)data
;
294 if (lPtr
==panel
->dirList
) {
295 WMListItem
*item
= WMGetListSelectedItem(lPtr
);
301 WMSetTextFieldText(panel
->fileField
, path
);
303 WMSetLabelImage(panel
->iconView
, NULL
);
305 WMSetButtonEnabled(panel
->okButton
, False
);
307 WMClearList(panel
->iconList
);
308 listPixmaps(panel
->scr
, panel
->iconList
, path
);
310 char *tmp
, *iconFile
;
311 WMListItem
*item
= WMGetListSelectedItem(panel
->dirList
);
316 tmp
= wexpandpath(path
);
318 item
= WMGetListSelectedItem(panel
->iconList
);
321 iconFile
= item
->text
;
323 path
= wmalloc(strlen(tmp
)+strlen(iconFile
)+4);
326 strcat(path
, iconFile
);
328 WMSetTextFieldText(panel
->fileField
, path
);
329 setViewedImage(panel
, path
);
336 listIconPaths(WMList
*lPtr
)
341 paths
= wstrdup(wPreferences
.icon_path
);
343 path
= strtok(paths
, ":");
348 tmp
= wexpandpath(path
);
349 /* do not sort, because the order implies the order of
350 * directories searched */
351 if (access(tmp
, X_OK
)==0)
352 WMAddListItem(lPtr
, path
);
354 } while ((path
=strtok(NULL
, ":"))!=NULL
);
361 drawIconProc(WMList
*lPtr
, int index
, Drawable d
, char *text
,
362 int state
, WMRect
*rect
)
364 IconPanel
*panel
= WMGetHangedData(lPtr
);
365 GC gc
= panel
->scr
->draw_gc
;
366 GC copygc
= panel
->scr
->copy_gc
;
367 char *file
, *dirfile
;
372 WMScreen
*wmscr
= WMWidgetScreen(panel
->win
);
376 if(!panel
->preview
) return;
378 width
= rect
->size
.width
;
380 blackcolor
= WMBlackColor(wmscr
);
381 whitecolor
= WMWhiteColor(wmscr
);
383 dirfile
= wexpandpath(WMGetListSelectedItem(panel
->dirList
)->text
);
385 int len
= strlen(dirfile
)+strlen(text
)+4;
387 snprintf(file
, len
, "%s/%s", dirfile
, text
);
391 if ((state
& WLDSSelected
) != 0) {
392 color
.red
= color
.green
= color
.blue
= 0xff;
395 color
.red
= color
.blue
= 0xae;
396 color
.green
= 0xaa; color
.alpha
= 0;
398 pixmap
= WMCreateBlendedPixmapFromFile(wmscr
, file
, &color
);
402 WMRemoveListItem(lPtr
, index
);
406 XClearArea(dpy
, d
, rect
->pos
.x
, rect
->pos
.y
, width
, rect
->size
.height
,
408 XSetClipMask(dpy
, gc
, None
);
410 XDrawRectangle(dpy, d, WMColorGC(whitecolor), rect->pos.x + 5,
411 rect->pos.y +5, width - 10, 54);
413 XDrawLine(dpy
, d
, WMColorGC(whitecolor
), rect
->pos
.x
,
414 rect
->pos
.y
+rect
->size
.height
-1, rect
->pos
.x
+width
,
415 rect
->pos
.y
+rect
->size
.height
-1);
418 if (state
&WLDSSelected
) {
419 XFillRectangle(dpy
, d
, WMColorGC(whitecolor
), rect
->pos
.x
,
420 rect
->pos
.y
, width
, rect
->size
.height
);
423 size
= WMGetPixmapSize(pixmap
);
425 XSetClipMask(dpy
, copygc
, WMGetPixmapMaskXID(pixmap
));
426 XSetClipOrigin(dpy
, copygc
, rect
->pos
.x
+ (width
-size
.width
)/2,
428 XCopyArea(dpy
, WMGetPixmapXID(pixmap
), d
, copygc
, 0, 0,
429 size
.width
>100?100:size
.width
, size
.height
>64?64:size
.height
,
430 rect
->pos
.x
+ (width
-size
.width
)/2, rect
->pos
.y
+2);
434 int fheight
= WMFontHeight(panel
->normalfont
);
435 int tlen
= strlen(text
);
436 int twidth
= WMWidthOfString(panel
->normalfont
, text
, tlen
);
439 ofx
= rect
->pos
.x
+ (width
- twidth
)/2;
440 ofy
= rect
->pos
.y
+ 64 - fheight
;
444 WMDrawString(wmscr
, d
, WMColorGC(whitecolor
),
445 panel
->normalfont
, ofx
+i
, ofy
+j
,
448 WMDrawString(wmscr
, d
, WMColorGC(blackcolor
), panel
->normalfont
,
449 ofx
, ofy
, text
, tlen
);
452 WMReleasePixmap(pixmap
);
453 /* I hope it is better to do not use cache / on my box it is fast nuff */
456 WMReleaseColor(blackcolor
);
457 WMReleaseColor(whitecolor
);
462 buttonCallback(void *self
, void *clientData
)
464 WMButton
*bPtr
= (WMButton
*)self
;
465 IconPanel
*panel
= (IconPanel
*)clientData
;
468 if (bPtr
==panel
->okButton
) {
470 panel
->result
= True
;
471 } else if (bPtr
==panel
->cancelButton
) {
473 panel
->result
= False
;
474 } else if (bPtr
==panel
->previewButton
) {
475 /**** Previewer ****/
476 WMSetButtonEnabled(bPtr
, False
);
477 WMSetListUserDrawItemHeight(panel
->iconList
, 68);
478 WMSetListUserDrawProc(panel
->iconList
, drawIconProc
);
479 WMRedisplayWidget(panel
->iconList
);
480 /* for draw proc to access screen/gc */
481 /*** end preview ***/
484 else if (bPtr
==panel
->chooseButton
) {
487 op
= WMCreateOpenPanel(WMWidgetScreen(bPtr
));
489 if (WMRunModalFilePanelForDirectory(op
, NULL
, "/usr/local", NULL
, NULL
)) {
491 path
= WMGetFilePanelFile(op
);
492 WMSetTextFieldText(panel
->fileField
, path
);
493 setViewedImage(panel
, path
);
496 WMDestroyFilePanel(op
);
503 keyPressHandler(XEvent
*event
, void *data
)
505 IconPanel
*panel
= (IconPanel
*)data
;
506 Display
*dpy
= event
->xany
.display
;
515 if (event
->type
== KeyRelease
)
519 count
= XLookupString(&event
->xkey
, buffer
, sizeof(buffer
), &ksym
, NULL
);
522 iidx
= WMGetListSelectedItemRow(panel
->iconList
);
523 didx
= WMGetListSelectedItemRow(panel
->dirList
);
531 list
= panel
->iconList
;
534 if (iidx
< WMGetListNumberOfRows(panel
->iconList
) - 1)
538 list
= panel
->iconList
;
542 list
= panel
->iconList
;
545 item
= WMGetListNumberOfRows(panel
->iconList
) - 1;
546 list
= panel
->iconList
;
549 if (didx
< WMGetListNumberOfRows(panel
->dirList
) - 1)
553 list
= panel
->dirList
;
560 list
= panel
->dirList
;
563 WMPerformButtonClick(panel
->okButton
);
566 WMPerformButtonClick(panel
->cancelButton
);
571 WMSelectListItem(list
, item
);
572 WMSetListPosition(list
, item
- 5);
573 listCallback(list
, panel
);
580 wIconChooserDialog(WScreen
*scr
, char **file
, char *instance
, char *class)
588 panel
= wmalloc(sizeof(IconPanel
));
589 memset(panel
, 0, sizeof(IconPanel
));
593 panel
->win
= WMCreateWindow(scr
->wmscreen
, "iconChooser");
594 WMResizeWidget(panel
->win
, 450, 280);
596 WMCreateEventHandler(WMWidgetView(panel
->win
), KeyPressMask
|KeyReleaseMask
,
597 keyPressHandler
, panel
);
600 boldFont
= WMBoldSystemFontOfSize(scr
->wmscreen
, 12);
601 panel
->normalfont
= WMSystemFontOfSize(WMWidgetScreen(panel
->win
), 12);
603 panel
->dirLabel
= WMCreateLabel(panel
->win
);
604 WMResizeWidget(panel
->dirLabel
, 200, 20);
605 WMMoveWidget(panel
->dirLabel
, 10, 7);
606 WMSetLabelText(panel
->dirLabel
, _("Directories"));
607 WMSetLabelFont(panel
->dirLabel
, boldFont
);
608 WMSetLabelTextAlignment(panel
->dirLabel
, WACenter
);
610 WMSetLabelRelief(panel
->dirLabel
, WRSunken
);
612 panel
->iconLabel
= WMCreateLabel(panel
->win
);
613 WMResizeWidget(panel
->iconLabel
, 140, 20);
614 WMMoveWidget(panel
->iconLabel
, 215, 7);
615 WMSetLabelText(panel
->iconLabel
, _("Icons"));
616 WMSetLabelFont(panel
->iconLabel
, boldFont
);
617 WMSetLabelTextAlignment(panel
->iconLabel
, WACenter
);
619 WMReleaseFont(boldFont
);
621 color
= WMWhiteColor(scr
->wmscreen
);
622 WMSetLabelTextColor(panel
->dirLabel
, color
);
623 WMSetLabelTextColor(panel
->iconLabel
, color
);
624 WMReleaseColor(color
);
626 color
= WMDarkGrayColor(scr
->wmscreen
);
627 WMSetWidgetBackgroundColor(panel
->iconLabel
, color
);
628 WMSetWidgetBackgroundColor(panel
->dirLabel
, color
);
629 WMReleaseColor(color
);
631 WMSetLabelRelief(panel
->iconLabel
, WRSunken
);
633 panel
->dirList
= WMCreateList(panel
->win
);
634 WMResizeWidget(panel
->dirList
, 200, 170);
635 WMMoveWidget(panel
->dirList
, 10, 30);
636 WMSetListAction(panel
->dirList
, listCallback
, panel
);
638 panel
->iconList
= WMCreateList(panel
->win
);
639 WMResizeWidget(panel
->iconList
, 140, 170);
640 WMMoveWidget(panel
->iconList
, 215, 30);
641 WMSetListAction(panel
->iconList
, listCallback
, panel
);
643 WMHangData(panel
->iconList
,panel
);
645 panel
->previewButton
= WMCreateCommandButton(panel
->win
);
646 WMResizeWidget(panel
->previewButton
, 75, 26);
647 WMMoveWidget(panel
->previewButton
, 365, 130);
648 WMSetButtonText(panel
->previewButton
, _("Preview"));
649 WMSetButtonAction(panel
->previewButton
, buttonCallback
, panel
);
651 panel
->iconView
= WMCreateLabel(panel
->win
);
652 WMResizeWidget(panel
->iconView
, 75, 75);
653 WMMoveWidget(panel
->iconView
, 365, 40);
654 WMSetLabelImagePosition(panel
->iconView
, WIPOverlaps
);
655 WMSetLabelRelief(panel
->iconView
, WRSunken
);
656 WMSetLabelTextAlignment(panel
->iconView
, WACenter
);
658 panel
->fileLabel
= WMCreateLabel(panel
->win
);
659 WMResizeWidget(panel
->fileLabel
, 80, 20);
660 WMMoveWidget(panel
->fileLabel
, 10, 210);
661 WMSetLabelText(panel
->fileLabel
, _("File Name:"));
663 panel
->fileField
= WMCreateTextField(panel
->win
);
664 WMSetViewNextResponder(WMWidgetView(panel
->fileField
), WMWidgetView(panel
->win
));
665 WMResizeWidget(panel
->fileField
, 345, 20);
666 WMMoveWidget(panel
->fileField
, 95, 210);
667 WMSetTextFieldEditable(panel
->fileField
, False
);
669 panel
->okButton
= WMCreateCommandButton(panel
->win
);
670 WMResizeWidget(panel
->okButton
, 80, 26);
671 WMMoveWidget(panel
->okButton
, 360, 240);
672 WMSetButtonText(panel
->okButton
, _("OK"));
673 WMSetButtonEnabled(panel
->okButton
, False
);
674 WMSetButtonAction(panel
->okButton
, buttonCallback
, panel
);
676 panel
->cancelButton
= WMCreateCommandButton(panel
->win
);
677 WMResizeWidget(panel
->cancelButton
, 80, 26);
678 WMMoveWidget(panel
->cancelButton
, 270, 240);
679 WMSetButtonText(panel
->cancelButton
, _("Cancel"));
680 WMSetButtonAction(panel
->cancelButton
, buttonCallback
, panel
);
682 panel
->chooseButton
= WMCreateCommandButton(panel
->win
);
683 WMResizeWidget(panel
->chooseButton
, 110, 26);
684 WMMoveWidget(panel
->chooseButton
, 150, 240);
685 WMSetButtonText(panel
->chooseButton
, _("Choose File"));
686 WMSetButtonAction(panel
->chooseButton
, buttonCallback
, panel
);
688 WMRealizeWidget(panel
->win
);
689 WMMapSubwidgets(panel
->win
);
691 parent
= XCreateSimpleWindow(dpy
, scr
->root_win
, 0, 0, 450, 280, 0, 0, 0);
693 XReparentWindow(dpy
, WMWidgetXID(panel
->win
), parent
, 0, 0);
697 int len
= (instance
? strlen(instance
) : 0)
698 + (class ? strlen(class) : 0) + 32;
702 if (tmp
&& (instance
|| class))
703 snprintf(tmp
, len
, "%s [%s.%s]", _("Icon Chooser"), instance
, class);
705 strcpy(tmp
, _("Icon Chooser"));
707 wwin
= wManageInternalWindow(scr
, parent
, None
, tmp
,
708 (scr
->scr_width
- 450)/2,
709 (scr
->scr_height
- 280)/2, 450, 280);
713 /* put icon paths in the list */
714 listIconPaths(panel
->dirList
);
716 WMMapWidget(panel
->win
);
720 while (!panel
->done
) {
723 WMNextEvent(dpy
, &event
);
724 WMHandleEvent(&event
);
728 char *defaultPath
, *wantedPath
;
730 /* check if the file the user selected is not the one that
731 * would be loaded by default with the current search path */
732 *file
= WMGetListSelectedItem(panel
->iconList
)->text
;
737 defaultPath
= FindImage(wPreferences
.icon_path
, *file
);
738 wantedPath
= WMGetTextFieldText(panel
->fileField
);
739 /* if the file is not the default, use full path */
740 if (strcmp(wantedPath
, defaultPath
)!=0) {
743 *file
= wstrdup(*file
);
752 WMReleaseFont(panel
->normalfont
);
754 WMUnmapWidget(panel
->win
);
756 WMDestroyWidget(panel
->win
);
758 wUnmanageWindow(wwin
, False
, False
);
762 XDestroyWindow(dpy
, parent
);
764 return panel
->result
;
769 ***********************************************************************
771 ***********************************************************************
806 #define COPYRIGHT_TEXT \
807 "Copyright \xa9 1997~2001 Alfredo K. Kojima <kojima@windowmaker.org>\n"\
808 "Copyright \xa9 1998~2001 Dan Pascu <dan@windowmaker.org>"
812 static InfoPanel
*thePanel
= NULL
;
815 destroyInfoPanel(WCoreWindow
*foo
, void *data
, XEvent
*event
)
818 if (thePanel
->timer
) {
819 WMDeleteTimerHandler(thePanel
->timer
);
821 if (thePanel
->oldPix
) {
822 WMReleasePixmap(thePanel
->oldPix
);
824 if (thePanel
->oldFont
) {
825 WMReleaseFont(thePanel
->oldFont
);
827 if (thePanel
->icon
) {
828 RReleaseImage(thePanel
->icon
);
831 RReleaseImage(thePanel
->pic
);
833 #endif /* SILLYNESS */
834 WMUnmapWidget(thePanel
);
836 wUnmanageWindow(thePanel
->wwin
, False
, False
);
838 WMDestroyWidget(thePanel
->win
);
847 renderText(WMScreen
*scr
, char *text
, char *font
, RColor
*from
, RColor
*to
)
849 WMPixmap
*wpix
= NULL
;
852 RContext
*rc
= WMScreenRContext(scr
);
853 XFontStruct
*f
= NULL
;
857 f
= XLoadQueryFont(dpy
, font
);
861 w
= XTextWidth(f
, text
, strlen(text
));
862 h
= f
->ascent
+f
->descent
;
864 mask
= XCreatePixmap(dpy
, rc
->drawable
, w
, h
, 1);
865 gc
= XCreateGC(dpy
, mask
, 0, NULL
);
866 XSetForeground(dpy
, gc
, 0);
867 XSetFont(dpy
, gc
, f
->fid
);
868 XFillRectangle(dpy
, mask
, gc
, 0, 0, w
, h
);
870 XSetForeground(dpy
, gc
, 1);
871 XDrawString(dpy
, mask
, gc
, 0, f
->ascent
, text
, strlen(text
));
872 XSetLineAttributes(dpy
, gc
, 3, LineSolid
, CapRound
, JoinMiter
);
873 XDrawLine(dpy
, mask
, gc
, 0, h
-2, w
, h
-2);
875 grad
= XCreatePixmap(dpy
, rc
->drawable
, w
, h
, rc
->depth
);
879 color
= WMBlackColor(scr
);
880 XFillRectangle(dpy
, grad
, WMColorGC(color
), 0, 0, w
, h
);
881 WMReleaseColor(color
);
884 wpix
= WMCreatePixmapFromXPixmaps(scr
, grad
, mask
, w
, h
, rc
->depth
);
895 extern WMPixmap
*DoXThing();
896 extern Bool
InitXThing();
899 logoPushCallback(void *data
)
901 InfoPanel
*panel
= (InfoPanel
*)data
;
906 static int jingobeu
[] = {
907 329, 150, -1, 100, 329, 150, -1, 100, 329, 300, -1, 250,
908 329, 150, -1, 100, 329, 150, -1, 100, 329, 300, -1, 250,
909 329, 150, 392, 150, 261, 150, 293, 150, 329, 400, -1, 400, 0
917 if(jingobeu
[panel
->x
-1]==0){panel
->x
=-1;}else if(jingobeu
[panel
->x
918 -1]<0){panel
->x
++;c
=jingobeu
[panel
->x
-1]/50;panel
->x
++;}else if(c
==0){
919 kc
.bell_pitch
=jingobeu
[panel
->x
-1];panel
->x
++;kc
.bell_percent
=50;c
=
920 jingobeu
[panel
->x
-1]/50;kc
.bell_duration
=jingobeu
[panel
->x
-1];panel
->x
++;
921 XChangeKeyboardControl(dpy
,KBBellPitch
|KBBellDuration
|KBBellPercent
,&kc
);
922 XBell(dpy
,50);XFlush(dpy
);}else{c
--;}}
923 if (!(panel
->cycle
% 4)) {
926 p
= DoXThing(panel
->wwin
);
927 WMSetLabelImage(panel
->logoL
, p
);
929 } else if (panel
->cycle
< 30) {
934 gray
.red
= 0xae; gray
.green
= 0xaa;
935 gray
.blue
= 0xae; gray
.alpha
= 0;
937 image
= RScaleImage(panel
->icon
, panel
->pic
->width
, panel
->pic
->height
);
938 RCombineImagesWithOpaqueness(image
, panel
->pic
, panel
->cycle
*255/30);
939 pix
= WMCreateBlendedPixmapFromRImage(panel
->scr
->wmscreen
, image
, &gray
);
940 RReleaseImage(image
);
941 WMSetLabelImage(panel
->logoL
, pix
);
942 WMReleasePixmap(pix
);
945 /* slow down text a little */
946 i
= (int)(panel
->cycle
* 50.0/85.0)%200;
949 len
= strlen(panel
->str
);
951 strncpy(buffer
, panel
->str
, i
<len
? i
: len
);
953 memset(&buffer
[len
], ' ', i
-len
);
955 strncpy(buffer
, panel
->str
, i
<len
? i
: len
);
957 memset(&buffer
[len
], ' ', i
-len
);
960 WMSetLabelText(panel
->versionL
, buffer
);
962 XFlush(WMScreenDisplay(WMWidgetScreen(panel
->versionL
)));
967 panel
->timer
= WMAddTimerHandler(50, logoPushCallback
, panel
);
973 handleLogoPush(XEvent
*event
, void *data
)
975 InfoPanel
*panel
= (InfoPanel
*)data
;
976 static int broken
= 0;
977 static int clicks
= 0;
978 static char *pic_data
[] = {
1037 " ............... ",
1038 " ....XoO+@##+O$%.... ",
1039 " ...%X&*========-;;:o... ",
1040 " ...>.>,<122222222222134@... ",
1041 " ..>5678912222222222222220q%.. ",
1042 " ..$.&-w2222222222222222222er>.. ",
1043 " ..O.t31222222222222222222222y4>.. ",
1044 " ...O5u3222222222222222222222222yri... ",
1045 " ..>p&a22222222222222222222222222wso.. ",
1046 " ..ids91222222222222222222222222222wfi.. ",
1047 " ..X.7w222222wgs-w2222222213=g0222222<hi.. ",
1048 " ..Xuj2222222<@X5=222222229k@l:022222y4i.. ",
1049 " .Xdz22222222*X%.s22222222axo%$-222222<c>.. ",
1050 " ..o7y22222222v...r222222223hX.i82222221si.. ",
1051 "..io*222222222&...u22222222yt..%*22222220:%. ",
1052 "..>k02222222227...f222222222v..X=222222229t. ",
1053 "..dz12222222220ui:y2222222223d%qw222222221g. ",
1054 ".%vw222222222221y2222222222219*y2222222222wd.",
1055 ".X;2222222222222222222222222222222222222222b.",
1056 ".i*2222222222222222222222222222222222222222v.",
1057 ".i*2222222222222222222222222222222222222222;.",
1058 ".i*22222222222222222222222222222222222222228.",
1059 ".>*2222222222222222222222222222222222222222=.",
1060 ".i*22222222222222222222222222222222222222228.",
1061 ".i*2222222222222222222222222222222222222222;.",
1062 ".X*222222222222222222222222222222we12222222r.",
1063 ".Xs12222222w3aw22222222222222222y8s0222222wk.",
1064 ".Xq02222222a,na22222222222222222zm6zwy2222gi.",
1065 "..>*22222y<:Xcj22222222222222222-o$k;;02228..",
1066 "..i7y2220rhX.:y22222222222222222jtiXd,a220,..",
1067 " .X@z222a,do%kj2222222222222222wMX5q;gw228%..",
1068 " ..58222wagsh6ry222222222222221;>Of0w222y:...",
1069 " ...:e2222218mdz22222222222222a&$vw222220@...",
1070 " ...O-122222y:.u02222222222229q$uj222221r... ",
1071 " ..%&a1222223&573w2222222219NOxz122221z>... ",
1072 " ...t3222221-l$nr8ay1222yzbo,=12222w-5... ",
1073 " ..X:022222w-k+>o,7s**s7xOn=12221<f5... ",
1074 " ..o:9222221j8:&Bl>>>>ihv<12221=dX... ",
1075 " ..Xb9122222109g-****;<y22221zn%... ",
1076 " ..X&801222222222222222222w-h.... ",
1077 " ...o:=022222222222222221=lX... ",
1078 " ..X@:;3w2222222222210fO... ",
1079 " ...XX&v8<30000003-N@... ",
1080 " .....XmnbN:q&Bo.... ",
1083 static char *msgs
[] = {
1085 "Focus follow mouse users will burn in hell!!!",
1087 "Hi! My name is bobby...",
1088 "AHH! The neurotic monkeys are after me!",
1091 "SOMEBODY SET UP US THE BOMB",
1092 "ALL YOUR BASE ARE BELONG TO US!",
1093 "Oh My God!!! Larry is back!"
1099 if (!panel
->timer
&& !broken
&& clicks
> 0) {
1105 panel
->icon
= WMGetApplicationIconImage(panel
->scr
->wmscreen
);
1112 color
.red
= 0xae; color
.green
= 0xaa;
1113 color
.blue
= 0xae; color
.alpha
= 0;
1115 panel
->icon
= RCloneImage(panel
->icon
);
1116 RCombineImageWithColor(panel
->icon
, &color
);
1120 panel
->pic
= RGetImageFromXPMData(panel
->scr
->rcontext
, pic_data
);
1123 RReleaseImage(panel
->icon
);
1129 panel
->str
= msgs
[rand()%(sizeof(msgs
)/sizeof(char*))];
1131 panel
->timer
= WMAddTimerHandler(50, logoPushCallback
, panel
);
1133 panel
->oldPix
= WMRetainPixmap(WMGetLabelImage(panel
->logoL
));
1134 /* If we don't use a fixed font, scrolling will be jumpy */
1135 /* Alternatively we can draw text in a pixmap and scroll it smoothly */
1136 if ((panel
->oldFont
= WMGetLabelFont(panel
->versionL
))!=NULL
)
1137 WMRetainFont(panel
->oldFont
);
1138 font
= WMCreateFont(WMWidgetScreen(panel
->versionL
), "-*-fixed-*-*-*-*-14-*-*-*-*-*-*-*");
1140 WMSetLabelFont(panel
->versionL
, font
);
1141 WMReleaseFont(font
);
1143 WMSetLabelText(panel
->versionL
, "");
1144 } else if (panel
->timer
) {
1149 WMSetLabelImage(panel
->logoL
, panel
->oldPix
);
1150 WMReleasePixmap(panel
->oldPix
);
1151 panel
->oldPix
= NULL
;
1153 WMDeleteTimerHandler(panel
->timer
);
1154 panel
->timer
= NULL
;
1156 WMSetLabelFont(panel
->versionL
, panel
->oldFont
);
1157 if (panel
->oldFont
) {
1158 WMReleaseFont(panel
->oldFont
);
1159 panel
->oldFont
= NULL
;
1161 snprintf(version
, sizeof(version
), _("Version %s"), VERSION
);
1162 WMSetLabelText(panel
->versionL
, version
);
1163 XFlush(WMScreenDisplay(WMWidgetScreen(panel
->versionL
)));
1168 while (XCheckTypedWindowEvent(dpy
, WMWidgetXID(panel
->versionL
),
1172 #endif /* SILLYNESS */
1176 wShowInfoPanel(WScreen
*scr
)
1182 char *strbuf
= NULL
;
1186 RColor color1
, color2
;
1200 if (thePanel
->scr
== scr
) {
1201 wRaiseFrame(thePanel
->wwin
->frame
->core
);
1202 wSetFocusTo(scr
, thePanel
->wwin
);
1207 panel
= wmalloc(sizeof(InfoPanel
));
1208 memset(panel
, 0, sizeof(InfoPanel
));
1212 panel
->win
= WMCreateWindow(scr
->wmscreen
, "info");
1213 WMResizeWidget(panel
->win
, 382, 230);
1215 logo
= WMCreateApplicationIconBlendedPixmap(scr
->wmscreen
, (RColor
*)NULL
);
1217 logo
= WMRetainPixmap(WMGetApplicationIconPixmap(scr
->wmscreen
));
1220 size
= WMGetPixmapSize(logo
);
1221 panel
->logoL
= WMCreateLabel(panel
->win
);
1222 WMResizeWidget(panel
->logoL
, 64, 64);
1223 WMMoveWidget(panel
->logoL
, 30, 20);
1224 WMSetLabelImagePosition(panel
->logoL
, WIPImageOnly
);
1225 WMSetLabelImage(panel
->logoL
, logo
);
1227 WMCreateEventHandler(WMWidgetView(panel
->logoL
), ButtonPressMask
,
1228 handleLogoPush
, panel
);
1230 WMReleasePixmap(logo
);
1233 panel
->name1L
= WMCreateLabel(panel
->win
);
1234 WMResizeWidget(panel
->name1L
, 240, 30);
1235 WMMoveWidget(panel
->name1L
, 100, 30);
1240 color2
.green
= 0x50;
1242 logo
= renderText(scr
->wmscreen
, "GNU Window Maker",
1243 "-*-utopia-*-r-*-*-25-*", &color1
, &color2
);
1245 WMSetLabelImagePosition(panel
->name1L
, WIPImageOnly
);
1246 WMSetLabelImage(panel
->name1L
, logo
);
1247 WMReleasePixmap(logo
);
1249 font
= WMBoldSystemFontOfSize(scr
->wmscreen
, 20);
1251 WMSetLabelFont(panel
->name1L
, font
);
1252 WMReleaseFont(font
);
1254 WMSetLabelTextAlignment(panel
->name1L
, WACenter
);
1255 WMSetLabelText(panel
->name1L
, "GNU Window Maker");
1258 panel
->name2L
= WMCreateLabel(panel
->win
);
1259 WMResizeWidget(panel
->name2L
, 240, 24);
1260 WMMoveWidget(panel
->name2L
, 100, 60);
1261 font
= WMBoldSystemFontOfSize(scr
->wmscreen
, 18);
1263 WMSetLabelFont(panel
->name2L
, font
);
1264 WMReleaseFont(font
);
1267 WMSetLabelTextAlignment(panel
->name2L
, WACenter
);
1268 WMSetLabelText(panel
->name2L
, _("Window Manager for X"));
1271 snprintf(buffer
, sizeof(buffer
), _("Version %s"), VERSION
);
1272 panel
->versionL
= WMCreateLabel(panel
->win
);
1273 WMResizeWidget(panel
->versionL
, 310, 16);
1274 WMMoveWidget(panel
->versionL
, 30, 95);
1275 WMSetLabelTextAlignment(panel
->versionL
, WARight
);
1276 WMSetLabelText(panel
->versionL
, buffer
);
1277 WMSetLabelWraps(panel
->versionL
, False
);
1279 panel
->copyrL
= WMCreateLabel(panel
->win
);
1280 WMResizeWidget(panel
->copyrL
, 340, 40);
1281 WMMoveWidget(panel
->copyrL
, 15, 185);
1282 WMSetLabelTextAlignment(panel
->copyrL
, WALeft
);
1283 WMSetLabelText(panel
->copyrL
, COPYRIGHT_TEXT
);
1284 /* we want the (c) character in the helvetica font */
1285 font
= WMCreateNormalFont(scr
->wmscreen
, HELVETICA10_FONT
);
1287 WMSetLabelFont(panel
->copyrL
, font
);
1291 snprintf(buffer
, sizeof(buffer
), _("Using visual 0x%x: %s %ibpp "),
1292 (unsigned)scr
->w_visual
->visualid
,
1293 visuals
[scr
->w_visual
->class], scr
->w_depth
);
1295 strbuf
= wstrappend(strbuf
, buffer
);
1297 switch (scr
->w_depth
) {
1299 strbuf
= wstrappend(strbuf
, _("(32 thousand colors)\n"));
1302 strbuf
= wstrappend(strbuf
, _("(64 thousand colors)\n"));
1306 strbuf
= wstrappend(strbuf
, _("(16 million colors)\n"));
1309 snprintf(buffer
, sizeof(buffer
), _("(%d colors)\n"), 1<<scr
->w_depth
);
1310 strbuf
= wstrappend(strbuf
, buffer
);
1315 #if defined(HAVE_MALLOC_H) && defined(HAVE_MALLINFO)
1317 struct mallinfo ma
= mallinfo();
1318 snprintf(buffer
, sizeof(buffer
),
1319 _("Total allocated memory: %i kB. Total memory in use: %i kB.\n"),
1320 (ma
.arena
+ma
.hblkhd
)/1024, (ma
.uordblks
+ma
.hblkhd
)/1024);
1322 strbuf
= wstrappend(strbuf
, buffer
);
1326 strbuf
= wstrappend(strbuf
, _("Supported image formats: "));
1327 strl
= RSupportedFileFormats();
1328 for (i
=0; strl
[i
]!=NULL
; i
++) {
1329 strbuf
= wstrappend(strbuf
, strl
[i
]);
1330 strbuf
= wstrappend(strbuf
, " ");
1333 strbuf
= wstrappend(strbuf
, _("\nAdditional support for: "));
1346 list
[j
++] = "GNOME";
1353 for (i
= 0; i
< j
; i
++) {
1356 strcat(buf
, _(" and "));
1360 strcat(buf
, list
[i
]);
1362 strbuf
= wstrappend(strbuf
, buf
);
1365 if (wPreferences
.no_sound
) {
1366 strbuf
= wstrappend(strbuf
, _("\nSound disabled"));
1368 strbuf
= wstrappend(strbuf
, _("\nSound enabled"));
1372 panel
->infoL
= WMCreateLabel(panel
->win
);
1373 WMResizeWidget(panel
->infoL
, 350, 75);
1374 WMMoveWidget(panel
->infoL
, 15, 115);
1375 WMSetLabelText(panel
->infoL
, strbuf
);
1377 WMSetLabelFont(panel
->infoL
, font
);
1378 WMReleaseFont(font
);
1383 WMRealizeWidget(panel
->win
);
1384 WMMapSubwidgets(panel
->win
);
1386 parent
= XCreateSimpleWindow(dpy
, scr
->root_win
, 0, 0, 382, 230, 0, 0, 0);
1388 XReparentWindow(dpy
, WMWidgetXID(panel
->win
), parent
, 0, 0);
1390 WMMapWidget(panel
->win
);
1392 wwin
= wManageInternalWindow(scr
, parent
, None
, _("Info"),
1393 (scr
->scr_width
- 382)/2,
1394 (scr
->scr_height
- 230)/2, 382, 230);
1396 WSETUFLAG(wwin
, no_closable
, 0);
1397 WSETUFLAG(wwin
, no_close_button
, 0);
1398 #ifdef XKB_BUTTON_HINT
1399 wFrameWindowHideButton(wwin
->frame
, WFF_LANGUAGE_BUTTON
);
1401 wWindowUpdateButtonImages(wwin
);
1402 wFrameWindowShowButton(wwin
->frame
, WFF_RIGHT_BUTTON
);
1403 wwin
->frame
->on_click_right
= destroyInfoPanel
;
1411 if (InitXThing(panel
->scr
)) {
1412 panel
->timer
= WMAddTimerHandler(100, logoPushCallback
, panel
);
1415 panel
->str
= _("Merry X'mas!");
1416 panel
->oldPix
= WMRetainPixmap(WMGetLabelImage(panel
->logoL
));
1423 ***********************************************************************
1425 ***********************************************************************
1439 static LegalPanel
*legalPanel
= NULL
;
1442 destroyLegalPanel(WCoreWindow
*foo
, void *data
, XEvent
*event
)
1444 WMUnmapWidget(legalPanel
->win
);
1446 WMDestroyWidget(legalPanel
->win
);
1448 wUnmanageWindow(legalPanel
->wwin
, False
, False
);
1457 wShowLegalPanel(WScreen
*scr
)
1464 if (legalPanel
->scr
== scr
) {
1465 wRaiseFrame(legalPanel
->wwin
->frame
->core
);
1466 wSetFocusTo(scr
, legalPanel
->wwin
);
1471 panel
= wmalloc(sizeof(LegalPanel
));
1475 panel
->win
= WMCreateWindow(scr
->wmscreen
, "legal");
1476 WMResizeWidget(panel
->win
, 420, 250);
1479 panel
->licenseL
= WMCreateLabel(panel
->win
);
1480 WMSetLabelWraps(panel
->licenseL
, True
);
1481 WMResizeWidget(panel
->licenseL
, 400, 230);
1482 WMMoveWidget(panel
->licenseL
, 10, 10);
1483 WMSetLabelTextAlignment(panel
->licenseL
, WALeft
);
1484 WMSetLabelText(panel
->licenseL
,
1485 _(" Window Maker is free software; you can redistribute it and/or\n"
1486 "modify it under the terms of the GNU General Public License as\n"
1487 "published by the Free Software Foundation; either version 2 of the\n"
1488 "License, or (at your option) any later version.\n\n\n"
1489 " Window Maker is distributed in the hope that it will be useful,\n"
1490 "but WITHOUT ANY WARRANTY; without even the implied warranty\n"
1491 "of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
1492 "See the GNU General Public License for more details.\n\n\n"
1493 " You should have received a copy of the GNU General Public\n"
1494 "License along with this program; if not, write to the Free Software\n"
1495 "Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA\n"
1496 "02111-1307, USA."));
1497 WMSetLabelRelief(panel
->licenseL
, WRGroove
);
1499 WMRealizeWidget(panel
->win
);
1500 WMMapSubwidgets(panel
->win
);
1502 parent
= XCreateSimpleWindow(dpy
, scr
->root_win
, 0, 0, 420, 250, 0, 0, 0);
1504 XReparentWindow(dpy
, WMWidgetXID(panel
->win
), parent
, 0, 0);
1506 wwin
= wManageInternalWindow(scr
, parent
, None
, _("Legal"),
1507 (scr
->scr_width
- 420)/2,
1508 (scr
->scr_height
- 250)/2, 420, 250);
1510 WSETUFLAG(wwin
, no_closable
, 0);
1511 WSETUFLAG(wwin
, no_close_button
, 0);
1512 wWindowUpdateButtonImages(wwin
);
1513 wFrameWindowShowButton(wwin
->frame
, WFF_RIGHT_BUTTON
);
1514 #ifdef XKB_BUTTON_HINT
1515 wFrameWindowHideButton(wwin
->frame
, WFF_LANGUAGE_BUTTON
);
1517 wwin
->frame
->on_click_right
= destroyLegalPanel
;
1521 WMMapWidget(panel
->win
);
1530 ***********************************************************************
1531 * Crashing Dialog Panel
1532 ***********************************************************************
1535 extern WDDomain
*WDWindowAttributes
;
1538 typedef struct _CrashPanel
{
1539 WMWindow
*win
; /* main window */
1541 WMLabel
*iconL
; /* application icon */
1542 WMLabel
*nameL
; /* title of panel */
1544 WMFrame
*sepF
; /* separator frame */
1546 WMLabel
*noteL
; /* Title of note */
1547 WMLabel
*note2L
; /* body of note with what happened */
1549 WMFrame
*whatF
; /* "what to do next" frame */
1550 WMPopUpButton
*whatP
; /* action selection popup button */
1552 WMButton
*okB
; /* ok button */
1554 Bool done
; /* if finished with this dialog */
1555 int action
; /* what to do after */
1563 handleKeyPress(XEvent
*event
, void *clientData
)
1565 CrashPanel
*panel
= (CrashPanel
*)clientData
;
1567 if (event
->xkey
.keycode
== panel
->retKey
) {
1568 WMPerformButtonClick(panel
->okB
);
1574 okButtonCallback(void *self
, void *clientData
)
1576 CrashPanel
*panel
= (CrashPanel
*)clientData
;
1583 setCrashAction(void *self
, void *clientData
)
1585 WMPopUpButton
*pop
= (WMPopUpButton
*)self
;
1586 CrashPanel
*panel
= (CrashPanel
*)clientData
;
1588 panel
->action
= WMGetPopUpButtonSelectedItem(pop
);
1593 getWindowMakerIconImage(WMScreen
*scr
)
1595 proplist_t dict
, key
, option
, value
=NULL
;
1599 PLSetStringCmpHook(NULL
);
1601 key
= PLMakeString("Logo.WMPanel");
1602 option
= PLMakeString("Icon");
1604 dict
= PLGetDictionaryEntry(WDWindowAttributes
->dictionary
, key
);
1607 value
= PLGetDictionaryEntry(dict
, option
);
1613 PLSetStringCmpHook(StringCompareHook
);
1615 if (value
&& PLIsString(value
)) {
1616 path
= FindImage(wPreferences
.icon_path
, PLGetString(value
));
1621 gray
.red
= 0xae; gray
.green
= 0xaa;
1622 gray
.blue
= 0xae; gray
.alpha
= 0;
1624 pix
= WMCreateBlendedPixmapFromFile(scr
, path
, &gray
);
1638 wShowCrashingDialogPanel(int whatSig
)
1644 int screen_no
, scr_width
, scr_height
;
1648 panel
= wmalloc(sizeof(CrashPanel
));
1649 memset(panel
, 0, sizeof(CrashPanel
));
1651 screen_no
= DefaultScreen(dpy
);
1652 scr_width
= WidthOfScreen(ScreenOfDisplay(dpy
, screen_no
));
1653 scr_height
= HeightOfScreen(ScreenOfDisplay(dpy
, screen_no
));
1655 scr
= WMCreateScreen(dpy
, screen_no
);
1657 wsyserror(_("cannot open connection for crashing dialog panel. Aborting."));
1661 panel
->retKey
= XKeysymToKeycode(dpy
, XK_Return
);
1663 panel
->win
= WMCreateWindow(scr
, "crashingDialog");
1664 WMResizeWidget(panel
->win
, PWIDTH
, PHEIGHT
);
1665 WMMoveWidget(panel
->win
, (scr_width
- PWIDTH
)/2, (scr_height
- PHEIGHT
)/2);
1667 logo
= getWindowMakerIconImage(scr
);
1669 panel
->iconL
= WMCreateLabel(panel
->win
);
1670 WMResizeWidget(panel
->iconL
, 64, 64);
1671 WMMoveWidget(panel
->iconL
, 10, 10);
1672 WMSetLabelImagePosition(panel
->iconL
, WIPImageOnly
);
1673 WMSetLabelImage(panel
->iconL
, logo
);
1676 panel
->nameL
= WMCreateLabel(panel
->win
);
1677 WMResizeWidget(panel
->nameL
, 190, 18);
1678 WMMoveWidget(panel
->nameL
, 80, 35);
1679 WMSetLabelTextAlignment(panel
->nameL
, WALeft
);
1680 font
= WMBoldSystemFontOfSize(scr
, 18);
1681 WMSetLabelFont(panel
->nameL
, font
);
1682 WMReleaseFont(font
);
1683 WMSetLabelText(panel
->nameL
, _("Fatal error"));
1685 panel
->sepF
= WMCreateFrame(panel
->win
);
1686 WMResizeWidget(panel
->sepF
, PWIDTH
+4, 2);
1687 WMMoveWidget(panel
->sepF
, -2, 80);
1689 panel
->noteL
= WMCreateLabel(panel
->win
);
1690 WMResizeWidget(panel
->noteL
, PWIDTH
-20, 40);
1691 WMMoveWidget(panel
->noteL
, 10, 90);
1692 WMSetLabelTextAlignment(panel
->noteL
, WAJustified
);
1693 #ifdef SYS_SIGLIST_DECLARED
1694 snprintf(buf
, sizeof(buf
), _("Window Maker received signal %i\n(%s)."),
1695 whatSig
, sys_siglist
[whatSig
]);
1697 snprintf(buf
, sizeof(buf
), _("Window Maker received signal %i."), whatSig
);
1699 WMSetLabelText(panel
->noteL
, buf
);
1701 panel
->note2L
= WMCreateLabel(panel
->win
);
1702 WMResizeWidget(panel
->note2L
, PWIDTH
-20, 100);
1703 WMMoveWidget(panel
->note2L
, 10, 130);
1704 WMSetLabelTextAlignment(panel
->note2L
, WALeft
);
1705 WMSetLabelText(panel
->note2L
,
1706 _(" This fatal error occured probably due to a bug."
1707 " Please fill the included BUGFORM and "
1708 "report it to bugs@windowmaker.org."));
1709 WMSetLabelWraps(panel
->note2L
, True
);
1712 panel
->whatF
= WMCreateFrame(panel
->win
);
1713 WMResizeWidget(panel
->whatF
, PWIDTH
-20, 50);
1714 WMMoveWidget(panel
->whatF
, 10, 240);
1715 WMSetFrameTitle(panel
->whatF
, _("What do you want to do now?"));
1717 panel
->whatP
= WMCreatePopUpButton(panel
->whatF
);
1718 WMResizeWidget(panel
->whatP
, PWIDTH
-20-70, 20);
1719 WMMoveWidget(panel
->whatP
, 35, 20);
1720 WMSetPopUpButtonPullsDown(panel
->whatP
, False
);
1721 WMSetPopUpButtonText(panel
->whatP
, _("Select action"));
1722 WMAddPopUpButtonItem(panel
->whatP
, _("Abort and leave a core file"));
1723 WMAddPopUpButtonItem(panel
->whatP
, _("Restart Window Maker"));
1724 WMAddPopUpButtonItem(panel
->whatP
, _("Start alternate window manager"));
1725 WMSetPopUpButtonAction(panel
->whatP
, setCrashAction
, panel
);
1726 WMSetPopUpButtonSelectedItem(panel
->whatP
, WMRestart
);
1727 panel
->action
= WMRestart
;
1729 WMMapSubwidgets(panel
->whatF
);
1731 panel
->okB
= WMCreateCommandButton(panel
->win
);
1732 WMResizeWidget(panel
->okB
, 80, 26);
1733 WMMoveWidget(panel
->okB
, 205, 309);
1734 WMSetButtonText(panel
->okB
, _("OK"));
1735 WMSetButtonImage(panel
->okB
, WMGetSystemPixmap(scr
, WSIReturnArrow
));
1736 WMSetButtonAltImage(panel
->okB
, WMGetSystemPixmap(scr
, WSIHighlightedReturnArrow
));
1737 WMSetButtonImagePosition(panel
->okB
, WIPRight
);
1738 WMSetButtonAction(panel
->okB
, okButtonCallback
, panel
);
1742 WMCreateEventHandler(WMWidgetView(panel
->win
), KeyPressMask
,
1743 handleKeyPress
, panel
);
1745 WMRealizeWidget(panel
->win
);
1746 WMMapSubwidgets(panel
->win
);
1748 WMMapWidget(panel
->win
);
1750 XSetInputFocus(dpy
, WMWidgetXID(panel
->win
), RevertToParent
, CurrentTime
);
1752 while (!panel
->done
) {
1755 WMNextEvent(dpy
, &event
);
1756 WMHandleEvent(&event
);
1759 action
= panel
->action
;
1761 WMUnmapWidget(panel
->win
);
1762 WMDestroyWidget(panel
->win
);
1771 /*****************************************************************************
1772 * About GNUstep Panel
1773 *****************************************************************************/
1777 drawGNUstepLogo(Display
*dpy
, Drawable d
, int width
, int height
,
1778 unsigned long blackPixel
, unsigned long whitePixel
)
1782 XRectangle rects
[3];
1784 gcv
.foreground
= blackPixel
;
1785 gc
= XCreateGC(dpy
, d
, GCForeground
, &gcv
);
1787 XFillArc(dpy
, d
, gc
, width
/45, height
/45,
1788 width
- 2*width
/45, height
- 2*height
/45, 0, 360*64);
1791 rects
[0].y
= 37*height
/45;
1792 rects
[0].width
= width
/3;
1793 rects
[0].height
= height
- rects
[0].y
;
1795 rects
[1].x
= rects
[0].width
;
1796 rects
[1].y
= height
/2;
1797 rects
[1].width
= width
- 2*width
/3;
1798 rects
[1].height
= height
- rects
[1].y
;
1800 rects
[2].x
= 2*width
/3;
1801 rects
[2].y
= height
- 37*height
/45;
1802 rects
[2].width
= width
/3;
1803 rects
[2].height
= height
- rects
[2].y
;
1805 XSetClipRectangles(dpy
, gc
, 0, 0, rects
, 3, Unsorted
);
1806 XFillRectangle(dpy
, d
, gc
, 0, 0, width
, height
);
1808 XSetForeground(dpy
, gc
, whitePixel
);
1809 XFillArc(dpy
, d
, gc
, width
/45, height
/45,
1810 width
- 2*width
/45, height
- 2*height
/45, 0, 360*64);
1828 static GNUstepPanel
*gnustepPanel
= NULL
;
1831 destroyGNUstepPanel(WCoreWindow
*foo
, void *data
, XEvent
*event
)
1833 WMUnmapWidget(gnustepPanel
->win
);
1835 WMDestroyWidget(gnustepPanel
->win
);
1837 wUnmanageWindow(gnustepPanel
->wwin
, False
, False
);
1839 wfree(gnustepPanel
);
1841 gnustepPanel
= NULL
;
1846 wShowGNUstepPanel(WScreen
*scr
)
1848 GNUstepPanel
*panel
;
1855 if (gnustepPanel
->scr
== scr
) {
1856 wRaiseFrame(gnustepPanel
->wwin
->frame
->core
);
1857 wSetFocusTo(scr
, gnustepPanel
->wwin
);
1862 panel
= wmalloc(sizeof(GNUstepPanel
));
1866 panel
->win
= WMCreateWindow(scr
->wmscreen
, "About GNUstep");
1867 WMResizeWidget(panel
->win
, 325, 200);
1869 pixmap
= WMCreatePixmap(scr
->wmscreen
, 130, 130,
1870 WMScreenDepth(scr
->wmscreen
), True
);
1872 color
= WMCreateNamedColor(scr
->wmscreen
, "gray50", True
);
1874 drawGNUstepLogo(dpy
, WMGetPixmapXID(pixmap
), 130, 130,
1875 WMColorPixel(color
), scr
->white_pixel
);
1877 WMReleaseColor(color
);
1879 XSetForeground(dpy
, scr
->mono_gc
, 0);
1880 XFillRectangle(dpy
, WMGetPixmapMaskXID(pixmap
), scr
->mono_gc
, 0, 0,
1882 drawGNUstepLogo(dpy
, WMGetPixmapMaskXID(pixmap
), 130, 130, 1, 1);
1884 panel
->gstepL
= WMCreateLabel(panel
->win
);
1885 WMResizeWidget(panel
->gstepL
, 285, 64);
1886 WMMoveWidget(panel
->gstepL
, 20, 0);
1887 WMSetLabelTextAlignment(panel
->gstepL
, WARight
);
1888 WMSetLabelText(panel
->gstepL
, "GNUstep");
1890 WMFont
*font
= WMBoldSystemFontOfSize(scr
->wmscreen
, 24);
1892 WMSetLabelFont(panel
->gstepL
, font
);
1893 WMReleaseFont(font
);
1896 panel
->textL
= WMCreateLabel(panel
->win
);
1897 WMResizeWidget(panel
->textL
, 275, 130);
1898 WMMoveWidget(panel
->textL
, 30, 50);
1899 WMSetLabelTextAlignment(panel
->textL
, WARight
);
1900 WMSetLabelImagePosition(panel
->textL
, WIPOverlaps
);
1901 WMSetLabelText(panel
->textL
,
1902 _("Window Maker is part of the GNUstep project.\n"\
1903 "The GNUstep project aims to create a free\n"\
1904 "implementation of the OpenStep(tm) specification\n"\
1905 "which is a object-oriented framework for\n"\
1906 "creating advanced graphical, multi-platform\n"\
1907 "applications. Additionally, a development and\n"\
1908 "user desktop enviroment will be created on top\n"\
1909 "of the framework. For more information about\n"\
1910 "GNUstep, please visit: www.gnustep.org"));
1911 WMSetLabelImage(panel
->textL
, pixmap
);
1913 WMReleasePixmap(pixmap
);
1915 WMRealizeWidget(panel
->win
);
1916 WMMapSubwidgets(panel
->win
);
1918 parent
= XCreateSimpleWindow(dpy
, scr
->root_win
, 0, 0, 325, 200, 0, 0, 0);
1920 XReparentWindow(dpy
, WMWidgetXID(panel
->win
), parent
, 0, 0);
1922 wwin
= wManageInternalWindow(scr
, parent
, None
, _("About GNUstep"),
1923 (scr
->scr_width
- 325)/2,
1924 (scr
->scr_height
- 200)/2, 325, 200);
1926 WSETUFLAG(wwin
, no_closable
, 0);
1927 WSETUFLAG(wwin
, no_close_button
, 0);
1928 wWindowUpdateButtonImages(wwin
);
1929 wFrameWindowShowButton(wwin
->frame
, WFF_RIGHT_BUTTON
);
1930 #ifdef XKB_BUTTON_HINT
1931 wFrameWindowHideButton(wwin
->frame
, WFF_LANGUAGE_BUTTON
);
1933 wwin
->frame
->on_click_right
= destroyGNUstepPanel
;
1937 WMMapWidget(panel
->win
);
1941 gnustepPanel
= panel
;