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 *buffer
, *dirfile
;
372 WMScreen
*wmscr
=WMWidgetScreen(panel
->win
);
375 if(!panel
->preview
) return;
377 width
= rect
->size
.width
;
379 blackcolor
= WMBlackColor(wmscr
);
380 whitecolor
= WMWhiteColor(wmscr
);
382 dirfile
= wexpandpath(WMGetListSelectedItem(panel
->dirList
)->text
);
383 buffer
= wmalloc(strlen(dirfile
)+strlen(text
)+4);
384 sprintf(buffer
, "%s/%s", dirfile
, text
);
387 pixmap
= WMCreatePixmapFromFile(WMWidgetScreen(panel
->win
), buffer
);
390 WMRemoveListItem(lPtr
, index
);
394 XClearArea(dpy
, d
, rect
->pos
.x
, rect
->pos
.y
, width
, rect
->size
.height
,
396 XSetClipMask(dpy
, gc
, None
);
398 XDrawRectangle(dpy, d, WMColorGC(whitecolor), rect->pos.x + 5,
399 rect->pos.y +5, width - 10, 54);
401 XDrawLine(dpy
, d
, WMColorGC(whitecolor
), rect
->pos
.x
,
402 rect
->pos
.y
+rect
->size
.height
-1, rect
->pos
.x
+width
,
403 rect
->pos
.y
+rect
->size
.height
-1);
406 if (state
&WLDSSelected
) {
407 XFillRectangle(dpy
, d
, WMColorGC(whitecolor
), rect
->pos
.x
,
408 rect
->pos
.y
, width
, rect
->size
.height
);
411 size
= WMGetPixmapSize(pixmap
);
413 XSetClipMask(dpy
, copygc
, WMGetPixmapMaskXID(pixmap
));
414 XSetClipOrigin(dpy
, copygc
, rect
->pos
.x
+ (width
-size
.width
)/2,
416 XCopyArea(dpy
, WMGetPixmapXID(pixmap
), d
, copygc
, 0, 0,
417 size
.width
>100?100:size
.width
, size
.height
>64?64:size
.height
,
418 rect
->pos
.x
+ (width
-size
.width
)/2, rect
->pos
.y
+2);
422 int fheight
= WMFontHeight(panel
->normalfont
);
423 int tlen
= strlen(text
);
424 int twidth
= WMWidthOfString(panel
->normalfont
, text
, tlen
);
427 ofx
= rect
->pos
.x
+ (width
- twidth
)/2;
428 ofy
= rect
->pos
.y
+ 64 - fheight
;
432 WMDrawString(wmscr
, d
, WMColorGC(whitecolor
),
433 panel
->normalfont
, ofx
+i
, ofy
+j
,
436 WMDrawString(wmscr
, d
, WMColorGC(blackcolor
), panel
->normalfont
,
437 ofx
, ofy
, text
, tlen
);
440 WMReleasePixmap(pixmap
);
441 /* I hope it is better to do not use cache / on my box it is fast nuff */
444 WMReleaseColor(blackcolor
);
445 WMReleaseColor(whitecolor
);
450 buttonCallback(void *self
, void *clientData
)
452 WMButton
*bPtr
= (WMButton
*)self
;
453 IconPanel
*panel
= (IconPanel
*)clientData
;
456 if (bPtr
==panel
->okButton
) {
458 panel
->result
= True
;
459 } else if (bPtr
==panel
->cancelButton
) {
461 panel
->result
= False
;
462 } else if (bPtr
==panel
->previewButton
) {
463 /**** Previewer ****/
464 WMSetButtonEnabled(bPtr
, False
);
465 WMSetListUserDrawItemHeight(panel
->iconList
, 68);
466 WMSetListUserDrawProc(panel
->iconList
, drawIconProc
);
467 WMRedisplayWidget(panel
->iconList
);
468 /* for draw proc to access screen/gc */
469 /*** end preview ***/
472 else if (bPtr
==panel
->chooseButton
) {
475 op
= WMCreateOpenPanel(WMWidgetScreen(bPtr
));
477 if (WMRunModalFilePanelForDirectory(op
, NULL
, "/usr/local", NULL
, NULL
)) {
479 path
= WMGetFilePanelFile(op
);
480 WMSetTextFieldText(panel
->fileField
, path
);
481 setViewedImage(panel
, path
);
484 WMDestroyFilePanel(op
);
491 keyPressHandler(XEvent
*event
, void *data
)
493 IconPanel
*panel
= (IconPanel
*)data
;
494 Display
*dpy
= event
->xany
.display
;
503 if (event
->type
== KeyRelease
)
507 count
= XLookupString(&event
->xkey
, buffer
, sizeof(buffer
), &ksym
, NULL
);
510 iidx
= WMGetListSelectedItemRow(panel
->iconList
);
511 didx
= WMGetListSelectedItemRow(panel
->dirList
);
519 list
= panel
->iconList
;
522 if (iidx
< WMGetListNumberOfRows(panel
->iconList
) - 1)
526 list
= panel
->iconList
;
530 list
= panel
->iconList
;
533 item
= WMGetListNumberOfRows(panel
->iconList
) - 1;
534 list
= panel
->iconList
;
537 if (didx
< WMGetListNumberOfRows(panel
->dirList
) - 1)
541 list
= panel
->dirList
;
548 list
= panel
->dirList
;
551 WMPerformButtonClick(panel
->okButton
);
554 WMPerformButtonClick(panel
->cancelButton
);
559 WMSelectListItem(list
, item
);
560 WMSetListPosition(list
, item
- 5);
561 listCallback(list
, panel
);
568 wIconChooserDialog(WScreen
*scr
, char **file
, char *instance
, char *class)
576 panel
= wmalloc(sizeof(IconPanel
));
577 memset(panel
, 0, sizeof(IconPanel
));
581 panel
->win
= WMCreateWindow(scr
->wmscreen
, "iconChooser");
582 WMResizeWidget(panel
->win
, 450, 280);
584 WMCreateEventHandler(WMWidgetView(panel
->win
), KeyPressMask
|KeyReleaseMask
,
585 keyPressHandler
, panel
);
588 boldFont
= WMBoldSystemFontOfSize(scr
->wmscreen
, 12);
589 panel
->normalfont
= WMSystemFontOfSize(WMWidgetScreen(panel
->win
), 12);
591 panel
->dirLabel
= WMCreateLabel(panel
->win
);
592 WMResizeWidget(panel
->dirLabel
, 200, 20);
593 WMMoveWidget(panel
->dirLabel
, 10, 7);
594 WMSetLabelText(panel
->dirLabel
, _("Directories"));
595 WMSetLabelFont(panel
->dirLabel
, boldFont
);
596 WMSetLabelTextAlignment(panel
->dirLabel
, WACenter
);
598 WMSetLabelRelief(panel
->dirLabel
, WRSunken
);
600 panel
->iconLabel
= WMCreateLabel(panel
->win
);
601 WMResizeWidget(panel
->iconLabel
, 140, 20);
602 WMMoveWidget(panel
->iconLabel
, 215, 7);
603 WMSetLabelText(panel
->iconLabel
, _("Icons"));
604 WMSetLabelFont(panel
->iconLabel
, boldFont
);
605 WMSetLabelTextAlignment(panel
->iconLabel
, WACenter
);
607 WMReleaseFont(boldFont
);
609 color
= WMWhiteColor(scr
->wmscreen
);
610 WMSetLabelTextColor(panel
->dirLabel
, color
);
611 WMSetLabelTextColor(panel
->iconLabel
, color
);
612 WMReleaseColor(color
);
614 color
= WMDarkGrayColor(scr
->wmscreen
);
615 WMSetWidgetBackgroundColor(panel
->iconLabel
, color
);
616 WMSetWidgetBackgroundColor(panel
->dirLabel
, color
);
617 WMReleaseColor(color
);
619 WMSetLabelRelief(panel
->iconLabel
, WRSunken
);
621 panel
->dirList
= WMCreateList(panel
->win
);
622 WMResizeWidget(panel
->dirList
, 200, 170);
623 WMMoveWidget(panel
->dirList
, 10, 30);
624 WMSetListAction(panel
->dirList
, listCallback
, panel
);
626 panel
->iconList
= WMCreateList(panel
->win
);
627 WMResizeWidget(panel
->iconList
, 140, 170);
628 WMMoveWidget(panel
->iconList
, 215, 30);
629 WMSetListAction(panel
->iconList
, listCallback
, panel
);
631 WMHangData(panel
->iconList
,panel
);
633 panel
->previewButton
= WMCreateCommandButton(panel
->win
);
634 WMResizeWidget(panel
->previewButton
, 75, 26);
635 WMMoveWidget(panel
->previewButton
, 365, 130);
636 WMSetButtonText(panel
->previewButton
, _("Preview"));
637 WMSetButtonAction(panel
->previewButton
, buttonCallback
, panel
);
639 panel
->iconView
= WMCreateLabel(panel
->win
);
640 WMResizeWidget(panel
->iconView
, 75, 75);
641 WMMoveWidget(panel
->iconView
, 365, 40);
642 WMSetLabelImagePosition(panel
->iconView
, WIPOverlaps
);
643 WMSetLabelRelief(panel
->iconView
, WRSunken
);
644 WMSetLabelTextAlignment(panel
->iconView
, WACenter
);
646 panel
->fileLabel
= WMCreateLabel(panel
->win
);
647 WMResizeWidget(panel
->fileLabel
, 80, 20);
648 WMMoveWidget(panel
->fileLabel
, 10, 210);
649 WMSetLabelText(panel
->fileLabel
, _("File Name:"));
651 panel
->fileField
= WMCreateTextField(panel
->win
);
652 WMSetViewNextResponder(WMWidgetView(panel
->fileField
), WMWidgetView(panel
->win
));
653 WMResizeWidget(panel
->fileField
, 345, 20);
654 WMMoveWidget(panel
->fileField
, 95, 210);
655 WMSetTextFieldEditable(panel
->fileField
, False
);
657 panel
->okButton
= WMCreateCommandButton(panel
->win
);
658 WMResizeWidget(panel
->okButton
, 80, 26);
659 WMMoveWidget(panel
->okButton
, 360, 240);
660 WMSetButtonText(panel
->okButton
, _("OK"));
661 WMSetButtonEnabled(panel
->okButton
, False
);
662 WMSetButtonAction(panel
->okButton
, buttonCallback
, panel
);
664 panel
->cancelButton
= WMCreateCommandButton(panel
->win
);
665 WMResizeWidget(panel
->cancelButton
, 80, 26);
666 WMMoveWidget(panel
->cancelButton
, 270, 240);
667 WMSetButtonText(panel
->cancelButton
, _("Cancel"));
668 WMSetButtonAction(panel
->cancelButton
, buttonCallback
, panel
);
670 panel
->chooseButton
= WMCreateCommandButton(panel
->win
);
671 WMResizeWidget(panel
->chooseButton
, 110, 26);
672 WMMoveWidget(panel
->chooseButton
, 150, 240);
673 WMSetButtonText(panel
->chooseButton
, _("Choose File"));
674 WMSetButtonAction(panel
->chooseButton
, buttonCallback
, panel
);
676 WMRealizeWidget(panel
->win
);
677 WMMapSubwidgets(panel
->win
);
679 parent
= XCreateSimpleWindow(dpy
, scr
->root_win
, 0, 0, 450, 280, 0, 0, 0);
681 XReparentWindow(dpy
, WMWidgetXID(panel
->win
), parent
, 0, 0);
686 tmp
= wmalloc((instance
? strlen(instance
) : 0)
687 + (class ? strlen(class) : 0) + 32);
689 if (tmp
&& (instance
|| class))
690 sprintf(tmp
, "%s [%s.%s]", _("Icon Chooser"), instance
, class);
692 strcpy(tmp
, _("Icon Chooser"));
694 wwin
= wManageInternalWindow(scr
, parent
, None
, tmp
,
695 (scr
->scr_width
- 450)/2,
696 (scr
->scr_height
- 280)/2, 450, 280);
700 /* put icon paths in the list */
701 listIconPaths(panel
->dirList
);
703 WMMapWidget(panel
->win
);
707 while (!panel
->done
) {
710 WMNextEvent(dpy
, &event
);
711 WMHandleEvent(&event
);
715 char *defaultPath
, *wantedPath
;
717 /* check if the file the user selected is not the one that
718 * would be loaded by default with the current search path */
719 *file
= WMGetListSelectedItem(panel
->iconList
)->text
;
724 defaultPath
= FindImage(wPreferences
.icon_path
, *file
);
725 wantedPath
= WMGetTextFieldText(panel
->fileField
);
726 /* if the file is not the default, use full path */
727 if (strcmp(wantedPath
, defaultPath
)!=0) {
730 *file
= wstrdup(*file
);
739 WMReleaseFont(panel
->normalfont
);
741 WMUnmapWidget(panel
->win
);
743 WMDestroyWidget(panel
->win
);
745 wUnmanageWindow(wwin
, False
, False
);
749 XDestroyWindow(dpy
, parent
);
751 return panel
->result
;
756 ***********************************************************************
758 ***********************************************************************
793 #define COPYRIGHT_TEXT \
794 "Copyright \xa9 1997~2001 Alfredo K. Kojima <kojima@windowmaker.org>\n"\
795 "Copyright \xa9 1998~2001 Dan Pascu <dan@windowmaker.org>"
799 static InfoPanel
*thePanel
= NULL
;
802 destroyInfoPanel(WCoreWindow
*foo
, void *data
, XEvent
*event
)
805 if (thePanel
->timer
) {
806 WMDeleteTimerHandler(thePanel
->timer
);
808 if (thePanel
->oldPix
) {
809 WMReleasePixmap(thePanel
->oldPix
);
811 if (thePanel
->icon
) {
812 RDestroyImage(thePanel
->icon
);
815 RDestroyImage(thePanel
->pic
);
817 #endif /* SILLYNESS */
818 WMUnmapWidget(thePanel
);
820 wUnmanageWindow(thePanel
->wwin
, False
, False
);
822 WMDestroyWidget(thePanel
->win
);
831 renderText(WMScreen
*scr
, char *text
, char *font
, RColor
*from
, RColor
*to
)
833 WMPixmap
*wpix
= NULL
;
836 RContext
*rc
= WMScreenRContext(scr
);
837 XFontStruct
*f
= NULL
;
841 f
= XLoadQueryFont(dpy
, font
);
845 w
= XTextWidth(f
, text
, strlen(text
));
846 h
= f
->ascent
+f
->descent
;
848 mask
= XCreatePixmap(dpy
, rc
->drawable
, w
, h
, 1);
849 gc
= XCreateGC(dpy
, mask
, 0, NULL
);
850 XSetForeground(dpy
, gc
, 0);
851 XSetFont(dpy
, gc
, f
->fid
);
852 XFillRectangle(dpy
, mask
, gc
, 0, 0, w
, h
);
854 XSetForeground(dpy
, gc
, 1);
855 XDrawString(dpy
, mask
, gc
, 0, f
->ascent
, text
, strlen(text
));
856 XSetLineAttributes(dpy
, gc
, 3, LineSolid
, CapRound
, JoinMiter
);
857 XDrawLine(dpy
, mask
, gc
, 0, h
-2, w
, h
-2);
859 grad
= XCreatePixmap(dpy
, rc
->drawable
, w
, h
, rc
->depth
);
863 color
= WMBlackColor(scr
);
864 XFillRectangle(dpy
, grad
, WMColorGC(color
), 0, 0, w
, h
);
865 WMReleaseColor(color
);
868 wpix
= WMCreatePixmapFromXPixmaps(scr
, grad
, mask
, w
, h
, rc
->depth
);
879 extern WMPixmap
*DoXThing();
880 extern Bool
InitXThing();
883 logoPushCallback(void *data
)
885 InfoPanel
*panel
= (InfoPanel
*)data
;
890 static int jingobeu
[] = {
891 329, 150, -1, 100, 329, 150, -1, 100, 329, 300, -1, 250,
892 329, 150, -1, 100, 329, 150, -1, 100, 329, 300, -1, 250,
893 329, 150, 392, 150, 261, 150, 293, 150, 329, 400, -1, 400, 0
901 if(jingobeu
[panel
->x
-1]==0){panel
->x
=-1;}else if(jingobeu
[panel
->x
902 -1]<0){panel
->x
++;c
=jingobeu
[panel
->x
-1]/50;panel
->x
++;}else if(c
==0){
903 kc
.bell_pitch
=jingobeu
[panel
->x
-1];panel
->x
++;kc
.bell_percent
=50;c
=
904 jingobeu
[panel
->x
-1]/50;kc
.bell_duration
=jingobeu
[panel
->x
-1];panel
->x
++;
905 XChangeKeyboardControl(dpy
,KBBellPitch
|KBBellDuration
|KBBellPercent
,&kc
);
906 XBell(dpy
,50);XFlush(dpy
);}else{c
--;}}
907 if (!(panel
->cycle
% 4)) {
910 p
= DoXThing(panel
->wwin
);
911 WMSetLabelImage(panel
->logoL
, p
);
913 } else if (panel
->cycle
< 30) {
917 image
= RCloneImage(panel
->icon
);
918 RCombineImagesWithOpaqueness(image
, panel
->pic
, panel
->cycle
*255/30);
919 pix
= WMCreatePixmapFromRImage(panel
->scr
->wmscreen
, image
, 128);
920 RDestroyImage(image
);
921 WMSetLabelImage(panel
->logoL
, pix
);
922 WMReleasePixmap(pix
);
925 /* slow down text a little */
926 i
= (int)(panel
->cycle
* 50.0/85.0)%200;
929 len
= strlen(panel
->str
);
931 strncpy(buffer
, panel
->str
, i
<len
? i
: len
);
933 memset(&buffer
[len
], ' ', i
-len
);
935 strncpy(buffer
, panel
->str
, i
<len
? i
: len
);
937 memset(&buffer
[len
], ' ', i
-len
);
940 WMSetLabelText(panel
->versionL
, buffer
);
942 XFlush(WMScreenDisplay(WMWidgetScreen(panel
->versionL
)));
947 panel
->timer
= WMAddTimerHandler(50, logoPushCallback
, panel
);
953 handleLogoPush(XEvent
*event
, void *data
)
955 InfoPanel
*panel
= (InfoPanel
*)data
;
956 static int broken
= 0;
957 static int clicks
= 0;
958 static char *pic_data
[] = {
1017 " ............... ",
1018 " ....XoO+@##+O$%.... ",
1019 " ...%X&*========-;;:o... ",
1020 " ...>.>,<122222222222134@... ",
1021 " ..>5678912222222222222220q%.. ",
1022 " ..$.&-w2222222222222222222er>.. ",
1023 " ..O.t31222222222222222222222y4>.. ",
1024 " ...O5u3222222222222222222222222yri... ",
1025 " ..>p&a22222222222222222222222222wso.. ",
1026 " ..ids91222222222222222222222222222wfi.. ",
1027 " ..X.7w222222wgs-w2222222213=g0222222<hi.. ",
1028 " ..Xuj2222222<@X5=222222229k@l:022222y4i.. ",
1029 " .Xdz22222222*X%.s22222222axo%$-222222<c>.. ",
1030 " ..o7y22222222v...r222222223hX.i82222221si.. ",
1031 "..io*222222222&...u22222222yt..%*22222220:%. ",
1032 "..>k02222222227...f222222222v..X=222222229t. ",
1033 "..dz12222222220ui:y2222222223d%qw222222221g. ",
1034 ".%vw222222222221y2222222222219*y2222222222wd.",
1035 ".X;2222222222222222222222222222222222222222b.",
1036 ".i*2222222222222222222222222222222222222222v.",
1037 ".i*2222222222222222222222222222222222222222;.",
1038 ".i*22222222222222222222222222222222222222228.",
1039 ".>*2222222222222222222222222222222222222222=.",
1040 ".i*22222222222222222222222222222222222222228.",
1041 ".i*2222222222222222222222222222222222222222;.",
1042 ".X*222222222222222222222222222222we12222222r.",
1043 ".Xs12222222w3aw22222222222222222y8s0222222wk.",
1044 ".Xq02222222a,na22222222222222222zm6zwy2222gi.",
1045 "..>*22222y<:Xcj22222222222222222-o$k;;02228..",
1046 "..i7y2220rhX.:y22222222222222222jtiXd,a220,..",
1047 " .X@z222a,do%kj2222222222222222wMX5q;gw228%..",
1048 " ..58222wagsh6ry222222222222221;>Of0w222y:...",
1049 " ...:e2222218mdz22222222222222a&$vw222220@...",
1050 " ...O-122222y:.u02222222222229q$uj222221r... ",
1051 " ..%&a1222223&573w2222222219NOxz122221z>... ",
1052 " ...t3222221-l$nr8ay1222yzbo,=12222w-5... ",
1053 " ..X:022222w-k+>o,7s**s7xOn=12221<f5... ",
1054 " ..o:9222221j8:&Bl>>>>ihv<12221=dX... ",
1055 " ..Xb9122222109g-****;<y22221zn%... ",
1056 " ..X&801222222222222222222w-h.... ",
1057 " ...o:=022222222222222221=lX... ",
1058 " ..X@:;3w2222222222210fO... ",
1059 " ...XX&v8<30000003-N@... ",
1060 " .....XmnbN:q&Bo.... ",
1062 static char *msgs
[] = {
1064 "Focus follow mouse users will burn in hell!!!",
1066 "F'ck Bastard Imperialists!!!",
1067 "Hi! My name is bobby...",
1068 "AHH! The neurotic monkeys are after me!",
1071 "SOMEBODY SET UP US THE BOMB",
1072 "ALL YOUR BASE ARE BELONG TO US!"
1079 if (!panel
->timer
&& !broken
&& clicks
> 0) {
1087 file
= wDefaultGetIconFile(panel
->scr
, "Logo", "WMPanel", False
);
1093 path
= FindImage(wPreferences
.icon_path
, file
);
1099 panel
->icon
= RLoadImage(panel
->scr
->rcontext
, path
, 0);
1107 panel
->pic
= RGetImageFromXPMData(panel
->scr
->rcontext
, pic_data
);
1108 if (!panel
->pic
|| panel
->icon
->width
!=panel
->pic
->width
1109 || panel
->icon
->height
!=panel
->pic
->height
) {
1111 RDestroyImage(panel
->icon
);
1114 RDestroyImage(panel
->pic
);
1126 RCombineImageWithColor(panel
->icon
, &color
);
1127 RCombineImageWithColor(panel
->pic
, &color
);
1131 panel
->str
= msgs
[rand()%(sizeof(msgs
)/sizeof(char*))];
1133 panel
->timer
= WMAddTimerHandler(50, logoPushCallback
, panel
);
1135 panel
->oldPix
= WMRetainPixmap(WMGetLabelImage(panel
->logoL
));
1136 /* If we don't use a fixed font, scrolling will be jumpy */
1137 /* Alternatively we can draw text in a pixmap and scroll it smoothly */
1138 if ((panel
->oldFont
= WMGetLabelFont(panel
->versionL
))!=NULL
)
1139 WMRetainFont(panel
->oldFont
);
1140 font
= WMCreateFont(WMWidgetScreen(panel
->versionL
), "-*-fixed-*-*-*-*-14-*-*-*-*-*-*-*");
1142 WMSetLabelFont(panel
->versionL
, font
);
1143 WMReleaseFont(font
);
1145 WMSetLabelText(panel
->versionL
, "");
1146 } else if (panel
->timer
) {
1151 WMSetLabelImage(panel
->logoL
, panel
->oldPix
);
1152 WMReleasePixmap(panel
->oldPix
);
1153 panel
->oldPix
= NULL
;
1155 WMDeleteTimerHandler(panel
->timer
);
1156 panel
->timer
= NULL
;
1158 WMSetLabelFont(panel
->versionL
, panel
->oldFont
);
1159 if (panel
->oldFont
) {
1160 WMReleaseFont(panel
->oldFont
);
1161 panel
->oldFont
= NULL
;
1163 sprintf(version
, _("Version %s"), VERSION
);
1164 WMSetLabelText(panel
->versionL
, version
);
1165 XFlush(WMScreenDisplay(WMWidgetScreen(panel
->versionL
)));
1170 while (XCheckTypedWindowEvent(dpy
, WMWidgetXID(panel
->versionL
),
1174 #endif /* SILLYNESS */
1178 wShowInfoPanel(WScreen
*scr
)
1188 RColor color1
, color2
;
1202 if (thePanel
->scr
== scr
) {
1203 wRaiseFrame(thePanel
->wwin
->frame
->core
);
1204 wSetFocusTo(scr
, thePanel
->wwin
);
1209 panel
= wmalloc(sizeof(InfoPanel
));
1210 memset(panel
, 0, sizeof(InfoPanel
));
1214 panel
->win
= WMCreateWindow(scr
->wmscreen
, "info");
1215 WMResizeWidget(panel
->win
, 382, 230);
1217 logo
= WMGetApplicationIconImage(scr
->wmscreen
);
1219 size
= WMGetPixmapSize(logo
);
1220 panel
->logoL
= WMCreateLabel(panel
->win
);
1221 WMResizeWidget(panel
->logoL
, 64, 64);
1222 WMMoveWidget(panel
->logoL
, 30, 20);
1223 WMSetLabelImagePosition(panel
->logoL
, WIPImageOnly
);
1224 WMSetLabelImage(panel
->logoL
, logo
);
1226 WMCreateEventHandler(WMWidgetView(panel
->logoL
), ButtonPressMask
,
1227 handleLogoPush
, panel
);
1231 panel
->name1L
= WMCreateLabel(panel
->win
);
1232 WMResizeWidget(panel
->name1L
, 240, 30);
1233 WMMoveWidget(panel
->name1L
, 100, 30);
1238 color2
.green
= 0x50;
1240 logo
= renderText(scr
->wmscreen
, "GNU Window Maker",
1241 "-*-utopia-*-r-*-*-25-*", &color1
, &color2
);
1243 WMSetLabelImagePosition(panel
->name1L
, WIPImageOnly
);
1244 WMSetLabelImage(panel
->name1L
, logo
);
1245 WMReleasePixmap(logo
);
1247 font
= WMBoldSystemFontOfSize(scr
->wmscreen
, 20);
1249 WMSetLabelFont(panel
->name1L
, font
);
1250 WMReleaseFont(font
);
1252 WMSetLabelTextAlignment(panel
->name1L
, WACenter
);
1253 WMSetLabelText(panel
->name1L
, "GNU Window Maker");
1256 panel
->name2L
= WMCreateLabel(panel
->win
);
1257 WMResizeWidget(panel
->name2L
, 240, 24);
1258 WMMoveWidget(panel
->name2L
, 100, 60);
1259 font
= WMBoldSystemFontOfSize(scr
->wmscreen
, 18);
1261 WMSetLabelFont(panel
->name2L
, font
);
1262 WMReleaseFont(font
);
1265 WMSetLabelTextAlignment(panel
->name2L
, WACenter
);
1266 WMSetLabelText(panel
->name2L
, _("Window Manager for X"));
1269 sprintf(version
, _("Version %s"), VERSION
);
1270 panel
->versionL
= WMCreateLabel(panel
->win
);
1271 WMResizeWidget(panel
->versionL
, 310, 16);
1272 WMMoveWidget(panel
->versionL
, 30, 95);
1273 WMSetLabelTextAlignment(panel
->versionL
, WARight
);
1274 WMSetLabelText(panel
->versionL
, version
);
1275 WMSetLabelWraps(panel
->versionL
, False
);
1277 panel
->copyrL
= WMCreateLabel(panel
->win
);
1278 WMResizeWidget(panel
->copyrL
, 340, 40);
1279 WMMoveWidget(panel
->copyrL
, 15, 185);
1280 WMSetLabelTextAlignment(panel
->copyrL
, WALeft
);
1281 WMSetLabelText(panel
->copyrL
, COPYRIGHT_TEXT
);
1282 /* we want the (c) character in the helvetica font */
1283 font
= WMCreateNormalFont(scr
->wmscreen
, HELVETICA10_FONT
);
1285 WMSetLabelFont(panel
->copyrL
, font
);
1288 switch (scr
->w_depth
) {
1290 strcpy(version
, _("32 thousand"));
1293 strcpy(version
, _("64 thousand"));
1297 strcpy(version
, _("16 million"));
1300 sprintf(version
, "%d", 1<<scr
->w_depth
);
1304 sprintf(buffer
, _("Using visual 0x%x: %s %ibpp (%s colors)\n"),
1305 (unsigned)scr
->w_visual
->visualid
,
1306 visuals
[scr
->w_visual
->class], scr
->w_depth
, version
);
1308 #if defined(HAVE_MALLOC_H) && defined(HAVE_MALLINFO)
1310 struct mallinfo ma
= mallinfo();
1311 sprintf(buffer
+strlen(buffer
),
1312 _("Total allocated memory: %i kB. Total memory in use: %i kB.\n"),
1313 (ma
.arena
+ma
.hblkhd
)/1024, (ma
.uordblks
+ma
.hblkhd
)/1024);
1318 strcat(buffer
, _("Supported image formats: "));
1319 strl
= RSupportedFileFormats();
1320 for (i
=0; strl
[i
]!=NULL
; i
++) {
1321 strcat(buffer
, strl
[i
]);
1322 strcat(buffer
, " ");
1325 strcat(buffer
, _("\nAdditional Support For: "));
1338 list
[j
++] = "GNOME";
1344 list
[j
++] = _("Sound");
1348 for (i
= 0; i
< j
; i
++) {
1351 strcat(buf
, _(" and "));
1355 strcat(buf
, list
[i
]);
1357 strcat(buffer
, buf
);
1361 panel
->infoL
= WMCreateLabel(panel
->win
);
1362 WMResizeWidget(panel
->infoL
, 350, 75);
1363 WMMoveWidget(panel
->infoL
, 15, 115);
1364 WMSetLabelText(panel
->infoL
, buffer
);
1366 WMSetLabelFont(panel
->infoL
, font
);
1367 WMReleaseFont(font
);
1371 WMRealizeWidget(panel
->win
);
1372 WMMapSubwidgets(panel
->win
);
1374 parent
= XCreateSimpleWindow(dpy
, scr
->root_win
, 0, 0, 382, 230, 0, 0, 0);
1376 XReparentWindow(dpy
, WMWidgetXID(panel
->win
), parent
, 0, 0);
1378 WMMapWidget(panel
->win
);
1380 wwin
= wManageInternalWindow(scr
, parent
, None
, _("Info"),
1381 (scr
->scr_width
- 382)/2,
1382 (scr
->scr_height
- 230)/2, 382, 230);
1384 WSETUFLAG(wwin
, no_closable
, 0);
1385 WSETUFLAG(wwin
, no_close_button
, 0);
1386 #ifdef XKB_BUTTON_HINT
1387 wFrameWindowHideButton(wwin
->frame
, WFF_LANGUAGE_BUTTON
);
1389 wWindowUpdateButtonImages(wwin
);
1390 wFrameWindowShowButton(wwin
->frame
, WFF_RIGHT_BUTTON
);
1391 wwin
->frame
->on_click_right
= destroyInfoPanel
;
1399 if (InitXThing(panel
->scr
)) {
1400 panel
->timer
= WMAddTimerHandler(100, logoPushCallback
, panel
);
1403 panel
->str
= _("Merry X'mas!");
1404 panel
->oldPix
= WMRetainPixmap(WMGetLabelImage(panel
->logoL
));
1411 ***********************************************************************
1413 ***********************************************************************
1427 static LegalPanel
*legalPanel
= NULL
;
1430 destroyLegalPanel(WCoreWindow
*foo
, void *data
, XEvent
*event
)
1432 WMUnmapWidget(legalPanel
->win
);
1434 WMDestroyWidget(legalPanel
->win
);
1436 wUnmanageWindow(legalPanel
->wwin
, False
, False
);
1445 wShowLegalPanel(WScreen
*scr
)
1452 if (legalPanel
->scr
== scr
) {
1453 wRaiseFrame(legalPanel
->wwin
->frame
->core
);
1454 wSetFocusTo(scr
, legalPanel
->wwin
);
1459 panel
= wmalloc(sizeof(LegalPanel
));
1463 panel
->win
= WMCreateWindow(scr
->wmscreen
, "legal");
1464 WMResizeWidget(panel
->win
, 420, 250);
1467 panel
->licenseL
= WMCreateLabel(panel
->win
);
1468 WMSetLabelWraps(panel
->licenseL
, True
);
1469 WMResizeWidget(panel
->licenseL
, 400, 230);
1470 WMMoveWidget(panel
->licenseL
, 10, 10);
1471 WMSetLabelTextAlignment(panel
->licenseL
, WALeft
);
1472 WMSetLabelText(panel
->licenseL
,
1473 _(" Window Maker is free software; you can redistribute it and/or\n"
1474 "modify it under the terms of the GNU General Public License as\n"
1475 "published by the Free Software Foundation; either version 2 of the\n"
1476 "License, or (at your option) any later version.\n\n\n"
1477 " Window Maker is distributed in the hope that it will be useful,\n"
1478 "but WITHOUT ANY WARRANTY; without even the implied warranty\n"
1479 "of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
1480 "See the GNU General Public License for more details.\n\n\n"
1481 " You should have received a copy of the GNU General Public\n"
1482 "License along with this program; if not, write to the Free Software\n"
1483 "Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA\n"
1484 "02111-1307, USA."));
1485 WMSetLabelRelief(panel
->licenseL
, WRGroove
);
1487 WMRealizeWidget(panel
->win
);
1488 WMMapSubwidgets(panel
->win
);
1490 parent
= XCreateSimpleWindow(dpy
, scr
->root_win
, 0, 0, 420, 250, 0, 0, 0);
1492 XReparentWindow(dpy
, WMWidgetXID(panel
->win
), parent
, 0, 0);
1494 wwin
= wManageInternalWindow(scr
, parent
, None
, _("Legal"),
1495 (scr
->scr_width
- 420)/2,
1496 (scr
->scr_height
- 250)/2, 420, 250);
1498 WSETUFLAG(wwin
, no_closable
, 0);
1499 WSETUFLAG(wwin
, no_close_button
, 0);
1500 wWindowUpdateButtonImages(wwin
);
1501 wFrameWindowShowButton(wwin
->frame
, WFF_RIGHT_BUTTON
);
1502 #ifdef XKB_BUTTON_HINT
1503 wFrameWindowHideButton(wwin
->frame
, WFF_LANGUAGE_BUTTON
);
1505 wwin
->frame
->on_click_right
= destroyLegalPanel
;
1509 WMMapWidget(panel
->win
);
1518 ***********************************************************************
1519 * Crashing Dialog Panel
1520 ***********************************************************************
1523 extern WDDomain
*WDWindowAttributes
;
1526 typedef struct _CrashPanel
{
1527 WMWindow
*win
; /* main window */
1529 WMLabel
*iconL
; /* application icon */
1530 WMLabel
*nameL
; /* title of panel */
1532 WMFrame
*sepF
; /* separator frame */
1534 WMLabel
*noteL
; /* Title of note */
1535 WMLabel
*note2L
; /* body of note with what happened */
1537 WMFrame
*whatF
; /* "what to do next" frame */
1538 WMPopUpButton
*whatP
; /* action selection popup button */
1540 WMButton
*okB
; /* ok button */
1542 Bool done
; /* if finished with this dialog */
1543 int action
; /* what to do after */
1551 handleKeyPress(XEvent
*event
, void *clientData
)
1553 CrashPanel
*panel
= (CrashPanel
*)clientData
;
1555 if (event
->xkey
.keycode
== panel
->retKey
) {
1556 WMPerformButtonClick(panel
->okB
);
1562 okButtonCallback(void *self
, void *clientData
)
1564 CrashPanel
*panel
= (CrashPanel
*)clientData
;
1571 setCrashAction(void *self
, void *clientData
)
1573 WMPopUpButton
*pop
= (WMPopUpButton
*)self
;
1574 CrashPanel
*panel
= (CrashPanel
*)clientData
;
1576 panel
->action
= WMGetPopUpButtonSelectedItem(pop
);
1581 getWindowMakerIconImage(WMScreen
*scr
)
1583 proplist_t dict
, key
, option
, value
=NULL
;
1587 PLSetStringCmpHook(NULL
);
1589 key
= PLMakeString("Logo.WMPanel");
1590 option
= PLMakeString("Icon");
1592 dict
= PLGetDictionaryEntry(WDWindowAttributes
->dictionary
, key
);
1595 value
= PLGetDictionaryEntry(dict
, option
);
1601 PLSetStringCmpHook(StringCompareHook
);
1603 if (value
&& PLIsString(value
)) {
1604 path
= FindImage(wPreferences
.icon_path
, PLGetString(value
));
1609 image
= RLoadImage(WMScreenRContext(scr
), path
, 0);
1611 pix
= WMCreatePixmapFromRImage(scr
, image
, 0);
1612 RDestroyImage(image
);
1627 wShowCrashingDialogPanel(int whatSig
)
1633 int screen_no
, scr_width
, scr_height
;
1637 panel
= wmalloc(sizeof(CrashPanel
));
1638 memset(panel
, 0, sizeof(CrashPanel
));
1640 screen_no
= DefaultScreen(dpy
);
1641 scr_width
= WidthOfScreen(ScreenOfDisplay(dpy
, screen_no
));
1642 scr_height
= HeightOfScreen(ScreenOfDisplay(dpy
, screen_no
));
1644 scr
= WMCreateScreen(dpy
, screen_no
);
1646 wsyserror(_("cannot open connection for crashing dialog panel. Aborting."));
1650 panel
->retKey
= XKeysymToKeycode(dpy
, XK_Return
);
1652 panel
->win
= WMCreateWindow(scr
, "crashingDialog");
1653 WMResizeWidget(panel
->win
, PWIDTH
, PHEIGHT
);
1654 WMMoveWidget(panel
->win
, (scr_width
- PWIDTH
)/2, (scr_height
- PHEIGHT
)/2);
1656 logo
= getWindowMakerIconImage(scr
);
1658 panel
->iconL
= WMCreateLabel(panel
->win
);
1659 WMResizeWidget(panel
->iconL
, 64, 64);
1660 WMMoveWidget(panel
->iconL
, 10, 10);
1661 WMSetLabelImagePosition(panel
->iconL
, WIPImageOnly
);
1662 WMSetLabelImage(panel
->iconL
, logo
);
1665 panel
->nameL
= WMCreateLabel(panel
->win
);
1666 WMResizeWidget(panel
->nameL
, 190, 18);
1667 WMMoveWidget(panel
->nameL
, 80, 35);
1668 WMSetLabelTextAlignment(panel
->nameL
, WALeft
);
1669 font
= WMBoldSystemFontOfSize(scr
, 18);
1670 WMSetLabelFont(panel
->nameL
, font
);
1671 WMReleaseFont(font
);
1672 WMSetLabelText(panel
->nameL
, _("Fatal error"));
1674 panel
->sepF
= WMCreateFrame(panel
->win
);
1675 WMResizeWidget(panel
->sepF
, PWIDTH
+4, 2);
1676 WMMoveWidget(panel
->sepF
, -2, 80);
1678 panel
->noteL
= WMCreateLabel(panel
->win
);
1679 WMResizeWidget(panel
->noteL
, PWIDTH
-20, 40);
1680 WMMoveWidget(panel
->noteL
, 10, 90);
1681 WMSetLabelTextAlignment(panel
->noteL
, WAJustified
);
1682 #ifdef SYS_SIGLIST_DECLARED
1683 sprintf(buf
, _("Window Maker received signal %i\n(%s)."),
1684 whatSig
, sys_siglist
[whatSig
]);
1686 sprintf(buf
, _("Window Maker received signal %i."), whatSig
);
1688 WMSetLabelText(panel
->noteL
, buf
);
1690 panel
->note2L
= WMCreateLabel(panel
->win
);
1691 WMResizeWidget(panel
->note2L
, PWIDTH
-20, 100);
1692 WMMoveWidget(panel
->note2L
, 10, 130);
1693 WMSetLabelTextAlignment(panel
->note2L
, WALeft
);
1694 WMSetLabelText(panel
->note2L
,
1695 _(" This fatal error occured probably due to a bug."
1696 " Please fill the included BUGFORM and "
1697 "report it to bugs@windowmaker.org."));
1700 panel
->whatF
= WMCreateFrame(panel
->win
);
1701 WMResizeWidget(panel
->whatF
, PWIDTH
-20, 50);
1702 WMMoveWidget(panel
->whatF
, 10, 240);
1703 WMSetFrameTitle(panel
->whatF
, _("What do you want to do now?"));
1705 panel
->whatP
= WMCreatePopUpButton(panel
->whatF
);
1706 WMResizeWidget(panel
->whatP
, PWIDTH
-20-70, 20);
1707 WMMoveWidget(panel
->whatP
, 35, 20);
1708 WMSetPopUpButtonPullsDown(panel
->whatP
, False
);
1709 WMSetPopUpButtonText(panel
->whatP
, _("Select action"));
1710 WMAddPopUpButtonItem(panel
->whatP
, _("Abort and leave a core file"));
1711 WMAddPopUpButtonItem(panel
->whatP
, _("Restart Window Maker"));
1712 WMAddPopUpButtonItem(panel
->whatP
, _("Start alternate window manager"));
1713 WMSetPopUpButtonAction(panel
->whatP
, setCrashAction
, panel
);
1714 WMSetPopUpButtonSelectedItem(panel
->whatP
, WMRestart
);
1715 panel
->action
= WMRestart
;
1717 WMMapSubwidgets(panel
->whatF
);
1719 panel
->okB
= WMCreateCommandButton(panel
->win
);
1720 WMResizeWidget(panel
->okB
, 80, 26);
1721 WMMoveWidget(panel
->okB
, 205, 309);
1722 WMSetButtonText(panel
->okB
, _("OK"));
1723 WMSetButtonImage(panel
->okB
, WMGetSystemPixmap(scr
, WSIReturnArrow
));
1724 WMSetButtonAltImage(panel
->okB
, WMGetSystemPixmap(scr
, WSIHighlightedReturnArrow
));
1725 WMSetButtonImagePosition(panel
->okB
, WIPRight
);
1726 WMSetButtonAction(panel
->okB
, okButtonCallback
, panel
);
1730 WMCreateEventHandler(WMWidgetView(panel
->win
), KeyPressMask
,
1731 handleKeyPress
, panel
);
1733 WMRealizeWidget(panel
->win
);
1734 WMMapSubwidgets(panel
->win
);
1736 WMMapWidget(panel
->win
);
1738 XSetInputFocus(dpy
, WMWidgetXID(panel
->win
), RevertToParent
, CurrentTime
);
1740 while (!panel
->done
) {
1743 WMNextEvent(dpy
, &event
);
1744 WMHandleEvent(&event
);
1747 action
= panel
->action
;
1749 WMUnmapWidget(panel
->win
);
1750 WMDestroyWidget(panel
->win
);
1759 /*****************************************************************************
1760 * About GNUstep Panel
1761 *****************************************************************************/
1765 drawGNUstepLogo(Display
*dpy
, Drawable d
, int width
, int height
,
1766 unsigned long blackPixel
, unsigned long whitePixel
)
1770 XRectangle rects
[3];
1772 gcv
.foreground
= blackPixel
;
1773 gc
= XCreateGC(dpy
, d
, GCForeground
, &gcv
);
1775 XFillArc(dpy
, d
, gc
, width
/45, height
/45,
1776 width
- 2*width
/45, height
- 2*height
/45, 0, 360*64);
1779 rects
[0].y
= 37*height
/45;
1780 rects
[0].width
= width
/3;
1781 rects
[0].height
= height
- rects
[0].y
;
1783 rects
[1].x
= rects
[0].width
;
1784 rects
[1].y
= height
/2;
1785 rects
[1].width
= width
- 2*width
/3;
1786 rects
[1].height
= height
- rects
[1].y
;
1788 rects
[2].x
= 2*width
/3;
1789 rects
[2].y
= height
- 37*height
/45;
1790 rects
[2].width
= width
/3;
1791 rects
[2].height
= height
- rects
[2].y
;
1793 XSetClipRectangles(dpy
, gc
, 0, 0, rects
, 3, Unsorted
);
1794 XFillRectangle(dpy
, d
, gc
, 0, 0, width
, height
);
1796 XSetForeground(dpy
, gc
, whitePixel
);
1797 XFillArc(dpy
, d
, gc
, width
/45, height
/45,
1798 width
- 2*width
/45, height
- 2*height
/45, 0, 360*64);
1816 static GNUstepPanel
*gnustepPanel
= NULL
;
1819 destroyGNUstepPanel(WCoreWindow
*foo
, void *data
, XEvent
*event
)
1821 WMUnmapWidget(gnustepPanel
->win
);
1823 WMDestroyWidget(gnustepPanel
->win
);
1825 wUnmanageWindow(gnustepPanel
->wwin
, False
, False
);
1827 wfree(gnustepPanel
);
1829 gnustepPanel
= NULL
;
1834 wShowGNUstepPanel(WScreen
*scr
)
1836 GNUstepPanel
*panel
;
1843 if (gnustepPanel
->scr
== scr
) {
1844 wRaiseFrame(gnustepPanel
->wwin
->frame
->core
);
1845 wSetFocusTo(scr
, gnustepPanel
->wwin
);
1850 panel
= wmalloc(sizeof(GNUstepPanel
));
1854 panel
->win
= WMCreateWindow(scr
->wmscreen
, "About GNUstep");
1855 WMResizeWidget(panel
->win
, 325, 200);
1857 pixmap
= WMCreatePixmap(scr
->wmscreen
, 130, 130,
1858 WMScreenDepth(scr
->wmscreen
), True
);
1860 color
= WMCreateNamedColor(scr
->wmscreen
, "gray50", True
);
1862 drawGNUstepLogo(dpy
, WMGetPixmapXID(pixmap
), 130, 130,
1863 WMColorPixel(color
), scr
->white_pixel
);
1865 WMReleaseColor(color
);
1867 XSetForeground(dpy
, scr
->mono_gc
, 0);
1868 XFillRectangle(dpy
, WMGetPixmapMaskXID(pixmap
), scr
->mono_gc
, 0, 0,
1870 drawGNUstepLogo(dpy
, WMGetPixmapMaskXID(pixmap
), 130, 130, 1, 1);
1872 panel
->gstepL
= WMCreateLabel(panel
->win
);
1873 WMResizeWidget(panel
->gstepL
, 285, 64);
1874 WMMoveWidget(panel
->gstepL
, 20, 0);
1875 WMSetLabelTextAlignment(panel
->gstepL
, WARight
);
1876 WMSetLabelText(panel
->gstepL
, "GNUstep");
1878 WMFont
*font
= WMBoldSystemFontOfSize(scr
->wmscreen
, 24);
1880 WMSetLabelFont(panel
->gstepL
, font
);
1881 WMReleaseFont(font
);
1884 panel
->textL
= WMCreateLabel(panel
->win
);
1885 WMResizeWidget(panel
->textL
, 275, 130);
1886 WMMoveWidget(panel
->textL
, 30, 50);
1887 WMSetLabelTextAlignment(panel
->textL
, WARight
);
1888 WMSetLabelImagePosition(panel
->textL
, WIPOverlaps
);
1889 WMSetLabelText(panel
->textL
,
1890 _("Window Maker is part of the GNUstep project.\n"\
1891 "The GNUstep project aims to create a free\n"\
1892 "implementation of the OpenStep(tm) specification\n"\
1893 "which is a object-oriented framework for\n"\
1894 "creating advanced graphical, multi-platform\n"\
1895 "applications. Additionally, a development and\n"\
1896 "user desktop enviroment will be created on top\n"\
1897 "of the framework. For more information about\n"\
1898 "GNUstep, please visit: www.gnustep.org"));
1899 WMSetLabelImage(panel
->textL
, pixmap
);
1901 WMReleasePixmap(pixmap
);
1903 WMRealizeWidget(panel
->win
);
1904 WMMapSubwidgets(panel
->win
);
1906 parent
= XCreateSimpleWindow(dpy
, scr
->root_win
, 0, 0, 325, 200, 0, 0, 0);
1908 XReparentWindow(dpy
, WMWidgetXID(panel
->win
), parent
, 0, 0);
1910 wwin
= wManageInternalWindow(scr
, parent
, None
, _("About GNUstep"),
1911 (scr
->scr_width
- 325)/2,
1912 (scr
->scr_height
- 200)/2, 325, 200);
1914 WSETUFLAG(wwin
, no_closable
, 0);
1915 WSETUFLAG(wwin
, no_close_button
, 0);
1916 wWindowUpdateButtonImages(wwin
);
1917 wFrameWindowShowButton(wwin
->frame
, WFF_RIGHT_BUTTON
);
1918 #ifdef XKB_BUTTON_HINT
1919 wFrameWindowHideButton(wwin
->frame
, WFF_LANGUAGE_BUTTON
);
1921 wwin
->frame
->on_click_right
= destroyGNUstepPanel
;
1925 WMMapWidget(panel
->win
);
1929 gnustepPanel
= panel
;