"Alexandre Julliard" <[EMAIL PROTECTED]> wrote:

> I think it's much better, drawing directly will cause a lot of
> problems, especially when called from another thread context. Unless
> you really have an app that depends on not getting a WM_NCPAINT here I
> see no reason not to use the normal mechanisms.

OK, here is another patch. But it now exposes a bug in Wine's RedrawWindow()
implementation. Under win2k RedrawWindow(RDW_FRAME | RDW_INVALIDATE) causes
a window to receive only WM_NCPAINT, while under Wine it redraws the whole
window.

-- 
Dmitry.
diff -u cvs/hq/wine/controls/menu.c wine/controls/menu.c
--- cvs/hq/wine/controls/menu.c Tue May 13 09:33:13 2003
+++ wine/controls/menu.c        Sun Aug 10 23:57:50 2003
@@ -3267,9 +3267,8 @@ UINT WINAPI EnableMenuItem( HMENU hMenu,
                if (!(parentMenu = MENU_GetMenu(menu->hSysMenuOwner)))
                    return (UINT)-1;
 
-               /* Refresh the frame to reflect the change*/
-               SetWindowPos(parentMenu->hWnd, 0, 0, 0, 0, 0,
-                            SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER);
+                /* Refresh the frame to reflect the change */
+                RedrawWindow(parentMenu->hWnd, NULL, 0, RDW_FRAME | RDW_INVALIDATE | 
RDW_NOCHILDREN);
            }
        }
 
diff -u cvs/hq/wine/windows/nonclient.c wine/windows/nonclient.c
--- cvs/hq/wine/windows/nonclient.c     Wed Feb 19 21:30:36 2003
+++ wine/windows/nonclient.c    Sun Aug 10 23:59:55 2003
@@ -1349,10 +1349,11 @@ static void  NC_DrawCaption95(
        /* Go get the sysmenu */
        hSysMenu = GetSystemMenu(hwnd, FALSE);
        state = GetMenuState(hSysMenu, SC_CLOSE, MF_BYCOMMAND);
+        if (state == 0xFFFFFFFF) state = 0;
+        if (GetClassLongW(hwnd, GCL_STYLE) & CS_NOCLOSE) state |= MF_GRAYED;
 
        /* Draw a grayed close button if disabled and a normal one if SC_CLOSE is not 
there */
-       NC_DrawCloseButton95 (hwnd, hdc, FALSE,
-                             ((((state & MF_DISABLED) || (state & MF_GRAYED))) && 
(state != 0xFFFFFFFF)));
+       NC_DrawCloseButton95 (hwnd, hdc, FALSE, state & (MF_DISABLED | MF_GRAYED));
        r.right -= GetSystemMetrics(SM_CYCAPTION) - 1;
 
        if ((style & WS_MAXIMIZEBOX) || (style & WS_MINIMIZEBOX))
@@ -1939,9 +1940,10 @@ NC_TrackCloseButton95 (HWND hwnd, WORD w
        return;
 
     state = GetMenuState(hSysMenu, SC_CLOSE, MF_BYCOMMAND);
+    if (GetClassLongW(hwnd, GCL_STYLE) & CS_NOCLOSE) state |= MF_GRAYED;
 
     /* If the item close of the sysmenu is disabled or not there do nothing */
-    if((state & MF_DISABLED) || (state & MF_GRAYED) || (state == 0xFFFFFFFF))
+    if((state & (MF_DISABLED | MF_GRAYED)) || (state == 0xFFFFFFFF))
        return;
 
     hdc = GetWindowDC( hwnd );

Reply via email to