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
->oldFont
) {
812 WMReleaseFont(thePanel
->oldFont
);
814 if (thePanel
->icon
) {
815 RDestroyImage(thePanel
->icon
);
818 RDestroyImage(thePanel
->pic
);
820 #endif /* SILLYNESS */
821 WMUnmapWidget(thePanel
);
823 wUnmanageWindow(thePanel
->wwin
, False
, False
);
825 WMDestroyWidget(thePanel
->win
);
834 renderText(WMScreen
*scr
, char *text
, char *font
, RColor
*from
, RColor
*to
)
836 WMPixmap
*wpix
= NULL
;
839 RContext
*rc
= WMScreenRContext(scr
);
840 XFontStruct
*f
= NULL
;
844 f
= XLoadQueryFont(dpy
, font
);
848 w
= XTextWidth(f
, text
, strlen(text
));
849 h
= f
->ascent
+f
->descent
;
851 mask
= XCreatePixmap(dpy
, rc
->drawable
, w
, h
, 1);
852 gc
= XCreateGC(dpy
, mask
, 0, NULL
);
853 XSetForeground(dpy
, gc
, 0);
854 XSetFont(dpy
, gc
, f
->fid
);
855 XFillRectangle(dpy
, mask
, gc
, 0, 0, w
, h
);
857 XSetForeground(dpy
, gc
, 1);
858 XDrawString(dpy
, mask
, gc
, 0, f
->ascent
, text
, strlen(text
));
859 XSetLineAttributes(dpy
, gc
, 3, LineSolid
, CapRound
, JoinMiter
);
860 XDrawLine(dpy
, mask
, gc
, 0, h
-2, w
, h
-2);
862 grad
= XCreatePixmap(dpy
, rc
->drawable
, w
, h
, rc
->depth
);
866 color
= WMBlackColor(scr
);
867 XFillRectangle(dpy
, grad
, WMColorGC(color
), 0, 0, w
, h
);
868 WMReleaseColor(color
);
871 wpix
= WMCreatePixmapFromXPixmaps(scr
, grad
, mask
, w
, h
, rc
->depth
);
882 extern WMPixmap
*DoXThing();
883 extern Bool
InitXThing();
886 logoPushCallback(void *data
)
888 InfoPanel
*panel
= (InfoPanel
*)data
;
893 static int jingobeu
[] = {
894 329, 150, -1, 100, 329, 150, -1, 100, 329, 300, -1, 250,
895 329, 150, -1, 100, 329, 150, -1, 100, 329, 300, -1, 250,
896 329, 150, 392, 150, 261, 150, 293, 150, 329, 400, -1, 400, 0
904 if(jingobeu
[panel
->x
-1]==0){panel
->x
=-1;}else if(jingobeu
[panel
->x
905 -1]<0){panel
->x
++;c
=jingobeu
[panel
->x
-1]/50;panel
->x
++;}else if(c
==0){
906 kc
.bell_pitch
=jingobeu
[panel
->x
-1];panel
->x
++;kc
.bell_percent
=50;c
=
907 jingobeu
[panel
->x
-1]/50;kc
.bell_duration
=jingobeu
[panel
->x
-1];panel
->x
++;
908 XChangeKeyboardControl(dpy
,KBBellPitch
|KBBellDuration
|KBBellPercent
,&kc
);
909 XBell(dpy
,50);XFlush(dpy
);}else{c
--;}}
910 if (!(panel
->cycle
% 4)) {
913 p
= DoXThing(panel
->wwin
);
914 WMSetLabelImage(panel
->logoL
, p
);
916 } else if (panel
->cycle
< 30) {
920 image
= RScaleImage(panel
->icon
, panel
->pic
->width
, panel
->pic
->height
);
921 RCombineImagesWithOpaqueness(image
, panel
->pic
, panel
->cycle
*255/30);
922 pix
= WMCreatePixmapFromRImage(panel
->scr
->wmscreen
, image
, 128);
923 RDestroyImage(image
);
924 WMSetLabelImage(panel
->logoL
, pix
);
925 WMReleasePixmap(pix
);
928 /* slow down text a little */
929 i
= (int)(panel
->cycle
* 50.0/85.0)%200;
932 len
= strlen(panel
->str
);
934 strncpy(buffer
, panel
->str
, i
<len
? i
: len
);
936 memset(&buffer
[len
], ' ', i
-len
);
938 strncpy(buffer
, panel
->str
, i
<len
? i
: len
);
940 memset(&buffer
[len
], ' ', i
-len
);
943 WMSetLabelText(panel
->versionL
, buffer
);
945 XFlush(WMScreenDisplay(WMWidgetScreen(panel
->versionL
)));
950 panel
->timer
= WMAddTimerHandler(50, logoPushCallback
, panel
);
956 handleLogoPush(XEvent
*event
, void *data
)
958 InfoPanel
*panel
= (InfoPanel
*)data
;
959 static int broken
= 0;
960 static int clicks
= 0;
961 static char *pic_data
[] = {
1020 " ............... ",
1021 " ....XoO+@##+O$%.... ",
1022 " ...%X&*========-;;:o... ",
1023 " ...>.>,<122222222222134@... ",
1024 " ..>5678912222222222222220q%.. ",
1025 " ..$.&-w2222222222222222222er>.. ",
1026 " ..O.t31222222222222222222222y4>.. ",
1027 " ...O5u3222222222222222222222222yri... ",
1028 " ..>p&a22222222222222222222222222wso.. ",
1029 " ..ids91222222222222222222222222222wfi.. ",
1030 " ..X.7w222222wgs-w2222222213=g0222222<hi.. ",
1031 " ..Xuj2222222<@X5=222222229k@l:022222y4i.. ",
1032 " .Xdz22222222*X%.s22222222axo%$-222222<c>.. ",
1033 " ..o7y22222222v...r222222223hX.i82222221si.. ",
1034 "..io*222222222&...u22222222yt..%*22222220:%. ",
1035 "..>k02222222227...f222222222v..X=222222229t. ",
1036 "..dz12222222220ui:y2222222223d%qw222222221g. ",
1037 ".%vw222222222221y2222222222219*y2222222222wd.",
1038 ".X;2222222222222222222222222222222222222222b.",
1039 ".i*2222222222222222222222222222222222222222v.",
1040 ".i*2222222222222222222222222222222222222222;.",
1041 ".i*22222222222222222222222222222222222222228.",
1042 ".>*2222222222222222222222222222222222222222=.",
1043 ".i*22222222222222222222222222222222222222228.",
1044 ".i*2222222222222222222222222222222222222222;.",
1045 ".X*222222222222222222222222222222we12222222r.",
1046 ".Xs12222222w3aw22222222222222222y8s0222222wk.",
1047 ".Xq02222222a,na22222222222222222zm6zwy2222gi.",
1048 "..>*22222y<:Xcj22222222222222222-o$k;;02228..",
1049 "..i7y2220rhX.:y22222222222222222jtiXd,a220,..",
1050 " .X@z222a,do%kj2222222222222222wMX5q;gw228%..",
1051 " ..58222wagsh6ry222222222222221;>Of0w222y:...",
1052 " ...:e2222218mdz22222222222222a&$vw222220@...",
1053 " ...O-122222y:.u02222222222229q$uj222221r... ",
1054 " ..%&a1222223&573w2222222219NOxz122221z>... ",
1055 " ...t3222221-l$nr8ay1222yzbo,=12222w-5... ",
1056 " ..X:022222w-k+>o,7s**s7xOn=12221<f5... ",
1057 " ..o:9222221j8:&Bl>>>>ihv<12221=dX... ",
1058 " ..Xb9122222109g-****;<y22221zn%... ",
1059 " ..X&801222222222222222222w-h.... ",
1060 " ...o:=022222222222222221=lX... ",
1061 " ..X@:;3w2222222222210fO... ",
1062 " ...XX&v8<30000003-N@... ",
1063 " .....XmnbN:q&Bo.... ",
1065 static char *msgs
[] = {
1067 "Focus follow mouse users will burn in hell!!!",
1069 "Hi! My name is bobby...",
1070 "AHH! The neurotic monkeys are after me!",
1073 "SOMEBODY SET UP US THE BOMB",
1074 "ALL YOUR BASE ARE BELONG TO US!",
1075 "Oh My God!!! Larry is back!"
1081 if (!panel
->timer
&& !broken
&& clicks
> 0) {
1089 file
= wDefaultGetIconFile(panel
->scr
, "Logo", "WMPanel", False
);
1095 path
= FindImage(wPreferences
.icon_path
, file
);
1101 panel
->icon
= RLoadImage(panel
->scr
->rcontext
, path
, 0);
1109 panel
->pic
= RGetImageFromXPMData(panel
->scr
->rcontext
, pic_data
);
1112 RDestroyImage(panel
->icon
);
1115 RDestroyImage(panel
->pic
);
1127 RCombineImageWithColor(panel
->icon
, &color
);
1128 RCombineImageWithColor(panel
->pic
, &color
);
1132 panel
->str
= msgs
[rand()%(sizeof(msgs
)/sizeof(char*))];
1134 panel
->timer
= WMAddTimerHandler(50, logoPushCallback
, panel
);
1136 panel
->oldPix
= WMRetainPixmap(WMGetLabelImage(panel
->logoL
));
1137 /* If we don't use a fixed font, scrolling will be jumpy */
1138 /* Alternatively we can draw text in a pixmap and scroll it smoothly */
1139 if ((panel
->oldFont
= WMGetLabelFont(panel
->versionL
))!=NULL
)
1140 WMRetainFont(panel
->oldFont
);
1141 font
= WMCreateFont(WMWidgetScreen(panel
->versionL
), "-*-fixed-*-*-*-*-14-*-*-*-*-*-*-*");
1143 WMSetLabelFont(panel
->versionL
, font
);
1144 WMReleaseFont(font
);
1146 WMSetLabelText(panel
->versionL
, "");
1147 } else if (panel
->timer
) {
1152 WMSetLabelImage(panel
->logoL
, panel
->oldPix
);
1153 WMReleasePixmap(panel
->oldPix
);
1154 panel
->oldPix
= NULL
;
1156 WMDeleteTimerHandler(panel
->timer
);
1157 panel
->timer
= NULL
;
1159 WMSetLabelFont(panel
->versionL
, panel
->oldFont
);
1160 if (panel
->oldFont
) {
1161 WMReleaseFont(panel
->oldFont
);
1162 panel
->oldFont
= NULL
;
1164 sprintf(version
, _("Version %s"), VERSION
);
1165 WMSetLabelText(panel
->versionL
, version
);
1166 XFlush(WMScreenDisplay(WMWidgetScreen(panel
->versionL
)));
1171 while (XCheckTypedWindowEvent(dpy
, WMWidgetXID(panel
->versionL
),
1175 #endif /* SILLYNESS */
1179 wShowInfoPanel(WScreen
*scr
)
1189 RColor color1
, color2
;
1203 if (thePanel
->scr
== scr
) {
1204 wRaiseFrame(thePanel
->wwin
->frame
->core
);
1205 wSetFocusTo(scr
, thePanel
->wwin
);
1210 panel
= wmalloc(sizeof(InfoPanel
));
1211 memset(panel
, 0, sizeof(InfoPanel
));
1215 panel
->win
= WMCreateWindow(scr
->wmscreen
, "info");
1216 WMResizeWidget(panel
->win
, 382, 230);
1218 logo
= WMGetApplicationIconImage(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
);
1232 panel
->name1L
= WMCreateLabel(panel
->win
);
1233 WMResizeWidget(panel
->name1L
, 240, 30);
1234 WMMoveWidget(panel
->name1L
, 100, 30);
1239 color2
.green
= 0x50;
1241 logo
= renderText(scr
->wmscreen
, "GNU Window Maker",
1242 "-*-utopia-*-r-*-*-25-*", &color1
, &color2
);
1244 WMSetLabelImagePosition(panel
->name1L
, WIPImageOnly
);
1245 WMSetLabelImage(panel
->name1L
, logo
);
1246 WMReleasePixmap(logo
);
1248 font
= WMBoldSystemFontOfSize(scr
->wmscreen
, 20);
1250 WMSetLabelFont(panel
->name1L
, font
);
1251 WMReleaseFont(font
);
1253 WMSetLabelTextAlignment(panel
->name1L
, WACenter
);
1254 WMSetLabelText(panel
->name1L
, "GNU Window Maker");
1257 panel
->name2L
= WMCreateLabel(panel
->win
);
1258 WMResizeWidget(panel
->name2L
, 240, 24);
1259 WMMoveWidget(panel
->name2L
, 100, 60);
1260 font
= WMBoldSystemFontOfSize(scr
->wmscreen
, 18);
1262 WMSetLabelFont(panel
->name2L
, font
);
1263 WMReleaseFont(font
);
1266 WMSetLabelTextAlignment(panel
->name2L
, WACenter
);
1267 WMSetLabelText(panel
->name2L
, _("Window Manager for X"));
1270 sprintf(version
, _("Version %s"), VERSION
);
1271 panel
->versionL
= WMCreateLabel(panel
->win
);
1272 WMResizeWidget(panel
->versionL
, 310, 16);
1273 WMMoveWidget(panel
->versionL
, 30, 95);
1274 WMSetLabelTextAlignment(panel
->versionL
, WARight
);
1275 WMSetLabelText(panel
->versionL
, version
);
1276 WMSetLabelWraps(panel
->versionL
, False
);
1278 panel
->copyrL
= WMCreateLabel(panel
->win
);
1279 WMResizeWidget(panel
->copyrL
, 340, 40);
1280 WMMoveWidget(panel
->copyrL
, 15, 185);
1281 WMSetLabelTextAlignment(panel
->copyrL
, WALeft
);
1282 WMSetLabelText(panel
->copyrL
, COPYRIGHT_TEXT
);
1283 /* we want the (c) character in the helvetica font */
1284 font
= WMCreateNormalFont(scr
->wmscreen
, HELVETICA10_FONT
);
1286 WMSetLabelFont(panel
->copyrL
, font
);
1289 switch (scr
->w_depth
) {
1291 strcpy(version
, _("32 thousand"));
1294 strcpy(version
, _("64 thousand"));
1298 strcpy(version
, _("16 million"));
1301 sprintf(version
, "%d", 1<<scr
->w_depth
);
1305 sprintf(buffer
, _("Using visual 0x%x: %s %ibpp (%s colors)\n"),
1306 (unsigned)scr
->w_visual
->visualid
,
1307 visuals
[scr
->w_visual
->class], scr
->w_depth
, version
);
1309 #if defined(HAVE_MALLOC_H) && defined(HAVE_MALLINFO)
1311 struct mallinfo ma
= mallinfo();
1312 sprintf(buffer
+strlen(buffer
),
1313 _("Total allocated memory: %i kB. Total memory in use: %i kB.\n"),
1314 (ma
.arena
+ma
.hblkhd
)/1024, (ma
.uordblks
+ma
.hblkhd
)/1024);
1319 strcat(buffer
, _("Supported image formats: "));
1320 strl
= RSupportedFileFormats();
1321 for (i
=0; strl
[i
]!=NULL
; i
++) {
1322 strcat(buffer
, strl
[i
]);
1323 strcat(buffer
, " ");
1326 strcat(buffer
, _("\nAdditional Support For: "));
1339 list
[j
++] = "GNOME";
1345 list
[j
++] = _("Sound");
1349 for (i
= 0; i
< j
; i
++) {
1352 strcat(buf
, _(" and "));
1356 strcat(buf
, list
[i
]);
1358 strcat(buffer
, buf
);
1362 panel
->infoL
= WMCreateLabel(panel
->win
);
1363 WMResizeWidget(panel
->infoL
, 350, 75);
1364 WMMoveWidget(panel
->infoL
, 15, 115);
1365 WMSetLabelText(panel
->infoL
, buffer
);
1367 WMSetLabelFont(panel
->infoL
, font
);
1368 WMReleaseFont(font
);
1372 WMRealizeWidget(panel
->win
);
1373 WMMapSubwidgets(panel
->win
);
1375 parent
= XCreateSimpleWindow(dpy
, scr
->root_win
, 0, 0, 382, 230, 0, 0, 0);
1377 XReparentWindow(dpy
, WMWidgetXID(panel
->win
), parent
, 0, 0);
1379 WMMapWidget(panel
->win
);
1381 wwin
= wManageInternalWindow(scr
, parent
, None
, _("Info"),
1382 (scr
->scr_width
- 382)/2,
1383 (scr
->scr_height
- 230)/2, 382, 230);
1385 WSETUFLAG(wwin
, no_closable
, 0);
1386 WSETUFLAG(wwin
, no_close_button
, 0);
1387 #ifdef XKB_BUTTON_HINT
1388 wFrameWindowHideButton(wwin
->frame
, WFF_LANGUAGE_BUTTON
);
1390 wWindowUpdateButtonImages(wwin
);
1391 wFrameWindowShowButton(wwin
->frame
, WFF_RIGHT_BUTTON
);
1392 wwin
->frame
->on_click_right
= destroyInfoPanel
;
1400 if (InitXThing(panel
->scr
)) {
1401 panel
->timer
= WMAddTimerHandler(100, logoPushCallback
, panel
);
1404 panel
->str
= _("Merry X'mas!");
1405 panel
->oldPix
= WMRetainPixmap(WMGetLabelImage(panel
->logoL
));
1412 ***********************************************************************
1414 ***********************************************************************
1428 static LegalPanel
*legalPanel
= NULL
;
1431 destroyLegalPanel(WCoreWindow
*foo
, void *data
, XEvent
*event
)
1433 WMUnmapWidget(legalPanel
->win
);
1435 WMDestroyWidget(legalPanel
->win
);
1437 wUnmanageWindow(legalPanel
->wwin
, False
, False
);
1446 wShowLegalPanel(WScreen
*scr
)
1453 if (legalPanel
->scr
== scr
) {
1454 wRaiseFrame(legalPanel
->wwin
->frame
->core
);
1455 wSetFocusTo(scr
, legalPanel
->wwin
);
1460 panel
= wmalloc(sizeof(LegalPanel
));
1464 panel
->win
= WMCreateWindow(scr
->wmscreen
, "legal");
1465 WMResizeWidget(panel
->win
, 420, 250);
1468 panel
->licenseL
= WMCreateLabel(panel
->win
);
1469 WMSetLabelWraps(panel
->licenseL
, True
);
1470 WMResizeWidget(panel
->licenseL
, 400, 230);
1471 WMMoveWidget(panel
->licenseL
, 10, 10);
1472 WMSetLabelTextAlignment(panel
->licenseL
, WALeft
);
1473 WMSetLabelText(panel
->licenseL
,
1474 _(" Window Maker is free software; you can redistribute it and/or\n"
1475 "modify it under the terms of the GNU General Public License as\n"
1476 "published by the Free Software Foundation; either version 2 of the\n"
1477 "License, or (at your option) any later version.\n\n\n"
1478 " Window Maker is distributed in the hope that it will be useful,\n"
1479 "but WITHOUT ANY WARRANTY; without even the implied warranty\n"
1480 "of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
1481 "See the GNU General Public License for more details.\n\n\n"
1482 " You should have received a copy of the GNU General Public\n"
1483 "License along with this program; if not, write to the Free Software\n"
1484 "Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA\n"
1485 "02111-1307, USA."));
1486 WMSetLabelRelief(panel
->licenseL
, WRGroove
);
1488 WMRealizeWidget(panel
->win
);
1489 WMMapSubwidgets(panel
->win
);
1491 parent
= XCreateSimpleWindow(dpy
, scr
->root_win
, 0, 0, 420, 250, 0, 0, 0);
1493 XReparentWindow(dpy
, WMWidgetXID(panel
->win
), parent
, 0, 0);
1495 wwin
= wManageInternalWindow(scr
, parent
, None
, _("Legal"),
1496 (scr
->scr_width
- 420)/2,
1497 (scr
->scr_height
- 250)/2, 420, 250);
1499 WSETUFLAG(wwin
, no_closable
, 0);
1500 WSETUFLAG(wwin
, no_close_button
, 0);
1501 wWindowUpdateButtonImages(wwin
);
1502 wFrameWindowShowButton(wwin
->frame
, WFF_RIGHT_BUTTON
);
1503 #ifdef XKB_BUTTON_HINT
1504 wFrameWindowHideButton(wwin
->frame
, WFF_LANGUAGE_BUTTON
);
1506 wwin
->frame
->on_click_right
= destroyLegalPanel
;
1510 WMMapWidget(panel
->win
);
1519 ***********************************************************************
1520 * Crashing Dialog Panel
1521 ***********************************************************************
1524 extern WDDomain
*WDWindowAttributes
;
1527 typedef struct _CrashPanel
{
1528 WMWindow
*win
; /* main window */
1530 WMLabel
*iconL
; /* application icon */
1531 WMLabel
*nameL
; /* title of panel */
1533 WMFrame
*sepF
; /* separator frame */
1535 WMLabel
*noteL
; /* Title of note */
1536 WMLabel
*note2L
; /* body of note with what happened */
1538 WMFrame
*whatF
; /* "what to do next" frame */
1539 WMPopUpButton
*whatP
; /* action selection popup button */
1541 WMButton
*okB
; /* ok button */
1543 Bool done
; /* if finished with this dialog */
1544 int action
; /* what to do after */
1552 handleKeyPress(XEvent
*event
, void *clientData
)
1554 CrashPanel
*panel
= (CrashPanel
*)clientData
;
1556 if (event
->xkey
.keycode
== panel
->retKey
) {
1557 WMPerformButtonClick(panel
->okB
);
1563 okButtonCallback(void *self
, void *clientData
)
1565 CrashPanel
*panel
= (CrashPanel
*)clientData
;
1572 setCrashAction(void *self
, void *clientData
)
1574 WMPopUpButton
*pop
= (WMPopUpButton
*)self
;
1575 CrashPanel
*panel
= (CrashPanel
*)clientData
;
1577 panel
->action
= WMGetPopUpButtonSelectedItem(pop
);
1582 getWindowMakerIconImage(WMScreen
*scr
)
1584 proplist_t dict
, key
, option
, value
=NULL
;
1588 PLSetStringCmpHook(NULL
);
1590 key
= PLMakeString("Logo.WMPanel");
1591 option
= PLMakeString("Icon");
1593 dict
= PLGetDictionaryEntry(WDWindowAttributes
->dictionary
, key
);
1596 value
= PLGetDictionaryEntry(dict
, option
);
1602 PLSetStringCmpHook(StringCompareHook
);
1604 if (value
&& PLIsString(value
)) {
1605 path
= FindImage(wPreferences
.icon_path
, PLGetString(value
));
1610 image
= RLoadImage(WMScreenRContext(scr
), path
, 0);
1612 pix
= WMCreatePixmapFromRImage(scr
, image
, 0);
1613 RDestroyImage(image
);
1628 wShowCrashingDialogPanel(int whatSig
)
1634 int screen_no
, scr_width
, scr_height
;
1638 panel
= wmalloc(sizeof(CrashPanel
));
1639 memset(panel
, 0, sizeof(CrashPanel
));
1641 screen_no
= DefaultScreen(dpy
);
1642 scr_width
= WidthOfScreen(ScreenOfDisplay(dpy
, screen_no
));
1643 scr_height
= HeightOfScreen(ScreenOfDisplay(dpy
, screen_no
));
1645 scr
= WMCreateScreen(dpy
, screen_no
);
1647 wsyserror(_("cannot open connection for crashing dialog panel. Aborting."));
1651 panel
->retKey
= XKeysymToKeycode(dpy
, XK_Return
);
1653 panel
->win
= WMCreateWindow(scr
, "crashingDialog");
1654 WMResizeWidget(panel
->win
, PWIDTH
, PHEIGHT
);
1655 WMMoveWidget(panel
->win
, (scr_width
- PWIDTH
)/2, (scr_height
- PHEIGHT
)/2);
1657 logo
= getWindowMakerIconImage(scr
);
1659 panel
->iconL
= WMCreateLabel(panel
->win
);
1660 WMResizeWidget(panel
->iconL
, 64, 64);
1661 WMMoveWidget(panel
->iconL
, 10, 10);
1662 WMSetLabelImagePosition(panel
->iconL
, WIPImageOnly
);
1663 WMSetLabelImage(panel
->iconL
, logo
);
1666 panel
->nameL
= WMCreateLabel(panel
->win
);
1667 WMResizeWidget(panel
->nameL
, 190, 18);
1668 WMMoveWidget(panel
->nameL
, 80, 35);
1669 WMSetLabelTextAlignment(panel
->nameL
, WALeft
);
1670 font
= WMBoldSystemFontOfSize(scr
, 18);
1671 WMSetLabelFont(panel
->nameL
, font
);
1672 WMReleaseFont(font
);
1673 WMSetLabelText(panel
->nameL
, _("Fatal error"));
1675 panel
->sepF
= WMCreateFrame(panel
->win
);
1676 WMResizeWidget(panel
->sepF
, PWIDTH
+4, 2);
1677 WMMoveWidget(panel
->sepF
, -2, 80);
1679 panel
->noteL
= WMCreateLabel(panel
->win
);
1680 WMResizeWidget(panel
->noteL
, PWIDTH
-20, 40);
1681 WMMoveWidget(panel
->noteL
, 10, 90);
1682 WMSetLabelTextAlignment(panel
->noteL
, WAJustified
);
1683 #ifdef SYS_SIGLIST_DECLARED
1684 sprintf(buf
, _("Window Maker received signal %i\n(%s)."),
1685 whatSig
, sys_siglist
[whatSig
]);
1687 sprintf(buf
, _("Window Maker received signal %i."), whatSig
);
1689 WMSetLabelText(panel
->noteL
, buf
);
1691 panel
->note2L
= WMCreateLabel(panel
->win
);
1692 WMResizeWidget(panel
->note2L
, PWIDTH
-20, 100);
1693 WMMoveWidget(panel
->note2L
, 10, 130);
1694 WMSetLabelTextAlignment(panel
->note2L
, WALeft
);
1695 WMSetLabelText(panel
->note2L
,
1696 _(" This fatal error occured probably due to a bug."
1697 " Please fill the included BUGFORM and "
1698 "report it to bugs@windowmaker.org."));
1699 WMSetLabelWraps(panel
->note2L
, True
);
1702 panel
->whatF
= WMCreateFrame(panel
->win
);
1703 WMResizeWidget(panel
->whatF
, PWIDTH
-20, 50);
1704 WMMoveWidget(panel
->whatF
, 10, 240);
1705 WMSetFrameTitle(panel
->whatF
, _("What do you want to do now?"));
1707 panel
->whatP
= WMCreatePopUpButton(panel
->whatF
);
1708 WMResizeWidget(panel
->whatP
, PWIDTH
-20-70, 20);
1709 WMMoveWidget(panel
->whatP
, 35, 20);
1710 WMSetPopUpButtonPullsDown(panel
->whatP
, False
);
1711 WMSetPopUpButtonText(panel
->whatP
, _("Select action"));
1712 WMAddPopUpButtonItem(panel
->whatP
, _("Abort and leave a core file"));
1713 WMAddPopUpButtonItem(panel
->whatP
, _("Restart Window Maker"));
1714 WMAddPopUpButtonItem(panel
->whatP
, _("Start alternate window manager"));
1715 WMSetPopUpButtonAction(panel
->whatP
, setCrashAction
, panel
);
1716 WMSetPopUpButtonSelectedItem(panel
->whatP
, WMRestart
);
1717 panel
->action
= WMRestart
;
1719 WMMapSubwidgets(panel
->whatF
);
1721 panel
->okB
= WMCreateCommandButton(panel
->win
);
1722 WMResizeWidget(panel
->okB
, 80, 26);
1723 WMMoveWidget(panel
->okB
, 205, 309);
1724 WMSetButtonText(panel
->okB
, _("OK"));
1725 WMSetButtonImage(panel
->okB
, WMGetSystemPixmap(scr
, WSIReturnArrow
));
1726 WMSetButtonAltImage(panel
->okB
, WMGetSystemPixmap(scr
, WSIHighlightedReturnArrow
));
1727 WMSetButtonImagePosition(panel
->okB
, WIPRight
);
1728 WMSetButtonAction(panel
->okB
, okButtonCallback
, panel
);
1732 WMCreateEventHandler(WMWidgetView(panel
->win
), KeyPressMask
,
1733 handleKeyPress
, panel
);
1735 WMRealizeWidget(panel
->win
);
1736 WMMapSubwidgets(panel
->win
);
1738 WMMapWidget(panel
->win
);
1740 XSetInputFocus(dpy
, WMWidgetXID(panel
->win
), RevertToParent
, CurrentTime
);
1742 while (!panel
->done
) {
1745 WMNextEvent(dpy
, &event
);
1746 WMHandleEvent(&event
);
1749 action
= panel
->action
;
1751 WMUnmapWidget(panel
->win
);
1752 WMDestroyWidget(panel
->win
);
1761 /*****************************************************************************
1762 * About GNUstep Panel
1763 *****************************************************************************/
1767 drawGNUstepLogo(Display
*dpy
, Drawable d
, int width
, int height
,
1768 unsigned long blackPixel
, unsigned long whitePixel
)
1772 XRectangle rects
[3];
1774 gcv
.foreground
= blackPixel
;
1775 gc
= XCreateGC(dpy
, d
, GCForeground
, &gcv
);
1777 XFillArc(dpy
, d
, gc
, width
/45, height
/45,
1778 width
- 2*width
/45, height
- 2*height
/45, 0, 360*64);
1781 rects
[0].y
= 37*height
/45;
1782 rects
[0].width
= width
/3;
1783 rects
[0].height
= height
- rects
[0].y
;
1785 rects
[1].x
= rects
[0].width
;
1786 rects
[1].y
= height
/2;
1787 rects
[1].width
= width
- 2*width
/3;
1788 rects
[1].height
= height
- rects
[1].y
;
1790 rects
[2].x
= 2*width
/3;
1791 rects
[2].y
= height
- 37*height
/45;
1792 rects
[2].width
= width
/3;
1793 rects
[2].height
= height
- rects
[2].y
;
1795 XSetClipRectangles(dpy
, gc
, 0, 0, rects
, 3, Unsorted
);
1796 XFillRectangle(dpy
, d
, gc
, 0, 0, width
, height
);
1798 XSetForeground(dpy
, gc
, whitePixel
);
1799 XFillArc(dpy
, d
, gc
, width
/45, height
/45,
1800 width
- 2*width
/45, height
- 2*height
/45, 0, 360*64);
1818 static GNUstepPanel
*gnustepPanel
= NULL
;
1821 destroyGNUstepPanel(WCoreWindow
*foo
, void *data
, XEvent
*event
)
1823 WMUnmapWidget(gnustepPanel
->win
);
1825 WMDestroyWidget(gnustepPanel
->win
);
1827 wUnmanageWindow(gnustepPanel
->wwin
, False
, False
);
1829 wfree(gnustepPanel
);
1831 gnustepPanel
= NULL
;
1836 wShowGNUstepPanel(WScreen
*scr
)
1838 GNUstepPanel
*panel
;
1845 if (gnustepPanel
->scr
== scr
) {
1846 wRaiseFrame(gnustepPanel
->wwin
->frame
->core
);
1847 wSetFocusTo(scr
, gnustepPanel
->wwin
);
1852 panel
= wmalloc(sizeof(GNUstepPanel
));
1856 panel
->win
= WMCreateWindow(scr
->wmscreen
, "About GNUstep");
1857 WMResizeWidget(panel
->win
, 325, 200);
1859 pixmap
= WMCreatePixmap(scr
->wmscreen
, 130, 130,
1860 WMScreenDepth(scr
->wmscreen
), True
);
1862 color
= WMCreateNamedColor(scr
->wmscreen
, "gray50", True
);
1864 drawGNUstepLogo(dpy
, WMGetPixmapXID(pixmap
), 130, 130,
1865 WMColorPixel(color
), scr
->white_pixel
);
1867 WMReleaseColor(color
);
1869 XSetForeground(dpy
, scr
->mono_gc
, 0);
1870 XFillRectangle(dpy
, WMGetPixmapMaskXID(pixmap
), scr
->mono_gc
, 0, 0,
1872 drawGNUstepLogo(dpy
, WMGetPixmapMaskXID(pixmap
), 130, 130, 1, 1);
1874 panel
->gstepL
= WMCreateLabel(panel
->win
);
1875 WMResizeWidget(panel
->gstepL
, 285, 64);
1876 WMMoveWidget(panel
->gstepL
, 20, 0);
1877 WMSetLabelTextAlignment(panel
->gstepL
, WARight
);
1878 WMSetLabelText(panel
->gstepL
, "GNUstep");
1880 WMFont
*font
= WMBoldSystemFontOfSize(scr
->wmscreen
, 24);
1882 WMSetLabelFont(panel
->gstepL
, font
);
1883 WMReleaseFont(font
);
1886 panel
->textL
= WMCreateLabel(panel
->win
);
1887 WMResizeWidget(panel
->textL
, 275, 130);
1888 WMMoveWidget(panel
->textL
, 30, 50);
1889 WMSetLabelTextAlignment(panel
->textL
, WARight
);
1890 WMSetLabelImagePosition(panel
->textL
, WIPOverlaps
);
1891 WMSetLabelText(panel
->textL
,
1892 _("Window Maker is part of the GNUstep project.\n"\
1893 "The GNUstep project aims to create a free\n"\
1894 "implementation of the OpenStep(tm) specification\n"\
1895 "which is a object-oriented framework for\n"\
1896 "creating advanced graphical, multi-platform\n"\
1897 "applications. Additionally, a development and\n"\
1898 "user desktop enviroment will be created on top\n"\
1899 "of the framework. For more information about\n"\
1900 "GNUstep, please visit: www.gnustep.org"));
1901 WMSetLabelImage(panel
->textL
, pixmap
);
1903 WMReleasePixmap(pixmap
);
1905 WMRealizeWidget(panel
->win
);
1906 WMMapSubwidgets(panel
->win
);
1908 parent
= XCreateSimpleWindow(dpy
, scr
->root_win
, 0, 0, 325, 200, 0, 0, 0);
1910 XReparentWindow(dpy
, WMWidgetXID(panel
->win
), parent
, 0, 0);
1912 wwin
= wManageInternalWindow(scr
, parent
, None
, _("About GNUstep"),
1913 (scr
->scr_width
- 325)/2,
1914 (scr
->scr_height
- 200)/2, 325, 200);
1916 WSETUFLAG(wwin
, no_closable
, 0);
1917 WSETUFLAG(wwin
, no_close_button
, 0);
1918 wWindowUpdateButtonImages(wwin
);
1919 wFrameWindowShowButton(wwin
->frame
, WFF_RIGHT_BUTTON
);
1920 #ifdef XKB_BUTTON_HINT
1921 wFrameWindowHideButton(wwin
->frame
, WFF_LANGUAGE_BUTTON
);
1923 wwin
->frame
->on_click_right
= destroyGNUstepPanel
;
1927 WMMapWidget(panel
->win
);
1931 gnustepPanel
= panel
;