Module: wine Branch: master Commit: bd5d5e97767eaa9827a464195be50fdd036d72d2 URL: http://source.winehq.org/git/wine.git/?a=commit;h=bd5d5e97767eaa9827a464195b...
Author: Alexandre Julliard julliard@winehq.org Date: Wed Dec 12 20:17:21 2012 +0100
user32: Start checking for driver events more often when the app doesn't consume messages properly.
---
dlls/user32/message.c | 12 ++++++++++++ dlls/user32/user_private.h | 3 ++- dlls/user32/winproc.c | 1 + 3 files changed, 15 insertions(+), 1 deletions(-)
diff --git a/dlls/user32/message.c b/dlls/user32/message.c index 3f0312a..79066a8 100644 --- a/dlls/user32/message.c +++ b/dlls/user32/message.c @@ -3671,6 +3671,16 @@ void WINAPI PostQuitMessage( INT exit_code ) SERVER_END_REQ; }
+/* check for driver events if we detect that the app is not properly consuming messages */ +static inline void check_for_driver_events(void) +{ + if (get_user_thread_info()->message_count > 200) + { + flush_window_surfaces( FALSE ); + USER_Driver->pMsgWaitForMultipleObjectsEx( 0, NULL, 0, QS_ALLINPUT, 0 ); + } + else get_user_thread_info()->message_count++; +}
/*********************************************************************** * PeekMessageW (USER32.@) @@ -3680,6 +3690,7 @@ BOOL WINAPI DECLSPEC_HOTPATCH PeekMessageW( MSG *msg_out, HWND hwnd, UINT first, MSG msg;
USER_CheckNotLock(); + check_for_driver_events();
if (!peek_message( &msg, hwnd, first, last, flags, 0 )) { @@ -3726,6 +3737,7 @@ BOOL WINAPI DECLSPEC_HOTPATCH GetMessageW( MSG *msg, HWND hwnd, UINT first, UINT unsigned int mask = QS_POSTMESSAGE | QS_SENDMESSAGE; /* Always selected */
USER_CheckNotLock(); + check_for_driver_events();
if (first || last) { diff --git a/dlls/user32/user_private.h b/dlls/user32/user_private.h index 3dc68c3..d743062 100644 --- a/dlls/user32/user_private.h +++ b/dlls/user32/user_private.h @@ -172,7 +172,8 @@ struct wm_char_mapping_data struct user_thread_info { HANDLE server_queue; /* Handle to server-side queue */ - DWORD recursion_count; /* SendMessage recursion counter */ + WORD recursion_count; /* SendMessage recursion counter */ + WORD message_count; /* Get/PeekMessage loop counter */ BOOL hook_unicode; /* Is current hook unicode? */ HHOOK hook; /* Current hook */ struct received_message_info *receive_info; /* Message being currently received */ diff --git a/dlls/user32/winproc.c b/dlls/user32/winproc.c index 3b13b82..e6b5194 100644 --- a/dlls/user32/winproc.c +++ b/dlls/user32/winproc.c @@ -1126,6 +1126,7 @@ static DWORD wait_message( DWORD count, CONST HANDLE *handles, DWORD timeout, DW { DWORD ret = USER_Driver->pMsgWaitForMultipleObjectsEx( count, handles, timeout, mask, flags ); if (ret == WAIT_TIMEOUT && !count && !timeout) NtYieldExecution(); + if ((mask & QS_INPUT) == QS_INPUT) get_user_thread_info()->message_count = 0; return ret; }