Implemented basic handling of assessibility actions.
diff --git a/include/winuser.h b/include/winuser.h
index 68434e0..c8b4527 100644
--- a/include/winuser.h
+++ b/include/winuser.h
@@ -62,6 +62,169 @@
typedef HANDLE HDWP;
+/* flags for FILTERKEYS dwFlags field */
+#define FKF_AVAILABLE 0x00000002
+#define FKF_CLICKON 0x00000040
+#define FKF_FILTERKEYSON 0x00000001
+#define FKF_HOTKEYACTIVE 0x00000004
+#define FKF_HOTKEYSOUND 0x00000010
+#define FKF_CONFIRMHOTKEY 0x00000008
+#define FKF_INDICATOR 0x00000020
+
+typedef struct tagFILTERKEYS
+{
+ UINT cbSize;
+ DWORD dwFlags;
+ DWORD iWaitMSec;
+ DWORD iDelayMSec;
+ DWORD iRepeatMSec;
+ DWORD iBounceMSec;
+} FILTERKEYS, *PFILTERKEYS, *LPFILTERKEYS;
+
+/* flags for TOGGLEKEYS dwFlags field */
+#define TKF_AVAILABLE 0x00000002
+#define TKF_CONFIRMHOTKEY 0x00000008
+#define TKF_HOTKEYACTIVE 0x00000004
+#define TKF_HOTKEYSOUND 0x00000010
+#define TKF_TOGGLEKEYSON 0x00000001
+
+typedef struct tagTOGGLEKEYS
+{
+ DWORD cbSize;
+ DWORD dwFlags;
+} TOGGLEKEYS, *PTOGGLEKEYS, *LPTOGGLEKEYS;
+
+/* flags for MOUSEKEYS dwFlags field */
+#define MKF_AVAILABLE 0x00000002
+#define MKF_CONFIRMHOTKEY 0x00000008
+#define MKF_HOTKEYACTIVE 0x00000004
+#define MKF_HOTKEYSOUND 0x00000010
+#define MKF_INDICATOR 0x00000020
+#define MKF_MOUSEKEYSON 0x00000001
+#define MKF_MODIFIERS 0x00000040
+#define MKF_REPLACENUMBERS 0x00000080
+
+typedef struct tagMOUSEKEYS
+{
+ UINT cbSize;
+ DWORD dwFlags;
+ DWORD iMaxSpeed;
+ DWORD iTimeToMaxSpeed;
+ DWORD iCtrlSpeed;
+ DWORD dwReserved1;
+ DWORD dwReserved2;
+} MOUSEKEYS, *PMOUSEKEYS, *LPMOUSEKEYS;
+
+/* flags for STICKYKEYS dwFlags field */
+#define SKF_AUDIBLEFEEDBACK 0x00000040
+#define SKF_AVAILABLE 0x00000002
+#define SKF_CONFIRMHOTKEY 0x00000008
+#define SKF_HOTKEYACTIVE 0x00000004
+#define SKF_HOTKEYSOUND 0x00000010
+#define SKF_INDICATOR 0x00000020
+#define SKF_STICKYKEYSON 0x00000001
+#define SKF_TRISTATE 0x00000080
+#define SKF_TWOKEYSOFF 0x00000100
+
+typedef struct tagSTICKYKEYS
+{
+ DWORD cbSize;
+ DWORD dwFlags;
+} STICKYKEYS, *PSTICKYKEYS, *LPSTICKYKEYS;
+
+/* flags for ACCESSTIMEOUT dwFlags field */
+#define ATF_ONOFFFEEDBACK 0x00000002
+#define ATF_AVAILABLE 0x00000004
+#define ATF_TIMEOUTON 0x00000001
+
+typedef struct tagACCESSTIMEOUT
+{
+ UINT cbSize;
+ DWORD dwFlags;
+ DWORD iTimeOutMSec;
+} ACCESSTIMEOUT, *PACCESSTIMEOUT, *LPACCESSTIMEOUT;
+
+/* flags for SERIALKEYS dwFlags field */
+#define SERKF_ACTIVE 0x00000008
+#define SERKF_AVAILABLE 0x00000002
+#define SERKF_INDICATOR 0x00000004
+#define SERKF_SERIALKEYSON 0x00000001
+
+typedef struct tagSERIALKEYSA
+{
+ UINT cbSize;
+ DWORD dwFlags;
+ LPSTR lpszActivePort;
+ LPSTR lpszPort;
+ UINT iBaudRate;
+ UINT iPortState;
+ UINT iActive;
+} SERIALKEYSA, *LPSERIALKEYSA;
+
+typedef struct tagSERIALKEYSW {
+ UINT cbSize;
+ DWORD dwFlags;
+ LPWSTR lpszActivePort;
+ LPWSTR lpszPort;
+ UINT iBaudRate;
+ UINT iPortState;
+ UINT iActive;
+} SERIALKEYSW,*LPSERIALKEYSW;
+
+DECL_WINELIB_TYPE_AW(SERIALKEYS)
+DECL_WINELIB_TYPE_AW(LPSERIALKEYS)
+
+/* flags for SOUNDSENTRY dwFlags field */
+#define SSF_AVAILABLE 0x00000002
+#define SSF_SOUNDSENTRYON 0x00000001
+
+#define SSTF_BORDER 0x00000002
+#define SSTF_CHARS 0x00000001
+#define SSTF_DISPLAY 0x00000003
+#define SSTF_NONE 0x00000000
+
+#define SSGF_DISPLAY 0x00000003
+#define SSGF_NONE 0x00000000
+
+#define SSWF_DISPLAY 0x00000003
+#define SSWF_NONE 0x00000000
+#define SSWF_TITLE 0x00000001
+#define SSWF_WINDOW 0x00000002
+
+typedef struct tagSOUNDSENTRYA
+{
+ UINT cbSize;
+ DWORD dwFlags;
+ DWORD iFSTextEffect;
+ DWORD iFSTextEffectMSec;
+ DWORD iFSTextEffectColorBits;
+ DWORD iFSGrafEffect;
+ DWORD iFSGrafEffectMSec;
+ DWORD iFSGrafEffectColor;
+ DWORD iWindowsEffect;
+ DWORD iWindowsEffectMSec;
+ LPSTR lpszWindowsEffectDLL;
+ DWORD iWindowsEffectOrdinal;
+} SOUNDSENTRYA, *LPSOUNDSENTRYA;
+
+typedef struct tagSOUNDSENTRYW
+{
+ UINT cbSize;
+ DWORD dwFlags;
+ DWORD iFSTextEffect;
+ DWORD iFSTextEffectMSec;
+ DWORD iFSTextEffectColorBits;
+ DWORD iFSGrafEffect;
+ DWORD iFSGrafEffectMSec;
+ DWORD iFSGrafEffectColor;
+ DWORD iWindowsEffect;
+ DWORD iWindowsEffectMSec;
+ LPWSTR lpszWindowsEffectDLL;
+ DWORD iWindowsEffectOrdinal;
+} SOUNDSENTRYW, *LPSOUNDSENTRYW;
+
+DECL_WINELIB_TYPE_AW(SOUNDSENTRY)
+DECL_WINELIB_TYPE_AW(LPSOUNDSENTRY)
/* flags for HIGHCONTRAST dwFlags field */
#define HCF_HIGHCONTRASTON 0x00000001
@@ -98,7 +261,6 @@
HWND hwnd;
} EVENTMSG, *PEVENTMSG, *LPEVENTMSG;
-
/* WH_KEYBOARD_LL structure */
typedef struct tagKBDLLHOOKSTRUCT
{
diff --git a/windows/sysparams.c b/windows/sysparams.c
index f1eb884..80b991e 100644
--- a/windows/sysparams.c
+++ b/windows/sysparams.c
@@ -1255,12 +1255,66 @@
WINE_SPI_FIXME(SPI_SETPENWINDOWS); /* 49 WINVER >= 0x400 */
- WINE_SPI_FIXME(SPI_GETFILTERKEYS); /* 50 */
+ case SPI_GETFILTERKEYS: /* 50 */
+ {
+ LPFILTERKEYS lpFilterKeys = (LPFILTERKEYS)pvParam;
+ WARN("SPI_GETFILTERKEYS not fully implemented\n");
+ if (lpFilterKeys->cbSize == sizeof(FILTERKEYS))
+ {
+ /* Indicate that no FilterKeys feature available */
+ lpFilterKeys->dwFlags = 0;
+ lpFilterKeys->iWaitMSec = 0;
+ lpFilterKeys->iDelayMSec = 0;
+ lpFilterKeys->iRepeatMSec = 0;
+ lpFilterKeys->iBounceMSec = 0;
+ }
+ else
+ {
+ ret = FALSE;
+ }
+ break;
+ }
WINE_SPI_FIXME(SPI_SETFILTERKEYS); /* 51 */
- WINE_SPI_FIXME(SPI_GETTOGGLEKEYS); /* 52 */
+
+ case SPI_GETTOGGLEKEYS: /* 52 */
+ {
+ LPTOGGLEKEYS lpToggleKeys = (LPTOGGLEKEYS)pvParam;
+ WARN("SPI_GETTOGGLEKEYS not fully implemented\n");
+ if (lpToggleKeys->cbSize == sizeof(TOGGLEKEYS))
+ {
+ /* Indicate that no ToggleKeys feature available */
+ lpToggleKeys->dwFlags = 0;
+ }
+ else
+ {
+ ret = FALSE;
+ }
+ break;
+ }
WINE_SPI_FIXME(SPI_SETTOGGLEKEYS); /* 53 */
- WINE_SPI_FIXME(SPI_GETMOUSEKEYS); /* 54 */
+
+ case SPI_GETMOUSEKEYS: /* 54 */
+ {
+ LPMOUSEKEYS lpMouseKeys = (LPMOUSEKEYS)pvParam;
+ WARN("SPI_GETMOUSEKEYS not fully implemented\n");
+ if (lpMouseKeys->cbSize == sizeof(MOUSEKEYS))
+ {
+ /* Indicate that no MouseKeys feature available */
+ lpMouseKeys->dwFlags = 0;
+ lpMouseKeys->iMaxSpeed = 360;
+ lpMouseKeys->iTimeToMaxSpeed = 1000;
+ lpMouseKeys->iCtrlSpeed = 0;
+ lpMouseKeys->dwReserved1 = 0;
+ lpMouseKeys->dwReserved2 = 0;
+ }
+ else
+ {
+ ret = FALSE;
+ }
+ break;
+ }
WINE_SPI_FIXME(SPI_SETMOUSEKEYS); /* 55 */
+
case SPI_GETSHOWSOUNDS: /* 56 */
spi_idx = SPI_SETSHOWSOUNDS_IDX;
@@ -1297,15 +1351,88 @@
ret = FALSE;
break;
}
- WINE_SPI_FIXME(SPI_GETSTICKYKEYS); /* 58 */
+
+ case SPI_GETSTICKYKEYS: /* 58 */
+ {
+ LPSTICKYKEYS lpStickyKeys = (LPSTICKYKEYS)pvParam;
+ WARN("SPI_GETSTICKYKEYS not fully implemented\n");
+ if (lpStickyKeys->cbSize == sizeof(STICKYKEYS))
+ {
+ /* Indicate that no StickyKeys feature available */
+ lpStickyKeys->dwFlags = 0;
+ }
+ else
+ {
+ ret = FALSE;
+ }
+ break;
+ }
WINE_SPI_FIXME(SPI_SETSTICKYKEYS); /* 59 */
- WINE_SPI_FIXME(SPI_GETACCESSTIMEOUT); /* 60 */
+
+ case SPI_GETACCESSTIMEOUT: /* 60 */
+ {
+ LPACCESSTIMEOUT lpAccessTimeout = (LPACCESSTIMEOUT)pvParam;
+ WARN("SPI_GETACCESSTIMEOUT not fully implemented\n");
+ if (lpAccessTimeout->cbSize == sizeof(ACCESSTIMEOUT))
+ {
+ /* Indicate that no accessibility features timeout is available */
+ lpAccessTimeout->dwFlags = 0;
+ lpAccessTimeout->iTimeOutMSec = 0;
+ }
+ else
+ {
+ ret = FALSE;
+ }
+ break;
+ }
WINE_SPI_FIXME(SPI_SETACCESSTIMEOUT); /* 61 */
- WINE_SPI_FIXME(SPI_GETSERIALKEYS); /* 62 WINVER >= 0x400 */
+ case SPI_GETSERIALKEYS: /* 62 WINVER >= 0x400 */
+ {
+ LPSERIALKEYSA lpSerialKeysA = (LPSERIALKEYSA)pvParam;
+ WARN("SPI_GETSERIALKEYS not fully implemented\n");
+ if (lpSerialKeysA->cbSize == sizeof(SERIALKEYSA))
+ {
+ /* Indicate that no SerialKeys feature available */
+ lpSerialKeysA->dwFlags = 0;
+ lpSerialKeysA->lpszActivePort = NULL;
+ lpSerialKeysA->lpszPort = NULL;
+ lpSerialKeysA->iBaudRate = 0;
+ lpSerialKeysA->iPortState = 0;
+ }
+ else
+ {
+ ret = FALSE;
+ }
+ break;
+ }
WINE_SPI_FIXME(SPI_SETSERIALKEYS); /* 63 WINVER >= 0x400 */
- WINE_SPI_FIXME(SPI_GETSOUNDSENTRY); /* 64 */
+ case SPI_GETSOUNDSENTRY: /* 64 */
+ {
+ LPSOUNDSENTRYA lpSoundSentryA = (LPSOUNDSENTRYA)pvParam;
+ WARN("SPI_GETSOUNDSENTRY not fully implemented\n");
+ if (lpSoundSentryA->cbSize == sizeof(SOUNDSENTRYA))
+ {
+ /* Indicate that no SoundSentry feature available */
+ lpSoundSentryA->dwFlags = 0;
+ lpSoundSentryA->iFSTextEffect = 0;
+ lpSoundSentryA->iFSTextEffectMSec = 0;
+ lpSoundSentryA->iFSTextEffectColorBits = 0;
+ lpSoundSentryA->iFSGrafEffect = 0;
+ lpSoundSentryA->iFSGrafEffectMSec = 0;
+ lpSoundSentryA->iFSGrafEffectColor = 0;
+ lpSoundSentryA->iWindowsEffect = 0;
+ lpSoundSentryA->iWindowsEffectMSec = 0;
+ lpSoundSentryA->lpszWindowsEffectDLL = 0;
+ lpSoundSentryA->iWindowsEffectOrdinal = 0;
+ }
+ else
+ {
+ ret = FALSE;
+ }
+ break;
+ }
WINE_SPI_FIXME(SPI_SETSOUNDSENTRY); /* 65 */
case SPI_GETHIGHCONTRAST: /* 66 WINVER >= 0x400 */
@@ -1314,7 +1441,7 @@
WARN("SPI_GETHIGHCONTRAST not fully implemented\n");
if (lpHighContrastA->cbSize == sizeof(HIGHCONTRASTA))
{
- /* Indicate that there is no high contrast available */
+ /* Indicate that no high contrast feature available */
lpHighContrastA->dwFlags = 0;
lpHighContrastA->lpszDefaultScheme = NULL;
}