Vitaliy Margolen : dinput: Move hook_thread from device to
DirectInput.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Sep 11 11:22:16 CDT 2006
Module: wine
Branch: master
Commit: 722a686d66cc7f3e04a86e1cc167cb3e0154c70a
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=722a686d66cc7f3e04a86e1cc167cb3e0154c70a
Author: Vitaliy Margolen <wine-patch at kievinfo.com>
Date: Sun Sep 10 16:47:39 2006 -0600
dinput: Move hook_thread from device to DirectInput.
---
dlls/dinput/device.c | 136 ------------------------------------------
dlls/dinput/device_private.h | 2 -
dlls/dinput/dinput_main.c | 136 ++++++++++++++++++++++++++++++++++++++++++
dlls/dinput/dinput_private.h | 2 +
4 files changed, 138 insertions(+), 138 deletions(-)
diff --git a/dlls/dinput/device.c b/dlls/dinput/device.c
index 13141c2..0c5564c 100644
--- a/dlls/dinput/device.c
+++ b/dlls/dinput/device.c
@@ -901,139 +901,3 @@ HRESULT WINAPI IDirectInputDevice8WImpl_
return DI_OK;
}
-
-/******************************************************************************
- * DInput hook thread
- */
-
-static LRESULT CALLBACK dinput_hook_WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
-{
- static HHOOK kbd_hook, mouse_hook;
- BOOL res;
-
- TRACE("got message %x %p %p\n", message, (LPVOID)wParam, (LPVOID)lParam);
- switch (message)
- {
- case WM_USER+0x10:
- if (wParam == WH_KEYBOARD_LL)
- {
- if (lParam)
- {
- if (kbd_hook) return 0;
- kbd_hook = SetWindowsHookExW(WH_KEYBOARD_LL, (LPVOID)lParam, DINPUT_instance, 0);
- return (LRESULT)kbd_hook;
- }
- else
- {
- if (!kbd_hook) return 0;
- res = UnhookWindowsHookEx(kbd_hook);
- kbd_hook = NULL;
- return res;
- }
- }
- else if (wParam == WH_MOUSE_LL)
- {
- if (lParam)
- {
- if (mouse_hook) return 0;
- mouse_hook = SetWindowsHookExW(WH_MOUSE_LL, (LPVOID)lParam, DINPUT_instance, 0);
- return (LRESULT)mouse_hook;
- }
- else
- {
- if (!mouse_hook) return 0;
- res = UnhookWindowsHookEx(mouse_hook);
- mouse_hook = NULL;
- return res;
- }
- }
- return 0;
-
- case WM_DESTROY:
- PostQuitMessage(0);
- }
- return DefWindowProcW(hWnd, message, wParam, lParam);
-}
-
-static HANDLE signal_event;
-
-static DWORD WINAPI hook_thread_proc(void *param)
-{
- static const WCHAR classW[]={'H','o','o','k','_','L','L','_','C','L',0};
- MSG msg;
- WNDCLASSEXW wcex;
- HWND hwnd;
-
- memset(&wcex, 0, sizeof(wcex));
- wcex.cbSize = sizeof(wcex);
- wcex.lpfnWndProc = dinput_hook_WndProc;
- wcex.lpszClassName = classW;
- wcex.hInstance = GetModuleHandleW(0);
-
- if (!RegisterClassExW(&wcex)) ERR("Error registering window class\n");
- hwnd = CreateWindowExW(0, classW, NULL, 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, NULL, 0);
- *(HWND*)param = hwnd;
-
- SetEvent(signal_event);
- if (hwnd)
- {
- while (GetMessageW(&msg, 0, 0, 0))
- {
- TranslateMessage(&msg);
- DispatchMessageW(&msg);
- }
- }
- else ERR("Error creating message window\n");
-
- DestroyWindow(hwnd);
- UnregisterClassW(wcex.lpszClassName, wcex.hInstance);
- return 0;
-}
-
-static CRITICAL_SECTION dinput_hook_crit;
-static CRITICAL_SECTION_DEBUG dinput_critsect_debug =
-{
- 0, 0, &dinput_hook_crit,
- { &dinput_critsect_debug.ProcessLocksList, &dinput_critsect_debug.ProcessLocksList },
- 0, 0, { (DWORD_PTR)(__FILE__ ": dinput_hook_crit") }
-};
-static CRITICAL_SECTION dinput_hook_crit = { &dinput_critsect_debug, -1, 0, 0, 0, 0 };
-
-static HWND get_thread_hwnd(void)
-{
- static HANDLE hook_thread;
- static HWND hook_thread_hwnd;
-
- EnterCriticalSection(&dinput_hook_crit);
- if (!hook_thread)
- {
- DWORD tid;
- HWND hwnd;
-
- signal_event = CreateEventW(NULL, FALSE, FALSE, NULL);
- hook_thread = CreateThread(NULL, 0, hook_thread_proc, &hwnd, 0, &tid);
- if (signal_event && hook_thread)
- {
- HANDLE handles[2];
- handles[0] = signal_event;
- handles[1] = hook_thread;
- WaitForMultipleObjects(2, handles, FALSE, INFINITE);
- }
- CloseHandle(signal_event);
-
- if (!(hook_thread_hwnd = hwnd))
- {
- /* Thread failed to create window - reset things so we could try again later */
- CloseHandle(hook_thread);
- hook_thread = 0;
- }
- }
- LeaveCriticalSection(&dinput_hook_crit);
-
- return hook_thread_hwnd;
-}
-
-HHOOK set_dinput_hook(int hook_id, LPVOID proc)
-{
- return (HHOOK)SendMessageW(get_thread_hwnd(), WM_USER+0x10, (WPARAM)hook_id, (LPARAM)proc);
-}
diff --git a/dlls/dinput/device_private.h b/dlls/dinput/device_private.h
index 8ccd0ab..a2777c2 100644
--- a/dlls/dinput/device_private.h
+++ b/dlls/dinput/device_private.h
@@ -52,8 +52,6 @@ extern void fill_DataFormat(void *out, c
extern DataFormat *create_DataFormat(const DIDATAFORMAT *wine_format, LPCDIDATAFORMAT asked_format, int *offset) ;
extern void release_DataFormat(DataFormat *df) ;
-extern HHOOK set_dinput_hook(int hook_id, LPVOID proc);
-
/* Used to fill events in the queue */
#define GEN_EVENT(offset,data,xtime,seq) \
{ \
diff --git a/dlls/dinput/dinput_main.c b/dlls/dinput/dinput_main.c
index cef61b7..2a05347 100644
--- a/dlls/dinput/dinput_main.c
+++ b/dlls/dinput/dinput_main.c
@@ -686,3 +686,139 @@ HRESULT WINAPI DllGetClassObject(REFCLSI
FIXME("(%s,%s,%p): no interface found.\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
return CLASS_E_CLASSNOTAVAILABLE;
}
+
+/******************************************************************************
+ * DInput hook thread
+ */
+
+static LRESULT CALLBACK dinput_hook_WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
+{
+ static HHOOK kbd_hook, mouse_hook;
+ BOOL res;
+
+ TRACE("got message %x %p %p\n", message, (LPVOID)wParam, (LPVOID)lParam);
+ switch (message)
+ {
+ case WM_USER+0x10:
+ if (wParam == WH_KEYBOARD_LL)
+ {
+ if (lParam)
+ {
+ if (kbd_hook) return 0;
+ kbd_hook = SetWindowsHookExW(WH_KEYBOARD_LL, (LPVOID)lParam, DINPUT_instance, 0);
+ return (LRESULT)kbd_hook;
+ }
+ else
+ {
+ if (!kbd_hook) return 0;
+ res = UnhookWindowsHookEx(kbd_hook);
+ kbd_hook = NULL;
+ return res;
+ }
+ }
+ else if (wParam == WH_MOUSE_LL)
+ {
+ if (lParam)
+ {
+ if (mouse_hook) return 0;
+ mouse_hook = SetWindowsHookExW(WH_MOUSE_LL, (LPVOID)lParam, DINPUT_instance, 0);
+ return (LRESULT)mouse_hook;
+ }
+ else
+ {
+ if (!mouse_hook) return 0;
+ res = UnhookWindowsHookEx(mouse_hook);
+ mouse_hook = NULL;
+ return res;
+ }
+ }
+ return 0;
+
+ case WM_DESTROY:
+ PostQuitMessage(0);
+ }
+ return DefWindowProcW(hWnd, message, wParam, lParam);
+}
+
+static HANDLE signal_event;
+
+static DWORD WINAPI hook_thread_proc(void *param)
+{
+ static const WCHAR classW[]={'H','o','o','k','_','L','L','_','C','L',0};
+ MSG msg;
+ WNDCLASSEXW wcex;
+ HWND hwnd;
+
+ memset(&wcex, 0, sizeof(wcex));
+ wcex.cbSize = sizeof(wcex);
+ wcex.lpfnWndProc = dinput_hook_WndProc;
+ wcex.lpszClassName = classW;
+ wcex.hInstance = GetModuleHandleW(0);
+
+ if (!RegisterClassExW(&wcex)) ERR("Error registering window class\n");
+ hwnd = CreateWindowExW(0, classW, NULL, 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, NULL, 0);
+ *(HWND*)param = hwnd;
+
+ SetEvent(signal_event);
+ if (hwnd)
+ {
+ while (GetMessageW(&msg, 0, 0, 0))
+ {
+ TranslateMessage(&msg);
+ DispatchMessageW(&msg);
+ }
+ }
+ else ERR("Error creating message window\n");
+
+ DestroyWindow(hwnd);
+ UnregisterClassW(wcex.lpszClassName, wcex.hInstance);
+ return 0;
+}
+
+static CRITICAL_SECTION dinput_hook_crit;
+static CRITICAL_SECTION_DEBUG dinput_critsect_debug =
+{
+ 0, 0, &dinput_hook_crit,
+ { &dinput_critsect_debug.ProcessLocksList, &dinput_critsect_debug.ProcessLocksList },
+ 0, 0, { (DWORD_PTR)(__FILE__ ": dinput_hook_crit") }
+};
+static CRITICAL_SECTION dinput_hook_crit = { &dinput_critsect_debug, -1, 0, 0, 0, 0 };
+
+static HWND get_thread_hwnd(void)
+{
+ static HANDLE hook_thread;
+ static HWND hook_thread_hwnd;
+
+ EnterCriticalSection(&dinput_hook_crit);
+ if (!hook_thread)
+ {
+ DWORD tid;
+ HWND hwnd;
+
+ signal_event = CreateEventW(NULL, FALSE, FALSE, NULL);
+ hook_thread = CreateThread(NULL, 0, hook_thread_proc, &hwnd, 0, &tid);
+ if (signal_event && hook_thread)
+ {
+ HANDLE handles[2];
+ handles[0] = signal_event;
+ handles[1] = hook_thread;
+ WaitForMultipleObjects(2, handles, FALSE, INFINITE);
+ }
+ CloseHandle(signal_event);
+
+ if (!(hook_thread_hwnd = hwnd))
+ {
+ /* Thread failed to create window - reset things so we could try again later */
+ CloseHandle(hook_thread);
+ hook_thread = 0;
+ }
+ }
+ LeaveCriticalSection(&dinput_hook_crit);
+
+ return hook_thread_hwnd;
+}
+
+HHOOK set_dinput_hook(int hook_id, LPVOID proc)
+{
+ return (HHOOK)SendMessageW(get_thread_hwnd(), WM_USER+0x10, (WPARAM)hook_id, (LPARAM)proc);
+}
diff --git a/dlls/dinput/dinput_private.h b/dlls/dinput/dinput_private.h
index c23b048..d3f58a3 100644
--- a/dlls/dinput/dinput_private.h
+++ b/dlls/dinput/dinput_private.h
@@ -54,4 +54,6 @@ extern const struct dinput_device joysti
extern HINSTANCE DINPUT_instance;
+extern HHOOK set_dinput_hook(int hook_id, LPVOID proc);
+
#endif /* __WINE_DLLS_DINPUT_DINPUT_PRIVATE_H */
More information about the wine-cvs
mailing list