Release 940518
Tue May 17 23:03:16 1994 Bob Amstadt (bob@pooh)
* [windows/dce.c]
Fixed bug with dce initialization that was causing dialog boxes to not
be displayed.
* [if1632/callback.c]
Better fix for bug found by Martin.
Sat May 14 19:48:39 1994 Rick Sladkey (jrs@world.std.com)
* [ memory/heap.c ]
Redirect HEAP_ReAlloc calls with NULL argument to HEAP_Alloc.
May 16, 94 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte)
* [objects/font.c]
Make EnumFonts() calling a callback with dummy fonts ... :-)
* [objects/text.c]
Add Empty Stub for ExtTextOut(), which temporarely call Textout().
* [if1632/callback.c]
Temporarely go around bug in CallWindowProc(), you will see printfs.
* [controls/edit.c]
Make EDIT controls focused by a mouse click.
* [misc/property.c]
Bug Fix in function EnumProps(), better use of CallBack16().
* [misc/mmsystem.c]
Basic Skelton's for MCI messages dispatching function.
Sun May 15 16:15:17 1994 Erik Bos (erik@hacktic.nl)
* [windows/utility.c]
Added windows_wsprintf() for the emulator, wsprintf() is
for libwine.
Sat May 14 22:16:40 1994 Rick Sladkey (jrs@world.std.com)
* [misc/cursor.c]
Fix pointer problems in LoadCursor leading to heap corruption.
* [ controls/menu.c ]
Fix two NULL dereferencing bugs.
Sun May 15 20:07:48 1994 Rick Sladkey (jrs@world.std.com)
* [objects/font.c]
Fix NULL pointer dereferencing bug in GetCharWidth.
* [loader/resource.c]
Fix under-allocation of memory in LoadAccelerators.
* [windows/class.c]
Ignore negative sizes for extra fields in RegisterClass.
Sun May 15 06:35:03 1994 David Metcalfe <david@prism.demon.co.uk>
* [objects/metafile.c] [include/metafile.h] [include/windows.h]
[objects/gdiobj.c] [objects/brush.c] [objects/pen.c]
[objects/text.c] [objects/dcvalues.c] [windows/graphics.c]
[windows/dc.c] [windows/mapping.c]
Beginnings of metafile support.
* [misc/file.c]
Corrected spelling of _lcreat.
* [controls/edit.c]
Minor bug fixes.
diff --git a/ChangeLog b/ChangeLog
index ed79d40..ed36b23 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,77 @@
----------------------------------------------------------------------
+Tue May 17 23:03:16 1994 Bob Amstadt (bob@pooh)
+
+ * [windows/dce.c]
+ Fixed bug with dce initialization that was causing dialog boxes to not
+ be displayed.
+
+ * [if1632/callback.c]
+ Better fix for bug found by Martin.
+
+Sat May 14 19:48:39 1994 Rick Sladkey (jrs@world.std.com)
+
+ * [ memory/heap.c ]
+ Redirect HEAP_ReAlloc calls with NULL argument to HEAP_Alloc.
+
+May 16, 94 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte)
+
+ * [objects/font.c]
+ Make EnumFonts() calling a callback with dummy fonts ... :-)
+
+ * [objects/text.c]
+ Add Empty Stub for ExtTextOut(), which temporarely call Textout().
+
+ * [if1632/callback.c]
+ Temporarely go around bug in CallWindowProc(), you will see printfs.
+
+ * [controls/edit.c]
+ Make EDIT controls focused by a mouse click.
+
+ * [misc/property.c]
+ Bug Fix in function EnumProps(), better use of CallBack16().
+
+ * [misc/mmsystem.c]
+ Basic Skelton's for MCI messages dispatching function.
+
+Sun May 15 16:15:17 1994 Erik Bos (erik@hacktic.nl)
+
+ * [windows/utility.c]
+ Added windows_wsprintf() for the emulator, wsprintf() is
+ for libwine.
+
+Sat May 14 22:16:40 1994 Rick Sladkey (jrs@world.std.com)
+
+ * [misc/cursor.c]
+ Fix pointer problems in LoadCursor leading to heap corruption.
+
+ * [ controls/menu.c ]
+ Fix two NULL dereferencing bugs.
+
+Sun May 15 20:07:48 1994 Rick Sladkey (jrs@world.std.com)
+
+ * [objects/font.c]
+ Fix NULL pointer dereferencing bug in GetCharWidth.
+
+ * [loader/resource.c]
+ Fix under-allocation of memory in LoadAccelerators.
+
+ * [windows/class.c]
+ Ignore negative sizes for extra fields in RegisterClass.
+
+Sun May 15 06:35:03 1994 David Metcalfe <david@prism.demon.co.uk>
+
+ * [objects/metafile.c] [include/metafile.h] [include/windows.h]
+ [objects/gdiobj.c] [objects/brush.c] [objects/pen.c]
+ [objects/text.c] [objects/dcvalues.c] [windows/graphics.c]
+ [windows/dc.c] [windows/mapping.c]
+ Beginnings of metafile support.
+
+ * [misc/file.c]
+ Corrected spelling of _lcreat.
+
+ * [controls/edit.c]
+ Minor bug fixes.
+----------------------------------------------------------------------
May 9, 94 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte)
* [controls/scroll.c]
diff --git a/Imakefile b/Imakefile
index 5f12665..f87fc8f 100644
--- a/Imakefile
+++ b/Imakefile
@@ -61,6 +61,7 @@
debugger.o \
memory.o \
miscemu.o \
+ opcodes.o \
readline.o
LIBOBJS = \
@@ -97,3 +98,6 @@
depend::
install::
+
+etags::
+ etags `find . -name '*.[chS]'`
\ No newline at end of file
diff --git a/README b/README
index 40aadbc..1d735be 100644
--- a/README
+++ b/README
@@ -171,6 +171,13 @@
7. WHAT'S NEW
+WHAT'S NEW with Wine-940518: (see ChangeLog for details)
+ - debugger improvements
+ - bug fixes to get some dialog boxes working.
+ - skeleton for passing MCI functions.
+ - beginnings of metafile support.
+ - and many many bug fixes!
+
WHAT'S NEW with Wine-940510: (see ChangeLog for details)
- debugger improvements
- mmsystem
diff --git a/controls/edit.c b/controls/edit.c
index 55678c0..5528247 100644
--- a/controls/edit.c
+++ b/controls/edit.c
@@ -309,6 +309,7 @@
break;
case WM_KEYDOWN:
+ printf("EDIT WM_KEYDOWN w=%04X !\n", wParam);
EDIT_KeyDownMsg(hwnd, wParam);
break;
@@ -319,6 +320,7 @@
case WM_LBUTTONDOWN:
HideCaret(hwnd);
+ SetFocus(hwnd);
EDIT_LButtonDownMsg(hwnd, wParam, lParam);
SetCaretPos(es->WndCol, es->WndRow * es->txtht);
ShowCaret(hwnd);
@@ -2043,8 +2045,6 @@
WND *wndPtr = WIN_FindWndPtr(hwnd);
EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
- if ((short)(lParam) < 0 || (short)(lParam >> 16) < 0)
- return;
so = LOWORD(lParam);
eo = HIWORD(lParam);
if (so > eo)
@@ -2343,7 +2343,7 @@
WND *wndPtr = WIN_FindWndPtr(hwnd);
EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
- if (wParam == 0xffff) /* really -1 */
+ if (wParam == (WORD)-1)
return (LONG)(es->SelBegLine);
else
EDIT_GetLineCol(hwnd, wParam, &row, &col);
@@ -2362,7 +2362,7 @@
EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
unsigned int *textPtrs = (unsigned int *)EDIT_HEAP_ADDR(es->hTextPtrs);
- if (wParam == 0xffff) /* really -1 */
+ if (wParam == (WORD)-1)
wParam = es->CurrLine;
return (LONG)(*(textPtrs + wParam));
diff --git a/controls/menu.c b/controls/menu.c
index 9ef90f41..e41c968 100644
--- a/controls/menu.c
+++ b/controls/menu.c
@@ -502,46 +502,53 @@
void MenuMouseMove(HWND hWnd, LPPOPUPMENU lppop, WORD wParam, int x, int y)
{
- HDC hDC;
- RECT rect;
- HMENU hSubMenu;
- LPMENUITEM lpitem, lpitem2;
- LPPOPUPMENU lppop2;
- WORD wRet;
-/* if ((wParam & MK_LBUTTON) != 0) { */
- if (GetKeyState(VK_LBUTTON) != 0) {
- lpitem = MenuFindItem(lppop, x, y, &wRet);
+ HDC hDC;
+ RECT rect;
+ HMENU hSubMenu;
+ LPMENUITEM lpitem, lpitem2;
+ LPPOPUPMENU lppop2;
+ WORD wRet;
+
+ if (GetKeyState(VK_LBUTTON) != 0)
+ {
+ lpitem = MenuFindItem(lppop, x, y, &wRet);
#ifdef DEBUG_MENU
- printf("MenuMouseMove // x=%d y=%d // wRet=%d lpitem=%08X !\n",
- x, y, wRet, lpitem);
+ printf("MenuMouseMove // x=%d y=%d // wRet=%d lpitem=%08X !\n",
+ x, y, wRet, lpitem);
#endif
- if ((lpitem != NULL) && (lppop->FocusedItem != wRet)) {
- lpitem2 = GetMenuItemPtr(lppop, lppop->FocusedItem);
- hDC = GetWindowDC(hWnd);
- if ((lpitem2->item_flags & MF_POPUP) == MF_POPUP) {
- HideAllSubPopupMenu(lppop);
- }
- MenuItemSelect(hWnd, lppop, wRet);
- if ((lpitem->item_flags & MF_POPUP) == MF_POPUP) {
- hSubMenu = (HMENU)lpitem->item_id;
- lppop2 = (LPPOPUPMENU) GlobalLock(hSubMenu);
- if (lppop2 == NULL) {
- ReleaseDC(hWnd, hDC);
- return;
- }
- if (lppop->BarFlag) {
- lppop2->hWndParent = hWnd;
- GetWindowRect(hWnd, &rect);
- rect.top += lppop->rect.bottom;
- TrackPopupMenu(hSubMenu, TPM_LEFTBUTTON,
- rect.left + lpitem->rect.left, rect.top,
- 0, lppop->ownerWnd, (LPRECT)NULL);
- }
- GlobalUnlock(hSubMenu);
- }
- ReleaseDC(hWnd, hDC);
- }
+ if ((lpitem != NULL) && (lppop->FocusedItem != wRet))
+ {
+ lpitem2 = GetMenuItemPtr(lppop, lppop->FocusedItem);
+ hDC = GetWindowDC(hWnd);
+ if ((lpitem2 != NULL ) &&
+ (lpitem2->item_flags & MF_POPUP) == MF_POPUP)
+ {
+ HideAllSubPopupMenu(lppop);
+ }
+ MenuItemSelect(hWnd, lppop, wRet);
+ if ((lpitem->item_flags & MF_POPUP) == MF_POPUP)
+ {
+ hSubMenu = (HMENU)lpitem->item_id;
+ lppop2 = (LPPOPUPMENU) GlobalLock(hSubMenu);
+ if (lppop2 == NULL)
+ {
+ ReleaseDC(hWnd, hDC);
+ return;
}
+ if (lppop->BarFlag)
+ {
+ lppop2->hWndParent = hWnd;
+ GetWindowRect(hWnd, &rect);
+ rect.top += lppop->rect.bottom;
+ TrackPopupMenu(hSubMenu, TPM_LEFTBUTTON,
+ rect.left + lpitem->rect.left, rect.top,
+ 0, lppop->ownerWnd, (LPRECT)NULL);
+ }
+ GlobalUnlock(hSubMenu);
+ }
+ ReleaseDC(hWnd, hDC);
+ }
+ }
}
@@ -562,38 +569,46 @@
void MenuItemSelect0(HWND hWnd, LPPOPUPMENU lppop,
LPMENUITEM lpitem, WORD wIndex)
{
- LPMENUITEM lpprev;
- if (lppop == NULL) return;
- if (lppop->FocusedItem != (WORD)-1) {
- lpprev = GetMenuItemPtr(lppop, lppop->FocusedItem);
- if (lpprev != NULL) {
- lpprev->item_flags &= MF_HILITE ^ 0xFFFF;
- if ((lpprev->item_flags & MF_POPUP) == MF_POPUP)
- HideAllSubPopupMenu(lppop);
- if (lppop->BarFlag)
- DrawMenuBar(hWnd);
- else {
- InvalidateRect(hWnd, &lpprev->rect, TRUE);
- UpdateWindow(hWnd);
- }
- }
- }
+ LPMENUITEM lpprev;
+
+ if (lppop == NULL)
+ return;
+ if (lppop->FocusedItem != (WORD)-1)
+ {
+ lpprev = GetMenuItemPtr(lppop, lppop->FocusedItem);
+ if (lpprev != NULL)
+ {
+ lpprev->item_flags &= MF_HILITE ^ 0xFFFF;
+ if ((lpprev->item_flags & MF_POPUP) == MF_POPUP)
+ HideAllSubPopupMenu(lppop);
+ if (lppop->BarFlag)
+ DrawMenuBar(hWnd);
+ else
+ {
+ InvalidateRect(hWnd, &lpprev->rect, TRUE);
+ UpdateWindow(hWnd);
+ }
+ }
+ }
lppop->FocusedItem = wIndex;
- if (lpitem == NULL || wIndex == (WORD)-1) {
- ResetHiliteFlags(lppop);
- if (lppop->BarFlag) DrawMenuBar(hWnd);
- }
- else {
- lpitem->item_flags |= MF_HILITE;
- if (lppop->BarFlag)
- DrawMenuBar(hWnd);
- else {
- InvalidateRect(hWnd, &lpitem->rect, TRUE);
- UpdateWindow(hWnd);
- }
- }
+ if (lpitem == NULL || wIndex == (WORD)-1)
+ {
+ ResetHiliteFlags(lppop);
+ if (lppop->BarFlag) DrawMenuBar(hWnd);
+ }
+ else
+ {
+ lpitem->item_flags |= MF_HILITE;
+ if (lppop->BarFlag)
+ DrawMenuBar(hWnd);
+ else
+ {
+ InvalidateRect(hWnd, &lpitem->rect, TRUE);
+ UpdateWindow(hWnd);
+ }
SendMessage(hWnd, WM_MENUSELECT, lpitem->item_id,
- MAKELONG(0, lpitem->item_flags));
+ MAKELONG(0, lpitem->item_flags));
+ }
}
@@ -1984,7 +1999,6 @@
return FALSE;
}
lpmenu->ownerWnd = hWnd;
- printf("SetMenu(%04X, %04X) // %04X\n", hWnd, hMenu, lpmenu->ownerWnd);
ResetHiliteFlags(lpmenu);
if (GetCapture() == hWnd) ReleaseCapture();
GlobalUnlock(hMenu);
diff --git a/debugger/Imakefile b/debugger/Imakefile
index 5958e7d..8f4d8a7 100644
--- a/debugger/Imakefile
+++ b/debugger/Imakefile
@@ -5,32 +5,23 @@
MODULE = debugger
-SUBDIRS = readline
+SUBDIRS = opcodes readline
-DEFINES = -DUSE_READLINE
-
-/* Quick and dirt hack, since i386 is defined as 1. sigh */
-#define temp i386
-#undef i386
+DEFINES = -DUSE_READLINE -Iopcodes
SRCS = \
dbg.tab.c \
break.c \
hash.c \
lex.yy.c \
- info.c \
- i386-pinsn.c
+ info.c
OBJS = \
dbg.tab.o \
break.o \
hash.o \
lex.yy.o \
- info.o \
- i386-pinsn.o
-
-#define i386 temp
-#undef temp
+ info.o
/*
* All the SUBDIR stuff
diff --git a/debugger/dbg.y b/debugger/dbg.y
index 7dea72f..e99e218 100644
--- a/debugger/dbg.y
+++ b/debugger/dbg.y
@@ -19,7 +19,8 @@
unsigned int dbg_mask = 0;
unsigned int dbg_mode = 0;
-void issue_prompt();
+void issue_prompt(void);
+void mode_command(int);
%}
@@ -50,7 +51,7 @@
line: '\n'
| infocmd '\n'
- | error '\n' {yyerrok; }
+ | error '\n' { yyerrok; }
| QUIT '\n' { exit(0); };
| HELP '\n' { dbg_help(); };
| CONT '\n' { return; };
@@ -161,6 +162,7 @@
dbg_mode = 16;
};
#endif
+ fprintf(stderr,"In %d bit mode.\n", dbg_mode);
/* This is intended to read the entry points from the Windows image, and
insert them in the hash table. It does not work yet, so it is commented out. */
diff --git a/debugger/info.c b/debugger/info.c
index 0a98d89..b4b2358 100644
--- a/debugger/info.c
+++ b/debugger/info.c
@@ -5,33 +5,23 @@
*/
#include <stdio.h>
+#include "opcodes/dis-asm.h"
#include "regpos.h"
extern int * regval;
extern unsigned int dbg_mask;
extern unsigned int dbg_mode;
-extern int print_insn(char * memaddr, char * realaddr, FILE * stream, int addrlen);
-
-/* THese three helper functions eliminate the need for patching the
-module from gdb for disassembly of code */
-
void application_not_running()
{
fprintf(stderr,"Application not running\n");
}
-void read_memory(char * memaddr, char * buffer, int len){
- memcpy(buffer, memaddr, len);
-}
-
-void fputs_filtered(char * buffer, FILE * outfile){
- fputs(buffer, outfile);
-}
-
void print_address(unsigned int addr, FILE * outfile){
char * name;
- name = find_nearest_symbol(addr);
+ extern char * find_nearest_symbol(unsigned int *);
+
+ name = find_nearest_symbol((unsigned int *) addr);
if(name)
fprintf(outfile,"0x%8.8x(%s)", addr, name);
else
@@ -39,12 +29,36 @@
}
+void print_address_info(bfd_vma addr, disassemble_info * info){
+ print_address((unsigned int) addr, info->stream);
+}
+
+int print_insn(char *realmemaddr, char *memaddr, FILE *stream, int addrlen){
+ static disassemble_info info;
+ static int initialized = 0;
+
+ if (!initialized) {
+ INIT_DISASSEMBLE_INFO(info, stderr);
+ info.print_address_func = print_address_info;
+ initialized = 1;
+ }
+ info.stream = stream;
+ info.buffer = memaddr;
+ info.buffer_vma = (bfd_vma) realmemaddr;
+ info.buffer_length = 1024;
+ if (addrlen == 16)
+ return print_insn_i286((bfd_vma) realmemaddr, &info);
+ if (addrlen == 32)
+ return print_insn_i386((bfd_vma) realmemaddr, &info);
+ fprintf(stderr, "invalid address length %d.\n", addrlen);
+ return 0;
+}
void info_reg(){
if(!regval) {
application_not_running();
- return 0;
+ return;
}
fprintf(stderr,"Register dump:\n");
@@ -73,7 +87,7 @@
if(!regval) {
application_not_running();
- return 0;
+ return;
}
fprintf(stderr,"Stack dump:\n");
@@ -234,10 +248,7 @@
"",
"The disassembly code seems to work most of the time, but it does get",
"a little confused at times. The 16 bit mode probably has not been used",
-"much so there are probably bugs. I snagged the file from the gdb-4.7",
-"source tree, which is what was on my latest cdrom. I should check to see",
-"if newer versions of gdb have anything substanitally different for the",
-"disassembler.",
+"much so there are probably bugs.",
"",
NULL};
@@ -271,7 +282,7 @@
if(!regval) {
application_not_running();
- return 0;
+ return;
}
fprintf(stderr,"Backtrace:\n");
diff --git a/if1632/callback.c b/if1632/callback.c
index ac2ab9f..02f5cda 100644
--- a/if1632/callback.c
+++ b/if1632/callback.c
@@ -1,6 +1,8 @@
static char RCSId[] = "$Id: wine.c,v 1.2 1993/07/04 04:04:21 root Exp root $";
static char Copyright[] = "Copyright Robert J. Amstadt, 1993";
+#include <stdio.h>
+#include <stdlib.h>
#include "windows.h"
#include "callback.h"
#include "wine.h"
@@ -143,9 +145,39 @@
WORD wParam, LONG lParam )
{
SpyMessage(hwnd, message, wParam, lParam);
-
- if (Is16bitAddress(func))
+
+ if (HIWORD((LONG)func) == WINE_CODE_SELECTOR)
+ {
+ static struct dll_table_entry_s *user_tab = NULL;
+ void *address = (void *) ((LONG) func & 0xffff);
+
+ if (user_tab == NULL)
+ user_tab = FindDLLTable("USER");
+
+ /* DefWindowProc */
+ if (user_tab[104].address == address)
+ return DefWindowProc(hwnd, message, wParam, lParam);
+
+ /* DefDlgProc */
+ else if (user_tab[308].address == address)
+ return DefDlgProc(hwnd, message, wParam, lParam);
+
+ /* DefMDIChildProc */
+ else if (user_tab[447].address == address)
+ return DefMDIChildProc(hwnd, message, wParam, lParam);
+
+ /* default */
+ else
+ {
+ fprintf(stderr, "wine: Unknown wine callback %08x\n", func);
+ exit(1);
+ }
+ }
+ else if (Is16bitAddress(func))
{
+#ifdef DEBUG_CALLBACK
+ printf("CallWindowProc // 16bit func=%08X !\n", func);
+#endif
PushOn16( CALLBACK_SIZE_WORD, hwnd );
PushOn16( CALLBACK_SIZE_WORD, message );
PushOn16( CALLBACK_SIZE_WORD, wParam );
@@ -155,6 +187,9 @@
}
else
{
+#ifdef DEBUG_CALLBACK
+ printf("CallWindowProc // 32bit func=%08X !\n", func);
+#endif
return (*func)(hwnd, message, wParam, lParam);
}
}
diff --git a/if1632/gdi.spec b/if1632/gdi.spec
index 9a87ccc..10c2ba9 100644
--- a/if1632/gdi.spec
+++ b/if1632/gdi.spec
@@ -129,9 +129,9 @@
#122 pascal ReSurRection
#123 pascal PlayMetaFile
#124 pascal GetMetaFile
-#125 pascal CreateMetaFile
-#126 pascal CloseMetaFile
-#127 pascal DeleteMetaFile
+125 pascal CreateMetaFile(ptr) CreateMetaFile(1)
+126 pascal CloseMetaFile(word) CloseMetaFile(1)
+127 pascal DeleteMetaFile(word) DeleteMetaFile(1)
128 pascal MulDiv(s_word s_word s_word) MulDiv(1 2 3)
129 pascal SaveVisRgn(word) SaveVisRgn(1)
130 pascal RestoreVisRgn(word) RestoreVisRgn(1)
@@ -219,7 +219,7 @@
#312 pascal CONVERTOUTLINEFONTFILE
#313 pascal GETRASTERIZERCAPS
#314 pascal ENGINEEXTTEXTOUT
-#330 pascal ENUMFONTFAMILIES
+330 pascal EnumFontFamilies(word ptr ptr ptr) EnumFontFamilies(1 2 3 4)
#332 pascal GETKERNINGPAIRS
345 pascal GetTextAlign(word) GetTextAlign(1)
346 pascal SetTextAlign(word word) SetTextAlign(1 2)
@@ -227,7 +227,8 @@
Chord(1 2 3 4 5 6 7 8 9)
349 pascal SetMapperFlags(word word) SetMapperFlags(1 2)
350 pascal GetCharWidth(word word word ptr) GetCharWidth(1 2 3 4)
-#351 pascal EXTTEXTOUT
+351 pascal ExtTextOut(word s_word s_word word ptr ptr s_word ptr)
+ ExtTextOut(1 2 3 4 5 6 7 8)
#352 pascal GETPHYSICALFONTHANDLE
#353 pascal GETASPECTRATIOFILTER
#354 pascal SHRINKGDIHEAP
diff --git a/if1632/kernel.spec b/if1632/kernel.spec
index 0744f78..2f00be8 100644
--- a/if1632/kernel.spec
+++ b/if1632/kernel.spec
@@ -81,7 +81,7 @@
#80 RESERVED4
81 pascal _lclose(word) _lclose(1)
82 pascal _lread(word ptr word) _lread(1 2 3)
-83 pascal _lcreate(ptr word) _lcreate(1 2)
+83 pascal _lcreat(ptr word) _lcreat(1 2)
84 pascal _llseek(word long word) _llseek(1 2 3)
85 pascal _lopen(ptr word) _lopen(1 2)
86 pascal _lwrite(word ptr word) _lwrite(1 2 3)
diff --git a/if1632/pop.h b/if1632/pop.h
new file mode 100644
index 0000000..ff2d961
--- /dev/null
+++ b/if1632/pop.h
@@ -0,0 +1,16 @@
+ add $8,%esp
+ popw %es
+ add $2,%esp
+ popw %ds
+ add $2,%esp
+ popl %edi
+ popl %esi
+ popl %ebp
+ add $4,%esp
+ popl %ebx
+ popl %edx
+ popl %ecx
+ popl %eax
+ add $16,%esp
+ popfl
+ add $20,%esp
diff --git a/if1632/shell.spec b/if1632/shell.spec
index 52499e3..fb44c1c 100644
--- a/if1632/shell.spec
+++ b/if1632/shell.spec
@@ -9,33 +9,33 @@
# proper parameters. It's just to have stub for PROGMAN.EXE ...
#
- 1 pascal RegOpenKey() RegOpenKey()
- 2 pascal RegCreateKey() RegCreateKey()
- 3 pascal RegCloseKey() RegCloseKey()
- 4 pascal RegDeleteKey() RegDeleteKey()
- 9 pascal DragAcceptFiles() DragAcceptFiles()
- 20 pascal ShellExecute(ptr) ShellExecute(1)
+ 1 pascal RegOpenKey(word ptr ptr) RegOpenKey(1 2 3)
+ 2 pascal RegCreateKey(word ptr ptr) RegCreateKey(1 2 3)
+ 3 pascal RegCloseKey(word) RegCloseKey(1)
+ 4 pascal RegDeleteKey(word ptr) RegDeleteKey(1 2)
+ 5 pascal RegSetValue(word ptr long ptr long) RegSetValue(1 2 3 4 5)
+ 6 pascal RegQueryValue(word ptr ptr ptr) RegQueryValue(1 2 3 4)
+ 7 pascal RegEnumKey(word long ptr long) RegEnumKey(1 2 3 4)
+ 9 pascal DragAcceptFiles(word word) DragAcceptFiles(1 2)
+ 11 pascal DragQueryFile(word s_word ptr s_word) DragQueryFile(1 2 3 4)
+ 12 pascal DragFinish(word) DragFinish(1)
+ 13 pascal DragQueryPoint(word ptr) DragQueryPoint(1 2)
+ 20 pascal ShellExecute(word ptr ptr ptr ptr s_word) ShellExecute(1 2 3 4 5 6)
+ 21 pascal FindExecutable(ptr ptr ptr) FindExecutable(1 2 3)
+ 22 pascal ShellAbout(word ptr ptr word) ShellAbout(1 2 3 4)
+ 33 pascal AboutDlgProc(word word word long) AboutDlgProc(1 2 3 4)
+ 34 pascal ExtractIcon(word ptr s_word) ExtractIcon(1 2 3)
102 pascal RegisterShellHook(ptr) RegisterShellHook(1)
103 pascal ShellHookProc() ShellHookProc()
# 8 7 0000 WEP exported, shared data
-# 33 9 0136 ABOUTDLGPROC exported, shared data
-# 34 10 021a EXTRACTICON exported, shared data
-# 21 4 1154 FINDEXECUTABLE exported, shared data
#100 4 0550 HERETHARBETYGARS exported, shared data
# 38 5 0000 FINDENVIRONMENTSTRING exported, shared data
-# 7 2 14dc REGENUMKEY exported, shared data
# 37 5 00ae DOENVIRONMENTSUBST exported, shared data
# 20 4 110a SHELLEXECUTE exported, shared data
#101 8 010e FINDEXEDLGPROC exported, shared data
-# 11 6 0094 DRAGQUERYFILE exported, shared data
-# 13 6 0000 DRAGQUERYPOINT exported, shared data
-# 5 2 16f4 REGSETVALUE exported, shared data
# 39 10 026e INTERNALEXTRACTICON exported, shared data
-# 22 9 0000 SHELLABOUT exported, shared data
-# 6 2 168e REGQUERYVALUE exported, shared data
# 32 9 0829 WCI exported, shared data
# 36 10 08dc EXTRACTASSOCIATEDICON exported, shared data
-# 12 6 0142 DRAGFINISH exported, shared data
diff --git a/if1632/user.spec b/if1632/user.spec
index a2aa4bd..1bb9eed 100644
--- a/if1632/user.spec
+++ b/if1632/user.spec
@@ -108,6 +108,7 @@
102 pascal AdjustWindowRect(ptr long word) AdjustWindowRect(1 2 3)
103 pascal MapDialogRect(word ptr) MapDialogRect(1 2)
104 pascal MessageBeep(word) MessageBeep(1)
+105 pascal FlashWindow(word word) FlashWindow(1 2)
106 pascal GetKeyState(word) GetKeyState(1)
107 pascal DefWindowProc(word word word long) DefWindowProc(1 2 3 4)
108 pascal GetMessage(ptr word word word) GetMessage(1 2 3 4)
@@ -357,7 +358,9 @@
417 pascal GetMenuCheckMarkDimensions() GetMenuCheckMarkDimensions()
418 pascal SetMenuItemBitmaps(word word word word word)
SetMenuItemBitmaps(1 2 3 4 5)
-420 pascal wsprintf(ptr ptr) wsprintf(1 2)
+420 pascal wsprintf() windows_wsprintf()
+# windows_wsprintf() handles arguments itself, as libc can't handle an
+# 16-bit stack. DLLRelay() will pass 16-bit stack pointer as 1st arg.
421 pascal wvsprintf(ptr ptr ptr) wvsprintf(1 2 3)
#422 DLGDIRSELECTEX
#423 DLGDIRSELECTCOMBOBOXEX
diff --git a/include/heap.h b/include/heap.h
index 94ba9c9..22fe129 100644
--- a/include/heap.h
+++ b/include/heap.h
@@ -60,16 +60,18 @@
*/
typedef struct global_mem_desc_s
{
- struct global_mem_desc_s *next;
- struct global_mem_desc_s *prev;
- unsigned short handle;
- short sequence;
- void *addr;
- int length;
- int lock_count;
- void *linear_addr;
- int linear_key;
- int linear_count;
+ struct global_mem_desc_s *next; /* Next GDESC in list */
+ struct global_mem_desc_s *prev; /* Previous GDESC in list */
+ unsigned short handle; /* Handle of this block. */
+ short sequence; /* Block sequence # in huge block */
+ void *addr; /* Address allocated with mmap() */
+ int length; /* Length of block */
+ int lock_count; /* Block lock count */
+ unsigned short alias; /* Offset-zero alias selector */
+ unsigned int alias_key; /* Offset-zero alias sh. mem. key */
+ void *linear_addr; /* Linear address of huge block */
+ int linear_key; /* Linear shared memory key */
+ int linear_count; /* Linear lock count */
} GDESC;
extern GDESC *GlobalList;
diff --git a/include/segmem.h b/include/segmem.h
index b0f38f7..afe7741 100644
--- a/include/segmem.h
+++ b/include/segmem.h
@@ -6,6 +6,8 @@
#ifndef SEGMEM_H
#define SEGMEM_H
+#include "wine.h"
+
#ifdef __linux__
#define HAVE_IPC
#include <sys/ipc.h>
@@ -77,13 +79,10 @@
static __inline__ int Is16bitAddress(void *address)
{
- return ((int) address >= (((FIRST_SELECTOR << 3) | 0x0007) << 16));
+ return ((unsigned int) address
+ >= (((FIRST_SELECTOR << 3) | 0x0007) << 16));
}
extern SEGDESC Segments[];
#endif /* SEGMEM_H */
-
-
-
-
diff --git a/include/windows.h b/include/windows.h
index 6d92ddd..0b27568 100644
--- a/include/windows.h
+++ b/include/windows.h
@@ -45,7 +45,7 @@
DECLARE_HANDLE(HBITMAP);
DECLARE_HANDLE(HBRUSH);
DECLARE_HANDLE(LOCALHANDLE);
-
+DECLARE_HANDLE(HMETAFILE);
#define TRUE 1
#define FALSE 0
@@ -850,14 +850,6 @@
#define ALTERNATE 1
#define WINDING 2
-typedef struct {
- DWORD rdSize;
- WORD rdFunction, rdParam[1];
-} METARECORD;
-typedef METARECORD *LPMETARECORD;
-typedef METARECORD *NPMETARECORD;
-typedef METARECORD *PMETARECORD;
-
/* Background modes */
#define TRANSPARENT 1
#define OPAQUE 2
@@ -1334,12 +1326,6 @@
#define WF_PAGING 0x0800
#define WF_WLO 0x8000
-typedef struct
-{
- HANDLE objectHandle[1];
-}HANDLETABLE;
-typedef HANDLETABLE *LPHANDLETABLE;
-
#define MAKEINTRESOURCE(i) (LPSTR)((DWORD)((WORD)(i)))
#define IDI_APPLICATION MAKEINTRESOURCE(32512)
@@ -2240,6 +2226,126 @@
#define WM_ASKCBFORMATNAME 0x030C
#define WM_CHANGECBCHAIN 0x030D
+/* Metafile header structure */
+typedef struct tagMETAHEADER
+{
+ WORD mtType;
+ WORD mtHeaderSize;
+ WORD mtVersion;
+ DWORD mtSize __attribute__ ((packed));
+ WORD mtNoObjects;
+ DWORD mtMaxRecord __attribute__ ((packed));
+ WORD mtNoParameters;
+} METAHEADER;
+
+/* Metafile typical record structure */
+typedef struct tagMETARECORD
+{
+ DWORD rdSize;
+ WORD rdFunction;
+ WORD rdParam[1];
+} METARECORD;
+typedef METARECORD *PMETARECORD;
+typedef METARECORD *LPMETARECORD;
+
+/* Handle table structure */
+typedef struct tagHANDLETABLE
+{
+ HANDLE objectHandle[1];
+} HANDLETABLE;
+typedef HANDLETABLE *PHANDLETABLE;
+typedef HANDLETABLE *LPHANDLETABLE;
+
+/* Clipboard metafile picture structure */
+typedef struct tagMETAFILEPICT
+{
+ int mm;
+ int xExt;
+ int yExt;
+ HMETAFILE hMF;
+} METAFILEPICT;
+typedef METAFILEPICT *LPMETAFILEPICT;
+
+/* Metafile functions */
+#define META_SETBKCOLOR 0x0201
+#define META_SETBKMODE 0x0102
+#define META_SETMAPMODE 0x0103
+#define META_SETROP2 0x0104
+#define META_SETRELABS 0x0105
+#define META_SETPOLYFILLMODE 0x0106
+#define META_SETSTRETCHBLTMODE 0x0107
+#define META_SETTEXTCHAREXTRA 0x0108
+#define META_SETTEXTCOLOR 0x0209
+#define META_SETTEXTJUSTIFICATION 0x020A
+#define META_SETWINDOWORG 0x020B
+#define META_SETWINDOWEXT 0x020C
+#define META_SETVIEWPORTORG 0x020D
+#define META_SETVIEWPORTEXT 0x020E
+#define META_OFFSETWINDOWORG 0x020F
+#define META_SCALEWINDOWEXT 0x0410
+#define META_OFFSETVIEWPORTORG 0x0211
+#define META_SCALEVIEWPORTEXT 0x0412
+#define META_LINETO 0x0213
+#define META_MOVETO 0x0214
+#define META_EXCLUDECLIPRECT 0x0415
+#define META_INTERSECTCLIPRECT 0x0416
+#define META_ARC 0x0817
+#define META_ELLIPSE 0x0418
+#define META_FLOODFILL 0x0419
+#define META_PIE 0x081A
+#define META_RECTANGLE 0x041B
+#define META_ROUNDRECT 0x061C
+#define META_PATBLT 0x061D
+#define META_SAVEDC 0x001E
+#define META_SETPIXEL 0x041F
+#define META_OFFSETCLIPRGN 0x0220
+#define META_TEXTOUT 0x0521
+#define META_BITBLT 0x0922
+#define META_STRETCHBLT 0x0B23
+#define META_POLYGON 0x0324
+#define META_POLYLINE 0x0325
+#define META_ESCAPE 0x0626
+#define META_RESTOREDC 0x0127
+#define META_FILLREGION 0x0228
+#define META_FRAMEREGION 0x0429
+#define META_INVERTREGION 0x012A
+#define META_PAINTREGION 0x012B
+#define META_SELECTCLIPREGION 0x012C
+#define META_SELECTOBJECT 0x012D
+#define META_SETTEXTALIGN 0x012E
+#define META_DRAWTEXT 0x062F
+#define META_CHORD 0x0830
+#define META_SETMAPPERFLAGS 0x0231
+#define META_SETTEXTOUT 0x0A32
+#define META_SETDIBTODEV 0x0D33
+#define META_SELECTPALETTE 0x0234
+#define META_REALIZEPALETTE 0x0035
+#define META_ANIMATEPALETTE 0x0436
+#define META_SETPALENTRIES 0x0037
+#define META_POLYPOLYGON 0x0538
+#define META_RESIZEPALETTE 0x0139
+#define META_DIBBITBLT 0x0940
+#define META_DIBSTRETCHBLT 0x0B41
+#define META_DIBCREATEPATTERNBRUSH 0x0142
+#define META_STRETCHDIB 0x0F43
+#define META_EXTFLOODFILL 0x0548
+#define META_RESETDC 0x014C
+#define META_STARTDOC 0x014D
+#define META_STARTPAGE 0x004F
+#define META_ENDPAGE 0x0050
+#define META_ABORTDOC 0x0052
+#define META_ENDDOC 0x005E
+#define META_DELETEOBJECT 0x01F0
+#define META_CREATEPALETTE 0x00F7
+#define META_CREATEBRUSH 0x00F8
+#define META_CREATEPATTERNBRUSH 0x01F9
+#define META_CREATEPENINDIRECT 0x02FA
+#define META_CREATEFONTINDIRECT 0x02FB
+#define META_CREATEBRUSHINDIRECT 0x02FC
+#define META_CREATEBITMAPINDIRECT 0x02FD
+#define META_CREATEBITMAP 0x06FE
+#define META_CREATEREGION 0x06FF
+
#define F(ret,name) ret name(void);
#define Fa(ret,name,t1,a1) ret name(t1 a1);
@@ -2338,7 +2444,7 @@
Fa(ATOM,GlobalFindAtom,LPCSTR,a)
Fa(BOOL,BringWindowToTop,HWND,a)
Fa(BOOL,DeleteDC,HDC,a)
-Fa(BOOL,DeleteMetaFile,HANDLE,a)
+Fa(BOOL,DeleteMetaFile,HMETAFILE,a)
Fa(BOOL,DeleteObject,HANDLE,a)
Fa(BOOL,DestroyCursor,HCURSOR,a)
Fa(BOOL,DestroyIcon,HICON,a)
@@ -2392,7 +2498,7 @@
Fa(DWORD,OemKeyScan,WORD,a)
Fa(FARPROC,LocalNotify,FARPROC,a)
Fa(HANDLE,BeginDeferWindowPos,int,nNumWindows)
-Fa(HANDLE,CloseMetaFile,HANDLE,a)
+Fa(HMETAFILE,CloseMetaFile,HANDLE,a)
Fa(HANDLE,CreateMetaFile,LPSTR,a)
Fa(HANDLE,GetAtomHandle,ATOM,a)
Fa(HANDLE,GetClipboardData,WORD,a)
@@ -2680,8 +2786,8 @@
Fc(BOOL,LineTo,HDC,a,short,b,short,c)
Fc(WORD,GetInternalWindowPos,HWND,a,LPRECT,b,LPPOINT,c)
Fc(LONG,_llseek,INT,a,LONG,b,INT,c)
-Fc(WORD,_lread,INT,a,LPSTR,b,INT,c)
-Fc(WORD,_lwrite,INT,a,LPSTR,b,INT,c)
+Fc(INT,_lread,INT,a,LPSTR,b,INT,c)
+Fc(INT,_lwrite,INT,a,LPSTR,b,INT,c)
Fc(int,FillRect,HDC,a,LPRECT,b,HBRUSH,c)
Fc(DWORD,MoveTo,HDC,a,short,b,short,c)
Fc(BOOL,CheckMenuItem,HMENU,a,WORD,b,WORD,c)
@@ -2896,7 +3002,7 @@
Fg(int,GetDIBits,HDC,a,HANDLE,a2,WORD,b,WORD,c,LPSTR,d,LPBITMAPINFO,e,WORD,f)
Fg(int,SetDIBits,HDC,a,HANDLE,a2,WORD,b,WORD,c,LPSTR,d,LPBITMAPINFO,e,WORD,f)
Fg(BOOL,SetWindowPos,HWND,a,HWND,b,short,c,short,d,short,e,short,f,WORD,g)
-Fh(BOOL,ExtTextOut,HDC,a,int,b,int,c,WORD,d,LPRECT,e,LPSTR,f,WORD,g,LPINT,h)
+Fh(BOOL,ExtTextOut,HDC,a,short,b,short,c,WORD,d,LPRECT,e,LPSTR,f,WORD,g,LPINT,h)
Fh(HANDLE,DeferWindowPos,HANDLE,hWinPosInfo,HWND,hWnd,HWND,hWndInsertAfter,int,x,int,y,int,cx,int,cy,WORD,wFlags)
Fh(LONG,TabbedTextOut,HDC,a,int,b,int,c,LPSTR,d,int,e,int,f,LPINT,g,int,h)
Fh(int,ScrollWindowEx,HWND,a,short,b,short,c,LPRECT,d,LPRECT,e,HRGN,f,LPRECT,g,WORD,h)
diff --git a/loader/library.c b/loader/library.c
index cede6ec..6cfbe08 100644
--- a/loader/library.c
+++ b/loader/library.c
@@ -117,6 +117,7 @@
if (FindDLLTable(libname))
{
+ printf("Library was a builtin - returning 0x23\n");
return WINE_CODE_SELECTOR;
}
diff --git a/loader/resource.c b/loader/resource.c
index dbd7d92..a5fb3c8 100644
--- a/loader/resource.c
+++ b/loader/resource.c
@@ -573,7 +573,7 @@
HANDLE rsc_mem;
BYTE *lp;
ACCELHEADER *lpAccelTbl;
- int i, image_size;
+ int i, image_size, n;
#ifdef DEBUG_ACCEL
if (((LONG)lpTableName & 0xFFFF0000L) == 0L)
printf("LoadAccelerators: instance = %04X, name = %08X\n",
@@ -597,11 +597,12 @@
#ifdef DEBUG_ACCEL
printf("LoadAccelerators / image_size=%d\n", image_size);
#endif
+ n = image_size/5;
hAccel = GlobalAlloc(GMEM_MOVEABLE,
- sizeof(ACCELHEADER) + sizeof(ACCELENTRY) + image_size);
+ sizeof(ACCELHEADER) + (n + 1)*sizeof(ACCELENTRY));
lpAccelTbl = (LPACCELHEADER)GlobalLock(hAccel);
lpAccelTbl->wCount = 0;
- for (i = 0; ; i++) {
+ for (i = 0; i < n; i++) {
lpAccelTbl->tbl[i].type = *(lp++);
lpAccelTbl->tbl[i].wEvent = *((WORD *)lp);
lp += 2;
@@ -895,6 +896,10 @@
buffer[i] = '\0';
}
else {
+ if (buflen > 1) {
+ buffer[0] = '\0';
+ return 0;
+ }
printf("LoadString // I dont know why , but caller give buflen=%d *p=%d !\n", buflen, *p);
printf("LoadString // and try to obtain string '%s'\n", p + 1);
}
diff --git a/loader/task.c b/loader/task.c
index 980ddc7..856f634 100644
--- a/loader/task.c
+++ b/loader/task.c
@@ -102,14 +102,14 @@
printf("EnumTaskWindows // found hTask=%04X !\n", hTask);
wptr = lpTask->lpWndList;
if (wptr == NULL) return FALSE;
+ if (lpEnumFunc == NULL) return FALSE;
while ((hWnd = *(wptr++)) != 0) {
if (++count >= MAXWIN_PER_TASK) return FALSE;
printf("EnumTaskWindows // hWnd=%04X count=%d !\n", hWnd, count);
#ifdef WINELIB
- if (lpEnumFunc != NULL) bRet = (*lpEnumFunc)(hWnd, lParam);
+ bRet = (*lpEnumFunc)(hWnd, lParam);
#else
- if (lpEnumFunc != NULL)
- bRet = CallBack16(lpEnumFunc, 2, lParam, (int) hWnd);
+ bRet = CallBack16(lpEnumFunc, 2, 0, (int)hWnd, 2, (int)lParam);
#endif
if (bRet == 0) break;
}
diff --git a/memory/global.c b/memory/global.c
index 29717e0..c257027 100644
--- a/memory/global.c
+++ b/memory/global.c
@@ -103,18 +103,20 @@
for (count = 0; count < n_segments; count++, s++)
{
g = (GDESC *) malloc(sizeof(*g));
- if (g == NULL) {
+ if (g == NULL)
+ {
printf("GlobalGetFreeSegments // bad GDESC malloc !\n");
return NULL;
- }
- g->prev = g_prev;
- g->next = NULL;
- g->handle = s->selector;
- g->sequence = -1;
- g->addr = s->base_addr;
- g->length = s->length;
- g->linear_addr = NULL;
- g->linear_key = 0;
+ }
+ g->prev = g_prev;
+ g->next = NULL;
+ g->handle = s->selector;
+ g->sequence = -1;
+ g->addr = s->base_addr;
+ g->length = s->length;
+ g->alias = 0;
+ g->linear_addr = NULL;
+ g->linear_key = 0;
g->linear_count = 0;
if (!(flags & GLOBAL_FLAGS_MOVEABLE))
g->lock_count = 1;
@@ -139,14 +141,16 @@
g = g_start;
for (i = 0; i < n_segments; i++, g = g->next)
{
- if (g == NULL) {
+ if (g == NULL)
+ {
printf("GlobalGetFreeSegments // bad Segments chain !\n");
return NULL;
- }
- g->sequence = i + 1;
- g->length = n_segments;
- g->linear_addr = NULL;
- g->linear_key = 0;
+ }
+ g->sequence = i + 1;
+ g->length = n_segments;
+ g->alias = 0;
+ g->linear_addr = NULL;
+ g->linear_key = 0;
g->linear_count = 0;
}
@@ -154,6 +158,15 @@
}
/**********************************************************************
+ * WIN16_GlobalAlloc
+ */
+HANDLE
+WIN16_GlobalAlloc(unsigned int flags, unsigned long size)
+{
+ return GlobalAlloc(flags & ~GLOBAL_FLAGS_MOVEABLE, size);
+}
+
+/**********************************************************************
* GlobalAlloc
*/
HANDLE
@@ -234,14 +247,15 @@
if (g == NULL)
return 0;
- g->handle = next_unused_handle;
- g->sequence = 0;
- g->addr = m;
- g->linear_addr = NULL;
- g->linear_key = 0;
+ g->handle = next_unused_handle;
+ g->sequence = 0;
+ g->addr = m;
+ g->alias = 0;
+ g->linear_addr = NULL;
+ g->linear_key = 0;
g->linear_count = 0;
- g->length = size;
- g->next = g_prev->next;
+ g->length = size;
+ g->next = g_prev->next;
if (g->next) g->next->prev = g;
g->lock_count = 0;
@@ -323,28 +337,15 @@
{
GDESC *g;
- if (block == 0)
+ if ((g = GlobalGetGDesc(block)) == NULL)
return 0;
- /*
- * Find GDESC for this block.
- */
- for (g = GlobalList; g != NULL; g = g->next)
- {
- if (g->handle == block)
- {
- g->lock_count++;
-#ifdef DEBUG_HEAP
- printf("GlobalLock: returning %08x\n", g->addr);
-#endif
- return g->addr;
- }
- }
+ g->lock_count++;
#ifdef DEBUG_HEAP
- printf("GlobalLock: returning %08x\n", 0);
+ printf("GlobalLock: returning %08x\n", g->addr);
#endif
- return NULL;
+ return g->addr;
}
/**********************************************************************
diff --git a/memory/heap.c b/memory/heap.c
index 471d5fe..c54c0ee 100644
--- a/memory/heap.c
+++ b/memory/heap.c
@@ -116,23 +116,28 @@
{
MDESC *m_free;
MDESC *m;
+
+
+ if (!old_block)
+ return HEAP_Alloc(free_list, flags, new_size);
+
/*
* Check validity of block
*/
m = (MDESC *) old_block - 1;
+
#ifdef DEBUG_HEAP
- printf("HEAP_ReAlloc new_size=%d !\n", new_size);
- printf("HEAP_ReAlloc old_block=%08X !\n", old_block);
- printf("HEAP_ReAlloc m=%08X free_list=%08X !\n", m, free_list);
- printf("HEAP_ReAlloc m->prev=%08X !\n", m->prev);
- printf("HEAP_ReAlloc m->next=%08X !\n", m->next);
- printf("HEAP_ReAlloc *free_list=%08X !\n", *free_list);
+ printf("HEAP_ReAlloc new_size=%d !\n", new_size);
+ printf("HEAP_ReAlloc old_block=%08X !\n", old_block);
+ printf("HEAP_ReAlloc m=%08X free_list=%08X !\n", m, free_list);
+ printf("HEAP_ReAlloc m->prev=%08X !\n", m->prev);
+ printf("HEAP_ReAlloc m->next=%08X !\n", m->next);
+ printf("HEAP_ReAlloc *free_list=%08X !\n", *free_list);
#endif
- if (m->prev != m || m->next != m ||
+
+ if (m->prev != m || m->next != m ||
((int) m & 0xffff0000) != ((int) *free_list & 0xffff0000))
{
- printf("Attempt to resize bad pointer, m = %08x, *free_list = %08x\n",
- m, free_list);
#ifdef DEBUG_HEAP
printf("Attempt to resize bad pointer, m = %08x, *free_list = %08x\n",
m, free_list);
@@ -144,8 +149,9 @@
* Check for grow block
*/
#ifdef DEBUG_HEAP
- printf("HEAP_ReAlloc Check for grow block !\n");
+ printf("HEAP_ReAlloc Check for grow block !\n");
#endif
+
if (new_size > m->length)
{
m_free = m + 1 + m->length / sizeof(MDESC);
diff --git a/misc/cursor.c b/misc/cursor.c
index 874ff92..49ce26c 100644
--- a/misc/cursor.c
+++ b/misc/cursor.c
@@ -171,7 +171,7 @@
ReleaseDC(GetDesktopWindow(), hdc);
return 0;
}
- lp += 2;
+ (char *)lp += 2;
for (j = 0; j < 16; j++)
printf("%04X ", *(lp + j));
/*
@@ -180,7 +180,7 @@
else
*/
lpcur->hBitmap = 0;
- lp += sizeof(BITMAP);
+/* lp += sizeof(BITMAP); */
for (i = 0; i < 81; i++) {
char temp = *((char *)lp + 162 + i);
*((char *)lp + 162 + i) = *((char *)lp + 324 - i);
diff --git a/misc/file.c b/misc/file.c
index ff4bcba..3348f75 100644
--- a/misc/file.c
+++ b/misc/file.c
@@ -12,7 +12,7 @@
*
* DEC 93 Erik Bos (erik@(trashcan.)hacktic.nl)
* - Existing functions modified to use dosfs functions.
- * - Added _llseek, _lcreate, GetDriveType, GetTempDrive,
+ * - Added _llseek, _lcreat, GetDriveType, GetTempDrive,
* GetWindowsDirectory, GetSystemDirectory, GetTempFileName.
*
************************************************************************/
@@ -27,7 +27,7 @@
#include <windows.h>
#include "prototypes.h"
-#define DEBUG_FILE
+/* #define DEBUG_FILE */
char WindowsDirectory[256], SystemDirectory[256], TempDirectory[256];
@@ -63,7 +63,7 @@
/***************************************************************************
_lread
***************************************************************************/
-WORD _lread (INT hFile, LPSTR lpBuffer, INT wBytes)
+INT _lread (INT hFile, LPSTR lpBuffer, INT wBytes)
{
int result;
@@ -83,7 +83,7 @@
/****************************************************************************
_lwrite
****************************************************************************/
-WORD _lwrite (INT hFile, LPSTR lpBuffer, INT wBytes)
+INT _lwrite (INT hFile, LPSTR lpBuffer, INT wBytes)
{
int result;
@@ -196,15 +196,15 @@
}
/***************************************************************************
- _lcreate
+ _lcreat
***************************************************************************/
-INT _lcreate (LPSTR lpszFilename, INT fnAttribute)
+INT _lcreat (LPSTR lpszFilename, INT fnAttribute)
{
int handle;
char *UnixFileName;
#ifdef DEBUG_FILE
- fprintf(stderr, "_lcreate: filename %s, attributes %d\n",lpszFilename,
+ fprintf(stderr, "_lcreat: filename %s, attributes %d\n",lpszFilename,
fnAttribute);
#endif
if ((UnixFileName = GetUnixFileName(lpszFilename)) == NULL)
@@ -307,7 +307,7 @@
fprintf(stderr,"GetTempFilename: %c %s %d => %s\n",bDriveLetter,
lpszPrefixString,uUnique,lpszTempFileName);
#endif
- if ((handle = _lcreate (lpszTempFileName, 0x0000)) == -1) {
+ if ((handle = _lcreat (lpszTempFileName, 0x0000)) == -1) {
fprintf(stderr,"GetTempFilename: can't create temp file '%s' !\n", lpszTempFileName);
}
else
diff --git a/misc/mmsystem.c b/misc/mmsystem.c
index 042974c..9332079 100644
--- a/misc/mmsystem.c
+++ b/misc/mmsystem.c
@@ -10,6 +10,8 @@
#include "win.h"
#include "mmsystem.h"
+static WORD mciActiveDev = 0;
+
int MCI_LibMain(HANDLE hInstance, WORD wDataSeg,
WORD cbHeapSize, LPSTR lpCmdLine)
@@ -78,6 +80,9 @@
+/**************************************************************************
+* mciGetErrorString [MMSYSTEM.706]
+*/
BOOL mciGetErrorString (DWORD wError, LPSTR lpstrBuffer, UINT uLength)
{
LPSTR msgptr;
@@ -331,23 +336,204 @@
break;
}
maxbuf = min(uLength - 1, strlen(msgptr));
- strncpy(lpstrBuffer, msgptr, maxbuf);
+ if (maxbuf > 0) strncpy(lpstrBuffer, msgptr, maxbuf);
lpstrBuffer[maxbuf + 1] = '\0';
return(TRUE);
}
+/**************************************************************************
+* mciWaveOpen [internal]
+*/
+DWORD mciWaveOpen(UINT wDevID, DWORD dwParam, LPMCI_WAVE_OPEN_PARMS lpParms)
+{
+ if (lpParms == NULL) return MCIERR_INTERNAL;
+ printf("mciWaveOpen(%04X, %08X, %08X)\n", wDevID, dwParam, lpParms);
+ return MCIERR_INTERNAL;
+}
+
+/**************************************************************************
+* mciOpen [internal]
+*/
+DWORD mciOpen(UINT wDevID, DWORD dwParam, LPMCI_OPEN_PARMS lpParms)
+{
+ DWORD dwDevTyp = 0;
+ if (lpParms == NULL) return MCIERR_INTERNAL;
+ printf("mciOpen(%04X, %08X, %08X)\n", wDevID, dwParam, lpParms);
+ if (dwParam & MCI_OPEN_TYPE) {
+ if (lpParms->lpstrDeviceType == NULL) return MCIERR_INTERNAL;
+ if (dwParam & MCI_OPEN_TYPE_ID) {
+ printf("MCI_OPEN // Dev=%08X !\n", lpParms->lpstrDeviceType);
+ dwDevTyp = (DWORD)lpParms->lpstrDeviceType;
+ }
+ else {
+ if (strcmp(lpParms->lpstrDeviceType, "cdaudio") == 0) {
+ dwDevTyp = MCI_DEVTYPE_CD_AUDIO;
+ }
+ else
+ if (strcmp(lpParms->lpstrDeviceType, "waveaudio") == 0) {
+ dwDevTyp = MCI_DEVTYPE_WAVEFORM_AUDIO;
+ }
+ else
+ if (strcmp(lpParms->lpstrDeviceType, "Sequencer") == 0) {
+ dwDevTyp = MCI_DEVTYPE_SEQUENCER;
+ }
+ else
+ if (strcmp(lpParms->lpstrDeviceType, "Animation1") == 0) {
+ dwDevTyp = MCI_DEVTYPE_ANIMATION;
+ }
+ }
+ switch(dwDevTyp) {
+ case MCI_DEVTYPE_CD_AUDIO:
+ printf("MCI_OPEN // No SEQUENCER yet !\n");
+ return MCIERR_DEVICE_NOT_INSTALLED;
+ case MCI_DEVTYPE_WAVEFORM_AUDIO:
+ printf("MCI_OPEN // No WAVEAUDIO yet !\n");
+ return MCIERR_DEVICE_NOT_INSTALLED;
+ case MCI_DEVTYPE_SEQUENCER:
+ printf("MCI_OPEN // No SEQUENCER yet !\n");
+ return MCIERR_DEVICE_NOT_INSTALLED;
+ case MCI_DEVTYPE_ANIMATION:
+ printf("MCI_OPEN // No ANIMATION yet !\n");
+ return MCIERR_DEVICE_NOT_INSTALLED;
+ case MCI_DEVTYPE_DIGITAL_VIDEO:
+ printf("MCI_OPEN // No DIGITAL_VIDEO yet !\n");
+ return MCIERR_DEVICE_NOT_INSTALLED;
+ default:
+ printf("MCI_OPEN // Invalid Device Name '%08X' !\n", lpParms->lpstrDeviceType);
+ return MCIERR_INVALID_DEVICE_NAME;
+ }
+ lpParms->wDeviceID = ++mciActiveDev;
+ printf("MCI_OPEN // wDeviceID=%04X !\n", lpParms->wDeviceID);
+ return 0;
+ }
+ if (dwParam & MCI_OPEN_ELEMENT) {
+ printf("MCI_OPEN // Element !\n");
+ printf("MCI_OPEN // Elem=%s' !\n", lpParms->lpstrElementName);
+ }
+ return MCIERR_INTERNAL;
+}
+
+
+/**************************************************************************
+* mciSound [internal]
+*/
+DWORD mciSound(UINT wDevID, DWORD dwParam, LPMCI_SOUND_PARMS lpParms)
+{
+ if (lpParms == NULL) return MCIERR_INTERNAL;
+ if (dwParam & MCI_SOUND_NAME)
+ printf("MCI_SOUND // file='%s' !\n", lpParms->lpstrSoundName);
+ return MCIERR_INVALID_DEVICE_ID;
+}
+
+
+/**************************************************************************
+* mciGetDevCaps [internal]
+*/
+DWORD mciGetDevCaps(UINT wDevID, DWORD dwParam, LPMCI_GETDEVCAPS_PARMS lpParms)
+{
+ if (lpParms == NULL) return MCIERR_INTERNAL;
+ lpParms->dwReturn = 0;
+ return 0;
+}
+
+
+/**************************************************************************
+* mciInfo [internal]
+*/
+DWORD mciInfo(UINT wDevID, DWORD dwParam, LPMCI_INFO_PARMS lpParms)
+{
+ if (lpParms == NULL) return MCIERR_INTERNAL;
+ lpParms->lpstrReturn = NULL;
+ lpParms->dwRetSize = 0;
+ return 0;
+}
+
+
+/**************************************************************************
+* mciStatus [internal]
+*/
+DWORD mciStatus(UINT wDevID, DWORD dwParam, LPMCI_STATUS_PARMS lpParms)
+{
+ if (lpParms == NULL) return MCIERR_INTERNAL;
+ return 0;
+}
+
+
+/**************************************************************************
+* mciPlay [internal]
+*/
+DWORD mciPlay(UINT wDevID, DWORD dwParam, LPMCI_PLAY_PARMS lpParms)
+{
+ if (lpParms == NULL) return MCIERR_INTERNAL;
+ return 0;
+}
+
+
+/**************************************************************************
+* mciRecord [internal]
+*/
+DWORD mciRecord(UINT wDevID, DWORD dwParam, LPMCI_RECORD_PARMS lpParms)
+{
+ if (lpParms == NULL) return MCIERR_INTERNAL;
+ return 0;
+}
+
+
+/**************************************************************************
+* mciClose [internal]
+*/
+DWORD mciClose(UINT wDevID)
+{
+ return 0;
+}
+
+
+/**************************************************************************
+* mciSendCommand [MMSYSTEM.701]
+*/
DWORD mciSendCommand(UINT wDevID, UINT wMsg, DWORD dwParam1, DWORD dwParam2)
{
printf("mciSendCommand(%04X, %04X, %08X, %08X)\n",
wDevID, wMsg, dwParam1, dwParam2);
+ switch(wMsg) {
+ case MCI_OPEN:
+ printf("mciSendCommand // MCI_OPEN !\n");
+ if (dwParam1 & MCI_WAVE_OPEN_BUFFER)
+ return mciWaveOpen(wDevID, dwParam1,
+ (LPMCI_WAVE_OPEN_PARMS)dwParam2);
+ else
+ return mciOpen(wDevID, dwParam1, (LPMCI_OPEN_PARMS)dwParam2);
+ case MCI_PLAY:
+ printf("mciSendCommand // MCI_PLAY !\n");
+ return mciPlay(wDevID, dwParam1, (LPMCI_PLAY_PARMS)dwParam2);
+ case MCI_RECORD:
+ printf("mciSendCommand // MCI_RECORD !\n");
+ return mciRecord(wDevID, dwParam1, (LPMCI_RECORD_PARMS)dwParam2);
+ case MCI_CLOSE:
+ printf("mciSendCommand // MCI_CLOSE !\n");
+ return mciClose(wDevID);
+ case MCI_SOUND:
+ printf("mciSendCommand // MCI_SOUND !\n");
+ return mciSound(wDevID, dwParam1, (LPMCI_SOUND_PARMS)dwParam2);
+ case MCI_STATUS:
+ printf("mciSendCommand // MCI_STATUS !\n");
+ return mciStatus(wDevID, dwParam1, (LPMCI_STATUS_PARMS)dwParam2);
+ case MCI_INFO:
+ printf("mciSendCommand // MCI_INFO !\n");
+ return mciInfo(wDevID, dwParam1, (LPMCI_INFO_PARMS)dwParam2);
+ case MCI_GETDEVCAPS:
+ printf("mciSendCommand // MCI_GETDEVCAPS !\n");
+ return mciGetDevCaps(wDevID, dwParam1, (LPMCI_GETDEVCAPS_PARMS)dwParam2);
+ }
return MCIERR_DEVICE_NOT_INSTALLED;
}
-
-
+/**************************************************************************
+* mciGetDeviceID [MMSYSTEM.703]
+*/
UINT mciGetDeviceID (LPCSTR lpstrName)
{
printf("mciGetDeviceID(%s)\n", lpstrName);
@@ -356,6 +542,9 @@
+/**************************************************************************
+* mciSendString [MMSYSTEM.702]
+*/
DWORD WINAPI mciSendString (LPCSTR lpstrCommand,
LPSTR lpstrReturnString, UINT uReturnLength, HWND hwndCallback)
{
@@ -483,7 +672,7 @@
break;
}
maxbuf = min(uSize - 1, strlen(msgptr));
- strncpy(lpText, msgptr, maxbuf);
+ if (maxbuf > 0) strncpy(lpText, msgptr, maxbuf);
lpText[maxbuf + 1] = '\0';
return(TRUE);
}
@@ -493,6 +682,7 @@
DWORD dwCallback, DWORD dwInstance, DWORD dwFlags)
{
printf("midiOutOpen\n");
+ if (lphMidiOut != NULL) *lphMidiOut = 0;
return 0;
}
@@ -603,6 +793,7 @@
DWORD dwCallback, DWORD dwInstance, DWORD dwFlags)
{
printf("midiInOpen\n");
+ if (lphMidiIn != NULL) *lphMidiIn = 0;
return 0;
}
@@ -698,65 +889,68 @@
UINT WINAPI waveGetErrorText(UINT uError, LPSTR lpText, UINT uSize)
{
- if ((lpText == NULL) || (uSize < 1)) return(FALSE);
- lpText[0] = '\0';
- switch(uError)
- {
- case MMSYSERR_NOERROR:
- sprintf(lpText, "The specified command was carried out.");
- break;
- case MMSYSERR_ERROR:
- sprintf(lpText, "Undefined external error.");
- break;
- case MMSYSERR_BADDEVICEID:
- sprintf(lpText, "A device ID has been used that is out of range for your system.");
- break;
- case MMSYSERR_NOTENABLED:
- sprintf(lpText, "The driver was not enabled.");
- break;
- case MMSYSERR_ALLOCATED:
- sprintf(lpText, "The specified device is already in use. Wait until it is free, and then try again.");
- break;
- case MMSYSERR_INVALHANDLE:
- sprintf(lpText, "The specified device handle is invalid.");
- break;
- case MMSYSERR_NODRIVER:
- sprintf(lpText, "There is no driver installed on your system !\n");
- break;
- case MMSYSERR_NOMEM:
- sprintf(lpText, "Not enough memory available for this task. Quit one or more applications to increase available memory, and then try again.");
- break;
- case MMSYSERR_NOTSUPPORTED:
- sprintf(lpText, "This function is not supported. Use the Capabilities function to determine which functions and messages the driver supports.");
- break;
- case MMSYSERR_BADERRNUM:
- sprintf(lpText, "An error number was specified that is not defined in the system.");
- break;
- case MMSYSERR_INVALFLAG:
- sprintf(lpText, "An invalid flag was passed to a system function.");
- break;
- case MMSYSERR_INVALPARAM:
- sprintf(lpText, "An invalid parameter was passed to a system function.");
- break;
- case WAVERR_BADFORMAT:
- sprintf(lpText, "The specified format is not supported or cannot be translated. Use the Capabilities function to determine the supported formats");
- break;
- case WAVERR_STILLPLAYING:
- sprintf(lpText, "Cannot perform this operation while media data is still playing. Reset the device, or wait until the data is finished playing.");
- break;
- case WAVERR_UNPREPARED:
- sprintf(lpText, "The wave header was not prepared. Use the Prepare function to prepare the header, and then try again.");
- break;
- case WAVERR_SYNC:
- sprintf(lpText, "Cannot open the device without using the WAVE_ALLOWSYNC flag. Use the flag, and then try again.");
- break;
-
- default:
- sprintf(lpText, "Unkown MMSYSTEM Error !\n");
- break;
- }
- lpText[uSize - 1] = '\0';
- return(TRUE);
+ LPSTR msgptr;
+ int maxbuf;
+ printf("waveGetErrorText(%04X, %08X, %d);\n", uError, lpText, uSize);
+ if ((lpText == NULL) || (uSize < 1)) return(FALSE);
+ lpText[0] = '\0';
+ switch(uError) {
+ case MMSYSERR_NOERROR:
+ msgptr = "The specified command was carried out.";
+ break;
+ case MMSYSERR_ERROR:
+ msgptr = "Undefined external error.";
+ break;
+ case MMSYSERR_BADDEVICEID:
+ msgptr = "A device ID has been used that is out of range for your system.";
+ break;
+ case MMSYSERR_NOTENABLED:
+ msgptr = "The driver was not enabled.";
+ break;
+ case MMSYSERR_ALLOCATED:
+ msgptr = "The specified device is already in use. Wait until it is free, and then try again.";
+ break;
+ case MMSYSERR_INVALHANDLE:
+ msgptr = "The specified device handle is invalid.";
+ break;
+ case MMSYSERR_NODRIVER:
+ msgptr = "There is no driver installed on your system !\n";
+ break;
+ case MMSYSERR_NOMEM:
+ msgptr = "Not enough memory available for this task. Quit one or more applications to increase available memory, and then try again.";
+ break;
+ case MMSYSERR_NOTSUPPORTED:
+ msgptr = "This function is not supported. Use the Capabilities function to determine which functions and messages the driver supports.";
+ break;
+ case MMSYSERR_BADERRNUM:
+ msgptr = "An error number was specified that is not defined in the system.";
+ break;
+ case MMSYSERR_INVALFLAG:
+ msgptr = "An invalid flag was passed to a system function.";
+ break;
+ case MMSYSERR_INVALPARAM:
+ msgptr = "An invalid parameter was passed to a system function.";
+ break;
+ case WAVERR_BADFORMAT:
+ msgptr = "The specified format is not supported or cannot be translated. Use the Capabilities function to determine the supported formats";
+ break;
+ case WAVERR_STILLPLAYING:
+ msgptr = "Cannot perform this operation while media data is still playing. Reset the device, or wait until the data is finished playing.";
+ break;
+ case WAVERR_UNPREPARED:
+ msgptr = "The wave header was not prepared. Use the Prepare function to prepare the header, and then try again.";
+ break;
+ case WAVERR_SYNC:
+ msgptr = "Cannot open the device without using the WAVE_ALLOWSYNC flag. Use the flag, and then try again.";
+ break;
+ default:
+ msgptr = "Unkown MMSYSTEM Error !\n";
+ break;
+ }
+ maxbuf = min(uSize - 1, strlen(msgptr));
+ if (maxbuf > 0) strncpy(lpText, msgptr, maxbuf);
+ lpText[maxbuf + 1] = '\0';
+ return(TRUE);
}
@@ -764,6 +958,7 @@
const WAVEFORMAT FAR* lpFormat, DWORD dwCallback, DWORD dwInstance, DWORD dwFlags)
{
printf("waveOutOpen\n");
+if (lphWaveOut != NULL) *lphWaveOut = 0;
return 0;
}
@@ -920,6 +1115,7 @@
const WAVEFORMAT FAR* lpFormat, DWORD dwCallback, DWORD dwInstance, DWORD dwFlags)
{
printf("waveInOpen\n");
+if (lphWaveIn != NULL) *lphWaveIn = 0;
return 0;
}
diff --git a/misc/property.c b/misc/property.c
index 55abcb9..3ce34c8 100644
--- a/misc/property.c
+++ b/misc/property.c
@@ -45,7 +45,10 @@
lpProp = (LPPROPENTRY) GlobalLock(wndPtr->hProp);
if (lpProp == NULL) return 0;
while (TRUE) {
- if (strcmp(lpProp->PropName, lpStr) == 0) {
+ if ((((DWORD)lpStr & 0xFFFF0000) == 0L &&
+ lpProp->Atom == LOWORD((DWORD)lpStr)) ||
+ (((DWORD)lpStr & 0xFFFF0000) != 0L &&
+ strcmp(lpProp->PropName, lpStr) == 0)) {
printf("RemoveProp // Property found ! hData=%04X\n", lpProp->hData);
hOldData = lpProp->hData;
if (lpProp->lpPrevProp != NULL)
@@ -54,7 +57,7 @@
if (lpProp->lpNextProp != NULL)
((LPPROPENTRY)lpProp->lpNextProp)->lpPrevProp =
lpProp->lpPrevProp;
- free(lpProp->PropName);
+ if (lpProp->PropName != NULL) free(lpProp->PropName);
free(lpProp);
GlobalUnlock(wndPtr->hProp);
return hOldData;
@@ -84,7 +87,7 @@
wndPtr = WIN_FindWndPtr(hWnd);
if (wndPtr == NULL) {
printf("GetProp // Bad Window handle !\n");
- return FALSE;
+ return 0;
}
lpProp = (LPPROPENTRY) GlobalLock(wndPtr->hProp);
if (lpProp == NULL) return 0;
@@ -130,7 +133,10 @@
lpProp = (LPPROPENTRY) GlobalLock(wndPtr->hProp);
if (lpProp != NULL) {
while (TRUE) {
- if (strcmp(lpProp->PropName, lpStr) == 0) {
+ if ((((DWORD)lpStr & 0xFFFF0000) == 0L &&
+ lpProp->Atom == LOWORD((DWORD)lpStr)) ||
+ (((DWORD)lpStr & 0xFFFF0000) != 0L &&
+ strcmp(lpProp->PropName, lpStr) == 0)) {
#ifdef DEBUG_PROP
printf("SetProp // change already exinsting property !\n");
#endif
@@ -190,8 +196,39 @@
*/
int EnumProps(HWND hWnd, FARPROC lpEnumFunc)
{
- printf("EMPTY STUB !!! EnumProps(%04X, %08X)\n", hWnd, lpEnumFunc);
- return -1;
+ WND *wndPtr;
+ LPPROPENTRY lpProp;
+ LPSTR str;
+ int nRet;
+ printf("EnumProps(%04X, %08X)\n", hWnd, lpEnumFunc);
+ wndPtr = WIN_FindWndPtr(hWnd);
+ if (wndPtr == NULL) {
+ printf("EnumProps // Bad Window handle !\n");
+ return 0;
+ }
+ lpProp = (LPPROPENTRY) GlobalLock(wndPtr->hProp);
+ if (lpProp == NULL) return 0;
+ if (lpEnumFunc != NULL) return 0;
+ while (TRUE) {
+ printf("EnumProps // lpProp->Atom=%04X !\n", lpProp->Atom);
+ str = (LPSTR)MAKELONG(lpProp->Atom, 0);
+ if (lpProp->PropName != NULL) {
+ printf("EnumProps // lpProp->PropName='%s' !\n", lpProp->PropName);
+ str = lpProp->PropName;
+ }
+#ifdef WINELIB
+ nRet = (*lpEnumFunc)((HWND)hWnd, (WORD)0,
+ (LPSTR)str, (HANDLE)lpProp->hData);
+#else
+ nRet = CallBack16(lpEnumFunc, 4, (HANDLE)lpProp->hData,
+ (LPSTR)str, (WORD)0, (HWND)hWnd);
+#endif
+ if (nRet == 0) break;
+ if (lpProp->lpNextProp == NULL) break;
+ lpProp = lpProp->lpNextProp;
+ }
+ GlobalUnlock(wndPtr->hProp);
+ return 0;
}
diff --git a/misc/shell.c b/misc/shell.c
index bb86353..779c595 100644
--- a/misc/shell.c
+++ b/misc/shell.c
@@ -134,30 +134,7 @@
}
char AppName[256], AppMisc[256];
-
-/*************************************************************************
- * AboutDlgProc [SHELL.33]
- */
-INT AboutDlgProc(HWND hWnd, WORD msg, WORD wParam, LONG lParam)
-{
- char temp[256];
-
- switch(msg) {
- case WM_INITDIALOG:
- sprintf(temp, "About %s", AppName);
-/* SetDlgItemText(hWnd, 0, temp);*/
- SetDlgItemText(hWnd, 100, AppMisc);
- break;
-
- case WM_COMMAND:
- switch (wParam) {
- case IDOK:
- EndDialog(hWnd, TRUE);
- return TRUE;
- }
- }
- return FALSE;
-}
+INT AboutDlgProc(HWND hWnd, WORD msg, WORD wParam, LONG lParam);
/*************************************************************************
* ShellAbout [SHELL.22]
@@ -174,6 +151,30 @@
/*************************************************************************
+ * AboutDlgProc [SHELL.33]
+ */
+INT AboutDlgProc(HWND hWnd, WORD msg, WORD wParam, LONG lParam)
+{
+ char temp[256];
+
+ switch(msg) {
+ case WM_INITDIALOG:
+ sprintf(temp, "About %s", AppName);
+ SetWindowText(hWnd, temp);
+ SetDlgItemText(hWnd, 100, AppMisc);
+ break;
+
+ case WM_COMMAND:
+ switch (wParam) {
+ case IDOK:
+ EndDialog(hWnd, TRUE);
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+/*************************************************************************
* ExtractIcon [SHELL.34]
*/
HICON ExtractIcon(HINSTANCE hInst, LPCSTR lpszExeFileName, UINT nIconIndex)
diff --git a/misc/winsocket.c b/misc/winsocket.c
index cc361f6..4d9d5c0 100644
--- a/misc/winsocket.c
+++ b/misc/winsocket.c
@@ -549,8 +549,12 @@
/******************** winsock specific functions ************************
*
*/
+static HANDLE new_handle = 0;
-#define AllocWSAHandle() getpid()
+HANDLE AllocWSAHandle(void)
+{
+ return new_handle++;
+}
static void recv_message(int sig)
{
diff --git a/objects/Imakefile b/objects/Imakefile
index bce8061..b39ccd2 100644
--- a/objects/Imakefile
+++ b/objects/Imakefile
@@ -17,7 +17,8 @@
bitblt.c \
linedda.c \
color.c \
- dither.c
+ dither.c \
+ metafile.c
OBJS = \
bitmap.o \
@@ -34,7 +35,8 @@
bitblt.o \
linedda.o \
color.o \
- dither.o
+ dither.o \
+ metafile.o
WineRelocatableTarget($(TOP)/$(MODULE),,$(OBJS))
DependTarget()
diff --git a/objects/brush.c b/objects/brush.c
index 9464184..563617f 100644
--- a/objects/brush.c
+++ b/objects/brush.c
@@ -9,6 +9,7 @@
#include "gdi.h"
#include "bitmap.h"
#include "prototypes.h"
+#include "metafile.h"
#define NB_HATCH_STYLES 6
@@ -228,6 +229,26 @@
HBITMAP hBitmap;
BITMAPINFO * bmpInfo;
HBRUSH prevHandle = dc->w.hBrush;
+
+ if (dc->header.wMagic == METAFILE_DC_MAGIC)
+ {
+ switch (brush->logbrush.lbStyle)
+ {
+ case BS_SOLID:
+ case BS_HATCHED:
+ case BS_HOLLOW:
+ if (!MF_CreateBrushIndirect(dc, &(brush->logbrush)))
+ return 0;
+ break;
+
+ case BS_PATTERN:
+ case BS_DIBPATTERN:
+ if (!MF_CreatePatternBrush(dc, &(brush->logbrush)))
+ return 0;
+ break;
+ }
+ return 1;
+ }
dc->w.hBrush = hbrush;
diff --git a/objects/dcvalues.c b/objects/dcvalues.c
index 12b775f..33b51ac 100644
--- a/objects/dcvalues.c
+++ b/objects/dcvalues.c
@@ -7,6 +7,7 @@
static char Copyright[] = "Copyright Alexandre Julliard, 1993";
#include "gdi.h"
+#include "metafile.h"
/* Default DC values */
const WIN_DC_INFO DCVAL_defaultValues =
@@ -96,25 +97,33 @@
return prevVal; \
}
-#define DC_SET_MODE( func_name, dc_field, min_val, max_val ) \
+#define DC_SET_MODE( func_name, dc_field, min_val, max_val, meta_func ) \
WORD func_name( HDC hdc, WORD mode ) \
{ \
WORD prevMode; \
DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ); \
- if (!dc) return 0; \
if ((mode < min_val) || (mode > max_val)) return 0; \
+ if (!dc) { \
+ dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC); \
+ if (!dc) return 0; \
+ MF_MetaParam1(dc, meta_func, mode); \
+ return 1; \
+ } \
prevMode = dc->w.dc_field; \
dc->w.dc_field = mode; \
return prevMode; \
}
-DC_SET_MODE( SetBkMode, backgroundMode, TRANSPARENT, OPAQUE ) /* GDI.2 */
-DC_SET_MODE( SetROP2, ROPmode, R2_BLACK, R2_WHITE ) /* GDI.4 */
-DC_SET_MODE( SetRelAbs, relAbsMode, ABSOLUTE, RELATIVE ) /* GDI.5 */
-DC_SET_MODE( SetPolyFillMode, polyFillMode, ALTERNATE, WINDING ) /* GDI.6 */
+DC_SET_MODE( SetBkMode, backgroundMode, TRANSPARENT, OPAQUE,
+ META_SETBKMODE ) /* GDI.2 */
+DC_SET_MODE( SetROP2, ROPmode, R2_BLACK, R2_WHITE, META_SETROP2 ) /* GDI.4 */
+DC_SET_MODE( SetRelAbs, relAbsMode, ABSOLUTE, RELATIVE,
+ META_SETRELABS ) /* GDI.5 */
+DC_SET_MODE( SetPolyFillMode, polyFillMode, ALTERNATE, WINDING,
+ META_SETPOLYFILLMODE ) /* GDI.6 */
DC_SET_MODE( SetStretchBltMode, stretchBltMode,
- BLACKONWHITE, COLORONCOLOR ) /* GDI.7 */
+ BLACKONWHITE, COLORONCOLOR, META_SETSTRETCHBLTMODE ) /* GDI.7 */
DC_GET_VAL( COLORREF, GetBkColor, backgroundColor ) /* GDI.75 */
DC_GET_VAL( WORD, GetBkMode, backgroundMode ) /* GDI.76 */
DC_GET_X_Y( DWORD, GetCurrentPosition, CursPosX, CursPosY ) /* GDI.78 */
diff --git a/objects/font.c b/objects/font.c
index b346d8a..2ff21c5 100644
--- a/objects/font.c
+++ b/objects/font.c
@@ -10,6 +10,7 @@
#include <stdlib.h>
#include <string.h>
#include <X11/Xatom.h>
+#include "user.h"
#include "gdi.h"
@@ -414,7 +415,7 @@
for (i = wFirstChar, j = 0; i <= wLastChar; i++, j++)
{
CI_GET_CHAR_INFO(xfont, i, def, cs);
- *(lpBuffer + j) = cs->width;
+ *(lpBuffer + j) = cs ? cs->width : xfont->max_bounds.width;
if (*(lpBuffer + j) < 0)
*(lpBuffer + j) = 0;
}
@@ -425,11 +426,138 @@
/*************************************************************************
* EnumFonts [GDI.70]
*/
-int EnumFonts(HDC hDC, LPSTR lpFaceName, FARPROC lpFontFunc, LPSTR lpData)
+int EnumFonts(HDC hDC, LPSTR lpFaceName, FARPROC lpEnumFunc, LPSTR lpData)
{
- printf("EMPTY STUB !!! EnumFonts(%04X, %08X, %08X, %08X)\n",
- hDC, lpFaceName, lpFontFunc, lpData);
- return -1;
+ HANDLE hLog;
+ HANDLE hMet;
+ LPLOGFONT lpLogFont;
+ LPTEXTMETRIC lptm;
+ int nRet;
+ printf("EnumFonts(%04X, %08X, %08X, %08X)\n",
+ hDC, lpFaceName, lpEnumFunc, lpData);
+ if (lpEnumFunc == NULL) return 0;
+ hLog = USER_HEAP_ALLOC(GMEM_MOVEABLE, sizeof(LOGFONT) + LF_FACESIZE);
+ lpLogFont = (LPLOGFONT) USER_HEAP_ADDR(hLog);
+ if (lpLogFont == NULL) {
+ printf("EnumFonts // can't alloc LOGFONT struct !\n");
+ return 0;
+ }
+ hMet = USER_HEAP_ALLOC(GMEM_MOVEABLE, sizeof(TEXTMETRIC));
+ lptm = (LPTEXTMETRIC) USER_HEAP_ADDR(hMet);
+ if (lptm == NULL) {
+ USER_HEAP_FREE(hLog);
+ printf("EnumFonts // can't alloc TEXTMETRIC struct !\n");
+ return 0;
+ }
+ while (TRUE) {
+ printf("EnumFonts // !\n");
+ lpLogFont->lfHeight = 18;
+ lpLogFont->lfWidth = 12;
+ lpLogFont->lfEscapement = 0;
+ lpLogFont->lfOrientation = 0;
+ lpLogFont->lfWeight = FW_REGULAR;
+ lpLogFont->lfItalic = 0;
+ lpLogFont->lfUnderline = 0;
+ lpLogFont->lfStrikeOut = 0;
+ lpLogFont->lfCharSet = ANSI_CHARSET;
+ lpLogFont->lfOutPrecision = OUT_DEFAULT_PRECIS;
+ lpLogFont->lfClipPrecision = CLIP_DEFAULT_PRECIS;
+ lpLogFont->lfQuality = DEFAULT_QUALITY;
+ lpLogFont->lfPitchAndFamily = FIXED_PITCH | FF_MODERN;
+ strcpy(lpLogFont->lfFaceName, "Courier");
+ printf("lpLogFont=%08X lptm=%08X\n", lpLogFont, lptm);
+#ifdef WINELIB
+ nRet = (*lpEnumFunc)(lpLogFont, lptm, 0, lpData);
+#else
+ nRet = CallBack16(lpEnumFunc, 4, 2, (int)lpLogFont,
+ 2, (int)lptm, 0, (int)0, 2, (int)lpData);
+#endif
+ if (nRet == 0) break;
+ lpLogFont->lfPitchAndFamily = VARIABLE_PITCH | FF_SWISS;
+ strcpy(lpLogFont->lfFaceName, "Helvetica");
+ printf("lpLogFont=%08X lptm=%08X\n", lpLogFont, lptm);
+#ifdef WINELIB
+ nRet = (*lpEnumFunc)(lpLogFont, lptm, 0, lpData);
+#else
+ nRet = CallBack16(lpEnumFunc, 4, 2, (int)lpLogFont,
+ 2, (int)lptm, 0, (int)0, 2, (int)lpData);
+#endif
+ if (nRet == 0) break;
+ else break;
+ }
+ USER_HEAP_FREE(hMet);
+ USER_HEAP_FREE(hLog);
+ return 0;
+}
+
+
+/*************************************************************************
+ * EnumFontFamilies [GDI.330]
+ */
+int EnumFontFamilies(HDC hDC, LPSTR lpszFamily, FARPROC lpEnumFunc, LPSTR lpData)
+{
+ HANDLE hLog;
+ HANDLE hMet;
+ LPLOGFONT lpLogFont;
+ LPTEXTMETRIC lptm;
+ int nRet;
+ printf("EnumFontFamilies(%04X, %08X, %08X, %08X)\n",
+ hDC, lpszFamily, lpEnumFunc, lpData);
+ if (lpEnumFunc == NULL) return 0;
+ hLog = USER_HEAP_ALLOC(GMEM_MOVEABLE, sizeof(LOGFONT) + LF_FACESIZE);
+ lpLogFont = (LPLOGFONT) USER_HEAP_ADDR(hLog);
+ if (lpLogFont == NULL) {
+ printf("EnumFontFamilies // can't alloc LOGFONT struct !\n");
+ return 0;
+ }
+ hMet = USER_HEAP_ALLOC(GMEM_MOVEABLE, sizeof(TEXTMETRIC));
+ lptm = (LPTEXTMETRIC) USER_HEAP_ADDR(hMet);
+ if (lptm == NULL) {
+ USER_HEAP_FREE(hLog);
+ printf("EnumFontFamilies // can't alloc TEXTMETRIC struct !\n");
+ return 0;
+ }
+ while (TRUE) {
+ printf("EnumFontFamilies // !\n");
+ lpLogFont->lfHeight = 12;
+ lpLogFont->lfWidth = 8;
+ lpLogFont->lfEscapement = 0;
+ lpLogFont->lfOrientation = 0;
+ lpLogFont->lfWeight = FW_REGULAR;
+ lpLogFont->lfItalic = 0;
+ lpLogFont->lfUnderline = 0;
+ lpLogFont->lfStrikeOut = 0;
+ lpLogFont->lfCharSet = ANSI_CHARSET;
+ lpLogFont->lfOutPrecision = OUT_DEFAULT_PRECIS;
+ lpLogFont->lfClipPrecision = CLIP_DEFAULT_PRECIS;
+ lpLogFont->lfQuality = DEFAULT_QUALITY;
+ lpLogFont->lfPitchAndFamily = FIXED_PITCH | FF_MODERN;
+ strcpy(lpLogFont->lfFaceName, "Courier");
+/* lpLogFont->lfFullName[LF_FACESIZE] = 12;
+ lpLogFont->lfStyle[LF_FACESIZE] = 12; */
+ printf("lpLogFont=%08X lptm=%08X\n", lpLogFont, lptm);
+#ifdef WINELIB
+ nRet = (*lpEnumFunc)(lpLogFont, lptm, 0, lpData);
+#else
+ nRet = CallBack16(lpEnumFunc, 4, 2, (int)lpLogFont,
+ 2, (int)lptm, 0, (int)0, 2, (int)lpData);
+#endif
+ if (nRet == 0) break;
+ lpLogFont->lfPitchAndFamily = VARIABLE_PITCH | FF_SWISS;
+ strcpy(lpLogFont->lfFaceName, "Helvetica");
+ printf("lpLogFont=%08X lptm=%08X\n", lpLogFont, lptm);
+#ifdef WINELIB
+ nRet = (*lpEnumFunc)(lpLogFont, lptm, 0, lpData);
+#else
+ nRet = CallBack16(lpEnumFunc, 4, 2, (int)lpLogFont,
+ 2, (int)lptm, 0, (int)0, 2, (int)lpData);
+#endif
+ if (nRet == 0) break;
+ else break;
+ }
+ USER_HEAP_FREE(hMet);
+ USER_HEAP_FREE(hLog);
+ return 0;
}
diff --git a/objects/gdiobj.c b/objects/gdiobj.c
index cd78887..6243fd2 100644
--- a/objects/gdiobj.c
+++ b/objects/gdiobj.c
@@ -356,7 +356,11 @@
if (!ptr) return 0;
dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
- if (!dc) return 0;
+ if (!dc)
+ {
+ dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
+ if (!dc) return 0;
+ }
switch(ptr->wMagic)
{
diff --git a/objects/pen.c b/objects/pen.c
index 48da252..cf3089f 100644
--- a/objects/pen.c
+++ b/objects/pen.c
@@ -7,6 +7,7 @@
static char Copyright[] = "Copyright Alexandre Julliard, 1993";
#include "gdi.h"
+#include "metafile.h"
extern WORD COLOR_ToPhysical( DC *dc, COLORREF color );
@@ -60,8 +61,11 @@
static char dash_dot[] = { 2, 2 }; /* -- -- -- -- -- -- */
static char dash_dashdot[] = { 4,3,2,3 }; /* ---- -- ---- -- */
static char dash_dashdotdot[] = { 4,2,2,2,2,2 }; /* ---- -- -- ---- */
-
HPEN prevHandle = dc->w.hPen;
+
+ if (dc->header.wMagic == METAFILE_DC_MAGIC)
+ return MF_CreatePenIndirect(dc, &(pen->logpen));
+
dc->w.hPen = hpen;
dc->u.x.pen.style = pen->logpen.lopnStyle;
diff --git a/objects/text.c b/objects/text.c
index ae01b20..0d9690b 100644
--- a/objects/text.c
+++ b/objects/text.c
@@ -9,6 +9,7 @@
#include <X11/Xatom.h>
#include "windows.h"
#include "gdi.h"
+#include "metafile.h"
#define TAB 9
#define LF 10
@@ -255,7 +256,14 @@
XFontStruct *font;
DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
- if (!dc) return FALSE;
+ if (!dc)
+ {
+ dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
+ if (!dc) return FALSE;
+ MF_TextOut(dc, x, y, str, count);
+ return TRUE;
+ }
+
if (!DC_SetupGCForText( dc )) return TRUE;
font = dc->u.x.font.fstruct;
@@ -403,3 +411,17 @@
return s;
}
}
+
+/***********************************************************************
+ * ExtTextOut [GDI.351]
+ */
+BOOL ExtTextOut(HDC hDC, short x, short y, WORD wOptions, LPRECT lprect,
+ LPSTR str, WORD count, LPINT lpDx)
+{
+ printf("EMPTY STUB !!! ExtTextOut(); ! (call TextOut() for new)\n");
+ TextOut(hDC, x, y, str, count);
+ return FALSE;
+}
+
+
+
diff --git a/windows/class.c b/windows/class.c
index 68277c6..753ee0d 100644
--- a/windows/class.c
+++ b/windows/class.c
@@ -110,6 +110,11 @@
if (!(prevClassPtr->wc.style & CS_GLOBALCLASS)) return 0;
}
+ /* bug for bug compatible */
+
+ if (class->cbClsExtra < 0) class->cbClsExtra = 0;
+ if (class->cbWndExtra < 0) class->cbWndExtra = 0;
+
/* Create class */
handle = USER_HEAP_ALLOC( GMEM_MOVEABLE, sizeof(CLASS)+class->cbClsExtra );
diff --git a/windows/dc.c b/windows/dc.c
index 58dd531..c5cc0c7 100644
--- a/windows/dc.c
+++ b/windows/dc.c
@@ -10,6 +10,7 @@
#include <string.h>
#include "gdi.h"
#include "bitmap.h"
+#include "metafile.h"
static DeviceCaps * displayDevCaps = NULL;
@@ -104,6 +105,7 @@
SelectObject( hdc, dc->w.hFont );
XSetGraphicsExposures( XT_display, dc->u.x.gc, False );
CLIPPING_SetDeviceClipping( dc );
+ FONT_SelectObject(dc, STOCK_SYSTEM_FIXED_FONT, NULL);
}
@@ -477,7 +479,13 @@
{
COLORREF oldColor;
DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
- if (!dc) return 0x80000000;
+ if (!dc)
+ {
+ dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
+ if (!dc) return 0x80000000;
+ MF_MetaParam2(dc, META_SETBKCOLOR, HIWORD(color), LOWORD(color));
+ return 0; /* ?? */
+ }
oldColor = dc->w.backgroundColor;
dc->w.backgroundColor = color;
@@ -493,7 +501,13 @@
{
COLORREF oldColor;
DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
- if (!dc) return 0x80000000;
+ if (!dc)
+ {
+ dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
+ if (!dc) return 0x80000000;
+ MF_MetaParam2(dc, META_SETTEXTCOLOR, HIWORD(color), LOWORD(color));
+ return 0; /* ?? */
+ }
oldColor = dc->w.textColor;
dc->w.textColor = color;
diff --git a/windows/dialog.c b/windows/dialog.c
index 379b0b0..7724084 100644
--- a/windows/dialog.c
+++ b/windows/dialog.c
@@ -4,6 +4,8 @@
* Copyright 1993 Alexandre Julliard
*/
+#define DEBUG_DIALOG /* */
+
static char Copyright[] = "Copyright Alexandre Julliard, 1993";
#include <stdlib.h>
@@ -267,6 +269,9 @@
return 0;
}
+ ShowWindow(hwnd, SW_SHOWNORMAL);
+ UpdateWindow(hwnd);
+
/* Create control windows */
#ifdef DEBUG_DIALOG
diff --git a/windows/graphics.c b/windows/graphics.c
index 2594c91..a80d5cf 100644
--- a/windows/graphics.c
+++ b/windows/graphics.c
@@ -26,7 +26,14 @@
BOOL LineTo( HDC hdc, short x, short y )
{
DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
- if (!dc) return FALSE;
+ if (!dc)
+ {
+ dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
+ if (!dc) return FALSE;
+ MF_MetaParam2(dc, META_LINETO, x, y);
+ return TRUE;
+ }
+
if (DC_SetupGCForPen( dc ))
XDrawLine(XT_display, dc->u.x.drawable, dc->u.x.gc,
dc->w.DCOrgX + XLPTODP( dc, dc->w.CursPosX ),
@@ -44,9 +51,21 @@
*/
DWORD MoveTo( HDC hdc, short x, short y )
{
- POINT pt;
- if (MoveToEx( hdc, x, y, &pt )) return pt.x | (pt.y << 16);
- else return 0;
+ short oldx, oldy;
+ DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
+ if (!dc)
+ {
+ dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
+ if (!dc) return FALSE;
+ MF_MetaParam2(dc, META_MOVETO, x, y);
+ return 0;
+ }
+
+ oldx = dc->w.CursPosX;
+ oldy = dc->w.CursPosY;
+ dc->w.CursPosX = x;
+ dc->w.CursPosY = y;
+ return oldx | (oldy << 16);
}
@@ -81,7 +100,29 @@
double start_angle, end_angle, diff_angle;
XPoint points[3];
DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
- if (!dc) return FALSE;
+ if (!dc)
+ {
+ dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
+ if (!dc) return FALSE;
+ switch (lines)
+ {
+ case 0:
+ MF_MetaParam8(dc, META_ARC, left, top, right, bottom,
+ xstart, ystart, xend, yend);
+ break;
+
+ case 1:
+ MF_MetaParam8(dc, META_CHORD, left, top, right, bottom,
+ xstart, ystart, xend, yend);
+ break;
+
+ case 2:
+ MF_MetaParam8(dc, META_PIE, left, top, right, bottom,
+ xstart, ystart, xend, yend);
+ break;
+ }
+ return 0;
+ }
left = XLPTODP( dc, left );
top = YLPTODP( dc, top );
@@ -166,7 +207,13 @@
BOOL Ellipse( HDC hdc, int left, int top, int right, int bottom )
{
DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
- if (!dc) return FALSE;
+ if (!dc)
+ {
+ dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
+ if (!dc) return FALSE;
+ MF_MetaParam4(dc, META_ELLIPSE, left, top, right, bottom);
+ return 0;
+ }
left = XLPTODP( dc, left );
top = YLPTODP( dc, top );
@@ -192,7 +239,13 @@
BOOL Rectangle( HDC hdc, int left, int top, int right, int bottom )
{
DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
- if (!dc) return FALSE;
+ if (!dc)
+ {
+ dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
+ if (!dc) return FALSE;
+ MF_MetaParam4(dc, META_RECTANGLE, left, top, right, bottom);
+ return TRUE;
+ }
left = XLPTODP( dc, left );
top = YLPTODP( dc, top );
@@ -219,7 +272,14 @@
{
int x1, y1, x2, y2;
DC * dc = (DC *) GDI_GetObjPtr(hDC, DC_MAGIC);
- if (!dc) return FALSE;
+ if (!dc)
+ {
+ dc = (DC *)GDI_GetObjPtr(hDC, METAFILE_DC_MAGIC);
+ if (!dc) return FALSE;
+ MF_MetaParam6(dc, META_ROUNDRECT, left, top, right, bottom,
+ ell_width, ell_height);
+ return TRUE;
+ }
/*
printf("RoundRect(%d %d %d %d %d %d\n",
left, top, right, bottom, ell_width, ell_height);
@@ -350,7 +410,13 @@
PALETTEENTRY entry;
DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
- if (!dc) return 0;
+ if (!dc)
+ {
+ dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
+ if (!dc) return 0;
+ MF_MetaParam4(dc, META_SETPIXEL, x, y, HIWORD(color), LOWORD(color));
+ return 1;
+ }
x = dc->w.DCOrgX + XLPTODP( dc, x );
y = dc->w.DCOrgY + YLPTODP( dc, y );
@@ -522,25 +588,32 @@
*/
BOOL Polyline (HDC hdc, LPPOINT pt, int count)
{
- register int i;
- DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
+ register int i;
+ DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
+ if (!dc)
+ {
+ dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
+ if (!dc) return FALSE;
+ MF_MetaPoly(dc, META_POLYLINE, pt, count);
+ return TRUE;
+ }
- if (DC_SetupGCForPen( dc ))
- {
- for (i = 0; i < count-1; i ++)
- XDrawLine (XT_display, dc->u.x.drawable, dc->u.x.gc,
- dc->w.DCOrgX + XLPTODP(dc, pt [i].x),
- dc->w.DCOrgY + YLPTODP(dc, pt [i].y),
- dc->w.DCOrgX + XLPTODP(dc, pt [i+1].x),
- dc->w.DCOrgY + YLPTODP(dc, pt [i+1].y));
- XDrawLine (XT_display, dc->u.x.drawable, dc->u.x.gc,
- dc->w.DCOrgX + XLPTODP(dc, pt [count-1].x),
- dc->w.DCOrgY + YLPTODP(dc, pt [count-1].y),
- dc->w.DCOrgX + XLPTODP(dc, pt [0].x),
- dc->w.DCOrgY + YLPTODP(dc, pt [0].y));
- }
+ if (DC_SetupGCForPen( dc ))
+ {
+ for (i = 0; i < count-1; i ++)
+ XDrawLine (XT_display, dc->u.x.drawable, dc->u.x.gc,
+ dc->w.DCOrgX + XLPTODP(dc, pt [i].x),
+ dc->w.DCOrgY + YLPTODP(dc, pt [i].y),
+ dc->w.DCOrgX + XLPTODP(dc, pt [i+1].x),
+ dc->w.DCOrgY + YLPTODP(dc, pt [i+1].y));
+ XDrawLine (XT_display, dc->u.x.drawable, dc->u.x.gc,
+ dc->w.DCOrgX + XLPTODP(dc, pt [count-1].x),
+ dc->w.DCOrgY + YLPTODP(dc, pt [count-1].y),
+ dc->w.DCOrgX + XLPTODP(dc, pt [0].x),
+ dc->w.DCOrgY + YLPTODP(dc, pt [0].y));
+ }
- return (TRUE);
+ return (TRUE);
}
@@ -549,31 +622,39 @@
*/
BOOL Polygon (HDC hdc, LPPOINT pt, int count)
{
- register int i;
- DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
- XPoint *points = (XPoint *) malloc (sizeof (XPoint) * count+1);
+ register int i;
+ DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
+ XPoint *points = (XPoint *) malloc (sizeof (XPoint) * count+1);
- if (DC_SetupGCForBrush( dc ))
- {
+ if (!dc)
+ {
+ dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
+ if (!dc) return FALSE;
+ MF_MetaPoly(dc, META_POLYGON, pt, count);
+ return TRUE;
+ }
+
+ if (DC_SetupGCForBrush( dc ))
+ {
- for (i = 0; i < count; i++)
- {
- points [i].x = dc->w.DCOrgX + XLPTODP(dc, pt [i].x);
- points [i].y = dc->w.DCOrgY + YLPTODP(dc, pt [i].y);
- }
- points [count] = points [0];
-
- XFillPolygon( XT_display, dc->u.x.drawable, dc->u.x.gc,
- points, count, Complex, CoordModeOrigin);
-
- if (DC_SetupGCForPen ( dc ))
- {
- XDrawLines( XT_display, dc->u.x.drawable, dc->u.x.gc,
- points, count, CoordModeOrigin );
- }
+ for (i = 0; i < count; i++)
+ {
+ points [i].x = dc->w.DCOrgX + XLPTODP(dc, pt [i].x);
+ points [i].y = dc->w.DCOrgY + YLPTODP(dc, pt [i].y);
}
- free ((void *) points);
- return (TRUE);
+ points [count] = points [0];
+
+ XFillPolygon( XT_display, dc->u.x.drawable, dc->u.x.gc,
+ points, count, Complex, CoordModeOrigin);
+
+ if (DC_SetupGCForPen ( dc ))
+ {
+ XDrawLines( XT_display, dc->u.x.drawable, dc->u.x.gc,
+ points, count, CoordModeOrigin );
+ }
+ }
+ free ((void *) points);
+ return (TRUE);
}
/**********************************************************************
@@ -619,51 +700,57 @@
*/
BOOL FloodFill(HDC hdc, short x, short y, DWORD crColor)
{
- Pixel boundrypixel;
- int imagex, imagey;
- XImage *image;
- DC *dc;
+ Pixel boundrypixel;
+ int imagex, imagey;
+ XImage *image;
+ DC *dc;
#ifdef DEBUG_GRAPHICS
- printf("FloodFill %x %d,%d %x\n", hdc, x, y, crColor);
+ printf("FloodFill %x %d,%d %x\n", hdc, x, y, crColor);
#endif
- dc = (DC *) GDI_GetObjPtr(hdc, DC_MAGIC);
-
- if (!dc) return 0;
-
- x = dc->w.DCOrgX + XLPTODP(dc, x);
- y = dc->w.DCOrgY + YLPTODP(dc, y);
-
- if (x < dc->w.DCOrgX || x > dc->w.DCOrgX + dc->w.DCSizeX ||
- y < dc->w.DCOrgY || y > dc->w.DCOrgY + dc->w.DCSizeY)
- return 0;
-
- if (!DC_SetupGCForBrush(dc))
- return FALSE;
-
- boundrypixel = GetNearestPaletteIndex( dc->w.hPalette, crColor );
-
- image = XGetImage(display, dc->u.x.drawable,
- dc->w.DCOrgX, dc->w.DCOrgY,
- dc->w.DCSizeX, dc->w.DCSizeY, AllPlanes, ZPixmap);
- if (XGetPixel(image, x, y) == boundrypixel)
- return FALSE;
- if (!FloodFill_rec(image, x, y,
- 0,0,
- dc->w.DCOrgX + dc->w.DCSizeX,
- dc->w.DCOrgY + dc->w.DCSizeY,
- boundrypixel, dc->u.x.brush.pixel)) {
- XDestroyImage(image);
- return 0;
- }
-
- XPutImage(display, dc->u.x.drawable, dc->u.x.gc, image,
- 0, 0,
- dc->w.DCOrgX, dc->w.DCOrgY,
- dc->w.DCSizeX, dc->w.DCSizeY);
- XDestroyImage(image);
-
+ dc = (DC *) GDI_GetObjPtr(hdc, DC_MAGIC);
+ if (!dc)
+ {
+ dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
+ if (!dc) return FALSE;
+ MF_MetaParam4(dc, META_FLOODFILL, x, y, HIWORD(crColor),
+ LOWORD(crColor));
return TRUE;
+ }
+
+ x = dc->w.DCOrgX + XLPTODP(dc, x);
+ y = dc->w.DCOrgY + YLPTODP(dc, y);
+
+ if (x < dc->w.DCOrgX || x > dc->w.DCOrgX + dc->w.DCSizeX ||
+ y < dc->w.DCOrgY || y > dc->w.DCOrgY + dc->w.DCSizeY)
+ return FALSE;
+
+ if (!DC_SetupGCForBrush(dc))
+ return FALSE;
+
+ boundrypixel = GetNearestPaletteIndex( dc->w.hPalette, crColor );
+
+ image = XGetImage(display, dc->u.x.drawable,
+ dc->w.DCOrgX, dc->w.DCOrgY,
+ dc->w.DCSizeX, dc->w.DCSizeY, AllPlanes, ZPixmap);
+ if (XGetPixel(image, x, y) == boundrypixel)
+ return FALSE;
+ if (!FloodFill_rec(image, x, y,
+ 0, 0,
+ dc->w.DCOrgX + dc->w.DCSizeX,
+ dc->w.DCOrgY + dc->w.DCSizeY,
+ boundrypixel, dc->u.x.brush.pixel)) {
+ XDestroyImage(image);
+ return FALSE;
+ }
+
+ XPutImage(display, dc->u.x.drawable, dc->u.x.gc, image,
+ 0, 0,
+ dc->w.DCOrgX, dc->w.DCOrgY,
+ dc->w.DCSizeX, dc->w.DCSizeY);
+ XDestroyImage(image);
+
+ return TRUE;
}
diff --git a/windows/mapping.c b/windows/mapping.c
index e361a0f..b7a4753 100644
--- a/windows/mapping.c
+++ b/windows/mapping.c
@@ -7,6 +7,7 @@
static char Copyright[] = "Copyright Alexandre Julliard, 1993";
#include "gdi.h"
+#include "metafile.h"
/***********************************************************************
@@ -75,7 +76,13 @@
{
WORD prevMode;
DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
- if (!dc) return 0;
+ if (!dc)
+ {
+ dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
+ if (!dc) return 0;
+ MF_MetaParam1(dc, META_SETMAPMODE, mode);
+ return 1;
+ }
#ifdef DEBUG_GDI
printf( "SetMapMode: %d %d\n", hdc, mode );
diff --git a/windows/utility.c b/windows/utility.c
index 00e1683..c16616d 100644
--- a/windows/utility.c
+++ b/windows/utility.c
@@ -52,7 +52,7 @@
int
DebugPrintString(char *str)
{
- printf("%s", str);
+ fprintf(stderr, "%s", str);
return 0;
}
@@ -78,7 +78,7 @@
static void UTILITY_qualify(const char *source, char *dest)
{
#ifdef debug_utility
- printf("UTILITY_qualify(\"%s\", \"%s\");\n", source, dest);
+ fprintf(stderr, "UTILITY_qualify(\"%s\", \"%s\");\n", source, dest);
#endif
if(!source) return; /* Dumbass attack! */
while(*source) {
@@ -130,7 +130,7 @@
if(*format) {
char modifier = ' ';
#ifdef debug_utility
- printf("found:\t\"%%");
+ fprintf(stderr, "found:\t\"%%");
#endif
format++; /* skip past '%' */
/* First skip the flags, field width, etc. */
@@ -138,39 +138,39 @@
if ((*format == '#') || (*format == '-') || (*format == '+')
|| (*format == ' ')) {
#ifdef debug_utility
- printf("%c", *format);
+ fprintf(stderr, "%c", *format);
#endif
format++;
}
/* Now the field width, etc. */
while(isdigit(*format)) {
#ifdef debug_utility
- printf("%c", *format);
+ fprintf(stderr, "%c", *format);
#endif
format++;
}
if(*format == '.') {
#ifdef debug_utility
- printf("%c", *format);
+ fprintf(stderr, "%c", *format);
#endif
format++;
}
while(isdigit(*format)) {
#ifdef debug_utility
- printf("%c", *format);
+ fprintf(stderr, "%c", *format);
#endif
format++;
}
/* Now we handle the rest */
if((*format == 'h') || (*format == 'l') || (*format == 'L')) {
#ifdef debug_utility
- printf("%c", modifier);
+ fprintf(stderr, "%c", modifier);
#endif
modifier = *(format++);
}
/* Handle the actual type. */
#ifdef debug_utility
- printf("%c\"\n", *format);
+ fprintf(stderr, "%c\"\n", *format);
#endif
switch(*format) {
case 'd':
@@ -200,7 +200,7 @@
};
#undef INT_SIZE
#ifdef debug_utility
- printf("UTILITY_argsize: returning %i\n", size);
+ fprintf(stderr, "UTILITY_argsize: returning %i\n", size);
#endif
return size;
};
@@ -228,7 +228,7 @@
if(*format) {
char modifier = ' ';
#ifdef debug_utility
- printf("found:\t\"%%");
+ fprintf(stderr, "found:\t\"%%");
#endif
format++; /* skip past '%' */
/* First skip the flags, field width, etc. */
@@ -244,7 +244,7 @@
modifier = *(format++);
/* Handle the actual type. */
#ifdef debug_utility
- printf("%c\"\n", *format);
+ fprintf(stderr, "%c\"\n", *format);
#endif
switch(*format) {
case 'd':
@@ -282,18 +282,132 @@
return result;
};
+#ifndef WINELIB
+INT windows_wsprintf(BYTE *win_stack)
+{
+ LPSTR lpOutput, lpFormat;
+ BYTE *new_stack, *stack_ptr, *ptr;
+ int stacklength, result;
+
+ lpOutput = (LPSTR) *(DWORD*)win_stack;
+ win_stack += 4;
+ lpFormat = (LPSTR) *(DWORD*)win_stack;
+ win_stack += 4;
+
+ /* determine # of bytes pushed on 16-bit stack by checking printf's
+ format string */
+
+ ptr = lpFormat;
+ stacklength = 0;
+ do {
+ if (*ptr++ != '%')
+ continue;
+
+ /* skip width/precision */
+ while ( *ptr == '-' || *ptr == '+' || *ptr == '.' ||
+ *ptr == ' ' || isdigit(*ptr))
+ ptr++;
+
+ switch(*ptr++) {
+ case 'l': ptr++; /* skip next type character */
+ stacklength += 4;
+ continue;
+ case 's':
+ stacklength += 4;
+ continue;
+ case 'c':
+ case 'd':
+ case 'i':
+ case 'u':
+ case 'x':
+ case 'X':
+ stacklength += 2;
+ continue;
+ default:
+ fprintf(stderr, "wsprintf: oops, unknown formattype `%c' used!\n", *ptr);
+ }
+ } while (*ptr);
+
+ /* create 32-bit stack for libc's vsprintf() */
+
+ new_stack = malloc(2 * stacklength);
+ stack_ptr = new_stack + 2 * stacklength;
+ win_stack += stacklength;
+ ptr = lpFormat;
+ do {
+ if (*ptr++ != '%')
+ continue;
+
+ /* skip width/precision */
+ while ( *ptr == '-' || *ptr == '+' || *ptr == '.' ||
+ *ptr == ' ' || isdigit(*ptr))
+ ptr++;
+
+ switch(*ptr++) {
+ case 's':
+ stack_ptr -= 4;
+ win_stack -= 4;
+ *(DWORD*)stack_ptr = *(DWORD*)win_stack;
+ continue;
+ case 'l':
+ stack_ptr -= 4;
+ win_stack -= 4;
+ *(DWORD*)stack_ptr = *(DWORD*)win_stack;
+ ptr++; /* skip next type character */
+ continue;
+ case 'c':
+ stack_ptr -= 4;
+ win_stack -= 2;
+
+/* windows' wsprintf() %c ignores 0's, we replace 0 with 1 to make sure
+ that the remaining part of the string isn't ignored by the winapp */
+
+ if (*(WORD*)win_stack)
+ *(DWORD*)stack_ptr = *(WORD*)win_stack;
+ else
+ *(DWORD*)stack_ptr = 1;
+ continue;
+ case 'd':
+ case 'i':
+ stack_ptr -= 4;
+ win_stack -= 2;
+ *(int*)stack_ptr = *(INT*)win_stack;
+ continue;
+ case 'u':
+ case 'x':
+ case 'X':
+ stack_ptr -= 4;
+ win_stack -= 2;
+ *(DWORD*)stack_ptr = *(WORD*)win_stack;
+ continue;
+ default:
+ stack_ptr -= 4;
+ win_stack -= 4;
+ *(DWORD*)stack_ptr = 0;
+ fprintf(stderr, "wsprintf: oops, unknown formattype %c used!\n", *ptr);
+ }
+ } while (*ptr);
+
+ result = vsprintf(lpOutput, lpFormat, stack_ptr);
+ free(new_stack);
+
+ return result;
+}
+#endif
/**************************************************************************
- * wsprintf [USER.420]
+ * wsprintf [USER.420] (not used by relay)
*/
int wsprintf(LPSTR lpOutput, LPSTR lpFormat, ...)
{
-va_list valist;
-int ArgCnt;
-va_start(valist, lpFormat);
-ArgCnt = vsprintf(lpOutput, lpFormat, valist);
-va_end(valist);
-return (ArgCnt);
+ va_list valist;
+ int ArgCnt;
+
+ va_start(valist, lpFormat);
+ ArgCnt = vsprintf(lpOutput, lpFormat, valist);
+ va_end(valist);
+
+ return ArgCnt;
}
@@ -320,12 +434,11 @@
/* Change the format string so that ints are handled as short by
default */
- UTILITY_qualify(format, qualified_fmt);
/* Convert agruments to 32-bit values */
newargs = UTILITY_convertArgs(format, args);
-
result = vsprintf(buf, qualified_fmt, newargs);
+
free(newargs);
return result;
};
diff --git a/windows/win.c b/windows/win.c
index aac7dcd..572dfe6 100644
--- a/windows/win.c
+++ b/windows/win.c
@@ -971,6 +971,15 @@
return FALSE;
}
+/*******************************************************************
+ * FlashWindow [USER.105]
+ */
+BOOL FlashWindow(HWND hWnd, BOOL bInvert)
+{
+ printf("EMPTY STUB !! FlashWindow !\n");
+ return FALSE;
+}
+
/*******************************************************************
* SetSysModalWindow [USER.188]