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