Hi all (after a long absence...) and here's a patch for the menu and the caption buttons

William Poetra Yoga H williampoetra at yahoo.com
Sat Apr 16 22:35:55 CDT 2005


OK, I think I haven't explained the patches (sorry).

--- William Poetra Yoga H <williampoetra at yahoo.com> wrote:

> Hi guys (and gals), sorry for the long absence but my time got taken up in
> something else (a problem with my isp, see
> http://sourceforge.net/projects/drcom-client) and I couldn't spend my time
> here...
> 
> Anyway, here are patches for the menu (it fixes some menu sizes, and also the
> shift-down-by-1-pixel bug in winemine), and the caption (fixes the size and
> position of the caption buttons).
> 
> Comments?
> 
> William Poetra Yoga Hadisoeseno
> 
> __________________________________________________
> Do You Yahoo!?
> Tired of spam?  Yahoo! Mail has the best spam protection around 
> http://mail.yahoo.com > Index: dlls/user/menu.c
> ===================================================================
> RCS file: /home/wine/wine/dlls/user/menu.c,v
> retrieving revision 1.25
> diff -u -p -r1.25 menu.c
> --- dlls/user/menu.c	14 Apr 2005 13:56:29 -0000	1.25
> +++ dlls/user/menu.c	15 Apr 2005 04:37:27 -0000
> @@ -1090,7 +1090,7 @@ static void MENU_MenuBarCalcSize( HDC hd
>            lprect->left, lprect->top, lprect->right, lprect->bottom);
>      lppop->Width  = lprect->right - lprect->left;
>      lppop->Height = 0;
> -    maxY = lprect->top+1;
> +    maxY = lprect->top;
>      start = 0;
>      helpPos = -1;
>      lppop->maxBmpSize.cx = 0;
> @@ -1126,7 +1126,7 @@ static void MENU_MenuBarCalcSize( HDC hd
>  	while (start < i) lppop->items[start++].rect.bottom = maxY;
>      }
>  
> -    lprect->bottom = maxY;
> +    lprect->bottom = maxY + 1;
>      lppop->Height = lprect->bottom - lprect->top;
>  
>      /* Flush right all items between the MF_RIGHTJUSTIFY and */
> @@ -1514,7 +1514,7 @@ UINT MENU_DrawMenuBar( HDC hDC, LPRECT l
>      lppop = MENU_GetMenu( hMenu );
>      if (lppop == NULL || lprect == NULL)
>      {
> -        return GetSystemMetrics(SM_CYMENU);
> +        return GetSystemMetrics(SM_CYMENU) + 1;
>      }
>  
>      if (suppress_draw)
> @@ -3857,7 +3857,7 @@ DWORD WINAPI DrawMenuBarTemp(HWND hwnd, 
>      lppop = MENU_GetMenu( hMenu );
>      if (lppop == NULL || lprect == NULL)
>      {
> -        retvalue = GetSystemMetrics(SM_CYMENU);
> +        retvalue = GetSystemMetrics(SM_CYMENU) + 1;
>          goto END;
>      }
>  
> @@ -3878,7 +3878,7 @@ DWORD WINAPI DrawMenuBarTemp(HWND hwnd, 
>  
>      if (lppop->nItems == 0)
>      {
> -        retvalue = GetSystemMetrics(SM_CYMENU);
> +        retvalue = GetSystemMetrics(SM_CYMENU) + 1;
>          goto END;
>      }
>  

The above patch fixes the menubar; previously the menubar was a bit too high
(there is a missing row of pixels betweel the caption and the menu). This fixes
the menubar.

> Index: windows/nonclient.c
> ===================================================================
> RCS file: /home/wine/wine/windows/nonclient.c,v
> retrieving revision 1.141
> diff -u -p -r1.141 nonclient.c
> --- windows/nonclient.c	13 Apr 2005 16:13:45 -0000	1.141
> +++ windows/nonclient.c	15 Apr 2005 04:37:28 -0000
> @@ -398,7 +398,7 @@ LONG NC_HandleNCCalcSize( HWND hwnd, REC
>  	    winRect->top +=
>  		MENU_GetMenuBarHeight( hwnd,
>  				       winRect->right - winRect->left,
> -				       -tmpRect.left, -tmpRect.top ) + 1;
> +				       -tmpRect.left, -tmpRect.top );
>  	}
>  
>          if( exStyle & WS_EX_CLIENTEDGE)
> > Index: windows/nonclient.c
> ===================================================================
> RCS file: /home/wine/wine/windows/nonclient.c,v
> retrieving revision 1.141
> diff -u -p -r1.141 nonclient.c
> --- windows/nonclient.c	13 Apr 2005 16:13:45 -0000	1.141
> +++ windows/nonclient.c	15 Apr 2005 04:37:28 -0000
> @@ -691,21 +691,21 @@ static void NC_DrawCloseButton (HWND hwn
>      /* A tool window has a smaller Close button */
>      if (GetWindowLongW( hwnd, GWL_EXSTYLE ) & WS_EX_TOOLWINDOW)
>      {
> -        INT iBmpHeight = 11; /* Windows does not use SM_CXSMSIZE and
> SM_CYSMSIZE   */
> -        INT iBmpWidth = 11;  /* it uses 11x11 for  the close button in tool
> window */
> -        INT iCaptionHeight = GetSystemMetrics(SM_CYSMCAPTION);
> +        INT iCaptionHeight = GetSystemMetrics(SM_CYSMCAPTION) - 1;
> +        INT iBmpHeight = iCaptionHeight - 4;
> +        INT iBmpWidth = iCaptionHeight - 5;
>  
> -        rect.top = rect.top + (iCaptionHeight - 1 - iBmpHeight) / 2;
> -        rect.left = rect.right - (iCaptionHeight + 1 + iBmpWidth) / 2;
> +        rect.top += 2;
> +        rect.right -= 2;
>          rect.bottom = rect.top + iBmpHeight;
> -        rect.right = rect.left + iBmpWidth;
> +        rect.left = rect.right - iBmpWidth;
>      }
>      else
>      {
> -        rect.left = rect.right - GetSystemMetrics(SM_CXSIZE) - 1;
> -        rect.bottom = rect.top + GetSystemMetrics(SM_CYSIZE) - 1;
>          rect.top += 2;
>          rect.right -= 2;
> +        rect.bottom = rect.top + (GetSystemMetrics(SM_CYSIZE) - 4);
> +        rect.left = rect.right - (GetSystemMetrics(SM_CXSIZE) - 2);
>      }
>      DrawFrameControl( hdc, &rect, DFC_CAPTION,
>                        (DFCS_CAPTIONCLOSE |
> @@ -731,12 +731,12 @@ static void NC_DrawMaxButton(HWND hwnd,H
>      flags = IsZoomed(hwnd) ? DFCS_CAPTIONRESTORE : DFCS_CAPTIONMAX;
>  
>      NC_GetInsideRect( hwnd, &rect );
> -    if (GetWindowLongW( hwnd, GWL_STYLE) & WS_SYSMENU)
> -        rect.right -= GetSystemMetrics(SM_CXSIZE) + 1;
> -    rect.left = rect.right - GetSystemMetrics(SM_CXSIZE);
> -    rect.bottom = rect.top + GetSystemMetrics(SM_CYSIZE) - 1;
>      rect.top += 2;
> +    if (GetWindowLongA( hwnd, GWL_STYLE) & WS_SYSMENU)
> +        rect.right -= (GetSystemMetrics(SM_CXSIZE) - 2) + 2;
>      rect.right -= 2;
> +    rect.bottom = rect.top + (GetSystemMetrics(SM_CYSIZE) - 4);
> +    rect.left = rect.right - (GetSystemMetrics(SM_CXSIZE) - 2);
>      if (down) flags |= DFCS_PUSHED;
>      if (bGrayed) flags |= DFCS_INACTIVE;
>      DrawFrameControl( hdc, &rect, DFC_CAPTION, flags );
> @@ -759,14 +759,14 @@ static void  NC_DrawMinButton(HWND hwnd,
>          return;
>  
>      NC_GetInsideRect( hwnd, &rect );
> +    rect.top += 2;
>      if (style & WS_SYSMENU)
> -        rect.right -= GetSystemMetrics(SM_CXSIZE) + 1;
> +        rect.right -= (GetSystemMetrics(SM_CXSIZE) - 2) + 2;
> +    rect.right -= 2;
>      if (style & (WS_MAXIMIZEBOX|WS_MINIMIZEBOX))
>          rect.right -= GetSystemMetrics(SM_CXSIZE) - 2;
> -    rect.left = rect.right - GetSystemMetrics(SM_CXSIZE);
> -    rect.bottom = rect.top + GetSystemMetrics(SM_CYSIZE) - 1;
> -    rect.top += 2;
> -    rect.right -= 2;
> +    rect.left = rect.right - (GetSystemMetrics(SM_CXSIZE) - 2);
> +    rect.bottom = rect.top + (GetSystemMetrics(SM_CYSIZE) - 4);
>      if (down) flags |= DFCS_PUSHED;
>      if (bGrayed) flags |= DFCS_INACTIVE;
>      DrawFrameControl( hdc, &rect, DFC_CAPTION, flags );
> @@ -893,19 +893,23 @@ static void  NC_DrawCaption( HDC  hdc, R
>  
>  	/* Draw a grayed close button if disabled or if SC_CLOSE is not there */
>  	NC_DrawCloseButton (hwnd, hdc, FALSE,
> -			    (state & (MF_DISABLED | MF_GRAYED)) || (state == 0xFFFFFFFF));
> -	r.right -= GetSystemMetrics(SM_CYCAPTION) - 1;
> +			    ((((state & MF_DISABLED) || (state & MF_GRAYED))) && (state !=
> 0xFFFFFFFF)));
> +	r.right -= (GetSystemMetrics(SM_CXSIZE) - 2) + 2;
>  
>  	if ((style & WS_MAXIMIZEBOX) || (style & WS_MINIMIZEBOX))
>  	{
> +            /* There's a 2-pixel space between Maximize and Close buttons */
> +
> +            r.right -= 2;
> +
>  	    /* In win95 the two buttons are always there */
>  	    /* But if the menu item is not in the menu they're disabled*/
>  
>  	    NC_DrawMaxButton( hwnd, hdc, FALSE, (!(style & WS_MAXIMIZEBOX)));
> -	    r.right -= GetSystemMetrics(SM_CXSIZE) + 1;
> +	    r.right -= GetSystemMetrics(SM_CXSIZE) - 2;
>  
>  	    NC_DrawMinButton( hwnd, hdc, FALSE,  (!(style & WS_MINIMIZEBOX)));
> -	    r.right -= GetSystemMetrics(SM_CXSIZE) + 1;
> +	    r.right -= GetSystemMetrics(SM_CXSIZE) - 2;
>  	}
>      }
>  
> @@ -924,6 +928,7 @@ static void  NC_DrawCaption( HDC  hdc, R
>  	else SetTextColor( hdc, GetSysColor( COLOR_INACTIVECAPTIONTEXT ) );
>  	SetBkMode( hdc, TRANSPARENT );
>  	r.left += 2;
> +        r.right -= 2;
>  	DrawTextW( hdc, buffer, -1, &r,
>  		     DT_SINGLELINE | DT_VCENTER | DT_NOPREFIX | DT_LEFT );
>  	DeleteObject (SelectObject (hdc, hOldFont));
> @@ -1025,7 +1030,7 @@ static void  NC_DoNCPaint( HWND  hwnd, H
>  	TRACE("Calling DrawMenuBar with rect (%ld, %ld)-(%ld, %ld)\n",
>                r.left, r.top, r.right, r.bottom);
>  
> -	rect.top += MENU_DrawMenuBar( hdc, &r, hwnd, suppress_menupaint ) + 1;
> +	rect.top += MENU_DrawMenuBar( hdc, &r, hwnd, suppress_menupaint );
>      }
>  
>      TRACE("After MenuBar, rect is (%ld, %ld)-(%ld, %ld).\n",
> 

This patch fixes the caption bar: the size of the system menu, the spacing
between the caption buttons, the sizes of the caption buttons with respect to
the size of the caption bar itself, and the spacing between the caption bar and
the menu.

Any comments on these? If not I'm sending it to wine-patches.


William Poetra Yoga Hadisoeseno


		
__________________________________ 
Do you Yahoo!? 
Make Yahoo! your home page 
http://www.yahoo.com/r/hs



More information about the wine-devel mailing list