Release 971101
Thu Oct 30 21:52:23 1997 Martin Boehme <boehme@informatik.mu-luebeck.de>
* [windows/nonclient.c]
Changed NC_TrackSysMenu to give the same behaviour as MS-Windows,
i.e. system menu already appears when mouse button is depressed.
Changed NC_HandleNCLButtonDblClk so that double clicks on scroll
bar arrows are handled the same way as single clicks.
* [windows/winpos.c]
Fixed SetWindowPos32 to clear WIN_NO_REDRAW when SWP_SHOWWINDOW is
set; this is the way MS-Windows behaves.
Thu Oct 30 21:08:57 1997 Morten Welinder <terra@diku.dk>
* [controls/status.c]
In SW_SetText, fix condition, I hope.
* [controls/menu.c]
(GetMenuState32): Don't mask return value. Print more debug info.
(MENU_MenuBarCalcSize): Be more careful when printing debug
information.
(MENU_SetItemData): Empty strings are separators.
* [graphics/x11drv/text.c]
Don't prototype CLIPPING_IntersectClipRect.
* [include/dc.h]
Prototype CLIPPING_IntersectClipRect.
* [objects/font.c]
Remove non-portable (and faulty) smartness in FONT_TextMetric*to*.
In CreateFont32W and CreateFont16, handle null font name.
* [objects/text.c]
(TEXT_NextLine): Fix end-of-line bug.
* [if1632/shell32.spec]
Activate existing implementation of ExtractIconA.
* [misc/shell.c]
For Control_RunDLL, add types for parameters.
Thu Oct 30 14:54:11 1997 Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>
* [controls/static.c] [include/windows.h] [misc/spy.c]
Added some win32 defines to static controls, basic SS_BITMAP style
handling implemented. [please add more, I am lacking knowledge and
time]
* [controls/status.c]
part_num 255 seems to indicate whole statusline (win95 cdplayer.exe)
* [if1632/thunk.c] [tools/build.c]
Support lret and 0x66 lret calls for CallTo16_regs
(needed for KERNEL32_45)
Fixed KERNEL32_45, QT_Thunk (should work now).
* [if1632/relay.c][if1632/builtin.c][tools/build.c][if1632/*32.spec]
Added string dumping to relay debugging for win32 apifuncs.
* [misc/ver.c]
Fixed and cleaned up VerQueryValue*.
* [multimedia/*.c][include/mmsystem.h][if1632/mmsystem.spec]
[if1632/winmm.spec]
Win32 support for lowlevel multimedia functions.
Added some mixer* lowlevel functions.
Some small fixes in the audio lowlevel queue handling, code
reformatting/cleanups.
* [debugger/hash.c]
Don't show difference between 16bit symbols if they are in
different segments.
* [objects/cursoricon.c]
Added GetIconInfo (partial) and CreateIconIndirect.
* [windows/mdi.c]
Fixed some "bad class" problems and crashes in MDICreateChild,
which happen in Win32 (jwp32.exe).
Wed Oct 29 00:57:27 1997 Bruce Milner <Bruce.Milner@genetics.utah.edu>
* [if1632/winaspi.spec] [misc/aspi.c] [include/aspi.c]
[documentation/aspi] [include/callback.h]
Added support for 16 bit ASPI calls to linux generic SCSI.
The support is not complete, but appears to run my Mustek
scanner from within ipplus.exe.
Mon Oct 27 00:59:41 1997 Alex Korobka <alex@trantor.pharm.sunysb.edu>
* [windows/dce.c]
DC reuse framework.
Sun Oct 26 18:41:21 1997 Huw D M Davies <h.davies1@physics.oxford.ac.uk>
* [graphics/x11drv/xfont.c]
Substituted fonts are removed from the alias table. References to
the old name are also updated.
* [controls/combo.c]
LB_SELECTSTRING32 not CB_SELECTSTRING32 should be sent to
ComboLBox.
Sun Oct 26 14:25:00 1997 Nikita V. Youshchenko <yoush@cs.msu.su>
* [include/drive.h] [files/drive.c] [msdos/int21.c]
Partially implemented DOS drive mapping (int21 AX=440F).
Sat Oct 25 13:03:29 1997 Alexandre Julliard <julliard@lrc.epfl.ch>
* [debugger/debug.l]
Support '.' in identifiers. Use "x . y" to access structure
fields.
* [debugger/hash.c] [loader/pe_image.c]
Load entry points of Win32 modules only when entering the
debugger.
* [debugger/break.c]
New function DEBUG_AddModuleBreakpoint() to set a breakpoint at
the start of every module.
* [files/file.c]
FILE_mmap() can now fake mmap() for unaligned offsets or broken
filesystems.
* [include/callback.h] [misc/callback.c] [if1632/thunk.c]
Use a table of callbacks instead of macros to differentiate
between emulator and Winelib.
* [loader/task.c]
Initialize current directory from cwd, not from module path.
* [tools/build.c]
Read CallTo16 prototypes directly from thunk.c source file.
* [windows/winproc.c] [windows/mdi.c]
Added translation for WM_MDIACTIVATE and WM_MDIGETACTIVE.
Fri Oct 24 21:41:25 1997 Uwe Bonnes <bon@elektron.ikp.tu-darmstadt.de>
* [files/drive.c]
Allow arguments like "a" for the drive related apis.
* [memory/global.c]
Keep the calculation for dwMemoryLoad in range.
* [misc/crtdll.c]
Make CRTDLL_getcwd use GetCurrentDirectory32A and alloc
its memory if requested.
Implemented CRTDLL_rename and CRTDLL_stat needed for
lcc-win32:wedit.exe.
Implemented CRTDLL__fullpath.
* [misc/comm.c]
High speed modes for the 16-bit mode Comm functions.
* [misc/cpu.c]
As applications may treat lpMaximumApplicationAddress as long,
use a valid long number.
* [misc/main.c]
In SystemParametersInfo16 ignore SPI_GETHIGHCONTRAST too.
* [misc/ole2nls.c]
Implement LCMAP_UPPERCASE for LCMapString32.
* [misc/wsprintf]
Made WPRINTF_ParseFormatA understand %ws.
* [win32/file.c]
Ignore FILE_ATTRIBUTE_NORMAL.
Stub for ReadFileEx.
Fri Oct 24 15:36:02 1997 Doug Ridgway <ridgway@routh.ucsd.edu>
* [memory/local.c]
Local heap exhaustion message now prints which builtin heap filled.
Fri Oct 24 00:46:34 1997 Huw D M Davies <h.davies1@physics.oxford.ac.uk>
* [windows/dialog.c]
Reversed CreateFont16/32W typo.
Thu Oct 23 23:44:20 1997 Kristian Nielsen <kristian.nielsen@risoe.dk>
* [if1632/user.spec]
Fixed argument list for ChangeClipboardChain.
* [windows/mdi.c]
Pass correct hInstance to CreateWindow16() in MDICreateChild().
Mon Oct 20 11:51:24 1997 Carsten Fallesen <cf@it.dtu.dk>
* [objects/metafile.c]
Added support for META_SETTEXTCHAREXTRA.
* [objects/region.c]
Fixed crash in XPolygonRegion if there is only one point in
in the region.
* [if1632/gdi32.spec][include/gdi.h][include/windows.h]
[objects/gdiobj.c]
Completed OBJ_XXX defines in gdi.h, removed OBJ_XXX in gdiobj.c
and included gdi.h instead. Implemented GetObjectType32().
Thu Oct 16 17:21:32 1997 Philippe De Muyter <phdm@info.ucl.ac.be>
* [documentation/wine.texinfo]
Fixed WIN32 and Makefiles entries of Reference manual node, that
made makeinfo dump core.
Mon Oct 13 17:15:57 1997 Robert Wilhelm <robert@physiol.med.tu-muenchen.de>
* [if1632/crtdll.spec]
Added missing math functions y0(), y1(), y2(), floor(), frexp(),
ldexp(), modf().
diff --git a/controls/button.c b/controls/button.c
index 312282d..27e73c4 100644
--- a/controls/button.c
+++ b/controls/button.c
@@ -170,12 +170,14 @@
case WM_SETTEXT:
DEFWND_SetText( wndPtr, (LPSTR)lParam );
- PAINT_BUTTON( wndPtr, style, ODA_DRAWENTIRE );
+ if( wndPtr->dwStyle & WS_VISIBLE )
+ PAINT_BUTTON( wndPtr, style, ODA_DRAWENTIRE );
return 0;
case WM_SETFONT:
infoPtr->hFont = (HFONT16)wParam;
- if (lParam) PAINT_BUTTON( wndPtr, style, ODA_DRAWENTIRE );
+ if (lParam && (wndPtr->dwStyle & WS_VISIBLE))
+ PAINT_BUTTON( wndPtr, style, ODA_DRAWENTIRE );
break;
case WM_GETFONT:
diff --git a/controls/combo.c b/controls/combo.c
index 26903fa..b66173c 100644
--- a/controls/combo.c
+++ b/controls/combo.c
@@ -1128,7 +1128,7 @@
*/
static LRESULT COMBO_SelectString( LPHEADCOMBO lphc, INT32 start, LPCSTR pText )
{
- INT32 index = SendMessage32A( lphc->hWndLBox, CB_SELECTSTRING32,
+ INT32 index = SendMessage32A( lphc->hWndLBox, LB_SELECTSTRING32,
(WPARAM32)start, (LPARAM)pText );
if( index >= 0 )
if( lphc->wState & CBF_EDIT )
diff --git a/controls/edit.c b/controls/edit.c
index 7e32b57..c6bcafe 100644
--- a/controls/edit.c
+++ b/controls/edit.c
@@ -978,7 +978,7 @@
if (es->word_break_proc16) {
HLOCAL16 hloc16 = EDIT_EM_GetHandle16(wnd, es);
SEGPTR segptr = LocalLock16(hloc16);
- INT32 ret = (INT32)CallWordBreakProc16((FARPROC16)es->word_break_proc16,
+ INT32 ret = (INT32)Callbacks->CallWordBreakProc(es->word_break_proc16,
segptr + start, index, count, action);
LocalUnlock16(hloc16);
return ret;
diff --git a/controls/menu.c b/controls/menu.c
index 682423f..a31b2f1 100644
--- a/controls/menu.c
+++ b/controls/menu.c
@@ -754,10 +754,10 @@
if ((i != start) &&
(lpitem->fType & (MF_MENUBREAK | MF_MENUBARBREAK))) break;
-
- dprintf_menu( stddeb, "MENU_MenuBarCalcSize: calling "
- "MENU_CalcItemSize on item '%s', org=(%d, %d)\n",
- lpitem->text, orgX, orgY );
+ dprintf_menu( stddeb,
+ "MENU_MenuBarCalcSize: calling MENU_CalcItemSize"
+ " org=(%d, %d)\n", orgX, orgY );
+ debug_print_menuitem (" item: ", lpitem, "\n");
MENU_CalcItemSize( hdc, lpitem, hwndOwner, orgX, orgY, TRUE );
if (lpitem->rect.right > lprect->right)
{
@@ -1396,7 +1396,7 @@
if (IS_STRING_ITEM(flags))
{
- if (!str)
+ if (!str || !*str)
{
flags |= MF_SEPARATOR;
item->text = NULL;
@@ -1904,7 +1904,7 @@
else
item = MENU_FindItemByCoords( ptmenu, pmt->pt, &id );
- if( ptmenu->FocusedItem == id )
+ if( item && (ptmenu->FocusedItem == id ))
{
if( !(item->fType & MF_POPUP) )
return MENU_ExecFocusedItem( pmt, hPtMenu );
@@ -2861,6 +2861,7 @@
dprintf_menu(stddeb,"GetMenuState(%04x, %04x, %04x);\n",
hMenu, wItemID, wFlags);
if (!(item = MENU_FindItem( &hMenu, &wItemID, wFlags ))) return -1;
+ debug_print_menuitem (" item: ", item, "\n");
if (item->fType & MF_POPUP)
{
POPUPMENU *menu = (POPUPMENU *) USER_HEAP_LIN_ADDR( item->hSubMenu );
@@ -2868,9 +2869,12 @@
else return (menu->nItems << 8) | (menu->wFlags & 0xff);
}
else
- /* Non POPUP Menus only return flags in the lower byte */
- /* XXX ??? */
- return ((item->fType | item->fState) & 0x00ff);
+ {
+ /* We used to (from way back then) mask the result to 0xff. */
+ /* I don't know why and it seems wrong as the documented */
+ /* return flag MF_SEPARATOR is outside that mask. */
+ return (item->fType | item->fState);
+ }
}
diff --git a/controls/scroll.c b/controls/scroll.c
index b8a3d4e..4b7867e 100644
--- a/controls/scroll.c
+++ b/controls/scroll.c
@@ -410,18 +410,20 @@
r = *rect;
if (vertical)
{
- r.top += arrowSize;
+ r.top += arrowSize - 1;
r.bottom -= arrowSize;
+ r.right--;
}
else
{
- r.left += arrowSize;
+ r.left += arrowSize - 1;
r.right -= arrowSize;
+ r.bottom--;
}
/* Draw the scroll bar frame */
- GRAPH_DrawRectangle( hdc, r.left, r.top, r.right - 1, r.bottom - 1, 0);
+ GRAPH_DrawRectangle( hdc, r.left, r.top, r.right - r.left, r.bottom - r.top, 0);
/* Draw the scroll rectangles and thumb */
@@ -443,7 +445,7 @@
r.right - r.left - 2,
r.bottom - r.top - thumbSize - 2,
bottom_selected ? 0x0f0000 : PATCOPY );
- r.bottom = r.top + thumbSize + 1;
+ r.bottom = r.top + thumbSize + 2;
}
else /* horizontal */
{
@@ -456,7 +458,7 @@
r.right - r.left - thumbSize - 2,
r.bottom - r.top - 2,
bottom_selected ? 0x0f0000 : PATCOPY );
- r.right = r.left + thumbSize + 1;
+ r.right = r.left + thumbSize + 2;
}
/* Draw the thumb */
diff --git a/controls/static.c b/controls/static.c
index ecd4a02..0e565f2 100644
--- a/controls/static.c
+++ b/controls/static.c
@@ -8,12 +8,15 @@
#include <stdio.h>
#include "windows.h"
#include "win.h"
+#include "bitmap.h"
+#include "cursoricon.h"
#include "static.h"
#include "heap.h"
static void STATIC_PaintTextfn( WND *wndPtr, HDC32 hdc );
static void STATIC_PaintRectfn( WND *wndPtr, HDC32 hdc );
static void STATIC_PaintIconfn( WND *wndPtr, HDC32 hdc );
+static void STATIC_PaintBitmapfn( WND *wndPtr, HDC32 hdc );
static COLORREF color_windowframe, color_background, color_window;
@@ -21,9 +24,7 @@
typedef void (*pfPaint)( WND *, HDC32 );
-#define LAST_STATIC_TYPE SS_LEFTNOWORDWRAP
-
-static pfPaint staticPaintFunc[LAST_STATIC_TYPE+1] =
+static pfPaint staticPaintFunc[SS_TYPEMASK+1] =
{
STATIC_PaintTextfn, /* SS_LEFT */
STATIC_PaintTextfn, /* SS_CENTER */
@@ -37,7 +38,13 @@
STATIC_PaintRectfn, /* SS_WHITEFRAME */
NULL, /* Not defined */
STATIC_PaintTextfn, /* SS_SIMPLE */
- STATIC_PaintTextfn /* SS_LEFTNOWORDWRAP */
+ STATIC_PaintTextfn, /* SS_LEFTNOWORDWRAP */
+ NULL, /* SS_OWNERDRAW */
+ STATIC_PaintBitmapfn, /* SS_BITMAP */
+ NULL, /* SS_ENHMETAFILE */
+ NULL, /* SS_ETCHEDHORIZ */
+ NULL, /* SS_ETCHEDVERT */
+ NULL, /* SS_ETCHEDFRAME */
};
@@ -52,7 +59,7 @@
STATICINFO *infoPtr = (STATICINFO *)wndPtr->wExtra;
CURSORICONINFO *info = hicon?(CURSORICONINFO *) GlobalLock16( hicon ):NULL;
- if ((wndPtr->dwStyle & 0x0f) != SS_ICON) return 0;
+ if ((wndPtr->dwStyle & SS_TYPEMASK) != SS_ICON) return 0;
if (hicon && !info) {
fprintf(stderr,"STATIC_SetIcon: huh? hicon!=0, but info=0???\n");
return 0;
@@ -68,6 +75,33 @@
return prevIcon;
}
+/***********************************************************************
+ * STATIC_SetBitmap
+ *
+ * Set the bitmap for an SS_BITMAP control.
+ */
+static HICON16 STATIC_SetBitmap( WND *wndPtr, HICON16 hicon )
+{
+ HICON16 prevIcon;
+ STATICINFO *infoPtr = (STATICINFO *)wndPtr->wExtra;
+ BITMAPOBJ *info = GDI_HEAP_LOCK(hicon);
+
+ if ((wndPtr->dwStyle & SS_TYPEMASK) != SS_BITMAP) return 0;
+ if (hicon && !info) {
+ fprintf(stderr,"STATIC_SetBitmap: huh? hicon!=0, but info=0???\n");
+ return 0;
+ }
+ prevIcon = infoPtr->hIcon;
+ infoPtr->hIcon = hicon;
+ if (hicon)
+ {
+ SetWindowPos32( wndPtr->hwndSelf, 0, 0, 0, info->bitmap.bmWidth, info->bitmap.bmHeight,
+ SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER );
+ }
+ GDI_HEAP_UNLOCK( hicon );
+ return prevIcon;
+}
+
/***********************************************************************
* STATIC_LoadIcon
@@ -95,6 +129,32 @@
return hicon;
}
+/***********************************************************************
+ * STATIC_LoadBitmap
+ *
+ * Load the bitmap for an SS_BITMAP control.
+ */
+static HBITMAP16 STATIC_LoadBitmap( WND *wndPtr, LPCSTR name )
+{
+ HBITMAP16 hbitmap;
+
+ if (wndPtr->flags & WIN_ISWIN32)
+ {
+ hbitmap = LoadBitmap32A( wndPtr->hInstance, name );
+ if (!hbitmap) /* Try OEM icon (FIXME: is this right?) */
+ hbitmap = LoadBitmap32A( 0, name );
+ }
+ else
+ {
+ LPSTR segname = SEGPTR_STRDUP(name);
+ hbitmap = LoadBitmap16( wndPtr->hInstance, SEGPTR_GET(segname) );
+ if (!hbitmap) /* Try OEM icon (FIXME: is this right?) */
+ hbitmap = LoadBitmap32A( 0, segname );
+ SEGPTR_FREE(segname);
+ }
+ return hbitmap;
+}
+
/***********************************************************************
* StaticWndProc
@@ -104,7 +164,7 @@
{
LRESULT lResult = 0;
WND *wndPtr = WIN_FindWndPtr(hWnd);
- LONG style = wndPtr->dwStyle & 0x0000000F;
+ LONG style = wndPtr->dwStyle & SS_TYPEMASK;
STATICINFO *infoPtr = (STATICINFO *)wndPtr->wExtra;
switch (uMsg)
@@ -118,10 +178,19 @@
STATIC_LoadIcon( wndPtr, cs->lpszName ));
return 1;
}
+ if (style == SS_BITMAP)
+ {
+ CREATESTRUCT32A *cs = (CREATESTRUCT32A *)lParam;
+ if (cs->lpszName)
+ STATIC_SetBitmap( wndPtr,
+ STATIC_LoadBitmap( wndPtr, cs->lpszName ));
+ fprintf(stderr,"STATIC:style SS_BITMAP, dwStyle is 0x%08lx\n",wndPtr->dwStyle);
+ return 1;
+ }
return DefWindowProc32A( hWnd, uMsg, wParam, lParam );
case WM_CREATE:
- if (style < 0L || style > LAST_STATIC_TYPE)
+ if (style < 0L || style > SS_TYPEMASK)
{
fprintf( stderr, "STATIC: Unknown style 0x%02lx\n", style );
lResult = -1L;
@@ -136,7 +205,7 @@
case WM_NCDESTROY:
if (style == SS_ICON)
DestroyIcon32( STATIC_SetIcon( wndPtr, 0 ) );
- else
+ else
lResult = DefWindowProc32A( hWnd, uMsg, wParam, lParam );
break;
@@ -165,7 +234,9 @@
if (style == SS_ICON)
/* FIXME : should we also return the previous hIcon here ??? */
STATIC_SetIcon( wndPtr, STATIC_LoadIcon( wndPtr, (LPCSTR)lParam ));
- else
+ else if (style == SS_BITMAP)
+ STATIC_SetBitmap(wndPtr,STATIC_LoadBitmap(wndPtr,(LPCSTR)lParam ));
+ else
DEFWND_SetText( wndPtr, (LPCSTR)lParam );
InvalidateRect32( hWnd, NULL, FALSE );
UpdateWindow32( hWnd );
@@ -173,6 +244,7 @@
case WM_SETFONT:
if (style == SS_ICON) return 0;
+ if (style == SS_BITMAP) return 0;
infoPtr->hFont = (HFONT16)wParam;
if (LOWORD(lParam))
{
@@ -190,10 +262,20 @@
case WM_GETDLGCODE:
return DLGC_STATIC;
- case STM_GETICON:
+ return infoPtr->hIcon;
+ case STM_GETIMAGE:
+ case STM_GETICON16:
+ case STM_GETICON32:
return infoPtr->hIcon;
- case STM_SETICON:
+ case STM_SETIMAGE:
+ /* FIXME: handle wParam */
+ lResult = STATIC_SetBitmap( wndPtr, (HBITMAP32)lParam );
+ InvalidateRect32( hWnd, NULL, FALSE );
+ UpdateWindow32( hWnd );
+ break;
+ case STM_SETICON16:
+ case STM_SETICON32:
lResult = STATIC_SetIcon( wndPtr, (HICON16)wParam );
InvalidateRect32( hWnd, NULL, FALSE );
UpdateWindow32( hWnd );
@@ -219,7 +301,7 @@
GetClientRect32( wndPtr->hwndSelf, &rc);
- switch (style & 0x0000000F)
+ switch (style & SS_TYPEMASK)
{
case SS_LEFT:
wFormat = DT_LEFT | DT_EXPANDTABS | DT_WORDBREAK | DT_NOCLIP;
@@ -263,7 +345,7 @@
GetClientRect32( wndPtr->hwndSelf, &rc);
- switch (wndPtr->dwStyle & 0x0f)
+ switch (wndPtr->dwStyle & SS_TYPEMASK)
{
case SS_BLACKRECT:
hBrush = CreateSolidBrush32(color_windowframe);
@@ -308,3 +390,28 @@
FillRect32( hdc, &rc, hbrush );
if (infoPtr->hIcon) DrawIcon32( hdc, rc.left, rc.top, infoPtr->hIcon );
}
+
+static void STATIC_PaintBitmapfn(WND *wndPtr, HDC32 hdc )
+{
+ RECT32 rc;
+ HBRUSH32 hbrush;
+ STATICINFO *infoPtr = (STATICINFO *)wndPtr->wExtra;
+ HDC32 hMemDC;
+ HBITMAP32 oldbitmap;
+
+ GetClientRect32( wndPtr->hwndSelf, &rc );
+ hbrush = SendMessage32A( GetParent32(wndPtr->hwndSelf), WM_CTLCOLORSTATIC,
+ hdc, wndPtr->hwndSelf );
+ FillRect32( hdc, &rc, hbrush );
+ if (infoPtr->hIcon) {
+ BITMAPOBJ *bmp = (BITMAPOBJ *) GDI_HEAP_LOCK( infoPtr->hIcon );
+
+ if (!bmp) return;
+ if (!(hMemDC = CreateCompatibleDC32( hdc ))) return;
+
+ oldbitmap = SelectObject32(hMemDC,infoPtr->hIcon);
+ BitBlt32(hdc,bmp->size.cx,bmp->size.cy,bmp->bitmap.bmWidth,bmp->bitmap.bmHeight,hMemDC,0,0,SRCCOPY);
+ DeleteDC32(hMemDC);
+ GDI_HEAP_UNLOCK(infoPtr->hIcon);
+ }
+}
diff --git a/controls/status.c b/controls/status.c
index 3fae2d9..d05aa6d 100644
--- a/controls/status.c
+++ b/controls/status.c
@@ -118,10 +118,10 @@
part_num = ((INT32) wParam) & 0x00ff;
style = ((INT32) wParam) & 0xff00;
- if (part_num > 255)
+ if (part_num >= 255)
return FALSE;
- if (self->simple)
+ if ((self->simple) || (part_num==255))
part = &self->part0;
else
part = &self->parts[part_num];