Commit b33c5f16 authored by Alexandre Julliard's avatar Alexandre Julliard

user32: Add a WoW wrapper for message waiting to allow releasing the Win16 lock in the 16-bit code.

parent 2ea73fd7
...@@ -96,6 +96,7 @@ struct wow_handlers16 ...@@ -96,6 +96,7 @@ struct wow_handlers16
LRESULT (*mdiclient_proc)(HWND,UINT,WPARAM,LPARAM,BOOL); LRESULT (*mdiclient_proc)(HWND,UINT,WPARAM,LPARAM,BOOL);
LRESULT (*scrollbar_proc)(HWND,UINT,WPARAM,LPARAM,BOOL); LRESULT (*scrollbar_proc)(HWND,UINT,WPARAM,LPARAM,BOOL);
LRESULT (*static_proc)(HWND,UINT,WPARAM,LPARAM,BOOL); LRESULT (*static_proc)(HWND,UINT,WPARAM,LPARAM,BOOL);
DWORD (*wait_message)(DWORD,const HANDLE*,DWORD,DWORD,DWORD);
HWND (*create_window)(CREATESTRUCTW*,LPCWSTR,HINSTANCE,BOOL); HWND (*create_window)(CREATESTRUCTW*,LPCWSTR,HINSTANCE,BOOL);
LRESULT (*call_window_proc)(HWND,UINT,WPARAM,LPARAM,LRESULT*,void*); LRESULT (*call_window_proc)(HWND,UINT,WPARAM,LPARAM,LRESULT*,void*);
LRESULT (*call_dialog_proc)(HWND,UINT,WPARAM,LPARAM,LRESULT*,void*); LRESULT (*call_dialog_proc)(HWND,UINT,WPARAM,LPARAM,LRESULT*,void*);
...@@ -114,6 +115,7 @@ struct wow_handlers32 ...@@ -114,6 +115,7 @@ struct wow_handlers32
LRESULT (*mdiclient_proc)(HWND,UINT,WPARAM,LPARAM,BOOL); LRESULT (*mdiclient_proc)(HWND,UINT,WPARAM,LPARAM,BOOL);
LRESULT (*scrollbar_proc)(HWND,UINT,WPARAM,LPARAM,BOOL); LRESULT (*scrollbar_proc)(HWND,UINT,WPARAM,LPARAM,BOOL);
LRESULT (*static_proc)(HWND,UINT,WPARAM,LPARAM,BOOL); LRESULT (*static_proc)(HWND,UINT,WPARAM,LPARAM,BOOL);
DWORD (*wait_message)(DWORD,const HANDLE*,DWORD,DWORD,DWORD);
HWND (*create_window)(CREATESTRUCTW*,LPCWSTR,HINSTANCE,BOOL); HWND (*create_window)(CREATESTRUCTW*,LPCWSTR,HINSTANCE,BOOL);
HWND (*get_win_handle)(HWND); HWND (*get_win_handle)(HWND);
WNDPROC (*alloc_winproc)(WNDPROC,BOOL); WNDPROC (*alloc_winproc)(WNDPROC,BOOL);
......
...@@ -2266,7 +2266,6 @@ static void wait_message_reply( UINT flags ) ...@@ -2266,7 +2266,6 @@ static void wait_message_reply( UINT flags )
for (;;) for (;;)
{ {
unsigned int wake_bits = 0; unsigned int wake_bits = 0;
DWORD dwlc, res;
SERVER_START_REQ( set_queue_mask ) SERVER_START_REQ( set_queue_mask )
{ {
...@@ -2286,12 +2285,7 @@ static void wait_message_reply( UINT flags ) ...@@ -2286,12 +2285,7 @@ static void wait_message_reply( UINT flags )
continue; continue;
} }
/* now wait for it */ wow_handlers.wait_message( 1, &server_queue, INFINITE, QS_SENDMESSAGE, 0 );
ReleaseThunkLock( &dwlc );
res = USER_Driver->pMsgWaitForMultipleObjectsEx( 1, &server_queue,
INFINITE, QS_SENDMESSAGE, 0 );
if (dwlc) RestoreThunkLock( dwlc );
} }
} }
...@@ -2955,11 +2949,7 @@ BOOL WINAPI GetMessageW( MSG *msg, HWND hwnd, UINT first, UINT last ) ...@@ -2955,11 +2949,7 @@ BOOL WINAPI GetMessageW( MSG *msg, HWND hwnd, UINT first, UINT last )
while (!peek_message( msg, hwnd, first, last, PM_REMOVE | (mask << 16), mask )) while (!peek_message( msg, hwnd, first, last, PM_REMOVE | (mask << 16), mask ))
{ {
DWORD dwlc; wow_handlers.wait_message( 1, &server_queue, INFINITE, mask, 0 );
ReleaseThunkLock( &dwlc );
USER_Driver->pMsgWaitForMultipleObjectsEx( 1, &server_queue, INFINITE, mask, 0 );
if (dwlc) RestoreThunkLock( dwlc );
} }
return (msg->message != WM_QUIT); return (msg->message != WM_QUIT);
...@@ -3269,7 +3259,7 @@ DWORD WINAPI MsgWaitForMultipleObjectsEx( DWORD count, CONST HANDLE *pHandles, ...@@ -3269,7 +3259,7 @@ DWORD WINAPI MsgWaitForMultipleObjectsEx( DWORD count, CONST HANDLE *pHandles,
DWORD timeout, DWORD mask, DWORD flags ) DWORD timeout, DWORD mask, DWORD flags )
{ {
HANDLE handles[MAXIMUM_WAIT_OBJECTS]; HANDLE handles[MAXIMUM_WAIT_OBJECTS];
DWORD i, ret, lock; DWORD i;
if (count > MAXIMUM_WAIT_OBJECTS-1) if (count > MAXIMUM_WAIT_OBJECTS-1)
{ {
...@@ -3291,10 +3281,7 @@ DWORD WINAPI MsgWaitForMultipleObjectsEx( DWORD count, CONST HANDLE *pHandles, ...@@ -3291,10 +3281,7 @@ DWORD WINAPI MsgWaitForMultipleObjectsEx( DWORD count, CONST HANDLE *pHandles,
for (i = 0; i < count; i++) handles[i] = pHandles[i]; for (i = 0; i < count; i++) handles[i] = pHandles[i];
handles[count] = get_server_queue_handle(); handles[count] = get_server_queue_handle();
ReleaseThunkLock( &lock ); return wow_handlers.wait_message( count+1, handles, timeout, mask, flags );
ret = USER_Driver->pMsgWaitForMultipleObjectsEx( count+1, handles, timeout, mask, flags );
if (lock) RestoreThunkLock( lock );
return ret;
} }
......
...@@ -2569,6 +2569,20 @@ static LRESULT static_proc16( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, ...@@ -2569,6 +2569,20 @@ static LRESULT static_proc16( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam,
/*********************************************************************** /***********************************************************************
* wait_message16
*/
static DWORD wait_message16( DWORD count, CONST HANDLE *handles, DWORD timeout, DWORD mask, DWORD flags )
{
DWORD lock, ret;
ReleaseThunkLock( &lock );
ret = wow_handlers32.wait_message( count, handles, timeout, mask, flags );
RestoreThunkLock( lock );
return ret;
}
/***********************************************************************
* create_window16 * create_window16
*/ */
HWND create_window16( CREATESTRUCTW *cs, LPCWSTR className, HINSTANCE instance, BOOL unicode ) HWND create_window16( CREATESTRUCTW *cs, LPCWSTR className, HINSTANCE instance, BOOL unicode )
...@@ -2619,6 +2633,7 @@ void register_wow_handlers(void) ...@@ -2619,6 +2633,7 @@ void register_wow_handlers(void)
mdiclient_proc16, mdiclient_proc16,
scrollbar_proc16, scrollbar_proc16,
static_proc16, static_proc16,
wait_message16,
create_window16, create_window16,
call_window_proc_Ato16, call_window_proc_Ato16,
call_dialog_proc_Ato16, call_dialog_proc_Ato16,
......
...@@ -1121,6 +1121,11 @@ static LRESULT WINAPI StaticWndProcW( HWND hwnd, UINT msg, WPARAM wParam, LPARAM ...@@ -1121,6 +1121,11 @@ static LRESULT WINAPI StaticWndProcW( HWND hwnd, UINT msg, WPARAM wParam, LPARAM
return wow_handlers.static_proc( hwnd, msg, wParam, lParam, TRUE ); return wow_handlers.static_proc( hwnd, msg, wParam, lParam, TRUE );
} }
static DWORD wait_message( DWORD count, CONST HANDLE *handles, DWORD timeout, DWORD mask, DWORD flags )
{
return USER_Driver->pMsgWaitForMultipleObjectsEx( count, handles, timeout, mask, flags );
}
static HICON alloc_icon_handle( unsigned int size ) static HICON alloc_icon_handle( unsigned int size )
{ {
struct user_object *obj = HeapAlloc( GetProcessHeap(), 0, sizeof(*obj) + size ); struct user_object *obj = HeapAlloc( GetProcessHeap(), 0, sizeof(*obj) + size );
...@@ -1167,6 +1172,7 @@ void WINAPI UserRegisterWowHandlers( const struct wow_handlers16 *new, struct wo ...@@ -1167,6 +1172,7 @@ void WINAPI UserRegisterWowHandlers( const struct wow_handlers16 *new, struct wo
orig->mdiclient_proc = MDIClientWndProc_common; orig->mdiclient_proc = MDIClientWndProc_common;
orig->scrollbar_proc = ScrollBarWndProc_common; orig->scrollbar_proc = ScrollBarWndProc_common;
orig->static_proc = StaticWndProc_common; orig->static_proc = StaticWndProc_common;
orig->wait_message = wait_message;
orig->create_window = WIN_CreateWindowEx; orig->create_window = WIN_CreateWindowEx;
orig->get_win_handle = WIN_GetFullHandle; orig->get_win_handle = WIN_GetFullHandle;
orig->alloc_winproc = WINPROC_AllocProc; orig->alloc_winproc = WINPROC_AllocProc;
...@@ -1185,6 +1191,7 @@ struct wow_handlers16 wow_handlers = ...@@ -1185,6 +1191,7 @@ struct wow_handlers16 wow_handlers =
MDIClientWndProc_common, MDIClientWndProc_common,
ScrollBarWndProc_common, ScrollBarWndProc_common,
StaticWndProc_common, StaticWndProc_common,
wait_message,
WIN_CreateWindowEx, WIN_CreateWindowEx,
NULL, /* call_window_proc */ NULL, /* call_window_proc */
NULL, /* call_dialog_proc */ NULL, /* call_dialog_proc */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment