Release 940722

Mon Jul 18 23:55:13 MET DST 1994

	* [if1632/call.S]
	CallTo16(): added `mov %eax,%edx' just before lcall,
	to make sure that DX contain the DLL's hinstance when
	initialised.

	CallTo32_16() added, equal to CallTo32() except for
	one thing: it saves DX and 

	* [tools/build.c]
	Added some code to support 16 and 32 bit return values.

	* [1632/{kernel,user}.spec]
	Changed most of the `pascal' style to pascal_16 when
	function returned a 16bit value.

Tue Jul 19 18:40:25 1994  Alexandre Julliard  (julliard@lamisun.epfl.ch)

	* [controls/menu.c]
	Reorganized sizing and drawing code to implement multi-line menus.
	Implemented MENUBREAK style.
	Use system colors to draw menus.

	* [objects/color.c]
	Bug fix in COLOR_IsSolid().

	* [objects/font.c]
	Bug fix in FONT_GetMetrics(): calculate average character width
	only on existing chars (dialogs look much better).

	* [objects/text.c]
	Bug fix in DrawText(): use text color to underline mnemonic.

	* [windows/nonclient.c]
	Changed WM_NCHITTEST handling to cope with multi-line menu bars.

	* [windows/syscolor.c]
	Added system objects for menu colors.

Mon Jul 18 19:32:08 PDT 1994  Andrew Lagodzinski  (andrew@netcom.com)

        * [controls/menu.c]
        Fixed bug in SelectPrevItem that caused seperators to not be
	skipped when using the up arrow key.
diff --git a/windows/nonclient.c b/windows/nonclient.c
index edc5ac2..c364b02 100644
--- a/windows/nonclient.c
+++ b/windows/nonclient.c
@@ -27,7 +27,8 @@
 extern void WINPOS_GetMinMaxInfo( HWND hwnd, POINT *maxSize, POINT *maxPos,
 			    POINT *minTrack, POINT *maxTrack );  /* winpos.c */
 extern void CURSOR_SetWinCursor( HWND hwnd, HCURSOR hcursor );   /* cursor.c */
-extern WORD MENU_GetMenuBarHeight( HWND hwnd, WORD menubarWidth ); /* menu.c */
+extern WORD MENU_GetMenuBarHeight( HWND hwnd, WORD menubarWidth,
+				   int orgX, int orgY );         /* menu.c */
 
 
   /* Some useful macros */
@@ -127,7 +128,8 @@
     if (HAS_MENU(wndPtr))
     {
 	params->rgrc[0].top += MENU_GetMenuBarHeight( hwnd,
-				params->rgrc[0].right - params->rgrc[0].left );
+				  params->rgrc[0].right - params->rgrc[0].left,
+				  -tmpRect.left, -tmpRect.top ) + 1;
     }
     return 0;
 }
@@ -178,43 +180,61 @@
 
     GetWindowRect( hwnd, &rect );
     if (!PtInRect( &rect, pt )) return HTNOWHERE;
-    ScreenToClient( hwnd, &pt );
-    GetClientRect( hwnd, &rect );
-    
-    if (PtInRect( &rect, pt )) return HTCLIENT;
 
-      /* Check vertical scroll bar */
-    if (wndPtr->dwStyle & WS_VSCROLL)
-    {
-	rect.right += SYSMETRICS_CXVSCROLL;
-	if (PtInRect( &rect, pt )) return HTVSCROLL;
-    }
+      /* Check borders */
 
