diff --git a/direct/src/showbase/ShowBase.py b/direct/src/showbase/ShowBase.py index 05666e898c..fab41c986e 100644 --- a/direct/src/showbase/ShowBase.py +++ b/direct/src/showbase/ShowBase.py @@ -75,6 +75,11 @@ class ShowBase(DirectObject.DirectObject): # Setup wantVerifyPdb as soon as reasonable: Verify.wantVerifyPdb = self.config.GetBool('want-verify-pdb', 0) + # [gjeon] to disable sticky keys + storeAccessibilityShortcutKeys() + if self.config.GetBool('disable-sticky-keys', 0): + allowAccessibilityShortcutKeys(False) + self.printEnvDebugInfo() vfs = VirtualFileSystem.getGlobalPtr() @@ -418,6 +423,9 @@ class ShowBase(DirectObject.DirectObject): This function is designed to be safe to call multiple times.""" + # [gjeon] restore sticky key settings + allowAccessibilityShortcutKeys(True) + taskMgr.destroy() if getattr(self, 'musicManager', None): diff --git a/direct/src/showbase/Sources.pp b/direct/src/showbase/Sources.pp index 3edaf0dbaa..271ad22b63 100644 --- a/direct/src/showbase/Sources.pp +++ b/direct/src/showbase/Sources.pp @@ -12,6 +12,9 @@ interrogatedb:c dconfig:c dtoolconfig:m \ dtoolutil:c dtoolbase:c dtool:m + #define WIN_SYS_LIBS \ + User32.lib + #define SOURCES \ showBase.cxx showBase.h diff --git a/direct/src/showbase/showBase.cxx b/direct/src/showbase/showBase.cxx index 5b4d1467c2..35a48033dd 100644 --- a/direct/src/showbase/showBase.cxx +++ b/direct/src/showbase/showBase.cxx @@ -20,6 +20,12 @@ #include "camera.h" #include "graphicsPipeSelection.h" +#ifdef WIN32 +#include // For SystemParametersInfo() +STICKYKEYS g_StartupStickyKeys = {sizeof(STICKYKEYS), 0}; +TOGGLEKEYS g_StartupToggleKeys = {sizeof(TOGGLEKEYS), 0}; +FILTERKEYS g_StartupFilterKeys = {sizeof(FILTERKEYS), 0}; +#endif ConfigureDef(config_showbase); ConfigureFn(config_showbase) { @@ -85,6 +91,61 @@ query_fullscreen_testresult(int xsize, int ysize) { return false; } +void +store_accessibility_shortcut_keys() { +#ifdef WIN32 + SystemParametersInfo(SPI_GETSTICKYKEYS, sizeof(STICKYKEYS), &g_StartupStickyKeys, 0); + SystemParametersInfo(SPI_GETTOGGLEKEYS, sizeof(TOGGLEKEYS), &g_StartupToggleKeys, 0); + SystemParametersInfo(SPI_GETFILTERKEYS, sizeof(FILTERKEYS), &g_StartupFilterKeys, 0); +#endif +} + +void +allow_accessibility_shortcut_keys(bool allowKeys) { +#ifdef WIN32 + if( allowKeys ) + { + // Restore StickyKeys/etc to original state and enable Windows key + SystemParametersInfo(SPI_SETSTICKYKEYS, sizeof(STICKYKEYS), &g_StartupStickyKeys, 0); + SystemParametersInfo(SPI_SETTOGGLEKEYS, sizeof(TOGGLEKEYS), &g_StartupToggleKeys, 0); + SystemParametersInfo(SPI_SETFILTERKEYS, sizeof(FILTERKEYS), &g_StartupFilterKeys, 0); + } else { + // Disable StickyKeys/etc shortcuts but if the accessibility feature is on, + // then leave the settings alone as its probably being usefully used + + STICKYKEYS skOff = g_StartupStickyKeys; + if( (skOff.dwFlags & SKF_STICKYKEYSON) == 0 ) + { + // Disable the hotkey and the confirmation + skOff.dwFlags &= ~SKF_HOTKEYACTIVE; + skOff.dwFlags &= ~SKF_CONFIRMHOTKEY; + + SystemParametersInfo(SPI_SETSTICKYKEYS, sizeof(STICKYKEYS), &skOff, 0); + } + + TOGGLEKEYS tkOff = g_StartupToggleKeys; + if( (tkOff.dwFlags & TKF_TOGGLEKEYSON) == 0 ) + { + // Disable the hotkey and the confirmation + tkOff.dwFlags &= ~TKF_HOTKEYACTIVE; + tkOff.dwFlags &= ~TKF_CONFIRMHOTKEY; + + SystemParametersInfo(SPI_SETTOGGLEKEYS, sizeof(TOGGLEKEYS), &tkOff, 0); + } + + FILTERKEYS fkOff = g_StartupFilterKeys; + if( (fkOff.dwFlags & FKF_FILTERKEYSON) == 0 ) + { + // Disable the hotkey and the confirmation + fkOff.dwFlags &= ~FKF_HOTKEYACTIVE; + fkOff.dwFlags &= ~FKF_CONFIRMHOTKEY; + + SystemParametersInfo(SPI_SETFILTERKEYS, sizeof(FILTERKEYS), &fkOff, 0); + } + } +#endif +} + #if 0 int TempGridZoneManager:: add_grid_zone(unsigned int x, diff --git a/direct/src/showbase/showBase.h b/direct/src/showbase/showBase.h index 2c75c6542c..77205a09b5 100644 --- a/direct/src/showbase/showBase.h +++ b/direct/src/showbase/showBase.h @@ -48,6 +48,10 @@ EXPCL_DIRECT void add_fullscreen_testsize(int xsize, int ysize); EXPCL_DIRECT void runtest_fullscreen_sizes(GraphicsWindow *win); EXPCL_DIRECT bool query_fullscreen_testresult(int xsize, int ysize); +// to handle windows stickykeys +EXPCL_DIRECT void store_accessibility_shortcut_keys(); +EXPCL_DIRECT void allow_accessibility_shortcut_keys(bool allowKeys); + END_PUBLISH diff --git a/dtool/src/parser-inc/windows.h b/dtool/src/parser-inc/windows.h index 4f7acf4d3d..fe19e12eb8 100644 --- a/dtool/src/parser-inc/windows.h +++ b/dtool/src/parser-inc/windows.h @@ -39,6 +39,10 @@ typedef WCHAR *BSTR; typedef struct _MediaType AM_MEDIA_TYPE; typedef struct _VIDEO_STREAM_CONFIG_CAPS VIDEO_STREAM_CONFIG_CAPS; typedef struct _GUID GUID; +typedef struct _STICKYKEYS STICKYKEYS; +typedef struct _TOGGLEKEYS TOGGLEKEYS; +typedef struct _FILTERKEYS FILTERKEYS; + #define CALLBACK #define WINAPI