* Copyright 1998 Marcus Meissner\r
* Copyright 1998,1999 Lionel Ulmer\r
* Copyright 2000-2001 TransGaming Technologies Inc.\r
+ * Copyright 2005 Raphael Junqueira\r
*\r
* This library is free software; you can redistribute it and/or\r
* modify it under the terms of the GNU Lesser General Public\r
\r
WINE_DEFAULT_DEBUG_CHANNEL(dinput);\r
\r
-//fast fix misning from mingw headers\r
-#ifdef __REACTOS__\r
-#define LLKHF_EXTENDED (KF_EXTENDED >> 8)\r
-#define LLKHF_INJECTED 0x00000010\r
-//#define LLKHF_ALTDOWN (KF_ALTDOWN >> 8)\r
-#define LLKHF_UP (KF_UP >> 8)\r
-#endif\r
+#define WINE_DINPUT_KEYBOARD_MAX_KEYS 256\r
\r
static IDirectInputDevice8AVtbl SysKeyboardAvt;\r
static IDirectInputDevice8WVtbl SysKeyboardWvt;\r
CRITICAL_SECTION crit;\r
};\r
\r
-SysKeyboardImpl *current; /* Today's acquired device\r
-FIXME: currently this can be only one.\r
-Maybe this should be a linked list or st.\r
-I don't know what the rules are for multiple acquired keyboards,\r
-but 'DI_LOSTFOCUS' and 'DI_UNACQUIRED' exist for a reason.\r
+static SysKeyboardImpl* current_lock = NULL; \r
+/* Today's acquired device\r
+ * FIXME: currently this can be only one.\r
+ * Maybe this should be a linked list or st.\r
+ * I don't know what the rules are for multiple acquired keyboards,\r
+ * but 'DI_LOSTFOCUS' and 'DI_UNACQUIRED' exist for a reason.\r
*/\r
\r
-static BYTE DInputKeyState[256]; /* array for 'GetDeviceState' */\r
+static BYTE DInputKeyState[WINE_DINPUT_KEYBOARD_MAX_KEYS]; /* array for 'GetDeviceState' */\r
\r
static CRITICAL_SECTION keyboard_crit;\r
static CRITICAL_SECTION_DEBUG critsect_debug =\r
static DWORD keyboard_users;\r
\r
#ifndef __REACTOS__\r
-static HHOOK keyboard_hook;\r
+static DWORD keyboard_users = 0;\r
+static HHOOK keyboard_hook = NULL;\r
#endif\r
\r
#ifdef __REACTOS__\r
\r
\r
if (disk_code!=-1) {\r
- if (current->buffer != NULL)\r
+ if (current_lock->buffer != NULL)\r
{\r
int n;\r
- n = (current->start + current->count) % current->buffersize;\r
+ n = (current_lock->start + current_lock->count) % current_lock->buffersize;\r
\r
- current->buffer[n].dwOfs = (BYTE) disk_code;\r
- current->buffer[n].dwData = DInputKeyState[disk_code];\r
- current->buffer[n].dwTimeStamp = 10;\r
- current->buffer[n].dwSequence = current->dinput->evsequence++;\r
+ current_lock->buffer[n].dwOfs = (BYTE) disk_code;\r
+ current_lock->buffer[n].dwData = DInputKeyState[disk_code];\r
+ current_lock->buffer[n].dwTimeStamp = 10;\r
+ current_lock->buffer[n].dwSequence = current_lock->dinput->evsequence++;\r
\r
\r
- if (current->count == current->buffersize)\r
+ if (current_lock->count == current_lock->buffersize)\r
{\r
- current->start = ++current->start % current->buffersize;\r
- current->overflow = TRUE;\r
+ current_lock->start = ++current_lock->start % current_lock->buffersize;\r
+ current_lock->overflow = TRUE;\r
}\r
else\r
- current->count++;\r
+ current_lock->count++;\r
\r
}\r
}\r
#ifndef __REACTOS__\r
LRESULT CALLBACK KeyboardCallback( int code, WPARAM wparam, LPARAM lparam )\r
{\r
- TRACE("(%d,%d,%ld)\n", code, wparam, lparam);\r
-\r
- if (code == HC_ACTION)\r
- {\r
- BYTE dik_code;\r
- BOOL down;\r
- DWORD timestamp;\r
- \r
- {\r
- KBDLLHOOKSTRUCT *hook = (KBDLLHOOKSTRUCT *)lparam;\r
- dik_code = hook->scanCode;\r
- if (hook->flags & LLKHF_EXTENDED) dik_code |= 0x80;\r
- down = !(hook->flags & LLKHF_UP);\r
- timestamp = hook->time;\r
- }\r
-\r
- DInputKeyState[dik_code] = (down ? 0x80 : 0);\r
- TRACE(" setting %02X to %02X\n", dik_code, DInputKeyState[dik_code]);\r
- \r
- if (current != NULL)\r
- {\r
- if (current->hEvent)\r
- SetEvent(current->hEvent);\r
-\r
- if (current->buffer != NULL)\r
- {\r
- int n;\r
-\r
- EnterCriticalSection(&(current->crit));\r
-\r
- n = (current->start + current->count) % current->buffersize;\r
+ BYTE dik_code;\r
+ BOOL down;\r
+ DWORD timestamp;\r
+ KBDLLHOOKSTRUCT *hook = (KBDLLHOOKSTRUCT *)lparam;\r
+ BYTE new_diks;\r
\r
- current->buffer[n].dwOfs = dik_code;\r
- current->buffer[n].dwData = down ? 0x80 : 0;\r
- current->buffer[n].dwTimeStamp = timestamp;\r
- current->buffer[n].dwSequence = current->dinput->evsequence++;\r
+ TRACE("(%d,%d,%ld)\n", code, wparam, lparam);\r
\r
- TRACE("Adding event at offset %d : %ld - %ld - %ld - %ld\n", n,\r
- current->buffer[n].dwOfs, current->buffer[n].dwData, current->buffer[n].dwTimeStamp, current->buffer[n].dwSequence);\r
+ /** returns now if not HC_ACTION */\r
+ if (code != HC_ACTION) return CallNextHookEx(keyboard_hook, code, wparam, lparam);\r
+ \r
+ {\r
+ dik_code = hook->scanCode;\r
+ if (hook->flags & LLKHF_EXTENDED) dik_code |= 0x80;\r
+ down = !(hook->flags & LLKHF_UP);\r
+ timestamp = hook->time;\r
+ }\r
\r
- if (current->count == current->buffersize)\r
- {\r
- current->start = ++current->start % current->buffersize;\r
- current->overflow = TRUE;\r
- }\r
- else\r
- current->count++;\r
+ /** returns now if key event already known */\r
+ new_diks = (down ? 0x80 : 0);\r
+ /*if (new_diks != DInputKeyState[dik_code]) return CallNextHookEx(keyboard_hook, code, wparam, lparam); TO BE FIXED */\r
\r
- LeaveCriticalSection(&(current->crit));\r
- }\r
- }\r
+ DInputKeyState[dik_code] = new_diks;\r
+ TRACE(" setting %02X to %02X\n", dik_code, DInputKeyState[dik_code]);\r
+ \r
+ if (current_lock != NULL) {\r
+ if (current_lock->hEvent) SetEvent(current_lock->hEvent);\r
+ \r
+ if (current_lock->buffer != NULL) {\r
+ int n;\r
+ \r
+ EnterCriticalSection(&(current_lock->crit));\r
+ \r
+ n = (current_lock->start + current_lock->count) % current_lock->buffersize;\r
+ \r
+ current_lock->buffer[n].dwOfs = dik_code;\r
+ current_lock->buffer[n].dwData = down ? 0x80 : 0;\r
+ current_lock->buffer[n].dwTimeStamp = timestamp;\r
+ current_lock->buffer[n].dwSequence = current_lock->dinput->evsequence++;\r
+ \r
+ TRACE("Adding event at offset %d : %ld - %ld - %ld - %ld\n", n,\r
+ current_lock->buffer[n].dwOfs, current_lock->buffer[n].dwData, current_lock->buffer[n].dwTimeStamp, current_lock->buffer[n].dwSequence);\r
+ \r
+ if (current_lock->count == current_lock->buffersize) {\r
+ current_lock->start = ++current_lock->start % current_lock->buffersize;\r
+ current_lock->overflow = TRUE;\r
+ } else\r
+ current_lock->count++;\r
+ \r
+ LeaveCriticalSection(&(current_lock->crit));\r
}\r
-\r
+ }\r
return CallNextHookEx(keyboard_hook, code, wparam, lparam);\r
}\r
#endif\r
static SysKeyboardImpl *alloc_device_keyboard(REFGUID rguid, LPVOID kvt, IDirectInputImpl *dinput)\r
{\r
SysKeyboardImpl* newDevice;\r
+ DWORD kbd_users;\r
+\r
newDevice = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(SysKeyboardImpl));\r
newDevice->lpVtbl = kvt;\r
newDevice->ref = 1;\r
memcpy(&(newDevice->guid),rguid,sizeof(*rguid));\r
newDevice->dinput = dinput;\r
+ InitializeCriticalSection(&(newDevice->crit));\r
\r
#ifndef __REACTOS__\r
EnterCriticalSection(&keyboard_crit);\r
+<<<<<<< .working\r
\r
if (!keyboard_users++)\r
keyboard_hook = SetWindowsHookExW( WH_KEYBOARD_LL, KeyboardCallback, DINPUT_instance, 0 );\r
+=======\r
+ kbd_users = InterlockedIncrement(&keyboard_users);\r
+ if (1 == kbd_users) {\r
+ keyboard_hook = SetWindowsHookExW( WH_KEYBOARD_LL, KeyboardCallback, DINPUT_instance, 0 );\r
+ }\r
+>>>>>>> .merge-right.r14821\r
\r
LeaveCriticalSection(&keyboard_crit);\r
#endif\r
return DIERR_DEVICENOTREG;\r
}\r
\r
-dinput_device keyboarddev = {\r
- 100,\r
+const struct dinput_device keyboard_device = {\r
"Wine keyboard driver",\r
keyboarddev_enum_deviceA,\r
keyboarddev_enum_deviceW,\r
keyboarddev_create_deviceW\r
};\r
\r
-void scan_keyboard()\r
-{\r
- dinput_register_device(&keyboarddev);\r
-}\r
-\r
-DECL_GLOBAL_CONSTRUCTOR(keyboarddev_register) { dinput_register_device(&keyboarddev); }\r
-\r
static ULONG WINAPI SysKeyboardAImpl_Release(LPDIRECTINPUTDEVICE8A iface)\r
{\r
SysKeyboardImpl *This = (SysKeyboardImpl *)iface;\r
ULONG ref;\r
+ DWORD kbd_users;\r
\r
ref = InterlockedDecrement(&(This->ref));\r
if (ref)\r
return ref;\r
\r
#ifndef __REACTOS__\r
- EnterCriticalSection(&keyboard_crit);\r
- if (!--keyboard_users) {\r
+ EnterCriticalSection(&keyboard_crit); \r
+ kbd_users = InterlockedDecrement(&keyboard_users);\r
+ if (0 == kbd_users) {\r
UnhookWindowsHookEx( keyboard_hook );\r
keyboard_hook = 0;\r
}\r
LPDIRECTINPUTDEVICE8A iface,DWORD len,LPVOID ptr\r
)\r
{\r
- TRACE("(%p)->(%ld,%p)\n", iface, len, ptr);\r
+ SysKeyboardImpl *This = (SysKeyboardImpl *)iface;\r
+ TRACE("(%p)->(%ld,%p)\n", This, len, ptr);\r
\r
#ifdef __REACTOS__\r
reactos_input_keyboard();\r
#endif\r
\r
/* Note: device does not need to be acquired */\r
- if (len != 256)\r
+ if (len != WINE_DINPUT_KEYBOARD_MAX_KEYS)\r
return DIERR_INVALIDPARAM;\r
\r
MsgWaitForMultipleObjectsEx(0, NULL, 0, QS_ALLINPUT, 0);\r
\r
+ EnterCriticalSection(&(This->crit));\r
+\r
if (TRACE_ON(dinput)) {\r
int i;\r
- for (i = 0; i < 256; i++) {\r
+ for (i = 0; i < WINE_DINPUT_KEYBOARD_MAX_KEYS; i++) {\r
if (DInputKeyState[i] != 0x00) {\r
TRACE(" - %02X: %02x\n", i, DInputKeyState[i]);\r
}\r
}\r
}\r
\r
- memcpy(ptr, DInputKeyState, 256);\r
+ memcpy(ptr, DInputKeyState, WINE_DINPUT_KEYBOARD_MAX_KEYS);\r
+ LeaveCriticalSection(&(This->crit));\r
+\r
return DI_OK;\r
}\r
\r
memset(&ddoi, 0, sizeof(ddoi));\r
ddoi.dwSize = FIELD_OFFSET(DIDEVICEOBJECTINSTANCEA, dwFFMaxForce);\r
\r
- for (i = 0; i < 256; i++) {\r
+ for (i = 0; i < WINE_DINPUT_KEYBOARD_MAX_KEYS; i++) {\r
/* Report 255 keys :-) */\r
ddoi.guidType = GUID_Key;\r
ddoi.dwOfs = i;\r
\r
This->acquired = 1;\r
\r
- if (current != NULL)\r
- {\r
- FIXME("Not more than one keyboard can be acquired at the same time.\n");\r
- SysKeyboardAImpl_Unacquire(iface);\r
- }\r
-\r
- current = This;\r
-\r
- if (This->buffersize > 0)\r
- {\r
- This->buffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,\r
- This->buffersize * sizeof(*(This->buffer)));\r
- This->start = 0;\r
- This->count = 0;\r
- This->overflow = FALSE;\r
- InitializeCriticalSection(&(This->crit));\r
- }\r
- else\r
+ if (current_lock != NULL) {\r
+ FIXME("Not more than one keyboard can be acquired at the same time.\n");\r
+ SysKeyboardAImpl_Unacquire(iface);\r
+ }\r
+ \r
+ current_lock = This;\r
+\r
+ if (This->buffersize > 0) {\r
+ This->buffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,\r
+ This->buffersize * sizeof(*(This->buffer)));\r
+ This->start = 0;\r
+ This->count = 0;\r
+ This->overflow = FALSE;\r
+ } else {\r
This->buffer = NULL;\r
+ }\r
\r
+ /*keyboard_hook = SetWindowsHookExW( WH_KEYBOARD_LL, KeyboardCallback, DINPUT_instance, 0 );*/\r
\r
return DI_OK;\r
}\r
if (This->acquired == 0)\r
return DI_NOEFFECT;\r
\r
- if (current == This)\r
- current = NULL;\r
+ /* No more locks */\r
+ if (current_lock == This)\r
+ current_lock = NULL;\r
else\r
- ERR("this != current\n");\r
+ ERR("this != current_lock\n");\r
\r
+ /* Unacquire device */\r
This->acquired = 0;\r
\r
- if (This->buffersize >= 0)\r
- {\r
- HeapFree(GetProcessHeap(), 0, This->buffer);\r
- This->buffer = NULL;\r
- DeleteCriticalSection(&(This->crit));\r
- }\r
+ if (This->buffersize >= 0) {\r
+ HeapFree(GetProcessHeap(), 0, This->buffer);\r
+ This->buffer = NULL;\r
+ }\r
\r
return DI_OK;\r
}\r
else\r
devcaps.dwDevType = DIDEVTYPE_KEYBOARD | (DIDEVTYPEKEYBOARD_UNKNOWN << 8);\r
devcaps.dwAxes = 0;\r
- devcaps.dwButtons = 256;\r
+ devcaps.dwButtons = WINE_DINPUT_KEYBOARD_MAX_KEYS;\r
devcaps.dwPOVs = 0;\r
devcaps.dwFFSamplePeriod = 0;\r
devcaps.dwFFMinTimeResolution = 0;\r
TRACE("(this=%p,%p)\n", This, pdidi);\r
\r
if (pdidi->dwSize != sizeof(DIDEVICEINSTANCEA)) {\r
- WARN(" dinput3 not supporte yet...\n");\r
+ WARN(" dinput3 not supported yet...\n");\r
return DI_OK;\r
}\r
\r
TRACE("(this=%p,%p)\n", This, pdidi);\r
\r
if (pdidi->dwSize != sizeof(DIDEVICEINSTANCEW)) {\r
- WARN(" dinput3 not supporte yet...\n");\r
+ WARN(" dinput3 not supported yet...\n");\r
return DI_OK;\r
}\r
\r