mirror of
https://github.com/gryf/wmaker.git
synced 2025-12-19 20:38:08 +01:00
rearranged the crashing dialog panel code.
This commit is contained in:
248
src/dialog.c
248
src/dialog.c
@@ -3,6 +3,7 @@
|
||||
* Window Maker window manager
|
||||
*
|
||||
* Copyright (c) 1997, 1998 Alfredo K. Kojima
|
||||
* Copyright (c) 1999 Dan Pascu
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -35,6 +36,12 @@
|
||||
#include <dirent.h>
|
||||
#include <limits.h>
|
||||
|
||||
#include <signal.h>
|
||||
#ifdef __FreeBSD__
|
||||
#include <sys/signal.h>
|
||||
#endif
|
||||
|
||||
|
||||
#ifndef PATH_MAX
|
||||
#define PATH_MAX DEFAULT_PATH_MAX
|
||||
#endif
|
||||
@@ -1258,3 +1265,244 @@ wShowLegalPanel(WScreen *scr)
|
||||
legalPanel = panel;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
***********************************************************************
|
||||
* Crashing Dialog Panel
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
extern WDDomain *WDWindowAttributes;
|
||||
|
||||
|
||||
typedef struct _CrashPanel {
|
||||
WMWindow *win; /* main window */
|
||||
|
||||
WMLabel *iconL; /* application icon */
|
||||
WMLabel *nameL; /* title of panel */
|
||||
|
||||
WMFrame *sepF; /* separator frame */
|
||||
|
||||
WMLabel *noteL; /* Title of note */
|
||||
WMLabel *note2L; /* body of note with what happened */
|
||||
|
||||
WMFrame *whatF; /* "what to do next" frame */
|
||||
WMPopUpButton *whatP; /* action selection popup button */
|
||||
|
||||
WMButton *okB; /* ok button */
|
||||
|
||||
Bool done; /* if finished with this dialog */
|
||||
int action; /* what to do after */
|
||||
|
||||
KeyCode retKey;
|
||||
|
||||
} CrashPanel;
|
||||
|
||||
|
||||
static void
|
||||
handleKeyPress(XEvent *event, void *clientData)
|
||||
{
|
||||
CrashPanel *panel = (CrashPanel*)clientData;
|
||||
|
||||
if (event->xkey.keycode == panel->retKey) {
|
||||
WMPerformButtonClick(panel->okB);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
okButtonCallback(void *self, void *clientData)
|
||||
{
|
||||
CrashPanel *panel = (CrashPanel*)clientData;
|
||||
|
||||
panel->done = True;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
setCrashAction(void *self, void *clientData)
|
||||
{
|
||||
WMPopUpButton *pop = (WMPopUpButton*)self;
|
||||
CrashPanel *panel = (CrashPanel*)clientData;
|
||||
|
||||
panel->action = WMGetPopUpButtonSelectedItem(pop);
|
||||
}
|
||||
|
||||
|
||||
static WMPixmap*
|
||||
getWindowMakerIconImage(WMScreen *scr)
|
||||
{
|
||||
proplist_t dict, key, option, value=NULL;
|
||||
WMPixmap *pix=NULL;
|
||||
char *path;
|
||||
|
||||
PLSetStringCmpHook(NULL);
|
||||
|
||||
key = PLMakeString("Logo.WMPanel");
|
||||
option = PLMakeString("Icon");
|
||||
|
||||
dict = PLGetDictionaryEntry(WDWindowAttributes->dictionary, key);
|
||||
|
||||
if (dict) {
|
||||
value = PLGetDictionaryEntry(dict, option);
|
||||
}
|
||||
|
||||
PLRelease(key);
|
||||
PLRelease(option);
|
||||
|
||||
PLSetStringCmpHook(StringCompareHook);
|
||||
|
||||
if (value && PLIsString(value)) {
|
||||
path = FindImage(wPreferences.icon_path, PLGetString(value));
|
||||
|
||||
if (path) {
|
||||
RImage *image;
|
||||
|
||||
image = RLoadImage(WMScreenRContext(scr), path, 0);
|
||||
if (image) {
|
||||
pix = WMCreatePixmapFromRImage(scr, image, 0);
|
||||
RDestroyImage(image);
|
||||
}
|
||||
free(path);
|
||||
}
|
||||
}
|
||||
|
||||
return pix;
|
||||
}
|
||||
|
||||
|
||||
#define PWIDTH 295
|
||||
#define PHEIGHT 345
|
||||
|
||||
|
||||
int
|
||||
wShowCrashingDialogPanel(int whatSig)
|
||||
{
|
||||
CrashPanel *panel;
|
||||
WMScreen *scr;
|
||||
WMFont *font;
|
||||
WMPixmap *logo;
|
||||
int screen_no, scr_width, scr_height;
|
||||
int action;
|
||||
char buf[256];
|
||||
|
||||
panel = wmalloc(sizeof(CrashPanel));
|
||||
memset(panel, 0, sizeof(CrashPanel));
|
||||
|
||||
screen_no = DefaultScreen(dpy);
|
||||
scr_width = WidthOfScreen(ScreenOfDisplay(dpy, screen_no));
|
||||
scr_height = HeightOfScreen(ScreenOfDisplay(dpy, screen_no));
|
||||
|
||||
scr = WMCreateScreen(dpy, screen_no);
|
||||
if (!scr) {
|
||||
wsyserror(_("cannot open connection for crashing dialog panel. Aborting."));
|
||||
return WMAbort;
|
||||
}
|
||||
|
||||
panel->retKey = XKeysymToKeycode(dpy, XK_Return);
|
||||
|
||||
panel->win = WMCreateWindow(scr, "crashingDialog");
|
||||
WMResizeWidget(panel->win, PWIDTH, PHEIGHT);
|
||||
WMMoveWidget(panel->win, (scr_width - PWIDTH)/2, (scr_height - PHEIGHT)/2);
|
||||
|
||||
logo = getWindowMakerIconImage(scr);
|
||||
if (logo) {
|
||||
panel->iconL = WMCreateLabel(panel->win);
|
||||
WMResizeWidget(panel->iconL, 64, 64);
|
||||
WMMoveWidget(panel->iconL, 10, 10);
|
||||
WMSetLabelImagePosition(panel->iconL, WIPImageOnly);
|
||||
WMSetLabelImage(panel->iconL, logo);
|
||||
}
|
||||
|
||||
panel->nameL = WMCreateLabel(panel->win);
|
||||
WMResizeWidget(panel->nameL, 190, 18);
|
||||
WMMoveWidget(panel->nameL, 80, 35);
|
||||
WMSetLabelTextAlignment(panel->nameL, WALeft);
|
||||
font = WMBoldSystemFontOfSize(scr, 18);
|
||||
WMSetLabelFont(panel->nameL, font);
|
||||
WMReleaseFont(font);
|
||||
WMSetLabelText(panel->nameL, _("Fatal error"));
|
||||
|
||||
panel->sepF = WMCreateFrame(panel->win);
|
||||
WMResizeWidget(panel->sepF, PWIDTH+4, 2);
|
||||
WMMoveWidget(panel->sepF, -2, 80);
|
||||
|
||||
panel->noteL = WMCreateLabel(panel->win);
|
||||
WMResizeWidget(panel->noteL, PWIDTH-20, 40);
|
||||
WMMoveWidget(panel->noteL, 10, 90);
|
||||
WMSetLabelTextAlignment(panel->noteL, WAJustified);
|
||||
#ifdef SYS_SIGLIST_DECLARED
|
||||
sprintf(buf, _("Window Maker received signal %i\n(%s)."),
|
||||
whatSig, sys_siglist[whatSig]);
|
||||
#else
|
||||
sprintf(buf, _("Window Maker received signal %i."), whatSig);
|
||||
#endif
|
||||
WMSetLabelText(panel->noteL, buf);
|
||||
|
||||
panel->note2L = WMCreateLabel(panel->win);
|
||||
WMResizeWidget(panel->note2L, PWIDTH-20, 100);
|
||||
WMMoveWidget(panel->note2L, 10, 130);
|
||||
WMSetLabelTextAlignment(panel->note2L, WALeft);
|
||||
WMSetLabelText(panel->note2L,
|
||||
_(" This fatal error occured probably due to a bug."
|
||||
" Please fill the included BUGFORM and "
|
||||
"report it to bugs@windowmaker.org."));
|
||||
|
||||
|
||||
panel->whatF = WMCreateFrame(panel->win);
|
||||
WMResizeWidget(panel->whatF, PWIDTH-20, 50);
|
||||
WMMoveWidget(panel->whatF, 10, 240);
|
||||
WMSetFrameTitle(panel->whatF, _("What do you want to do now?"));
|
||||
|
||||
panel->whatP = WMCreatePopUpButton(panel->whatF);
|
||||
WMResizeWidget(panel->whatP, PWIDTH-20-70, 20);
|
||||
WMMoveWidget(panel->whatP, 35, 20);
|
||||
WMSetPopUpButtonPullsDown(panel->whatP, False);
|
||||
WMSetPopUpButtonText(panel->whatP, _("Select action"));
|
||||
WMAddPopUpButtonItem(panel->whatP, _("Abort and leave a core file"));
|
||||
WMAddPopUpButtonItem(panel->whatP, _("Restart Window Maker"));
|
||||
WMAddPopUpButtonItem(panel->whatP, _("Start alternate window manager"));
|
||||
WMSetPopUpButtonAction(panel->whatP, setCrashAction, panel);
|
||||
WMSetPopUpButtonSelectedItem(panel->whatP, WMRestart);
|
||||
panel->action = WMRestart;
|
||||
|
||||
WMMapSubwidgets(panel->whatF);
|
||||
|
||||
panel->okB = WMCreateCommandButton(panel->win);
|
||||
WMResizeWidget(panel->okB, 80, 26);
|
||||
WMMoveWidget(panel->okB, 205, 309);
|
||||
WMSetButtonText(panel->okB, _("OK"));
|
||||
WMSetButtonImage(panel->okB, WMGetSystemPixmap(scr, WSIReturnArrow));
|
||||
WMSetButtonAltImage(panel->okB, WMGetSystemPixmap(scr, WSIHighlightedReturnArrow));
|
||||
WMSetButtonImagePosition(panel->okB, WIPRight);
|
||||
WMSetButtonAction(panel->okB, okButtonCallback, panel);
|
||||
|
||||
panel->done = 0;
|
||||
|
||||
WMCreateEventHandler(WMWidgetView(panel->win), KeyPressMask,
|
||||
handleKeyPress, panel);
|
||||
|
||||
WMRealizeWidget(panel->win);
|
||||
WMMapSubwidgets(panel->win);
|
||||
|
||||
WMMapWidget(panel->win);
|
||||
|
||||
XSetInputFocus(dpy, WMWidgetXID(panel->win), RevertToParent, CurrentTime);
|
||||
|
||||
while (!panel->done) {
|
||||
XEvent event;
|
||||
|
||||
WMNextEvent(dpy, &event);
|
||||
WMHandleEvent(&event);
|
||||
}
|
||||
|
||||
action = panel->action;
|
||||
|
||||
WMUnmapWidget(panel->win);
|
||||
WMDestroyWidget(panel->win);
|
||||
free(panel);
|
||||
|
||||
return action;
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user