Release 961117
Sun Nov 17 15:01:45 1996 Alexandre Julliard <julliard@lrc.epfl.ch>
* [graphics/bitblt.c] [graphics/x11drv/bitblt.c]
Moved BitBlt operations to the new graphics driver
interface. Implemented PatBlt32, BitBlt32 and StretchBlt32.
* [memory/global.c]
Unified MemManInfo() and GlobalMemoryStatus().
* [objects/text.c]
Fixed ExtTextOut() to always use physical coords for clip rect.
* [windows/dialog.c]
Implemented DlgDirSelectEx() and Win32 version of DlgDirSelect*.
* [windows/event.c]
Avoid busy-looping in EVENT_WaitXEvent when no timer is pending
(thanks to Thomas Koenig).
* [windows/painting.c]
Moved update region clipping for CS_PARENTDC windows to BeginPaint().
* [windows/scroll.c]
Implemented Win32 version of ScrollWindow() and ScrollDC().
Tue Nov 12 09:52:17 1996 Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>
* [files/*.c] [win32/file.c]
Some win32 filetime conversion functions added.
Fixed behaviour with DOS drives pointing to UNIX /
SetCurrentDirectory() may also get X:\xxx paths.
Fixed FILE_Open when called from CreateFile().
Added GetFileSize(), MapViewOfFile(), SetFileTime(), GetFileTime().
* [misc/crtdll.c] [if1632/crtdll.spec]
Added some new functions.
* [if1632/user32.spec]
Some thunks into win16 code added.
* [win32/init.c]
Added GetSystemInfo(), removed GetModuleFileName() stub.
* [win32/code_page.c] [if1632/thunk.c]
Added EnumSystemCodePages* (untested).
* [objects/font.c] [if1632/thunk.c]
Added EnumFontFamilies32*.
Mon Nov 11 14:50:24 1996 Huw D. M. Davies <h.davies1@physics.oxford.ac.uk>
* [controls/menu.c] [windows/mdi.c]
Don't delete the MDI `windows' menu if it's already been deleted.
* [misc/exec.c]
Notepad always calls WinHelp(.., HELP_QUIT, ...) at termination
and complains if it returns FALSE.
* [windows/winpos.c]
Get maximized MDI child's nonclient area redrawn after resize.
Thu Nov 7 13:32:34 1996 Lee Jaekil <juria@seodu.co.kr>
* [memory/global.c]
Use /proc filesystem for GlobalMemoryStatus() on Linux.
Mon Nov 4 18:30:00 1996 Alex Korobka <alex@trantor.pharm.sunysb.edu>
* [windows/event.c]
Added OffiX-style file drop handling. File paths must be
DOS-mappable by Wine (via wine.conf).
* [controls/combo.c]
Added WM_GETTEXT handler.
* [objects/palette.c]
Added ResizePalette() (untested).
* [objects/cursoricon.c]
Implemented icon to cursor conversion.
* [objects/color.c]
Fixed crash on startup when no colorcells are writeable.
Mon Nov 4 00:49:41 1996 Ulrich Schmid <uschmid@mail.hh.provi.de>
* [rc/winerc.c]
Added support for win32 output.
* [library/libres.c] [include/libres.h] [loader/resource.c]
Renamed LIBRES_FindResource to LIBRES_FindResource16.
Added LIBRES_FindResource32.
Sun Nov 3 21:21:45 1996 Robert Pouliot <krynos@clic.net>
* [loader/builtin.c] [if1632/Makefile.in] [if1632/wing.spec]
Added the spec file for WinG, it's only stub for now, but it
should be easy to do by someone with Windows programming
knowledge. See: ftp.microsoft.com/SoftLib/MSLFILES/wing10.exe.
* [if1632/crtdll.spec]
Added some string and memory functions to make sfxed95.exe (of
Warcraft 2) almost work.
diff --git a/ANNOUNCE b/ANNOUNCE
index d5d35fe..a999ecd 100644
--- a/ANNOUNCE
+++ b/ANNOUNCE
@@ -1,12 +1,13 @@
-This is release 961102 of Wine, the MS Windows emulator. This is still a
+This is release 961117 of Wine, the MS Windows emulator. This is still a
developer's only release. There are many bugs and many unimplemented API
features. Most applications still do not work correctly.
Patches should be submitted to "julliard@lrc.epfl.ch". Please don't
forget to include a ChangeLog entry.
-WHAT'S NEW with Wine-961102: (see ChangeLog for details)
+WHAT'S NEW with Wine-961117: (see ChangeLog for details)
- More Win32 functions.
+ - OffiX-style drag and drop.
- Lots of bug fixes.
See the README file in the distribution for installation instructions.
@@ -15,10 +16,10 @@
the release is available at the ftp sites. The sources will be available
from the following locations:
- ftp://sunsite.unc.edu/pub/Linux/ALPHA/wine/development/Wine-961102.tar.gz
- ftp://tsx-11.mit.edu/pub/linux/ALPHA/Wine/development/Wine-961102.tar.gz
- ftp://ftp.infomagic.com/pub/mirrors/linux/wine/development/Wine-961102.tar.gz
- ftp://aris.com/pub/linux/ALPHA/Wine/development/Wine-961102.tar.gz
+ ftp://sunsite.unc.edu/pub/Linux/ALPHA/wine/development/Wine-961117.tar.gz
+ ftp://tsx-11.mit.edu/pub/linux/ALPHA/Wine/development/Wine-961117.tar.gz
+ ftp://ftp.infomagic.com/pub/mirrors/linux/wine/development/Wine-961117.tar.gz
+ ftp://aris.com/pub/linux/ALPHA/Wine/development/Wine-961117.tar.gz
It should also be available from any site that mirrors tsx-11 or sunsite.
diff --git a/BUGS b/BUGS
index 1148443..4785851 100644
--- a/BUGS
+++ b/BUGS
@@ -1,20 +1,45 @@
-1. Messaging:
+This is intended to be a place where you should look first if
+you want to contribute to Wine development. Add your e-mail
+address to the corresponding entry if you are working on/have
+done something for one of the problems. You are encouraged to
+add new entries and, more importantly, remove those for the
+bugs you fixed ;-)
+------------------------------------------------------------
+As of Nov 8 1996 -
-- Message flow is not correct for multiple tasks
-- Dialog Boxes created by WM_CREATE handler aren't visible
-- MDI does not send WM_GETMINMAX message.
-- resizing of MDI child windows sometimes leaves them unrepainted
+General:
-2. Controls:
+ * Combobox code is very inadequate (no notification messages,
+ dropdown listboxes often stay visible, etc... ).
-- Some features are missing (like VK_SHIFT aided multiple selection in listboxes)
+ * Multicolumn and/or LBS_EXTENDEDSEL style listboxes are still
+ screwed up. [julliard@lrc.epfl.ch]
-3. Miscellaneous:
+ * Winsock asynchronous functions do not work.
-- AllocCSToDSAlias() shouldn't alloc alias for the same segment multiple times.
+ * Font mapping is too generic. No soft font loading, no rotated
+ text support. [alex@amadeus.pharm.sunysb.edu]
-4. Where to look in source files:
+ * No thread support in Win32 code.
-- grep for FIXME in the source files.
+ * Very alpha printing code. [john@division.co.uk]
+
+ * No icon titles.
+ - Windows uses a special window class to display icon titles.
+ Handles to these title windows are stored in the icon window
+ properties.
+
+Miscellaneous:
+
+ * AllocCSToDSAlias() shouldn't alloc alias for the same segment multiple
+ times.
+ * ScrollWindowEx() is outdated.
+ * HCBT_CLICKSKIPPED/HCBT_KEYSKIPPED hook actions are not implemented.
+ * Write sometimes segfaults in StretchDIBits() (when inside BITBLT_GetRow)
+ when only lower part of the resulting image is visible.
+
+Where to look in source files:
+
+ * grep for FIXME in the source files.
diff --git a/ChangeLog b/ChangeLog
index fec97dd..d848a91 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,109 @@
----------------------------------------------------------------------
+Sun Nov 17 15:01:45 1996 Alexandre Julliard <julliard@lrc.epfl.ch>
+
+ * [graphics/bitblt.c] [graphics/x11drv/bitblt.c]
+ Moved BitBlt operations to the new graphics driver
+ interface. Implemented PatBlt32, BitBlt32 and StretchBlt32.
+
+ * [memory/global.c]
+ Unified MemManInfo() and GlobalMemoryStatus().
+
+ * [objects/text.c]
+ Fixed ExtTextOut() to always use physical coords for clip rect.
+
+ * [windows/dialog.c]
+ Implemented DlgDirSelectEx() and Win32 version of DlgDirSelect*.
+
+ * [windows/event.c]
+ Avoid busy-looping in EVENT_WaitXEvent when no timer is pending
+ (thanks to Thomas Koenig).
+
+ * [windows/painting.c]
+ Moved update region clipping for CS_PARENTDC windows to BeginPaint().
+
+ * [windows/scroll.c]
+ Implemented Win32 version of ScrollWindow() and ScrollDC().
+
+Tue Nov 12 09:52:17 1996 Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>
+
+ * [files/*.c] [win32/file.c]
+ Some win32 filetime conversion functions added.
+ Fixed behaviour with DOS drives pointing to UNIX /
+ SetCurrentDirectory() may also get X:\xxx paths.
+ Fixed FILE_Open when called from CreateFile().
+ Added GetFileSize(), MapViewOfFile(), SetFileTime(), GetFileTime().
+
+ * [misc/crtdll.c] [if1632/crtdll.spec]
+ Added some new functions.
+
+ * [if1632/user32.spec]
+ Some thunks into win16 code added.
+
+ * [win32/init.c]
+ Added GetSystemInfo(), removed GetModuleFileName() stub.
+
+ * [win32/code_page.c] [if1632/thunk.c]
+ Added EnumSystemCodePages* (untested).
+
+ * [objects/font.c] [if1632/thunk.c]
+ Added EnumFontFamilies32*.
+
+Mon Nov 11 14:50:24 1996 Huw D. M. Davies <h.davies1@physics.oxford.ac.uk>
+
+ * [controls/menu.c] [windows/mdi.c]
+ Don't delete the MDI `windows' menu if it's already been deleted.
+
+ * [misc/exec.c]
+ Notepad always calls WinHelp(.., HELP_QUIT, ...) at termination
+ and complains if it returns FALSE.
+
+ * [windows/winpos.c]
+ Get maximized MDI child's nonclient area redrawn after resize.
+
+Thu Nov 7 13:32:34 1996 Lee Jaekil <juria@seodu.co.kr>
+
+ * [memory/global.c]
+ Use /proc filesystem for GlobalMemoryStatus() on Linux.
+
+Mon Nov 4 18:30:00 1996 Alex Korobka <alex@trantor.pharm.sunysb.edu>
+
+ * [windows/event.c]
+ Added OffiX-style file drop handling. File paths must be
+ DOS-mappable by Wine (via wine.conf).
+
+ * [controls/combo.c]
+ Added WM_GETTEXT handler.
+
+ * [objects/palette.c]
+ Added ResizePalette() (untested).
+
+ * [objects/cursoricon.c]
+ Implemented icon to cursor conversion.
+
+ * [objects/color.c]
+ Fixed crash on startup when no colorcells are writeable.
+
+Mon Nov 4 00:49:41 1996 Ulrich Schmid <uschmid@mail.hh.provi.de>
+
+ * [rc/winerc.c]
+ Added support for win32 output.
+
+ * [library/libres.c] [include/libres.h] [loader/resource.c]
+ Renamed LIBRES_FindResource to LIBRES_FindResource16.
+ Added LIBRES_FindResource32.
+
+Sun Nov 3 21:21:45 1996 Robert Pouliot <krynos@clic.net>
+
+ * [loader/builtin.c] [if1632/Makefile.in] [if1632/wing.spec]
+ Added the spec file for WinG, it's only stub for now, but it
+ should be easy to do by someone with Windows programming
+ knowledge. See: ftp.microsoft.com/SoftLib/MSLFILES/wing10.exe.
+
+ * [if1632/crtdll.spec]
+ Added some string and memory functions to make sfxed95.exe (of
+ Warcraft 2) almost work.
+
+----------------------------------------------------------------------
Sat Nov 2 12:50:40 1996 Alexandre Julliard <julliard@lrc.epfl.ch>
* [files/dos_fs.c]
diff --git a/Make.rules.in b/Make.rules.in
index 43d024a..f8d1c90 100644
--- a/Make.rules.in
+++ b/Make.rules.in
@@ -52,7 +52,7 @@
echo "#include \"windows.h\"" >winerctmp.c
echo WINDOWS_H_ENDS_HERE >>winerctmp.c
cat $< >>winerctmp.c
- $(CPP) $(DEFS) $(OPTIONS) $(DIVINCL) -DRC_INVOKED -P winerctmp.c | sed -e '1,/^WINDOWS_H_ENDS_HERE/d' | $(WINERC) -c -o $* -p $*
+ $(CPP) $(DEFS) $(OPTIONS) $(DIVINCL) -DRC_INVOKED -P winerctmp.c | sed -e '1,/^WINDOWS_H_ENDS_HERE/d' | $(WINERC) $(RCFLAGS) -c -o $* -p $*
$(RM) winerctmp.c
.rc.h:
diff --git a/controls/button.c b/controls/button.c
index 8d92822..3367a66 100644
--- a/controls/button.c
+++ b/controls/button.c
@@ -284,8 +284,8 @@
{
/* draw button shadow: */
SelectObject32(hDC, sysColorObjects.hbrushBtnShadow );
- PatBlt(hDC, rc.left, rc.top, 1, rc.bottom-rc.top, PATCOPY );
- PatBlt(hDC, rc.left, rc.top, rc.right-rc.left, 1, PATCOPY );
+ PatBlt32(hDC, rc.left, rc.top, 1, rc.bottom-rc.top, PATCOPY );
+ PatBlt32(hDC, rc.left, rc.top, rc.right-rc.left, 1, PATCOPY );
rc.left += 2; /* To position the text down and right */
rc.top += 2;
}
@@ -352,12 +352,12 @@
SelectObject32( hdcMem, hbmMem);
hBr = SelectObject32( hdcMem, CreatePatternBrush32(hbm) );
DeleteObject32( hbm );
- PatBlt( hdcMem,0,0,rect.right,rect.bottom,WHITENESS);
+ PatBlt32( hdcMem,0,0,rect.right,rect.bottom,WHITENESS);
if (hFont) SelectObject32( hdcMem, hFont);
DrawText32A( hdcMem, text, -1, &rc2, DT_SINGLELINE);
- PatBlt( hdcMem,0,0,rect.right,rect.bottom,0xFA0089);
+ PatBlt32( hdcMem,0,0,rect.right,rect.bottom,0xFA0089);
DeleteObject32( SelectObject32( hdcMem,hBr) );
- BitBlt( hDC,rect.left,rect.top,rect.right,rect.bottom,hdcMem,0,0,0x990000);
+ BitBlt32(hDC,rect.left,rect.top,rect.right,rect.bottom,hdcMem,0,0,0x990000);
DeleteDC( hdcMem);
DeleteObject32( hbmMem );
}
diff --git a/controls/combo.c b/controls/combo.c
index c3f429e..43a368b 100644
--- a/controls/combo.c
+++ b/controls/combo.c
@@ -21,7 +21,6 @@
#include "graphics.h"
#include "heap.h"
#include "listbox.h"
-#include "dos_fs.h"
#include "drive.h"
#include "stddebug.h"
#include "debug.h"
@@ -289,7 +288,7 @@
static LRESULT CBLButtonDown(HWND hwnd, WPARAM16 wParam, LPARAM lParam)
{
LPHEADCOMBO lphc = ComboGetStorageHeader(hwnd);
- SendMessage16(hwnd,CB_SHOWDROPDOWN,!lphc->DropDownVisible,0);
+ SendMessage16(hwnd,CB_SHOWDROPDOWN16,!lphc->DropDownVisible,0);
return 0;
}
@@ -774,6 +773,15 @@
return SendMessage16(lphc->hWndEdit, EM_SETSEL, 0, lParam);
}
+/***********************************************************************
+ * CBGetText
+ */
+static LRESULT CBGetText(HWND hwnd, WPARAM16 wParam, LPARAM lParam)
+{
+ LPHEADCOMBO lphc = ComboGetStorageHeader(hwnd);
+
+ return SendMessage16(lphc->hWndEdit, WM_GETTEXT, wParam, lParam);
+}
/***********************************************************************
* ComboWndProc
@@ -790,31 +798,32 @@
case WM_SETFONT: return CBSetFont(hwnd, wParam, lParam);
case WM_SETREDRAW: return CBSetRedraw(hwnd, wParam, lParam);
case WM_PAINT: return CBPaint(hwnd, wParam, lParam);
+ case WM_GETTEXT: return CBGetText( hwnd, wParam, lParam);
case WM_LBUTTONDOWN: return CBLButtonDown(hwnd, wParam, lParam);
case WM_SETFOCUS: return CBSetFocus(hwnd, wParam, lParam);
case WM_KILLFOCUS: return CBKillFocus(hwnd, wParam, lParam);
case WM_SIZE: return CBCheckSize(hwnd);
case WM_COMMAND: return CBCommand(hwnd, wParam, lParam);
- case CB_RESETCONTENT: return CBResetContent(hwnd, wParam, lParam);
- case CB_DIR: return CBDir(hwnd, wParam, lParam);
- case CB_ADDSTRING: return CBAddString(hwnd, wParam, lParam);
- case CB_INSERTSTRING: return CBInsertString(hwnd, wParam, lParam);
- case CB_DELETESTRING: return CBDeleteString(hwnd, wParam, lParam);
- case CB_FINDSTRING: return CBFindString(hwnd, wParam, lParam);
- case CB_GETCOUNT: return CBGetCount(hwnd, wParam, lParam);
- case CB_GETCURSEL: return CBGetCurSel(hwnd, wParam, lParam);
- case CB_GETITEMDATA: return CBGetItemData(hwnd, wParam, lParam);
- case CB_GETITEMHEIGHT: return CBGetItemHeight(hwnd, wParam, lParam);
- case CB_GETLBTEXT: return CBGetLBText(hwnd, wParam, lParam);
- case CB_GETLBTEXTLEN: return CBGetLBTextLen(hwnd, wParam, lParam);
- case CB_SELECTSTRING: return CBSelectString(hwnd, wParam, lParam);
- case CB_SETITEMDATA: return CBSetItemData(hwnd, wParam, lParam);
- case CB_SETCURSEL: return CBSetCurSel(hwnd, wParam, lParam);
- case CB_SETITEMHEIGHT: return CBSetItemHeight(hwnd, wParam, lParam);
- case CB_SHOWDROPDOWN: return CBShowDropDown(hwnd, wParam, lParam);
- case CB_GETEDITSEL: return CBGetEditSel(hwnd, wParam, lParam);
- case CB_SETEDITSEL: return CBSetEditSel(hwnd, wParam, lParam);
- case CB_FINDSTRINGEXACT: return CBFindStringExact(hwnd, wParam, lParam);
+ case CB_RESETCONTENT16: return CBResetContent(hwnd, wParam, lParam);
+ case CB_DIR16: return CBDir(hwnd, wParam, lParam);
+ case CB_ADDSTRING16: return CBAddString(hwnd, wParam, lParam);
+ case CB_INSERTSTRING16: return CBInsertString(hwnd, wParam, lParam);
+ case CB_DELETESTRING16: return CBDeleteString(hwnd, wParam, lParam);
+ case CB_FINDSTRING16: return CBFindString(hwnd, wParam, lParam);
+ case CB_GETCOUNT16: return CBGetCount(hwnd, wParam, lParam);
+ case CB_GETCURSEL16: return CBGetCurSel(hwnd, wParam, lParam);
+ case CB_GETITEMDATA16: return CBGetItemData(hwnd, wParam, lParam);
+ case CB_GETITEMHEIGHT16: return CBGetItemHeight(hwnd, wParam, lParam);
+ case CB_GETLBTEXT16: return CBGetLBText(hwnd, wParam, lParam);
+ case CB_GETLBTEXTLEN16: return CBGetLBTextLen(hwnd, wParam, lParam);
+ case CB_SELECTSTRING16: return CBSelectString(hwnd, wParam, lParam);
+ case CB_SETITEMDATA16: return CBSetItemData(hwnd, wParam, lParam);
+ case CB_SETCURSEL16: return CBSetCurSel(hwnd, wParam, lParam);
+ case CB_SETITEMHEIGHT16: return CBSetItemHeight(hwnd, wParam, lParam);
+ case CB_SHOWDROPDOWN16: return CBShowDropDown(hwnd, wParam, lParam);
+ case CB_GETEDITSEL16: return CBGetEditSel(hwnd, wParam, lParam);
+ case CB_SETEDITSEL16: return CBSetEditSel(hwnd, wParam, lParam);
+ case CB_FINDSTRINGEXACT16: return CBFindStringExact(hwnd, wParam, lParam);
}
return DefWindowProc16(hwnd, message, wParam, lParam);
}
@@ -988,7 +997,7 @@
*/
static LRESULT CBLKillFocus( HWND hwnd, WPARAM16 wParam, LPARAM lParam )
{
-/* SendMessage16(CLBoxGetCombo(hwnd),CB_SHOWDROPDOWN,0,0);*/
+/* SendMessage16(CLBoxGetCombo(hwnd),CB_SHOWDROPDOWN16,0,0);*/
return 0;
}
@@ -998,7 +1007,7 @@
static LRESULT CBLActivate( HWND hwnd, WPARAM16 wParam, LPARAM lParam )
{
if (wParam == WA_INACTIVE)
- SendMessage16(CLBoxGetCombo(hwnd),CB_SHOWDROPDOWN,0,0);
+ SendMessage16(CLBoxGetCombo(hwnd),CB_SHOWDROPDOWN16,0,0);
return 0;
}
@@ -1042,12 +1051,12 @@
}
else if (lphl->PrevFocused != lphl->ItemFocused)
{
- SendMessage16(CLBoxGetCombo(hwnd),CB_SETCURSEL,lphl->ItemFocused,0);
+ SendMessage16(CLBoxGetCombo(hwnd),CB_SETCURSEL16,lphl->ItemFocused,0);
SendMessage16(GetParent16(hwnd), WM_COMMAND,ID_CLB,MAKELONG(0,CBN_SELCHANGE));
ListBoxSendNotification(lphl, CBN_SELCHANGE);
}
- SendMessage16(CLBoxGetCombo(hwnd),CB_SHOWDROPDOWN,0,0);
+ SendMessage16(CLBoxGetCombo(hwnd),CB_SHOWDROPDOWN16,0,0);
return 0;
}
@@ -1225,15 +1234,6 @@
return DefWindowProc16(hwnd, message, wParam, lParam);
}
-/************************************************************************
- * DlgDirSelectComboBox [USER.194]
- */
-BOOL DlgDirSelectComboBox(HWND hDlg, LPSTR lpStr, INT nIDLBox)
-{
- fprintf(stdnimp,"DlgDirSelectComboBox(%04x, '%s', %d) \n",
- hDlg, lpStr, nIDLBox);
- return TRUE;
-}
static INT32 COMBO_DlgDirList( HWND32 hDlg, LPARAM path, INT32 idCBox,
INT32 idStatic, UINT32 wType, BOOL32 unicode )
@@ -1242,11 +1242,11 @@
if (idCBox)
{
- SendDlgItemMessage32A( hDlg, idCBox, CB_RESETCONTENT, 0, 0 );
+ SendDlgItemMessage32A( hDlg, idCBox, CB_RESETCONTENT16, 0, 0 );
if (unicode)
- res = SendDlgItemMessage32W( hDlg, idCBox, CB_DIR, wType, path );
+ res = SendDlgItemMessage32W( hDlg, idCBox, CB_DIR16, wType, path );
else
- res = SendDlgItemMessage32A( hDlg, idCBox, CB_DIR, wType, path );
+ res = SendDlgItemMessage32A( hDlg, idCBox, CB_DIR16, wType, path );
}
if (idStatic)
{
diff --git a/controls/edit.c b/controls/edit.c
index e86af14..66baa58 100644
--- a/controls/edit.c
+++ b/controls/edit.c
@@ -1879,7 +1879,7 @@
if (wndPtr->hwndSelf == GetFocus32())
HideCaret(wndPtr->hwndSelf);
if (EDIT_GetRedraw(wndPtr))
- ScrollWindow(wndPtr->hwndSelf, dx, dy, NULL, NULL);
+ ScrollWindow32(wndPtr->hwndSelf, dx, dy, NULL, NULL);
es->FirstVisibleLine = nfv;
es->XOffset = nxoff;
if (IsVScrollBar(wndPtr))
diff --git a/controls/listbox.c b/controls/listbox.c
index 1fe77b2..a07645d 100644
--- a/controls/listbox.c
+++ b/controls/listbox.c
@@ -2176,43 +2176,6 @@
/**********************************************************************
- * DlgDirSelect (USER.99)
- */
-BOOL DlgDirSelect( HWND hDlg, LPSTR lpStr, INT id )
-{
- char *buffer;
- INT i;
-
- dprintf_listbox( stddeb, "DlgDirSelect: %04x '%s' %d\n", hDlg, lpStr, id );
- if ((i = SendDlgItemMessage16( hDlg, id, LB_GETCURSEL16, 0, 0 )) == LB_ERR)
- return FALSE;
- if (!(buffer = SEGPTR_ALLOC( 20 * sizeof(char) ))) return FALSE;
- SendDlgItemMessage16(hDlg, id, LB_GETTEXT16, i, (LPARAM)SEGPTR_GET(buffer) );
- if (buffer[0] == '[') /* drive or directory */
- {
- if (buffer[1] == '-') /* drive */
- {
- lpStr[0] = buffer[2];
- lpStr[1] = ':';
- lpStr[2] = '\0';
- dprintf_listbox( stddeb, "Returning drive '%s'\n", lpStr );
- SEGPTR_FREE(buffer);
- return TRUE;
- }
- strcpy( lpStr, buffer + 1 );
- lpStr[strlen(lpStr)-1] = '\\';
- dprintf_listbox( stddeb, "Returning directory '%s'\n", lpStr );
- SEGPTR_FREE(buffer);
- return TRUE;
- }
- strcpy( lpStr, buffer );
- dprintf_listbox( stddeb, "Returning file '%s'\n", lpStr );
- SEGPTR_FREE(buffer);
- return FALSE;
-}
-
-
-/**********************************************************************
* DlgDirList (USER.100)
*/
INT DlgDirList( HWND hDlg, SEGPTR spec, INT idLBox, INT idStatic, UINT attrib )
diff --git a/controls/menu.c b/controls/menu.c
index 8443376..59cee28 100644
--- a/controls/menu.c
+++ b/controls/menu.c
@@ -2173,7 +2173,7 @@
LPPOPUPMENU menu;
dprintf_menu(stddeb,"GetMenuItemCount(%04x);\n", hMenu);
menu = (LPPOPUPMENU) USER_HEAP_LIN_ADDR(hMenu);
- if (menu == NULL) return (UINT)-1;
+ if (menu == NULL || menu->wMagic != MENU_MAGIC) return (UINT)-1;
dprintf_menu(stddeb,"GetMenuItemCount(%04x) return %d \n",
hMenu, menu->nItems);
return menu->nItems;
diff --git a/controls/scroll.c b/controls/scroll.c
index 481f6cb..21316a0 100644
--- a/controls/scroll.c
+++ b/controls/scroll.c
@@ -48,7 +48,7 @@
#define SCROLL_MIN_RECT 4
/* Minimum size of the thumb in pixels */
-#define SCROLL_MIN_THUMB 4
+#define SCROLL_MIN_THUMB 6
/* Delay (in ms) before first repetition when holding the button down */
#define SCROLL_FIRST_DELAY 200
@@ -316,28 +316,28 @@
TOP_ARROW(infoPtr->flags, top_pressed)
: LEFT_ARROW(infoPtr->flags, top_pressed));
SetStretchBltMode( hdc, STRETCH_DELETESCANS );
- StretchBlt( hdc, rect->left, rect->top,
- vertical ? rect->right-rect->left : arrowSize+1,
- vertical ? arrowSize+1 : rect->bottom-rect->top,
- hdcMem, 0, 0,
- SYSMETRICS_CXVSCROLL + 1, SYSMETRICS_CYHSCROLL + 1,
- SRCCOPY );
+ StretchBlt32( hdc, rect->left, rect->top,
+ vertical ? rect->right-rect->left : arrowSize+1,
+ vertical ? arrowSize+1 : rect->bottom-rect->top,
+ hdcMem, 0, 0,
+ SYSMETRICS_CXVSCROLL + 1, SYSMETRICS_CYHSCROLL + 1,
+ SRCCOPY );
SelectObject32( hdcMem, vertical ?
BOTTOM_ARROW( infoPtr->flags, bottom_pressed )
: RIGHT_ARROW( infoPtr->flags, bottom_pressed ) );
if (vertical)
- StretchBlt( hdc, rect->left, rect->bottom - arrowSize - 1,
- rect->right - rect->left, arrowSize + 1,
- hdcMem, 0, 0,
- SYSMETRICS_CXVSCROLL + 1, SYSMETRICS_CYHSCROLL + 1,
- SRCCOPY );
+ StretchBlt32( hdc, rect->left, rect->bottom - arrowSize - 1,
+ rect->right - rect->left, arrowSize + 1,
+ hdcMem, 0, 0,
+ SYSMETRICS_CXVSCROLL + 1, SYSMETRICS_CYHSCROLL + 1,
+ SRCCOPY );
else
- StretchBlt( hdc, rect->right - arrowSize - 1, rect->top,
- arrowSize + 1, rect->bottom - rect->top,
- hdcMem, 0, 0,
- SYSMETRICS_CXVSCROLL + 1, SYSMETRICS_CYHSCROLL + 1,
- SRCCOPY );
+ StretchBlt32( hdc, rect->right - arrowSize - 1, rect->top,
+ arrowSize + 1, rect->bottom - rect->top,
+ hdcMem, 0, 0,
+ SYSMETRICS_CXVSCROLL + 1, SYSMETRICS_CYHSCROLL + 1,
+ SRCCOPY );
SelectObject32( hdcMem, hbmpPrev );
DeleteDC( hdcMem );
}
@@ -432,35 +432,35 @@
if (!thumbPos) /* No thumb to draw */
{
- PatBlt( hdc, r.left+1, r.top+1, r.right - r.left - 2,
- r.bottom - r.top - 2, PATCOPY );
+ PatBlt32( hdc, r.left+1, r.top+1, r.right - r.left - 2,
+ r.bottom - r.top - 2, PATCOPY );
return;
}
if (vertical)
{
- PatBlt( hdc, r.left + 1, r.top + 1,
- r.right - r.left - 2,
- thumbPos - arrowSize,
- top_selected ? 0x0f0000 : PATCOPY );
+ PatBlt32( hdc, r.left + 1, r.top + 1,
+ r.right - r.left - 2,
+ thumbPos - arrowSize,
+ top_selected ? 0x0f0000 : PATCOPY );
r.top += thumbPos - arrowSize;
- PatBlt( hdc, r.left + 1, r.top + thumbSize + 1,
- r.right - r.left - 2,
- r.bottom - r.top - thumbSize - 2,
- bottom_selected ? 0x0f0000 : PATCOPY );
+ PatBlt32( hdc, r.left + 1, r.top + thumbSize + 1,
+ r.right - r.left - 2,
+ r.bottom - r.top - thumbSize - 2,
+ bottom_selected ? 0x0f0000 : PATCOPY );
r.bottom = r.top + thumbSize + 1;
}
else /* horizontal */
{
- PatBlt( hdc, r.left + 1, r.top + 1,
- thumbPos - arrowSize,
- r.bottom - r.top - 2,
- top_selected ? 0x0f0000 : PATCOPY );
+ PatBlt32( hdc, r.left + 1, r.top + 1,
+ thumbPos - arrowSize,
+ r.bottom - r.top - 2,
+ top_selected ? 0x0f0000 : PATCOPY );
r.left += thumbPos - arrowSize;
- PatBlt( hdc, r.left + thumbSize + 1, r.top + 1,
- r.right - r.left - thumbSize - 2,
- r.bottom - r.top - 2,
- bottom_selected ? 0x0f0000 : PATCOPY );
+ PatBlt32( hdc, r.left + thumbSize + 1, r.top + 1,
+ r.right - r.left - thumbSize - 2,
+ r.bottom - r.top - 2,
+ bottom_selected ? 0x0f0000 : PATCOPY );
r.right = r.left + thumbSize + 1;
}
diff --git a/controls/widgets.c b/controls/widgets.c
index 0235053..88d01a4 100644
--- a/controls/widgets.c
+++ b/controls/widgets.c
@@ -16,6 +16,8 @@
#include "module.h"
#include "heap.h"
+#define OLD_LISTBOX
+
typedef struct
{
UINT16 style;
@@ -29,8 +31,10 @@
{
{ CS_GLOBALCLASS | CS_PARENTDC,
sizeof(STATICINFO), 0, "StaticWndProc", "STATIC" },
+#ifdef OLD_LISTBOX
{ CS_GLOBALCLASS | CS_PARENTDC | CS_DBLCLKS,
8, 0, "ListBoxWndProc", "LISTBOX" },
+#endif
{ CS_GLOBALCLASS | CS_PARENTDC | CS_DBLCLKS,
8, 0, "ComboBoxWndProc", "COMBOBOX" },
{ CS_GLOBALCLASS | CS_DBLCLKS | CS_SAVEBITS,
@@ -53,6 +57,10 @@
{
{ CS_GLOBALCLASS | CS_DBLCLKS | CS_VREDRAW | CS_HREDRAW | CS_PARENTDC,
ButtonWndProc, 0, sizeof(BUTTONINFO), 0, 0, 0, 0, 0, "BUTTON" },
+#ifndef OLD_LISTBOX
+ { CS_GLOBALCLASS | CS_DBLCLKS /*| CS_PARENTDC*/,
+ ListBoxWndProc32, 0, sizeof(void *), 0, 0, 0, 0, 0, "LISTBOX" },
+#endif
{ CS_GLOBALCLASS | CS_DBLCLKS | CS_VREDRAW | CS_HREDRAW | CS_PARENTDC,
ScrollBarWndProc, 0, sizeof(SCROLLBAR_INFO), 0, 0, 0, 0, 0, "SCROLLBAR"},
{ CS_GLOBALCLASS, DesktopWndProc, 0, sizeof(DESKTOPINFO),
diff --git a/documentation/user_module b/documentation/user_module
index 4335f9c..8cff4cb 100644
--- a/documentation/user_module
+++ b/documentation/user_module
@@ -213,5 +213,4 @@
and in this case SendMessage has to build some sort of message
queue for sent messages. Another issue is what to do with messages
sent to the sender when it is blocked inside its own SendMessage.
- At this point Wine addresses very few of these problems.
diff --git a/files/dos_fs.c b/files/dos_fs.c
index 3e3c8dc..77aa5ed 100644
--- a/files/dos_fs.c
+++ b/files/dos_fs.c
@@ -306,6 +306,25 @@
+ tm->tm_mday;
}
+/***********************************************************************
+ * DOSFS_DosDateTimeToUnixTime
+ *
+ * Convert from the DOS (FAT) date/time format into Unix time
+ * (borrowed from files/file.c)
+ */
+time_t DOSFS_DosDateTimeToUnixTime( WORD date, WORD time )
+{
+ struct tm newtm;
+
+ newtm.tm_sec = (time & 0x1f) * 2;
+ newtm.tm_min = (time >> 5) & 0x3f;
+ newtm.tm_hour = (time >> 11);
+ newtm.tm_mday = (date & 0x1f);
+ newtm.tm_mon = ((date >> 5) & 0x0f) - 1;
+ newtm.tm_year = (date >> 9) + 80;
+ return mktime( &newtm );
+}
+
/***********************************************************************
* DOSFS_UnixTimeToFileTime
@@ -760,7 +779,8 @@
path, skip, buffer, cur_pos );
cur_pos = skip;
if (dir) closedir(dir);
- if (!(dir = opendir( path ))) return 0;
+ if (!*path) path = "/";
+ if (!(dir = opendir(path))) return 0;
drive_path = path;
drive_root = 0;
if (DRIVE_FindDriveRoot( &drive_path ) != -1)
@@ -876,3 +896,94 @@
*lastpart=strrchr(buf,'\\');
return strlen(fn);
}
+
+
+/***********************************************************************
+ * DosDateTimeToFileTime (KERNEL32.76)
+ */
+BOOL32 DosDateTimeToFileTime( WORD fatdate, WORD fattime, LPFILETIME ft )
+{
+ time_t unixtime = DOSFS_DosDateTimeToUnixTime(fatdate,fattime);
+ DOSFS_UnixTimeToFileTime(unixtime,ft);
+ return TRUE;
+}
+
+
+/***********************************************************************
+ * FileTimeToDosDateTime (KERNEL32.111)
+ */
+BOOL32 FileTimeToDosDateTime( LPFILETIME ft, LPWORD fatdate, LPWORD fattime)
+{
+ time_t unixtime = DOSFS_FileTimeToUnixTime(ft);
+ DOSFS_ToDosDateTime(unixtime,fatdate,fattime);
+ return TRUE;
+}
+
+
+/***********************************************************************
+ * LocalFileTimeToFileTime (KERNEL32.373)
+ */
+BOOL32 LocalFileTimeToFileTime( LPFILETIME localft, LPFILETIME utcft )
+{
+ struct tm *xtm;
+
+ /* convert from local to UTC. Perhaps not correct. FIXME */
+ xtm = gmtime((time_t*)&(localft->dwLowDateTime));
+ utcft->dwLowDateTime = mktime(xtm);
+ utcft->dwHighDateTime = 0;
+ return TRUE;
+}
+
+
+/***********************************************************************
+ * FileTimeToLocalFileTime (KERNEL32.112)
+ */
+BOOL32 FileTimeToLocalFileTime( LPFILETIME utcft, LPFILETIME localft )
+{
+ struct tm *xtm;
+
+ /* convert from UTC to local. Perhaps not correct. FIXME */
+ xtm = localtime((time_t*)&(utcft->dwLowDateTime));
+ localft->dwLowDateTime = mktime(xtm);
+ localft->dwHighDateTime = 0;
+ return TRUE;
+}
+
+
+/***********************************************************************
+ * FileTimeToSystemTime (KERNEL32.113)
+ */
+BOOL32 FileTimeToSystemTime( LPFILETIME ft, LPSYSTEMTIME syst )
+{
+ struct tm *xtm;
+ time_t xtime = DOSFS_FileTimeToUnixTime(ft);
+ xtm = gmtime(&xtime);
+ syst->wYear = xtm->tm_year;
+ syst->wMonth = xtm->tm_mon;
+ syst->wDayOfWeek = xtm->tm_wday;
+ syst->wDay = xtm->tm_mday;
+ syst->wHour = xtm->tm_hour;
+ syst->wMinute = xtm->tm_min;
+ syst->wSecond = xtm->tm_sec;
+ syst->wMilliseconds = 0; /* FIXME */
+ return TRUE;
+}
+
+
+/***********************************************************************
+ * SystemTimeToFileTime (KERNEL32.526)
+ */
+BOOL32 SystemTimeToFileTime( LPSYSTEMTIME syst, LPFILETIME ft )
+{
+ struct tm xtm;
+
+ xtm.tm_year = syst->wYear;
+ xtm.tm_mon = syst->wMonth;
+ xtm.tm_wday = syst->wDayOfWeek;
+ xtm.tm_mday = syst->wDay;
+ xtm.tm_hour = syst->wHour;
+ xtm.tm_min = syst->wMinute;
+ xtm.tm_sec = syst->wSecond;
+ DOSFS_UnixTimeToFileTime(mktime(&xtm),ft);
+ return TRUE;
+}
diff --git a/files/drive.c b/files/drive.c
index 9210de7..8a5bf5a 100644
--- a/files/drive.c
+++ b/files/drive.c
@@ -136,7 +136,10 @@
{
p = path + strlen(path) - 1;
while ((p > path) && ((*p == '/') || (*p == '\\'))) *p-- = '\0';
- drive->root = xstrdup( path );
+ if (strlen(path))
+ drive->root = xstrdup( path );
+ else
+ drive->root = xstrdup( "/" );
drive->dos_cwd = xstrdup( "" );
drive->unix_cwd = xstrdup( "" );
drive->type = DRIVE_GetDriveType( name );
@@ -681,6 +684,17 @@
*/
BOOL32 SetCurrentDirectory( LPCSTR dir )
{
+ if (dir[0] && (dir[1]==':'))
+ {
+ int drive = tolower( *dir ) - 'a';
+ if (!DRIVE_IsValid(drive))
+ {
+ DOS_ERROR( ER_InvalidDrive, EC_MediaError, SA_Abort, EL_Disk );
+ return 0;
+ }
+ dir += 2;
+ }
+ /* FIXME: what about empty strings? Add a \\ ? */
return DRIVE_Chdir( DRIVE_GetCurrentDrive(), dir );
}
diff --git a/files/file.c b/files/file.c
index d8b22b2..45ac9f0 100644
--- a/files/file.c
+++ b/files/file.c
@@ -366,8 +366,9 @@
return HFILE_ERROR;
}
}
- else if (!(unixName = DOSFS_GetUnixFileName( path, TRUE )))
- return HFILE_ERROR;
+ else /* check for filename, don't check for last entry if creating */
+ if (!(unixName = DOSFS_GetUnixFileName( path, !(mode & O_CREAT) )))
+ return HFILE_ERROR;
if (!(file = FILE_OpenUnixFile( unixName, mode ))) return HFILE_ERROR;
if ((handle = FILE_AllocTaskHandle( file )) == HFILE_ERROR)
@@ -1406,3 +1407,71 @@
}
return file->type;
}
+
+
+/***********************************************************************
+ * GetFileTime (KERNEL32.221)
+ */
+BOOL32 GetFileTime( HFILE hFile, FILETIME *lpCreationTime,
+ FILETIME *lpLastAccessTime, FILETIME *lpLastWriteTime )
+{
+ DOS_FILE *file = FILE_GetFile(hFile);
+ struct stat stbuf;
+
+ if (!file) {
+ SetLastError( ERROR_INVALID_HANDLE );
+ return FILE_TYPE_UNKNOWN; /* FIXME: correct? */
+ }
+ dprintf_file(stddeb,"SetFileTime(%s,%p,%p,%p)\n",
+ file->unix_name,
+ lpCreationTime,
+ lpLastAccessTime,
+ lpLastWriteTime
+ );
+ if (-1==fstat(file->unix_handle,&stbuf)) {
+ FILE_SetDosError();
+ return FALSE;
+ }
+ if (lpLastWriteTime)
+ DOSFS_UnixTimeToFileTime(stbuf.st_mtime,lpLastWriteTime);
+ if (lpCreationTime)
+ DOSFS_UnixTimeToFileTime(stbuf.st_ctime,lpCreationTime);
+ if (lpLastAccessTime)
+ DOSFS_UnixTimeToFileTime(stbuf.st_atime,lpLastAccessTime);
+ return TRUE;
+}
+
+
+/***********************************************************************
+ * SetFileTime (KERNEL32.493)
+ */
+BOOL32 SetFileTime( HFILE hFile, FILETIME *lpCreationTime,
+ FILETIME *lpLastAccessTime, FILETIME *lpLastWriteTime )
+{
+ DOS_FILE *file = FILE_GetFile(hFile);
+ struct utimbuf utimbuf;
+
+ if (!file) {
+ SetLastError( ERROR_INVALID_HANDLE );
+ return FILE_TYPE_UNKNOWN; /* FIXME: correct? */
+ }
+ dprintf_file(stddeb,"SetFileTime(%s,%p,%p,%p)\n",
+ file->unix_name,
+ lpCreationTime,
+ lpLastAccessTime,
+ lpLastWriteTime
+ );
+ if (lpLastAccessTime)
+ utimbuf.actime = DOSFS_FileTimeToUnixTime(lpLastAccessTime);
+ else
+ utimbuf.actime = 0; /* FIXME */
+ if (lpLastWriteTime)
+ utimbuf.modtime = DOSFS_FileTimeToUnixTime(lpLastWriteTime);
+ else
+ utimbuf.modtime = 0; /* FIXME */
+ if (-1==utime(file->unix_name,&utimbuf)) {
+ FILE_SetDosError();
+ return FALSE;
+ }
+ return TRUE;
+}
diff --git a/files/profile.c b/files/profile.c
index 4570b5e..ddb21ed 100644
--- a/files/profile.c
+++ b/files/profile.c
@@ -10,8 +10,8 @@
#include <stdlib.h>
#include <string.h>
-#include "dos_fs.h"
#include "windows.h"
+#include "dos_fs.h"
#include "xmalloc.h"
#include "stddebug.h"
#include "debug.h"
diff --git a/graphics/Makefile.in b/graphics/Makefile.in
index cc46354..9bb9535 100644
--- a/graphics/Makefile.in
+++ b/graphics/Makefile.in
@@ -6,6 +6,7 @@
MODULE = graphics
C_SRCS = \
+ bitblt.c \
driver.c
all: $(MODULE).o
diff --git a/graphics/bitblt.c b/graphics/bitblt.c
new file mode 100644
index 0000000..2acda69
--- /dev/null
+++ b/graphics/bitblt.c
@@ -0,0 +1,149 @@
+/*
+ * GDI bit-blit operations
+ *
+ * Copyright 1993, 1994 Alexandre Julliard
+ */
+
+#include "gdi.h"
+#include "stddebug.h"
+#include "debug.h"
+
+
+/***********************************************************************
+ * PatBlt16 (GDI.29)
+ */
+BOOL16 PatBlt16( HDC16 hdc, INT16 left, INT16 top,
+ INT16 width, INT16 height, DWORD rop)
+{
+ DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
+ if (!dc || !dc->funcs->pPatBlt) return FALSE;
+
+ dprintf_bitblt( stddeb, "PatBlt16: %04x %d,%d %dx%d %06lx\n",
+ hdc, left, top, width, height, rop );
+ return dc->funcs->pPatBlt( dc, left, top, width, height, rop );
+}
+
+
+/***********************************************************************
+ * PatBlt32 (GDI32.260)
+ */
+BOOL32 PatBlt32( HDC32 hdc, INT32 left, INT32 top,
+ INT32 width, INT32 height, DWORD rop)
+{
+ DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
+ if (!dc || !dc->funcs->pPatBlt) return FALSE;
+
+ dprintf_bitblt( stddeb, "PatBlt32: %04x %d,%d %dx%d %06lx\n",
+ hdc, left, top, width, height, rop );
+ return dc->funcs->pPatBlt( dc, left, top, width, height, rop );
+}
+
+
+/***********************************************************************
+ * BitBlt16 (GDI.34)
+ */
+BOOL16 BitBlt16( HDC16 hdcDst, INT16 xDst, INT16 yDst, INT16 width,
+ INT16 height, HDC16 hdcSrc, INT16 xSrc, INT16 ySrc, DWORD rop)
+{
+ DC *dcDst, *dcSrc;
+
+ if (!(dcDst = (DC *)GDI_GetObjPtr( hdcDst, DC_MAGIC ))) return FALSE;
+ if (!dcDst->funcs->pBitBlt) return FALSE;
+ dcSrc = (DC *) GDI_GetObjPtr( hdcSrc, DC_MAGIC );
+
+ dprintf_bitblt(stddeb,
+ "BitBlt16: hdcSrc=%04x %d,%d %d bpp -> hdcDest=%04x %d,%d %dx%dx%d rop=%06lx\n",
+ hdcSrc, xSrc, ySrc, dcSrc ? dcSrc->w.bitsPerPixel : 0,
+ hdcDst, xDst, yDst, width, height, dcDst->w.bitsPerPixel, rop);
+ return dcDst->funcs->pBitBlt( dcDst, xDst, yDst, width, height,
+ dcSrc, xSrc, ySrc, rop );
+}
+
+
+/***********************************************************************
+ * BitBlt32 (GDI32.10)
+ */
+BOOL32 BitBlt32( HDC32 hdcDst, INT32 xDst, INT32 yDst, INT32 width,
+ INT32 height, HDC32 hdcSrc, INT32 xSrc, INT32 ySrc, DWORD rop)
+{
+ DC *dcDst, *dcSrc;
+
+ if (!(dcDst = (DC *)GDI_GetObjPtr( hdcDst, DC_MAGIC ))) return FALSE;
+ if (!dcDst->funcs->pBitBlt) return FALSE;
+ dcSrc = (DC *) GDI_GetObjPtr( hdcSrc, DC_MAGIC );
+
+ dprintf_bitblt(stddeb,
+ "BitBlt32: hdcSrc=%04x %d,%d %d bpp -> hdcDest=%04x %d,%d %dx%dx%d rop=%06lx\n",
+ hdcSrc, xSrc, ySrc, dcSrc ? dcSrc->w.bitsPerPixel : 0,
+ hdcDst, xDst, yDst, width, height, dcDst->w.bitsPerPixel, rop);
+ return dcDst->funcs->pBitBlt( dcDst, xDst, yDst, width, height,
+ dcSrc, xSrc, ySrc, rop );
+}
+
+
+/***********************************************************************
+ * StretchBlt16 (GDI.35)
+ */
+BOOL16 StretchBlt16( HDC16 hdcDst, INT16 xDst, INT16 yDst,
+ INT16 widthDst, INT16 heightDst,
+ HDC16 hdcSrc, INT16 xSrc, INT16 ySrc,
+ INT16 widthSrc, INT16 heightSrc, DWORD rop )
+{
+ DC *dcDst, *dcSrc;
+
+ if (!(dcDst = (DC *) GDI_GetObjPtr( hdcDst, DC_MAGIC ))) return FALSE;
+ if (!dcDst->funcs->pStretchBlt) return FALSE;
+ dcSrc = (DC *) GDI_GetObjPtr( hdcSrc, DC_MAGIC );
+ dprintf_bitblt(stddeb,
+ "StretchBlt16: %04x %d,%d %dx%dx%d -> %04x %d,%d %dx%dx%d rop=%06lx\n",
+ hdcSrc, xSrc, ySrc, widthSrc, heightSrc,
+ dcSrc ? dcSrc->w.bitsPerPixel : 0, hdcDst, xDst, yDst,
+ widthDst, heightDst, dcDst->w.bitsPerPixel, rop );
+ return dcDst->funcs->pStretchBlt( dcDst, xDst, yDst, widthDst, heightDst,
+ dcSrc, xSrc, ySrc, widthSrc, heightSrc,
+ rop );
+}
+
+
+/***********************************************************************
+ * StretchBlt32 (GDI32.350)
+ */
+BOOL32 StretchBlt32( HDC32 hdcDst, INT32 xDst, INT32 yDst,
+ INT32 widthDst, INT32 heightDst,
+ HDC32 hdcSrc, INT32 xSrc, INT32 ySrc,
+ INT32 widthSrc, INT32 heightSrc, DWORD rop )
+{
+ DC *dcDst, *dcSrc;
+
+ if (!(dcDst = (DC *) GDI_GetObjPtr( hdcDst, DC_MAGIC ))) return FALSE;
+ if (!dcDst->funcs->pStretchBlt) return FALSE;
+ dcSrc = (DC *) GDI_GetObjPtr( hdcSrc, DC_MAGIC );
+ dprintf_bitblt(stddeb,
+ "StretchBlt32: %04x %d,%d %dx%dx%d -> %04x %d,%d %dx%dx%d rop=%06lx\n",
+ hdcSrc, xSrc, ySrc, widthSrc, heightSrc,
+ dcSrc ? dcSrc->w.bitsPerPixel : 0, hdcDst, xDst, yDst,
+ widthDst, heightDst, dcDst->w.bitsPerPixel, rop );
+ return dcDst->funcs->pStretchBlt( dcDst, xDst, yDst, widthDst, heightDst,
+ dcSrc, xSrc, ySrc, widthSrc, heightSrc,
+ rop );
+}
+
+
+/***********************************************************************
+ * FastWindowFrame (GDI.400)
+ */
+BOOL16 FastWindowFrame( HDC16 hdc, const RECT16 *rect,
+ INT16 width, INT16 height, DWORD rop )
+{
+ HBRUSH32 hbrush = SelectObject32( hdc, GetStockObject32( GRAY_BRUSH ) );
+ PatBlt32( hdc, rect->left, rect->top,
+ rect->right - rect->left - width, height, rop );
+ PatBlt32( hdc, rect->left, rect->top + height, width,
+ rect->bottom - rect->top - height, rop );
+ PatBlt32( hdc, rect->left + width, rect->bottom,
+ rect->right - rect->left - width, -height, rop );
+ PatBlt32( hdc, rect->right, rect->top, -width,
+ rect->bottom - rect->top - height, rop );
+ SelectObject32( hdc, hbrush );
+ return TRUE;
+}
diff --git a/graphics/metafiledrv/Makefile.in b/graphics/metafiledrv/Makefile.in
index 1e39e5b..02de44e 100644
--- a/graphics/metafiledrv/Makefile.in
+++ b/graphics/metafiledrv/Makefile.in
@@ -6,6 +6,7 @@
MODULE = metafiledrv
C_SRCS = \
+ bitblt.c \
init.c
all: $(MODULE).o
diff --git a/graphics/metafiledrv/bitblt.c b/graphics/metafiledrv/bitblt.c
new file mode 100644
index 0000000..34c6ad6
--- /dev/null
+++ b/graphics/metafiledrv/bitblt.c
@@ -0,0 +1,45 @@
+/*
+ * GDI bit-blit operations
+ *
+ * Copyright 1993, 1994 Alexandre Julliard
+ */
+
+#include "gdi.h"
+#include "metafile.h"
+#include "metafiledrv.h"
+
+/***********************************************************************
+ * MFDRV_PatBlt
+ */
+BOOL32 MFDRV_PatBlt( DC *dc, INT32 left, INT32 top,
+ INT32 width, INT32 height, DWORD rop )
+{
+ MF_MetaParam6( dc, META_PATBLT, left, top, width, height,
+ HIWORD(rop), LOWORD(rop) );
+ return TRUE;
+}
+
+
+/***********************************************************************
+ * MFDRV_BitBlt
+ */
+BOOL32 MFDRV_BitBlt( DC *dcDst, INT32 xDst, INT32 yDst,
+ INT32 width, INT32 height, DC *dcSrc,
+ INT32 xSrc, INT32 ySrc, DWORD rop )
+{
+ return MF_BitBlt( dcDst, xDst, yDst, width, height,
+ dcSrc, xSrc, ySrc, rop );
+}
+
+
+/***********************************************************************
+ * MFDRV_StretchBlt
+ */
+BOOL32 MFDRV_StretchBlt( DC *dcDst, INT32 xDst, INT32 yDst,
+ INT32 widthDst, INT32 heightDst,
+ DC *dcSrc, INT32 xSrc, INT32 ySrc,
+ INT32 widthSrc, INT32 heightSrc, DWORD rop )
+{
+ return MF_StretchBlt( dcDst, xDst, yDst, widthDst, heightDst,
+ dcSrc, xSrc, ySrc, widthSrc, heightSrc, rop );
+}
diff --git a/graphics/metafiledrv/init.c b/graphics/metafiledrv/init.c
index dc11829..e8ad11d 100644
--- a/graphics/metafiledrv/init.c
+++ b/graphics/metafiledrv/init.c
@@ -17,7 +17,7 @@
static const DC_FUNCTIONS MFDRV_Funcs =
{
NULL, /* pArc */
- NULL, /* pBitBlt */
+ MFDRV_BitBlt, /* pBitBlt */
NULL, /* pChord */
NULL, /* pCreateDC */
MFDRV_DeleteDC, /* pDeleteDC */
@@ -42,7 +42,7 @@
NULL, /* pOffsetViewportOrgEx */
NULL, /* pOffsetWindowOrgEx */
NULL, /* pPaintRgn */
- NULL, /* pPatBlt */
+ MFDRV_PatBlt, /* pPatBlt */
NULL, /* pPie */
NULL, /* pPolyPolygon */
NULL, /* pPolygon */
@@ -76,7 +76,7 @@
NULL, /* pSetViewportOrgEx */
NULL, /* pSetWindowExtEx */
NULL, /* pSetWindowOrgEx */
- NULL, /* pStretchBlt */
+ MFDRV_StretchBlt, /* pStretchBlt */
NULL, /* pStretchDIBits */
NULL /* pTextOut */
};
@@ -146,7 +146,6 @@
METAFILEDRV_PDEVICE *physDev;
HFILE hFile;
- printf( "CreateMetafile16: '%s'\n", filename );
dprintf_metafile( stddeb, "CreateMetaFile16: '%s'\n", filename );
if (!(dc = MFDRV_AllocMetaFile())) return 0;
diff --git a/graphics/x11drv/Makefile.in b/graphics/x11drv/Makefile.in
index a197fd7..77883a2 100644
--- a/graphics/x11drv/Makefile.in
+++ b/graphics/x11drv/Makefile.in
@@ -6,6 +6,7 @@
MODULE = x11drv
C_SRCS = \
+ bitblt.c \
clipping.c \
font.c \
init.c
diff --git a/objects/bitblt.c b/graphics/x11drv/bitblt.c
similarity index 90%
rename from objects/bitblt.c
rename to graphics/x11drv/bitblt.c
index 1bf8657..d037d13 100644
--- a/objects/bitblt.c
+++ b/graphics/x11drv/bitblt.c
@@ -14,8 +14,8 @@
#include "dc.h"
#include "metafile.h"
#include "options.h"
+#include "x11drv.h"
#include "stddebug.h"
-/* #define DEBUG_BITBLT */
#include "debug.h"
#include "xmalloc.h"
@@ -521,10 +521,10 @@
* Stretch a row of pixels. Helper function for BITBLT_StretchImage.
*/
static void BITBLT_StretchRow( int *rowSrc, int *rowDst,
- short startDst, short widthDst,
- int xinc, WORD mode )
+ INT32 startDst, INT32 widthDst,
+ INT32 xinc, WORD mode )
{
- register int xsrc = xinc * startDst;
+ register INT32 xsrc = xinc * startDst;
rowDst += startDst;
switch(mode)
{
@@ -550,10 +550,10 @@
* Shrink a row of pixels. Helper function for BITBLT_StretchImage.
*/
static void BITBLT_ShrinkRow( int *rowSrc, int *rowDst,
- short startSrc, short widthSrc,
- int xinc, WORD mode )
+ INT32 startSrc, INT32 widthSrc,
+ INT32 xinc, WORD mode )
{
- register int xdst = xinc * startSrc;
+ register INT32 xdst = xinc * startSrc;
rowSrc += startSrc;
switch(mode)
{
@@ -578,11 +578,11 @@
*
* Retrieve a row from an image. Helper function for BITBLT_StretchImage.
*/
-static void BITBLT_GetRow( XImage *image, int *pdata, short row,
- short start, short width, short depthDst,
- int fg, int bg, BOOL swap)
+static void BITBLT_GetRow( XImage *image, int *pdata, INT32 row,
+ INT32 start, INT32 width, INT32 depthDst,
+ int fg, int bg, BOOL32 swap)
{
- register short i;
+ register INT32 i;
pdata += swap ? start+width-1 : start;
if (image->depth == depthDst) /* color -> color */
@@ -627,17 +627,18 @@
* BITBLT_StretchImage
*
* Stretch an X image.
+ * FIXME: does not work for full 32-bit coordinates.
*/
static void BITBLT_StretchImage( XImage *srcImage, XImage *dstImage,
- short widthSrc, short heightSrc,
- short widthDst, short heightDst,
- RECT16 *visRectSrc, RECT16 *visRectDst,
+ INT32 widthSrc, INT32 heightSrc,
+ INT32 widthDst, INT32 heightDst,
+ RECT32 *visRectSrc, RECT32 *visRectDst,
int foreground, int background, WORD mode )
{
int *rowSrc, *rowDst, *pixel;
- int xinc, yinc, ysrc, ydst;
- register short x, y;
- BOOL hstretch, vstretch, hswap, vswap;
+ INT32 xinc, yinc, ysrc, ydst;
+ register INT32 x, y;
+ BOOL32 hstretch, vstretch, hswap, vswap;
hswap = ((int)widthSrc * widthDst) < 0;
vswap = ((int)heightSrc * heightDst) < 0;
@@ -774,18 +775,18 @@
*/
static void BITBLT_GetSrcAreaStretch( DC *dcSrc, DC *dcDst,
Pixmap pixmap, GC gc,
- short xSrc, short ySrc,
- short widthSrc, short heightSrc,
- short xDst, short yDst,
- short widthDst, short heightDst,
- RECT16 *visRectSrc, RECT16 *visRectDst )
+ INT32 xSrc, INT32 ySrc,
+ INT32 widthSrc, INT32 heightSrc,
+ INT32 xDst, INT32 yDst,
+ INT32 widthDst, INT32 heightDst,
+ RECT32 *visRectSrc, RECT32 *visRectDst )
{
XImage *imageSrc, *imageDst;
- RECT16 rectSrc = *visRectSrc;
- RECT16 rectDst = *visRectDst;
- OffsetRect16( &rectSrc, -xSrc, -ySrc );
- OffsetRect16( &rectDst, -xDst, -yDst );
+ RECT32 rectSrc = *visRectSrc;
+ RECT32 rectDst = *visRectDst;
+ OffsetRect32( &rectSrc, -xSrc, -ySrc );
+ OffsetRect32( &rectDst, -xDst, -yDst );
/* FIXME: avoid BadMatch errors */
imageSrc = XGetImage( display, dcSrc->u.x.drawable,
visRectSrc->left, visRectSrc->top,
@@ -813,13 +814,12 @@
* pixels to Windows colors.
*/
static void BITBLT_GetSrcArea( DC *dcSrc, DC *dcDst, Pixmap pixmap, GC gc,
- short xSrc, short ySrc,
- RECT16 *visRectSrc )
+ INT32 xSrc, INT32 ySrc, RECT32 *visRectSrc )
{
XImage *imageSrc, *imageDst;
- register short x, y;
- short width = visRectSrc->right - visRectSrc->left;
- short height = visRectSrc->bottom - visRectSrc->top;
+ register INT32 x, y;
+ INT32 width = visRectSrc->right - visRectSrc->left;
+ INT32 height = visRectSrc->bottom - visRectSrc->top;
if (dcSrc->w.bitsPerPixel == dcDst->w.bitsPerPixel)
{
@@ -899,10 +899,10 @@
* Retrieve an area from the destination DC, mapping all the
* pixels to Windows colors.
*/
-static void BITBLT_GetDstArea(DC *dc, Pixmap pixmap, GC gc, RECT16 *visRectDst)
+static void BITBLT_GetDstArea(DC *dc, Pixmap pixmap, GC gc, RECT32 *visRectDst)
{
- short width = visRectDst->right - visRectDst->left;
- short height = visRectDst->bottom - visRectDst->top;
+ INT32 width = visRectDst->right - visRectDst->left;
+ INT32 height = visRectDst->bottom - visRectDst->top;
if (!COLOR_PixelToPalette || (dc->w.bitsPerPixel == 1) ||
(COLOR_GetSystemPaletteFlags() & COLOR_VIRTUAL) )
@@ -912,7 +912,7 @@
}
else
{
- register short x, y;
+ register INT32 x, y;
XImage *image;
if (dc->w.flags & DC_MEMORY)
@@ -942,10 +942,10 @@
* Put an area back into the destination DC, mapping the pixel
* colors to X pixels.
*/
-static void BITBLT_PutDstArea(DC *dc, Pixmap pixmap, GC gc, RECT16 *visRectDst)
+static void BITBLT_PutDstArea(DC *dc, Pixmap pixmap, GC gc, RECT32 *visRectDst)
{
- short width = visRectDst->right - visRectDst->left;
- short height = visRectDst->bottom - visRectDst->top;
+ INT32 width = visRectDst->right - visRectDst->left;
+ INT32 height = visRectDst->bottom - visRectDst->top;
/* !COLOR_PaletteToPixel is _NOT_ enough */
@@ -957,7 +957,7 @@
}
else
{
- register short x, y;
+ register INT32 x, y;
XImage *image = XGetImage( display, pixmap, 0, 0, width, height,
AllPlanes, ZPixmap );
for (y = 0; y < height; y++)
@@ -979,13 +979,13 @@
* Get the source and destination visible rectangles for StretchBlt().
* Return FALSE if one of the rectangles is empty.
*/
-static BOOL BITBLT_GetVisRectangles( DC *dcDst, short xDst, short yDst,
- short widthDst, short heightDst,
- DC *dcSrc, short xSrc, short ySrc,
- short widthSrc, short heightSrc,
- RECT16 *visRectSrc, RECT16 *visRectDst )
+static BOOL32 BITBLT_GetVisRectangles( DC *dcDst, INT32 xDst, INT32 yDst,
+ INT32 widthDst, INT32 heightDst,
+ DC *dcSrc, INT32 xSrc, INT32 ySrc,
+ INT32 widthSrc, INT32 heightSrc,
+ RECT32 *visRectSrc, RECT32 *visRectDst )
{
- RECT16 tmpRect, clipRect;
+ RECT32 tmpRect, clipRect;
if (widthSrc < 0) { widthSrc = -widthSrc; xSrc -= widthSrc; }
if (widthDst < 0) { widthDst = -widthDst; xDst -= widthDst; }
@@ -994,28 +994,28 @@
/* Get the destination visible rectangle */
- SetRect16( &tmpRect, xDst, yDst, xDst + widthDst, yDst + heightDst );
- GetRgnBox16( dcDst->w.hGCClipRgn, &clipRect );
- OffsetRect16( &clipRect, dcDst->w.DCOrgX, dcDst->w.DCOrgY );
- if (!IntersectRect16( visRectDst, &tmpRect, &clipRect )) return FALSE;
+ SetRect32( &tmpRect, xDst, yDst, xDst + widthDst, yDst + heightDst );
+ GetRgnBox32( dcDst->w.hGCClipRgn, &clipRect );
+ OffsetRect32( &clipRect, dcDst->w.DCOrgX, dcDst->w.DCOrgY );
+ if (!IntersectRect32( visRectDst, &tmpRect, &clipRect )) return FALSE;
/* Get the source visible rectangle */
if (!dcSrc) return TRUE;
- SetRect16( &tmpRect, xSrc, ySrc, xSrc + widthSrc, ySrc + heightSrc );
+ SetRect32( &tmpRect, xSrc, ySrc, xSrc + widthSrc, ySrc + heightSrc );
/* Apparently the clip region is only for output, so use hVisRgn here */
- GetRgnBox16( dcSrc->w.hVisRgn, &clipRect );
- OffsetRect16( &clipRect, dcSrc->w.DCOrgX, dcSrc->w.DCOrgY );
- if (!IntersectRect16( visRectSrc, &tmpRect, &clipRect )) return FALSE;
+ GetRgnBox32( dcSrc->w.hVisRgn, &clipRect );
+ OffsetRect32( &clipRect, dcSrc->w.DCOrgX, dcSrc->w.DCOrgY );
+ if (!IntersectRect32( visRectSrc, &tmpRect, &clipRect )) return FALSE;
/* Intersect the rectangles */
if ((widthSrc == widthDst) && (heightSrc == heightDst)) /* no stretching */
{
- OffsetRect16( visRectSrc, xDst - xSrc, yDst - ySrc );
- if (!IntersectRect16( &tmpRect, visRectSrc, visRectDst )) return FALSE;
+ OffsetRect32( visRectSrc, xDst - xSrc, yDst - ySrc );
+ if (!IntersectRect32( &tmpRect, visRectSrc, visRectDst )) return FALSE;
*visRectSrc = *visRectDst = tmpRect;
- OffsetRect16( visRectSrc, xSrc - xDst, ySrc - yDst );
+ OffsetRect32( visRectSrc, xSrc - xDst, ySrc - yDst );
}
else /* stretching */
{
@@ -1025,7 +1025,7 @@
((visRectSrc->right-xSrc) * widthDst) / widthSrc;
visRectSrc->bottom = yDst +
((visRectSrc->bottom-ySrc) * heightDst) / heightSrc;
- if (!IntersectRect16( &tmpRect, visRectSrc, visRectDst )) return FALSE;
+ if (!IntersectRect32( &tmpRect, visRectSrc, visRectDst )) return FALSE;
*visRectSrc = *visRectDst = tmpRect;
visRectSrc->left = xSrc + (visRectSrc->left-xDst)*widthSrc/widthDst;
visRectSrc->top = ySrc + (visRectSrc->top-yDst)*heightSrc/heightDst;
@@ -1033,7 +1033,7 @@
((visRectSrc->right-xDst) * widthSrc) / widthDst;
visRectSrc->bottom = ySrc +
((visRectSrc->bottom-yDst) * heightSrc) / heightDst;
- if (IsRectEmpty16( visRectSrc )) return FALSE;
+ if (IsRectEmpty32( visRectSrc )) return FALSE;
}
return TRUE;
}
@@ -1044,14 +1044,14 @@
*
* Implementation of PatBlt(), BitBlt() and StretchBlt().
*/
-BOOL BITBLT_InternalStretchBlt( DC *dcDst, short xDst, short yDst,
- short widthDst, short heightDst,
- DC *dcSrc, short xSrc, short ySrc,
- short widthSrc, short heightSrc, DWORD rop )
+BOOL32 BITBLT_InternalStretchBlt( DC *dcDst, INT32 xDst, INT32 yDst,
+ INT32 widthDst, INT32 heightDst,
+ DC *dcSrc, INT32 xSrc, INT32 ySrc,
+ INT32 widthSrc, INT32 heightSrc, DWORD rop )
{
- BOOL usePat, useSrc, useDst, destUsed, fStretch, fNullBrush;
- RECT16 visRectDst, visRectSrc;
- short width, height;
+ BOOL32 usePat, useSrc, useDst, destUsed, fStretch, fNullBrush;
+ RECT32 visRectDst, visRectSrc;
+ INT32 width, height;
const BYTE *opcode;
Pixmap pixmaps[3] = { 0, 0, 0 }; /* pixmaps for DST, SRC, TMP */
GC tmpGC = 0;
@@ -1285,24 +1285,11 @@
/***********************************************************************
- * PatBlt (GDI.29)
+ * X11DRV_PatBlt
*/
-BOOL PatBlt( HDC16 hdc, short left, short top,
- short width, short height, DWORD rop)
+BOOL32 X11DRV_PatBlt( DC *dc, INT32 left, INT32 top,
+ INT32 width, INT32 height, DWORD rop )
{
- DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
- if (!dc)
- {
- dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
- if (!dc) return FALSE;
- MF_MetaParam6(dc, META_PATBLT, left, top, width, height,
- HIWORD(rop), LOWORD(rop));
- return TRUE;
- }
-
- dprintf_bitblt(stddeb, "PatBlt: %04x %d,%d %dx%d %06lx\n",
- hdc, left, top, width, height, rop );
-
return CallTo32_LargeStack( (int(*)())BITBLT_InternalStretchBlt, 11,
dc, left, top, width, height,
NULL, 0, 0, 0, 0, rop );
@@ -1310,27 +1297,12 @@
/***********************************************************************
- * BitBlt (GDI.34)
+ * X11DRV_BitBlt
*/
-BOOL BitBlt( HDC16 hdcDst, INT xDst, INT yDst, INT width, INT height,
- HDC16 hdcSrc, INT xSrc, INT ySrc, DWORD rop )
+BOOL32 X11DRV_BitBlt( DC *dcDst, INT32 xDst, INT32 yDst,
+ INT32 width, INT32 height, DC *dcSrc,
+ INT32 xSrc, INT32 ySrc, DWORD rop )
{
- DC *dcDst, *dcSrc;
-
- if (!(dcDst = (DC *)GDI_GetObjPtr( hdcDst, DC_MAGIC )))
- {
- dcDst = (DC *)GDI_GetObjPtr( hdcDst, METAFILE_DC_MAGIC );
- if (!dcDst) return FALSE;
- return MF_BitBlt( dcDst, xDst, yDst, width, height,
- hdcSrc, xSrc, ySrc, rop );
- }
- dcSrc = (DC *) GDI_GetObjPtr( hdcSrc, DC_MAGIC );
-
- dprintf_bitblt(stddeb,
- "BitBlt: hdcSrc=%04x %d,%d %d bpp -> hdcDest=%04x %d,%d %dx%dx%d rop=%06lx\n",
- hdcSrc, xSrc, ySrc, dcSrc ? dcSrc->w.bitsPerPixel : 0,
- hdcDst, xDst, yDst, width, height, dcDst->w.bitsPerPixel, rop);
-
return CallTo32_LargeStack( (int(*)())BITBLT_InternalStretchBlt, 11,
dcDst, xDst, yDst, width, height,
dcSrc, xSrc, ySrc, width, height, rop );
@@ -1338,39 +1310,14 @@
/***********************************************************************
- * StretchBlt (GDI.35)
+ * X11DRV_StretchBlt
*/
-BOOL StretchBlt( HDC16 hdcDst, short xDst, short yDst,
- short widthDst, short heightDst,
- HDC16 hdcSrc, short xSrc, short ySrc,
- short widthSrc, short heightSrc, DWORD rop )
+BOOL32 X11DRV_StretchBlt( DC *dcDst, INT32 xDst, INT32 yDst,
+ INT32 widthDst, INT32 heightDst,
+ DC *dcSrc, INT32 xSrc, INT32 ySrc,
+ INT32 widthSrc, INT32 heightSrc, DWORD rop )
{
- DC *dcDst, *dcSrc;
-
- if (!(dcDst = (DC *) GDI_GetObjPtr( hdcDst, DC_MAGIC )))
- {
- if (!(dcDst = (DC *)GDI_GetObjPtr( hdcDst, METAFILE_DC_MAGIC )))
- return FALSE;
- return MF_StretchBlt( dcDst, xDst, yDst, widthDst, heightDst,
- hdcSrc, xSrc, ySrc, widthSrc, heightSrc, rop );
- }
-
- dcSrc = (DC *) GDI_GetObjPtr( hdcSrc, DC_MAGIC );
- dprintf_bitblt(stddeb,
- "StretchBlt: %04x %d,%d %dx%dx%d -> %04x %d,%d %dx%dx%d rop=%06lx\n",
- hdcSrc, xSrc, ySrc, widthSrc, heightSrc,
- dcSrc ? dcSrc->w.bitsPerPixel : 0, hdcDst, xDst, yDst,
- widthDst, heightDst, dcDst->w.bitsPerPixel, rop );
-
return CallTo32_LargeStack( (int(*)())BITBLT_InternalStretchBlt, 11,
dcDst, xDst, yDst, widthDst, heightDst,
dcSrc, xSrc, ySrc, widthSrc, heightSrc, rop );
}
-/***********************************************************************
- * FastWindowFrame (GDI.400)
- */
-WORD
-FastWindowFrame(WORD x1,DWORD x2,WORD x3,WORD x4,DWORD x5) {
- dprintf_gdi(stdnimp,"FastWindowFrame (%04x, %08lx, %04x, %04x, %08lx) // unimplemented!\n",x1,x2,x3,x4,x5);
- return 0xFFFF; /* failed? */
-}
diff --git a/graphics/x11drv/init.c b/graphics/x11drv/init.c
index 5d43e8d..4841c2b 100644
--- a/graphics/x11drv/init.c
+++ b/graphics/x11drv/init.c
@@ -17,7 +17,7 @@
static const DC_FUNCTIONS X11DRV_Funcs =
{
NULL, /* pArc */
- NULL, /* pBitBlt */
+ X11DRV_BitBlt, /* pBitBlt */
NULL, /* pChord */
X11DRV_CreateDC, /* pCreateDC */
X11DRV_DeleteDC, /* pDeleteDC */
@@ -42,7 +42,7 @@
NULL, /* pOffsetViewportOrgEx */
NULL, /* pOffsetWindowOrgEx */
NULL, /* pPaintRgn */
- NULL, /* pPatBlt */
+ X11DRV_PatBlt, /* pPatBlt */
NULL, /* pPie */
NULL, /* pPolyPolygon */
NULL, /* pPolygon */
@@ -76,7 +76,7 @@
NULL, /* pSetViewportOrgEx */
NULL, /* pSetWindowExtEx */
NULL, /* pSetWindowOrgEx */
- NULL, /* pStretchBlt */
+ X11DRV_StretchBlt, /* pStretchBlt */
NULL, /* pStretchDIBits */
NULL /* pTextOut */
};
diff --git a/if1632/Makefile.in b/if1632/Makefile.in
index 62c579b..9efa8c9 100644
--- a/if1632/Makefile.in
+++ b/if1632/Makefile.in
@@ -45,6 +45,7 @@
version.spec \
w32sys.spec \
win87em.spec \
+ wing.spec \
winmm.spec \
winsock.spec \
winspool.spec \
diff --git a/if1632/crtdll.spec b/if1632/crtdll.spec
index bd07234..6e15693 100644
--- a/if1632/crtdll.spec
+++ b/if1632/crtdll.spec
@@ -287,7 +287,7 @@
282 cdecl _strcmpi(ptr ptr) lstrcmpi32A
283 stub _strdate
284 stub _strdec
-285 stub _strdup
+285 cdecl _strdup(ptr) CRTDLL__strdup
286 stub _strerror
287 cdecl _stricmp(ptr ptr) lstrcmpi32A
288 stub _stricoll
@@ -364,7 +364,7 @@
359 cdecl exit(long) CRTDLL_exit
360 cdecl exp(long) CRTDLL_exp
361 cdecl fabs(long) CRTDLL_fabs
-362 stub fclose
+362 cdecl fclose(ptr) CRTDLL_fclose
363 stub feof
364 stub ferror
365 cdecl fflush(ptr) CRTDLL_fflush
@@ -433,11 +433,11 @@
428 stub mblen
429 stub mbstowcs
430 stub mbtowc
-431 stub memchr
-432 stub memcmp
-433 stub memcpy
-434 stub memmove
-435 stub memset
+431 cdecl memchr(ptr long long) memchr
+432 cdecl memcmp(ptr ptr long) memcmp
+433 cdecl memcpy(ptr ptr long) memcpy
+434 cdecl memmove(ptr ptr long) memmove
+435 cdecl memset(ptr long long) memset
436 stub mktime
437 stub modf
438 stub perror
@@ -460,16 +460,16 @@
455 stub signal
456 cdecl sin(long) CRTDLL_sin
457 cdecl sinh(long) CRTDLL_sinh
-458 stub sprintf
+458 cdecl sprintf() CRTDLL_sprintf
459 cdecl sqrt(long) CRTDLL_sqrt
460 cdecl srand(long) CRTDLL_srand
461 stub sscanf
462 cdecl strcat(ptr ptr) lstrcat32A
-463 stub strchr
+463 cdecl strchr(ptr long) strchr
464 cdecl strcmp(ptr ptr) lstrcmp32A
465 stub strcoll
466 cdecl strcpy(ptr ptr) lstrcpy32A
-467 stub strcspn
+467 cdecl strcspn(ptr ptr) strcspn
468 stub strerror
469 stub strftime
470 cdecl strlen(ptr) lstrlen32A
@@ -478,11 +478,11 @@
473 cdecl strncpy(ptr ptr long) lstrcpyn32A
474 stub strpbrk
475 stub strrchr
-476 stub strspn
-477 stub strstr
+476 cdecl strspn(ptr ptr) strspn
+477 cdecl strstr(ptr ptr) strstr
478 stub strtod
-479 stub strtok
-480 stub strtol
+479 cdecl strtok(ptr ptr) strtok
+480 cdecl strtol(ptr ptr long) strtol
481 cdecl strtoul(ptr ptr long) strtoul
482 stub strxfrm
483 stub swprintf
diff --git a/if1632/gdi.spec b/if1632/gdi.spec
index 2f0433c..4a8e1b5 100644
--- a/if1632/gdi.spec
+++ b/if1632/gdi.spec
@@ -33,15 +33,15 @@
27 pascal16 Rectangle(word s_word s_word s_word s_word) Rectangle16
28 pascal16 RoundRect(word s_word s_word s_word s_word s_word s_word)
RoundRect16
-29 pascal16 PatBlt(word s_word s_word s_word s_word long) PatBlt
+29 pascal16 PatBlt(word s_word s_word s_word s_word long) PatBlt16
30 pascal16 SaveDC(word) SaveDC
31 pascal SetPixel(word s_word s_word long) SetPixel16
32 pascal16 OffsetClipRgn(word s_word s_word) OffsetClipRgn16
33 pascal16 TextOut(word s_word s_word ptr word) TextOut16
34 pascal16 BitBlt( word s_word s_word s_word s_word word s_word s_word long)
- BitBlt
+ BitBlt16
35 pascal16 StretchBlt(word s_word s_word s_word s_word word s_word s_word
- s_word s_word long) StretchBlt
+ s_word s_word long) StretchBlt16
36 pascal16 Polygon (word ptr word) Polygon16
37 pascal16 Polyline (word ptr word) Polyline16
38 pascal Escape(word word word segptr segptr) Escape
@@ -262,7 +262,7 @@
380 stub ENDPAGE
381 stub SETABORTPROC
382 stub ABORTDOC
-400 pascal16 FastWindowFrame(word long word word long) FastWindowFrame
+400 pascal16 FastWindowFrame(word ptr s_word s_word long) FastWindowFrame
401 stub GDIMOVEBITMAP
403 stub GDIINIT2
404 stub GetTTGlyphIndexMap
diff --git a/if1632/gdi32.spec b/if1632/gdi32.spec
index aad949c..6c6853e 100644
--- a/if1632/gdi32.spec
+++ b/if1632/gdi32.spec
@@ -12,7 +12,7 @@
0007 stdcall Arc(long long long long long long long long long) Arc32
0008 stub ArcTo
0009 stub BeginPath
-0010 stdcall BitBlt(long long long long long long long long long) BitBlt
+0010 stdcall BitBlt(long long long long long long long long long) BitBlt32
0011 stub CancelDC
0012 stub CheckColorsInGamut
0013 stub ChoosePixelFormat
@@ -85,10 +85,10 @@
0077 stub EndPage
0078 stub EndPath
0079 stub EnumEnhMetaFile
-0080 stub EnumFontFamiliesA
+0080 stdcall EnumFontFamiliesA(long ptr ptr long) THUNK_EnumFontFamilies32A
0081 stub EnumFontFamiliesExA
0082 stub EnumFontFamiliesExW
-0083 stub EnumFontFamiliesW
+0083 stdcall EnumFontFamiliesW(long ptr ptr long) THUNK_EnumFontFamilies32W
0084 stub EnumFontsA
0085 stub EnumFontsW
0086 stub EnumICMProfilesA
@@ -265,7 +265,7 @@
0257 stdcall OffsetViewportOrgEx(long long long ptr) OffsetViewportOrgEx32
0258 stdcall OffsetWindowOrgEx(long long long ptr) OffsetWindowOrgEx32
0259 stdcall PaintRgn(long long) PaintRgn32
-0260 stdcall PatBlt(long long long long long long) PatBlt
+0260 stdcall PatBlt(long long long long long long) PatBlt32
0261 stub PathToRegion
0262 stdcall Pie(long long long long long long long long long) Pie32
0263 stub PlayEnhMetaFile
@@ -356,7 +356,8 @@
0347 stub StartDocA
0348 stub StartDocW
0349 stub StartPage
-0350 stdcall StretchBlt(long long long long long long long long long long long) StretchBlt
+0350 stdcall StretchBlt(long long long long long long long long long long long)
+ StretchBlt32
0351 stdcall StretchDIBits(long long long long long long long
long long long long long long) StretchDIBits
0352 stub StrokeAndFillPath
diff --git a/if1632/kernel32.spec b/if1632/kernel32.spec
index ca3fc9b..ecf6020 100644
--- a/if1632/kernel32.spec
+++ b/if1632/kernel32.spec
@@ -78,7 +78,7 @@
0073 stub DeviceIoControl
0074 stub DisableThreadLibraryCalls
0075 stub DisconnectNamedPipe
-0076 stub DosDateTimeToFileTime
+0076 stdcall DosDateTimeToFileTime(long long ptr) DosDateTimeToFileTime
0077 stub DuplicateConsoleHandle
0078 stdcall DuplicateHandle(long long long ptr long long long) DuplicateHandle
0079 stub EndUpdateResourceA
@@ -94,8 +94,8 @@
0089 stub EnumResourceNamesW
0090 stub EnumResourceTypesA
0091 stub EnumResourceTypesW
-0092 stub EnumSystemCodePagesA
-0093 stub EnumSystemCodePagesW
+0092 stdcall EnumSystemCodePagesA(ptr long) THUNK_EnumSystemCodePages32A
+0093 stdcall EnumSystemCodePagesW(ptr long) THUNK_EnumSystemCodePages32W
0094 stub EnumSystemLocalesA
0095 stub EnumSystemLocalesW
0096 stub EnumTimeFormatsA
@@ -113,9 +113,9 @@
0108 stub FatalAppExitA
0109 stub FatalAppExitW
0110 stub FatalExit
-0111 stub FileTimeToDosDateTime
-0112 stub FileTimeToLocalFileTime
-0113 stub FileTimeToSystemTime
+0111 stdcall FileTimeToDosDateTime(ptr ptr ptr) FileTimeToDosDateTime
+0112 stdcall FileTimeToLocalFileTime(ptr ptr) FileTimeToLocalFileTime
+0113 stdcall FileTimeToSystemTime(ptr ptr) FileTimeToSystemTime
0114 stub FillConsoleOutputAttribute
0115 stub FillConsoleOutputCharacterA
0116 stub FillConsoleOutputCharacterW
@@ -222,22 +222,22 @@
0217 stdcall GetFileAttributesA(ptr) GetFileAttributes32A
0218 stdcall GetFileAttributesW(ptr) GetFileAttributes32W
0219 stdcall GetFileInformationByHandle(long ptr) GetFileInformationByHandle
-0220 stub GetFileSize
-0221 stub GetFileTime
-0222 stdcall GetFileType(long) GetFileType
+0220 stdcall GetFileSize(long ptr ptr) GetFileSize
+0221 stdcall GetFileTime(long ptr ptr ptr) GetFileTime
+0222 stdcall GetFileType(long) GetFileType
0223 stdcall GetFullPathNameA(ptr long ptr ptr) GetFullPathName32A
0224 stub GetFullPathNameW
0225 stub GetHandleInformation
0226 stdcall GetLargestConsoleWindowSize(long) GetLargestConsoleWindowSize
-0227 stdcall GetLastError() GetLastError
-0228 stdcall GetLocalTime(ptr) GetLocalTime
+0227 stdcall GetLastError() GetLastError
+0228 stdcall GetLocalTime(ptr) GetLocalTime
0229 stdcall GetLocaleInfoA(long long ptr long) GetLocaleInfoA
0230 stdcall GetLocaleInfoW(long long ptr long) GetLocaleInfo32W
0231 stdcall GetLogicalDriveStringsA(long ptr) GetLogicalDriveStrings32A
0232 stdcall GetLogicalDriveStringsW(long ptr) GetLogicalDriveStrings32W
0233 stdcall GetLogicalDrives() GetLogicalDrives
0234 stub GetMailslotInfo
-0235 stdcall GetModuleFileNameA(long ptr long) GetModuleFileNameA
+0235 stdcall GetModuleFileNameA(long ptr long) GetModuleFileName
0236 stub GetModuleFileNameW
0237 stdcall GetModuleHandleA(ptr) WIN32_GetModuleHandle
0238 stub GetModuleHandleW
@@ -286,7 +286,7 @@
0281 stdcall GetSystemDefaultLangID() GetSystemDefaultLangID
0282 stdcall GetSystemDirectoryA(ptr long) GetSystemDirectory32A
0283 stdcall GetSystemDirectoryW(ptr long) GetSystemDirectory32W
-0284 stub GetSystemInfo
+0284 stdcall GetSystemInfo(ptr) GetSystemInfo
0285 stdcall GetSystemTime(ptr) GetSystemTime
0286 stub GetSystemTimeAdjustment
0287 stub GetTapeParameters
@@ -375,7 +375,7 @@
0370 stdcall LoadResource(long long) LoadResource32
0371 stdcall LocalAlloc(long long) LocalAlloc32
0372 stdcall LocalCompact(long) LocalCompact32
-0373 stub LocalFileTimeToFileTime
+0373 stdcall LocalFileTimeToFileTime(ptr ptr) LocalFileTimeToFileTime
0374 stdcall LocalFlags(long) LocalFlags32
0375 stdcall LocalFree(long) LocalFree32
0376 stdcall LocalHandle(ptr) LocalHandle32
@@ -387,7 +387,7 @@
0382 stub LockFile
0383 stub LockFileEx
0384 stdcall LockResource(long) LockResource32
-0385 stub MapViewOfFile
+0385 stdcall MapViewOfFile(long long long long long) MapViewOfFile
0386 stdcall MapViewOfFileEx(long long long long long long) MapViewOfFileEx
0387 stdcall MoveFileA(ptr ptr) MoveFile32A
0388 stub MoveFileExA
@@ -494,8 +494,8 @@
0489 stub SetFileApisToOEM
0490 stdcall SetFileAttributesA(ptr long) SetFileAttributes32A
0491 stdcall SetFileAttributesW(ptr long) SetFileAttributes32W
-0492 stdcall SetFilePointer(long long ptr long) SetFilePointer
-0493 stub SetFileTime
+0492 stdcall SetFilePointer(long long ptr long) SetFilePointer
+0493 stdcall SetFileTime(long ptr ptr ptr) SetFileTime
0494 stdcall SetHandleCount(long) SetHandleCount32
0495 stub SetHandleInformation
0496 stub SetLastConsoleEventActive
@@ -528,7 +528,7 @@
0523 stdcall Sleep(long) Sleep
0524 stub SleepEx
0525 stub SuspendThread
-0526 stub SystemTimeToFileTime
+0526 stdcall SystemTimeToFileTime(ptr ptr) SystemTimeToFileTime
0527 stub SystemTimeToTzSpecificLocalTime
0528 stub TerminateProcess
0529 stub TerminateThread
@@ -568,7 +568,7 @@
0563 stub WaitNamedPipeA
0564 stub WaitNamedPipeW
0565 stdcall WideCharToMultiByte(long long ptr long ptr long ptr ptr) WideCharToMultiByte
-0566 stub WinExec
+0566 stdcall WinExec(ptr long) WinExec
0567 stub WriteConsoleA
0568 stub WriteConsoleInputA
0569 stub WriteConsoleInputVDMA
@@ -636,7 +636,7 @@
0630 stdcall SetSystemPowerState(long long) SetSystemPowerState
0631 stub WritePrivateProfileStructA
0632 stub WritePrivateProfileStructW
-0633 stub MakeCriticalSectionGlobal
+0633 stdcall MakeCriticalSectionGlobal(ptr) MakeCriticalSectionGlobal
#extra late additions
0634 stdcall ThunkConnect32(ptr ptr ptr ptr ptr ptr) ThunkConnect32
0636 stub SUnMapLS
diff --git a/if1632/ole32.spec b/if1632/ole32.spec
index cf93117..d6ff57b 100644
--- a/if1632/ole32.spec
+++ b/if1632/ole32.spec
@@ -109,7 +109,7 @@
104 stub OleGetClipboard
105 stub OleGetIconOfClass
106 stub OleGetIconOfFile
-107 stub OleInitialize
+107 return OleInitialize 4 0
108 stub OleInitializeWOW
109 stub OleIsCurrentClipboard
110 stub OleIsRunning
diff --git a/if1632/thunk.c b/if1632/thunk.c
index 8441542..348606f 100644
--- a/if1632/thunk.c
+++ b/if1632/thunk.c
@@ -139,7 +139,29 @@
FONTENUMPROC16 func, LPARAM lParam )
{
DECL_THUNK( thunk, func, CallTo16_word_llwl );
- return EnumFontFamilies( hdc, lpszFamily, (FONTENUMPROC16)&thunk, lParam );
+ return EnumFontFamilies16(hdc, lpszFamily, (FONTENUMPROC16)&thunk, lParam);
+}
+
+
+/*************************************************************************
+ * THUNK_EnumFontFamilies32A (GDI32.80)
+ */
+INT32 THUNK_EnumFontFamilies32A( HDC32 hdc, LPCSTR lpszFamily,
+ FONTENUMPROC32A func, LPARAM lParam )
+{
+ DECL_THUNK( thunk, func, CallTo32_4 );
+ return EnumFontFamilies32A(hdc,lpszFamily,(FONTENUMPROC32A)&thunk,lParam);
+}
+
+
+/*************************************************************************
+ * THUNK_EnumFontFamilies32W (GDI32.83)
+ */
+INT32 THUNK_EnumFontFamilies32W( HDC32 hdc, LPCWSTR lpszFamily,
+ FONTENUMPROC32W func, LPARAM lParam )
+{
+ DECL_THUNK( thunk, func, CallTo32_4 );
+ return EnumFontFamilies32W(hdc,lpszFamily,(FONTENUMPROC32W)&thunk,lParam);
}
@@ -280,6 +302,26 @@
/***********************************************************************
+ * THUNK_EnumSystemCodePages32A (KERNEL32.92)
+ */
+BOOL32 THUNK_EnumSystemCodePages32A( CODEPAGE_ENUMPROC32A func, DWORD flags )
+{
+ DECL_THUNK( thunk, func, CallTo32_1 );
+ return EnumSystemCodePages32A( (CODEPAGE_ENUMPROC32A)&thunk, flags );
+}
+
+
+/***********************************************************************
+ * THUNK_EnumSystemCodePages32W (KERNEL32.93)
+ */
+BOOL32 THUNK_EnumSystemCodePages32W( CODEPAGE_ENUMPROC32W func, DWORD flags )
+{
+ DECL_THUNK( thunk, func, CallTo32_1 );
+ return EnumSystemCodePages32W( (CODEPAGE_ENUMPROC32W)&thunk, flags );
+}
+
+
+/***********************************************************************
* THUNK_GrayString16 (USER.185)
*/
BOOL16 THUNK_GrayString16( HDC16 hdc, HBRUSH16 hbr, GRAYSTRINGPROC16 func,
diff --git a/if1632/user.spec b/if1632/user.spec
index 77c3c62..2ca9abf 100644
--- a/if1632/user.spec
+++ b/if1632/user.spec
@@ -61,7 +61,7 @@
58 pascal16 GetClassName(word ptr word) GetClassName16
59 pascal16 SetActiveWindow(word) SetActiveWindow
60 pascal16 GetActiveWindow() GetActiveWindow
-61 pascal16 ScrollWindow(word s_word s_word ptr ptr) ScrollWindow
+61 pascal16 ScrollWindow(word s_word s_word ptr ptr) ScrollWindow16
62 pascal16 SetScrollPos(word word s_word word) SetScrollPos16
63 pascal16 GetScrollPos(word word) GetScrollPos16
64 pascal16 SetScrollRange(word word s_word s_word word) SetScrollRange16
@@ -221,7 +221,7 @@
218 pascal16 DialogBoxIndirect(word word word segptr) DialogBoxIndirect16
219 pascal16 CreateDialogIndirect(word ptr word segptr) CreateDialogIndirect16
220 pascal16 LoadMenuIndirect(ptr) LoadMenuIndirect16
-221 pascal16 ScrollDC(word s_word s_word ptr ptr word ptr) ScrollDC
+221 pascal16 ScrollDC(word s_word s_word ptr ptr word ptr) ScrollDC16
222 pascal16 GetKeyboardState(ptr) GetKeyboardState
223 pascal16 SetKeyboardState(ptr) SetKeyboardState
224 pascal16 GetWindowTask(word) GetWindowTask16
@@ -305,8 +305,7 @@
308 pascal DefDlgProc(word word word long) DefDlgProc16
309 pascal16 GetClipCursor(ptr) GetClipCursor16
314 stub SignalProc
-319 pascal16 ScrollWindowEx(word s_word s_word ptr ptr word ptr word)
- ScrollWindowEx
+319 pascal16 ScrollWindowEx(word s_word s_word ptr ptr word ptr word) ScrollWindowEx16
320 stub SysErrorBox
321 stub SetEventHook
322 stub WinOldAppHackOMatic
@@ -374,8 +373,8 @@
418 pascal16 SetMenuItemBitmaps(word word word word word) SetMenuItemBitmaps
420 pascal16 wsprintf() WIN16_wsprintf16
421 pascal16 wvsprintf(ptr ptr ptr) wvsprintf16
-422 stub DlgDirSelectEx
-423 stub DlgDirSelectComboBoxEx
+422 pascal16 DlgDirSelectEx(word ptr word word) DlgDirSelectEx16
+423 pascal16 DlgDirSelectComboBoxEx(word ptr word word) DlgDirSelectComboBoxEx16
427 pascal16 FindWindowEx(word word segptr ptr) FindWindowEx16
428 stub TileWindows
429 stub CascadeWindows
diff --git a/if1632/user32.spec b/if1632/user32.spec
index 0c12313..7a484ba 100644
--- a/if1632/user32.spec
+++ b/if1632/user32.spec
@@ -150,10 +150,10 @@
0143 stdcall DlgDirListComboBoxA(long ptr long long long) DlgDirListComboBox32A
0144 stdcall DlgDirListComboBoxW(long ptr long long long) DlgDirListComboBox32W
0145 stub DlgDirListW
-0146 stub DlgDirSelectComboBoxExA
-0147 stub DlgDirSelectComboBoxExW
-0148 stub DlgDirSelectExA
-0149 stub DlgDirSelectExW
+0146 stdcall DlgDirSelectComboBoxExA(long ptr long long) DlgDirSelectComboBoxEx32A
+0147 stdcall DlgDirSelectComboBoxExW(long ptr long long) DlgDirSelectComboBoxEx32W
+0148 stdcall DlgDirSelectExA(long ptr long long) DlgDirSelectEx32A
+0149 stdcall DlgDirSelectExW(long ptr long long) DlgDirSelectEx32W
0150 stub DragDetect
0151 stub DragObject
0152 stub DrawAnimatedRects
@@ -162,7 +162,7 @@
0155 stdcall DrawFocusRect(long ptr) DrawFocusRect32
0156 stub DrawFrame
0157 stdcall DrawFrameControl(long ptr long long) DrawFrameControl32
-0158 stub DrawIcon
+0158 stdcall DrawIcon(long long long long) DrawIcon
0159 stub DrawIconEx
0160 stdcall DrawMenuBar(long) DrawMenuBar
0161 stub DrawStateA
@@ -230,7 +230,7 @@
0223 stub GetClipboardFormatNameW
0224 stub GetClipboardOwner
0225 stdcall GetClipboardViewer(long) GetClipboardViewer
-0226 stub GetCursor
+0226 stdcall GetCursor() GetCursor
0227 stub GetCursorInfo
0228 stdcall GetCursorPos(ptr) GetCursorPos32
0229 stdcall GetDC(long) GetDC32
@@ -296,7 +296,7 @@
0289 stdcall GetSysColorBrush(long) GetSysColorBrush32
0290 stdcall GetSystemMenu(long long) GetSystemMenu
0291 stdcall GetSystemMetrics(long) GetSystemMetrics
-0292 stub GetTabbedTextExtentA
+0292 stdcall GetTabbedTextExtentA(long ptr long long ptr) GetTabbedTextExtent
0293 stub GetTabbedTextExtentW
0294 stub GetThreadDesktop
0295 stub GetTopWindow
@@ -452,9 +452,9 @@
0445 stub ReuseDDElParam
0446 stdcall ScreenToClient(long ptr) ScreenToClient32
0447 stub ScrollChildren
-0448 stub ScrollDC
-0449 stub ScrollWindow
-0450 stub ScrollWindowEx
+0448 stdcall ScrollDC(long long long ptr ptr long ptr) ScrollDC32
+0449 stdcall ScrollWindow(long long long ptr ptr) ScrollWindow32
+0450 stdcall ScrollWindowEx(long long long ptr ptr long ptr long) ScrollWindowEx32
0451 stdcall SendDlgItemMessageA(long long long long long) SendDlgItemMessage32A
0452 stdcall SendDlgItemMessageW(long long long long long) SendDlgItemMessage32W
0453 stdcall SendMessageA(long long long long) SendMessage32A
@@ -485,7 +485,7 @@
0478 stdcall SetDlgItemTextW(long long ptr) SetDlgItemText32W
0479 stub SetDoubleClickTime
0480 stdcall SetFocus(long) SetFocus32
-0481 stub SetForegroundWindow
+0481 return SetForegroundWindow 4 0
0482 stdcall SetInternalWindowPos(long long ptr ptr) SetInternalWindowPos32
0483 stub SetKeyboardState
0484 stdcall SetLastErrorEx(long long) SetLastErrorEx
diff --git a/if1632/wing.spec b/if1632/wing.spec
new file mode 100644
index 0000000..ec1ab43
--- /dev/null
+++ b/if1632/wing.spec
@@ -0,0 +1,20 @@
+name wing
+type win16
+
+1001 stub WINGCREATEDC
+1002 stub WINGRECOMMENDDIBFORMAT
+1003 stub WINGCREATEBITMAP
+1004 stub WINGGETDIBPOINTER
+1005 stub WINGGETDIBCOLORTABLE
+1006 stub WINGSETDIBCOLORTABLE
+1007 stub WINGCREATEHALFTONEPALETTE
+1008 stub WINGCREATEHALFTONEBRUSH
+1009 stub WINGSTRETCHBLT
+1010 stub WINGBITBLT
+
+# Seem that 1299 is the limit... weird...
+#1500 stub WINGINITIALIZETHUNK16
+#1501 stub WINGTHUNK16
+
+#2000 stub REGISTERWINGPAL
+#2001 stub EXCEPTIONHANDLER
diff --git a/include/callback.h b/include/callback.h
index bf94586..2f603c2 100644
--- a/include/callback.h
+++ b/include/callback.h
@@ -73,6 +73,7 @@
/* by the build program to generate the file if1632/callto32.S */
extern LONG CallTo32_0( FARPROC32 );
+extern LONG CallTo32_1( FARPROC32, DWORD );
extern LONG CallTo32_2( FARPROC32, DWORD, DWORD );
extern LONG CallTo32_3( FARPROC32, DWORD, DWORD, DWORD );
extern LONG CallTo32_4( FARPROC32, DWORD, DWORD, DWORD, DWORD );
diff --git a/include/dos_fs.h b/include/dos_fs.h
index 303cbbb..4bb2b7f 100644
--- a/include/dos_fs.h
+++ b/include/dos_fs.h
@@ -26,12 +26,15 @@
#define IS_END_OF_NAME(ch) (!(ch) || ((ch) == '/') || ((ch) == '\\'))
extern void DOSFS_ToDosDateTime( time_t unixtime, WORD *pDate, WORD *pTime );
+extern time_t DOSFS_DosDateTimeToUnixTime(WORD,WORD);
extern const char *DOSFS_ToDosFCBFormat( const char *name );
extern const char *DOSFS_ToDosDTAFormat( const char *name );
extern const char *DOSFS_IsDevice( const char *name );
extern const char * DOSFS_GetUnixFileName( const char * name, int check_last );
extern const char * DOSFS_GetDosTrueName( const char *name, int unix_format );
extern int DOSFS_GetDosFileName( const char *name, char *buffer, int len );
+extern time_t DOSFS_FileTimeToUnixTime(LPFILETIME ft);
+extern void DOSFS_UnixTimeToFileTime(time_t unixtime,LPFILETIME ft);
extern int DOSFS_FindNext( const char *path, const char *short_mask,
const char *long_mask, int drive, BYTE attr,
int skip, DOS_DIRENT *entry );
diff --git a/include/libres.h b/include/libres.h
index 288f5ec..6014a3b 100644
--- a/include/libres.h
+++ b/include/libres.h
@@ -11,7 +11,8 @@
extern INT32 LIBRES_AccessResource( HINSTANCE32 hModule, HRSRC32 hRsrc );
extern HGLOBAL32 LIBRES_AllocResource( HINSTANCE32 hModule, HRSRC32 hRsrc, DWORD size );
-extern HRSRC32 LIBRES_FindResource( HINSTANCE32 hModule, LPCSTR name, LPCSTR type );
+extern HRSRC32 LIBRES_FindResource16( HINSTANCE32 hModule, LPCSTR name, LPCSTR type );
+extern HRSRC32 LIBRES_FindResource32( HINSTANCE32 hModule, LPCWSTR name, LPCWSTR type );
extern BOOL32 LIBRES_FreeResource( HGLOBAL32 handle );
extern HGLOBAL32 LIBRES_LoadResource( HINSTANCE32 hModule, HRSRC32 hRsrc );
extern LPVOID LIBRES_LockResource( HGLOBAL32 handle );
diff --git a/include/metafile.h b/include/metafile.h
index a6378dd..22e0b61 100644
--- a/include/metafile.h
+++ b/include/metafile.h
@@ -32,9 +32,9 @@
LPCSTR str, short count, const INT16 *lpDx);
BOOL32 MF_MetaPoly(DC *dc, short func, LPPOINT16 pt, short count);
BOOL32 MF_BitBlt(DC *dcDest, short xDest, short yDest, short width,
- short height, HDC16 hdcSrc, short xSrc, short ySrc, DWORD rop);
+ short height, DC *dcSrc, short xSrc, short ySrc, DWORD rop);
BOOL32 MF_StretchBlt(DC *dcDest, short xDest, short yDest, short widthDest,
- short heightDest, HDC16 hdcSrc, short xSrc, short ySrc,
+ short heightDest, DC *dcSrc, short xSrc, short ySrc,
short widthSrc, short heightSrc, DWORD rop);
#endif /* METAFILE_H */
diff --git a/include/metafiledrv.h b/include/metafiledrv.h
index 519f3a5..14b2da5 100644
--- a/include/metafiledrv.h
+++ b/include/metafiledrv.h
@@ -13,10 +13,24 @@
#define METAFILE_DISK 1
/* Metafile driver physical DC */
+
typedef struct
{
METAHEADER *mh; /* Pointer to metafile header */
UINT32 nextHandle; /* Next handle number */
} METAFILEDRV_PDEVICE;
+
+/* Metafile driver functions */
+
+extern BOOL32 MFDRV_BitBlt( struct tagDC *dcDst, INT32 xDst, INT32 yDst,
+ INT32 width, INT32 height, struct tagDC *dcSrc,
+ INT32 xSrc, INT32 ySrc, DWORD rop );
+extern BOOL32 MFDRV_PatBlt( struct tagDC *dc, INT32 left, INT32 top,
+ INT32 width, INT32 height, DWORD rop );
+extern BOOL32 MFDRV_StretchBlt( struct tagDC *dcDst, INT32 xDst, INT32 yDst,
+ INT32 widthDst, INT32 heightDst,
+ struct tagDC *dcSrc, INT32 xSrc, INT32 ySrc,
+ INT32 widthSrc, INT32 heightSrc, DWORD rop );
+
#endif /* __WINE_METAFILEDRV_H */
diff --git a/include/region.h b/include/region.h
index eb44f4f..c5818f1 100644
--- a/include/region.h
+++ b/include/region.h
@@ -18,7 +18,7 @@
extern BOOL32 REGION_DeleteObject( HRGN32 hrgn, RGNOBJ * obj );
-extern BOOL32 REGION_UnionRectWithRgn( HRGN32 hrgn, LPRECT16 lpRect );
+extern BOOL32 REGION_UnionRectWithRgn( HRGN32 hrgn, const RECT32 *lpRect );
extern BOOL32 REGION_FrameRgn( HRGN32 dest, HRGN32 src, INT32 x, INT32 y );
#endif /* __WINE_REGION_H */
diff --git a/include/shell.h b/include/shell.h
index 801d857..4a7e0cd 100644
--- a/include/shell.h
+++ b/include/shell.h
@@ -32,7 +32,7 @@
typedef struct { /* structure for dropped files */
WORD wSize;
POINT16 ptMousePos;
- BOOL fInNonClientArea;
+ BOOL16 fInNonClientArea;
/* memory block with filenames follows */
} DROPFILESTRUCT, *LPDROPFILESTRUCT;
diff --git a/include/windows.h b/include/windows.h
index 7359e0b..8e03f49 100644
--- a/include/windows.h
+++ b/include/windows.h
@@ -1521,11 +1521,15 @@
BOOL32 bInheritHandle;
} SECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES;
+/* 64 bit number of 100 nanoseconds intervals since January 1, 1601 */
+/* FIXME: currently dwLowDateTime is equivalent to the UNIX time(),
+ * and dwHighDateTime 0
+ */
typedef struct
{
INT32 dwLowDateTime;
INT32 dwHighDateTime;
-} FILETIME;
+} FILETIME, *LPFILETIME;
/* Find* structures */
typedef struct
@@ -2427,7 +2431,7 @@
/* Window scrolling */
#define SW_SCROLLCHILDREN 0x0001
#define SW_INVALIDATE 0x0002
-#define SW_ERASE 0x0003
+#define SW_ERASE 0x0004
/* CreateWindow() coordinates */
#define CW_USEDEFAULT16 ((INT16)0x8000)
@@ -2766,31 +2770,108 @@
#define CBS_DISABLENOSCROLL 0x0800L
/* Combo box messages */
-#define CB_GETEDITSEL (WM_USER+0)
-#define CB_LIMITTEXT (WM_USER+1)
-#define CB_SETEDITSEL (WM_USER+2)
-#define CB_ADDSTRING (WM_USER+3)
-#define CB_DELETESTRING (WM_USER+4)
-#define CB_DIR (WM_USER+5)
-#define CB_GETCOUNT (WM_USER+6)
-#define CB_GETCURSEL (WM_USER+7)
-#define CB_GETLBTEXT (WM_USER+8)
-#define CB_GETLBTEXTLEN (WM_USER+9)
-#define CB_INSERTSTRING (WM_USER+10)
-#define CB_RESETCONTENT (WM_USER+11)
-#define CB_FINDSTRING (WM_USER+12)
-#define CB_SELECTSTRING (WM_USER+13)
-#define CB_SETCURSEL (WM_USER+14)
-#define CB_SHOWDROPDOWN (WM_USER+15)
-#define CB_GETITEMDATA (WM_USER+16)
-#define CB_SETITEMDATA (WM_USER+17)
-#define CB_GETDROPPEDCONTROLRECT (WM_USER+18)
-#define CB_SETITEMHEIGHT (WM_USER+19)
-#define CB_GETITEMHEIGHT (WM_USER+20)
-#define CB_SETEXTENDEDUI (WM_USER+21)
-#define CB_GETEXTENDEDUI (WM_USER+22)
-#define CB_GETDROPPEDSTATE (WM_USER+23)
-#define CB_FINDSTRINGEXACT (WM_USER+24)
+#define CB_GETEDITSEL16 (WM_USER+0)
+#define CB_GETEDITSEL32 0x0140
+#define CB_GETEDITSEL WINELIB_NAME(CB_GETEDITSEL)
+#define CB_LIMITTEXT16 (WM_USER+1)
+#define CB_LIMITTEXT32 0x0141
+#define CB_LIMITTEXT WINELIB_NAME(CB_LIMITTEXT)
+#define CB_SETEDITSEL16 (WM_USER+2)
+#define CB_SETEDITSEL32 0x0142
+#define CB_SETEDITSEL WINELIB_NAME(CB_SETEDITSEL)
+#define CB_ADDSTRING16 (WM_USER+3)
+#define CB_ADDSTRING32 0x0143
+#define CB_ADDSTRING WINELIB_NAME(CB_ADDSTRING)
+#define CB_DELETESTRING16 (WM_USER+4)
+#define CB_DELETESTRING32 0x0144
+#define CB_DELETESTRING WINELIB_NAME(CB_DELETESTRING)
+#define CB_DIR16 (WM_USER+5)
+#define CB_DIR32 0x0145
+#define CB_DIR WINELIB_NAME(CB_DIR)
+#define CB_GETCOUNT16 (WM_USER+6)
+#define CB_GETCOUNT32 0x0146
+#define CB_GETCOUNT WINELIB_NAME(CB_GETCOUNT)
+#define CB_GETCURSEL16 (WM_USER+7)
+#define CB_GETCURSEL32 0x0147
+#define CB_GETCURSEL WINELIB_NAME(CB_GETCURSEL)
+#define CB_GETLBTEXT16 (WM_USER+8)
+#define CB_GETLBTEXT32 0x0148
+#define CB_GETLBTEXT WINELIB_NAME(CB_GETLBTEXT)
+#define CB_GETLBTEXTLEN16 (WM_USER+9)
+#define CB_GETLBTEXTLEN32 0x0149
+#define CB_GETLBTEXTLEN WINELIB_NAME(CB_GETLBTEXTLEN)
+#define CB_INSERTSTRING16 (WM_USER+10)
+#define CB_INSERTSTRING32 0x014a
+#define CB_INSERTSTRING WINELIB_NAME(CB_INSERTSTRING)
+#define CB_RESETCONTENT16 (WM_USER+11)
+#define CB_RESETCONTENT32 0x014b
+#define CB_RESETCONTENT WINELIB_NAME(CB_RESETCONTENT)
+#define CB_FINDSTRING16 (WM_USER+12)
+#define CB_FINDSTRING32 0x014c
+#define CB_FINDSTRING WINELIB_NAME(CB_FINDSTRING)
+#define CB_SELECTSTRING16 (WM_USER+13)
+#define CB_SELECTSTRING32 0x014d
+#define CB_SELECTSTRING WINELIB_NAME(CB_SELECTSTRING)
+#define CB_SETCURSEL16 (WM_USER+14)
+#define CB_SETCURSEL32 0x014e
+#define CB_SETCURSEL WINELIB_NAME(CB_SETCURSEL)
+#define CB_SHOWDROPDOWN16 (WM_USER+15)
+#define CB_SHOWDROPDOWN32 0x014f
+#define CB_SHOWDROPDOWN WINELIB_NAME(CB_SHOWDROPDOWN)
+#define CB_GETITEMDATA16 (WM_USER+16)
+#define CB_GETITEMDATA32 0x0150
+#define CB_GETITEMDATA WINELIB_NAME(CB_GETITEMDATA)
+#define CB_SETITEMDATA16 (WM_USER+17)
+#define CB_SETITEMDATA32 0x0151
+#define CB_SETITEMDATA WINELIB_NAME(CB_SETITEMDATA)
+#define CB_GETDROPPEDCONTROLRECT16 (WM_USER+18)
+#define CB_GETDROPPEDCONTROLRECT32 0x0152
+#define CB_GETDROPPEDCONTROLRECT WINELIB_NAME(CB_GETDROPPEDCONTROLRECT)
+#define CB_SETITEMHEIGHT16 (WM_USER+19)
+#define CB_SETITEMHEIGHT32 0x0153
+#define CB_SETITEMHEIGHT WINELIB_NAME(CB_SETITEMHEIGHT)
+#define CB_GETITEMHEIGHT16 (WM_USER+20)
+#define CB_GETITEMHEIGHT32 0x0154
+#define CB_GETITEMHEIGHT WINELIB_NAME(CB_GETITEMHEIGHT)
+#define CB_SETEXTENDEDUI16 (WM_USER+21)
+#define CB_SETEXTENDEDUI32 0x0155
+#define CB_SETEXTENDEDUI WINELIB_NAME(CB_SETEXTENDEDUI)
+#define CB_GETEXTENDEDUI16 (WM_USER+22)
+#define CB_GETEXTENDEDUI32 0x0156
+#define CB_GETEXTENDEDUI WINELIB_NAME(CB_GETEXTENDEDUI)
+#define CB_GETDROPPEDSTATE16 (WM_USER+23)
+#define CB_GETDROPPEDSTATE32 0x0157
+#define CB_GETDROPPEDSTATE WINELIB_NAME(CB_GETDROPPEDSTATE)
+#define CB_FINDSTRINGEXACT16 (WM_USER+24)
+#define CB_FINDSTRINGEXACT32 0x0158
+#define CB_FINDSTRINGEXACT WINELIB_NAME(CB_FINDSTRINGEXACT)
+#define CB_SETLOCALE16 WM_NULL /* Not in Win16 */
+#define CB_SETLOCALE32 0x0159
+#define CB_SETLOCALE WINELIB_NAME(CB_SETLOCALE)
+#define CB_GETLOCALE16 WM_NULL /* Not in Win16 */
+#define CB_GETLOCALE32 0x015a
+#define CB_GETLOCALE WINELIB_NAME(CB_GETLOCALE)
+#define CB_GETTOPINDEX16 WM_NULL /* Not in Win16 */
+#define CB_GETTOPINDEX32 0x015b
+#define CB_GETTOPINDEX WINELIB_NAME(CB_GETTOPINDEX)
+#define CB_SETTOPINDEX16 WM_NULL /* Not in Win16 */
+#define CB_SETTOPINDEX32 0x015c
+#define CB_SETTOPINDEX WINELIB_NAME(CB_SETTOPINDEX)
+#define CB_GETHORIZONTALEXTENT16 WM_NULL /* Not in Win16 */
+#define CB_GETHORIZONTALEXTENT32 0x015d
+#define CB_GETHORIZONTALEXTENT WINELIB_NAME(CB_GETHORIZONTALEXTENT)
+#define CB_SETHORIZONTALEXTENT16 WM_NULL /* Not in Win16 */
+#define CB_SETHORIZONTALEXTENT32 0x015e
+#define CB_SETHORIZONTALEXTENT WINELIB_NAME(CB_SETHORIZONTALEXTENT)
+#define CB_GETDROPPEDWIDTH16 WM_NULL /* Not in Win16 */
+#define CB_GETDROPPEDWIDTH32 0x015f
+#define CB_GETDROPPEDWIDTH WINELIB_NAME(CB_GETDROPPEDWIDTH)
+#define CB_SETDROPPEDWIDTH16 WM_NULL /* Not in Win16 */
+#define CB_SETDROPPEDWIDTH32 0x0160
+#define CB_SETDROPPEDWIDTH WINELIB_NAME(CB_SETDROPPEDWIDTH)
+#define CB_INITSTORAGE16 WM_NULL /* Not in Win16 */
+#define CB_INITSTORAGE32 0x0161
+#define CB_INITSTORAGE WINELIB_NAME(CB_INITSTORAGE)
/* Combo box notification codes */
#define CBN_ERRSPACE (-1)
@@ -3624,6 +3705,19 @@
typedef BOOL32 (*CODEPAGE_ENUMPROC32W)(LPWSTR);
DECL_WINELIB_TYPE_AW(CODEPAGE_ENUMPROC);
+typedef struct tagSYSTEM_INFO
+{
+ DWORD dwOemId;
+ DWORD dwPageSize;
+ LPVOID lpMinimumApplicationAddress;
+ LPVOID lpMaximumApplicationAddress;
+ DWORD dwActiveProcessorMask;
+ DWORD dwNumberOfProcessors;
+ DWORD dwProcessorType;
+ DWORD dwAllocationGranularity;
+ DWORD dwReserved;
+} SYSTEM_INFO, *LPSYSTEM_INFO;
+
#pragma pack(4)
/* Declarations for functions that exist only in Win16 */
@@ -3638,10 +3732,13 @@
BOOL16 DCHook(HDC16,WORD,DWORD,LPARAM);
VOID DirectedYield(HTASK16);
HGLOBAL16 DirectResAlloc(HINSTANCE16,WORD,UINT16);
+BOOL16 DlgDirSelect(HWND16,LPSTR,INT16);
+BOOL16 DlgDirSelectComboBox(HWND16,LPSTR,INT16);
BOOL16 EnableHardwareInput(BOOL16);
INT16 ExcludeVisRect(HDC16,INT16,INT16,INT16,INT16);
HANDLE16 FarGetOwner(HGLOBAL16);
VOID FarSetOwner(HGLOBAL16,HANDLE16);
+BOOL16 FastWindowFrame(HDC16,const RECT16*,INT16,INT16,DWORD);
VOID FillWindow(HWND16,HWND16,HDC16,HBRUSH16);
INT16 FlushComm(INT16,INT16);
WORD FreeSelector(WORD);
@@ -3731,11 +3828,18 @@
HANDLE32 CreateFileMapping32A(HANDLE32,LPSECURITY_ATTRIBUTES,DWORD,DWORD,DWORD,LPCSTR);
HANDLE32 CreateFileMapping32W(HANDLE32,LPSECURITY_ATTRIBUTES,DWORD,DWORD,DWORD,LPCWSTR);
#define CreateFileMapping WINELIB_NAME_AW(CreateFileMapping)
+BOOL32 DosDateTimeToFileTime(WORD,WORD,LPFILETIME);
INT32 EnumPropsEx32A(HWND32,PROPENUMPROCEX32A,LPARAM);
INT32 EnumPropsEx32W(HWND32,PROPENUMPROCEX32W,LPARAM);
#define EnumPropsEx WINELIB_NAME_AW(EnumPropsEx)
+BOOL32 EnumSystemCodePages32A(CODEPAGE_ENUMPROC32A,DWORD);
+BOOL32 EnumSystemCodePages32W(CODEPAGE_ENUMPROC32W,DWORD);
+#define EnumSystemCodePages WINELIB_NAME_AW(EnumSystemCodePages)
BOOL32 EnumThreadWindows(DWORD,WNDENUMPROC32,LPARAM);
void ExitProcess(DWORD);
+BOOL32 FileTimeToDosDateTime(LPFILETIME,LPWORD,LPWORD);
+BOOL32 FileTimeToLocalFileTime(LPFILETIME,LPFILETIME);
+BOOL32 FileTimeToSystemTime(LPFILETIME,LPSYSTEMTIME);
HRSRC32 FindResourceEx32A(HINSTANCE32,LPCSTR,LPCSTR,WORD);
HRSRC32 FindResourceEx32W(HINSTANCE32,LPCWSTR,LPCWSTR,WORD);
#define FindResourceEx WINELIB_NAME_AW(FindResourceEx)
@@ -3745,6 +3849,8 @@
#define GetCommandLine WINELIB_NAME_AW(GetCommandLine)
BOOL32 GetCommTimeouts(INT32,LPCOMMTIMEOUTS);
DWORD GetFileInformationByHandle(HFILE,BY_HANDLE_FILE_INFORMATION*);
+DWORD GetFileSize(HFILE,LPDWORD);
+DWORD GetFileType(HFILE);
VOID GetLocalTime(LPSYSTEMTIME);
DWORD GetLogicalDrives(void);
HANDLE32 GetProcessHeap(void);
@@ -3752,6 +3858,7 @@
DWORD GetShortPathName32W(LPCWSTR,LPWSTR,DWORD);
#define GetShortPathName WINELIB_NAME_AW(GetShortPathName)
HFILE GetStdHandle(DWORD);
+VOID GetSystemInfo(LPSYSTEM_INFO);
BOOL32 GetSystemPowerStatus(LPSYSTEM_POWER_STATUS);
VOID GetSystemTime(LPSYSTEMTIME);
VOID GlobalMemoryStatus(LPMEMORYSTATUS);
@@ -3766,6 +3873,7 @@
BOOL32 HeapUnlock(HANDLE32);
BOOL32 HeapValidate(HANDLE32,DWORD,LPVOID);
BOOL32 IsWindowUnicode(HWND32);
+BOOL32 LocalFileTimeToFileTime(LPFILETIME,LPFILETIME);
LPVOID MapViewOfFileEx(HANDLE32,DWORD,DWORD,DWORD,DWORD,DWORD);
BOOL32 MoveFile32A(LPCSTR,LPCSTR);
BOOL32 MoveFile32W(LPCWSTR,LPCWSTR);
@@ -3777,16 +3885,16 @@
DWORD RegCreateKeyEx32W(HKEY,LPCWSTR,DWORD,LPWSTR,DWORD,REGSAM,
LPSECURITY_ATTRIBUTES,LPHKEY,LPDWORD);
#define RegCreateKeyEx WINELIB_NAME_AW(RegCreateKeyEx)
-DWORD RegEnumKeyEx32A(HKEY,DWORD,LPSTR,LPDWORD,LPDWORD,LPSTR,LPDWORD,FILETIME*);
-DWORD RegEnumKeyEx32W(HKEY,DWORD,LPWSTR,LPDWORD,LPDWORD,LPWSTR,LPDWORD,FILETIME*);
+DWORD RegEnumKeyEx32A(HKEY,DWORD,LPSTR,LPDWORD,LPDWORD,LPSTR,LPDWORD,LPFILETIME);
+DWORD RegEnumKeyEx32W(HKEY,DWORD,LPWSTR,LPDWORD,LPDWORD,LPWSTR,LPDWORD,LPFILETIME);
#define RegEnumKeyEx WINELIB_NAME_AW(RegEnumKeyEx)
DWORD RegOpenKeyEx32W(HKEY,LPCWSTR,DWORD,REGSAM,LPHKEY);
DWORD RegOpenKeyEx32A(HKEY,LPCSTR,DWORD,REGSAM,LPHKEY);
#define RegOpenKeyEx WINELIB_NAME_AW(RegOpenKeyEx)
DWORD RegQueryInfoKey32W(HKEY,LPWSTR,LPDWORD,LPDWORD,LPDWORD,LPDWORD,
- LPDWORD,LPDWORD,LPDWORD,LPDWORD,LPDWORD,FILETIME*);
+ LPDWORD,LPDWORD,LPDWORD,LPDWORD,LPDWORD,LPFILETIME);
DWORD RegQueryInfoKey32A(HKEY,LPSTR,LPDWORD,LPDWORD,LPDWORD,LPDWORD,
- LPDWORD,LPDWORD,LPDWORD,LPDWORD,LPDWORD,FILETIME*);
+ LPDWORD,LPDWORD,LPDWORD,LPDWORD,LPDWORD,LPFILETIME);
#define RegQueryInfoKey WINELIB_NAME_AW(RegQueryInfoKey)
VOID RtlFillMemory(LPVOID,UINT32,UINT32);
VOID RtlMoveMemory(LPVOID,LPCVOID,UINT32);
@@ -3799,10 +3907,12 @@
BOOL32 SetCommTimeouts(INT32,LPCOMMTIMEOUTS);
BOOL32 SetEndOfFile(HFILE);
DWORD SetFilePointer(HFILE,LONG,LPLONG,DWORD);
+BOOL32 SetFileTime(HFILE,LPFILETIME,LPFILETIME,LPFILETIME);
BOOL32 SetTimeZoneInformation(const LPTIME_ZONE_INFORMATION);
BOOL32 SetSystemPowerState(BOOL32,BOOL32);
BOOL32 SetSystemTime(const SYSTEMTIME*);
VOID Sleep(DWORD);
+BOOL32 SystemTimeToFileTime(LPSYSTEMTIME,LPFILETIME);
LPVOID VirtualAlloc(LPVOID,DWORD,DWORD,DWORD);
BOOL32 VirtualFree(LPVOID,DWORD,DWORD);
BOOL32 WriteFile(HFILE,LPVOID,DWORD,LPDWORD,LPOVERLAPPED);
@@ -3887,6 +3997,9 @@
HDC16 BeginPaint16(HWND16,LPPAINTSTRUCT16);
HDC32 BeginPaint32(HWND32,LPPAINTSTRUCT32);
#define BeginPaint WINELIB_NAME(BeginPaint)
+BOOL16 BitBlt16(HDC16,INT16,INT16,INT16,INT16,HDC16,INT16,INT16,DWORD);
+BOOL32 BitBlt32(HDC32,INT32,INT32,INT32,INT32,HDC32,INT32,INT32,DWORD);
+#define BitBlt WINELIB_NAME(BitBlt)
BOOL16 BuildCommDCB16(LPCSTR,LPDCB16);
BOOL32 BuildCommDCB32A(LPCSTR,LPDCB32);
BOOL32 BuildCommDCB32W(LPCWSTR,LPDCB32);
@@ -4111,6 +4224,14 @@
INT32 DlgDirListComboBox32A(HWND32,LPCSTR,INT32,INT32,UINT32);
INT32 DlgDirListComboBox32W(HWND32,LPCWSTR,INT32,INT32,UINT32);
#define DlgDirListComboBox WINELIB_NAME_AW(DlgDirListComboBox)
+BOOL16 DlgDirSelectComboBoxEx16(HWND16,LPSTR,INT16,INT16);
+BOOL32 DlgDirSelectComboBoxEx32A(HWND32,LPSTR,INT32,INT32);
+BOOL32 DlgDirSelectComboBoxEx32W(HWND32,LPWSTR,INT32,INT32);
+#define DlgDirSelectComboBoxEx WINELIB_NAME_AW(DlgDirSelectComboBoxEx)
+BOOL16 DlgDirSelectEx16(HWND16,LPSTR,INT16,INT16);
+BOOL32 DlgDirSelectEx32A(HWND32,LPSTR,INT32,INT32);
+BOOL32 DlgDirSelectEx32W(HWND32,LPWSTR,INT32,INT32);
+#define DlgDirSelectEx WINELIB_NAME_AW(DlgDirSelectEx)
BOOL16 DPtoLP16(HDC16,LPPOINT16,INT16);
BOOL32 DPtoLP32(HDC32,LPPOINT32,INT32);
#define DPtoLP WINELIB_NAME(DPtoLP)
@@ -4139,6 +4260,10 @@
BOOL16 EnumChildWindows16(HWND16,WNDENUMPROC16,LPARAM);
BOOL32 EnumChildWindows32(HWND32,WNDENUMPROC32,LPARAM);
#define EnumChildWindows WINELIB_NAME(EnumChildWindows)
+INT16 EnumFontFamilies16(HDC16,LPCSTR,FONTENUMPROC16,LPARAM);
+INT32 EnumFontFamilies32A(HDC32,LPCSTR,FONTENUMPROC32A,LPARAM);
+INT32 EnumFontFamilies32W(HDC32,LPCWSTR,FONTENUMPROC32W,LPARAM);
+#define EnumFontFamilies WINELIB_NAME_AW(EnumFontFamilies)
INT16 EnumObjects16(HDC16,INT16,GOBJENUMPROC16,LPARAM);
INT32 EnumObjects32(HDC32,INT32,GOBJENUMPROC32,LPARAM);
#define EnumObjects WINELIB_NAME(EnumObjects)
@@ -4657,6 +4782,9 @@
BOOL16 PaintRgn16(HDC16,HRGN16);
BOOL32 PaintRgn32(HDC32,HRGN32);
#define PaintRgn WINELIB_NAME(PaintRgn)
+BOOL16 PatBlt16(HDC16,INT16,INT16,INT16,INT16,DWORD);
+BOOL32 PatBlt32(HDC32,INT32,INT32,INT32,INT32,DWORD);
+#define PatBlt WINELIB_NAME(PatBlt)
BOOL16 PeekMessage16(LPMSG16,HWND16,UINT16,UINT16,UINT16);
BOOL32 PeekMessage32A(LPMSG32,HWND32,UINT32,UINT32,UINT32);
BOOL32 PeekMessage32W(LPMSG32,HWND32,UINT32,UINT32,UINT32);
@@ -4775,6 +4903,19 @@
void ScreenToClient16(HWND16,LPPOINT16);
void ScreenToClient32(HWND32,LPPOINT32);
#define ScreenToClient WINELIB_NAME(ScreenToClient)
+BOOL16 ScrollDC16(HDC16,INT16,INT16,const RECT16*,const RECT16*,
+ HRGN16,LPRECT16);
+BOOL32 ScrollDC32(HDC32,INT32,INT32,const RECT32*,const RECT32*,
+ HRGN32,LPRECT32);
+#define ScrollDC WINELIB_NAME(ScrollDC)
+void ScrollWindow16(HWND16,INT16,INT16,const RECT16*,const RECT16*);
+BOOL32 ScrollWindow32(HWND32,INT32,INT32,const RECT32*,const RECT32*);
+#define ScrollWindow WINELIB_NAME(ScrollWindow)
+INT16 ScrollWindowEx16(HWND16,INT16,INT16,const RECT16*,const RECT16*,
+ HRGN16,LPRECT16,UINT16);
+INT32 ScrollWindowEx32(HWND32,INT32,INT32,const RECT32*,const RECT32*,
+ HRGN32,LPRECT32,UINT32);
+#define ScrollWindowEx WINELIB_NAME(ScrollWindowEx)
INT16 SelectClipRgn16(HDC16,HRGN16);
INT32 SelectClipRgn32(HDC32,HRGN32);
#define SelectClipRgn WINELIB_NAME(SelectClipRgn)
@@ -4896,6 +5037,11 @@
void ShowScrollBar16(HWND16,INT16,BOOL16);
BOOL32 ShowScrollBar32(HWND32,INT32,BOOL32);
#define ShowScrollBar WINELIB_NAME(ShowScrollBar)
+BOOL16 StretchBlt16(HDC16,INT16,INT16,INT16,INT16,HDC16,INT16,INT16,
+ INT16,INT16,DWORD);
+BOOL32 StretchBlt32(HDC32,INT32,INT32,INT32,INT32,HDC32,INT32,INT32,
+ INT32,INT32,DWORD);
+#define StretchBlt WINELIB_NAME(StretchBlt)
BOOL16 SubtractRect16(LPRECT16,const RECT16*,const RECT16*);
BOOL32 SubtractRect32(LPRECT32,const RECT32*,const RECT32*);
#define SubtractRect WINELIB_NAME(SubtractRect)
@@ -5059,7 +5205,6 @@
BOOL AnyPopup(void);
UINT ArrangeIconicWindows(HWND);
HDWP16 BeginDeferWindowPos(INT);
-BOOL BitBlt(HDC16,INT,INT,INT,INT,HDC16,INT,INT,DWORD);
BOOL BringWindowToTop(HWND);
void CalcChildScroll(HWND,WORD);
BOOL CallMsgFilter(SEGPTR,INT);
@@ -5094,8 +5239,6 @@
BOOL DestroyWindow(HWND);
LONG DispatchMessage(const MSG16*);
INT DlgDirList(HWND,SEGPTR,INT,INT,UINT);
-BOOL DlgDirSelect(HWND,LPSTR,INT);
-BOOL DlgDirSelectComboBox(HWND,LPSTR,INT);
BOOL16 DragDetect(HWND16,POINT16);
DWORD DragObject(HWND, HWND, WORD, HANDLE16, WORD, HCURSOR16);
BOOL DrawIcon(HDC16,INT,INT,HICON16);
@@ -5106,7 +5249,6 @@
BOOL EnableWindow(HWND,BOOL);
BOOL EndDeferWindowPos(HDWP16);
UINT16 EnumClipboardFormats(UINT16);
-INT EnumFontFamilies(HDC16,LPCSTR,FONTENUMPROC16,LPARAM);
INT EnumFonts(HDC16,LPCSTR,FONTENUMPROC16,LPARAM);
BOOL EnumMetaFile(HDC16,HMETAFILE16,MFENUMPROC16,LPARAM);
INT Escape(HDC16,INT,INT,SEGPTR,SEGPTR);
@@ -5249,7 +5391,6 @@
BOOL OpenIcon(HWND);
int OpenSound(void);
void OutputDebugString(LPCSTR);
-BOOL PatBlt(HDC16,short,short,short,short,DWORD);
BOOL PlayMetaFile(HDC16,HMETAFILE16);
void PlayMetaFileRecord(HDC16,LPHANDLETABLE16,LPMETARECORD,WORD);
BOOL PostMessage(HWND,WORD,WORD,LONG);
@@ -5272,9 +5413,6 @@
BOOL RestoreDC(HDC16,short);
int SaveDC(HDC16);
void ScrollChildren(HWND,UINT,WPARAM16,LPARAM);
-BOOL ScrollDC(HDC16,short,short,LPRECT16,LPRECT16,HRGN32,LPRECT16);
-void ScrollWindow(HWND,short,short,LPRECT16,LPRECT16);
-int ScrollWindowEx(HWND,short,short,LPRECT16,LPRECT16,HRGN32,LPRECT16,WORD);
HPALETTE16 SelectPalette(HDC16,HPALETTE16,BOOL);
HWND SetActiveWindow(HWND);
WORD SetBkMode(HDC16,WORD);
@@ -5326,7 +5464,6 @@
DWORD SizeofResource(HMODULE16,HRSRC16);
int StartSound(void);
int StopSound(void);
-BOOL StretchBlt(HDC16,short,short,short,short,HDC16,short,short,short,short,DWORD);
int StretchDIBits(HDC16,WORD,WORD,WORD,WORD,WORD,WORD,WORD,WORD,LPSTR,LPBITMAPINFO,WORD,DWORD);
BOOL SwapMouseButton(BOOL);
void SwapRecording(WORD);
diff --git a/include/winpos.h b/include/winpos.h
index 2b30dd3..d8df072 100644
--- a/include/winpos.h
+++ b/include/winpos.h
@@ -35,6 +35,6 @@
RECT16 *newClientRect );
extern LONG WINPOS_HandleWindowPosChanging16(WND *wndPtr, WINDOWPOS16 *winpos);
extern LONG WINPOS_HandleWindowPosChanging32(WND *wndPtr, WINDOWPOS32 *winpos);
-extern INT16 WINPOS_WindowFromPoint( POINT16 pt, WND **ppWnd );
+extern INT16 WINPOS_WindowFromPoint( WND* scopeWnd, POINT16 pt, WND **ppWnd );
#endif /* __WINE_WINPOS_H */
diff --git a/include/x11drv.h b/include/x11drv.h
index eea87db..0c811a4 100644
--- a/include/x11drv.h
+++ b/include/x11drv.h
@@ -50,8 +50,17 @@
struct tagDC;
+extern BOOL32 X11DRV_BitBlt( struct tagDC *dcDst, INT32 xDst, INT32 yDst,
+ INT32 width, INT32 height, struct tagDC *dcSrc,
+ INT32 xSrc, INT32 ySrc, DWORD rop );
extern BOOL32 X11DRV_GetTextExtentPoint( struct tagDC *dc, LPCSTR str,
INT32 count, LPSIZE32 size );
+extern BOOL32 X11DRV_PatBlt( struct tagDC *dc, INT32 left, INT32 top,
+ INT32 width, INT32 height, DWORD rop );
extern VOID X11DRV_SetDeviceClipping(struct tagDC *dc);
+extern BOOL32 X11DRV_StretchBlt( struct tagDC *dcDst, INT32 xDst, INT32 yDst,
+ INT32 widthDst, INT32 heightDst,
+ struct tagDC *dcSrc, INT32 xSrc, INT32 ySrc,
+ INT32 widthSrc, INT32 heightSrc, DWORD rop );
#endif /* __WINE_X11DRV_H */
diff --git a/library/libres.c b/library/libres.c
index c3964ec..521f7c2 100644
--- a/library/libres.c
+++ b/library/libres.c
@@ -9,6 +9,7 @@
#include "libres.h"
#include "windows.h"
#include "xmalloc.h"
+#include "string32.h"
typedef struct RLE
{
@@ -30,9 +31,9 @@
}
/**********************************************************************
- * LIBRES_FindResource
+ * LIBRES_FindResource16
*/
-HRSRC32 LIBRES_FindResource( HINSTANCE32 hModule, LPCSTR name, LPCSTR type )
+HRSRC32 LIBRES_FindResource16( HINSTANCE32 hModule, LPCSTR name, LPCSTR type )
{
int nameid=0,typeid;
ResListE* ResBlock;
@@ -57,7 +58,7 @@
typeid=atoi(type+1);
else
{
- WINELIB_UNIMP("LIBRES_FindResource(*,*,type=string)");
+ WINELIB_UNIMP("LIBRES_FindResource16(*,*,type=string)");
return 0;
}
}
@@ -77,6 +78,61 @@
return 0;
}
+/**********************************************************************
+ * LIBRES_FindResource32
+ */
+HRSRC32 LIBRES_FindResource32( HINSTANCE32 hModule, LPCWSTR name, LPCWSTR type )
+{
+ int nameid=0,typeid;
+ ResListE* ResBlock;
+ const struct resource* const * Res;
+ LPSTR nameA, typeA;
+
+ if(HIWORD(name))
+ {
+ if(*name=='#')
+ {
+ nameA = STRING32_DupUniToAnsi(name);
+ nameid=atoi(nameA+1);
+ free(nameA);
+ name=NULL;
+ }
+ }
+ else
+ {
+ nameid=LOWORD(name);
+ name=NULL;
+ }
+ if(HIWORD(type))
+ {
+ if(*type=='#')
+ {
+ typeA = STRING32_DupUniToAnsi(type);
+ typeid=atoi(typeA+1);
+ free(typeA);
+ }
+ else
+ {
+ WINELIB_UNIMP("LIBRES_FindResource32(*,*,type=string)");
+ return 0;
+ }
+ }
+ else
+ typeid=LOWORD(type);
+
+ for(ResBlock=ResourceList; ResBlock; ResBlock=ResBlock->next)
+ for(Res=ResBlock->Resources; *Res; Res++)
+ if(name)
+ {
+ if((*Res)->type==typeid && !lstrcmpi32W((*Res)->name,name))
+ return (HRSRC32)*Res;
+ }
+ else
+ if((*Res)->type==typeid && (*Res)->id==nameid)
+ return (HRSRC32)*Res;
+ return 0;
+}
+
/**********************************************************************
* LIBRES_LoadResource
diff --git a/loader/builtin.c b/loader/builtin.c
index 0b67254..0a12bc6 100644
--- a/loader/builtin.c
+++ b/loader/builtin.c
@@ -90,6 +90,7 @@
extern const DLL_DESCRIPTOR LZEXPAND_Descriptor;
extern const DLL_DESCRIPTOR VER_Descriptor;
extern const DLL_DESCRIPTOR W32SYS_Descriptor;
+extern const DLL_DESCRIPTOR WING_Descriptor;
/* 32-bit DLLs */
@@ -143,6 +144,7 @@
{ &LZEXPAND_Descriptor, 0 },
{ &VER_Descriptor, 0 },
{ &W32SYS_Descriptor, 0 },
+ { &WING_Descriptor, 0 },
/* Win32 DLLs */
{ &ADVAPI32_Descriptor, 0 },
{ &COMCTL32_Descriptor, DLL_FLAG_NOT_USED },
diff --git a/loader/resource.c b/loader/resource.c
index 9bf8dba..cf7cc0b 100644
--- a/loader/resource.c
+++ b/loader/resource.c
@@ -63,7 +63,7 @@
}
return NE_FindResource( hModule, type, name );
#else
- return LIBRES_FindResource( hModule, name, type );
+ return LIBRES_FindResource16( hModule, name, type );
#endif
}
@@ -116,7 +116,7 @@
if (!(pModule->flags & NE_FFLAGS_WIN32)) return 0;
return PE_FindResourceEx32W(hModule,name,type,lang);
#else
- return LIBRES_FindResource( hModule, name, type );
+ return LIBRES_FindResource32( hModule, name, type );
#endif
}
@@ -661,6 +661,7 @@
LPWSTR buffer2 = buffer?(LPWSTR)xmalloc(buflen*2):NULL;
INT32 retval = LoadString32W(instance,resource_id,buffer2,buflen);
+ if (!retval) return 0;
if (buffer) {
STRING32_UniToAnsi(buffer,buffer2);
free(buffer2);
diff --git a/memory/global.c b/memory/global.c
index 4718a63..876c6c9 100644
--- a/memory/global.c
+++ b/memory/global.c
@@ -750,52 +750,23 @@
/***********************************************************************
* MemManInfo (TOOLHELP.72)
*/
-BOOL16 MemManInfo( MEMMANINFO *pInfo )
+BOOL16 MemManInfo( MEMMANINFO *info )
{
-#ifdef linux
- /* FIXME: does not take into account the dwSize member
- * could be corrupting memory therefore
- */
- /* shamefully stolen from free */
- DWORD availmem = 0;
- DWORD totalmem = 0;
- FILE *meminfo;
- char buf[80];
- int col[5];
- int n;
+ MEMORYSTATUS status;
- if ((meminfo = fopen("/proc/meminfo", "r")) < 0) {
- perror("wine: open");
- return FALSE;
- }
-
- fgets(buf, 80, meminfo); /* read first line */
- while ( fgets(buf, 80, meminfo) ) {
- n = sscanf( buf, "%*s %d %d %d %d %d", &col[0], &col[1], &col[2], &col[3], &col[4]);
- if ( n < 1 ) continue; /* escape the loop at the top */
- totalmem += col[0];
- availmem += col[2] + col[4];
- }
-
- fprintf(stderr,"MemManInfo called with dwSize = %ld\n",pInfo->dwSize);
- if (pInfo->dwSize) {
- pInfo->wPageSize = getpagesize();
- pInfo->dwLargestFreeBlock = availmem;
- pInfo->dwTotalLinearSpace = totalmem / pInfo->wPageSize;
- pInfo->dwMaxPagesAvailable = pInfo->dwLargestFreeBlock / pInfo->wPageSize;
- pInfo->dwMaxPagesLockable = pInfo->dwMaxPagesLockable;
- /* FIXME: the next three are not quite correct */
- pInfo->dwTotalUnlockedPages = pInfo->dwMaxPagesAvailable;
- pInfo->dwFreePages = pInfo->dwMaxPagesAvailable;
- pInfo->dwTotalPages = pInfo->dwMaxPagesAvailable;
- /* FIXME: the three above are not quite correct */
- pInfo->dwFreeLinearSpace = pInfo->dwMaxPagesAvailable;
- pInfo->dwSwapFilePages = 0L;
- }
+ if (info->dwSize < sizeof(MEMMANINFO)) return FALSE;
+ GlobalMemoryStatus( &status );
+ info->wPageSize = getpagesize();
+ info->dwLargestFreeBlock = status.dwAvailVirtual;
+ info->dwMaxPagesAvailable = info->dwLargestFreeBlock / info->wPageSize;
+ info->dwMaxPagesLockable = info->dwMaxPagesAvailable;
+ info->dwTotalLinearSpace = status.dwTotalVirtual / info->wPageSize;
+ info->dwTotalUnlockedPages = info->dwTotalLinearSpace;
+ info->dwFreePages = info->dwMaxPagesAvailable;
+ info->dwTotalPages = info->dwTotalLinearSpace;
+ info->dwFreeLinearSpace = info->dwMaxPagesAvailable;
+ info->dwSwapFilePages = status.dwTotalPageFile / info->wPageSize;
return TRUE;
-#else
- return TRUE;
-#endif
}
@@ -897,11 +868,46 @@
*/
VOID GlobalMemoryStatus( LPMEMORYSTATUS lpmem )
{
- /* FIXME: should do something like MemManInfo() here */
+#ifdef linux
+ FILE *f = fopen( "/proc/meminfo", "r" );
+ if (f)
+ {
+ char buffer[256];
+ int total, used, free;
+
+ lpmem->dwTotalPhys = lpmem->dwAvailPhys = 0;
+ lpmem->dwTotalPageFile = lpmem->dwAvailPageFile = 0;
+ while (fgets( buffer, sizeof(buffer), f ))
+ {
+ if (sscanf( buffer, "Mem: %d %d %d", &total, &used, &free ))
+ {
+ lpmem->dwTotalPhys += total;
+ lpmem->dwAvailPhys += free;
+ }
+ else if (sscanf( buffer, "Swap: %d %d %d", &total, &used, &free ))
+ {
+ lpmem->dwTotalPageFile += total;
+ lpmem->dwAvailPageFile += free;
+ }
+ }
+ fclose( f );
+
+ if (lpmem->dwTotalPhys)
+ {
+ lpmem->dwTotalVirtual = lpmem->dwTotalPhys+lpmem->dwTotalPageFile;
+ lpmem->dwAvailVirtual = lpmem->dwAvailPhys+lpmem->dwAvailPageFile;
+ lpmem->dwMemoryLoad = (lpmem->dwTotalVirtual-lpmem->dwAvailVirtual)
+ * 100 / lpmem->dwTotalVirtual;
+ return;
+ }
+ }
+#endif
+ /* FIXME: should do something for other systems */
lpmem->dwMemoryLoad = 0;
lpmem->dwTotalPhys = 16*1024*1024;
lpmem->dwAvailPhys = 16*1024*1024;
- lpmem->dwTotalPageFile = 0;
+ lpmem->dwTotalPageFile = 16*1024*1024;
lpmem->dwAvailPageFile = 16*1024*1024;
- lpmem->dwAvailVirtual = 16*1024*1024;
+ lpmem->dwTotalVirtual = 32*1024*1024;
+ lpmem->dwAvailVirtual = 32*1024*1024;
}
diff --git a/misc/commdlg.c b/misc/commdlg.c
index 0133f88..80aa834 100644
--- a/misc/commdlg.c
+++ b/misc/commdlg.c
@@ -263,8 +263,8 @@
lpdis->rcItem.top, str, strlen(str));
hMemDC = CreateCompatibleDC(lpdis->hDC);
hPrevBitmap = SelectObject32(hMemDC, hBitmap);
- BitBlt(lpdis->hDC, lpdis->rcItem.left, lpdis->rcItem.top,
- bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+ BitBlt32(lpdis->hDC, lpdis->rcItem.left, lpdis->rcItem.top,
+ bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
SelectObject32(hMemDC, hPrevBitmap);
DeleteDC(hMemDC);
if (lpdis->itemState != 0) InvertRect16(lpdis->hDC, &lpdis->rcItem);
@@ -277,7 +277,7 @@
hBrush = SelectObject32(lpdis->hDC, GetStockObject32(LTGRAY_BRUSH));
SelectObject32(lpdis->hDC, hBrush);
FillRect16(lpdis->hDC, &lpdis->rcItem, hBrush);
- SendMessage16(lpdis->hwndItem, CB_GETLBTEXT, lpdis->itemID,
+ SendMessage16(lpdis->hwndItem, CB_GETLBTEXT16, lpdis->itemID,
(LPARAM)SEGPTR_GET(str));
switch(DRIVE_GetType( str[2] - 'a' ))
{
@@ -292,8 +292,8 @@
lpdis->rcItem.top, str, strlen(str));
hMemDC = CreateCompatibleDC(lpdis->hDC);
hPrevBitmap = SelectObject32(hMemDC, hBitmap);
- BitBlt(lpdis->hDC, lpdis->rcItem.left, lpdis->rcItem.top,
- bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+ BitBlt32( lpdis->hDC, lpdis->rcItem.left, lpdis->rcItem.top,
+ bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY );
SelectObject32(hMemDC, hPrevBitmap);
DeleteDC(hMemDC);
if (lpdis->itemState != 0) InvertRect16(lpdis->hDC, &lpdis->rcItem);
@@ -351,12 +351,12 @@
while(*pstr)
{
dprintf_commdlg(stddeb,"lpstrCustomFilter // add str='%s' ",pstr);
- i = SendDlgItemMessage16(hWnd, cmb1, CB_ADDSTRING, 0,
+ i = SendDlgItemMessage16(hWnd, cmb1, CB_ADDSTRING16, 0,
(LPARAM)lpofn->lpstrCustomFilter + n );
n += strlen(pstr) + 1;
pstr += strlen(pstr) + 1;
dprintf_commdlg(stddeb,"associated to '%s'\n", pstr);
- SendDlgItemMessage16(hWnd, cmb1, CB_SETITEMDATA, i, (LPARAM)pstr);
+ SendDlgItemMessage16(hWnd, cmb1, CB_SETITEMDATA16, i, (LPARAM)pstr);
n += strlen(pstr) + 1;
pstr += strlen(pstr) + 1;
}
@@ -367,12 +367,12 @@
n = 0;
while(*pstr) {
dprintf_commdlg(stddeb,"lpstrFilter // add str='%s' ", pstr);
- i = SendDlgItemMessage16(hWnd, cmb1, CB_ADDSTRING, 0,
+ i = SendDlgItemMessage16(hWnd, cmb1, CB_ADDSTRING16, 0,
(LPARAM)lpofn->lpstrFilter + n );
n += strlen(pstr) + 1;
pstr += strlen(pstr) + 1;
dprintf_commdlg(stddeb,"associated to '%s'\n", pstr);
- SendDlgItemMessage16(hWnd, cmb1, CB_SETITEMDATA, i, (LPARAM)pstr);
+ SendDlgItemMessage16(hWnd, cmb1, CB_SETITEMDATA16, i, (LPARAM)pstr);
n += strlen(pstr) + 1;
pstr += strlen(pstr) + 1;
}
@@ -380,7 +380,7 @@
/* set default filter */
if (lpofn->nFilterIndex == 0 && lpofn->lpstrCustomFilter == (SEGPTR)NULL)
lpofn->nFilterIndex = 1;
- SendDlgItemMessage16(hWnd, cmb1, CB_SETCURSEL, lpofn->nFilterIndex - 1, 0);
+ SendDlgItemMessage16(hWnd, cmb1, CB_SETCURSEL16, lpofn->nFilterIndex - 1, 0);
strncpy(tmpstr, FILEDLG_GetFileType(PTR_SEG_TO_LIN(lpofn->lpstrCustomFilter),
PTR_SEG_TO_LIN(lpofn->lpstrFilter), lpofn->nFilterIndex - 1),511);
tmpstr[511]=0;
@@ -407,7 +407,7 @@
fprintf(stderr, "FileDlg: couldn't read initial directory %s!\n", tmpstr);
/* select current drive in combo 2 */
n = DRIVE_GetCurrentDrive();
- SendDlgItemMessage16(hWnd, cmb2, CB_SETCURSEL, n, 0);
+ SendDlgItemMessage16(hWnd, cmb2, CB_SETCURSEL16, n, 0);
if (!(lpofn->Flags & OFN_SHOWHELP))
ShowWindow(GetDlgItem(hWnd, pshHelp), SW_HIDE);
if (lpofn->Flags & OFN_HIDEREADONLY)
@@ -486,18 +486,18 @@
return TRUE;
case cmb2: /* disk drop list */
FILEDLG_StripEditControl(hWnd);
- lRet = SendDlgItemMessage16(hWnd, cmb2, CB_GETCURSEL, 0, 0L);
+ lRet = SendDlgItemMessage16(hWnd, cmb2, CB_GETCURSEL16, 0, 0L);
if (lRet == LB_ERR) return 0;
pstr = SEGPTR_ALLOC(512);
- SendDlgItemMessage16(hWnd, cmb2, CB_GETLBTEXT, lRet,
+ SendDlgItemMessage16(hWnd, cmb2, CB_GETLBTEXT16, lRet,
(LPARAM)SEGPTR_GET(pstr));
sprintf(tmpstr, "%c:", pstr[2]);
SEGPTR_FREE(pstr);
reset_scan:
- lRet = SendDlgItemMessage16(hWnd, cmb1, CB_GETCURSEL, 0, 0);
+ lRet = SendDlgItemMessage16(hWnd, cmb1, CB_GETCURSEL16, 0, 0);
if (lRet == LB_ERR)
return TRUE;
- pstr = (LPSTR)SendDlgItemMessage16(hWnd, cmb1, CB_GETITEMDATA, lRet, 0);
+ pstr = (LPSTR)SendDlgItemMessage16(hWnd, cmb1, CB_GETITEMDATA16, lRet, 0);
dprintf_commdlg(stddeb,"Selected filter : %s\n", pstr);
SetDlgItemText32A( hWnd, edt1, pstr );
FILEDLG_ScanDir(hWnd, tmpstr);
@@ -536,7 +536,7 @@
pstr2 = tmpstr + strlen(tmpstr);
if (pstr == NULL || *(pstr+1) != 0)
strcat(tmpstr, "\\");
- lRet = SendDlgItemMessage16(hWnd, cmb1, CB_GETCURSEL, 0, 0);
+ lRet = SendDlgItemMessage16(hWnd, cmb1, CB_GETCURSEL16, 0, 0);
if (lRet == LB_ERR) return TRUE;
lpofn->nFilterIndex = lRet + 1;
dprintf_commdlg(stddeb,"commdlg: lpofn->nFilterIndex=%ld\n", lpofn->nFilterIndex);
@@ -1568,10 +1568,10 @@
point.x=((long)rect.right*(long)x)/(long)MAXHORI;
point.y=rect.bottom-((long)rect.bottom*(long)y)/(long)MAXVERT;
if (lpp->oldcross.left!=lpp->oldcross.right)
- BitBlt(hDC,lpp->oldcross.left,lpp->oldcross.top,
- lpp->oldcross.right-lpp->oldcross.left,
- lpp->oldcross.bottom-lpp->oldcross.top,
- lpp->hdcMem,lpp->oldcross.left,lpp->oldcross.top,SRCCOPY);
+ BitBlt32(hDC,lpp->oldcross.left,lpp->oldcross.top,
+ lpp->oldcross.right-lpp->oldcross.left,
+ lpp->oldcross.bottom-lpp->oldcross.top,
+ lpp->hdcMem,lpp->oldcross.left,lpp->oldcross.top,SRCCOPY);
lpp->oldcross.left =point.x-w-1;
lpp->oldcross.right =point.x+w+1;
lpp->oldcross.top =point.y-w-1;
@@ -1652,7 +1652,7 @@
hDC=GetDC32(hwnd);
GetClientRect16(hwnd,&rect);
if (lpp->hdcMem)
- BitBlt(hDC,0,0,rect.right,rect.bottom,lpp->hdcMem,0,0,SRCCOPY);
+ BitBlt32(hDC,0,0,rect.right,rect.bottom,lpp->hdcMem,0,0,SRCCOPY);
else
fprintf(stderr,"choose color: hdcMem is not defined\n");
ReleaseDC32(hwnd,hDC);
@@ -2285,12 +2285,12 @@
if (!(nFontType & 0x0004)) /* this means 'TRUETYPE_FONTTYPE' */
return 1;
- i=SendMessage16(hwnd,CB_ADDSTRING,0,
+ i=SendMessage16(hwnd,CB_ADDSTRING16,0,
(LPARAM)logfont + ((char *)lplf->lfFaceName - (char *)lplf));
if (i!=CB_ERR)
{
w=(lplf->lfCharSet << 8) | lplf->lfPitchAndFamily;
- SendMessage16(hwnd, CB_SETITEMDATA,i,MAKELONG(nFontType,w));
+ SendMessage16(hwnd, CB_SETITEMDATA16,i,MAKELONG(nFontType,w));
return 1 ; /* store some important font information */
}
else
@@ -2330,10 +2330,10 @@
lptm->tmItalic==fontstyles[i].italic) /* font successful created ? */
{
char *str = SEGPTR_STRDUP(fontstyles[i].stname);
- j=SendMessage16(hwnd,CB_ADDSTRING,0,(LPARAM)SEGPTR_GET(str) );
+ j=SendMessage16(hwnd,CB_ADDSTRING16,0,(LPARAM)SEGPTR_GET(str) );
SEGPTR_FREE(str);
if (j==CB_ERR) return 1;
- j=SendMessage16(hwnd, CB_SETITEMDATA, j,
+ j=SendMessage16(hwnd, CB_SETITEMDATA16, j,
MAKELONG(fontstyles[i].weight,fontstyles[i].italic));
if (j==CB_ERR) return 1;
}
@@ -2359,11 +2359,11 @@
((lpcf->Flags & CF_LIMITSIZE) && (h >= lpcf->nSizeMin) && (h <= lpcf->nSizeMax)))
{
sprintf(buffer,"%2d",h);
- j=SendMessage16(hwnd,CB_FINDSTRING,-1,(LPARAM)SEGPTR_GET(buffer));
+ j=SendMessage16(hwnd,CB_FINDSTRING16,-1,(LPARAM)SEGPTR_GET(buffer));
if (j==CB_ERR)
{
- j=SendMessage16(hwnd,CB_ADDSTRING,0,(LPARAM)SEGPTR_GET(buffer));
- if (j!=CB_ERR) j = SendMessage16(hwnd, CB_SETITEMDATA, j, h);
+ j=SendMessage16(hwnd,CB_ADDSTRING16,0,(LPARAM)SEGPTR_GET(buffer));
+ if (j!=CB_ERR) j = SendMessage16(hwnd, CB_SETITEMDATA16, j, h);
if (j==CB_ERR)
{
SEGPTR_FREE(buffer);
@@ -2400,7 +2400,7 @@
if (SetFontSizesToCombo3(hcmb3, lplf ,lpcf))
return 0;
- if (!SendMessage16(hcmb2,CB_GETCOUNT,0,0))
+ if (!SendMessage16(hcmb2,CB_GETCOUNT16,0,0))
{
HDC32 hdc= (lpcf->Flags & CF_PRINTERFONTS && lpcf->hDC) ? lpcf->hDC : GetDC32(hDlg);
i=SetFontStylesToCombo2(hcmb2,hdc,lplf,lptm);
@@ -2450,12 +2450,12 @@
/* FIXME: load color name from resource: res=LoadString(...,i+....,buffer,.....); */
char *name = SEGPTR_ALLOC(20);
strcpy( name, "[color name]" );
- j=SendDlgItemMessage16(hDlg,cmb4,CB_ADDSTRING,0,(LPARAM)SEGPTR_GET(name));
+ j=SendDlgItemMessage16(hDlg,cmb4,CB_ADDSTRING16,0,(LPARAM)SEGPTR_GET(name));
SEGPTR_FREE(name);
- SendDlgItemMessage16(hDlg,cmb4, CB_SETITEMDATA,j,textcolors[j]);
+ SendDlgItemMessage16(hDlg,cmb4, CB_SETITEMDATA16,j,textcolors[j]);
/* look for a fitting value in color combobox */
if (textcolors[j]==lpcf->rgbColors)
- SendDlgItemMessage16(hDlg,cmb4, CB_SETCURSEL,j,0);
+ SendDlgItemMessage16(hDlg,cmb4, CB_SETCURSEL16,j,0);
}
}
else
@@ -2469,45 +2469,45 @@
hdc= (lpcf->Flags & CF_PRINTERFONTS && lpcf->hDC) ? lpcf->hDC : GetDC32(hDlg);
if (hdc)
{
- if (!EnumFontFamilies (hdc, NULL,FontFamilyEnumProc,(LPARAM)GetDlgItem(hDlg,cmb1)))
+ if (!EnumFontFamilies16(hdc, NULL,FontFamilyEnumProc,(LPARAM)GetDlgItem(hDlg,cmb1)))
dprintf_commdlg(stddeb,"WM_INITDIALOG: EnumFontFamilies returns 0\n");
if (lpcf->Flags & CF_INITTOLOGFONTSTRUCT)
{
/* look for fitting font name in combobox1 */
- j=SendDlgItemMessage16(hDlg,cmb1,CB_FINDSTRING,-1,(LONG)lpxx->lfFaceName);
+ j=SendDlgItemMessage16(hDlg,cmb1,CB_FINDSTRING16,-1,(LONG)lpxx->lfFaceName);
if (j!=CB_ERR)
{
- SendDlgItemMessage16(hDlg,cmb1,CB_SETCURSEL,j,0);
+ SendDlgItemMessage16(hDlg,cmb1,CB_SETCURSEL16,j,0);
SendMessage16(hDlg,WM_COMMAND,cmb1,MAKELONG(GetDlgItem(hDlg,cmb1),CBN_SELCHANGE));
init=1;
/* look for fitting font style in combobox2 */
l=MAKELONG(lpxx->lfWeight > FW_MEDIUM ? FW_BOLD:FW_NORMAL,lpxx->lfItalic !=0);
for (i=0;i<TEXT_EXTRAS;i++)
{
- if (l==SendDlgItemMessage16(hDlg,cmb2, CB_GETITEMDATA,i,0))
- SendDlgItemMessage16(hDlg,cmb2,CB_SETCURSEL,i,0);
+ if (l==SendDlgItemMessage16(hDlg,cmb2, CB_GETITEMDATA16,i,0))
+ SendDlgItemMessage16(hDlg,cmb2,CB_SETCURSEL16,i,0);
}
/* look for fitting font size in combobox3 */
- j=SendDlgItemMessage16(hDlg,cmb3,CB_GETCOUNT,0,0);
+ j=SendDlgItemMessage16(hDlg,cmb3,CB_GETCOUNT16,0,0);
for (i=0;i<j;i++)
{
- if (lpxx->lfHeight==(int)SendDlgItemMessage16(hDlg,cmb3, CB_GETITEMDATA,i,0))
- SendDlgItemMessage16(hDlg,cmb3,CB_SETCURSEL,i,0);
+ if (lpxx->lfHeight==(int)SendDlgItemMessage16(hDlg,cmb3, CB_GETITEMDATA16,i,0))
+ SendDlgItemMessage16(hDlg,cmb3,CB_SETCURSEL16,i,0);
}
}
if (!init)
{
- SendDlgItemMessage16(hDlg,cmb1,CB_SETCURSEL,0,0);
+ SendDlgItemMessage16(hDlg,cmb1,CB_SETCURSEL16,0,0);
SendMessage16(hDlg,WM_COMMAND,cmb1,MAKELONG(GetDlgItem(hDlg,cmb1),CBN_SELCHANGE));
}
}
if (lpcf->Flags & CF_USESTYLE && lpcf->lpszStyle)
{
- j=SendDlgItemMessage16(hDlg,cmb2,CB_FINDSTRING,-1,(LONG)lpcf->lpszStyle);
+ j=SendDlgItemMessage16(hDlg,cmb2,CB_FINDSTRING16,-1,(LONG)lpcf->lpszStyle);
if (j!=CB_ERR)
{
- j=SendDlgItemMessage16(hDlg,cmb2,CB_SETCURSEL,j,0);
+ j=SendDlgItemMessage16(hDlg,cmb2,CB_SETCURSEL16,j,0);
SendMessage16(hDlg,WM_COMMAND,cmb2,MAKELONG(GetDlgItem(hDlg,cmb2),CBN_SELCHANGE));
}
}
@@ -2580,20 +2580,20 @@
switch (lpdi->CtlID)
{
case cmb1: /* dprintf_commdlg(stddeb,"WM_Drawitem cmb1\n"); */
- SendMessage16(lpdi->hwndItem, CB_GETLBTEXT, lpdi->itemID,
+ SendMessage16(lpdi->hwndItem, CB_GETLBTEXT16, lpdi->itemID,
(LPARAM)SEGPTR_GET(buffer));
GetObject16( hBitmapTT, sizeof(bm), &bm );
TextOut16(lpdi->hDC, lpdi->rcItem.left + bm.bmWidth + 10,
lpdi->rcItem.top, buffer, lstrlen16(buffer));
#if 0
- nFontType = SendMessage16(lpdi->hwndItem, CB_GETITEMDATA, lpdi->itemID,0L);
+ nFontType = SendMessage16(lpdi->hwndItem, CB_GETITEMDATA16, lpdi->itemID,0L);
/* FIXME: draw bitmap if truetype usage */
if (nFontType&TRUETYPE_FONTTYPE)
{
hMemDC = CreateCompatibleDC(lpdi->hDC);
hBitmap = SelectObject32(hMemDC, hBitmapTT);
- BitBlt(lpdi->hDC, lpdi->rcItem.left, lpdi->rcItem.top,
- bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+ BitBlt32(lpdi->hDC, lpdi->rcItem.left, lpdi->rcItem.top,
+ bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
SelectObject32(hMemDC, hBitmap);
DeleteDC(hMemDC);
}
@@ -2601,18 +2601,18 @@
break;
case cmb2:
case cmb3: /* dprintf_commdlg(stddeb,"WM_DRAWITEN cmb2,cmb3\n"); */
- SendMessage16(lpdi->hwndItem, CB_GETLBTEXT, lpdi->itemID,
+ SendMessage16(lpdi->hwndItem, CB_GETLBTEXT16, lpdi->itemID,
(LPARAM)SEGPTR_GET(buffer));
TextOut16(lpdi->hDC, lpdi->rcItem.left,
lpdi->rcItem.top, buffer, lstrlen16(buffer));
break;
case cmb4: /* dprintf_commdlg(stddeb,"WM_DRAWITEM cmb4 (=COLOR)\n"); */
- SendMessage16(lpdi->hwndItem, CB_GETLBTEXT, lpdi->itemID,
+ SendMessage16(lpdi->hwndItem, CB_GETLBTEXT16, lpdi->itemID,
(LPARAM)SEGPTR_GET(buffer));
TextOut16(lpdi->hDC, lpdi->rcItem.left + 25+5,
lpdi->rcItem.top, buffer, lstrlen16(buffer));
- cr = SendMessage16(lpdi->hwndItem, CB_GETITEMDATA, lpdi->itemID,0L);
+ cr = SendMessage16(lpdi->hwndItem, CB_GETITEMDATA16, lpdi->itemID,0L);
hBrush = CreateSolidBrush32(cr);
if (hBrush)
{
@@ -2674,17 +2674,17 @@
hdc=(lpcf->Flags & CF_PRINTERFONTS && lpcf->hDC) ? lpcf->hDC : GetDC32(hDlg);
if (hdc)
{
- SendDlgItemMessage16(hDlg,cmb2,CB_RESETCONTENT,0,0);
- SendDlgItemMessage16(hDlg,cmb3,CB_RESETCONTENT,0,0);
- i=SendDlgItemMessage16(hDlg,cmb1,CB_GETCURSEL,0,0);
+ SendDlgItemMessage16(hDlg,cmb2,CB_RESETCONTENT16,0,0);
+ SendDlgItemMessage16(hDlg,cmb3,CB_RESETCONTENT16,0,0);
+ i=SendDlgItemMessage16(hDlg,cmb1,CB_GETCURSEL16,0,0);
if (i!=CB_ERR)
{
HCURSOR16 hcursor=SetCursor(LoadCursor16(0,IDC_WAIT));
char *str = SEGPTR_ALLOC(256);
- SendDlgItemMessage16(hDlg,cmb1,CB_GETLBTEXT,i,
+ SendDlgItemMessage16(hDlg,cmb1,CB_GETLBTEXT16,i,
(LPARAM)SEGPTR_GET(str));
dprintf_commdlg(stddeb,"WM_COMMAND/cmb1 =>%s\n",str);
- EnumFontFamilies(hdc,str,FontStyleEnumProc,
+ EnumFontFamilies16(hdc,str,FontStyleEnumProc,
MAKELONG(GetDlgItem(hDlg,cmb2),GetDlgItem(hDlg,cmb3)));
SetCursor(hcursor);
SEGPTR_FREE(str);
@@ -2706,14 +2706,14 @@
{
char *str = SEGPTR_ALLOC(256);
dprintf_commdlg(stddeb,"WM_COMMAND/cmb2,3 =%08lX\n", lParam);
- i=SendDlgItemMessage16(hDlg,cmb1,CB_GETCURSEL,0,0);
+ i=SendDlgItemMessage16(hDlg,cmb1,CB_GETCURSEL16,0,0);
if (i==CB_ERR)
i=GetDlgItemText32A( hDlg, cmb1, str, 256 );
else
{
- SendDlgItemMessage16(hDlg,cmb1,CB_GETLBTEXT,i,
+ SendDlgItemMessage16(hDlg,cmb1,CB_GETLBTEXT16,i,
(LPARAM)SEGPTR_GET(str));
- l=SendDlgItemMessage16(hDlg,cmb1,CB_GETITEMDATA,i,0);
+ l=SendDlgItemMessage16(hDlg,cmb1,CB_GETITEMDATA16,i,0);
j=HIWORD(l);
lpcf->nFontType = LOWORD(l);
/* FIXME: lpcf->nFontType |= .... SIMULATED_FONTTYPE and so */
@@ -2724,18 +2724,18 @@
}
strcpy(lpxx->lfFaceName,str);
SEGPTR_FREE(str);
- i=SendDlgItemMessage16(hDlg,cmb2,CB_GETCURSEL,0,0);
+ i=SendDlgItemMessage16(hDlg,cmb2,CB_GETCURSEL16,0,0);
if (i!=CB_ERR)
{
- l=SendDlgItemMessage16(hDlg,cmb2,CB_GETITEMDATA,i,0);
+ l=SendDlgItemMessage16(hDlg,cmb2,CB_GETITEMDATA16,i,0);
if (0!=(lpxx->lfItalic=HIWORD(l)))
lpcf->nFontType |= ITALIC_FONTTYPE;
if ((lpxx->lfWeight=LOWORD(l)) > FW_MEDIUM)
lpcf->nFontType |= BOLD_FONTTYPE;
}
- i=SendDlgItemMessage16(hDlg,cmb3,CB_GETCURSEL,0,0);
+ i=SendDlgItemMessage16(hDlg,cmb3,CB_GETCURSEL16,0,0);
if (i!=CB_ERR)
- lpxx->lfHeight=-LOWORD(SendDlgItemMessage16(hDlg,cmb3,CB_GETITEMDATA,i,0));
+ lpxx->lfHeight=-LOWORD(SendDlgItemMessage16(hDlg,cmb3,CB_GETITEMDATA16,i,0));
else
lpxx->lfHeight=0;
lpxx->lfStrikeOut=IsDlgButtonChecked(hDlg,chx1);
@@ -2753,7 +2753,7 @@
}
break;
- case cmb4:i=SendDlgItemMessage16(hDlg,cmb4,CB_GETCURSEL,0,0);
+ case cmb4:i=SendDlgItemMessage16(hDlg,cmb4,CB_GETCURSEL16,0,0);
if (i!=CB_ERR)
{
lpcf->rgbColors=textcolors[i];
diff --git a/misc/crtdll.c b/misc/crtdll.c
index 4917a4e..e7a8be6 100644
--- a/misc/crtdll.c
+++ b/misc/crtdll.c
@@ -20,6 +20,7 @@
#include "debug.h"
#include "module.h"
#include "xmalloc.h"
+#include "heap.h"
UINT32 CRTDLL_argc_dll; /* CRTDLL.23 */
LPSTR *CRTDLL_argv_dll; /* CRTDLL.24 */
@@ -141,6 +142,14 @@
}
/*********************************************************************
+ * sprintf (CRTDLL.458)
+ */
+int CRTDLL_sprintf(DWORD *args)
+{
+ return vsprintf((LPSTR)(args[0]),(LPSTR)(args[1]),args+2);
+}
+
+/*********************************************************************
* time (CRTDLL.488)
*/
time_t CRTDLL_time(time_t *timeptr)
@@ -613,3 +622,20 @@
{
HeapFree(GetProcessHeap(),0,ptr);
}
+
+/*********************************************************************
+ * _strdup (CRTDLL.285)
+ */
+LPSTR CRTDLL__strdup(LPSTR ptr)
+{
+ return HEAP_strdupA(GetProcessHeap(),0,ptr);
+}
+
+/*********************************************************************
+ * fclose (CRTDLL.362)
+ */
+DWORD CRTDLL_fclose(LPVOID x)
+{
+ dprintf_crtdll(stdnimp,"fclose(%p)\n",x);
+ return 0;
+}
diff --git a/misc/exec.c b/misc/exec.c
index 5594182..c69416d 100644
--- a/misc/exec.c
+++ b/misc/exec.c
@@ -113,7 +113,10 @@
}
hDest = FindWindow32A( "MS_WINHELP", NULL );
if(!hDest)
- return FALSE;
+ if(wCommand == HELP_QUIT)
+ return TRUE;
+ else
+ return FALSE;
switch(wCommand)
{
case HELP_CONTEXT:
diff --git a/misc/registry.c b/misc/registry.c
index b5ba088..cdd6751 100644
--- a/misc/registry.c
+++ b/misc/registry.c
@@ -20,6 +20,7 @@
#include "win.h"
#include "winerror.h"
#include "file.h"
+#include "dos_fs.h"
#include "string32.h"
#include "stddebug.h"
#include "debug.h"
@@ -1054,8 +1055,6 @@
return NULL;
}
-extern time_t FileTimeToUnixTime(FILETIME*);
-
static void
_w95_loadreg(char* fn,LPKEYSTRUCT lpkey) {
/* Disk Key Entry structure (RGKN part) */
@@ -1211,7 +1210,7 @@
if (!GetFileInformationByHandle(hfd,&hfdinfo))
return;
end = hfdinfo.nFileSizeLow;
- lastmodified = FileTimeToUnixTime(&(hfdinfo.ftLastWriteTime));
+ lastmodified = DOSFS_FileTimeToUnixTime(&(hfdinfo.ftLastWriteTime));
if (-1==_llseek(hfd,rgdbsection,SEEK_SET))
return;
diff --git a/misc/shell.c b/misc/shell.c
index 3bec8c7..3a96897 100644
--- a/misc/shell.c
+++ b/misc/shell.c
@@ -79,11 +79,8 @@
hDrop,wFile,lpszFile,wLength);
lpDropFileStruct = (LPDROPFILESTRUCT) GlobalLock16(hDrop);
- if(!lpDropFileStruct)
- {
- dprintf_reg(stddeb,"DragQueryFile: unable to lock handle!\n");
- return 0;
- }
+ if(!lpDropFileStruct) return 0;
+
lpCurrent = (LPSTR) lpDropFileStruct + lpDropFileStruct->wSize;
i = 0;
@@ -100,7 +97,7 @@
i = (wLength > i) ? i : wLength-1;
strncpy(lpszFile, lpCurrent, i);
lpszFile[i] = '\0';
-
+
GlobalUnlock16(hDrop);
return i;
}
@@ -121,7 +118,7 @@
BOOL DragQueryPoint(HDROP16 hDrop, POINT16 *p)
{
LPDROPFILESTRUCT lpDropFileStruct;
- BOOL bRet;
+ BOOL16 bRet;
lpDropFileStruct = (LPDROPFILESTRUCT) GlobalLock16(hDrop);
@@ -807,7 +804,7 @@
*/
int RegisterShellHook(void *ptr)
{
- dprintf_reg(stdnimp, "RegisterShellHook : Empty Stub !!!\n");
+ fprintf(stdnimp, "RegisterShellHook : Empty Stub !!!\n");
return 0;
}
@@ -817,7 +814,7 @@
*/
int ShellHookProc(void)
{
- dprintf_reg(stdnimp, "ShellHookProc : Empty Stub !!!\n");
+ fprintf(stdnimp, "ShellHookProc : Empty Stub !!!\n");
return 0;
}
diff --git a/misc/spy.c b/misc/spy.c
index 3cdf52d..57ce9d9 100644
--- a/misc/spy.c
+++ b/misc/spy.c
@@ -215,15 +215,43 @@
NULL, NULL, NULL, NULL, NULL, NULL, NULL,
/* 0x0140 - Win32 Comboboxes */
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ "CB_GETEDITSEL32", /* 0x0140 */
+ "CB_LIMITTEXT32", /* 0x0141 */
+ "CB_SETEDITSEL32", /* 0x0142 */
+ "CB_ADDSTRING32", /* 0x0143 */
+ "CB_DELETESTRING32", /* 0x0144 */
+ "CB_DIR32", /* 0x0145 */
+ "CB_GETCOUNT32", /* 0x0146 */
+ "CB_GETCURSEL32", /* 0x0147 */
+ "CB_GETLBTEXT32", /* 0x0148 */
+ "CB_GETLBTEXTLEN32", /* 0x0149 */
+ "CB_INSERTSTRING32", /* 0x014a */
+ "CB_RESETCONTENT32", /* 0x014b */
+ "CB_FINDSTRING32", /* 0x014c */
+ "CB_SELECTSTRING32", /* 0x014d */
+ "CB_SETCURSEL32", /* 0x014e */
+ "CB_SHOWDROPDOWN32", /* 0x014f */
- /* 0x0150 */
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ "CB_GETITEMDATA32", /* 0x0150 */
+ "CB_SETITEMDATA32", /* 0x0151 */
+ "CB_GETDROPPEDCONTROLRECT32",/* 0x0152 */
+ "CB_SETITEMHEIGHT32", /* 0x0153 */
+ "CB_GETITEMHEIGHT32", /* 0x0154 */
+ "CB_SETEXTENDEDUI32", /* 0x0155 */
+ "CB_GETEXTENDEDUI32", /* 0x0156 */
+ "CB_GETDROPPEDSTATE32", /* 0x0157 */
+ "CB_FINDSTRINGEXACT32", /* 0x0158 */
+ "CB_SETLOCALE32", /* 0x0159 */
+ "CB_GETLOCALE32", /* 0x015a */
+ "CB_GETTOPINDEX32", /* 0x015b */
+ "CB_SETTOPINDEX32", /* 0x015c */
+ "CB_GETHORIZONTALEXTENT32", /* 0x015d */
+ "CB_SETHORIZONTALEXTENT32", /* 0x015e */
+ "CB_GETDROPPEDWIDTH32", /* 0x015f */
- /* 0x0160 */
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ "CB_SETDROPPEDWIDTH32", /* 0x0160 */
+ "CB_INITSTORAGE32", /* 0x0161 */
+ NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
/* 0x0170 - Win32 Static controls */
diff --git a/miscemu/int21.c b/miscemu/int21.c
index d701a8b..1a4cc96 100644
--- a/miscemu/int21.c
+++ b/miscemu/int21.c
@@ -15,10 +15,10 @@
#include <unistd.h>
#include <utime.h>
#include <ctype.h>
+#include "windows.h"
#include "dos_fs.h"
#include "drive.h"
#include "file.h"
-#include "windows.h"
#include "msdos.h"
#include "ldt.h"
#include "task.h"
diff --git a/objects/Makefile.in b/objects/Makefile.in
index 56b3307..953c68d 100644
--- a/objects/Makefile.in
+++ b/objects/Makefile.in
@@ -6,7 +6,6 @@
MODULE = objects
C_SRCS = \
- bitblt.c \
bitmap.c \
brush.c \
clipping.c \
diff --git a/objects/color.c b/objects/color.c
index d5afb9d..bc1615f 100644
--- a/objects/color.c
+++ b/objects/color.c
@@ -482,9 +482,10 @@
/* Build free list */
if( COLOR_firstFree != -1 )
+ {
COLOR_FormatSystemPalette();
-
- COLOR_FillDefaultColors();
+ COLOR_FillDefaultColors();
+ }
/* create default palette (20 system colors) */
diff --git a/objects/cursoricon.c b/objects/cursoricon.c
index a3388af..df7be52 100644
--- a/objects/cursoricon.c
+++ b/objects/cursoricon.c
@@ -25,6 +25,7 @@
#include <string.h>
#include <stdlib.h>
#include "windows.h"
+#include "color.h"
#include "bitmap.h"
#include "callback.h"
#include "cursoricon.h"
@@ -430,34 +431,86 @@
/***********************************************************************
* CURSORICON_IconToCursor
*
- * Should convert bitmap to mono and truncate if too large
- * FIXME: if icon is passed returns a copy of OCR_DRAGOBJECT cursor
- * but should actually convert icon to cursor.
+ * Converts bitmap to mono and truncates if icon is too large
*/
-HCURSOR16 CURSORICON_IconToCursor(HICON16 hIcon)
+HCURSOR16 CURSORICON_IconToCursor(HICON16 hIcon, BOOL32 bSemiTransparent)
{
+ HCURSOR16 hRet = 0;
CURSORICONINFO *ptr = NULL;
+ HTASK16 hTask = GetCurrentTask();
+ TDB* pTask = (TDB *)GlobalLock16(hTask);
if(hIcon)
if (!(ptr = (CURSORICONINFO*)GlobalLock16( hIcon ))) return FALSE;
if (ptr->bPlanes * ptr->bBitsPerPixel == 1)
+ hRet = CURSORICON_Copy( pTask->hInstance, hIcon );
+ else
{
- return hIcon; /* assuming it's a cursor */
+ BYTE pAndBits[128];
+ BYTE pXorBits[128];
+ int x, y, ix, iy, shift;
+ int bpp = (ptr->bBitsPerPixel>=24)?32:ptr->bBitsPerPixel; /* this sucks */
+ BYTE* psPtr = (BYTE *)(ptr + 1) +
+ ptr->nHeight * BITMAP_WIDTH_BYTES(ptr->nWidth,1);
+ BYTE* pxbPtr = pXorBits;
+ unsigned *psc = NULL, val = 0;
+ unsigned val_base = 0xffffffff >> (32 - bpp);
+ BYTE* pbc = NULL;
+
+ COLORREF col;
+ CURSORICONINFO cI;
+
+ if(!pTask) return 0;
+
+ memset(pXorBits, 0, 128);
+ cI.bBitsPerPixel = 1; cI.bPlanes = 1;
+ cI.ptHotSpot.x = cI.ptHotSpot.y = 15;
+ cI.nWidth = 32; cI.nHeight = 32;
+ cI.nWidthBytes = 4; /* 1bpp */
+
+ x = (ptr->nWidth > 32) ? 32 : ptr->nWidth;
+ y = (ptr->nHeight > 32) ? 32 : ptr->nHeight;
+
+ for( iy = 0; iy < y; iy++ )
+ {
+ val = BITMAP_WIDTH_BYTES( ptr->nWidth, 1 );
+ memcpy( pAndBits + iy * 4,
+ (BYTE *)(ptr + 1) + iy * val, (val>4) ? 4 : val);
+ shift = iy % 2;
+
+ for( ix = 0; ix < x; ix++ )
+ {
+ if( bSemiTransparent && ((ix+shift)%2) )
+ {
+ pbc = pAndBits + iy * 4 + ix/8;
+ *pbc |= 0x80 >> (ix%8);
+ }
+ else
+ {
+ psc = (unsigned*)(psPtr + (ix * bpp)/8);
+ val = ((*psc) >> (ix * bpp)%8) & val_base;
+ col = COLOR_ToLogical(val);
+ if( GetRValue(col) > 0xa0 ||
+ GetGValue(col) > 0x80 ||
+ GetBValue(col) > 0xa0 )
+ {
+ pbc = pxbPtr + ix/8;
+ *pbc |= 0x80 >> (ix%8);
+ }
+ }
+ }
+ psPtr += ptr->nWidthBytes;
+ pxbPtr += 4;
+ }
+ hRet = CreateCursorIconIndirect( pTask->hInstance , &cI, pAndBits, pXorBits);
+
+ if( !hRet ) /* fall back on default drag cursor */
+ hRet = CURSORICON_Copy( pTask->hInstance ,
+ CURSORICON_Load(0,MAKEINTRESOURCE(OCR_DRAGOBJECT),
+ SYSMETRICS_CXCURSOR, SYSMETRICS_CYCURSOR, 1, TRUE) );
}
- else
- {
- /* kludge */
- TDB* pTask = (TDB *)GlobalLock16( GetCurrentTask() );
- if(!pTask) return 0;
-
- fprintf( stdnimp, "IconToCursor: Icons are not supported, returning default!\n");
- return CURSORICON_Copy( pTask->hInstance ,
- CURSORICON_Load(0,MAKEINTRESOURCE(OCR_DRAGOBJECT),
- SYSMETRICS_CXCURSOR, SYSMETRICS_CYCURSOR, 1, TRUE) );
- }
-
- return 0;
+ return hRet;
}
/***********************************************************************
@@ -627,9 +680,9 @@
if (hXorBits && hAndBits)
{
HBITMAP32 hBitTemp = SelectObject32( hMemDC, hAndBits );
- BitBlt( hdc, x, y, ptr->nWidth, ptr->nHeight, hMemDC, 0, 0, SRCAND );
+ BitBlt32( hdc, x, y, ptr->nWidth, ptr->nHeight, hMemDC, 0, 0, SRCAND );
SelectObject32( hMemDC, hXorBits );
- BitBlt( hdc, x, y, ptr->nWidth, ptr->nHeight, hMemDC, 0, 0, SRCINVERT);
+ BitBlt32(hdc, x, y, ptr->nWidth, ptr->nHeight, hMemDC, 0, 0,SRCINVERT);
SelectObject32( hMemDC, hBitTemp );
}
DeleteDC( hMemDC );
@@ -896,8 +949,8 @@
pt->x = pt->y = 0;
else
{
- pt->x = rootX + desktopX;
- pt->y = rootY + desktopY;
+ pt->x = childX;
+ pt->y = childY;
}
dprintf_cursor(stddeb, "GetCursorPos: ret=%d,%d\n", pt->x, pt->y );
}
diff --git a/objects/dib.c b/objects/dib.c
index 8ec1ce1..7a4fcf0 100644
--- a/objects/dib.c
+++ b/objects/dib.c
@@ -633,8 +633,8 @@
bits, info, wUsage );
hdcMem = CreateCompatibleDC( hdc );
hOldBitmap = SelectObject32( hdcMem, hBitmap );
- StretchBlt( hdc, xDest, yDest, wDestWidth, wDestHeight,
- hdcMem, xSrc, ySrc, wSrcWidth, wSrcHeight, dwRop );
+ StretchBlt32( hdc, xDest, yDest, wDestWidth, wDestHeight,
+ hdcMem, xSrc, ySrc, wSrcWidth, wSrcHeight, dwRop );
SelectObject32( hdcMem, hOldBitmap );
DeleteDC( hdcMem );
DeleteObject32( hBitmap );
diff --git a/objects/font.c b/objects/font.c
index 0c4f2fe..df3b109 100644
--- a/objects/font.c
+++ b/objects/font.c
@@ -339,6 +339,78 @@
return (DWORD)-1; /* failure */
}
+void
+FONT_LOGFONT32AToLOGFONT16(const LOGFONT32A *font,LPLOGFONT16 font16) {
+ font16->lfHeight = (INT16)font->lfHeight;
+ font16->lfWidth = (INT16)font->lfWidth;
+ font16->lfEscapement = (INT16)font->lfEscapement;
+ font16->lfOrientation = (INT16)font->lfOrientation;
+ font16->lfWeight = (INT16)font->lfWeight;
+ font16->lfItalic = font->lfItalic;
+ font16->lfUnderline = font->lfUnderline;
+ font16->lfStrikeOut = font->lfStrikeOut;
+ font16->lfCharSet = font->lfCharSet;
+ font16->lfOutPrecision = font->lfOutPrecision;
+ font16->lfClipPrecision = font->lfClipPrecision;
+ font16->lfQuality = font->lfQuality;
+ font16->lfPitchAndFamily = font->lfPitchAndFamily;
+ lstrcpyn32A( font16->lfFaceName, font->lfFaceName, LF_FACESIZE );
+}
+
+void
+FONT_LOGFONT32WToLOGFONT16(const LOGFONT32W *font,LPLOGFONT16 font16) {
+ font16->lfHeight = (INT16)font->lfHeight;
+ font16->lfWidth = (INT16)font->lfWidth;
+ font16->lfEscapement = (INT16)font->lfEscapement;
+ font16->lfOrientation = (INT16)font->lfOrientation;
+ font16->lfWeight = (INT16)font->lfWeight;
+ font16->lfItalic = font->lfItalic;
+ font16->lfUnderline = font->lfUnderline;
+ font16->lfStrikeOut = font->lfStrikeOut;
+ font16->lfCharSet = font->lfCharSet;
+ font16->lfOutPrecision = font->lfOutPrecision;
+ font16->lfClipPrecision = font->lfClipPrecision;
+ font16->lfQuality = font->lfQuality;
+ font16->lfPitchAndFamily = font->lfPitchAndFamily;
+ lstrcpynWtoA( font16->lfFaceName, font->lfFaceName, LF_FACESIZE );
+}
+
+void
+FONT_LOGFONT16ToLOGFONT32A(LPLOGFONT16 font,LPLOGFONT32A font32A) {
+ font32A->lfHeight = (INT32)font->lfHeight;
+ font32A->lfWidth = (INT32)font->lfWidth;
+ font32A->lfEscapement = (INT32)font->lfEscapement;
+ font32A->lfOrientation = (INT32)font->lfOrientation;
+ font32A->lfWeight = (INT32)font->lfWeight;
+ font32A->lfItalic = font->lfItalic;
+ font32A->lfUnderline = font->lfUnderline;
+ font32A->lfStrikeOut = font->lfStrikeOut;
+ font32A->lfCharSet = font->lfCharSet;
+ font32A->lfOutPrecision = font->lfOutPrecision;
+ font32A->lfClipPrecision = font->lfClipPrecision;
+ font32A->lfQuality = font->lfQuality;
+ font32A->lfPitchAndFamily = font->lfPitchAndFamily;
+ lstrcpyn32A( font32A->lfFaceName, font->lfFaceName, LF_FACESIZE );
+}
+
+void
+FONT_LOGFONT16ToLOGFONT32W(LPLOGFONT16 font,LPLOGFONT32W font32W) {
+ font32W->lfHeight = (INT32)font->lfHeight;
+ font32W->lfWidth = (INT32)font->lfWidth;
+ font32W->lfEscapement = (INT32)font->lfEscapement;
+ font32W->lfOrientation = (INT32)font->lfOrientation;
+ font32W->lfWeight = (INT32)font->lfWeight;
+ font32W->lfItalic = font->lfItalic;
+ font32W->lfUnderline = font->lfUnderline;
+ font32W->lfStrikeOut = font->lfStrikeOut;
+ font32W->lfCharSet = font->lfCharSet;
+ font32W->lfOutPrecision = font->lfOutPrecision;
+ font32W->lfClipPrecision = font->lfClipPrecision;
+ font32W->lfQuality = font->lfQuality;
+ font32W->lfPitchAndFamily = font->lfPitchAndFamily;
+ lstrcpynAtoW( font32W->lfFaceName, font->lfFaceName, LF_FACESIZE );
+}
+
/***********************************************************************
* CreateScalableFontResource (GDI.310)
@@ -387,20 +459,8 @@
{
LOGFONT16 font16;
- font16.lfHeight = (INT16)font->lfHeight;
- font16.lfWidth = (INT16)font->lfWidth;
- font16.lfEscapement = (INT16)font->lfEscapement;
- font16.lfOrientation = (INT16)font->lfOrientation;
- font16.lfWeight = (INT16)font->lfWeight;
- font16.lfItalic = font->lfItalic;
- font16.lfUnderline = font->lfUnderline;
- font16.lfStrikeOut = font->lfStrikeOut;
- font16.lfCharSet = font->lfCharSet;
- font16.lfOutPrecision = font->lfOutPrecision;
- font16.lfClipPrecision = font->lfClipPrecision;
- font16.lfQuality = font->lfQuality;
- font16.lfPitchAndFamily = font->lfPitchAndFamily;
- lstrcpyn32A( font16.lfFaceName, font->lfFaceName, LF_FACESIZE );
+ FONT_LOGFONT32AToLOGFONT16(font,&font16);
+
return CreateFontIndirect16( &font16 );
}
@@ -412,20 +472,7 @@
{
LOGFONT16 font16;
- font16.lfHeight = (INT16)font->lfHeight;
- font16.lfWidth = (INT16)font->lfWidth;
- font16.lfEscapement = (INT16)font->lfEscapement;
- font16.lfOrientation = (INT16)font->lfOrientation;
- font16.lfWeight = (INT16)font->lfWeight;
- font16.lfItalic = font->lfItalic;
- font16.lfUnderline = font->lfUnderline;
- font16.lfStrikeOut = font->lfStrikeOut;
- font16.lfCharSet = font->lfCharSet;
- font16.lfOutPrecision = font->lfOutPrecision;
- font16.lfClipPrecision = font->lfClipPrecision;
- font16.lfQuality = font->lfQuality;
- font16.lfPitchAndFamily = font->lfPitchAndFamily;
- lstrcpynWtoA( font16.lfFaceName, font->lfFaceName, LF_FACESIZE );
+ FONT_LOGFONT32WToLOGFONT16(font,&font16);
return CreateFontIndirect16( &font16 );
}
@@ -1224,7 +1271,7 @@
/*************************************************************************
* EnumFontFamilies [GDI.330]
*/
-INT EnumFontFamilies(HDC16 hDC, LPCSTR lpszFamily, FONTENUMPROC16 lpEnumFunc, LPARAM lpData)
+INT16 EnumFontFamilies16(HDC16 hDC, LPCSTR lpszFamily, FONTENUMPROC16 lpEnumFunc, LPARAM lpData)
{
HLOCAL16 hLog;
HLOCAL16 hMet;
@@ -1291,6 +1338,146 @@
}
/*************************************************************************
+ * EnumFontFamiliesA [GDI32.80]
+ */
+INT32 EnumFontFamilies32A(HDC32 hDC, LPCSTR lpszFamily, FONTENUMPROC32A lpEnumFunc, LPARAM lpData)
+{
+ HLOCAL16 hLog;
+ HLOCAL16 hMet;
+ HFONT32 hFont;
+ HFONT32 hOldFont;
+ LPENUMLOGFONT32A lpEnumLogFont;
+ LPTEXTMETRIC32A lptm;
+ LPSTR lpOldName;
+ char FaceName[LF_FACESIZE];
+ int nRet = 0;
+ int i;
+
+ dprintf_font(stddeb,"EnumFontFamilies32A(%04x, %p, %08lx, %08lx)\n",
+ hDC, lpszFamily, (DWORD)lpEnumFunc, lpData);
+ if (lpEnumFunc == 0) return 0;
+ hLog = GDI_HEAP_ALLOC( sizeof(ENUMLOGFONT32A) );
+ lpEnumLogFont = (LPENUMLOGFONT32A) GDI_HEAP_LIN_ADDR(hLog);
+ if (lpEnumLogFont == NULL) {
+ fprintf(stderr,"EnumFontFamilies // can't alloc LOGFONT struct !\n");
+ return 0;
+ }
+ hMet = GDI_HEAP_ALLOC( sizeof(TEXTMETRIC32A) );
+ lptm = (LPTEXTMETRIC32A) GDI_HEAP_LIN_ADDR(hMet);
+ if (lptm == NULL) {
+ GDI_HEAP_FREE(hLog);
+ fprintf(stderr,"EnumFontFamilies32A // can't alloc TEXTMETRIC struct !\n");
+ return 0;
+ }
+ lpOldName = NULL;
+ if (lpszFamily != NULL) {
+ strcpy(FaceName, lpszFamily);
+ AnsiUpper(FaceName);
+ }
+ if (lpLogFontList[0] == NULL) InitFontsList();
+ for(i = 0; lpLogFontList[i] != NULL; i++) {
+ if (lpszFamily == NULL) {
+ if (lpOldName != NULL) {
+ if (strcmp(lpOldName,lpLogFontList[i]->lfFaceName) == 0) continue;
+ }
+ lpOldName = lpLogFontList[i]->lfFaceName;
+ } else {
+ if (strcmp(FaceName, lpLogFontList[i]->lfFaceName) != 0) continue;
+ }
+ FONT_LOGFONT16ToLOGFONT32A(lpLogFontList[i],&(lpEnumLogFont->elfLogFont));
+ strcpy(lpEnumLogFont->elfFullName,"");
+ strcpy(lpEnumLogFont->elfStyle,"");
+ hFont = CreateFontIndirect32A((LPLOGFONT32A)lpEnumLogFont);
+ hOldFont = SelectObject32(hDC, hFont);
+ GetTextMetrics32A(hDC, lptm);
+ SelectObject32(hDC, hOldFont);
+ DeleteObject32(hFont);
+ dprintf_font(stddeb, "EnumFontFamilies32A // i=%d lpLogFont=%p lptm=%p\n", i, lpEnumLogFont, lptm);
+
+ nRet = lpEnumFunc( GDI_HEAP_LIN_ADDR(hLog), GDI_HEAP_LIN_ADDR(hMet),
+ 0, lpData );
+ if (nRet == 0) {
+ dprintf_font(stddeb,"EnumFontFamilies32A // EnumEnd requested by application !\n");
+ break;
+ }
+ }
+ GDI_HEAP_FREE(hMet);
+ GDI_HEAP_FREE(hLog);
+ return nRet;
+}
+
+/*************************************************************************
+ * EnumFontFamiliesW [GDI32.83]
+ */
+INT32 EnumFontFamilies32W(HDC32 hDC, LPCWSTR lpszFamilyW, FONTENUMPROC32W lpEnumFunc, LPARAM lpData)
+{
+ HLOCAL16 hLog;
+ HLOCAL16 hMet;
+ HFONT32 hFont;
+ HFONT32 hOldFont;
+ LPENUMLOGFONT32W lpEnumLogFont;
+ LPTEXTMETRIC32W lptm;
+ LPSTR lpOldName;
+ char FaceName[LF_FACESIZE];
+ int nRet = 0;
+ int i;
+ LPCSTR lpszFamily=lpszFamilyW?STRING32_DupUniToAnsi(lpszFamilyW):NULL;
+
+ dprintf_font(stddeb,"EnumFontFamilies32W(%04x, %p, %08lx, %08lx)\n",
+ hDC, lpszFamily, (DWORD)lpEnumFunc, lpData);
+ if (lpEnumFunc == 0) return 0;
+ hLog = GDI_HEAP_ALLOC( sizeof(ENUMLOGFONT32W) );
+ lpEnumLogFont = (LPENUMLOGFONT32W) GDI_HEAP_LIN_ADDR(hLog);
+ if (lpEnumLogFont == NULL) {
+ fprintf(stderr,"EnumFontFamilies32W // can't alloc LOGFONT struct !\n");
+ return 0;
+ }
+ hMet = GDI_HEAP_ALLOC( sizeof(TEXTMETRIC32W) );
+ lptm = (LPTEXTMETRIC32W) GDI_HEAP_LIN_ADDR(hMet);
+ if (lptm == NULL) {
+ GDI_HEAP_FREE(hLog);
+ fprintf(stderr,"EnumFontFamilies32W // can't alloc TEXTMETRIC struct !\n");
+ return 0;
+ }
+ lpOldName = NULL;
+ if (lpszFamily != NULL) {
+ strcpy(FaceName, lpszFamily);
+ AnsiUpper(FaceName);
+ }
+ if (lpLogFontList[0] == NULL) InitFontsList();
+ for(i = 0; lpLogFontList[i] != NULL; i++) {
+ if (lpszFamily == NULL) {
+ if (lpOldName != NULL) {
+ if (strcmp(lpOldName,lpLogFontList[i]->lfFaceName) == 0) continue;
+ }
+ lpOldName = lpLogFontList[i]->lfFaceName;
+ } else {
+ if (strcmp(FaceName, lpLogFontList[i]->lfFaceName) != 0) continue;
+ }
+ FONT_LOGFONT16ToLOGFONT32W(lpLogFontList[i],&(lpEnumLogFont->elfLogFont));
+ lstrcpynAtoW(lpEnumLogFont->elfFullName,"",1);
+ lstrcpynAtoW(lpEnumLogFont->elfStyle,"",1);
+ hFont = CreateFontIndirect32W((LPLOGFONT32W)lpEnumLogFont);
+ hOldFont = SelectObject32(hDC, hFont);
+ GetTextMetrics32W(hDC, lptm);
+ SelectObject32(hDC, hOldFont);
+ DeleteObject32(hFont);
+ dprintf_font(stddeb, "EnumFontFamilies32W // i=%d lpLogFont=%p lptm=%p\n", i, lpEnumLogFont, lptm);
+
+ nRet = lpEnumFunc( GDI_HEAP_LIN_ADDR(hLog), GDI_HEAP_LIN_ADDR(hMet),
+ 0, lpData );
+ if (nRet == 0) {
+ dprintf_font(stddeb,"EnumFontFamilies32W // EnumEnd requested by application !\n");
+ break;
+ }
+ }
+ GDI_HEAP_FREE(hMet);
+ GDI_HEAP_FREE(hLog);
+ return nRet;
+}
+
+
+/*************************************************************************
* GetRasterizerCaps [GDI.313]
*/
diff --git a/objects/metafile.c b/objects/metafile.c
index ad885d6..65e5484 100644
--- a/objects/metafile.c
+++ b/objects/metafile.c
@@ -522,9 +522,9 @@
break;
case META_PATBLT:
- PatBlt(hdc, *(mr->rdParam + 5), *(mr->rdParam + 4),
- *(mr->rdParam + 3), *(mr->rdParam + 2),
- MAKELONG(*(mr->rdParam), *(mr->rdParam + 1)));
+ PatBlt16(hdc, *(mr->rdParam + 5), *(mr->rdParam + 4),
+ *(mr->rdParam + 3), *(mr->rdParam + 2),
+ MAKELONG(*(mr->rdParam), *(mr->rdParam + 1)));
break;
case META_SAVEDC:
@@ -705,7 +705,7 @@
mr->rdParam[14], /*BitsPixel*/
(LPSTR)&mr->rdParam[15]); /*bits*/
SelectObject32(hdcSrc,hbitmap);
- StretchBlt(hdc,mr->rdParam[9],mr->rdParam[8],
+ StretchBlt32(hdc,mr->rdParam[9],mr->rdParam[8],
mr->rdParam[7],mr->rdParam[6],
hdcSrc,mr->rdParam[5],mr->rdParam[4],
mr->rdParam[3],mr->rdParam[2],
@@ -721,11 +721,10 @@
mr->rdParam[10]/*Planes*/,mr->rdParam[11]/*BitsPixel*/,
(LPSTR)&mr->rdParam[12]/*bits*/);
SelectObject32(hdcSrc,hbitmap);
- BitBlt(hdc,mr->rdParam[6],mr->rdParam[5],
- mr->rdParam[4],mr->rdParam[3],
- hdcSrc,
- mr->rdParam[2],mr->rdParam[1],
- MAKELONG(0,mr->rdParam[0]));
+ BitBlt32(hdc,mr->rdParam[6],mr->rdParam[5],
+ mr->rdParam[4],mr->rdParam[3],
+ hdcSrc, mr->rdParam[2],mr->rdParam[1],
+ MAKELONG(0,mr->rdParam[0]));
DeleteDC(hdcSrc);
}
break;
@@ -1157,16 +1156,14 @@
* MF_BitBlt
*/
BOOL32 MF_BitBlt(DC *dcDest, short xDest, short yDest, short width,
- short height, HDC16 hdcSrc, short xSrc, short ySrc, DWORD rop)
+ short height, DC *dcSrc, short xSrc, short ySrc, DWORD rop)
{
BOOL32 ret;
DWORD len;
HGLOBAL16 hmr;
METARECORD *mr;
- DC *dcSrc;
BITMAP16 BM;
- if (!(dcSrc = (DC *) GDI_GetObjPtr( hdcSrc, DC_MAGIC ))) return 0;
GetObject16(dcSrc->w.hBitmap, sizeof(BITMAP16), &BM);
len = sizeof(METARECORD) + 12 * sizeof(INT16) + BM.bmWidthBytes * BM.bmHeight;
if (!(hmr = GlobalAlloc16(GMEM_MOVEABLE, len)))
@@ -1207,20 +1204,18 @@
#define STRETCH_VIA_DIB
#undef STRETCH_VIA_DIB
BOOL32 MF_StretchBlt(DC *dcDest, short xDest, short yDest, short widthDest,
- short heightDest, HDC16 hdcSrc, short xSrc, short ySrc,
+ short heightDest, DC *dcSrc, short xSrc, short ySrc,
short widthSrc, short heightSrc, DWORD rop)
{
BOOL32 ret;
DWORD len;
HGLOBAL16 hmr;
METARECORD *mr;
- DC *dcSrc;
BITMAP16 BM;
#ifdef STRETCH_VIA_DIB
LPBITMAPINFOHEADER lpBMI;
WORD nBPP;
#endif
- if (!(dcSrc = (DC *) GDI_GetObjPtr( hdcSrc, DC_MAGIC ))) return 0;
GetObject16(dcSrc->w.hBitmap, sizeof(BITMAP16), &BM);
#ifdef STRETCH_VIA_DIB
nBPP = BM.bmPlanes * BM.bmBitsPixel;
@@ -1240,8 +1235,8 @@
lpBMI->biClrUsed = nBPP != 24 ? 1 << nBPP : 0;
lpBMI->biSizeImage = ((lpBMI->biWidth * nBPP + 31) / 32) * 4 * lpBMI->biHeight;
lpBMI->biCompression = BI_RGB;
- lpBMI->biXPelsPerMeter = MulDiv32(GetDeviceCaps(hdcSrc,LOGPIXELSX),3937,100);
- lpBMI->biYPelsPerMeter = MulDiv32(GetDeviceCaps(hdcSrc,LOGPIXELSY),3937,100);
+ lpBMI->biXPelsPerMeter = MulDiv32(GetDeviceCaps(dcSrc->hSelf,LOGPIXELSX),3937,100);
+ lpBMI->biYPelsPerMeter = MulDiv32(GetDeviceCaps(dcSrc->hSelf,LOGPIXELSY),3937,100);
lpBMI->biClrImportant = 0; /* 1 meter = 39.37 inch */
dprintf_metafile(stddeb,"MF_StretchBltViaDIB->len = %ld rop=%lx PixYPM=%ld Caps=%d\n",
diff --git a/objects/palette.c b/objects/palette.c
index 39a1ae7..7a67571 100644
--- a/objects/palette.c
+++ b/objects/palette.c
@@ -9,8 +9,10 @@
#include <string.h>
#include <X11/Xlib.h>
+#include "gdi.h"
#include "color.h"
#include "palette.h"
+#include "xmalloc.h"
#include "stddebug.h"
/* #define DEBUG_PALETTE */
#include "debug.h"
@@ -120,12 +122,38 @@
*/
BOOL ResizePalette(HPALETTE16 hPal, UINT cEntries)
{
+ PALETTEOBJ * palPtr = (PALETTEOBJ *) GDI_GetObjPtr( hPal, PALETTE_MAGIC );
+ UINT cPrevEnt, prevVer;
+ int prevsize, size = sizeof(LOGPALETTE) + (cEntries - 1) * sizeof(PALETTEENTRY);
+ int* mapping = NULL;
- /* should simply realloc memory and zero out
- * added entries, if any */
+ dprintf_palette(stddeb,"ResizePalette: hpal = %04x, prev = %i, new = %i\n",
+ hPal, (palPtr)? -1: palPtr->logpalette.palNumEntries, cEntries );
+ if( !palPtr ) return FALSE;
+ cPrevEnt = palPtr->logpalette.palNumEntries;
+ prevVer = palPtr->logpalette.palVersion;
+ prevsize = sizeof(LOGPALETTE) + (cPrevEnt - 1) * sizeof(PALETTEENTRY) +
+ sizeof(int*) + sizeof(GDIOBJHDR);
+ size += sizeof(int*) + sizeof(GDIOBJHDR);
+ mapping = palPtr->mapping;
- fprintf(stdnimp,"ResizePalette: empty stub! \n");
- return FALSE;
+ GDI_HEAP_REALLOC( hPal, size );
+ palPtr = (PALETTEOBJ *) GDI_GetObjPtr( hPal, PALETTE_MAGIC );
+ if( !palPtr ) return FALSE;
+
+ if( mapping )
+ palPtr->mapping = (int*) xrealloc( mapping, cEntries * sizeof(int) );
+ if( cEntries > cPrevEnt )
+ {
+ if( mapping )
+ memset(palPtr->mapping + cPrevEnt, 0, (cEntries - cPrevEnt)*sizeof(int));
+ memset( (BYTE*)palPtr + prevsize, 0, size - prevsize );
+ PALETTE_ValidateFlags((PALETTEENTRY*)((BYTE*)palPtr + prevsize),
+ cEntries - cPrevEnt );
+ }
+ palPtr->logpalette.palNumEntries = cEntries;
+ palPtr->logpalette.palVersion = prevVer;
+ return TRUE;
}
/***********************************************************************
diff --git a/objects/region.c b/objects/region.c
index 4404062..40dae541 100644
--- a/objects/region.c
+++ b/objects/region.c
@@ -487,7 +487,7 @@
*
* Add rectangle to region
*/
-BOOL32 REGION_UnionRectWithRgn( HRGN32 hRgn, LPRECT16 rc )
+BOOL32 REGION_UnionRectWithRgn( HRGN32 hRgn, const RECT32 *rc )
{
RGNOBJ *rgnObj = (RGNOBJ*) GDI_GetObjPtr( hRgn, REGION_MAGIC );
XRectangle rect = { rc->left, rc->top, rc->right - rc->left, rc->bottom - rc->top };
diff --git a/objects/text.c b/objects/text.c
index 1862afe..782fe70 100644
--- a/objects/text.c
+++ b/objects/text.c
@@ -447,17 +447,9 @@
if (flags & ETO_CLIPPED)
{
- if (dc->w.flags & DC_MEMORY)
- {
- hRgnClip = dc->w.hClipRgn;
- CLIPPING_IntersectClipRect(dc, rect.left, rect.top, rect.right, rect.bottom,
- CLIP_INTERSECT | CLIP_KEEPRGN);
- }
- else
- {
- SaveVisRgn( hdc );
- IntersectVisRect( hdc, rect.left, rect.top, rect.right, rect.bottom );
- }
+ hRgnClip = dc->w.hClipRgn;
+ CLIPPING_IntersectClipRect( dc, rect.left, rect.top, rect.right,
+ rect.bottom, CLIP_INTERSECT|CLIP_KEEPRGN );
}
/* Draw the text background if necessary */
@@ -565,11 +557,7 @@
dc->w.DCOrgX + x + info.width, dc->w.DCOrgY + y - lineAscent );
}
- if (flags & ETO_CLIPPED)
- {
- if (dc->w.flags & DC_MEMORY) SelectClipRgn16( hdc, hRgnClip );
- else RestoreVisRgn( hdc );
- }
+ if (flags & ETO_CLIPPED) SelectClipRgn32( hdc, hRgnClip );
return TRUE;
}
diff --git a/programs/progman/Makefile.in b/programs/progman/Makefile.in
index ddf06ce..ea2e954 100644
--- a/programs/progman/Makefile.in
+++ b/programs/progman/Makefile.in
@@ -6,6 +6,7 @@
PROGRAMS = progman
ALL_LIBS = $(WINELIB) $(X_LIBS) $(XPM_LIB) $(XLIB) $(LDLIBS)
DEFS = -I$(SRCDIR)
+RCFLAGS = -w32
LANGUAGES = En De Fr Fi
LICENSELANG = En
diff --git a/programs/winhelp/Makefile.in b/programs/winhelp/Makefile.in
index cb6a691..d70b716 100644
--- a/programs/winhelp/Makefile.in
+++ b/programs/winhelp/Makefile.in
@@ -5,6 +5,7 @@
MODULE = none
PROGRAMS = winhelp hlp2sgml
ALL_LIBS = $(WINELIB) $(X_LIBS) $(XPM_LIB) $(XLIB) $(LDLIBS)
+RCFLAGS = -w32
LANGUAGES = En De Fr Fi
diff --git a/rc/winerc.c b/rc/winerc.c
index 43a27f3..63a9f4e 100644
--- a/rc/winerc.c
+++ b/rc/winerc.c
@@ -21,11 +21,12 @@
" -d Output debugging information\n"
" -p prefix Give a prefix for the generated names\n"
" -v Show each resource as it is processed\n"
- " -o file Output to file.c and file.h\n";
-
+ " -o file Output to file.c and file.h\n"
+ " -w 16|32 Select win16 or win32 output\n";
/*might be overwritten by command line*/
char *prefix="_Resource";
+int win32=1;
int verbose,constant;
gen_res* g_start;
FILE *header,*code;
@@ -55,7 +56,7 @@
char* tmpc;
int optc,lose,ret,binary;
lose=binary=0;
- while((optc=getopt(argc,argv,"bcdp:vo:"))!=EOF)
+ while((optc=getopt(argc,argv,"bcdp:vo:w:"))!=EOF)
switch(optc)
{
/* bison will print state transitions on stderr */
@@ -76,6 +77,10 @@
setbuf(stderr,0);
break;
case 'o':set_out_file(optarg);break;
+ case 'w':if(!strcmp(optarg,"16"))win32=0;
+ else if(!strcmp(optarg,"32"))win32=1;
+ else lose++;
+ break;
default: lose++;break;
}
if(lose)return fprintf(stderr,usage),1;
@@ -195,6 +200,35 @@
return res;
}
+/* insert string into res, starting at start */
+gen_res* insert_string(gen_res* res,unsigned char* string,int start,int terminating0)
+{
+ unsigned char* p;
+ int lengthA = strlen(string) + (terminating0 ? 1 : 0);
+ int length = (win32 ? 2 : 1) * lengthA;
+ while(res->size+length>res->space)res=grow(res);
+ save_memcpy(res->res+start+length,res->res+start,res->size-start);
+ p=res->res+start;
+ while(lengthA--)
+ if (win32)
+ {
+ put_WORD(p, *string++);
+ p+=2;
+ }
+ else
+ *p++=*string++;
+ res->size+=length;
+ return res;
+}
+
+/* insert string at offset 0, increase num_entries */
+gen_res* insert_string_at_beginning(gen_res* res,char* entry,int terminating0)
+{
+ res=insert_string(res,entry,0,terminating0);
+ res->num_entries++;
+ return res;
+}
+
/*delete len bytes from res, starting at start*/
gen_res* delete_bytes(gen_res* res,int start,int len)
{
@@ -253,7 +287,7 @@
/* create a new dialog header, set all items to 0 */
gen_res* new_dialog()
{ gen_res* ret=new_res();
- ret->size=16; /*all strings "\0", no font*/
+ ret->size=win32?24:16; /*all strings "\0", no font*/
return ret;
}
@@ -266,18 +300,18 @@
return attr;
}
-/* menu name is at offset 13 */
+/* menu name is at offset 13 (win32: 18) */
int dialog_get_menu(gen_res* attr)
{
- return 13;
+ return win32?18:13;
}
/* the class is after the menu name */
int dialog_get_class(gen_res* attr)
{
int offs=dialog_get_menu(attr);
- while(attr->res[offs])offs++;
- offs++;
+ while(attr->res[offs]||(win32&&attr->res[offs+1]))offs+=win32?2:1;
+ offs+=win32?2:1;
return offs;
}
@@ -285,8 +319,8 @@
int dialog_get_caption(gen_res* attr)
{
int offs=dialog_get_class(attr);
- while(attr->res[offs])offs++;
- offs++;
+ while(attr->res[offs]||(win32&&attr->res[offs+1]))offs+=win32?2:1;
+ offs+=win32?2:1;
return offs;
}
@@ -294,8 +328,8 @@
int dialog_get_fontsize(gen_res* attr)
{
int offs=dialog_get_caption(attr);
- while(attr->res[offs])offs++;
- offs++;
+ while(attr->res[offs]||(win32&&attr->res[offs+1]))offs+=win32?2:1;
+ offs+=win32?2:1;
return offs;
}
@@ -304,7 +338,7 @@
gen_res* dialog_caption(char* cap, gen_res*attr)
{
/* we don't need the terminating 0 as it's already there */
- return insert_bytes(attr,cap,dialog_get_caption(attr),strlen(cap));
+ return insert_string(attr,cap,dialog_get_caption(attr),0);
}
@@ -318,31 +352,47 @@
attr=insert_bytes(attr,c_size,offs,2);
offs+=2;
/* as there is no font name by default, copy the '\0' */
- return insert_bytes(attr,font,offs,strlen(font)+1);
+ return insert_string(attr,font,offs,1);
}
gen_res* dialog_class(char* cap, gen_res*attr)
{
- return insert_bytes(attr,cap,dialog_get_class(attr),strlen(cap));
+ return insert_string(attr,cap,dialog_get_class(attr),0);
}
gen_res* dialog_menu(char* cap, gen_res*attr)
{
- return insert_bytes(attr,cap,dialog_get_menu(attr),strlen(cap));
+ return insert_string(attr,cap,dialog_get_menu(attr),0);
}
/* set the dialogs id, position, extent, and style */
gen_res* create_control_desc(int id,int x,int y,int cx, int cy,rc_style *style)
{ gen_res* ret=new_res();
int s=WS_VISIBLE|WS_CHILD; /*defaults styles for any control*/
- put_WORD(ret->res+0,x);
- put_WORD(ret->res+2,y);
- put_WORD(ret->res+4,cx);
- put_WORD(ret->res+6,cy);
- put_WORD(ret->res+8,id);
- if(style)s=(s|style->or)&style->and;
- put_DWORD(ret->res+10,s);
- ret->size=17; /*empty strings, unused byte*/
+ if(win32)
+ {
+ if(style)s=(s|style->or)&style->and;
+ put_DWORD(ret->res+0,s);
+ /* FIXME */
+ /* put_WORD(ret->res+4, exStyle); */
+ put_WORD(ret->res+8,x);
+ put_WORD(ret->res+10,y);
+ put_WORD(ret->res+12,cx);
+ put_WORD(ret->res+14,cy);
+ put_WORD(ret->res+16,id);
+ ret->size=24; /*empty strings, unused byte*/
+ }
+ else
+ {
+ put_WORD(ret->res+0,x);
+ put_WORD(ret->res+2,y);
+ put_WORD(ret->res+4,cx);
+ put_WORD(ret->res+6,cy);
+ put_WORD(ret->res+8,id);
+ if(style)s=(s|style->or)&style->and;
+ put_DWORD(ret->res+10,s);
+ ret->size=17; /*empty strings, unused byte*/
+ }
return ret;
}
@@ -350,45 +400,99 @@
gen_res* label_control_desc(char* label,gen_res* cd)
{
int offs;
- if(cd->res[14]&0x80)offs=15; /* one-character class */
- else {
- for(offs=14;cd->res[offs];offs++);
- offs++;
+ if(win32) {
+ if(get_WORD(cd->res+18)==0xffff)offs=20; /* one-character class */
+ else {
+ for(offs=18;get_WORD(cd->res+offs);offs+=2);
+ offs+=2;
+ }
}
- return insert_bytes(cd,label,offs,strlen(label));
+ else {
+ if(cd->res[14]&0x80)offs=15; /* one-character class */
+ else {
+ for(offs=14;cd->res[offs];offs++);
+ offs++;
+ }
+ }
+ return insert_string(cd,label,offs,0);
}
/* a CONTROL was specified */
gen_res* create_generic_control(char* label,int id,char* class,
rc_style*style,int x,int y,int cx,int cy)
-{ char cl;
- gen_res* ret=new_res();
- put_WORD(ret->res+0,x);
- put_WORD(ret->res+2,y);
- put_WORD(ret->res+4,cx);
- put_WORD(ret->res+6,cy);
- put_WORD(ret->res+8,id);
- put_DWORD(ret->res+10,style->or);
- ret->size=17;
- ret=insert_bytes(ret,label,15,strlen(label));
- /* is it a predefined class? */
- cl=0;
- if(!strcmp(class,"BUTTON"))cl=CT_BUTTON;
- if(!strcmp(class,"EDIT"))cl=CT_EDIT;
- if(!strcmp(class,"STATIC"))cl=CT_STATIC;
- if(!strcmp(class,"LISTBOX"))cl=CT_LISTBOX;
- if(!strcmp(class,"SCROLLBAR"))cl=CT_SCROLLBAR;
- if(!strcmp(class,"COMBOBOX"))cl=CT_COMBOBOX;
- if(cl)ret->res[14]=cl;
- else ret=insert_bytes(ret,class,14,strlen(class));
+{ gen_res* ret=new_res();
+ if(win32)
+ {
+ WORD cl;
+ put_DWORD(ret->res+0,style->or);
+ /* FIXME */
+ /* put_DWORD(ret->res+4,exstyle->or); */
+ put_WORD(ret->res+8,x);
+ put_WORD(ret->res+10,y);
+ put_WORD(ret->res+12,cx);
+ put_WORD(ret->res+14,cy);
+ put_WORD(ret->res+16,id);
+ ret->size=win32?24:17;
+ ret=insert_string(ret,label,20,0);
+ /* is it a predefined class? */
+ cl=0;
+ if(!strcmp(class,"BUTTON"))cl=CT_BUTTON;
+ if(!strcmp(class,"EDIT"))cl=CT_EDIT;
+ if(!strcmp(class,"STATIC"))cl=CT_STATIC;
+ if(!strcmp(class,"LISTBOX"))cl=CT_LISTBOX;
+ if(!strcmp(class,"SCROLLBAR"))cl=CT_SCROLLBAR;
+ if(!strcmp(class,"COMBOBOX"))cl=CT_COMBOBOX;
+ if(cl) {
+ char ffff[2]={0xff, 0xff};
+ ret=insert_bytes(ret,ffff,18,2);
+ put_WORD(ret->res+20,cl);
+ }
+ else ret=insert_string(ret,class,18,0);
+ }
+ else
+ {
+ char cl;
+ put_WORD(ret->res+0,x);
+ put_WORD(ret->res+2,y);
+ put_WORD(ret->res+4,cx);
+ put_WORD(ret->res+6,cy);
+ put_WORD(ret->res+8,id);
+ put_DWORD(ret->res+10,style->or);
+ ret->size=17;
+ ret=insert_string(ret,label,15,0);
+ /* is it a predefined class? */
+ cl=0;
+ if(!strcmp(class,"BUTTON"))cl=CT_BUTTON;
+ if(!strcmp(class,"EDIT"))cl=CT_EDIT;
+ if(!strcmp(class,"STATIC"))cl=CT_STATIC;
+ if(!strcmp(class,"LISTBOX"))cl=CT_LISTBOX;
+ if(!strcmp(class,"SCROLLBAR"))cl=CT_SCROLLBAR;
+ if(!strcmp(class,"COMBOBOX"))cl=CT_COMBOBOX;
+ if(cl)ret->res[14]=cl;
+ else ret=insert_string(ret,class,14,0);
+ }
return ret;
}
/* insert cd into rest, set the type, add flags */
gen_res* add_control(int type,int flags,gen_res*cd,gen_res* rest)
{
- put_DWORD(cd->res+10,get_DWORD(cd->res+10)|flags);
- cd->res[14]=type;
+ char zeros[4]={0,0,0,0};
+ if(win32)
+ {
+ char ffff[2]={0xff, 0xff};
+ put_DWORD(cd->res+0,get_DWORD(cd->res+0)|flags);
+ cd=insert_bytes(cd,ffff,18,2);
+ put_WORD(cd->res+20,type);
+ }
+ else
+ {
+ put_DWORD(cd->res+10,get_DWORD(cd->res+10)|flags);
+ cd->res[14]=type;
+ }
+ /* WIN32: First control is on dword boundary */
+ if(win32 && cd->size%4)
+ cd=insert_bytes(cd,zeros,cd->size,4-cd->size%4);
return insert_at_beginning(rest,cd->res,cd->size);
}
@@ -412,12 +516,28 @@
Set position and extent */
gen_res* make_dialog(gen_res* header,int x,int y,int cx,int cy,gen_res* ctls)
{
- header->res[4]=ctls->num_entries;
- header->type=dlg;
- put_WORD(header->res+5,x);
- put_WORD(header->res+7,y);
- put_WORD(header->res+9,cx);
- put_WORD(header->res+11,cy);
+ char zeros[4]={0,0,0,0};
+ if(win32)
+ {
+ put_WORD(header->res+8, ctls->num_entries);
+ header->type=dlg;
+ put_WORD(header->res+10,x);
+ put_WORD(header->res+12,y);
+ put_WORD(header->res+14,cx);
+ put_WORD(header->res+16,cy);
+ }
+ else
+ {
+ header->res[4]=ctls->num_entries;
+ header->type=dlg;
+ put_WORD(header->res+5,x);
+ put_WORD(header->res+7,y);
+ put_WORD(header->res+9,cx);
+ put_WORD(header->res+11,cy);
+ }
+ /* WIN32: First control is on dword boundary */
+ if(win32 && header->size%4)
+ header=insert_bytes(header,zeros,header->size,4-header->size%4);
return insert_bytes(header,ctls->res,header->size,ctls->size);
}
@@ -473,7 +593,7 @@
if(res->num_entries==0)flags|=MF_END;
put_WORD(item,flags);
put_WORD(item+2,id);
- res=insert_at_beginning(res,name,strlen(name)+1);
+ res=insert_string_at_beginning(res,name,1);
res=insert_bytes(res,item,0,4);
return res;
}
@@ -486,7 +606,7 @@
if(res->num_entries==0)flags|=MF_END;
put_WORD(c_flags,flags);
res=insert_at_beginning(res,body->res,body->size);
- res=insert_bytes(res,name,0,strlen(name)+1);
+ res=insert_string(res,name,0,1);
res=insert_bytes(res,c_flags,0,2);
return res;
}
@@ -543,27 +663,45 @@
int size,i;
gen_res* res;
unsigned char* p;
- char* q;
+ unsigned char* q;
if(!string_table) return t;
for(ste=string_table; ste; ste=ste->next)
{
for(size=0,i=0; i<16; i++)
- size += ste->strings[i] ? strlen(ste->strings[i])+1 : 1;
+ size += (win32 ? 2 : 1) * (ste->strings[i] ? strlen(ste->strings[i])+1 : 1);
res=new_res();
while(res->space<size)res=grow(res);
res->type=str;
res->n.i_name=ste->group;
res->n_type=0;
res->size=size;
- for(p=res->res,i=0; i<16; i++)
- if((q=ste->strings[i])==NULL)
- *p++ = 0;
- else
- {
- *p++ = strlen(q);
- while(*q) *p++ = *q++;
- }
+ if (win32)
+ for(p=res->res,i=0; i<16; i++)
+ if((q=ste->strings[i])==NULL)
+ {
+ put_WORD(p, 0);
+ p+=2;
+ }
+ else
+ {
+ put_WORD(p, strlen(q));
+ p+=2;
+ while(*q)
+ {
+ put_WORD(p, *q++);
+ p+=2;
+ }
+ }
+ else
+ for(p=res->res,i=0; i<16; i++)
+ if((q=ste->strings[i])==NULL)
+ *p++ = 0;
+ else
+ {
+ *p++ = strlen(q);
+ while(*q) *p++ = *q++;
+ }
t=add_resource(res,t);
}
return t;
@@ -628,8 +766,9 @@
for(it=top;it;it=it->next)
{
int i;
- fprintf( code, "static %sunsigned char %s__bytes[] = {\n",
- ISCONSTANT, get_resource_name(it) );
+ fprintf( code, "static %sunsigned char %s__bytes[]%s = {\n",
+ ISCONSTANT, get_resource_name(it),
+ win32?"\n__attribute__ ((aligned (4)))":"");
for (i=0;i<it->size-1;i++)
{
fprintf(code,"0x%02x, ",it->res[i]);
@@ -638,6 +777,25 @@
fprintf(code,"0x%02x };\n\n",it->res[i]);
}
+ /* Print the resources names */
+
+ if (win32)
+ for(it=top;it;it=it->next)
+ {
+ int i;
+ char s_buffer[20], *s_name=s_buffer;
+ if(it->n_type) s_name=it->n.s_name;
+ else sprintf(s_name,"@%d",it->n.i_name);
+ fprintf( code, "static %sunsigned char %s__name[] = {\n",
+ ISCONSTANT, get_resource_name(it) );
+ for (i=0;*s_name;i++,s_name++)
+ {
+ fprintf(code,"0x%02x, 0x00, ",*s_name);
+ if ((i&3)==3)fputc('\n',code);
+ }
+ fprintf(code,"0x00, 0x00};\n\n");
+ }
+
/* Print the resources */
for (it=top;it;it=it->next)
{
@@ -655,14 +813,28 @@
case str:type=(int)RT_STRING;break;
default:fprintf(stderr,"Unknown restype\n");type=-1;break;
}
- if(it->n_type)
- fprintf(code,"%sstruct resource %s = {0,%d,\"%s\",%s__bytes,%d};\n",
- ISCONSTANT, get_resource_name(it), type, it->n.s_name,
- get_resource_name(it), it->size );
- else
- fprintf(code,"%sstruct resource %s = {%d,%d,\"@%d\",%s__bytes,%d};\n",
- ISCONSTANT, get_resource_name(it), it->n.i_name, type,
- it->n.i_name, get_resource_name(it), it->size );
+ if(win32)
+ {
+ if(it->n_type)
+ fprintf(code,"%sstruct resource %s = {0,%d,%s__name,%s__bytes,%d};\n",
+ ISCONSTANT, get_resource_name(it), type, get_resource_name(it),
+ get_resource_name(it), it->size );
+ else
+ fprintf(code,"%sstruct resource %s = {%d,%d,%s__name,%s__bytes,%d};\n",
+ ISCONSTANT, get_resource_name(it), it->n.i_name, type,
+ get_resource_name(it), get_resource_name(it), it->size );
+ }
+ else
+ {
+ if(it->n_type)
+ fprintf(code,"%sstruct resource %s = {0,%d,\"%s\",%s__bytes,%d};\n",
+ ISCONSTANT, get_resource_name(it), type, it->n.s_name,
+ get_resource_name(it), it->size );
+ else
+ fprintf(code,"%sstruct resource %s = {%d,%d,\"@%d\",%s__bytes,%d};\n",
+ ISCONSTANT, get_resource_name(it), it->n.i_name, type,
+ it->n.i_name, get_resource_name(it), it->size );
+ }
}
/* Print the resource table (NULL terminated) */
diff --git a/resources/Makefile.in b/resources/Makefile.in
index e24d54f..f4f1e5c 100644
--- a/resources/Makefile.in
+++ b/resources/Makefile.in
@@ -4,6 +4,7 @@
SRCDIR = @srcdir@
VPATH = @srcdir@
MODULE = resources
+RCFLAGS = -w16
SYSRES_SRCS = \
sysres_Cz.c \
diff --git a/win32/code_page.c b/win32/code_page.c
index 731dd45..2d60fc4 100644
--- a/win32/code_page.c
+++ b/win32/code_page.c
@@ -5,11 +5,13 @@
*/
#include <stdio.h>
+#include <malloc.h>
#include "windows.h"
#include "winerror.h"
#include "winnls.h"
#include "stddebug.h"
#include "debug.h"
+#include "string32.h"
/***********************************************************************
@@ -84,4 +86,30 @@
return count;
}
-
+/***********************************************************************
+ * EnumSystemCodePages32A (KERNEL32.92)
+ */
+BOOL32
+EnumSystemCodePages32A(CODEPAGE_ENUMPROC32A lpfnCodePageEnum,DWORD flags) {
+ dprintf_win32(stddeb,"EnumSystemCodePages32A(%p,%08lx)\n",
+ lpfnCodePageEnum,flags
+ );
+ lpfnCodePageEnum("437");
+ return TRUE;
+}
+
+/***********************************************************************
+ * EnumSystemCodePages32W (KERNEL32.93)
+ */
+BOOL32
+EnumSystemCodePages32W(CODEPAGE_ENUMPROC32W lpfnCodePageEnum,DWORD flags) {
+ WCHAR *cp;
+ dprintf_win32(stddeb,"EnumSystemCodePages32W(%p,%08lx)\n",
+ lpfnCodePageEnum,flags
+ );
+
+ cp=STRING32_DupAnsiToUni("437");
+ lpfnCodePageEnum(cp);
+ free(cp);
+ return TRUE;
+}
diff --git a/win32/file.c b/win32/file.c
index 150322b..925de51 100644
--- a/win32/file.c
+++ b/win32/file.c
@@ -26,7 +26,6 @@
#include "debug.h"
-static void UnixTimeToFileTime(time_t unix_time, FILETIME *filetime);
static int TranslateCreationFlags(DWORD create_flags);
static int TranslateAccessFlags(DWORD access_flags);
int TranslateProtectionFlags(DWORD);
@@ -54,6 +53,9 @@
HFILE hfile;
FILEMAP_OBJECT *filemap_obj;
+ dprintf_win32(stddeb,"CreateFileMapping32A(%08x,%p,%ld,%ld,%ld,%s)\n",
+ h,ats,pot,sh,hlow,lpName
+ );
if (sh) {
SetLastError(ErrnoToLastError(errno));
return INVALID_HANDLE_VALUE;
@@ -94,6 +96,16 @@
/***********************************************************************
+ * MapViewOfFile (KERNEL32.385)
+ *
+ */
+LPVOID MapViewOfFile(HANDLE32 handle, DWORD access, DWORD offhi,
+ DWORD offlo, DWORD size)
+{
+ return MapViewOfFileEx(handle,access,offhi,offlo,size,0);
+}
+
+/***********************************************************************
* MapViewOfFileEx (KERNEL32.386)
*
*/
@@ -138,9 +150,9 @@
/* Translate the file times. Use the last modification time
* for both the creation time and write time.
*/
- UnixTimeToFileTime(file_stat.st_mtime, &(lpfi->ftCreationTime));
- UnixTimeToFileTime(file_stat.st_mtime, &(lpfi->ftLastWriteTime));
- UnixTimeToFileTime(file_stat.st_atime, &(lpfi->ftLastAccessTime));
+ DOSFS_UnixTimeToFileTime(file_stat.st_mtime, &(lpfi->ftCreationTime));
+ DOSFS_UnixTimeToFileTime(file_stat.st_mtime, &(lpfi->ftLastWriteTime));
+ DOSFS_UnixTimeToFileTime(file_stat.st_atime, &(lpfi->ftLastAccessTime));
lpfi->nFileSizeLow = file_stat.st_size;
lpfi->nNumberOfLinks = file_stat.st_nlink;
@@ -155,19 +167,18 @@
return 1;
}
-static void UnixTimeToFileTime(time_t unix_time, FILETIME *filetime)
-{
- /* This isn't anywhere close to being correct, but should
- * work for now.
- */
- filetime->dwLowDateTime = (unix_time & 0x0000FFFF) << 16;
- filetime->dwHighDateTime = (unix_time & 0xFFFF0000) >> 16;
-}
+/***********************************************************************
+ * GetFileSize (KERNEL32.220)
+ */
+DWORD GetFileSize(HFILE hf,LPDWORD filesizehigh) {
+ BY_HANDLE_FILE_INFORMATION fi;
+ DWORD res = GetFileInformationByHandle(hf,&fi);
-time_t FileTimeToUnixTime(FILETIME *filetime)
-{
- /* reverse of UnixTimeToFileTime */
- return (filetime->dwLowDateTime>>16)+(filetime->dwHighDateTime<<16);
+ if (!res)
+ return 0; /* FIXME: correct ? */
+ if (filesizehigh)
+ *filesizehigh = fi.nFileSizeHigh;
+ return fi.nFileSizeLow;
}
/***********************************************************************
diff --git a/win32/findfile.c b/win32/findfile.c
index 8f9bf52..50bb75d 100644
--- a/win32/findfile.c
+++ b/win32/findfile.c
@@ -188,6 +188,8 @@
{
FindFileContext32 *context;
+ if (handle==(INVALID_HANDLE_VALUE))
+ return TRUE;
context = (FindFileContext32 *) handle;
if (context->dir)
closedir(context->dir);
diff --git a/win32/init.c b/win32/init.c
index 5fa1b3a..8585a93 100644
--- a/win32/init.c
+++ b/win32/init.c
@@ -55,15 +55,6 @@
}
/***********************************************************************
- * GetModuleFileNameA (KERNEL32.235)
- */
-DWORD GetModuleFileNameA(HMODULE32 hModule, LPSTR lpFilename, DWORD nSize)
-{
- strcpy(lpFilename, "c:\\dummy");
- return 8;
-}
-
-/***********************************************************************
* GetModuleHandle (KERNEL32.237)
*/
HMODULE32 WIN32_GetModuleHandle(char *module)
@@ -99,6 +90,26 @@
lpStartupInfo->hStdError = (HANDLE32)2;
}
+/***********************************************************************
+ * GetStartupInfoA (KERNEL32.284)
+ * FIXME: perhaps supply better values.
+ */
+VOID
+GetSystemInfo(LPSYSTEM_INFO si) {
+ si->dwOemId = 0x12345678;
+ si->dwPageSize = 4096; /* 4K */
+ si->lpMinimumApplicationAddress = 0x40000000;
+ si->lpMaximumApplicationAddress = 0x80000000;
+ si->dwActiveProcessorMask = 1;
+ si->dwNumberOfProcessors = 1;
+#ifdef WINELIB
+ si->dwProcessorType = 3;
+#else
+ si->dwProcessorType = runtime_cpu();
+#endif
+ si->dwAllocationGranularity = 8; /* hmm? */
+}
+
/* Initialize whatever internal data structures we need.
*
* Returns 1 on success, 0 on failure.
diff --git a/win32/thread.c b/win32/thread.c
index 1495f7c..37e3c54 100644
--- a/win32/thread.c
+++ b/win32/thread.c
@@ -67,8 +67,11 @@
return;
}
-void
-ReinitializeCriticalSection(CRITICAL_SECTION *lpCrit) {
+void ReinitializeCriticalSection(CRITICAL_SECTION *lpCrit) {
+ /* hmm */
+}
+
+void MakeCriticalSectionGlobal(CRITICAL_SECTION *lpCrit) {
/* hmm */
}
diff --git a/windows/caret.c b/windows/caret.c
index 041eff0..99c955f 100644
--- a/windows/caret.c
+++ b/windows/caret.c
@@ -60,7 +60,7 @@
Caret.on = !Caret.on;
if (!(hdc = GetDCEx32( Caret.hwnd, 0, DCX_USESTYLE | DCX_CACHE ))) return;
hPrevBrush = SelectObject32( hdc, Caret.hBrush );
- PatBlt( hdc, Caret.x, Caret.y, Caret.width, Caret.height, PATINVERT );
+ PatBlt32( hdc, Caret.x, Caret.y, Caret.width, Caret.height, PATINVERT );
SelectObject32( hdc, hPrevBrush );
ReleaseDC32( Caret.hwnd, hdc );
}
diff --git a/windows/dce.c b/windows/dce.c
index d83b8bb..5a7c9e0 100644
--- a/windows/dce.c
+++ b/windows/dce.c
@@ -331,8 +331,8 @@
wndPtr = wndPtr->parent;
xoffset -= wndPtr->rectClient.left;
yoffset -= wndPtr->rectClient.top;
- hrgn = DCE_ClipWindows( wndPtr->parent->child, wndPtr,
- hrgn, xoffset, yoffset );
+ hrgn = DCE_ClipWindows( wndPtr->parent ? wndPtr->parent->child : NULL,
+ wndPtr, hrgn, xoffset, yoffset );
if (!hrgn) return 0;
}
return hrgn;
diff --git a/windows/dialog.c b/windows/dialog.c
index 17a349a..03a0ddf 100644
--- a/windows/dialog.c
+++ b/windows/dialog.c
@@ -1320,3 +1320,143 @@
}
return pWndLast->hwndSelf;
}
+
+
+/**********************************************************************
+ * DIALOG_DlgDirSelect
+ *
+ * Helper function for DlgDirSelect*
+ */
+static BOOL32 DIALOG_DlgDirSelect( HWND32 hwnd, LPSTR str, INT32 len,
+ INT32 id, BOOL32 win32, BOOL32 unicode,
+ BOOL32 combo )
+{
+ char *buffer, *ptr;
+ INT32 item, size;
+ BOOL32 ret;
+ HWND32 listbox = GetDlgItem( hwnd, id );
+
+ dprintf_dialog( stddeb, "DlgDirSelect: %04x '%s' %d\n", hwnd, str, id );
+ if (!listbox) return FALSE;
+ if (win32)
+ {
+ item = SendMessage32A(listbox, combo ? CB_GETCURSEL32
+ : LB_GETCURSEL32, 0, 0 );
+ if (item == LB_ERR) return FALSE;
+ size = SendMessage32A(listbox, combo ? CB_GETLBTEXTLEN32
+ : LB_GETTEXTLEN32, 0, 0 );
+ if (size == LB_ERR) return FALSE;
+ }
+ else
+ {
+ item = SendMessage32A(listbox, combo ? CB_GETCURSEL16
+ : LB_GETCURSEL16, 0, 0 );
+ if (item == LB_ERR) return FALSE;
+ size = SendMessage32A(listbox, combo ? CB_GETLBTEXTLEN16
+ : LB_GETTEXTLEN16, 0, 0 );
+ if (size == LB_ERR) return FALSE;
+ }
+
+ if (!(buffer = SEGPTR_ALLOC( size+1 ))) return FALSE;
+
+ if (win32)
+ SendMessage32A( listbox, combo ? CB_GETLBTEXT32 : LB_GETTEXT32,
+ item, (LPARAM)buffer );
+ else
+ SendMessage16( listbox, combo ? CB_GETLBTEXT16 : LB_GETTEXT16,
+ item, (LPARAM)SEGPTR_GET(buffer) );
+
+ if ((ret = (buffer[0] == '['))) /* drive or directory */
+ {
+ if (buffer[1] == '-') /* drive */
+ {
+ buffer[3] = ':';
+ buffer[4] = 0;
+ ptr = buffer + 2;
+ }
+ else
+ {
+ buffer[strlen(buffer)-1] = '\\';
+ ptr = buffer + 1;
+ }
+ }
+ else ptr = buffer;
+
+ if (unicode) lstrcpynAtoW( (LPWSTR)str, ptr, len );
+ else lstrcpyn32A( str, ptr, len );
+ SEGPTR_FREE( buffer );
+ dprintf_dialog( stddeb, "Returning %d '%s'\n", ret, str );
+ return ret;
+}
+
+
+/**********************************************************************
+ * DlgDirSelect (USER.99)
+ */
+BOOL16 DlgDirSelect( HWND16 hwnd, LPSTR str, INT16 id )
+{
+ return DlgDirSelectEx16( hwnd, str, 128, id );
+}
+
+
+/**********************************************************************
+ * DlgDirSelectComboBox (USER.194)
+ */
+BOOL16 DlgDirSelectComboBox( HWND16 hwnd, LPSTR str, INT16 id )
+{
+ return DlgDirSelectComboBoxEx16( hwnd, str, 128, id );
+}
+
+
+/**********************************************************************
+ * DlgDirSelectEx16 (USER.422)
+ */
+BOOL16 DlgDirSelectEx16( HWND16 hwnd, LPSTR str, INT16 len, INT16 id )
+{
+ return DIALOG_DlgDirSelect( hwnd, str, len, id, FALSE, FALSE, FALSE );
+}
+
+
+/**********************************************************************
+ * DlgDirSelectEx32A (USER32.148)
+ */
+BOOL32 DlgDirSelectEx32A( HWND32 hwnd, LPSTR str, INT32 len, INT32 id )
+{
+ return DIALOG_DlgDirSelect( hwnd, str, len, id, TRUE, FALSE, FALSE );
+}
+
+
+/**********************************************************************
+ * DlgDirSelectEx32W (USER32.149)
+ */
+BOOL32 DlgDirSelectEx32W( HWND32 hwnd, LPWSTR str, INT32 len, INT32 id )
+{
+ return DIALOG_DlgDirSelect( hwnd, (LPSTR)str, len, id, TRUE, TRUE, FALSE );
+}
+
+
+/**********************************************************************
+ * DlgDirSelectComboBoxEx16 (USER.423)
+ */
+BOOL16 DlgDirSelectComboBoxEx16( HWND16 hwnd, LPSTR str, INT16 len, INT16 id )
+{
+ return DIALOG_DlgDirSelect( hwnd, str, len, id, FALSE, FALSE, TRUE );
+}
+
+
+/**********************************************************************
+ * DlgDirSelectComboBoxEx32A (USER32.146)
+ */
+BOOL32 DlgDirSelectComboBoxEx32A( HWND32 hwnd, LPSTR str, INT32 len, INT32 id )
+{
+ return DIALOG_DlgDirSelect( hwnd, str, len, id, TRUE, FALSE, TRUE );
+}
+
+
+/**********************************************************************
+ * DlgDirSelectComboBoxEx32W (USER32.147)
+ */
+BOOL32 DlgDirSelectComboBoxEx32W( HWND32 hwnd, LPWSTR str, INT32 len, INT32 id)
+{
+ return DIALOG_DlgDirSelect( hwnd, (LPSTR)str, len, id, TRUE, TRUE, TRUE );
+}
diff --git a/windows/event.c b/windows/event.c
index 24ec312..2010052 100644
--- a/windows/event.c
+++ b/windows/event.c
@@ -32,14 +32,30 @@
#include "options.h"
#include "queue.h"
#include "winpos.h"
+#include "drive.h"
+#include "dos_fs.h"
+#include "shell.h"
#include "registers.h"
#include "xmalloc.h"
#include "stddebug.h"
#include "debug.h"
#include "dde_proc.h"
+
#define NB_BUTTONS 3 /* Windows can handle 3 buttons */
+#define DndNotDnd -1 /* OffiX drag&drop */
+#define DndUnknown 0
+#define DndRawData 1
+#define DndFile 2
+#define DndFiles 3
+#define DndText 4
+#define DndDir 5
+#define DndLink 6
+#define DndExe 7
+
+#define DndEND 8
+
/* X context to associate a hwnd to an X window */
static XContext winContext = 0;
@@ -123,6 +139,11 @@
static BOOL KeyDown = FALSE;
+static Atom wmProtocols = None;
+static Atom wmDeleteWindow = None;
+static Atom dndProtocol = None;
+static Atom dndSelection = None;
+
static const char * const event_names[] =
{
"", "", "KeyPress", "KeyRelease", "ButtonPress", "ButtonRelease",
@@ -155,6 +176,9 @@
static void EVENT_EnterNotify( WND *pWnd, XCrossingEvent *event );
*/
+extern void FOCUS_SetXFocus( HWND32 );
+extern BOOL16 DRAG_QueryUpdate( HWND, SEGPTR, BOOL32 );
+
/***********************************************************************
* EVENT_ProcessEvent
*
@@ -277,6 +301,15 @@
*/
void EVENT_RegisterWindow( WND *pWnd )
{
+ if (wmProtocols == None)
+ wmProtocols = XInternAtom( display, "WM_PROTOCOLS", True );
+ if (wmDeleteWindow == None)
+ wmDeleteWindow = XInternAtom( display, "WM_DELETE_WINDOW", True );
+ if( dndProtocol == None )
+ dndProtocol = XInternAtom( display, "DndProtocol" , False );
+ if( dndSelection == None )
+ dndSelection = XInternAtom( display, "DndSelection" , False );
+
if (!winContext) winContext = XUniqueContext();
XSaveContext( display, pWnd->window, winContext, (char *)pWnd );
}
@@ -291,14 +324,18 @@
*/
BOOL32 EVENT_WaitXEvent( BOOL32 sleep, BOOL32 peek )
{
- fd_set read_set;
- struct timeval timeout;
XEvent event;
- int fd = ConnectionNumber(display);
+ LONG maxWait = sleep ? TIMER_GetNextExpiration() : 0;
- if (!XPending(display))
+ /* Wait for an event or a timeout. If maxWait is -1, we have no timeout;
+ * in this case, we fall through directly to the XNextEvent loop.
+ */
+
+ if ((maxWait != -1) && !XPending(display))
{
- LONG maxWait = sleep ? TIMER_GetNextExpiration() : 0;
+ fd_set read_set;
+ struct timeval timeout;
+ int fd = ConnectionNumber(display);
FD_ZERO( &read_set );
FD_SET( fd, &read_set );
@@ -824,11 +861,11 @@
/* remove carriage returns */
lpstr = (char*)xmalloc(size--);
- for(i=0,j=0; i < size; i++ )
+ for(i=0,j=0; i < size && text[i]; i++ )
{
- if( text[i] == '\r' && text[i+1] == '\n' ) continue;
+ if( text[i] == '\r' &&
+ (text[i+1] == '\n' || text[i+1] == '\0') ) continue;
lpstr[j++] = text[i];
- if( text[i] == '\0' ) break;
}
lpstr[j]='\0';
@@ -886,21 +923,121 @@
*/
static void EVENT_ClientMessage( WND *pWnd, XClientMessageEvent *event )
{
- static Atom wmProtocols = None;
- static Atom wmDeleteWindow = None;
-
- if (wmProtocols == None)
- wmProtocols = XInternAtom( display, "WM_PROTOCOLS", True );
- if (wmDeleteWindow == None)
- wmDeleteWindow = XInternAtom( display, "WM_DELETE_WINDOW", True );
-
- if ((event->format != 32) || (event->message_type != wmProtocols) ||
- (((Atom) event->data.l[0]) != wmDeleteWindow))
+ if (event->message_type != None && event->format == 32)
{
- dprintf_event( stddeb, "unrecognized ClientMessage\n" );
- return;
+ if ((event->message_type == wmProtocols) &&
+ (((Atom) event->data.l[0]) == wmDeleteWindow))
+ SendMessage16( pWnd->hwndSelf, WM_SYSCOMMAND, SC_CLOSE, 0 );
+ else if ( event->message_type == dndProtocol &&
+ (event->data.l[0] == DndFile || event->data.l[0] == DndFiles) )
+ {
+ unsigned long data_length;
+ unsigned long aux_long;
+ unsigned char* p_data = NULL;
+ union {
+ Atom atom_aux;
+ POINT32 pt_aux;
+ BOOL16 bAccept;
+ int i;
+ } u;
+ int x, y;
+ HGLOBAL16 hDragInfo = GlobalAlloc16( GMEM_SHARE | GMEM_ZEROINIT, sizeof(DRAGINFO));
+ LPDRAGINFO lpDragInfo = (LPDRAGINFO) GlobalLock16(hDragInfo);
+ SEGPTR spDragInfo = (SEGPTR) WIN16_GlobalLock16(hDragInfo);
+ Window w_aux_root, w_aux_child;
+ WND* pDropWnd;
+
+ if( !lpDragInfo || !spDragInfo ) return;
+
+ XQueryPointer( display, pWnd->window, &w_aux_root, &w_aux_child,
+ &x, &y, &u.pt_aux.x, &u.pt_aux.y, (unsigned int*)&aux_long);
+
+ lpDragInfo->hScope = pWnd->hwndSelf;
+ lpDragInfo->pt.x = (INT16)x; lpDragInfo->pt.y = (INT16)y;
+
+ /* find out drop point and drop window */
+ if( x < 0 || y < 0 ||
+ x > (pWnd->rectWindow.right - pWnd->rectWindow.left) ||
+ y > (pWnd->rectWindow.bottom - pWnd->rectWindow.top) )
+ { u.bAccept = pWnd->dwExStyle & WS_EX_ACCEPTFILES; x = y = 0; }
+ else
+ {
+ u.bAccept = DRAG_QueryUpdate( pWnd->hwndSelf, spDragInfo, TRUE );
+ x = lpDragInfo->pt.x; y = lpDragInfo->pt.y;
+ }
+ pDropWnd = WIN_FindWndPtr( lpDragInfo->hScope );
+ GlobalFree16( hDragInfo );
+
+ if( u.bAccept )
+ {
+ XGetWindowProperty( display, DefaultRootWindow(display),
+ dndSelection, 0, 65535, FALSE,
+ AnyPropertyType, &u.atom_aux, &u.pt_aux.y,
+ &data_length, &aux_long, &p_data);
+
+ if( !aux_long && p_data) /* don't bother if > 64K */
+ {
+ char* p = (char*) p_data;
+ char* p_filename,*p_drop;
+
+ aux_long = 0;
+ while( *p ) /* calculate buffer size */
+ {
+ p_drop = p;
+ if((u.i = *p) != -1 )
+ u.i = DRIVE_FindDriveRoot( (const char**)&p_drop );
+ if( u.i == -1 ) *p = -1; /* mark as "bad" */
+ else
+ {
+ p_filename = (char*) DOSFS_GetDosTrueName( (const char*)p, TRUE );
+ if( p_filename ) aux_long += strlen(p_filename) + 1;
+ else *p = -1;
+ }
+ p += strlen(p) + 1;
+ }
+ if( aux_long && aux_long < 65535 )
+ {
+ HDROP16 hDrop;
+ LPDROPFILESTRUCT lpDrop;
+
+ aux_long += sizeof(DROPFILESTRUCT) + 1;
+ hDrop = (HDROP16)GlobalAlloc16( GMEM_SHARE, aux_long );
+ lpDrop = (LPDROPFILESTRUCT) GlobalLock16( hDrop );
+
+ if( lpDrop )
+ {
+ lpDrop->wSize = sizeof(DROPFILESTRUCT);
+ lpDrop->ptMousePos.x = (INT16)x;
+ lpDrop->ptMousePos.y = (INT16)y;
+ lpDrop->fInNonClientArea = (BOOL16)
+ ( x < (pDropWnd->rectClient.left - pDropWnd->rectWindow.left) ||
+ y < (pDropWnd->rectClient.top - pDropWnd->rectWindow.top) ||
+ x > (pDropWnd->rectClient.right - pDropWnd->rectWindow.left) ||
+ y > (pDropWnd->rectClient.bottom - pDropWnd->rectWindow.top) );
+ p_drop = ((char*)lpDrop) + sizeof(DROPFILESTRUCT);
+ p = p_data;
+ while(*p)
+ {
+ if( *p != -1 ) /* use only "good" entries */
+ {
+ p_filename = (char*) DOSFS_GetDosTrueName( p, TRUE );
+ strcpy(p_drop, p_filename);
+ p_drop += strlen( p_filename ) + 1;
+ }
+ p += strlen(p) + 1;
+ }
+ *p_drop = '\0';
+ PostMessage( pWnd->hwndSelf, WM_DROPFILES, (WPARAM16)hDrop, 0L );
+ }
+ }
+ }
+ if( p_data ) XFree(p_data);
+
+ } /* WS_EX_ACCEPTFILES */
+ } /* dndProtocol */
+ else
+ dprintf_event( stddeb, "unrecognized ClientMessage\n" );
}
- SendMessage16( pWnd->hwndSelf, WM_SYSCOMMAND, SC_CLOSE, 0 );
}
/**********************************************************************
@@ -918,8 +1055,6 @@
}
*/
-extern void FOCUS_SetXFocus( HWND32 );
-
/**********************************************************************
* EVENT_MapNotify
*/
diff --git a/windows/graphics.c b/windows/graphics.c
index 78abec2..40d1c30 100644
--- a/windows/graphics.c
+++ b/windows/graphics.c
@@ -533,8 +533,8 @@
*/
if (!(prevBrush = SelectObject16( hdc, hbrush ))) return 0;
- PatBlt( hdc, rect->left, rect->top,
- rect->right - rect->left, rect->bottom - rect->top, PATCOPY );
+ PatBlt32( hdc, rect->left, rect->top,
+ rect->right - rect->left, rect->bottom - rect->top, PATCOPY );
SelectObject16( hdc, prevBrush );
return 1;
}
@@ -548,8 +548,8 @@
HBRUSH32 prevBrush;
if (!(prevBrush = SelectObject32( hdc, hbrush ))) return 0;
- PatBlt( hdc, rect->left, rect->top,
- rect->right - rect->left, rect->bottom - rect->top, PATCOPY );
+ PatBlt32( hdc, rect->left, rect->top,
+ rect->right - rect->left, rect->bottom - rect->top, PATCOPY );
SelectObject32( hdc, prevBrush );
return 1;
}
@@ -560,8 +560,8 @@
*/
void InvertRect16( HDC16 hdc, const RECT16 *rect )
{
- PatBlt( hdc, rect->left, rect->top,
- rect->right - rect->left, rect->bottom - rect->top, DSTINVERT );
+ PatBlt32( hdc, rect->left, rect->top,
+ rect->right - rect->left, rect->bottom - rect->top, DSTINVERT );
}
@@ -570,8 +570,8 @@
*/
void InvertRect32( HDC32 hdc, const RECT32 *rect )
{
- PatBlt( hdc, rect->left, rect->top,
- rect->right - rect->left, rect->bottom - rect->top, DSTINVERT );
+ PatBlt32( hdc, rect->left, rect->top,
+ rect->right - rect->left, rect->bottom - rect->top, DSTINVERT );
}
@@ -596,15 +596,15 @@
if (DC_SetupGCForBrush( dc ))
{
- PatBlt( hdc, rect->left, rect->top, 1,
- rect->bottom - rect->top, PATCOPY );
- PatBlt( hdc, rect->right - 1, rect->top, 1,
- rect->bottom - rect->top, PATCOPY );
- PatBlt( hdc, rect->left, rect->top,
- rect->right - rect->left, 1, PATCOPY );
- PatBlt( hdc, rect->left, rect->bottom - 1,
- rect->right - rect->left, 1, PATCOPY );
- }
+ PatBlt32( hdc, rect->left, rect->top, 1,
+ rect->bottom - rect->top, PATCOPY );
+ PatBlt32( hdc, rect->right - 1, rect->top, 1,
+ rect->bottom - rect->top, PATCOPY );
+ PatBlt32( hdc, rect->left, rect->top,
+ rect->right - rect->left, 1, PATCOPY );
+ PatBlt32( hdc, rect->left, rect->bottom - 1,
+ rect->right - rect->left, 1, PATCOPY );
+ }
SelectObject16( hdc, prevBrush );
return 1;
}
@@ -922,20 +922,20 @@
sysColorObjects.hbrushBtnHighlight );
for (i = 0; i < highlight_size; i++)
{
- PatBlt( hdc, rect->left + i, rect->top,
- 1, rect->bottom - rect->top - i, PATCOPY );
- PatBlt( hdc, rect->left, rect->top + i,
- rect->right - rect->left - i, 1, PATCOPY );
+ PatBlt32( hdc, rect->left + i, rect->top,
+ 1, rect->bottom - rect->top - i, PATCOPY );
+ PatBlt32( hdc, rect->left, rect->top + i,
+ rect->right - rect->left - i, 1, PATCOPY );
}
SelectObject32( hdc, pressed ? sysColorObjects.hbrushBtnHighlight :
sysColorObjects.hbrushBtnShadow );
for (i = 0; i < shadow_size; i++)
{
- PatBlt( hdc, rect->right - i - 1, rect->top + i,
- 1, rect->bottom - rect->top - i, PATCOPY );
- PatBlt( hdc, rect->left + i, rect->bottom - i - 1,
- rect->right - rect->left - i, 1, PATCOPY );
+ PatBlt32( hdc, rect->right - i - 1, rect->top + i,
+ 1, rect->bottom - rect->top - i, PATCOPY );
+ PatBlt32( hdc, rect->left + i, rect->bottom - i - 1,
+ rect->right - rect->left - i, 1, PATCOPY );
}
SelectObject32( hdc, hbrushOld );
@@ -1250,31 +1250,31 @@
hbrushOld = SelectObject32( hdc, sysColorObjects.hbrushBtnHighlight );
if (edge & BDR_RAISEDOUTER)
{
- if (flags & BF_LEFT) PatBlt( hdc, rc->left, rc->top,
- 1, rc->bottom - rc->top - 1, PATCOPY );
- if (flags & BF_TOP) PatBlt( hdc, rc->left, rc->top,
- rc->right - rc->left - 1, 1, PATCOPY );
+ if (flags & BF_LEFT) PatBlt32( hdc, rc->left, rc->top,
+ 1, rc->bottom - rc->top - 1, PATCOPY );
+ if (flags & BF_TOP) PatBlt32( hdc, rc->left, rc->top,
+ rc->right - rc->left - 1, 1, PATCOPY );
}
if (edge & BDR_SUNKENOUTER)
{
- if (flags & BF_RIGHT) PatBlt( hdc, rc->right - 1, rc->top,
- 1, rc->bottom - rc->top, PATCOPY );
- if (flags & BF_BOTTOM) PatBlt( hdc, rc->left, rc->bottom - 1,
- rc->right - rc->left, 1, PATCOPY );
+ if (flags & BF_RIGHT) PatBlt32( hdc, rc->right - 1, rc->top,
+ 1, rc->bottom - rc->top, PATCOPY );
+ if (flags & BF_BOTTOM) PatBlt32( hdc, rc->left, rc->bottom - 1,
+ rc->right - rc->left, 1, PATCOPY );
}
if (edge & BDR_RAISEDINNER)
{
- if (flags & BF_LEFT) PatBlt( hdc, rc->left + 1, rc->top + 1,
- 1, rc->bottom - rc->top - 2, PATCOPY );
- if (flags & BF_TOP) PatBlt( hdc, rc->left + 1, rc->top + 1,
- rc->right - rc->left - 2, 1, PATCOPY );
+ if (flags & BF_LEFT) PatBlt32( hdc, rc->left + 1, rc->top + 1,
+ 1, rc->bottom - rc->top - 2, PATCOPY );
+ if (flags & BF_TOP) PatBlt32( hdc, rc->left + 1, rc->top + 1,
+ rc->right - rc->left - 2, 1, PATCOPY );
}
if (edge & BDR_SUNKENINNER)
{
- if (flags & BF_RIGHT) PatBlt( hdc, rc->right - 2, rc->top + 1,
- 1, rc->bottom - rc->top - 2, PATCOPY );
- if (flags & BF_BOTTOM) PatBlt( hdc, rc->left + 1, rc->bottom - 2,
- rc->right - rc->left - 2, 1, PATCOPY );
+ if (flags & BF_RIGHT) PatBlt32( hdc, rc->right - 2, rc->top + 1,
+ 1, rc->bottom - rc->top - 2, PATCOPY );
+ if (flags & BF_BOTTOM) PatBlt32( hdc, rc->left + 1, rc->bottom - 2,
+ rc->right - rc->left - 2, 1, PATCOPY );
}
/* Then do all the sunken edges */
@@ -1282,31 +1282,31 @@
SelectObject32( hdc, sysColorObjects.hbrushBtnShadow );
if (edge & BDR_SUNKENOUTER)
{
- if (flags & BF_LEFT) PatBlt( hdc, rc->left, rc->top,
- 1, rc->bottom - rc->top - 1, PATCOPY );
- if (flags & BF_TOP) PatBlt( hdc, rc->left, rc->top,
- rc->right - rc->left - 1, 1, PATCOPY );
+ if (flags & BF_LEFT) PatBlt32( hdc, rc->left, rc->top,
+ 1, rc->bottom - rc->top - 1, PATCOPY );
+ if (flags & BF_TOP) PatBlt32( hdc, rc->left, rc->top,
+ rc->right - rc->left - 1, 1, PATCOPY );
}
if (edge & BDR_RAISEDOUTER)
{
- if (flags & BF_RIGHT) PatBlt( hdc, rc->right - 1, rc->top,
- 1, rc->bottom - rc->top, PATCOPY );
- if (flags & BF_BOTTOM) PatBlt( hdc, rc->left, rc->bottom - 1,
- rc->right - rc->left, 1, PATCOPY );
+ if (flags & BF_RIGHT) PatBlt32( hdc, rc->right - 1, rc->top,
+ 1, rc->bottom - rc->top, PATCOPY );
+ if (flags & BF_BOTTOM) PatBlt32( hdc, rc->left, rc->bottom - 1,
+ rc->right - rc->left, 1, PATCOPY );
}
if (edge & BDR_SUNKENINNER)
{
- if (flags & BF_LEFT) PatBlt( hdc, rc->left + 1, rc->top + 1,
- 1, rc->bottom - rc->top - 2, PATCOPY );
- if (flags & BF_TOP) PatBlt( hdc, rc->left + 1, rc->top + 1,
- rc->right - rc->left - 2, 1, PATCOPY );
+ if (flags & BF_LEFT) PatBlt32( hdc, rc->left + 1, rc->top + 1,
+ 1, rc->bottom - rc->top - 2, PATCOPY );
+ if (flags & BF_TOP) PatBlt32( hdc, rc->left + 1, rc->top + 1,
+ rc->right - rc->left - 2, 1, PATCOPY );
}
if (edge & BDR_RAISEDINNER)
{
- if (flags & BF_RIGHT) PatBlt( hdc, rc->right - 2, rc->top + 1,
- 1, rc->bottom - rc->top - 2, PATCOPY );
- if (flags & BF_BOTTOM) PatBlt( hdc, rc->left + 1, rc->bottom - 2,
- rc->right - rc->left - 2, 1, PATCOPY );
+ if (flags & BF_RIGHT) PatBlt32( hdc, rc->right - 2, rc->top + 1,
+ 1, rc->bottom - rc->top - 2, PATCOPY );
+ if (flags & BF_BOTTOM) PatBlt32( hdc, rc->left + 1, rc->bottom - 2,
+ rc->right - rc->left - 2, 1, PATCOPY );
}
SelectObject32( hdc, hbrushOld );
diff --git a/windows/mdi.c b/windows/mdi.c
index 1e6b45f..684b3fc 100644
--- a/windows/mdi.c
+++ b/windows/mdi.c
@@ -672,8 +672,8 @@
hbCopy = CreateCompatibleBitmap(hDCSrc,SYSMETRICS_CXSIZE, SYSMETRICS_CYSIZE);
hb_dest = SelectObject32(hDCDest,hbCopy);
- BitBlt(hDCDest, 0, 0, SYSMETRICS_CXSIZE, SYSMETRICS_CYSIZE,
- hDCSrc, SYSMETRICS_CXSIZE, 0, SRCCOPY);
+ BitBlt32(hDCDest, 0, 0, SYSMETRICS_CXSIZE, SYSMETRICS_CYSIZE,
+ hDCSrc, SYSMETRICS_CXSIZE, 0, SRCCOPY);
SelectObject32(hDCSrc,hb_src);
SelectObject32(hDCDest,hb_dest);
@@ -982,7 +982,8 @@
RECT16 rect;
WND *w = WIN_FindWndPtr(hwnd);
WND *frameWnd = w->parent;
-
+ INT nItems;
+
ci = (MDICLIENTINFO *) w->wExtra;
switch (message)
@@ -1020,12 +1021,12 @@
case WM_DESTROY:
if( ci->hwndChildMaximized ) MDI_RestoreFrameMenu(w, frameWnd->hwndSelf);
- ci->idFirstChild = GetMenuItemCount(ci->hWindowMenu) - 1;
- ci->nActiveChildren++; /* to delete a separator */
-
- while( ci->nActiveChildren-- )
- DeleteMenu(ci->hWindowMenu,MF_BYPOSITION,ci->idFirstChild--);
-
+ if((nItems = GetMenuItemCount(ci->hWindowMenu)) > 0) {
+ ci->idFirstChild = nItems - 1;
+ ci->nActiveChildren++; /* to delete a separator */
+ while( ci->nActiveChildren-- )
+ DeleteMenu(ci->hWindowMenu,MF_BYPOSITION,ci->idFirstChild--);
+ }
return 0;
case WM_MDIACTIVATE:
@@ -1718,8 +1719,8 @@
SetScrollPos32(hWnd, (uMsg == WM_VSCROLL)?SB_VERT:SB_HORZ , newPos, TRUE);
if( uMsg == WM_VSCROLL )
- ScrollWindow(hWnd ,0 ,curPos - newPos, NULL, NULL);
+ ScrollWindow32(hWnd ,0 ,curPos - newPos, NULL, NULL);
else
- ScrollWindow(hWnd ,curPos - newPos, 0, NULL, NULL);
+ ScrollWindow32(hWnd ,curPos - newPos, 0, NULL, NULL);
}
diff --git a/windows/message.c b/windows/message.c
index 3e5f253..4ac32f3 100644
--- a/windows/message.c
+++ b/windows/message.c
@@ -105,7 +105,7 @@
return ret ? SYSQ_MSG_ACCEPT : SYSQ_MSG_SKIP ;
}
- hittest = WINPOS_WindowFromPoint( msg->pt, &pWnd );
+ hittest = WINPOS_WindowFromPoint( WIN_GetDesktop(), msg->pt, &pWnd );
if (pWnd->hmemTaskQ != GetTaskQueue(0))
{
/* Not for the current task */
diff --git a/windows/nonclient.c b/windows/nonclient.c
index ec0c986..d7f70cb 100644
--- a/windows/nonclient.c
+++ b/windows/nonclient.c
@@ -56,6 +56,8 @@
#define ON_BOTTOM_BORDER(hit) \
(((hit) == HTBOTTOM) || ((hit) == HTBOTTOMLEFT) || ((hit) == HTBOTTOMRIGHT))
+extern HCURSOR16 CURSORICON_IconToCursor( HICON16, BOOL32 );
+
/***********************************************************************
* NC_AdjustRect
*
@@ -443,9 +445,9 @@
NC_GetInsideRect( hwnd, &rect );
hdcMem = CreateCompatibleDC( hdc );
hbitmap = SelectObject32( hdcMem, hbitmapClose );
- BitBlt( hdc, rect.left, rect.top, SYSMETRICS_CXSIZE, SYSMETRICS_CYSIZE,
- hdcMem, (wndPtr->dwStyle & WS_CHILD) ? SYSMETRICS_CXSIZE : 0, 0,
- down ? NOTSRCCOPY : SRCCOPY );
+ BitBlt32(hdc, rect.left, rect.top, SYSMETRICS_CXSIZE, SYSMETRICS_CYSIZE,
+ hdcMem, (wndPtr->dwStyle & WS_CHILD) ? SYSMETRICS_CXSIZE : 0, 0,
+ down ? NOTSRCCOPY : SRCCOPY );
SelectObject32( hdcMem, hbitmap );
DeleteDC( hdcMem );
}
@@ -517,14 +519,14 @@
}
/* Draw frame */
- PatBlt( hdc, rect->left, rect->top,
- rect->right - rect->left, height, PATCOPY );
- PatBlt( hdc, rect->left, rect->top,
- width, rect->bottom - rect->top, PATCOPY );
- PatBlt( hdc, rect->left, rect->bottom,
- rect->right - rect->left, -height, PATCOPY );
- PatBlt( hdc, rect->right, rect->top,
- -width, rect->bottom - rect->top, PATCOPY );
+ PatBlt32( hdc, rect->left, rect->top,
+ rect->right - rect->left, height, PATCOPY );
+ PatBlt32( hdc, rect->left, rect->top,
+ width, rect->bottom - rect->top, PATCOPY );
+ PatBlt32( hdc, rect->left, rect->bottom,
+ rect->right - rect->left, -height, PATCOPY );
+ PatBlt32( hdc, rect->right, rect->top,
+ -width, rect->bottom - rect->top, PATCOPY );
if (dlgFrame)
{
@@ -575,21 +577,8 @@
*/
static void NC_DrawMovingFrame( HDC16 hdc, RECT16 *rect, BOOL thickframe )
{
- if (thickframe)
- {
- SelectObject32( hdc, GetStockObject32( GRAY_BRUSH ) );
- PatBlt( hdc, rect->left, rect->top,
- rect->right - rect->left - SYSMETRICS_CXFRAME,
- SYSMETRICS_CYFRAME, PATINVERT );
- PatBlt( hdc, rect->left, rect->top + SYSMETRICS_CYFRAME,
- SYSMETRICS_CXFRAME,
- rect->bottom - rect->top - SYSMETRICS_CYFRAME, PATINVERT );
- PatBlt( hdc, rect->left + SYSMETRICS_CXFRAME, rect->bottom,
- rect->right - rect->left - SYSMETRICS_CXFRAME,
- -SYSMETRICS_CYFRAME, PATINVERT );
- PatBlt( hdc, rect->right, rect->top, -SYSMETRICS_CXFRAME,
- rect->bottom - rect->top - SYSMETRICS_CYFRAME, PATINVERT );
- }
+ if (thickframe) FastWindowFrame( hdc, rect, SYSMETRICS_CXFRAME,
+ SYSMETRICS_CYFRAME, PATINVERT );
else DrawFocusRect16( hdc, rect );
}
@@ -624,9 +613,9 @@
if (wndPtr->dwExStyle & WS_EX_DLGMODALFRAME)
{
HBRUSH32 hbrushOld = SelectObject32(hdc, sysColorObjects.hbrushWindow);
- PatBlt( hdc, r.left, r.top, 1, r.bottom-r.top+1,PATCOPY );
- PatBlt( hdc, r.right-1, r.top, 1, r.bottom-r.top+1, PATCOPY );
- PatBlt( hdc, r.left, r.top-1, r.right-r.left, 1, PATCOPY );
+ PatBlt32( hdc, r.left, r.top, 1, r.bottom-r.top+1,PATCOPY );
+ PatBlt32( hdc, r.right-1, r.top, 1, r.bottom-r.top+1, PATCOPY );
+ PatBlt32( hdc, r.left, r.top-1, r.right-r.left, 1, PATCOPY );
r.left++;
r.right--;
SelectObject32( hdc, hbrushOld );
@@ -992,18 +981,18 @@
static void NC_DoSizeMove( HWND hwnd, WORD wParam, POINT16 pt )
{
MSG16 msg;
- LONG hittest;
RECT16 sizingRect, mouseRect;
HDC32 hdc;
- BOOL thickframe;
- POINT16 minTrack, maxTrack, capturePoint = pt;
- WND * wndPtr = WIN_FindWndPtr( hwnd );
- int moved = 0;
+ LONG hittest = (LONG)(wParam & 0x0f);
+ HCURSOR16 hDragCursor = 0, hOldCursor = 0;
+ POINT16 minTrack, maxTrack, capturePoint = pt;
+ WND * wndPtr = WIN_FindWndPtr( hwnd );
+ BOOL32 thickframe = HAS_THICKFRAME( wndPtr->dwStyle );
+ BOOL32 iconic = wndPtr->dwStyle & WS_MINIMIZE;
+ int moved = 0;
if (IsZoomed(hwnd) || !IsWindowVisible(hwnd) ||
(wndPtr->flags & WIN_MANAGED)) return;
- hittest = wParam & 0x0f;
- thickframe = HAS_THICKFRAME( wndPtr->dwStyle );
if ((wParam & 0xfff0) == SC_MOVE)
{
@@ -1068,7 +1057,21 @@
hdc = GetDC32( 0 );
if (rootWindow == DefaultRootWindow(display)) XGrabServer( display );
}
- NC_DrawMovingFrame( hdc, &sizingRect, thickframe );
+
+ if( iconic )
+ {
+ HICON16 hIcon = (wndPtr->class->hIcon)
+ ? wndPtr->class->hIcon
+ : (HICON16)SendMessage16( hwnd, WM_QUERYDRAGICON, 0, 0L);
+ if( hIcon )
+ {
+ hDragCursor = CURSORICON_IconToCursor( hIcon, TRUE );
+ hOldCursor = SetCursor(hDragCursor);
+ ShowCursor(1);
+ } else iconic = FALSE;
+ }
+
+ if( !iconic ) NC_DrawMovingFrame( hdc, &sizingRect, thickframe );
while(1)
{
@@ -1117,16 +1120,26 @@
else if (ON_RIGHT_BORDER(hittest)) newRect.right += dx;
if (ON_TOP_BORDER(hittest)) newRect.top += dy;
else if (ON_BOTTOM_BORDER(hittest)) newRect.bottom += dy;
- NC_DrawMovingFrame( hdc, &sizingRect, thickframe );
- NC_DrawMovingFrame( hdc, &newRect, thickframe );
+ if( !iconic )
+ {
+ NC_DrawMovingFrame( hdc, &sizingRect, thickframe );
+ NC_DrawMovingFrame( hdc, &newRect, thickframe );
+ }
capturePoint = pt;
sizingRect = newRect;
}
}
}
- NC_DrawMovingFrame( hdc, &sizingRect, thickframe );
ReleaseCapture();
+ if( iconic )
+ {
+ ShowCursor(0);
+ SetCursor(hOldCursor);
+ if( hDragCursor ) DestroyCursor(hDragCursor);
+ }
+ else
+ NC_DrawMovingFrame( hdc, &sizingRect, thickframe );
if (wndPtr->dwStyle & WS_CHILD)
ReleaseDC32( wndPtr->parent->hwndSelf, hdc );
diff --git a/windows/painting.c b/windows/painting.c
index 3edfe8a..b41a6e9 100644
--- a/windows/painting.c
+++ b/windows/painting.c
@@ -115,8 +115,14 @@
* (because rectClient == rectWindow for WS_MINIMIZE windows).
*/
- lps->hdc = GetDCEx16(hwnd, hrgnUpdate, DCX_INTERSECTRGN | DCX_WINDOWPAINT |
- DCX_USESTYLE | (bIcon ? DCX_WINDOW : 0) );
+ if (wndPtr->class->style & CS_PARENTDC)
+ /* Don't clip the output to the update region for CS_PARENTDC window */
+ lps->hdc = GetDCEx16( hwnd, 0, DCX_WINDOWPAINT | DCX_USESTYLE |
+ (bIcon ? DCX_WINDOW : 0) );
+ else
+ lps->hdc = GetDCEx16(hwnd, hrgnUpdate, DCX_INTERSECTRGN |
+ DCX_WINDOWPAINT | DCX_USESTYLE |
+ (bIcon ? DCX_WINDOW : 0) );
dprintf_win(stddeb,"hdc = %04x\n", lps->hdc);
@@ -264,13 +270,7 @@
hwnd, hrgnUpdate, flags);
}
- if (wndPtr->class->style & CS_PARENTDC)
- {
- GetClientRect32( wndPtr->parent->hwndSelf, &rectClient );
- OffsetRect32( &rectClient, -wndPtr->rectClient.left,
- -wndPtr->rectClient.top );
- }
- else GetClientRect32( hwnd, &rectClient );
+ GetClientRect32( hwnd, &rectClient );
if (flags & RDW_INVALIDATE) /* Invalidate */
{
@@ -410,23 +410,16 @@
for (wndPtr = wndPtr->child; wndPtr; wndPtr = wndPtr->next)
if( wndPtr->dwStyle & WS_VISIBLE )
{
- if (wndPtr->class->style & CS_PARENTDC)
- {
- if (!CombineRgn32( hrgn, hrgnUpdate, 0, RGN_COPY ))
- continue;
- }
- else
- {
- SetRectRgn( hrgn, wndPtr->rectWindow.left,
- wndPtr->rectWindow.top,
- wndPtr->rectWindow.right,
- wndPtr->rectWindow.bottom );
- if (!CombineRgn32( hrgn, hrgn, hrgnUpdate, RGN_AND ))
- continue;
- }
+ SetRectRgn( hrgn, wndPtr->rectWindow.left,
+ wndPtr->rectWindow.top,
+ wndPtr->rectWindow.right,
+ wndPtr->rectWindow.bottom );
+ if (!CombineRgn32( hrgn, hrgn, hrgnUpdate, RGN_AND ))
+ continue;
OffsetRgn32( hrgn, -wndPtr->rectClient.left,
-wndPtr->rectClient.top );
- PAINT_RedrawWindow( wndPtr->hwndSelf, NULL, hrgn, flags, RDW_C_USEHRGN );
+ PAINT_RedrawWindow( wndPtr->hwndSelf, NULL, hrgn, flags,
+ RDW_C_USEHRGN );
}
DeleteObject32( hrgn );
if (control & RDW_C_DELETEHRGN) DeleteObject32( hrgnUpdate );
diff --git a/windows/scroll.c b/windows/scroll.c
index b26ba15..71ecc98 100644
--- a/windows/scroll.c
+++ b/windows/scroll.c
@@ -7,6 +7,7 @@
*
*/
+#define NO_TRANSITION_TYPES /* This file is Win32-clean */
#include <stdlib.h>
#include "wintypes.h"
#include "class.h"
@@ -15,38 +16,54 @@
#include "region.h"
#include "sysmetrics.h"
#include "stddebug.h"
-/* #define DEBUG_SCROLL */
#include "debug.h"
-extern HWND CARET_GetHwnd(); /* windows/caret.c */
+extern HWND32 CARET_GetHwnd(); /* windows/caret.c */
extern void CLIPPING_UpdateGCRegion(DC* ); /* objects/clipping.c */
static int RgnType;
+
/*************************************************************************
- * ScrollWindow (USER.61)
- *
+ * ScrollWindow16 (USER.61)
*/
-void ScrollWindow(HWND hwnd, short dx, short dy, LPRECT16 rect, LPRECT16 clipRect)
+void ScrollWindow16( HWND16 hwnd, INT16 dx, INT16 dy, const RECT16 *rect,
+ const RECT16 *clipRect )
+{
+ RECT32 rect32, clipRect32;
+
+ if (rect) CONV_RECT16TO32( rect, &rect32 );
+ if (clipRect) CONV_RECT16TO32( clipRect, &clipRect32 );
+ ScrollWindow32( hwnd, dx, dy, rect ? &rect32 : NULL,
+ clipRect ? &clipRect32 : NULL );
+}
+
+
+/*************************************************************************
+ * ScrollWindow32 (USER32.449)
+ */
+BOOL32 ScrollWindow32( HWND32 hwnd, INT32 dx, INT32 dy, const RECT32 *rect,
+ const RECT32 *clipRect )
{
HDC32 hdc;
HRGN32 hrgnUpdate,hrgnClip;
- RECT16 rc, cliprc;
- HWND hCaretWnd = CARET_GetHwnd();
+ RECT32 rc, cliprc;
+ HWND32 hCaretWnd = CARET_GetHwnd();
WND* wndScroll = WIN_FindWndPtr( hwnd );
- dprintf_scroll(stddeb,"ScrollWindow: hwnd=%04x, dx=%d, dy=%d, lpRect =%08lx clipRect=%i,%i,%i,%i\n",
- hwnd, dx, dy, (LONG)rect, (int)((clipRect)?clipRect->left:0),
- (int)((clipRect)?clipRect->top:0),
- (int)((clipRect)?clipRect->right:0),
- (int)((clipRect)?clipRect->bottom:0));
+ dprintf_scroll(stddeb,"ScrollWindow: hwnd=%04x, dx=%d, dy=%d, lpRect =%p clipRect=%i,%i,%i,%i\n",
+ hwnd, dx, dy, rect,
+ clipRect ? clipRect->left : 0,
+ clipRect ? clipRect->top : 0,
+ clipRect ? clipRect->right : 0,
+ clipRect ? clipRect->bottom : 0 );
- if ( !wndScroll || !WIN_IsWindowDrawable( wndScroll, TRUE ) ) return;
+ if ( !wndScroll || !WIN_IsWindowDrawable( wndScroll, TRUE ) ) return TRUE;
if ( !rect ) /* do not clip children */
{
- GetClientRect16(hwnd, &rc);
- hrgnClip = CreateRectRgnIndirect16( &rc );
+ GetClientRect32(hwnd, &rc);
+ hrgnClip = CreateRectRgnIndirect32( &rc );
if ((hCaretWnd == hwnd) || IsChild(hwnd,hCaretWnd))
HideCaret(hCaretWnd);
@@ -57,22 +74,21 @@
}
else /* clip children */
{
- GetClientRect16(hwnd,&rc);
- CopyRect16(&rc, rect);
+ CopyRect32(&rc, rect);
if (hCaretWnd == hwnd) HideCaret(hCaretWnd);
else hCaretWnd = 0;
- hdc = GetDC32(hwnd);
+ hdc = GetDCEx32( hwnd, 0, DCX_CACHE | DCX_USESTYLE );
}
if (clipRect == NULL)
- GetClientRect16(hwnd, &cliprc);
+ GetClientRect32(hwnd, &cliprc);
else
- CopyRect16(&cliprc, clipRect);
+ CopyRect32(&cliprc, clipRect);
hrgnUpdate = CreateRectRgn32( 0, 0, 0, 0 );
- ScrollDC(hdc, dx, dy, &rc, &cliprc, hrgnUpdate, NULL);
+ ScrollDC32( hdc, dx, dy, &rc, &cliprc, hrgnUpdate, NULL );
ReleaseDC32(hwnd, hdc);
if( !rect ) /* move child windows and update region */
@@ -94,21 +110,39 @@
DeleteObject32( hrgnUpdate );
if( hCaretWnd ) ShowCaret(hCaretWnd);
+ return TRUE;
}
/*************************************************************************
- * ScrollDC (USER.221)
- *
+ * ScrollDC16 (USER.221)
*/
-BOOL ScrollDC(HDC16 hdc, short dx, short dy, LPRECT16 rc, LPRECT16 cliprc,
- HRGN32 hrgnUpdate, LPRECT16 rcUpdate)
+BOOL16 ScrollDC16( HDC16 hdc, INT16 dx, INT16 dy, const RECT16 *rect,
+ const RECT16 *cliprc, HRGN16 hrgnUpdate, LPRECT16 rcUpdate )
+{
+ RECT32 rect32, clipRect32, rcUpdate32;
+ BOOL16 ret;
+
+ if (rect) CONV_RECT16TO32( rect, &rect32 );
+ if (cliprc) CONV_RECT16TO32( cliprc, &clipRect32 );
+ ret = ScrollDC32( hdc, dx, dy, rect ? &rect32 : NULL,
+ cliprc ? &clipRect32 : NULL, hrgnUpdate, &rcUpdate32 );
+ if (rcUpdate) CONV_RECT32TO16( &rcUpdate32, rcUpdate );
+ return ret;
+}
+
+
+/*************************************************************************
+ * ScrollDC32 (USER32.448)
+ */
+BOOL32 ScrollDC32( HDC32 hdc, INT32 dx, INT32 dy, const RECT32 *rc,
+ const RECT32 *cliprc, HRGN32 hrgnUpdate, LPRECT32 rcUpdate )
{
HRGN32 hrgnClip = 0;
HRGN32 hrgnScrollClip = 0;
- RECT16 rectClip;
- POINT16 src, dest;
- short width, height;
+ RECT32 rectClip;
+ POINT32 src, dest;
+ INT32 width, height;
DC *dc = (DC *)GDI_GetObjPtr(hdc, DC_MAGIC);
dprintf_scroll(stddeb,"ScrollDC: dx=%d dy=%d, hrgnUpdate=%04x rcUpdate = %p cliprc = %p, rc=%d %d %d %d\n",
@@ -119,17 +153,17 @@
/* set clipping region */
- if ( !rc ) GetClipBox16( hdc, &rectClip );
+ if ( !rc ) GetClipBox32( hdc, &rectClip );
else rectClip = *rc;
if (cliprc)
- IntersectRect16(&rectClip,&rectClip,cliprc);
+ IntersectRect32(&rectClip,&rectClip,cliprc);
if( rectClip.left >= rectClip.right || rectClip.top >= rectClip.bottom )
return FALSE;
hrgnClip = GetClipRgn(hdc);
- hrgnScrollClip = CreateRectRgnIndirect16(&rectClip);
+ hrgnScrollClip = CreateRectRgnIndirect32(&rectClip);
if( hrgnClip )
{
@@ -142,7 +176,7 @@
CLIPPING_UpdateGCRegion( dc );
}
else
- SelectClipRgn16( hdc, hrgnScrollClip );
+ SelectClipRgn32( hdc, hrgnScrollClip );
/* translate coordinates */
@@ -172,8 +206,8 @@
/* copy bits */
- if (!BitBlt(hdc, dest.x, dest.y, width, height, hdc, src.x, src.y,
- SRCCOPY))
+ if (!BitBlt32( hdc, dest.x, dest.y, width, height, hdc, src.x, src.y,
+ SRCCOPY))
return FALSE;
/* compute update areas */
@@ -195,23 +229,23 @@
}
else
{
- RECT16 rect;
+ RECT32 rect;
rect = rectClip; /* vertical band */
if (dx > 0) rect.right = rect.left + dx;
else if (dx < 0) rect.left = rect.right + dx;
- else SetRectEmpty16( &rect );
+ else SetRectEmpty32( &rect );
SetRectRgn( hrgn1, rect.left, rect.top, rect.right, rect.bottom );
rect = rectClip; /* horizontal band */
if (dy > 0) rect.bottom = rect.top + dy;
else if (dy < 0) rect.top = rect.bottom + dy;
- else SetRectEmpty16( &rect );
+ else SetRectEmpty32( &rect );
RgnType = REGION_UnionRectWithRgn( hrgn1, &rect );
}
- if (rcUpdate) GetRgnBox16( hrgn1, rcUpdate );
+ if (rcUpdate) GetRgnBox32( hrgn1, rcUpdate );
if (!hrgnUpdate) DeleteObject32( hrgn1 );
}
@@ -225,32 +259,55 @@
/*************************************************************************
- * ScrollWindowEx (USER.319)
+ * ScrollWindowEx16 (USER.319)
+ */
+INT16 ScrollWindowEx16( HWND16 hwnd, INT16 dx, INT16 dy, const RECT16 *rect,
+ const RECT16 *clipRect, HRGN16 hrgnUpdate,
+ LPRECT16 rcUpdate, UINT16 flags )
+{
+ RECT32 rect32, clipRect32, rcUpdate32;
+ BOOL16 ret;
+
+ if (rect) CONV_RECT16TO32( rect, &rect32 );
+ if (clipRect) CONV_RECT16TO32( clipRect, &clipRect32 );
+ ret = ScrollWindowEx32( hwnd, dx, dy, rect ? &rect32 : NULL,
+ clipRect ? &clipRect32 : NULL, hrgnUpdate,
+ &rcUpdate32, flags );
+ if (rcUpdate) CONV_RECT32TO16( &rcUpdate32, rcUpdate );
+ return ret;
+}
+
+
+/*************************************************************************
+ * ScrollWindowEx32 (USER32.450)
*
* FIXME: broken, is there a program that actually uses it?
*
*/
-
-int ScrollWindowEx(HWND hwnd, short dx, short dy, LPRECT16 rect, LPRECT16 clipRect,
- HRGN32 hrgnUpdate, LPRECT16 rcUpdate, WORD flags)
+INT32 ScrollWindowEx32( HWND32 hwnd, INT32 dx, INT32 dy, const RECT32 *rect,
+ const RECT32 *clipRect, HRGN32 hrgnUpdate,
+ LPRECT32 rcUpdate, UINT32 flags )
{
HDC32 hdc;
- RECT16 rc, cliprc;
+ RECT32 rc, cliprc;
- dprintf_scroll(stddeb,"ScrollWindowEx: dx=%d, dy=%d, wFlags=%04x\n",dx, dy, flags);
+ fprintf( stderr, "ScrollWindowEx: not fully implemented\n" );
+
+ dprintf_scroll(stddeb,"ScrollWindowEx: dx=%d, dy=%d, wFlags=%04x\n",
+ dx, dy, flags);
hdc = GetDC32(hwnd);
if (rect == NULL)
- GetClientRect16(hwnd, &rc);
+ GetClientRect32(hwnd, &rc);
else
- CopyRect16(&rc, rect);
+ CopyRect32(&rc, rect);
if (clipRect == NULL)
- GetClientRect16(hwnd, &cliprc);
+ GetClientRect32(hwnd, &cliprc);
else
- CopyRect16(&cliprc, clipRect);
+ CopyRect32(&cliprc, clipRect);
- ScrollDC(hdc, dx, dy, &rc, &cliprc, hrgnUpdate, rcUpdate);
+ ScrollDC32( hdc, dx, dy, &rc, &cliprc, hrgnUpdate, rcUpdate );
if (flags | SW_INVALIDATE)
{
diff --git a/windows/win.c b/windows/win.c
index 0221627..f9b70ee 100644
--- a/windows/win.c
+++ b/windows/win.c
@@ -43,7 +43,7 @@
static WORD wDragWidth = 4;
static WORD wDragHeight= 3;
-extern HCURSOR16 CURSORICON_IconToCursor(HICON16);
+extern HCURSOR16 CURSORICON_IconToCursor(HICON16, BOOL32);
extern HWND32 CARET_GetHwnd(void);
extern BOOL32 WINPOS_ActivateOtherWindow(WND* pWnd);
extern void WINPOS_CheckActive(HWND32);
@@ -311,6 +311,8 @@
HWND hwnd = wndPtr->hwndSelf;
WND* pWnd,*pNext;
+ dprintf_win( stddeb, "WIN_DestroyWindow: %04x\n", wndPtr->hwndSelf );
+
#ifdef CONFIG_IPC
if (main_block)
DDE_DestroyWindow(wndPtr->hwndSelf);
@@ -659,7 +661,6 @@
if (!(cs->style & WS_CHILD) && (rootWindow == DefaultRootWindow(display)))
{
XSetWindowAttributes win_attr;
- Atom XA_WM_DELETE_WINDOW;
if (Options.managed && ((cs->style & (WS_DLGFRAME | WS_THICKFRAME)) ||
(cs->dwExStyle & WS_EX_DLGMODALFRAME)))
@@ -689,9 +690,6 @@
CWEventMask | CWOverrideRedirect |
CWColormap | CWCursor | CWSaveUnder |
CWBackingStore, &win_attr );
- XA_WM_DELETE_WINDOW = XInternAtom( display, "WM_DELETE_WINDOW",
- False );
- XSetWMProtocols( display, wndPtr->window, &XA_WM_DELETE_WINDOW, 1 );
if ((wndPtr->flags & WIN_MANAGED) &&
(cs->dwExStyle & WS_EX_DLGMODALFRAME))
@@ -2069,13 +2067,13 @@
* recursively find a child that contains spDragInfo->pt point
* and send WM_QUERYDROPOBJECT
*/
-BOOL DRAG_QueryUpdate( HWND hQueryWnd, SEGPTR spDragInfo )
+BOOL16 DRAG_QueryUpdate( HWND hQueryWnd, SEGPTR spDragInfo, BOOL32 bNoSend )
{
- BOOL wParam,bResult = 0;
+ BOOL16 wParam,bResult = 0;
POINT16 pt;
LPDRAGINFO ptrDragInfo = (LPDRAGINFO) PTR_SEG_TO_LIN(spDragInfo);
WND *ptrQueryWnd = WIN_FindWndPtr(hQueryWnd),*ptrWnd;
- RECT16 tempRect; /* this sucks */
+ RECT16 tempRect;
if( !ptrQueryWnd || !ptrDragInfo ) return 0;
@@ -2112,7 +2110,7 @@
ptrWnd->hwndSelf, ptrWnd->rectWindow.left, ptrWnd->rectWindow.top,
ptrWnd->rectWindow.right, ptrWnd->rectWindow.bottom );
if( !(ptrWnd->dwStyle & WS_DISABLED) )
- bResult = DRAG_QueryUpdate(ptrWnd->hwndSelf, spDragInfo);
+ bResult = DRAG_QueryUpdate(ptrWnd->hwndSelf, spDragInfo, bNoSend);
}
if(bResult) return bResult;
@@ -2125,7 +2123,9 @@
ptrDragInfo->hScope = hQueryWnd;
- bResult = SendMessage16( hQueryWnd ,WM_QUERYDROPOBJECT ,
+ bResult = ( bNoSend )
+ ? ptrQueryWnd->dwExStyle & WS_EX_ACCEPTFILES
+ : SendMessage16( hQueryWnd ,WM_QUERYDROPOBJECT ,
(WPARAM16)wParam ,(LPARAM) spDragInfo );
if( !bResult )
ptrDragInfo->pt = pt;
@@ -2191,7 +2191,7 @@
short dragDone = 0;
HCURSOR16 hCurrentCursor = 0;
HWND hCurrentWnd = 0;
- WORD btemp;
+ BOOL16 b;
lpDragInfo = (LPDRAGINFO) GlobalLock16(hDragInfo);
spDragInfo = (SEGPTR) WIN16_GlobalLock16(hDragInfo);
@@ -2208,7 +2208,7 @@
if(hCursor)
{
- if( !(hDragCursor = CURSORICON_IconToCursor(hCursor)) )
+ if( !(hDragCursor = CURSORICON_IconToCursor(hCursor, FALSE)) )
{
GlobalFree16(hDragInfo);
return 0L;
@@ -2244,7 +2244,7 @@
/* update DRAGINFO struct */
dprintf_msg(stddeb,"drag: lpDI->hScope = %04x\n",lpDragInfo->hScope);
- if( (btemp = (WORD)DRAG_QueryUpdate(hwndScope, spDragInfo)) > 0 )
+ if( (b = DRAG_QueryUpdate(hwndScope, spDragInfo, FALSE)) > 0 )
hCurrentCursor = hCursor;
else
{
@@ -2254,7 +2254,7 @@
if( hCurrentCursor )
SetCursor(hCurrentCursor);
- dprintf_msg(stddeb,"drag: got %04x\n",btemp);
+ dprintf_msg(stddeb,"drag: got %04x\n", b);
/* send WM_DRAGLOOP */
SendMessage16( hWnd, WM_DRAGLOOP, (WPARAM16)(hCurrentCursor != hBummer) ,
diff --git a/windows/winpos.c b/windows/winpos.c
index 7d0dd30..81a727e 100644
--- a/windows/winpos.c
+++ b/windows/winpos.c
@@ -253,7 +253,7 @@
*
* Find the window and hittest for a given point.
*/
-INT16 WINPOS_WindowFromPoint( POINT16 pt, WND **ppWnd )
+INT16 WINPOS_WindowFromPoint( WND* wndScope, POINT16 pt, WND **ppWnd )
{
WND *wndPtr;
INT16 hittest = HTERROR;
@@ -262,7 +262,7 @@
*ppWnd = NULL;
x = pt.x;
y = pt.y;
- wndPtr = WIN_GetDesktop()->child;
+ wndPtr = wndScope->child;
for (;;)
{
while (wndPtr)
@@ -298,11 +298,20 @@
else wndPtr = wndPtr->next;
}
- /* If nothing found, return the desktop window */
+ /* If nothing found, return the scope window */
if (!*ppWnd)
{
- *ppWnd = WIN_GetDesktop();
- return HTCLIENT;
+ *ppWnd = wndScope;
+ if( pt.x >= (wndScope->rectClient.left - wndScope->rectWindow.left) &&
+ pt.x >= (wndScope->rectClient.top - wndScope->rectWindow.top ) &&
+ pt.x <= (wndScope->rectClient.right - wndScope->rectWindow.left) &&
+ pt.x <= (wndScope->rectClient.bottom - wndScope->rectWindow.top ) )
+ return HTCLIENT;
+ if( pt.x < 0 || pt.y < 0 ||
+ pt.x > (wndScope->rectWindow.right - wndScope->rectWindow.left) ||
+ pt.y > (wndScope->rectWindow.bottom - wndScope->rectWindow.top ) )
+ return HTNOWHERE;
+ return HTCAPTION; /* doesn't matter in this case */
}
/* Send the WM_NCHITTEST message (only if to the same task) */
@@ -331,7 +340,7 @@
HWND16 WindowFromPoint16( POINT16 pt )
{
WND *pWnd;
- WINPOS_WindowFromPoint( pt, &pWnd );
+ WINPOS_WindowFromPoint( WIN_GetDesktop(), pt, &pWnd );
return pWnd->hwndSelf;
}
@@ -344,7 +353,7 @@
WND *pWnd;
POINT16 pt16;
CONV_POINT32TO16( &pt, &pt16 );
- WINPOS_WindowFromPoint( pt16, &pWnd );
+ WINPOS_WindowFromPoint( WIN_GetDesktop(), pt16, &pWnd );
return (HWND32)pWnd->hwndSelf;
}
@@ -1419,9 +1428,12 @@
if( uFlags & SMC_NOCOPY ) /* invalidate Wnd visible region */
{
- if (my != NULLREGION) PAINT_RedrawWindow( Wnd->hwndSelf, NULL, newVisRgn, RDW_INVALIDATE |
- RDW_FRAME | RDW_ALLCHILDREN | RDW_ERASE, RDW_C_USEHRGN );
- }
+ if (my != NULLREGION)
+ PAINT_RedrawWindow( Wnd->hwndSelf, NULL, newVisRgn, RDW_INVALIDATE |
+ RDW_FRAME | RDW_ALLCHILDREN | RDW_ERASE, RDW_C_USEHRGN );
+ else if(uFlags & SMC_DRAWFRAME)
+ Wnd->flags |= WIN_NEEDS_NCPAINT;
+ }
else /* bitblt old client area */
{
HDC32 hDC;
@@ -1471,9 +1483,8 @@
DCX_KEEPCLIPRGN | DCX_INTERSECTRGN |
DCX_CACHE | DCX_CLIPSIBLINGS);
- BitBlt( hDC, xto, yto, width, height, hDC, xfrom, yfrom, SRCCOPY );
-
- ReleaseDC32( Wnd->parent->hwndSelf, hDC);
+ BitBlt32( hDC, xto, yto, width, height, hDC, xfrom, yfrom, SRCCOPY );
+ ReleaseDC32( Wnd->parent->hwndSelf, hDC);
}
if( update != NULLREGION )