diff --git a/WPrefs.app/KeyboardShortcuts.c b/WPrefs.app/KeyboardShortcuts.c index 52c395e9..b70146e1 100644 --- a/WPrefs.app/KeyboardShortcuts.c +++ b/WPrefs.app/KeyboardShortcuts.c @@ -156,6 +156,7 @@ static const struct { { "WindowRelaunchKey", N_("Launch new instance of application") }, { "ScreenSwitchKey", N_("Switch to Next Screen/Monitor") }, { "RunKey", N_("Run application") }, + { "ExitKey", N_("Exit Window Maker") }, { "DockRaiseLowerKey", N_("Raise/Lower Dock") }, { "ClipRaiseLowerKey", N_("Raise/Lower Clip") } #ifdef XKB_MODELOCK diff --git a/WindowMaker/Defaults/WindowMaker.in b/WindowMaker/Defaults/WindowMaker.in index eb5ccc14..71575507 100644 --- a/WindowMaker/Defaults/WindowMaker.in +++ b/WindowMaker/Defaults/WindowMaker.in @@ -232,6 +232,7 @@ WindowRelaunchKey = None; ScreenSwitchKey = None; RunKey = None; + ExitKey = None; NormalCursor = (builtin, left_ptr); ArrowCursor = (builtin, top_left_arrow); MoveCursor = (builtin, fleur); diff --git a/src/defaults.c b/src/defaults.c index 469809f1..ebe8f782 100644 --- a/src/defaults.c +++ b/src/defaults.c @@ -788,6 +788,8 @@ WDefaultEntry optionList[] = { NULL, getKeybind, setKeyGrab, NULL, NULL}, {"RunKey", "None", (void *)WKBD_RUN, NULL, getKeybind, setKeyGrab, NULL, NULL}, + {"ExitKey", "None", (void *)WKBD_EXIT, + NULL, getKeybind, setKeyGrab, NULL, NULL}, #ifdef KEEP_XKB_LOCK_STATUS {"ToggleKbdModeKey", "None", (void *)WKBD_TOGGLE, diff --git a/src/event.c b/src/event.c index bfcead1c..f0958274 100644 --- a/src/event.c +++ b/src/event.c @@ -1856,6 +1856,13 @@ static void handleKeyPress(XEvent * event) break; } + case WKBD_EXIT: + { + /* quick mode is not allowed to prevent inadvertently call */ + ExecuteExitCommand(scr, 0); + break; + } + case WKBD_NEXTWSLAYER: case WKBD_PREVWSLAYER: { diff --git a/src/keybind.h b/src/keybind.h index fe8d4c95..c2b5dbb8 100644 --- a/src/keybind.h +++ b/src/keybind.h @@ -145,6 +145,9 @@ enum { /* open "run" dialog */ WKBD_RUN, + /* open "exit" dialog */ + WKBD_EXIT, + #ifdef KEEP_XKB_LOCK_STATUS WKBD_TOGGLE, #endif diff --git a/src/misc.c b/src/misc.c index 9d82423d..4c7fa3a5 100644 --- a/src/misc.c +++ b/src/misc.c @@ -53,6 +53,7 @@ #include "xmodifier.h" #include "main.h" #include "event.h" +#include "shutdown.h" #define ICON_SIZE wPreferences.icon_size @@ -679,6 +680,46 @@ char *ExpandOptions(WScreen *scr, const char *cmdline) return NULL; } +void ExecuteExitCommand(WScreen *scr, long quickmode) +{ + static int inside = 0; + int result; + + /* prevent reentrant calls */ + if (inside) + return; + inside = 1; + +#define R_CANCEL 0 +#define R_EXIT 1 + + result = R_CANCEL; + + if (quickmode == M_QUICK) { + result = R_EXIT; + } else { + int r, oldSaveSessionFlag; + + oldSaveSessionFlag = wPreferences.save_session_on_exit; + r = wExitDialog(scr, _("Exit"), + _("Are you sure you want to quit Window Maker?"), _("Exit"), _("Cancel"), NULL); + + if (r == WAPRDefault) { + result = R_EXIT; + } else if (r == WAPRAlternate) { + /* Don't modify the "save session on exit" flag if the + * user canceled the operation. */ + wPreferences.save_session_on_exit = oldSaveSessionFlag; + } + } + if (result == R_EXIT) + Shutdown(WSExitMode); + +#undef R_EXIT +#undef R_CANCEL + inside = 0; +} + void ExecuteInputCommand(WScreen *scr, const char *cmdline) { char *cmd; diff --git a/src/misc.h b/src/misc.h index fb360380..4809f24a 100644 --- a/src/misc.h +++ b/src/misc.h @@ -25,6 +25,8 @@ #include "keybind.h" #include "appicon.h" +#define M_QUICK 1 + Bool wFetchName(Display *dpy, Window win, char **winname); Bool wGetIconName(Display *dpy, Window win, char **iconname); Bool UpdateDomainFile(WDDomain * domain); @@ -46,6 +48,7 @@ char *ShrinkString(WMFont *font, const char *string, int width); char *FindImage(const char *paths, const char *file); char *ExpandOptions(WScreen * scr, const char *cmdline); void ExecuteInputCommand(WScreen *scr, const char *cmdline); +void ExecuteExitCommand(WScreen *scr, long quickmode); char *GetShortcutString(const char *text); char *GetShortcutKey(WShortKey key); char *EscapeWM_CLASS(const char *name, const char *class); diff --git a/src/rootmenu.c b/src/rootmenu.c index e31e7ff9..d3d5b744 100644 --- a/src/rootmenu.c +++ b/src/rootmenu.c @@ -142,8 +142,6 @@ static Shortcut *shortcutList = NULL; * */ -#define M_QUICK 1 - /* menu commands */ static void execCommand(WMenu * menu, WMenuEntry * entry) @@ -153,42 +151,8 @@ static void execCommand(WMenu * menu, WMenuEntry * entry) static void exitCommand(WMenu * menu, WMenuEntry * entry) { - static int inside = 0; - int result; + ExecuteExitCommand(menu->frame->screen_ptr, (long)entry->clientdata); - /* prevent reentrant calls */ - if (inside) - return; - inside = 1; - -#define R_CANCEL 0 -#define R_EXIT 1 - - result = R_CANCEL; - - if ((long)entry->clientdata == M_QUICK) { - result = R_EXIT; - } else { - int r, oldSaveSessionFlag; - - oldSaveSessionFlag = wPreferences.save_session_on_exit; - r = wExitDialog(menu->frame->screen_ptr, _("Exit"), - _("Are you sure you want to quit Window Maker?"), _("Exit"), _("Cancel"), NULL); - - if (r == WAPRDefault) { - result = R_EXIT; - } else if (r == WAPRAlternate) { - /* Don't modify the "save session on exit" flag if the - * user canceled the operation. */ - wPreferences.save_session_on_exit = oldSaveSessionFlag; - } - } - if (result == R_EXIT) - Shutdown(WSExitMode); - -#undef R_EXIT -#undef R_CANCEL - inside = 0; } static void shutdownCommand(WMenu * menu, WMenuEntry * entry)