At 12:38 AM 10/11/2001 -0500, you wrote:
- SetTimer call is not always generating WM_TIMER messages as it should. I
see:
0806bb20:Call user32.SetTimer(00020057,00001003,00000000,6003a04c) ret=6001e9e4 0806bb20:Ret user32.SetTimer() retval=00001003 ret=6001e9e4
in the trace, but never is the callback routine invoked. Without the above patch, the callback is invoked and does the painting.
I am not sure if it's related, but I have seen something like that. I have seen it since much longer than this patch, though.
It's about the paint count in the server. When there is a paint count > 0 in the server and the number of windows found to need a repaint (at the client level) is less than the paint count, the client can never get a timer event again.
Try this patch to dlls/user/message.c to see if your problem is related :
--- message.c.orig Sat Nov 10 07:03:29 2001 +++ message.c Sat Nov 10 07:08:27 2001 @@ -1861,6 +1861,7 @@ USER_Driver.pMsgWaitForMultipleObjectsEx( 0, NULL, 0, 0, 0 );
hwnd = WIN_GetFullHandle( hwnd ); +yetanothergoto: locks = WIN_SuspendWndsLock();
if (!MSG_peek_message( &msg, hwnd, first, last, @@ -1884,8 +1885,19 @@ /* need to fill the window handle for WM_PAINT message */ if (msg.message == WM_PAINT) { - if (!(msg.hwnd = WIN_FindWinToRepaint( hwnd ))) return FALSE; - + if (!(msg.hwnd = WIN_FindWinToRepaint( hwnd ))) + { + TRACE("FIXME : server paint count > 0 but no window needs painting\n"); + SERVER_START_REQ( inc_queue_paint_count ) + { + req->id = (void *)GetWindowThreadProcessId( hwnd, NULL ); + if (!req->id) req->id = (void *)GetCurrentThreadId(); + req->incr = -100000; /* reset paint count */ + SERVER_CALL(); + } + SERVER_END_REQ; + goto yetanothergoto; + } if (IsIconic( msg.hwnd ) && GetClassLongA( msg.hwnd, GCL_HICON )) { msg.message = WM_PAINTICON;
I have no idea about your second problem.
Gerard