From 0c126c7c61792221e6e26ae6c7d08d848aa32d04 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Sun, 18 Feb 1996 18:44:41 +0000 Subject: [PATCH] Release 960218 Sun Feb 18 16:35:54 1996 Alexandre Julliard * [controls/desktop.c] Look for the wallpaper file in the Windows directory. * [controls/menu.c] Fixed swapped parameters in SetMenuItemBitmaps(). Create a separator in MENU_SetItemData() when the string is NULL. * [file/dosfs.c] DOSFS_FindNext: don't return '.' and '..' in a drive root dir. * [files/file.c] Added a DOS_FILE structure to store per-file information (not really used yet). Fixed _lread and _hread to check the size of the buffer before calling Unix read() to avoid EFAULT error. * [misc/exec.c] Return TRUE in WinHelp() for HELP_QUIT to quiet Notepad on exit. * [miscemu/instr.c] Call DOSMEM_Alarm() in INSTR_ReplaceSelector(). This should fix programs that poll the BIOS counter, provided they reload the selector on every read. * [miscemu/int21.c] Re-implemented FindFirst/FindNext for FCB calls. * [windows/message.c] [windows/winpos.c] Merged MSG_GetWindowForEvent() and WINPOS_WindowFromPoint(). * [windows/nonclient.c] [windows/win.c] [include/windows.h] Added a per-window WIN_MANAGED flag; only windows that have a dialog frame or a sizing border are managed. Sat Feb 17 18:25:00 1996 Thomas Sandford * [if1632/Makefile.in] Added -g flag to compilation of .c files generated from *32.spec. * [if1632/gdi32.spec] Numerous additional functions implemented. * if1632/user32.spec] wsprintfA maps to vsprintf not wsprintf Numerous additional functions implemented. * [include/gdi.h] [objects/gdiobj.c] New #define MAGIC_DONTCARE added. This is used in GDI_GetObjPtr to enable getting a pointer to a GDI object of unknow type. * [win32/gdi32.c] New file. * [win32/param32.c] WIN32_MoveToEx() - handle NULL pointer argument. * [win32/user32.c] USER32_InvalidateRect - handle passing of a NULL pointer. USER32_SetTimer - New function. * [files/directory.c] Fixed DIR_Init() (off by one in allocation of space for environment variables). * [files/drive.c] Added to #includes (prerequisite for on FreeBSD). Fri Feb 16 10:26:56 1996 Andreas Kirschbaum * [controls/menu.c] Memory leak plugged. * [controls/edit.c] Erase space with function ExtTextOut(). This eliminates the use of xmalloc(). Memory leak in EDIT_WriteText plugged. * [debugger/db_disasm.c] Operand for scas now is di. * [files/profile.c] PROFILE_GetSection was copying too much data. PROFILE_GetSection now returns the correct value. It was returning the number of unused instead of used bytes. * [objects/dc.c] Corrected two typos in comments. * [objects/font.c] FONT_MatchFont didn't return if it couldn't find any font. * [objects/oembitmap.c] Free object only if it has been allocated. * [windows/scroll.c] Memory leak in ScrollDC plugged. Tue Feb 13 11:17:00 1996 William Magro * [controls/edit.c] Implemented ES_NOHIDESEL style, shift+click selection, shift+{arrow,home,end,pgup,pgdn} selection. Optimized (de)selection drawing. Changed selection drawing to use correct system colors instead of inverting. Fixed deleting or backspacing across a '\r\n' end of line pair. Selection now anchors correctly. Fixed text leaking and extra garbage problem bug uncovered by change in class style in wine960131. * [controls/widgets.c] Class flags now match those of Windows. Mon Feb 12 21:28:19 1996 Martin von Loewis * [controls/widgets.c] WIDGETS_Init: RELAY32_GetEntryPoint does not take a string anymore. * [if1632/Makefile.in][if1632/relay32.c][include/relay32.h] comctl32.spec ole32.spec winspool.spec: new files. RELAY32_Init: call initialization of new DLLs. RELAY32_GetEntryPoint: expects WIN32_builtin* now. RELAY32_MakeFakeModule: new function. * [if1632/gdi32.spec][if1632/kernel32.spec][if1632/user32.spec] Added Win95 functions. Ordinals now differ from both NT and Win95 HeapCreate, CreateDialogIndirectParamA, CreateDialogIndirectParamW, CreateDialogParamA, CreateDialogParamW, DialogBoxIndirectParamA DialogBoxIndirectParamW, DialogBoxParamA, DialogBoxParamW: new relays. * [if1632/shell32.spec] shell32.spec: renumbered all functions to take into account ordinals. These seem to be identical between NT and Win95. * [include/dialog.h][windows/dialog.c] xBaseUnit,yBaseUnit,DIALOG_DoDialogBox: made non-static. * [include/handle32.h] New handle types VRANGE, HEAP, HEAPITEM. * [include/pe_image.h][loader/pe_image.c] struct w_files: new field builtin. PE_FindExportedFunction: support ordinals. PE_GetProcAddress: call RELAY32_GetEntryPoint for builtins. fixup_imports: support ordinals. PE_LoadImage: prefer directories over segments. * [include/resource.h][win32/resource.c] FindResource32: changed parameter from LPCTSTR to LPCWSTR check LANG_NEUTRAL if LANG_ENGLISH fails. LoadAcceleratorsW,SizeofResource32,AccessResource32: disabled because it's broken. Casted to and from LPWSTR at various places. * [include/string32.h][win32/string32.c] Changed prototypes to take const arguments where appropriate. * [include/struct32.h] New structures DLGTEMPLATE32, DLGITEMTEMPLATE32. * [tools/build.c] BuildSpec32Files: generate Base value into code, generate call to RELAY32_MakeFakeModule. * [win32/heap.c] This is still not finished and needs rework. HeapAlloc: renamed to SIMPLE_HeapAlloc, implemented HeapAlloc. HeapCreate: implemented on top of VirtualAlloc, which does not work yet HeapDestroy, HEAP_GrowHeap, HeapFree: new functions. * [win32/memory.c] Support for VRANGE_OBJECT. This is not yet called from any place, and needs more platform specific support MEMORY_FindVrange, MEMORY_IsVrangeFree, MEMORY_InsertVrange, MEMORY_AllocVrange, MEMORY_ReleaseVrange: new functions. * [win32/user32.c] WIN32_CreateWindowExA: don't GlobalAlloc for integer class and window names, as in dialogs. Implemented dialog functions (see user32.spec). * [windows/caret.c] CARET_Initialize: call RELAY32_GetBuiltinDLL. Mon Feb 12 18:52:40 1996 Jim Peterson * [controls/edit.c] Removed commented out #ifdefs for WINELIB. * [tools/makehtml.pl] Put in error checking when trying to open a file. * [libtest/Makefile.in] [libtest/new.c] [libtest/hello4.c] Added two new targets: hello4 and new. * [include/windows.h] Added definition of DEVMODE structure, although it's not yet used. Modified various API functions from CreateDC() to Escape(), in order to make them more compliant with the strict API definitions. * [include/wintypes.h] Added 'typedef char TCHAR'. It probably should be defined as 'short', but then we would have to support such characters. Also did 'typedef const TCHAR* LPCTSTR' and 'typedef TCHAR* LPTSTR'. Also defined WNDENUMPROC, FONTENUMPROC, GOBJENUMPROC, PROPENUMPROC MFENUMPROC, and HGDIOBJ. Mon Feb 5 16:42:07 1996 Frans van Dorsselaer * [misc/commdlg.c] Patched a bug that occurred in the internal COMMDLG module for the FileOpen(), FileSave() and FileSaveAs() functions. The file-type combobox is now handled correctly. Fri Feb 2 22:52:58 1996 Roman Dolejsi * [resources/sysres_Cz.rc] Added support for Czech [Cz] language. Thu Feb 1 00:35:04 1996 Philippe De Muyter * [objects/font.c] FONT_matchfont : for fixed-spacing fonts, allow 'c' if 'm' fails; for variable-spacing fonts : allow '*' if 'p' fails; if asked lfHeight is -1, assume 0. CreateFontIndirect : if font parameter is NULL, issue an error message. CreateFont : null-terminate lfFaceName. ParseFontParms : debug code turned off : too verbose. InitFontsList : recognize *-c-* fonts as fixed-spacing fonts. * [objects/color.c] ColorToPhysical : admit 0xff...... COLORREF's as 0x00...... ones. --- ANNOUNCE | 25 +- ChangeLog | 238 +++++++++++++++++- README | 2 +- controls/combo.c | 4 +- controls/desktop.c | 17 +- controls/edit.c | 338 ++++++++++++-------------- controls/listbox.c | 8 +- controls/menu.c | 68 +++--- controls/scroll.c | 2 +- controls/widgets.c | 37 +-- debugger/db_disasm.c | 4 +- files/directory.c | 4 +- files/dos_fs.c | 23 +- files/drive.c | 3 +- files/file.c | 336 +++++++++++++++---------- files/profile.c | 7 +- if1632/Makefile.in | 17 +- if1632/comctl32.spec | 60 +++++ if1632/gdi32.spec | 36 ++- if1632/kernel.spec | 4 +- if1632/kernel32.spec | 21 +- if1632/ole32.spec | 165 +++++++++++++ if1632/relay32.c | 130 +++++----- if1632/shell32.spec | 200 +++++++++------ if1632/user32.spec | 50 ++-- if1632/winspool.spec | 126 ++++++++++ include/debug.h | 273 +++++++++++---------- include/dialog.h | 3 + include/file.h | 3 +- include/gdi.h | 1 + include/handle32.h | 29 +++ include/miscemu.h | 1 + include/msdos.h | 37 +-- include/options.h | 3 +- include/pe_image.h | 31 +-- include/relay32.h | 9 +- include/resource32.h | 7 +- include/stddebug.h | 2 + include/string32.h | 8 +- include/struct32.h | 22 ++ include/win.h | 17 +- include/windows.h | 201 ++++++++------- include/winpos.h | 1 + include/wintypes.h | 23 +- library/miscstubs.c | 8 +- libtest/Makefile.in | 12 +- libtest/hello4.c | 121 +++++++++ libtest/new.c | 153 ++++++++++++ loader/main.c | 8 +- loader/pe_image.c | 66 ++--- memory/ldt.c | 1 + memory/local.c | 1 + memory/selector.c | 7 +- misc/clipboard.c | 2 +- misc/commdlg.c | 68 +++--- misc/escape.c | 4 +- misc/exec.c | 2 + misc/main.c | 3 +- misc/ole2nls.c | 1 + misc/rect.c | 2 +- misc/shell.c | 5 +- misc/toolhelp.c | 2 +- misc/xmalloc.c | 4 +- miscemu/dosmem.c | 2 +- miscemu/dpmi.c | 12 + miscemu/instr.c | 1 + miscemu/int21.c | 149 ++++++------ miscemu/int2f.c | 2 + objects/color.c | 19 +- objects/cursoricon.c | 11 +- objects/dc.c | 10 +- objects/font.c | 61 ++++- objects/gdiobj.c | 6 +- objects/metafile.c | 9 +- objects/oembitmap.c | 21 +- objects/palette.c | 2 +- objects/pen.c | 2 +- objects/region.c | 12 +- objects/text.c | 4 +- rc/README | 7 +- resources/Makefile.in | 2 +- resources/sysres.c | 4 +- resources/sysres_Cz.rc | 200 +++++++++++++++ {documentation => tools}/apiw.index | 0 tools/build.c | 6 +- tools/makehtml.pl | 8 +- win32/Makefile.in | 1 + win32/gdi32.c | 74 ++++++ win32/heap.c | 157 +++++++++++- win32/memory.c | 129 ++++++++++ win32/param32.c | 8 +- win32/resource.c | 84 +++---- win32/string32.c | 6 +- win32/user32.c | 365 ++++++++++++++++++++++++++-- windows/caret.c | 8 +- windows/dialog.c | 23 +- windows/graphics.c | 2 +- windows/mapping.c | 2 +- windows/mdi.c | 6 +- windows/message.c | 86 +------ windows/msgbox.c | 3 +- windows/nonclient.c | 237 +++++++++--------- windows/painting.c | 3 +- windows/property.c | 2 +- windows/scroll.c | 2 + windows/win.c | 14 +- windows/winpos.c | 132 +++++----- wine.man | 2 +- 108 files changed, 3545 insertions(+), 1417 deletions(-) create mode 100644 if1632/comctl32.spec create mode 100644 if1632/ole32.spec create mode 100644 if1632/winspool.spec create mode 100644 libtest/hello4.c create mode 100644 libtest/new.c create mode 100644 resources/sysres_Cz.rc rename {documentation => tools}/apiw.index (100%) create mode 100644 win32/gdi32.c diff --git a/ANNOUNCE b/ANNOUNCE index 2f3d6e13e51..f46d24061c8 100644 --- a/ANNOUNCE +++ b/ANNOUNCE @@ -1,15 +1,14 @@ -This is release 960131 of Wine the MS Windows emulator. This is still a +This is release 960218 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. -Patches should be submitted to "wine-new@amscons.com". Please don't forget -to include a ChangeLog entry. I'll make a new release every other week. +Patches should be submitted to "julliard@lrc.epfl.ch". Please don't +forget to include a ChangeLog entry. -WHAT'S NEW with Wine-960131: (see ChangeLog for details) - - New format for drives configuration in wine.conf; please - check your configuration files. - - Many MDI improvements. - - Even more Win32 code. +WHAT'S NEW with Wine-960218: (see ChangeLog for details) + - Lots of edit control fixes. + - Czech language support. + - As usual, more Win32 code. - Lots of bug fixes. See the README file in the distribution for installation instructions. @@ -18,10 +17,10 @@ Because of lags created by using mirror, this message may reach you before the release is available at the ftp sites. The sources will be available from the following locations: - sunsite.unc.edu:/pub/Linux/ALPHA/wine/Wine-960131.tar.gz - tsx-11.mit.edu:/pub/linux/ALPHA/Wine/development/Wine-960131.tar.gz - ftp.infomagic.com:/pub/mirrors/linux/wine/development/Wine-960131.tar.gz - aris.com:/pub/linux/ALPHA/Wine/development/Wine-960131.tar.gz + sunsite.unc.edu:/pub/Linux/ALPHA/wine/Wine-960218.tar.gz + tsx-11.mit.edu:/pub/linux/ALPHA/Wine/development/Wine-960218.tar.gz + ftp.infomagic.com:/pub/mirrors/linux/wine/development/Wine-960218.tar.gz + aris.com:/pub/linux/ALPHA/Wine/development/Wine-960218.tar.gz It should also be available from any site that mirrors tsx-11 or sunsite. @@ -49,4 +48,4 @@ and James Youngman. -- Alexandre Julliard -julliard@sunsite.unc.edu +julliard@lrc.epfl.ch diff --git a/ChangeLog b/ChangeLog index e5a42a0dc5b..315a1ca6a07 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,241 @@ ---------------------------------------------------------------------- -Wed Jan 31 10:58:00 1996 Alexandre Julliard +Sun Feb 18 16:35:54 1996 Alexandre Julliard + + * [controls/desktop.c] + Look for the wallpaper file in the Windows directory. + + * [controls/menu.c] + Fixed swapped parameters in SetMenuItemBitmaps(). + Create a separator in MENU_SetItemData() when the string is NULL. + + * [file/dosfs.c] + DOSFS_FindNext: don't return '.' and '..' in a drive root dir. + + * [files/file.c] + Added a DOS_FILE structure to store per-file information (not + really used yet). + Fixed _lread and _hread to check the size of the buffer before + calling Unix read() to avoid EFAULT error. + + * [misc/exec.c] + Return TRUE in WinHelp() for HELP_QUIT to quiet Notepad on exit. + + * [miscemu/instr.c] + Call DOSMEM_Alarm() in INSTR_ReplaceSelector(). This should fix + programs that poll the BIOS counter, provided they reload the + selector on every read. + + * [miscemu/int21.c] + Re-implemented FindFirst/FindNext for FCB calls. + + * [windows/message.c] [windows/winpos.c] + Merged MSG_GetWindowForEvent() and WINPOS_WindowFromPoint(). + + * [windows/nonclient.c] [windows/win.c] [include/windows.h] + Added a per-window WIN_MANAGED flag; only windows that have a + dialog frame or a sizing border are managed. + +Sat Feb 17 18:25:00 1996 Thomas Sandford + + * [if1632/Makefile.in] + Added -g flag to compilation of .c files generated from *32.spec. + + * [if1632/gdi32.spec] + Numerous additional functions implemented. + + * if1632/user32.spec] + wsprintfA maps to vsprintf not wsprintf + Numerous additional functions implemented. + + * [include/gdi.h] [objects/gdiobj.c] + New #define MAGIC_DONTCARE added. This is used in + GDI_GetObjPtr to enable getting a pointer to a GDI object of + unknow type. + + * [win32/gdi32.c] + New file. + + * [win32/param32.c] + WIN32_MoveToEx() - handle NULL pointer argument. + + * [win32/user32.c] + USER32_InvalidateRect - handle passing of a NULL pointer. + USER32_SetTimer - New function. + + * [files/directory.c] + Fixed DIR_Init() (off by one in allocation of space for + environment variables). + + * [files/drive.c] + Added to #includes (prerequisite for + on FreeBSD). + +Fri Feb 16 10:26:56 1996 Andreas Kirschbaum + + * [controls/menu.c] + Memory leak plugged. + + * [controls/edit.c] + Erase space with function ExtTextOut(). This eliminates the use of + xmalloc(). Memory leak in EDIT_WriteText plugged. + + * [debugger/db_disasm.c] + Operand for scas now is di. + + * [files/profile.c] + PROFILE_GetSection was copying too much data. + PROFILE_GetSection now returns the correct value. It was returning + the number of unused instead of used bytes. + + * [objects/dc.c] + Corrected two typos in comments. + + * [objects/font.c] + FONT_MatchFont didn't return if it couldn't find any font. + + * [objects/oembitmap.c] + Free object only if it has been allocated. + + * [windows/scroll.c] + Memory leak in ScrollDC plugged. + +Tue Feb 13 11:17:00 1996 William Magro + + * [controls/edit.c] + Implemented ES_NOHIDESEL style, shift+click selection, + shift+{arrow,home,end,pgup,pgdn} selection. Optimized + (de)selection drawing. Changed selection drawing to use correct + system colors instead of inverting. Fixed deleting or backspacing + across a '\r\n' end of line pair. Selection now anchors + correctly. Fixed text leaking and extra garbage problem bug + uncovered by change in class style in wine960131. + + * [controls/widgets.c] + Class flags now match those of Windows. + +Mon Feb 12 21:28:19 1996 Martin von Loewis + + * [controls/widgets.c] + WIDGETS_Init: RELAY32_GetEntryPoint does not take a string anymore. + + * [if1632/Makefile.in][if1632/relay32.c][include/relay32.h] + comctl32.spec ole32.spec winspool.spec: new files. + RELAY32_Init: call initialization of new DLLs. + RELAY32_GetEntryPoint: expects WIN32_builtin* now. + RELAY32_MakeFakeModule: new function. + + * [if1632/gdi32.spec][if1632/kernel32.spec][if1632/user32.spec] + Added Win95 functions. Ordinals now differ from both NT and Win95 + HeapCreate, CreateDialogIndirectParamA, CreateDialogIndirectParamW, + CreateDialogParamA, CreateDialogParamW, DialogBoxIndirectParamA + DialogBoxIndirectParamW, DialogBoxParamA, DialogBoxParamW: + new relays. + + * [if1632/shell32.spec] + shell32.spec: renumbered all functions to take into account ordinals. + These seem to be identical between NT and Win95. + + * [include/dialog.h][windows/dialog.c] + xBaseUnit,yBaseUnit,DIALOG_DoDialogBox: made non-static. + + * [include/handle32.h] + New handle types VRANGE, HEAP, HEAPITEM. + + * [include/pe_image.h][loader/pe_image.c] + struct w_files: new field builtin. + PE_FindExportedFunction: support ordinals. + PE_GetProcAddress: call RELAY32_GetEntryPoint for builtins. + fixup_imports: support ordinals. + PE_LoadImage: prefer directories over segments. + + * [include/resource.h][win32/resource.c] + FindResource32: changed parameter from LPCTSTR to LPCWSTR + check LANG_NEUTRAL if LANG_ENGLISH fails. + LoadAcceleratorsW,SizeofResource32,AccessResource32: + disabled because it's broken. + Casted to and from LPWSTR at various places. + + * [include/string32.h][win32/string32.c] + Changed prototypes to take const arguments where appropriate. + + * [include/struct32.h] + New structures DLGTEMPLATE32, DLGITEMTEMPLATE32. + + * [tools/build.c] + BuildSpec32Files: generate Base value into code, generate call to + RELAY32_MakeFakeModule. + + * [win32/heap.c] + This is still not finished and needs rework. + HeapAlloc: renamed to SIMPLE_HeapAlloc, implemented HeapAlloc. + HeapCreate: implemented on top of VirtualAlloc, which does not work yet + HeapDestroy, HEAP_GrowHeap, HeapFree: new functions. + + * [win32/memory.c] + Support for VRANGE_OBJECT. This is not yet called from any place, + and needs more platform specific support + MEMORY_FindVrange, MEMORY_IsVrangeFree, MEMORY_InsertVrange, + MEMORY_AllocVrange, MEMORY_ReleaseVrange: new functions. + + * [win32/user32.c] + WIN32_CreateWindowExA: don't GlobalAlloc for integer class and window + names, as in dialogs. + Implemented dialog functions (see user32.spec). + + * [windows/caret.c] + CARET_Initialize: call RELAY32_GetBuiltinDLL. + +Mon Feb 12 18:52:40 1996 Jim Peterson + + * [controls/edit.c] + Removed commented out #ifdefs for WINELIB. + + * [tools/makehtml.pl] + Put in error checking when trying to open a file. + + * [libtest/Makefile.in] [libtest/new.c] [libtest/hello4.c] + Added two new targets: hello4 and new. + + * [include/windows.h] + Added definition of DEVMODE structure, although it's not yet used. + Modified various API functions from CreateDC() to Escape(), in + order to make them more compliant with the strict API definitions. + + * [include/wintypes.h] + Added 'typedef char TCHAR'. It probably should be defined as + 'short', but then we would have to support such characters. Also did + 'typedef const TCHAR* LPCTSTR' and 'typedef TCHAR* LPTSTR'. + Also defined WNDENUMPROC, FONTENUMPROC, GOBJENUMPROC, PROPENUMPROC + MFENUMPROC, and HGDIOBJ. + +Mon Feb 5 16:42:07 1996 Frans van Dorsselaer + + * [misc/commdlg.c] + Patched a bug that occurred in the internal COMMDLG module for the + FileOpen(), FileSave() and FileSaveAs() functions. The file-type + combobox is now handled correctly. + +Fri Feb 2 22:52:58 1996 Roman Dolejsi + + * [resources/sysres_Cz.rc] + Added support for Czech [Cz] language. + +Thu Feb 1 00:35:04 1996 Philippe De Muyter + + * [objects/font.c] + FONT_matchfont : for fixed-spacing fonts, allow 'c' if 'm' fails; + for variable-spacing fonts : allow '*' if 'p' fails; if asked lfHeight + is -1, assume 0. + CreateFontIndirect : if font parameter is NULL, issue an error message. + CreateFont : null-terminate lfFaceName. + ParseFontParms : debug code turned off : too verbose. + InitFontsList : recognize *-c-* fonts as fixed-spacing fonts. + + * [objects/color.c] + ColorToPhysical : admit 0xff...... COLORREF's as 0x00...... ones. + +-------------------------------------------------------------------- +Wed Jan 31 10:58:00 1996 Alexandre Julliard * [configure.in] Added --with-dll option to build libwine.so. diff --git a/README b/README index 54543850fcd..135cf3c404b 100644 --- a/README +++ b/README @@ -77,7 +77,7 @@ comp.emulators.ms-windows.wine. The Wine FAQ is posted there every month. If you add something, or fix a bug, please send a patch ('diff -u' -format preferred) to wine-new@amscons.com for inclusion in the next +format preferred) to julliard@lrc.epfl.ch for inclusion in the next release. -- diff --git a/controls/combo.c b/controls/combo.c index 378115e1de7..6cc8eae6463 100644 --- a/controls/combo.c +++ b/controls/combo.c @@ -986,7 +986,7 @@ LRESULT ComboLBoxWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) /************************************************************************ * DlgDirSelectComboBox [USER.194] */ -BOOL DlgDirSelectComboBox(HWND hDlg, LPSTR lpStr, int nIDLBox) +BOOL DlgDirSelectComboBox(HWND hDlg, LPSTR lpStr, INT nIDLBox) { fprintf(stdnimp,"DlgDirSelectComboBox("NPFMT", '%s', %d) \n", hDlg, lpStr, nIDLBox); @@ -998,7 +998,7 @@ BOOL DlgDirSelectComboBox(HWND hDlg, LPSTR lpStr, int nIDLBox) * DlgDirListComboBox [USER.195] */ INT DlgDirListComboBox( HWND hDlg, SEGPTR path, INT idCBox, - INT idStatic, WORD wType ) + INT idStatic, UINT wType ) { INT ret = 0; diff --git a/controls/desktop.c b/controls/desktop.c index 9f462c6e583..77faca71547 100644 --- a/controls/desktop.c +++ b/controls/desktop.c @@ -2,9 +2,7 @@ * Desktop window class. * * Copyright 1994 Alexandre Julliard - -static char Copyright[] = "Copyright Alexandre Julliard, 1994"; -*/ + */ #include #include @@ -13,6 +11,7 @@ static char Copyright[] = "Copyright Alexandre Julliard, 1994"; #include #include "win.h" #include "desktop.h" +#include "directory.h" #include "dos_fs.h" #include "graphics.h" @@ -34,7 +33,17 @@ static HBITMAP DESKTOP_LoadBitmap( HDC hdc, const char *filename ) /* Read all the file into memory */ - if (!(unixFileName = DOSFS_GetUnixFileName( filename, TRUE ))) return 0; + if (!(unixFileName = DOSFS_GetUnixFileName( filename, TRUE ))) + { + int len = DIR_GetWindowsUnixDir( NULL, 0 ); + if (!(buffer = malloc( len + strlen(filename) + 2 ))) return 0; + DIR_GetWindowsUnixDir( buffer, len + 1 ); + strcat( buffer, "/" ); + strcat( buffer, filename ); + unixFileName = DOSFS_GetUnixFileName( buffer, TRUE ); + free( buffer ); + if (!unixFileName) return 0; + } if ((file = open( unixFileName, O_RDONLY )) == -1) return 0; size = lseek( file, 0, SEEK_END ); if (!(buffer = (char *)malloc( size ))) diff --git a/controls/edit.c b/controls/edit.c index c0f7222db29..73ce4047a75 100644 --- a/controls/edit.c +++ b/controls/edit.c @@ -2,9 +2,8 @@ * Edit control * * Copyright David W. Metcalfe, 1994 + * Copyright William Magro, 1995, 1996 * - * Release 3, July 1994 - * April 1995 bug fixes (William Magro) */ #include @@ -50,7 +49,6 @@ typedef struct HANDLE hText; /* handle to text buffer */ INT *CharWidths; /* widths of chars in font */ unsigned int *textptrs; /* list of line offsets */ - char *BlankLine; /* to fill blank lines quickly */ int CurrCol; /* current column */ int CurrLine; /* current line */ int WndCol; /* current window column */ @@ -78,8 +76,8 @@ typedef struct #define EditBufStartLen(hwnd) (GetWindowLong(hwnd,GWL_STYLE) & ES_MULTILINE \ ? EDITLEN : ENTRYLEN) #define CurrChar (EDIT_TextLine(hwnd, es->CurrLine) + es->CurrCol) -#define SelMarked(es) ((es)->SelBegLine != 0 || (es)->SelBegCol != 0 || \ - (es)->SelEndLine != 0 || (es)->SelEndCol != 0) +#define SelMarked(es) (((es)->SelBegCol != (es)->SelEndCol) || \ + ((es)->SelBegLine != (es)->SelEndLine)) #define ROUNDUP(numer, denom) (((numer) % (denom)) \ ? ((((numer) + (denom)) / (denom)) * (denom)) \ : (numer) + (denom)) @@ -459,11 +457,12 @@ static void EDIT_WriteText(HWND hwnd, char *lp, int off, int len, int row, HDC hdc; HANDLE hStr; char *str, *cp, *cp1; - int diff=0, num_spaces, tabwidth, scol; + int diff=0, tabwidth, scol; HRGN hrgnClip; COLORREF oldTextColor, oldBkgdColor; HFONT oldfont; EDITSTATE *es = EDIT_GetEditState(hwnd); + RECT rc2; dprintf_edit(stddeb,"EDIT_WriteText lp=%s, off=%d, len=%d, row=%d, col=%d, reverse=%d\n", lp, off, len, row, col, reverse); @@ -478,6 +477,7 @@ static void EDIT_WriteText(HWND hwnd, char *lp, int off, int len, int row, str = (char *)EDIT_HeapLock(hwnd, hStr); hrgnClip = CreateRectRgnIndirect(rc); SelectClipRgn(hdc, hrgnClip); + DeleteObject(hrgnClip); if (es->hFont) oldfont = (HFONT)SelectObject(hdc, (HANDLE)es->hFont); @@ -495,21 +495,12 @@ static void EDIT_WriteText(HWND hwnd, char *lp, int off, int len, int row, { oldBkgdColor = GetBkColor(hdc); oldTextColor = GetTextColor(hdc); - SetBkColor(hdc, oldTextColor); - SetTextColor(hdc, oldBkgdColor); + SetBkColor(hdc, GetSysColor(COLOR_HIGHLIGHT)); + SetTextColor(hdc, GetSysColor(COLOR_HIGHLIGHTTEXT)); } else /* -Wall does not see the use of if */ oldTextColor = oldBkgdColor = 0; - if (strlen(es->BlankLine) < (es->ClientWidth / es->CharWidths[32]) + 2) - { - dprintf_edit( stddeb, "EDIT_WriteText: realloc\n" ); - es->BlankLine = xrealloc(es->BlankLine, - (es->ClientWidth / es->CharWidths[32]) + 2); - memset(es->BlankLine, ' ', (es->ClientWidth / es->CharWidths[32]) + 2); - es->BlankLine[(es->ClientWidth / es->CharWidths[32]) + 1] = 0; - } - if ((es->PasswordChar && GetWindowLong( hwnd, GWL_STYLE ) & ES_PASSWORD)) { int len = strlen(str); @@ -525,8 +516,8 @@ static void EDIT_WriteText(HWND hwnd, char *lp, int off, int len, int row, TextOut(hdc, col - diff, row * es->txtht, str, (int)(cp - str)); scol = EDIT_StrWidth(hwnd, str, (int)(cp - str), 0); tabwidth = EDIT_CharWidth(hwnd, VK_TAB, scol); - num_spaces = tabwidth / es->CharWidths[32] + 1; - TextOut(hdc, scol, row * es->txtht, es->BlankLine, num_spaces); + SetRect(&rc2, scol, row * es->txtht, scol+tabwidth, (row + 1) * es->txtht); + ExtTextOut(hdc, 0, 0, ETO_OPAQUE, &rc2, "", 0, NULL); cp++; scol += tabwidth; @@ -535,8 +526,8 @@ static void EDIT_WriteText(HWND hwnd, char *lp, int off, int len, int row, TextOut(hdc, scol, row * es->txtht, cp, (int)(cp1 - cp)); scol += EDIT_StrWidth(hwnd, cp, (int)(cp1 - cp), scol); tabwidth = EDIT_CharWidth(hwnd, VK_TAB, scol); - num_spaces = tabwidth / es->CharWidths[32] + 1; - TextOut(hdc, scol, row * es->txtht, es->BlankLine, num_spaces); + SetRect(&rc2, scol, row * es->txtht, scol+tabwidth, (row + 1) * es->txtht); + ExtTextOut( hdc, 0, 0, ETO_OPAQUE, &rc2, "", 0, NULL ); cp = ++cp1; scol += tabwidth; } @@ -551,13 +542,11 @@ static void EDIT_WriteText(HWND hwnd, char *lp, int off, int len, int row, } /* blank out remainder of line if appropriate */ - if (blank) + if (blank && ((rc->right - col) > len)) { - if ((rc->right - col) > len) - { - num_spaces = (rc->right - col - len) / es->CharWidths[32]; - TextOut(hdc, col + len, row * es->txtht, es->BlankLine, num_spaces); - } + SetRect( &rc2, col + len, row * es->txtht, + rc->right, (row + 1) * es->txtht ); + ExtTextOut( hdc, 0, 0, ETO_OPAQUE, &rc2, "", 0, NULL ); } if (es->hFont) @@ -643,7 +632,7 @@ static void EDIT_WriteTextLine(HWND hwnd, RECT *rect, int y) } len = MIN(lnlen, rc.right - rc.left); - if (SelMarked(es)) + if (SelMarked(es) && (es->HaveFocus)) { sbl = es->SelBegLine; sel = es->SelEndLine; @@ -1142,11 +1131,21 @@ static void EDIT_DelKey(HWND hwnd) RECT rc; EDITSTATE *es = EDIT_GetEditState(hwnd); char *currchar = CurrChar; - BOOL repaint = *currchar == '\n'; + BOOL repaint; - if (IsMultiLine(hwnd) && *currchar == '\n' && *(currchar + 1) == '\0') + if (IsMultiLine(hwnd) && !strncmp(currchar,"\r\n\0",3)) return; - strcpy(currchar, currchar + 1); + + if(*currchar == '\n') { + repaint = TRUE; + strcpy(currchar, currchar + 1); + } else if (*currchar == '\r') { + repaint = TRUE; + strcpy(currchar, currchar + 2); + } else { + repaint = FALSE; + strcpy(currchar, currchar + 1); + } NOTIFY_PARENT(hwnd, EN_UPDATE); if (repaint) @@ -1304,11 +1303,9 @@ static void EDIT_ClearText(HWND hwnd) char *text; dprintf_edit(stddeb,"EDIT_ClearText %d\n",blen); -/*#ifndef WINELIB*/ es->hText = EDIT_HeapReAlloc(hwnd, es->hText, blen); text = EDIT_HeapLock(hwnd, es->hText); memset(text, 0, blen); -/*#endif*/ es->textlen = 0; es->wlines = 0; es->CurrLine = es->CurrCol = 0; @@ -1316,9 +1313,7 @@ static void EDIT_ClearText(HWND hwnd) es->wleft = es->wtop = 0; es->textwidth = 0; es->TextChanged = FALSE; -/*#ifndef WINELIB*/ EDIT_ClearTextPointers(hwnd); -/*#endif*/ } /********************************************************************* @@ -1364,6 +1359,29 @@ static void EDIT_GetLineCol(HWND hwnd, int off, int *line, int *col) #endif } +/********************************************************************* + * EDIT_UpdateSel + * + * Redraw the current selection, after losing focus, for example. + */ +static void EDIT_UpdateSel(HWND hwnd) +{ + EDITSTATE *es = EDIT_GetEditState(hwnd); + int y, bbl, bel; + RECT rc; + + /* Note which lines need redrawing. */ + bbl=MIN(es->SelBegLine,es->SelEndLine); + bel=MAX(es->SelBegLine,es->SelEndLine); + + /* Redraw the affected lines */ + GetClientRect(hwnd, &rc); + for (y = bbl; y <= bel; y++) + { + EDIT_WriteTextLine(hwnd, &rc, y); + } +} + /********************************************************************* * EDIT_ClearSel * @@ -1372,12 +1390,23 @@ static void EDIT_GetLineCol(HWND hwnd, int off, int *line, int *col) static void EDIT_ClearSel(HWND hwnd) { EDITSTATE *es = EDIT_GetEditState(hwnd); + int y, bbl, bel; + RECT rc; + + /* Note which lines need redrawing. */ + bbl=MIN(es->SelBegLine,es->SelEndLine); + bel=MAX(es->SelBegLine,es->SelEndLine); + /* Clear the selection */ es->SelBegLine = es->SelBegCol = 0; es->SelEndLine = es->SelEndCol = 0; - InvalidateRect(hwnd, NULL, TRUE); - UpdateWindow(hwnd); + /* Redraw the affected lines */ + GetClientRect(hwnd, &rc); + for (y = bbl; y <= bel; y++) + { + EDIT_WriteTextLine(hwnd, &rc, y); + } } /********************************************************************* @@ -1412,33 +1441,52 @@ static void EDIT_SaveDeletedText(HWND hwnd, char *deltext, int len, */ static void EDIT_DeleteSel(HWND hwnd) { - char *bbl, *bel; + char *selStart, *selEnd; + int bl, el, bc, ec; int len; EDITSTATE *es = EDIT_GetEditState(hwnd); if (SelMarked(es)) { - bbl = EDIT_TextLine(hwnd, es->SelBegLine) + es->SelBegCol; - bel = EDIT_TextLine(hwnd, es->SelEndLine) + es->SelEndCol; - len = (int)(bel - bbl); - EDIT_SaveDeletedText(hwnd, bbl, len, es->SelBegLine, es->SelBegCol); + /* Get the real beginning and ending lines and columns */ + bl = es->SelBegLine; + el = es->SelEndLine; + if ( bl > el ) { + bl = el; + el = es->SelBegLine; + bc = es->SelEndCol; + ec = es->SelBegCol; + } else if ( bl == el ) { + bc = MIN(es->SelBegCol,es->SelEndCol); + ec = MAX(es->SelBegCol,es->SelEndCol); + } else { + bc = es->SelBegCol; + ec = es->SelEndCol; + } + + selStart = EDIT_TextLine(hwnd, bl) + bc; + selEnd = EDIT_TextLine(hwnd, el) + ec; + len = (int)(selEnd - selStart); + EDIT_SaveDeletedText(hwnd, selStart, len, bl, bc); es->TextChanged = TRUE; - strcpy(bbl, bel); + EDIT_ClearSel(hwnd); + strcpy(selStart, selEnd); - es->CurrLine = es->SelBegLine; - es->CurrCol = es->SelBegCol; - es->WndRow = es->SelBegLine - es->wtop; + es->CurrLine = bl; + es->CurrCol = bc; + es->WndRow = bl - es->wtop; if (es->WndRow < 0) { - es->wtop = es->SelBegLine; + es->wtop = bl; es->WndRow = 0; } - es->WndCol = EDIT_StrWidth(hwnd, bbl - es->SelBegCol, - es->SelBegCol, 0) - es->wleft; + es->WndCol = EDIT_StrWidth(hwnd, selStart - bc, bc, 0) - es->wleft; EDIT_BuildTextPointers(hwnd); es->PaintBkgd = TRUE; - EDIT_ClearSel(hwnd); + + InvalidateRect(hwnd, NULL, TRUE); + UpdateWindow(hwnd); } } @@ -1475,65 +1523,11 @@ static int EDIT_TextLineNumber(HWND hwnd, char *lp) */ static void EDIT_SetAnchor(HWND hwnd, int row, int col) { - BOOL sel = FALSE; EDITSTATE *es = EDIT_GetEditState(hwnd); - if (SelMarked(es)) - { - sel = TRUE; - EDIT_ClearSel(hwnd); - } + if (SelMarked(es)) EDIT_ClearSel(hwnd); es->SelBegLine = es->SelEndLine = row; es->SelBegCol = es->SelEndCol = col; - if (sel) - { - InvalidateRect(hwnd, NULL, FALSE); - UpdateWindow(hwnd); - } -} - -/********************************************************************* - * EDIT_WriteSel - * - * Display selection by reversing pixels in selected text. - * If end == -1, selection applies to end of line. - */ -static void EDIT_WriteSel(HWND hwnd, int y, int start, int end) -{ - RECT rc, rcInvert; - int scol, ecol; - char *cp; - HDC hdc; - EDITSTATE *es = EDIT_GetEditState(hwnd); - - dprintf_edit(stddeb,"EDIT_WriteSel: y=%d start=%d end=%d\n", y, start,end); - GetClientRect(hwnd, &rc); - - /* make sure y is within the window */ - if (y < es->wtop || y > (es->wtop + es->ClientHeight)) - return; - - /* get pointer to text */ - cp = EDIT_TextLine(hwnd, y); - - /* get length of line if end == -1 */ - if (end == -1) - end = EDIT_LineLength(hwnd, y); - - scol = EDIT_StrWidth(hwnd, cp, start, 0) - es->wleft; - if (scol > rc.right) return; - if (scol < rc.left) scol = rc.left; - ecol = EDIT_StrWidth(hwnd, cp, end, 0) - es->wleft; - if (ecol < rc.left) return; - if (ecol > rc.right) ecol = rc.right; - - hdc = GetDC(hwnd); - rcInvert.left = scol; - rcInvert.top = (y - es->wtop) * es->txtht; - rcInvert.right = ecol; - rcInvert.bottom = (y - es->wtop + 1) * es->txtht; - InvertRect(hdc, (LPRECT) &rcInvert); - ReleaseDC(hwnd, hdc); } /********************************************************************* @@ -1543,10 +1537,11 @@ static void EDIT_WriteSel(HWND hwnd, int y, int start, int end) */ static void EDIT_ExtendSel(HWND hwnd, INT x, INT y) { - int bbl, bel, bbc, bec; + int bbl, bel, bbc; char *cp; int len, line; EDITSTATE *es = EDIT_GetEditState(hwnd); + RECT rc; dprintf_edit(stddeb,"EDIT_ExtendSel: x=%d, y=%d\n", x, y); @@ -1580,53 +1575,21 @@ static void EDIT_ExtendSel(HWND hwnd, INT x, INT y) es->SelEndCol = es->CurrCol; bel = es->SelEndLine; - bec = es->SelEndCol; /* return if no new characters to mark */ - if (bbl == bel && bbc == bec) - return; + if (bbl == bel && bbc == es->SelEndCol) return; /* put lowest marker first */ - if (bbl > bel) - { - SWAP_INT(bbl, bel); - SWAP_INT(bbc, bec); - } - if (bbl == bel && bbc > bec) - SWAP_INT(bbc, bec); + if (bbl > bel) SWAP_INT(bbl, bel); + /* Update lines on which selection has changed */ + GetClientRect(hwnd, &rc); for (y = bbl; y <= bel; y++) { - if (y == bbl && y == bel) - EDIT_WriteSel(hwnd, y, bbc, bec); - else if (y == bbl) - EDIT_WriteSel(hwnd, y, bbc, -1); - else if (y == bel) - EDIT_WriteSel(hwnd, y, 0, bec); - else - EDIT_WriteSel(hwnd, y, 0, -1); + EDIT_WriteTextLine(hwnd, &rc, y); } } -/********************************************************************* - * EDIT_StopMarking - * - * Stop text marking (selection). - */ -static void EDIT_StopMarking(HWND hwnd) -{ - EDITSTATE *es = EDIT_GetEditState(hwnd); - - TextMarking = FALSE; - if (es->SelBegLine > es->SelEndLine) - { - SWAP_INT((es->SelBegLine), (es->SelEndLine)); - SWAP_INT((es->SelBegCol), (es->SelEndCol)); - } - if (es->SelBegLine == es->SelEndLine && es->SelBegCol > es->SelEndCol) - SWAP_INT((es->SelBegCol), (es->SelEndCol)); -} - /********************************************************************* * EDIT_InsertText * @@ -1804,6 +1767,7 @@ static void EDIT_KeyTyped(HWND hwnd, short ch) EDIT_BuildTextPointers(hwnd); EDIT_End(hwnd); EDIT_Forward(hwnd); + EDIT_SetAnchor(hwnd, es->CurrLine, es->CurrCol); /* invalidate rest of window */ GetClientRect(hwnd, &rc); @@ -1829,6 +1793,7 @@ static void EDIT_KeyTyped(HWND hwnd, short ch) } es->WndCol += EDIT_CharWidth(hwnd, (BYTE)ch, es->WndCol + es->wleft); es->CurrCol++; + EDIT_SetAnchor(hwnd, es->CurrLine, es->CurrCol); EDIT_WriteTextLine(hwnd, NULL, es->wtop + es->WndRow); SetCaretPos(es->WndCol, es->WndRow * es->txtht); ShowCaret(hwnd); @@ -2222,7 +2187,8 @@ static void EDIT_WM_Paint(HWND hwnd) EDITSTATE *es = EDIT_GetEditState(hwnd); hdc = BeginPaint(hwnd, &ps); - rc = ps.rcPaint; + GetClientRect(hwnd, &rc); + IntersectClipRect(hdc, rc.left, rc.top, rc.right, rc.bottom); dprintf_edit(stddeb,"WM_PAINT: rc=(%ld,%ld), (%ld,%ld)\n", (LONG)rc.left, (LONG)rc.top, (LONG)rc.right, (LONG)rc.bottom); @@ -2399,12 +2365,6 @@ static long EDIT_WM_Create(HWND hwnd, LONG lParam) es->NumTabStops = 0; es->TabStops = xmalloc( sizeof(short) ); - /* allocate space for a line full of blanks to speed up */ - /* line filling */ - es->BlankLine = xmalloc( (es->ClientWidth / es->CharWidths[32]) + 2); - memset(es->BlankLine, ' ', (es->ClientWidth / es->CharWidths[32]) + 2); - es->BlankLine[(es->ClientWidth / es->CharWidths[32]) + 1] = 0; - /* set up text cursor for edit class */ { char editname[] = "EDIT"; @@ -2491,8 +2451,12 @@ static void EDIT_WM_LButtonDown(HWND hwnd, WORD wParam, LONG lParam) BOOL end = FALSE; EDITSTATE *es = EDIT_GetEditState(hwnd); - if (SelMarked(es)) - EDIT_ClearSel(hwnd); + ButtonDown = TRUE; + + if ((wParam & MK_SHIFT)) { + EDIT_ExtendSel(hwnd, LOWORD(lParam), HIWORD(lParam)); + return; + } es->WndRow = HIWORD(lParam) / es->txtht; dprintf_edit( stddeb, "EDIT_LButtonDown: %04x %08lx, WndRow %d\n", wParam, @@ -2515,9 +2479,9 @@ static void EDIT_WM_LButtonDown(HWND hwnd, WORD wParam, LONG lParam) es->CurrCol = EDIT_PixelToChar(hwnd, es->CurrLine, &(es->WndCol)); es->WndCol -= es->wleft; - ButtonDown = TRUE; ButtonRow = es->CurrLine; ButtonCol = es->CurrCol; + EDIT_SetAnchor(hwnd, ButtonRow, ButtonCol); } /********************************************************************* @@ -2527,13 +2491,11 @@ static void EDIT_WM_MouseMove(HWND hwnd, WORD wParam, LONG lParam) { EDITSTATE *es = EDIT_GetEditState(hwnd); - if (wParam != MK_LBUTTON) - return; + if (!(wParam & MK_LBUTTON)) return; HideCaret(hwnd); if (ButtonDown) { - EDIT_SetAnchor(hwnd, ButtonRow, ButtonCol); TextMarking = TRUE; ButtonDown = FALSE; } @@ -2582,6 +2544,7 @@ static void EDIT_WM_Char(HWND hwnd, WORD wParam) static void EDIT_WM_KeyDown(HWND hwnd, WORD wParam) { EDITSTATE *es = EDIT_GetEditState(hwnd); + BOOL motionKey = FALSE; dprintf_edit(stddeb,"EDIT_WM_KeyDown: key=%x\n", wParam); @@ -2589,63 +2552,55 @@ static void EDIT_WM_KeyDown(HWND hwnd, WORD wParam) switch (wParam) { case VK_UP: - if (SelMarked(es)) - EDIT_ClearSel(hwnd); if (IsMultiLine(hwnd)) EDIT_Upward(hwnd); else EDIT_Backward(hwnd); + motionKey = TRUE; break; case VK_DOWN: - if (SelMarked(es)) - EDIT_ClearSel(hwnd); if (IsMultiLine(hwnd)) EDIT_Downward(hwnd); else EDIT_Forward(hwnd); + motionKey = TRUE; break; case VK_RIGHT: - if (SelMarked(es)) - EDIT_ClearSel(hwnd); EDIT_Forward(hwnd); + motionKey = TRUE; break; case VK_LEFT: - if (SelMarked(es)) - EDIT_ClearSel(hwnd); EDIT_Backward(hwnd); + motionKey = TRUE; break; case VK_HOME: - if (SelMarked(es)) - EDIT_ClearSel(hwnd); EDIT_Home(hwnd); + motionKey = TRUE; break; case VK_END: - if (SelMarked(es)) - EDIT_ClearSel(hwnd); EDIT_End(hwnd); + motionKey = TRUE; break; case VK_PRIOR: if (IsMultiLine(hwnd)) { - if (SelMarked(es)) - EDIT_ClearSel(hwnd); EDIT_KeyVScrollPage(hwnd, SB_PAGEUP); } + motionKey = TRUE; break; case VK_NEXT: if (IsMultiLine(hwnd)) { - if (SelMarked(es)) - EDIT_ClearSel(hwnd); EDIT_KeyVScrollPage(hwnd, SB_PAGEDOWN); } + motionKey = TRUE; break; case VK_BACK: @@ -2666,8 +2621,26 @@ static void EDIT_WM_KeyDown(HWND hwnd, WORD wParam) else EDIT_DelKey(hwnd); break; + + case VK_SHIFT: + motionKey = TRUE; + break; + + default: + ShowCaret(hwnd); + return; } + /* FIXME: GetKeyState appears to have its bits reversed */ +#if CorrectGetKeyState + if(motionKey && (0x80 & GetKeyState(VK_SHIFT))) { +#else + if(motionKey && (0x01 & GetKeyState(VK_SHIFT))) { +#endif + EDIT_ExtendSel(hwnd, es->WndCol, es->WndRow*es->txtht); + } else { + EDIT_SetAnchor(hwnd, es->CurrLine, es->CurrCol); + } SetCaretPos(es->WndCol, es->WndRow * es->txtht); ShowCaret(hwnd); } @@ -2813,6 +2786,7 @@ LRESULT EditWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) case EM_SETHANDLE: HideCaret(hwnd); + EDIT_ClearDeletedText(hwnd); EDIT_SetHandleMsg(hwnd, wParam); SetCaretPos(es->WndCol, es->WndRow * es->txtht); ShowCaret(hwnd); @@ -2882,7 +2856,6 @@ LRESULT EditWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) free(es->textptrs); free(es->CharWidths); free(es->TabStops); - free(es->BlankLine); EDIT_HeapFree(hwnd, es->hText); free( EDIT_GetEditState(hwnd) ); break; @@ -2919,9 +2892,14 @@ LRESULT EditWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) break; case WM_KILLFOCUS: + dprintf_edit(stddeb, "WM_KILLFOCUS\n"); es->HaveFocus = FALSE; DestroyCaret(); - if (SelMarked(es)) EDIT_ClearSel(hwnd); + if (SelMarked(es)) + if(GetWindowLong(hwnd,GWL_STYLE) & ES_NOHIDESEL) + EDIT_UpdateSel(hwnd); + else + EDIT_ClearSel(hwnd); NOTIFY_PARENT(hwnd, EN_KILLFOCUS); break; @@ -2938,8 +2916,7 @@ LRESULT EditWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) if (GetCapture() != hwnd) break; ReleaseCapture(); ButtonDown = FALSE; - if (TextMarking) - EDIT_StopMarking(hwnd); + TextMarking = FALSE; break; case WM_MOUSEMOVE: @@ -2964,7 +2941,9 @@ LRESULT EditWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) break; case WM_SETFOCUS: + dprintf_edit(stddeb, "WM_SETFOCUS\n"); es->HaveFocus = TRUE; + if (SelMarked(es)) EDIT_UpdateSel(hwnd); CreateCaret(hwnd, 0, 2, es->txtht); SetCaretPos(es->WndCol, es->WndRow * es->txtht); ShowCaret(hwnd); @@ -2985,6 +2964,7 @@ LRESULT EditWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) break; #endif case WM_SETTEXT: + EDIT_ClearDeletedText(hwnd); EDIT_WM_SetText(hwnd, lParam); break; @@ -2997,6 +2977,12 @@ LRESULT EditWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) EDIT_WM_VScroll(hwnd, wParam, lParam); break; + case WM_LBUTTONDBLCLK: + dprintf_edit(stddeb, "WM_LBUTTONDBLCLK: hwnd=%d, wParam=%x\n", + hwnd, wParam); + lResult = 0; + break; + default: lResult = DefWindowProc(hwnd, uMsg, wParam, lParam); break; diff --git a/controls/listbox.c b/controls/listbox.c index fc9ba605292..b9cd547072c 100644 --- a/controls/listbox.c +++ b/controls/listbox.c @@ -694,6 +694,7 @@ LONG ListBoxDirectory(LPHEADLIST lphl, UINT attrib, LPCSTR filespec) if ((ret = ListBoxAddString(lphl, temp)) == LB_ERR) break; } } + free( path ); return ret; } @@ -1886,7 +1887,7 @@ LRESULT ListBoxWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) /********************************************************************** * DlgDirSelect (USER.99) */ -BOOL DlgDirSelect( HWND hDlg, LPSTR lpStr, int id ) +BOOL DlgDirSelect( HWND hDlg, LPSTR lpStr, INT id ) { char buffer[20]; INT i; @@ -1920,7 +1921,7 @@ BOOL DlgDirSelect( HWND hDlg, LPSTR lpStr, int id ) /********************************************************************** * DlgDirList (USER.100) */ -INT DlgDirList( HWND hDlg, SEGPTR spec, INT idLBox, INT idStatic, WORD attrib ) +INT DlgDirList( HWND hDlg, SEGPTR spec, INT idLBox, INT idStatic, UINT attrib ) { char *filespec = (char *)PTR_SEG_TO_LIN( spec ); int drive; @@ -1934,7 +1935,7 @@ INT DlgDirList( HWND hDlg, SEGPTR spec, INT idLBox, INT idStatic, WORD attrib ) hDlg, filespec ? filespec : "NULL", idLBox, idStatic, attrib ); - if (filespec && (filespec[1] == ':')) + if (filespec && filespec[0] && (filespec[1] == ':')) { drive = toupper( filespec[0] ) - 'A'; filespec += 2; @@ -2004,4 +2005,5 @@ INT DlgDirList( HWND hDlg, SEGPTR spec, INT idLBox, INT idStatic, WORD attrib ) SENDMSG( WM_SETTEXT, 0, (LPARAM)MAKE_SEGPTR(temp) ); } return TRUE; +#undef SENDMSG } diff --git a/controls/menu.c b/controls/menu.c index 23982342b90..b467450a598 100644 --- a/controls/menu.c +++ b/controls/menu.c @@ -895,27 +895,39 @@ static void MENU_SelectPrevItem( HWND hwndOwner, HMENU hmenu ) */ static BOOL MENU_SetItemData( MENUITEM *item, UINT flags, UINT id, SEGPTR data) { - item->item_flags = flags & ~(MF_HILITE | MF_MOUSESELECT); - item->item_id = id; + HANDLE hPrevText = IS_STRING_ITEM(item->item_flags) ? item->hText : 0; - SetRectEmpty( &item->rect ); if (IS_STRING_ITEM(flags)) { - char *str = (char *)PTR_SEG_TO_LIN(data); - HANDLE hText; - - /* Item beginning with a backspace is a help item */ - if (*str == '\b') - { - item->item_flags |= MF_HELP; - str++; - } - if (!(hText = USER_HEAP_ALLOC( strlen(str)+1 ))) return FALSE; - item->hText = hText; - strcpy( (char *)USER_HEAP_LIN_ADDR( hText ), str ); + if (!data) + { + flags |= MF_SEPARATOR; + item->hText = 0; + } + else + { + char *str = (char *)PTR_SEG_TO_LIN(data); + HANDLE hText; + + /* Item beginning with a backspace is a help item */ + if (*str == '\b') + { + flags |= MF_HELP; + str++; + } + if (!(hText = USER_HEAP_ALLOC( strlen(str)+1 ))) return FALSE; + item->hText = hText; + strcpy( (char *)USER_HEAP_LIN_ADDR( hText ), str ); + } } else if (flags & MF_BITMAP) item->hText = (HANDLE)(DWORD)data; else if (flags & MF_OWNERDRAW) SET_OWNERDRAW_DATA( item, data ); + else item->hText = 0; + + item->item_flags = flags & ~(MF_HILITE | MF_MOUSESELECT); + item->item_id = id; + SetRectEmpty( &item->rect ); + if (hPrevText) USER_HEAP_FREE( hPrevText ); return TRUE; } @@ -984,6 +996,7 @@ static MENUITEM *MENU_InsertItem( HMENU hMenu, UINT pos, UINT flags ) } menu->hItems = hNewItems; menu->nItems++; + memset( &newItems[pos], 0, sizeof(*newItems) ); return &newItems[pos]; } @@ -1022,8 +1035,7 @@ static SEGPTR MENU_ParseResource( SEGPTR res, HMENU hMenu ) } else { - if (!id && !flags && !*(char *)PTR_SEG_TO_LIN(data)) - flags |= MF_SEPARATOR; /* FIXME: do this in InsertMenu? */ + if (!*(char *)PTR_SEG_TO_LIN(data)) data = 0; AppendMenu( hMenu, flags, id, data ); } } while (!(flags & MF_END)); @@ -1877,13 +1889,9 @@ BOOL InsertMenu( HMENU hMenu, UINT pos, UINT flags, UINT id, SEGPTR data ) { MENUITEM *item; - if (IS_STRING_ITEM(flags)) - { + if (IS_STRING_ITEM(flags) && data) dprintf_menu( stddeb, "InsertMenu: "NPFMT" %d %04x %04x '%s'\n", - hMenu, pos, flags, id, - data ? (char *)PTR_SEG_TO_LIN(data) : "#NULL#" ); - if (!data) return FALSE; - } + hMenu, pos, flags, id, (char *)PTR_SEG_TO_LIN(data) ); else dprintf_menu( stddeb, "InsertMenu: "NPFMT" %d %04x %04x %08lx\n", hMenu, pos, flags, id, (DWORD)data ); @@ -1891,7 +1899,6 @@ BOOL InsertMenu( HMENU hMenu, UINT pos, UINT flags, UINT id, SEGPTR data ) if (!(MENU_SetItemData( item, flags, id, data ))) { - item->hText = 0; RemoveMenu( hMenu, pos, flags ); return FALSE; } @@ -1928,7 +1935,8 @@ BOOL RemoveMenu(HMENU hMenu, UINT nPos, UINT wFlags) /* Remove item */ - if (IS_STRING_ITEM(lpitem->item_flags)) USER_HEAP_FREE( lpitem->hText ); + if (IS_STRING_ITEM(lpitem->item_flags) && lpitem->hText) + USER_HEAP_FREE(lpitem->hText); if (--menu->nItems == 0) { USER_HEAP_FREE( menu->hItems ); @@ -1969,7 +1977,6 @@ BOOL DeleteMenu(HMENU hMenu, UINT nPos, UINT wFlags) BOOL ModifyMenu( HMENU hMenu, UINT pos, UINT flags, UINT id, SEGPTR data ) { MENUITEM *item; - HANDLE hText = 0; if (IS_STRING_ITEM(flags)) { @@ -1983,10 +1990,7 @@ BOOL ModifyMenu( HMENU hMenu, UINT pos, UINT flags, UINT id, SEGPTR data ) hMenu, pos, flags, id, (DWORD)data ); if (!(item = MENU_FindItem( &hMenu, &pos, flags ))) return FALSE; - if (IS_STRING_ITEM(item->item_flags)) hText = item->hText; - if (!MENU_SetItemData( item, flags, id, data )) return FALSE; - if (hText) USER_HEAP_FREE( hText ); - return TRUE; + return MENU_SetItemData( item, flags, id, data ); } @@ -2018,7 +2022,7 @@ DWORD GetMenuCheckMarkDimensions() * SetMenuItemBitmaps [USER.418] */ BOOL SetMenuItemBitmaps(HMENU hMenu, UINT nPos, UINT wFlags, - HBITMAP hNewCheck, HBITMAP hNewUnCheck) + HBITMAP hNewUnCheck, HBITMAP hNewCheck) { LPMENUITEM lpitem; dprintf_menu(stddeb,"SetMenuItemBitmaps ("NPFMT", %04X, %04X, "NPFMT", %08lX) !\n", @@ -2090,6 +2094,8 @@ BOOL DestroyMenu(HMENU hMenu) { if (item->item_flags & MF_POPUP) DestroyMenu( (HMENU)item->item_id ); + if (IS_STRING_ITEM(item->item_flags) && item->hText) + USER_HEAP_FREE(item->hText); } USER_HEAP_FREE( lppop->hItems ); } diff --git a/controls/scroll.c b/controls/scroll.c index ff63e0830ae..d18c1756ab5 100644 --- a/controls/scroll.c +++ b/controls/scroll.c @@ -971,7 +971,7 @@ void ShowScrollBar( HWND hwnd, WORD wBar, BOOL fShow ) /************************************************************************* * EnableScrollBar (USER.482) */ -BOOL EnableScrollBar( HWND hwnd, INT nBar, UINT flags ) +BOOL EnableScrollBar( HWND hwnd, UINT nBar, UINT flags ) { SCROLLINFO *infoPtr; HDC hdc; diff --git a/controls/widgets.c b/controls/widgets.c index ccbe8c8565a..4ae39e3da9a 100644 --- a/controls/widgets.c +++ b/controls/widgets.c @@ -19,20 +19,27 @@ static WNDCLASS WIDGETS_BuiltinClasses[] = { - { CS_GLOBALCLASS | CS_PARENTDC, (WNDPROC)"ButtonWndProc", 0, - sizeof(BUTTONINFO), 0, 0, 0, 0, 0, (SEGPTR)"BUTTON" }, - { CS_GLOBALCLASS | CS_PARENTDC, (WNDPROC)"StaticWndProc", 0, - sizeof(STATICINFO), 0, 0, 0, 0, 0, (SEGPTR)"STATIC" }, - { CS_GLOBALCLASS | CS_HREDRAW | CS_VREDRAW | CS_PARENTDC , (WNDPROC)"ScrollBarWndProc", 0, - sizeof(SCROLLINFO), 0, 0, 0, 0, 0, (SEGPTR)"SCROLLBAR" }, - { CS_GLOBALCLASS | CS_PARENTDC | CS_DBLCLKS, (WNDPROC)"ListBoxWndProc", 0, - 8, 0, 0, 0, 0, 0, (SEGPTR)"LISTBOX" }, - { CS_GLOBALCLASS | CS_PARENTDC, (WNDPROC)"ComboBoxWndProc", 0, 8, + { CS_GLOBALCLASS | CS_DBLCLKS | CS_VREDRAW | CS_HREDRAW | CS_PARENTDC, + (WNDPROC)"ButtonWndProc", 0, sizeof(BUTTONINFO), + 0, 0, 0, 0, 0, (SEGPTR)"BUTTON" }, + { CS_GLOBALCLASS | CS_PARENTDC, + (WNDPROC)"StaticWndProc", 0, sizeof(STATICINFO), + 0, 0, 0, 0, 0, (SEGPTR)"STATIC" }, + { CS_GLOBALCLASS | CS_DBLCLKS | CS_VREDRAW | CS_HREDRAW | CS_PARENTDC, + (WNDPROC)"ScrollBarWndProc", 0, sizeof(SCROLLINFO), + 0, 0, 0, 0, 0, (SEGPTR)"SCROLLBAR" }, + { CS_GLOBALCLASS | CS_PARENTDC | CS_DBLCLKS, + (WNDPROC)"ListBoxWndProc", 0, 8, + 0, 0, 0, 0, 0, (SEGPTR)"LISTBOX" }, + { CS_GLOBALCLASS | CS_PARENTDC | CS_DBLCLKS, + (WNDPROC)"ComboBoxWndProc", 0, 8, 0, 0, 0, 0, 0, (SEGPTR)"COMBOBOX" }, - { CS_GLOBALCLASS | CS_PARENTDC | CS_DBLCLKS | CS_SAVEBITS, (WNDPROC)"ComboLBoxWndProc", - 0, 8, 0, 0, 0, 0, 0, (SEGPTR)"COMBOLBOX" }, - { CS_GLOBALCLASS | CS_PARENTDC | CS_DBLCLKS, (WNDPROC)"EditWndProc", - 0, sizeof(DWORD), 0, 0, 0, 0, 0, (SEGPTR)"EDIT" }, + { CS_GLOBALCLASS | CS_DBLCLKS | CS_SAVEBITS, + (WNDPROC)"ComboLBoxWndProc", 0, 8, + 0, 0, 0, 0, 0, (SEGPTR)"COMBOLBOX" }, + { CS_GLOBALCLASS | CS_PARENTDC | CS_DBLCLKS, + (WNDPROC)"EditWndProc", 0, sizeof(DWORD), + 0, 0, 0, 0, 0, (SEGPTR)"EDIT" }, { CS_GLOBALCLASS | CS_SAVEBITS, (WNDPROC)"PopupMenuWndProc", 0, 8, 0, 0, 0, 0, 0, (SEGPTR)POPUPMENU_CLASS_NAME }, { CS_GLOBALCLASS, (WNDPROC)"DesktopWndProc", 0, sizeof(DESKTOPINFO), @@ -61,11 +68,13 @@ BOOL WIDGETS_Init(void) for (i = 0; i < NB_BUILTIN_CLASSES; i++, class++) { DWORD WineProc,Win16Proc,Win32Proc; + WIN32_builtin *dll; /* currently, there is no way to get the 'real' pointer at run time */ WineProc=0; Win16Proc = (DWORD)GetWndProcEntry16( (char *)class->lpfnWndProc ); + dll = RELAY32_GetBuiltinDLL("WINPROCS32"); Win32Proc = (DWORD)RELAY32_GetEntryPoint( - "WINPROCS32",(char *)class->lpfnWndProc, 0); + dll,(char *)class->lpfnWndProc, 0); /* Register the alias so we don't pass Win16 pointers to Win32 apps */ ALIAS_RegisterAlias(WineProc,Win16Proc,Win32Proc); diff --git a/debugger/db_disasm.c b/debugger/db_disasm.c index 7ffd2a814a3..8d38f5a2826 100644 --- a/debugger/db_disasm.c +++ b/debugger/db_disasm.c @@ -733,8 +733,8 @@ static struct inst db_inst_table[256] = { /*ab*/ { "stos", FALSE, LONG, op1(DI), 0 }, /*ac*/ { "lods", FALSE, BYTE, op1(SI), 0 }, /*ad*/ { "lods", FALSE, LONG, op1(SI), 0 }, -/*ae*/ { "scas", FALSE, BYTE, op1(SI), 0 }, -/*af*/ { "scas", FALSE, LONG, op1(SI), 0 }, +/*ae*/ { "scas", FALSE, BYTE, op1(DI), 0 }, +/*af*/ { "scas", FALSE, LONG, op1(DI), 0 }, /*b0*/ { "mov", FALSE, BYTE, op2(I, Ri), 0 }, /*b1*/ { "mov", FALSE, BYTE, op2(I, Ri), 0 }, diff --git a/files/directory.c b/files/directory.c index 5365bd60b6c..85542dd1752 100644 --- a/files/directory.c +++ b/files/directory.c @@ -164,11 +164,11 @@ int DIR_Init(void) /* Put the temp and Windows directories into the environment */ - env_p = (char *)xmalloc( strlen(DIR_TempDosDir) + 5 ); + env_p = (char *)xmalloc( strlen(DIR_TempDosDir) + 6 ); strcpy( env_p, "TEMP=" ); strcpy( env_p + 5, DIR_TempDosDir ); putenv( env_p ); - env_p = (char *)xmalloc( strlen(DIR_WindowsDosDir) + 7 ); + env_p = (char *)xmalloc( strlen(DIR_WindowsDosDir) + 8 ); strcpy( env_p, "windir=" ); strcpy( env_p + 7, DIR_WindowsDosDir ); putenv( env_p ); diff --git a/files/dos_fs.c b/files/dos_fs.c index 29131eca3ac..e0172f6af89 100644 --- a/files/dos_fs.c +++ b/files/dos_fs.c @@ -5,6 +5,7 @@ * Copyright 1996 Alexandre Julliard */ +#include #include #include #include @@ -415,7 +416,7 @@ const char *DOSFS_IsDevice( const char *name ) int i; const char *p; - if (name[1] == ':') name += 2; + if (name[0] && (name[1] == ':')) name += 2; if ((p = strrchr( name, '/' ))) name = p + 1; if ((p = strrchr( name, '\\' ))) name = p + 1; for (i = 0; i < sizeof(DOSFS_Devices)/sizeof(DOSFS_Devices[0]); i++) @@ -424,7 +425,6 @@ const char *DOSFS_IsDevice( const char *name ) if (!lstrncmpi( dev, name, strlen(dev) )) { p = name + strlen( dev ); - if (*p == ':') p++; if (!*p || (*p == '.')) return DOSFS_Devices[i][1]; } } @@ -446,7 +446,7 @@ const char * DOSFS_GetUnixFileName( const char * name, int check_last ) char *p, *root; dprintf_dosfs( stddeb, "DOSFS_GetUnixFileName: %s\n", name ); - if (name[1] == ':') + if (name[0] && (name[1] == ':')) { drive = toupper(name[0]) - 'A'; name += 2; @@ -549,7 +549,7 @@ const char * DOSFS_GetDosTrueName( const char *name, int unix_format ) char *p; dprintf_dosfs( stddeb, "DOSFS_GetDosTrueName(%s,%d)\n", name, unix_format); - if (name[1] == ':') + if (name[0] && (name[1] == ':')) { drive = toupper(name[0]) - 'A'; name += 2; @@ -646,6 +646,7 @@ int DOSFS_FindNext( const char *path, const char *mask, int drive, int count = 0; static char buffer[MAX_PATHNAME_LEN]; static int cur_pos = 0; + static int drive_root = 0; char *p; const char *hash_name; @@ -664,12 +665,22 @@ int DOSFS_FindNext( const char *path, const char *mask, int drive, if (dir && !strcmp( buffer, path ) && (cur_pos <= skip)) skip -= cur_pos; else /* Not in the cache, open it anew */ { + const char *drive_path; dprintf_dosfs( stddeb, "DOSFS_FindNext: cache miss, path=%s skip=%d buf=%s cur=%d\n", path, skip, buffer, cur_pos ); cur_pos = skip; if (dir) closedir(dir); if (!(dir = opendir( path ))) return 0; + drive_path = path; + drive_root = 0; + if (DRIVE_FindDriveRoot( &drive_path ) != -1) + { + while ((*drive_path == '/') || (*drive_path == '\\')) drive_path++; + if (!*drive_path) drive_root = 1; + } + dprintf_dosfs(stddeb, "DOSFS_FindNext: drive_root = %d\n", drive_root); lstrcpyn( buffer, path, sizeof(buffer) - 1 ); + } strcat( buffer, "/" ); p = buffer + strlen(buffer); @@ -681,6 +692,10 @@ int DOSFS_FindNext( const char *path, const char *mask, int drive, count++; hash_name = DOSFS_Hash( dirent->d_name, TRUE ); if (!DOSFS_Match( mask, hash_name )) continue; + /* Don't return '.' and '..' in the root of the drive */ + if (drive_root && (dirent->d_name[0] == '.') && + (!dirent->d_name[1] || + ((dirent->d_name[1] == '.') && !dirent->d_name[2]))) continue; lstrcpyn( p, dirent->d_name, sizeof(buffer) - (int)(p - buffer) ); if (!FILE_Stat( buffer, &entry->attr, &entry->size, diff --git a/files/drive.c b/files/drive.c index 5c72a545dfd..648faf5de2a 100644 --- a/files/drive.c +++ b/files/drive.c @@ -7,6 +7,7 @@ #include #include +#include #include #if defined(__linux__) || defined(sun) @@ -131,7 +132,7 @@ int DRIVE_Init(void) if (!count) { - fprintf( stderr, "Warning: no valid DOS drive found\n" ); + fprintf( stderr, "Warning: no valid DOS drive found, check your configuration file.\n" ); /* Create a C drive pointing to Unix root dir */ DOSDrives[2].root = xstrdup( "/" ); DOSDrives[2].dos_cwd = xstrdup( "" ); diff --git a/files/file.c b/files/file.c index 3d00a25bc00..0ba36fd31a6 100644 --- a/files/file.c +++ b/files/file.c @@ -26,6 +26,179 @@ #include "stddebug.h" #include "debug.h" +#define MAX_OPEN_FILES 64 /* Max. open files for all tasks; must be <255 */ + +typedef struct +{ + int unix_handle; + int mode; +} DOS_FILE; + +/* Global files array */ +static DOS_FILE DOSFiles[MAX_OPEN_FILES]; + + +/*********************************************************************** + * FILE_AllocDOSFile + * + * Allocate a file from the DOS files array. + */ +static BYTE FILE_AllocDOSFile( int unix_handle ) +{ + BYTE i; + for (i = 0; i < MAX_OPEN_FILES; i++) if (!DOSFiles[i].mode) + { + DOSFiles[i].unix_handle = unix_handle; + DOSFiles[i].mode = 1; + return i; + } + return 0xff; +} + + +/*********************************************************************** + * FILE_FreeDOSFile + * + * Free a file from the DOS files array. + */ +static BOOL FILE_FreeDOSFile( BYTE handle ) +{ + if (handle >= MAX_OPEN_FILES) return FALSE; + if (!DOSFiles[handle].mode) return FALSE; + DOSFiles[handle].mode = 0; + return TRUE; +} + + +/*********************************************************************** + * FILE_GetUnixHandle + * + * Return the Unix handle for a global DOS file handle. + */ +static int FILE_GetUnixHandle( BYTE handle ) +{ + if (handle >= MAX_OPEN_FILES) return -1; + if (!DOSFiles[handle].mode) return -1; + return DOSFiles[handle].unix_handle; +} + + +/*********************************************************************** + * FILE_AllocTaskHandle + * + * Allocate a per-task file handle. + */ +static HFILE FILE_AllocTaskHandle( int unix_handle ) +{ + PDB *pdb = (PDB *)GlobalLock( GetCurrentPDB() ); + BYTE *files, *fp; + WORD i; + + if (!pdb) + { + fprintf(stderr,"FILE_MakeTaskHandle: internal error, no current PDB.\n"); + exit(1); + } + files = PTR_SEG_TO_LIN( pdb->fileHandlesPtr ); + fp = files + 1; /* Don't use handle 0, as some programs don't like it */ + for (i = pdb->nbFiles - 1; (i > 0) && (*fp != 0xff); i--, fp++); + if (!i || (*fp = FILE_AllocDOSFile( unix_handle )) == 0xff) + { /* No more handles or files */ + DOS_ERROR( ER_TooManyOpenFiles, EC_ProgramError, SA_Abort, EL_Disk ); + return -1; + } + dprintf_file(stddeb, + "FILE_AllocTaskHandle: returning task handle %d, file %d for unix handle %d file %d of %d \n", + (fp - files), *fp, unix_handle, pdb->nbFiles - i, pdb->nbFiles ); + return (HFILE)(fp - files); +} + + +/*********************************************************************** + * FILE_FreeTaskHandle + * + * Free a per-task file handle. + */ +static void FILE_FreeTaskHandle( HFILE handle ) +{ + PDB *pdb = (PDB *)GlobalLock( GetCurrentPDB() ); + BYTE *files; + + if (!pdb) + { + fprintf(stderr,"FILE_FreeTaskHandle: internal error, no current PDB.\n"); + exit(1); + } + files = PTR_SEG_TO_LIN( pdb->fileHandlesPtr ); + dprintf_file( stddeb,"FILE_FreeTaskHandle: dos=%d file=%d\n", + handle, files[handle] ); + if ((handle < 0) || (handle >= (INT)pdb->nbFiles) || + !FILE_FreeDOSFile( files[handle] )) + { + fprintf( stderr, "FILE_FreeTaskHandle: invalid file handle %d\n", + handle ); + return; + } + files[handle] = 0xff; +} + + +/*********************************************************************** + * FILE_GetUnixTaskHandle + * + * Return the Unix file handle associated to a task file handle. + */ +int FILE_GetUnixTaskHandle( HFILE handle ) +{ + PDB *pdb = (PDB *)GlobalLock( GetCurrentPDB() ); + BYTE *files; + int unix_handle; + + if (!pdb) + { + fprintf(stderr,"FILE_GetUnixHandle: internal error, no current PDB.\n"); + exit(1); + } + files = PTR_SEG_TO_LIN( pdb->fileHandlesPtr ); + if ((handle < 0) || (handle >= (INT)pdb->nbFiles) || + ((unix_handle = FILE_GetUnixHandle( files[handle] )) == -1)) + { + DOS_ERROR( ER_InvalidHandle, EC_ProgramError, SA_Abort, EL_Disk ); + return -1; + } + return unix_handle; +} + + +/*********************************************************************** + * FILE_CloseAllFiles + * + * Close all open files of a given PDB. Used on task termination. + */ +void FILE_CloseAllFiles( HANDLE hPDB ) +{ + BYTE *files; + WORD count; + PDB *pdb = (PDB *)GlobalLock( hPDB ); + int unix_handle; + + if (!pdb) return; + files = PTR_SEG_TO_LIN( pdb->fileHandlesPtr ); + dprintf_file(stddeb,"FILE_CloseAllFiles: closing %d files\n",pdb->nbFiles); + for (count = pdb->nbFiles; count > 0; count--, files++) + { + if (*files != 0xff) + { + if ((unix_handle = FILE_GetUnixHandle( *files )) != -1) + { + close( unix_handle ); + FILE_FreeDOSFile( *files ); + } + *files = 0xff; + } + } +} + /*********************************************************************** * FILE_SetDosError @@ -75,115 +248,6 @@ void FILE_SetDosError(void) } -/*********************************************************************** - * FILE_AllocTaskHandle - * - * Allocate a DOS file handle for the current task. - */ -static HFILE FILE_AllocTaskHandle( int handle ) -{ - PDB *pdb = (PDB *)GlobalLock( GetCurrentPDB() ); - BYTE *files, *fp; - WORD i; - - if (!pdb) - { - fprintf(stderr,"FILE_MakeTaskHandle: internal error, no current PDB.\n"); - exit(1); - } - fp = files = PTR_SEG_TO_LIN( pdb->fileHandlesPtr ); - for (i = pdb->nbFiles; (i > 0) && (*fp != 0xff); i--, fp++); - if (!i || (handle >= 0xff)) /* No more handles */ - { - DOS_ERROR( ER_TooManyOpenFiles, EC_ProgramError, SA_Abort, EL_Disk ); - return -1; - } - *fp = (BYTE)handle; - dprintf_file(stddeb, - "FILE_AllocTaskHandle: returning %d for handle %d file %d of %d \n", - (fp - files),handle,pdb->nbFiles - i, pdb->nbFiles ); - return (HFILE)(fp - files); -} - - -/*********************************************************************** - * FILE_FreeTaskHandle - * - * Free a DOS file handle for the current task. - */ -static void FILE_FreeTaskHandle( HFILE handle ) -{ - PDB *pdb = (PDB *)GlobalLock( GetCurrentPDB() ); - BYTE *files; - - if (!pdb) - { - fprintf(stderr,"FILE_FreeTaskHandle: internal error, no current PDB.\n"); - exit(1); - } - files = PTR_SEG_TO_LIN( pdb->fileHandlesPtr ); - dprintf_file( stddeb,"FILE_FreeTaskHandle: dos=%d unix=%d\n", - handle, files[handle]); - if ((handle<0) || (handle >= (INT)pdb->nbFiles) || (files[handle] == 0xff)) - { - fprintf( stderr, "FILE_FreeTaskHandle: invalid file handle %d\n", - handle ); - return; - } - files[handle] = 0xff; -} - - -/*********************************************************************** - * FILE_GetUnixHandle - * - * Return the Unix file handle associated to a DOS file handle. - */ -int FILE_GetUnixHandle( HFILE handle ) -{ - PDB *pdb = (PDB *)GlobalLock( GetCurrentPDB() ); - BYTE *files; - - if (!pdb) - { - fprintf(stderr,"FILE_GetUnixHandle: internal error, no current PDB.\n"); - exit(1); - } - files = PTR_SEG_TO_LIN( pdb->fileHandlesPtr ); - if ((handle<0) || (handle >= (INT)pdb->nbFiles) || (files[handle] == 0xff)) - { - DOS_ERROR( ER_InvalidHandle, EC_ProgramError, SA_Abort, EL_Disk ); - return -1; - } - return (int)files[handle]; -} - - -/*********************************************************************** - * FILE_CloseAllFiles - * - * Close all open files of a given PDB. Used on task termination. - */ -void FILE_CloseAllFiles( HANDLE hPDB ) -{ - BYTE *files; - WORD count; - PDB *pdb = (PDB *)GlobalLock( hPDB ); - - if (!pdb) return; - files = PTR_SEG_TO_LIN( pdb->fileHandlesPtr ); - fprintf(stderr,"FILE_CloseAllFiles: closing %d files\n",pdb->nbFiles); - for (count = pdb->nbFiles; count > 0; count--, files++) - { - if (*files != 0xff) - { - close( (int)*files ); - *files = 0xff; - } - } -} - - /*********************************************************************** * FILE_OpenUnixFile */ @@ -310,7 +374,7 @@ int FILE_Stat( LPCSTR unixName, BYTE *pattr, DWORD *psize, return 0; } if (pattr) *pattr = FA_ARCHIVE | (S_ISDIR(st.st_mode) ? FA_DIRECTORY : 0); - if (psize) *psize = st.st_size; + if (psize) *psize = S_ISDIR(st.st_mode) ? 0 : st.st_size; DOSFS_ToDosDateTime( &st.st_mtime, pdate, ptime ); return 1; } @@ -327,14 +391,14 @@ int FILE_Fstat( HFILE hFile, BYTE *pattr, DWORD *psize, struct stat st; int handle; - if ((handle = FILE_GetUnixHandle( hFile )) == -1) return 0; + if ((handle = FILE_GetUnixTaskHandle( hFile )) == -1) return 0; if (fstat( handle, &st ) == -1) { FILE_SetDosError(); return 0; } if (pattr) *pattr = FA_ARCHIVE | (S_ISDIR(st.st_mode) ? FA_DIRECTORY : 0); - if (psize) *psize = st.st_size; + if (psize) *psize = S_ISDIR(st.st_mode) ? 0 : st.st_size; DOSFS_ToDosDateTime( &st.st_mtime, pdate, ptime ); return 1; } @@ -400,7 +464,7 @@ HFILE FILE_Dup( HFILE hFile ) int handle, newhandle; HFILE dosHandle; - if ((handle = FILE_GetUnixHandle( hFile )) == -1) return HFILE_ERROR; + if ((handle = FILE_GetUnixTaskHandle( hFile )) == -1) return HFILE_ERROR; dprintf_file( stddeb, "FILE_Dup for handle %d\n",handle); if ((newhandle = dup(handle)) == -1) { @@ -425,7 +489,7 @@ HFILE FILE_Dup2( HFILE hFile1, HFILE hFile2 ) BYTE *files; int handle, newhandle; - if ((handle = FILE_GetUnixHandle( hFile1 )) == -1) return HFILE_ERROR; + if ((handle = FILE_GetUnixTaskHandle( hFile1 )) == -1) return HFILE_ERROR; dprintf_file( stddeb, "FILE_Dup2 for handle %d\n",handle); if ((hFile2 < 0) || (hFile2 >= (INT)pdb->nbFiles)) { @@ -639,6 +703,22 @@ found: } +/*********************************************************************** + * FILE_Read + */ +LONG FILE_Read( HFILE hFile, LPSTR buffer, LONG count ) +{ + int handle; + LONG result; + + dprintf_file( stddeb, "FILE_Read: %d %p %ld\n", hFile, buffer, count ); + if ((handle = FILE_GetUnixTaskHandle( hFile )) == -1) return -1; + if (!count) return 0; + if ((result = read( handle, buffer, count )) == -1) FILE_SetDosError(); + return result; +} + + /*********************************************************************** * GetTempFileName (KERNEL.97) */ @@ -719,7 +799,7 @@ HFILE _lclose( HFILE hFile ) int handle; - if ((handle = FILE_GetUnixHandle( hFile )) == -1) return HFILE_ERROR; + if ((handle = FILE_GetUnixTaskHandle( hFile )) == -1) return HFILE_ERROR; dprintf_file( stddeb, "_lclose: doshandle %d unixhandle %d\n", hFile,handle ); if (handle <= 2) { @@ -735,7 +815,7 @@ HFILE _lclose( HFILE hFile ) /*********************************************************************** * _lread (KERNEL.82) */ -INT _lread( HFILE hFile, LPSTR buffer, WORD count ) +INT _lread( HFILE hFile, SEGPTR buffer, WORD count ) { return (INT)_hread( hFile, buffer, (LONG)count ); } @@ -787,7 +867,7 @@ LONG _llseek( HFILE hFile, LONG lOffset, INT nOrigin ) dprintf_file( stddeb, "_llseek: handle %d, offset %ld, origin %d\n", hFile, lOffset, nOrigin); - if ((handle = FILE_GetUnixHandle( hFile )) == -1) return HFILE_ERROR; + if ((handle = FILE_GetUnixTaskHandle( hFile )) == -1) return HFILE_ERROR; switch(nOrigin) { case 1: origin = SEEK_CUR; break; @@ -843,17 +923,19 @@ INT _lwrite( HFILE hFile, LPCSTR buffer, WORD count ) /*********************************************************************** * _hread (KERNEL.349) */ -LONG _hread( HFILE hFile, LPSTR buffer, LONG count ) +LONG _hread( HFILE hFile, SEGPTR buffer, LONG count ) { - int handle; - LONG result; +#ifndef WINELIB + LONG maxlen; - dprintf_file( stddeb, "_hread: %d %p %ld\n", hFile, buffer, count ); - - if ((handle = FILE_GetUnixHandle( hFile )) == -1) return -1; - if (!count) return 0; - if ((result = read( handle, buffer, count )) == -1) FILE_SetDosError(); - return result; + dprintf_file( stddeb, "_hread: %d %08lx %ld\n", + hFile, (DWORD)buffer, count ); + + /* Some programs pass a count larger than the allocated buffer */ + maxlen = GetSelectorLimit( SELECTOROF(buffer) ) - OFFSETOF(buffer) + 1; + if (count > maxlen) count = maxlen; +#endif + return FILE_Read( hFile, PTR_SEG_TO_LIN(buffer), count ); } @@ -867,7 +949,7 @@ LONG _hwrite( HFILE hFile, LPCSTR buffer, LONG count ) dprintf_file( stddeb, "_hwrite: %d %p %ld\n", hFile, buffer, count ); - if ((handle = FILE_GetUnixHandle( hFile )) == -1) return HFILE_ERROR; + if ((handle = FILE_GetUnixTaskHandle( hFile )) == -1) return HFILE_ERROR; if (count == 0) /* Expand or truncate at current position */ result = ftruncate( handle, lseek( handle, 0, SEEK_CUR ) ); diff --git a/files/profile.c b/files/profile.c index 50816e13a8b..61a916a5a0b 100644 --- a/files/profile.c +++ b/files/profile.c @@ -447,21 +447,22 @@ static INT PROFILE_GetSection( PROFILESECTION *section, { if (section->name && !lstrcmpi( section->name, section_name )) { + INT oldlen = len; for (key = section->key; key; key = key->next) { if (len <= 2) break; if (IS_ENTRY_COMMENT(key->name)) continue; /* Skip comments */ PROFILE_CopyEntry( buffer, key->name, len - 1, handle_env ); - len -= strlen(buffer) - 1; + len -= strlen(buffer) + 1; buffer += strlen(buffer) + 1; } *buffer = '\0'; - return len - 1; + return oldlen - len + 1; } section = section->next; } buffer[0] = buffer[1] = '\0'; - return len - 2; + return 2; } diff --git a/if1632/Makefile.in b/if1632/Makefile.in index 8cdd78d5212..1db5b311c95 100644 --- a/if1632/Makefile.in +++ b/if1632/Makefile.in @@ -8,7 +8,8 @@ DLLS16 = commdlg.spec compobj.spec ddeml.spec gdi.spec kernel.spec \ shell.spec sound.spec storage.spec stress.spec system.spec \ toolhelp.spec user.spec win87em.spec winprocs.spec winsock.spec -DLLS32 = advapi32.spec comdlg32.spec gdi32.spec kernel32.spec shell32.spec user32.spec winprocs32.spec +DLLS32 = advapi32.spec comctl32.spec comdlg32.spec gdi32.spec kernel32.spec \ + ole32.spec shell32.spec user32.spec winprocs32.spec winspool.spec SPEC16_FILES = $(DLLS16:.spec=.S) SPEC32_FILES = $(DLLS32:.spec=.c) @@ -53,18 +54,18 @@ clean:: # Kludge: don't use optimisation flags to compile these files advapi32.o: advapi32.c - $(CC) -c $(DEFS) $(DIVINCL) $(EXTRA_DEFS) -o advapi32.o advapi32.c + $(CC) -c -g $(DEFS) $(DIVINCL) $(EXTRA_DEFS) -o advapi32.o advapi32.c comdlg32.o: comdlg32.c - $(CC) -c $(DEFS) $(DIVINCL) $(EXTRA_DEFS) -o comdlg32.o comdlg32.c + $(CC) -c -g $(DEFS) $(DIVINCL) $(EXTRA_DEFS) -o comdlg32.o comdlg32.c gdi32.o: gdi32.c - $(CC) -c $(DEFS) $(DIVINCL) $(EXTRA_DEFS) -o gdi32.o gdi32.c + $(CC) -c -g $(DEFS) $(DIVINCL) $(EXTRA_DEFS) -o gdi32.o gdi32.c kernel32.o: kernel32.c - $(CC) -c $(DEFS) $(DIVINCL) $(EXTRA_DEFS) -o kernel32.o kernel32.c + $(CC) -c -g $(DEFS) $(DIVINCL) $(EXTRA_DEFS) -o kernel32.o kernel32.c shell32.o: shell32.c - $(CC) -c $(DEFS) $(DIVINCL) $(EXTRA_DEFS) -o shell32.o shell32.c + $(CC) -c -g $(DEFS) $(DIVINCL) $(EXTRA_DEFS) -o shell32.o shell32.c user32.o: user32.c - $(CC) -c $(DEFS) $(DIVINCL) $(EXTRA_DEFS) -o user32.o user32.c + $(CC) -c -g $(DEFS) $(DIVINCL) $(EXTRA_DEFS) -o user32.o user32.c winprocs32.o: winprocs32.c - $(CC) -c $(DEFS) $(DIVINCL) $(EXTRA_DEFS) -o winprocs32.o winprocs32.c + $(CC) -c -g $(DEFS) $(DIVINCL) $(EXTRA_DEFS) -o winprocs32.o winprocs32.c ### Dependencies: diff --git a/if1632/comctl32.spec b/if1632/comctl32.spec new file mode 100644 index 00000000000..5967fef2745 --- /dev/null +++ b/if1632/comctl32.spec @@ -0,0 +1,60 @@ +name comctl32 +base 2 + +00 stub MenuHelp +01 stub ShowHideMenuCtl +02 stub GetEffectiveClientRect +03 stub DrawStatusTextA +04 stub CreateStatusWindowA +05 stub CreateToolbar +06 stub CreateMappedBitmap +07 stub CreatePropertySheetPage +08 stub CreatePropertySheetPageA +09 stub CreatePropertySheetPageW +10 stub CreateStatusWindow +11 stub MakeDragList +12 stub LBItemFromPt +13 stub DrawInsert +14 stub CreateUpDownControl +15 stub InitCommonControls +16 stub CreateStatusWindowW +17 stub CreateToolbarEx +18 stub DestroyPropertySheetPage +19 stub DrawStatusText +20 stub DrawStatusTextW +21 stub ImageList_Add +22 stub ImageList_AddIcon +23 stub ImageList_AddMasked +24 stub ImageList_BeginDrag +25 stub ImageList_Create +26 stub ImageList_Destroy +27 stub ImageList_DragEnter +28 stub ImageList_DragLeave +29 stub ImageList_DragMove +30 stub ImageList_DragShowNolock +31 stub ImageList_Draw +32 stub ImageList_DrawEx +33 stub ImageList_EndDrag +34 stub ImageList_GetBkColor +35 stub ImageList_GetDragImage +36 stub ImageList_GetIcon +37 stub ImageList_GetIconSize +38 stub ImageList_GetImageCount +39 stub ImageList_GetImageInfo +40 stub ImageList_GetImageRect +41 stub ImageList_LoadImage +42 stub ImageList_LoadImageA +43 stub ImageList_LoadImageW +44 stub ImageList_Merge +45 stub ImageList_Read +46 stub ImageList_Remove +47 stub ImageList_Replace +48 stub ImageList_ReplaceIcon +49 stub ImageList_SetBkColor +50 stub ImageList_SetDragCursorImage +51 stub ImageList_SetIconSize +52 stub ImageList_SetOverlayImage +53 stub ImageList_Write +54 stub PropertySheet +55 stub PropertySheetA +56 stub PropertySheetW diff --git a/if1632/gdi32.spec b/if1632/gdi32.spec index 43d7586d8bb..9899d0eaf41 100644 --- a/if1632/gdi32.spec +++ b/if1632/gdi32.spec @@ -20,7 +20,7 @@ base 1 0016 stub CloseFigure 0017 stub CloseMetaFile 0018 stub ColorMatchToTarget -0019 stub CombineRgn +0019 stdcall CombineRgn(long long long long) CombineRgn 0020 stub CombineTransform 0021 stub CopyEnhMetaFileA 0022 stub CopyEnhMetaFileW @@ -60,7 +60,7 @@ base 1 0056 stub CreatePenIndirect 0057 stub CreatePolyPolygonRgn 0058 stub CreatePolygonRgn -0059 stub CreateRectRgn +0059 stdcall CreateRectRgn(long long long long) CreateRectRgn 0060 stub CreateRectRgnIndirect 0061 stub CreateRoundRectRgn 0062 stub CreateScalableFontResourceA @@ -205,7 +205,7 @@ base 1 0201 stub GetMiterLimit 0202 stub GetNearestColor 0203 stub GetNearestPaletteIndex -0204 stdcall GetObjectA(long long ptr) GetObject +0204 stdcall GetObjectA(long long ptr) WIN32_GetObject 0205 stub GetObjectType 0206 stub GetObjectW 0207 stub GetOutlineTextMetricsA @@ -333,7 +333,7 @@ base 1 0329 stub SetPixelV 0330 stub SetPolyFillMode 0331 stub SetROP2 -0332 stub SetRectRgn +0332 stdcall SetRectRgn(long long long long long) SetRectRgn 0333 stub SetRelAbs 0334 stub SetStretchBltMode 0335 stub SetSystemPaletteUse @@ -351,7 +351,7 @@ base 1 0347 stub StartDocA 0348 stub StartDocW 0349 stub StartPage -0350 stub StretchBlt +0350 stdcall StretchBlt(long long long long long long long long long long long) StretchBlt 0351 stub StretchDIBits 0352 stub StrokeAndFillPath 0353 stub StrokePath @@ -363,4 +363,30 @@ base 1 0359 stub UpdateColors 0360 stub WidenPath 0361 stub pstackConnect +#late additions +0362 stub DeviceCapabilitiesEx +0363 stub GdiDciBeginAccess +0364 stub GdiDciCreateOffscreenSurface +0365 stub GdiDciCreateOverlaySurface +0366 stub GdiDciCreatePrimarySurface +0367 stub GdiDciDestroySurface +0368 stub GdiDciDrawSurface +0369 stub GdiDciEndAccess +0370 stub GdiDciEnumSurface +0371 stub GdiDciInitialize +0372 stub GdiDciSetClipList +0373 stub GdiDciSetDestination +0374 stub GdiDllInitialize +0375 stub GdiGetLocalBitmap +0376 stub GdiWinWatchClose +0377 stub GdiWinWatchDidStatusChange +0378 stub GdiWinWatchGetClipList +0379 stub GdiWinWatchOpen +0380 stub GetGlyphOutlineWow +0381 stub GetTextCharsetInfo +0382 stub TranslateCharsetInfo +0383 stub UpdateICMRegKeyA +0384 stub UpdateICMRegKeyW +0385 stub gdiPlaySpoolStream + diff --git a/if1632/kernel.spec b/if1632/kernel.spec index 01fa49f9487..7d874edf949 100644 --- a/if1632/kernel.spec +++ b/if1632/kernel.spec @@ -78,7 +78,7 @@ id 1 #79 RESERVED3 #80 RESERVED4 81 pascal16 _lclose(word) _lclose -82 pascal16 _lread(word ptr word) _lread +82 pascal16 _lread(word segptr word) _lread 83 pascal16 _lcreat(ptr word) _lcreat 84 pascal _llseek(word long word) _llseek 85 pascal16 _lopen(ptr word) _lopen @@ -256,7 +256,7 @@ id 1 346 pascal16 IsBadHugeReadPtr(segptr long) IsBadHugeReadPtr 347 pascal16 IsBadHugeWritePtr(segptr long) IsBadHugeWritePtr 348 pascal16 hmemcpy(ptr ptr long) hmemcpy -349 pascal _hread(word ptr long) _hread +349 pascal _hread(word segptr long) _hread 350 pascal _hwrite(word ptr long) _hwrite #351 BUNNY_351 352 stub lstrcatn diff --git a/if1632/kernel32.spec b/if1632/kernel32.spec index a660700773e..b54f516f434 100644 --- a/if1632/kernel32.spec +++ b/if1632/kernel32.spec @@ -338,7 +338,7 @@ base 1 0333 stub GlobalWire 0334 stdcall HeapAlloc(long long long) HeapAlloc 0335 stub HeapCompact -0336 stub HeapCreate +0336 stdcall HeapCreate(long long long) HeapCreate 0337 stub HeapDestroy 0338 stub HeapFree 0339 stub HeapLock @@ -618,3 +618,22 @@ base 1 0613 stub lstrlen 0614 stdcall lstrlenA(ptr) strlen 0615 stub lstrlenW +#late additions +0616 stub GetPrivateProfileSectionNamesA +0617 stub GetPrivateProfileSectionNamesW +0618 stub GetPrivateProfileStructA +0619 stub GetPrivateProfileStructW +0620 stub GetProcessVersion +0621 stub GetSystemPowerStatus +0622 stub GetSystemTimeAsFileTime +0623 stub HeapCreateTagsW +0624 stub HeapExtend +0625 stub HeapQueryTagW +0626 stub HeapSummary +0627 stub HeapUsage +0628 stub IsDebuggerPresent +0629 stub PostQueuedCompletionStatus +0630 stub SetSystemPowerState +0631 stub WritePrivateProfileStructA +0632 stub WritePrivateProfileStructW +0633 stub MakeCriticalSectionGlobal diff --git a/if1632/ole32.spec b/if1632/ole32.spec new file mode 100644 index 00000000000..f9c6dd2eea9 --- /dev/null +++ b/if1632/ole32.spec @@ -0,0 +1,165 @@ +name ole32 +base 1 + +0 stub BindMoniker +1 stub CLSIDFromProgID +2 stub CLSIDFromString +3 stub CoBuildVersion +4 stub CoCreateFreeThreadedMarshaler +5 stub CoCreateGuid +6 stub CoCreateInstance +7 stub CoDisconnectObject +8 stub CoDosDateTimeToFileTime +9 stub CoFileTimeNow +10 stub CoFileTimeToDosDateTime +11 stub CoFreeAllLibraries +12 stub CoFreeLibrary +13 stub CoFreeUnusedLibraries +14 stub CoGetCallerTID +15 stub CoGetClassObject +16 stub CoGetCurrentLogicalThreadId +17 stub CoGetCurrentProcess +18 stub CoGetInterfaceAndReleaseStream +19 stub CoGetMalloc +20 stub CoGetMarshalSizeMax +21 stub CoGetPSClsid +22 stub CoGetStandardMarshal +23 stub CoGetState +24 stub CoGetTreatAsClass +25 stub CoInitialize +26 stub CoInitializeWOW +27 stub CoIsHandlerConnected +28 stub CoIsOle1Class +29 stub CoLoadLibrary +30 stub CoLockObjectExternal +31 stub CoMarshalHresult +32 stub CoMarshalInterThreadInterfaceInStream +33 stub CoMarshalInterface +34 stub CoQueryReleaseObject +35 stub CoRegisterClassObject +36 stub CoRegisterMallocSpy +37 stub CoRegisterMessageFilter +38 stub CoReleaseMarshalData +39 stub CoRevokeClassObject +40 stub CoRevokeMallocSpy +41 stub CoSetState +42 stub CoTaskMemAlloc +43 stub CoTaskMemFree +44 stub CoTaskMemRealloc +45 stub CoTreatAsClass +46 stub CoUninitialize +47 stub CoUnloadingWOW +48 stub CoUnmarshalHresult +49 stub CoUnmarshalInterface +50 stub CreateAntiMoniker +51 stub CreateBindCtx +52 stub CreateDataAdviseHolder +53 stub CreateDataCache +54 stub CreateFileMoniker +55 stub CreateGenericComposite +56 stub CreateILockBytesOnHGlobal +57 stub CreateItemMoniker +58 stub CreateOleAdviseHolder +59 stub CreatePointerMoniker +60 stub CreateStreamOnHGlobal +61 stub DllDebugObjectRPCHook +62 stub DllGetClassObject +63 stub DllGetClassObjectWOW +64 stub DoDragDrop +65 stub EnableHookObject +66 stub GetClassFile +67 stub GetConvertStg +68 stub GetDocumentBitStg +69 stub GetHGlobalFromILockBytes +70 stub GetHGlobalFromStream +71 stub GetHookInterface +72 stub GetRunningObjectTable +73 stub IIDFromString +74 stub IsAccelerator +75 stub IsEqualGUID +76 stub IsValidIid +77 stub IsValidInterface +78 stub IsValidPtrIn +79 stub IsValidPtrOut +80 stub MkParseDisplayName +81 stub MonikerCommonPrefixWith +82 stub MonikerRelativePathTo +83 stub OleBuildVersion +84 stub OleConvertIStorageToOLESTREAM +85 stub OleConvertIStorageToOLESTREAMEx +86 stub OleConvertOLESTREAMToIStorage +87 stub OleConvertOLESTREAMToIStorageEx +88 stub OleCreate +89 stub OleCreateDefaultHandler +90 stub OleCreateEmbeddingHelper +91 stub OleCreateFromData +92 stub OleCreateFromFile +93 stub OleCreateLink +94 stub OleCreateLinkFromData +95 stub OleCreateLinkToFile +96 stub OleCreateMenuDescriptor +97 stub OleCreateStaticFromData +98 stub OleDestroyMenuDescriptor +99 stub OleDoAutoConvert +100 stub OleDraw +101 stub OleDuplicateData +102 stub OleFlushClipboard +103 stub OleGetAutoConvert +104 stub OleGetClipboard +105 stub OleGetIconOfClass +106 stub OleGetIconOfFile +107 stub OleInitialize +108 stub OleInitializeWOW +109 stub OleIsCurrentClipboard +110 stub OleIsRunning +111 stub OleLoad +112 stub OleLoadFromStream +113 stub OleLockRunning +114 stub OleMetafilePictFromIconAndLabel +115 stub OleNoteObjectVisible +116 stub OleQueryCreateFromData +117 stub OleQueryLinkFromData +118 stub OleRegEnumFormatEtc +119 stub OleRegEnumVerbs +120 stub OleRegGetMiscStatus +121 stub OleRegGetUserType +122 stub OleRun +123 stub OleSave +124 stub OleSaveToStream +125 stub OleSetAutoConvert +126 stub OleSetClipboard +127 stub OleSetContainedObject +128 stub OleSetMenuDescriptor +129 stub OleTranslateAccelerator +130 stub OleUninitialize +131 stub OpenOrCreateStream +132 stub ProgIDFromCLSID +133 stub ReadClassStg +134 stub ReadClassStm +135 stub ReadFmtUserTypeStg +136 stub ReadOleStg +137 stub ReadStringStream +138 stub RegisterDragDrop +139 stub ReleaseStgMedium +140 stub RevokeDragDrop +141 stub SetConvertStg +142 stub SetDocumentBitStg +143 stub StgCreateDocfile +144 stub StgCreateDocfileOnILockBytes +145 stub StgIsStorageFile +146 stub StgIsStorageILockBytes +147 stub StgOpenStorage +148 stub StgOpenStorageOnILockBytes +149 stub StgSetTimes +150 stub StringFromCLSID +151 stub StringFromGUID2 +152 stub StringFromIID +153 stub UtConvertDvtd16toDvtd32 +154 stub UtConvertDvtd32toDvtd16 +155 stub UtGetDvtd16Info +156 stub UtGetDvtd32Info +157 stub WriteClassStg +158 stub WriteClassStm +159 stub WriteFmtUserTypeStg +160 stub WriteOleStg +161 stub WriteStringStream diff --git a/if1632/relay32.c b/if1632/relay32.c index a380483df2b..54c18980767 100644 --- a/if1632/relay32.c +++ b/if1632/relay32.c @@ -12,6 +12,8 @@ #include #include "windows.h" #include "dlls.h" +#include "module.h" +#include "neexe.h" #include "pe_image.h" #include "peexe.h" #include "relay32.h" @@ -23,24 +25,30 @@ WIN32_builtin *WIN32_builtin_list; /* Functions are in generated code */ void ADVAPI32_Init(); +void COMCTL32_Init(); void COMDLG32_Init(); +void OLE32_Init(); void GDI32_Init(); void KERNEL32_Init(); void SHELL32_Init(); void USER32_Init(); void WINPROCS32_Init(); +void WINSPOOL_Init(); int RELAY32_Init(void) { #ifndef WINELIB /* Add a call for each DLL */ ADVAPI32_Init(); + COMCTL32_Init(); COMDLG32_Init(); GDI32_Init(); KERNEL32_Init(); + OLE32_Init(); SHELL32_Init(); USER32_Init(); WINPROCS32_Init(); + WINSPOOL_Init(); #endif /* Why should it fail, anyways? */ return 1; @@ -72,70 +80,18 @@ void RELAY32_Unimplemented(char *dll, int item) exit(1); } -void *RELAY32_GetEntryPoint(char *dll_name, char *item, int hint) +void *RELAY32_GetEntryPoint(WIN32_builtin *dll, char *item, int hint) { - WIN32_builtin *dll; int i; - u_short * ordinal; - u_long * function; - u_char ** name; - struct PE_Export_Directory * pe_exports; - unsigned int load_addr; dprintf_module(stddeb, "Looking for %s in %s, hint %x\n", - item ? item: "(no name)", dll_name, hint); - dll=RELAY32_GetBuiltinDLL(dll_name); - /* FIXME: This should deal with built-in DLLs only. See pe_module on - loading PE DLLs */ + item ? item: "(no name)", dll->name, hint); if(!dll) return 0; -#if 0 - if(!dll) { - if(!wine_files || !wine_files->name || - lstrcmpi(dll_name, wine_files->name)) { - LoadModule(dll_name, (LPVOID) -1); - if(!wine_files || !wine_files->name || - lstrcmpi(dll_name, wine_files->name)) - return 0; - } - load_addr = wine_files->load_addr; - pe_exports = wine_files->pe->pe_export; - ordinal = (u_short *) (((char *) load_addr) + (int) pe_exports->Address_Of_Name_Ordinals); - function = (u_long *) (((char *) load_addr) + (int) pe_exports->AddressOfFunctions); - name = (u_char **) (((char *) load_addr) + (int) pe_exports->AddressOfNames); - /* import by ordinal */ - if(!item){ - return 0; - } - /* hint is correct */ - #if 0 - if(hint && hintsize && - dll->functions[hint].name && - strcmp(item,dll->functions[hint].name)==0) - return dll->functions[hint].definition; - #endif - /* hint is incorrect, search for name */ - for(i=0;iNumber_Of_Functions;i++) - if (name[i] && !strcmp(item,name[i]+load_addr)) - return function[i]+(char *)load_addr; - - /* function at hint has no name (unimplemented) */ - #if 0 - if(hint && hintsize && !dll->functions[hint].name) - { - dll->functions[hint].name=xstrdup(item); - dprintf_module(stddeb, "Returning unimplemented function %s.%d\n", - dll_name,hint); - return dll->functions[hint].definition; - } - #endif - printf("Not found\n"); - return 0; - } -#endif /* import by ordinal */ if(!item){ - if(hint && hintsize)return dll->functions[hint].definition; + if(hint && hintsize) + return dll->functions[hint-dll->base].definition; return 0; } /* hint is correct */ @@ -153,7 +109,7 @@ void *RELAY32_GetEntryPoint(char *dll_name, char *item, int hint) { dll->functions[hint].name=xstrdup(item); dprintf_module(stddeb, "Returning unimplemented function %s.%d\n", - dll_name,hint); + dll->name,hint); return dll->functions[hint].definition; } return 0; @@ -179,3 +135,63 @@ __asm__ ( ); return ret; } + +void RELAY32_MakeFakeModule(WIN32_builtin*dll) +{ + NE_MODULE *pModule; + struct w_files *wpnt; + int size; + HMODULE hModule; + LOADEDFILEINFO *pFileInfo; + char *pStr; + wpnt=xmalloc(sizeof(struct w_files)); + wpnt->hinstance=0; + wpnt->hModule=0; + wpnt->initialised=1; + wpnt->mz_header=wpnt->pe=0; + size=sizeof(NE_MODULE) + + /* loaded file info */ + sizeof(LOADEDFILEINFO) + strlen(dll->name) + + /* name table */ + 12 + + /* several empty tables */ + 8; + hModule = GlobalAlloc( GMEM_MOVEABLE | GMEM_ZEROINIT, size ); + wpnt->hModule = hModule; + FarSetOwner( hModule, hModule ); + pModule = (NE_MODULE*)GlobalLock(hModule); + /* Set all used entries */ + pModule->magic=PE_SIGNATURE; + pModule->count=1; + pModule->next=0; + pModule->flags=0; + pModule->dgroup=0; + pModule->ss=0; + pModule->cs=0; + pModule->heap_size=0; + pModule->stack_size=0; + pModule->seg_count=0; + pModule->modref_count=0; + pModule->nrname_size=0; + pModule->seg_table=0; + pModule->fileinfo=sizeof(NE_MODULE); + pModule->os_flags=NE_OSFLAGS_WINDOWS; + pModule->expected_version=0x30A; + pFileInfo=(LOADEDFILEINFO *)(pModule + 1); + pFileInfo->length = sizeof(LOADEDFILEINFO)+strlen(dll->name)-1; + strcpy(pFileInfo->filename,dll->name); + pStr = ((char*)pFileInfo+pFileInfo->length+1); + pModule->name_table=(int)pStr-(int)pModule; + *pStr=strlen(dll->name); + strcpy(pStr+1,dll->name); + pStr += *pStr+1; + pModule->res_table=pModule->import_table=pModule->entry_table= + (int)pStr-(int)pModule; + MODULE_RegisterModule(hModule); + wpnt->builtin=dll; + wpnt->next=wine_files; + wine_files=wpnt; +} + + + diff --git a/if1632/shell32.spec b/if1632/shell32.spec index 1ce2e8aa94c..1e191e2fee9 100644 --- a/if1632/shell32.spec +++ b/if1632/shell32.spec @@ -4,84 +4,122 @@ base 1 0000 stub CheckEscapesA 0001 stub CheckEscapesW 0002 stub CommandLineToArgvW -0003 stub DoEnvironmentSubstA -0004 stub DoEnvironmentSubstW -0005 stub DragAcceptFiles -0006 stub DragFinish -0007 stub DragQueryFileA -0008 stub DragQueryFileAorW -0009 stub DragQueryFileW -0010 stub DragQueryPoint -0011 stub DuplicateIcon -0012 stub ExtractAssociatedIconA -0013 stub ExtractAssociatedIconExA -0014 stub ExtractAssociatedIconExW -0015 stub ExtractAssociatedIconW -0016 stub ExtractIconA -0017 stub ExtractIconResInfoA -0018 stub ExtractIconResInfoW -0019 stub ExtractIconW -0020 stub ExtractVersionResource16W -0021 stub FindExeDlgProc -0022 stub FindExecutableA -0023 stub FindExecutableW -0024 stub FreeIconList -0025 stub InternalExtractIconListA -0026 stub InternalExtractIconListW -0027 stub RealShellExecuteA -0028 stub RealShellExecuteExA -0029 stub RealShellExecuteExW -0030 stub RealShellExecuteW -0031 stub RegenerateUserEnvironment -0032 stub RegisterShellHook -0033 stub SheChangeDirA -0034 stub SheChangeDirExA -0035 stub SheChangeDirExW -0036 stub SheChangeDirW -0037 stub SheConvertPathW -0038 stub SheFullPathA -0039 stub SheFullPathW -0040 stub SheGetCurDrive -0041 stub SheGetDirA -0042 stub SheGetDirExW -0043 stub SheGetDirW -0044 stub SheGetPathOffsetW -0045 stub SheRemoveQuotesA -0046 stub SheRemoveQuotesW -0047 stub SheSetCurDrive -0048 stub SheShortenPathA -0049 stub SheShortenPathW -0050 stub ShellAboutA -0051 stub ShellAboutW -0052 stub ShellExecuteA -0053 stub ShellExecuteW -0054 stub ShellHookProc -0055 stub StrChrA -0056 stub StrChrIA -0057 stub StrChrIW -0058 stub StrChrW -0059 stub StrCmpNA -0060 stub StrCmpNIA -0061 stub StrCmpNIW -0062 stub StrCmpNW -0063 stub StrCpyNA -0064 stub StrCpyNW -0065 stub StrNCmpA -0066 stub StrNCmpIA -0067 stub StrNCmpIW -0068 stub StrNCmpW -0069 stub StrNCpyA -0070 stub StrNCpyW -0071 stub StrRChrA -0072 stub StrRChrIA -0073 stub StrRChrIW -0074 stub StrRChrW -0075 stub StrRStrA -0076 stub StrRStrIA -0077 stub StrRStrIW -0078 stub StrRStrW -0079 stub StrStrA -0080 stub StrStrIA -0081 stub StrStrIW -0082 stub StrStrW -0083 stub WOWShellExecute +0003 stub Control_FillCache_RunDLL +0004 stub Control_RunDLL +0005 stub DllGetClassObject +0006 stub DoEnvironmentSubstA +0007 stub DoEnvironmentSubstW +0008 stub DragAcceptFiles +0009 stub DragFinish +0010 stub DragQueryFile +0011 stub DragQueryFileA +0012 stub DragQueryFileAorW +0013 stub DragQueryFileW +0014 stub DragQueryPoint +0015 stub DuplicateIcon +0016 stub ExtractAssociatedIconA +0017 stub ExtractAssociatedIconExA +0018 stub ExtractAssociatedIconExW +0019 stub ExtractAssociatedIconW +0020 stub ExtractIconA +0021 stub ExtractIconEx +0022 stub ExtractIconExA +0023 stub ExtractIconExW +0024 stub ExtractIconResInfoA +0025 stub ExtractIconResInfoW +0026 stub ExtractIconW +0027 stub ExtractVersionResource16W +0028 stub FindExeDlgProc +0029 stub FindExecutableA +0030 stub FindExecutableW +0031 stub FreeIconList +0032 stub InternalExtractIconListA +0033 stub InternalExtractIconListW +0034 stub OpenAs_RunDLL +0035 stub PrintersGetCommand_RunDLL +0036 stub RealShellExecuteA +0037 stub RealShellExecuteExA +0038 stub RealShellExecuteExW +0039 stub RealShellExecuteW +0040 stub RegenerateUserEnvironment +0041 stub RegisterShellHook +0042 stub SHAddToRecentDocs +0043 stub SHAppBarMessage +0044 stub SHBrowseForFolder +0045 stub SHBrowseForFolderA +0046 stub SHBrowseForFolderW +0047 stub SHChangeNotify +0048 stub SHFileOperation +0049 stub SHFileOperationA +0050 stub SHFileOperationW +0051 stub SHFormatDrive +0052 stub SHFreeNameMappings +0053 stub SHGetDesktopFolder +0054 stub SHGetFileInfo +0055 stub SHGetFileInfoA +0056 stub SHGetFileInfoW +0057 stub SHGetInstanceExplorer +0058 stub SHGetMalloc +0059 stub SHGetPathFromIDList +0060 stub SHGetPathFromIDListA +0061 stub SHGetPathFromIDListW +0062 stub SHGetSpecialFolderLocation +0063 stub SHHelpShortcuts_RunDLL +0064 stub SHLoadInProc +0065 stub SheChangeDirA +0066 stub SheChangeDirExA +0067 stub SheChangeDirExW +0068 stub SheChangeDirW +0069 stub SheConvertPathW +0070 stub SheFullPathA +0071 stub SheFullPathW +0072 stub SheGetCurDrive +0073 stub SheGetDirA +0074 stub SheGetDirExW +0075 stub SheGetDirW +0076 stub SheGetPathOffsetW +0077 stub SheRemoveQuotesA +0078 stub SheRemoveQuotesW +0079 stub SheSetCurDrive +0080 stub SheShortenPathA +0081 stub SheShortenPathW +0082 stub ShellAboutA +0083 stub ShellAboutW +0084 stub ShellExecuteA +0085 stub ShellExecuteEx +0086 stub ShellExecuteExA +0087 stub ShellExecuteExW +0088 stub ShellExecuteW +0089 stub ShellHookProc +0090 stub Shell_NotifyIcon +0091 stub Shell_NotifyIconA +0092 stub Shell_NotifyIconW +0093 stub StrChrA +0094 stub StrChrIA +0095 stub StrChrIW +0096 stub StrChrW +0097 stub StrCmpNA +0098 stub StrCmpNIA +0099 stub StrCmpNIW +0100 stub StrCmpNW +0101 stub StrCpyNA +0102 stub StrCpyNW +0103 stub StrNCmpA +0104 stub StrNCmpIA +0105 stub StrNCmpIW +0106 stub StrNCmpW +0107 stub StrNCpyA +0108 stub StrNCpyW +0109 stub StrRChrA +0110 stub StrRChrIA +0111 stub StrRChrIW +0112 stub StrRChrW +0113 stub StrRStrA +0114 stub StrRStrIA +0115 stub StrRStrIW +0116 stub StrRStrW +0117 stub StrStrA +0118 stub StrStrIA +0119 stub StrStrIW +0120 stub StrStrW +0121 stub WOWShellExecute diff --git a/if1632/user32.spec b/if1632/user32.spec index 1a56acc52b1..bb36b0b7164 100644 --- a/if1632/user32.spec +++ b/if1632/user32.spec @@ -70,11 +70,15 @@ base 1 0066 stub CreateCursor 0067 stub CreateDesktopA 0068 stub CreateDesktopW -0069 stub CreateDialogIndirectParamA +0069 stdcall CreateDialogIndirectParamA(long ptr long ptr long) + USER32_CreateDialogIndirectParamA 0070 stub CreateDialogIndirectParamAorW -0071 stub CreateDialogIndirectParamW -0072 stub CreateDialogParamA -0073 stub CreateDialogParamW +0071 stdcall CreateDialogIndirectParamW(long ptr long ptr long) + USER32_CreateDialogIndirectParamW +0072 stdcall CreateDialogParamA(long ptr long ptr long) + USER32_CreateDialogParamA +0073 stdcall CreateDialogParamW(long ptr long ptr long) + USER32_CreateDialogParamW 0074 stub CreateIcon 0075 stub CreateIconFromResource 0076 stub CreateIconFromResourceEx @@ -137,11 +141,13 @@ base 1 0132 stub DestroyIcon 0133 stub DestroyMenu 0134 stub DestroyWindow -0135 stub DialogBoxIndirectParamA +0135 stdcall DialogBoxIndirectParamA(long ptr long ptr long) + USER32_DialogBoxIndirectParamA 0136 stub DialogBoxIndirectParamAorW -0137 stub DialogBoxIndirectParamW -0138 stub DialogBoxParamA -0139 stub DialogBoxParamW +0137 stdcall DialogBoxIndirectParamW(long ptr long ptr long) + USER32_DialogBoxIndirectParamW +0138 stdcall DialogBoxParamA(long ptr long ptr long) USER32_DialogBoxParamA +0139 stdcall DialogBoxParamW(long ptr long ptr long) USER32_DialogBoxParamW 0140 stdcall DispatchMessageA(ptr) USER32_DispatchMessageA 0141 stub DispatchMessageW 0142 stub DlgDirListA @@ -203,7 +209,7 @@ base 1 0198 stub FindWindowExA 0199 stub FindWindowExW 0200 stub FindWindowW -0201 stub FlashWindow +0201 stdcall FlashWindow(long long) FlashWindow 0202 stub FrameRect 0203 stub FreeDDElParam 0204 stub GetActiveWindow @@ -355,7 +361,7 @@ base 1 0350 stub IsWindowVisible 0351 stub IsZoomed 0352 stub KillSystemTimer -0353 stub KillTimer +0353 stdcall KillTimer(long long) KillTimer 0354 stdcall LoadAcceleratorsA(long ptr) WIN32_LoadAcceleratorsA 0355 stdcall LoadAcceleratorsW(long ptr) WIN32_LoadAcceleratorsW 0356 stdcall LoadBitmapA(long ptr) WIN32_LoadBitmapA @@ -421,7 +427,7 @@ base 1 0415 stub PeekMessageA 0416 stub PeekMessageW 0417 stub PlaySoundEvent -0418 stub PostMessageA +0418 stdcall PostMessageA(long long long long) PostMessage 0419 stub PostMessageW 0420 stdcall PostQuitMessage(long) PostQuitMessage 0421 stub PostThreadMessageA @@ -441,7 +447,7 @@ base 1 0435 stub RegisterTasklist 0436 stub RegisterWindowMessageA 0437 stub RegisterWindowMessageW -0438 stub ReleaseCapture +0438 stdcall ReleaseCapture() ReleaseCapture 0439 stdcall ReleaseDC(long long) ReleaseDC 0440 stub RemoveMenu 0441 stub RemovePropA @@ -456,7 +462,7 @@ base 1 0450 stub ScrollWindowEx 0451 stub SendDlgItemMessageA 0452 stub SendDlgItemMessageW -0453 stub SendMessageA +0453 stdcall SendMessageA(long long long long) SendMessage 0454 stub SendMessageCallbackA 0455 stub SendMessageCallbackW 0456 stub SendMessageTimeoutA @@ -466,7 +472,7 @@ base 1 0460 stub SendNotifyMessageW 0461 stub ServerSetFunctionPointers 0462 stub SetActiveWindow -0463 stub SetCapture +0463 stdcall SetCapture(long) SetCapture 0464 stub SetCaretBlinkTime 0465 stub SetCaretPos 0466 stub SetClassLongA @@ -513,7 +519,7 @@ base 1 0507 stub SetSystemMenu 0508 stub SetSystemTimer 0509 stub SetThreadDesktop -0510 stub SetTimer +0510 stdcall SetTimer(long long long long) USER32_SetTimer 0511 stub SetUserObjectInformationA 0512 stub SetUserObjectInformationW 0513 stub SetUserObjectSecurity @@ -587,7 +593,19 @@ base 1 0581 stub WindowFromPoint 0582 stub keybd_event 0583 stub mouse_event -0584 cdecl wsprintfA(ptr ptr ...) wsprintf +0584 cdecl wsprintfA(ptr ptr ...) vsprintf 0585 stub wsprintfW 0586 stub wvsprintfA 0587 stub wvsprintfW +#late additions +0588 stub ChangeDisplaySettingsA +0588 stub ChangeDisplaySettingsW +0588 stub EnumDesktopWindows +0588 stub EnumDisplaySettingsA +0588 stub EnumDisplaySettingsW +0588 stub GetWindowRgn +0588 stub MapVirtualKeyExW +0588 stub RegisterServicesProcess +0588 stub SetWindowRgn +0588 stub ToUnicodeEx + diff --git a/if1632/winspool.spec b/if1632/winspool.spec new file mode 100644 index 00000000000..d3ac3157a6f --- /dev/null +++ b/if1632/winspool.spec @@ -0,0 +1,126 @@ +name winspool +base 100 + +001 stub ADVANCEDSETUPDIALOG +002 stub AbortPrinter +003 stub AddFormA +004 stub AddFormW +005 stub AddJobA +006 stub AddJobW +007 stub AddMonitorA +008 stub AddMonitorW +009 stub AddPortA +010 stub AddPortExA +011 stub AddPortExW +012 stub AddPortW +013 stub AddPrintProcessorA +014 stub AddPrintProcessorW +015 stub AddPrintProvidorA +016 stub AddPrintProvidorW +017 stub AddPrinterA +018 stub AddPrinterConnectionA +019 stub AddPrinterConnectionW +020 stub AddPrinterDriverA +021 stub AddPrinterDriverW +022 stub AddPrinterW +023 stub AdvancedDocumentPropertiesA +024 stub AdvancedDocumentPropertiesW +025 stub AdvancedSetupDialog +026 stub ClosePrinter +027 stub ConfigurePortA +028 stub ConfigurePortW +029 stub ConnectToPrinterDlg +030 stub CreatePrinterIC +031 stub DEVICECAPABILITIES +032 stub DEVICEMODE +033 stub DeleteFormA +034 stub DeleteFormW +035 stub DeleteMonitorA +036 stub DeleteMonitorW +037 stub DeletePortA +038 stub DeletePortW +039 stub DeletePrintProcessorA +040 stub DeletePrintProcessorW +041 stub DeletePrintProvidorA +042 stub DeletePrintProvidorW +043 stub DeletePrinter +044 stub DeletePrinterConnectionA +045 stub DeletePrinterConnectionW +046 stub DeletePrinterDriverA +047 stub DeletePrinterDriverW +048 stub DeletePrinterIC +049 stub DevQueryPrint +050 stub DeviceCapabilities +051 stub DeviceCapabilitiesA +052 stub DeviceCapabilitiesW +053 stub DeviceMode +054 stub DocumentEvent +055 stub DocumentPropertiesA +056 stub DocumentPropertiesW +057 stub EXTDEVICEMODE +058 stub EndDocPrinter +059 stub EndPagePrinter +060 stub EnumFormsA +061 stub EnumFormsW +062 stub EnumJobsA +063 stub EnumJobsW +064 stub EnumMonitorsA +065 stub EnumMonitorsW +066 stub EnumPortsA +067 stub EnumPortsW +068 stub EnumPrintProcessorDatatypesA +069 stub EnumPrintProcessorDatatypesW +070 stub EnumPrintProcessorsA +071 stub EnumPrintProcessorsW +072 stub EnumPrinterDriversA +073 stub EnumPrinterDriversW +074 stub EnumPrintersA +075 stub EnumPrintersW +076 stub ExtDeviceMode +077 stub FindClosePrinterChangeNotification +078 stub FindFirstPrinterChangeNotification +079 stub FindNextPrinterChangeNotification +080 stub FreePrinterNotifyInfo +081 stub GetFormA +082 stub GetFormW +083 stub GetJobA +084 stub GetJobW +085 stub GetPrintProcessorDirectoryA +086 stub GetPrintProcessorDirectoryW +087 stub GetPrinterA +088 stub GetPrinterDataA +089 stub GetPrinterDataW +090 stub GetPrinterDriverA +091 stub GetPrinterDriverDirectoryA +092 stub GetPrinterDriverDirectoryW +093 stub GetPrinterDriverW +094 stub GetPrinterW +095 stub InitializeDll +096 stub OpenPrinterA +097 stub OpenPrinterW +098 stub PlayGdiScriptOnPrinterIC +099 stub PrinterMessageBoxA +100 stub PrinterMessageBoxW +101 stub PrinterProperties +102 stub ReadPrinter +103 stub ResetPrinterA +104 stub ResetPrinterW +105 stub ScheduleJob +106 stub SetAllocFailCount +107 stub SetFormA +108 stub SetFormW +109 stub SetJobA +110 stub SetJobW +111 stub SetPrinterA +112 stub SetPrinterDataA +113 stub SetPrinterDataW +114 stub SetPrinterW +115 stub SpoolerDevQueryPrintW +116 stub SpoolerInit +117 stub StartDocDlgA +118 stub StartDocDlgW +119 stub StartDocPrinterA +120 stub StartDocPrinterW +121 stub StartPagePrinter +122 stub WaitForPrinterChange +123 stub WritePrinter diff --git a/include/debug.h b/include/debug.h index 82e08ebddd7..1d721918a2e 100644 --- a/include/debug.h +++ b/include/debug.h @@ -28,6 +28,7 @@ #undef DEBUG_CLIPPING #undef DEBUG_COMBO #undef DEBUG_COMM +#undef DEBUG_COMMDLG #undef DEBUG_CURSOR #undef DEBUG_DC #undef DEBUG_DDE @@ -106,6 +107,7 @@ #define DEBUG_CLIPPING #define DEBUG_COMBO #define DEBUG_COMM +#define DEBUG_COMMDLG #define DEBUG_CURSOR #define DEBUG_DC #define DEBUG_DDE @@ -234,6 +236,11 @@ short debug_msg_enabled[]={ #else 0, #endif +#ifdef DEBUG_COMMDLG + 1, +#else + 0, +#endif #ifdef DEBUG_CURSOR 1, #else @@ -713,8 +720,21 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_cursor if(!debug_msg_enabled[12]) ; else fprintf -#define debugging_cursor debug_msg_enabled[12] +#define dprintf_commdlg if(!debug_msg_enabled[12]) ; else fprintf +#define debugging_commdlg debug_msg_enabled[12] +#else +#ifdef DEBUG_COMMDLG +#define dprintf_commdlg fprintf +#define debugging_commdlg 1 +#else +#define dprintf_commdlg while(0) fprintf +#define debugging_commdlg 0 +#endif +#endif + +#ifdef DEBUG_RUNTIME +#define dprintf_cursor if(!debug_msg_enabled[13]) ; else fprintf +#define debugging_cursor debug_msg_enabled[13] #else #ifdef DEBUG_CURSOR #define dprintf_cursor fprintf @@ -726,8 +746,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_dc if(!debug_msg_enabled[13]) ; else fprintf -#define debugging_dc debug_msg_enabled[13] +#define dprintf_dc if(!debug_msg_enabled[14]) ; else fprintf +#define debugging_dc debug_msg_enabled[14] #else #ifdef DEBUG_DC #define dprintf_dc fprintf @@ -739,8 +759,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_dde if(!debug_msg_enabled[14]) ; else fprintf -#define debugging_dde debug_msg_enabled[14] +#define dprintf_dde if(!debug_msg_enabled[15]) ; else fprintf +#define debugging_dde debug_msg_enabled[15] #else #ifdef DEBUG_DDE #define dprintf_dde fprintf @@ -752,8 +772,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_dialog if(!debug_msg_enabled[15]) ; else fprintf -#define debugging_dialog debug_msg_enabled[15] +#define dprintf_dialog if(!debug_msg_enabled[16]) ; else fprintf +#define debugging_dialog debug_msg_enabled[16] #else #ifdef DEBUG_DIALOG #define dprintf_dialog fprintf @@ -765,8 +785,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_dll if(!debug_msg_enabled[16]) ; else fprintf -#define debugging_dll debug_msg_enabled[16] +#define dprintf_dll if(!debug_msg_enabled[17]) ; else fprintf +#define debugging_dll debug_msg_enabled[17] #else #ifdef DEBUG_DLL #define dprintf_dll fprintf @@ -778,8 +798,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_dosfs if(!debug_msg_enabled[17]) ; else fprintf -#define debugging_dosfs debug_msg_enabled[17] +#define dprintf_dosfs if(!debug_msg_enabled[18]) ; else fprintf +#define debugging_dosfs debug_msg_enabled[18] #else #ifdef DEBUG_DOSFS #define dprintf_dosfs fprintf @@ -791,8 +811,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_driver if(!debug_msg_enabled[18]) ; else fprintf -#define debugging_driver debug_msg_enabled[18] +#define dprintf_driver if(!debug_msg_enabled[19]) ; else fprintf +#define debugging_driver debug_msg_enabled[19] #else #ifdef DEBUG_DRIVER #define dprintf_driver fprintf @@ -804,8 +824,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_edit if(!debug_msg_enabled[19]) ; else fprintf -#define debugging_edit debug_msg_enabled[19] +#define dprintf_edit if(!debug_msg_enabled[20]) ; else fprintf +#define debugging_edit debug_msg_enabled[20] #else #ifdef DEBUG_EDIT #define dprintf_edit fprintf @@ -817,8 +837,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_enum if(!debug_msg_enabled[20]) ; else fprintf -#define debugging_enum debug_msg_enabled[20] +#define dprintf_enum if(!debug_msg_enabled[21]) ; else fprintf +#define debugging_enum debug_msg_enabled[21] #else #ifdef DEBUG_ENUM #define dprintf_enum fprintf @@ -830,8 +850,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_env if(!debug_msg_enabled[21]) ; else fprintf -#define debugging_env debug_msg_enabled[21] +#define dprintf_env if(!debug_msg_enabled[22]) ; else fprintf +#define debugging_env debug_msg_enabled[22] #else #ifdef DEBUG_ENV #define dprintf_env fprintf @@ -843,8 +863,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_event if(!debug_msg_enabled[22]) ; else fprintf -#define debugging_event debug_msg_enabled[22] +#define dprintf_event if(!debug_msg_enabled[23]) ; else fprintf +#define debugging_event debug_msg_enabled[23] #else #ifdef DEBUG_EVENT #define dprintf_event fprintf @@ -856,8 +876,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_exec if(!debug_msg_enabled[23]) ; else fprintf -#define debugging_exec debug_msg_enabled[23] +#define dprintf_exec if(!debug_msg_enabled[24]) ; else fprintf +#define debugging_exec debug_msg_enabled[24] #else #ifdef DEBUG_EXEC #define dprintf_exec fprintf @@ -869,8 +889,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_file if(!debug_msg_enabled[24]) ; else fprintf -#define debugging_file debug_msg_enabled[24] +#define dprintf_file if(!debug_msg_enabled[25]) ; else fprintf +#define debugging_file debug_msg_enabled[25] #else #ifdef DEBUG_FILE #define dprintf_file fprintf @@ -882,8 +902,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_fixup if(!debug_msg_enabled[25]) ; else fprintf -#define debugging_fixup debug_msg_enabled[25] +#define dprintf_fixup if(!debug_msg_enabled[26]) ; else fprintf +#define debugging_fixup debug_msg_enabled[26] #else #ifdef DEBUG_FIXUP #define dprintf_fixup fprintf @@ -895,8 +915,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_font if(!debug_msg_enabled[26]) ; else fprintf -#define debugging_font debug_msg_enabled[26] +#define dprintf_font if(!debug_msg_enabled[27]) ; else fprintf +#define debugging_font debug_msg_enabled[27] #else #ifdef DEBUG_FONT #define dprintf_font fprintf @@ -908,8 +928,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_gdi if(!debug_msg_enabled[27]) ; else fprintf -#define debugging_gdi debug_msg_enabled[27] +#define dprintf_gdi if(!debug_msg_enabled[28]) ; else fprintf +#define debugging_gdi debug_msg_enabled[28] #else #ifdef DEBUG_GDI #define dprintf_gdi fprintf @@ -921,8 +941,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_global if(!debug_msg_enabled[28]) ; else fprintf -#define debugging_global debug_msg_enabled[28] +#define dprintf_global if(!debug_msg_enabled[29]) ; else fprintf +#define debugging_global debug_msg_enabled[29] #else #ifdef DEBUG_GLOBAL #define dprintf_global fprintf @@ -934,8 +954,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_graphics if(!debug_msg_enabled[29]) ; else fprintf -#define debugging_graphics debug_msg_enabled[29] +#define dprintf_graphics if(!debug_msg_enabled[30]) ; else fprintf +#define debugging_graphics debug_msg_enabled[30] #else #ifdef DEBUG_GRAPHICS #define dprintf_graphics fprintf @@ -947,8 +967,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_hook if(!debug_msg_enabled[30]) ; else fprintf -#define debugging_hook debug_msg_enabled[30] +#define dprintf_hook if(!debug_msg_enabled[31]) ; else fprintf +#define debugging_hook debug_msg_enabled[31] #else #ifdef DEBUG_HOOK #define dprintf_hook fprintf @@ -960,8 +980,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_icon if(!debug_msg_enabled[31]) ; else fprintf -#define debugging_icon debug_msg_enabled[31] +#define dprintf_icon if(!debug_msg_enabled[32]) ; else fprintf +#define debugging_icon debug_msg_enabled[32] #else #ifdef DEBUG_ICON #define dprintf_icon fprintf @@ -973,8 +993,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_int if(!debug_msg_enabled[32]) ; else fprintf -#define debugging_int debug_msg_enabled[32] +#define dprintf_int if(!debug_msg_enabled[33]) ; else fprintf +#define debugging_int debug_msg_enabled[33] #else #ifdef DEBUG_INT #define dprintf_int fprintf @@ -986,8 +1006,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_key if(!debug_msg_enabled[33]) ; else fprintf -#define debugging_key debug_msg_enabled[33] +#define dprintf_key if(!debug_msg_enabled[34]) ; else fprintf +#define debugging_key debug_msg_enabled[34] #else #ifdef DEBUG_KEY #define dprintf_key fprintf @@ -999,8 +1019,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_keyboard if(!debug_msg_enabled[34]) ; else fprintf -#define debugging_keyboard debug_msg_enabled[34] +#define dprintf_keyboard if(!debug_msg_enabled[35]) ; else fprintf +#define debugging_keyboard debug_msg_enabled[35] #else #ifdef DEBUG_KEYBOARD #define dprintf_keyboard fprintf @@ -1012,8 +1032,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_ldt if(!debug_msg_enabled[35]) ; else fprintf -#define debugging_ldt debug_msg_enabled[35] +#define dprintf_ldt if(!debug_msg_enabled[36]) ; else fprintf +#define debugging_ldt debug_msg_enabled[36] #else #ifdef DEBUG_LDT #define dprintf_ldt fprintf @@ -1025,8 +1045,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_listbox if(!debug_msg_enabled[36]) ; else fprintf -#define debugging_listbox debug_msg_enabled[36] +#define dprintf_listbox if(!debug_msg_enabled[37]) ; else fprintf +#define debugging_listbox debug_msg_enabled[37] #else #ifdef DEBUG_LISTBOX #define dprintf_listbox fprintf @@ -1038,8 +1058,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_local if(!debug_msg_enabled[37]) ; else fprintf -#define debugging_local debug_msg_enabled[37] +#define dprintf_local if(!debug_msg_enabled[38]) ; else fprintf +#define debugging_local debug_msg_enabled[38] #else #ifdef DEBUG_LOCAL #define dprintf_local fprintf @@ -1051,8 +1071,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_mci if(!debug_msg_enabled[38]) ; else fprintf -#define debugging_mci debug_msg_enabled[38] +#define dprintf_mci if(!debug_msg_enabled[39]) ; else fprintf +#define debugging_mci debug_msg_enabled[39] #else #ifdef DEBUG_MCI #define dprintf_mci fprintf @@ -1064,8 +1084,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_mcianim if(!debug_msg_enabled[39]) ; else fprintf -#define debugging_mcianim debug_msg_enabled[39] +#define dprintf_mcianim if(!debug_msg_enabled[40]) ; else fprintf +#define debugging_mcianim debug_msg_enabled[40] #else #ifdef DEBUG_MCIANIM #define dprintf_mcianim fprintf @@ -1077,8 +1097,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_mciwave if(!debug_msg_enabled[40]) ; else fprintf -#define debugging_mciwave debug_msg_enabled[40] +#define dprintf_mciwave if(!debug_msg_enabled[41]) ; else fprintf +#define debugging_mciwave debug_msg_enabled[41] #else #ifdef DEBUG_MCIWAVE #define dprintf_mciwave fprintf @@ -1090,8 +1110,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_mdi if(!debug_msg_enabled[41]) ; else fprintf -#define debugging_mdi debug_msg_enabled[41] +#define dprintf_mdi if(!debug_msg_enabled[42]) ; else fprintf +#define debugging_mdi debug_msg_enabled[42] #else #ifdef DEBUG_MDI #define dprintf_mdi fprintf @@ -1103,8 +1123,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_menu if(!debug_msg_enabled[42]) ; else fprintf -#define debugging_menu debug_msg_enabled[42] +#define dprintf_menu if(!debug_msg_enabled[43]) ; else fprintf +#define debugging_menu debug_msg_enabled[43] #else #ifdef DEBUG_MENU #define dprintf_menu fprintf @@ -1116,8 +1136,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_message if(!debug_msg_enabled[43]) ; else fprintf -#define debugging_message debug_msg_enabled[43] +#define dprintf_message if(!debug_msg_enabled[44]) ; else fprintf +#define debugging_message debug_msg_enabled[44] #else #ifdef DEBUG_MESSAGE #define dprintf_message fprintf @@ -1129,8 +1149,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_metafile if(!debug_msg_enabled[44]) ; else fprintf -#define debugging_metafile debug_msg_enabled[44] +#define dprintf_metafile if(!debug_msg_enabled[45]) ; else fprintf +#define debugging_metafile debug_msg_enabled[45] #else #ifdef DEBUG_METAFILE #define dprintf_metafile fprintf @@ -1142,8 +1162,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_midi if(!debug_msg_enabled[45]) ; else fprintf -#define debugging_midi debug_msg_enabled[45] +#define dprintf_midi if(!debug_msg_enabled[46]) ; else fprintf +#define debugging_midi debug_msg_enabled[46] #else #ifdef DEBUG_MIDI #define dprintf_midi fprintf @@ -1155,8 +1175,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_mmio if(!debug_msg_enabled[46]) ; else fprintf -#define debugging_mmio debug_msg_enabled[46] +#define dprintf_mmio if(!debug_msg_enabled[47]) ; else fprintf +#define debugging_mmio debug_msg_enabled[47] #else #ifdef DEBUG_MMIO #define dprintf_mmio fprintf @@ -1168,8 +1188,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_mmsys if(!debug_msg_enabled[47]) ; else fprintf -#define debugging_mmsys debug_msg_enabled[47] +#define dprintf_mmsys if(!debug_msg_enabled[48]) ; else fprintf +#define debugging_mmsys debug_msg_enabled[48] #else #ifdef DEBUG_MMSYS #define dprintf_mmsys fprintf @@ -1181,8 +1201,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_mmtime if(!debug_msg_enabled[48]) ; else fprintf -#define debugging_mmtime debug_msg_enabled[48] +#define dprintf_mmtime if(!debug_msg_enabled[49]) ; else fprintf +#define debugging_mmtime debug_msg_enabled[49] #else #ifdef DEBUG_MMTIME #define dprintf_mmtime fprintf @@ -1194,8 +1214,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_module if(!debug_msg_enabled[49]) ; else fprintf -#define debugging_module debug_msg_enabled[49] +#define dprintf_module if(!debug_msg_enabled[50]) ; else fprintf +#define debugging_module debug_msg_enabled[50] #else #ifdef DEBUG_MODULE #define dprintf_module fprintf @@ -1207,8 +1227,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_msg if(!debug_msg_enabled[50]) ; else fprintf -#define debugging_msg debug_msg_enabled[50] +#define dprintf_msg if(!debug_msg_enabled[51]) ; else fprintf +#define debugging_msg debug_msg_enabled[51] #else #ifdef DEBUG_MSG #define dprintf_msg fprintf @@ -1220,8 +1240,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_nonclient if(!debug_msg_enabled[51]) ; else fprintf -#define debugging_nonclient debug_msg_enabled[51] +#define dprintf_nonclient if(!debug_msg_enabled[52]) ; else fprintf +#define debugging_nonclient debug_msg_enabled[52] #else #ifdef DEBUG_NONCLIENT #define dprintf_nonclient fprintf @@ -1233,8 +1253,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_ole if(!debug_msg_enabled[52]) ; else fprintf -#define debugging_ole debug_msg_enabled[52] +#define dprintf_ole if(!debug_msg_enabled[53]) ; else fprintf +#define debugging_ole debug_msg_enabled[53] #else #ifdef DEBUG_OLE #define dprintf_ole fprintf @@ -1246,8 +1266,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_palette if(!debug_msg_enabled[53]) ; else fprintf -#define debugging_palette debug_msg_enabled[53] +#define dprintf_palette if(!debug_msg_enabled[54]) ; else fprintf +#define debugging_palette debug_msg_enabled[54] #else #ifdef DEBUG_PALETTE #define dprintf_palette fprintf @@ -1259,8 +1279,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_profile if(!debug_msg_enabled[54]) ; else fprintf -#define debugging_profile debug_msg_enabled[54] +#define dprintf_profile if(!debug_msg_enabled[55]) ; else fprintf +#define debugging_profile debug_msg_enabled[55] #else #ifdef DEBUG_PROFILE #define dprintf_profile fprintf @@ -1272,8 +1292,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_prop if(!debug_msg_enabled[55]) ; else fprintf -#define debugging_prop debug_msg_enabled[55] +#define dprintf_prop if(!debug_msg_enabled[56]) ; else fprintf +#define debugging_prop debug_msg_enabled[56] #else #ifdef DEBUG_PROP #define dprintf_prop fprintf @@ -1285,8 +1305,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_reg if(!debug_msg_enabled[56]) ; else fprintf -#define debugging_reg debug_msg_enabled[56] +#define dprintf_reg if(!debug_msg_enabled[57]) ; else fprintf +#define debugging_reg debug_msg_enabled[57] #else #ifdef DEBUG_REG #define dprintf_reg fprintf @@ -1298,8 +1318,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_region if(!debug_msg_enabled[57]) ; else fprintf -#define debugging_region debug_msg_enabled[57] +#define dprintf_region if(!debug_msg_enabled[58]) ; else fprintf +#define debugging_region debug_msg_enabled[58] #else #ifdef DEBUG_REGION #define dprintf_region fprintf @@ -1311,8 +1331,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_relay if(!debug_msg_enabled[58]) ; else fprintf -#define debugging_relay debug_msg_enabled[58] +#define dprintf_relay if(!debug_msg_enabled[59]) ; else fprintf +#define debugging_relay debug_msg_enabled[59] #else #ifdef DEBUG_RELAY #define dprintf_relay fprintf @@ -1324,8 +1344,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_resource if(!debug_msg_enabled[59]) ; else fprintf -#define debugging_resource debug_msg_enabled[59] +#define dprintf_resource if(!debug_msg_enabled[60]) ; else fprintf +#define debugging_resource debug_msg_enabled[60] #else #ifdef DEBUG_RESOURCE #define dprintf_resource fprintf @@ -1337,8 +1357,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_scroll if(!debug_msg_enabled[60]) ; else fprintf -#define debugging_scroll debug_msg_enabled[60] +#define dprintf_scroll if(!debug_msg_enabled[61]) ; else fprintf +#define debugging_scroll debug_msg_enabled[61] #else #ifdef DEBUG_SCROLL #define dprintf_scroll fprintf @@ -1350,8 +1370,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_selector if(!debug_msg_enabled[61]) ; else fprintf -#define debugging_selector debug_msg_enabled[61] +#define dprintf_selector if(!debug_msg_enabled[62]) ; else fprintf +#define debugging_selector debug_msg_enabled[62] #else #ifdef DEBUG_SELECTOR #define dprintf_selector fprintf @@ -1363,8 +1383,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_sem if(!debug_msg_enabled[62]) ; else fprintf -#define debugging_sem debug_msg_enabled[62] +#define dprintf_sem if(!debug_msg_enabled[63]) ; else fprintf +#define debugging_sem debug_msg_enabled[63] #else #ifdef DEBUG_SEM #define dprintf_sem fprintf @@ -1376,8 +1396,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_shm if(!debug_msg_enabled[63]) ; else fprintf -#define debugging_shm debug_msg_enabled[63] +#define dprintf_shm if(!debug_msg_enabled[64]) ; else fprintf +#define debugging_shm debug_msg_enabled[64] #else #ifdef DEBUG_SHM #define dprintf_shm fprintf @@ -1389,8 +1409,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_stress if(!debug_msg_enabled[64]) ; else fprintf -#define debugging_stress debug_msg_enabled[64] +#define dprintf_stress if(!debug_msg_enabled[65]) ; else fprintf +#define debugging_stress debug_msg_enabled[65] #else #ifdef DEBUG_STRESS #define dprintf_stress fprintf @@ -1402,8 +1422,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_syscolor if(!debug_msg_enabled[65]) ; else fprintf -#define debugging_syscolor debug_msg_enabled[65] +#define dprintf_syscolor if(!debug_msg_enabled[66]) ; else fprintf +#define debugging_syscolor debug_msg_enabled[66] #else #ifdef DEBUG_SYSCOLOR #define dprintf_syscolor fprintf @@ -1415,8 +1435,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_task if(!debug_msg_enabled[66]) ; else fprintf -#define debugging_task debug_msg_enabled[66] +#define dprintf_task if(!debug_msg_enabled[67]) ; else fprintf +#define debugging_task debug_msg_enabled[67] #else #ifdef DEBUG_TASK #define dprintf_task fprintf @@ -1428,8 +1448,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_text if(!debug_msg_enabled[67]) ; else fprintf -#define debugging_text debug_msg_enabled[67] +#define dprintf_text if(!debug_msg_enabled[68]) ; else fprintf +#define debugging_text debug_msg_enabled[68] #else #ifdef DEBUG_TEXT #define dprintf_text fprintf @@ -1441,8 +1461,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_timer if(!debug_msg_enabled[68]) ; else fprintf -#define debugging_timer debug_msg_enabled[68] +#define dprintf_timer if(!debug_msg_enabled[69]) ; else fprintf +#define debugging_timer debug_msg_enabled[69] #else #ifdef DEBUG_TIMER #define dprintf_timer fprintf @@ -1454,8 +1474,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_toolhelp if(!debug_msg_enabled[69]) ; else fprintf -#define debugging_toolhelp debug_msg_enabled[69] +#define dprintf_toolhelp if(!debug_msg_enabled[70]) ; else fprintf +#define debugging_toolhelp debug_msg_enabled[70] #else #ifdef DEBUG_TOOLHELP #define dprintf_toolhelp fprintf @@ -1467,8 +1487,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_utility if(!debug_msg_enabled[70]) ; else fprintf -#define debugging_utility debug_msg_enabled[70] +#define dprintf_utility if(!debug_msg_enabled[71]) ; else fprintf +#define debugging_utility debug_msg_enabled[71] #else #ifdef DEBUG_UTILITY #define dprintf_utility fprintf @@ -1480,8 +1500,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_vxd if(!debug_msg_enabled[71]) ; else fprintf -#define debugging_vxd debug_msg_enabled[71] +#define dprintf_vxd if(!debug_msg_enabled[72]) ; else fprintf +#define debugging_vxd debug_msg_enabled[72] #else #ifdef DEBUG_VXD #define dprintf_vxd fprintf @@ -1493,8 +1513,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_win if(!debug_msg_enabled[72]) ; else fprintf -#define debugging_win debug_msg_enabled[72] +#define dprintf_win if(!debug_msg_enabled[73]) ; else fprintf +#define debugging_win debug_msg_enabled[73] #else #ifdef DEBUG_WIN #define dprintf_win fprintf @@ -1506,8 +1526,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_win32 if(!debug_msg_enabled[73]) ; else fprintf -#define debugging_win32 debug_msg_enabled[73] +#define dprintf_win32 if(!debug_msg_enabled[74]) ; else fprintf +#define debugging_win32 debug_msg_enabled[74] #else #ifdef DEBUG_WIN32 #define dprintf_win32 fprintf @@ -1519,8 +1539,8 @@ extern short debug_msg_enabled[]; #endif #ifdef DEBUG_RUNTIME -#define dprintf_winsock if(!debug_msg_enabled[74]) ; else fprintf -#define debugging_winsock debug_msg_enabled[74] +#define dprintf_winsock if(!debug_msg_enabled[75]) ; else fprintf +#define debugging_winsock debug_msg_enabled[75] #else #ifdef DEBUG_WINSOCK #define dprintf_winsock fprintf @@ -1547,6 +1567,7 @@ static char *debug_msg_name[] = { "clipping", "combo", "comm", + "commdlg", "cursor", "dc", "dde", diff --git a/include/dialog.h b/include/dialog.h index 772074e2eb0..2eb2d8f9721 100644 --- a/include/dialog.h +++ b/include/dialog.h @@ -70,4 +70,7 @@ typedef struct #pragma pack(4) +extern WORD xBaseUnit,yBaseUnit; +int DIALOG_DoDialogBox( HWND hwnd, HWND owner ); + #endif /* DIALOG_H */ diff --git a/include/file.h b/include/file.h index 1c585a4eff4..9a4e0e45309 100644 --- a/include/file.h +++ b/include/file.h @@ -10,7 +10,7 @@ #include "windows.h" extern void FILE_SetDosError(void); -extern int FILE_GetUnixHandle( HFILE handle ); +extern int FILE_GetUnixTaskHandle( HFILE handle ); extern void FILE_CloseAllFiles( HANDLE hPDB ); extern int FILE_Open( LPCSTR path, int mode ); extern int FILE_Create( LPCSTR path, int mode, int unique ); @@ -24,6 +24,7 @@ extern int FILE_RemoveDir( LPCSTR path ); extern HFILE FILE_Dup( HFILE hFile ); extern HFILE FILE_Dup2( HFILE hFile1, HFILE hFile2 ); extern int FILE_OpenFile( LPCSTR name, OFSTRUCT *ofs, UINT mode ); +extern LONG FILE_Read( HFILE hFile, LPSTR buffer, LONG count ); extern INT _lcreat_uniq( LPCSTR path, INT attr ); #endif /* __WINE_FILE_H */ diff --git a/include/gdi.h b/include/gdi.h index a8f1899808d..16a631cfa57 100644 --- a/include/gdi.h +++ b/include/gdi.h @@ -26,6 +26,7 @@ #define META_DC_MAGIC 0x4f4f #define METAFILE_MAGIC 0x4f50 #define METAFILE_DC_MAGIC 0x4f51 +#define MAGIC_DONTCARE 0xffff #ifndef WINELIB #pragma pack(1) diff --git a/include/handle32.h b/include/handle32.h index e6d07a75b46..08ab132d8b0 100644 --- a/include/handle32.h +++ b/include/handle32.h @@ -2,6 +2,7 @@ #define __WINE_HANDLE32_H #include +#include "wintypes.h" /* The _*_OBJECT structures contain information needed about each * particular type of handle. This information is a combination of @@ -61,6 +62,31 @@ typedef struct { KERNEL_OBJECT common; } REGKEY_OBJECT; +typedef struct _VRANGE_OBJECT{ + KERNEL_OBJECT common; + DWORD start; + DWORD size; + struct _VRANGE_OBJECT *next; +} VRANGE_OBJECT; + +struct _HEAPITEM_OBJECT; +typedef struct{ + KERNEL_OBJECT common; + LPVOID start; + DWORD size; + DWORD maximum; + DWORD flags; + struct _HEAPITEM_OBJECT *first,*last; +} HEAP_OBJECT; + +typedef struct _HEAPITEM_OBJECT{ + KERNEL_OBJECT common; + HEAP_OBJECT *heap; + DWORD size; /* size including header */ + struct _HEAPITEM_OBJECT *next,*prev; +} HEAPITEM_OBJECT; + + /* Object number definitions. These numbers are used to * validate the kernel object by comparison against the * object's 'magic' value. @@ -73,6 +99,9 @@ typedef struct { #define KERNEL_OBJECT_EVENT (KERNEL_OBJECT_UNUSED + 5) #define KERNEL_OBJECT_REGKEY (KERNEL_OBJECT_UNUSED + 6) #define KERNEL_OBJECT_FILEMAP (KERNEL_OBJECT_UNUSED + 7) +#define KERNEL_OBJECT_VRANGE (KERNEL_OBJECT_UNUSED + 8) +#define KERNEL_OBJECT_HEAP (KERNEL_OBJECT_UNUSED + 9) +#define KERNEL_OBJECT_HEAPITEM (KERNEL_OBJECT_UNUSED + 10) /* Define the invalid handle value */ diff --git a/include/miscemu.h b/include/miscemu.h index 33d7648ae56..af6b0612649 100644 --- a/include/miscemu.h +++ b/include/miscemu.h @@ -12,6 +12,7 @@ /* miscemu/dosmem.c */ extern BOOL DOSMEM_Init(void); +extern void DOSMEM_Alarm(void); extern void DOSMEM_FillBiosSegment(void); extern HANDLE DOSMEM_BiosSeg; diff --git a/include/msdos.h b/include/msdos.h index e399be1ae7b..094c680cb6f 100644 --- a/include/msdos.h +++ b/include/msdos.h @@ -5,21 +5,6 @@ #include #include "comm.h" -#define WINE_PATH_LENGTH 256 -struct dosdirent { - int inuse; - DIR *ds; - char unixpath[WINE_PATH_LENGTH]; - char filename[WINE_PATH_LENGTH]; - char filemask[13]; - char attribute; - char search_attribute; - long filesize; - long filetime; - short entnum; /* Directory entry number */ - struct dosdirent *next; -}; - struct fcb { BYTE drive; char name[8]; @@ -48,6 +33,26 @@ typedef struct char filename[13]; /* 1e file name + extension */ } FINDFILE_DTA; +/* FCB layout for FindFirstFCB/FindNextFCB */ +typedef struct +{ + BYTE drive; /* 00 drive letter */ + char filename[11]; /* 01 filename 8+3 format */ + int count; /* 0c entry count (was: reserved) */ + char *unixPath; /* 10 unix path (was: reserved) */ +} FINDFILE_FCB; + +/* DOS directory entry for FindFirstFCB/FindNextFCB */ +typedef struct +{ + char filename[11]; /* 00 filename 8+3 format */ + BYTE fileattr; /* 0b file attributes */ + BYTE reserved[10]; /* 0c reserved */ + WORD filetime; /* 16 file time */ + WORD filedate; /* 18 file date */ + WORD cluster; /* 1a file first cluster */ + DWORD filesize; /* 1c file size */ +} DOS_DIRENTRY_LAYOUT; #define DOSVERSION 0x1606 /* Major version in low byte: DOS 6.22 */ #define WINDOSVER 0x0616 /* Windows reports the DOS version reversed */ @@ -55,8 +60,6 @@ typedef struct #define MAX_DOS_DRIVES 26 -extern WORD ExtendedError; -extern BYTE ErrorClass, Action, ErrorLocus; extern struct DosDeviceStruct COM[MAX_PORTS]; extern struct DosDeviceStruct LPT[MAX_PORTS]; diff --git a/include/options.h b/include/options.h index 684aa6b9000..a646908b0a0 100644 --- a/include/options.h +++ b/include/options.h @@ -16,7 +16,8 @@ typedef enum LANG_No, /* Norwegian */ LANG_Fr, /* French */ LANG_Fi, /* Finnish */ - LANG_Da /* Danish */ + LANG_Da, /* Danish */ + LANG_Cz /* Czech */ } WINE_LANGUAGE; struct options diff --git a/include/pe_image.h b/include/pe_image.h index 220f5b23907..944d2ff8184 100644 --- a/include/pe_image.h +++ b/include/pe_image.h @@ -1,6 +1,7 @@ #ifndef __WINE_PE_IMAGE_H #define __WINE_PE_IMAGE_H +#include #include "windows.h" struct pe_data { @@ -16,6 +17,21 @@ struct pe_data { int resource_offset; /* offset to resource typedirectory in file */ }; +typedef struct _WIN32_function{ + char *name; + void *definition; +} WIN32_function; + +typedef struct _WIN32_builtin{ + char *name; + WIN32_function *functions; + int size; + int base; + struct _WIN32_builtin *next; +} WIN32_builtin; + +extern WIN32_builtin *WIN32_builtin_list; + struct w_files { struct w_files * next; @@ -29,6 +45,7 @@ struct w_files struct pe_data *pe; OFSTRUCT ofs; unsigned int load_addr; + WIN32_builtin* builtin; }; @@ -38,18 +55,4 @@ extern void PE_InitDLL(HMODULE hModule); extern void my_wcstombs(char * result, u_short * source, int len); extern struct w_files *wine_files; -typedef struct _WIN32_function{ - char *name; - void *definition; -} WIN32_function; - -typedef struct _WIN32_builtin{ - char *name; - WIN32_function *functions; - int size; - struct _WIN32_builtin *next; -} WIN32_builtin; - -extern WIN32_builtin *WIN32_builtin_list; - #endif /* __WINE_PE_IMAGE_H */ diff --git a/include/relay32.h b/include/relay32.h index 2736089d3d0..0fd7680bb64 100644 --- a/include/relay32.h +++ b/include/relay32.h @@ -4,8 +4,13 @@ * Copyright 1995 Martin von Loewis */ +#ifndef _RELAY32_H +#define _RELAY32_H +#include "pe_image.h" + void RELAY32_Unimplemented(char *dll, int item); -void *RELAY32_GetEntryPoint(char *dll_name, char *item, int hint); +WIN32_builtin *RELAY32_GetBuiltinDLL(char *name); +void *RELAY32_GetEntryPoint(WIN32_builtin *dll, char *item, int hint); LONG RELAY32_CallWindowProc(WNDPROC,int,int,int,int); void RELAY32_DebugEnter(char *dll,char *name); @@ -58,3 +63,5 @@ LRESULT USER32_DefWindowProcA(DWORD hwnd,DWORD msg,DWORD wParam,DWORD lParam); BOOL USER32_GetMessageA(struct WIN32_MSG* lpmsg,DWORD hwnd,DWORD min,DWORD max); HDC USER32_BeginPaint(DWORD hwnd,struct WIN32_PAINTSTRUCT *lpps); BOOL USER32_EndPaint(DWORD hwnd,struct WIN32_PAINTSTRUCT *lpps); +#endif + diff --git a/include/resource32.h b/include/resource32.h index bcddc21c50b..c47d50e2ea3 100644 --- a/include/resource32.h +++ b/include/resource32.h @@ -10,7 +10,7 @@ #include -HANDLE32 FindResource32( HINSTANCE hModule, LPCTSTR name, LPCTSTR type ); +HANDLE32 FindResource32( HINSTANCE hModule, LPCWSTR name, LPCWSTR type ); HANDLE32 LoadResource32( HINSTANCE hModule, HANDLE32 hRsrc ); LPVOID LockResource32( HANDLE32 handle ); BOOL FreeResource32( HANDLE32 handle ); @@ -45,4 +45,9 @@ typedef struct _IMAGE_RESOURCE_DIR_STRING_U { WCHAR NameString[1]; } IMAGE_RESOURCE_DIR_STRING_U, *PIMAGE_RESOURCE_DIR_STRING_U; +HMENU WIN32_LoadMenuIndirectW(void *menu); +HMENU WIN32_LoadMenuW(HANDLE instance, LPCWSTR name); +HMENU WIN32_LoadMenuIndirectA(void *menu); +HMENU WIN32_LoadMenuA(HANDLE instance,LPCSTR name); + #endif /* __WINE_RESOURCE32_H */ diff --git a/include/stddebug.h b/include/stddebug.h index 54cc9d2777f..452812a04cc 100644 --- a/include/stddebug.h +++ b/include/stddebug.h @@ -88,6 +88,7 @@ #undef DEBUG_CLIPPING #undef DEBUG_COMBO #undef DEBUG_COMM +#undef DEBUG_COMMDLG #undef DEBUG_CURSOR #undef DEBUG_DC #undef DEBUG_DDE @@ -166,6 +167,7 @@ #define DEBUG_CLIPPING #define DEBUG_COMBO #define DEBUG_COMM +#define DEBUG_COMMDLG #define DEBUG_CURSOR #define DEBUG_DC #define DEBUG_DDE diff --git a/include/string32.h b/include/string32.h index b598c0efe83..a50bb010e15 100644 --- a/include/string32.h +++ b/include/string32.h @@ -13,8 +13,10 @@ int STRING32_UniLen(LPWSTR s); void STRING32_UniToAnsi(LPSTR dest,LPCWSTR src); void STRING32_AnsiToUni(LPWSTR dest,LPCSTR src); -LPSTR STRING32_DupUniToAnsi(LPWSTR src); -LPWSTR STRING32_DupAnsiToUni(LPSTR src); -LPWSTR STRING32_lstrcmpnW(LPCWSTR a,LPCWSTR b,DWORD len); +LPSTR STRING32_DupUniToAnsi(LPCWSTR src); +LPWSTR STRING32_DupAnsiToUni(LPCSTR src); +int STRING32_lstrcmpnW(LPCWSTR a,LPCWSTR b,DWORD len); +int STRING32_lstrcmpniW(LPCWSTR a,LPCWSTR b,DWORD len); +DWORD STRING32_lstrlenW(LPCWSTR); #endif diff --git a/include/struct32.h b/include/struct32.h index f9394cda59d..a7d4dfa3d75 100644 --- a/include/struct32.h +++ b/include/struct32.h @@ -22,4 +22,26 @@ typedef struct tagPOINT32 void PARAM32_POINT32to16(const POINT32*,POINT*); void PARAM32_POINT16to32(const POINT*,POINT32*); +typedef struct { + DWORD style; + DWORD dwExtendedStyle; + WORD noOfItems; + short x; + short y; + WORD cx; + WORD cy; +} DLGTEMPLATE32; + +typedef struct { + DWORD style; + DWORD dwExtendedStyle; + short x; + short y; + short cx; + short cy; + WORD id; +} DLGITEMTEMPLATE32; + +#define CW_USEDEFAULT32 0x80000000 + #endif diff --git a/include/win.h b/include/win.h index f5f7ba15c9b..37184a772b8 100644 --- a/include/win.h +++ b/include/win.h @@ -60,14 +60,15 @@ typedef struct tagWND } WND; /* WND flags values */ -#define WIN_NEEDS_BEGINPAINT 0x01 /* WM_PAINT sent to window */ -#define WIN_NEEDS_ERASEBKGND 0x02 /* WM_ERASEBKGND must be sent to window*/ -#define WIN_NEEDS_NCPAINT 0x04 /* WM_NCPAINT must be sent to window */ -#define WIN_RESTORE_MAX 0x08 /* Maximize when restoring */ -#define WIN_INTERNAL_PAINT 0x10 /* Internal WM_PAINT message pending */ -#define WIN_NO_REDRAW 0x20 /* WM_SETREDRAW called for this window */ -#define WIN_GOT_SIZEMSG 0x40 /* WM_SIZE has been sent to the window */ -#define WIN_NCACTIVATED 0x80 /* last WM_NCACTIVATE was positive */ +#define WIN_NEEDS_BEGINPAINT 0x0001 /* WM_PAINT sent to window */ +#define WIN_NEEDS_ERASEBKGND 0x0002 /* WM_ERASEBKGND must be sent to window*/ +#define WIN_NEEDS_NCPAINT 0x0004 /* WM_NCPAINT must be sent to window */ +#define WIN_RESTORE_MAX 0x0008 /* Maximize when restoring */ +#define WIN_INTERNAL_PAINT 0x0010 /* Internal WM_PAINT message pending */ +#define WIN_NO_REDRAW 0x0020 /* WM_SETREDRAW called for this window */ +#define WIN_GOT_SIZEMSG 0x0040 /* WM_SIZE has been sent to the window */ +#define WIN_NCACTIVATED 0x0080 /* last WM_NCACTIVATE was positive */ +#define WIN_MANAGED 0x0100 /* Window managed by the X wm */ #define WIN_CLASS_INFO(wndPtr) (CLASS_FindClassPtr((wndPtr)->hClass)->wc) #define WIN_CLASS_STYLE(wndPtr) (WIN_CLASS_INFO(wndPtr).style) diff --git a/include/windows.h b/include/windows.h index 0e2ce322a56..22a0cd23c90 100644 --- a/include/windows.h +++ b/include/windows.h @@ -10,23 +10,14 @@ #endif #ifdef WINELIB32 -typedef struct { LONG x,y; } POINT; typedef struct { SHORT x,y; } POINTS; -typedef struct { LONG cx,cy; } SIZE, *LPSIZE; -typedef struct { LONG left, top, right, bottom; } RECT; #define MAKEPOINTS(l) (*((POINTS *)&(l))) #else -typedef struct { INT x,y; } POINT; -typedef struct { INT cx,cy; } SIZE, *LPSIZE; -typedef struct { INT left, top, right, bottom; } RECT; #define MAKEPOINT(l) (*((POINT *)&(l))) #endif -typedef POINT *PPOINT; -typedef POINT *NPPOINT; -typedef POINT *LPPOINT; -typedef RECT *LPRECT; -typedef RECT *NPRECT; -typedef RECT *PRECT; +typedef struct { INT cx,cy; } SIZE, *LPSIZE; +typedef struct { INT x,y; } POINT, *PPOINT, *NPPOINT, *LPPOINT; +typedef struct { INT left, top, right, bottom; } RECT, *LPRECT; #ifdef WINELIB32 #define MAKEWPARAM(low, high) ((LONG)(((WORD)(low)) | \ @@ -1751,32 +1742,33 @@ typedef struct tagDRAGINFO { #define TPM_CENTERALIGN 0x0004 #define TPM_RIGHTALIGN 0x0008 -#define MF_INSERT 0 -#define MF_CHANGE 0x0080 -#define MF_APPEND 0x0100 -#define MF_DELETE 0x0200 -#define MF_REMOVE 0x1000 -#define MF_BYCOMMAND 0 -#define MF_BYPOSITION 0x0400 -#define MF_SEPARATOR 0x0800 -#define MF_ENABLED 0 -#define MF_GRAYED 0x0001 -#define MF_DISABLED 0x0002 -#define MF_UNCHECKED 0 -#define MF_CHECKED 0x0008 +#define MF_INSERT 0x0000 +#define MF_CHANGE 0x0080 +#define MF_APPEND 0x0100 +#define MF_DELETE 0x0200 +#define MF_REMOVE 0x1000 +#define MF_END 0x0080 + +#define MF_ENABLED 0x0000 +#define MF_GRAYED 0x0001 +#define MF_DISABLED 0x0002 +#define MF_STRING 0x0000 +#define MF_BITMAP 0x0004 +#define MF_UNCHECKED 0x0000 +#define MF_CHECKED 0x0008 +#define MF_POPUP 0x0010 +#define MF_MENUBARBREAK 0x0020 +#define MF_MENUBREAK 0x0040 +#define MF_UNHILITE 0x0000 +#define MF_HILITE 0x0080 +#define MF_OWNERDRAW 0x0100 #define MF_USECHECKBITMAPS 0x0200 -#define MF_STRING 0 -#define MF_BITMAP 0x0004 -#define MF_OWNERDRAW 0x0100 -#define MF_POPUP 0x0010 -#define MF_MENUBARBREAK 0x0020 -#define MF_MENUBREAK 0x0040 -#define MF_UNHILITE 0 -#define MF_HILITE 0x0080 -#define MF_SYSMENU 0x2000 -#define MF_HELP 0x4000 -#define MF_MOUSESELECT 0x8000 -#define MF_END 0x0080 +#define MF_BYCOMMAND 0x0000 +#define MF_BYPOSITION 0x0400 +#define MF_SEPARATOR 0x0800 +#define MF_SYSMENU 0x2000 +#define MF_HELP 0x4000 +#define MF_MOUSESELECT 0x8000 #ifndef NOWINOFFSETS #define GCW_HBRBACKGROUND (-10) @@ -2566,6 +2558,35 @@ typedef struct { #define HELP_MULTIKEY 0x0201 #define HELP_SETWINPOS 0x0203 +typedef struct { + TCHAR dmDeviceName[32]; + WORD dmSpecVersion; + WORD dmDriverVersion; + WORD dmSize; + WORD dmDriverExtra; + DWORD dmFields; + short dmOrientation; + short dmPaperSize; + short dmPaperLength; + short dmPaperWidth; + short dmScale; + short dmCopies; + short dmDefaultSource; + short dmPrintQuality; + short dmColor; + short dmDuplex; + short dmYResolution; + short dmTTOption; + short dmCollate; + TCHAR dmFormName[32]; + WORD dmUnusedPadding; + WORD dmBitsPerPel; + DWORD dmPelsWidth; + DWORD dmPelsHeight; + DWORD dmDisplayFlags; + DWORD dmDisplayFrequency; +} DEVMODE; + #ifndef WINELIB #pragma pack(4) #endif @@ -2638,95 +2659,95 @@ HBRUSH CreateBrushIndirect(const LOGBRUSH*); BOOL CreateCaret(HWND,HBITMAP,INT,INT); HBITMAP CreateCompatibleBitmap(HDC,INT,INT); HDC CreateCompatibleDC(HDC); -HCURSOR CreateCursor(HANDLE,INT,INT,INT,INT,LPVOID,LPVOID); -HANDLE CreateCursorIconIndirect(HANDLE,CURSORICONINFO*,LPSTR,LPSTR); -HDC CreateDC(LPCSTR,LPCSTR,LPCSTR,LPCSTR); +HCURSOR CreateCursor(HANDLE,INT,INT,INT,INT,const BYTE*,const BYTE*); +HANDLE CreateCursorIconIndirect(HANDLE,CURSORICONINFO*,const BYTE*,const BYTE*); +HDC CreateDC(LPCTSTR,LPCTSTR,LPCTSTR,const DEVMODE*); HBRUSH CreateDIBPatternBrush(HGLOBAL,UINT); HBITMAP CreateDIBitmap(HDC,BITMAPINFOHEADER*,DWORD,LPVOID,BITMAPINFO*,UINT); -HWND CreateDialog(HANDLE,SEGPTR,HWND,DLGPROC); -HWND CreateDialogIndirect(HANDLE,SEGPTR,HWND,DLGPROC); -HWND CreateDialogIndirectParam(HANDLE,SEGPTR,HWND,DLGPROC,LPARAM); -HWND CreateDialogParam(HANDLE,SEGPTR,HWND,DLGPROC,LPARAM); +HWND CreateDialog(HINSTANCE,SEGPTR,HWND,DLGPROC); +HWND CreateDialogIndirect(HINSTANCE,SEGPTR,HWND,DLGPROC); +HWND CreateDialogIndirectParam(HINSTANCE,SEGPTR,HWND,DLGPROC,LPARAM); +HWND CreateDialogParam(HINSTANCE,SEGPTR,HWND,DLGPROC,LPARAM); HBITMAP CreateDiscardableBitmap(HDC,INT,INT); HRGN CreateEllipticRgn(INT,INT,INT,INT); HRGN CreateEllipticRgnIndirect(LPRECT); HFONT CreateFont(INT,INT,INT,INT,INT,BYTE,BYTE,BYTE,BYTE,BYTE,BYTE,BYTE,BYTE,LPCSTR); HFONT CreateFontIndirect(const LOGFONT*); HBRUSH CreateHatchBrush(INT,COLORREF); -HDC CreateIC(LPSTR,LPSTR,LPSTR,LPSTR); -HICON CreateIcon(HANDLE,INT,INT,BYTE,BYTE,LPSTR,LPSTR); +HDC CreateIC(LPCTSTR,LPCTSTR,LPCTSTR,const DEVMODE*); +HICON CreateIcon(HINSTANCE,INT,INT,BYTE,BYTE,const BYTE*,const BYTE*); HMENU CreateMenu(void); -HANDLE CreateMetaFile(LPSTR); -HPALETTE CreatePalette(LPLOGPALETTE); +HDC CreateMetaFile(LPCTSTR); +HPALETTE CreatePalette(const LOGPALETTE*); HBRUSH CreatePatternBrush(HBITMAP); HPEN CreatePen(INT,INT,COLORREF); -HPEN CreatePenIndirect(LOGPEN*); -HRGN CreatePolyPolygonRgn(LPPOINT,LPINT,INT,INT); -HRGN CreatePolygonRgn(LPPOINT,INT,INT); +HPEN CreatePenIndirect(const LOGPEN*); +HRGN CreatePolyPolygonRgn(const POINT*,const INT*,INT,INT); +HRGN CreatePolygonRgn(const POINT*,INT,INT); HMENU CreatePopupMenu(void); -HRGN CreateRectRgn(short,short,short,short); -HRGN CreateRectRgnIndirect(LPRECT); -HRGN CreateRoundRectRgn(short,short,short,short,short,short); -HBRUSH CreateSolidBrush(DWORD); +HRGN CreateRectRgn(INT,INT,INT,INT); +HRGN CreateRectRgnIndirect(const RECT*); +HRGN CreateRoundRectRgn(INT,INT,INT,INT,INT,INT); +HBRUSH CreateSolidBrush(COLORREF); HWND CreateWindow(SEGPTR,SEGPTR,DWORD,INT,INT,INT,INT,HWND,HMENU,HINSTANCE,SEGPTR); HWND CreateWindowEx(DWORD,SEGPTR,SEGPTR,DWORD,INT,INT,INT,INT,HWND,HMENU,HINSTANCE,SEGPTR); -BOOL DPtoLP(HDC,LPPOINT,int); +BOOL DPtoLP(HDC,LPPOINT,INT); void DebugBreak(void); -LONG DefDlgProc(HWND,UINT,WPARAM,LPARAM); -LONG DefFrameProc(HWND,HWND,UINT,WPARAM,LPARAM); +LRESULT DefDlgProc(HWND,UINT,WPARAM,LPARAM); +LRESULT DefFrameProc(HWND,HWND,UINT,WPARAM,LPARAM); DWORD DefHookProc(short,WORD,DWORD,HHOOK*); -LONG DefMDIChildProc(HWND,UINT,WPARAM,LPARAM); +LRESULT DefMDIChildProc(HWND,UINT,WPARAM,LPARAM); LRESULT DefWindowProc(HWND,UINT,WPARAM,LPARAM); -HDWP DeferWindowPos(HDWP,HWND,HWND,INT,INT,INT,INT,WORD); +HDWP DeferWindowPos(HDWP,HWND,HWND,INT,INT,INT,INT,UINT); ATOM DeleteAtom(ATOM); BOOL DeleteDC(HDC); BOOL DeleteMenu(HMENU,UINT,UINT); BOOL DeleteMetaFile(HMETAFILE); -BOOL DeleteObject(HANDLE); -void DestroyCaret(void); +BOOL DeleteObject(HGDIOBJ); +BOOL DestroyCaret(void); BOOL DestroyCursor(HCURSOR); BOOL DestroyIcon(HICON); BOOL DestroyMenu(HMENU); BOOL DestroyWindow(HWND); -int DialogBox(HINSTANCE,SEGPTR,HWND,WNDPROC); -int DialogBoxIndirect(HANDLE,HANDLE,HWND,WNDPROC); -int DialogBoxIndirectParam(HANDLE,HANDLE,HWND,WNDPROC,LONG); -int DialogBoxParam(HANDLE,SEGPTR,HWND,WNDPROC,LONG); +INT DialogBox(HINSTANCE,SEGPTR,HWND,DLGPROC); +INT DialogBoxIndirect(HINSTANCE,HANDLE,HWND,DLGPROC); +INT DialogBoxIndirectParam(HINSTANCE,HANDLE,HWND,DLGPROC,LONG); +INT DialogBoxParam(HINSTANCE,SEGPTR,HWND,DLGPROC,LONG); HANDLE DirectResAlloc(HANDLE,WORD,WORD); void DirectedYield(HTASK); -LONG DispatchMessage(LPMSG); -INT DlgDirList(HWND,SEGPTR,INT,INT,WORD); -INT DlgDirListComboBox(HWND,SEGPTR,INT,INT,WORD); -BOOL DlgDirSelect(HWND,LPSTR,int); -BOOL DlgDirSelectComboBox(HWND,LPSTR,int); +LONG DispatchMessage(const MSG*); +INT DlgDirList(HWND,SEGPTR,INT,INT,UINT); +INT DlgDirListComboBox(HWND,SEGPTR,INT,INT,UINT); +BOOL DlgDirSelect(HWND,LPSTR,INT); +BOOL DlgDirSelectComboBox(HWND,LPSTR,INT); BOOL DragDetect(HWND,POINT); DWORD DragObject(HWND, HWND, WORD, HANDLE, WORD, HCURSOR); -void DrawFocusRect(HDC,LPRECT); -BOOL DrawIcon(HDC,short,short,HICON); +void DrawFocusRect(HDC,const RECT*); +BOOL DrawIcon(HDC,INT,INT,HICON); void DrawMenuBar(HWND); -int DrawText(HDC,LPCSTR,int,LPRECT,WORD); +INT DrawText(HDC,LPCTSTR,INT,LPRECT,UINT); DWORD DumpIcon(SEGPTR,WORD*,SEGPTR*,SEGPTR*); BOOL Ellipse(HDC,INT,INT,INT,INT); BOOL EmptyClipboard(void); BOOL EnableHardwareInput(BOOL); BOOL EnableMenuItem(HMENU,UINT,UINT); -BOOL EnableScrollBar(HWND,INT,UINT); +BOOL EnableScrollBar(HWND,UINT,UINT); BOOL EnableWindow(HWND,BOOL); BOOL EndDeferWindowPos(HDWP); -void EndDialog(HWND,short); -void EndPaint(HWND,LPPAINTSTRUCT); -BOOL EnumChildWindows(HWND,FARPROC,LONG); -WORD EnumClipboardFormats(WORD); -int EnumFontFamilies(HDC,LPSTR,FONTENUMPROC,LPARAM); -int EnumFonts(HDC,LPSTR,FARPROC,LPSTR); -BOOL EnumMetaFile(HDC,LOCALHANDLE,FARPROC,BYTE*); -int EnumObjects(HDC,int,FARPROC,LPARAM); -int EnumProps(HWND,FARPROC); -BOOL EnumTaskWindows(HANDLE,FARPROC,LONG); -BOOL EnumWindows(FARPROC,LONG); -BOOL EqualRect(LPRECT,LPRECT); +BOOL EndDialog(HWND,INT); +BOOL EndPaint(HWND,const PAINTSTRUCT*); +BOOL EnumChildWindows(HWND,WNDENUMPROC,LPARAM); +UINT EnumClipboardFormats(UINT); +INT EnumFontFamilies(HDC,LPCTSTR,FONTENUMPROC,LPARAM); +INT EnumFonts(HDC,LPCTSTR,FONTENUMPROC,LPARAM); +BOOL EnumMetaFile(HDC,HMETAFILE,MFENUMPROC,LPARAM); +INT EnumObjects(HDC,INT,GOBJENUMPROC,LPARAM); +INT EnumProps(HWND,PROPENUMPROC); +BOOL EnumTaskWindows(HTASK,WNDENUMPROC,LPARAM); +BOOL EnumWindows(WNDENUMPROC,LPARAM); +BOOL EqualRect(const RECT*,const RECT*); BOOL EqualRgn(HRGN,HRGN); -int Escape(HDC,int,int,LPSTR,LPSTR); +INT Escape(HDC,INT,INT,LPCSTR,LPVOID); LONG EscapeCommFunction(int,int); int ExcludeClipRect(HDC,short,short,short,short); int ExcludeUpdateRgn(HDC,HWND); @@ -3269,13 +3290,13 @@ void WriteOutProfiles(void); BOOL WritePrivateProfileString(LPCSTR,LPCSTR,LPCSTR,LPCSTR); BOOL WriteProfileString(LPCSTR,LPCSTR,LPCSTR); void Yield(void); -LONG _hread(HFILE,LPSTR,LONG); +LONG _hread(HFILE,SEGPTR,LONG); LONG _hwrite(HFILE,LPCSTR,LONG); HFILE _lclose(HFILE); HFILE _lcreat(LPCSTR,INT); LONG _llseek(HFILE,LONG,INT); HFILE _lopen(LPCSTR,INT); -INT _lread(HFILE,LPSTR,WORD); +INT _lread(HFILE,SEGPTR,WORD); INT _lwrite(HFILE,LPCSTR,WORD); void hmemcpy(LPVOID,LPCVOID,LONG); SEGPTR lstrcat(SEGPTR,SEGPTR); diff --git a/include/winpos.h b/include/winpos.h index 8660036dd55..33ee4bbc4a8 100644 --- a/include/winpos.h +++ b/include/winpos.h @@ -34,5 +34,6 @@ extern LONG WINPOS_SendNCCalcSize( HWND hwnd, BOOL calcValidRect, RECT *oldClientRect, WINDOWPOS *winpos, RECT *newClientRect ); extern LONG WINPOS_HandleWindowPosChanging( WINDOWPOS *winpos ); +extern INT WINPOS_WindowFromPoint( POINT pt, HWND *phwnd ); #endif /* WINPOS_H */ diff --git a/include/wintypes.h b/include/wintypes.h index 30da7789b6c..77b33feae03 100644 --- a/include/wintypes.h +++ b/include/wintypes.h @@ -39,6 +39,9 @@ typedef void* SEGPTR; #define UIFMT "%u" #define NPFMT "%p" #define SPFMT "%p" + +/* Should probably eventually be unsigned short, but not now */ +typedef char TCHAR; #else typedef short INT; typedef unsigned short UINT; @@ -49,6 +52,9 @@ typedef DWORD SEGPTR; #define UIFMT "%hu" #define NPFMT "%04x" #define SPFMT "%08lx" + +/* TCHAR is just char in Win16 */ +typedef char TCHAR; #endif typedef LONG LPARAM; typedef LONG LRESULT; @@ -56,7 +62,8 @@ typedef INT HFILE; typedef DWORD HHOOK; typedef char *LPSTR; typedef const char *LPCSTR; -typedef LPCSTR LPCTSTR; +typedef TCHAR *LPTSTR; +typedef const TCHAR *LPCTSTR; typedef WCHAR *LPWSTR; typedef const WCHAR *LPCWSTR; typedef char *NPSTR; @@ -81,6 +88,7 @@ DECLARE_HANDLE(HDROP); DECLARE_HANDLE(HDRVR); DECLARE_HANDLE(HDWP); DECLARE_HANDLE(HFONT); +DECLARE_HANDLE(HGDIOBJ); DECLARE_HANDLE(HGLOBAL); DECLARE_HANDLE(HICON); DECLARE_HANDLE(HINSTANCE); @@ -107,12 +115,23 @@ typedef HGLOBAL GLOBALHANDLE; #ifdef WINELIB typedef long (*FARPROC)(); typedef LRESULT (*WNDPROC)(HWND,UINT,WPARAM,LPARAM); +typedef LRESULT (*WNDENUMPROC)(HWND,LPARAM); +/*typedef int (*FONTENUMPROC)(const LOGFONT*,const TEXTMETRIC*,DWORD,LPARAM);*/ +typedef int (*FONTENUMPROC)(const void*,const void*,DWORD,LPARAM); +typedef int (*GOBJENUMPROC)(LPVOID,LPARAM); +typedef BOOL (*PROPENUMPROC)(HWND,LPCTSTR,HANDLE); +/*typedef int (*MFENUMPROC)(HDC,HANDLETABLE*,METARECORD*,int,LPARAM);*/ +typedef int (*MFENUMPROC)(HDC,void*,void*,int,LPARAM); #else typedef SEGPTR FARPROC; typedef SEGPTR WNDPROC; +typedef SEGPTR WNDENUMPROC; +typedef SEGPTR FONTENUMPROC; +typedef SEGPTR GOBJENUMPROC; +typedef SEGPTR PROPENUMPROC; +typedef SEGPTR MFENUMPROC; #endif typedef FARPROC DLGPROC; -typedef FARPROC FONTENUMPROC; typedef FARPROC HOOKPROC; #define TRUE 1 diff --git a/library/miscstubs.c b/library/miscstubs.c index c1cb479012f..1354de1fb24 100644 --- a/library/miscstubs.c +++ b/library/miscstubs.c @@ -10,6 +10,7 @@ #include "dde_mem.h" #include "windows.h" #include "global.h" +#include "relay32.h" #include "debug.h" #include "xmalloc.h" @@ -128,7 +129,12 @@ HGLOBAL GlobalHandle(LPCVOID a) return 0; } -void *RELAY32_GetEntryPoint(char *dll_name, char *item, int hint) +WIN32_builtin *RELAY32_GetBuiltinDLL(char *name) +{ + return NULL; +} + +void *RELAY32_GetEntryPoint(WIN32_builtin *dll, char *item, int hint) { return NULL; } diff --git a/libtest/Makefile.in b/libtest/Makefile.in index 23e4a667fc1..437a6dd5462 100644 --- a/libtest/Makefile.in +++ b/libtest/Makefile.in @@ -1,6 +1,6 @@ TOPSRC = @top_srcdir@ MODULE = none -PROGRAMS = hello hello2 hello3 rolex +PROGRAMS = hello hello2 hello3 hello4 new rolex ALL_LIBS = $(WINELIB) $(X_LIBS) $(XPM_LIB) $(XLIB) $(LDLIBS) C_SRCS = \ @@ -8,6 +8,8 @@ C_SRCS = \ hello2.c \ hello3.c \ hello3res.c \ + hello4.c \ + new.c \ rolex.c all: check_winerc $(PROGRAMS) @@ -23,11 +25,17 @@ hello2: hello2.o $(WINELIB) hello3: hello3res.o hello3.o $(WINELIB) $(CC) -o hello3 hello3.o hello3res.o $(LDOPTIONS) $(ALL_LIBS) +hello4: hello4.o $(WINELIB) + $(CC) -o hello4 hello4.o $(LDOPTIONS) $(ALL_LIBS) + +new: new.o $(WINELIB) + $(CC) -o new new.o $(LDOPTIONS) $(ALL_LIBS) + rolex: rolex.o $(WINELIB) $(CC) -o rolex rolex.o $(LDOPTIONS) $(ALL_LIBS) clean:: - $(RM) hello hello2 hello3 hello3res.c hello3res.h rolex + $(RM) hello hello2 hello3 hello3res.c hello3res.h hello4 new rolex hello3res.c hello3res.h: $(WINERC) diff --git a/libtest/hello4.c b/libtest/hello4.c new file mode 100644 index 00000000000..9e8f8001d79 --- /dev/null +++ b/libtest/hello4.c @@ -0,0 +1,121 @@ +#include +#include + +void Write (HDC dc, int x, int y, char *s) +{ + TextOut (dc, x, y, s, strlen (s)); +} + +LRESULT WndProc (HWND wnd, UINT msg, WPARAM w, LPARAM l) +{ + static short xChar, yChar; + HDC dc; + PAINTSTRUCT ps; + TEXTMETRIC tm; + + switch (msg){ + case WM_CREATE: + dc = GetDC (wnd); + GetTextMetrics (dc, &tm); + xChar = tm.tmAveCharWidth; + yChar = tm.tmHeight; + ReleaseDC (wnd, dc); + break; + + case WM_PAINT: + dc = BeginPaint (wnd, &ps); + Write (dc, xChar, yChar, "Hola"); + EndPaint (wnd, &ps); + break; + + case WM_DESTROY: + PostQuitMessage (0); + break; + + default: + return DefWindowProc (wnd, msg, w, l); + } + return 0l; +} + +LRESULT WndProc2 (HWND wnd, UINT msg, WPARAM w, LPARAM l) +{ + static short xChar, yChar; + char buf[128]; + HDC dc; + PAINTSTRUCT ps; + TEXTMETRIC tm; + + switch (msg){ + case WM_CREATE: + dc = GetDC (wnd); + GetTextMetrics (dc, &tm); + xChar = tm.tmAveCharWidth; + yChar = tm.tmHeight; + ReleaseDC (wnd, dc); + break; + + case WM_PAINT: + dc = BeginPaint (wnd, &ps); + sprintf(buf,"ps.rcPaint = {left = %d, top = %d, right = %d, bottom = %d}", + ps.rcPaint.left,ps.rcPaint.top,ps.rcPaint.right,ps.rcPaint.bottom); + Write (dc, xChar, yChar, buf); + EndPaint (wnd, &ps); + break; + + case WM_DESTROY: + PostQuitMessage (0); + break; + + default: + return DefWindowProc (wnd, msg, w, l); + } + return 0l; +} + +int PASCAL WinMain (HANDLE inst, HANDLE prev, LPSTR cmdline, int show) +{ + HWND wnd,wnd2; + MSG msg; + WNDCLASS class; + + if (!prev){ + class.style = CS_HREDRAW | CS_VREDRAW; + class.lpfnWndProc = WndProc; + class.cbClsExtra = 0; + class.cbWndExtra = 0; + class.hInstance = inst; + class.hIcon = LoadIcon (0, IDI_APPLICATION); + class.hCursor = LoadCursor (0, IDC_ARROW); + class.hbrBackground = GetStockObject (WHITE_BRUSH); + class.lpszMenuName = NULL; + class.lpszClassName = (SEGPTR)"class"; + if (!RegisterClass (&class)) + return FALSE; + } + + wnd = CreateWindow ("class", "Test app", WS_OVERLAPPEDWINDOW, + CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, 0, + 0, inst, 0); + + if (!prev){ + class.lpfnWndProc = WndProc2; + class.lpszClassName = (SEGPTR)"class2"; + if (!RegisterClass (&class)) + return FALSE; + } + + wnd2= CreateWindow ("class2","Test app", WS_BORDER | WS_CHILD, + 50, 50, 350, 50, wnd, 0, inst, 0); + + ShowWindow (wnd, show); + UpdateWindow (wnd); + ShowWindow (wnd2, show); + UpdateWindow (wnd2); + + while (GetMessage (&msg, 0, 0, 0)){ + TranslateMessage (&msg); + DispatchMessage (&msg); + } + return 0; +} diff --git a/libtest/new.c b/libtest/new.c new file mode 100644 index 00000000000..8dfabced7ff --- /dev/null +++ b/libtest/new.c @@ -0,0 +1,153 @@ +#include + +HANDLE ghInstance; + + +long FAR PASCAL WndProc (HWND, WORD, WPARAM, LPARAM); +long FAR PASCAL ChildProc(HWND, WORD, WPARAM, LPARAM); + +int PASCAL WinMain (HANDLE hInstance, HANDLE hPrevInstance, + LPSTR lpszCmdParam, int nCmdShow) + { + static char szAppName[] = "ClassLook" ; + HWND hwnd ; + MSG msg ; + WNDCLASS wndclass ; + + ghInstance = hInstance; + if (!hPrevInstance) + { + wndclass.style = CS_HREDRAW | CS_VREDRAW ; + wndclass.lpfnWndProc = WndProc ; + wndclass.cbClsExtra = 0 ; + wndclass.cbWndExtra = 0 ; + wndclass.hInstance = hInstance ; + wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; + wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; + wndclass.hbrBackground = GetStockObject (WHITE_BRUSH) ; + wndclass.lpszMenuName = NULL ; + wndclass.lpszClassName = szAppName ; + + RegisterClass (&wndclass) ; + } + + hwnd = CreateWindow (szAppName, /* window class name */ + "ClassLook", /* window caption */ + WS_OVERLAPPEDWINDOW, /* window style */ + CW_USEDEFAULT, /* initial x position */ + CW_USEDEFAULT, /* initial y position */ + 600, /* initial x size */ + 400, /* initial y size */ + NULL, /* parent window handle */ + NULL, /* window menu handle */ + hInstance, /* program instance handle */ + NULL) ; /* creation parameters */ + + ShowWindow (hwnd, nCmdShow) ; + UpdateWindow (hwnd) ; + + while (GetMessage (&msg, NULL, 0, 0)) + { + TranslateMessage (&msg) ; + DispatchMessage (&msg) ; + } + return msg.wParam ; + } + +long FAR PASCAL WndProc (HWND hwnd, WORD message, WPARAM wParam, LPARAM lParam) + { + HDC hdc ; + PAINTSTRUCT ps ; + RECT rect ; + WNDCLASS wndclass ; + + static HWND hChild; + + switch (message) + { + case WM_CREATE : + wndclass.style = CS_PARENTDC | CS_HREDRAW | CS_VREDRAW; + wndclass.lpfnWndProc = ChildProc ; + wndclass.cbClsExtra = 0 ; + wndclass.cbWndExtra = 0 ; + wndclass.hInstance = ghInstance ; + wndclass.hIcon = NULL ; + wndclass.hCursor = LoadCursor (NULL, IDC_CROSS) ; + wndclass.hbrBackground = GetStockObject (LTGRAY_BRUSH) ; + wndclass.lpszMenuName = NULL ; + wndclass.lpszClassName = "SecondClass" ; + + RegisterClass (&wndclass); + + hChild = CreateWindow("SecondClass","Child Window", + WS_CHILD | WS_VISIBLE | WS_BORDER, + 10, 10, 580, 380, hwnd, NULL, ghInstance, NULL); + ShowWindow(hChild, SW_SHOW); + case WM_PAINT : + hdc = BeginPaint (hwnd, &ps) ; + + GetClientRect (hwnd, &rect) ; + + DrawText (hdc, "Hello, Windows!", -1, &rect, + DT_SINGLELINE | DT_CENTER | DT_VCENTER) ; + + EndPaint (hwnd, &ps); + return 0 ; + + case WM_DESTROY : + PostQuitMessage (0) ; + return 0 ; + } + return DefWindowProc (hwnd, message, wParam, lParam) ; + } + +long FAR PASCAL ChildProc(HWND hwnd, WORD message, WPARAM wParam, LPARAM lParam) +{ + HDC hDC; + PAINTSTRUCT ps; + WNDCLASS wndClass; + char* classes[]={"EDIT","BUTTON","LISTBOX","STATIC","SCROLLBAR","COMBOBOX","COMBOLBOX", NULL}; + char** curr; + char buf[256]; + RECT rect ; + int i; + + switch (message) { + case WM_PAINT: + curr = classes; + i=0; + hDC = BeginPaint(hwnd, &ps); + SelectObject(hDC,GetStockObject(ANSI_FIXED_FONT)); + while (*curr) { + wsprintf(buf,"%12s:",*curr); + GetClassInfo(NULL, *curr, &wndClass); + if(wndClass.style&CS_VREDRAW) lstrcat(buf," | CS_VREDRAW"); + if(wndClass.style&CS_HREDRAW) lstrcat(buf," | CS_HREDRAW" ); + if(wndClass.style&CS_KEYCVTWINDOW) lstrcat(buf," | CS_KEYCVTWINDOW" ); + if(wndClass.style&CS_DBLCLKS) lstrcat(buf," | CS_DBLCLKS" ); + if(wndClass.style&CS_OWNDC) lstrcat(buf," | CS_OWNDC" ); + if(wndClass.style&CS_CLASSDC) lstrcat(buf," | CS_CLASSDC" ); + if(wndClass.style&CS_PARENTDC) lstrcat(buf," | CS_PARENTDC" ); + if(wndClass.style&CS_NOKEYCVT) lstrcat(buf," | CS_NOKEYCVT" ); + if(wndClass.style&CS_NOCLOSE) lstrcat(buf," | CS_NOCLOSE" ); + if(wndClass.style&CS_SAVEBITS) lstrcat(buf," | CS_SAVEBITS" ); + if(wndClass.style&CS_GLOBALCLASS) lstrcat(buf," | CS_GLOBALCLASS"); + GetClientRect (hwnd, &rect) ; + TextOut (hDC, 5,20+i,buf,lstrlen(buf)) ; + i += 15; + curr++; + } +/* EndPaint(hwnd, &ps); + break; + hDC = BeginPaint(hwnd, &ps); +*/ + MoveTo(hDC, 0, 0); + LineTo(hDC, 500, 500); + EndPaint(hwnd, &ps); + break; + default: + return DefWindowProc (hwnd, message, wParam, lParam) ; + } + return (0L); +} + diff --git a/loader/main.c b/loader/main.c index e1bcee8b72f..25c09905d52 100644 --- a/loader/main.c +++ b/loader/main.c @@ -76,6 +76,9 @@ int MAIN_Init(void) /* Initialize tasks */ if (!TASK_Init()) return 0; + /* Initialize communications */ + COMM_Init(); + #ifndef WINELIB /* Initialize interrupt vectors */ if (!INT_Init()) return 0; @@ -85,12 +88,7 @@ int MAIN_Init(void) /* Initialize signal handling */ init_wine_signals(); -#endif - /* Initialize communications */ - COMM_Init(); - -#ifndef WINELIB /* Initialize the DOS memory */ if (!INT21_Init()) return 0; diff --git a/loader/pe_image.c b/loader/pe_image.c index 3d749c11ce9..5abdeae350f 100644 --- a/loader/pe_image.c +++ b/loader/pe_image.c @@ -1,6 +1,7 @@ #ifndef WINELIB /* * Copyright 1994 Eric Youndale & Erik Bos + * Copyright 1995 Martin von Löwis * * based on Eric Youndale's pe-test and: * @@ -118,9 +119,15 @@ DWORD PE_FindExportedFunction(struct w_files* wpnt, char* funcName) name = (u_char **) (((char *) load_addr) + (int) exports->AddressOfNames); for(i=0; iNumber_Of_Functions; i++) { - ename = (char *) (((char *) load_addr) + (int) *name); - if(strcmp(ename,funcName)==0) - return load_addr+*function; + if(HIWORD(funcName)) + { + ename = (char *) (((char *) load_addr) + (int) *name); + if(strcmp(ename,funcName)==0) + return load_addr+*function; + }else{ + if(funcName == (int)*ordinal + exports->Base) + return load_addr+*function; + } function++; ordinal++; name++; @@ -134,6 +141,13 @@ DWORD PE_GetProcAddress(HMODULE hModule, char* function) for(wpnt=wine_files;wpnt;wpnt=wpnt->next) if(wpnt->hModule==hModule) break; if(!wpnt)return 0; + if(wpnt->builtin) + { + if(HIWORD(function)) + return RELAY32_GetEntryPoint(wpnt->builtin,function,0); + else + return RELAY32_GetEntryPoint(wpnt->builtin,0,(int)function); + } return PE_FindExportedFunction(wpnt,function); } @@ -179,16 +193,9 @@ void fixup_imports(struct w_files* wpnt) char * Module; struct pe_import_name * pe_name; unsigned int * import_list, *thunk_list; -#if 0 - char * c; -#endif Module = ((char *) load_addr) + pe_imp->ModuleName; dprintf_win32(stddeb, "%s\n", Module); -#if 0 - c = strchr(Module, '.'); - if (c) *c = 0; -#endif if(pe_imp->Import_List != 0) { /* original microsoft style */ dprintf_win32(stddeb, "Microsoft style imports used\n"); @@ -198,28 +205,29 @@ void fixup_imports(struct w_files* wpnt) (((unsigned int) load_addr) + pe_imp->Thunk_List); - while(*import_list) + while(*import_list) { pe_name = (struct pe_import_name *) ((int) load_addr + *import_list); - if((unsigned)pe_name & 0x80000000) + if((unsigned)*import_list & 0x80000000) { - fprintf(stderr,"Import by ordinal not supported\n"); - exit(0); - } + int ordinal=*import_list & (0x80000000-1); + dprintf_win32(stddeb,"--- Ordinal %s,%d\n", Module, ordinal); + *thunk_list = WIN32_GetProcAddress(MODULE_FindModule(Module), + ordinal); + }else{ /* import by name */ dprintf_win32(stddeb, "--- %s %s.%d\n", pe_name->Name, Module, pe_name->Hint); #ifndef WINELIB /* FIXME: JBP: Should this happen in libwine.a? */ - /* FIXME: Both calls should be unified into GetProcAddress */ - *thunk_list=(unsigned int)RELAY32_GetEntryPoint(Module,pe_name->Name,pe_name->Hint); - if(*thunk_list == 0) *thunk_list = WIN32_GetProcAddress(MODULE_FindModule(Module), pe_name->Name); #else fprintf(stderr,"JBP: Call to RELAY32_GetEntryPoint being ignored.\n"); #endif + } if(!*thunk_list) { - fprintf(stderr,"No implementation for %s.%d\n",Module, pe_name->Hint); + fprintf(stderr,"No implementation for %s.%d(%s)\n",Module, + pe_name->Hint, pe_name->Name); fixup_failed=1; } @@ -239,8 +247,10 @@ void fixup_imports(struct w_files* wpnt) dprintf_win32(stddeb, "--- %s %s.%d\n", pe_name->Name, Module, pe_name->Hint); #ifndef WINELIB /* FIXME: JBP: Should this happen in libwine.a? */ /* FIXME: Both calls should be unified into GetProcAddress */ +#if 0 *thunk_list=(unsigned int)RELAY32_GetEntryPoint(Module,pe_name->Name,pe_name->Hint); if(*thunk_list == 0) +#endif *thunk_list = WIN32_GetProcAddress(MODULE_FindModule(Module), pe_name->Name); #else @@ -454,8 +464,8 @@ static HINSTANCE PE_LoadImage( int fd, struct w_files *wpnt ) if(wpnt->pe->pe_export && wpnt->pe->pe_export!=load_addr+dir.Virtual_address) fprintf(stderr,"wrong export directory??\n"); - else - wpnt->pe->pe_export = load_addr+dir.Virtual_address; + /* always trust the directory */ + wpnt->pe->pe_export = load_addr+dir.Virtual_address; } dir=wpnt->pe->pe_header->opt_coff.DataDirectory[IMAGE_FILE_IMPORT_DIRECTORY]; @@ -463,9 +473,8 @@ static HINSTANCE PE_LoadImage( int fd, struct w_files *wpnt ) { if(wpnt->pe->pe_import && wpnt->pe->pe_import!=load_addr+dir.Virtual_address) - fprintf(stderr,"wrong export directory??\n"); - else - wpnt->pe->pe_import = load_addr+dir.Virtual_address; + fprintf(stderr,"wrong import directory??\n"); + wpnt->pe->pe_import = load_addr+dir.Virtual_address; } dir=wpnt->pe->pe_header->opt_coff.DataDirectory[IMAGE_FILE_RESOURCE_DIRECTORY]; @@ -474,8 +483,7 @@ static HINSTANCE PE_LoadImage( int fd, struct w_files *wpnt ) if(wpnt->pe->pe_resource && wpnt->pe->pe_resource!=load_addr+dir.Virtual_address) fprintf(stderr,"wrong resource directory??\n"); - else - wpnt->pe->pe_resource = load_addr+dir.Virtual_address; + wpnt->pe->pe_resource = load_addr+dir.Virtual_address; } dir=wpnt->pe->pe_header->opt_coff.DataDirectory[IMAGE_FILE_BASE_RELOCATION_TABLE]; @@ -483,9 +491,8 @@ static HINSTANCE PE_LoadImage( int fd, struct w_files *wpnt ) { if(wpnt->pe->pe_reloc && wpnt->pe->pe_reloc!=load_addr+dir.Virtual_address) - fprintf(stderr,"wrong export directory??\n"); - else - wpnt->pe->pe_reloc = load_addr+dir.Virtual_address; + fprintf(stderr,"wrong relocation list??\n"); + wpnt->pe->pe_reloc = load_addr+dir.Virtual_address; } if(wpnt->pe->pe_header->opt_coff.DataDirectory @@ -549,6 +556,7 @@ HINSTANCE PE_LoadModule(int fd, OFSTRUCT *ofs, LOADPARAMS* params) wpnt->hinstance=0; wpnt->hModule=0; wpnt->initialised=0; + wpnt->builtin=0; lseek(fd,0,SEEK_SET); wpnt->mz_header=xmalloc(sizeof(struct mz_header_s)); read(fd,wpnt->mz_header,sizeof(struct mz_header_s)); diff --git a/memory/ldt.c b/memory/ldt.c index bc1c96facae..86ab2ef8ade 100644 --- a/memory/ldt.c +++ b/memory/ldt.c @@ -125,6 +125,7 @@ int LDT_SetEntry( int entry, const ldt_entry *content ) { struct modify_ldt_ldt_s ldt_info; + /* Clear all unused bits (like seg_not_present) */ memset( &ldt_info, 0, sizeof(ldt_info) ); ldt_info.entry_number = entry; ldt_info.base_addr = content->base; diff --git a/memory/local.c b/memory/local.c index d1235a3087f..e1134963737 100644 --- a/memory/local.c +++ b/memory/local.c @@ -681,6 +681,7 @@ HLOCAL LOCAL_Free( HANDLE ds, HLOCAL handle ) dprintf_local( stddeb, "LocalFree: %04x ds=%04x\n", handle, ds ); + if (!handle) { fprintf( stderr, "LOCAL_Free: handle is 0.\n" ); return 0; } if (HANDLE_FIXED( handle )) { arena = ARENA_HEADER( handle ); } else { diff --git a/memory/selector.c b/memory/selector.c index bbf2e441349..20c7bd15815 100644 --- a/memory/selector.c +++ b/memory/selector.c @@ -308,7 +308,10 @@ WORD SelectorAccessRights( WORD sel, WORD op, WORD val ) LDT_GetEntry( SELECTOR_TO_ENTRY(sel), &entry ); if (op == 0) /* get */ { - return 1 /* accessed */ | + return 0x01 | /* accessed */ + 0x10 | /* not system */ + 0x60 | /* DPL 3 */ + 0x80 | /* present */ ((entry.read_only == 0) << 1) | (entry.type << 2) | (entry.seg_32bit << 14) | @@ -453,7 +456,7 @@ SEGPTR MAKE_SEGPTR(void * ptr) if (!ptr) return ptr; if (!((unsigned)ptr & 0xffff0000)) { - fprintf(stderr, "Invalid pointer %08x has been passed to MAKE_SEGPTR. This was\n", ptr); + fprintf(stderr, "Invalid pointer %p has been passed to MAKE_SEGPTR. This was\n", ptr); fprintf(stderr, "probably caused by an unnecessary call to PTR_SEG_TO_LIN.\n"); fprintf(stderr, "Forcing call to debugger\n"); ptr = *(void **)0; diff --git a/misc/clipboard.c b/misc/clipboard.c index 41bab8230be..847e8918a79 100644 --- a/misc/clipboard.c +++ b/misc/clipboard.c @@ -187,7 +187,7 @@ INT CountClipboardFormats() /************************************************************************** * EnumClipboardFormats [USER.144] */ -WORD EnumClipboardFormats(WORD wFormat) +UINT EnumClipboardFormats(UINT wFormat) { LPCLIPFORMAT lpFormat = ClipFormats; dprintf_clipboard(stddeb,"EnumClipboardFormats(%04X) !\n", wFormat); diff --git a/misc/commdlg.c b/misc/commdlg.c index 8991597f014..90c37055806 100644 --- a/misc/commdlg.c +++ b/misc/commdlg.c @@ -17,6 +17,8 @@ #include "dos_fs.h" #include "drive.h" #include "stackframe.h" +#include "stddebug.h" +#include "debug.h" static DWORD CommDlgLastError = 0; @@ -90,7 +92,7 @@ BOOL GetOpenFileName(LPOPENFILENAME lpofn) else SYSRES_FreeResource( hDlgTmpl ); } - printf("GetOpenFileName // return lpstrFile='%s' !\n", + dprintf_commdlg(stddeb,"GetOpenFileName // return lpstrFile='%s' !\n", (LPSTR)PTR_SEG_TO_LIN(lpofn->lpstrFile)); return bRet; } @@ -131,7 +133,7 @@ BOOL GetSaveFileName(LPOPENFILENAME lpofn) else SYSRES_FreeResource( hDlgTmpl ); } - printf( "GetSaveFileName // return lpstrFile='%s' !\n", + dprintf_commdlg(stddeb, "GetSaveFileName // return lpstrFile='%s' !\n", (LPSTR)PTR_SEG_TO_LIN(lpofn->lpstrFile)); return bRet; } @@ -253,14 +255,14 @@ static LONG FILEDLG_WMDrawItem(HWND hWnd, WPARAM wParam, LPARAM lParam) FillRect(lpdis->hDC, &lpdis->rcItem, hBrush); SendMessage(lpdis->hwndItem, CB_GETLBTEXT, lpdis->itemID, (LPARAM)MAKE_SEGPTR(str)); - switch(str[2]) { - case 'a': case 'b': - hBitmap = hFloppy; - break; - default: - hBitmap = hHDisk; - break; - } + switch(DRIVE_GetType( str[2] - 'a' )) + { + case TYPE_FLOPPY: hBitmap = hFloppy; break; + case TYPE_CDROM: hBitmap = hCDRom; break; + case TYPE_HD: + case TYPE_NETWORK: + default: hBitmap = hHDisk; break; + } GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&bm); TextOut(lpdis->hDC, lpdis->rcItem.left + bm.bmWidth, lpdis->rcItem.top, str, strlen(str)); @@ -299,6 +301,7 @@ static LONG FILEDLG_WMMeasureItem(HWND hWnd, WPARAM wParam, LPARAM lParam) static LONG FILEDLG_WMInitDialog(HWND hWnd, WPARAM wParam, LPARAM lParam) { int n; + int i; LPOPENFILENAME lpofn; char tmpstr[512]; LPSTR pstr; @@ -308,16 +311,17 @@ static LONG FILEDLG_WMInitDialog(HWND hWnd, WPARAM wParam, LPARAM lParam) if (lpofn->lpstrCustomFilter) { pstr = (LPSTR)PTR_SEG_TO_LIN(lpofn->lpstrCustomFilter); - printf("lpstrCustomFilter = %p\n", pstr); + dprintf_commdlg(stddeb,"lpstrCustomFilter = %p\n", pstr); while(*pstr) { n = strlen(pstr); strncpy(tmpstr, pstr, 511); tmpstr[511]=0; - printf("lpstrCustomFilter // add tmpstr='%s' ", tmpstr); - SendDlgItemMessage(hWnd, cmb1, CB_ADDSTRING, 0, (LPARAM)MAKE_SEGPTR(tmpstr)); + dprintf_commdlg(stddeb,"lpstrCustomFilter // add tmpstr='%s' ", tmpstr); + i = SendDlgItemMessage(hWnd, cmb1, CB_ADDSTRING, 0, (LPARAM)MAKE_SEGPTR(tmpstr)); pstr += n + 1; n = strlen(pstr); - printf("associated to '%s'\n", pstr); + dprintf_commdlg(stddeb,"associated to '%s'\n", pstr); + SendDlgItemMessage(hWnd, cmb1, CB_SETITEMDATA, i, (LPARAM)pstr); pstr += n + 1; } } @@ -327,11 +331,12 @@ static LONG FILEDLG_WMInitDialog(HWND hWnd, WPARAM wParam, LPARAM lParam) { n = strlen(pstr); strncpy(tmpstr, pstr, 511); tmpstr[511]=0; - printf("lpstrFilter // add tmpstr='%s' ", tmpstr); - SendDlgItemMessage(hWnd, cmb1, CB_ADDSTRING, 0, (LPARAM)MAKE_SEGPTR(tmpstr)); + dprintf_commdlg(stddeb,"lpstrFilter // add tmpstr='%s' ", tmpstr); + i = SendDlgItemMessage(hWnd, cmb1, CB_ADDSTRING, 0, (LPARAM)MAKE_SEGPTR(tmpstr)); pstr += n + 1; n = strlen(pstr); - printf("associated to '%s'\n", pstr); + dprintf_commdlg(stddeb,"associated to '%s'\n", pstr); + SendDlgItemMessage(hWnd, cmb1, CB_SETITEMDATA, i, (LPARAM)pstr); pstr += n + 1; } /* set default filter */ @@ -341,7 +346,7 @@ static LONG FILEDLG_WMInitDialog(HWND hWnd, WPARAM wParam, LPARAM lParam) strncpy(tmpstr, FILEDLG_GetFileType(PTR_SEG_TO_LIN(lpofn->lpstrCustomFilter), PTR_SEG_TO_LIN(lpofn->lpstrFilter), lpofn->nFilterIndex - 1),511); tmpstr[511]=0; - printf("nFilterIndex = %ld // SetText of edt1 to '%s'\n", + dprintf_commdlg(stddeb,"nFilterIndex = %ld // SetText of edt1 to '%s'\n", lpofn->nFilterIndex, tmpstr); SendDlgItemMessage(hWnd, edt1, WM_SETTEXT, 0, (LPARAM)MAKE_SEGPTR(tmpstr)); /* get drive list */ @@ -437,9 +442,8 @@ static LRESULT FILEDLG_WMCommand(HWND hWnd, WPARAM wParam, LPARAM lParam) lRet = SendDlgItemMessage(hWnd, cmb1, CB_GETCURSEL, 0, 0); if (lRet == LB_ERR) return TRUE; - pstr = FILEDLG_GetFileType(PTR_SEG_TO_LIN(lpofn->lpstrCustomFilter), - PTR_SEG_TO_LIN(lpofn->lpstrFilter), - lRet); + pstr = (LPSTR)SendDlgItemMessage(hWnd, cmb1, CB_GETITEMDATA, lRet, 0); + dprintf_commdlg(stddeb,"Selected filter : %s\n", pstr); strncpy(tmpstr2, pstr, 511); tmpstr2[511]=0; SendDlgItemMessage(hWnd, edt1, WM_SETTEXT, 0, (LPARAM)MAKE_SEGPTR(tmpstr2)); FILEDLG_ScanDir(hWnd, tmpstr); @@ -467,7 +471,7 @@ static LRESULT FILEDLG_WMCommand(HWND hWnd, WPARAM wParam, LPARAM lParam) strcpy(tmpstr2, tmpstr); *tmpstr=0; } - printf("commdlg: %s, %s\n", tmpstr, tmpstr2); + dprintf_commdlg(stddeb,"commdlg: %s, %s\n", tmpstr, tmpstr2); SendDlgItemMessage(hWnd, edt1, WM_SETTEXT, 0, (LPARAM)MAKE_SEGPTR(tmpstr2)); FILEDLG_ScanDir(hWnd, tmpstr); return TRUE; @@ -480,7 +484,7 @@ static LRESULT FILEDLG_WMCommand(HWND hWnd, WPARAM wParam, LPARAM lParam) lRet = SendDlgItemMessage(hWnd, cmb1, CB_GETCURSEL, 0, 0); if (lRet == LB_ERR) return TRUE; lpofn->nFilterIndex = lRet + 1; - printf("commdlg: lpofn->nFilterIndex=%ld\n", lpofn->nFilterIndex); + dprintf_commdlg(stddeb,"commdlg: lpofn->nFilterIndex=%ld\n", lpofn->nFilterIndex); strncpy(tmpstr2, FILEDLG_GetFileType(PTR_SEG_TO_LIN(lpofn->lpstrCustomFilter), PTR_SEG_TO_LIN(lpofn->lpstrFilter), @@ -528,7 +532,7 @@ static LRESULT FILEDLG_WMCommand(HWND hWnd, WPARAM wParam, LPARAM lParam) lRet = SendDlgItemMessage(hWnd, lst1, LB_GETCURSEL, 0, 0); SendDlgItemMessage(hWnd, lst1, LB_GETTEXT, lRet, (LPARAM)MAKE_SEGPTR(tmpstr)); - printf("strcpy'ing '%s'\n",tmpstr); fflush(stdout); + dprintf_commdlg(stddeb,"strcpy'ing '%s'\n",tmpstr); fflush(stdout); strcpy(PTR_SEG_TO_LIN(lpofn->lpstrFileTitle), tmpstr); } EndDialog(hWnd, TRUE); @@ -639,7 +643,7 @@ LRESULT ColorDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam) switch (wMsg) { case WM_INITDIALOG: - printf("ColorDlgProc // WM_INITDIALOG lParam=%08lX\n", lParam); + dprintf_commdlg(stddeb,"ColorDlgProc // WM_INITDIALOG lParam=%08lX\n", lParam); ShowWindow(hWnd, SW_SHOWNORMAL); return (TRUE); case WM_COMMAND: @@ -702,7 +706,7 @@ LRESULT FindTextDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam) switch (wMsg) { case WM_INITDIALOG: - printf("FindTextDlgProc // WM_INITDIALOG lParam=%08lX\n", lParam); + dprintf_commdlg(stddeb,"FindTextDlgProc // WM_INITDIALOG lParam=%08lX\n", lParam); ShowWindow(hWnd, SW_SHOWNORMAL); return (TRUE); case WM_COMMAND: @@ -729,7 +733,7 @@ LRESULT ReplaceTextDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam) switch (wMsg) { case WM_INITDIALOG: - printf("ReplaceTextDlgProc // WM_INITDIALOG lParam=%08lX\n", lParam); + dprintf_commdlg(stddeb,"ReplaceTextDlgProc // WM_INITDIALOG lParam=%08lX\n", lParam); ShowWindow(hWnd, SW_SHOWNORMAL); return (TRUE); case WM_COMMAND: @@ -756,7 +760,7 @@ BOOL PrintDlg(LPPRINTDLG lpPrint) HANDLE hInst, hDlgTmpl; BOOL bRet; - printf("PrintDlg(%p) // Flags=%08lX\n", lpPrint, lpPrint->Flags ); + dprintf_commdlg(stddeb,"PrintDlg(%p) // Flags=%08lX\n", lpPrint, lpPrint->Flags ); if (lpPrint->Flags & PD_RETURNDEFAULT) /* FIXME: should fill lpPrint->hDevMode and lpPrint->hDevNames here */ @@ -786,7 +790,7 @@ LRESULT PrintDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam) switch (wMsg) { case WM_INITDIALOG: - printf("PrintDlgProc // WM_INITDIALOG lParam=%08lX\n", lParam); + dprintf_commdlg(stddeb,"PrintDlgProc // WM_INITDIALOG lParam=%08lX\n", lParam); ShowWindow(hWnd, SW_SHOWNORMAL); return (TRUE); case WM_COMMAND: @@ -813,7 +817,7 @@ LRESULT PrintSetupDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam) switch (wMsg) { case WM_INITDIALOG: - printf("PrintSetupDlgProc // WM_INITDIALOG lParam=%08lX\n", lParam); + dprintf_commdlg(stddeb,"PrintSetupDlgProc // WM_INITDIALOG lParam=%08lX\n", lParam); ShowWindow(hWnd, SW_SHOWNORMAL); return (TRUE); case WM_COMMAND: @@ -846,7 +850,7 @@ DWORD CommDlgExtendedError(void) short GetFileTitle(LPCSTR lpFile, LPSTR lpTitle, UINT cbBuf) { int i, len; - printf("GetFileTitle(%p %p %d); \n", lpFile, lpTitle, cbBuf); + dprintf_commdlg(stddeb,"GetFileTitle(%p %p %d); \n", lpFile, lpTitle, cbBuf); if (lpFile == NULL || lpTitle == NULL) return -1; len = strlen(lpFile); @@ -863,7 +867,7 @@ short GetFileTitle(LPCSTR lpFile, LPSTR lpTitle, UINT cbBuf) i++; break; } - printf("\n---> '%s' ", &lpFile[i]); + dprintf_commdlg(stddeb,"\n---> '%s' ", &lpFile[i]); len = strlen(lpFile+i)+1; if (cbBuf < len) diff --git a/misc/escape.c b/misc/escape.c index b848f3a9621..f86def0bd3c 100644 --- a/misc/escape.c +++ b/misc/escape.c @@ -10,8 +10,8 @@ static char Copyright[] = "Copyright Bob Amstadt, 1994"; #include #include "windows.h" -int Escape(HDC hdc, int nEscape, int cbInput, - LPSTR lpszInData, LPSTR lpvOutData) +INT Escape(HDC hdc, INT nEscape, INT cbInput, + LPCSTR lpszInData, LPVOID lpvOutData) { fprintf(stderr, "Escape(nEscape = %04x)\n", nEscape); return 0; diff --git a/misc/exec.c b/misc/exec.c index 5c494870b5d..6cc85b3ae6e 100644 --- a/misc/exec.c +++ b/misc/exec.c @@ -72,6 +72,8 @@ BOOL WinHelp(HWND hWnd, LPSTR lpHelpFile, WORD wCommand, DWORD dwData) strcat(str, lpHelpFile); dprintf_exec(stddeb,"'%s'\n", str); break; + case HELP_QUIT: + return TRUE; default: return FALSE; } diff --git a/misc/main.c b/misc/main.c index b445865ce76..762274ec474 100644 --- a/misc/main.c +++ b/misc/main.c @@ -55,6 +55,7 @@ static const char *langNames[] = "Fr", /* LANG_Fr */ "Fi", /* LANG_Fi */ "Da", /* LANG_Da */ + "Cz", /* LANG_Cz */ NULL }; @@ -132,7 +133,7 @@ static XrmOptionDescRec optionsTable[] = " -iconic Start as an icon\n" \ " -ipc Enable IPC facilities\n" \ " -debug Enter debugger before starting application\n" \ - " -language xx Set the language (one of En,Es,De,No,Fr,Fi,Da)\n" \ + " -language xx Set the language (one of En,Es,De,No,Fr,Fi,Da,Cz)\n" \ " -managed Allow the window manager to manage created windows\n" \ " -name name Set the application name\n" \ " -privatemap Use a private color map\n" \ diff --git a/misc/ole2nls.c b/misc/ole2nls.c index 8100e5efac1..500a3f2c97c 100644 --- a/misc/ole2nls.c +++ b/misc/ole2nls.c @@ -30,6 +30,7 @@ DWORD WINAPI GetUserDefaultLCID() case LANG_Fr: case LANG_Fi: case LANG_Da: + case LANG_Cz: default: return 0; /* Neutral language */ } diff --git a/misc/rect.c b/misc/rect.c index 0ae8b0cc5f4..3d2bc8c51bc 100644 --- a/misc/rect.c +++ b/misc/rect.c @@ -135,7 +135,7 @@ BOOL UnionRect( LPRECT dest, LPRECT src1, LPRECT src2 ) /*********************************************************************** * EqualRect (USER.244) */ -BOOL EqualRect( LPRECT rect1, LPRECT rect2 ) +BOOL EqualRect( const RECT* rect1, const RECT* rect2 ) { return ((rect1->left == rect2->left) && (rect1->right == rect2->right) && (rect1->top == rect2->top) && (rect1->bottom == rect2->bottom)); diff --git a/misc/shell.c b/misc/shell.c index 802ee7bf406..8e4b9f7e187 100644 --- a/misc/shell.c +++ b/misc/shell.c @@ -696,7 +696,8 @@ INT ShellAbout(HWND hWnd, LPCSTR szApp, LPCSTR szOtherStuff, HICON hIcon) { WineProc=(DWORD)AboutDlgProc; Win16Proc=(DWORD)GetWndProcEntry16("AboutDlgProc"); - Win32Proc=(DWORD)RELAY32_GetEntryPoint("WINPROCS32","AboutDlgProc",0); + Win32Proc=(DWORD)RELAY32_GetEntryPoint(RELAY32_GetBuiltinDLL("WINPROCS32"), + "AboutDlgProc",0); ALIAS_RegisterAlias(WineProc,Win16Proc,Win32Proc); initialized=1; } @@ -752,7 +753,7 @@ HICON ExtractAssociatedIcon(HINSTANCE hInst,LPSTR lpIconPath, LPWORD lpiIcon) */ DWORD DoEnvironmentSubst(LPSTR str,WORD len) { - dprintf_reg(stdnimp, "DoEnvironmentSubst(%s,%x): Empyt Stub !!!\n",str,len); + dprintf_reg(stdnimp, "DoEnvironmentSubst(%s,%x): Empty Stub !!!\n",str,len); return 0; } diff --git a/misc/toolhelp.c b/misc/toolhelp.c index ccde79a8f02..cd34e208911 100644 --- a/misc/toolhelp.c +++ b/misc/toolhelp.c @@ -64,7 +64,7 @@ NotifyUnregister(HTASK htask) if (i==-1) return FALSE; memcpy(notifys+i,notifys+(i+1),sizeof(struct notify)*(nrofnotifys-i-1)); - notifys=(struct notify*)realloc(notifys,(nrofnotifys-1)*sizeof(struct notify)); + notifys=(struct notify*)xrealloc(notifys,(nrofnotifys-1)*sizeof(struct notify)); nrofnotifys--; return TRUE; } diff --git a/misc/xmalloc.c b/misc/xmalloc.c index 58b9681359d..d79bd20c081 100644 --- a/misc/xmalloc.c +++ b/misc/xmalloc.c @@ -5,8 +5,8 @@ the return value yourself, for instance because you don't have a good way to handle a zero return value. - Typically, Wine's own memory requests should be handles by this function, - while the client's should use malloc directly (and Wine should return an + Typically, Wine's own memory requests should be handled by this function, + while the clients should use malloc directly (and Wine should return an error to the client if allocation fails). Copyright 1995 by Morten Welinder. diff --git a/miscemu/dosmem.c b/miscemu/dosmem.c index 4568eb8ecd0..92b0cdc1763 100644 --- a/miscemu/dosmem.c +++ b/miscemu/dosmem.c @@ -136,7 +136,7 @@ BOOL DOSMEM_Init(void) * * Increment the BIOS tick counter. */ -static void DOSMEM_Alarm(void) +void DOSMEM_Alarm(void) { pBiosData->Ticks = INT1A_GetTicksSinceMidnight(); printf( "Ticks = %ld\n", pBiosData->Ticks ); diff --git a/miscemu/dpmi.c b/miscemu/dpmi.c index 2b3c0f862db..2f9319d1bce 100644 --- a/miscemu/dpmi.c +++ b/miscemu/dpmi.c @@ -290,11 +290,23 @@ void INT_Int31Handler( struct sigcontext_struct context ) case 0x0601: /* Unlock linear region */ break; /* Just ignore it */ + case 0x0602: /* Unlock real-mode region */ + break; /* Just ignore it */ + + case 0x0603: /* Lock real-mode region */ + break; /* Just ignore it */ + case 0x0604: /* Get page size */ BX_reg(&context) = 0; CX_reg(&context) = 4096; break; + case 0x0702: /* Mark page as demand-paging candidate */ + break; /* Just ignore it */ + + case 0x0703: /* Discard page contents */ + break; /* Just ignore it */ + default: INT_BARF( &context, 0x31 ); AX_reg(&context) = 0x8001; /* unsupported function */ diff --git a/miscemu/instr.c b/miscemu/instr.c index 14ac461321e..1e54951d79d 100644 --- a/miscemu/instr.c +++ b/miscemu/instr.c @@ -30,6 +30,7 @@ static WORD INSTR_ReplaceSelector( struct sigcontext_struct *context, WORD sel) { fprintf( stderr, "Direct access to segment 0x40 (cs:ip=%04x:%04lx).\n", CS_reg(context), EIP_reg(context) ); + DOSMEM_Alarm(); /* Increment BIOS clock */ return DOSMEM_BiosSeg; } return 0; /* Can't replace selector */ diff --git a/miscemu/int21.c b/miscemu/int21.c index a7d9ec09b97..f406ef790a9 100644 --- a/miscemu/int21.c +++ b/miscemu/int21.c @@ -560,8 +560,8 @@ static int INT21_FindFirst(struct sigcontext_struct *context) return 0; } memcpy( dta->mask, mask, sizeof(dta->mask) ); - dta->drive = (path[1] == ':') ? toupper(path[0]) - 'A' - : DRIVE_GetCurrentDrive(); + dta->drive = (path[0] && (path[1] == ':')) ? toupper(path[0]) - 'A' + : DRIVE_GetCurrentDrive(); dta->count = 0; dta->search_attr = CL_reg(context); return 1; @@ -694,86 +694,76 @@ static int INT21_SetDiskSerialNumber(struct sigcontext_struct *context) } -static void DumpFCB(BYTE *fcb) -{ - int x, y; - - fcb -= 7; - - for (y = 0; y !=2 ; y++) { - for (x = 0; x!=15;x++) - dprintf_int(stddeb, "%02x ", *fcb++); - dprintf_int(stddeb,"\n"); - } -} - /* microsoft's programmers should be shot for using CP/M style int21 calls in Windows for Workgroup's winfile.exe */ -static void FindFirstFCB(struct sigcontext_struct *context) +static int INT21_FindFirstFCB( struct sigcontext_struct *context ) { - BYTE *fcb = PTR_SEG_OFF_TO_LIN(DS_reg(context), DX_reg(context)); - struct fcb *standard_fcb; - struct fcb *output_fcb; - int drive; - char path[12]; + BYTE *fcb = (BYTE *)PTR_SEG_OFF_TO_LIN(DS_reg(context), DX_reg(context)); + FINDFILE_FCB *pFCB; + BYTE attr; + char buffer[] = "A:."; + const char *unixPath; - BYTE *dta = GetCurrentDTA(); + if (*fcb == 0xff) + { + attr = fcb[6]; + pFCB = (FINDFILE_FCB *)(fcb + 7); + } + else + { + attr = 0; + pFCB = (FINDFILE_FCB *)fcb; + } - DumpFCB( fcb ); - - if ((*fcb) == 0xff) - { - standard_fcb = (struct fcb *)(fcb + 7); - output_fcb = (struct fcb *)(dta + 7); - *dta = 0xff; - } - else - { - standard_fcb = (struct fcb *)fcb; - output_fcb = (struct fcb *)dta; - } + buffer[0] += DOS_GET_DRIVE( pFCB->drive ); + pFCB->unixPath = NULL; + if (!(unixPath = DOSFS_GetUnixFileName( buffer, TRUE ))) return 0; + pFCB->unixPath = xstrdup( unixPath ); + pFCB->count = 0; + return 1; +} - if (standard_fcb->drive) - { - drive = standard_fcb->drive - 1; - if (!DRIVE_IsValid(drive)) - { - DOS_ERROR(ER_InvalidDrive, EC_MediaError, SA_Abort, EL_Disk); - AX_reg(context) = 0xff; - return; - } - } - else - drive = DRIVE_GetCurrentDrive(); - output_fcb->drive = drive; +static int INT21_FindNextFCB( struct sigcontext_struct *context ) +{ + BYTE *fcb = (BYTE *)PTR_SEG_OFF_TO_LIN(DS_reg(context), DX_reg(context)); + FINDFILE_FCB *pFCB; + DOS_DIRENTRY_LAYOUT *pResult = (DOS_DIRENTRY_LAYOUT *)GetCurrentDTA(); + DOS_DIRENT entry; + BYTE attr; + int count; - if (*(fcb) == 0xff) - { - if (*(fcb+6) & FA_LABEL) /* return volume label */ - { - *(dta+6) = FA_LABEL; - memset(&output_fcb->name, ' ', 11); - memcpy(output_fcb->name, DRIVE_GetLabel(drive), 11); - AX_reg(context) = 0x00; - return; - } - } + if (*fcb == 0xff) + { + attr = fcb[6]; + pFCB = (FINDFILE_FCB *)(fcb + 7); + } + else + { + attr = 0; + pFCB = (FINDFILE_FCB *)fcb; + } - strncpy(output_fcb->name, standard_fcb->name, 11); - if (*fcb == 0xff) - *(dta+6) = ( *(fcb+6) & (!FA_DIRECTORY)); + if (!pFCB->unixPath) return 0; + if (!(count = DOSFS_FindNext( pFCB->unixPath, pFCB->filename, + DOS_GET_DRIVE( pFCB->drive ), attr, + pFCB->count, &entry ))) + { + free( pFCB->unixPath ); + pFCB->unixPath = NULL; + return 0; + } + pFCB->count += count; -#if 0 - sprintf(path,"%c:*.*",drive+'A'); - if ((output_fcb->directory = DOS_opendir(path))==NULL) - { - Error (PathNotFound, EC_MediaError, EL_Disk); - AX_reg(context) = 0xff; - return; - } -#endif + memcpy( pResult->filename, entry.name, sizeof(pResult->filename) ); + pResult->fileattr = entry.attr; + memset( pResult->reserved, 0, sizeof(pResult->reserved) ); + pResult->filetime = entry.time; + pResult->filedate = entry.date; + pResult->cluster = 0; /* what else? */ + pResult->filesize = entry.size; + return 1; } @@ -975,7 +965,6 @@ void DOS3Call( struct sigcontext_struct context ) case 0x0c: /* FLUSH BUFFER AND READ STANDARD INPUT */ case 0x0f: /* OPEN FILE USING FCB */ case 0x10: /* CLOSE FILE USING FCB */ - case 0x12: /* FIND NEXT MATCHING FILE USING FCB */ case 0x14: /* SEQUENTIAL READ FROM FCB FILE */ case 0x15: /* SEQUENTIAL WRITE TO FCB FILE */ case 0x16: /* CREATE OR TRUNCATE FILE USING FCB */ @@ -1017,7 +1006,15 @@ void DOS3Call( struct sigcontext_struct context ) break; case 0x11: /* FIND FIRST MATCHING FILE USING FCB */ - FindFirstFCB(&context); + if (!INT21_FindFirstFCB(&context)) + { + AL_reg(&context) = 0xff; + break; + } + /* else fall through */ + + case 0x12: /* FIND NEXT MATCHING FILE USING FCB */ + AL_reg(&context) = INT21_FindNextFCB(&context) ? 0x00 : 0xff; break; case 0x13: /* DELETE FILE USING FCB */ @@ -1200,8 +1197,8 @@ void DOS3Call( struct sigcontext_struct context ) case 0x3f: /* "READ" - READ FROM FILE OR DEVICE */ { LONG result = _hread( BX_reg(&context), - PTR_SEG_OFF_TO_LIN( DS_reg(&context), - DX_reg(&context) ), + (SEGPTR)MAKELONG( DX_reg(&context), + DS_reg(&context) ), CX_reg(&context) ); if (result == -1) { @@ -1569,7 +1566,7 @@ void DOS3Call( struct sigcontext_struct context ) case 0x68: /* "FFLUSH" - COMMIT FILE */ case 0x6a: /* COMMIT FILE */ - if (fsync( FILE_GetUnixHandle( BX_reg(&context) )) == -1) + if (fsync( FILE_GetUnixTaskHandle( BX_reg(&context) )) == -1) { FILE_SetDosError(); AX_reg(&context) = DOS_ExtendedError; diff --git a/miscemu/int2f.c b/miscemu/int2f.c index e8d0948ba7d..f3fd66507c8 100644 --- a/miscemu/int2f.c +++ b/miscemu/int2f.c @@ -46,6 +46,8 @@ void INT_Int2fHandler( struct sigcontext_struct context ) { case 0x10: /* smartdrv */ break; /* not installed */ + case 0x11: /* dblspace */ + break; /* not installed */ case 0x12: /* realtime compression interface */ break; /* not installed */ default: diff --git a/objects/color.c b/objects/color.c index 03cefa9a85c..9d78e5498f8 100644 --- a/objects/color.c +++ b/objects/color.c @@ -12,6 +12,8 @@ #include "gdi.h" #include "color.h" #include "palette.h" +#include "stddebug.h" +#include "debug.h" #include "xmalloc.h" Colormap COLOR_WinColormap = 0; @@ -301,8 +303,18 @@ int COLOR_ToPhysical( DC *dc, COLORREF color ) { WORD index = 0; WORD *mapping; + unsigned char spec_type; - if (dc && (dc->w.bitsPerPixel == 1) && ((color >> 24) == 0)) + spec_type = color >> 24; + if (spec_type == 0xff) + { + spec_type = 0; /* 'write' seems to need that for 'Page 1' text */ + color &= 0xffffff; + } + if (spec_type > 2) + fprintf(stderr, "COLOR_ToPhysical : color >> 24 not in {-1,0,1,2} : %08lx\n", + color); + if (dc && (dc->w.bitsPerPixel == 1) && (spec_type == 0)) { /* monochrome */ if (((color >> 16) & 0xff) + @@ -320,7 +332,7 @@ int COLOR_ToPhysical( DC *dc, COLORREF color ) unsigned idx; PALETTEOBJ * palPtr; - switch(color >> 24) + switch(spec_type) { case 0: /* RGB */ case 2: /* PALETTERGB -- needs some work, but why bother; we've got a REALLY LARGE number of colors...? */ @@ -362,8 +374,9 @@ int COLOR_ToPhysical( DC *dc, COLORREF color ) return (red << COLOR_Redshift) | (green << COLOR_Greenshift) | (blue << COLOR_Blueshift); } } - else switch(color >> 24) + else switch(spec_type) { + default: case 0: /* RGB */ index = GetNearestPaletteIndex( STOCK_DEFAULT_PALETTE, color ); break; diff --git a/objects/cursoricon.c b/objects/cursoricon.c index 75258556af1..763f53c91fe 100644 --- a/objects/cursoricon.c +++ b/objects/cursoricon.c @@ -499,7 +499,8 @@ HICON LoadIcon( HANDLE hInstance, SEGPTR name ) * CreateCursor (USER.406) */ HCURSOR CreateCursor( HINSTANCE hInstance, INT xHotSpot, INT yHotSpot, - INT nWidth, INT nHeight, LPVOID lpANDbits, LPVOID lpXORbits) + INT nWidth, INT nHeight, + const BYTE *lpANDbits, const BYTE *lpXORbits ) { CURSORICONINFO info = { { xHotSpot, yHotSpot }, nWidth, nHeight, 0, 1, 1 }; @@ -512,8 +513,8 @@ HCURSOR CreateCursor( HINSTANCE hInstance, INT xHotSpot, INT yHotSpot, /*********************************************************************** * CreateIcon (USER.407) */ -HICON CreateIcon( HANDLE hInstance, INT nWidth, INT nHeight, BYTE bPlanes, - BYTE bBitsPixel, LPSTR lpANDbits, LPSTR lpXORbits) +HICON CreateIcon( HINSTANCE hInstance, INT nWidth, INT nHeight, BYTE bPlanes, + BYTE bBitsPixel, const BYTE* lpANDbits, const BYTE* lpXORbits) { CURSORICONINFO info = { { 0, 0 }, nWidth, nHeight, 0, bPlanes, bBitsPixel }; @@ -527,7 +528,7 @@ HICON CreateIcon( HANDLE hInstance, INT nWidth, INT nHeight, BYTE bPlanes, * CreateCursorIconIndirect (USER.408) */ HANDLE CreateCursorIconIndirect( HANDLE hInstance, CURSORICONINFO *info, - LPSTR lpANDbits, LPSTR lpXORbits ) + const BYTE *lpANDbits, const BYTE *lpXORbits ) { HANDLE handle; char *ptr; @@ -611,7 +612,7 @@ BOOL DestroyCursor( HCURSOR hCursor ) /*********************************************************************** * DrawIcon (USER.84) */ -BOOL DrawIcon( HDC hdc, short x, short y, HICON hIcon ) +BOOL DrawIcon( HDC hdc, INT x, INT y, HICON hIcon ) { CURSORICONINFO *ptr; HDC hMemDC; diff --git a/objects/dc.c b/objects/dc.c index 27c1303d2a6..029534c0d8a 100644 --- a/objects/dc.c +++ b/objects/dc.c @@ -158,7 +158,7 @@ void DC_InitDC( HDC hdc ) /*********************************************************************** - * DC_SetupDCForPatBlt + * DC_SetupGCForPatBlt * * Setup the GC for a PatBlt operation using current brush. * If fMapColors is TRUE, X pixels are mapped to Windows colors. @@ -239,7 +239,7 @@ BOOL DC_SetupGCForPatBlt( DC * dc, GC gc, BOOL fMapColors ) /*********************************************************************** - * DC_SetupDCForBrush + * DC_SetupGCForBrush * * Setup dc->u.x.gc for drawing operations using current brush. * Return FALSE if brush is BS_NULL, TRUE otherwise. @@ -251,7 +251,7 @@ BOOL DC_SetupGCForBrush( DC * dc ) /*********************************************************************** - * DC_SetupDCForPen + * DC_SetupGCForPen * * Setup dc->u.x.gc for drawing operations using current pen. * Return FALSE if pen is PS_NULL, TRUE otherwise. @@ -450,7 +450,7 @@ BOOL RestoreDC( HDC hdc, short level ) /*********************************************************************** * CreateDC (GDI.53) */ -HDC CreateDC( LPCSTR driver, LPCSTR device, LPCSTR output, LPCSTR initData ) +HDC CreateDC( LPCTSTR driver, LPCTSTR device, LPCTSTR output, const DEVMODE* initData ) { DC * dc; HANDLE handle; @@ -494,7 +494,7 @@ HDC CreateDC( LPCSTR driver, LPCSTR device, LPCSTR output, LPCSTR initData ) /*********************************************************************** * CreateIC (GDI.153) */ -HDC CreateIC( LPSTR driver, LPSTR device, LPSTR output, LPSTR initData ) +HDC CreateIC( LPCTSTR driver, LPCTSTR device, LPCTSTR output, const DEVMODE* initData ) { /* Nothing special yet for ICs */ return CreateDC( driver, device, output, initData ); diff --git a/objects/font.c b/objects/font.c index 95c8332af96..c05ba02a245 100644 --- a/objects/font.c +++ b/objects/font.c @@ -123,20 +123,26 @@ static XFontStruct * FONT_MatchFont( LOGFONT * font, DC * dc ) char pattern[100]; const char *family, *weight, *charset; char **names; - char slant, spacing; + char slant, oldspacing, spacing; int width, height, oldheight, count; XFontStruct * fontStruct; + dprintf_font(stddeb, + "FONT_MatchFont(H,W = %d,%d; Weight = %d; Italic = %d; FaceName = '%s'\n", + font->lfHeight, font->lfWidth, font->lfWeight, font->lfItalic, font->lfFaceName); weight = (font->lfWeight > 550) ? "bold" : "medium"; slant = font->lfItalic ? 'i' : 'r'; - height = font->lfHeight * dc->w.VportExtX / dc->w.WndExtX; + if (font->lfHeight == -1) + height = 0; + else + height = font->lfHeight * dc->w.VportExtX / dc->w.WndExtX; if (height == 0) height = 120; /* Default height = 12 */ else if (height < 0) { /* If height is negative, it means the height of the characters */ /* *without* the internal leading. So we adjust it a bit to */ /* compensate. 5/4 seems to give good results for small fonts. */ - height = 10 * (-height * 5 / 4); + height = 10 * (-height * 8 / 7); } else height *= 10; width = 10 * (font->lfWidth * dc->w.VportExtY / dc->w.WndExtY); @@ -172,6 +178,7 @@ static XFontStruct * FONT_MatchFont( LOGFONT * font, DC * dc ) } oldheight = height; + oldspacing = spacing; while (TRUE) { /* Width==0 seems not to be a valid wildcard on SGI's, using * instead */ if ( width == 0 ) @@ -183,22 +190,30 @@ static XFontStruct * FONT_MatchFont( LOGFONT * font, DC * dc ) dprintf_font(stddeb, "FONT_MatchFont: '%s'\n", pattern ); names = XListFonts( display, pattern, 1, &count ); if (count > 0) break; + if (spacing == 'm') /* try 'c' if no 'm' found */ { + spacing = 'c'; + continue; + } else if (spacing == 'p') /* try '*' if no 'p' found */ { + spacing = '*'; + continue; + } + spacing = oldspacing; height -= 10; if (height < 10) { - dprintf_font(stddeb,"*** No match for %s\n", pattern ); - if(slant == 'i') { + if (slant == 'i') { /* try oblique if no italic font */ slant = 'o'; height = oldheight; continue; } - if (spacing == 'm') { + if (spacing == 'm' && strcmp(family, "*-*") != 0) { /* If a fixed spacing font could not be found, ignore * the family */ family = "*-*"; height = oldheight; continue; } + fprintf(stderr, "FONT_MatchFont(%s) : returning NULL\n", pattern); return NULL; } } @@ -296,12 +311,20 @@ BOOL CreateScalableFontResource( UINT fHidden,LPSTR lpszResourceFile, HFONT CreateFontIndirect( const LOGFONT * font ) { FONTOBJ * fontPtr; - HFONT hfont = GDI_AllocObject( sizeof(FONTOBJ), FONT_MAGIC ); + HFONT hfont; + + if (!font) + { + fprintf(stderr, "CreateFontIndirect : font is NULL : returning NULL\n"); + return 0; + } + hfont = GDI_AllocObject( sizeof(FONTOBJ), FONT_MAGIC ); if (!hfont) return 0; fontPtr = (FONTOBJ *) GDI_HEAP_LIN_ADDR( hfont ); memcpy( &fontPtr->logfont, font, sizeof(LOGFONT) ); AnsiLower( fontPtr->logfont.lfFaceName ); - dprintf_font(stddeb,"CreateFontIndirect(%p); return "NPFMT"\n",font,hfont); + dprintf_font(stddeb,"CreateFontIndirect(%p (%d,%d)); return "NPFMT"\n", + font, font->lfHeight, font->lfWidth, hfont); return hfont; } @@ -316,7 +339,12 @@ HFONT CreateFont( INT height, INT width, INT esc, INT orient, INT weight, { LOGFONT logfont = { height, width, esc, orient, weight, italic, underline, strikeout, charset, outpres, clippres, quality, pitch, }; - if (name) strncpy( logfont.lfFaceName, name, LF_FACESIZE ); + dprintf_font(stddeb,"CreateFont(%d,%d)\n", height, width); + if (name) + { + strncpy( logfont.lfFaceName, name, LF_FACESIZE - 1 ); + logfont.lfFaceName[LF_FACESIZE - 1] = '\0'; + } else logfont.lfFaceName[0] = '\0'; return CreateFontIndirect( &logfont ); } @@ -344,8 +372,9 @@ HFONT FONT_SelectObject( DC * dc, HFONT hfont, FONTOBJ * font ) XFontStruct * fontStruct; dprintf_font(stddeb,"FONT_SelectObject(%p, "NPFMT", %p)\n", dc, hfont, font); - /* Load font if necessary */ +#if 0 /* From the code in SelectObject, this can not happen */ + /* Load font if necessary */ if (!font) { HFONT hnewfont; @@ -355,6 +384,7 @@ HFONT FONT_SelectObject( DC * dc, HFONT hfont, FONTOBJ * font ) DEFAULT_QUALITY, FF_DONTCARE, "*" ); font = (FONTOBJ *) GDI_HEAP_LIN_ADDR( hnewfont ); } +#endif if (dc->header.wMagic == METAFILE_DC_MAGIC) if (MF_CreateFontIndirect(dc, hfont, &(font->logfont))) @@ -627,8 +657,10 @@ BOOL RemoveFontResource( LPSTR str ) int ParseFontParms(LPSTR lpFont, WORD wParmsNo, LPSTR lpRetStr, WORD wMaxSiz) { int i; +#if 0 dprintf_font(stddeb,"ParseFontParms('%s', %d, %p, %d);\n", lpFont, wParmsNo, lpRetStr, wMaxSiz); +#endif if (lpFont == NULL) return 0; if (lpRetStr == NULL) return 0; for (i = 0; (*lpFont != '\0' && i != wParmsNo); ) { @@ -641,7 +673,9 @@ int ParseFontParms(LPSTR lpFont, WORD wParmsNo, LPSTR lpRetStr, WORD wMaxSiz) for (i = 0; (*lpFont != '\0' && *lpFont != '-' && i < wMaxSiz); i++) *(lpRetStr + i) = *lpFont++; *(lpRetStr + i) = '\0'; +#if 0 dprintf_font(stddeb,"ParseFontParms // '%s'\n", lpRetStr); +#endif return i; } else @@ -714,6 +748,7 @@ void InitFontsList(void) lpNewFont->lfPitchAndFamily = VARIABLE_PITCH | FF_SWISS; break; case 'm': + case 'c': lpNewFont->lfPitchAndFamily = FIXED_PITCH | FF_MODERN; break; default: @@ -734,7 +769,7 @@ void InitFontsList(void) /************************************************************************* * EnumFonts [GDI.70] */ -int EnumFonts(HDC hDC, LPSTR lpFaceName, FARPROC lpEnumFunc, LPSTR lpData) +INT EnumFonts(HDC hDC, LPCTSTR lpFaceName, FONTENUMPROC lpEnumFunc, LPARAM lpData) { HANDLE hLog; HANDLE hMet; @@ -747,7 +782,7 @@ int EnumFonts(HDC hDC, LPSTR lpFaceName, FARPROC lpEnumFunc, LPSTR lpData) int nRet = 0; int i; - dprintf_font(stddeb,"EnumFonts("NPFMT", %p='%s', %08lx, %p)\n", + dprintf_font(stddeb,"EnumFonts("NPFMT", %p='%s', %08lx, %08lx)\n", hDC, lpFaceName, lpFaceName, (LONG)lpEnumFunc, lpData); if (lpEnumFunc == 0) return 0; hLog = GDI_HEAP_ALLOC( sizeof(LOGFONT) + LF_FACESIZE ); @@ -804,7 +839,7 @@ int EnumFonts(HDC hDC, LPSTR lpFaceName, FARPROC lpEnumFunc, LPSTR lpData) /************************************************************************* * EnumFontFamilies [GDI.330] */ -int EnumFontFamilies(HDC hDC, LPSTR lpszFamily, FONTENUMPROC lpEnumFunc, LPARAM lpData) +INT EnumFontFamilies(HDC hDC, LPCTSTR lpszFamily, FONTENUMPROC lpEnumFunc, LPARAM lpData) { HANDLE hLog; HANDLE hMet; diff --git a/objects/gdiobj.c b/objects/gdiobj.c index 12cacd3d73b..d840c1efd93 100644 --- a/objects/gdiobj.c +++ b/objects/gdiobj.c @@ -246,7 +246,7 @@ GDIOBJHDR * GDI_GetObjPtr( HANDLE handle, WORD magic ) else ptr = (GDIOBJHDR *) GDI_HEAP_LIN_ADDR( handle ); if (!ptr) return NULL; - if (ptr->wMagic != magic) return NULL; + if ((magic != MAGIC_DONTCARE) && (ptr->wMagic != magic)) return NULL; return ptr; } @@ -254,7 +254,7 @@ GDIOBJHDR * GDI_GetObjPtr( HANDLE handle, WORD magic ) /*********************************************************************** * DeleteObject (GDI.69) */ -BOOL DeleteObject( HANDLE obj ) +BOOL DeleteObject( HGDIOBJ obj ) { /* Check if object is valid */ @@ -377,7 +377,7 @@ BOOL UnrealizeObject( HANDLE handle ) /*********************************************************************** * EnumObjects (GDI.71) */ -int EnumObjects( HDC hdc, int nObjType, FARPROC lpEnumFunc, LPARAM lParam ) +INT EnumObjects( HDC hdc, INT nObjType, GOBJENUMPROC lpEnumFunc, LPARAM lParam ) { /* Solid colors to enumerate */ static const COLORREF solid_colors[] = diff --git a/objects/metafile.c b/objects/metafile.c index ab0b7dfb858..20d2235006d 100644 --- a/objects/metafile.c +++ b/objects/metafile.c @@ -10,6 +10,7 @@ static char Copyright[] = "Copyright David W. Metcalfe, 1994"; #include #include "gdi.h" #include "bitmap.h" +#include "file.h" #include "metafile.h" #include "stddebug.h" /* #define DEBUG_METAFILE */ @@ -55,7 +56,7 @@ HMETAFILE GetMetaFile(LPSTR lpFilename) GlobalFree(hmf); return 0; } - if (_lread(mf->hFile, (char *)mh, MFHEADERSIZE) == HFILE_ERROR) { + if (FILE_Read(mf->hFile, (char *)mh, MFHEADERSIZE) == HFILE_ERROR) { GlobalFree(mf->hMetaHdr); GlobalFree(hmf); return 0; @@ -77,7 +78,7 @@ HMETAFILE GetMetaFile(LPSTR lpFilename) /****************************************************************** * CreateMetafile GDI.125 */ -HANDLE CreateMetaFile(LPSTR lpFilename) +HANDLE CreateMetaFile(LPCTSTR lpFilename) { DC *dc; HANDLE handle; @@ -254,9 +255,9 @@ BOOL PlayMetaFile(HDC hdc, HMETAFILE hmf) { if (mh->mtType == 1) /* disk based metafile */ { - _lread(mf->hFile, buffer, sizeof(METARECORD)); + FILE_Read(mf->hFile, buffer, sizeof(METARECORD)); mr = (METARECORD *)buffer; - _lread(mf->hFile, (char *)(mr->rdParam + 1), (mr->rdSize * 2) - + FILE_Read(mf->hFile, (char *)(mr->rdParam + 1), (mr->rdSize * 2) - sizeof(METARECORD)); mf->MetaOffset += mr->rdSize * 2; } diff --git a/objects/oembitmap.c b/objects/oembitmap.c index facd5b45e00..0b2d9a5f983 100644 --- a/objects/oembitmap.c +++ b/objects/oembitmap.c @@ -323,9 +323,8 @@ static HBITMAP OBM_MakeBitmap( WORD width, WORD height, * * Create the 2 bitmaps from XPM data. */ -static BOOL OBM_CreateBitmaps( char **data, BOOL color, BOOL mask, - HBITMAP *hBitmap, HBITMAP *hBitmapMask, - POINT *hotspot ) +static BOOL OBM_CreateBitmaps( char **data, BOOL color, HBITMAP *hBitmap, + HBITMAP *hBitmapMask, POINT *hotspot ) { Pixmap pixmap, pixmask; XpmAttributes attrs; @@ -348,14 +347,14 @@ static BOOL OBM_CreateBitmaps( char **data, BOOL color, BOOL mask, } *hBitmap = OBM_MakeBitmap( attrs.width, attrs.height, attrs.depth, pixmap ); - if (mask) *hBitmapMask = OBM_MakeBitmap( attrs.width, attrs.height, - 1, pixmask ); + if (hBitmapMask) *hBitmapMask = OBM_MakeBitmap( attrs.width, attrs.height, + 1, pixmask ); if (!*hBitmap) { if (pixmap) XFreePixmap( display, pixmap ); if (pixmask) XFreePixmap( display, pixmask ); if (*hBitmap) GDI_FreeObject( *hBitmap ); - if (*hBitmapMask) GDI_FreeObject( *hBitmapMask ); + if (hBitmapMask && *hBitmapMask) GDI_FreeObject( *hBitmapMask ); return FALSE; } else return TRUE; @@ -367,17 +366,17 @@ static BOOL OBM_CreateBitmaps( char **data, BOOL color, BOOL mask, */ HBITMAP OBM_LoadBitmap( WORD id ) { - HBITMAP hbitmap, hbitmask; + HBITMAP hbitmap; if ((id < OBM_FIRST) || (id > OBM_LAST)) return 0; id -= OBM_FIRST; if (!OBM_InitColorSymbols()) return 0; - if (!CallTo32_LargeStack( (int(*)())OBM_CreateBitmaps, 6, + if (!CallTo32_LargeStack( (int(*)())OBM_CreateBitmaps, 5, OBM_Pixmaps_Data[id].data, OBM_Pixmaps_Data[id].color, - FALSE, &hbitmap, &hbitmask, NULL, NULL )) + &hbitmap, NULL, NULL )) { fprintf( stderr, "Error creating OEM bitmap %d\n", OBM_FIRST+id ); return 0; @@ -417,9 +416,9 @@ HANDLE OBM_LoadCursorIcon( WORD id, BOOL fCursor ) if (!OBM_InitColorSymbols()) return 0; - if (!CallTo32_LargeStack( (int(*)())OBM_CreateBitmaps, 6, + if (!CallTo32_LargeStack( (int(*)())OBM_CreateBitmaps, 5, fCursor ? OBM_Cursors_Data[id] : OBM_Icons_Data[id], - !fCursor, TRUE, &hXorBits, &hAndBits, &hotspot )) + !fCursor, &hXorBits, &hAndBits, &hotspot )) { fprintf( stderr, "Error creating OEM cursor/icon %d\n", id ); return 0; diff --git a/objects/palette.c b/objects/palette.c index 1945bdf1e23..a637d5af47e 100644 --- a/objects/palette.c +++ b/objects/palette.c @@ -76,7 +76,7 @@ static WORD PALETTE_GetNearestIndexAndColor(HPALETTE hpalette, COLORREF *color) /*********************************************************************** * CreatePalette (GDI.360) */ -HPALETTE CreatePalette( LOGPALETTE * palette ) +HPALETTE CreatePalette( const LOGPALETTE* palette ) { PALETTEOBJ * palettePtr; HPALETTE hpalette; diff --git a/objects/pen.c b/objects/pen.c index 13c2f80a321..bc5a986ce77 100644 --- a/objects/pen.c +++ b/objects/pen.c @@ -24,7 +24,7 @@ HPEN CreatePen( INT style, INT width, COLORREF color ) /*********************************************************************** * CreatePenIndirect (GDI.62) */ -HPEN CreatePenIndirect( LOGPEN * pen ) +HPEN CreatePenIndirect( const LOGPEN * pen ) { PENOBJ * penPtr; HPEN hpen; diff --git a/objects/region.c b/objects/region.c index 13b37995d97..1874a911be8 100644 --- a/objects/region.c +++ b/objects/region.c @@ -66,7 +66,7 @@ int GetRgnBox( HRGN hrgn, LPRECT rect ) /*********************************************************************** * CreateRectRgn (GDI.64) */ -HRGN CreateRectRgn( short left, short top, short right, short bottom ) +HRGN CreateRectRgn( INT left, INT top, INT right, INT bottom ) { HRGN hrgn; RGNOBJ *obj; @@ -93,7 +93,7 @@ HRGN CreateRectRgn( short left, short top, short right, short bottom ) /*********************************************************************** * CreateRectRgnIndirect (GDI.65) */ -HRGN CreateRectRgnIndirect( LPRECT rect ) +HRGN CreateRectRgnIndirect( const RECT* rect ) { return CreateRectRgn( rect->left, rect->top, rect->right, rect->bottom ); } @@ -124,8 +124,8 @@ void SetRectRgn( HRGN hrgn, short left, short top, short right, short bottom ) /*********************************************************************** * CreateRoundRectRgn (GDI.444) */ -HRGN CreateRoundRectRgn( short left, short top, short right, short bottom, - short ellipse_width, short ellipse_height ) +HRGN CreateRoundRectRgn( INT left, INT top, INT right, INT bottom, + INT ellipse_width, INT ellipse_height ) { RGNOBJ * obj; HRGN hrgn; @@ -240,7 +240,7 @@ HRGN CreateEllipticRgnIndirect( LPRECT rect ) /*********************************************************************** * CreatePolygonRgn (GDI.63) */ -HRGN CreatePolygonRgn( POINT * points, INT count, INT mode ) +HRGN CreatePolygonRgn( const POINT * points, INT count, INT mode ) { return CreatePolyPolygonRgn( points, &count, 1, mode ); } @@ -249,7 +249,7 @@ HRGN CreatePolygonRgn( POINT * points, INT count, INT mode ) /*********************************************************************** * CreatePolyPolygonRgn (GDI.451) */ -HRGN CreatePolyPolygonRgn( POINT * points, INT * count, +HRGN CreatePolyPolygonRgn( const POINT * points, const INT * count, INT nbpolygons, INT mode ) { RGNOBJ * obj; diff --git a/objects/text.c b/objects/text.c index 6b4f8e63569..ad96f0eeefb 100644 --- a/objects/text.c +++ b/objects/text.c @@ -184,12 +184,12 @@ static const char *TEXT_NextLine( HDC hdc, const char *str, int *count, /*********************************************************************** * DrawText (USER.85) */ -int DrawText( HDC hdc, LPCSTR str, int count, LPRECT rect, WORD flags ) +INT DrawText( HDC hdc, LPCTSTR str, INT i_count, LPRECT rect, UINT flags ) { SIZE size; const char *strPtr; static char line[1024]; - int len, lh; + int len, lh, count=i_count; int prefix_x = 0; int prefix_end = 0; TEXTMETRIC tm; diff --git a/rc/README b/rc/README index d436c18fc21..949335c0ec0 100644 --- a/rc/README +++ b/rc/README @@ -32,7 +32,6 @@ as long as you leave the existing copyrights intact. Bug Reports and Fixes If you find a bug in winerc, you can report it to me, -martin@cs.csufresno.edu (Martin von Loewis) -or to comp.emulators.ms-windows.wine. If you can fix the bug, send the -diffs & ChangeLog to wine-new@amscons.com (Bob Amstadt), or send it to -me, and I will collect the fixes and forward them to wine-news. +martin@cs.csufresno.edu (Martin von Loewis) or to +comp.emulators.ms-windows.wine. If you can fix the bug, send the diffs +and ChangeLog entry to julliard@lrc.epfl.ch (Alexandre Julliard). diff --git a/resources/Makefile.in b/resources/Makefile.in index 3ccf2b040e9..3bcc5ef1d24 100644 --- a/resources/Makefile.in +++ b/resources/Makefile.in @@ -2,7 +2,7 @@ TOPSRC = @top_srcdir@ MODULE = resources -LANGUAGES = En Es De No Fr Fi Da +LANGUAGES = En Es De No Fr Fi Da Cz SYSRES_SRCS = $(LANGUAGES:%=sysres_%.c) diff --git a/resources/sysres.c b/resources/sysres.c index 04a6d52029d..4dac4bff1ed 100644 --- a/resources/sysres.c +++ b/resources/sysres.c @@ -16,6 +16,7 @@ #include "sysres_Fr.h" #include "sysres_Fi.h" #include "sysres_Da.h" +#include "sysres_Cz.h" static const struct resource * const * SYSRES_Resources[] = @@ -26,7 +27,8 @@ static const struct resource * const * SYSRES_Resources[] = sysres_No_Table, /* LANG_No */ sysres_Fr_Table, /* LANG_Fr */ sysres_Fi_Table, /* LANG_Fi */ - sysres_Da_Table /* LANG_Da */ + sysres_Da_Table, /* LANG_Da */ + sysres_Cz_Table /* LANG_Cz */ }; diff --git a/resources/sysres_Cz.rc b/resources/sysres_Cz.rc new file mode 100644 index 00000000000..9dc052f3eed --- /dev/null +++ b/resources/sysres_Cz.rc @@ -0,0 +1,200 @@ +SYSMENU MENU LOADONCALL MOVEABLE DISCARDABLE +{ + MENUITEM "&Obnov", 61728 + MENUITEM "Pøe&suò", 61456 + MENUITEM "&Zmìò velikost", 61440 + MENUITEM "Mi&nimalizuj", 61472 + MENUITEM "Ma&ximalizuj", 61488 + MENUITEM SEPARATOR + MENUITEM "&Zavøi\tAlt-F4", 61536 + MENUITEM SEPARATOR + MENUITEM "&Pøepni do jiné úlohy...\tCtrl-Esc", 61744 + MENUITEM SEPARATOR + MENUITEM "&O programu WINE", 61761 +} + +MSGBOX DIALOG 100, 80, 216, 168 +STYLE DS_SYSMODAL | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +BEGIN + ICON "", 1088, 8, 20, 16, 16, WS_CHILD | WS_VISIBLE + LTEXT "", 100, 32, 4, 176, 48, WS_CHILD | WS_VISIBLE | WS_GROUP + PUSHBUTTON "&Ok", 1, 16, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "&Storno", 2, 64, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "&Pøerušit", 3, 112, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "&Zkusit znovu", 4, 160, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "&Ignorovat", 5, 208, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "&Ano", 6, 256, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "&Ne", 7, 304, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP +END + +SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 50, 44, 223, 200 +STYLE DS_LOCALEDIT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "O aplikaci %s" +FONT 10, "System" +{ + DEFPUSHBUTTON "OK", 1, 91, 180, 40, 14 + CONTROL "", -1, "STATIC", SS_BLACKFRAME | WS_CHILD | WS_VISIBLE | WS_DISABLED, 4, 35, 215, 140 + LTEXT "Text", 100, 11, 40, 200, 130, SS_NOPREFIX | WS_GROUP + ICON "", 1088, 195, 10, 18, 20 +} + + +OPEN_FILE DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 275, 134 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Otevøení souboru" +FONT 8, "Helv" +{ + LTEXT "&jméno souboru:", 1090, 6, 6, 76, 9 + EDITTEXT 1152, 6, 16, 90, 12, ES_AUTOHSCROLL | ES_OEMCONVERT | WS_BORDER | WS_TABSTOP + LISTBOX 1120, 6, 32, 90, 68, LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_TABSTOP + LTEXT "&Adresáøe:", -1, 110, 6, 92, 9 + LTEXT "", 1088, 110, 18, 92, 9, SS_NOPREFIX | WS_GROUP + LISTBOX 1121, 110, 32, 92, 68, LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_TABSTOP + LTEXT "&Typ zobrazených souborù:", 1089, 6, 104, 90, 9 + COMBOBOX 1136, 6, 114, 90, 36, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_BORDER | WS_VSCROLL | WS_TABSTOP + LTEXT "&Diskové jednotky:", 1091, 110, 104, 92, 9 + COMBOBOX 1137, 110, 114, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP + DEFPUSHBUTTON "Otevøít", 1, 208, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "Storno", 2, 208, 24, 56, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&Nápovìda", 1038, 208, 46, 56, 14, WS_GROUP | WS_TABSTOP + CHECKBOX "&Pouze pro ètení", 1040, 208, 68, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP +} + + +SAVE_FILE DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 275, 134 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Ulož pod jménem..." +FONT 8, "Helv" +{ + LTEXT "&Jméno souboru:", 1090, 6, 6, 76, 9 + EDITTEXT 1152, 6, 16, 90, 12, ES_AUTOHSCROLL | ES_OEMCONVERT | WS_BORDER | WS_TABSTOP + LISTBOX 1120, 6, 32, 90, 68, LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_TABSTOP + LTEXT "&Adresáøe:", -1, 110, 6, 92, 9 + LTEXT "", 1088, 110, 18, 92, 9, SS_NOPREFIX | WS_GROUP + LISTBOX 1121, 110, 32, 92, 68, LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_TABSTOP + LTEXT "&Typ zobrazených souborù:", 1089, 6, 104, 90, 9 + COMBOBOX 1136, 6, 114, 90, 36, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_BORDER | WS_VSCROLL | WS_TABSTOP + LTEXT "&Diskové jednotky:", 1091, 110, 104, 92, 9 + COMBOBOX 1137, 110, 114, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP + DEFPUSHBUTTON "Ulož pod jménem", 1, 208, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "Storno", 2, 208, 24, 56, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&Nápovìda", 1038, 208, 46, 56, 14, WS_GROUP | WS_TABSTOP + CHECKBOX "&Pouze pro ètení", 1040, 208, 68, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP +} + + +PRINT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 134 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Tisk" +FONT 8, "Helv" +{ + LTEXT "Tiskárna:", 1088, 6, 6, 40, 9 + LTEXT "", 1089, 60, 6, 150, 9 + GROUPBOX "Rozsah tisku", 1072, 6, 30, 160, 65, BS_GROUPBOX + RADIOBUTTON "Vytiskni vš&e", 1056, 16, 45, 60, 12 + RADIOBUTTON "Vytiskni &výbìr", 1057, 16, 60, 60, 12 + RADIOBUTTON "Vytiskni &zadané stránky", 1058, 16, 75, 60, 12 + DEFPUSHBUTTON "Tiskni", 1, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "Storno", 2, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&Nastavit...", 1024, 206, 46, 56, 14, WS_GROUP | WS_TABSTOP + LTEXT "&Od:", 1090, 60, 80, 30, 9 + LTEXT "&Do:", 1091, 120, 80, 30, 9 + LTEXT "Kvalita &tisku:", 1092, 6, 100, 76, 9 + COMBOBOX 1136, 80, 100, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP + CHECKBOX "Tisk do so&uboru", 1040, 20, 100, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + CHECKBOX "Kondenzované", 1041, 160, 100, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP +} + + +PRINT_SETUP DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 134 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Nastavení zpùsobu tisku" +FONT 8, "Helv" +{ + GROUPBOX "Tiskárna", 1072, 6, 10, 180, 65, BS_GROUPBOX + RADIOBUTTON "&Pøedvolená tiskárna", 1056, 16, 20, 80, 12 + LTEXT "[none]", 1088, 35, 35, 120, 9 + RADIOBUTTON "Specifická &tiskárna", 1057, 16, 50, 80, 12 + COMBOBOX 1136, 35, 65, 149, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP + DEFPUSHBUTTON "Ok", 1, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "Storno", 2, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&Další volby...", 1024, 206, 46, 56, 14, WS_GROUP | WS_TABSTOP + GROUPBOX "Orientace", 1073, 6, 85, 100, 50, BS_GROUPBOX + RADIOBUTTON "Na &výšku", 1058, 50, 100, 40, 12 + RADIOBUTTON "Na šíø&ku", 1059, 50, 115, 40, 12 + ICON "LANDSCAP", 1097, 10, 95, 32, 32 + ICON "PORTRAIT", 1098, 10, 95, 32, 32 + GROUPBOX "Papír", 1074, 120, 85, 180, 50, BS_GROUPBOX + LTEXT "&Formát", 1089, 130, 95, 30, 9 + LTEXT "&Odkud", 1090, 130, 110, 30, 9 + COMBOBOX 1137, 155, 95, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP + COMBOBOX 1138, 155, 110, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP +} + + +CHOOSE_FONT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 134 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Písmo" +FONT 8, "Helv" +{ + LTEXT "Písmo:", 1088, 6, 6, 40, 9 + LTEXT "", 1089, 60, 6, 150, 9 + DEFPUSHBUTTON "Ok", 1, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "Storno", 2, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP +} + + +CHOOSE_COLOR DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 200 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Barvy" +FONT 8, "Helv" +{ + LTEXT "&Základní barvy:", 1088, 6, 6, 40, 9 + LTEXT "&Barvy na zakázku:", 1089, 6, 126, 40, 9 + LTEXT "Barva|Spoj&itá", 1090, 100, 146, 40, 9 + LTEXT "&Odstín:", 1091, 150, 126, 40, 9 + LTEXT "&Sytost:", 1092, 150, 146, 40, 9 + LTEXT "&Jas:", 1093, 150, 166, 40, 9 + LTEXT "Èe&rvená:", 1094, 150, 126, 40, 9 + LTEXT "&Zelená:", 1095, 150, 146, 40, 9 + LTEXT "&Modrá:", 1096, 150, 166, 40, 9 + DEFPUSHBUTTON "Ok", 1, 6, 182, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "&Pøidat barvu", 1024, 120, 182, 100, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&Vyøadit barvu", 1025, 6, 164, 56, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "Storno", 2, 76, 182, 56, 14, WS_GROUP | WS_TABSTOP +} + + +FIND_TEXT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 84 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Hledání" +FONT 8, "Helv" +{ + LTEXT "&Vyhledat:", 1088, 6, 6, 40, 9 + LTEXT "", 1089, 60, 6, 150, 9 + CHECKBOX "Pouze &celá slova", 1040, 20, 30, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + CHECKBOX "&Rozlišovat malá a velká písmena", 1041, 20, 50, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + GROUPBOX "Smìr", 1072, 90, 40, 80, 40, BS_GROUPBOX + RADIOBUTTON "&Nahoru", 1056, 100, 50, 50, 12 + RADIOBUTTON "&Dolu", 1057, 150, 50, 50, 12 + DEFPUSHBUTTON "Vyhledat d&alší", 1, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "Zavøít", 2, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP +} + + +REPLACE_TEXT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 114 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Zámìna" +FONT 8, "Helv" +{ + LTEXT "&Vyhledat:", 1088, 6, 6, 40, 9 + LTEXT "", 1089, 60, 6, 150, 9 + LTEXT "&Zamìnit za:", 1090, 6, 26, 40, 9 + LTEXT "", 1091, 60, 26, 150, 9 + CHECKBOX "Pouze &celá slova", 1040, 20, 40, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + CHECKBOX "&Rozlišovat malá a velká písmena", 1041, 20, 60, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + DEFPUSHBUTTON "Vyhledat d&alší", 1, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "Za&mìnit", 1024, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "Zamìnit ve vý&bìru", 1025, 206, 44, 56, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "Zavøít", 2, 206, 64, 56, 14, WS_GROUP | WS_TABSTOP +} diff --git a/documentation/apiw.index b/tools/apiw.index similarity index 100% rename from documentation/apiw.index rename to tools/apiw.index diff --git a/tools/build.c b/tools/build.c index e9667ad67ca..13d2913f328 100644 --- a/tools/build.c +++ b/tools/build.c @@ -915,12 +915,12 @@ static void BuildSpec32Files( char *specname ) } printf("};\n\n"); - printf( "static WIN32_builtin dll={\"%s\",functions,%d,0};\n", - UpperDLLName, Limit+1); + printf( "static WIN32_builtin dll={\"%s\",functions,%d,%d,0};\n", + UpperDLLName, Limit+1, Base); printf( "void %s_Init(void)\n{\n",UpperDLLName); printf( "\tdll.next=WIN32_builtin_list;\n"); - printf( "\tWIN32_builtin_list=&dll;\n}"); + printf( "\tWIN32_builtin_list=&dll;\n\tRELAY32_MakeFakeModule(&dll);\n}"); } diff --git a/tools/makehtml.pl b/tools/makehtml.pl index cfd8408c461..e51cf47dd44 100644 --- a/tools/makehtml.pl +++ b/tools/makehtml.pl @@ -1,5 +1,5 @@ #!/usr/bin/perl -open(APIW,"./apiw.index"); +open(APIW,"./apiw.index") or die "Can't find ./apiw.index"; while() { ($func,$link)=split /:/; @@ -9,13 +9,13 @@ while() } close(APIW); -open(WINDOWS,"../include/windows.h"); +open(WINDOWS,"../include/windows.h") or die "Can't find ../include/windows.h"; while() { add_func($_) if /AccessResource/../wvsprintf/; } close(WINDOWS); -open(TOOLHELP,"../include/toolhelp.h"); +open(TOOLHELP,"../include/toolhelp.h") or die "Can't find ../include/toolhelp.h"; while() { add_func($_) if /GlobalInfo/../MemoryWrite/; } close(TOOLHELP); -open(COMMDLG,"../include/commdlg.h"); +open(COMMDLG,"../include/commdlg.h") or die "Can't find ../include/commdlg.h"; while() { add_func($_) if /ChooseColor/../ReplaceText/; } close(COMMDLG); diff --git a/win32/Makefile.in b/win32/Makefile.in index 2300885422c..b7ea362ccc6 100644 --- a/win32/Makefile.in +++ b/win32/Makefile.in @@ -8,6 +8,7 @@ C_SRCS = \ environment.c \ error.c \ file.c \ + gdi32.c \ heap.c \ init.c \ memory.c \ diff --git a/win32/gdi32.c b/win32/gdi32.c new file mode 100644 index 00000000000..782c0b32efa --- /dev/null +++ b/win32/gdi32.c @@ -0,0 +1,74 @@ + +/* + * Win32 GDI functions + * + * Copyright 1996 Thomas Sandford t.d.g.sandford@prds-grn.demon.co.uk + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +int WIN32_GetObject( HANDLE handle, int count, LPVOID buffer ) + +/* largely a copy of GetObject, but with size mangling capabilities to +convert between win16 and win32 objects. Yeuch! */ + +{ + void *temp = alloca(count); + GDIOBJHDR * ptr = NULL; + + dprintf_win32(stddeb, "WIN32_GetObject: %d %d %p\n", handle, count, buffer); + + if ((!count) || (temp == NULL)) + return 0; + + ptr = GDI_GetObjPtr(handle, MAGIC_DONTCARE); + if (!ptr) return 0; + + /* FIXME: only bitmaps fixed so far */ + + switch(ptr->wMagic) + { + case PEN_MAGIC: + return PEN_GetObject( (PENOBJ *)ptr, count, buffer ); + case BRUSH_MAGIC: + return BRUSH_GetObject( (BRUSHOBJ *)ptr, count, buffer ); + case BITMAP_MAGIC: { + BITMAP *pbm = (BITMAP *)temp; + int *pdest = (int *)buffer; + + if (buffer == NULL) + return 28; + + BITMAP_GetObject( (BITMAPOBJ *)ptr, count, temp ); + if (count > 3) + pdest[0] = pbm->bmType; + if (count > 7) + pdest[1] = pbm->bmWidth; + if (count > 11) + pdest[2] = pbm->bmHeight; + if (count > 15) + pdest[3] = pbm->bmWidthBytes; + if (count > 19) + pdest[4] = pbm->bmPlanes; + if (count > 23) + pdest[5] = pbm->bmBitsPixel; + if (count > 27) + pdest[6] = pbm->bmBits; + + return (count > 28) ? 28 : count - (count % 4); + } + case FONT_MAGIC: + return FONT_GetObject( (FONTOBJ *)ptr, count, buffer ); + case PALETTE_MAGIC: + return PALETTE_GetObject( (PALETTEOBJ *)ptr, count, buffer ); + } + return 0; +} + diff --git a/win32/heap.c b/win32/heap.c index 7a4468fbab1..33e9dbbdcbc 100644 --- a/win32/heap.c +++ b/win32/heap.c @@ -2,6 +2,7 @@ * Win32 kernel functions * * Copyright 1995 Thomas Sandford + * Copyright 1995 Martin von Löwis */ #include @@ -13,6 +14,7 @@ #include "windows.h" #include "winerror.h" #include "kernel32.h" +#include "handle32.h" #include "winbase.h" #include "stddebug.h" #include "debug.h" @@ -21,12 +23,11 @@ /* FIXME: these functions do *not* implement the win32 API properly. They are here merely as "get you going" aids */ - /*********************************************************************** * HeapAlloc (KERNEL32.222) * */ -LPVOID HeapAlloc(HANDLE hHeap, DWORD dwFlags, DWORD dwBytes) +LPVOID SIMPLE_HeapAlloc(HANDLE hHeap, DWORD dwFlags, DWORD dwBytes) { void *result; @@ -36,3 +37,155 @@ LPVOID HeapAlloc(HANDLE hHeap, DWORD dwFlags, DWORD dwBytes) memset(result, 0, dwBytes); return result; } + +HANDLE32 HeapCreate(DWORD flOptions, DWORD dwInitialSize, DWORD dwMaximumSize) +{ + LPVOID start; + HEAP_OBJECT *ret; + HEAPITEM_OBJECT *item; + if(dwInitialSize<4096) + return 0; + start = VirtualAlloc(0,dwMaximumSize, MEM_RESERVE, PAGE_READWRITE); + if(!start) + return 0; + if(!VirtualAlloc(start,dwInitialSize, MEM_COMMIT, PAGE_READWRITE)) + { + VirtualFree(start,dwMaximumSize,MEM_RELEASE); + return 0; + } + ret=CreateKernelObject(sizeof(HEAP_OBJECT)); + ret->common.magic=KERNEL_OBJECT_HEAP; + ret->start=start; + ret->size=dwInitialSize; + ret->maximum=dwMaximumSize; + ret->flags=flOptions; + item=start; + item->common.magic=KERNEL_OBJECT_HEAPITEM; + item->next=item->prev=0; + item->heap=ret; + + ret->first=ret->last=item; + + return (HANDLE32)ret; +} + +BOOL HeapDestroy(HEAP_OBJECT *h) +{ + /* FIXME: last error */ + if(h->common.magic!=KERNEL_OBJECT_HEAP) + return 0; + h->common.magic=0; + VirtualFree(h->start,h->size,MEM_RELEASE); + ReleaseKernelObject(h); + return 1; +} + + +static BOOL HEAP_GrowHeap(HEAP_OBJECT *h,DWORD size) +{ + HEAPITEM_OBJECT *last; + /* FIXME: last error */ + if(size > h->maximum-h->size) + return 0; + if(!VirtualAlloc(h->start+h->size,size,MEM_COMMIT,PAGE_READWRITE)) + return 0; + /* FIXME: consolidate with previous item */ + last=h->start+size; + h->size+=size; + h->last->next=last; + last->prev=h->last; + last->next=0; + h->last=last; + last->common.magic=KERNEL_OBJECT_HEAPITEM; + last->heap=h; + return 1; +} + + +LPVOID HeapAlloc(HEAP_OBJECT *h,DWORD dwFlags,DWORD dwBytes) +{ + HEAPITEM_OBJECT *it,*next,*prev; + /* FIXME: last error */ + if(!h) + return SIMPLE_HeapAlloc(h,dwFlags,dwBytes); + if(h->common.magic!=KERNEL_OBJECT_HEAP) + return 0; + /* align to DWORD */ + dwBytes = (dwBytes + 3) & ~3; + for(it=h->first;it;it=it->next) + { + if(it->size>dwBytes+sizeof(HEAPITEM_OBJECT)) + break; + } + if(!it) + { + if(!HEAP_GrowHeap(h,dwBytes)) + return 0; + it=h->last; + } + next = it->next; + prev = it->prev; + if(it->size > dwBytes+2*sizeof(HEAPITEM_OBJECT)) + { /* split item */ + HEAPITEM_OBJECT *next=(HEAPITEM_OBJECT*)((char*)(it+1)+dwBytes); + next->common.magic=KERNEL_OBJECT_HEAPITEM; + next->size=it->size-sizeof(HEAPITEM_OBJECT)-dwBytes; + next->next = it->next; + } + if(next) + next->prev=prev; + else + h->last=prev; + if(prev) + prev->next=next; + else + h->first=next; + /* Allocated item is denoted by self-referencing */ + it->next=it->prev=it; + return (LPVOID)(it+1); +} + +BOOL HeapFree(HEAP_OBJECT *h,DWORD dwFlags,LPVOID lpMem) +{ + HEAPITEM_OBJECT *item,*prev,*next; + item = (HEAPITEM_OBJECT*)lpMem - 1; + if(item->common.magic != KERNEL_OBJECT_HEAP) + return 0; + for(next=item;(caddr_t)next<(caddr_t)h->start+h->size; + next=(HEAPITEM_OBJECT*)((char*)next+next->size)) + if(next!=next->next) + break; + if((caddr_t)next>=(caddr_t)h->start+h->size) + next=0; + if(next) + prev=next->prev; + else + prev=h->last; + /* consolidate with previous */ + if(prev && (char*)prev+prev->size==(char*)item) + { + prev->size+=item->size; + item=prev; + prev=item->prev; + } + /* consolidate with next */ + if(next && (char*)item+item->size==(char*)next) + { + item->size+=next->size; + next=next->next; + } + if(prev) + { + item->prev=prev; + prev->next=item; + } else + h->first=item; + if(next) + { + item->next=next; + next->prev=item; + }else + h->last=item; + return 1; +} + diff --git a/win32/memory.c b/win32/memory.c index bd55c2b874f..0227222b2fe 100644 --- a/win32/memory.c +++ b/win32/memory.c @@ -10,10 +10,13 @@ #include #include #include +#include +#include #include "windows.h" #include "winerror.h" #include "kernel32.h" #include "winbase.h" +#include "handle32.h" #include "stddebug.h" #include "debug.h" @@ -33,6 +36,131 @@ virtual_mem_t *mem = 0; int mem_count = 0; int mem_used = 0; +/******************************************************************* + * VRANGE + * A VRANGE denotes a contiguous part of the address space. It is used + * for house keeping, and will be obtained by higher-level memory allocation + * functions (VirtualAlloc, MapViewOfFile) + * There can be at most one VRANGE object covering any address at any time. + * Currently, all VRANGE objects are stored in a sorted list. Wine does not + * attempt to give a complete list of in-use address ranges, only those + * allocated via Win32. + * An exception is IsVrangeFree, which should test the OS specific + * mappings, too. As a default, an range not known to be allocated is + * considered free. + *******************************************************************/ + +VRANGE_OBJECT *MEMORY_ranges=0; + +VRANGE_OBJECT *MEMORY_FindVrange(DWORD start) +{ + VRANGE_OBJECT *range; + for(range=MEMORY_ranges;range && range->startnext) + { + if(range->startstart+range->size) + return range; + } + return 0; +} + +static int MEMORY_IsVrangeFree(DWORD start,DWORD size) +{ + DWORD end; + VRANGE_OBJECT *range; + if(!size) + return 1; + /* First, check our lists*/ + end=start+size; + for(range=MEMORY_ranges;range && range->startnext) + { + if((range->startstart+range->size) || + (range->startstart+range->size)) + return 0; + } + /* Now, check the maps that are not under our control */ +#ifdef linux + { + FILE *f=fopen("/proc/self/maps","r"); + char line[80]; + int found=0; + while(1) + { + char *it; + int lower,upper; + if(!fgets(line,sizeof(line),f)) + break; + it=line; + lower=strtoul(it,&it,16); + if(*it++!='-') + fprintf(stderr,"Format of /proc/self/maps changed\n"); + upper=strtoul(it,&it,16); + if((lowerstartstart) + { + r->next=MEMORY_ranges; + MEMORY_ranges=r; + } + for(it=MEMORY_ranges,last=0;it && it->startstart;it=it->next) + last=it; + r->next=last->next; + last->next=r; +} + + +VRANGE_OBJECT *MEMORY_AllocVrange(int start,int size) +{ + VRANGE_OBJECT *ret=CreateKernelObject(sizeof(VRANGE_OBJECT)); + ret->common.magic=KERNEL_OBJECT_VRANGE; + MEMORY_InsertVrange(ret); + return ret; +} + +void MEMORY_ReleaseVrange(VRANGE_OBJECT *r) +{ + VRANGE_OBJECT *it; + if(MEMORY_ranges==r) + { + MEMORY_ranges=r->next; + ReleaseKernelObject(r); + return; + } + for(it=MEMORY_ranges;it;it=it->next) + if(it->next==r)break; + if(!it) + { + fprintf(stderr,"VRANGE not found\n"); + return; + } + it->next=r->next; + ReleaseKernelObject(r); +} + /*********************************************************************** * VirtualAlloc (KERNEL32.548) */ @@ -167,3 +295,4 @@ int TranslateProtectionFlags(DWORD protection_flags) } return prot; } + diff --git a/win32/param32.c b/win32/param32.c index d2c10f2ef80..121972522a6 100644 --- a/win32/param32.c +++ b/win32/param32.c @@ -25,6 +25,10 @@ void PARAM32_POINT32to16(const POINT32* p32,POINT* p16) BOOL WIN32_MoveToEx(HDC hdc,int x,int y,POINT32* p32) { POINT p; - PARAM32_POINT32to16(p32,&p); - return MoveToEx(hdc,x,y,&p); + if (p32 == NULL) + return MoveToEx(hdc,x,y,(POINT *)NULL); + else { + PARAM32_POINT32to16(p32,&p); + return MoveToEx(hdc,x,y,&p); + } } diff --git a/win32/resource.c b/win32/resource.c index 2e2dd751c27..b2f055bba51 100644 --- a/win32/resource.c +++ b/win32/resource.c @@ -29,11 +29,15 @@ int language = 0x0409; +#if 0 #define PrintId(name) \ if (HIWORD((DWORD)name)) \ dprintf_resource( stddeb, "'%s'", name); \ else \ dprintf_resource( stddeb, "#%04x", LOWORD(name)); +#else +#define PrintId(name) +#endif /********************************************************************** * GetResDirEntry @@ -85,12 +89,13 @@ PIMAGE_RESOURCE_DIRECTORY GetResDirEntry(PIMAGE_RESOURCE_DIRECTORY resdirptr, /********************************************************************** * FindResource (KERNEL.60) */ -HANDLE32 FindResource32( HINSTANCE hModule, LPCTSTR name, LPCTSTR type ) +HANDLE32 FindResource32( HINSTANCE hModule, LPCWSTR name, LPCWSTR type ) { #ifndef WINELIB struct w_files *wptr = wine_files; PIMAGE_RESOURCE_DIRECTORY resdirptr; DWORD root; + HANDLE32 result; #if 0 hModule = GetExePtr( hModule ); /* In case we were passed an hInstance */ @@ -110,7 +115,10 @@ HANDLE32 FindResource32( HINSTANCE hModule, LPCTSTR name, LPCTSTR type ) return 0; if ((resdirptr = GetResDirEntry(resdirptr, name, root)) == NULL) return 0; - return (HANDLE32) GetResDirEntry(resdirptr, (LPCSTR)language, root); + result = GetResDirEntry(resdirptr, (LPCWSTR)language, root); + /* Try LANG_NEUTRAL, too */ + if(!result) + return GetResDirEntry(resdirptr, (LPCWSTR)0, root); #else return LIBRES_FindResource( hModule, name, type ); #endif @@ -164,26 +172,12 @@ BOOL FreeResource32( HANDLE32 handle ) */ INT AccessResource32( HINSTANCE hModule, HRSRC hRsrc ) { - WORD *pModule; - hModule = GetExePtr( hModule ); /* In case we were passed an hInstance */ dprintf_resource(stddeb, "AccessResource: module="NPFMT" res="NPFMT"\n", hModule, hRsrc ); if (!hRsrc) return 0; - if (!(pModule = (WORD *)GlobalLock( hModule ))) return 0; -#ifndef WINELIB - switch(*pModule) - { - case NE_SIGNATURE: - return NE_AccessResource( hModule, hRsrc ); - case PE_SIGNATURE: - return 0; - default: - return 0; - } -#else - return LIBRES_AccessResource( hModule, hRsrc ); -#endif + fprintf(stderr,"AccessResource32: not implemented\n"); + return 0; } @@ -192,25 +186,11 @@ INT AccessResource32( HINSTANCE hModule, HRSRC hRsrc ) */ DWORD SizeofResource32( HINSTANCE hModule, HRSRC hRsrc ) { - WORD *pModule; - hModule = GetExePtr( hModule ); /* In case we were passed an hInstance */ dprintf_resource(stddeb, "SizeofResource: module="NPFMT" res="NPFMT"\n", hModule, hRsrc ); - if (!(pModule = (WORD *)GlobalLock( hModule ))) return 0; -#ifndef WINELIB - switch(*pModule) - { - case NE_SIGNATURE: - return NE_SizeofResource( hModule, hRsrc ); - case PE_SIGNATURE: - return 0; - default: - return 0; - } -#else - return LIBRES_SizeofResource( hModule, hRsrc ); -#endif + fprintf(stderr,"SizeofResource32: not implemented\n"); + return 0; } /********************************************************************** @@ -218,6 +198,7 @@ DWORD SizeofResource32( HINSTANCE hModule, HRSRC hRsrc ) */ HANDLE32 WIN32_LoadAcceleratorsW(HINSTANCE instance, LPCWSTR lpTableName) { +#if 0 HANDLE32 hAccel; HANDLE32 rsc_mem; HANDLE32 hRsrc; @@ -232,7 +213,8 @@ HANDLE32 WIN32_LoadAcceleratorsW(HINSTANCE instance, LPCWSTR lpTableName) dprintf_accel( stddeb, "LoadAccelerators: "NPFMT" %04x\n", instance, LOWORD(lpTableName) ); - if (!(hRsrc = FindResource32( instance, lpTableName, RT_ACCELERATOR ))) + if (!(hRsrc = FindResource32( instance, lpTableName, + (LPCWSTR)RT_ACCELERATOR ))) return 0; if (!(rsc_mem = LoadResource32( instance, hRsrc ))) return 0; @@ -258,6 +240,10 @@ HANDLE32 WIN32_LoadAcceleratorsW(HINSTANCE instance, LPCWSTR lpTableName) GlobalUnlock(hAccel); FreeResource( rsc_mem ); return hAccel; +#else + fprintf(stderr,"LoadAcceleratorsW: not implemented\n"); + return 0; +#endif } HANDLE32 WIN32_LoadAcceleratorsA(HINSTANCE instance, LPCSTR lpTableName) @@ -280,9 +266,10 @@ WIN32_LoadStringW(HINSTANCE instance, DWORD resource_id, LPWSTR buffer, int bufl int i; dprintf_resource(stddeb, "LoadString: instance = "NPFMT", id = %04x, buffer = %08x, " - "length = %d\n", instance, resource_id, (int) buffer, buflen); + "length = %d\n", instance, (int)resource_id, (int) buffer, buflen); - hrsrc = FindResource32( instance, (resource_id>>4)+1, RT_STRING ); + hrsrc = FindResource32( instance, (LPCWSTR)((resource_id>>4)+1), + (LPCWSTR)RT_STRING ); if (!hrsrc) return 0; hmem = LoadResource32( instance, hrsrc ); if (!hmem) return 0; @@ -305,8 +292,10 @@ WIN32_LoadStringW(HINSTANCE instance, DWORD resource_id, LPWSTR buffer, int bufl buffer[0] = (WCHAR) 0; return 0; } +#if 0 fprintf(stderr,"LoadString // I dont know why , but caller give buflen=%d *p=%d !\n", buflen, *p); fprintf(stderr,"LoadString // and try to obtain string '%s'\n", p + 1); +#endif } dprintf_resource(stddeb,"LoadString // '%s' copied !\n", buffer); return i; @@ -341,7 +330,7 @@ HICON LoadIconA32(HINSTANCE hinst, LPCTSTR lpszIcon) /********************************************************************** * LoadBitmapW */ -HBITMAP WIN32_LoadBitmapW( HANDLE instance, LPCTSTR name ) +HBITMAP WIN32_LoadBitmapW( HANDLE instance, LPCWSTR name ) { HBITMAP hbitmap = 0; HDC hdc; @@ -355,7 +344,8 @@ HBITMAP WIN32_LoadBitmapW( HANDLE instance, LPCTSTR name ) return OBM_LoadBitmap( LOWORD((int)name) ); } - if (!(hRsrc = FindResource32( instance, name, RT_BITMAP ))) return 0; + if (!(hRsrc = FindResource32( instance, name, + (LPWSTR)RT_BITMAP ))) return 0; if (!(handle = LoadResource32( instance, hRsrc ))) return 0; info = (BITMAPINFO *)LockResource32( handle ); @@ -371,11 +361,11 @@ HBITMAP WIN32_LoadBitmapW( HANDLE instance, LPCTSTR name ) /********************************************************************** * LoadBitmapA */ -HBITMAP WIN32_LoadBitmapA( HANDLE instance, LPCTSTR name ) +HBITMAP WIN32_LoadBitmapA( HANDLE instance, LPCSTR name ) { HBITMAP res; if(!HIWORD(name)) - res = WIN32_LoadBitmapW(instance,name); + res = WIN32_LoadBitmapW(instance,(LPWSTR)name); else{ LPWSTR uni=STRING32_DupAnsiToUni(name); res=WIN32_LoadBitmapW(instance,uni); @@ -403,15 +393,15 @@ BYTE* WIN32_ParseMenu(HMENU hMenu,BYTE *it) if(flags & MF_POPUP) { wMenuID = CreatePopupMenu(); - len = STRING32_lstrlenW(it); - utext = it; + len = STRING32_lstrlenW((LPWSTR)it); + utext = (WCHAR*)it; it += sizeof(WCHAR)*(len+1); it = WIN32_ParseMenu(wMenuID,it); } else { wMenuID=*(WORD*)it; it+=sizeof(WORD); - utext = it; - len = STRING32_lstrlenW(it); + utext = (LPWSTR)it; + len = STRING32_lstrlenW((LPWSTR)it); it += sizeof(WCHAR)*(len+1); if(!wMenuID && !*utext) flags |= MF_SEPARATOR; @@ -444,7 +434,7 @@ HMENU WIN32_LoadMenuIndirectW(void *menu) HMENU WIN32_LoadMenuW(HANDLE instance, LPCWSTR name) { HANDLE32 hrsrc; - hrsrc=FindResource32(instance,name,RT_MENU); + hrsrc=FindResource32(instance,name,(LPWSTR)RT_MENU); if(!hrsrc)return 0; return WIN32_LoadMenuIndirectW(LoadResource32(instance, hrsrc)); } @@ -465,7 +455,7 @@ HMENU WIN32_LoadMenuA(HANDLE instance,LPCSTR name) { HMENU res; if(!HIWORD(name)) - res = WIN32_LoadMenuW(instance,name); + res = WIN32_LoadMenuW(instance,(LPWSTR)name); else{ LPWSTR uni=STRING32_DupAnsiToUni(name); res=WIN32_LoadMenuW(instance,uni); diff --git a/win32/string32.c b/win32/string32.c index e9af8cbe78f..1ae569b9364 100644 --- a/win32/string32.c +++ b/win32/string32.c @@ -45,14 +45,14 @@ void STRING32_AnsiToUni(LPWSTR dest,LPCSTR src) *dest = *src; } -LPSTR STRING32_DupUniToAnsi(LPWSTR src) +LPSTR STRING32_DupUniToAnsi(LPCWSTR src) { LPSTR dest=xmalloc(STRING32_UniLen(src)+1); STRING32_UniToAnsi(dest,src); return dest; } -LPWSTR STRING32_DupAnsiToUni(LPSTR src) +LPWSTR STRING32_DupAnsiToUni(LPCSTR src) { LPWSTR dest=xmalloc(2*strlen(src)+2); STRING32_AnsiToUni(dest,src); @@ -75,7 +75,7 @@ WCHAR STRING32_tolowerW(WCHAR c) return tolower(c); } -LPWSTR STRING32_lstrcmpniW(LPCWSTR a,LPCWSTR b,DWORD len) +int STRING32_lstrcmpniW(LPCWSTR a,LPCWSTR b,DWORD len) { while(len--) { diff --git a/win32/user32.c b/win32/user32.c index d3b2a4c0161..c195056d15a 100644 --- a/win32/user32.c +++ b/win32/user32.c @@ -8,13 +8,21 @@ stubs. 'Real' implementations go into context specific files */ #include +#include #include "windows.h" #include "winerror.h" #include "relay32.h" #include "alias.h" #include "stackframe.h" #include "xmalloc.h" +#include "handle32.h" #include "struct32.h" +#include "resource32.h" +#include "string32.h" +#include "dialog.h" +#include "win.h" +#include "debug.h" +#include "stddebug.h" /* Structure copy functions */ static void MSG16to32(MSG *msg16,struct WIN32_MSG *msg32) @@ -182,47 +190,77 @@ DWORD USER32_CreateWindowExA(long flags,char* class,char *title, DWORD instance,DWORD param) { DWORD retval; - HANDLE classh, titleh; - SEGPTR classsegp, titlesegp; + HANDLE classh=0, titleh=0; + SEGPTR classsegp=0, titlesegp=0; char *classbuf, *titlebuf; + int usec,uset; /*Have to translate CW_USEDEFAULT */ - if(x==0x80000000)x=CW_USEDEFAULT; - if(y==0x80000000)y=CW_USEDEFAULT; - if(width==0x80000000)width=CW_USEDEFAULT; - if(height==0x80000000)height=CW_USEDEFAULT; + if(x==CW_USEDEFAULT32)x=CW_USEDEFAULT; + if(y==CW_USEDEFAULT32)y=CW_USEDEFAULT; + if(width==CW_USEDEFAULT32)width=CW_USEDEFAULT; + if(height==CW_USEDEFAULT32)height=CW_USEDEFAULT; /* FIXME: There has to be a better way of doing this - but neither malloc nor alloca will work */ + usec = HIWORD(class); + uset = HIWORD(title); - classh = GlobalAlloc(0, strlen(class)+1); - titleh = GlobalAlloc(0, strlen(title)+1); - classsegp = WIN16_GlobalLock(classh); - titlesegp = WIN16_GlobalLock(titleh); - classbuf = PTR_SEG_TO_LIN(classsegp); - titlebuf = PTR_SEG_TO_LIN(titlesegp); - strcpy( classbuf, class ); - strcpy( titlebuf, title ); + if(usec){ + classh = GlobalAlloc(0, strlen(class)+1); + classsegp = WIN16_GlobalLock(classh); + classbuf = PTR_SEG_TO_LIN(classsegp); + strcpy( classbuf, class ); + } + if(uset){ + titleh = GlobalAlloc(0, strlen(title)+1); + titlesegp = WIN16_GlobalLock(titleh); + titlebuf = PTR_SEG_TO_LIN(titlesegp); + strcpy( titlebuf, title ); + } - retval = (DWORD) CreateWindowEx(flags,classsegp, - titlesegp,style,x,y,width,height, + retval = (DWORD) CreateWindowEx(flags,(usec ? classsegp : (SEGPTR)class), + (uset ? titlesegp : (SEGPTR)title),style,x,y,width,height, (HWND)parent,(HMENU)menu,(HINSTANCE)instance, - (LPVOID)param); - GlobalFree(classh); - GlobalFree(titleh); + (DWORD)param); + if(usec)GlobalFree(classh); + if(uset)GlobalFree(titleh); return retval; } +DWORD USER32_CreateWindowExW(long flags,LPCWSTR class,LPCWSTR title, + long style,int x,int y,int width,int height,DWORD parent,DWORD menu, + DWORD instance,DWORD param) +{ + HWND hwnd; + LPSTR c,t; + int usec,uset; + usec=HIWORD(class); + uset=HIWORD(title); + c = usec ? STRING32_DupUniToAnsi(class) : (LPSTR)class; + t = uset ? STRING32_DupUniToAnsi(title) : (LPSTR)title; + hwnd=USER32_CreateWindowExA(flags,c,t,style,x,y,width,height,parent,menu, + instance,param); + if(usec)free(c); + if(uset)free(t); + return hwnd; +} + /*********************************************************************** * InvalidateRect (USER32.327) */ BOOL USER32_InvalidateRect(HWND hWnd,const RECT32 *lpRect,BOOL bErase) { RECT r; - USER32_RECT32to16(lpRect,&r); - InvalidateRect(hWnd,&r,bErase); - /* FIXME: Return value */ - return 0; + + if (lpRect == NULL) + InvalidateRect(hWnd, (RECT *)NULL, bErase); + else { + USER32_RECT32to16(lpRect,&r); + InvalidateRect(hWnd,&r,bErase); + } + /* FIXME: Return meaningful value */ + return TRUE; } /*********************************************************************** @@ -247,3 +285,284 @@ BOOL USER32_GetClientRect(HWND hwnd,RECT32 *r32) return 0; } +UINT USER32_SetTimer(HWND hwnd, UINT id, UINT timeout, void *proc) + +{ + dprintf_win32(stddeb, "USER32_SetTimer: %d %d %d %08lx\n", hwnd, id, timeout, +(LONG)proc ); + return SetTimer( hwnd, id, timeout, MAKE_SEGPTR(proc)); +} + +/* WARNING: It has not been verified that the signature or semantics + of the corresponding NT function is the same */ + +HWND USER32_CreateDialogIndirectParamAorW(HINSTANCE hInst,LPVOID templ, + HWND hWndParent,DLGPROC lpDialogFunc,LPARAM dwInitParam,int A) +{ + DLGTEMPLATE32 *dlgTempl=templ; + DLGITEMTEMPLATE32 *dlgitem; + WORD *ptr; + DWORD MenuName=0; + DWORD ClassName=0; + DWORD szFontName=0; + WORD wPointSize; + HFONT hFont=0; + HMENU hMenu=0; + DWORD exStyle; + DWORD szCaption; + RECT rect; + DIALOGINFO *dlgInfo; + WND *wndPtr; + WORD xUnit = xBaseUnit; + WORD yUnit = yBaseUnit; + int i; + DWORD ClassId; + DWORD Text; + HWND hwnd,hwndCtrl; + HWND hwndDefButton=0; + WCHAR buffer[200]; + + /* parse the dialog template header*/ + exStyle = dlgTempl->dwExtendedStyle; + ptr = (WORD*)(dlgTempl+1); + switch(*ptr){ + case 0: MenuName=0;ptr++;break; + case 0xFFFF: MenuName=*(ptr+1);ptr+=2;break; + default: MenuName = (DWORD)ptr; + ptr += STRING32_lstrlenW(ptr)+1; + } + switch(*ptr){ + case 0: ClassName = DIALOG_CLASS_ATOM;ptr++;break; + case 0xFFFF: ClassName = *(ptr+1);ptr+=2;break; + default: ClassName = (DWORD)ptr; + ptr += STRING32_lstrlenW(ptr)+1; + } + szCaption=(DWORD)ptr; + ptr+=STRING32_lstrlenW(ptr)+1; + if(dlgTempl->style & DS_SETFONT) + { + wPointSize = *ptr; + ptr++; + szFontName = (DWORD)ptr; + ptr+=STRING32_lstrlenW(ptr)+1; + } + + if(MenuName) hMenu=WIN32_LoadMenuW(hInst,(LPWSTR)MenuName); + if(dlgTempl->style & DS_SETFONT) + { + fprintf(stderr,"Win32: dialog fonts not supported yet\n"); + } + + /* Create dialog main window */ + rect.left = rect.top = 0; + rect.right = dlgTempl->cx * xUnit / 4; + rect.bottom = dlgTempl->cy * yUnit / 8; + + /* FIXME: proper modalframe handling ??*/ + if (dlgTempl->style & DS_MODALFRAME) exStyle |= WS_EX_DLGMODALFRAME; + + /* FIXME: AdjustWindowRectEx */ + + rect.right -= rect.left; + rect.bottom -= rect.top; + + if(dlgTempl->x == CW_USEDEFAULT) + rect.left = rect.top = CW_USEDEFAULT; + else{ + rect.left += dlgTempl->x * xUnit / 4; + rect.top += dlgTempl->y * yUnit / 8; + if (!(dlgTempl->style & DS_ABSALIGN)) + ClientToScreen(hWndParent, (POINT *)&rect ); + } + + /* FIXME: Here is the place to consider A */ + hwnd = USER32_CreateWindowExW(exStyle, (LPWSTR)ClassName, (LPWSTR)szCaption, + dlgTempl->style & ~WS_VISIBLE, + rect.left, rect.top, rect.right, rect.bottom, + hWndParent, hMenu, hInst, 0); + + if(!hwnd) + { + if(hFont)DeleteObject(hFont); + if(hMenu)DeleteObject(hMenu); + return 0; + } + + wndPtr = WIN_FindWndPtr(hwnd); + + /* FIXME: should purge junk from system menu, but windows/dialog.c + says this does not belong here */ + + /* Create control windows */ + dprintf_dialog(stddeb, " BEGIN\n" ); + dlgInfo = (DIALOGINFO *)wndPtr->wExtra; + dlgInfo->msgResult = 0; /* This is used to store the default button id */ + dlgInfo->hDialogHeap = 0; + + for (i = 0; i < dlgTempl->noOfItems; i++) + { + if((int)ptr&3) + { + fprintf(stddeb,"DWORD aligning\n"); + ptr++; + } + dlgitem = (DLGITEMTEMPLATE32*)ptr; + ptr = (WORD*)(dlgitem+1); + if(*ptr == 0xFFFF) { + /* FIXME: ignore HIBYTE? */ + ClassId = *(ptr+1); + ptr+=2; + }else{ + ClassId = (DWORD)ptr; + ptr += STRING32_lstrlenW(ptr)+1; + } + if(*ptr == 0xFFFF) { + Text = *(ptr+1); + ptr+=2; + }else{ + Text = (DWORD)ptr; + ptr += STRING32_lstrlenW(ptr)+1; + } + if(!HIWORD(ClassId)) + { + switch(LOWORD(ClassId)) + { + case 0x80: STRING32_AnsiToUni(buffer,"BUTTON" ); break; + case 0x81: STRING32_AnsiToUni( buffer, "EDIT" ); break; + case 0x82: STRING32_AnsiToUni( buffer, "STATIC" ); break; + case 0x83: STRING32_AnsiToUni( buffer, "LISTBOX" ); break; + case 0x84: STRING32_AnsiToUni( buffer, "SCROLLBAR" ); break; + case 0x85: STRING32_AnsiToUni( buffer, "COMBOBOX" ); break; + default: buffer[0] = '\0'; break; + } + ClassId = (DWORD)buffer; + } + /*FIXME: debugging output*/ + /*FIXME: local edit ?*/ + exStyle = dlgitem->dwExtendedStyle|WS_EX_NOPARENTNOTIFY; + if(*ptr) + { + fprintf(stderr,"having data\n"); + } + ptr++; + hwndCtrl = USER32_CreateWindowExW(WS_EX_NOPARENTNOTIFY, + (LPWSTR)ClassId, (LPWSTR)Text, + dlgitem->style | WS_CHILD, + dlgitem->x * xUnit / 4, + dlgitem->y * yUnit / 8, + dlgitem->cx * xUnit / 4, + dlgitem->cy * yUnit / 8, + hwnd, (HMENU)((DWORD)dlgitem->id), + hInst, (SEGPTR)0 ); + SetWindowPos( hwndCtrl, HWND_BOTTOM, 0, 0, 0, 0, + SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE ); + /* Send initialisation messages to the control */ + if (hFont) SendMessage( hwndCtrl, WM_SETFONT, (WPARAM)hFont, 0 ); + if (SendMessage( hwndCtrl, WM_GETDLGCODE, 0, 0 ) & DLGC_DEFPUSHBUTTON) + { + /* If there's already a default push-button, set it back */ + /* to normal and use this one instead. */ + if (hwndDefButton) + SendMessage( hwndDefButton, BM_SETSTYLE, BS_PUSHBUTTON, FALSE); + hwndDefButton = hwndCtrl; + dlgInfo->msgResult = GetWindowWord( hwndCtrl, GWW_ID ); + } + } + dprintf_dialog(stddeb, " END\n" ); + + /* Initialise dialog extra data */ + ALIAS_RegisterAlias(0,0,lpDialogFunc); + dlgInfo->dlgProc = lpDialogFunc; + dlgInfo->hUserFont = hFont; + dlgInfo->hMenu = hMenu; + dlgInfo->xBaseUnit = xUnit; + dlgInfo->yBaseUnit = yUnit; + dlgInfo->hwndFocus = DIALOG_GetFirstTabItem( hwnd ); + + /* Send initialisation messages and set focus */ + if (dlgInfo->hUserFont) + SendMessage( hwnd, WM_SETFONT, (WPARAM)dlgInfo->hUserFont, 0 ); + if (SendMessage( hwnd, WM_INITDIALOG, (WPARAM)dlgInfo->hwndFocus, dwInitParam )) + SetFocus( dlgInfo->hwndFocus ); + if (dlgTempl->style & WS_VISIBLE) ShowWindow(hwnd, SW_SHOW); + return hwnd; +} + +HWND USER32_CreateDialogIndirectParamW(HINSTANCE hInst,LPVOID dlgTempl, + HWND hWndParent,DLGPROC lpDialogFunc,LPARAM dwInitParam) +{ + return USER32_CreateDialogIndirectParamAorW(hInst,dlgTempl,hWndParent, + lpDialogFunc,dwInitParam,0); +} + +HWND USER32_CreateDialogIndirectParamA(HINSTANCE hInst,LPVOID dlgTempl, + HWND hWndParent,DLGPROC lpDialogFunc,LPARAM dwInitParam) +{ + return USER32_CreateDialogIndirectParamAorW(hInst,dlgTempl,hWndParent, + lpDialogFunc,dwInitParam,1); +} + +HWND USER32_CreateDialogParamW(HINSTANCE hInst,LPCWSTR lpszName, + HWND hWndParent,DLGPROC lpDialogFunc,LPARAM dwInitParam) +{ + HANDLE32 hrsrc; + hrsrc=FindResource32(hInst,lpszName,(LPWSTR)RT_DIALOG); + if(!hrsrc)return 0; + return USER32_CreateDialogIndirectParamW(hInst, + LoadResource32(hInst, hrsrc),hWndParent,lpDialogFunc,dwInitParam); +} + +HWND USER32_CreateDialogParamA(HINSTANCE hInst,LPCSTR lpszName, + HWND hWndParent,DLGPROC lpDialogFunc,LPARAM dwInitParam) +{ + HWND res; + if(!HIWORD(lpszName)) + res = USER32_CreateDialogParamW(hInst,(LPCWSTR)lpszName,hWndParent, + lpDialogFunc,dwInitParam); + else{ + LPWSTR uni=STRING32_DupAnsiToUni(lpszName); + res=USER32_CreateDialogParamW(hInst,uni,hWndParent, + lpDialogFunc,dwInitParam); + } + return res; +} + +int USER32_DialogBoxIndirectParamW(HINSTANCE hInstance,LPVOID dlgTempl, + HWND hWndParent,DLGPROC lpDialogFunc,LPARAM dwInitParam) +{ + HWND hwnd; + hwnd = USER32_CreateDialogIndirectParamW(hInstance,dlgTempl, + hWndParent,lpDialogFunc,dwInitParam); + if(hwnd)return DIALOG_DoDialogBox(hwnd,hWndParent); + return -1; +} + +int USER32_DialogBoxIndirectParamA(HINSTANCE hInstance,LPVOID dlgTempl, + HWND hWndParent,DLGPROC lpDialogFunc,LPARAM dwInitParam) +{ + HWND hwnd; + hwnd = USER32_CreateDialogIndirectParamA(hInstance,dlgTempl, + hWndParent,lpDialogFunc,dwInitParam); + if(hwnd)return DIALOG_DoDialogBox(hwnd,hWndParent); + return -1; +} + +int USER32_DialogBoxParamW(HINSTANCE hInstance,LPCWSTR lpszName, + HWND hWndParent,DLGPROC lpDialogFunc,LPARAM dwInitParam) +{ + HWND hwnd; + hwnd = USER32_CreateDialogParamW(hInstance,lpszName, + hWndParent,lpDialogFunc,dwInitParam); + if(hwnd)return DIALOG_DoDialogBox(hwnd,hWndParent); + return -1; +} + +int USER32_DialogBoxParamA(HINSTANCE hInstance,LPCSTR lpszName, + HWND hWndParent,DLGPROC lpDialogFunc,LPARAM dwInitParam) +{ + HWND hwnd; + hwnd = USER32_CreateDialogParamA(hInstance,lpszName, + hWndParent,lpDialogFunc,dwInitParam); + if(hwnd)return DIALOG_DoDialogBox(hwnd,hWndParent); + return -1; +} diff --git a/windows/caret.c b/windows/caret.c index 983cdee32fe..12e9e000bfc 100644 --- a/windows/caret.c +++ b/windows/caret.c @@ -84,7 +84,7 @@ static void CARET_HideCaret() else hBrush = CreatePatternBrush(Caret.bitmap); SelectObject(hdc, (HANDLE)hBrush); - SetROP2(hdc, R2_XORPEN); + SetROP2(hdc, R2_NOTXORPEN); rgn = CreateRectRgn(Caret.x, Caret.y, Caret.x + Caret.width, Caret.y + Caret.height); @@ -105,7 +105,8 @@ static void CARET_Initialize() { WineProc=(DWORD)CARET_Callback; Win16Proc=(DWORD)GetWndProcEntry16("CARET_Callback"); - Win32Proc=(DWORD)RELAY32_GetEntryPoint("WINPROCS32","CARET_Callback",0); + Win32Proc=(DWORD)RELAY32_GetEntryPoint( + RELAY32_GetBuiltinDLL("WINPROCS32"),"CARET_Callback",0); ALIAS_RegisterAlias(WineProc,Win16Proc,Win32Proc); initialized=1; } @@ -165,7 +166,7 @@ BOOL CreateCaret(HWND hwnd, HBITMAP bitmap, INT width, INT height) * DestroyCaret (USER.164) */ -void DestroyCaret() +BOOL DestroyCaret() { /* if (!Caret.hwnd) return; */ @@ -177,6 +178,7 @@ void DestroyCaret() CARET_HideCaret(); Caret.hwnd = 0; /* cursor marked as not existing */ + return TRUE; } diff --git a/windows/dialog.c b/windows/dialog.c index 8a982b4e3b6..90bb72aa198 100644 --- a/windows/dialog.c +++ b/windows/dialog.c @@ -21,7 +21,7 @@ static char Copyright[] = "Copyright Alexandre Julliard, 1993, 1994"; #include "debug.h" /* Dialog base units */ -static WORD xBaseUnit = 0, yBaseUnit = 0; +WORD xBaseUnit = 0, yBaseUnit = 0; /*********************************************************************** @@ -469,7 +469,7 @@ HWND CreateDialogIndirectParam( HINSTANCE hInst, SEGPTR dlgTemplate, /*********************************************************************** * DIALOG_DoDialogBox */ -static int DIALOG_DoDialogBox( HWND hwnd, HWND owner ) +int DIALOG_DoDialogBox( HWND hwnd, HWND owner ) { WND * wndPtr; DIALOGINFO * dlgInfo; @@ -508,8 +508,8 @@ static int DIALOG_DoDialogBox( HWND hwnd, HWND owner ) /*********************************************************************** * DialogBox (USER.87) */ -int DialogBox( HINSTANCE hInst, SEGPTR dlgTemplate, - HWND owner, WNDPROC dlgProc ) +INT DialogBox( HINSTANCE hInst, SEGPTR dlgTemplate, + HWND owner, DLGPROC dlgProc ) { return DialogBoxParam( hInst, dlgTemplate, owner, dlgProc, 0 ); } @@ -518,8 +518,8 @@ int DialogBox( HINSTANCE hInst, SEGPTR dlgTemplate, /*********************************************************************** * DialogBoxParam (USER.239) */ -int DialogBoxParam( HINSTANCE hInst, SEGPTR dlgTemplate, - HWND owner, WNDPROC dlgProc, LPARAM param ) +INT DialogBoxParam( HINSTANCE hInst, SEGPTR dlgTemplate, + HWND owner, DLGPROC dlgProc, LPARAM param ) { HWND hwnd; @@ -534,8 +534,8 @@ int DialogBoxParam( HINSTANCE hInst, SEGPTR dlgTemplate, /*********************************************************************** * DialogBoxIndirect (USER.218) */ -int DialogBoxIndirect( HINSTANCE hInst, HANDLE dlgTemplate, - HWND owner, WNDPROC dlgProc ) +INT DialogBoxIndirect( HINSTANCE hInst, HANDLE dlgTemplate, + HWND owner, DLGPROC dlgProc ) { return DialogBoxIndirectParam( hInst, dlgTemplate, owner, dlgProc, 0 ); } @@ -544,8 +544,8 @@ int DialogBoxIndirect( HINSTANCE hInst, HANDLE dlgTemplate, /*********************************************************************** * DialogBoxIndirectParam (USER.240) */ -int DialogBoxIndirectParam( HINSTANCE hInst, HANDLE dlgTemplate, - HWND owner, WNDPROC dlgProc, LPARAM param ) +INT DialogBoxIndirectParam( HINSTANCE hInst, HANDLE dlgTemplate, + HWND owner, DLGPROC dlgProc, LPARAM param ) { HWND hwnd; SEGPTR ptr; @@ -561,13 +561,14 @@ int DialogBoxIndirectParam( HINSTANCE hInst, HANDLE dlgTemplate, /*********************************************************************** * EndDialog (USER.88) */ -void EndDialog( HWND hwnd, short retval ) +BOOL EndDialog( HWND hwnd, INT retval ) { WND * wndPtr = WIN_FindWndPtr( hwnd ); DIALOGINFO * dlgInfo = (DIALOGINFO *)wndPtr->wExtra; dlgInfo->msgResult = retval; dlgInfo->fEnd = TRUE; dprintf_dialog(stddeb, "EndDialog: "NPFMT" %d\n", hwnd, retval ); + return TRUE; } diff --git a/windows/graphics.c b/windows/graphics.c index 517d74bff63..741b49f70c2 100644 --- a/windows/graphics.c +++ b/windows/graphics.c @@ -642,7 +642,7 @@ BOOL InvertRgn( HDC hdc, HRGN hrgn ) /*********************************************************************** * DrawFocusRect (USER.466) */ -void DrawFocusRect( HDC hdc, LPRECT rc ) +void DrawFocusRect( HDC hdc, const RECT* rc ) { HPEN hOldPen; int oldDrawMode, oldBkMode; diff --git a/windows/mapping.c b/windows/mapping.c index 5e6681972b8..8c9f1210315 100644 --- a/windows/mapping.c +++ b/windows/mapping.c @@ -38,7 +38,7 @@ void MAPPING_FixIsotropic( DC * dc ) /*********************************************************************** * DPtoLP (GDI.67) */ -BOOL DPtoLP( HDC hdc, LPPOINT points, int count ) +BOOL DPtoLP( HDC hdc, LPPOINT points, INT count ) { POINT * pt; DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ); diff --git a/windows/mdi.c b/windows/mdi.c index 38e09449844..7ed6727a525 100644 --- a/windows/mdi.c +++ b/windows/mdi.c @@ -1138,11 +1138,7 @@ LRESULT DefFrameProc(HWND hwnd, HWND hwndMDIClient, UINT message, * DefMDIChildProc (USER.447) * */ -#ifdef WINELIB32 -LONG DefMDIChildProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) -#else -LONG DefMDIChildProc(HWND hwnd, WORD message, WORD wParam, LONG lParam) -#endif +LRESULT DefMDIChildProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { MDICLIENTINFO *ci; WND *clientWnd; diff --git a/windows/message.c b/windows/message.c index a197f379519..cd733d379a0 100644 --- a/windows/message.c +++ b/windows/message.c @@ -209,88 +209,6 @@ HTASK MSG_GetQueueTask( HANDLE hQueue ) return (msgQ) ? msgQ->hTask : 0 ; } -/*********************************************************************** - * MSG_GetWindowForEvent - * - * Find the window and hittest for a mouse event. - */ -static INT MSG_GetWindowForEvent( POINT pt, HWND *phwnd ) -{ - WND *wndPtr; - HWND hwnd; - INT hittest = HTERROR; - INT x, y; - - *phwnd = hwnd = GetDesktopWindow(); - x = pt.x; - y = pt.y; - while (hwnd) - { - /* If point is in window, and window is visible, and it */ - /* is enabled (or it's a top-level window), then explore */ - /* its children. Otherwise, go to the next window. */ - - wndPtr = WIN_FindWndPtr( hwnd ); - if ((wndPtr->dwStyle & WS_VISIBLE) && - (!(wndPtr->dwStyle & WS_DISABLED) || - !(wndPtr->dwStyle & WS_CHILD)) && - (x >= wndPtr->rectWindow.left) && - (x < wndPtr->rectWindow.right) && - (y >= wndPtr->rectWindow.top) && - (y < wndPtr->rectWindow.bottom)) - { - *phwnd = hwnd; - x -= wndPtr->rectClient.left; - y -= wndPtr->rectClient.top; - /* If window is minimized or disabled, ignore its children */ - if ((wndPtr->dwStyle & WS_MINIMIZE) || - (wndPtr->dwStyle & WS_DISABLED)) break; - hwnd = wndPtr->hwndChild; - } - else hwnd = wndPtr->hwndNext; - } - - /* Make point relative to parent again */ - - wndPtr = WIN_FindWndPtr( *phwnd ); - x += wndPtr->rectClient.left; - y += wndPtr->rectClient.top; - - /* Send the WM_NCHITTEST message */ - - while (*phwnd) - { - wndPtr = WIN_FindWndPtr( *phwnd ); - if (wndPtr->dwStyle & WS_DISABLED) hittest = HTERROR; - else hittest = (INT)SendMessage( *phwnd, WM_NCHITTEST, 0, - MAKELONG( pt.x, pt.y ) ); - if (hittest != HTTRANSPARENT) break; /* Found the window */ - hwnd = wndPtr->hwndNext; - while (hwnd) - { - WND *nextPtr = WIN_FindWndPtr( hwnd ); - if ((nextPtr->dwStyle & WS_VISIBLE) && - (x >= nextPtr->rectWindow.left) && - (x < nextPtr->rectWindow.right) && - (y >= nextPtr->rectWindow.top) && - (y < nextPtr->rectWindow.bottom)) break; - hwnd = nextPtr->hwndNext; - } - if (hwnd) *phwnd = hwnd; /* Found a suitable sibling */ - else /* Go back to the parent */ - { - if (!(*phwnd = wndPtr->hwndParent)) break; - wndPtr = WIN_FindWndPtr( *phwnd ); - x += wndPtr->rectClient.left; - y += wndPtr->rectClient.top; - } - } - - if (!*phwnd) *phwnd = GetDesktopWindow(); - return hittest; -} - - /*********************************************************************** * MSG_TranslateMouseMsg * @@ -333,7 +251,7 @@ static BOOL MSG_TranslateMouseMsg( MSG *msg, BOOL remove ) msg->message, (LPARAM)MAKE_SEGPTR(&hook)); } - if ((hittest = MSG_GetWindowForEvent( msg->pt, &msg->hwnd )) != HTERROR) + if ((hittest = WINPOS_WindowFromPoint( msg->pt, &msg->hwnd )) != HTERROR) { /* Send the WM_PARENTNOTIFY message */ @@ -1171,7 +1089,7 @@ BOOL TranslateMessage( LPMSG msg ) /*********************************************************************** * DispatchMessage (USER.114) */ -LONG DispatchMessage( LPMSG msg ) +LONG DispatchMessage( const MSG* msg ) { WND * wndPtr; LONG retval; diff --git a/windows/msgbox.c b/windows/msgbox.c index 59f61cc6fd2..33ebe2cc251 100644 --- a/windows/msgbox.c +++ b/windows/msgbox.c @@ -195,7 +195,8 @@ int MessageBox(HWND hWnd, LPCSTR text, LPCSTR title, WORD type) { WineProc=(DWORD)SystemMessageBoxProc; Win16Proc=(DWORD)GetWndProcEntry16("SystemMessageBoxProc"); - Win32Proc=(DWORD)RELAY32_GetEntryPoint("WINPROCS32","SystemMessageBoxProc",0); + Win32Proc=(DWORD)RELAY32_GetEntryPoint(RELAY32_GetBuiltinDLL("WINPROCS32"), + "SystemMessageBoxProc",0); ALIAS_RegisterAlias(WineProc,Win16Proc,Win32Proc); initialized=1; } diff --git a/windows/nonclient.c b/windows/nonclient.c index e19ccf66e30..976cfb6262b 100644 --- a/windows/nonclient.c +++ b/windows/nonclient.c @@ -37,17 +37,12 @@ static HBITMAP hbitmapRestoreD = 0; #define SC_ABOUTWINE (SC_SCREENSAVE+1) /* Some useful macros */ -#define IS_MANAGED(style) \ - (Options.managed && !((style) & WS_CHILD)) - #define HAS_DLGFRAME(style,exStyle) \ - (!(IS_MANAGED(style)) && \ - (((exStyle) & WS_EX_DLGMODALFRAME) || \ - (((style) & WS_DLGFRAME) && !((style) & WS_BORDER)))) + (((exStyle) & WS_EX_DLGMODALFRAME) || \ + (((style) & WS_DLGFRAME) && !((style) & WS_BORDER))) #define HAS_THICKFRAME(style) \ - (!(IS_MANAGED(style)) && \ - ((style) & WS_THICKFRAME) && \ + (((style) & WS_THICKFRAME) && \ !(((style) & (WS_DLGFRAME|WS_BORDER)) == WS_DLGFRAME)) #define HAS_MENU(w) (!((w)->dwStyle & WS_CHILD) && ((w)->wIDmenu != 0)) @@ -70,19 +65,24 @@ static HBITMAP hbitmapRestoreD = 0; static void NC_AdjustRect( LPRECT rect, DWORD style, BOOL menu, DWORD exStyle ) { if (style & WS_ICONIC) return; /* Nothing to change for an icon */ - if (IS_MANAGED(style)) return; - if (HAS_DLGFRAME( style, exStyle )) - InflateRect( rect, SYSMETRICS_CXDLGFRAME, SYSMETRICS_CYDLGFRAME ); - else - { - if (HAS_THICKFRAME(style)) - InflateRect( rect, SYSMETRICS_CXFRAME, SYSMETRICS_CYFRAME ); - if (style & WS_BORDER) - InflateRect( rect, SYSMETRICS_CXBORDER, SYSMETRICS_CYBORDER ); - } - if ((style & WS_CAPTION) == WS_CAPTION) - rect->top -= SYSMETRICS_CYCAPTION - SYSMETRICS_CYBORDER; + /* Decide if the window will be managed (see CreateWindowEx) */ + if (!(Options.managed && ((style & (WS_DLGFRAME | WS_THICKFRAME)) || + (exStyle & WS_EX_DLGMODALFRAME)))) + { + if (HAS_DLGFRAME( style, exStyle )) + InflateRect( rect, SYSMETRICS_CXDLGFRAME, SYSMETRICS_CYDLGFRAME ); + else + { + if (HAS_THICKFRAME(style)) + InflateRect( rect, SYSMETRICS_CXFRAME, SYSMETRICS_CYFRAME ); + if (style & WS_BORDER) + InflateRect( rect, SYSMETRICS_CXBORDER, SYSMETRICS_CYBORDER ); + } + + if ((style & WS_CAPTION) == WS_CAPTION) + rect->top -= SYSMETRICS_CYCAPTION - SYSMETRICS_CYBORDER; + } if (menu) rect->top -= SYSMETRICS_CYMENU + SYSMETRICS_CYBORDER; if (style & WS_VSCROLL) rect->right += SYSMETRICS_CXVSCROLL; @@ -140,8 +140,7 @@ void NC_GetMinMaxInfo( HWND hwnd, POINT *maxSize, POINT *maxPos, MinMax.ptMaxTrackSize.x = SYSMETRICS_CXSCREEN; MinMax.ptMaxTrackSize.y = SYSMETRICS_CYSCREEN; - if (IS_MANAGED(wndPtr->dwStyle)) - xinc = yinc = 0; + if (wndPtr->flags & WIN_MANAGED) xinc = yinc = 0; else if (HAS_DLGFRAME( wndPtr->dwStyle, wndPtr->dwExStyle )) { xinc = SYSMETRICS_CXDLGFRAME; @@ -240,7 +239,7 @@ void NC_GetInsideRect( HWND hwnd, RECT *rect ) rect->bottom = wndPtr->rectWindow.bottom - wndPtr->rectWindow.top; if (wndPtr->dwStyle & WS_ICONIC) return; /* No border to remove */ - if (IS_MANAGED(wndPtr->dwStyle)) return; + if (wndPtr->flags & WIN_MANAGED) return; /* Remove frame from rectangle */ if (HAS_DLGFRAME( wndPtr->dwStyle, wndPtr->dwExStyle )) @@ -275,86 +274,79 @@ LONG NC_HandleNCHitTest( HWND hwnd, POINT pt ) GetWindowRect( hwnd, &rect ); if (!PtInRect( &rect, pt )) return HTNOWHERE; - /* - * if this is a iconic window, we don't care were the hit - * occured, only that it did occur, just return HTCAPTION - * so the caller knows the icon did get hit - */ - if (IsIconic(hwnd)) - { - return HTCAPTION; /* change this to something meaningful? */ - } + if (wndPtr->dwStyle & WS_MINIMIZE) return HTCAPTION; - /* Check borders */ - if (HAS_THICKFRAME( wndPtr->dwStyle )) + if (!(wndPtr->flags & WIN_MANAGED)) { - InflateRect( &rect, -SYSMETRICS_CXFRAME, -SYSMETRICS_CYFRAME ); - if (wndPtr->dwStyle & WS_BORDER) - InflateRect( &rect, -SYSMETRICS_CXBORDER, -SYSMETRICS_CYBORDER ); - if (!PtInRect( &rect, pt )) - { - /* Check top sizing border */ - if (pt.y < rect.top) - { - if (pt.x < rect.left+SYSMETRICS_CXSIZE) return HTTOPLEFT; - if (pt.x >= rect.right-SYSMETRICS_CXSIZE) return HTTOPRIGHT; - return HTTOP; - } - /* Check bottom sizing border */ - if (pt.y >= rect.bottom) - { - if (pt.x < rect.left+SYSMETRICS_CXSIZE) return HTBOTTOMLEFT; - if (pt.x >= rect.right-SYSMETRICS_CXSIZE) return HTBOTTOMRIGHT; - return HTBOTTOM; - } - /* Check left sizing border */ - if (pt.x < rect.left) - { - if (pt.y < rect.top+SYSMETRICS_CYSIZE) return HTTOPLEFT; - if (pt.y >= rect.bottom-SYSMETRICS_CYSIZE) return HTBOTTOMLEFT; - return HTLEFT; - } - /* Check right sizing border */ - if (pt.x >= rect.right) - { - if (pt.y < rect.top+SYSMETRICS_CYSIZE) return HTTOPRIGHT; - if (pt.y >= rect.bottom-SYSMETRICS_CYSIZE) return HTBOTTOMRIGHT; - return HTRIGHT; - } - } - } - else /* No thick frame */ - { - if (HAS_DLGFRAME( wndPtr->dwStyle, wndPtr->dwExStyle )) - InflateRect(&rect, -SYSMETRICS_CXDLGFRAME, -SYSMETRICS_CYDLGFRAME); - else if (!(IS_MANAGED(wndPtr->dwStyle)) && - (wndPtr->dwStyle & WS_BORDER)) - InflateRect(&rect, -SYSMETRICS_CXBORDER, -SYSMETRICS_CYBORDER); - if (!PtInRect( &rect, pt )) return HTBORDER; - } + /* Check borders */ + if (HAS_THICKFRAME( wndPtr->dwStyle )) + { + InflateRect( &rect, -SYSMETRICS_CXFRAME, -SYSMETRICS_CYFRAME ); + if (wndPtr->dwStyle & WS_BORDER) + InflateRect(&rect, -SYSMETRICS_CXBORDER, -SYSMETRICS_CYBORDER); + if (!PtInRect( &rect, pt )) + { + /* Check top sizing border */ + if (pt.y < rect.top) + { + if (pt.x < rect.left+SYSMETRICS_CXSIZE) return HTTOPLEFT; + if (pt.x >= rect.right-SYSMETRICS_CXSIZE) return HTTOPRIGHT; + return HTTOP; + } + /* Check bottom sizing border */ + if (pt.y >= rect.bottom) + { + if (pt.x < rect.left+SYSMETRICS_CXSIZE) return HTBOTTOMLEFT; + if (pt.x >= rect.right-SYSMETRICS_CXSIZE) return HTBOTTOMRIGHT; + return HTBOTTOM; + } + /* Check left sizing border */ + if (pt.x < rect.left) + { + if (pt.y < rect.top+SYSMETRICS_CYSIZE) return HTTOPLEFT; + if (pt.y >= rect.bottom-SYSMETRICS_CYSIZE) return HTBOTTOMLEFT; + return HTLEFT; + } + /* Check right sizing border */ + if (pt.x >= rect.right) + { + if (pt.y < rect.top+SYSMETRICS_CYSIZE) return HTTOPRIGHT; + if (pt.y >= rect.bottom-SYSMETRICS_CYSIZE) return HTBOTTOMRIGHT; + return HTRIGHT; + } + } + } + else /* No thick frame */ + { + if (HAS_DLGFRAME( wndPtr->dwStyle, wndPtr->dwExStyle )) + InflateRect(&rect, -SYSMETRICS_CXDLGFRAME, -SYSMETRICS_CYDLGFRAME); + else if (wndPtr->dwStyle & WS_BORDER) + InflateRect(&rect, -SYSMETRICS_CXBORDER, -SYSMETRICS_CYBORDER); + if (!PtInRect( &rect, pt )) return HTBORDER; + } - /* Check caption */ + /* Check caption */ - if (!(IS_MANAGED(wndPtr->dwStyle)) && - ((wndPtr->dwStyle & WS_CAPTION) == WS_CAPTION)) - { - rect.top += SYSMETRICS_CYCAPTION - 1; - if (!PtInRect( &rect, pt )) - { - /* Check system menu */ - if (wndPtr->dwStyle & WS_SYSMENU) - rect.left += SYSMETRICS_CXSIZE; - if (pt.x <= rect.left) return HTSYSMENU; - /* Check maximize box */ - if (wndPtr->dwStyle & WS_MAXIMIZEBOX) - rect.right -= SYSMETRICS_CXSIZE + 1; - if (pt.x >= rect.right) return HTMAXBUTTON; - /* Check minimize box */ - if (wndPtr->dwStyle & WS_MINIMIZEBOX) - rect.right -= SYSMETRICS_CXSIZE + 1; - if (pt.x >= rect.right) return HTMINBUTTON; - return HTCAPTION; - } + if ((wndPtr->dwStyle & WS_CAPTION) == WS_CAPTION) + { + rect.top += SYSMETRICS_CYCAPTION - 1; + if (!PtInRect( &rect, pt )) + { + /* Check system menu */ + if (wndPtr->dwStyle & WS_SYSMENU) + rect.left += SYSMETRICS_CXSIZE; + if (pt.x <= rect.left) return HTSYSMENU; + /* Check maximize box */ + if (wndPtr->dwStyle & WS_MAXIMIZEBOX) + rect.right -= SYSMETRICS_CXSIZE + 1; + if (pt.x >= rect.right) return HTMAXBUTTON; + /* Check minimize box */ + if (wndPtr->dwStyle & WS_MINIMIZEBOX) + rect.right -= SYSMETRICS_CXSIZE + 1; + if (pt.x >= rect.right) return HTMINBUTTON; + return HTCAPTION; + } + } } /* Check client area */ @@ -673,31 +665,31 @@ void NC_DoNCPaint( HWND hwnd, BOOL active, BOOL suppress_menupaint ) SelectObject( hdc, sysColorObjects.hpenWindowFrame ); - if (((wndPtr->dwStyle & WS_BORDER) || (wndPtr->dwStyle & WS_DLGFRAME) || - (wndPtr->dwExStyle & WS_EX_DLGMODALFRAME)) && - !(IS_MANAGED(wndPtr->dwStyle))) + if (!(wndPtr->flags & WIN_MANAGED)) { - MoveTo( hdc, 0, 0 ); - LineTo( hdc, rect.right-1, 0 ); - LineTo( hdc, rect.right-1, rect.bottom-1 ); - LineTo( hdc, 0, rect.bottom-1 ); - LineTo( hdc, 0, 0 ); - InflateRect( &rect, -1, -1 ); - } + if ((wndPtr->dwStyle & WS_BORDER) || (wndPtr->dwStyle & WS_DLGFRAME) || + (wndPtr->dwExStyle & WS_EX_DLGMODALFRAME)) + { + MoveTo( hdc, 0, 0 ); + LineTo( hdc, rect.right-1, 0 ); + LineTo( hdc, rect.right-1, rect.bottom-1 ); + LineTo( hdc, 0, rect.bottom-1 ); + LineTo( hdc, 0, 0 ); + InflateRect( &rect, -1, -1 ); + } - if (HAS_DLGFRAME( wndPtr->dwStyle, wndPtr->dwExStyle )) - NC_DrawFrame( hdc, &rect, TRUE, active ); - else if ((wndPtr->dwStyle & WS_THICKFRAME) && - !(IS_MANAGED(wndPtr->dwStyle))) - NC_DrawFrame(hdc, &rect, FALSE, active ); + if (HAS_DLGFRAME( wndPtr->dwStyle, wndPtr->dwExStyle )) + NC_DrawFrame( hdc, &rect, TRUE, active ); + else if (wndPtr->dwStyle & WS_THICKFRAME) + NC_DrawFrame(hdc, &rect, FALSE, active ); - if (((wndPtr->dwStyle & WS_CAPTION) == WS_CAPTION) && - !(IS_MANAGED(wndPtr->dwStyle))) - { - RECT r = rect; - r.bottom = rect.top + SYSMETRICS_CYSIZE; - rect.top += SYSMETRICS_CYSIZE + SYSMETRICS_CYBORDER; - NC_DrawCaption( hdc, &r, hwnd, wndPtr->dwStyle, active ); + if ((wndPtr->dwStyle & WS_CAPTION) == WS_CAPTION) + { + RECT r = rect; + r.bottom = rect.top + SYSMETRICS_CYSIZE; + rect.top += SYSMETRICS_CYSIZE + SYSMETRICS_CYBORDER; + NC_DrawCaption( hdc, &r, hwnd, wndPtr->dwStyle, active ); + } } if (HAS_MENU(wndPtr)) @@ -913,7 +905,8 @@ static void NC_DoSizeMove( HWND hwnd, WORD wParam, POINT pt ) POINT minTrack, maxTrack, capturePoint = pt; WND * wndPtr = WIN_FindWndPtr( hwnd ); - if (IsZoomed(hwnd) || !IsWindowVisible(hwnd)) return; + if (IsZoomed(hwnd) || !IsWindowVisible(hwnd) || + (wndPtr->flags & WIN_MANAGED)) return; hittest = wParam & 0x0f; thickframe = HAS_THICKFRAME( wndPtr->dwStyle ); diff --git a/windows/painting.c b/windows/painting.c index 014426df0a0..18d6e3c67ba 100644 --- a/windows/painting.c +++ b/windows/painting.c @@ -68,9 +68,10 @@ HDC BeginPaint( HWND hwnd, LPPAINTSTRUCT lps ) /*********************************************************************** * EndPaint (USER.40) */ -void EndPaint( HWND hwnd, LPPAINTSTRUCT lps ) +BOOL EndPaint( HWND hwnd, const PAINTSTRUCT* lps ) { ReleaseDC( hwnd, lps->hdc ); + return TRUE; } diff --git a/windows/property.c b/windows/property.c index 92d1748f660..ef6a323c159 100644 --- a/windows/property.c +++ b/windows/property.c @@ -113,7 +113,7 @@ HANDLE RemoveProp( HWND hwnd, SEGPTR str ) /*********************************************************************** * EnumProps (USER.27) */ -int EnumProps( HWND hwnd, FARPROC func ) +INT EnumProps( HWND hwnd, PROPENUMPROC func ) { int ret = -1; HANDLE hProp; diff --git a/windows/scroll.c b/windows/scroll.c index 9c5ad2bf982..d69f5b7f7a6 100644 --- a/windows/scroll.c +++ b/windows/scroll.c @@ -268,6 +268,8 @@ BOOL ScrollDC(HDC hdc, short dx, short dy, LPRECT rc, LPRECT cliprc, hrgn2 = CreateRectRgn(0, 0, 0, 0); RgnType = CombineRgn(hrgnUpdate, hrgn1, hrgn2, RGN_OR); + DeleteObject(hrgn1); + DeleteObject(hrgn2); } if (rcUpdate) GetRgnBox( hrgnUpdate, rcUpdate ); diff --git a/windows/win.c b/windows/win.c index d9aaa3ab764..456b76282e7 100644 --- a/windows/win.c +++ b/windows/win.c @@ -444,14 +444,18 @@ HWND CreateWindowEx( DWORD exStyle, SEGPTR className, SEGPTR windowName, if (!(style & WS_CHILD) && (rootWindow == DefaultRootWindow(display))) { - if(Options.managed && className != POPUPMENU_CLASS_ATOM) { + if (Options.managed && ((style & (WS_DLGFRAME | WS_THICKFRAME)) || + (exStyle & WS_EX_DLGMODALFRAME))) + { win_attr.event_mask = ExposureMask | KeyPressMask | KeyReleaseMask | PointerMotionMask | ButtonPressMask | ButtonReleaseMask | FocusChangeMask | StructureNotifyMask; win_attr.override_redirect = FALSE; + wndPtr->flags |= WIN_MANAGED; } - else { + else + { win_attr.event_mask = ExposureMask | KeyPressMask | KeyReleaseMask | PointerMotionMask | ButtonPressMask | ButtonReleaseMask | @@ -1079,7 +1083,7 @@ HWND GetLastActivePopup(HWND hwnd) /******************************************************************* * EnumWindows (USER.54) */ -BOOL EnumWindows( FARPROC lpEnumFunc, LPARAM lParam ) +BOOL EnumWindows( WNDENUMPROC lpEnumFunc, LPARAM lParam ) { HWND hwnd; WND *wndPtr; @@ -1125,7 +1129,7 @@ BOOL EnumWindows( FARPROC lpEnumFunc, LPARAM lParam ) /********************************************************************** * EnumTaskWindows (USER.225) */ -BOOL EnumTaskWindows( HTASK hTask, FARPROC lpEnumFunc, LONG lParam ) +BOOL EnumTaskWindows( HTASK hTask, WNDENUMPROC lpEnumFunc, LPARAM lParam ) { HWND hwnd; WND *wndPtr; @@ -1200,7 +1204,7 @@ static BOOL WIN_EnumChildWin(HWND hwnd, FARPROC wndenumprc, LPARAM lParam) * * o calls WIN_EnumChildWin to do a recursive decent of child windows */ -BOOL EnumChildWindows(HWND hwnd, FARPROC wndenumprc, LPARAM lParam) +BOOL EnumChildWindows(HWND hwnd, WNDENUMPROC wndenumprc, LPARAM lParam) { WND *wndPtr; diff --git a/windows/winpos.c b/windows/winpos.c index 04dcb66ee8b..683bde0ebc4 100644 --- a/windows/winpos.c +++ b/windows/winpos.c @@ -167,73 +167,83 @@ void ScreenToClient( HWND hwnd, LPPOINT lppnt ) } -/******************************************************************* - * WINPOS_WindowFromPoint +/*********************************************************************** + * WINPOS_WindowFromPoint * - * The Right Thing + * Find the window and hittest for a given point. */ -HWND WINPOS_WindowFromPoint( HWND hScope, POINT pt, WORD* lpht ) +INT WINPOS_WindowFromPoint( POINT pt, HWND *phwnd ) { - WORD wRet; - WND* wndPtr = WIN_FindWndPtr( hScope ); + WND *wndPtr; + HWND hwnd; + INT hittest = HTERROR; + INT x, y; - if( !wndPtr || !(wndPtr->dwStyle & WS_VISIBLE) ) return 0; + *phwnd = 0; + x = pt.x; + y = pt.y; + hwnd = GetWindow( GetDesktopWindow(), GW_CHILD ); + for (;;) + { + while (hwnd) + { + /* If point is in window, and window is visible, and it */ + /* is enabled (or it's a top-level window), then explore */ + /* its children. Otherwise, go to the next window. */ - if ((pt.x < wndPtr->rectWindow.left) || - (pt.x >= wndPtr->rectWindow.right) || - (pt.y < wndPtr->rectWindow.top) || - (pt.y >= wndPtr->rectWindow.bottom)) return 0; + wndPtr = WIN_FindWndPtr( hwnd ); + if ((wndPtr->dwStyle & WS_VISIBLE) && + (!(wndPtr->dwStyle & WS_DISABLED) || + ((wndPtr->dwStyle & (WS_POPUP | WS_CHILD)) != WS_CHILD)) && + (x >= wndPtr->rectWindow.left) && + (x < wndPtr->rectWindow.right) && + (y >= wndPtr->rectWindow.top) && + (y < wndPtr->rectWindow.bottom)) + { + *phwnd = hwnd; /* Got a suitable window */ - /* pt is inside hScope window */ + /* If window is minimized or disabled, return at once */ + if (wndPtr->dwStyle & WS_MINIMIZE) return HTCAPTION; + if (wndPtr->dwStyle & WS_DISABLED) return HTERROR; - if( wndPtr->dwStyle & WS_DISABLED ) - if( wndPtr->dwStyle & (WS_POPUP | WS_CHILD) == WS_CHILD ) - return 0; - else - { - if( lpht ) *lpht = HTERROR; - return hScope; - } + /* If point is not in client area, ignore the children */ + if ((x < wndPtr->rectClient.left) || + (x >= wndPtr->rectClient.right) || + (y < wndPtr->rectClient.top) || + (y >= wndPtr->rectClient.bottom)) break; - if( wndPtr->dwStyle & WS_MINIMIZE ) - { - if( lpht ) *lpht = HTCAPTION; - return hScope; - } + x -= wndPtr->rectClient.left; + y -= wndPtr->rectClient.top; + hwnd = wndPtr->hwndChild; + } + else hwnd = wndPtr->hwndNext; + } - if( PtInRect(&wndPtr->rectClient, pt)) - { - /* look among children */ - HWND hwnd = wndPtr->hwndChild; - WND* wndChild = WIN_FindWndPtr(hwnd); - POINT ptChild = { pt.x - wndPtr->rectClient.left, - pt.y - wndPtr->rectClient.top }; + /* If nothing found, return the desktop window */ + if (!*phwnd) + { + *phwnd = GetDesktopWindow(); + return HTCLIENT; + } + wndPtr = WIN_FindWndPtr( *phwnd ); - while( wndChild ) - { - if( (hwnd = WINPOS_WindowFromPoint(hwnd, ptChild, lpht)) ) - return hwnd; + /* Send the WM_NCHITTEST message (only if to the same task) */ + if (wndPtr->hmemTaskQ != GetTaskQueue(0)) return HTCLIENT; + hittest = (INT)SendMessage( *phwnd, WM_NCHITTEST, 0, + MAKELONG( pt.x, pt.y ) ); + if (hittest != HTTRANSPARENT) return hittest; /* Found the window */ - hwnd = wndChild->hwndNext; - wndChild = WIN_FindWndPtr( hwnd ); - } - } + /* If no children found in last search, make point relative to parent*/ + if (!hwnd) + { + x += wndPtr->rectClient.left; + y += wndPtr->rectClient.top; + } - /* don't do intertask sendmessage */ - if( wndPtr->hmemTaskQ == GetTaskQueue(0) ) - { - if( wndPtr->dwStyle & WS_CHILD ) - MapWindowPoints( hScope, GetDesktopWindow(), &pt, 1); - - wRet = SendMessage( hScope, WM_NCHITTEST, 0, MAKELONG( pt.x, pt.y )); - if( wRet == (WORD)HTTRANSPARENT ) - return 0; - } - else - wRet = HTCLIENT; - - if( lpht ) *lpht = wRet; - return hScope; + /* Restart the search from the next sibling */ + hwnd = wndPtr->hwndNext; + *phwnd = wndPtr->hwndParent; + } } @@ -242,7 +252,9 @@ HWND WINPOS_WindowFromPoint( HWND hScope, POINT pt, WORD* lpht ) */ HWND WindowFromPoint( POINT pt ) { - return WINPOS_WindowFromPoint( GetDesktopWindow(), pt , NULL ); + HWND hwnd; + WINPOS_WindowFromPoint( pt, &hwnd ); + return hwnd; } @@ -705,7 +717,7 @@ BOOL WINPOS_SetActiveWindow( HWND hWnd, BOOL fMouse, BOOL fChangeFocus ) RedrawIconTitle(hwndPrevActive); } */ - if (!(wndPtr->dwStyle & WS_CHILD) ) + if (!(wndPtr->dwStyle & WS_CHILD)) { /* check Z-order and bring hWnd to the top */ wndTemp = WIN_FindWndPtr( GetDesktopWindow() ); @@ -1099,9 +1111,9 @@ BOOL SetWindowPos( HWND hwnd, HWND hwndInsertAfter, INT x, INT y, result = WINPOS_SendNCCalcSize( winpos.hwnd, TRUE, &newWindowRect, &wndPtr->rectWindow, &wndPtr->rectClient, &winpos, &newClientRect ); - /* .... Should handle result here */ + /* FIXME: Should handle result here */ - /* Perform the moving and resizing */ + /* Perform the moving and resizing */ if (wndPtr->window) { @@ -1249,7 +1261,7 @@ HDWP BeginDeferWindowPos( INT count ) * DeferWindowPos (USER.260) */ HDWP DeferWindowPos( HDWP hdwp, HWND hwnd, HWND hwndAfter, INT x, INT y, - INT cx, INT cy, WORD flags ) + INT cx, INT cy, UINT flags ) { DWP *pDWP; int i; diff --git a/wine.man b/wine.man index 11a4ad8b6ca..6ac862910c0 100644 --- a/wine.man +++ b/wine.man @@ -74,7 +74,7 @@ Enter the debugger before starting application .I -language xx Set the language to .I xx -(one of En, Es, De, No, Fr, Fi, Da) +(one of En, Es, De, No, Fr, Fi, Da Cz) .TP .I -managed Create each top-level window as a properly managed X window