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
);
384 file
= wmalloc(strlen(dirfile
)+strlen(text
)+4);
385 sprintf(file
, "%s/%s", dirfile
, text
);
388 if ((state
& WLDSSelected
) != 0) {
389 color
.red
= color
.green
= color
.blue
= 0xff;
392 color
.red
= color
.blue
= 0xae;
393 color
.green
= 0xaa; color
.alpha
= 0;
395 pixmap
= WMCreateBlendedPixmapFromFile(wmscr
, file
, &color
);
399 WMRemoveListItem(lPtr
, index
);
403 XClearArea(dpy
, d
, rect
->pos
.x
, rect
->pos
.y
, width
, rect
->size
.height
,
405 XSetClipMask(dpy
, gc
, None
);
407 XDrawRectangle(dpy, d, WMColorGC(whitecolor), rect->pos.x + 5,
408 rect->pos.y +5, width - 10, 54);
410 XDrawLine(dpy
, d
, WMColorGC(whitecolor
), rect
->pos
.x
,
411 rect
->pos
.y
+rect
->size
.height
-1, rect
->pos
.x
+width
,
412 rect
->pos
.y
+rect
->size
.height
-1);
415 if (state
&WLDSSelected
) {
416 XFillRectangle(dpy
, d
, WMColorGC(whitecolor
), rect
->pos
.x
,
417 rect
->pos
.y
, width
, rect
->size
.height
);
420 size
= WMGetPixmapSize(pixmap
);
422 XSetClipMask(dpy
, copygc
, WMGetPixmapMaskXID(pixmap
));
423 XSetClipOrigin(dpy
, copygc
, rect
->pos
.x
+ (width
-size
.width
)/2,
425 XCopyArea(dpy
, WMGetPixmapXID(pixmap
), d
, copygc
, 0, 0,
426 size
.width
>100?100:size
.width
, size
.height
>64?64:size
.height
,
427 rect
->pos
.x
+ (width
-size
.width
)/2, rect
->pos
.y
+2);
431 int fheight
= WMFontHeight(panel
->normalfont
);
432 int tlen
= strlen(text
);
433 int twidth
= WMWidthOfString(panel
->normalfont
, text
, tlen
);
436 ofx
= rect
->pos
.x
+ (width
- twidth
)/2;
437 ofy
= rect
->pos
.y
+ 64 - fheight
;
441 WMDrawString(wmscr
, d
, WMColorGC(whitecolor
),
442 panel
->normalfont
, ofx
+i
, ofy
+j
,
445 WMDrawString(wmscr
, d
, WMColorGC(blackcolor
), panel
->normalfont
,
446 ofx
, ofy
, text
, tlen
);
449 WMReleasePixmap(pixmap
);
450 /* I hope it is better to do not use cache / on my box it is fast nuff */
453 WMReleaseColor(blackcolor
);
454 WMReleaseColor(whitecolor
);
459 buttonCallback(void *self
, void *clientData
)
461 WMButton
*bPtr
= (WMButton
*)self
;
462 IconPanel
*panel
= (IconPanel
*)clientData
;
465 if (bPtr
==panel
->okButton
) {
467 panel
->result
= True
;
468 } else if (bPtr
==panel
->cancelButton
) {
470 panel
->result
= False
;
471 } else if (bPtr
==panel
->previewButton
) {
472 /**** Previewer ****/
473 WMSetButtonEnabled(bPtr
, False
);
474 WMSetListUserDrawItemHeight(panel
->iconList
, 68);
475 WMSetListUserDrawProc(panel
->iconList
, drawIconProc
);
476 WMRedisplayWidget(panel
->iconList
);
477 /* for draw proc to access screen/gc */
478 /*** end preview ***/
481 else if (bPtr
==panel
->chooseButton
) {
484 op
= WMCreateOpenPanel(WMWidgetScreen(bPtr
));
486 if (WMRunModalFilePanelForDirectory(op
, NULL
, "/usr/local", NULL
, NULL
)) {
488 path
= WMGetFilePanelFile(op
);
489 WMSetTextFieldText(panel
->fileField
, path
);
490 setViewedImage(panel
, path
);
493 WMDestroyFilePanel(op
);
500 keyPressHandler(XEvent
*event
, void *data
)
502 IconPanel
*panel
= (IconPanel
*)data
;
503 Display
*dpy
= event
->xany
.display
;
512 if (event
->type
== KeyRelease
)
516 count
= XLookupString(&event
->xkey
, buffer
, sizeof(buffer
), &ksym
, NULL
);
519 iidx
= WMGetListSelectedItemRow(panel
->iconList
);
520 didx
= WMGetListSelectedItemRow(panel
->dirList
);
528 list
= panel
->iconList
;
531 if (iidx
< WMGetListNumberOfRows(panel
->iconList
) - 1)
535 list
= panel
->iconList
;
539 list
= panel
->iconList
;
542 item
= WMGetListNumberOfRows(panel
->iconList
) - 1;
543 list
= panel
->iconList
;
546 if (didx
< WMGetListNumberOfRows(panel
->dirList
) - 1)
550 list
= panel
->dirList
;
557 list
= panel
->dirList
;
560 WMPerformButtonClick(panel
->okButton
);
563 WMPerformButtonClick(panel
->cancelButton
);
568 WMSelectListItem(list
, item
);
569 WMSetListPosition(list
, item
- 5);
570 listCallback(list
, panel
);
577 wIconChooserDialog(WScreen
*scr
, char **file
, char *instance
, char *class)
585 panel
= wmalloc(sizeof(IconPanel
));
586 memset(panel
, 0, sizeof(IconPanel
));
590 panel
->win
= WMCreateWindow(scr
->wmscreen
, "iconChooser");
591 WMResizeWidget(panel
->win
, 450, 280);
593 WMCreateEventHandler(WMWidgetView(panel
->win
), KeyPressMask
|KeyReleaseMask
,
594 keyPressHandler
, panel
);
597 boldFont
= WMBoldSystemFontOfSize(scr
->wmscreen
, 12);
598 panel
->normalfont
= WMSystemFontOfSize(WMWidgetScreen(panel
->win
), 12);
600 panel
->dirLabel
= WMCreateLabel(panel
->win
);
601 WMResizeWidget(panel
->dirLabel
, 200, 20);
602 WMMoveWidget(panel
->dirLabel
, 10, 7);
603 WMSetLabelText(panel
->dirLabel
, _("Directories"));
604 WMSetLabelFont(panel
->dirLabel
, boldFont
);
605 WMSetLabelTextAlignment(panel
->dirLabel
, WACenter
);
607 WMSetLabelRelief(panel
->dirLabel
, WRSunken
);
609 panel
->iconLabel
= WMCreateLabel(panel
->win
);
610 WMResizeWidget(panel
->iconLabel
, 140, 20);
611 WMMoveWidget(panel
->iconLabel
, 215, 7);
612 WMSetLabelText(panel
->iconLabel
, _("Icons"));
613 WMSetLabelFont(panel
->iconLabel
, boldFont
);
614 WMSetLabelTextAlignment(panel
->iconLabel
, WACenter
);
616 WMReleaseFont(boldFont
);
618 color
= WMWhiteColor(scr
->wmscreen
);
619 WMSetLabelTextColor(panel
->dirLabel
, color
);
620 WMSetLabelTextColor(panel
->iconLabel
, color
);
621 WMReleaseColor(color
);
623 color
= WMDarkGrayColor(scr
->wmscreen
);
624 WMSetWidgetBackgroundColor(panel
->iconLabel
, color
);
625 WMSetWidgetBackgroundColor(panel
->dirLabel
, color
);
626 WMReleaseColor(color
);
628 WMSetLabelRelief(panel
->iconLabel
, WRSunken
);
630 panel
->dirList
= WMCreateList(panel
->win
);
631 WMResizeWidget(panel
->dirList
, 200, 170);
632 WMMoveWidget(panel
->dirList
, 10, 30);
633 WMSetListAction(panel
->dirList
, listCallback
, panel
);
635 panel
->iconList
= WMCreateList(panel
->win
);
636 WMResizeWidget(panel
->iconList
, 140, 170);
637 WMMoveWidget(panel
->iconList
, 215, 30);
638 WMSetListAction(panel
->iconList
, listCallback
, panel
);
640 WMHangData(panel
->iconList
,panel
);
642 panel
->previewButton
= WMCreateCommandButton(panel
->win
);
643 WMResizeWidget(panel
->previewButton
, 75, 26);
644 WMMoveWidget(panel
->previewButton
, 365, 130);
645 WMSetButtonText(panel
->previewButton
, _("Preview"));
646 WMSetButtonAction(panel
->previewButton
, buttonCallback
, panel
);
648 panel
->iconView
= WMCreateLabel(panel
->win
);
649 WMResizeWidget(panel
->iconView
, 75, 75);
650 WMMoveWidget(panel
->iconView
, 365, 40);
651 WMSetLabelImagePosition(panel
->iconView
, WIPOverlaps
);
652 WMSetLabelRelief(panel
->iconView
, WRSunken
);
653 WMSetLabelTextAlignment(panel
->iconView
, WACenter
);
655 panel
->fileLabel
= WMCreateLabel(panel
->win
);
656 WMResizeWidget(panel
->fileLabel
, 80, 20);
657 WMMoveWidget(panel
->fileLabel
, 10, 210);
658 WMSetLabelText(panel
->fileLabel
, _("File Name:"));
660 panel
->fileField
= WMCreateTextField(panel
->win
);
661 WMSetViewNextResponder(WMWidgetView(panel
->fileField
), WMWidgetView(panel
->win
));
662 WMResizeWidget(panel
->fileField
, 345, 20);
663 WMMoveWidget(panel
->fileField
, 95, 210);
664 WMSetTextFieldEditable(panel
->fileField
, False
);
666 panel
->okButton
= WMCreateCommandButton(panel
->win
);
667 WMResizeWidget(panel
->okButton
, 80, 26);
668 WMMoveWidget(panel
->okButton
, 360, 240);
669 WMSetButtonText(panel
->okButton
, _("OK"));
670 WMSetButtonEnabled(panel
->okButton
, False
);
671 WMSetButtonAction(panel
->okButton
, buttonCallback
, panel
);
673 panel
->cancelButton
= WMCreateCommandButton(panel
->win
);
674 WMResizeWidget(panel
->cancelButton
, 80, 26);
675 WMMoveWidget(panel
->cancelButton
, 270, 240);
676 WMSetButtonText(panel
->cancelButton
, _("Cancel"));
677 WMSetButtonAction(panel
->cancelButton
, buttonCallback
, panel
);
679 panel
->chooseButton
= WMCreateCommandButton(panel
->win
);
680 WMResizeWidget(panel
->chooseButton
, 110, 26);
681 WMMoveWidget(panel
->chooseButton
, 150, 240);
682 WMSetButtonText(panel
->chooseButton
, _("Choose File"));
683 WMSetButtonAction(panel
->chooseButton
, buttonCallback
, panel
);
685 WMRealizeWidget(panel
->win
);
686 WMMapSubwidgets(panel
->win
);
688 parent
= XCreateSimpleWindow(dpy
, scr
->root_win
, 0, 0, 450, 280, 0, 0, 0);
690 XReparentWindow(dpy
, WMWidgetXID(panel
->win
), parent
, 0, 0);
695 tmp
= wmalloc((instance
? strlen(instance
) : 0)
696 + (class ? strlen(class) : 0) + 32);
698 if (tmp
&& (instance
|| class))
699 sprintf(tmp
, "%s [%s.%s]", _("Icon Chooser"), instance
, class);
701 strcpy(tmp
, _("Icon Chooser"));
703 wwin
= wManageInternalWindow(scr
, parent
, None
, tmp
,
704 (scr
->scr_width
- 450)/2,
705 (scr
->scr_height
- 280)/2, 450, 280);
709 /* put icon paths in the list */
710 listIconPaths(panel
->dirList
);
712 WMMapWidget(panel
->win
);
716 while (!panel
->done
) {
719 WMNextEvent(dpy
, &event
);
720 WMHandleEvent(&event
);
724 char *defaultPath
, *wantedPath
;
726 /* check if the file the user selected is not the one that
727 * would be loaded by default with the current search path */
728 *file
= WMGetListSelectedItem(panel
->iconList
)->text
;
733 defaultPath
= FindImage(wPreferences
.icon_path
, *file
);
734 wantedPath
= WMGetTextFieldText(panel
->fileField
);
735 /* if the file is not the default, use full path */
736 if (strcmp(wantedPath
, defaultPath
)!=0) {
739 *file
= wstrdup(*file
);
748 WMReleaseFont(panel
->normalfont
);
750 WMUnmapWidget(panel
->win
);
752 WMDestroyWidget(panel
->win
);
754 wUnmanageWindow(wwin
, False
, False
);
758 XDestroyWindow(dpy
, parent
);
760 return panel
->result
;
765 ***********************************************************************
767 ***********************************************************************
802 #define COPYRIGHT_TEXT \
803 "Copyright \xa9 1997~2001 Alfredo K. Kojima <kojima@windowmaker.org>\n"\
804 "Copyright \xa9 1998~2001 Dan Pascu <dan@windowmaker.org>"
808 static InfoPanel
*thePanel
= NULL
;
811 destroyInfoPanel(WCoreWindow
*foo
, void *data
, XEvent
*event
)
814 if (thePanel
->timer
) {
815 WMDeleteTimerHandler(thePanel
->timer
);
817 if (thePanel
->oldPix
) {
818 WMReleasePixmap(thePanel
->oldPix
);
820 if (thePanel
->oldFont
) {
821 WMReleaseFont(thePanel
->oldFont
);
823 if (thePanel
->icon
) {
824 RReleaseImage(thePanel
->icon
);
827 RReleaseImage(thePanel
->pic
);
829 #endif /* SILLYNESS */
830 WMUnmapWidget(thePanel
);
832 wUnmanageWindow(thePanel
->wwin
, False
, False
);
834 WMDestroyWidget(thePanel
->win
);
843 renderText(WMScreen
*scr
, char *text
, char *font
, RColor
*from
, RColor
*to
)
845 WMPixmap
*wpix
= NULL
;
848 RContext
*rc
= WMScreenRContext(scr
);
849 XFontStruct
*f
= NULL
;
853 f
= XLoadQueryFont(dpy
, font
);
857 w
= XTextWidth(f
, text
, strlen(text
));
858 h
= f
->ascent
+f
->descent
;
860 mask
= XCreatePixmap(dpy
, rc
->drawable
, w
, h
, 1);
861 gc
= XCreateGC(dpy
, mask
, 0, NULL
);
862 XSetForeground(dpy
, gc
, 0);
863 XSetFont(dpy
, gc
, f
->fid
);
864 XFillRectangle(dpy
, mask
, gc
, 0, 0, w
, h
);
866 XSetForeground(dpy
, gc
, 1);
867 XDrawString(dpy
, mask
, gc
, 0, f
->ascent
, text
, strlen(text
));
868 XSetLineAttributes(dpy
, gc
, 3, LineSolid
, CapRound
, JoinMiter
);
869 XDrawLine(dpy
, mask
, gc
, 0, h
-2, w
, h
-2);
871 grad
= XCreatePixmap(dpy
, rc
->drawable
, w
, h
, rc
->depth
);
875 color
= WMBlackColor(scr
);
876 XFillRectangle(dpy
, grad
, WMColorGC(color
), 0, 0, w
, h
);
877 WMReleaseColor(color
);
880 wpix
= WMCreatePixmapFromXPixmaps(scr
, grad
, mask
, w
, h
, rc
->depth
);
891 extern WMPixmap
*DoXThing();
892 extern Bool
InitXThing();
895 logoPushCallback(void *data
)
897 InfoPanel
*panel
= (InfoPanel
*)data
;
902 static int jingobeu
[] = {
903 329, 150, -1, 100, 329, 150, -1, 100, 329, 300, -1, 250,
904 329, 150, -1, 100, 329, 150, -1, 100, 329, 300, -1, 250,
905 329, 150, 392, 150, 261, 150, 293, 150, 329, 400, -1, 400, 0
913 if(jingobeu
[panel
->x
-1]==0){panel
->x
=-1;}else if(jingobeu
[panel
->x
914 -1]<0){panel
->x
++;c
=jingobeu
[panel
->x
-1]/50;panel
->x
++;}else if(c
==0){
915 kc
.bell_pitch
=jingobeu
[panel
->x
-1];panel
->x
++;kc
.bell_percent
=50;c
=
916 jingobeu
[panel
->x
-1]/50;kc
.bell_duration
=jingobeu
[panel
->x
-1];panel
->x
++;
917 XChangeKeyboardControl(dpy
,KBBellPitch
|KBBellDuration
|KBBellPercent
,&kc
);
918 XBell(dpy
,50);XFlush(dpy
);}else{c
--;}}
919 if (!(panel
->cycle
% 4)) {
922 p
= DoXThing(panel
->wwin
);
923 WMSetLabelImage(panel
->logoL
, p
);
925 } else if (panel
->cycle
< 30) {
930 gray
.red
= 0xae; gray
.green
= 0xaa;
931 gray
.blue
= 0xae; gray
.alpha
= 0;
933 image
= RScaleImage(panel
->icon
, panel
->pic
->width
, panel
->pic
->height
);
934 RCombineImagesWithOpaqueness(image
, panel
->pic
, panel
->cycle
*255/30);
935 pix
= WMCreateBlendedPixmapFromRImage(panel
->scr
->wmscreen
, image
, &gray
);
936 RReleaseImage(image
);
937 WMSetLabelImage(panel
->logoL
, pix
);
938 WMReleasePixmap(pix
);
941 /* slow down text a little */
942 i
= (int)(panel
->cycle
* 50.0/85.0)%200;
945 len
= strlen(panel
->str
);
947 strncpy(buffer
, panel
->str
, i
<len
? i
: len
);
949 memset(&buffer
[len
], ' ', i
-len
);
951 strncpy(buffer
, panel
->str
, i
<len
? i
: len
);
953 memset(&buffer
[len
], ' ', i
-len
);
956 WMSetLabelText(panel
->versionL
, buffer
);
958 XFlush(WMScreenDisplay(WMWidgetScreen(panel
->versionL
)));
963 panel
->timer
= WMAddTimerHandler(50, logoPushCallback
, panel
);
969 handleLogoPush(XEvent
*event
, void *data
)
971 InfoPanel
*panel
= (InfoPanel
*)data
;
972 static int broken
= 0;
973 static int clicks
= 0;
974 static char *pic_data
[] = {
1033 " ............... ",
1034 " ....XoO+@##+O$%.... ",
1035 " ...%X&*========-;;:o... ",
1036 " ...>.>,<122222222222134@... ",
1037 " ..>5678912222222222222220q%.. ",
1038 " ..$.&-w2222222222222222222er>.. ",
1039 " ..O.t31222222222222222222222y4>.. ",
1040 " ...O5u3222222222222222222222222yri... ",
1041 " ..>p&a22222222222222222222222222wso.. ",
1042 " ..ids91222222222222222222222222222wfi.. ",
1043 " ..X.7w222222wgs-w2222222213=g0222222<hi.. ",
1044 " ..Xuj2222222<@X5=222222229k@l:022222y4i.. ",
1045 " .Xdz22222222*X%.s22222222axo%$-222222<c>.. ",
1046 " ..o7y22222222v...r222222223hX.i82222221si.. ",
1047 "..io*222222222&...u22222222yt..%*22222220:%. ",
1048 "..>k02222222227...f222222222v..X=222222229t. ",
1049 "..dz12222222220ui:y2222222223d%qw222222221g. ",
1050 ".%vw222222222221y2222222222219*y2222222222wd.",
1051 ".X;2222222222222222222222222222222222222222b.",
1052 ".i*2222222222222222222222222222222222222222v.",
1053 ".i*2222222222222222222222222222222222222222;.",
1054 ".i*22222222222222222222222222222222222222228.",
1055 ".>*2222222222222222222222222222222222222222=.",
1056 ".i*22222222222222222222222222222222222222228.",
1057 ".i*2222222222222222222222222222222222222222;.",
1058 ".X*222222222222222222222222222222we12222222r.",
1059 ".Xs12222222w3aw22222222222222222y8s0222222wk.",
1060 ".Xq02222222a,na22222222222222222zm6zwy2222gi.",
1061 "..>*22222y<:Xcj22222222222222222-o$k;;02228..",
1062 "..i7y2220rhX.:y22222222222222222jtiXd,a220,..",
1063 " .X@z222a,do%kj2222222222222222wMX5q;gw228%..",
1064 " ..58222wagsh6ry222222222222221;>Of0w222y:...",
1065 " ...:e2222218mdz22222222222222a&$vw222220@...",
1066 " ...O-122222y:.u02222222222229q$uj222221r... ",
1067 " ..%&a1222223&573w2222222219NOxz122221z>... ",
1068 " ...t3222221-l$nr8ay1222yzbo,=12222w-5... ",
1069 " ..X:022222w-k+>o,7s**s7xOn=12221<f5... ",
1070 " ..o:9222221j8:&Bl>>>>ihv<12221=dX... ",
1071 " ..Xb9122222109g-****;<y22221zn%... ",
1072 " ..X&801222222222222222222w-h.... ",
1073 " ...o:=022222222222222221=lX... ",
1074 " ..X@:;3w2222222222210fO... ",
1075 " ...XX&v8<30000003-N@... ",
1076 " .....XmnbN:q&Bo.... ",
1078 static char *msgs
[] = {
1080 "Focus follow mouse users will burn in hell!!!",
1082 "Hi! My name is bobby...",
1083 "AHH! The neurotic monkeys are after me!",
1086 "SOMEBODY SET UP US THE BOMB",
1087 "ALL YOUR BASE ARE BELONG TO US!",
1088 "Oh My God!!! Larry is back!"
1094 if (!panel
->timer
&& !broken
&& clicks
> 0) {
1100 panel
->icon
= WMGetApplicationIconImage(panel
->scr
->wmscreen
);
1107 color
.red
= 0xae; color
.green
= 0xaa;
1108 color
.blue
= 0xae; color
.alpha
= 0;
1110 panel
->icon
= RCloneImage(panel
->icon
);
1111 RCombineImageWithColor(panel
->icon
, &color
);
1115 panel
->pic
= RGetImageFromXPMData(panel
->scr
->rcontext
, pic_data
);
1118 RReleaseImage(panel
->icon
);
1124 panel
->str
= msgs
[rand()%(sizeof(msgs
)/sizeof(char*))];
1126 panel
->timer
= WMAddTimerHandler(50, logoPushCallback
, panel
);
1128 panel
->oldPix
= WMRetainPixmap(WMGetLabelImage(panel
->logoL
));
1129 /* If we don't use a fixed font, scrolling will be jumpy */
1130 /* Alternatively we can draw text in a pixmap and scroll it smoothly */
1131 if ((panel
->oldFont
= WMGetLabelFont(panel
->versionL
))!=NULL
)
1132 WMRetainFont(panel
->oldFont
);
1133 font
= WMCreateFont(WMWidgetScreen(panel
->versionL
), "-*-fixed-*-*-*-*-14-*-*-*-*-*-*-*");
1135 WMSetLabelFont(panel
->versionL
, font
);
1136 WMReleaseFont(font
);
1138 WMSetLabelText(panel
->versionL
, "");
1139 } else if (panel
->timer
) {
1144 WMSetLabelImage(panel
->logoL
, panel
->oldPix
);
1145 WMReleasePixmap(panel
->oldPix
);
1146 panel
->oldPix
= NULL
;
1148 WMDeleteTimerHandler(panel
->timer
);
1149 panel
->timer
= NULL
;
1151 WMSetLabelFont(panel
->versionL
, panel
->oldFont
);
1152 if (panel
->oldFont
) {
1153 WMReleaseFont(panel
->oldFont
);
1154 panel
->oldFont
= NULL
;
1156 sprintf(version
, _("Version %s"), VERSION
);
1157 WMSetLabelText(panel
->versionL
, version
);
1158 XFlush(WMScreenDisplay(WMWidgetScreen(panel
->versionL
)));
1163 while (XCheckTypedWindowEvent(dpy
, WMWidgetXID(panel
->versionL
),
1167 #endif /* SILLYNESS */
1171 wShowInfoPanel(WScreen
*scr
)
1181 RColor color1
, color2
;
1195 if (thePanel
->scr
== scr
) {
1196 wRaiseFrame(thePanel
->wwin
->frame
->core
);
1197 wSetFocusTo(scr
, thePanel
->wwin
);
1202 panel
= wmalloc(sizeof(InfoPanel
));
1203 memset(panel
, 0, sizeof(InfoPanel
));
1207 panel
->win
= WMCreateWindow(scr
->wmscreen
, "info");
1208 WMResizeWidget(panel
->win
, 382, 230);
1210 logo
= WMCreateApplicationIconBlendedPixmap(scr
->wmscreen
, (RColor
*)NULL
);
1212 logo
= WMRetainPixmap(WMGetApplicationIconPixmap(scr
->wmscreen
));
1215 size
= WMGetPixmapSize(logo
);
1216 panel
->logoL
= WMCreateLabel(panel
->win
);
1217 WMResizeWidget(panel
->logoL
, 64, 64);
1218 WMMoveWidget(panel
->logoL
, 30, 20);
1219 WMSetLabelImagePosition(panel
->logoL
, WIPImageOnly
);
1220 WMSetLabelImage(panel
->logoL
, logo
);
1222 WMCreateEventHandler(WMWidgetView(panel
->logoL
), ButtonPressMask
,
1223 handleLogoPush
, panel
);
1225 WMReleasePixmap(logo
);
1228 panel
->name1L
= WMCreateLabel(panel
->win
);
1229 WMResizeWidget(panel
->name1L
, 240, 30);
1230 WMMoveWidget(panel
->name1L
, 100, 30);
1235 color2
.green
= 0x50;
1237 logo
= renderText(scr
->wmscreen
, "GNU Window Maker",
1238 "-*-utopia-*-r-*-*-25-*", &color1
, &color2
);
1240 WMSetLabelImagePosition(panel
->name1L
, WIPImageOnly
);
1241 WMSetLabelImage(panel
->name1L
, logo
);
1242 WMReleasePixmap(logo
);
1244 font
= WMBoldSystemFontOfSize(scr
->wmscreen
, 20);
1246 WMSetLabelFont(panel
->name1L
, font
);
1247 WMReleaseFont(font
);
1249 WMSetLabelTextAlignment(panel
->name1L
, WACenter
);
1250 WMSetLabelText(panel
->name1L
, "GNU Window Maker");
1253 panel
->name2L
= WMCreateLabel(panel
->win
);
1254 WMResizeWidget(panel
->name2L
, 240, 24);
1255 WMMoveWidget(panel
->name2L
, 100, 60);
1256 font
= WMBoldSystemFontOfSize(scr
->wmscreen
, 18);
1258 WMSetLabelFont(panel
->name2L
, font
);
1259 WMReleaseFont(font
);
1262 WMSetLabelTextAlignment(panel
->name2L
, WACenter
);
1263 WMSetLabelText(panel
->name2L
, _("Window Manager for X"));
1266 sprintf(version
, _("Version %s"), VERSION
);
1267 panel
->versionL
= WMCreateLabel(panel
->win
);
1268 WMResizeWidget(panel
->versionL
, 310, 16);
1269 WMMoveWidget(panel
->versionL
, 30, 95);
1270 WMSetLabelTextAlignment(panel
->versionL
, WARight
);
1271 WMSetLabelText(panel
->versionL
, version
);
1272 WMSetLabelWraps(panel
->versionL
, False
);
1274 panel
->copyrL
= WMCreateLabel(panel
->win
);
1275 WMResizeWidget(panel
->copyrL
, 340, 40);
1276 WMMoveWidget(panel
->copyrL
, 15, 185);
1277 WMSetLabelTextAlignment(panel
->copyrL
, WALeft
);
1278 WMSetLabelText(panel
->copyrL
, COPYRIGHT_TEXT
);
1279 /* we want the (c) character in the helvetica font */
1280 font
= WMCreateNormalFont(scr
->wmscreen
, HELVETICA10_FONT
);
1282 WMSetLabelFont(panel
->copyrL
, font
);
1285 switch (scr
->w_depth
) {
1287 strcpy(version
, _("32 thousand"));
1290 strcpy(version
, _("64 thousand"));
1294 strcpy(version
, _("16 million"));
1297 sprintf(version
, "%d", 1<<scr
->w_depth
);
1301 sprintf(buffer
, _("Using visual 0x%x: %s %ibpp (%s colors)\n"),
1302 (unsigned)scr
->w_visual
->visualid
,
1303 visuals
[scr
->w_visual
->class], scr
->w_depth
, version
);
1305 #if defined(HAVE_MALLOC_H) && defined(HAVE_MALLINFO)
1307 struct mallinfo ma
= mallinfo();
1308 sprintf(buffer
+strlen(buffer
),
1309 _("Total allocated memory: %i kB. Total memory in use: %i kB.\n"),
1310 (ma
.arena
+ma
.hblkhd
)/1024, (ma
.uordblks
+ma
.hblkhd
)/1024);
1315 strcat(buffer
, _("Supported image formats: "));
1316 strl
= RSupportedFileFormats();
1317 for (i
=0; strl
[i
]!=NULL
; i
++) {
1318 strcat(buffer
, strl
[i
]);
1319 strcat(buffer
, " ");
1322 strcat(buffer
, _("\nAdditional Support For: "));
1335 list
[j
++] = "GNOME";
1341 list
[j
++] = _("Sound");
1345 for (i
= 0; i
< j
; i
++) {
1348 strcat(buf
, _(" and "));
1352 strcat(buf
, list
[i
]);
1354 strcat(buffer
, buf
);
1358 panel
->infoL
= WMCreateLabel(panel
->win
);
1359 WMResizeWidget(panel
->infoL
, 350, 75);
1360 WMMoveWidget(panel
->infoL
, 15, 115);
1361 WMSetLabelText(panel
->infoL
, buffer
);
1363 WMSetLabelFont(panel
->infoL
, font
);
1364 WMReleaseFont(font
);
1368 WMRealizeWidget(panel
->win
);
1369 WMMapSubwidgets(panel
->win
);
1371 parent
= XCreateSimpleWindow(dpy
, scr
->root_win
, 0, 0, 382, 230, 0, 0, 0);
1373 XReparentWindow(dpy
, WMWidgetXID(panel
->win
), parent
, 0, 0);
1375 WMMapWidget(panel
->win
);
1377 wwin
= wManageInternalWindow(scr
, parent
, None
, _("Info"),
1378 (scr
->scr_width
- 382)/2,
1379 (scr
->scr_height
- 230)/2, 382, 230);
1381 WSETUFLAG(wwin
, no_closable
, 0);
1382 WSETUFLAG(wwin
, no_close_button
, 0);
1383 #ifdef XKB_BUTTON_HINT
1384 wFrameWindowHideButton(wwin
->frame
, WFF_LANGUAGE_BUTTON
);
1386 wWindowUpdateButtonImages(wwin
);
1387 wFrameWindowShowButton(wwin
->frame
, WFF_RIGHT_BUTTON
);
1388 wwin
->frame
->on_click_right
= destroyInfoPanel
;
1396 if (InitXThing(panel
->scr
)) {
1397 panel
->timer
= WMAddTimerHandler(100, logoPushCallback
, panel
);
1400 panel
->str
= _("Merry X'mas!");
1401 panel
->oldPix
= WMRetainPixmap(WMGetLabelImage(panel
->logoL
));
1408 ***********************************************************************
1410 ***********************************************************************
1424 static LegalPanel
*legalPanel
= NULL
;
1427 destroyLegalPanel(WCoreWindow
*foo
, void *data
, XEvent
*event
)
1429 WMUnmapWidget(legalPanel
->win
);
1431 WMDestroyWidget(legalPanel
->win
);
1433 wUnmanageWindow(legalPanel
->wwin
, False
, False
);
1442 wShowLegalPanel(WScreen
*scr
)
1449 if (legalPanel
->scr
== scr
) {
1450 wRaiseFrame(legalPanel
->wwin
->frame
->core
);
1451 wSetFocusTo(scr
, legalPanel
->wwin
);
1456 panel
= wmalloc(sizeof(LegalPanel
));
1460 panel
->win
= WMCreateWindow(scr
->wmscreen
, "legal");
1461 WMResizeWidget(panel
->win
, 420, 250);
1464 panel
->licenseL
= WMCreateLabel(panel
->win
);
1465 WMSetLabelWraps(panel
->licenseL
, True
);
1466 WMResizeWidget(panel
->licenseL
, 400, 230);
1467 WMMoveWidget(panel
->licenseL
, 10, 10);
1468 WMSetLabelTextAlignment(panel
->licenseL
, WALeft
);
1469 WMSetLabelText(panel
->licenseL
,
1470 _(" Window Maker is free software; you can redistribute it and/or\n"
1471 "modify it under the terms of the GNU General Public License as\n"
1472 "published by the Free Software Foundation; either version 2 of the\n"
1473 "License, or (at your option) any later version.\n\n\n"
1474 " Window Maker is distributed in the hope that it will be useful,\n"
1475 "but WITHOUT ANY WARRANTY; without even the implied warranty\n"
1476 "of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
1477 "See the GNU General Public License for more details.\n\n\n"
1478 " You should have received a copy of the GNU General Public\n"
1479 "License along with this program; if not, write to the Free Software\n"
1480 "Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA\n"
1481 "02111-1307, USA."));
1482 WMSetLabelRelief(panel
->licenseL
, WRGroove
);
1484 WMRealizeWidget(panel
->win
);
1485 WMMapSubwidgets(panel
->win
);
1487 parent
= XCreateSimpleWindow(dpy
, scr
->root_win
, 0, 0, 420, 250, 0, 0, 0);
1489 XReparentWindow(dpy
, WMWidgetXID(panel
->win
), parent
, 0, 0);
1491 wwin
= wManageInternalWindow(scr
, parent
, None
, _("Legal"),
1492 (scr
->scr_width
- 420)/2,
1493 (scr
->scr_height
- 250)/2, 420, 250);
1495 WSETUFLAG(wwin
, no_closable
, 0);
1496 WSETUFLAG(wwin
, no_close_button
, 0);
1497 wWindowUpdateButtonImages(wwin
);
1498 wFrameWindowShowButton(wwin
->frame
, WFF_RIGHT_BUTTON
);
1499 #ifdef XKB_BUTTON_HINT
1500 wFrameWindowHideButton(wwin
->frame
, WFF_LANGUAGE_BUTTON
);
1502 wwin
->frame
->on_click_right
= destroyLegalPanel
;
1506 WMMapWidget(panel
->win
);
1515 ***********************************************************************
1516 * Crashing Dialog Panel
1517 ***********************************************************************
1520 extern WDDomain
*WDWindowAttributes
;
1523 typedef struct _CrashPanel
{
1524 WMWindow
*win
; /* main window */
1526 WMLabel
*iconL
; /* application icon */
1527 WMLabel
*nameL
; /* title of panel */
1529 WMFrame
*sepF
; /* separator frame */
1531 WMLabel
*noteL
; /* Title of note */
1532 WMLabel
*note2L
; /* body of note with what happened */
1534 WMFrame
*whatF
; /* "what to do next" frame */
1535 WMPopUpButton
*whatP
; /* action selection popup button */
1537 WMButton
*okB
; /* ok button */
1539 Bool done
; /* if finished with this dialog */
1540 int action
; /* what to do after */
1548 handleKeyPress(XEvent
*event
, void *clientData
)
1550 CrashPanel
*panel
= (CrashPanel
*)clientData
;
1552 if (event
->xkey
.keycode
== panel
->retKey
) {
1553 WMPerformButtonClick(panel
->okB
);
1559 okButtonCallback(void *self
, void *clientData
)
1561 CrashPanel
*panel
= (CrashPanel
*)clientData
;
1568 setCrashAction(void *self
, void *clientData
)
1570 WMPopUpButton
*pop
= (WMPopUpButton
*)self
;
1571 CrashPanel
*panel
= (CrashPanel
*)clientData
;
1573 panel
->action
= WMGetPopUpButtonSelectedItem(pop
);
1578 getWindowMakerIconImage(WMScreen
*scr
)
1580 proplist_t dict
, key
, option
, value
=NULL
;
1584 PLSetStringCmpHook(NULL
);
1586 key
= PLMakeString("Logo.WMPanel");
1587 option
= PLMakeString("Icon");
1589 dict
= PLGetDictionaryEntry(WDWindowAttributes
->dictionary
, key
);
1592 value
= PLGetDictionaryEntry(dict
, option
);
1598 PLSetStringCmpHook(StringCompareHook
);
1600 if (value
&& PLIsString(value
)) {
1601 path
= FindImage(wPreferences
.icon_path
, PLGetString(value
));
1606 gray
.red
= 0xae; gray
.green
= 0xaa;
1607 gray
.blue
= 0xae; gray
.alpha
= 0;
1609 pix
= WMCreateBlendedPixmapFromFile(scr
, path
, &gray
);
1623 wShowCrashingDialogPanel(int whatSig
)
1629 int screen_no
, scr_width
, scr_height
;
1633 panel
= wmalloc(sizeof(CrashPanel
));
1634 memset(panel
, 0, sizeof(CrashPanel
));
1636 screen_no
= DefaultScreen(dpy
);
1637 scr_width
= WidthOfScreen(ScreenOfDisplay(dpy
, screen_no
));
1638 scr_height
= HeightOfScreen(ScreenOfDisplay(dpy
, screen_no
));
1640 scr
= WMCreateScreen(dpy
, screen_no
);
1642 wsyserror(_("cannot open connection for crashing dialog panel. Aborting."));
1646 panel
->retKey
= XKeysymToKeycode(dpy
, XK_Return
);
1648 panel
->win
= WMCreateWindow(scr
, "crashingDialog");
1649 WMResizeWidget(panel
->win
, PWIDTH
, PHEIGHT
);
1650 WMMoveWidget(panel
->win
, (scr_width
- PWIDTH
)/2, (scr_height
- PHEIGHT
)/2);
1652 logo
= getWindowMakerIconImage(scr
);
1654 panel
->iconL
= WMCreateLabel(panel
->win
);
1655 WMResizeWidget(panel
->iconL
, 64, 64);
1656 WMMoveWidget(panel
->iconL
, 10, 10);
1657 WMSetLabelImagePosition(panel
->iconL
, WIPImageOnly
);
1658 WMSetLabelImage(panel
->iconL
, logo
);
1661 panel
->nameL
= WMCreateLabel(panel
->win
);
1662 WMResizeWidget(panel
->nameL
, 190, 18);
1663 WMMoveWidget(panel
->nameL
, 80, 35);
1664 WMSetLabelTextAlignment(panel
->nameL
, WALeft
);
1665 font
= WMBoldSystemFontOfSize(scr
, 18);
1666 WMSetLabelFont(panel
->nameL
, font
);
1667 WMReleaseFont(font
);
1668 WMSetLabelText(panel
->nameL
, _("Fatal error"));
1670 panel
->sepF
= WMCreateFrame(panel
->win
);
1671 WMResizeWidget(panel
->sepF
, PWIDTH
+4, 2);
1672 WMMoveWidget(panel
->sepF
, -2, 80);
1674 panel
->noteL
= WMCreateLabel(panel
->win
);
1675 WMResizeWidget(panel
->noteL
, PWIDTH
-20, 40);
1676 WMMoveWidget(panel
->noteL
, 10, 90);
1677 WMSetLabelTextAlignment(panel
->noteL
, WAJustified
);
1678 #ifdef SYS_SIGLIST_DECLARED
1679 sprintf(buf
, _("Window Maker received signal %i\n(%s)."),
1680 whatSig
, sys_siglist
[whatSig
]);
1682 sprintf(buf
, _("Window Maker received signal %i."), whatSig
);
1684 WMSetLabelText(panel
->noteL
, buf
);
1686 panel
->note2L
= WMCreateLabel(panel
->win
);
1687 WMResizeWidget(panel
->note2L
, PWIDTH
-20, 100);
1688 WMMoveWidget(panel
->note2L
, 10, 130);
1689 WMSetLabelTextAlignment(panel
->note2L
, WALeft
);
1690 WMSetLabelText(panel
->note2L
,
1691 _(" This fatal error occured probably due to a bug."
1692 " Please fill the included BUGFORM and "
1693 "report it to bugs@windowmaker.org."));
1694 WMSetLabelWraps(panel
->note2L
, True
);
1697 panel
->whatF
= WMCreateFrame(panel
->win
);
1698 WMResizeWidget(panel
->whatF
, PWIDTH
-20, 50);
1699 WMMoveWidget(panel
->whatF
, 10, 240);
1700 WMSetFrameTitle(panel
->whatF
, _("What do you want to do now?"));
1702 panel
->whatP
= WMCreatePopUpButton(panel
->whatF
);
1703 WMResizeWidget(panel
->whatP
, PWIDTH
-20-70, 20);
1704 WMMoveWidget(panel
->whatP
, 35, 20);
1705 WMSetPopUpButtonPullsDown(panel
->whatP
, False
);
1706 WMSetPopUpButtonText(panel
->whatP
, _("Select action"));
1707 WMAddPopUpButtonItem(panel
->whatP
, _("Abort and leave a core file"));
1708 WMAddPopUpButtonItem(panel
->whatP
, _("Restart Window Maker"));
1709 WMAddPopUpButtonItem(panel
->whatP
, _("Start alternate window manager"));
1710 WMSetPopUpButtonAction(panel
->whatP
, setCrashAction
, panel
);
1711 WMSetPopUpButtonSelectedItem(panel
->whatP
, WMRestart
);
1712 panel
->action
= WMRestart
;
1714 WMMapSubwidgets(panel
->whatF
);
1716 panel
->okB
= WMCreateCommandButton(panel
->win
);
1717 WMResizeWidget(panel
->okB
, 80, 26);
1718 WMMoveWidget(panel
->okB
, 205, 309);
1719 WMSetButtonText(panel
->okB
, _("OK"));
1720 WMSetButtonImage(panel
->okB
, WMGetSystemPixmap(scr
, WSIReturnArrow
));
1721 WMSetButtonAltImage(panel
->okB
, WMGetSystemPixmap(scr
, WSIHighlightedReturnArrow
));
1722 WMSetButtonImagePosition(panel
->okB
, WIPRight
);
1723 WMSetButtonAction(panel
->okB
, okButtonCallback
, panel
);
1727 WMCreateEventHandler(WMWidgetView(panel
->win
), KeyPressMask
,
1728 handleKeyPress
, panel
);
1730 WMRealizeWidget(panel
->win
);
1731 WMMapSubwidgets(panel
->win
);
1733 WMMapWidget(panel
->win
);
1735 XSetInputFocus(dpy
, WMWidgetXID(panel
->win
), RevertToParent
, CurrentTime
);
1737 while (!panel
->done
) {
1740 WMNextEvent(dpy
, &event
);
1741 WMHandleEvent(&event
);
1744 action
= panel
->action
;
1746 WMUnmapWidget(panel
->win
);
1747 WMDestroyWidget(panel
->win
);
1756 /*****************************************************************************
1757 * About GNUstep Panel
1758 *****************************************************************************/
1762 drawGNUstepLogo(Display
*dpy
, Drawable d
, int width
, int height
,
1763 unsigned long blackPixel
, unsigned long whitePixel
)
1767 XRectangle rects
[3];
1769 gcv
.foreground
= blackPixel
;
1770 gc
= XCreateGC(dpy
, d
, GCForeground
, &gcv
);
1772 XFillArc(dpy
, d
, gc
, width
/45, height
/45,
1773 width
- 2*width
/45, height
- 2*height
/45, 0, 360*64);
1776 rects
[0].y
= 37*height
/45;
1777 rects
[0].width
= width
/3;
1778 rects
[0].height
= height
- rects
[0].y
;
1780 rects
[1].x
= rects
[0].width
;
1781 rects
[1].y
= height
/2;
1782 rects
[1].width
= width
- 2*width
/3;
1783 rects
[1].height
= height
- rects
[1].y
;
1785 rects
[2].x
= 2*width
/3;
1786 rects
[2].y
= height
- 37*height
/45;
1787 rects
[2].width
= width
/3;
1788 rects
[2].height
= height
- rects
[2].y
;
1790 XSetClipRectangles(dpy
, gc
, 0, 0, rects
, 3, Unsorted
);
1791 XFillRectangle(dpy
, d
, gc
, 0, 0, width
, height
);
1793 XSetForeground(dpy
, gc
, whitePixel
);
1794 XFillArc(dpy
, d
, gc
, width
/45, height
/45,
1795 width
- 2*width
/45, height
- 2*height
/45, 0, 360*64);
1813 static GNUstepPanel
*gnustepPanel
= NULL
;
1816 destroyGNUstepPanel(WCoreWindow
*foo
, void *data
, XEvent
*event
)
1818 WMUnmapWidget(gnustepPanel
->win
);
1820 WMDestroyWidget(gnustepPanel
->win
);
1822 wUnmanageWindow(gnustepPanel
->wwin
, False
, False
);
1824 wfree(gnustepPanel
);
1826 gnustepPanel
= NULL
;
1831 wShowGNUstepPanel(WScreen
*scr
)
1833 GNUstepPanel
*panel
;
1840 if (gnustepPanel
->scr
== scr
) {
1841 wRaiseFrame(gnustepPanel
->wwin
->frame
->core
);
1842 wSetFocusTo(scr
, gnustepPanel
->wwin
);
1847 panel
= wmalloc(sizeof(GNUstepPanel
));
1851 panel
->win
= WMCreateWindow(scr
->wmscreen
, "About GNUstep");
1852 WMResizeWidget(panel
->win
, 325, 200);
1854 pixmap
= WMCreatePixmap(scr
->wmscreen
, 130, 130,
1855 WMScreenDepth(scr
->wmscreen
), True
);
1857 color
= WMCreateNamedColor(scr
->wmscreen
, "gray50", True
);
1859 drawGNUstepLogo(dpy
, WMGetPixmapXID(pixmap
), 130, 130,
1860 WMColorPixel(color
), scr
->white_pixel
);
1862 WMReleaseColor(color
);
1864 XSetForeground(dpy
, scr
->mono_gc
, 0);
1865 XFillRectangle(dpy
, WMGetPixmapMaskXID(pixmap
), scr
->mono_gc
, 0, 0,
1867 drawGNUstepLogo(dpy
, WMGetPixmapMaskXID(pixmap
), 130, 130, 1, 1);
1869 panel
->gstepL
= WMCreateLabel(panel
->win
);
1870 WMResizeWidget(panel
->gstepL
, 285, 64);
1871 WMMoveWidget(panel
->gstepL
, 20, 0);
1872 WMSetLabelTextAlignment(panel
->gstepL
, WARight
);
1873 WMSetLabelText(panel
->gstepL
, "GNUstep");
1875 WMFont
*font
= WMBoldSystemFontOfSize(scr
->wmscreen
, 24);
1877 WMSetLabelFont(panel
->gstepL
, font
);
1878 WMReleaseFont(font
);
1881 panel
->textL
= WMCreateLabel(panel
->win
);
1882 WMResizeWidget(panel
->textL
, 275, 130);
1883 WMMoveWidget(panel
->textL
, 30, 50);
1884 WMSetLabelTextAlignment(panel
->textL
, WARight
);
1885 WMSetLabelImagePosition(panel
->textL
, WIPOverlaps
);
1886 WMSetLabelText(panel
->textL
,
1887 _("Window Maker is part of the GNUstep project.\n"\
1888 "The GNUstep project aims to create a free\n"\
1889 "implementation of the OpenStep(tm) specification\n"\
1890 "which is a object-oriented framework for\n"\
1891 "creating advanced graphical, multi-platform\n"\
1892 "applications. Additionally, a development and\n"\
1893 "user desktop enviroment will be created on top\n"\
1894 "of the framework. For more information about\n"\
1895 "GNUstep, please visit: www.gnustep.org"));
1896 WMSetLabelImage(panel
->textL
, pixmap
);
1898 WMReleasePixmap(pixmap
);
1900 WMRealizeWidget(panel
->win
);
1901 WMMapSubwidgets(panel
->win
);
1903 parent
= XCreateSimpleWindow(dpy
, scr
->root_win
, 0, 0, 325, 200, 0, 0, 0);
1905 XReparentWindow(dpy
, WMWidgetXID(panel
->win
), parent
, 0, 0);
1907 wwin
= wManageInternalWindow(scr
, parent
, None
, _("About GNUstep"),
1908 (scr
->scr_width
- 325)/2,
1909 (scr
->scr_height
- 200)/2, 325, 200);
1911 WSETUFLAG(wwin
, no_closable
, 0);
1912 WSETUFLAG(wwin
, no_close_button
, 0);
1913 wWindowUpdateButtonImages(wwin
);
1914 wFrameWindowShowButton(wwin
->frame
, WFF_RIGHT_BUTTON
);
1915 #ifdef XKB_BUTTON_HINT
1916 wFrameWindowHideButton(wwin
->frame
, WFF_LANGUAGE_BUTTON
);
1918 wwin
->frame
->on_click_right
= destroyGNUstepPanel
;
1922 WMMapWidget(panel
->win
);
1926 gnustepPanel
= panel
;