http://bugs.winehq.org/show_bug.cgi?id=31442
--- Comment #41 from voidcastr voidcastr@gmail.com 2012-10-08 03:53:58 CDT ---
(In reply to comment #40)
I expect a thread problem...
Oh, that's quite for sure.
Well, apparently the lower SendMessageW is not handled properly under certain circumstances like the one being at hand here. Exchanging SendMessageW with SendNotifyMessageW would only obscure the actual problem that avoids the proper handling of the message. We should solve that instead.
I just investigated the message sending a little further:
As we know, SendMessageW(...) in dlls/user32/message.c is employed by the imm32 code in question. It calls send_message(struct send_message_info*, DWORD_PTR *, BOOL) which hangs at ret = send_inter_thread_message( info, &result ); in the "else" case at the end of the function.
This is because send_inter_thread_message(...) hangs at wait_message_reply( info->flags ); because wait_message_reply(...) hangs at wow_handlers.wait_message( 1, &server_queue, INFINITE, QS_SENDMESSAGE, 0 ); which refers to wait_message( DWORD, CONST HANDLE*, DWORD, DWORD, DWORD) in dlls/user32/winproc.c, which in turn hangs at ret = USER_Driver->pMsgWaitForMultipleObjectsEx( count, handles, timeout, mask, flags );.
From here, I kind of lose track of what's happening exactly. What I know for
sure is that X11DRV_MsgWaitForMultipleObjectsEx(DWORD, const HANDLE*, DWORD, DWORD, DWORD) in dlls/winex11.drv/event.c gets called over and over again, once every 5 seconds. The first time it returns calling WaitForMultipleObjectsEx under the "if (!data)" condition. Any subsequent call ends at the above "return WAIT_TIMEOUT;".
So, Henri, you already expected something related to WaitForMultipleObjects[Ex]... however this one was hard to find since there is no TRACE in the method. Seems like we're now deep into message handling and this has only little to nothing to do with wine's d3d implementation... How do we proceed from here?