diff --git a/include/keyboard.h b/include/keyboard.h index 2268208154b..f6ac7df8f5b 100644 --- a/include/keyboard.h +++ b/include/keyboard.h @@ -30,6 +30,11 @@ VOID WINAPI KEYBOARD_Disable(VOID); /* Wine internals */ +#define WINE_KEYBOARD_CONFIG_AUTO_REPEAT 0x00000001 +typedef struct tagKEYBOARD_CONFIG { + BOOL auto_repeat; +} KEYBOARD_CONFIG; + typedef struct tagKEYBOARD_DRIVER { void (*pInit)(void); WORD (*pVkKeyScan)(CHAR); @@ -41,6 +46,8 @@ typedef struct tagKEYBOARD_DRIVER { void (*pBeep)(void); BOOL (*pGetDIState)(DWORD, LPVOID); BOOL (*pGetDIData)(BYTE *, DWORD, LPDIDEVICEOBJECTDATA, LPDWORD, DWORD); + void (*pGetKeyboardConfig)(KEYBOARD_CONFIG *); + void (*pSetKeyboardConfig)(KEYBOARD_CONFIG *, DWORD); } KEYBOARD_DRIVER; extern KEYBOARD_DRIVER *KEYBOARD_Driver; diff --git a/include/ttydrv.h b/include/ttydrv.h index 7c9a4c9cd29..9c7a281b5d8 100644 --- a/include/ttydrv.h +++ b/include/ttydrv.h @@ -20,6 +20,8 @@ #include "wine/winuser16.h" #include "wine/wingdi16.h" +#include "keyboard.h" + struct tagBITMAPOBJ; struct tagCLASS; struct tagDC; @@ -164,6 +166,8 @@ extern void TTYDRV_KEYBOARD_SetBeepActive(BOOL bActivate); extern void TTYDRV_KEYBOARD_Beep(void); extern BOOL TTYDRV_KEYBOARD_GetDIState(DWORD len, LPVOID ptr); extern BOOL TTYDRV_KEYBOARD_GetDIData(BYTE *keystate, DWORD dodsize, LPDIDEVICEOBJECTDATA dod, LPDWORD entries, DWORD flags); +extern void TTYDRV_KEYBOARD_GetKeyboardConfig(KEYBOARD_CONFIG *cfg); +extern void TTYDRV_KEYBOARD_SetKeyboardConfig(KEYBOARD_CONFIG *cfg, DWORD mask); /* TTY monitor driver */ diff --git a/include/x11drv.h b/include/x11drv.h index 0293b352f44..e8d59b509d7 100644 --- a/include/x11drv.h +++ b/include/x11drv.h @@ -19,6 +19,8 @@ #include "winbase.h" #include "windef.h" +#include "keyboard.h" + #include struct tagBITMAPOBJ; @@ -396,6 +398,8 @@ extern void X11DRV_KEYBOARD_SetBeepActive(BOOL bActivate); extern void X11DRV_KEYBOARD_Beep(void); extern BOOL X11DRV_KEYBOARD_GetDIState(DWORD len, LPVOID ptr); extern BOOL X11DRV_KEYBOARD_GetDIData(BYTE *keystate, DWORD dodsize, LPDIDEVICEOBJECTDATA dod, LPDWORD entries, DWORD flags); +extern void X11DRV_KEYBOARD_GetKeyboardConfig(KEYBOARD_CONFIG *cfg); +extern void X11DRV_KEYBOARD_SetKeyboardConfig(KEYBOARD_CONFIG *cfg, DWORD mask); extern void X11DRV_KEYBOARD_HandleEvent(struct tagWND *pWnd, XKeyEvent *event); diff --git a/windows/dinput.c b/windows/dinput.c index 40c8a34c927..df6ff189918 100644 --- a/windows/dinput.c +++ b/windows/dinput.c @@ -81,6 +81,7 @@ struct SysKeyboardAImpl GUID guid; /* SysKeyboardAImpl */ BYTE keystate[256]; + KEYBOARD_CONFIG initial_config; }; #ifdef HAVE_LINUX_22_JOYSTICK_API @@ -294,7 +295,7 @@ static HRESULT WINAPI IDirectInputAImpl_CreateDevice( char xbuf[50]; WINE_StringFromCLSID(rguid,xbuf); - FIXME("(this=%p,%s,%p,%p): stub\n",This,xbuf,pdev,punk); + TRACE("(this=%p,%s,%p,%p)\n",This,xbuf,pdev,punk); if ((!memcmp(&GUID_SysKeyboard,rguid,sizeof(GUID_SysKeyboard))) || /* Generic Keyboard */ (!memcmp(&DInput_Wine_Keyboard_GUID,rguid,sizeof(GUID_SysKeyboard)))) { /* Wine Keyboard */ SysKeyboardAImpl* newDevice; @@ -431,7 +432,7 @@ static HRESULT WINAPI IDirectInputDevice2AImpl_SetCooperativeLevel( LPDIRECTINPUTDEVICE2A iface,HWND hwnd,DWORD dwflags ) { ICOM_THIS(IDirectInputDevice2AImpl,iface); - FIXME("(this=%p,0x%08lx,0x%08lx): stub\n",This,(DWORD)hwnd,dwflags); + TRACE("(this=%p,0x%08lx,0x%08lx)\n",This,(DWORD)hwnd,dwflags); if (TRACE_ON(dinput)) _dump_cooperativelevel(dwflags); return 0; @@ -507,7 +508,7 @@ static HRESULT WINAPI SysKeyboardAImpl_GetDeviceData( ret=KEYBOARD_Driver->pGetDIData( This->keystate, dodsize, dod, entries, flags)?DI_OK:E_FAIL; for (i=0;i<*entries;i++) { - dod[i].dwTimeStamp = time(NULL); + dod[i].dwTimeStamp = GetTickCount(); dod[i].dwSequence = evsequence++; } return ret; @@ -516,15 +517,28 @@ static HRESULT WINAPI SysKeyboardAImpl_GetDeviceData( static HRESULT WINAPI SysKeyboardAImpl_Acquire(LPDIRECTINPUTDEVICE2A iface) { ICOM_THIS(SysKeyboardAImpl,iface); - TRACE("(this=%p): stub\n",This); - return 0; + KEYBOARD_CONFIG no_auto; + + TRACE("(this=%p)\n",This); + /* Save the original config */ + KEYBOARD_Driver->pGetKeyboardConfig(&(This->initial_config)); + + /* Now, remove auto-repeat */ + no_auto.auto_repeat = FALSE; + KEYBOARD_Driver->pSetKeyboardConfig(&no_auto, WINE_KEYBOARD_CONFIG_AUTO_REPEAT); + + return DI_OK; } static HRESULT WINAPI SysKeyboardAImpl_Unacquire(LPDIRECTINPUTDEVICE2A iface) { ICOM_THIS(SysKeyboardAImpl,iface); - TRACE("(this=%p): stub\n",This); - return 0; + TRACE("(this=%p)\n",This); + + /* Restore the original configuration */ + KEYBOARD_Driver->pSetKeyboardConfig(&(This->initial_config), 0xFFFFFFFF); + + return DI_OK; } static HRESULT WINAPI IDirectInputDevice2AImpl_QueryInterface( @@ -760,7 +774,7 @@ static HRESULT WINAPI SysMouseAImpl_SetCooperativeLevel( { ICOM_THIS(SysMouseAImpl,iface); - TRACE("(this=%p,0x%08lx,0x%08lx): stub\n",This,(DWORD)hwnd,dwflags); + TRACE("(this=%p,0x%08lx,0x%08lx)\n",This,(DWORD)hwnd,dwflags); if (TRACE_ON(dinput)) _dump_cooperativelevel(dwflags); diff --git a/windows/ttydrv/init.c b/windows/ttydrv/init.c index 74daf2d10b7..5914887c241 100644 --- a/windows/ttydrv/init.c +++ b/windows/ttydrv/init.c @@ -59,7 +59,9 @@ KEYBOARD_DRIVER TTYDRV_KEYBOARD_Driver = TTYDRV_KEYBOARD_SetBeepActive, TTYDRV_KEYBOARD_Beep, TTYDRV_KEYBOARD_GetDIState, - TTYDRV_KEYBOARD_GetDIData + TTYDRV_KEYBOARD_GetDIData, + TTYDRV_KEYBOARD_GetKeyboardConfig, + TTYDRV_KEYBOARD_SetKeyboardConfig }; MONITOR_DRIVER TTYDRV_MONITOR_Driver = diff --git a/windows/ttydrv/keyboard.c b/windows/ttydrv/keyboard.c index f70d2f60d80..6b078f52ca0 100644 --- a/windows/ttydrv/keyboard.c +++ b/windows/ttydrv/keyboard.c @@ -93,3 +93,18 @@ BOOL TTYDRV_KEYBOARD_GetDIData( { return TRUE; } + +/*********************************************************************** + * TTYDRV_KEYBOARD_GetKeyboardConfig + */ +void TTYDRV_KEYBOARD_GetKeyboardConfig(KEYBOARD_CONFIG *cfg) { + +} + +/*********************************************************************** + * TTYDRV_KEYBOARD_SetKeyboardConfig + */ +extern void TTYDRV_KEYBOARD_SetKeyboardConfig(KEYBOARD_CONFIG *cfg, DWORD mask) { + +} + diff --git a/windows/x11drv/init.c b/windows/x11drv/init.c index c1d4d027826..b2150403d05 100644 --- a/windows/x11drv/init.c +++ b/windows/x11drv/init.c @@ -63,7 +63,9 @@ KEYBOARD_DRIVER X11DRV_KEYBOARD_Driver = X11DRV_KEYBOARD_SetBeepActive, X11DRV_KEYBOARD_Beep, X11DRV_KEYBOARD_GetDIState, - X11DRV_KEYBOARD_GetDIData + X11DRV_KEYBOARD_GetDIData, + X11DRV_KEYBOARD_GetKeyboardConfig, + X11DRV_KEYBOARD_SetKeyboardConfig }; MONITOR_DRIVER X11DRV_MONITOR_Driver = diff --git a/windows/x11drv/keyboard.c b/windows/x11drv/keyboard.c index 78bfd9ee9ae..fe7607f2d99 100644 --- a/windows/x11drv/keyboard.c +++ b/windows/x11drv/keyboard.c @@ -33,6 +33,7 @@ DECLARE_DEBUG_CHANNEL(key) DECLARE_DEBUG_CHANNEL(keyboard) DECLARE_DEBUG_CHANNEL(x11drv) +DECLARE_DEBUG_CHANNEL(dinput) extern BYTE InputKeyStateTable[256]; @@ -1480,11 +1481,38 @@ BOOL X11DRV_KEYBOARD_GetDIData( } - if (n) fprintf(stderr,"%d entries\n",n); + if (n) TRACE_(dinput)("%d entries\n",n); *entries = n; return TRUE; } +/*********************************************************************** + * X11DRV_KEYBOARD_GetKeyboardConfig + */ +void X11DRV_KEYBOARD_GetKeyboardConfig(KEYBOARD_CONFIG *cfg) { + XKeyboardState xks; + + /* For the moment, only get the auto-repeat mode */ + TSXGetKeyboardControl(display, &xks); + cfg->auto_repeat = xks.global_auto_repeat; +} + +/*********************************************************************** + * X11DRV_KEYBOARD_SetKeyboardConfig + */ +extern void X11DRV_KEYBOARD_SetKeyboardConfig(KEYBOARD_CONFIG *cfg, DWORD mask) { + XKeyboardControl xkc; + unsigned long X_mask = 0; + + if (mask & WINE_KEYBOARD_CONFIG_AUTO_REPEAT) { + X_mask |= KBAutoRepeatMode; + xkc.auto_repeat_mode = cfg->auto_repeat; + } + if (X_mask) + TSXChangeKeyboardControl(display, X_mask, &xkc); +} + + #endif /* !defined(X_DISPLAY_MISSING) */