Release 960818
Sun Aug 18 12:17:54 1996 Alexandre Julliard <julliard@lrc.epfl.ch>
* [files/drive.c]
Added 'Filesystem' option in drives configuration.
* [files/dos_fs.c]
Added handling of case-insensitive filesystems.
* [memory/selector.c] [include/stackframe.h]
Removed MAKE_SEGPTR.
* [misc/commdlg.c] [multimedia/mcistring.c]
Replaced MAKE_SEGPTR by the SEGPTR_* macros.
* [objects/bitblt.c] [windows/graphics.c]
Use an intermediary pixmap to avoid some BadMatch errors on
XGetImage().
Sun Aug 18 09:21:27 1996 Albrecht Kleine <kleine@ak.sax.de>
* [windows/message.c]
Added handling of WM_NC...mouse messages in JOURNALRECORD hook.
* [misc/ver.c]
Fixed a bad string result in VerQueryValue[16|32A|32W].
Fri Aug 16 19:55:04 1996 Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>
* [if1632/crtdll.spec] [misc/crtdll.c]
More additions to get win95 programs further down the road.
* [if1632/kernel.spec] [loader/module.c]
GetModuleName() added.
LoadModule(): params->showCmd can be NULL.
* [if1632/kernel32.spec] [if1632/thunk.c]
ThunkConnect32() stub added.
* [loader/resource.c]
Entries include lastentry.
* [misc/shell.c] [files/file.c]
Made progman work again.
Fri Aug 16 09:00:00 1996 Alex Korobka <alex@phm30.pharm.sunysb.edu>
* [windows/defwnd.c] [windows/winpos.c] [windows/painting.c]
Icon painting fixes.
* [windows/winpos.c] [windows/painting.c]
Enforce and follow hrgnUpdate more closely to cut down on
redundant RedrawWindow() calls.
* [windows/event.c]
Process ConfigureNotify only for managed windows.
* [windows/winpos.c]
Do not redraw parent if the window was hidden before SetWindowPos().
* [windows/nonclient.c]
Omit some nonclient decoration painting for managed windows.
* [controls/menu.c] [windows/mdi.c] [windows/nonclient.c]
Implemented WM_NEXTMENU.
* [controls/listbox.c]
Multicolumn listboxes return WVR_VREDRAW on WM_NCCALCSIZE.
* [misc/shell.c]
Added .ICO file handling to ExtractIcon().
diff --git a/windows/nonclient.c b/windows/nonclient.c
index 0846325..64de6c0 100644
--- a/windows/nonclient.c
+++ b/windows/nonclient.c
@@ -16,7 +16,6 @@
#include "menu.h"
#include "winpos.h"
#include "scroll.h"
-#include "stackframe.h"
#include "nonclient.h"
#include "graphics.h"
#include "queue.h"
@@ -235,17 +234,20 @@
{
RECT16 tmpRect = { 0, 0, 0, 0 };
- NC_AdjustRect( &tmpRect, pWnd->dwStyle, FALSE, pWnd->dwExStyle );
- winRect->left -= tmpRect.left;
- winRect->top -= tmpRect.top;
- winRect->right -= tmpRect.right;
- winRect->bottom -= tmpRect.bottom;
-
- if (HAS_MENU(pWnd))
+ if( !( pWnd->dwStyle & WS_MINIMIZE ) )
{
+ NC_AdjustRect( &tmpRect, pWnd->dwStyle, FALSE, pWnd->dwExStyle );
+ winRect->left -= tmpRect.left;
+ winRect->top -= tmpRect.top;
+ winRect->right -= tmpRect.right;
+ winRect->bottom -= tmpRect.bottom;
+
+ if (HAS_MENU(pWnd))
+ {
winRect->top += MENU_GetMenuBarHeight( pWnd->hwndSelf,
winRect->right - winRect->left,
- -tmpRect.left, -tmpRect.top ) + 1;
+ -tmpRect.left, -tmpRect.top ) + 1;
+ }
}
return 0;
}
@@ -430,14 +432,17 @@
HBITMAP hbitmap;
WND *wndPtr = WIN_FindWndPtr( hwnd );
- NC_GetInsideRect( hwnd, &rect );
- hdcMem = CreateCompatibleDC( hdc );
- hbitmap = SelectObject( hdcMem, hbitmapClose );
- BitBlt( hdc, rect.left, rect.top, SYSMETRICS_CXSIZE, SYSMETRICS_CYSIZE,
- hdcMem, (wndPtr->dwStyle & WS_CHILD) ? SYSMETRICS_CXSIZE : 0, 0,
- down ? NOTSRCCOPY : SRCCOPY );
- SelectObject( hdcMem, hbitmap );
- DeleteDC( hdcMem );
+ if( !(wndPtr->flags & WIN_MANAGED) )
+ {
+ NC_GetInsideRect( hwnd, &rect );
+ hdcMem = CreateCompatibleDC( hdc );
+ hbitmap = SelectObject( hdcMem, hbitmapClose );
+ BitBlt( hdc, rect.left, rect.top, SYSMETRICS_CXSIZE, SYSMETRICS_CYSIZE,
+ hdcMem, (wndPtr->dwStyle & WS_CHILD) ? SYSMETRICS_CXSIZE : 0, 0,
+ down ? NOTSRCCOPY : SRCCOPY );
+ SelectObject( hdcMem, hbitmap );
+ DeleteDC( hdcMem );
+ }
}
@@ -447,12 +452,17 @@
static void NC_DrawMaxButton( HWND hwnd, HDC hdc, BOOL down )
{
RECT16 rect;
- NC_GetInsideRect( hwnd, &rect );
- GRAPH_DrawBitmap( hdc, (IsZoomed(hwnd) ?
- (down ? hbitmapRestoreD : hbitmapRestore) :
- (down ? hbitmapMaximizeD : hbitmapMaximize)),
- rect.right - SYSMETRICS_CXSIZE - 1, rect.top,
- 0, 0, SYSMETRICS_CXSIZE+1, SYSMETRICS_CYSIZE );
+ WND *wndPtr = WIN_FindWndPtr( hwnd );
+
+ if( !(wndPtr->flags & WIN_MANAGED) )
+ {
+ NC_GetInsideRect( hwnd, &rect );
+ GRAPH_DrawBitmap( hdc, (IsZoomed(hwnd) ?
+ (down ? hbitmapRestoreD : hbitmapRestore) :
+ (down ? hbitmapMaximizeD : hbitmapMaximize)),
+ rect.right - SYSMETRICS_CXSIZE - 1, rect.top,
+ 0, 0, SYSMETRICS_CXSIZE+1, SYSMETRICS_CYSIZE );
+ }
}
@@ -463,11 +473,15 @@
{
RECT16 rect;
WND *wndPtr = WIN_FindWndPtr( hwnd );
- NC_GetInsideRect( hwnd, &rect );
- if (wndPtr->dwStyle & WS_MAXIMIZEBOX) rect.right -= SYSMETRICS_CXSIZE + 1;
- GRAPH_DrawBitmap( hdc, (down ? hbitmapMinimizeD : hbitmapMinimize),
- rect.right - SYSMETRICS_CXSIZE - 1, rect.top,
- 0, 0, SYSMETRICS_CXSIZE+1, SYSMETRICS_CYSIZE );
+
+ if( !(wndPtr->flags & WIN_MANAGED) )
+ {
+ NC_GetInsideRect( hwnd, &rect );
+ if (wndPtr->dwStyle & WS_MAXIMIZEBOX) rect.right -= SYSMETRICS_CXSIZE + 1;
+ GRAPH_DrawBitmap( hdc, (down ? hbitmapMinimizeD : hbitmapMinimize),
+ rect.right - SYSMETRICS_CXSIZE - 1, rect.top,
+ 0, 0, SYSMETRICS_CXSIZE+1, SYSMETRICS_CYSIZE );
+ }
}
@@ -587,6 +601,8 @@
WND * wndPtr = WIN_FindWndPtr( hwnd );
char buffer[256];
+ if (wndPtr->flags & WIN_MANAGED) return;
+
if (!hbitmapClose)
{
if (!(hbitmapClose = LoadBitmap16( 0, MAKEINTRESOURCE(OBM_CLOSE) )))
@@ -658,7 +674,8 @@
WND *wndPtr = WIN_FindWndPtr( hwnd );
- if (!wndPtr || !(wndPtr->dwStyle & WS_VISIBLE)) return; /* Nothing to do */
+ if (!wndPtr || wndPtr->dwStyle & WS_MINIMIZE ||
+ !WIN_IsWindowDrawable( wndPtr, 0 )) return; /* Nothing to do */
active = wndPtr->flags & WIN_NCACTIVATED;
@@ -666,29 +683,6 @@
if (!(hdc = GetDCEx( hwnd, 0, DCX_USESTYLE | DCX_WINDOW ))) return;
- /*
- * If this is an icon, we don't want to do any more nonclient painting
- * of the window manager.
- * If there is a class icon to draw, draw it
- */
- if (IsIconic(hwnd))
- {
- if (wndPtr->class->hIcon)
- {
- SendMessage16(hwnd, WM_ICONERASEBKGND, (WPARAM)hdc, 0);
- DrawIcon( hdc, 0, 0, wndPtr->class->hIcon );
- }
- ReleaseDC(hwnd, hdc);
- wndPtr->flags &= ~WIN_INTERNAL_PAINT;
- if( wndPtr->hrgnUpdate )
- {
- DeleteObject( wndPtr->hrgnUpdate );
- QUEUE_DecPaintCount( wndPtr->hmemTaskQ );
- wndPtr->hrgnUpdate = 0;
- }
- return;
- }
-
if (ExcludeVisRect( hdc, wndPtr->rectClient.left-wndPtr->rectWindow.left,
wndPtr->rectClient.top-wndPtr->rectWindow.top,
wndPtr->rectClient.right-wndPtr->rectWindow.left,
@@ -776,14 +770,23 @@
*
* Handle a WM_NCACTIVATE message. Called from DefWindowProc().
*/
-LONG NC_HandleNCActivate( HWND hwnd, WPARAM wParam )
+LONG NC_HandleNCActivate( WND *wndPtr, WPARAM wParam )
{
- WND *wndPtr = WIN_FindWndPtr(hwnd);
+ WORD wStateChange;
- if (wParam != 0) wndPtr->flags |= WIN_NCACTIVATED;
- else wndPtr->flags &= ~WIN_NCACTIVATED;
+ if( wParam ) wStateChange = !(wndPtr->flags & WIN_NCACTIVATED);
+ else wStateChange = wndPtr->flags & WIN_NCACTIVATED;
- NC_DoNCPaint( hwnd, (HRGN)1, FALSE );
+ if( wStateChange )
+ {
+ if (wParam) wndPtr->flags |= WIN_NCACTIVATED;
+ else wndPtr->flags &= ~WIN_NCACTIVATED;
+
+ if( wndPtr->dwStyle & WS_MINIMIZE )
+ PAINT_RedrawWindow( wndPtr->hwndSelf, NULL, 0, RDW_INVALIDATE | RDW_ERASE | RDW_ERASENOW, 0 );
+ else
+ NC_DoNCPaint( wndPtr->hwndSelf, (HRGN)1, FALSE );
+ }
return TRUE;
}
@@ -841,6 +844,21 @@
return (LONG)SetCursor( LoadCursor16( 0, IDC_ARROW ) );
}
+/***********************************************************************
+ * NC_GetSysPopupPos
+ */
+BOOL NC_GetSysPopupPos( WND* wndPtr, RECT16* rect )
+{
+ if( !wndPtr->hSysMenu ) return FALSE;
+
+ NC_GetInsideRect( wndPtr->hwndSelf, rect );
+ OffsetRect16( rect, wndPtr->rectWindow.left, wndPtr->rectWindow.top );
+ if (wndPtr->dwStyle & WS_CHILD)
+ ClientToScreen16( wndPtr->parent->hwndSelf, (POINT16 *)rect );
+ rect->right = rect->left + SYSMETRICS_CXSIZE;
+ rect->bottom = rect->top + SYSMETRICS_CYSIZE;
+ return TRUE;
+}
/***********************************************************************
* NC_TrackSysMenu
@@ -854,19 +872,16 @@
int iconic = wndPtr->dwStyle & WS_MINIMIZE;
if (!(wndPtr->dwStyle & WS_SYSMENU)) return;
+
/* If window has a menu, track the menu bar normally if it not minimized */
if (HAS_MENU(wndPtr) && !iconic) MENU_TrackMouseMenuBar( hwnd, pt );
else
{
/* Otherwise track the system menu like a normal popup menu */
- NC_GetInsideRect( hwnd, &rect );
- OffsetRect16( &rect, wndPtr->rectWindow.left, wndPtr->rectWindow.top );
- if (wndPtr->dwStyle & WS_CHILD)
- ClientToScreen16( wndPtr->parent->hwndSelf, (POINT16 *)&rect );
- rect.right = rect.left + SYSMETRICS_CXSIZE;
- rect.bottom = rect.top + SYSMETRICS_CYSIZE;
+
+ NC_GetSysPopupPos( wndPtr, &rect );
if (!iconic) NC_DrawSysButton( hwnd, hdc, TRUE );
- TrackPopupMenu16( wndPtr->hSysMenu, TPM_LEFTALIGN | TPM_LEFTBUTTON,
+ TrackPopupMenu16( GetSystemMenu(hwnd, 0), TPM_LEFTALIGN | TPM_LEFTBUTTON,
rect.left, rect.bottom, 0, hwnd, &rect );
if (!iconic) NC_DrawSysButton( hwnd, hdc, FALSE );
}
@@ -908,8 +923,7 @@
SetCapture(hwnd);
while(!hittest)
{
- MSG_InternalGetMessage( MAKE_SEGPTR(&msg), 0, 0, MSGF_SIZE,
- PM_REMOVE, FALSE );
+ MSG_InternalGetMessage( &msg, 0, 0, MSGF_SIZE, PM_REMOVE, FALSE );
switch(msg.message)
{
case WM_MOUSEMOVE:
@@ -1048,8 +1062,7 @@
{
int dx = 0, dy = 0;
- MSG_InternalGetMessage( MAKE_SEGPTR(&msg), 0, 0, MSGF_SIZE,
- PM_REMOVE, FALSE );
+ MSG_InternalGetMessage( &msg, 0, 0, MSGF_SIZE, PM_REMOVE, FALSE );
/* Exit on button-up, Return, or Esc */
if ((msg.message == WM_LBUTTONUP) ||
@@ -1151,7 +1164,7 @@
do
{
BOOL oldstate = pressed;
- MSG_InternalGetMessage( MAKE_SEGPTR(&msg), 0, 0, 0, PM_REMOVE, FALSE );
+ MSG_InternalGetMessage( &msg, 0, 0, 0, PM_REMOVE, FALSE );
pressed = (NC_HandleNCHitTest( hwnd, msg.pt ) == wParam);
if (pressed != oldstate)