Add SDL_HINT_WINDOWS_ENABLE_MENU_MNEMONICS.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
diff --git a/include/SDL_hints.h b/include/SDL_hints.h
index 76a74f0..2b42b08 100644
--- a/include/SDL_hints.h
+++ b/include/SDL_hints.h
@@ -1955,6 +1955,28 @@ extern "C" {
#define SDL_HINT_WINDOWS_DISABLE_THREAD_NAMING "SDL_WINDOWS_DISABLE_THREAD_NAMING"
/**
+ * \brief Controls whether menus can be opened with their keyboard shortcut (Alt+mnemonic).
+ *
+ * If the mnemonics are enabled, then menus can be opened by pressing the Alt
+ * key and the corresponding mnemonic (for example, Alt+F opens the File menu).
+ * However, in case an invalid mnemonic is pressed, Windows makes an audible
+ * beep to convey that nothing happened. This is true even if the window has
+ * no menu at all!
+ *
+ * Because most SDL applications don't have menus, and some want to use the Alt
+ * key for other purposes, SDL disables mnemonics (and the beeping) by default.
+ *
+ * Note: This also affects keyboard events: with mnemonics enabled, when a
+ * menu is opened from the keyboard, you will not receive a KEYUP event for
+ * the mnemonic key, and *might* not receive one for Alt.
+ *
+ * This variable can be set to the following values:
+ * "0" - Alt+mnemonic does nothing, no beeping. (default)
+ * "1" - Alt+mnemonic opens menus, invalid mnemonics produce a beep.
+ */
+#define SDL_HINT_WINDOWS_ENABLE_MENU_MNEMONICS "SDL_WINDOWS_ENABLE_MENU_MNEMONICS"
+
+/**
* \brief A variable controlling whether the windows message loop is processed by SDL
*
* This variable can be set to the following values:
diff --git a/src/video/windows/SDL_windowsevents.c b/src/video/windows/SDL_windowsevents.c
index 269046e..b73ccd0 100644
--- a/src/video/windows/SDL_windowsevents.c
+++ b/src/video/windows/SDL_windowsevents.c
@@ -1316,8 +1316,10 @@ WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
case WM_SYSCOMMAND:
{
- if ((wParam & 0xFFF0) == SC_KEYMENU) {
- return 0;
+ if (!g_WindowsEnableMenuMnemonics) {
+ if ((wParam & 0xFFF0) == SC_KEYMENU) {
+ return 0;
+ }
}
#if defined(SC_SCREENSAVE) || defined(SC_MONITORPOWER)
diff --git a/src/video/windows/SDL_windowsvideo.c b/src/video/windows/SDL_windowsvideo.c
index 32e0caf..7bc0392 100644
--- a/src/video/windows/SDL_windowsvideo.c
+++ b/src/video/windows/SDL_windowsvideo.c
@@ -29,6 +29,7 @@
#include "SDL_system.h"
#include "../SDL_sysvideo.h"
#include "../SDL_pixels_c.h"
+#include "../../SDL_hints_c.h"
#include "SDL_windowsvideo.h"
#include "SDL_windowsframebuffer.h"
@@ -43,24 +44,22 @@ static void WIN_VideoQuit(_THIS);
/* Hints */
SDL_bool g_WindowsEnableMessageLoop = SDL_TRUE;
+SDL_bool g_WindowsEnableMenuMnemonics = SDL_FALSE;
SDL_bool g_WindowFrameUsableWhileCursorHidden = SDL_TRUE;
static void SDLCALL UpdateWindowsEnableMessageLoop(void *userdata, const char *name, const char *oldValue, const char *newValue)
{
- if (newValue && *newValue == '0') {
- g_WindowsEnableMessageLoop = SDL_FALSE;
- } else {
- g_WindowsEnableMessageLoop = SDL_TRUE;
- }
+ g_WindowsEnableMessageLoop = SDL_GetStringBoolean(newValue, SDL_TRUE);
+}
+
+static void SDLCALL UpdateWindowsEnableMenuMnemonics(void *userdata, const char *name, const char *oldValue, const char *newValue)
+{
+ g_WindowsEnableMenuMnemonics = SDL_GetStringBoolean(newValue, SDL_FALSE);
}
static void SDLCALL UpdateWindowFrameUsableWhileCursorHidden(void *userdata, const char *name, const char *oldValue, const char *newValue)
{
- if (newValue && *newValue == '0') {
- g_WindowFrameUsableWhileCursorHidden = SDL_FALSE;
- } else {
- g_WindowFrameUsableWhileCursorHidden = SDL_TRUE;
- }
+ g_WindowFrameUsableWhileCursorHidden = SDL_GetStringBoolean(newValue, SDL_TRUE);
}
#if !defined(__XBOXONE__) && !defined(__XBOXSERIES__)
@@ -448,6 +447,7 @@ int WIN_VideoInit(_THIS)
#endif
SDL_AddHintCallback(SDL_HINT_WINDOWS_ENABLE_MESSAGELOOP, UpdateWindowsEnableMessageLoop, NULL);
+ SDL_AddHintCallback(SDL_HINT_WINDOWS_ENABLE_MENU_MNEMONICS, UpdateWindowsEnableMenuMnemonics, NULL);
SDL_AddHintCallback(SDL_HINT_WINDOW_FRAME_USABLE_WHILE_CURSOR_HIDDEN, UpdateWindowFrameUsableWhileCursorHidden, NULL);
#if !defined(__XBOXONE__) && !defined(__XBOXSERIES__)
diff --git a/src/video/windows/SDL_windowsvideo.h b/src/video/windows/SDL_windowsvideo.h
index 59d53f4..bf4286d 100644
--- a/src/video/windows/SDL_windowsvideo.h
+++ b/src/video/windows/SDL_windowsvideo.h
@@ -462,6 +462,7 @@ typedef struct SDL_VideoData
} SDL_VideoData;
extern SDL_bool g_WindowsEnableMessageLoop;
+extern SDL_bool g_WindowsEnableMenuMnemonics;
extern SDL_bool g_WindowFrameUsableWhileCursorHidden;
typedef struct IDirect3D9 IDirect3D9;