At 12:38 AM 10/11/2001 -0500, you wrote:
>1. 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