Vitaliy Margolen : dinput: Use PostMessage instead of SendMessage.
Remove message window.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Jul 16 16:27:18 CDT 2007
Module: wine
Branch: master
Commit: 233cd46a22d9c53e8a7a7306a88756cb78ada47a
URL: http://source.winehq.org/git/wine.git/?a=commit;h=233cd46a22d9c53e8a7a7306a88756cb78ada47a
Author: Vitaliy Margolen <wine-patches at kievinfo.com>
Date: Sun Jul 15 10:38:05 2007 -0600
dinput: Use PostMessage instead of SendMessage. Remove message window.
---
dlls/dinput/dinput_main.c | 99 ++++++++++++++++-----------------------------
1 files changed, 35 insertions(+), 64 deletions(-)
diff --git a/dlls/dinput/dinput_main.c b/dlls/dinput/dinput_main.c
index dfa9dbe..5052829 100644
--- a/dlls/dinput/dinput_main.c
+++ b/dlls/dinput/dinput_main.c
@@ -848,22 +848,31 @@ static LRESULT CALLBACK LL_hook_proc( int code, WPARAM wparam, LPARAM lparam )
return CallNextHookEx( 0, code, wparam, lparam );
}
-static LRESULT CALLBACK dinput_hook_WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
+static DWORD WINAPI hook_thread_proc(void *param)
{
static HHOOK kbd_hook, mouse_hook;
- UINT kbd_cnt = 0, mice_cnt = 0;
+ MSG msg;
+
+ /* Force creation of the message queue */
+ PeekMessageW( &msg, 0, 0, 0, PM_NOREMOVE );
+ SetEvent(*(LPHANDLE)param);
- TRACE("got message %x %p %p\n", message, (LPVOID)wParam, (LPVOID)lParam);
- switch (message)
+ while (GetMessageW( &msg, 0, 0, 0 ))
{
- case WM_USER+0x10:
+ UINT kbd_cnt = 0, mice_cnt = 0;
+
+ if (msg.message == WM_USER+0x10)
{
IDirectInputImpl *dinput;
- if (!wParam && !lParam)
+ TRACE( "Processing hook change notification lp:%ld\n", msg.lParam );
+
+ if (!msg.wParam && !msg.lParam)
{
- DestroyWindow( hWnd );
- return 0;
+ if (kbd_hook) UnhookWindowsHookEx( kbd_hook );
+ if (mouse_hook) UnhookWindowsHookEx( mouse_hook );
+ kbd_hook = mouse_hook = NULL;
+ break;
}
EnterCriticalSection( &dinput_hook_crit );
@@ -906,46 +915,15 @@ static LRESULT CALLBACK dinput_hook_WndProc(HWND hWnd, UINT message, WPARAM wPar
mouse_hook = NULL;
}
}
- return 0;
-
- case WM_DESTROY:
- if (kbd_hook) UnhookWindowsHookEx(kbd_hook);
- if (mouse_hook) UnhookWindowsHookEx(mouse_hook);
- kbd_hook = mouse_hook = NULL;
- PostQuitMessage(0);
+ TranslateMessage(&msg);
+ DispatchMessageW(&msg);
}
- return DefWindowProcW(hWnd, message, wParam, lParam);
-}
-
-static HWND hook_thread_hwnd;
-static HANDLE hook_thread;
-
-static const WCHAR classW[]={'H','o','o','k','_','L','L','_','C','L',0};
-
-static DWORD WINAPI hook_thread_proc(void *param)
-{
- MSG msg;
- HWND hwnd;
-
- hwnd = CreateWindowExW(0, classW, NULL, 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, NULL, 0);
- hook_thread_hwnd = hwnd;
- SetEvent(*(LPHANDLE)param);
- if (hwnd)
- {
- while (GetMessageW(&msg, 0, 0, 0))
- {
- TranslateMessage(&msg);
- DispatchMessageW(&msg);
- }
- DestroyWindow(hwnd);
- }
- else ERR("Error creating message window\n");
-
- UnregisterClassW(classW, DINPUT_instance);
return 0;
}
+static DWORD hook_thread_id;
+
static CRITICAL_SECTION_DEBUG dinput_critsect_debug =
{
0, 0, &dinput_hook_crit,
@@ -956,26 +934,17 @@ static CRITICAL_SECTION dinput_hook_crit = { &dinput_critsect_debug, -1, 0, 0, 0
static BOOL check_hook_thread(void)
{
+ static HANDLE hook_thread;
+
EnterCriticalSection(&dinput_hook_crit);
TRACE("IDirectInputs left: %d\n", list_count(&direct_input_list));
if (!list_empty(&direct_input_list) && !hook_thread)
{
- DWORD tid;
HANDLE event;
- /* Create window class */
- WNDCLASSEXW wcex;
- memset(&wcex, 0, sizeof(wcex));
- wcex.cbSize = sizeof(wcex);
- wcex.lpfnWndProc = dinput_hook_WndProc;
- wcex.lpszClassName = classW;
- wcex.hInstance = DINPUT_instance;
- if (!RegisterClassExW(&wcex))
- ERR("Error registering window class\n");
-
event = CreateEventW(NULL, FALSE, FALSE, NULL);
- hook_thread = CreateThread(NULL, 0, hook_thread_proc, &event, 0, &tid);
+ hook_thread = CreateThread(NULL, 0, hook_thread_proc, &event, 0, &hook_thread_id);
if (event && hook_thread)
{
HANDLE handles[2];
@@ -983,29 +952,31 @@ static BOOL check_hook_thread(void)
handles[1] = hook_thread;
WaitForMultipleObjects(2, handles, FALSE, INFINITE);
}
+ LeaveCriticalSection(&dinput_hook_crit);
CloseHandle(event);
}
else if (list_empty(&direct_input_list) && hook_thread)
{
- HWND hwnd = hook_thread_hwnd;
- hook_thread_hwnd = 0;
- SendMessageW(hwnd, WM_USER+0x10, 0, 0);
+ DWORD tid = hook_thread_id;
+
+ hook_thread_id = 0;
+ PostThreadMessageW(tid, WM_USER+0x10, 0, 0);
+ LeaveCriticalSection(&dinput_hook_crit);
+
/* wait for hook thread to exit */
WaitForSingleObject(hook_thread, INFINITE);
CloseHandle(hook_thread);
hook_thread = NULL;
}
- LeaveCriticalSection(&dinput_hook_crit);
+ else
+ LeaveCriticalSection(&dinput_hook_crit);
- return hook_thread_hwnd != 0;
+ return hook_thread_id != 0;
}
void check_dinput_hooks(LPDIRECTINPUTDEVICE8A iface)
{
- HWND hwnd;
-
EnterCriticalSection(&dinput_hook_crit);
- hwnd = hook_thread_hwnd;
+ PostThreadMessageW( hook_thread_id, WM_USER+0x10, 1, 0 );
LeaveCriticalSection(&dinput_hook_crit);
- SendMessageW(hwnd, WM_USER+0x10, 1, 0);
}
More information about the wine-cvs
mailing list