Added a feature for disabling sticky keys in Windows

This commit is contained in:
Gyedo Jeon 2009-04-22 22:43:23 +00:00
parent 72f7489e66
commit e54901c125
5 changed files with 80 additions and 0 deletions

View File

@ -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):

View File

@ -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

View File

@ -20,6 +20,12 @@
#include "camera.h"
#include "graphicsPipeSelection.h"
#ifdef WIN32
#include <windows.h> // 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,

View File

@ -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

View File

@ -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