diff --git a/windows/nonclient.c b/windows/nonclient.c index f382f04d20de210345a55f19c67c553e3c69b9a1..8d47dc638c31a95576c4ba08db9ab346515914ba 100644 --- a/windows/nonclient.c +++ b/windows/nonclient.c @@ -45,26 +45,23 @@ static HBITMAP16 hbitmapRestoreD = 0; /* Some useful macros */ #define HAS_DLGFRAME(style,exStyle) \ (((exStyle) & WS_EX_DLGMODALFRAME) || \ - (((style) & WS_DLGFRAME) && !((style) & WS_BORDER))) + (((style) & WS_DLGFRAME) && !((style) & WS_THICKFRAME))) -#define HAS_THICKFRAME(style) \ +#define HAS_THICKFRAME(style,exStyle) \ (((style) & WS_THICKFRAME) && \ - !(((style) & (WS_DLGFRAME|WS_BORDER)) == WS_DLGFRAME)) + !((exStyle) & WS_EX_DLGMODALFRAME)) -#define HAS_FIXEDFRAME(style,exStyle) \ - (((((exStyle) & WS_EX_DLGMODALFRAME) || \ - ((style) & WS_DLGFRAME)) && ((style) & WS_BORDER)) && \ - !((style) & WS_THICKFRAME)) +#define HAS_THINFRAME(style) \ + (((style) & WS_BORDER) || !((style) & (WS_CHILD | WS_POPUP))) -/* win31 style (simple border) in win95 look */ -#define HAS_CLASSICBORDER(style,exStyle) \ - (!((exStyle) & WS_EX_STATICEDGE) && !((exStyle) & WS_EX_CLIENTEDGE) && \ - !((style) & WS_THICKFRAME) && !((style) & WS_DLGFRAME) && \ - ((style) & WS_BORDER)) +#define HAS_BIGFRAME(style,exStyle) \ + (((style) & (WS_THICKFRAME | WS_DLGFRAME)) || \ + ((exStyle) & WS_EX_DLGMODALFRAME)) -#define HAS_SIZEFRAME(style) \ - (((style) & WS_THICKFRAME) && \ - !(((style) & (WS_DLGFRAME|WS_BORDER)) == WS_DLGFRAME)) +#define HAS_ANYFRAME(style,exStyle) \ + (((style) & (WS_THICKFRAME | WS_DLGFRAME | WS_BORDER)) || \ + ((exStyle) & WS_EX_DLGMODALFRAME) || \ + !((style) & (WS_CHILD | WS_POPUP))) #define HAS_MENU(w) (!((w)->dwStyle & WS_CHILD) && ((w)->wIDmenu != 0)) @@ -95,15 +92,14 @@ static void NC_AdjustRect( LPRECT16 rect, DWORD style, BOOL menu, ((style & (WS_DLGFRAME | WS_THICKFRAME)) || (exStyle & WS_EX_DLGMODALFRAME)))) { + if (HAS_THICKFRAME( style, exStyle )) + InflateRect16( rect, GetSystemMetrics(SM_CXFRAME), GetSystemMetrics(SM_CYFRAME) ); + else if (HAS_DLGFRAME( style, exStyle )) - InflateRect16(rect, GetSystemMetrics(SM_CXDLGFRAME), GetSystemMetrics(SM_CYDLGFRAME) ); + InflateRect16( rect, GetSystemMetrics(SM_CXDLGFRAME), GetSystemMetrics(SM_CYDLGFRAME) ); else - { - if (HAS_THICKFRAME(style)) - InflateRect16( rect, GetSystemMetrics(SM_CXFRAME), GetSystemMetrics(SM_CYFRAME) ); - if (style & WS_BORDER) - InflateRect16( rect, GetSystemMetrics(SM_CXBORDER), GetSystemMetrics(SM_CYBORDER)); - } + if (HAS_THINFRAME( style )) + InflateRect16( rect, GetSystemMetrics(SM_CXBORDER), GetSystemMetrics(SM_CYBORDER)); if ((style & WS_CAPTION) == WS_CAPTION) rect->top -= GetSystemMetrics(SM_CYCAPTION) - GetSystemMetrics(SM_CYBORDER); @@ -112,13 +108,13 @@ static void NC_AdjustRect( LPRECT16 rect, DWORD style, BOOL menu, if (style & WS_VSCROLL) { rect->right += GetSystemMetrics(SM_CXVSCROLL) - 1; - if(!(style & WS_BORDER)) + if(!HAS_ANYFRAME( style, exStyle )) rect->right++; } if (style & WS_HSCROLL) { rect->bottom += GetSystemMetrics(SM_CYHSCROLL) - 1; - if(!(style & WS_BORDER)) + if(!HAS_ANYFRAME( style, exStyle )) rect->bottom++; } } @@ -149,6 +145,9 @@ static void NC_AdjustRect( LPRECT16 rect, DWORD style, BOOL menu, * Split NC_AdjustRect95 into NC_AdjustRectOuter95 and * NC_AdjustRectInner95 and added handling of Win95 styles. * + * 28-Jul-1999 Ove Kåven (ovek@arcticnet.no) + * Streamlined window style checks. + * *****************************************************************************/ static void @@ -161,17 +160,14 @@ NC_AdjustRectOuter95 (LPRECT16 rect, DWORD style, BOOL menu, DWORD exStyle) ((style & (WS_DLGFRAME | WS_THICKFRAME)) || (exStyle & WS_EX_DLGMODALFRAME)))) { - if (HAS_FIXEDFRAME( style, exStyle )) + if (HAS_THICKFRAME( style, exStyle )) + InflateRect16( rect, GetSystemMetrics(SM_CXFRAME), GetSystemMetrics(SM_CYFRAME) ); + else + if (HAS_DLGFRAME( style, exStyle )) InflateRect16(rect, GetSystemMetrics(SM_CXDLGFRAME), GetSystemMetrics(SM_CYDLGFRAME) ); else - { - if (HAS_SIZEFRAME(style)) - InflateRect16( rect, GetSystemMetrics(SM_CXFRAME), GetSystemMetrics(SM_CYFRAME) ); -#if 0 - if (style & WS_BORDER) - InflateRect16( rect, GetSystemMetrics(SM_CXBORDER), GetSystemMetrics(SM_CYBORDER)); -#endif - } + if (HAS_THINFRAME( style )) + InflateRect16( rect, GetSystemMetrics(SM_CXBORDER), GetSystemMetrics(SM_CYBORDER)); if ((style & WS_CAPTION) == WS_CAPTION) { @@ -224,9 +220,6 @@ NC_AdjustRectInner95 (LPRECT16 rect, DWORD style, DWORD exStyle) if (exStyle & WS_EX_STATICEDGE) InflateRect16 (rect, GetSystemMetrics(SM_CXBORDER), GetSystemMetrics(SM_CYBORDER)); - if (HAS_CLASSICBORDER(style, exStyle)) - InflateRect16( rect, GetSystemMetrics(SM_CXBORDER), GetSystemMetrics(SM_CYBORDER )); - if (style & WS_VSCROLL) rect->right += GetSystemMetrics(SM_CXVSCROLL); if (style & WS_HSCROLL) rect->bottom += GetSystemMetrics(SM_CYHSCROLL); } @@ -566,19 +559,19 @@ static void NC_GetInsideRect( HWND hwnd, RECT *rect ) if ((wndPtr->dwStyle & WS_ICONIC) || (wndPtr->flags & WIN_MANAGED)) goto END; /* Remove frame from rectangle */ + if (HAS_THICKFRAME( wndPtr->dwStyle, wndPtr->dwExStyle )) + InflateRect( rect, -GetSystemMetrics(SM_CXFRAME), -GetSystemMetrics(SM_CYFRAME) ); + else if (HAS_DLGFRAME( wndPtr->dwStyle, wndPtr->dwExStyle )) { InflateRect( rect, -GetSystemMetrics(SM_CXDLGFRAME), -GetSystemMetrics(SM_CYDLGFRAME)); + /* FIXME: this isn't in NC_AdjustRect? why not? */ if (wndPtr->dwExStyle & WS_EX_DLGMODALFRAME) InflateRect( rect, -1, 0 ); } else - { - if (HAS_THICKFRAME( wndPtr->dwStyle )) - InflateRect( rect, -GetSystemMetrics(SM_CXFRAME), -GetSystemMetrics(SM_CYFRAME) ); - if (wndPtr->dwStyle & WS_BORDER) - InflateRect( rect, -GetSystemMetrics(SM_CXBORDER), -GetSystemMetrics(SM_CYBORDER) ); - } + if (HAS_THINFRAME( wndPtr->dwStyle )) + InflateRect( rect, -GetSystemMetrics(SM_CXBORDER), -GetSystemMetrics(SM_CYBORDER) ); END: WIN_ReleaseWndPtr(wndPtr); return; @@ -605,16 +598,17 @@ NC_GetInsideRect95 (HWND hwnd, RECT *rect) if ((wndPtr->dwStyle & WS_ICONIC) || (wndPtr->flags & WIN_MANAGED)) goto END; /* Remove frame from rectangle */ - if (HAS_FIXEDFRAME (wndPtr->dwStyle, wndPtr->dwExStyle )) + if (HAS_THICKFRAME (wndPtr->dwStyle, wndPtr->dwExStyle)) + { + InflateRect( rect, -GetSystemMetrics(SM_CXSIZEFRAME), -GetSystemMetrics(SM_CYSIZEFRAME) ); + } + else if (HAS_DLGFRAME (wndPtr->dwStyle, wndPtr->dwExStyle )) { InflateRect( rect, -GetSystemMetrics(SM_CXFIXEDFRAME), -GetSystemMetrics(SM_CYFIXEDFRAME)); } - else if (HAS_SIZEFRAME (wndPtr->dwStyle)) + else if (HAS_THINFRAME (wndPtr->dwStyle)) { - InflateRect( rect, -GetSystemMetrics(SM_CXSIZEFRAME), -GetSystemMetrics(SM_CYSIZEFRAME) ); - -/* if (wndPtr->dwStyle & WS_BORDER) - InflateRect32( rect, -GetSystemMetrics(SM_CXBORDER, -GetSystemMetrics(SM_CYBORDER );*/ + InflateRect( rect, -GetSystemMetrics(SM_CXBORDER), -GetSystemMetrics(SM_CYBORDER) ); } if (wndPtr->dwStyle & WS_CHILD) { @@ -651,11 +645,9 @@ static LONG NC_DoNCHitTest (WND *wndPtr, POINT16 pt ) if (!(wndPtr->flags & WIN_MANAGED)) { /* Check borders */ - if (HAS_THICKFRAME( wndPtr->dwStyle )) + if (HAS_THICKFRAME( wndPtr->dwStyle, wndPtr->dwExStyle )) { InflateRect16( &rect, -GetSystemMetrics(SM_CXFRAME), -GetSystemMetrics(SM_CYFRAME) ); - if (wndPtr->dwStyle & WS_BORDER) - InflateRect16(&rect,-GetSystemMetrics(SM_CXBORDER),-GetSystemMetrics(SM_CYBORDER)); if (!PtInRect16( &rect, pt )) { /* Check top sizing border */ @@ -692,7 +684,7 @@ static LONG NC_DoNCHitTest (WND *wndPtr, POINT16 pt ) { if (HAS_DLGFRAME( wndPtr->dwStyle, wndPtr->dwExStyle )) InflateRect16(&rect, -GetSystemMetrics(SM_CXDLGFRAME), -GetSystemMetrics(SM_CYDLGFRAME)); - else if (wndPtr->dwStyle & WS_BORDER) + else if (HAS_THINFRAME( wndPtr->dwStyle )) InflateRect16(&rect, -GetSystemMetrics(SM_CXBORDER), -GetSystemMetrics(SM_CYBORDER)); if (!PtInRect16( &rect, pt )) return HTBORDER; } @@ -701,7 +693,7 @@ static LONG NC_DoNCHitTest (WND *wndPtr, POINT16 pt ) if ((wndPtr->dwStyle & WS_CAPTION) == WS_CAPTION) { - rect.top += GetSystemMetrics(SM_CYCAPTION) - 1; + rect.top += GetSystemMetrics(SM_CYCAPTION) - GetSystemMetrics(SM_CYBORDER); if (!PtInRect16( &rect, pt )) { /* Check system menu */ @@ -787,11 +779,9 @@ NC_DoNCHitTest95 (WND *wndPtr, POINT16 pt ) if (!(wndPtr->flags & WIN_MANAGED)) { /* Check borders */ - if (HAS_SIZEFRAME( wndPtr->dwStyle )) + if (HAS_THICKFRAME( wndPtr->dwStyle, wndPtr->dwExStyle )) { InflateRect16( &rect, -GetSystemMetrics(SM_CXFRAME), -GetSystemMetrics(SM_CYFRAME) ); -/* if (wndPtr->dwStyle & WS_BORDER) */ -/* InflateRect16(&rect,-GetSystemMetrics(SM_CXBORDER),-GetSystemMetrics(SM_CYBORDER)); */ if (!PtInRect16( &rect, pt )) { /* Check top sizing border */ @@ -826,10 +816,10 @@ NC_DoNCHitTest95 (WND *wndPtr, POINT16 pt ) } else /* No thick frame */ { - if (HAS_FIXEDFRAME( wndPtr->dwStyle, wndPtr->dwExStyle )) + if (HAS_DLGFRAME( wndPtr->dwStyle, wndPtr->dwExStyle )) InflateRect16(&rect, -GetSystemMetrics(SM_CXDLGFRAME), -GetSystemMetrics(SM_CYDLGFRAME)); -/* else if (wndPtr->dwStyle & WS_BORDER) */ -/* InflateRect16(&rect, -GetSystemMetrics(SM_CXBORDER), -GetSystemMetrics(SM_CYBORDER)); */ + else if (HAS_THINFRAME( wndPtr->dwStyle )) + InflateRect16(&rect, -GetSystemMetrics(SM_CXBORDER), -GetSystemMetrics(SM_CYBORDER)); if (!PtInRect16( &rect, pt )) return HTBORDER; } @@ -1225,8 +1215,8 @@ static void NC_DrawFrame( HDC hdc, RECT *rect, BOOL dlgFrame, } else { - width = GetSystemMetrics(SM_CXFRAME) - 1; - height = GetSystemMetrics(SM_CYFRAME) - 1; + width = GetSystemMetrics(SM_CXFRAME) - 2; + height = GetSystemMetrics(SM_CYFRAME) - 2; SelectObject( hdc, GetSysColorBrush(active ? COLOR_ACTIVEBORDER : COLOR_INACTIVEBORDER) ); } @@ -1247,8 +1237,8 @@ static void NC_DrawFrame( HDC hdc, RECT *rect, BOOL dlgFrame, } else { - INT decYOff = GetSystemMetrics(SM_CXFRAME) + GetSystemMetrics(SM_CXSIZE); - INT decXOff = GetSystemMetrics(SM_CYFRAME) + GetSystemMetrics(SM_CYSIZE); + INT decYOff = GetSystemMetrics(SM_CXFRAME) + GetSystemMetrics(SM_CXSIZE) - 1; + INT decXOff = GetSystemMetrics(SM_CYFRAME) + GetSystemMetrics(SM_CYSIZE) - 1; /* Draw inner rectangle */ @@ -1308,6 +1298,8 @@ static void NC_DrawFrame( HDC hdc, RECT *rect, BOOL dlgFrame, * Original implementation (based on NC_DrawFrame) * 02-Jun-1998 Eric Kohl (ekohl@abo.rhein-zeitung.de) * Some minor fixes. + * 29-Jun-1999 Ove Kåven (ovek@arcticnet.no) + * Fixed a fix or something. * *****************************************************************************/ @@ -1340,7 +1332,7 @@ static void NC_DrawFrame95( width, rect->bottom - rect->top, PATCOPY ); PatBlt( hdc, rect->left, rect->bottom - 1, rect->right - rect->left, -height, PATCOPY ); - PatBlt( hdc, rect->right - 1, rect->top - 1, + PatBlt( hdc, rect->right - 1, rect->top, -width, rect->bottom - rect->top, PATCOPY ); InflateRect( rect, -width, -height ); @@ -1591,18 +1583,17 @@ static void NC_DoNCPaint( WND* wndPtr, HRGN clip, BOOL suppress_menupaint ) if (!(wndPtr->flags & WIN_MANAGED)) { - if ((wndPtr->dwStyle & WS_BORDER) || (wndPtr->dwStyle & WS_DLGFRAME) || - (wndPtr->dwExStyle & WS_EX_DLGMODALFRAME)) - { + if (HAS_ANYFRAME( wndPtr->dwStyle, wndPtr->dwExStyle )) + { SelectObject( hdc, GetStockObject(NULL_BRUSH) ); Rectangle( hdc, 0, 0, rect.right, rect.bottom ); InflateRect( &rect, -1, -1 ); } - if (HAS_DLGFRAME( wndPtr->dwStyle, wndPtr->dwExStyle )) - NC_DrawFrame( hdc, &rect, TRUE, active ); - else if (wndPtr->dwStyle & WS_THICKFRAME) + if (HAS_THICKFRAME( wndPtr->dwStyle, wndPtr->dwExStyle )) NC_DrawFrame(hdc, &rect, FALSE, active ); + else if (HAS_DLGFRAME( wndPtr->dwStyle, wndPtr->dwExStyle )) + NC_DrawFrame( hdc, &rect, TRUE, active ); if ((wndPtr->dwStyle & WS_CAPTION) == WS_CAPTION) { @@ -1664,6 +1655,8 @@ static void NC_DoNCPaint( WND* wndPtr, HRGN clip, BOOL suppress_menupaint ) * Original implementation * 10-Jun-1998 Eric Kohl (ekohl@abo.rhein-zeitung.de) * Fixed some bugs. + * 29-Jun-1999 Ove Kåven (ovek@arcticnet.no) + * Streamlined window style checks. * *****************************************************************************/ @@ -1719,19 +1712,17 @@ static void NC_DoNCPaint95( SelectObject( hdc, GetSysColorPen(COLOR_WINDOWFRAME) ); if(!(wndPtr->flags & WIN_MANAGED)) { - if ((wndPtr->dwStyle & WS_BORDER) && ((wndPtr->dwStyle & WS_DLGFRAME) || - (wndPtr->dwExStyle & WS_EX_DLGMODALFRAME) || (wndPtr->dwStyle & WS_THICKFRAME))) { + if (HAS_BIGFRAME( wndPtr->dwStyle, wndPtr->dwExStyle)) { DrawEdge (hdc, &rect, EDGE_RAISED, BF_RECT | BF_ADJUST); } - else if (HAS_CLASSICBORDER(wndPtr->dwStyle, wndPtr->dwExStyle)) - { + if (HAS_THICKFRAME( wndPtr->dwStyle, wndPtr->dwExStyle )) + NC_DrawFrame95(hdc, &rect, FALSE, active ); + else if (HAS_DLGFRAME( wndPtr->dwStyle, wndPtr->dwExStyle )) + NC_DrawFrame95( hdc, &rect, TRUE, active ); + else if (HAS_THINFRAME( wndPtr->dwStyle )) { SelectObject( hdc, GetStockObject(NULL_BRUSH) ); Rectangle( hdc, 0, 0, rect.right, rect.bottom ); - } - if (HAS_FIXEDFRAME( wndPtr->dwStyle, wndPtr->dwExStyle )) - NC_DrawFrame95( hdc, &rect, TRUE, active ); - else if (wndPtr->dwStyle & WS_THICKFRAME) - NC_DrawFrame95(hdc, &rect, FALSE, active ); + } if ((wndPtr->dwStyle & WS_CAPTION) == WS_CAPTION) { @@ -2031,7 +2022,7 @@ static void NC_DoSizeMove( HWND hwnd, WORD wParam ) POINT minTrack, maxTrack; POINT16 capturePoint, pt; WND * wndPtr = WIN_FindWndPtr( hwnd ); - BOOL thickframe = HAS_THICKFRAME( wndPtr->dwStyle ); + BOOL thickframe = HAS_THICKFRAME( wndPtr->dwStyle, wndPtr->dwExStyle ); BOOL iconic = wndPtr->dwStyle & WS_MINIMIZE; BOOL moved = FALSE; DWORD dwPoint = GetMessagePos ();