-      /* Check horizontal scroll bar */
-    if (wndPtr->dwStyle & WS_HSCROLL)
+    if (HAS_THICKFRAME( wndPtr->dwStyle ))
     {
-	rect.bottom += SYSMETRICS_CYHSCROLL;
-	if (PtInRect( &rect, pt ))
+	InflateRect( &rect, -SYSMETRICS_CXFRAME, -SYSMETRICS_CYFRAME );
+	if (wndPtr->dwStyle & WS_BORDER)
+	    InflateRect( &rect, -SYSMETRICS_CXBORDER, -SYSMETRICS_CYBORDER );
+	if (!PtInRect( &rect, pt ))
 	{
-	      /* Check size box */
-	    if ((wndPtr->dwStyle & WS_VSCROLL) &&
-		(pt.x >= rect.right - SYSMETRICS_CXVSCROLL)) return HTSIZE;
-	    return HTHSCROLL;
+	      /* Check top sizing border */
+	    if (pt.y < rect.top)
+	    {
+		if (pt.x < rect.left+SYSMETRICS_CXSIZE) return HTTOPLEFT;
+		if (pt.x >= rect.right-SYSMETRICS_CXSIZE) return HTTOPRIGHT;
+		return HTTOP;
+	    }
+	      /* Check bottom sizing border */
+	    if (pt.y >= rect.bottom)
+	    {
+		if (pt.x < rect.left+SYSMETRICS_CXSIZE) return HTBOTTOMLEFT;
+		if (pt.x >= rect.right-SYSMETRICS_CXSIZE) return HTBOTTOMRIGHT;
+		return HTBOTTOM;
+	    }
+	      /* Check left sizing border */
+	    if (pt.x < rect.left)
+	    {
+		if (pt.y < rect.top+SYSMETRICS_CYSIZE) return HTTOPLEFT;
+		if (pt.y >= rect.bottom-SYSMETRICS_CYSIZE) return HTBOTTOMLEFT;
+		return HTLEFT;
+	    }
+	      /* Check right sizing border */
+	    if (pt.x >= rect.right)
+	    {
+		if (pt.y < rect.top+SYSMETRICS_CYSIZE) return HTTOPRIGHT;
+		if (pt.y >= rect.bottom-SYSMETRICS_CYSIZE) return HTBOTTOMRIGHT;
+		return HTRIGHT;
+	    }
 	}
     }
-
-      /* Check menu */
-    if (HAS_MENU(wndPtr))
+    else  /* No thick frame */
     {
-	rect.top -= SYSMETRICS_CYMENU + 1;
-	if (PtInRect( &rect, pt )) return HTMENU;
+	if (HAS_DLGFRAME( wndPtr->dwStyle, wndPtr->dwExStyle ))
+	    InflateRect(&rect, -SYSMETRICS_CXDLGFRAME, -SYSMETRICS_CYDLGFRAME);
+	else if (wndPtr->dwStyle & WS_BORDER)
+	    InflateRect(&rect, -SYSMETRICS_CXBORDER, -SYSMETRICS_CYBORDER);
+	if (!PtInRect( &rect, pt )) return HTBORDER;
     }
 
       /* Check caption */
+
     if ((wndPtr->dwStyle & WS_CAPTION) == WS_CAPTION)
     {
-	rect.top -= SYSMETRICS_CYCAPTION - 1;
-	if (PtInRect( &rect, pt ))
+	rect.top += SYSMETRICS_CYCAPTION - 1;
+	if (!PtInRect( &rect, pt ))
 	{
 	      /* Check system menu */
 	    if ((wndPtr->dwStyle & WS_SYSMENU) && (pt.x <= SYSMETRICS_CXSIZE))
@@ -230,40 +250,42 @@
 	    return HTCAPTION;
 	}
     }
-    
-      /* Check non-sizing border */
-    if (!HAS_THICKFRAME( wndPtr->dwStyle )) return HTBORDER;
 
-      /* Check top sizing border */
-    if (pt.y < rect.top)
+      /* Check client area */
+
+    ScreenToClient( hwnd, &pt );
+    GetClientRect( hwnd, &rect );
+    if (PtInRect( &rect, pt )) return HTCLIENT;
+
+      /* Check vertical scroll bar */
+
+    if (wndPtr->dwStyle & WS_VSCROLL)
     {
-	if (pt.x < rect.left+SYSMETRICS_CXSIZE) return HTTOPLEFT;
-	if (pt.x >= rect.right-SYSMETRICS_CXSIZE) return HTTOPRIGHT;
-	return HTTOP;
+	rect.right += SYSMETRICS_CXVSCROLL;
+	if (PtInRect( &rect, pt )) return HTVSCROLL;
     }
 
-      /* Check bottom sizing border */
-    if (pt.y >= rect.bottom)
+      /* Check horizontal scroll bar */
+
+    if (wndPtr->dwStyle & WS_HSCROLL)
     {
-	if (pt.x < rect.left+SYSMETRICS_CXSIZE) return HTBOTTOMLEFT;
-	if (pt.x >= rect.right-SYSMETRICS_CXSIZE) return HTBOTTOMRIGHT;
-	return HTBOTTOM;
-    }
-    
-      /* Check left sizing border */
-    if (pt.x < rect.left)
-    {
-	if (pt.y < rect.top+SYSMETRICS_CYSIZE) return HTTOPLEFT;
-	if (pt.y >= rect.bottom-SYSMETRICS_CYSIZE) return HTBOTTOMLEFT;
-	return HTLEFT;
+	rect.bottom += SYSMETRICS_CYHSCROLL;
+	if (PtInRect( &rect, pt ))
+	{
+	      /* Check size box */
+	    if ((wndPtr->dwStyle & WS_VSCROLL) &&
+		(pt.x >= rect.right - SYSMETRICS_CXVSCROLL))
+		return HTSIZE;
+	    return HTHSCROLL;
+	}
     }
 
-      /* Check right sizing border */
-    if (pt.x >= rect.right)
+      /* Check menu bar */
+
+    if (HAS_MENU(wndPtr))
     {
-	if (pt.y < rect.top+SYSMETRICS_CYSIZE) return HTTOPRIGHT;
-	if (pt.y >= rect.bottom-SYSMETRICS_CYSIZE) return HTBOTTOMRIGHT;
-	return HTRIGHT;
+	if ((pt.y < 0) && (pt.x >= 0) && (pt.x < rect.right))
+	    return HTMENU;
     }
 
       /* Should never get here */
@@ -537,9 +559,9 @@
 #ifdef DEBUG_NONCLIENT
     printf( "NC_DoNCPaint: %d %d\n", hwnd, hrgn );
 #endif
-    if (!IsWindowVisible(hwnd)) return;
     if (!wndPtr || !hrgn) return;
-    if (!(wndPtr->dwStyle & (WS_BORDER | WS_DLGFRAME | WS_THICKFRAME)))
+    if ((!(wndPtr->dwStyle & (WS_BORDER | WS_DLGFRAME | WS_THICKFRAME))) ||
+	(!(wndPtr->dwStyle & WS_VISIBLE)))
 	return;  /* Nothing to do! */
 
     if (hrgn == 1) hdc = GetDCEx( hwnd, 0, DCX_CACHE | DCX_WINDOW );
@@ -594,27 +616,15 @@
 	NC_DrawCaption( hdc, &r, hwnd, wndPtr->dwStyle, active );
     }
 
-    if (wndPtr->wIDmenu != 0 &&
-	(wndPtr->dwStyle & WS_CHILD) != WS_CHILD) {
-	LPPOPUPMENU	lpMenu = (LPPOPUPMENU) GlobalLock(wndPtr->wIDmenu);
-	if (lpMenu != NULL) {
-		int oldHeight;
-		CopyRect(&rect2, &rect);
-		/* Default MenuBar height */
-		if (lpMenu->Height == 0) lpMenu->Height = SYSMETRICS_CYMENU + 1;
-		oldHeight = lpMenu->Height;
-		rect2.bottom = rect2.top + oldHeight; 
-		StdDrawMenuBar(hdc, &rect2, lpMenu, suppress_menupaint);
-		if (oldHeight != lpMenu->Height) {
-			printf("NC_DoNCPaint // menubar changed oldHeight=%d != lpMenu->Height=%d\n",
-									oldHeight, lpMenu->Height);
-			/* Reduce ClientRect according to MenuBar height */
-			wndPtr->rectClient.top -= oldHeight;
-			wndPtr->rectClient.top += lpMenu->Height;
-			}
-		GlobalUnlock(wndPtr->wIDmenu);
-		}
-	}
+    if (HAS_MENU(wndPtr))
+    {
+	LPPOPUPMENU lpMenu = (LPPOPUPMENU) GlobalLock( wndPtr->wIDmenu );
+	RECT r = rect;
+	r.bottom = rect.top + lpMenu->Height;
+	rect.top += lpMenu->Height;
+	StdDrawMenuBar( hdc, &r, lpMenu, suppress_menupaint );
+	GlobalUnlock( wndPtr->wIDmenu );
+    }
 
     if (wndPtr->dwStyle & (WS_VSCROLL | WS_HSCROLL)) {
  	if ((wndPtr->dwStyle & WS_VSCROLL) && (wndPtr->VScroll != NULL) &&
@@ -624,9 +634,6 @@
 			bottom -= SYSMETRICS_CYHSCROLL;
 	    SetRect(&rect2, rect.right - SYSMETRICS_CXVSCROLL, 
 	    	rect.top, rect.right, bottom); 
-	    if (wndPtr->dwStyle & WS_CAPTION) rect.top += SYSMETRICS_CYSIZE;
-	    if (wndPtr->wIDmenu != 0 && (wndPtr->dwStyle & WS_CHILD) != WS_CHILD) 
-	    	rect2.top += SYSMETRICS_CYMENU + 1;
  	    StdDrawScrollBar(hwnd, hdc, SB_VERT, &rect2, (LPHEADSCROLL)wndPtr->VScroll);
  	    }
  	if ((wndPtr->dwStyle & WS_HSCROLL) && wndPtr->HScroll != NULL &&