Release 941030
Sun Oct 30 13:01:18 1994 Alexandre Julliard (julliard@lamisun.epfl.ch)
* [controls/static.c]
Bug fix for SS_ICON controls.
* [if1632/Imakefile]
Fixed call.o dependencies.
* [objects/clipping.c] [objects/dc.c]
Fixed visible region handling. hVisRgn is always non-null now.
* [windows/dce.c]
Bug fix in GetDCEx for CS_OWNDC windows.
* [windows/nonclient.c] [windows/painting.c]
Fixes to icon window drawing.
* [windows/winpos.c]
A few fixes in SetWindowPos().
Sun Oct 30 12:50:24 1994 Michael Patra <micky@marie.physik.tu-berlin.de>
* [objects/bitblt.c]
BitBlt(): BitBlt is now able to handle any raster operation. If
the request can't be passed to XWindows directly, it's quite
slow, though.
* [*/*.c]
[misc/main.c]
Improvements of the system for handling debug messages. Options are
now also loaded from /usr/lib/X11/app-defaults/Wine (insert
*debugoptions: +xxx there if you want to have turn messages xxx on).
* [controls/menu.c]
DestroyMenu(): The whole window won't be destroyed as a sideeffect
any longer.
* [misc/file.c]
OpenFile(): Fixed bug in searching in system/window-directory.
Sun Oct 30 12:25:53 1994 Jimmy Tirtawangsa <j0t2527@tam2000.tamu.edu>
* [include/windows.h]
Bug fix for window related structures.
DCB and COMSTAT are affected. They must be packed.
* [misc/comm.c]
Bug fix for COM ports:
Dial and dialog window in terminal.exe now works.
Non sequential COM assignments in wine.conf should not break now.
Baudrate can be specified in wine.conf to overcome baudrate limitation
in mswindow. See sample wine.ini
* [include/comm.h]
add baudrate field to DosDeviceStructre
* [object/font.c]
Bug fix for font assignment.
Use pairs of foundry and family fontnames in X11 to correspond with
window's fonts.
Put font assignment ini wine.ini.
* [wine.ini]
Adding optional baudrate after port name in "serialports" section
Add new section, "fonts".
"default" is special key in "fonts" to match any unmatch window font.
Oct 29, 94 (new address) wine@trgcorp.mksinfo.qc.ca (Martin Ayotte)
* [if1632/relay.c]
* [if1632/commdlg.spec] New file.
* [misc/commdlg.c] New file.
* [include/commdlg.h] New file.
Begin of an emulated COMMDLG DLL, built-in for now.
(BTW, if you want to switch between built-in & 16bits CommDlg, only
thing you need to do is to put the real/dummy name in file relay.c)
* [controls/scroll.c]
* [controls/combo.c]
* [controls/listbox.c]
Few bug fixes and/or cosmetic.
* [misc/audio.c]
* [misc/mmaux.c]
bug fixes and flags returned to emulate SB16.
* [misc/midi.c] New file.
skeleton for 'Midi' MMSYSTEM & MCI driver.
* [misc/mcianim.c] New file.
skeleton for 'Animation1' MCI driver.
* [windows/win.c]
Add new stub for GetLastActiveWindow().
Tue Oct 25 09:17:25 1994 Olaf Flebbe (flebbe@tat.physik.uni-tuebingen.de)
* [if1632/call.S] [tools/build.c]
Support for ELF format. (Not complete)
Sun Oct 23 00:51:50 1994 Paul Falstad (pf@zoof)
* [if1632/user.spec]
Add stubs for ArrangeIconicWindows(), etc.
* [if1632/kernel.spec]
Add IsBad*Ptr() functions.
* [loader/signal.c]
Add test_memory(), for use with IsBad*Ptr().
* [windows/winpos.c]
Add stubs for TileChildWindows(), etc.
* [windows/win.c]
IsWindow() shouldn't crash if it's given a bad handle.
Add stub for GetLastActivePopup().
* [memory/global.c]
Implement the IsBad*Ptr() functions.
* [controls/listbox.c]
Return the full longword of the item data in LB_GETITEMDATA.
* [controls/edit.c]
Don't let the user select an area past the end of the text.
* [objects/text.c]
In DrawText(), the code to delete crlfs also removed multiple
consecutive newlines. Also, using DT_CALCRECT didn't return
the right height, and the width wasn't returned at all.
This caused MessageBoxes to be missing much of their text.
* [windows/scroll.c]
ScrollWindow[Ex] didn't work right with null LPRECT arguments.
Fri Oct 21 21:47:19 1994 Paul Falstad (pf@zoof.cts.com)
* [miscemu/int21.c]
Fixed int21 0x42 handler to properly assemble 32-bit seek ptr.
* [misc/property.c]
Fixed inverted logic in EnumProps(), and changed CallBack16()
call to use new arg format.
* [windows/win.c]
Fixed CallBack16() call in Enum[Child]Windows to use new arg
format; this fixes crashes in enum procedures.
Wed Oct 19 21:30:00 PDT 1994 martin@cs.csufresno.edu
* [misc/clipboard.c]
[windows/event.c]
[windows/message.c]
Added cut and paste between Wine and other X clients via
the PRIMARY selection. Text only this time.
* [controls/edit.c]
EDIT_LineLength, EDIT_TextLine return 0 for lines after last one.
* [windows/defwnd.c]
Send WM_SYSCOMMAND to overlapped ancestor window,
not the receiver of WM_SYSKEYDOWN
Sat Oct 22 15:01:02 1994 Thomas Sandford <t.d.g.sandford@bradford.ac.uk>
* [controls/edit.c]
ClientWidth()/ClientHeight() macros: return 0 if size would
be negative
EDIT_StrLength(): takes unsigned char* instead of char*
* [controls/listbox.c]
ListBoxWndProc(): in "case WM_MOUSEMOVE" - set lphl at start of
case instead of in each place required (it was omitted in
some places causing problems!)
* [controls/menu.c]
MENU_CalcItemSize(): don't try to find size of a text item
if the pointer is NULL
* [include/heap.h]
added definition of HEAP_LocalInit()
* [include/msdos.h]
removed buggy pointer() macro (use SAFEMAKEPTR() from segmem.h
instead)
* [loader/selector.c]
IPCCopySelector(): added missing flags to shmget() call
? does this break linux - I added these flags in a previous
patch but they were missing in the corresponding release ?
* [loader/signal.c]
win_fault(): added missing definitions of i, dump for those
not running NetBSD or linux
* [misc/dos_fs.c]
DOS_GetCurrentDir(): made temp[] static so it can be safely
returned
* [miscemu/int21.c,int25.c,int26.c]
Changed all invocations of pointer() to SAFEMAKEPTR(). Included
segmem.h where necessary.
* [windows/dialog.c]
CreateDialogIndirectParam(): Changed HEAP_Init() call to
HEAP_LocalInit(), removed redundant variables
Sat Oct 22 00:29:41 MET 1994 Dag Asheim (dash@ifi.uio.no)
* [loader/library.c] [loader/main.c] [loader/ne_image.c]
[misc/exec.c] [miscemu/int10.c] [miscemu/int21.c]
[objects/bitblt.c] [objects/metafile.c]
Rewritten more printf's to use the new debugging system, and
made wine less verbose per default. Use "-debugmsg +module"
to get (almost) the same behavior as before.
diff --git a/ChangeLog b/ChangeLog
index 0ec9eaa..37409fe 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,222 @@
+----------------------------------------------------------------------
+Sun Oct 30 13:01:18 1994 Alexandre Julliard (julliard@lamisun.epfl.ch)
+
+ * [controls/static.c]
+ Bug fix for SS_ICON controls.
+
+ * [if1632/Imakefile]
+ Fixed call.o dependencies.
+
+ * [objects/clipping.c] [objects/dc.c]
+ Fixed visible region handling. hVisRgn is always non-null now.
+
+ * [windows/dce.c]
+ Bug fix in GetDCEx for CS_OWNDC windows.
+
+ * [windows/nonclient.c] [windows/painting.c]
+ Fixes to icon window drawing.
+
+ * [windows/winpos.c]
+ A few fixes in SetWindowPos().
+
+Sun Oct 30 12:50:24 1994 Michael Patra <micky@marie.physik.tu-berlin.de>
+
+ * [objects/bitblt.c]
+ BitBlt(): BitBlt is now able to handle any raster operation. If
+ the request can't be passed to XWindows directly, it's quite
+ slow, though.
+
+ * [*/*.c]
+ [misc/main.c]
+ Improvements of the system for handling debug messages. Options are
+ now also loaded from /usr/lib/X11/app-defaults/Wine (insert
+ *debugoptions: +xxx there if you want to have turn messages xxx on).
+
+ * [controls/menu.c]
+ DestroyMenu(): The whole window won't be destroyed as a sideeffect
+ any longer.
+
+ * [misc/file.c]
+ OpenFile(): Fixed bug in searching in system/window-directory.
+
+Sun Oct 30 12:25:53 1994 Jimmy Tirtawangsa <j0t2527@tam2000.tamu.edu>
+
+ * [include/windows.h]
+ Bug fix for window related structures.
+ DCB and COMSTAT are affected. They must be packed.
+
+ * [misc/comm.c]
+ Bug fix for COM ports:
+ Dial and dialog window in terminal.exe now works.
+ Non sequential COM assignments in wine.conf should not break now.
+ Baudrate can be specified in wine.conf to overcome baudrate limitation
+ in mswindow. See sample wine.ini
+
+ * [include/comm.h]
+ add baudrate field to DosDeviceStructre
+
+ * [object/font.c]
+ Bug fix for font assignment.
+ Use pairs of foundry and family fontnames in X11 to correspond with
+ window's fonts.
+ Put font assignment ini wine.ini.
+
+ * [wine.ini]
+ Adding optional baudrate after port name in "serialports" section
+ Add new section, "fonts".
+ "default" is special key in "fonts" to match any unmatch window font.
+
+Oct 29, 94 (new address) wine@trgcorp.mksinfo.qc.ca (Martin Ayotte)
+
+ * [if1632/relay.c]
+ * [if1632/commdlg.spec] New file.
+ * [misc/commdlg.c] New file.
+ * [include/commdlg.h] New file.
+ Begin of an emulated COMMDLG DLL, built-in for now.
+ (BTW, if you want to switch between built-in & 16bits CommDlg, only
+ thing you need to do is to put the real/dummy name in file relay.c)
+
+ * [controls/scroll.c]
+ * [controls/combo.c]
+ * [controls/listbox.c]
+ Few bug fixes and/or cosmetic.
+
+ * [misc/audio.c]
+ * [misc/mmaux.c]
+ bug fixes and flags returned to emulate SB16.
+
+ * [misc/midi.c] New file.
+ skeleton for 'Midi' MMSYSTEM & MCI driver.
+
+ * [misc/mcianim.c] New file.
+ skeleton for 'Animation1' MCI driver.
+
+ * [windows/win.c]
+ Add new stub for GetLastActiveWindow().
+
+Tue Oct 25 09:17:25 1994 Olaf Flebbe (flebbe@tat.physik.uni-tuebingen.de)
+
+ * [if1632/call.S] [tools/build.c]
+ Support for ELF format. (Not complete)
+
+Sun Oct 23 00:51:50 1994 Paul Falstad (pf@zoof)
+
+ * [if1632/user.spec]
+ Add stubs for ArrangeIconicWindows(), etc.
+
+ * [if1632/kernel.spec]
+ Add IsBad*Ptr() functions.
+
+ * [loader/signal.c]
+ Add test_memory(), for use with IsBad*Ptr().
+
+ * [windows/winpos.c]
+ Add stubs for TileChildWindows(), etc.
+
+ * [windows/win.c]
+ IsWindow() shouldn't crash if it's given a bad handle.
+ Add stub for GetLastActivePopup().
+
+ * [memory/global.c]
+ Implement the IsBad*Ptr() functions.
+
+ * [controls/listbox.c]
+ Return the full longword of the item data in LB_GETITEMDATA.
+
+ * [controls/edit.c]
+ Don't let the user select an area past the end of the text.
+
+ * [objects/text.c]
+ In DrawText(), the code to delete crlfs also removed multiple
+ consecutive newlines. Also, using DT_CALCRECT didn't return
+ the right height, and the width wasn't returned at all.
+ This caused MessageBoxes to be missing much of their text.
+
+ * [windows/scroll.c]
+ ScrollWindow[Ex] didn't work right with null LPRECT arguments.
+
+Fri Oct 21 21:47:19 1994 Paul Falstad (pf@zoof.cts.com)
+
+ * [miscemu/int21.c]
+ Fixed int21 0x42 handler to properly assemble 32-bit seek ptr.
+
+ * [misc/property.c]
+ Fixed inverted logic in EnumProps(), and changed CallBack16()
+ call to use new arg format.
+
+ * [windows/win.c]
+ Fixed CallBack16() call in Enum[Child]Windows to use new arg
+ format; this fixes crashes in enum procedures.
+
+Wed Oct 19 21:30:00 PDT 1994 martin@cs.csufresno.edu
+
+ * [misc/clipboard.c]
+ [windows/event.c]
+ [windows/message.c]
+ Added cut and paste between Wine and other X clients via
+ the PRIMARY selection. Text only this time.
+
+ * [controls/edit.c]
+ EDIT_LineLength, EDIT_TextLine return 0 for lines after last one.
+
+ * [windows/defwnd.c]
+ Send WM_SYSCOMMAND to overlapped ancestor window,
+ not the receiver of WM_SYSKEYDOWN
+
+Sat Oct 22 15:01:02 1994 Thomas Sandford <t.d.g.sandford@bradford.ac.uk>
+
+ * [controls/edit.c]
+ ClientWidth()/ClientHeight() macros: return 0 if size would
+ be negative
+ EDIT_StrLength(): takes unsigned char* instead of char*
+
+ * [controls/listbox.c]
+ ListBoxWndProc(): in "case WM_MOUSEMOVE" - set lphl at start of
+ case instead of in each place required (it was omitted in
+ some places causing problems!)
+
+ * [controls/menu.c]
+ MENU_CalcItemSize(): don't try to find size of a text item
+ if the pointer is NULL
+
+ * [include/heap.h]
+ added definition of HEAP_LocalInit()
+
+ * [include/msdos.h]
+ removed buggy pointer() macro (use SAFEMAKEPTR() from segmem.h
+ instead)
+
+ * [loader/selector.c]
+ IPCCopySelector(): added missing flags to shmget() call
+ ? does this break linux - I added these flags in a previous
+ patch but they were missing in the corresponding release ?
+
+ * [loader/signal.c]
+ win_fault(): added missing definitions of i, dump for those
+ not running NetBSD or linux
+
+ * [misc/dos_fs.c]
+ DOS_GetCurrentDir(): made temp[] static so it can be safely
+ returned
+
+ * [miscemu/int21.c,int25.c,int26.c]
+ Changed all invocations of pointer() to SAFEMAKEPTR(). Included
+ segmem.h where necessary.
+
+ * [windows/dialog.c]
+ CreateDialogIndirectParam(): Changed HEAP_Init() call to
+ HEAP_LocalInit(), removed redundant variables
+
+Sat Oct 22 00:29:41 MET 1994 Dag Asheim (dash@ifi.uio.no)
+
+ * [loader/library.c] [loader/main.c] [loader/ne_image.c]
+ [misc/exec.c] [miscemu/int10.c] [miscemu/int21.c]
+ [objects/bitblt.c] [objects/metafile.c]
+ Rewritten more printf's to use the new debugging system, and
+ made wine less verbose per default. Use "-debugmsg +module"
+ to get (almost) the same behavior as before.
+
+----------------------------------------------------------------------
Sun Oct 16 13:29:07 1994 Alexandre Julliard (julliard@lamisun.epfl.ch)
* [controls/button.c]
diff --git a/Imakefile b/Imakefile
index 5b5f709..9a38b3d7 100644
--- a/Imakefile
+++ b/Imakefile
@@ -30,6 +30,7 @@
loader \
misc \
objects \
+ rc \
test \
windows
diff --git a/controls/combo.c b/controls/combo.c
index 0dc66fb..fbf10f1 100644
--- a/controls/combo.c
+++ b/controls/combo.c
@@ -14,6 +14,7 @@
#include "windows.h"
#include "combo.h"
+#include "user.h"
#include "heap.h"
#include "win.h"
#include "prototypes.h"
@@ -22,11 +23,18 @@
/* #undef DEBUG_COMBO */
#include "debug.h"
+ /* windows/graphics.c */
+extern void GRAPH_DrawReliefRect( HDC hdc, RECT *rect,
+ int thickness, BOOL pressed );
+extern BOOL GRAPH_DrawBitmap( HDC hdc, HBITMAP hbitmap, int xdest, int ydest,
+ int xsrc, int ysrc, int width, int height, int rop );
+
HBITMAP hComboBit = 0;
LPHEADCOMBO ComboGetStorageHeader(HWND hwnd);
int CreateComboStruct(HWND hwnd);
+void ComboBoxStaticOwnerDraw(HWND hWnd, LPHEADCOMBO lphc);
/***********************************************************************
@@ -34,66 +42,75 @@
*/
LONG ComboBoxWndProc( HWND hwnd, WORD message, WORD wParam, LONG lParam )
{
- RECT rect;
- int y, count;
- int width, height;
- WND *wndPtr;
- LPHEADCOMBO lphc;
- HDC hDC;
- BITMAP bm;
- char str[128];
- PAINTSTRUCT paintstruct;
- int style;
- switch(message)
- {
- case WM_CREATE:
- wndPtr = WIN_FindWndPtr(hwnd);
- if (wndPtr == NULL) return 0;
- dprintf_combo(stddeb,"Combo WM_CREATE %p !\n", lphc);
- if (hComboBit == (HBITMAP)NULL)
- hComboBit = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_COMBO));
- GetObject(hComboBit, sizeof(BITMAP), (LPSTR)&bm);
- wndPtr->dwStyle &= 0xFFFFFFFFL ^ (WS_VSCROLL | WS_HSCROLL);
- GetWindowRect(hwnd, &rect);
- width = rect.right - rect.left;
- height = rect.bottom - rect.top;
- SetWindowPos(hwnd, 0, 0, 0, width + bm.bmHeight, bm.bmHeight,
- SWP_NOMOVE | SWP_NOZORDER);
- CreateComboStruct(hwnd);
- lphc = ComboGetStorageHeader(hwnd);
- if (lphc == NULL) return 0;
- if (wndPtr->dwStyle & CBS_SIMPLE)
-/* lphc->hWndEdit = CreateWindow("EDIT", "", */
- lphc->hWndEdit = CreateWindow("STATIC", "",
- WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | SS_LEFT,
- 0, 0, width - bm.bmHeight, bm.bmHeight,
- hwnd, 1, wndPtr->hInstance, 0L);
- else
- lphc->hWndEdit = CreateWindow("STATIC", "",
- WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | SS_LEFT,
- 0, 0, width - bm.bmHeight, bm.bmHeight,
- hwnd, 1, wndPtr->hInstance, 0L);
- style=0;
- if ((wndPtr->dwStyle & CBS_HASSTRINGS) == CBS_HASSTRINGS)
- style |= LBS_HASSTRINGS;
- if ((wndPtr->dwStyle & CBS_OWNERDRAWFIXED) ==CBS_OWNERDRAWFIXED)
- style |= LBS_OWNERDRAWFIXED;
- if ((wndPtr->dwStyle & CBS_OWNERDRAWVARIABLE)==CBS_OWNERDRAWVARIABLE)
- style |= LBS_OWNERDRAWVARIABLE;
- lphc->hWndLBox = CreateWindow("LISTBOX", "",
- WS_POPUP | WS_BORDER | WS_VSCROLL | LBS_NOTIFY | style,
- rect.left, rect.top + bm.bmHeight,
- width, height, wndPtr->hwndParent, 0,
- wndPtr->hInstance, (LPSTR)MAKELONG(0, hwnd));
- ShowWindow(lphc->hWndLBox, SW_HIDE);
- dprintf_combo(stddeb,"Combo Creation LBox=%X!\n",
- lphc->hWndLBox);
- return 0;
+ RECT rect;
+ int y, count;
+ int width, height;
+ WND *wndPtr;
+ LPHEADCOMBO lphc;
+ HDC hDC;
+ BITMAP bm;
+ char str[128];
+ PAINTSTRUCT paintstruct;
+ LPDRAWITEMSTRUCT lpdis;
+ DWORD dwStyle;
+ switch(message) {
+ case WM_CREATE:
+ wndPtr = WIN_FindWndPtr(hwnd);
+ if (wndPtr == NULL) return 0;
+ dprintf_combo(stddeb,"Combo WM_CREATE %p !\n", lphc);
+ if (hComboBit == (HBITMAP)NULL)
+ hComboBit = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_COMBO));
+ GetObject(hComboBit, sizeof(BITMAP), (LPSTR)&bm);
+ wndPtr->dwStyle &= 0xFFFFFFFFL ^ (WS_VSCROLL | WS_HSCROLL);
+ GetWindowRect(hwnd, &rect);
+ width = rect.right - rect.left;
+ height = rect.bottom - rect.top;
+ if (height < bm.bmHeight) height = bm.bmHeight;
+/* SetWindowPos(hwnd, 0, 0, 0, width + bm.bmHeight, bm.bmHeight,
+ SWP_NOMOVE | SWP_NOZORDER); */
+ SetWindowPos(hwnd, 0, 0, 0, width, bm.bmHeight,
+ SWP_NOMOVE | SWP_NOZORDER);
+ CreateComboStruct(hwnd);
+ lphc = ComboGetStorageHeader(hwnd);
+ if (lphc == NULL) return 0;
+/* SetRect(&lphc->RectEdit, 0, 0, width - 2, bm.bmHeight); */
+ SetRect(&lphc->RectEdit, 0, 0, width - bm.bmHeight, bm.bmHeight);
+ if (wndPtr->dwStyle & CBS_DROPDOWNLIST) {
+ if ((wndPtr->dwStyle & CBS_OWNERDRAWFIXED) == CBS_OWNERDRAWFIXED ||
+ (wndPtr->dwStyle & CBS_OWNERDRAWVARIABLE) == CBS_OWNERDRAWVARIABLE)
+ lphc->hWndEdit = 0;
+ else
+ lphc->hWndEdit = CreateWindow("STATIC", "",
+ WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | SS_LEFT,
+ 0, 0, width - bm.bmHeight, bm.bmHeight,
+ hwnd, 1, wndPtr->hInstance, 0L);
+ }
+ else {
+/* lphc->hWndEdit = CreateWindow("EDIT", "", */
+ lphc->hWndEdit = CreateWindow("STATIC", "",
+ WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | SS_LEFT,
+ 0, 0, width - bm.bmHeight, bm.bmHeight,
+ hwnd, 1, wndPtr->hInstance, 0L);
+ }
+ dwStyle = WS_POPUP | WS_BORDER | WS_VSCROLL | LBS_NOTIFY;
+ if ((wndPtr->dwStyle & CBS_HASSTRINGS) == CBS_HASSTRINGS)
+ dwStyle |= LBS_HASSTRINGS;
+ if ((wndPtr->dwStyle & CBS_OWNERDRAWFIXED) == CBS_OWNERDRAWFIXED)
+ dwStyle |= LBS_OWNERDRAWFIXED;
+ if ((wndPtr->dwStyle & CBS_OWNERDRAWVARIABLE) == CBS_OWNERDRAWVARIABLE)
+ dwStyle |= LBS_OWNERDRAWVARIABLE;
+ lphc->hWndLBox = CreateWindow("LISTBOX", "", dwStyle,
+ rect.left, rect.top + bm.bmHeight,
+ width, height, wndPtr->hwndParent, 0,
+ wndPtr->hInstance, (LPSTR)MAKELONG(0, hwnd));
+ ShowWindow(lphc->hWndLBox, SW_HIDE);
+ dprintf_combo(stddeb,"Combo Creation LBox=%X!\n", lphc->hWndLBox);
+ return 0;
case WM_DESTROY:
lphc = ComboGetStorageHeader(hwnd);
if (lphc == 0) return 0;
/*
- DestroyWindow(lphc->hWndEdit);
+ if (lphc->hWndEdit != 0) DestroyWindow(lphc->hWndEdit);
*/
DestroyWindow(lphc->hWndLBox);
free(lphc);
@@ -114,24 +131,29 @@
case WM_COMMAND:
wndPtr = WIN_FindWndPtr(hwnd);
lphc = ComboGetStorageHeader(hwnd);
- if (lphc == NULL) return 0;
+ if (lphc == NULL || wndPtr == NULL) return 0;
if (LOWORD(lParam) == lphc->hWndLBox) {
- switch(HIWORD(lParam)) {
- case LBN_SELCHANGE:
- lphc->dwState = lphc->dwState & (CB_SHOWDROPDOWN ^ 0xFFFFFFFFL);
- ShowWindow(lphc->hWndLBox, SW_HIDE);
- y = SendMessage(lphc->hWndLBox, LB_GETCURSEL, 0, 0L);
- if (y != LB_ERR) {
- SendMessage(lphc->hWndLBox, LB_GETTEXT, (WORD)y, (LPARAM)str);
- SendMessage(lphc->hWndEdit, WM_SETTEXT, (WORD)y, (LPARAM)str);
- }
- SendMessage(GetParent(hwnd), WM_COMMAND, wndPtr->wIDmenu,
- MAKELONG(hwnd, CBN_SELCHANGE));
- break;
- case LBN_DBLCLK:
- SendMessage(GetParent(hwnd), WM_COMMAND, wndPtr->wIDmenu,
- MAKELONG(hwnd, CBN_DBLCLK));
- break;
+ switch(HIWORD(lParam)) {
+ case LBN_SELCHANGE:
+ lphc->dwState = lphc->dwState & (CB_SHOWDROPDOWN ^ 0xFFFFFFFFL);
+ ShowWindow(lphc->hWndLBox, SW_HIDE);
+ y = SendMessage(lphc->hWndLBox, LB_GETCURSEL, 0, 0L);
+ if (y != LB_ERR) {
+ SendMessage(lphc->hWndLBox, LB_GETTEXT, (WORD)y, (LPARAM)str);
+ if (lphc->hWndEdit != 0)
+ SendMessage(lphc->hWndEdit, WM_SETTEXT, (WORD)y, (LPARAM)str);
+ else {
+ InvalidateRect(hwnd, NULL, TRUE);
+ UpdateWindow(hwnd);
+ }
+ }
+ SendMessage(GetParent(hwnd), WM_COMMAND, wndPtr->wIDmenu,
+ MAKELONG(hwnd, CBN_SELCHANGE));
+ break;
+ case LBN_DBLCLK:
+ SendMessage(GetParent(hwnd), WM_COMMAND, wndPtr->wIDmenu,
+ MAKELONG(hwnd, CBN_DBLCLK));
+ break;
}
}
break;
@@ -178,14 +200,18 @@
case WM_KEYDOWN:
wndPtr = WIN_FindWndPtr(hwnd);
lphc = ComboGetStorageHeader(hwnd);
- if (lphc == NULL) return 0;
+ if (lphc == NULL || wndPtr == NULL) return 0;
y = SendMessage(lphc->hWndLBox, LB_GETCURSEL, 0, 0L);
count = SendMessage(lphc->hWndLBox, LB_GETCOUNT, 0, 0L);
dprintf_combo(stddeb,"COMBOBOX // GetKeyState(VK_MENU)=%d\n", GetKeyState(VK_MENU));
if (GetKeyState(VK_MENU) < 0) {
lphc->dwState = lphc->dwState ^ CB_SHOWDROPDOWN;
if ((lphc->dwState & CB_SHOWDROPDOWN) == CB_SHOWDROPDOWN) {
- ShowWindow(lphc->hWndLBox, SW_SHOW);
+ GetWindowRect(hwnd, &rect);
+ SetWindowPos(lphc->hWndLBox, 0, rect.left, rect.bottom, 0, 0,
+ SWP_NOREDRAW | SWP_NOSIZE);
+ SetWindowPos(lphc->hWndLBox, 0, 0, 0, 0, 0, SWP_SHOWWINDOW |
+ SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER);
SetFocus(lphc->hWndLBox);
}
else {
@@ -193,7 +219,8 @@
y = SendMessage(lphc->hWndLBox, LB_GETCURSEL, 0, 0L);
if (y != LB_ERR) {
SendMessage(lphc->hWndLBox, LB_GETTEXT, (WORD)y, (LPARAM)str);
- SendMessage(lphc->hWndEdit, WM_SETTEXT, (WORD)y, (LPARAM)str);
+ if (lphc->hWndEdit != 0)
+ SendMessage(lphc->hWndEdit, WM_SETTEXT, (WORD)y, (LPARAM)str);
}
}
}
@@ -214,9 +241,11 @@
}
if (y < 0) y = 0;
if (y >= count) y = count - 1;
+ lphc->LastSel = y;
SendMessage(lphc->hWndLBox, LB_SETCURSEL, y, 0L);
SendMessage(lphc->hWndLBox, LB_GETTEXT, (WORD)y, (LPARAM)str);
- SendMessage(lphc->hWndEdit, WM_SETTEXT, (WORD)y, (LPARAM)str);
+ if (lphc->hWndEdit != 0)
+ SendMessage(lphc->hWndEdit, WM_SETTEXT, (WORD)y, (LPARAM)str);
SendMessage(GetParent(hwnd), WM_COMMAND, wndPtr->wIDmenu,
MAKELONG(hwnd, CBN_SELCHANGE));
}
@@ -226,8 +255,21 @@
return(SendMessage(GetParent(hwnd), WM_MEASUREITEM, wParam, lParam));
case WM_CTLCOLOR:
return(SendMessage(GetParent(hwnd), WM_CTLCOLOR, wParam, lParam));
+ case WM_SETREDRAW:
+ dprintf_combo(stddeb,"ComboBoxWndProc WM_SETREDRAW hWnd=%04X w=%04X !\n", hwnd, wParam);
+ lphc = ComboGetStorageHeader(hwnd);
+ if (lphc == NULL) return 0;
+ lphc->bRedrawFlag = wParam;
+ break;
case WM_DRAWITEM:
- return(SendMessage(GetParent(hwnd), WM_DRAWITEM, wParam, lParam));
+ dprintf_combo(stddeb,"ComboBoxWndProc // WM_DRAWITEM w=%04X l=%08lX\n", wParam, lParam);
+ wndPtr = WIN_FindWndPtr(hwnd);
+ if (wndPtr == NULL) break;
+ lpdis = (LPDRAWITEMSTRUCT)lParam;
+ if (lpdis == NULL) break;
+ lpdis->CtlType = ODT_COMBOBOX;
+ lpdis->CtlID = wndPtr->wIDmenu;
+ return(SendMessage(GetParent(hwnd), WM_DRAWITEM, wParam, lParam));
case WM_PAINT:
GetClientRect(hwnd, &rect);
hDC = BeginPaint(hwnd, &paintstruct);
@@ -241,8 +283,13 @@
EndPaint(hwnd, &paintstruct);
lphc = ComboGetStorageHeader(hwnd);
if (lphc == NULL) return 0;
- InvalidateRect(lphc->hWndEdit, NULL, TRUE);
- UpdateWindow(lphc->hWndEdit);
+ if (lphc->hWndEdit != 0) {
+ InvalidateRect(lphc->hWndEdit, NULL, TRUE);
+ UpdateWindow(lphc->hWndEdit);
+ }
+ else {
+ ComboBoxStaticOwnerDraw(hwnd, lphc);
+ }
if ((lphc->dwState & CB_SHOWDROPDOWN) == CB_SHOWDROPDOWN) {
InvalidateRect(lphc->hWndLBox, NULL, TRUE);
UpdateWindow(lphc->hWndLBox);
@@ -251,7 +298,8 @@
case WM_SETFOCUS:
lphc = ComboGetStorageHeader(hwnd);
if (lphc == NULL) return 0;
- SetFocus(lphc->hWndEdit);
+ if (lphc->hWndEdit != 0)
+ SetFocus(lphc->hWndEdit);
break;
case WM_KILLFOCUS:
lphc = ComboGetStorageHeader(hwnd);
@@ -260,11 +308,12 @@
y = SendMessage(lphc->hWndLBox, LB_GETCURSEL, 0, 0L);
if (y != LB_ERR) {
SendMessage(lphc->hWndLBox, LB_GETTEXT, (WORD)y, (LPARAM)str);
- SendMessage(lphc->hWndEdit, WM_SETTEXT, (WORD)y, (LPARAM)str);
+ if (lphc->hWndEdit != 0)
+ SendMessage(lphc->hWndEdit, WM_SETTEXT, (WORD)y, (LPARAM)str);
}
break;
case CB_ADDSTRING:
- dprintf_combo(stddeb,"CB_ADDSTRING '%s' !\n", (LPSTR)lParam);
+ dprintf_combo(stddeb,"CB_ADDSTRING '%s' !\n", (LPSTR)lParam);
lphc = ComboGetStorageHeader(hwnd);
if (lphc == NULL) return 0;
return(SendMessage(lphc->hWndLBox, LB_ADDSTRING, wParam, lParam));
@@ -319,14 +368,16 @@
dprintf_combo(stddeb,"ComboBox CB_GETEDITSEL !\n");
lphc = ComboGetStorageHeader(hwnd);
if (lphc == NULL) return 0;
-/* return(SendMessage(lphc->hWndEdit, EM_GETSEL, 0, 0L)); */
+/* if (lphc->hWndEdit != 0)
+ return(SendMessage(lphc->hWndEdit, EM_GETSEL, 0, 0L)); */
break;
case CB_SETEDITSEL:
dprintf_combo(stddeb,"ComboBox CB_SETEDITSEL lParam=%lX !\n",
lParam);
lphc = ComboGetStorageHeader(hwnd);
if (lphc == NULL) return 0;
-/* return(SendMessage(lphc->hWndEdit, EM_SETSEL, 0, lParam)); */
+/* if (lphc->hWndEdit != 0)
+ return(SendMessage(lphc->hWndEdit, EM_SETSEL, 0, lParam)); */
break;
case CB_SELECTSTRING:
dprintf_combo(stddeb,"ComboBox CB_SELECTSTRING !\n");
@@ -339,7 +390,11 @@
if (lphc == NULL) return 0;
lphc->dwState = lphc->dwState | CB_SHOWDROPDOWN;
if (wParam != 0) {
- ShowWindow(lphc->hWndLBox, SW_SHOW);
+ GetWindowRect(hwnd, &rect);
+ SetWindowPos(lphc->hWndLBox, 0, rect.left, rect.bottom, 0, 0,
+ SWP_NOREDRAW | SWP_NOSIZE);
+ SetWindowPos(lphc->hWndLBox, 0, 0, 0, 0, 0, SWP_SHOWWINDOW |
+ SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER);
}
else {
lphc->dwState = lphc->dwState ^ CB_SHOWDROPDOWN;
@@ -364,7 +419,8 @@
dprintf_combo(stddeb,"ComboBox CB_LIMITTEXT !\n");
lphc = ComboGetStorageHeader(hwnd);
if (lphc == NULL) return 0;
-/* return(SendMessage(lphc->hWndEdit, EM_LIMITTEXT, wParam, 0L)); */
+/* if (lphc->hWndEdit != 0)
+ return(SendMessage(lphc->hWndEdit, EM_LIMITTEXT, wParam, 0L)); */
break;
default:
@@ -377,35 +433,79 @@
LPHEADCOMBO ComboGetStorageHeader(HWND hwnd)
{
- WND *wndPtr;
- LPHEADCOMBO lphc;
- wndPtr = WIN_FindWndPtr(hwnd);
- if (wndPtr == 0) {
- fprintf(stderr,"Bad Window handle on ComboBox !\n");
- return 0;
- }
- lphc = *((LPHEADCOMBO *)&wndPtr->wExtra[1]);
- return lphc;
+ WND *wndPtr;
+ LPHEADCOMBO lphc;
+ wndPtr = WIN_FindWndPtr(hwnd);
+ if (wndPtr == 0) {
+ fprintf(stderr,"Bad Window handle on ComboBox !\n");
+ return 0;
+ }
+ lphc = *((LPHEADCOMBO *)&wndPtr->wExtra[1]);
+ return lphc;
}
int CreateComboStruct(HWND hwnd)
{
- WND *wndPtr;
- LPHEADCOMBO lphc;
- wndPtr = WIN_FindWndPtr(hwnd);
- if (wndPtr == 0) {
- fprintf(stderr,"Bad Window handle on ComboBox !\n");
- return 0;
- }
- lphc = (LPHEADCOMBO)malloc(sizeof(HEADCOMBO));
- *((LPHEADCOMBO *)&wndPtr->wExtra[1]) = lphc;
- lphc->dwState = 0;
- return TRUE;
+ WND *wndPtr;
+ LPHEADCOMBO lphc;
+ wndPtr = WIN_FindWndPtr(hwnd);
+ if (wndPtr == 0) {
+ fprintf(stderr,"Bad Window handle on ComboBox !\n");
+ return 0;
+ }
+ lphc = (LPHEADCOMBO)malloc(sizeof(HEADCOMBO));
+ *((LPHEADCOMBO *)&wndPtr->wExtra[1]) = lphc;
+ lphc->hWndEdit = 0;
+ lphc->hWndLBox = 0;
+ lphc->dwState = 0;
+ lphc->LastSel = -1;
+ return TRUE;
}
+void ComboBoxStaticOwnerDraw(HWND hWnd, LPHEADCOMBO lphc)
+{
+ HDC hDC;
+ HBRUSH hBrush;
+ short y;
+ char str[64];
+ LPSTR ptr = NULL;
+ HANDLE hTemp;
+ WND *wndPtr;
+ LPDRAWITEMSTRUCT lpdis;
+ dprintf_combo(stddeb,"ComboBoxStaticOwnerDraw(%04X, %p) !\n", hWnd, lphc);
+ y = SendMessage(lphc->hWndLBox, LB_GETCURSEL, 0, 0L);
+ if (y != LB_ERR) {
+ SendMessage(lphc->hWndLBox, LB_GETTEXT, y, (LPARAM)str);
+ ptr = (LPSTR)SendMessage(lphc->hWndLBox, LB_GETITEMDATA, y, 0L);
+ }
+ hBrush = SendMessage(GetParent(hWnd), WM_CTLCOLOR, (WORD)hDC,
+ MAKELONG(hWnd, CTLCOLOR_STATIC));
+ if (hBrush == (HBRUSH)NULL) hBrush = GetStockObject(WHITE_BRUSH);
+ wndPtr = WIN_FindWndPtr(hWnd);
+ if (wndPtr == NULL) return;
+ hTemp = USER_HEAP_ALLOC(GMEM_MOVEABLE, sizeof(DRAWITEMSTRUCT));
+ lpdis = (LPDRAWITEMSTRUCT) USER_HEAP_ADDR(hTemp);
+ if (lpdis == NULL) {
+ printf("ComboBox Ownerdraw // Error allocating DRAWITEMSTRUCT !\n");
+ return;
+ }
+ hDC = GetDC(hWnd);
+ FillRect(hDC, &lphc->RectEdit, hBrush);
+ lpdis->hDC = hDC;
+ if (y != LB_ERR) lpdis->itemID = y - 1;
+ CopyRect(&lpdis->rcItem, &lphc->RectEdit);
+ lpdis->itemData = (DWORD)ptr;
+ lpdis->itemAction = ODA_DRAWENTIRE;
+ lpdis->CtlType = ODT_COMBOBOX;
+ lpdis->CtlID = wndPtr->wIDmenu;
+ SendMessage(GetParent(hWnd), WM_DRAWITEM, y, (LPARAM)lpdis);
+ USER_HEAP_FREE(hTemp);
+ ReleaseDC(hWnd, hDC);
+}
+
/************************************************************************
* DlgDirSelectComboBox [USER.194]
@@ -413,7 +513,8 @@
BOOL DlgDirSelectComboBox(HWND hDlg, LPSTR lpStr, int nIDLBox)
{
fprintf(stdnimp,"DlgDirSelectComboBox(%04X, '%s', %d) \n",
- hDlg, lpStr, nIDLBox);
+ hDlg, lpStr, nIDLBox);
+ return TRUE;
}
diff --git a/controls/edit.c b/controls/edit.c
index 968cc3d..81e5b4f 100644
--- a/controls/edit.c
+++ b/controls/edit.c
@@ -18,8 +18,8 @@
#include "user.h"
#include "scroll.h"
#include "stddebug.h"
-/* #define DEBUG_EDIT /* */
-/* #undef DEBUG_EDIT /* */
+/* #define DEBUG_EDIT */
+/* #undef DEBUG_EDIT */
#include "debug.h"
@@ -69,10 +69,12 @@
} EDITSTATE;
-#define ClientWidth(wndPtr) (wndPtr->rectClient.right - \
- wndPtr->rectClient.left)
-#define ClientHeight(wndPtr, es) ((wndPtr->rectClient.bottom - \
- wndPtr->rectClient.top) / es->txtht)
+#define ClientWidth(wndPtr) \
+ (wndPtr->rectClient.right > wndPtr->rectClient.left ? \
+ wndPtr->rectClient.right - wndPtr->rectClient.left : 0)
+#define ClientHeight(wndPtr, es) \
+ (wndPtr->rectClient.bottom > wndPtr->rectClient.top ? \
+ (wndPtr->rectClient.bottom - wndPtr->rectClient.top) / es->txtht : 0)
#define EditBufLen(wndPtr) (wndPtr->dwStyle & ES_MULTILINE \
? EDITLEN : ENTRYLEN)
#define CurrChar (EDIT_TextLine(hwnd, es->CurrLine) + es->CurrCol)
@@ -94,7 +96,6 @@
static BOOL ButtonDown; /* TRUE if left mouse button down */
static int ButtonRow; /* row in text buffer when button pressed */
static int ButtonCol; /* col in text buffer when button pressed */
-static BOOL Print = FALSE;
LONG EditWndProc(HWND hWnd, WORD uMsg, WORD wParam, LONG lParam);
@@ -106,7 +107,7 @@
void EDIT_PaintMsg(HWND hwnd);
HANDLE EDIT_GetTextLine(HWND hwnd, int selection);
char *EDIT_TextLine(HWND hwnd, int sel);
-int EDIT_StrLength(HWND hwnd, char *str, int len, int pcol);
+int EDIT_StrLength(HWND hwnd, unsigned char *str, int len, int pcol);
int EDIT_LineLength(HWND hwnd, int num);
void EDIT_WriteTextLine(HWND hwnd, RECT *rc, int y);
void EDIT_WriteText(HWND hwnd, char *lp, int off, int len, int row,
@@ -177,7 +178,6 @@
LONG EditWndProc(HWND hwnd, WORD uMsg, WORD wParam, LONG lParam)
{
LONG lResult = 0L;
- HDC hdc;
char *textPtr;
int len;
WND *wndPtr = WIN_FindWndPtr(hwnd);
@@ -466,7 +466,6 @@
EDITSTATE *es;
unsigned int *textPtrs;
char *text;
- int len;
/* store pointer to local or global heap in window structure so that */
/* EDITSTATE structure itself can be stored on local heap */
@@ -627,7 +626,7 @@
WND *wndPtr = WIN_FindWndPtr(hwnd);
char *text, *cp;
int incrs = INITLINES;
- unsigned int off, len, temp;
+ unsigned int off, len;
EDITSTATE *es;
unsigned int *textPtrs;
short *charWidths;
@@ -772,6 +771,7 @@
unsigned int *textPtrs =
(unsigned int *)EDIT_HeapAddr(hwnd, es->hTextPtrs);
+ if(sel>es->wlines)return NULL;
return (text + *(textPtrs + sel));
}
@@ -784,12 +784,9 @@
* the width of a tab.
*/
-int EDIT_StrLength(HWND hwnd, char *str, int len, int pcol)
+int EDIT_StrLength(HWND hwnd, unsigned char *str, int len, int pcol)
{
int i, plen = 0;
- WND *wndPtr = WIN_FindWndPtr(hwnd);
- EDITSTATE *es =
- (EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
for (i = 0; i < len; i++)
plen += EDIT_CharWidth(hwnd, (BYTE)(*(str + i)), pcol + plen);
@@ -807,12 +804,10 @@
int EDIT_LineLength(HWND hwnd, int num)
{
- WND *wndPtr = WIN_FindWndPtr(hwnd);
- EDITSTATE *es =
- (EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
char *cp = EDIT_TextLine(hwnd, num);
char *cp1;
+ if(!cp)return 0;
cp1 = strchr(cp, '\n');
return cp1 ? (int)(cp1 - cp) : strlen(cp);
}
@@ -827,14 +822,12 @@
void EDIT_WriteTextLine(HWND hwnd, RECT *rect, int y)
{
int len = 0;
- unsigned char line[200];
HANDLE hLine;
unsigned char *lp;
int lnlen, lnlen1;
int col, off = 0;
int sbl, sel, sbc, sec;
RECT rc;
- BOOL trunc = FALSE;
WND *wndPtr = WIN_FindWndPtr(hwnd);
EDITSTATE *es =
(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
@@ -1049,7 +1042,7 @@
cp++;
scol += tabwidth;
- while (cp1 = strchr(cp, VK_TAB))
+ while ((cp1 = strchr(cp, VK_TAB)))
{
TextOut(hdc, scol, row * es->txtht, cp, (int)(cp1 - cp));
scol += EDIT_StrLength(hwnd, cp, (int)(cp1 - cp), scol);
@@ -1102,9 +1095,6 @@
char *str;
int ch = 0, i = 0, j, s_i;
int ch1;
- WND *wndPtr = WIN_FindWndPtr(hwnd);
- EDITSTATE *es =
- (EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
dprintf_edit(stddeb,"EDIT_GetStr %s %d %d\n", lp, off, len);
@@ -1147,8 +1137,6 @@
void EDIT_CharMsg(HWND hwnd, WORD wParam)
{
WND *wndPtr = WIN_FindWndPtr(hwnd);
- EDITSTATE *es =
- (EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
dprintf_edit(stddeb,"EDIT_CharMsg: wParam=%c\n", (char)wParam);
@@ -1326,7 +1314,7 @@
int EDIT_GetNextTabStop(HWND hwnd, int pcol)
{
- int i, tmp;
+ int i;
int baseUnitWidth = LOWORD(GetDialogBaseUnits());
WND *wndPtr = WIN_FindWndPtr(hwnd);
EDITSTATE *es =
@@ -1360,7 +1348,6 @@
WND *wndPtr = WIN_FindWndPtr(hwnd);
EDITSTATE *es =
(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
- char *text = EDIT_HeapAddr(hwnd, es->hText);
if (*CurrChar == '\0')
return;
@@ -1449,7 +1436,6 @@
WND *wndPtr = WIN_FindWndPtr(hwnd);
EDITSTATE *es =
(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
- char *text = EDIT_HeapAddr(hwnd, es->hText);
if (es->CurrCol)
{
@@ -1480,11 +1466,9 @@
void EDIT_End(HWND hwnd)
{
- RECT rc;
WND *wndPtr = WIN_FindWndPtr(hwnd);
EDITSTATE *es =
(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
- char *text = EDIT_HeapAddr(hwnd, es->hText);
while (*CurrChar && *CurrChar != '\n')
{
@@ -1510,7 +1494,6 @@
void EDIT_Home(HWND hwnd)
{
- RECT rc;
WND *wndPtr = WIN_FindWndPtr(hwnd);
EDITSTATE *es =
(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
@@ -1667,7 +1650,6 @@
void EDIT_KeyHScroll(HWND hwnd, WORD opt)
{
- RECT rc;
int hscrollpos;
WND *wndPtr = WIN_FindWndPtr(hwnd);
EDITSTATE *es =
@@ -1779,7 +1761,6 @@
void EDIT_KeyVScrollPage(HWND hwnd, WORD opt)
{
- RECT rc;
int vscrollpos;
WND *wndPtr = WIN_FindWndPtr(hwnd);
EDITSTATE *es =
@@ -1827,7 +1808,6 @@
void EDIT_KeyVScrollDoc(HWND hwnd, WORD opt)
{
- RECT rc;
int vscrollpos;
WND *wndPtr = WIN_FindWndPtr(hwnd);
EDITSTATE *es =
@@ -2050,7 +2030,6 @@
void EDIT_VScrollPage(HWND hwnd, WORD opt)
{
- RECT rc;
int vscrollpos;
WND *wndPtr = WIN_FindWndPtr(hwnd);
EDITSTATE *es =
@@ -2114,7 +2093,6 @@
void EDIT_SizeMsg(HWND hwnd, WORD wParam, LONG lParam)
{
- RECT rc;
WND *wndPtr = WIN_FindWndPtr(hwnd);
EDITSTATE *es =
(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
@@ -2200,9 +2178,6 @@
{
int ch = 0, i = 0, s_i;
char *text;
- WND *wndPtr = WIN_FindWndPtr(hwnd);
- EDITSTATE *es =
- (EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
dprintf_edit(stddeb,"EDIT_PixelToChar: row=%d, pixel=%d\n", row, *pixel);
@@ -2233,7 +2208,6 @@
{
int len;
char *text;
- RECT rc;
WND *wndPtr = WIN_FindWndPtr(hwnd);
EDITSTATE *es =
(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
@@ -2440,7 +2414,6 @@
WND *wndPtr = WIN_FindWndPtr(hwnd);
EDITSTATE *es =
(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
- char *text = EDIT_HeapAddr(hwnd, es->hText);
if (SelMarked(es))
{
@@ -2555,7 +2528,7 @@
{
int bbl, bel, bbc, bec;
char *cp;
- int len;
+ int len, line;
BOOL end = FALSE;
WND *wndPtr = WIN_FindWndPtr(hwnd);
EDITSTATE *es =
@@ -2565,8 +2538,11 @@
bbl = es->SelEndLine;
bbc = es->SelEndCol;
- cp = EDIT_TextLine(hwnd, es->wtop + y / es->txtht);
- len = EDIT_LineLength(hwnd, es->wtop + y / es->txtht);
+ line = es->wtop + y / es->txtht;
+ if (line > es->wlines)
+ line = es->wlines;
+ cp = EDIT_TextLine(hwnd, line);
+ len = EDIT_LineLength(hwnd, line);
es->WndRow = y / es->txtht;
if (es->WndRow > es->wlines - es->wtop - 1)
@@ -2699,9 +2675,6 @@
char *cp, *cp1;
int len;
char *buffer = (char *)lParam;
- WND *wndPtr = WIN_FindWndPtr(hwnd);
- EDITSTATE *es =
- (EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
cp = EDIT_TextLine(hwnd, wParam);
cp1 = EDIT_TextLine(hwnd, wParam + 1);
@@ -3077,7 +3050,6 @@
void EDIT_SetHandleMsg(HWND hwnd, WORD wParam)
{
- MDESC *m;
WND *wndPtr = WIN_FindWndPtr(hwnd);
EDITSTATE *es =
(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
diff --git a/controls/listbox.c b/controls/listbox.c
index a639814..b5d59b7 100644
--- a/controls/listbox.c
+++ b/controls/listbox.c
@@ -22,8 +22,8 @@
#include "scroll.h"
#include "prototypes.h"
#include "stddebug.h"
-/* #define DEBUG_LISTBOX /* */
-/* #undef DEBUG_LISTBOX /* */
+/* #define DEBUG_LISTBOX */
+/* #undef DEBUG_LISTBOX */
#include "debug.h"
#define GMEM_ZEROINIT 0x0040
@@ -58,6 +58,11 @@
((wndPtr->dwStyle & LBS_OWNERDRAWVARIABLE) != LBS_OWNERDRAWVARIABLE) ) || \
((wndPtr->dwStyle & LBS_HASSTRINGS) == LBS_HASSTRINGS) )
+#define HasStrings(wndPtr) ( \
+ ( ((wndPtr->dwStyle & LBS_OWNERDRAWFIXED) != LBS_OWNERDRAWFIXED) && \
+ ((wndPtr->dwStyle & LBS_OWNERDRAWVARIABLE) != LBS_OWNERDRAWVARIABLE) ) || \
+ ((wndPtr->dwStyle & LBS_HASSTRINGS) == LBS_HASSTRINGS) )
+
/***********************************************************************
* ListBoxWndProc
@@ -68,6 +73,7 @@
LPHEADLIST lphl;
HWND hWndCtl;
WORD wRet;
+ LONG lRet;
RECT rect;
int y;
CREATESTRUCT *createStruct;
@@ -76,7 +82,7 @@
case WM_CREATE:
CreateListBoxStruct(hwnd);
lphl = ListBoxGetWindowAndStorage(hwnd, &wndPtr);
- dprintf_listbox(stddeb,"ListBox WM_CREATE %lX !\n", lphl);
+ dprintf_listbox(stddeb,"ListBox WM_CREATE %p !\n", lphl);
if (lphl == NULL) return 0;
createStruct = (CREATESTRUCT *)lParam;
if (HIWORD(createStruct->lpCreateParams) != 0)
@@ -102,11 +108,11 @@
ListBoxResetContent(hwnd);
free(lphl);
*((LPHEADLIST *)&wndPtr->wExtra[1]) = 0;
- dprintf_listbox(stddeb,"ListBox WM_DESTROY %lX !\n", lphl);
+ dprintf_listbox(stddeb,"ListBox WM_DESTROY %p !\n", lphl);
return 0;
case WM_VSCROLL:
- dprintf_listbox(stddeb,"ListBox WM_VSCROLL w=%04X l=%08X !\n",
+ dprintf_listbox(stddeb,"ListBox WM_VSCROLL w=%04X l=%08lX !\n",
wParam, lParam);
lphl = ListBoxGetStorageHeader(hwnd);
if (lphl == NULL) return 0;
@@ -143,7 +149,7 @@
return 0;
case WM_HSCROLL:
- dprintf_listbox(stddeb,"ListBox WM_HSCROLL w=%04X l=%08X !\n",
+ dprintf_listbox(stddeb,"ListBox WM_HSCROLL w=%04X l=%08lX !\n",
wParam, lParam);
lphl = ListBoxGetStorageHeader(hwnd);
if (lphl == NULL) return 0;
@@ -195,6 +201,8 @@
if (lphl == NULL) return 0;
lphl->PrevFocused = lphl->ItemFocused;
y = ListBoxFindMouse(hwnd, LOWORD(lParam), HIWORD(lParam));
+ if (y==-1)
+ return 0;
if ((wndPtr->dwStyle & LBS_MULTIPLESEL) == LBS_MULTIPLESEL) {
lphl->ItemFocused = y;
wRet = ListBoxGetSel(hwnd, y);
@@ -202,6 +210,9 @@
}
else {
ListBoxSetCurSel(hwnd, y);
+ if ((wndPtr->dwStyle && LBS_NOTIFY) != 0)
+ SendMessage(lphl->hWndLogicParent, WM_COMMAND,
+ wndPtr->wIDmenu, MAKELONG(hwnd, LBN_SELCHANGE));
}
ListBoxGetItemRect(hwnd, y, &rectsel);
InvalidateRect(hwnd, NULL, TRUE);
@@ -223,11 +234,11 @@
MAKELONG(hwnd, LBN_DBLCLK));
return 0;
case WM_MOUSEMOVE:
+ lphl = ListBoxGetWindowAndStorage(hwnd, &wndPtr);
+ if (lphl == NULL) return 0;
if ((wParam & MK_LBUTTON) != 0) {
y = HIWORD(lParam);
if (y < 4) {
- lphl = ListBoxGetStorageHeader(hwnd);
- if (lphl == NULL) return 0;
if (lphl->FirstVisible > 1) {
lphl->FirstVisible--;
if (wndPtr->dwStyle & WS_VSCROLL)
@@ -239,8 +250,6 @@
}
GetClientRect(hwnd, &rect);
if (y > (rect.bottom - 4)) {
- lphl = ListBoxGetStorageHeader(hwnd);
- if (lphl == NULL) return 0;
if (lphl->FirstVisible < lphl->ItemsCount) {
lphl->FirstVisible++;
if (wndPtr->dwStyle & WS_VSCROLL)
@@ -252,14 +261,15 @@
}
if ((y > 0) && (y < (rect.bottom - 4))) {
if ((y < rectsel.top) || (y > rectsel.bottom)) {
- lphl = ListBoxGetStorageHeader(hwnd);
- if (lphl == NULL) return 0;
wRet = ListBoxFindMouse(hwnd, LOWORD(lParam), HIWORD(lParam));
if ((wndPtr->dwStyle & LBS_MULTIPLESEL) == LBS_MULTIPLESEL) {
lphl->ItemFocused = wRet;
}
else {
ListBoxSetCurSel(hwnd, wRet);
+ if ((wndPtr->dwStyle && LBS_NOTIFY) != 0)
+ SendMessage(lphl->hWndLogicParent, WM_COMMAND,
+ wndPtr->wIDmenu, MAKELONG(hwnd, LBN_SELCHANGE));
}
ListBoxGetItemRect(hwnd, wRet, &rectsel);
InvalidateRect(hwnd, NULL, TRUE);
@@ -327,6 +337,9 @@
if (lphl->FirstVisible < 1) lphl->FirstVisible = 1;
if ((wndPtr->dwStyle & LBS_MULTIPLESEL) != LBS_MULTIPLESEL) {
ListBoxSetCurSel(hwnd, lphl->ItemFocused);
+ if ((wndPtr->dwStyle && LBS_NOTIFY) != 0)
+ SendMessage(lphl->hWndLogicParent, WM_COMMAND,
+ wndPtr->wIDmenu, MAKELONG(hwnd, LBN_SELCHANGE));
}
if (wndPtr->dwStyle & WS_VSCROLL)
SetScrollPos(hwnd, SB_VERT, lphl->FirstVisible, TRUE);
@@ -341,6 +354,15 @@
else
lphl->hFont = wParam;
if (wParam == 0) break;
+ break;
+ case WM_SETREDRAW:
+#ifdef DEBUG_LISTBOX
+ printf("ListBox WM_SETREDRAW hWnd=%04X w=%04X !\n", hwnd, wParam);
+#endif
+ lphl = ListBoxGetWindowAndStorage(hwnd, &wndPtr);
+ if (lphl == NULL) return 0;
+ lphl->bRedrawFlag = wParam;
+ break;
case WM_PAINT:
wndPtr = WIN_FindWndPtr(hwnd);
if ((wndPtr->dwStyle & LBS_OWNERDRAWFIXED) == LBS_OWNERDRAWFIXED) {
@@ -401,23 +423,29 @@
case LB_GETHORIZONTALEXTENT:
return wRet;
case LB_GETITEMDATA:
- wRet = ListBoxGetText(hwnd, wParam, (LPSTR)lParam, TRUE);
- return wRet;
+ lRet = ListBoxGetText(hwnd, wParam, (LPSTR)lParam, HasStrings(wndPtr));
+ return lRet;
case LB_GETITEMHEIGHT:
- return wRet;
+ ListBoxGetItemRect(hwnd, wParam, &rect);
+ return (rect.bottom - rect.top);
case LB_GETITEMRECT:
- return wRet;
+ ListBoxGetItemRect(hwnd, wParam, (LPRECT)lParam);
+ return 0;
case LB_GETSEL:
wRet = ListBoxGetSel(hwnd, wParam);
return wRet;
case LB_GETSELCOUNT:
- return wRet;
+ lphl = ListBoxGetStorageHeader(hwnd);
+ if (lphl == NULL) return LB_ERR;
+ return lphl->SelCount;
case LB_GETSELITEMS:
return wRet;
case LB_GETTEXTLEN:
return wRet;
case LB_GETTOPINDEX:
- return wRet;
+ lphl = ListBoxGetStorageHeader(hwnd);
+ if (lphl == NULL) return LB_ERR;
+ return lphl->FirstVisible;
case LB_SELECTSTRING:
return wRet;
case LB_SELITEMRANGE:
@@ -426,6 +454,7 @@
return wRet;
case LB_SETCOLUMNWIDTH:
lphl = ListBoxGetStorageHeader(hwnd);
+ if (lphl == NULL) return LB_ERR;
lphl->ColumnsWidth = wParam;
break;
case LB_SETHORIZONTALEXTENT:
@@ -434,7 +463,10 @@
wRet = ListBoxSetItemData(hwnd, wParam, lParam);
return wRet;
case LB_SETTABSTOPS:
- return wRet;
+ lphl = ListBoxGetStorageHeader(hwnd);
+ if (lphl == NULL) return LB_ERR;
+ lphl->FirstVisible = wParam;
+ return 0;
case LB_SETCURSEL:
dprintf_listbox(stddeb,"ListBox LB_SETCURSEL wParam=%x !\n",
wParam);
@@ -500,19 +532,18 @@
HBRUSH hBrush;
int OldBkMode;
DWORD dwOldTextColor;
- HWND hWndParent;
HDC hdc;
RECT rect;
- UINT i, h, h2, maxwidth, ipc;
- char C[128];
+ int i, h, h2, maxwidth, ipc;
h = 0;
hdc = BeginPaint( hwnd, &ps );
- if (!IsWindowVisible(hwnd)) {
- EndPaint( hwnd, &ps );
- return;
- }
+ if (!IsWindowVisible(hwnd)) {
+ EndPaint( hwnd, &ps );
+ return;
+ }
lphl = ListBoxGetWindowAndStorage(hwnd, &wndPtr);
if (lphl == NULL) goto EndOfPaint;
+ if (!lphl->bRedrawFlag) goto EndOfPaint;
SelectObject(hdc, lphl->hFont);
hBrush = SendMessage(lphl->hWndLogicParent, WM_CTLCOLOR, (WORD)hdc,
MAKELONG(hwnd, CTLCOLOR_LISTBOX));
@@ -592,18 +623,19 @@
PAINTSTRUCT ps;
HBRUSH hBrush;
HWND hWndParent;
- HDC hdc;
- RECT rect;
- UINT i, h, h2, maxwidth;
- char C[128];
+ DWORD itemData;
+ HDC hdc;
+ RECT rect;
+ int i, h, h2, maxwidth;
h = 0;
hdc = BeginPaint(hwnd, &ps);
- if (!IsWindowVisible(hwnd)) {
- EndPaint( hwnd, &ps );
- return;
- }
+ if (!IsWindowVisible(hwnd)) {
+ EndPaint( hwnd, &ps );
+ return;
+ }
lphl = ListBoxGetWindowAndStorage(hwnd, &wndPtr);
if (lphl == NULL) goto EndOfPaint;
+ if (!lphl->bRedrawFlag) goto EndOfPaint;
hBrush = SendMessage(lphl->hWndLogicParent, WM_CTLCOLOR, (WORD)hdc,
MAKELONG(hwnd, CTLCOLOR_LISTBOX));
if (hBrush == (HBRUSH)NULL) hBrush = GetStockObject(WHITE_BRUSH);
@@ -623,11 +655,10 @@
lpls->dis.hwndItem = hwnd;
lpls->dis.CtlType = ODT_LISTBOX;
lpls->dis.itemID = i - 1;
- if ((!lpls->dis.CtlID)&&(lphl->hWndLogicParent))
- {
- ListBoxGetWindowAndStorage(lphl->hWndLogicParent, &ParentWndPtr);
+ if ((!lpls->dis.CtlID) && (lphl->hWndLogicParent)) {
+ ParentWndPtr = WIN_FindWndPtr(lphl->hWndLogicParent);
lpls->dis.CtlID = ParentWndPtr->wIDmenu;
- }
+ }
h2 = lpls->dis.rcItem.bottom - lpls->dis.rcItem.top;
lpls->dis.rcItem.top = h;
lpls->dis.rcItem.bottom = h + h2;
@@ -645,10 +676,18 @@
lpls->dis.rcItem.right, lpls->dis.rcItem.bottom);
dprintf_listbox(stddeb,"LBOX WM_DRAWITEM Parent=%X &dis=%lX CtlID=%u !\n",
hWndParent, (LONG)&lpls->dis, lpls->dis.CtlID);
- dprintf_listbox(stddeb,"LBOX WM_DRAWITEM %08X!\n",lpls->dis.itemData);
+ dprintf_listbox(stddeb,"LBOX WM_DRAWITEM %08lX!\n",lpls->dis.itemData);
if (HasStrings(wndPtr))
dprintf_listbox(stddeb," '%s'\n",lpls->itemText);
- SendMessage(lphl->hWndLogicParent, WM_DRAWITEM, i-1, (LPARAM)&lpls->dis);
+ if (HasStrings(wndPtr)) {
+ itemData = lpls->dis.itemData;
+ lpls->dis.itemData = (DWORD)lpls->itemText;
+ }
+ SendMessage(lphl->hWndLogicParent, WM_DRAWITEM,
+ i-1, (LPARAM)&lpls->dis);
+ if (HasStrings(wndPtr))
+ lpls->dis.itemData = itemData;
+
/* if (lpls->dis.itemState != 0) {
InvertRect(hdc, &lpls->dis.rcItem);
} */
@@ -662,7 +701,7 @@
EndOfPaint:
EndPaint( hwnd, &ps );
if ((lphl->ItemsCount > lphl->ItemsVisible) &
- (wndPtr->dwStyle & WS_VSCROLL)) {
+ (wndPtr->dwStyle & WS_VSCROLL)) {
/*
InvalidateRect(wndPtr->hWndVScroll, NULL, TRUE);
UpdateWindow(wndPtr->hWndVScroll);
@@ -679,8 +718,7 @@
LPHEADLIST lphl;
LPLISTSTRUCT lpls;
RECT rect;
- UINT i, h, h2, w, w2;
- char C[128];
+ int i, h, h2, w, w2;
lphl = ListBoxGetWindowAndStorage(hwnd, &wndPtr);
if (lphl == NULL) return LB_ERR;
if (lphl->ItemsCount == 0) return LB_ERR;
@@ -715,39 +753,48 @@
int CreateListBoxStruct(HWND hwnd)
{
- WND *wndPtr;
- LPHEADLIST lphl;
- wndPtr = WIN_FindWndPtr(hwnd);
- lphl = (LPHEADLIST)malloc(sizeof(HEADLIST));
- lphl->lpFirst = NULL;
- *((LPHEADLIST *)&wndPtr->wExtra[1]) = lphl; /* HEAD of List */
- lphl->ItemsCount = 0;
- lphl->ItemsVisible = 0;
- lphl->FirstVisible = 1;
- lphl->StdItemHeight = 15;
- lphl->DrawCtlType = ODT_LISTBOX;
- return TRUE;
+ WND *wndPtr;
+ LPHEADLIST lphl;
+ wndPtr = WIN_FindWndPtr(hwnd);
+ lphl = (LPHEADLIST)malloc(sizeof(HEADLIST));
+ lphl->lpFirst = NULL;
+ *((LPHEADLIST *)&wndPtr->wExtra[1]) = lphl; /* HEAD of List */
+ lphl->ItemsCount = 0;
+ lphl->ItemsVisible = 0;
+ lphl->FirstVisible = 1;
+ lphl->ColumnsVisible = 1;
+ lphl->ItemsPerColumn = 0;
+ lphl->StdItemHeight = 15;
+ lphl->ItemFocused = 0;
+ lphl->PrevFocused = 0;
+ lphl->SelCount = 0;
+ lphl->DrawCtlType = ODT_LISTBOX;
+ lphl->bRedrawFlag = TRUE;
+ return TRUE;
}
void ListBoxAskMeasure(WND *wndPtr, LPHEADLIST lphl, LPLISTSTRUCT lpls)
{
- MEASUREITEMSTRUCT *measure;
+ MEASUREITEMSTRUCT *lpmeasure;
HANDLE hTemp = USER_HEAP_ALLOC(GMEM_MOVEABLE, sizeof(MEASUREITEMSTRUCT));
- measure = (MEASUREITEMSTRUCT *) USER_HEAP_ADDR(hTemp);
- if (measure == NULL) {
+ lpmeasure = (MEASUREITEMSTRUCT *) USER_HEAP_ADDR(hTemp);
+ if (lpmeasure == NULL) {
fprintf(stderr,"ListBoxAskMeasure() // Bad allocation of Measure struct !\n");
return;
}
- measure->CtlType = ODT_LISTBOX;
- measure->CtlID = wndPtr->wIDmenu;
- measure->itemID = lpls->dis.itemID;
- measure->itemWidth = wndPtr->rectWindow.right - wndPtr->rectWindow.left;
- measure->itemHeight = 0;
- measure->itemData = lpls->dis.itemData;
- SendMessage(lphl->hWndLogicParent, WM_MEASUREITEM, 0, (DWORD)measure);
- lpls->dis.rcItem.right = lpls->dis.rcItem.left + measure->itemWidth;
- lpls->dis.rcItem.bottom = lpls->dis.rcItem.top + measure->itemHeight;
+ lpmeasure->CtlType = ODT_LISTBOX;
+ lpmeasure->CtlID = wndPtr->wIDmenu;
+ lpmeasure->itemID = lpls->dis.itemID;
+ lpmeasure->itemWidth = wndPtr->rectWindow.right - wndPtr->rectWindow.left;
+ lpmeasure->itemHeight = 0;
+ if (HasStrings(wndPtr))
+ lpmeasure->itemData = (DWORD)lpls->itemText;
+ else
+ lpmeasure->itemData = lpls->dis.itemData;
+ SendMessage(lphl->hWndLogicParent, WM_MEASUREITEM, 0, (DWORD)lpmeasure);
+ lpls->dis.rcItem.right = lpls->dis.rcItem.left + lpmeasure->itemWidth;
+ lpls->dis.rcItem.bottom = lpls->dis.rcItem.top + lpmeasure->itemHeight;
USER_HEAP_FREE(hTemp);
}
@@ -757,14 +804,15 @@
WND *wndPtr;
LPHEADLIST lphl;
LPLISTSTRUCT lpls, lplsnew;
- HANDLE hTemp;
+ HANDLE hItem;
+ HANDLE hStr;
LPSTR str;
lphl = ListBoxGetWindowAndStorage(hwnd, &wndPtr);
if (lphl == NULL) return LB_ERR;
- hTemp = USER_HEAP_ALLOC(GMEM_MOVEABLE, sizeof(LISTSTRUCT));
- lplsnew = (LPLISTSTRUCT) USER_HEAP_ADDR(hTemp);
+ hItem = USER_HEAP_ALLOC(GMEM_MOVEABLE, sizeof(LISTSTRUCT));
+ lplsnew = (LPLISTSTRUCT) USER_HEAP_ADDR(hItem);
if (lplsnew == NULL) {
- fprintf(stderr,"ListBoxAddString() // Bad allocation of new item !\n");
+ dprintf_listbox(stddeb,"ListBoxAddString() // Bad allocation of new item !\n");
return LB_ERRSPACE;
}
lpls = lphl->lpFirst;
@@ -778,47 +826,47 @@
lphl->lpFirst = lplsnew;
lphl->ItemsCount++;
dprintf_listbox(stddeb,"Items Count = %u\n", lphl->ItemsCount);
- hTemp = 0;
- ListBoxDefaultItem(hwnd, wndPtr, lphl, lplsnew);
- if (HasStrings(wndPtr))
- {
- hTemp = USER_HEAP_ALLOC(GMEM_MOVEABLE, strlen(newstr) + 1);
- str = (LPSTR)USER_HEAP_ADDR(hTemp);
- if (str == NULL) return LB_ERRSPACE;
- strcpy(str, newstr);
- newstr = str;
- lplsnew->itemText = str;
- lplsnew->dis.itemData = 0;
- dprintf_listbox(stddeb,"ListBoxAddString// after strcpy '%s'\n", str);
- }
- else
- {
- lplsnew->itemText = NULL;
- lplsnew->dis.itemData = (DWORD)newstr;
- }
- lplsnew->hMem = hTemp;
- lplsnew->lpNext = NULL;
- lplsnew->dis.itemID = lphl->ItemsCount;
- lplsnew->hData = hTemp;
- if (((wndPtr->dwStyle & LBS_OWNERDRAWVARIABLE) == LBS_OWNERDRAWVARIABLE)|| ((wndPtr->dwStyle & LBS_OWNERDRAWFIXED) == LBS_OWNERDRAWFIXED))
+ hStr = 0;
+
+ ListBoxDefaultItem(hwnd, wndPtr, lphl, lplsnew);
+ if (HasStrings(wndPtr)) {
+ hStr = USER_HEAP_ALLOC(GMEM_MOVEABLE, strlen(newstr) + 1);
+ str = (LPSTR)USER_HEAP_ADDR(hStr);
+ if (str == NULL) return LB_ERRSPACE;
+ strcpy(str, newstr);
+ newstr = str;
+ lplsnew->itemText = str;
+ dprintf_listbox(stddeb,"ListBoxAddString // LBS_HASSTRINGS after strcpy '%s'\n", str);
+ }
+ else {
+ lplsnew->itemText = NULL;
+ lplsnew->dis.itemData = (DWORD)newstr;
+ }
+ lplsnew->hMem = hItem;
+ lplsnew->lpNext = NULL;
+ lplsnew->dis.itemID = lphl->ItemsCount;
+ lplsnew->hData = hStr;
+ if (((wndPtr->dwStyle & LBS_OWNERDRAWVARIABLE) == LBS_OWNERDRAWVARIABLE) ||
+ ((wndPtr->dwStyle & LBS_OWNERDRAWFIXED) == LBS_OWNERDRAWFIXED))
ListBoxAskMeasure(wndPtr, lphl, lplsnew);
- if (wndPtr->dwStyle & WS_VSCROLL)
- SetScrollRange(hwnd, SB_VERT, 1, lphl->ItemsCount,
- (lphl->FirstVisible != 1));
- if ((wndPtr->dwStyle & WS_HSCROLL) && lphl->ItemsPerColumn != 0)
- SetScrollRange(hwnd, SB_HORZ, 1, lphl->ItemsVisible /
- lphl->ItemsPerColumn + 1, (lphl->FirstVisible != 1));
- if (lphl->FirstVisible >= (lphl->ItemsCount - lphl->ItemsVisible)) {
- InvalidateRect(hwnd, NULL, TRUE);
- UpdateWindow(hwnd);
- }
- if ((lphl->ItemsCount - lphl->FirstVisible) == lphl->ItemsVisible) {
if (wndPtr->dwStyle & WS_VSCROLL)
- ShowScrollBar(hwnd, SB_VERT, TRUE);
- if (wndPtr->dwStyle & WS_HSCROLL)
- ShowScrollBar(hwnd, SB_HORZ, TRUE);
- }
- return lphl->ItemsCount-1;
+ SetScrollRange(hwnd, SB_VERT, 1, lphl->ItemsCount,
+ (lphl->FirstVisible != 1 && lphl->bRedrawFlag));
+ if ((wndPtr->dwStyle & WS_HSCROLL) && lphl->ItemsPerColumn != 0)
+ SetScrollRange(hwnd, SB_HORZ, 1,
+ lphl->ItemsVisible / lphl->ItemsPerColumn + 1,
+ (lphl->FirstVisible != 1 && lphl->bRedrawFlag));
+ if (lphl->FirstVisible >= (lphl->ItemsCount - lphl->ItemsVisible)) {
+ InvalidateRect(hwnd, NULL, TRUE);
+ UpdateWindow(hwnd);
+ }
+ if ((lphl->ItemsCount - lphl->FirstVisible) == lphl->ItemsVisible) {
+ if (wndPtr->dwStyle & WS_VSCROLL)
+ ShowScrollBar(hwnd, SB_VERT, TRUE);
+ if (wndPtr->dwStyle & WS_HSCROLL)
+ ShowScrollBar(hwnd, SB_HORZ, TRUE);
+ }
+ return (lphl->ItemsCount - 1);
}
@@ -827,10 +875,11 @@
WND *wndPtr;
LPHEADLIST lphl;
LPLISTSTRUCT lpls, lplsnew;
- HANDLE hTemp;
+ HANDLE hItem;
+ HANDLE hStr;
LPSTR str;
UINT Count;
- dprintf_listbox(stddeb,"ListBoxInsertString(%04X, %d, %08X);\n",
+ dprintf_listbox(stddeb,"ListBoxInsertString(%04X, %d, %p);\n",
hwnd, uIndex, newstr);
if (uIndex == (UINT)-1) return ListBoxAddString(hwnd, newstr);
lphl = ListBoxGetWindowAndStorage(hwnd, &wndPtr);
@@ -846,47 +895,42 @@
if (lpls->lpNext == NULL) return LB_ERR;
lpls = (LPLISTSTRUCT)lpls->lpNext;
}
- hTemp = USER_HEAP_ALLOC(GMEM_MOVEABLE, sizeof(LISTSTRUCT));
- lplsnew = (LPLISTSTRUCT) USER_HEAP_ADDR(hTemp);
+ hItem = USER_HEAP_ALLOC(GMEM_MOVEABLE, sizeof(LISTSTRUCT));
+ lplsnew = (LPLISTSTRUCT) USER_HEAP_ADDR(hItem);
if (lplsnew == NULL) {
- fprintf(stderr,"ListBoxInsertString() // Bad allocation of new item !\n");
+ printf("ListBoxInsertString() // Bad allocation of new item !\n");
return LB_ERRSPACE;
}
ListBoxDefaultItem(hwnd, wndPtr, lphl, lplsnew);
- lplsnew->hMem = hTemp;
- if (uIndex == 0)
- {
+ lplsnew->hMem = hItem;
+ if (uIndex == 0) {
lplsnew->lpNext = lphl->lpFirst;
lphl->lpFirst = lplsnew;
- }
- else
- {
+ }
+ else {
lplsnew->lpNext = lpls->lpNext;
lpls->lpNext = lplsnew;
- }
+ }
lphl->ItemsCount++;
- hTemp = 0;
- if (HasStrings(wndPtr))
- {
- hTemp = USER_HEAP_ALLOC(GMEM_MOVEABLE, strlen(newstr) + 1);
- str = (LPSTR)USER_HEAP_ADDR(hTemp);
- if (str == NULL) return LB_ERRSPACE;
- strcpy(str, newstr);
- newstr = str;
- lplsnew->itemText = str;
- lplsnew->dis.itemData = 0;
-#ifdef DEBUG_LISTBOX
- printf("ListBoxInsertString // after strcpy '%s'\n", str);
-#endif
- }
- else
- {
- lplsnew->itemText = NULL;
- lplsnew->dis.itemData = (DWORD)newstr;
- }
+ hStr = 0;
+
+ if (HasStrings(wndPtr)) {
+ hStr = USER_HEAP_ALLOC(GMEM_MOVEABLE, strlen(newstr) + 1);
+ str = (LPSTR)USER_HEAP_ADDR(hStr);
+ if (str == NULL) return LB_ERRSPACE;
+ strcpy(str, newstr);
+ newstr = str;
+ lplsnew->itemText = str;
+ dprintf_listbox(stddeb,"ListBoxInsertString // LBS_HASSTRINGS after strcpy '%s'\n", str);
+ }
+ else {
+ lplsnew->itemText = NULL;
+ lplsnew->dis.itemData = (DWORD)newstr;
+ }
lplsnew->dis.itemID = lphl->ItemsCount;
- lplsnew->hData = hTemp;
- if (((wndPtr->dwStyle & LBS_OWNERDRAWVARIABLE) == LBS_OWNERDRAWVARIABLE)|| ((wndPtr->dwStyle & LBS_OWNERDRAWFIXED) == LBS_OWNERDRAWFIXED))
+ lplsnew->hData = hStr;
+ if (((wndPtr->dwStyle & LBS_OWNERDRAWVARIABLE) == LBS_OWNERDRAWVARIABLE) ||
+ ((wndPtr->dwStyle & LBS_OWNERDRAWFIXED) == LBS_OWNERDRAWFIXED))
ListBoxAskMeasure(wndPtr, lphl, lplsnew);
if (wndPtr->dwStyle & WS_VSCROLL)
SetScrollRange(hwnd, SB_VERT, 1, lphl->ItemsCount,
@@ -904,10 +948,9 @@
InvalidateRect(hwnd, NULL, TRUE);
UpdateWindow(hwnd);
}
-#ifdef DEBUG_LISTBOX
- printf("ListBoxInsertString // count=%d\n", lphl->ItemsCount);
-#endif
- return /* lphl->ItemsCount;*/ uIndex;
+ dprintf_listbox(stddeb,"ListBoxInsertString // count=%d\n", lphl->ItemsCount);
+/* return lphl->ItemsCount; */
+ return uIndex;
}
@@ -917,8 +960,7 @@
LPHEADLIST lphl;
LPLISTSTRUCT lpls;
UINT Count;
- if (!bItemData)
- *OutStr=0;
+ if (!bItemData) *OutStr=0;
lphl = ListBoxGetWindowAndStorage(hwnd, &wndPtr);
if (lphl == NULL) return LB_ERR;
if (uIndex >= lphl->ItemsCount) return LB_ERR;
@@ -1055,8 +1097,8 @@
lphl->lpFirst = NULL;
lphl->FirstVisible = 1;
lphl->ItemsCount = 0;
- lphl->ItemFocused = /*0*/-1;
- lphl->PrevFocused = /*0*/-1;
+ lphl->ItemFocused = -1;
+ lphl->PrevFocused = -1;
if ((wndPtr->dwStyle && LBS_NOTIFY) != 0)
SendMessage(lphl->hWndLogicParent, WM_COMMAND,
wndPtr->wIDmenu, MAKELONG(hwnd, LBN_SELCHANGE));
@@ -1153,64 +1195,56 @@
int ListBoxDirectory(HWND hwnd, UINT attrib, LPSTR filespec)
{
- struct dosdirent *dp;
- struct dosdirent *newdp;
- struct stat st;
- int x, wRet;
- char temp[256];
-#ifdef DEBUG_LISTBOX
- fprintf(stderr,"ListBoxDirectory: %s, %4x\n",filespec,attrib);
-#endif
- if ((dp = (struct dosdirent *)DOS_opendir(filespec)) ==NULL) return 0;
- while (dp = (struct dosdirent *)DOS_readdir(dp))
- {
- if (!dp->inuse) break;
-#ifdef DEBUG_LISTBOX
- printf("ListBoxDirectory %08X '%s' !\n", dp->filename, dp->filename);
-#endif
- if (dp->attribute & FA_DIREC)
- {
- if (attrib & DDL_DIRECTORY)
- {
- sprintf(temp, "[%s]", dp->filename);
- if ( (wRet = ListBoxAddString(hwnd, temp)) == LB_ERR) break;
- }
- }
- else
- {
- if (attrib & DDL_EXCLUSIVE)
- {
- if (attrib & (DDL_READWRITE | DDL_READONLY | DDL_HIDDEN |
- DDL_SYSTEM) )
- if ( (wRet = ListBoxAddString(hwnd, dp->filename))
- == LB_ERR)
- break;
- }
- else
- {
- if ( (wRet = ListBoxAddString(hwnd, dp->filename)) == LB_ERR)
- break;
- }
- }
- }
- DOS_closedir(dp);
-
- if (attrib & DDL_DRIVES)
- {
- for (x=0;x!=MAX_DOS_DRIVES;x++)
- {
- if (DOS_ValidDrive(x))
- {
- sprintf(temp, "[-%c-]", 'a'+x);
- if ( (wRet = ListBoxAddString(hwnd, temp)) == LB_ERR)
- break;
- }
- }
- }
-#ifdef DEBUG_LISTBOX
- printf("End of ListBoxDirectory !\n");
-#endif
- return wRet;
+ struct dosdirent *dp;
+ int x, wRet;
+ BOOL OldFlag;
+ char temp[256];
+ LPHEADLIST lphl;
+ dprintf_listbox(stddeb,"ListBoxDirectory: %s, %4x\n",filespec,attrib);
+ lphl = ListBoxGetStorageHeader(hwnd);
+ if (lphl == NULL) return LB_ERR;
+ if ((dp = (struct dosdirent *)DOS_opendir(filespec)) ==NULL) return 0;
+ OldFlag = lphl->bRedrawFlag;
+ lphl->bRedrawFlag = FALSE;
+ while ((dp = (struct dosdirent *)DOS_readdir(dp))) {
+ if (!dp->inuse) break;
+ dprintf_listbox(stddeb,"ListBoxDirectory %p '%s' !\n", dp->filename, dp->filename);
+ if (dp->attribute & FA_DIREC) {
+ if (attrib & DDL_DIRECTORY) {
+ sprintf(temp, "[%s]", dp->filename);
+ if ( (wRet = ListBoxAddString(hwnd, temp)) == LB_ERR) break;
+ }
+ }
+ else {
+ if (attrib & DDL_EXCLUSIVE) {
+ if (attrib & (DDL_READWRITE | DDL_READONLY | DDL_HIDDEN |
+ DDL_SYSTEM) )
+ if ( (wRet = ListBoxAddString(hwnd, dp->filename))
+ == LB_ERR) break;
+ }
+ else {
+ if ( (wRet = ListBoxAddString(hwnd, dp->filename))
+ == LB_ERR) break;
+ }
+ }
+ }
+ DOS_closedir(dp);
+
+ if (attrib & DDL_DRIVES) {
+ for (x=0;x!=MAX_DOS_DRIVES;x++) {
+ if (DOS_ValidDrive(x)) {
+ sprintf(temp, "[-%c-]", 'a'+x);
+ if ( (wRet = ListBoxAddString(hwnd, temp)) == LB_ERR) break;
+ }
+ }
+ }
+ lphl->bRedrawFlag = OldFlag;
+ if (OldFlag) {
+ InvalidateRect(hwnd, NULL, TRUE);
+ UpdateWindow(hwnd);
+ }
+ dprintf_listbox(stddeb,"End of ListBoxDirectory !\n");
+ return wRet;
}
@@ -1357,7 +1391,8 @@
*/
BOOL DlgDirSelect(HWND hDlg, LPSTR lpStr, int nIDLBox)
{
- fprintf(stdnimp,"DlgDirSelect(%04X, '%s', %d) \n", hDlg, lpStr, nIDLBox);
+ fprintf(stdnimp,"DlgDirSelect(%04X, '%s', %d) \n", hDlg, lpStr, nIDLBox);
+ return FALSE;
}
diff --git a/controls/menu.c b/controls/menu.c
index 8290dda..3d5fef0 100644
--- a/controls/menu.c
+++ b/controls/menu.c
@@ -24,14 +24,15 @@
#include "user.h"
#include "win.h"
#include "message.h"
+#include "stddebug.h"
+/* #define DEBUG_MENU */
+/* #undef DEBUG_MENU */
+/* #define DEBUG_MENUCALC */
+/* #undef DEBUG_MENUCALC */
+/* #define DEBUG_MENUSHORTCUT */
+/* #undef DEBUG_MENUSHORTCUT */
#include "debug.h"
-/* #define DEBUG_MENU /* */
-/* #undef DEBUG_MENU /* */
-/* #define DEBUG_MENUCALC /* */
-/* #undef DEBUG_MENUCALC /* */
-/* #define DEBUG_MENUSHORTCUT /* */
-/* #undef DEBUG_MENUSHORTCUT /* */
/* Dimension of the menu bitmaps */
static WORD check_bitmap_width = 0, check_bitmap_height = 0;
@@ -288,7 +289,7 @@
/* If we get here, then it is a text item */
- dwSize = GetTextExtent( hdc, lpitem->item_text, strlen(lpitem->item_text));
+ dwSize = (lpitem->item_text == NULL) ? 0 : GetTextExtent( hdc, lpitem->item_text, strlen(lpitem->item_text));
lpitem->rect.right += LOWORD(dwSize);
lpitem->rect.bottom += max( HIWORD(dwSize), SYSMETRICS_CYMENU );
@@ -605,7 +606,7 @@
lppop = (LPPOPUPMENU) USER_HEAP_ADDR( wndPtr->wIDmenu );
if (lppop == NULL || lprect == NULL) return SYSMETRICS_CYMENU;
- dprintf_menu(stddeb,"MENU_DrawMenuBar(%04X, %08X, %08X); !\n",
+ dprintf_menu(stddeb,"MENU_DrawMenuBar(%04X, %p, %p); !\n",
hDC, lprect, lppop);
if (lppop->Height == 0) MENU_MenuBarCalcSize(hDC, lprect, lppop, hwnd);
lprect->bottom = lprect->top + lppop->Height;
@@ -1527,7 +1528,7 @@
{
LPMENUITEM lpitem;
int maxsiz;
- dprintf_menu(stddeb,"GetMenuString(%04X, %04X, %08X, %d, %04X);\n",
+ dprintf_menu(stddeb,"GetMenuString(%04X, %04X, %p, %d, %04X);\n",
hMenu, wItemID, str, nMaxSiz, wFlags);
if (str == NULL) return FALSE;
lpitem = MENU_FindItem( &hMenu, &wItemID, wFlags );
@@ -1624,10 +1625,12 @@
LPPOPUPMENU menu;
if (IS_STRING_ITEM(wFlags))
- dprintf_menu(stddeb,"InsertMenu (%04X, %04X, %04X, '%s') !\n",
- hMenu, wFlags, wItemID, lpNewItem);
+ {
+ dprintf_menu(stddeb,"InsertMenu (%04X, %04X, %04X, %04X, '%s') !\n",
+ hMenu, nPos, wFlags, wItemID, lpNewItem);
+ }
else
- dprintf_menu(stddeb,"InsertMenu (%04X, %04X, %04X, %04X, %08X) !\n",
+ dprintf_menu(stddeb,"InsertMenu (%04X, %04X, %04X, %04X, %p) !\n",
hMenu, nPos, wFlags, wItemID, lpNewItem);
/* Find where to insert new item */
@@ -1763,7 +1766,7 @@
dprintf_menu(stddeb,"ModifyMenu (%04X, %04X, %04X, %04X, '%s') !\n",
hMenu, nPos, wFlags, wItemID, lpNewItem);
else
- dprintf_menu(stddeb,"ModifyMenu (%04X, %04X, %04X, %04X, %08X) !\n",
+ dprintf_menu(stddeb,"ModifyMenu (%04X, %04X, %04X, %04X, %p) !\n",
hMenu, nPos, wFlags, wItemID, lpNewItem);
if (!(lpitem = MENU_FindItem( &hMenu, &nPos, wFlags ))) return FALSE;
@@ -1872,7 +1875,8 @@
if (hMenu == 0) return FALSE;
lppop = (LPPOPUPMENU) USER_HEAP_ADDR(hMenu);
if (lppop == NULL) return FALSE;
- if (lppop->hWnd) DestroyWindow (lppop->hWnd);
+ if ((lppop->wFlags & MF_POPUP) && lppop->hWnd)
+ DestroyWindow( lppop->hWnd );
if (lppop->hItems)
{
@@ -1912,10 +1916,10 @@
*/
BOOL SetSystemMenu(HWND hWnd, HMENU newHmenu)
{
- WND *wndPtr;
+ WND *wndPtr;
- if ((wndPtr = WIN_FindWndPtr(hWnd)) != NULL)
- wndPtr->hSysMenu = newHmenu;
+ if ((wndPtr = WIN_FindWndPtr(hWnd)) != NULL) wndPtr->hSysMenu = newHmenu;
+ return TRUE;
}
@@ -2030,7 +2034,7 @@
{
HMENU hMenu;
MENU_HEADER *menu_desc;
- dprintf_menu(stddeb,"LoadMenuIndirect: menu_template '%08X'\n",
+ dprintf_menu(stddeb,"LoadMenuIndirect: menu_template '%p'\n",
menu_template);
hMenu = CreateMenu();
menu_desc = (MENU_HEADER *)menu_template;
diff --git a/controls/scroll.c b/controls/scroll.c
index 36c7ef8..74be050 100644
--- a/controls/scroll.c
+++ b/controls/scroll.c
@@ -20,8 +20,8 @@
#include "win.h"
#include "prototypes.h"
#include "stddebug.h"
-/* #define DEBUG_SCROLL /* */
-/* #undef DEBUG_SCROLL /* */
+/* #define DEBUG_SCROLL */
+/* #undef DEBUG_SCROLL */
#include "debug.h"
@@ -34,6 +34,10 @@
HBITMAP hLfArrowD = 0;
HBITMAP hRgArrowD = 0;
+ /* windows/graphics.c */
+extern void GRAPH_DrawReliefRect( HDC hdc, RECT *rect,
+ int thickness, BOOL pressed );
+
LPHEADSCROLL ScrollBarGetWindowAndStorage(HWND hWnd, WND **wndPtr);
LPHEADSCROLL ScrollBarGetStorageHeader(HWND hWnd);
LPHEADSCROLL GetScrollObjectStruct(HWND hWnd, int nBar);
@@ -51,17 +55,12 @@
*/
LONG ScrollBarWndProc( HWND hWnd, WORD message, WORD wParam, LONG lParam )
{
- WORD wRet;
- short x, y;
- short width, height;
WND *wndPtr;
LPHEADSCROLL lphs;
PAINTSTRUCT ps;
HDC hDC;
- BITMAP bm;
- RECT rect, rect2;
+ RECT rect;
LPCREATESTRUCT lpCreat;
- static RECT rectsel;
POINT *pt;
pt=(POINT*)&lParam;
switch(message) {
@@ -90,7 +89,7 @@
case WM_DESTROY:
lphs = ScrollBarGetWindowAndStorage(hWnd, &wndPtr);
if (lphs == 0) return 0;
- dprintf_scroll(stddeb,"ScrollBar WM_DESTROY %lX !\n", lphs);
+ dprintf_scroll(stddeb,"ScrollBar WM_DESTROY %p !\n", lphs);
free(lphs);
*((LPHEADSCROLL *)&wndPtr->wExtra[1]) = 0;
return 0;
@@ -143,10 +142,19 @@
SetTimer(hWnd, 1, 100, NULL);
return 0;
+ case WM_SETREDRAW:
+#ifdef DEBUG_SCROLL
+ printf("ScrollBar WM_SETREDRAW hWnd=%04X w=%04X !\n", hWnd, wParam);
+#endif
+ lphs = ScrollBarGetStorageHeader(hWnd);
+ if (lphs == NULL) return 0;
+ lphs->bRedrawFlag = wParam;
+ break;
+
case WM_PAINT:
hDC = BeginPaint(hWnd, &ps);
lphs = ScrollBarGetStorageHeader(hWnd);
- if (lphs != NULL) {
+ if (lphs != NULL && lphs->bRedrawFlag) {
GetClientRect(hWnd, &rect);
StdDrawScrollBar(hWnd, hDC, SB_CTL, &rect, lphs);
}
@@ -164,7 +172,7 @@
{
LPHEADSCROLL lphs;
HWND hWndParent;
- RECT rect, rect2;
+ RECT rect;
int width, height;
LONG dwOwner;
lphs = GetScrollObjectStruct(hWnd, nBar);
@@ -265,7 +273,7 @@
void ScrollBarButtonUp(HWND hWnd, int nBar, int x, int y)
{
LPHEADSCROLL lphs;
- RECT rect, rect2;
+ RECT rect;
HDC hDC;
dprintf_scroll(stddeb,"ScrollBarButtonUp // x=%d y=%d\n", x, y);
lphs = GetScrollObjectStruct(hWnd, nBar);
@@ -308,7 +316,7 @@
LPHEADSCROLL lphs;
HWND hWndParent;
HWND hWndOwner;
- LONG dwOwner;
+
if ((wParam & MK_LBUTTON) == 0) return;
lphs = GetScrollObjectStruct(hWnd, nBar);
if (lphs->ThumbActive == 0) return;
@@ -391,9 +399,10 @@
HBITMAP hOldBmp;
BITMAP bm;
RECT rect;
- UINT i, w, w2, h, h2, siz;
- char C[128];
+ UINT w, w2, h, h2;
+
if (lphs == NULL) return;
+ if (!lphs->bRedrawFlag) return;
dprintf_scroll(stddeb,"StdDrawScrollBar nBar=%04X !\n", nBar);
if (lphs->Direction == WM_VSCROLL)
dprintf_scroll(stddeb,"StdDrawScrollBar Vertical left=%d top=%d right=%d bottom=%d !\n",
@@ -505,7 +514,6 @@
int CreateScrollBarStruct(HWND hWnd)
{
- RECT rect;
int width, height;
WND *wndPtr;
LPHEADSCROLL lphs;
@@ -516,7 +524,7 @@
lphs = AllocScrollBar(WS_VSCROLL, width, height);
else
lphs = AllocScrollBar(WS_HSCROLL, width, height);
- dprintf_scroll(stddeb,"CreateScrollBarStruct %lX !\n", lphs);
+ dprintf_scroll(stddeb,"CreateScrollBarStruct %p !\n", lphs);
*((LPHEADSCROLL *)&wndPtr->wExtra[1]) = lphs;
lphs->hWndOwner = hWnd;
CopyRect(&lphs->rect, &wndPtr->rectClient);
@@ -549,6 +557,7 @@
fprintf(stderr,"Bad Memory Alloc on ScrollBar !\n");
return NULL;
}
+ lphs->bRedrawFlag = TRUE;
lphs->ThumbActive = FALSE;
lphs->TimerPending = FALSE;
lphs->ButtonDown = 0;
@@ -589,7 +598,7 @@
if (wndPtr->dwStyle & WS_VSCROLL) {
if (wndPtr->dwStyle & WS_HSCROLL) height -= SYSMETRICS_CYHSCROLL;
lphs = AllocScrollBar(WS_VSCROLL, SYSMETRICS_CXVSCROLL, height);
- dprintf_scroll(stddeb,"NC_CreateScrollBars Vertical %lX !\n",
+ dprintf_scroll(stddeb,"NC_CreateScrollBars Vertical %p !\n",
lphs);
lphs->rect.left = width - SYSMETRICS_CYVSCROLL;
lphs->rect.right = width;
@@ -601,7 +610,7 @@
if (wndPtr->dwStyle & WS_HSCROLL) {
if (wndPtr->dwStyle & WS_VSCROLL) width -= SYSMETRICS_CYVSCROLL;
lphs = AllocScrollBar(WS_HSCROLL, width, SYSMETRICS_CYHSCROLL);
- dprintf_scroll(stddeb,"NC_CreateScrollBars Horizontal %lX !\n", lphs);
+ dprintf_scroll(stddeb,"NC_CreateScrollBars Horizontal %p !\n", lphs);
lphs->rect.top = height - SYSMETRICS_CYHSCROLL;
lphs->rect.bottom = height;
lphs->hWndOwner = hWnd;
@@ -750,17 +759,20 @@
wndPtr = WIN_FindWndPtr(hWnd);
if ((wBar == SB_VERT) || (wBar == SB_BOTH)) {
if (bFlag)
- wndPtr->scroll_flags != 0x0001;
+ wndPtr->scroll_flags |= 1;
else
- wndPtr->scroll_flags &= 0xFFFE;
+ wndPtr->scroll_flags &= ~1;
}
if ((wBar == SB_HORZ) || (wBar == SB_BOTH)) {
if (bFlag)
- wndPtr->scroll_flags != 0x0002;
+ wndPtr->scroll_flags |= 2;
else
- wndPtr->scroll_flags &= 0xFFFD;
+ wndPtr->scroll_flags &= ~2;
}
SetWindowPos(hWnd, 0, 0, 0, 0, 0,
SWP_NOZORDER | SWP_NOMOVE |
SWP_NOSIZE | SWP_FRAMECHANGED);
}
+
+
+
diff --git a/controls/static.c b/controls/static.c
index e36b412..b61c9e1 100644
--- a/controls/static.c
+++ b/controls/static.c
@@ -86,6 +86,17 @@
InvalidateRect(hWnd, NULL, FALSE);
break;
+ case WM_NCCREATE:
+ if (style == SS_ICON)
+ {
+ CREATESTRUCT * createStruct = (CREATESTRUCT *)lParam;
+ if (createStruct->lpszName)
+ STATIC_SetIcon( hWnd, LoadIcon( createStruct->hInstance,
+ createStruct->lpszName ));
+ break;
+ }
+ return DefWindowProc(hWnd, uMsg, wParam, lParam);
+
case WM_CREATE:
if (style < 0L || style > LAST_STATIC_TYPE) {
lResult = -1L;
@@ -95,17 +106,13 @@
color_windowframe = GetSysColor(COLOR_WINDOWFRAME);
color_background = GetSysColor(COLOR_BACKGROUND);
color_window = GetSysColor(COLOR_WINDOW);
- if (style == SS_ICON)
- {
- CREATESTRUCT * createStruct = (CREATESTRUCT *)lParam;
- if (createStruct->lpszName)
- STATIC_SetIcon( hWnd, LoadIcon( createStruct->hInstance,
- createStruct->lpszName ));
- }
break;
- case WM_DESTROY:
- STATIC_SetIcon( hWnd, 0 ); /* Destroy the current icon */
+ case WM_NCDESTROY:
+ if (style == SS_ICON)
+ STATIC_SetIcon( hWnd, 0 ); /* Destroy the current icon */
+ else
+ lResult = DefWindowProc(hWnd, uMsg, wParam, lParam);
break;
case WM_PAINT:
diff --git a/if1632/Imakefile b/if1632/Imakefile
index 4c15d44..9812c1d 100644
--- a/if1632/Imakefile
+++ b/if1632/Imakefile
@@ -3,18 +3,17 @@
MODULE = if1632
-#ifdef WINELIB
SRCS = \
callback.c \
relay.c
-#else
-SRCS = \
- call.S \
- callback.c \
- relay.c
-#endif
+#ifdef WINELIB
+CALLOBJS =
+DLLOBJS =
+#else
+CALLOBJS = call.o
DLLOBJS = \
+ dll_commdlg.o \
dll_gdi.o \
dll_kernel.o \
dll_keyboard.o \
@@ -29,22 +28,18 @@
dll_user.o \
dll_win87em.o \
dll_winsock.o
-
-#ifdef WINELIB
-DLLOBJS=
#endif
-OBJS1= $(SRCS:.S=.o)
-
#ifndef NewBuild
-OBJS = $(DLLOBJS) $(OBJS1:.c=.o) $(DLLOBJS:.o=_tab.o)
+OBJS = $(CALLOBJS) $(DLLOBJS) $(SRCS:.c=.o) $(DLLOBJS:.o=_tab.o)
#else
-OBJS = $(DLLOBJS) $(OBJS1:.c=.o) $(DLLOBJS:.o=_tab.o) $(DLLOBJS:dll_.rly_)
+OBJS = $(CALLOBJS) $(DLLOBJS) $(SRCS:.c=.o) $(DLLOBJS:.o=_tab.o) $(DLLOBJS:dll_.rly_)
#endif
/*
* If you add a new spec file, copy one of these lines
*/
+MakeDllFromSpec(commdlg,$(TOP)/$(MODULE))
MakeDllFromSpec(gdi,$(TOP)/$(MODULE))
MakeDllFromSpec(kernel,$(TOP)/$(MODULE))
MakeDllFromSpec(keyboard,$(TOP)/$(MODULE))
@@ -63,10 +58,13 @@
WineRelocatableTarget($(TOP)/$(MODULE),,$(OBJS))
DependTarget()
+#ifndef WINELIB
pop.h: $(TOP)/tools/build
$(TOP)/tools/build -p
-call.s: call.S pop.h
+call.o: call.S pop.h
+ gcc -I. -c -o call.o call.S
+#endif
includes::
touch pop.h
diff --git a/if1632/call.S b/if1632/call.S
index 48f6d75..5a6b10b 100644
--- a/if1632/call.S
+++ b/if1632/call.S
@@ -7,6 +7,11 @@
#if defined(__NetBSD__) || defined(__FreeBSD__)
#define UDATASEL 0x27
#endif
+#ifdef __ELF__
+#define A( addr) addr
+#else
+#define A( addr) _##addr
+#endif
.data
jump_target:
return_value:
@@ -15,23 +20,23 @@
/**********************************************************************
* Places to keep info about the current 32-bit stack frame.
*/
- .globl _IF1632_Saved32_esp,_IF1632_Saved32_ebp,_IF1632_Saved32_ss
-_IF1632_Saved32_esp:
+ .globl A( IF1632_Saved32_esp), A(IF1632_Saved32_ebp), A(IF1632_Saved32_ss)
+A(IF1632_Saved32_esp):
.long 0
-_IF1632_Saved32_ebp:
+A(IF1632_Saved32_ebp):
.long 0
-_IF1632_Saved32_ss:
+A(IF1632_Saved32_ss):
.word 0
/**********************************************************************
* Places to keep info about the current 16-bit stack frame.
*/
- .globl _IF1632_Saved16_esp,_IF1632_Saved16_ebp,_IF1632_Saved16_ss
-_IF1632_Saved16_esp:
+ .globl A(IF1632_Saved16_esp),A(IF1632_Saved16_ebp),A(IF1632_Saved16_ss)
+A(IF1632_Saved16_esp):
.long 0
-_IF1632_Saved16_ebp:
+A(IF1632_Saved16_ebp):
.long 0
-_IF1632_Saved16_ss:
+A(IF1632_Saved16_ss):
.word 0
nbytes:
@@ -56,8 +61,8 @@
* 16 target ds
*/
.align 4
- .globl _CallToInit16
-_CallToInit16:
+ .globl A(CallToInit16)
+A(CallToInit16):
pushl %ebp
movl %esp,%ebp
@@ -65,9 +70,9 @@
* Save our registers
*/
pushal
- pushl _IF1632_Saved32_esp
- pushl _IF1632_Saved32_ebp
- pushw _IF1632_Saved32_ss
+ pushl A(IF1632_Saved32_esp)
+ pushl A(IF1632_Saved32_ebp)
+ pushw A(IF1632_Saved32_ss)
/*
* Get target address.
@@ -79,18 +84,18 @@
/*
* Put stack registers where we can get them after stack switch.
*/
- movw %ss,_IF1632_Saved32_ss
- movl %esp,_IF1632_Saved32_esp
- movl %ebp,_IF1632_Saved32_ebp
+ movw %ss,A(IF1632_Saved32_ss)
+ movl %esp,A(IF1632_Saved32_esp)
+ movl %ebp,A(IF1632_Saved32_ebp)
/*
* Load initial registers
*/
- movw _WIN_StackSize,%bx
- movw _WIN_HeapSize,%cx
+ movw A(WIN_StackSize),%bx
+ movw A(WIN_HeapSize),%cx
movl $0,%esi
xorl %eax,%eax
- movw _PSPSelector,%ax
+ movw A(PSPSelector),%ax
movw %ax,%es
movw 16(%ebp),%ax
movw %ax,%ds
@@ -131,16 +136,16 @@
movw %ax,%fs
movw %ax,%gs
popl %eax
- movw _IF1632_Saved32_ss,%ss
- movl _IF1632_Saved32_esp,%esp
- movl _IF1632_Saved32_ebp,%ebp
+ movw A(IF1632_Saved32_ss),%ss
+ movl A(IF1632_Saved32_esp),%esp
+ movl A(IF1632_Saved32_ebp),%ebp
/*
* Restore registers, but do not destroy return value.
*/
- popw _IF1632_Saved32_ss
- popl _IF1632_Saved32_ebp
- popl _IF1632_Saved32_esp
+ popw A(IF1632_Saved32_ss)
+ popl A(IF1632_Saved32_ebp)
+ popl A(IF1632_Saved32_esp)
movl %eax,return_value
popal
movl return_value,%eax
@@ -158,8 +163,8 @@
* 12 target ds
*/
.align 4
- .globl _CallTo16
-_CallTo16:
+ .globl A(CallTo16)
+A(CallTo16):
pushl %ebp
movl %esp,%ebp
@@ -174,17 +179,17 @@
/*
* Switch to 16-bit stack
*/
- pushl _IF1632_Saved32_esp
- pushl _IF1632_Saved32_ebp
- pushw _IF1632_Saved32_ss
+ pushl A(IF1632_Saved32_esp)
+ pushl A(IF1632_Saved32_ebp)
+ pushw A(IF1632_Saved32_ss)
- movw %ss,_IF1632_Saved32_ss
- movl %esp,_IF1632_Saved32_esp
- movl %ebp,_IF1632_Saved32_ebp
+ movw %ss,A(IF1632_Saved32_ss)
+ movl %esp,A(IF1632_Saved32_esp)
+ movl %ebp,A(IF1632_Saved32_ebp)
- movw _IF1632_Saved16_ss,%ss
- movl _IF1632_Saved16_esp,%esp
- movl _IF1632_Saved16_ebp,%ebp
+ movw A(IF1632_Saved16_ss),%ss
+ movl A(IF1632_Saved16_esp),%esp
+ movl A(IF1632_Saved16_ebp),%ebp
/*
* Call entry point
@@ -213,17 +218,17 @@
movw %ax,%gs
popl %eax
- movw %ss,_IF1632_Saved16_ss
- movl %esp,_IF1632_Saved16_esp
- movl %ebp,_IF1632_Saved16_ebp
+ movw %ss,A(IF1632_Saved16_ss)
+ movl %esp,A(IF1632_Saved16_esp)
+ movl %ebp,A(IF1632_Saved16_ebp)
- movw _IF1632_Saved32_ss,%ss
- movl _IF1632_Saved32_esp,%esp
- movl _IF1632_Saved32_ebp,%ebp
+ movw A(IF1632_Saved32_ss),%ss
+ movl A(IF1632_Saved32_esp),%esp
+ movl A(IF1632_Saved32_ebp),%ebp
- popw _IF1632_Saved32_ss
- popl _IF1632_Saved32_ebp
- popl _IF1632_Saved32_esp
+ popw A(IF1632_Saved32_ss)
+ popl A(IF1632_Saved32_ebp)
+ popl A(IF1632_Saved32_esp)
movl %eax,return_value
movw return_value+2,%dx
@@ -246,8 +251,8 @@
* 16-bit stack.
*/
.align 4
- .globl _CallTo32
-_CallTo32:
+ .globl A(CallTo32)
+A(CallTo32):
pushl %ebp
movl %esp,%ebp
@@ -270,26 +275,26 @@
* Save old stack save variables, save stack registers, reload
* stack registers.
*/
- pushl _IF1632_Saved16_esp
- pushl _IF1632_Saved16_ebp
- pushw _IF1632_Saved16_ss
+ pushl A(IF1632_Saved16_esp)
+ pushl A(IF1632_Saved16_ebp)
+ pushw A(IF1632_Saved16_ss)
- movw %ss,_IF1632_Saved16_ss
- movl %esp,_IF1632_Saved16_esp
- movl %ebp,_IF1632_Saved16_ebp
+ movw %ss,A(IF1632_Saved16_ss)
+ movl %esp,A(IF1632_Saved16_esp)
+ movl %ebp,A(IF1632_Saved16_ebp)
- movw _IF1632_Saved32_ss,%ss
- movl _IF1632_Saved32_esp,%esp
- movl _IF1632_Saved32_ebp,%ebp
+ movw A(IF1632_Saved32_ss),%ss
+ movl A(IF1632_Saved32_esp),%esp
+ movl A(IF1632_Saved32_ebp),%ebp
/*
* Call entry point
*/
pushl %edx
- pushw _IF1632_Saved16_ss
- pushw _IF1632_Saved16_esp
+ pushw A(IF1632_Saved16_ss)
+ pushw A(IF1632_Saved16_esp)
pushl %eax
- call _DLLRelay
+ call A(DLLRelay)
popl %edx
popl %edx
@@ -298,13 +303,13 @@
/*
* Restore registers, but do not destroy return value.
*/
- movw _IF1632_Saved16_ss,%ss
- movl _IF1632_Saved16_esp,%esp
- movl _IF1632_Saved16_ebp,%ebp
+ movw A(IF1632_Saved16_ss),%ss
+ movl A(IF1632_Saved16_esp),%esp
+ movl A(IF1632_Saved16_ebp),%ebp
- popw _IF1632_Saved16_ss
- popl _IF1632_Saved16_ebp
- popl _IF1632_Saved16_esp
+ popw A(IF1632_Saved16_ss)
+ popl A(IF1632_Saved16_ebp)
+ popl A(IF1632_Saved16_esp)
popw %es
popw %ds
@@ -348,8 +353,8 @@
* word of EAX won't be moved to DX.
*/
.align 4
- .globl _CallTo32_16
-_CallTo32_16:
+ .globl A(CallTo32_16)
+A(CallTo32_16):
pushl %ebp
movl %esp,%ebp
@@ -372,26 +377,26 @@
* Save old stack save variables, save stack registers, reload
* stack registers.
*/
- pushl _IF1632_Saved16_esp
- pushl _IF1632_Saved16_ebp
- pushw _IF1632_Saved16_ss
+ pushl A(IF1632_Saved16_esp)
+ pushl A(IF1632_Saved16_ebp)
+ pushw A(IF1632_Saved16_ss)
- movw %ss,_IF1632_Saved16_ss
- movl %esp,_IF1632_Saved16_esp
- movl %ebp,_IF1632_Saved16_ebp
+ movw %ss,A(IF1632_Saved16_ss)
+ movl %esp,A(IF1632_Saved16_esp)
+ movl %ebp,A(IF1632_Saved16_ebp)
- movw _IF1632_Saved32_ss,%ss
- movl _IF1632_Saved32_esp,%esp
- movl _IF1632_Saved32_ebp,%ebp
+ movw A(IF1632_Saved32_ss),%ss
+ movl A(IF1632_Saved32_esp),%esp
+ movl A(IF1632_Saved32_ebp),%ebp
/*
* Call entry point
*/
pushl %edx
- pushw _IF1632_Saved16_ss
- pushw _IF1632_Saved16_esp
+ pushw A(IF1632_Saved16_ss)
+ pushw A(IF1632_Saved16_esp)
pushl %eax
- call _DLLRelay
+ call A(DLLRelay)
popl %edx
popl %edx
@@ -400,13 +405,13 @@
/*
* Restore registers, but do not destroy return value.
*/
- movw _IF1632_Saved16_ss,%ss
- movl _IF1632_Saved16_esp,%esp
- movl _IF1632_Saved16_ebp,%ebp
+ movw A(IF1632_Saved16_ss),%ss
+ movl A(IF1632_Saved16_esp),%esp
+ movl A(IF1632_Saved16_ebp),%ebp
- popw _IF1632_Saved16_ss
- popl _IF1632_Saved16_ebp
- popl _IF1632_Saved16_esp
+ popw A(IF1632_Saved16_ss)
+ popl A(IF1632_Saved16_ebp)
+ popl A(IF1632_Saved16_esp)
popw %es
popw %ds
@@ -437,18 +442,18 @@
/**********************************************************************
* ReturnFromRegisterFunc()
*/
- .globl _ReturnFromRegisterFunc
-_ReturnFromRegisterFunc:
+ .globl A(ReturnFromRegisterFunc)
+A(ReturnFromRegisterFunc):
/*
* Restore 16-bit stack
*/
- movw _IF1632_Saved16_ss,%ss
- movl _IF1632_Saved16_esp,%esp
- movl _IF1632_Saved16_ebp,%ebp
+ movw A(IF1632_Saved16_ss),%ss
+ movl A(IF1632_Saved16_esp),%esp
+ movl A(IF1632_Saved16_ebp),%ebp
- popw _IF1632_Saved16_ss
- popl _IF1632_Saved16_ebp
- popl _IF1632_Saved16_esp
+ popw A(IF1632_Saved16_ss)
+ popl A(IF1632_Saved16_ebp)
+ popl A(IF1632_Saved16_esp)
popw %es
popw %ds
diff --git a/if1632/callback.c b/if1632/callback.c
index 3d69c34..6f27756 100644
--- a/if1632/callback.c
+++ b/if1632/callback.c
@@ -10,6 +10,12 @@
#include "segmem.h"
#include <setjmp.h>
#include "dlls.h"
+#include "stddebug.h"
+/* #define DEBUG_CALLBACK */
+/* #undef DEBUG_CALLBACK */
+#include "debug.h"
+
+
extern SEGDESC Segments[];
extern unsigned short IF1632_Saved16_ss;
extern unsigned long IF1632_Saved16_ebp;
@@ -99,8 +105,6 @@
void *
CALLBACK_MakeProcInstance(void *func, int instance)
{
- int handle;
- void *new_func;
struct thunk_s *tp;
int i;
@@ -129,8 +133,6 @@
*/
void FreeProcInstance(FARPROC func)
{
- int handle;
- void *new_func;
struct thunk_s *tp;
int i;
@@ -155,7 +157,7 @@
/* Return the code segment containing 'proc'. */
/* Not sure if this is really correct (shouldn't matter that much). */
printf( "STUB: GetCodeHandle(%p) returning %x\n",
- tp->thunk[8] + (tp->thunk[9] << 8) );
+ proc, tp->thunk[8] + (tp->thunk[9] << 8) );
return tp->thunk[8] + (tp->thunk[9] << 8);
}
@@ -197,9 +199,7 @@
}
else if (Is16bitAddress(func))
{
-#ifdef DEBUG_CALLBACK
- printf("CallWindowProc // 16bit func=%08X !\n", func);
-#endif
+ dprintf_callback(stddeb, "CallWindowProc // 16bit func=%p !\n", func);
PushOn16( CALLBACK_SIZE_WORD, hwnd );
PushOn16( CALLBACK_SIZE_WORD, message );
PushOn16( CALLBACK_SIZE_WORD, wParam );
@@ -209,9 +209,7 @@
}
else
{
-#ifdef DEBUG_CALLBACK
- printf("CallWindowProc // 32bit func=%08X !\n", func);
-#endif
+ dprintf_callback(stddeb, "CallWindowProc // 32bit func=%08X !\n", func);
return (*func)(hwnd, message, wParam, lParam);
}
}
@@ -325,15 +323,12 @@
(IF1632_Saved16_esp & 0xffff));
memcpy (stack16, sb -> stack_part, STACK_DEPTH_16);
-#ifdef DEBUG_CATCH
- printf ("Been thrown here: %d, retval = %d\n", sb, retval);
-#endif
+ dprintf_catch (stddeb, "Been thrown here: %d, retval = %d\n",
+ sb, retval);
free ((void *) sb);
return (retval);
} else {
-#ifdef DEBUG_CATCH
- printf ("Will somtime get thrown here: %d\n", sb);
-#endif
+ dprintf_catch (stddeb, "Will somtime get thrown here: %d\n", sb);
return (retval);
}
}
@@ -341,9 +336,7 @@
void Throw (LPCATCHBUF cbuf, int val)
{
sb = *((struct special_buffer **)cbuf);
-#ifdef DEBUG_CATCH
- printf ("Throwing to: %d\n", sb);
-#endif
+ dprintf_catch (stddeb, "Throwing to: %d\n", sb);
longjmp (sb -> buffer, val);
}
#endif /* !WINELIB */
diff --git a/if1632/commdlg.spec b/if1632/commdlg.spec
new file mode 100644
index 0000000..c52227b
--- /dev/null
+++ b/if1632/commdlg.spec
@@ -0,0 +1,32 @@
+# $Id: commdlg.spec,v 1.3 1994/20/08 04:04:21 root Exp root $
+#
+name commdlg
+id 15
+length 31
+
+ 1 pascal GETOPENFILENAME(ptr) GetOpenFileName(1)
+ 2 pascal GETSAVEFILENAME(ptr) GetSaveFileName(1)
+ 5 pascal CHOOSECOLOR(ptr) ChooseColor(1)
+ 6 pascal FILEOPENDLGPROC(word word word long) FileOpenDlgProc(1 2 3 4)
+ 7 pascal FILESAVEDLGPROC(word word word long) FileSaveDlgProc(1 2 3 4)
+ 8 pascal COLORDLGPROC(word word word long) ColorDlgProc(1 2 3 4)
+# 9 pascal LOADALTERBITMAP exported, shared data
+ 11 pascal FINDTEXT(ptr) FindText(1)
+ 12 pascal REPLACETEXT(ptr) ReplaceText(1)
+ 13 pascal FINDTEXTDLGPROC(word word word long) FindTextDlgProc(1 2 3 4)
+ 14 pascal REPLACETEXTDLGPROC(word word word long) ReplaceTextDlgProc(1 2 3 4)
+# 15 pascal CHOOSEFONT exported, shared data
+# 16 pascal FORMATCHARDLGPROC exported, shared data
+# 18 pascal FONTSTYLEENUMPROC exported, shared data
+# 19 pascal FONTFAMILYENUMPROC exported, shared data
+ 20 pascal PRINTDLG(ptr) PrintDlg(1)
+ 21 pascal PRINTDLGPROC(word word word long) PrintDlgProc(1 2 3 4)
+ 22 pascal PRINTSETUPDLGPROC(word word word long) PrintSetupDlgProc(1 2 3 4)
+# 23 pascal EDITINTEGERONLY exported, shared data
+# 25 pascal WANTARROWS exported, shared data
+ 26 pascal COMMDLGEXTENDEDERROR() CommDlgExtendError()
+ 27 pascal GETFILETITLE(ptr ptr word) GetFileTitle(1 2 3)
+# 28 pascal WEP exported, shared data
+# 29 pascal DWLBSUBCLASS exported, shared data
+# 30 pascal DWUPARROWHACK exported, shared data
+# 31 pascal DWOKSUBCLASS exported, shared data
diff --git a/if1632/kernel.spec b/if1632/kernel.spec
index f3930a5..e265567 100644
--- a/if1632/kernel.spec
+++ b/if1632/kernel.spec
@@ -221,10 +221,10 @@
#328 _DEBUGOUTPUT
#329 K329
#332 THHOOK
-#334 ISBADREADPTR
-#335 ISBADWRITEPTR
-#336 ISBADCODEPTR
-#337 ISBADSTRINGPTR
+334 pascal IsBadReadPtr(ptr long) IsBadReadPtr(1 2)
+335 pascal IsBadWritePtr(ptr long) IsBadWritePtr(1 2)
+336 pascal IsBadCodePtr(ptr) IsBadCodePtr(1)
+337 pascal IsBadStringPtr(ptr word) IsBadStringPtr(1 2)
#338 HASGPHANDLER
#339 DIAGQUERY
#340 DIAGOUTPUT
@@ -233,8 +233,8 @@
#343 REGISTERWINOLDAPHOOK
#344 GETWINOLDAPHOOKS
#345 ISSHAREDSELECTOR
-#346 ISBADHUGEREADPTR
-#347 ISBADHUGEWRITEPTR
+346 pascal IsBadHugeReadPtr(ptr long) IsBadHugeReadPtr(1 2)
+347 pascal IsBadHugeWritePtr(ptr long) IsBadHugeWritePtr(1 2)
348 pascal hmemcpy(ptr ptr long) hmemcpy(1 2 3)
349 pascal16 _hread(word ptr long) _hread(1 2 3)
350 pascal16 _hwrite(word ptr long) _hwrite(1 2 3)
diff --git a/if1632/mmsystem.spec b/if1632/mmsystem.spec
index d599d19..d074cae 100644
--- a/if1632/mmsystem.spec
+++ b/if1632/mmsystem.spec
@@ -34,6 +34,7 @@
211 pascal MIDIOUTGETVOLUME(word ptr) midiOutGetVolume(1 2)
212 pascal MIDIOUTSETVOLUME(word long) midiOutSetVolume(1 2)
215 pascal MIDIOUTGETID(word ptr) midiOutGetID(1 2)
+216 pascal MIDIOUTMESSAGE(word word long long) midiOutMessage(1 2 3 4)
301 pascal MIDIINGETNUMDEVS() midiInGetNumDevs()
302 pascal MIDIINGETDEVCAPS(word ptr word) midiInGetDevCaps(1 2 3)
303 pascal MIDIINGETERRORTEXT(word ptr word) midiInGetErrorText(1 2 3)
@@ -45,10 +46,12 @@
310 pascal MIDIINSTOP(word) midiInStop(1)
311 pascal MIDIINRESET(word) midiInReset(1)
312 pascal MIDIINGETID(word ptr) midiInGetID(1 2)
+313 pascal MIDIINMESSAGE(word word long long) midiInMessage(1 2 3 4)
350 pascal AUXGETNUMDEVS() auxGetNumDevs()
351 pascal AUXGETDEVCAPS(word ptr word) auxGetDevCaps(1 2 3)
352 pascal AUXGETVOLUME(word ptr) auxGetVolume(1 2)
353 pascal AUXSETVOLUME(word long) auxSetVolume(1 2)
+354 pascal AUXOUTMESSAGE(word word long long) auxOutMessage(1 2 3 4)
401 pascal WAVEOUTGETNUMDEVS() waveOutGetNumDevs()
402 pascal WAVEOUTGETDEVCAPS(word ptr word) waveOutGetDevCaps(1 2 3)
403 pascal WAVEOUTGETERRORTEXT(word ptr word) waveOutGetErrorText(1 2 3)
@@ -69,6 +72,7 @@
418 pascal WAVEOUTSETPLAYBACKRATE(word long) waveOutSetPlaybackRate(1 2)
419 pascal WAVEOUTBREAKLOOP(word) waveOutBreakLoop(1)
420 pascal WAVEOUTGETID(word ptr) waveOutGetID(1 2)
+421 pascal WAVEOUTMESSAGE(word word long long) waveOutMessage(1 2 3 4)
501 pascal WAVEINGETNUMDEVS() waveInGetNumDevs()
502 pascal WAVEINGETDEVCAPS(word ptr word) waveInGetDevCaps(1 2 3)
503 pascal WAVEINGETERRORTEXT(word ptr word) waveInGetErrorText(1 2 3)
@@ -82,6 +86,7 @@
511 pascal WAVEINRESET(word) waveInReset(1)
512 pascal WAVEINGETPOSITION(word ptr word) waveInGetPosition(1 2 3)
513 pascal WAVEINGETID(word ptr) waveInGetID(1 2)
+514 pascal WAVEINMESSAGE(word word long long) waveInMessage(1 2 3 4)
601 pascal timeGetSystemTime(ptr word) timeGetSystemTime(1 2)
602 pascal timeSetEvent(word word ptr long word) timeSetEvent(1 2 3 4 5)
603 pascal timeKillEvent(word) timeKillEvent(1)
diff --git a/if1632/relay.c b/if1632/relay.c
index 9bf9682..d9d9994 100644
--- a/if1632/relay.c
+++ b/if1632/relay.c
@@ -46,6 +46,7 @@
{ "SYSTEM", WineLibSkip(SYSTEM_table), 20 ,12},
{ "TOOLHELP",WineLibSkip(TOOLHELP_table), 83, 13},
{ "MOUSE", WineLibSkip(MOUSE_table), 8, 14},
+ { "EMUCOMMDLG", WineLibSkip(COMMDLG_table), 31, 15},
};
/* don't forget to increase N_BUILTINS in dll.h if you add a dll */
diff --git a/if1632/user.spec b/if1632/user.spec
index 673bbc3..3e7af17 100644
--- a/if1632/user.spec
+++ b/if1632/user.spec
@@ -172,7 +172,7 @@
167 pascal ShowCaret(word) ShowCaret(1)
168 pascal SetCaretBlinkTime(word) SetCaretBlinkTime(1)
169 pascal GetCaretBlinkTime() GetCaretBlinkTime()
-#170 ARRANGEICONICWINDOWS
+170 pascal ArrangeIconicWindows(word) ArrangeIconicWindows(1)
171 pascal WinHelp(word ptr word long) WinHelp(1 2 3 4)
#172 SWITCHTOTHISWINDOW
173 pascal LoadCursor(word ptr) LoadCursor(1 2)
@@ -203,8 +203,8 @@
TabbedTextOut(1 2 3 4 5 6 7 8)
197 pascal GETTABBEDTEXTEXTENT(word ptr word word ptr)
GetTabbedTextExtent(1 2 3 4 5)
-#198 CASCADECHILDWINDOWS
-#199 TILECHILDWINDOWS
+198 pascal CascadeChildWindows(word word) CascadeChildWindows(1 2)
+199 pascal TileChildWindows(word word) TileChildWindows(1 2)
200 pascal OpenComm(ptr word word) OpenComm(1 2 3)
201 pascal SetCommState(ptr) SetCommState(1)
202 pascal GetCommState(word ptr) GetCommState(1 2)
@@ -299,7 +299,7 @@
284 pascal16 GetFreeSystemResources(word) GetFreeSystemResources(1)
#285 BEAR285
286 pascal GetDesktopWindow() GetDesktopWindow()
-#287 GETLASTACTIVEPOPUP
+287 pascal GetLastActivePopup(word) GetLastActivePopup(1)
288 pascal GetMessageExtraInfo() GetMessageExtraInfo()
#289 KEYB_EVENT
290 pascal RedrawWindow(word ptr word word) RedrawWindow(1 2 3 4)
diff --git a/include/combo.h b/include/combo.h
index 0162664..4b0d444 100644
--- a/include/combo.h
+++ b/include/combo.h
@@ -8,6 +8,9 @@
DWORD dwState;
HWND hWndEdit;
HWND hWndLBox;
+ short LastSel;
+ RECT RectEdit;
+ BOOL bRedrawFlag;
} HEADCOMBO;
typedef HEADCOMBO FAR* LPHEADCOMBO;
diff --git a/include/comm.h b/include/comm.h
index 7f74685..785a7b7 100644
--- a/include/comm.h
+++ b/include/comm.h
@@ -16,6 +16,7 @@
int suspended;
int unget;
int unget_byte;
+ int baudrate;
};
#endif /* COMM_H */
diff --git a/include/commdlg.h b/include/commdlg.h
new file mode 100644
index 0000000..737e6e0
--- /dev/null
+++ b/include/commdlg.h
@@ -0,0 +1,298 @@
+/*
+ * COMMDLG - Common Wine Dialog ... :-)
+ */
+
+#ifndef COMMDLG_H
+#define COMMDLG_H
+
+#define RT_CURSOR MAKEINTRESOURCE(1)
+#define RT_BITMAP MAKEINTRESOURCE(2)
+#define RT_ICON MAKEINTRESOURCE(3)
+#define RT_MENU MAKEINTRESOURCE(4)
+#define RT_DIALOG MAKEINTRESOURCE(5)
+#define RT_STRING MAKEINTRESOURCE(6)
+#define RT_FONTDIR MAKEINTRESOURCE(7)
+#define RT_FONT MAKEINTRESOURCE(8)
+#define RT_ACCELERATOR MAKEINTRESOURCE(9)
+#define RT_RCDATA MAKEINTRESOURCE(10)
+
+#define RT_GROUP_CURSOR MAKEINTRESOURCE(12)
+#define RT_GROUP_ICON MAKEINTRESOURCE(14)
+
+#ifndef HGLOBAL
+#define HGLOBAL HANDLE
+#endif
+
+#define OFN_READONLY 0x00000001
+#define OFN_OVERWRITEPROMPT 0x00000002
+#define OFN_HIDEREADONLY 0x00000004
+#define OFN_NOCHANGEDIR 0x00000008
+#define OFN_SHOWHELP 0x00000010
+#define OFN_ENABLEHOOK 0x00000020
+#define OFN_ENABLETEMPLATE 0x00000040
+#define OFN_ENABLETEMPLATEHANDLE 0x00000080
+#define OFN_NOVALIDATE 0x00000100
+#define OFN_ALLOWMULTISELECT 0x00000200
+#define OFN_EXTENSIONDIFFERENT 0x00000400
+#define OFN_PATHMUSTEXIST 0x00000800
+#define OFN_FILEMUSTEXIST 0x00001000
+#define OFN_CREATEPROMPT 0x00002000
+#define OFN_SHAREAWARE 0x00004000
+#define OFN_NOREADONLYRETURN 0x00008000
+#define OFN_NOTESTFILECREATE 0x00010000
+
+#define OFN_SHAREFALLTHROUGH 2
+#define OFN_SHARENOWARN 1
+#define OFN_SHAREWARN 0
+
+
+typedef struct {
+ DWORD lStructSize;
+ HWND hwndOwner;
+ HINSTANCE hInstance;
+ LPCSTR lpstrFilter;
+ LPSTR lpstrCustomFilter;
+ DWORD nMaxCustFilter;
+ DWORD nFilterIndex;
+ LPSTR lpstrFile;
+ DWORD nMaxFile;
+ LPSTR lpstrFileTitle;
+ DWORD nMaxFileTitle;
+ LPCSTR lpstrInitialDir;
+ LPCSTR lpstrTitle;
+ DWORD Flags;
+ UINT nFileOffset;
+ UINT nFileExtension;
+ LPCSTR lpstrDefExt;
+ LPARAM lCustData;
+ UINT (CALLBACK *lpfnHook)(HWND, UINT, WPARAM, LPARAM);
+ LPCSTR lpTemplateName;
+ } OPENFILENAME;
+typedef OPENFILENAME * LPOPENFILENAME;
+
+
+typedef struct {
+ DWORD lStructSize;
+ HWND hwndOwner;
+ HWND hInstance;
+ COLORREF rgbResult;
+ COLORREF FAR* lpCustColors;
+ DWORD Flags;
+ LPARAM lCustData;
+ UINT (CALLBACK* lpfnHook)(HWND, UINT, WPARAM, LPARAM);
+ LPCSTR lpTemplateName;
+ } CHOOSECOLOR;
+typedef CHOOSECOLOR *LPCHOOSECOLOR;
+
+#define CC_RGBINIT 0x00000001
+#define CC_FULLOPEN 0x00000002
+#define CC_PREVENTFULLOPEN 0x00000004
+#define CC_SHOWHELP 0x00000008
+#define CC_ENABLEHOOK 0x00000010
+#define CC_ENABLETEMPLATE 0x00000020
+#define CC_ENABLETEMPLATEHANDLE 0x00000040
+
+typedef struct {
+ DWORD lStructSize; /* size of this struct 0x20 */
+ HWND hwndOwner; /* handle to owner's window */
+ HINSTANCE hInstance; /* instance handle of.EXE that */
+ /* contains cust. dlg. template */
+ DWORD Flags; /* one or more of the FR_?? */
+ LPSTR lpstrFindWhat; /* ptr. to search string */
+ LPSTR lpstrReplaceWith; /* ptr. to replace string */
+ UINT wFindWhatLen; /* size of find buffer */
+ UINT wReplaceWithLen; /* size of replace buffer */
+ LPARAM lCustData; /* data passed to hook fn. */
+ UINT (CALLBACK* lpfnHook)(HWND, UINT, WPARAM, LPARAM);
+ LPCSTR lpTemplateName; /* custom template name */
+ } FINDREPLACE;
+typedef FINDREPLACE *LPFINDREPLACE;
+
+#define FR_DOWN 0x00000001
+#define FR_WHOLEWORD 0x00000002
+#define FR_MATCHCASE 0x00000004
+#define FR_FINDNEXT 0x00000008
+#define FR_REPLACE 0x00000010
+#define FR_REPLACEALL 0x00000020
+#define FR_DIALOGTERM 0x00000040
+#define FR_SHOWHELP 0x00000080
+#define FR_ENABLEHOOK 0x00000100
+#define FR_ENABLETEMPLATE 0x00000200
+#define FR_NOUPDOWN 0x00000400
+#define FR_NOMATCHCASE 0x00000800
+#define FR_NOWHOLEWORD 0x00001000
+#define FR_ENABLETEMPLATEHANDLE 0x00002000
+#define FR_HIDEUPDOWN 0x00004000
+#define FR_HIDEMATCHCASE 0x00008000
+#define FR_HIDEWHOLEWORD 0x00010000
+
+
+typedef struct {
+ DWORD lStructSize;
+ HWND hwndOwner; /* caller's window handle */
+ HDC hDC; /* printer DC/IC or NULL */
+ LOGFONT FAR* lpLogFont; /* ptr. to a LOGFONT struct */
+ short iPointSize; /* 10 * size in points of selected font */
+ DWORD Flags; /* enum. type flags */
+ COLORREF rgbColors; /* returned text color */
+ LPARAM lCustData; /* data passed to hook fn. */
+ UINT (CALLBACK* lpfnHook)(HWND, UINT, WPARAM, LPARAM);
+ LPCSTR lpTemplateName; /* custom template name */
+ HINSTANCE hInstance; /* instance handle of.EXE that */
+ /* contains cust. dlg. template */
+ LPSTR lpszStyle; /* return the style field here */
+ /* must be LF_FACESIZE or bigger */
+ UINT nFontType; /* same value reported to the */
+ /* EnumFonts callback with the */
+ /* extra FONTTYPE_ bits added */
+ short nSizeMin; /* minimum pt size allowed & */
+ short nSizeMax; /* max pt size allowed if */
+ /* CF_LIMITSIZE is used */
+ } CHOOSEFONT;
+typedef CHOOSEFONT *LPCHOOSEFONT;
+
+
+#define CF_SCREENFONTS 0x00000001
+#define CF_PRINTERFONTS 0x00000002
+#define CF_BOTH (CF_SCREENFONTS | CF_PRINTERFONTS)
+#define CF_SHOWHELP 0x00000004L
+#define CF_ENABLEHOOK 0x00000008L
+#define CF_ENABLETEMPLATE 0x00000010L
+#define CF_ENABLETEMPLATEHANDLE 0x00000020L
+#define CF_INITTOLOGFONTSTRUCT 0x00000040L
+#define CF_USESTYLE 0x00000080L
+#define CF_EFFECTS 0x00000100L
+#define CF_APPLY 0x00000200L
+#define CF_ANSIONLY 0x00000400L
+#define CF_NOVECTORFONTS 0x00000800L
+#define CF_NOOEMFONTS CF_NOVECTORFONTS
+#define CF_NOSIMULATIONS 0x00001000L
+#define CF_LIMITSIZE 0x00002000L
+#define CF_FIXEDPITCHONLY 0x00004000L
+#define CF_WYSIWYG 0x00008000L /* use with CF_SCREENFONTS & CF_PRINTERFONTS */
+#define CF_FORCEFONTEXIST 0x00010000L
+#define CF_SCALABLEONLY 0x00020000L
+#define CF_TTONLY 0x00040000L
+#define CF_NOFACESEL 0x00080000L
+#define CF_NOSTYLESEL 0x00100000L
+#define CF_NOSIZESEL 0x00200000L
+
+#define SIMULATED_FONTTYPE 0x8000
+#define PRINTER_FONTTYPE 0x4000
+#define SCREEN_FONTTYPE 0x2000
+#define BOLD_FONTTYPE 0x0100
+#define ITALIC_FONTTYPE 0x0200
+#define REGULAR_FONTTYPE 0x0400
+
+#define WM_CHOOSEFONT_GETLOGFONT (WM_USER + 1)
+
+#define LBSELCHSTRING "commdlg_LBSelChangedNotify"
+#define SHAREVISTRING "commdlg_ShareViolation"
+#define FILEOKSTRING "commdlg_FileNameOK"
+#define COLOROKSTRING "commdlg_ColorOK"
+#define SETRGBSTRING "commdlg_SetRGBColor"
+#define FINDMSGSTRING "commdlg_FindReplace"
+#define HELPMSGSTRING "commdlg_help"
+
+#define CD_LBSELNOITEMS -1
+#define CD_LBSELCHANGE 0
+#define CD_LBSELSUB 1
+#define CD_LBSELADD 2
+
+typedef struct {
+ DWORD lStructSize;
+ HWND hwndOwner;
+ HGLOBAL hDevMode;
+ HGLOBAL hDevNames;
+ HDC hDC;
+ DWORD Flags;
+ UINT nFromPage;
+ UINT nToPage;
+ UINT nMinPage;
+ UINT nMaxPage;
+ UINT nCopies;
+ HINSTANCE hInstance;
+ LPARAM lCustData;
+ UINT (CALLBACK* lpfnPrintHook)(HWND, UINT, WPARAM, LPARAM);
+ UINT (CALLBACK* lpfnSetupHook)(HWND, UINT, WPARAM, LPARAM);
+ LPCSTR lpPrintTemplateName;
+ LPCSTR lpSetupTemplateName;
+ HGLOBAL hPrintTemplate;
+ HGLOBAL hSetupTemplate;
+ } PRINTDLG;
+typedef PRINTDLG * LPPRINTDLG;
+
+
+#define PD_ALLPAGES 0x00000000
+#define PD_SELECTION 0x00000001
+#define PD_PAGENUMS 0x00000002
+#define PD_NOSELECTION 0x00000004
+#define PD_NOPAGENUMS 0x00000008
+#define PD_COLLATE 0x00000010
+#define PD_PRINTTOFILE 0x00000020
+#define PD_PRINTSETUP 0x00000040
+#define PD_NOWARNING 0x00000080
+#define PD_RETURNDC 0x00000100
+#define PD_RETURNIC 0x00000200
+#define PD_RETURNDEFAULT 0x00000400
+#define PD_SHOWHELP 0x00000800
+#define PD_ENABLEPRINTHOOK 0x00001000
+#define PD_ENABLESETUPHOOK 0x00002000
+#define PD_ENABLEPRINTTEMPLATE 0x00004000
+#define PD_ENABLESETUPTEMPLATE 0x00008000
+#define PD_ENABLEPRINTTEMPLATEHANDLE 0x00010000
+#define PD_ENABLESETUPTEMPLATEHANDLE 0x00020000
+#define PD_USEDEVMODECOPIES 0x00040000
+#define PD_DISABLEPRINTTOFILE 0x00080000
+#define PD_HIDEPRINTTOFILE 0x00100000
+
+typedef struct {
+ UINT wDriverOffset;
+ UINT wDeviceOffset;
+ UINT wOutputOffset;
+ UINT wDefault;
+ } DEVNAMES;
+typedef DEVNAMES * LPDEVNAMES;
+
+#define DN_DEFAULTPRN 0x0001
+
+
+#define CDERR_DIALOGFAILURE 0xFFFF
+#define CDERR_GENERALCODES 0x0000
+#define CDERR_STRUCTSIZE 0x0001
+#define CDERR_INITIALIZATION 0x0002
+#define CDERR_NOTEMPLATE 0x0003
+#define CDERR_NOHINSTANCE 0x0004
+#define CDERR_LOADSTRFAILURE 0x0005
+#define CDERR_FINDRESFAILURE 0x0006
+#define CDERR_LOADRESFAILURE 0x0007
+#define CDERR_LOCKRESFAILURE 0x0008
+#define CDERR_MEMALLOCFAILURE 0x0009
+#define CDERR_MEMLOCKFAILURE 0x000A
+#define CDERR_NOHOOK 0x000B
+#define CDERR_REGISTERMSGFAIL 0x000C
+
+/************************************************************************
+* COMMDLG Resources placed in Wine SYSRES.DLL *
+************************************************************************/
+
+#define OBM_FOLDER 32520
+#define OBM_FOLDER2 32521
+#define OBM_FLOPPY 32522
+#define OBM_HDISK 32523
+#define OBM_CDROM 32524
+
+#define OPENFILEDLG 3
+#define SAVEFILEDLG 4
+#define PRINTDLG 5
+#define PRINTSETUPDLG 6
+#define FONTDLG 7
+#define COLORDLG 8
+#define FINDDLG 9
+#define REPLACEDLG 10
+
+
+
+#endif /* #ifdef COMMDLG_H */
+
+
diff --git a/include/debug.h b/include/debug.h
index ab06923..eb60565 100644
--- a/include/debug.h
+++ b/include/debug.h
@@ -9,7 +9,9 @@
#ifdef DEBUG_NONE_EXT
#undef DEBUG_ACCEL
#undef DEBUG_BITMAP
+#undef DEBUG_CALLBACK
#undef DEBUG_CARET
+#undef DEBUG_CATCH
#undef DEBUG_CDAUDIO
#undef DEBUG_CLASS
#undef DEBUG_CLIPBOARD
@@ -33,36 +35,51 @@
#undef DEBUG_GRAPHICS
#undef DEBUG_HEAP
#undef DEBUG_ICON
+#undef DEBUG_IF
#undef DEBUG_INT
#undef DEBUG_KEY
#undef DEBUG_KEYBOARD
#undef DEBUG_LDT
#undef DEBUG_LISTBOX
+#undef DEBUG_MCI
+#undef DEBUG_MCIANIM
#undef DEBUG_MCIWAVE
#undef DEBUG_MDI
#undef DEBUG_MENU
#undef DEBUG_MENUCALC
#undef DEBUG_MESSAGE
#undef DEBUG_METAFILE
+#undef DEBUG_MMIO
+#undef DEBUG_MMTIME
#undef DEBUG_MODULE
#undef DEBUG_MSG
+#undef DEBUG_MSGBOX
#undef DEBUG_NONCLIENT
#undef DEBUG_PALETTE
+#undef DEBUG_PROFILE
+#undef DEBUG_PROP
+#undef DEBUG_REG
#undef DEBUG_REGION
#undef DEBUG_RESOURCE
#undef DEBUG_SCROLL
+#undef DEBUG_SELECTORS
+#undef DEBUG_STRESS
#undef DEBUG_SYSCOLOR
+#undef DEBUG_TASK
#undef DEBUG_TEXT
#undef DEBUG_TIMER
#undef DEBUG_UTILITY
#undef DEBUG_WIN
+#undef DEBUG_WINSOCK
#endif
#ifdef DEBUG_ALL_EXT
#define DEBUG_ACCEL
#define DEBUG_BITMAP
+#define DEBUG_CALLBACK
#define DEBUG_CARET
+#define DEBUG_CATCH
#define DEBUG_CDAUDIO
#define DEBUG_CLASS
#define DEBUG_CLIPBOARD
@@ -86,29 +103,42 @@
#define DEBUG_GRAPHICS
#define DEBUG_HEAP
#define DEBUG_ICON
+#define DEBUG_IF
#define DEBUG_INT
#define DEBUG_KEY
#define DEBUG_KEYBOARD
#define DEBUG_LDT
#define DEBUG_LISTBOX
+#define DEBUG_MCI
+#define DEBUG_MCIANIM
#define DEBUG_MCIWAVE
#define DEBUG_MDI
#define DEBUG_MENU
#define DEBUG_MENUCALC
#define DEBUG_MESSAGE
#define DEBUG_METAFILE
+#define DEBUG_MMIO
+#define DEBUG_MMTIME
#define DEBUG_MODULE
#define DEBUG_MSG
+#define DEBUG_MSGBOX
#define DEBUG_NONCLIENT
#define DEBUG_PALETTE
+#define DEBUG_PROFILE
+#define DEBUG_PROP
+#define DEBUG_REG
#define DEBUG_REGION
#define DEBUG_RESOURCE
#define DEBUG_SCROLL
+#define DEBUG_SELECTORS
+#define DEBUG_STRESS
#define DEBUG_SYSCOLOR
+#define DEBUG_TASK
#define DEBUG_TEXT
#define DEBUG_TIMER
#define DEBUG_UTILITY
#define DEBUG_WIN
+#define DEBUG_WINSOCK
#endif
@@ -125,11 +155,21 @@
#else
0,
#endif
+#ifdef DEBUG_CALLBACK
+1,
+#else
+0,
+#endif
#ifdef DEBUG_CARET
1,
#else
0,
#endif
+#ifdef DEBUG_CATCH
+1,
+#else
+0,
+#endif
#ifdef DEBUG_CDAUDIO
1,
#else
@@ -245,6 +285,11 @@
#else
0,
#endif
+#ifdef DEBUG_IF
+1,
+#else
+0,
+#endif
#ifdef DEBUG_INT
1,
#else
@@ -270,6 +315,16 @@
#else
0,
#endif
+#ifdef DEBUG_MCI
+1,
+#else
+0,
+#endif
+#ifdef DEBUG_MCIANIM
+1,
+#else
+0,
+#endif
#ifdef DEBUG_MCIWAVE
1,
#else
@@ -300,6 +355,16 @@
#else
0,
#endif
+#ifdef DEBUG_MMIO
+1,
+#else
+0,
+#endif
+#ifdef DEBUG_MMTIME
+1,
+#else
+0,
+#endif
#ifdef DEBUG_MODULE
1,
#else
@@ -310,6 +375,11 @@
#else
0,
#endif
+#ifdef DEBUG_MSGBOX
+1,
+#else
+0,
+#endif
#ifdef DEBUG_NONCLIENT
1,
#else
@@ -320,6 +390,21 @@
#else
0,
#endif
+#ifdef DEBUG_PROFILE
+1,
+#else
+0,
+#endif
+#ifdef DEBUG_PROP
+1,
+#else
+0,
+#endif
+#ifdef DEBUG_REG
+1,
+#else
+0,
+#endif
#ifdef DEBUG_REGION
1,
#else
@@ -335,11 +420,26 @@
#else
0,
#endif
+#ifdef DEBUG_SELECTORS
+1,
+#else
+0,
+#endif
+#ifdef DEBUG_STRESS
+1,
+#else
+0,
+#endif
#ifdef DEBUG_SYSCOLOR
1,
#else
0,
#endif
+#ifdef DEBUG_TASK
+1,
+#else
+0,
+#endif
#ifdef DEBUG_TEXT
1,
#else
@@ -360,6 +460,11 @@
#else
0,
#endif
+#ifdef DEBUG_WINSOCK
+1,
+#else
+0,
+#endif
0};
#else
extern short debug_msg_enabled[];
@@ -388,7 +493,17 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_caret if(debug_msg_enabled[2]) fprintf
+#define dprintf_callback if(debug_msg_enabled[2]) fprintf
+#else
+#ifdef DEBUG_CALLBACK
+#define dprintf_callback fprintf
+#else
+#define dprintf_callback
+#endif
+#endif
+
+#ifdef DEBUG_RUNTIME
+#define dprintf_caret if(debug_msg_enabled[3]) fprintf
#else
#ifdef DEBUG_CARET
#define dprintf_caret fprintf
@@ -398,7 +513,17 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_cdaudio if(debug_msg_enabled[3]) fprintf
+#define dprintf_catch if(debug_msg_enabled[4]) fprintf
+#else
+#ifdef DEBUG_CATCH
+#define dprintf_catch fprintf
+#else
+#define dprintf_catch
+#endif
+#endif
+
+#ifdef DEBUG_RUNTIME
+#define dprintf_cdaudio if(debug_msg_enabled[5]) fprintf
#else
#ifdef DEBUG_CDAUDIO
#define dprintf_cdaudio fprintf
@@ -408,7 +533,7 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_class if(debug_msg_enabled[4]) fprintf
+#define dprintf_class if(debug_msg_enabled[6]) fprintf
#else
#ifdef DEBUG_CLASS
#define dprintf_class fprintf
@@ -418,7 +543,7 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_clipboard if(debug_msg_enabled[5]) fprintf
+#define dprintf_clipboard if(debug_msg_enabled[7]) fprintf
#else
#ifdef DEBUG_CLIPBOARD
#define dprintf_clipboard fprintf
@@ -428,7 +553,7 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_clipping if(debug_msg_enabled[6]) fprintf
+#define dprintf_clipping if(debug_msg_enabled[8]) fprintf
#else
#ifdef DEBUG_CLIPPING
#define dprintf_clipping fprintf
@@ -438,7 +563,7 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_combo if(debug_msg_enabled[7]) fprintf
+#define dprintf_combo if(debug_msg_enabled[9]) fprintf
#else
#ifdef DEBUG_COMBO
#define dprintf_combo fprintf
@@ -448,7 +573,7 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_comm if(debug_msg_enabled[8]) fprintf
+#define dprintf_comm if(debug_msg_enabled[10]) fprintf
#else
#ifdef DEBUG_COMM
#define dprintf_comm fprintf
@@ -458,7 +583,7 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_cursor if(debug_msg_enabled[9]) fprintf
+#define dprintf_cursor if(debug_msg_enabled[11]) fprintf
#else
#ifdef DEBUG_CURSOR
#define dprintf_cursor fprintf
@@ -468,7 +593,7 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_dc if(debug_msg_enabled[10]) fprintf
+#define dprintf_dc if(debug_msg_enabled[12]) fprintf
#else
#ifdef DEBUG_DC
#define dprintf_dc fprintf
@@ -478,7 +603,7 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_dialog if(debug_msg_enabled[11]) fprintf
+#define dprintf_dialog if(debug_msg_enabled[13]) fprintf
#else
#ifdef DEBUG_DIALOG
#define dprintf_dialog fprintf
@@ -488,7 +613,7 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_dll if(debug_msg_enabled[12]) fprintf
+#define dprintf_dll if(debug_msg_enabled[14]) fprintf
#else
#ifdef DEBUG_DLL
#define dprintf_dll fprintf
@@ -498,7 +623,7 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_dosfs if(debug_msg_enabled[13]) fprintf
+#define dprintf_dosfs if(debug_msg_enabled[15]) fprintf
#else
#ifdef DEBUG_DOSFS
#define dprintf_dosfs fprintf
@@ -508,7 +633,7 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_driver if(debug_msg_enabled[14]) fprintf
+#define dprintf_driver if(debug_msg_enabled[16]) fprintf
#else
#ifdef DEBUG_DRIVER
#define dprintf_driver fprintf
@@ -518,7 +643,7 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_edit if(debug_msg_enabled[15]) fprintf
+#define dprintf_edit if(debug_msg_enabled[17]) fprintf
#else
#ifdef DEBUG_EDIT
#define dprintf_edit fprintf
@@ -528,7 +653,7 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_enum if(debug_msg_enabled[16]) fprintf
+#define dprintf_enum if(debug_msg_enabled[18]) fprintf
#else
#ifdef DEBUG_ENUM
#define dprintf_enum fprintf
@@ -538,7 +663,7 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_event if(debug_msg_enabled[17]) fprintf
+#define dprintf_event if(debug_msg_enabled[19]) fprintf
#else
#ifdef DEBUG_EVENT
#define dprintf_event fprintf
@@ -548,7 +673,7 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_exec if(debug_msg_enabled[18]) fprintf
+#define dprintf_exec if(debug_msg_enabled[20]) fprintf
#else
#ifdef DEBUG_EXEC
#define dprintf_exec fprintf
@@ -558,7 +683,7 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_file if(debug_msg_enabled[19]) fprintf
+#define dprintf_file if(debug_msg_enabled[21]) fprintf
#else
#ifdef DEBUG_FILE
#define dprintf_file fprintf
@@ -568,7 +693,7 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_fixup if(debug_msg_enabled[20]) fprintf
+#define dprintf_fixup if(debug_msg_enabled[22]) fprintf
#else
#ifdef DEBUG_FIXUP
#define dprintf_fixup fprintf
@@ -578,7 +703,7 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_font if(debug_msg_enabled[21]) fprintf
+#define dprintf_font if(debug_msg_enabled[23]) fprintf
#else
#ifdef DEBUG_FONT
#define dprintf_font fprintf
@@ -588,7 +713,7 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_gdi if(debug_msg_enabled[22]) fprintf
+#define dprintf_gdi if(debug_msg_enabled[24]) fprintf
#else
#ifdef DEBUG_GDI
#define dprintf_gdi fprintf
@@ -598,7 +723,7 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_graphics if(debug_msg_enabled[23]) fprintf
+#define dprintf_graphics if(debug_msg_enabled[25]) fprintf
#else
#ifdef DEBUG_GRAPHICS
#define dprintf_graphics fprintf
@@ -608,7 +733,7 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_heap if(debug_msg_enabled[24]) fprintf
+#define dprintf_heap if(debug_msg_enabled[26]) fprintf
#else
#ifdef DEBUG_HEAP
#define dprintf_heap fprintf
@@ -618,7 +743,7 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_icon if(debug_msg_enabled[25]) fprintf
+#define dprintf_icon if(debug_msg_enabled[27]) fprintf
#else
#ifdef DEBUG_ICON
#define dprintf_icon fprintf
@@ -628,7 +753,17 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_int if(debug_msg_enabled[26]) fprintf
+#define dprintf_if if(debug_msg_enabled[28]) fprintf
+#else
+#ifdef DEBUG_IF
+#define dprintf_if fprintf
+#else
+#define dprintf_if
+#endif
+#endif
+
+#ifdef DEBUG_RUNTIME
+#define dprintf_int if(debug_msg_enabled[29]) fprintf
#else
#ifdef DEBUG_INT
#define dprintf_int fprintf
@@ -638,7 +773,7 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_key if(debug_msg_enabled[27]) fprintf
+#define dprintf_key if(debug_msg_enabled[30]) fprintf
#else
#ifdef DEBUG_KEY
#define dprintf_key fprintf
@@ -648,7 +783,7 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_keyboard if(debug_msg_enabled[28]) fprintf
+#define dprintf_keyboard if(debug_msg_enabled[31]) fprintf
#else
#ifdef DEBUG_KEYBOARD
#define dprintf_keyboard fprintf
@@ -658,7 +793,7 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_ldt if(debug_msg_enabled[29]) fprintf
+#define dprintf_ldt if(debug_msg_enabled[32]) fprintf
#else
#ifdef DEBUG_LDT
#define dprintf_ldt fprintf
@@ -668,7 +803,7 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_listbox if(debug_msg_enabled[30]) fprintf
+#define dprintf_listbox if(debug_msg_enabled[33]) fprintf
#else
#ifdef DEBUG_LISTBOX
#define dprintf_listbox fprintf
@@ -678,7 +813,27 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_mciwave if(debug_msg_enabled[31]) fprintf
+#define dprintf_mci if(debug_msg_enabled[34]) fprintf
+#else
+#ifdef DEBUG_MCI
+#define dprintf_mci fprintf
+#else
+#define dprintf_mci
+#endif
+#endif
+
+#ifdef DEBUG_RUNTIME
+#define dprintf_mcianim if(debug_msg_enabled[35]) fprintf
+#else
+#ifdef DEBUG_MCIANIM
+#define dprintf_mcianim fprintf
+#else
+#define dprintf_mcianim
+#endif
+#endif
+
+#ifdef DEBUG_RUNTIME
+#define dprintf_mciwave if(debug_msg_enabled[36]) fprintf
#else
#ifdef DEBUG_MCIWAVE
#define dprintf_mciwave fprintf
@@ -688,7 +843,7 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_mdi if(debug_msg_enabled[32]) fprintf
+#define dprintf_mdi if(debug_msg_enabled[37]) fprintf
#else
#ifdef DEBUG_MDI
#define dprintf_mdi fprintf
@@ -698,7 +853,7 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_menu if(debug_msg_enabled[33]) fprintf
+#define dprintf_menu if(debug_msg_enabled[38]) fprintf
#else
#ifdef DEBUG_MENU
#define dprintf_menu fprintf
@@ -708,7 +863,7 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_menucalc if(debug_msg_enabled[34]) fprintf
+#define dprintf_menucalc if(debug_msg_enabled[39]) fprintf
#else
#ifdef DEBUG_MENUCALC
#define dprintf_menucalc fprintf
@@ -718,7 +873,7 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_message if(debug_msg_enabled[35]) fprintf
+#define dprintf_message if(debug_msg_enabled[40]) fprintf
#else
#ifdef DEBUG_MESSAGE
#define dprintf_message fprintf
@@ -728,7 +883,7 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_metafile if(debug_msg_enabled[36]) fprintf
+#define dprintf_metafile if(debug_msg_enabled[41]) fprintf
#else
#ifdef DEBUG_METAFILE
#define dprintf_metafile fprintf
@@ -738,7 +893,27 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_module if(debug_msg_enabled[37]) fprintf
+#define dprintf_mmio if(debug_msg_enabled[42]) fprintf
+#else
+#ifdef DEBUG_MMIO
+#define dprintf_mmio fprintf
+#else
+#define dprintf_mmio
+#endif
+#endif
+
+#ifdef DEBUG_RUNTIME
+#define dprintf_mmtime if(debug_msg_enabled[43]) fprintf
+#else
+#ifdef DEBUG_MMTIME
+#define dprintf_mmtime fprintf
+#else
+#define dprintf_mmtime
+#endif
+#endif
+
+#ifdef DEBUG_RUNTIME
+#define dprintf_module if(debug_msg_enabled[44]) fprintf
#else
#ifdef DEBUG_MODULE
#define dprintf_module fprintf
@@ -748,7 +923,7 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_msg if(debug_msg_enabled[38]) fprintf
+#define dprintf_msg if(debug_msg_enabled[45]) fprintf
#else
#ifdef DEBUG_MSG
#define dprintf_msg fprintf
@@ -758,7 +933,17 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_nonclient if(debug_msg_enabled[39]) fprintf
+#define dprintf_msgbox if(debug_msg_enabled[46]) fprintf
+#else
+#ifdef DEBUG_MSGBOX
+#define dprintf_msgbox fprintf
+#else
+#define dprintf_msgbox
+#endif
+#endif
+
+#ifdef DEBUG_RUNTIME
+#define dprintf_nonclient if(debug_msg_enabled[47]) fprintf
#else
#ifdef DEBUG_NONCLIENT
#define dprintf_nonclient fprintf
@@ -768,7 +953,7 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_palette if(debug_msg_enabled[40]) fprintf
+#define dprintf_palette if(debug_msg_enabled[48]) fprintf
#else
#ifdef DEBUG_PALETTE
#define dprintf_palette fprintf
@@ -778,7 +963,37 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_region if(debug_msg_enabled[41]) fprintf
+#define dprintf_profile if(debug_msg_enabled[49]) fprintf
+#else
+#ifdef DEBUG_PROFILE
+#define dprintf_profile fprintf
+#else
+#define dprintf_profile
+#endif
+#endif
+
+#ifdef DEBUG_RUNTIME
+#define dprintf_prop if(debug_msg_enabled[50]) fprintf
+#else
+#ifdef DEBUG_PROP
+#define dprintf_prop fprintf
+#else
+#define dprintf_prop
+#endif
+#endif
+
+#ifdef DEBUG_RUNTIME
+#define dprintf_reg if(debug_msg_enabled[51]) fprintf
+#else
+#ifdef DEBUG_REG
+#define dprintf_reg fprintf
+#else
+#define dprintf_reg
+#endif
+#endif
+
+#ifdef DEBUG_RUNTIME
+#define dprintf_region if(debug_msg_enabled[52]) fprintf
#else
#ifdef DEBUG_REGION
#define dprintf_region fprintf
@@ -788,7 +1003,7 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_resource if(debug_msg_enabled[42]) fprintf
+#define dprintf_resource if(debug_msg_enabled[53]) fprintf
#else
#ifdef DEBUG_RESOURCE
#define dprintf_resource fprintf
@@ -798,7 +1013,7 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_scroll if(debug_msg_enabled[43]) fprintf
+#define dprintf_scroll if(debug_msg_enabled[54]) fprintf
#else
#ifdef DEBUG_SCROLL
#define dprintf_scroll fprintf
@@ -808,7 +1023,27 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_syscolor if(debug_msg_enabled[44]) fprintf
+#define dprintf_selectors if(debug_msg_enabled[55]) fprintf
+#else
+#ifdef DEBUG_SELECTORS
+#define dprintf_selectors fprintf
+#else
+#define dprintf_selectors
+#endif
+#endif
+
+#ifdef DEBUG_RUNTIME
+#define dprintf_stress if(debug_msg_enabled[56]) fprintf
+#else
+#ifdef DEBUG_STRESS
+#define dprintf_stress fprintf
+#else
+#define dprintf_stress
+#endif
+#endif
+
+#ifdef DEBUG_RUNTIME
+#define dprintf_syscolor if(debug_msg_enabled[57]) fprintf
#else
#ifdef DEBUG_SYSCOLOR
#define dprintf_syscolor fprintf
@@ -818,7 +1053,17 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_text if(debug_msg_enabled[45]) fprintf
+#define dprintf_task if(debug_msg_enabled[58]) fprintf
+#else
+#ifdef DEBUG_TASK
+#define dprintf_task fprintf
+#else
+#define dprintf_task
+#endif
+#endif
+
+#ifdef DEBUG_RUNTIME
+#define dprintf_text if(debug_msg_enabled[59]) fprintf
#else
#ifdef DEBUG_TEXT
#define dprintf_text fprintf
@@ -828,7 +1073,7 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_timer if(debug_msg_enabled[46]) fprintf
+#define dprintf_timer if(debug_msg_enabled[60]) fprintf
#else
#ifdef DEBUG_TIMER
#define dprintf_timer fprintf
@@ -838,7 +1083,7 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_utility if(debug_msg_enabled[47]) fprintf
+#define dprintf_utility if(debug_msg_enabled[61]) fprintf
#else
#ifdef DEBUG_UTILITY
#define dprintf_utility fprintf
@@ -848,7 +1093,7 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_win if(debug_msg_enabled[48]) fprintf
+#define dprintf_win if(debug_msg_enabled[62]) fprintf
#else
#ifdef DEBUG_WIN
#define dprintf_win fprintf
@@ -857,6 +1102,16 @@
#endif
#endif
+#ifdef DEBUG_RUNTIME
+#define dprintf_winsock if(debug_msg_enabled[63]) fprintf
+#else
+#ifdef DEBUG_WINSOCK
+#define dprintf_winsock fprintf
+#else
+#define dprintf_winsock
+#endif
+#endif
+
#ifdef DEBUG_RUNTIME
@@ -864,7 +1119,9 @@
static char *debug_msg_name[] = {
"accel",
"bitmap",
+"callback",
"caret",
+"catch",
"cdaudio",
"class",
"clipboard",
@@ -888,29 +1145,42 @@
"graphics",
"heap",
"icon",
+"if",
"int",
"key",
"keyboard",
"ldt",
"listbox",
+"mci",
+"mcianim",
"mciwave",
"mdi",
"menu",
"menucalc",
"message",
"metafile",
+"mmio",
+"mmtime",
"module",
"msg",
+"msgbox",
"nonclient",
"palette",
+"profile",
+"prop",
+"reg",
"region",
"resource",
"scroll",
+"selectors",
+"stress",
"syscolor",
+"task",
"text",
"timer",
"utility",
"win",
+"winsock",
""};
#endif
#endif
diff --git a/include/dlgs.h b/include/dlgs.h
new file mode 100644
index 0000000..f7116ac
--- /dev/null
+++ b/include/dlgs.h
@@ -0,0 +1,186 @@
+/******************************************************************************
+* dlgs.h - Common dialog's dialog control ID numbers *
+******************************************************************************/
+
+#ifndef DLGS_H
+#define DLGS_H
+
+#define ctlFirst 0x0400
+#define ctlLast 0x04ff
+ /* Push buttons */
+#define psh1 0x0400
+#define psh2 0x0401
+#define psh3 0x0402
+#define psh4 0x0403
+#define psh5 0x0404
+#define psh6 0x0405
+#define psh7 0x0406
+#define psh8 0x0407
+#define psh9 0x0408
+#define psh10 0x0409
+#define psh11 0x040a
+#define psh12 0x040b
+#define psh13 0x040c
+#define psh14 0x040d
+#define psh15 0x040e
+#define pshHelp psh15
+#define psh16 0x040f
+ /* Checkboxes */
+#define chx1 0x0410
+#define chx2 0x0411
+#define chx3 0x0412
+#define chx4 0x0413
+#define chx5 0x0414
+#define chx6 0x0415
+#define chx7 0x0416
+#define chx8 0x0417
+#define chx9 0x0418
+#define chx10 0x0419
+#define chx11 0x041a
+#define chx12 0x041b
+#define chx13 0x041c
+#define chx14 0x041d
+#define chx15 0x041e
+#define chx16 0x041f
+ /* Radio buttons */
+#define rad1 0x0420
+#define rad2 0x0421
+#define rad3 0x0422
+#define rad4 0x0423
+#define rad5 0x0424
+#define rad6 0x0425
+#define rad7 0x0426
+#define rad8 0x0427
+#define rad9 0x0428
+#define rad10 0x0429
+#define rad11 0x042a
+#define rad12 0x042b
+#define rad13 0x042c
+#define rad14 0x042d
+#define rad15 0x042e
+#define rad16 0x042f
+ /* Groups, frames, rectangles, and icons */
+#define grp1 0x0430
+#define grp2 0x0431
+#define grp3 0x0432
+#define grp4 0x0433
+#define frm1 0x0434
+#define frm2 0x0435
+#define frm3 0x0436
+#define frm4 0x0437
+#define rct1 0x0438
+#define rct2 0x0439
+#define rct3 0x043a
+#define rct4 0x043b
+#define ico1 0x043c
+#define ico2 0x043d
+#define ico3 0x043e
+#define ico4 0x043f
+ /* Static text */
+#define stc1 0x0440
+#define stc2 0x0441
+#define stc3 0x0442
+#define stc4 0x0443
+#define stc5 0x0444
+#define stc6 0x0445
+#define stc7 0x0446
+#define stc8 0x0447
+#define stc9 0x0448
+#define stc10 0x0449
+#define stc11 0x044a
+#define stc12 0x044b
+#define stc13 0x044c
+#define stc14 0x044d
+#define stc15 0x044e
+#define stc16 0x044f
+#define stc17 0x0450
+#define stc18 0x0451
+#define stc19 0x0452
+#define stc20 0x0453
+#define stc21 0x0454
+#define stc22 0x0455
+#define stc23 0x0456
+#define stc24 0x0457
+#define stc25 0x0458
+#define stc26 0x0459
+#define stc27 0x045a
+#define stc28 0x045b
+#define stc29 0x045c
+#define stc30 0x045d
+#define stc31 0x045e
+#define stc32 0x045f
+ /* Listboxes */
+#define lst1 0x0460
+#define lst2 0x0461
+#define lst3 0x0462
+#define lst4 0x0463
+#define lst5 0x0464
+#define lst6 0x0465
+#define lst7 0x0466
+#define lst8 0x0467
+#define lst9 0x0468
+#define lst10 0x0469
+#define lst11 0x046a
+#define lst12 0x046b
+#define lst13 0x046c
+#define lst14 0x046d
+#define lst15 0x046e
+#define lst16 0x046f
+ /* Combo boxes */
+#define cmb1 0x0470
+#define cmb2 0x0471
+#define cmb3 0x0472
+#define cmb4 0x0473
+#define cmb5 0x0474
+#define cmb6 0x0475
+#define cmb7 0x0476
+#define cmb8 0x0477
+#define cmb9 0x0478
+#define cmb10 0x0479
+#define cmb11 0x047a
+#define cmb12 0x047b
+#define cmb13 0x047c
+#define cmb14 0x047d
+#define cmb15 0x047e
+#define cmb16 0x047f
+ /* Edit controls */
+#define edt1 0x0480
+#define edt2 0x0481
+#define edt3 0x0482
+#define edt4 0x0483
+#define edt5 0x0484
+#define edt6 0x0485
+#define edt7 0x0486
+#define edt8 0x0487
+#define edt9 0x0488
+#define edt10 0x0489
+#define edt11 0x048a
+#define edt12 0x048b
+#define edt13 0x048c
+#define edt14 0x048d
+#define edt15 0x048e
+#define edt16 0x048f
+ /* Scroll bars */
+#define scr1 0x0490
+#define scr2 0x0491
+#define scr3 0x0492
+#define scr4 0x0493
+#define scr5 0x0494
+#define scr6 0x0495
+#define scr7 0x0496
+#define scr8 0x0497
+
+/* These dialog resource ordinals really start at 0x0600, but the
+ * RC Compiler can't handle hex for resource IDs, hence the decimal.
+ */
+#define FILEOPENORD 1536
+#define MULTIFILEOPENORD 1537
+#define PRINTDLGORD 1538
+#define PRNSETUPDLGORD 1539
+#define FINDDLGORD 1540
+#define REPLACEDLGORD 1541
+#define FONTDLGORD 1542
+#define FORMATDLGORD31 1543
+#define FORMATDLGORD30 1544
+
+#endif /* #ifdef DLGS_H */
diff --git a/include/dlls.h b/include/dlls.h
index 5a5cdf6..b4a3fc0 100644
--- a/include/dlls.h
+++ b/include/dlls.h
@@ -112,7 +112,8 @@
extern struct dll_table_entry_s SYSTEM_table[];
extern struct dll_table_entry_s TOOLHELP_table[];
extern struct dll_table_entry_s MOUSE_table[];
+extern struct dll_table_entry_s COMMDLG_table[];
-#define N_BUILTINS 14
+#define N_BUILTINS 15
#endif /* DLLS_H */
diff --git a/include/gdi.h b/include/gdi.h
index 9198f21..bc553df 100644
--- a/include/gdi.h
+++ b/include/gdi.h
@@ -124,8 +124,8 @@
DeviceCaps *devCaps;
HANDLE hMetaFile;
- HRGN hClipRgn; /* Clip region */
- HRGN hVisRgn; /* Visible region */
+ HRGN hClipRgn; /* Clip region (may be 0) */
+ HRGN hVisRgn; /* Visible region (must never be 0) */
HRGN hGCClipRgn; /* GC clip region (ClipRgn AND VisRgn) */
HPEN hPen;
HBRUSH hBrush;
@@ -158,8 +158,6 @@
WORD MapMode;
short DCOrgX; /* DC origin */
short DCOrgY;
- short DCSizeX; /* DC dimensions */
- short DCSizeY;
short CursPosX; /* Current position */
short CursPosY;
short WndOrgX;
diff --git a/include/heap.h b/include/heap.h
index 7ff97a0..ff4321a 100644
--- a/include/heap.h
+++ b/include/heap.h
@@ -37,6 +37,7 @@
int new_size, unsigned int flags);
extern LHEAP *HEAP_LocalFindHeap(unsigned short owner);
extern unsigned int HEAP_LocalSize(MDESC **free_list, unsigned int handle);
+extern void HEAP_LocalInit(unsigned short owner, void *start, int length);
#define HEAP_OWNER (Segments[Stack16Frame[11] >> 3].owner)
#define LOCALHEAP() (&HEAP_LocalFindHeap(HEAP_OWNER)->free_list)
diff --git a/include/listbox.h b/include/listbox.h
index 22148ec..e244781 100644
--- a/include/listbox.h
+++ b/include/listbox.h
@@ -4,30 +4,32 @@
typedef struct tagLISTSTRUCT {
- DRAWITEMSTRUCT dis;
- HANDLE hMem;
- HANDLE hData;
- char *itemText;
- void *lpNext;
+ DRAWITEMSTRUCT dis;
+ HANDLE hMem;
+ HANDLE hData;
+ char *itemText;
+ void *lpNext;
} LISTSTRUCT;
typedef LISTSTRUCT FAR* LPLISTSTRUCT;
typedef struct tagHEADLIST {
- short FirstVisible;
- short ItemsCount;
- short ItemsVisible;
- short ColumnsVisible;
- short ItemsPerColumn;
- short ItemFocused;
- short PrevFocused;
- short StdItemHeight;
- short ColumnsWidth;
- short DrawCtlType;
- void *lpFirst;
- DWORD dwStyle;
- HWND hWndLogicParent;
- HFONT hFont;
+ short FirstVisible;
+ short ItemsCount;
+ short ItemsVisible;
+ short ColumnsVisible;
+ short ItemsPerColumn;
+ short ItemFocused;
+ short PrevFocused;
+ short SelCount;
+ short StdItemHeight;
+ short ColumnsWidth;
+ short DrawCtlType;
+ void *lpFirst;
+ DWORD dwStyle;
+ HWND hWndLogicParent;
+ HFONT hFont;
+ BOOL bRedrawFlag;
} HEADLIST;
typedef HEADLIST FAR* LPHEADLIST;
diff --git a/include/msdos.h b/include/msdos.h
index 0578218..0529883 100644
--- a/include/msdos.h
+++ b/include/msdos.h
@@ -30,25 +30,24 @@
#define DOSVERSION 0x0330;
#define MAX_DOS_DRIVES 26
-#define pointer(a,b) (BYTE*)(((WORD) a << 16) | b)
-#define segment(a) ((DWORD)a >> 16)
-#define offset(a) ((DWORD)a & 0xffff)
+#define segment(a) ((DWORD)(a) >> 16)
+#define offset(a) ((DWORD)(a) & 0xffff)
-#define setword(a,b) *(BYTE*)(a) = b & 0xff; \
- *((BYTE*)(a + 1)) = (b>>8) & 0xff;
+#define setword(a,b) *(BYTE*)(a) = (b) & 0xff; \
+ *((BYTE*)((a)+1)) = ((b)>>8) & 0xff;
-#define setdword(a,b) *(BYTE*)a = b & 0xff; \
- *((BYTE*)a + 1) = (b>>8) & 0xff; \
- *((BYTE*)a + 2) = (b>>16) & 0xff; \
- *((BYTE*)a + 3) = (b>>24) & 0xff;
+#define setdword(a,b) *(BYTE*)(a) = (b) & 0xff; \
+ *((BYTE*)(a)+1) = ((b)>>8) & 0xff; \
+ *((BYTE*)(a)+2) = ((b)>>16) & 0xff; \
+ *((BYTE*)(a)+3) = ((b)>>24) & 0xff;
-#define getword(a) (WORD) *(BYTE*)a + \
- (*((BYTE*)a + 1) << 8)
+#define getword(a) (WORD) *(BYTE*)(a) + \
+ (*((BYTE*)(a) + 1) << 8)
-#define getdword(a) (DWORD) (*(BYTE*)a + \
- (*((BYTE*)a + 1) << 8) + \
- (*((BYTE*)a + 2) << 16) + \
- (*((BYTE*)a + 3) << 24))
+#define getdword(a) (DWORD) (*(BYTE*)(a) + \
+ (*((BYTE*)(a) + 1) << 8) + \
+ (*((BYTE*)(a) + 2) << 16) + \
+ (*((BYTE*)(a) + 3) << 24))
/* dos file attributes */
diff --git a/include/scroll.h b/include/scroll.h
index 02ce9d1..96a6be9 100644
--- a/include/scroll.h
+++ b/include/scroll.h
@@ -4,22 +4,23 @@
typedef struct tagHEADSSCROLL {
- short CurVal;
- short MinVal;
- short MaxVal;
- short MaxPix;
- short CurPix;
- short ThumbVal;
- RECT rect;
- RECT rectUp;
- RECT rectDown;
- BOOL ThumbActive;
- BOOL TimerPending;
- WORD ButtonDown;
- WORD Direction;
- DWORD dwStyle;
- HWND hWndOwner;
-} HEADSCROLL;
+ short CurVal;
+ short MinVal;
+ short MaxVal;
+ short MaxPix;
+ short CurPix;
+ short ThumbVal;
+ RECT rect;
+ RECT rectUp;
+ RECT rectDown;
+ BOOL ThumbActive;
+ BOOL TimerPending;
+ WORD ButtonDown;
+ WORD Direction;
+ DWORD dwStyle;
+ HWND hWndOwner;
+ BOOL bRedrawFlag;
+ } HEADSCROLL;
typedef HEADSCROLL FAR* LPHEADSCROLL;
diff --git a/include/stddebug.h b/include/stddebug.h
index cda6a2e..465bd25 100644
--- a/include/stddebug.h
+++ b/include/stddebug.h
@@ -68,6 +68,8 @@
/* #define DEBUG_WIN */
/* #define DEBUG_ENUM */
/* #define DEBUG_DLL */
+/* #define DEBUG_MSGBOX */
+/* #define DEBUG_CATCH */
# /* Do not remove this line or change anything below this line */
@@ -75,7 +77,9 @@
#ifdef DEBUG_NONE
#undef DEBUG_ACCEL
#undef DEBUG_BITMAP
+#undef DEBUG_CALLBACK
#undef DEBUG_CARET
+#undef DEBUG_CATCH
#undef DEBUG_CDAUDIO
#undef DEBUG_CLASS
#undef DEBUG_CLIPBOARD
@@ -99,36 +103,51 @@
#undef DEBUG_GRAPHICS
#undef DEBUG_HEAP
#undef DEBUG_ICON
+#undef DEBUG_IF
#undef DEBUG_INT
#undef DEBUG_KEY
#undef DEBUG_KEYBOARD
#undef DEBUG_LDT
#undef DEBUG_LISTBOX
+#undef DEBUG_MCI
+#undef DEBUG_MCIANIM
#undef DEBUG_MCIWAVE
#undef DEBUG_MDI
#undef DEBUG_MENU
#undef DEBUG_MENUCALC
#undef DEBUG_MESSAGE
#undef DEBUG_METAFILE
+#undef DEBUG_MMIO
+#undef DEBUG_MMTIME
#undef DEBUG_MODULE
#undef DEBUG_MSG
+#undef DEBUG_MSGBOX
#undef DEBUG_NONCLIENT
#undef DEBUG_PALETTE
+#undef DEBUG_PROFILE
+#undef DEBUG_PROP
+#undef DEBUG_REG
#undef DEBUG_REGION
#undef DEBUG_RESOURCE
#undef DEBUG_SCROLL
+#undef DEBUG_SELECTORS
+#undef DEBUG_STRESS
#undef DEBUG_SYSCOLOR
+#undef DEBUG_TASK
#undef DEBUG_TEXT
#undef DEBUG_TIMER
#undef DEBUG_UTILITY
#undef DEBUG_WIN
+#undef DEBUG_WINSOCK
#endif
#ifdef DEBUG_ALL
#define DEBUG_ACCEL
#define DEBUG_BITMAP
+#define DEBUG_CALLBACK
#define DEBUG_CARET
+#define DEBUG_CATCH
#define DEBUG_CDAUDIO
#define DEBUG_CLASS
#define DEBUG_CLIPBOARD
@@ -152,27 +171,40 @@
#define DEBUG_GRAPHICS
#define DEBUG_HEAP
#define DEBUG_ICON
+#define DEBUG_IF
#define DEBUG_INT
#define DEBUG_KEY
#define DEBUG_KEYBOARD
#define DEBUG_LDT
#define DEBUG_LISTBOX
+#define DEBUG_MCI
+#define DEBUG_MCIANIM
#define DEBUG_MCIWAVE
#define DEBUG_MDI
#define DEBUG_MENU
#define DEBUG_MENUCALC
#define DEBUG_MESSAGE
#define DEBUG_METAFILE
+#define DEBUG_MMIO
+#define DEBUG_MMTIME
#define DEBUG_MODULE
#define DEBUG_MSG
+#define DEBUG_MSGBOX
#define DEBUG_NONCLIENT
#define DEBUG_PALETTE
+#define DEBUG_PROFILE
+#define DEBUG_PROP
+#define DEBUG_REG
#define DEBUG_REGION
#define DEBUG_RESOURCE
#define DEBUG_SCROLL
+#define DEBUG_SELECTORS
+#define DEBUG_STRESS
#define DEBUG_SYSCOLOR
+#define DEBUG_TASK
#define DEBUG_TEXT
#define DEBUG_TIMER
#define DEBUG_UTILITY
#define DEBUG_WIN
+#define DEBUG_WINSOCK
#endif
diff --git a/include/windows.h b/include/windows.h
index ee8fc6f..96d80ea 100644
--- a/include/windows.h
+++ b/include/windows.h
@@ -1195,7 +1195,7 @@
typedef struct tagDCB
{
BYTE Id;
- UINT BaudRate;
+ UINT BaudRate WINE_PACKED;
BYTE ByteSize;
BYTE Parity;
BYTE StopBits;
@@ -1227,15 +1227,15 @@
char PeChar;
char EofChar;
char EvtChar;
- UINT TxDelay;
+ UINT TxDelay WINE_PACKED;
} DCB;
typedef DCB FAR* LPDCB;
typedef struct tagCOMSTAT
{
BYTE status;
- UINT cbInQue;
- UINT cbOutQue;
+ UINT cbInQue WINE_PACKED;
+ UINT cbOutQue WINE_PACKED;
} COMSTAT;
#define CSTF_CTSHOLD 0x01
@@ -2655,6 +2655,7 @@
Fb(BOOL,InvertRgn,HDC,a,HRGN,b)
Fb(BOOL,IsChild,HWND,a,HWND,b)
Fb(BOOL,IsDialogMessage,HWND,a,LPMSG,b)
+Fb(BOOL,KillSystemTimer,HWND,a,WORD,b)
Fb(BOOL,KillTimer,HWND,a,WORD,b)
Fb(BOOL,OemToAnsi,LPSTR,a,LPSTR,b)
Fb(BOOL,PaintRgn,HDC,a,HRGN,b)
@@ -2916,6 +2917,7 @@
Fd(WORD,GetPrivateProfileInt,LPSTR,a,LPSTR,b,short,c,LPSTR,d)
Fd(WORD,GetSystemPaletteEntries,HDC,a,WORD,b,WORD,c,LPPALETTEENTRY,d)
Fd(WORD,SetPaletteEntries,HPALETTE,a,WORD,b,WORD,c,LPPALETTEENTRY,d)
+Fd(WORD,SetSystemTimer,HWND,a,WORD,d,WORD,b,FARPROC,c)
Fd(WORD,SetTimer,HWND,a,WORD,d,WORD,b,FARPROC,c)
Fd(BOOL,SetViewportExtEx,HDC,a,short,b,short,c,LPSIZE,d)
Fd(BOOL,SetViewportOrgEx,HDC,a,short,b,short,c,LPPOINT,d)
diff --git a/include/winpos.h b/include/winpos.h
index 1353f92..837a5b3 100644
--- a/include/winpos.h
+++ b/include/winpos.h
@@ -15,6 +15,7 @@
WORD suggestedCount;
WORD valid;
WORD wMagic;
+ HWND hwndParent;
WINDOWPOS winPos[1];
} DWP;
diff --git a/loader/dump.c b/loader/dump.c
index 08e1962..1cf84fa 100644
--- a/loader/dump.c
+++ b/loader/dump.c
@@ -29,14 +29,14 @@
ne_header->header_type[1]);
printf("linker version: %d.%d\n", ne_header->linker_version,
ne_header->linker_revision);
- printf("format flags: %04.4x\n", ne_header->format_flags);
- printf("automatic data segment: %04.4x\n", ne_header->auto_data_seg);
- printf("CS:IP %04.4x:%04.4x\n", ne_header->cs, ne_header->ip);
- printf("SS:SP %04.4x:%04.4x\n", ne_header->ss, ne_header->sp);
- printf("additional flags: %02.2x\n", ne_header->additional_flags);
- printf("operating system: %02.2x\n", ne_header->operating_system);
- printf("fast load offset: %04.4x\n", ne_header->fastload_offset);
- printf("fast load length: %04.4x\n", ne_header->fastload_length);
+ printf("format flags: %04x\n", ne_header->format_flags);
+ printf("automatic data segment: %04x\n", ne_header->auto_data_seg);
+ printf("CS:IP %04x:%04x\n", ne_header->cs, ne_header->ip);
+ printf("SS:SP %04x:%04x\n", ne_header->ss, ne_header->sp);
+ printf("additional flags: %02x\n", ne_header->additional_flags);
+ printf("operating system: %02x\n", ne_header->operating_system);
+ printf("fast load offset: %04x\n", ne_header->fastload_offset);
+ printf("fast load length: %04x\n", ne_header->fastload_length);
}
/**********************************************************************
@@ -49,10 +49,10 @@
for (i = 0; i < nentries; i++)
{
- printf(" %2d: OFFSET %04.4x, LENGTH %04.4x, ",
+ printf(" %2d: OFFSET %04x, LENGTH %04x, ",
i + 1, seg_table[i].seg_data_offset,
seg_table[i].seg_data_length);
- printf("FLAGS %04.4x, MIN ALLOC %04.4x\n",
+ printf("FLAGS %04x, MIN ALLOC %04x\n",
seg_table[i].seg_flags, seg_table[i].min_alloc);
}
}
@@ -85,9 +85,9 @@
rep = (struct relocation_entry_s *) (sp + 1);
for (i = 0; i < n_entries; i++, rep++)
{
- printf(" ADDR TYPE %d, TYPE %d, OFFSET %04.4x,",
+ printf(" ADDR TYPE %d, TYPE %d, OFFSET %04x,",
rep->address_type, rep->relocation_type, rep->offset);
- printf("TARGET %04.4x %04.4x\n", rep->target1, rep->target2);
+ printf("TARGET %04x %04x\n", rep->target1, rep->target2);
}
}
#endif /* ifndef WINELIB */
diff --git a/loader/ldt.c b/loader/ldt.c
index 96ca5e4..ebcd574 100644
--- a/loader/ldt.c
+++ b/loader/ldt.c
@@ -55,7 +55,7 @@
#endif
if (*lp & 1000)
{
- printf("Entry %2d: Base %08.8x, Limit %05.5x, DPL %d, Type %d\n",
+ printf("Entry %2d: Base %08lx, Limit %05lx, DPL %d, Type %d\n",
i, base_addr, limit, dpl, type);
printf(" ");
if (*lp & 0x100)
@@ -75,13 +75,13 @@
else
printf("byte limit, ");
printf("\n");
- printf(" %08.8x %08.8x\n", *(lp), *(lp-1));
+ printf(" %08lx %08lx\n", *(lp), *(lp-1));
}
else
{
- printf("Entry %2d: Base %08.8x, Limit %05.5x, DPL %d, Type %d\n",
+ printf("Entry %2d: Base %08lx, Limit %05lx, DPL %d, Type %d\n",
i, base_addr, limit, dpl, type);
- printf(" SYSTEM: %08.8x %08.8x\n", *lp, *(lp-1));
+ printf(" SYSTEM: %08x %08x\n", *lp, *(lp-1));
}
}
}
diff --git a/loader/ldtlib.c b/loader/ldtlib.c
index 8266c7f..6e4c30b 100644
--- a/loader/ldtlib.c
+++ b/loader/ldtlib.c
@@ -7,8 +7,8 @@
#include <errno.h>
#include "autoconf.h"
#include "stddebug.h"
-/* #define DEBUG_LDT /* */
-/* #undef DEBUG_LDT /* */
+/* #define DEBUG_LDT */
+/* #undef DEBUG_LDT */
#include "debug.h"
#ifdef linux
diff --git a/loader/library.c b/loader/library.c
index ea6f623..1f9291d 100644
--- a/loader/library.c
+++ b/loader/library.c
@@ -22,8 +22,8 @@
#include "task.h"
#include "toolhelp.h"
#include "stddebug.h"
-/* #define DEBUG_MODULE /* */
-/* #undef DEBUG_MODULE /* */
+/* #define DEBUG_MODULE */
+/* #undef DEBUG_MODULE */
#include "debug.h"
extern char WindowsPath[256];
@@ -96,12 +96,12 @@
static flagReadyToRun = 0;
struct w_files *final_wpnt;
- printf("InitializeLoadedDLLs %08X\n", wpnt);
+ dprintf_module(stddeb,"InitializeLoadedDLLs(%08lX)\n", wpnt);
if (wpnt == NULL)
{
flagReadyToRun = 1;
- fprintf(stderr, "Initializing DLLs\n");
+ dprintf_module(stddeb,"Initializing DLLs\n");
}
if (!flagReadyToRun)
@@ -109,7 +109,7 @@
#if 1
if (wpnt != NULL)
- fprintf(stderr, "Initializing %s\n", wpnt->name);
+ dprintf_module(stddeb,"Initializing %s\n", wpnt->name);
#endif
/*
@@ -140,7 +140,7 @@
char buffer[256], header[2], modulename[64], *fullname;
ExtractDLLName(module, modulename);
- printf("LoadImage [%s]\n", module);
+ dprintf_module(stddeb,"LoadImage [%s]\n", module);
/* built-in one ? */
if (FindDLLTable(modulename)) {
return GetModuleHandle(modulename);
@@ -166,7 +166,7 @@
fullname = GetDosFileName(fullname);
- fprintf(stderr,"LoadImage: loading %s (%s)\n [%s]\n",
+ dprintf_module(stddeb,"LoadImage: loading %s (%s)\n [%s]\n",
module, buffer, fullname);
if (change_dir && fullname)
@@ -209,8 +209,12 @@
{
myerror("Unable to read MZ header from file");
}
+
+ /* This field is ignored according to "Windows Internals", p.242 */
+#if 0
if (wpnt->mz_header->must_be_0x40 != 0x40)
myerror("This is not a Windows program");
+#endif
/* read first two bytes to determine filetype */
lseek(wpnt->fd, wpnt->mz_header->ne_offset, SEEK_SET);
@@ -261,45 +265,45 @@
ExtractDLLName(lpModuleName, dllname);
if ((int) lpModuleName & 0xffff0000)
- printf("GetModuleHandle('%s');\n", lpModuleName);
+ dprintf_module(stddeb,"GetModuleHandle('%s');\n", lpModuleName);
else
- printf("GetModuleHandle('%x');\n", lpModuleName);
+ dprintf_module(stddeb,"GetModuleHandle('%p');\n", lpModuleName);
-/* printf("GetModuleHandle // searching in builtin libraries\n");*/
+/* dprintf_module(stddeb,"GetModuleHandle // searching in builtin libraries\n");*/
for (i = 0; i < N_BUILTINS; i++) {
if (dll_builtin_table[i].dll_name == NULL) break;
if (((int) lpModuleName & 0xffff0000) == 0) {
if (0xFF00 + i == (int) lpModuleName) {
- printf("GetModuleHandle('%s') return %04X \n",
+ dprintf_module(stddeb,"GetModuleHandle('%s') return %04X \n",
lpModuleName, 0xff00 + i);
return 0xFF00 + i;
}
}
else if (strcasecmp(dll_builtin_table[i].dll_name, dllname) == 0) {
- printf("GetModuleHandle('%x') return %04X \n",
+ dprintf_module(stddeb,"GetModuleHandle('%p') return %04X \n",
lpModuleName, 0xFF00 + i);
return (0xFF00 + i);
}
}
- printf("GetModuleHandle // searching in loaded modules\n");
+ dprintf_module(stddeb,"GetModuleHandle // searching in loaded modules\n");
while (w) {
-/* printf("GetModuleHandle // '%x' \n", w->name); */
+/* dprintf_module(stddeb,"GetModuleHandle // '%x' \n", w->name); */
if (((int) lpModuleName & 0xffff0000) == 0) {
if (w->hinstance == (int) lpModuleName) {
- printf("GetModuleHandle('%x') return %04X \n",
+ dprintf_module(stddeb,"GetModuleHandle('%p') return %04X \n",
lpModuleName, w->hinstance);
return w->hinstance;
}
}
else if (strcasecmp(w->name, dllname) == 0) {
- printf("GetModuleHandle('%s') return %04X \n",
+ dprintf_module(stddeb,"GetModuleHandle('%s') return %04X \n",
lpModuleName, w->hinstance);
return w->hinstance;
}
w = w->next;
}
- printf("GetModuleHandle('%x') not found !\n", lpModuleName);
+ printf("GetModuleHandle('%p') not found !\n", lpModuleName);
return 0;
}
@@ -311,7 +315,7 @@
{
struct w_files *w;
- printf("GetModuleUsage(%04X);\n", hModule);
+ dprintf_module(stddeb,"GetModuleUsage(%04X);\n", hModule);
/* built-in dll ? */
if (IS_BUILTIN_DLL(hModule))
@@ -332,7 +336,7 @@
LPSTR str;
char windir[256], temp[256];
- printf("GetModuleFileName(%04X, %08X, %d);\n", hModule, lpFileName, nSize);
+ dprintf_module(stddeb,"GetModuleFileName(%04X, %p, %d);\n", hModule, lpFileName, nSize);
if (lpFileName == NULL) return 0;
if (nSize < 1) return 0;
@@ -343,7 +347,7 @@
sprintf(temp, "%s\\%s.DLL", windir, dll_builtin_table[hModule & 0x00ff].dll_name);
ToDos(temp);
strncpy(lpFileName, temp, nSize);
- printf("GetModuleFileName copied '%s' (internal dll) return %d \n", lpFileName, nSize);
+ dprintf_module(stddeb,"GetModuleFileName copied '%s' (internal dll) return %d \n", lpFileName, nSize);
return strlen(lpFileName);
}
@@ -353,7 +357,7 @@
str = GetDosFileName(w->filename);
if (nSize > strlen(str)) nSize = strlen(str) + 1;
strncpy(lpFileName, str, nSize);
- printf("GetModuleFileName copied '%s' return %d \n", lpFileName, nSize);
+ dprintf_module(stddeb,"GetModuleFileName copied '%s' return %d \n", lpFileName, nSize);
return nSize - 1;
}
@@ -379,8 +383,7 @@
*/
void FreeLibrary(HANDLE hLib)
{
- struct w_files *wpnt;
- printf("FreeLibrary(%04X);\n", hLib);
+ dprintf_module(stddeb,"FreeLibrary(%04X);\n", hLib);
/* built-in dll ? */
if (IS_BUILTIN_DLL(hLib) || hLib == 0 || hLib == hSysRes)
@@ -399,11 +402,11 @@
if (lpMod->ModuleName != NULL) free(lpMod->ModuleName);
if (lpMod->FileName != NULL) free(lpMod->FileName);
GlobalFree(lpMod->hModule);
- printf("FreeLibrary // freed !\n");
+ dprintf_module(stddeb,"FreeLibrary // freed !\n");
return;
}
lpMod->Count--;
- printf("FreeLibrary // Count decremented !\n");
+ dprintf_module(stddeb,"FreeLibrary // Count decremented !\n");
return;
}
lpMod = lpMod->lpNextModule;
@@ -433,7 +436,7 @@
{
if ((int) proc_name & 0xffff0000)
{
- printf("GetProcAddress: builtin %#04X, '%s'\n",
+ dprintf_module(stddeb,"GetProcAddress: builtin %#04X, '%s'\n",
hModule, proc_name);
if (GetEntryDLLName(dll_builtin_table[hModule - 0xFF00].dll_name,
proc_name, &sel, &addr))
@@ -443,7 +446,7 @@
}
else
{
- printf("GetProcAddress: builtin %#04X, %d\n",
+ dprintf_module(stddeb,"GetProcAddress: builtin %#04X, %d\n",
hModule, (int)proc_name);
if (GetEntryDLLOrdinal(dll_builtin_table[hModule-0xFF00].dll_name,
(int)proc_name & 0x0000FFFF, &sel, &addr))
@@ -452,14 +455,14 @@
}
}
ret = MAKELONG(addr, sel);
- printf("GetProcAddress // ret=%08X sel=%04X addr=%04X\n",
+ dprintf_module(stddeb,"GetProcAddress // ret=%08X sel=%04X addr=%04X\n",
ret, sel, addr);
return (FARPROC)ret;
}
if (hModule == 0)
{
hTask = GetCurrentTask();
- printf("GetProcAddress // GetCurrentTask()=%04X\n", hTask);
+ dprintf_module(stddeb,"GetProcAddress // GetCurrentTask()=%04X\n", hTask);
lpTask = (LPTASKENTRY) GlobalLock(hTask);
if (lpTask == NULL)
{
@@ -467,7 +470,7 @@
return NULL;
}
hModule = lpTask->hInst;
- printf("GetProcAddress: current module=%04X instance=%04X!\n",
+ dprintf_module(stddeb,"GetProcAddress: current module=%04X instance=%04X!\n",
lpTask->hModule, lpTask->hInst);
GlobalUnlock(hTask);
}
@@ -475,11 +478,11 @@
w = w->next;
if (w == NULL)
return NULL;
- printf("GetProcAddress // Module Found ! w->filename='%s'\n", w->filename);
+ dprintf_module(stddeb,"GetProcAddress // Module Found ! w->filename='%s'\n", w->filename);
if ((int)proc_name & 0xFFFF0000)
{
AnsiUpper(proc_name);
- printf("GetProcAddress: %04X, '%s'\n", hModule, proc_name);
+ dprintf_module(stddeb,"GetProcAddress: %04X, '%s'\n", hModule, proc_name);
cpnt = w->ne->nrname_table;
while(TRUE)
{
@@ -488,10 +491,8 @@
len = *cpnt++;
strncpy(C, cpnt, len);
C[len] = '\0';
-#ifdef DEBUG_MODULE
- printf("pointing Function '%s' ordinal=%d !\n",
+ dprintf_module(stddeb,"pointing Function '%s' ordinal=%d !\n",
C, *((unsigned short *)(cpnt + len)));
-#endif
if (strncmp(cpnt, proc_name, len) == 0)
{
ordinal = *((unsigned short *)(cpnt + len));
@@ -507,7 +508,7 @@
}
else
{
- printf("GetProcAddress: %#04x, %d\n", hModule, (int) proc_name);
+ dprintf_module(stddeb,"GetProcAddress: %#04x, %d\n", hModule, (int) proc_name);
ordinal = (int)proc_name;
}
ret = GetEntryPointFromOrdinal(w, ordinal);
@@ -518,7 +519,7 @@
}
addr = ret & 0xffff;
sel = (ret >> 16);
- printf("GetProcAddress // ret=%08X sel=%04X addr=%04X\n", ret, sel, addr);
+ dprintf_module(stddeb,"GetProcAddress // ret=%08X sel=%04X addr=%04X\n", ret, sel, addr);
return (FARPROC) ret;
#endif /* WINELIB */
}
@@ -552,7 +553,7 @@
*/
BOOL ModuleFirst(MODULEENTRY *lpModule)
{
- printf("ModuleFirst(%08X)\n", (int) lpModule);
+ dprintf_module(stddeb,"ModuleFirst(%08X)\n", (int) lpModule);
FillModStructBuiltIn(lpModule, &dll_builtin_table[0]);
return TRUE;
@@ -565,7 +566,7 @@
{
struct w_files *w;
- printf("ModuleNext(%08X)\n", (int) lpModule);
+ dprintf_module(stddeb,"ModuleNext(%08X)\n", (int) lpModule);
if (IS_BUILTIN_DLL(lpModule->hModule)) {
/* last built-in ? */
@@ -594,7 +595,7 @@
{
struct w_files *w;
- printf("ModuleFindHandle(%08X, %04X)\n", (int) lpModule, (int)hModule);
+ dprintf_module(stddeb,"ModuleFindHandle(%08X, %04X)\n", (int) lpModule, (int)hModule);
/* built-in dll ? */
if (IS_BUILTIN_DLL(hModule)) {
diff --git a/loader/main.c b/loader/main.c
index eefa3c1..5721a52 100644
--- a/loader/main.c
+++ b/loader/main.c
@@ -20,8 +20,8 @@
#include "task.h"
#include "options.h"
#include "stddebug.h"
-/* #define DEBUG_DLL /* */
-/* #undef DEBUG_DLL /* */
+/* #define DEBUG_DLL */
+/* #undef DEBUG_DLL */
#include "debug.h"
@@ -83,7 +83,8 @@
exit(1);
}
hTaskMain = CreateNewTask(hInstMain, 0);
- printf("_WinMain // hTaskMain=%04X hInstMain=%04X !\n", hTaskMain, hInstMain);
+ dprintf_dll(stddeb,"_WinMain // hTaskMain=%04X hInstMain=%04X !\n",
+ hTaskMain, hInstMain);
GetPrivateProfileString("wine", "SystemResources", "sysres.dll",
filename, sizeof(filename), WINE_INI);
@@ -93,7 +94,8 @@
fprintf(stderr, "wine: can't load %s!.\n", filename);
exit(1);
} else
- dprintf_dll(stddeb,"System Resources Loaded // hSysRes='%04X'\n", hSysRes);
+ dprintf_dll(stddeb,"System Resources Loaded // hSysRes='%04X'\n",
+ hSysRes);
#ifdef WINESTAT
cp = strrchr(argv[0], '/');
diff --git a/loader/ne_image.c b/loader/ne_image.c
index 03d3b86..5584fec 100644
--- a/loader/ne_image.c
+++ b/loader/ne_image.c
@@ -25,8 +25,8 @@
#include "arch.h"
#include "options.h"
#include "stddebug.h"
-/* #define DEBUG_FIXUP /* */
-/* #undef DEBUG_FIXUP /* */
+/* #define DEBUG_FIXUP */
+/* #undef DEBUG_FIXUP */
#include "debug.h"
extern HANDLE CreateNewTask(HINSTANCE hInst);
@@ -284,7 +284,7 @@
return -1;
}
- dprintf_fixup(stddeb,"%d: %s.%d: %04.4x:%04.4x\n", i + 1,
+ dprintf_fixup(stddeb,"%d: %s.%d: %04x:%04x\n", i + 1,
dll_name, ordinal, selector, address);
break;
@@ -317,7 +317,7 @@
return -1;
}
- dprintf_fixup(stddeb,"%d: %s %s.%d: %04.4x:%04.4x\n", i + 1,
+ dprintf_fixup(stddeb,"%d: %s %s.%d: %04x:%04x\n", i + 1,
func_name, dll_name, ordinal, selector, address);
break;
@@ -335,7 +335,7 @@
address = rep->target2;
}
- dprintf_fixup(stddeb,"%d: %04.4x:%04.4x\n",
+ dprintf_fixup(stddeb,"%d: %04x:%04x\n",
i + 1, selector, address);
break;
@@ -349,19 +349,19 @@
* exist.
*/
dprintf_fixup(stddeb,
- "%d: ADDR TYPE %d, TYPE %d, OFFSET %04.4x, ",
+ "%d: ADDR TYPE %d, TYPE %d, OFFSET %04x, ",
i + 1, rep->address_type, rep->relocation_type,
rep->offset);
- dprintf_fixup(stddeb,"TARGET %04.4x %04.4x\n",
+ dprintf_fixup(stddeb,"TARGET %04x %04x\n",
rep->target1, rep->target2);
continue;
default:
dprintf_fixup(stddeb,
- "%d: ADDR TYPE %d, TYPE %d, OFFSET %04.4x, ",
+ "%d: ADDR TYPE %d, TYPE %d, OFFSET %04x, ",
i + 1, rep->address_type, rep->relocation_type,
rep->offset);
- dprintf_fixup(stddeb,"TARGET %04.4x %04.4x\n",
+ dprintf_fixup(stddeb,"TARGET %04x %04x\n",
rep->target1, rep->target2);
free(rep1);
return -1;
@@ -376,10 +376,10 @@
if (FindDLLTable(dll_name) == NULL)
additive = 2;
dprintf_fixup(stddeb,
- "%d: ADDR TYPE %d, TYPE %d, OFFSET %04.4x, ",
+ "%d: ADDR TYPE %d, TYPE %d, OFFSET %04x, ",
i + 1, rep->address_type, rep->relocation_type,
rep->offset);
- dprintf_fixup(stddeb,"TARGET %04.4x %04.4x\n",
+ dprintf_fixup(stddeb,"TARGET %04x %04x\n",
rep->target1, rep->target2);
dprintf_fixup(stddeb, " Additive = %d\n", additive);
}
@@ -388,8 +388,8 @@
{
case NE_RADDR_OFFSET16:
do {
- dprintf_fixup(stddeb," %04.4x:%04.4x:%04.4x OFFSET16\n",
- (unsigned long) sp >> 16, (int) sp & 0xFFFF, *sp);
+ dprintf_fixup(stddeb," %04x:%04x:%04x OFFSET16\n",
+ (unsigned int) sp >> 16, (int) sp & 0xFFFF, *sp);
next_addr = *sp;
*sp = (unsigned short) address;
if (additive == 2)
@@ -402,8 +402,8 @@
case NE_RADDR_POINTER32:
do {
- dprintf_fixup(stddeb," %04.4x:%04.4x:%04.4x POINTER32\n",
- (unsigned long) sp >> 16, (int) sp & 0xFFFF, *sp);
+ dprintf_fixup(stddeb," %04x:%04x:%04x POINTER32\n",
+ (unsigned int) sp >> 16, (int) sp & 0xFFFF, *sp);
next_addr = *sp;
*sp = (unsigned short) address;
if (additive == 2)
@@ -417,8 +417,8 @@
case NE_RADDR_SELECTOR:
do {
- dprintf_fixup(stddeb," %04.4x:%04.4x:%04.4x SELECTOR\n",
- (unsigned long) sp >> 16, (int) sp & 0xFFFF, *sp);
+ dprintf_fixup(stddeb," %04x:%04x:%04x SELECTOR\n",
+ (unsigned int) sp >> 16, (int) sp & 0xFFFF, *sp);
next_addr = *sp;
*sp = (unsigned short) selector;
sp = (unsigned short *) ((char *) sel->base_addr + next_addr);
@@ -431,11 +431,11 @@
default:
dprintf_fixup(stddeb,
- "%d: ADDR TYPE %d, TYPE %d, OFFSET %04.4x, ",
+ "%d: ADDR TYPE %d, TYPE %d, OFFSET %04x, ",
i + 1, rep->address_type, rep->relocation_type,
rep->offset);
dprintf_fixup(stddeb,
- "TARGET %04.4x %04.4x\n", rep->target1, rep->target2);
+ "TARGET %04x %04x\n", rep->target1, rep->target2);
free(rep1);
return -1;
}
@@ -447,7 +447,7 @@
int NEunloadImage(struct w_files *wpnt)
{
- printf("NEunloadImage() called!\n");
+ dprintf_fixup(stdnimp, "NEunloadImage() called!\n");
/* free resources, image */
return 1;
}
@@ -491,13 +491,13 @@
ip_reg = wpnt->ne->ne_header->ip;
if (cs_reg) {
- fprintf(stderr, "Initializing %s, cs:ip %04x:%04x, ds %04x\n",
+ dprintf_dll(stddeb,"Initializing %s, cs:ip %04x:%04x, ds %04x\n",
wpnt->name, cs_reg, ip_reg, ds_reg);
rv = CallTo16(cs_reg << 16 | ip_reg, ds_reg);
- printf ("rv = %x\n", rv);
+ dprintf_exec(stddeb,"rv = %x\n", rv);
} else
- printf("%s skipped\n", wpnt->name);
+ dprintf_exec(stddeb,"%s skipped\n", wpnt->name);
}
}
diff --git a/loader/ne_resource.c b/loader/ne_resource.c
index 25e0b4c..9e665c0 100644
--- a/loader/ne_resource.c
+++ b/loader/ne_resource.c
@@ -14,8 +14,11 @@
#include "arch.h"
#include "dlls.h"
#include "resource.h"
-
+#include "stddebug.h"
/* #define DEBUG_RESOURCE */
+/* #undef DEBUG_RESOURCE */
+#include "debug.h"
+
static int ResourceFd = -1;
static HANDLE ResourceInst = 0;
@@ -142,10 +145,8 @@
#endif
#endif
-#ifdef DEBUG_RESOURCE
- printf("OpenResourceFile(%04X) // file='%s' hFile=%04X !\n",
+ dprintf_resource(stddeb, "OpenResourceFile(%04X) // file='%s' hFile=%04X !\n",
instance, w->filename, ResourceFd);
-#endif
return ResourceFd;
}
@@ -170,22 +171,16 @@
}
if ((type_id2 & 0x8000) != 0)
return 0;
-#ifdef DEBUG_RESOURCE
- printf("type_compare: type_id2=%04X !\n", type_id2);
-#endif
+ dprintf_resource(stddeb, "type_compare: type_id2=%04X !\n", type_id2);
old_pos = lseek(fd, 0, SEEK_CUR);
lseek(fd, off + type_id2, SEEK_SET);
read(fd, &c, 1);
nbytes = CONV_CHAR_TO_LONG (c);
-#ifdef DEBUG_RESOURCE
- printf("type_compare: namesize=%d\n", nbytes);
-#endif
+ dprintf_resource(stddeb, "type_compare: namesize=%d\n", nbytes);
read(fd, name, nbytes);
lseek(fd, old_pos, SEEK_SET);
name[nbytes] = '\0';
-#ifdef DEBUG_RESOURCE
- printf("type_compare: name=`%s'\n", name);
-#endif
+ dprintf_resource(stddeb, "type_compare: name=`%s'\n", name);
return strcasecmp((char *) type_id1, name) == 0;
}
@@ -227,10 +222,8 @@
printf("FindResourceByNumber (%X) bad typeinfo size !\n", resource_id);
return -1;
}
-#ifdef DEBUG_RESOURCE
- printf("FindResourceByNumber type=%X count=%d ?=%d searched=%08X\n",
+ dprintf_resource(stddeb, "FindResourceByNumber type=%X count=%d ?=%ld searched=%08X\n",
typeinfo.type_id, typeinfo.count, typeinfo.reserved, type_id);
-#endif
if (typeinfo.type_id == 0) break;
if (type_match(type_id, typeinfo.type_id, ResourceFd, rtoff)) {
@@ -245,10 +238,8 @@
printf("FindResourceByNumber (%X) bad nameinfo size !\n", resource_id);
return -1;
}
-#ifdef DEBUG_RESOURCE
- printf("FindResource: search type=%X id=%X // type=%X id=%X\n",
+ dprintf_resource(stddeb, "FindResource: search type=%X id=%X // type=%X id=%X\n",
type_id, resource_id, typeinfo.type_id, nameinfo.id);
-#endif
if (nameinfo.id == resource_id) {
memcpy(result_p, &nameinfo, sizeof(nameinfo));
return size_shift;
@@ -325,10 +316,8 @@
printf("FindResourceByName (%s) bad typeinfo size !\n", resource_name);
return -1;
}
-#ifdef DEBUG_RESOURCE
- printf("FindResourceByName typeinfo.type_id=%X count=%d type_id=%X\n",
+ dprintf_resource(stddeb, "FindResourceByName typeinfo.type_id=%X count=%d type_id=%X\n",
typeinfo.type_id, typeinfo.count, type_id);
-#endif
if (typeinfo.type_id == 0) break;
if (type_match(type_id, typeinfo.type_id, ResourceFd, rtoff))
{
@@ -347,25 +336,19 @@
/*
if ((nameinfo.id & 0x8000) != 0) continue;
*/
-#ifdef DEBUG_RESOURCE
- printf("FindResourceByName // nameinfo.id=%04X !\n", nameinfo.id);
-#endif
+ dprintf_resource(stddeb, "FindResourceByName // nameinfo.id=%04X !\n", nameinfo.id);
old_pos = lseek(ResourceFd, 0, SEEK_CUR);
new_pos = rtoff + nameinfo.id;
lseek(ResourceFd, new_pos, SEEK_SET);
read(ResourceFd, &nbytes, 1);
-#ifdef DEBUG_RESOURCE
- printf("FindResourceByName // namesize=%d !\n", nbytes);
-#endif
+ dprintf_resource(stddeb, "FindResourceByName // namesize=%d !\n", nbytes);
nbytes = CONV_CHAR_TO_LONG (nbytes);
read(ResourceFd, name, nbytes);
lseek(ResourceFd, old_pos, SEEK_SET);
name[nbytes] = '\0';
-#ifdef DEBUG_RESOURCE
- printf("FindResourceByName type_id=%X (%d of %d) name='%s' resource_name='%s'\n",
+ dprintf_resource(stddeb, "FindResourceByName type_id=%X (%d of %d) name='%s' resource_name='%s'\n",
typeinfo.type_id, i + 1, typeinfo.count,
name, resource_name);
-#endif
if (strcasecmp(name, resource_name) == 0)
{
memcpy(result_p, &nameinfo, sizeof(nameinfo));
@@ -392,9 +375,8 @@
off_t rtoff;
if (hInst == 0) return 0;
-#ifdef DEBUG_RESOURCE
- printf("GetRsrcCount hInst=%04X typename=%08X\n", hInst, type_id);
-#endif
+ dprintf_resource(stddeb, "GetRsrcCount hInst=%04X typename=%08X\n",
+ hInst, type_id);
if (OpenResourceFile(hInst) < 0) return 0;
/*
@@ -416,10 +398,8 @@
printf("GetRsrcCount // bad typeinfo size !\n");
return 0;
}
-#ifdef DEBUG_RESOURCE
- printf("GetRsrcCount // typeinfo.type_id=%X count=%d type_id=%X\n",
+ dprintf_resource(stddeb, "GetRsrcCount // typeinfo.type_id=%X count=%d type_id=%X\n",
typeinfo.type_id, typeinfo.count, type_id);
-#endif
if (typeinfo.type_id == 0) break;
if (type_match(type_id, typeinfo.type_id, ResourceFd, rtoff)) {
return typeinfo.count;
@@ -440,10 +420,8 @@
{
int type;
-#ifdef DEBUG_RESOURCE
- printf("NE_FindResource hInst=%04X typename=%08X resname=%08X\n",
+ dprintf_resource(stddeb, "NE_FindResource hInst=%04X typename=%p resname=%p\n",
instance, type_name, resource_name);
-#endif
ResourceFd = r->fd;
ResourceFileInfo = r->wpnt;
diff --git a/loader/pe_image.c b/loader/pe_image.c
index 948e8e6..78b536b 100644
--- a/loader/pe_image.c
+++ b/loader/pe_image.c
@@ -6,6 +6,7 @@
* ftp.microsoft.com:/pub/developer/MSDN/CD8/PEFILE.ZIP
*/
+#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -41,7 +42,7 @@
/* Sigh. Alignment must be wrong for mmap. Do this the hard way. */
if(!(flags & MAP_FIXED)) {
- vaddr = 0x40000000;
+ vaddr = (char *)0x40000000;
flags |= MAP_FIXED;
};
@@ -51,7 +52,7 @@
return vaddr;
};
-dump_exports(struct PE_Export_Directory * pe_exports)
+void dump_exports(struct PE_Export_Directory * pe_exports)
{
char * Module;
int i;
@@ -60,7 +61,7 @@
u_char ** name, *ename;
Module = ((char *) load_addr) + pe_exports->Name;
- printf("\n*******EXPORT DATA*******\nModule name is %s, %d functions, %d names\n",
+ printf("\n*******EXPORT DATA*******\nModule name is %s, %ld functions, %ld names\n",
Module,
pe_exports->Number_Of_Functions,
pe_exports->Number_Of_Names);
@@ -73,13 +74,11 @@
for(i=0; i< pe_exports->Number_Of_Functions; i++)
{
ename = (char *) (((char *) load_addr) + (int) *name++);
- printf("%-32s %4d %8.8x\n", ename, *ordinal++, *function++);
+ printf("%-32s %4d %8.8lx\n", ename, *ordinal++, *function++);
}
-
- return;
}
-dump_imports(struct PE_Import_Directory *pe_imports)
+void dump_imports(struct PE_Import_Directory *pe_imports)
{
struct PE_Import_Directory * pe_imp;
@@ -88,7 +87,7 @@
pe_imp = pe_imports;
while (pe_imp->ModuleName)
{
- char * Module, *Function;
+ char * Module;
struct pe_import_name * pe_name;
unsigned int * import_list;
char * c;
@@ -119,7 +118,7 @@
printf(" Name VSz Vaddr SzRaw Fileadr *Reloc *Lineum #Reloc #Linum Char\n");
for(i=0; i< wpnt->pe->pe_header->coff.NumberOfSections; i++)
{
- printf("%8s: %4.4x %8.8x %8.8x %8.8x %8.8x %8.8x %4.4x %4.4x %8.8x\n",
+ printf("%8s: %4.4lx %8.8lx %8.8lx %8.8lx %8.8lx %8.8lx %4.4x %4.4x %8.8lx\n",
wpnt->pe->pe_seg[i].Name,
wpnt->pe->pe_seg[i].Virtual_Size,
wpnt->pe->pe_seg[i].Virtual_Address,
diff --git a/loader/pe_resource.c b/loader/pe_resource.c
index d82789c..41fa92d 100644
--- a/loader/pe_resource.c
+++ b/loader/pe_resource.c
@@ -18,13 +18,15 @@
#include "peexe.h"
#include "dlls.h"
#include "resource.h"
+#include "stddebug.h"
+/* #define DEBUG_RESOURCE */
+/* #undef DEBUG_RESOURCE */
+#include "debug.h"
-#define DEBUG_RESOURCE
static int
find_lang(char *root, struct PE_Resource_Directory *resource, RESOURCE *r)
{
- int i;
struct PE_Directory_Entry *type_dir;
struct PE_Resource_Leaf_Entry *leaf;
@@ -33,10 +35,8 @@
/* grab the 1st resource available */
leaf = (struct PE_Resource_Leaf_Entry *) (root + type_dir->OffsetToData);
-#ifdef DEBUG_RESOURCE
- printf("\t\tPE_findlang: id %8x\n", (int) type_dir->Name);
- printf("\t\taddress %d, size %d, language id %d\n", leaf->OffsetToData, leaf->Size, leaf->CodePage);
-#endif
+ dprintf_resource(stddeb, "\t\tPE_findlang: id %8x\n", (int) type_dir->Name);
+ dprintf_resource(stddeb, "\t\taddress %ld, size %ld, language id %ld\n", leaf->OffsetToData, leaf->Size, leaf->CodePage);
r->offset = leaf->OffsetToData - r->wpnt->pe->resource_offset;
r->size = leaf->Size;
printf("\t\toffset %d, size %d\n", r->offset, r->size);
@@ -44,11 +44,10 @@
/* for(i=0; i< resource->NumberOfIdEntries; i++) {
leaf = (root + (type_dir->OffsetToData & ~IMAGE_RESOURCE_DATA_IS_DIRECTORY));
-#ifdef DEBUG_RESOURCE
- printf("\t\tPE_findlang: id %8x\n", (int) type_dir->Name);
- printf("\t\t%x %x %x\n", leaf->OffsetToData, leaf->Size,
- leaf->CodePage);
-#endif
+ dprintf_resource(stddeb, "\t\tPE_findlang: id %8x\n",
+ (int) type_dir->Name);
+ dprintf_resource(stddeb, "\t\t%x %x %x\n", leaf->OffsetToData,
+ leaf->Size, leaf->CodePage);
type_dir++;
} */
}
@@ -69,9 +68,7 @@
name = (struct PE_Directory_Name_String_U *)(root + (type_dir->Name & ~IMAGE_RESOURCE_NAME_IS_STRING));
memset(res_name, 0, sizeof(res_name));
my_wcstombs(res_name, name->NameString, name->Length);
-#ifdef DEBUG_RESOURCE
- printf("\tPE_findresource: name %s\n", res_name);
-#endif
+ dprintf_resource(stddeb, "\tPE_findresource: name %s\n", res_name);
if (strcasecmp(res_name, resource_name) == 0)
return find_lang(root, (struct PE_Resource_Directory *) (root + (type_dir->OffsetToData & ~IMAGE_RESOURCE_DATA_IS_DIRECTORY)), r);
type_dir++;
@@ -79,9 +76,7 @@
} else {
type_dir += resource->NumberOfNamedEntries;
for(i=0; i< resource->NumberOfIdEntries; i++) {
-#ifdef DEBUG_RESOURCE
- printf("\tPE_findresource: name %8x\n", (int) type_dir->Name);
-#endif
+ dprintf_resource(stddeb, "\tPE_findresource: name %8x\n", (int) type_dir->Name);
if (type_dir->Name == ((int) resource_name & 0xff))
return find_lang(root, (struct PE_Resource_Directory *) (root + (type_dir->OffsetToData & ~IMAGE_RESOURCE_DATA_IS_DIRECTORY)), r);
type_dir++;
@@ -107,9 +102,8 @@
name = (struct PE_Directory_Name_String_U *)(root + (type_dir->Name & ~IMAGE_RESOURCE_NAME_IS_STRING));
memset(res_name, 0, sizeof(res_name));
my_wcstombs(res_name, name->NameString, name->Length);
-#ifdef DEBUG_RESOURCE
- printf("PE_findtype: type %s\n", res_name);
-#endif
+ dprintf_resource(stddeb, "PE_findtype: type %s\n",
+ res_name);
if (strcasecmp(res_name, type_name) == 0)
return find_resource(root, (struct PE_Resource_Directory *) (root + (type_dir->OffsetToData & ~IMAGE_RESOURCE_DATA_IS_DIRECTORY)), resource_name, r);
type_dir++;
@@ -117,9 +111,7 @@
} else {
type_dir += resource->NumberOfNamedEntries;
for(i=0; i< resource->NumberOfIdEntries; i++) {
-#ifdef DEBUG_RESOURCE
- printf("PE_findtype: type %8x\n", (int) type_dir->Name);
-#endif
+ dprintf_resource(stddeb, "PE_findtype: type %8x\n", (int) type_dir->Name);
if (type_dir->Name == ((int) type_name & 0xff))
return find_resource(root, (struct PE_Resource_Directory *) (root + (type_dir->OffsetToData & ~IMAGE_RESOURCE_DATA_IS_DIRECTORY)), resource_name, r);
type_dir++;
@@ -135,10 +127,8 @@
PE_FindResource(HANDLE instance, LPSTR resource_name, LPSTR type_name,
RESOURCE *r)
{
-#ifdef DEBUG_RESOURCE
- printf("PE_FindResource hInst=%04X typename=%08X resname=%08X\n",
+ dprintf_resource(stddeb, "PE_FindResource hInst=%04X typename=%08X resname=%08X\n",
instance, (int) type_name, (int) resource_name);
-#endif
if (HIWORD((DWORD)resource_name))
if (resource_name[0] == '#')
resource_name = (LPSTR) atoi(resource_name + 1);
diff --git a/loader/resource.c b/loader/resource.c
index 867c783..f1ed5cb 100644
--- a/loader/resource.c
+++ b/loader/resource.c
@@ -19,10 +19,10 @@
#include "dlls.h"
#include "resource.h"
#include "stddebug.h"
-/* #define DEBUG_RESOURCE /* */
-/* #undef DEBUG_RESOURCE /* */
-/* #define DEBUG_ACCEL /* */
-/* #undef DEBUG_ACCEL /* */
+/* #define DEBUG_RESOURCE */
+/* #undef DEBUG_RESOURCE */
+/* #define DEBUG_ACCEL */
+/* #undef DEBUG_ACCEL */
#include "debug.h"
#define MIN(a,b) ((a) < (b) ? (a) : (b))
@@ -110,9 +110,8 @@
RESOURCE *r;
int image_size;
-#ifdef DEBUG_RESOURCE
- printf("AllocResource(%04X, %04X, %08X);\n", instance, hResInfo, (int) dwSize);
-#endif
+ dprintf_resource(stddeb, "AllocResource(%04X, %04X, %08X);\n",
+ instance, hResInfo, (int) dwSize);
if (instance == (HANDLE)NULL)
instance = hSysRes;
@@ -140,9 +139,8 @@
int fd;
RESOURCE *r;
-#ifdef DEBUG_RESOURCE
- printf("AccessResource(%04X, %04X);\n", instance, hResInfo);
-#endif
+ dprintf_resource(stddeb, "AccessResource(%04X, %04X);\n",
+ instance, hResInfo);
if (instance == (HANDLE)NULL)
instance = hSysRes;
@@ -165,9 +163,8 @@
RESOURCE *r;
int size;
-#ifdef DEBUG_RESOURCE
- printf("SizeofResource(%04X, %04X);\n", instance, hResInfo);
-#endif
+ dprintf_resource(stddeb, "SizeofResource(%04X, %04X);\n",
+ instance, hResInfo);
if (instance == (HANDLE)NULL)
instance = hSysRes;
@@ -191,9 +188,7 @@
void *image;
HANDLE h;
-#ifdef DEBUG_RESOURCE
- printf("LoadResource(%04X, %04X);\n", instance, hResInfo);
-#endif
+ dprintf_resource(stddeb, "LoadResource(%04X, %04X);\n", instance, hResInfo);
if (instance == (HANDLE)NULL)
instance = hSysRes;
@@ -233,9 +228,7 @@
{
RESOURCE *r, *rp;
-#ifdef DEBUG_RESOURCE
- printf("FreeResource: handle %04x\n", hResData);
-#endif
+ dprintf_resource(stddeb, "FreeResource: handle %04x\n", hResData);
for (r = rp = Top; r ; r = r->next) {
if (r->rsc_mem == hResData) {
@@ -269,9 +262,8 @@
HBITMAP hbitmap;
char * bits;
int i, size, n_colors;
-
+
n_colors = 1 << image->bcBitCount;
-
if (image->bcBitCount < 24)
{
size = sizeof(BITMAPINFOHEADER) + n_colors * sizeof(RGBQUAD);
@@ -337,10 +329,8 @@
if (instance == (HANDLE)NULL)
instance = hSysRes;
-#ifdef DEBUG_RESOURCE
- printf("RSC_LoadResource: instance = %04x, name = %08x, type = %08x\n",
+ dprintf_resource(stddeb, "RSC_LoadResource: instance = %04x, name = %08x, type = %08x\n",
instance, (int) rsc_name, (int) type);
-#endif
if ((hResInfo = FindResource(instance, rsc_name, (LPSTR) type)) == (HANDLE) NULL) {
return (HANDLE)NULL;
@@ -371,6 +361,7 @@
HDC hMemDC2;
HDC hdc;
int image_size;
+ HBITMAP hbmpOld1, hbmpOld2;
#ifdef DEBUG_RESOURCE
printf("LoadIcon(%04X", instance);
@@ -458,9 +449,11 @@
GlobalFree(rsc_mem);
hMemDC = CreateCompatibleDC(hdc);
hMemDC2 = CreateCompatibleDC(hdc);
- SelectObject(hMemDC, lpico->hBitmap);
- SelectObject(hMemDC2, lpico->hBitMask);
- BitBlt(hMemDC, 0, 0, bih->biWidth, bih->biHeight, hMemDC2, 0, 0, SRCINVERT);
+ hbmpOld1 = SelectObject(hMemDC, lpico->hBitmap);
+ hbmpOld2 = SelectObject(hMemDC2, lpico->hBitMask);
+ BitBlt(hMemDC, 0, 0, bih->biWidth, bih->biHeight, hMemDC2, 0, 0,SRCINVERT);
+ SelectObject( hMemDC, hbmpOld1 );
+ SelectObject( hMemDC2, hbmpOld2 );
DeleteDC(hMemDC);
DeleteDC(hMemDC2);
ReleaseDC(GetDesktopWindow(), hdc);
@@ -479,13 +472,11 @@
HICON hIcon;
ICONALLOC *lpico;
-#ifdef DEBUG_RESOURCE
- printf("CreateIcon: hInstance = %04x, nWidth = %08x, nHeight = %08x \n",
+ dprintf_resource(stddeb, "CreateIcon: hInstance = %04x, nWidth = %08x, nHeight = %08x \n",
hInstance, nWidth, nHeight);
- printf(" nPlanes = %04x, nBitsPixel = %04x,",nPlanes, nBitsPixel);
- printf(" lpANDbits= %04x, lpXORbits = %04x, \n", (int)lpANDbits,
+ dprintf_resource(stddeb, " nPlanes = %04x, nBitsPixel = %04x,",nPlanes, nBitsPixel);
+ dprintf_resource(stddeb, " lpANDbits= %04x, lpXORbits = %04x, \n", (int)lpANDbits,
(int)lpXORbits);
-#endif
if (hInstance == (HANDLE)NULL) {
printf("CreateIcon / hInstance %04x not Found!\n",hInstance);
@@ -522,9 +513,7 @@
}
GlobalUnlock(hIcon);
-#ifdef DEBUG_RESOURCE
- printf("CreateIcon Alloc hIcon=%X\n", hIcon);
-#endif
+ dprintf_resource(stddeb, "CreateIcon Alloc hIcon=%X\n", hIcon);
return hIcon;
}
@@ -612,9 +601,7 @@
msg->message != WM_KEYUP &&
msg->message != WM_CHAR) return 0;
-#ifdef DEBUG_ACCEL
- printf("TranslateAccelerators hAccel=%04X !\n", hAccel);
-#endif
+ dprintf_accel(stddeb, "TranslateAccelerators hAccel=%04X !\n", hAccel);
lpAccelTbl = (LPACCELHEADER)GlobalLock(hAccel);
for (i = 0; i < lpAccelTbl->wCount; i++) {
@@ -667,10 +654,8 @@
int string_num;
int i;
-#ifdef DEBUG_RESOURCE
- printf("LoadString: instance = %04x, id = %d, buffer = %08x, "
+ dprintf_resource(stddeb, "LoadString: instance = %04x, id = %d, buffer = %08x, "
"length = %d\n", instance, resource_id, (int) buffer, buflen);
-#endif
hmem = RSC_LoadResource(instance, (char *) ((resource_id >> 4) + 1),
(LPSTR) NE_RSCTYPE_STRING, &rsc_size);
@@ -760,7 +745,7 @@
return 0;
}
lp = (long *) GlobalLinearLock(rsc_mem);
- if (!(hdc = GetDC(0))) lp == NULL;
+ if (!(hdc = GetDC(0))) lp = NULL;
if (lp == NULL)
{
GlobalFree(rsc_mem);
diff --git a/loader/selector.c b/loader/selector.c
index b38feeb..eb17a27 100644
--- a/loader/selector.c
+++ b/loader/selector.c
@@ -29,10 +29,11 @@
#include "wine.h"
#include "windows.h"
#include "prototypes.h"
+#include "stddebug.h"
+/* #define DEBUG_SELECTORS */
+/* #undef DEBUG_SELECTORS */
#include "debug.h"
-/* #define DEBUG_SELECTORS /* */
-/* #undef DEBUG_SELECTORS /* */
#ifdef linux
#define DEV_ZERO
@@ -68,6 +69,9 @@
extern char **Argv;
extern int Argc;
extern char **environ;
+
+unsigned int
+GetEntryPointFromOrdinal(struct w_files * wpnt, int ordinal);
/**********************************************************************
* FindUnusedSelectors
@@ -160,7 +164,7 @@
*/
if (s_old->shm_key == -1)
{
- s_old->shm_key = shmget(IPC_PRIVATE, s_old->length, IPC_CREAT);
+ s_old->shm_key = shmget(IPC_PRIVATE, s_old->length, IPC_CREAT | 0600);
if (s_old->shm_key == -1)
{
if (s_new) {
@@ -232,7 +236,7 @@
*/
WORD AllocSelector(WORD old_selector)
{
- SEGDESC *s_new, *s_old;
+ SEGDESC *s_new;
int i_new, i_old;
int selector;
@@ -506,9 +510,8 @@
i = FindUnusedSelectors(n_segments);
-#ifdef DEBUG_SELECTORS
- fprintf(stddeb, "Using %d segments starting at index %d.\n", n_segments, i);
-#endif
+ dprintf_selectors(stddeb, "Using %d segments starting at index %d.\n",
+ n_segments, i);
/*
* Fill in selector info.
@@ -661,10 +664,6 @@
unsigned int
GetEntryPointFromOrdinal(struct w_files * wpnt, int ordinal)
{
- int fd = wpnt->fd;
- struct mz_header_s *mz_header = wpnt->mz_header;
- struct ne_header_s *ne_header = wpnt->ne->ne_header;
-
union lookup entry_tab_pointer;
struct entry_tab_header_s *eth;
struct entry_tab_movable_s *etm;
@@ -771,11 +770,9 @@
/*
* Display environment
*/
-#ifdef DEBUG_SELECTORS
- fprintf(stddeb, "Environment at %08.8x\n", s->base_addr);
+ dprintf_selectors(stddeb, "Environment at %08.8x\n", s->base_addr);
for (p = s->base_addr; *p; p += strlen(p) + 1)
- fprintf(stddeb, " %s\n", p);
-#endif
+ dprintf_selectors(stddeb, " %s\n", p);
return s;
}
@@ -848,7 +845,7 @@
int fd = wpnt->fd;
struct ne_segment_table_entry_s *seg_table = wpnt->ne->seg_table;
struct ne_header_s *ne_header = wpnt->ne->ne_header;
- SEGDESC *selectors, *s, *stmp;
+ SEGDESC *selectors, *s;
unsigned short auto_data_sel;
int contents, read_only;
int SelectorTableLength;
@@ -992,7 +989,6 @@
void
FixupFunctionPrologs(struct w_files * wpnt)
{
- struct mz_header_s *mz_header = wpnt->mz_header;
struct ne_header_s *ne_header = wpnt->ne->ne_header;
union lookup entry_tab_pointer;
struct entry_tab_header_s *eth;
@@ -1059,6 +1055,7 @@
DWORD GetSelectorBase(WORD wSelector)
{
fprintf(stdnimp, "GetSelectorBase(selector %4X) stub!\n", wSelector);
+ return 0;
}
/***********************************************************************
@@ -1066,7 +1063,7 @@
*/
void SetSelectorBase(WORD wSelector, DWORD dwBase)
{
- fprintf(stdnimp, "SetSelectorBase(selector %4X, base %8X) stub!\n",
+ fprintf(stdnimp, "SetSelectorBase(selector %4X, base %8lX) stub!\n",
wSelector, dwBase);
}
@@ -1085,7 +1082,7 @@
*/
void SetSelectorLimit(WORD wSelector, DWORD dwLimit)
{
- fprintf(stdnimp, "SetSelectorLimit(selector %4X, base %8X) stub!\n",
+ fprintf(stdnimp, "SetSelectorLimit(selector %4X, base %8lX) stub!\n",
wSelector, dwLimit);
}
diff --git a/loader/signal.c b/loader/signal.c
index 24256e4..aa5f467 100644
--- a/loader/signal.c
+++ b/loader/signal.c
@@ -4,6 +4,7 @@
#include <signal.h>
#include <errno.h>
#include <time.h>
+#include <setjmp.h>
#if defined(__NetBSD__) || defined(__FreeBSD__)
#include <sys/syscall.h>
@@ -102,6 +103,9 @@
{
#endif
unsigned char * instr;
+#if !(defined (linux) || defined (__NetBSD__))
+ int i, *dump;
+#endif
/* First take care of a few preliminaries */
#ifdef linux
@@ -132,7 +136,7 @@
{
#endif
fprintf(stderr,
- "Segmentation fault in Wine program (%x:%x)."
+ "Segmentation fault in Wine program (%x:%lx)."
" Please debug\n",
scp->sc_cs, scp->sc_eip);
goto oops;
@@ -195,7 +199,7 @@
XUngrabPointer(display, CurrentTime);
XUngrabServer(display);
XFlush(display);
- fprintf(stderr,"In win_fault %x:%x\n", scp->sc_cs, scp->sc_eip);
+ fprintf(stderr,"In win_fault %x:%lx\n", scp->sc_cs, scp->sc_eip);
#if defined(linux) || defined(__NetBSD__)
wine_debug(signal, scp); /* Enter our debugger */
#else
@@ -278,4 +282,34 @@
#endif
}
+static sigjmp_buf segv_jmpbuf;
+
+static void
+segv_handler()
+{
+ siglongjmp(segv_jmpbuf, 1);
+}
+
+int
+test_memory( char *p, int write )
+{
+ int ret = FALSE;
+ struct sigaction new_act;
+ struct sigaction old_act;
+
+ memset(&new_act, 0, sizeof new_act);
+ new_act.sa_handler = segv_handler;
+ if (sigsetjmp( segv_jmpbuf, 1 ) == 0) {
+ char c = 100;
+ if (sigaction(SIGSEGV, &new_act, &old_act) < 0)
+ perror("sigaction");
+ c = *p;
+ if (write)
+ *p = c;
+ ret = TRUE;
+ }
+ wine_sigaction(SIGSEGV, &old_act, NULL);
+ return ret;
+}
+
#endif /* ifndef WINELIB */
diff --git a/loader/task.c b/loader/task.c
index d43e404..693612f 100644
--- a/loader/task.c
+++ b/loader/task.c
@@ -12,13 +12,12 @@
#include "windows.h"
#include "wine.h"
#include "task.h"
+#include "stddebug.h"
+/* #define DEBUG_TASK */
+/* #undef DEBUG_TASK */
#include "debug.h"
-/* #define DEBUG_TASK /* */
-/* #undef DEBUG_TASK /* */
-
-
static LPWINETASKENTRY lpTaskList = NULL;
static int nTaskCount = 0;
@@ -29,18 +28,14 @@
{
LPWINETASKENTRY lpTask = lpTaskList;
int pid = getpid();
-#ifdef DEBUG_TASK
- fprintf(stddeb,"GetCurrentTask() // unix_pid=%08X !\n", pid);
-#endif
+ dprintf_task(stddeb,"GetCurrentTask() // unix_pid=%08X !\n", pid);
if (lpTask == NULL) return 0;
while (TRUE) {
if (lpTask->unix_pid == pid) break;
if (lpTask->lpNextTask == NULL) return 0;
lpTask = lpTask->lpNextTask;
}
-#ifdef DEBUG_TASK
- fprintf(stddeb,"GetCurrentTask() returned hTask=%04X !\n", lpTask->te.hTask);
-#endif
+ dprintf_task(stddeb,"GetCurrentTask() returned hTask=%04X !\n", lpTask->te.hTask);
return lpTask->te.hTask;
}
@@ -50,9 +45,7 @@
*/
WORD GetNumTasks()
{
-#ifdef DEBUG_TASK
- fprintf(stddeb,"GetNumTasks() returned %d !\n", nTaskCount);
-#endif
+ dprintf_task(stddeb,"GetNumTasks() returned %d !\n", nTaskCount);
return nTaskCount;
}
@@ -65,23 +58,17 @@
HWND *wptr;
int count;
LPWINETASKENTRY lpTask = lpTaskList;
-#ifdef DEBUG_TASK
- fprintf(stddeb,"GetWindowTask(%04X) !\n", hWnd);
-#endif
+ dprintf_task(stddeb,"GetWindowTask(%04X) !\n", hWnd);
while (lpTask != NULL) {
wptr = lpTask->lpWndList;
if (wptr != NULL) {
count = 0;
while (++count < MAXWIN_PER_TASK) {
-#ifdef DEBUG_TASK
- fprintf(stddeb,"GetWindowTask // searching %04X %04X !\n",
+ dprintf_task(stddeb,"GetWindowTask // searching %04X %04X !\n",
lpTask->te.hTask, *(wptr));
-#endif
if (*(wptr) == hWnd) {
-#ifdef DEBUG_TASK
- fprintf(stddeb,"GetWindowTask(%04X) found hTask=%04X !\n",
+ dprintf_task(stddeb,"GetWindowTask(%04X) found hTask=%04X !\n",
hWnd, lpTask->te.hTask);
-#endif
return lpTask->te.hTask;
}
wptr++;
@@ -102,30 +89,22 @@
BOOL bRet;
int count = 0;
LPWINETASKENTRY lpTask = lpTaskList;
-#ifdef DEBUG_TASK
- fprintf(stddeb,"EnumTaskWindows(%04X, %08X, %08X) !\n", hTask, lpEnumFunc, lParam);
-#endif
+ dprintf_task(stddeb,"EnumTaskWindows(%04X, %08X, %08X) !\n", hTask, lpEnumFunc, lParam);
while (TRUE) {
if (lpTask->te.hTask == hTask) break;
if (lpTask == NULL) {
-#ifdef DEBUG_TASK
- fprintf(stddeb,"EnumTaskWindows // hTask=%04X not found !\n", hTask);
-#endif
+ dprintf_task(stddeb,"EnumTaskWindows // hTask=%04X not found !\n", hTask);
return FALSE;
}
lpTask = lpTask->lpNextTask;
}
-#ifdef DEBUG_TASK
- fprintf(stddeb,"EnumTaskWindows // found hTask=%04X !\n", hTask);
-#endif
+ dprintf_task(stddeb,"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;
-#ifdef DEBUG_TASK
- fprintf(stddeb,"EnumTaskWindows // hWnd=%04X count=%d !\n", hWnd, count);
-#endif
+ dprintf_task(stddeb,"EnumTaskWindows // hWnd=%04X count=%d !\n", hWnd, count);
#ifdef WINELIB
bRet = (*lpEnumFunc)(hWnd, lParam);
#else
@@ -158,9 +137,7 @@
}
hTask = GlobalAlloc(GMEM_MOVEABLE, sizeof(WINETASKENTRY));
lpNewTask = (LPWINETASKENTRY) GlobalLock(hTask);
-#ifdef DEBUG_TASK
- fprintf(stddeb,"CreateNewTask entry allocated %08X\n", lpNewTask);
-#endif
+ dprintf_task(stddeb,"CreateNewTask entry allocated %08X\n", lpNewTask);
if (lpNewTask == NULL) return 0;
if (lpTaskList == NULL) {
lpTaskList = lpNewTask;
@@ -191,10 +168,8 @@
lpNewTask->lpWndList = (HWND *) malloc(MAXWIN_PER_TASK * sizeof(HWND));
if (lpNewTask->lpWndList != NULL)
memset((LPSTR)lpNewTask->lpWndList, 0, MAXWIN_PER_TASK * sizeof(HWND));
-#ifdef DEBUG_TASK
- fprintf(stddeb,"CreateNewTask // unix_pid=%08X return hTask=%04X\n",
+ dprintf_task(stddeb,"CreateNewTask // unix_pid=%08X return hTask=%04X\n",
lpNewTask->unix_pid, hTask);
-#endif
GlobalUnlock(hTask);
nTaskCount++;
return hTask;
@@ -209,9 +184,7 @@
HWND *wptr;
int count = 0;
LPWINETASKENTRY lpTask = lpTaskList;
-#ifdef DEBUG_TASK
- fprintf(stddeb,"AddWindowToTask(%04X, %04X); !\n", hTask, hWnd);
-#endif
+ dprintf_task(stddeb,"AddWindowToTask(%04X, %04X); !\n", hTask, hWnd);
while (TRUE) {
if (lpTask->te.hTask == hTask) break;
if (lpTask == NULL) {
@@ -227,9 +200,7 @@
wptr++;
}
*wptr = hWnd;
-#ifdef DEBUG_TASK
- fprintf(stddeb,"AddWindowToTask // window added, count=%d !\n", count);
-#endif
+ dprintf_task(stddeb,"AddWindowToTask // window added, count=%d !\n", count);
return TRUE;
}
@@ -242,9 +213,7 @@
HWND *wptr;
int count = 0;
LPWINETASKENTRY lpTask = lpTaskList;
-#ifdef DEBUG_TASK
- fprintf(stddeb,"RemoveWindowToTask(%04X, %04X); !\n", hTask, hWnd);
-#endif
+ dprintf_task(stddeb,"RemoveWindowFromTask (%04X, %04X); !\n", hTask, hWnd);
while (TRUE) {
if (lpTask->te.hTask == hTask) break;
if (lpTask == NULL) {
@@ -264,17 +233,13 @@
if (++count >= MAXWIN_PER_TASK) return FALSE;
wptr++;
}
-#ifdef DEBUG_TASK
- fprintf(stddeb,"RemoveWindowFromTask // window removed, count=%d !\n", --count);
-#endif
+ dprintf_task(stddeb,"RemoveWindowFromTask // window removed, count=%d !\n", --count);
return TRUE;
}
BOOL TaskFirst(LPTASKENTRY lpTask)
{
-#ifdef DEBUG_TASK
- fprintf(stddeb,"TaskFirst(%8x)\n", (int) lpTask);
-#endif
+ dprintf_task(stddeb,"TaskFirst(%8x)\n", (int) lpTask);
if (lpTaskList) {
memcpy(lpTask, &lpTaskList->te, lpTask->dwSize);
return TRUE;
@@ -285,9 +250,7 @@
BOOL TaskNext(LPTASKENTRY lpTask)
{
LPWINETASKENTRY list;
-#ifdef DEBUG_TASK
- fprintf(stddeb,"TaskNext(%8x)\n", (int) lpTask);
-#endif
+ dprintf_task(stddeb,"TaskNext(%8x)\n", (int) lpTask);
list = lpTaskList;
while (list) {
if (list->te.hTask == lpTask->hTask) {
@@ -306,9 +269,7 @@
BOOL TaskFindHandle(LPTASKENTRY lpTask, HTASK hTask)
{
static LPWINETASKENTRY list;
-#ifdef DEBUG_TASK
- fprintf(stddeb,"TaskFindHandle(%8x,%4x)\n", (int) lpTask, hTask);
-#endif
+ dprintf_task(stddeb,"TaskFindHandle(%8x,%4x)\n", (int) lpTask, hTask);
list = lpTaskList;
while (list) {
if (list->te.hTask == hTask) {
diff --git a/memory/global.c b/memory/global.c
index 8ab7d2e..9450c95 100644
--- a/memory/global.c
+++ b/memory/global.c
@@ -196,9 +196,15 @@
g = GlobalGetFreeSegments(flags, segments);
if (g == NULL)
+ {
+ dprintf_heap(stddeb, "==> NULL\n");
return 0;
+ }
else
+ {
+ dprintf_heap(stddeb, "==> %04x\n",g->handle);
return g->handle;
+ }
}
/*
* Otherwise we just need a little piece of a segment.
@@ -226,7 +232,10 @@
{
g = GlobalGetFreeSegments(0, 1);
if (g == NULL)
+ {
+ dprintf_heap(stddeb, "==> Null\n");
return 0;
+ }
g->handle = 0;
g->sequence = 0;
@@ -235,7 +244,10 @@
m = HEAP_Alloc((MDESC **) g->addr, flags & GLOBAL_FLAGS_ZEROINIT,
size);
if (m == NULL)
+ {
+ dprintf_heap(stddeb, "==> Null\n");
return 0;
+ }
}
/*
@@ -449,7 +461,7 @@
if (g->handle == selector)
{
if (g->sequence > 0)
- return g->handle;
+ return MAKELONG(g->handle, selector);
else
{
fprintf(stderr, "Attempt to get a handle "
@@ -458,7 +470,7 @@
}
}
}
-
+ dprintf_heap(stddeb, "GlobalHandle ==> Null\n");
return 0;
}
@@ -820,6 +832,65 @@
*/
LONG SetSwapAreaSize( WORD size )
{
- printf( "STUB: SetSwapAreaSize(%d)\n", size );
+ dprintf_heap(stdnimp, "STUB: SetSwapAreaSize(%d)\n", size );
return MAKELONG( size, 0xffff );
}
+
+/***********************************************************************
+ * IsBadCodePtr (KERNEL.336)
+ */
+BOOL IsBadCodePtr( FARPROC lpfn )
+{
+ printf( "STUB: IsBadCodePtr(%p)\n", lpfn );
+ return FALSE;
+}
+
+/***********************************************************************
+ * IsBadHugeWritePtr (KERNEL.347)
+ */
+BOOL IsBadHugeWritePtr( const char *lp, DWORD cb )
+{
+ return !test_memory(&lp[cb-1], TRUE);
+}
+
+/***********************************************************************
+ * IsBadWritePtr (KERNEL.335)
+ */
+BOOL IsBadWritePtr( const char *lp, DWORD cb )
+{
+ if ((0xffff & (unsigned int) lp) + cb > 0xffff)
+ return TRUE;
+ return !test_memory(&lp[cb-1], TRUE);
+}
+
+/***********************************************************************
+ * IsBadReadPtr (KERNEL.334)
+ */
+BOOL IsBadReadPtr( const char *lp, DWORD cb )
+{
+ if ((0xffff & (unsigned int) lp) + cb > 0xffff)
+ return TRUE;
+ return !test_memory(&lp[cb-1], FALSE);
+}
+
+/***********************************************************************
+ * IsBadHugeReadPtr (KERNEL.346)
+ */
+BOOL IsBadHugeReadPtr( const char *lp, DWORD cb )
+{
+ if ((0xffff & (unsigned int) lp) + cb > 0xffff)
+ return TRUE;
+ return !test_memory(&lp[cb-1], FALSE);
+}
+
+/***********************************************************************
+ * IsBadStringPtr (KERNEL.337)
+ */
+BOOL IsBadStringPtr( const char *lp, UINT cb )
+{
+ if (!IsBadReadPtr(lp, cb+1))
+ return FALSE;
+ if (lp[cb])
+ return FALSE;
+ return TRUE;
+}
diff --git a/memory/linear.c b/memory/linear.c
index 1bceeaa..1ebb17b 100644
--- a/memory/linear.c
+++ b/memory/linear.c
@@ -164,7 +164,7 @@
}
/**********************************************************************/
-LinearTest()
+void LinearTest()
{
#if 0
unsigned int handle;
diff --git a/misc/Imakefile b/misc/Imakefile
index 3bd175fd..c5bdec9 100644
--- a/misc/Imakefile
+++ b/misc/Imakefile
@@ -7,6 +7,7 @@
atom.c \
clipboard.c \
comm.c \
+ commdlg.c \
dos_fs.c \
driver.c \
exec.c \
@@ -15,8 +16,10 @@
keyboard.c \
lstr.c \
main.c \
+ mcianim.c \
mcicda.c \
message.c \
+ midi.c \
mmaux.c \
mmsystem.c \
network.c \
diff --git a/misc/audio.c b/misc/audio.c
index 1aad3cd..42e63ee 100644
--- a/misc/audio.c
+++ b/misc/audio.c
@@ -1,4 +1,4 @@
-/*
+/*
* Sample Wine Driver for Linux
*
* Copyright 1994 Martin Ayotte
@@ -11,6 +11,8 @@
#ifdef BUILTIN_MMSYSTEM
+#define EMULATE_SB16
+
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
@@ -344,7 +346,7 @@
end = lpParms->dwTo;
dprintf_mciwave(stddeb,"WAVE_mciPlay // MCI_TO=%d \n", end);
}
-/*
+/**/
if (dwFlags & MCI_NOTIFY) {
dprintf_mciwave(stddeb,
"WAVE_mciPlay // MCI_NOTIFY %08X !\n", lpParms->dwCallback);
@@ -360,7 +362,7 @@
return 0;
}
}
-*/
+/**/
lpWaveHdr = &MCIWavDev[wDevID].WaveHdr;
lpWaveHdr->lpData = (LPSTR) malloc(64000);
lpWaveHdr->dwBufferLength = 32000;
@@ -719,7 +721,7 @@
lpParms->dwReturn = TRUE;
break;
case MCI_GETDEVCAPS_CAN_SAVE:
- lpParms->dwReturn = FALSE;
+ lpParms->dwReturn = TRUE;
break;
case MCI_WAVE_GETDEVCAPS_INPUTS:
lpParms->dwReturn = 1;
@@ -752,7 +754,8 @@
lpParms->lpstrReturn = "Linux Sound System 0.5";
break;
case MCI_INFO_FILE:
- lpParms->lpstrReturn = "FileName";
+ lpParms->lpstrReturn =
+ (LPSTR)MCIWavDev[wDevID].openParms.lpstrElementName;
break;
case MCI_WAVE_INPUT:
lpParms->lpstrReturn = "Linux Sound System 0.5";
@@ -793,12 +796,19 @@
if (lpCaps == NULL) return MMSYSERR_NOTENABLED;
audio = open (SOUND_DEV, O_WRONLY, 0);
if (audio == -1) return MMSYSERR_NOTENABLED;
- lpCaps->wMid = 0xFF; /* Manufac ID */
- lpCaps->wPid = 0x01; /* Product ID */
- strcpy(lpCaps->szPname, "Linux WAV Driver");
- lpCaps->dwFormats = 0;
- lpCaps->dwSupport = 0;
+#ifdef EMULATE_SB16
+ lpCaps->wMid = 0x0002;
+ lpCaps->wPid = 0x0104;
+ strcpy(lpCaps->szPname, "SB16 Wave Out");
+#else
+ lpCaps->wMid = 0x00FF; /* Manufac ID */
+ lpCaps->wPid = 0x0001; /* Product ID */
+ strcpy(lpCaps->szPname, "Linux WAVOUT Driver");
+#endif
+ lpCaps->dwFormats = 0x00000000;
+ lpCaps->dwSupport = WAVECAPS_VOLUME;
lpCaps->wChannels = (IOCTL(audio, SNDCTL_DSP_STEREO, dsp_stereo) != 0) ? 1 : 2;
+ if (lpCaps->wChannels > 1) lpCaps->dwSupport |= WAVECAPS_LRVOLUME;
bytespersmpl = (IOCTL(audio, SNDCTL_DSP_SAMPLESIZE, samplesize) != 0) ? 1 : 2;
smplrate = 44100;
if (IOCTL(audio, SNDCTL_DSP_SPEED, smplrate) == 0) {
@@ -1223,10 +1233,16 @@
if (lpCaps == NULL) return MMSYSERR_NOTENABLED;
audio = open (SOUND_DEV, O_RDONLY, 0);
if (audio == -1) return MMSYSERR_NOTENABLED;
- lpCaps->wMid = 0xFF; /* Manufac ID */
- lpCaps->wPid = 0x01; /* Product ID */
- strcpy(lpCaps->szPname, "Linux WAV Driver");
- lpCaps->dwFormats = 0;
+#ifdef EMULATE_SB16
+ lpCaps->wMid = 0x0002;
+ lpCaps->wPid = 0x0004;
+ strcpy(lpCaps->szPname, "SB16 Wave Out");
+#else
+ lpCaps->wMid = 0x00FF; /* Manufac ID */
+ lpCaps->wPid = 0x0001; /* Product ID */
+ strcpy(lpCaps->szPname, "Linux WAVIN Driver");
+#endif
+ lpCaps->dwFormats = 0x00000000;
lpCaps->wChannels = (IOCTL(audio, SNDCTL_DSP_STEREO, dsp_stereo) != 0) ? 1 : 2;
bytespersmpl = (IOCTL(audio, SNDCTL_DSP_SAMPLESIZE, samplesize) != 0) ? 1 : 2;
smplrate = 44100;
@@ -1681,26 +1697,4 @@
}
-/*-----------------------------------------------------------------------*/
-
-
-
-/**************************************************************************
-* midMessage [sample driver]
-*/
-DWORD midMessage(WORD wDevID, WORD wMsg, DWORD dwUser,
- DWORD dwParam1, DWORD dwParam2)
-{
- return MMSYSERR_NOTENABLED;
-}
-
-/**************************************************************************
-* modMessage [sample driver]
-*/
-DWORD modMessage(WORD wDevID, WORD wMsg, DWORD dwUser,
- DWORD dwParam1, DWORD dwParam2)
-{
- return MMSYSERR_NOTENABLED;
-}
-
#endif /* #ifdef BUILTIN_MMSYSTEM */
diff --git a/misc/clipboard.c b/misc/clipboard.c
index ad2d99a..3910314 100644
--- a/misc/clipboard.c
+++ b/misc/clipboard.c
@@ -13,6 +13,8 @@
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
+#include <X11/Xlib.h>
+#include <X11/Xatom.h>
#include "prototypes.h"
#include "heap.h"
#include "win.h"
@@ -35,6 +37,8 @@
static HWND hWndClipboardOwner = 0;
static HWND hWndViewer = 0;
static WORD LastRegFormat = 0xC000;
+static Bool wait_for_selection = False;
+static Bool wineOwnsSelection = False;
CLIPFORMAT ClipFormats[12] = {
{ CF_TEXT, 1, "Text", (HANDLE)NULL, 0, NULL, &ClipFormats[1] },
@@ -91,6 +95,11 @@
}
lpFormat = lpFormat->NextFormat;
}
+ if(wineOwnsSelection){
+ dprintf_clipboard(stddeb,"Losing selection\n");
+ wineOwnsSelection=False;
+ XSetSelectionOwner(display,XA_PRIMARY,None,CurrentTime);
+ }
return TRUE;
}
@@ -119,6 +128,11 @@
if (lpFormat->wFormatID == wFormat) break;
lpFormat = lpFormat->NextFormat;
}
+ /* doc says we shouldn't use CurrentTime */
+ /* should we become owner of CLIPBOARD as well? */
+ XSetSelectionOwner(display,XA_PRIMARY,WIN_GetXWindow(hWndClipboardOwner),CurrentTime);
+ wineOwnsSelection = True;
+ dprintf_clipboard(stddeb,"Getting selection\n");
if (lpFormat->hData != 0) GlobalFree(lpFormat->hData);
lpFormat->hData = hData;
return lpFormat->hData;
@@ -132,6 +146,15 @@
{
LPCLIPFORMAT lpFormat = ClipFormats;
dprintf_clipboard(stddeb,"GetClipboardData(%04X) !\n", wFormat);
+ if(wFormat == CF_TEXT && !wineOwnsSelection)
+ { wait_for_selection=True;
+ dprintf_clipboard(stddeb,"Requesting selection\n");
+ XConvertSelection(display,XA_PRIMARY,XA_STRING,
+ XInternAtom(display,"PRIMARY_TEXT",False),
+ WIN_GetXWindow(hWndClipboardOwner),CurrentTime);
+ /* TODO: need time-out for broken clients */
+ while(wait_for_selection)MSG_WaitXEvent(-1);
+ }
while(TRUE) {
if (lpFormat == NULL) return 0;
if (lpFormat->wFormatID == wFormat) break;
@@ -289,6 +312,8 @@
{
LPCLIPFORMAT lpFormat = ClipFormats;
dprintf_clipboard(stddeb,"IsClipboardFormatAvailable(%04X) !\n", wFormat);
+ if(wFormat == CF_TEXT) /* obtain selection as text if possible */
+ return GetClipboardData(CF_TEXT)!=0;
while(TRUE) {
if (lpFormat == NULL) return FALSE;
if (lpFormat->wFormatID == wFormat) break;
@@ -319,4 +344,62 @@
}
+/**************************************************************************
+ * CLIPBOARD_ReadSelection
+ *
+ * The current selection owner has set prop at our window w
+ * Transfer the property contents into the Clipboard
+ */
+void CLIPBOARD_ReadSelection(Window w,Atom prop)
+{
+ HANDLE hText;
+ LPCLIPFORMAT lpFormat = ClipFormats;
+ if(prop==None)hText=NULL;
+ else{
+ Atom atype=None;
+ int aformat;
+ unsigned long nitems,remain;
+ unsigned char *val=NULL;
+ dprintf_clipboard(stddeb,"Received prop %s\n",XGetAtomName(display,prop));
+ /* TODO: Properties longer than 64K */
+ if(XGetWindowProperty(display,w,prop,0,0x3FFF,True,XA_STRING,
+ &atype, &aformat, &nitems, &remain, &val)!=Success)
+ printf("couldn't read property\n");
+ dprintf_clipboard(stddeb,"Type %s,Format %d,nitems %d,value %s\n",
+ XGetAtomName(display,atype),aformat,nitems,val);
+ if(atype!=XA_STRING || aformat!=8){
+ fprintf(stderr,"Property not set\n");
+ hText=NULL;
+ } else {
+ dprintf_clipboard(stddeb,"Selection is %s\n",val);
+ hText=GlobalAlloc(GMEM_MOVEABLE, nitems);
+ memcpy(GlobalLock(hText),val,nitems+1);
+ GlobalUnlock(hText);
+ }
+ XFree(val);
+ }
+ while(TRUE) {
+ if (lpFormat == NULL) return;
+ if (lpFormat->wFormatID == CF_TEXT) break;
+ lpFormat = lpFormat->NextFormat;
+ }
+ if (lpFormat->hData != 0) GlobalFree(lpFormat->hData);
+ wait_for_selection=False;
+ lpFormat->hData = hText;
+ dprintf_clipboard(stddeb,"Received selection\n");
+}
+/**************************************************************************
+ * CLIPBOARD_ReleaseSelection
+ *
+ * Wine lost the primary selection.
+ * Empty the clipboard, but don't set the current owner to None.
+ * Make sure current get/put attempts fail.
+ */
+void CLIPBOARD_ReleaseSelection(HWND hwnd)
+{
+ wineOwnsSelection=False;
+ OpenClipboard(hwnd);
+ EmptyClipboard();
+ CloseClipboard();
+}
diff --git a/misc/comm.c b/misc/comm.c
index 930a5f1..00a0d6a 100644
--- a/misc/comm.c
+++ b/misc/comm.c
@@ -29,55 +29,62 @@
struct DosDeviceStruct COM[MAX_PORTS];
struct DosDeviceStruct LPT[MAX_PORTS];
-void Comm_DeInit(void);
-
void Comm_Init(void)
{
- int x, serial = 0, parallel = 0;
- char option[10], temp[256];
+ int x;
+ char option[10], temp[256], *btemp;
struct stat st;
for (x=0; x!=MAX_PORTS; x++) {
strcpy(option,"COMx");
- option[3] = '0' + x;
+ option[3] = '1' + x;
option[4] = '\0';
GetPrivateProfileString("serialports", option, "*", temp, sizeof(temp), WINE_INI);
if (!strcmp(temp, "*") || *temp == '\0')
- COM[serial].devicename = NULL;
+ COM[x].devicename = NULL;
else {
+ btemp = index(temp,',');
+ if (btemp != NULL) {
+ *btemp++ = '\0';
+ COM[x].baudrate = atoi(btemp);
+ } else {
+ COM[x].baudrate = -1;
+ }
stat(temp, &st);
if (!S_ISCHR(st.st_mode))
- fprintf(stderr,"comm: can 't use `%s' as COM%d !\n", temp, x);
+ fprintf(stderr,"comm: can 't use `%s' as %s !\n", temp, option);
else
- if ((COM[serial].devicename = malloc(strlen(temp)+1)) == NULL)
+ if ((COM[x].devicename = malloc(strlen(temp)+1)) == NULL)
fprintf(stderr,"comm: can't malloc for device info!\n");
else {
- COM[serial].fd = 0;
- strcpy(COM[serial].devicename, temp);
- serial++;
+ COM[x].fd = 0;
+ strcpy(COM[x].devicename, temp);
}
- }
+ dprintf_comm(stddeb,
+ "Comm_Init: %s = %s\n", option, COM[x].devicename);
+ }
strcpy(option, "LPTx");
- option[3] = '0' + x;
+ option[3] = '1' + x;
option[4] = '\0';
GetPrivateProfileString("parallelports", option, "*", temp, sizeof(temp), WINE_INI);
if (!strcmp(temp, "*") || *temp == '\0')
- LPT[parallel].devicename = NULL;
+ LPT[x].devicename = NULL;
else {
stat(temp, &st);
if (!S_ISCHR(st.st_mode))
- fprintf(stderr,"comm: can 't use `%s' as LPT%d !\n", temp, x);
+ fprintf(stderr,"comm: can 't use `%s' as %s !\n", temp, option);
else
- if ((LPT[parallel].devicename = malloc(strlen(temp)+1)) == NULL)
+ if ((LPT[x].devicename = malloc(strlen(temp)+1)) == NULL)
fprintf(stderr,"comm: can't malloc for device info!\n");
else {
- LPT[parallel].fd = 0;
- strcpy(LPT[parallel].devicename, temp);
- parallel++;
+ LPT[x].fd = 0;
+ strcpy(LPT[x].devicename, temp);
}
+ dprintf_comm(stddeb,
+ "Comm_Init: %s = %s\n", option, LPT[x].devicename);
}
}
@@ -128,7 +135,7 @@
int WinError(void)
{
- perror("comm");
+ dprintf_comm(stddeb, "WinError: errno = %d\n", errno);
switch (errno) {
default:
return CE_IOE;
@@ -175,8 +182,11 @@
strcpy(temp,device+5);
ptr = strtok(temp, ",");
- dprintf_comm(stddeb,"BuildCommDCB: baudrate (%s)\n", ptr);
- lpdcb->BaudRate = atoi(ptr);
+ if (COM[port].baudrate > 0)
+ lpdcb->BaudRate = COM[port].baudrate;
+ else
+ lpdcb->BaudRate = atoi(ptr);
+ dprintf_comm(stddeb,"BuildCommDCB: baudrate (%d)\n", lpdcb->BaudRate);
ptr = strtok(NULL, ",");
if (islower(*ptr))
@@ -243,6 +253,9 @@
commerror = IE_BADID;
}
+ dprintf_comm(stddeb,
+ "OpenComm: %s = %s\n", device, COM[port].devicename);
+
if (!ValidCOMPort(port)) {
commerror = IE_BADID;
return -1;
@@ -251,7 +264,7 @@
return COM[port].fd;
}
- fd = open(COM[port].devicename, O_RDWR | O_NONBLOCK, 0);
+ fd = open(COM[port].devicename, O_RDWR | O_NONBLOCK);
if (fd == -1) {
commerror = WinError();
return -1;
@@ -344,13 +357,13 @@
break;
case GETMAXCOM:
- for (max = 0;COM[max].devicename;max++)
+ for (max = MAX_PORTS;!COM[max].devicename;max--)
;
return max;
break;
case GETMAXLPT:
- for (max = 0;LPT[max].devicename;max++)
+ for (max = MAX_PORTS;!LPT[max].devicename;max--)
;
return 0x80 + max;
break;
@@ -425,9 +438,13 @@
int GetCommError(int fd, COMSTAT FAR *lpStat)
{
+ int temperror;
+
dprintf_comm(stddeb,
"GetCommError: fd %d (current error %d)\n", fd, commerror);
- return(commerror);
+ temperror = commerror;
+ commerror = 0;
+ return(temperror);
}
UINT FAR* SetCommEventMask(int fd, UINT fuEvtMask)
@@ -449,6 +466,7 @@
int SetCommState(DCB FAR *lpdcb)
{
struct termios port;
+ struct DosDeviceStruct *ptr;
dprintf_comm(stddeb,
"SetCommState: fd %d, ptr %d\n", lpdcb->Id, (long) lpdcb);
@@ -471,6 +489,12 @@
port.c_lflag &= ~(ICANON|ECHO|ISIG);
port.c_lflag |= NOFLSH;
+ if ((ptr = GetDeviceStruct(lpdcb->Id)) == NULL) {
+ commerror = IE_BADID;
+ return -1;
+ }
+ if (ptr->baudrate > 0)
+ lpdcb->BaudRate = ptr->baudrate;
dprintf_comm(stddeb,"SetCommState: baudrate %d\n",lpdcb->BaudRate);
#ifdef CBAUD
port.c_cflag &= ~CBAUD;
@@ -823,9 +847,14 @@
status = read(fd, (void *) lpvBuf, cbRead);
if (status == -1) {
- commerror = WinError();
- return -1 - length;
- } else {
+ if (errno != EAGAIN) {
+ commerror = WinError();
+ return -1 - length;
+ } else {
+ commerror = 0;
+ return length;
+ }
+ } else {
commerror = 0;
return length + status;
}
diff --git a/misc/commdlg.c b/misc/commdlg.c
new file mode 100644
index 0000000..aa1614b
--- /dev/null
+++ b/misc/commdlg.c
@@ -0,0 +1,1127 @@
+/*
+ * COMMDLG functions
+ *
+ * Copyright 1994 Martin Ayotte
+ */
+static char Copyright[] = "Copyright Martin Ayotte, 1994";
+
+/*
+#define DEBUG_OPENDLG
+#define DEBUG_OPENDLG_DRAW
+*/
+
+#include "stdio.h"
+#include "dialog.h"
+#include "win.h"
+#include "user.h"
+#include "message.h"
+#include "heap.h"
+#include "commdlg.h"
+#include "dlgs.h"
+
+#define OPENFILEDLG2 11
+#define SAVEFILEDLG2 12
+
+
+extern HINSTANCE hSysRes;
+static DWORD CommDlgLastError = 0;
+
+static HBITMAP hFolder = 0;
+static HBITMAP hFolder2 = 0;
+static HBITMAP hFloppy = 0;
+static HBITMAP hHDisk = 0;
+static HBITMAP hCDRom = 0;
+
+int DOS_GetDefaultDrive(void);
+void DOS_SetDefaultDrive(int drive);
+char *DOS_GetCurrentDir(int drive);
+int DOS_ChangeDir(int drive, char *dirname);
+
+BOOL FileDlg_Init(HWND hWnd, DWORD lParam);
+BOOL OpenDlg_ScanFiles(HWND hWnd, WORD nDrive, LPSTR newPath, LPSTR fileSpec);
+BOOL OpenDlg_ScanDir(HWND hWnd, WORD nDrive, LPSTR newPath, LPSTR fileSpec);
+LPSTR OpenDlg_GetFileType(LPCSTR types, WORD index);
+LPSTR OpenDlg_ExtractCurDir(LPSTR FullPath, short MaxLen);
+BOOL FileOpenDlgProc(HWND hWnd, WORD wMsg, WORD wParam, LONG lParam);
+BOOL FileSaveDlgProc(HWND hWnd, WORD wMsg, WORD wParam, LONG lParam);
+BOOL ColorDlgProc(HWND hWnd, WORD wMsg, WORD wParam, LONG lParam);
+BOOL PrintDlgProc(HWND hWnd, WORD wMsg, WORD wParam, LONG lParam);
+BOOL PrintSetupDlgProc(HWND hWnd, WORD wMsg, WORD wParam, LONG lParam);
+BOOL ReplaceTextDlgProc(HWND hWnd, WORD wMsg, WORD wParam, LONG lParam);
+BOOL FindTextDlgProc(HWND hWnd, WORD wMsg, WORD wParam, LONG lParam);
+
+/***********************************************************************
+ * GetOpenFileName [COMMDLG.1]
+ */
+BOOL GetOpenFileName(LPOPENFILENAME lpofn)
+{
+ HANDLE hDlgTmpl;
+ HANDLE hResInfo;
+ HINSTANCE hInst;
+ WND *wndPtr;
+ BOOL bRet;
+ printf("GetOpenFileName(%08X); !\n", lpofn);
+ if (lpofn == NULL) return FALSE;
+ printf("GetOpenFileName // Flags=%08X !\n", lpofn->Flags);
+ printf("GetOpenFileName // nMaxFile=%d lpstrFile='%s' !\n",
+ lpofn->nMaxFile, lpofn->lpstrFile);
+ printf("GetOpenFileName // lpstrInitialDir='%s' !\n", lpofn->lpstrInitialDir);
+ printf("GetOpenFileName // lpstrFilter=%08X !\n", lpofn->lpstrFilter);
+ printf("GetOpenFileName // nFilterIndex=%d !\n", lpofn->nFilterIndex);
+ if (lpofn->Flags & OFN_ENABLETEMPLATEHANDLE) {
+ hDlgTmpl = lpofn->hInstance;
+ }
+ else {
+ if (lpofn->Flags & OFN_ENABLETEMPLATE) {
+ printf("GetOpenFileName // avant FindResource hInstance=%04X lpTemplateName='%s' !\n",
+ lpofn->hInstance, lpofn->lpTemplateName);
+ hInst = lpofn->hInstance;
+ hResInfo = FindResource(hInst,
+ (LPSTR)lpofn->lpTemplateName, RT_DIALOG);
+ }
+ else {
+ printf("GetOpenFileName // avant FindResource hSysRes=%04X !\n", hSysRes);
+ hInst = hSysRes;
+ hResInfo = FindResource(hInst, MAKEINTRESOURCE(OPENFILEDLG2), RT_DIALOG);
+ }
+ if (hResInfo == 0) {
+ CommDlgLastError = CDERR_FINDRESFAILURE;
+ return FALSE;
+ }
+ printf("GetOpenFileName // apres FindResource hResInfo=%04X!\n", hResInfo);
+ hDlgTmpl = LoadResource(hInst, hResInfo);
+ }
+ if (hDlgTmpl == 0) {
+ CommDlgLastError = CDERR_LOADRESFAILURE;
+ return FALSE;
+ }
+ printf("GetOpenFileName // apres LoadResource hDlgTmpl=%04X!\n", hDlgTmpl);
+ wndPtr = WIN_FindWndPtr(lpofn->hwndOwner);
+ bRet = DialogBoxIndirectParam(wndPtr->hInstance, hDlgTmpl,
+ lpofn->hwndOwner, (WNDPROC)FileOpenDlgProc, (DWORD)lpofn);
+
+/* strcpy(lpofn->lpstrFile, "SETUP.TXT"); */
+/* strcpy(lpofn->lpstrFileTitle, "SETUP.TXT");*/
+/*
+ lpofn->nFileOffset = 0;
+ lpofn->nFileExtension = strlen(lpofn->lpstrFile) - 3;
+ bRet = TRUE;
+*/
+ printf("GetOpenFileName // return lpstrFile='%s' !\n", lpofn->lpstrFile);
+ return bRet;
+}
+
+
+/***********************************************************************
+ * GetSaveFileName [COMMDLG.2]
+ */
+BOOL GetSaveFileName(LPOPENFILENAME lpofn)
+{
+ HANDLE hDlgTmpl;
+ HANDLE hResInfo;
+ HINSTANCE hInst;
+ WND *wndPtr;
+ BOOL bRet;
+ printf("GetSaveFileName(%08X); !\n", lpofn);
+ if (lpofn == NULL) return FALSE;
+ printf("GetSaveFileName // Flags=%08X !\n", lpofn->Flags);
+ printf("GetSaveFileName // nMaxFile=%d lpstrFile='%s' !\n",
+ lpofn->nMaxFile, lpofn->lpstrFile);
+ printf("GetSaveFileName // lpstrInitialDir='%s' !\n", lpofn->lpstrInitialDir);
+ printf("GetSaveFileName // lpstrFilter=%08X !\n", lpofn->lpstrFilter);
+ if (lpofn->Flags & OFN_ENABLETEMPLATEHANDLE) {
+ hDlgTmpl = lpofn->hInstance;
+ }
+ else {
+ if (lpofn->Flags & OFN_ENABLETEMPLATE) {
+ printf("GetSaveFileName // avant FindResource lpTemplateName='%s' !\n",
+ lpofn->lpTemplateName);
+ hInst = lpofn->hInstance;
+ hResInfo = FindResource(hInst,
+ (LPSTR)lpofn->lpTemplateName, RT_DIALOG);
+ }
+ else {
+ printf("GetSaveFileName // avant FindResource !\n");
+ hInst = hSysRes;
+ hResInfo = FindResource(hInst, MAKEINTRESOURCE(SAVEFILEDLG2), RT_DIALOG);
+ }
+ if (hResInfo == 0) {
+ CommDlgLastError = CDERR_FINDRESFAILURE;
+ return FALSE;
+ }
+ hDlgTmpl = LoadResource(hInst, hResInfo);
+ }
+ if (hDlgTmpl == 0) {
+ CommDlgLastError = CDERR_LOADRESFAILURE;
+ return FALSE;
+ }
+ wndPtr = WIN_FindWndPtr(lpofn->hwndOwner);
+ bRet = DialogBoxIndirectParam(wndPtr->hInstance, hDlgTmpl,
+ lpofn->hwndOwner, (WNDPROC)FileSaveDlgProc, (DWORD)lpofn);
+ printf("GetSaveFileName // return lpstrFile='%s' !\n", lpofn->lpstrFile);
+ return bRet;
+}
+
+
+/***********************************************************************
+ * ChooseColor [COMMDLG.5]
+ */
+BOOL ChooseColor(LPCHOOSECOLOR lpChCol)
+{
+ HANDLE hDlgTmpl;
+ HANDLE hResInfo;
+ WND *wndPtr;
+ BOOL bRet;
+ hResInfo = FindResource(hSysRes, MAKEINTRESOURCE(COLORDLG), RT_DIALOG);
+ hDlgTmpl = LoadResource(hSysRes, hResInfo);
+ wndPtr = WIN_FindWndPtr(lpChCol->hwndOwner);
+ bRet = DialogBoxIndirectParam(wndPtr->hInstance, hDlgTmpl,
+ lpChCol->hwndOwner, (WNDPROC)ColorDlgProc, (DWORD)lpChCol);
+ return bRet;
+}
+
+
+/***********************************************************************
+ * FileOpenDlgProc [COMMDLG.6]
+ */
+BOOL FileOpenDlgProc(HWND hWnd, WORD wMsg, WORD wParam, LONG lParam)
+{
+ int n;
+ LPSTR ptr;
+ LPSTR fspec;
+ char str[512];
+ char C2[128];
+ WORD wRet;
+ HBRUSH hBrush;
+ HDC hMemDC;
+ HBITMAP hBitmap;
+ BITMAP bm;
+ WND *wndPtr;
+ LPMEASUREITEMSTRUCT lpmeasure;
+ LPDRAWITEMSTRUCT lpdis;
+ static int nDrive;
+ static char CurPath[512];
+ static LPOPENFILENAME lpofn;
+
+ switch (wMsg) {
+ case WM_INITDIALOG:
+#ifdef DEBUG_OPENDLG
+ printf("FileOpenDlgProc // WM_INITDIALOG lParam=%08X\n", lParam);
+#endif
+ printf("FileOpenDlgProc // WM_INITDIALOG lParam=%08X\n", lParam);
+ if (!FileDlg_Init(hWnd, lParam)) return TRUE;
+ SendDlgItemMessage(hWnd, cmb1, CB_RESETCONTENT, 0, 0L);
+ lpofn = (LPOPENFILENAME)lParam;
+ ptr = (LPSTR)lpofn->lpstrFilter;
+ strcpy(CurPath, lpofn->lpstrInitialDir);
+#ifdef DEBUG_OPENDLG
+ printf("FileOpenDlgProc // lpstrInitialDir='%s' !\n", CurPath);
+#endif
+ while((n = strlen(ptr)) != 0) {
+#ifdef DEBUG_OPENDLG
+ printf("FileOpenDlgProc // file type '%s' !\n", ptr);
+#endif
+ SendDlgItemMessage(hWnd, cmb1, CB_ADDSTRING, 0, (DWORD)ptr);
+ ptr += ++n;
+#ifdef DEBUG_OPENDLG
+ printf("FileOpenDlgProc // file spec '%s' !\n", ptr);
+#endif
+ n = strlen(ptr);
+ ptr += ++n;
+ }
+ SendDlgItemMessage(hWnd, edt1, WM_SETTEXT, 0, (DWORD)str);
+ SendDlgItemMessage(hWnd, cmb1, CB_SETCURSEL,
+ lpofn->nFilterIndex - 1, 0L);
+ DlgDirListComboBox(hWnd, "", cmb2, 0, 0xC000);
+ nDrive = 2; /* Drive 'C:' */
+ SendDlgItemMessage(hWnd, cmb2, CB_SETCURSEL, nDrive, 0L);
+ sprintf(str, "%c:\\%s", nDrive + 'A', DOS_GetCurrentDir(nDrive));
+ fspec = OpenDlg_GetFileType(lpofn->lpstrFilter,
+ lpofn->nFilterIndex);
+#ifdef DEBUG_OPENDLG
+ printf("FileOpenDlgProc // WM_INITDIALOG fspec #%d = '%s' !\n",
+ lpofn->nFilterIndex, fspec);
+#endif
+ if (!OpenDlg_ScanDir(hWnd, nDrive, str, fspec)) {
+ printf("OpenDlg_ScanDir // ChangeDir Error !\n");
+ }
+ else {
+ strcpy(CurPath, str);
+ }
+ ShowWindow(hWnd, SW_SHOWNORMAL);
+ return TRUE;
+
+ case WM_SHOWWINDOW:
+ if (wParam == 0) break;
+ if (!(lpofn->Flags & OFN_SHOWHELP)) {
+ ShowWindow(GetDlgItem(hWnd, pshHelp), SW_HIDE);
+ }
+ if (lpofn->Flags & OFN_HIDEREADONLY) {
+ ShowWindow(GetDlgItem(hWnd, chx1), SW_HIDE);
+ }
+ return TRUE;
+
+ case WM_MEASUREITEM:
+ GetObject(hFolder2, sizeof(BITMAP), (LPSTR)&bm);
+ lpmeasure = (LPMEASUREITEMSTRUCT)lParam;
+ lpmeasure->itemHeight = bm.bmHeight;
+#ifdef DEBUG_OPENDLG_DRAW
+ printf("FileOpenDlgProc WM_MEASUREITEM Height=%d !\n", bm.bmHeight);
+#endif
+ return TRUE;
+
+ case WM_DRAWITEM:
+#ifdef DEBUG_OPENDLG_DRAW
+ printf("FileOpenDlgProc // WM_DRAWITEM w=%04X l=%08X\n", wParam, lParam);
+#endif
+ if (lParam == 0L) break;
+ lpdis = (LPDRAWITEMSTRUCT)lParam;
+#ifdef DEBUG_OPENDLG_DRAW
+ printf("FileOpenDlgProc // WM_DRAWITEM CtlType=%04X CtlID=%04X \n",
+ lpdis->CtlType, lpdis->CtlID);
+#endif
+ if ((lpdis->CtlType == ODT_LISTBOX) && (lpdis->CtlID == lst1)) {
+ hBrush = SelectObject(lpdis->hDC, GetStockObject(LTGRAY_BRUSH));
+ SelectObject(lpdis->hDC, hBrush);
+ FillRect(lpdis->hDC, &lpdis->rcItem, hBrush);
+ ptr = (LPSTR) lpdis->itemData;
+ if (ptr == NULL) break;
+ TextOut(lpdis->hDC, lpdis->rcItem.left, lpdis->rcItem.top,
+ ptr, strlen(ptr));
+ }
+ if ((lpdis->CtlType == ODT_LISTBOX) && (lpdis->CtlID == lst2)) {
+ hBrush = SelectObject(lpdis->hDC, GetStockObject(LTGRAY_BRUSH));
+ SelectObject(lpdis->hDC, hBrush);
+ FillRect(lpdis->hDC, &lpdis->rcItem, hBrush);
+ ptr = (LPSTR) lpdis->itemData;
+ if (ptr == NULL) break;
+ if (strcmp(ptr, "[.]") == 0) {
+ hBitmap = hFolder2;
+/* ptr = OpenDlg_ExtractCurDir(CurPath, -1); */
+ ptr = CurPath;
+ }
+ else
+ hBitmap = hFolder;
+ GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&bm);
+ TextOut(lpdis->hDC, lpdis->rcItem.left + bm.bmWidth,
+ lpdis->rcItem.top, ptr, strlen(ptr));
+ hMemDC = CreateCompatibleDC(lpdis->hDC);
+ SelectObject(hMemDC, hBitmap);
+ BitBlt(lpdis->hDC, lpdis->rcItem.left, lpdis->rcItem.top,
+ bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+ DeleteDC(hMemDC);
+ }
+ if ((lpdis->CtlType == ODT_COMBOBOX) && (lpdis->CtlID == cmb2)) {
+ hBrush = SelectObject(lpdis->hDC, GetStockObject(LTGRAY_BRUSH));
+ SelectObject(lpdis->hDC, hBrush);
+ FillRect(lpdis->hDC, &lpdis->rcItem, hBrush);
+ ptr = (LPSTR) lpdis->itemData;
+ if (ptr == NULL) break;
+ switch(ptr[2]) {
+ case 'a':
+ case 'b':
+ hBitmap = hFloppy;
+ break;
+ default:
+ hBitmap = hHDisk;
+ }
+ GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&bm);
+ TextOut(lpdis->hDC, lpdis->rcItem.left + bm.bmWidth,
+ lpdis->rcItem.top, ptr, strlen(ptr));
+ hMemDC = CreateCompatibleDC(lpdis->hDC);
+ SelectObject(hMemDC, hBitmap);
+ BitBlt(lpdis->hDC, lpdis->rcItem.left, lpdis->rcItem.top,
+ bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+ DeleteDC(hMemDC);
+ }
+ if (lpdis->itemState != 0) {
+ InvertRect(lpdis->hDC, &lpdis->rcItem);
+ }
+ break;
+
+ case WM_COMMAND:
+ switch (wParam) {
+ case lst1:
+ if (HIWORD(lParam) == LBN_DBLCLK ||
+ HIWORD(lParam) == LBN_SELCHANGE) {
+#ifdef DEBUG_OPENDLG
+ printf("FileOpenDlgProc // LBN_SELCHANGE on lst1 !\n");
+#endif
+ wRet = SendDlgItemMessage(hWnd, lst1, LB_GETCURSEL, 0, 0L);
+ SendDlgItemMessage(hWnd, lst1, LB_GETTEXT, wRet, (DWORD)C2);
+ }
+ if (HIWORD(lParam) == LBN_DBLCLK) {
+#ifdef DEBUG_OPENDLG
+ printf("FileOpenDlgProc // LBN_DBLCLK on lst1 !\n");
+#endif
+ return SendMessage(hWnd, WM_COMMAND, IDOK, 0L);
+ }
+ break;
+ case lst2:
+ if (HIWORD(lParam) == LBN_DBLCLK) {
+#ifdef DEBUG_OPENDLG
+ printf("FileOpenDlgProc // LBN_DBLCLK on lst2 !\n");
+#endif
+ wRet = SendDlgItemMessage(hWnd, cmb1, CB_GETCURSEL, 0, 0L);
+ if (wRet == (WORD)LB_ERR) return 0;
+ fspec = OpenDlg_GetFileType(lpofn->lpstrFilter, wRet + 1);
+ C2[0] = '\0';
+ wRet = SendDlgItemMessage(hWnd, lst2, LB_GETCURSEL, 0, 0L);
+ if (wRet == (WORD)LB_ERR) return 0;
+ SendDlgItemMessage(hWnd, lst2, LB_GETTEXT, wRet, (DWORD)C2);
+ if (C2[0] == '[') {
+ C2[strlen(C2) - 1] = '\0';
+ sprintf(str, "%s\\%s", CurPath, &C2[1]);
+ if (!OpenDlg_ScanDir(hWnd, nDrive, str, fspec)) {
+ printf("OpenDlg_ScanDir // ChangeDir Error !\n");
+ }
+ else {
+ strcpy(CurPath, str);
+ }
+ }
+ }
+ break;
+ case cmb1:
+ if (HIWORD(lParam) == CBN_SELCHANGE) {
+ wRet = SendDlgItemMessage(hWnd, cmb1, CB_GETCURSEL, 0, 0L);
+ if (wRet == (WORD)LB_ERR) return 0;
+ fspec = OpenDlg_GetFileType(lpofn->lpstrFilter, wRet + 1);
+ printf("FileOpenDlgProc // new fspec #%d = '%s' !\n", wRet, fspec);
+ if (!OpenDlg_ScanFiles(hWnd, nDrive, CurPath, fspec)) {
+ printf("OpenDlg_ScanFiles // Change FileType Error !\n");
+ }
+ }
+ break;
+ case cmb2:
+#ifdef DEBUG_OPENDLG
+ printf("FileOpenDlgProc // combo #2 changed !\n");
+#endif
+ wRet = SendDlgItemMessage(hWnd, cmb1, CB_GETCURSEL, 0, 0L);
+ if (wRet == (WORD)LB_ERR) return 0;
+ fspec = OpenDlg_GetFileType(lpofn->lpstrFilter, wRet + 1);
+ wRet = SendDlgItemMessage(hWnd, cmb2, CB_GETCURSEL, 0, 0L);
+ if (wRet == (WORD)LB_ERR) return 0;
+ printf("FileOpenDlgProc // combo #2 CB_GETCURSEL=%d !\n", wRet);
+ SendDlgItemMessage(hWnd, cmb2, CB_GETLBTEXT, wRet, (DWORD)C2);
+ nDrive = C2[2] - 'a';
+#ifdef DEBUG_OPENDLG
+ printf("FileOpenDlgProc // new drive selected=%d !\n", nDrive);
+#endif
+ sprintf(str, "%c:\\%s", nDrive + 'A', DOS_GetCurrentDir(nDrive));
+#ifdef DEBUG_OPENDLG
+ printf("FileOpenDlgProc // new drive , curPath='%s' !\n", str);
+#endif
+ if (!OpenDlg_ScanDir(hWnd, nDrive, str, fspec)) {
+ printf("OpenDlg_ScanDir // ChangeDir Error !\n");
+ }
+ else {
+ strcpy(CurPath, str);
+ }
+ break;
+ case chx1:
+#ifdef DEBUG_OPENDLG
+ printf("FileOpenDlgProc // read-only toggled !\n");
+#endif
+ break;
+ case pshHelp:
+#ifdef DEBUG_OPENDLG
+ printf("FileOpenDlgProc // pshHelp pressed !\n");
+#endif
+ break;
+ case IDOK:
+ ShowWindow(hWnd, SW_HIDE);
+ SendDlgItemMessage(hWnd, edt1, WM_GETTEXT, 0, (DWORD)str);
+ wRet = SendDlgItemMessage(hWnd, lst1, LB_GETCURSEL, 0, 0L);
+ SendDlgItemMessage(hWnd, lst1, LB_GETTEXT, wRet, (DWORD)str);
+ printf("FileOpenDlgProc // IDOK str='%s'\n", str);
+ strcpy(lpofn->lpstrFile, str);
+ lpofn->nFileOffset = 0;
+ lpofn->nFileExtension = strlen(lpofn->lpstrFile) - 3;
+ if (lpofn->lpstrFileTitle != NULL) {
+ wRet = SendDlgItemMessage(hWnd, lst1, LB_GETCURSEL, 0, 0L);
+ SendDlgItemMessage(hWnd, lst1, LB_GETTEXT, wRet, (DWORD)str);
+ strcpy(lpofn->lpstrFileTitle, str);
+ }
+ EndDialog(hWnd, TRUE);
+ return(TRUE);
+ case IDCANCEL:
+ EndDialog(hWnd, FALSE);
+ return(TRUE);
+ }
+ return(FALSE);
+ }
+
+
+/*
+ case WM_CTLCOLOR:
+ SetBkColor((HDC)wParam, 0x00C0C0C0);
+ switch (HIWORD(lParam))
+ {
+ case CTLCOLOR_BTN:
+ SetTextColor((HDC)wParam, 0x00000000);
+ return(hGRAYBrush);
+ case CTLCOLOR_STATIC:
+ SetTextColor((HDC)wParam, 0x00000000);
+ return(hGRAYBrush);
+ }
+ return(FALSE);
+
+*/
+ return FALSE;
+}
+
+
+/***********************************************************************
+ * FileDlg_Init [internal]
+ */
+BOOL FileDlg_Init(HWND hWnd, DWORD lParam)
+{
+ LPOPENFILENAME lpofn;
+ lpofn = (LPOPENFILENAME)lParam;
+ if (lpofn == NULL) {
+ fprintf(stderr, "FileDlg_Init // Bad LPOPENFILENAME pointer !");
+ return FALSE;
+ }
+ if (hFolder == (HBITMAP)NULL)
+ hFolder = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_FOLDER));
+ if (hFolder2 == (HBITMAP)NULL)
+ hFolder2 = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_FOLDER2));
+ if (hFloppy == (HBITMAP)NULL)
+ hFloppy = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_FLOPPY));
+ if (hHDisk == (HBITMAP)NULL)
+ hHDisk = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_HDISK));
+ if (hCDRom == (HBITMAP)NULL)
+ hCDRom = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_CDROM));
+ if (hFolder == 0 || hFolder2 == 0 || hFloppy == 0 ||
+ hHDisk == 0 || hCDRom == 0)
+ fprintf(stderr, "FileDlg_Init // Error loading bitmaps !");
+ return TRUE;
+}
+
+
+/***********************************************************************
+ * OpenDlg_ScanFiles [internal]
+ */
+BOOL OpenDlg_ScanFiles(HWND hWnd, WORD nDrive, LPSTR newPath, LPSTR fileSpec)
+{
+ int OldDrive;
+ char OldPath[512];
+ char str[512];
+ OldDrive = DOS_GetDefaultDrive();
+ DOS_SetDefaultDrive(nDrive) ;
+ strcpy(OldPath, DOS_GetCurrentDir(nDrive));
+#ifdef DEBUG_OPENDLG
+ printf("OpenDlg_ScanFiles // OldDrive=%d OldPath='%s'\n", OldDrive, OldPath);
+ printf("OpenDlg_ScanFiles // wanted newPath='%s'\n", newPath);
+#endif
+ if (newPath[1] == ':')
+ DOS_ChangeDir(nDrive, &newPath[2]);
+ else
+ DOS_ChangeDir(nDrive, newPath);
+ sprintf(newPath, "%c:\\%s", nDrive + 'A', DOS_GetCurrentDir(nDrive));
+#ifdef DEBUG_OPENDLG
+ printf("OpenDlg_ScanFiles // actual newPath='%s'\n", newPath);
+#endif
+ if (strlen(newPath) == 3) newPath[2] = '\0';
+ sprintf(str, "%s\\%s", newPath, fileSpec);
+ DlgDirList(hWnd, str, lst1, 0, 0x0000);
+ SendDlgItemMessage(hWnd, edt1, WM_SETTEXT, 0, (DWORD)str);
+ DOS_ChangeDir(nDrive, OldPath);
+ DOS_SetDefaultDrive(OldDrive);
+ return TRUE;
+}
+
+
+
+/***********************************************************************
+ * OpenDlg_ScanDir [internal]
+ */
+BOOL OpenDlg_ScanDir(HWND hWnd, WORD nDrive, LPSTR newPath, LPSTR fileSpec)
+{
+ int OldDrive;
+ char OldPath[512];
+ char str[512];
+ OldDrive = DOS_GetDefaultDrive();
+ DOS_SetDefaultDrive(nDrive) ;
+ strcpy(OldPath, DOS_GetCurrentDir(nDrive));
+#ifdef DEBUG_OPENDLG
+ printf("OpenDlg_ScanDir // OldDrive=%d OldPath='%s'\n", OldDrive, OldPath);
+ printf("OpenDlg_ScanDir // wanted newPath='%s'\n", newPath);
+#endif
+ if (newPath[1] == ':')
+ DOS_ChangeDir(nDrive, &newPath[2]);
+ else
+ DOS_ChangeDir(nDrive, newPath);
+ sprintf(newPath, "%c:\\%s", nDrive + 'A', DOS_GetCurrentDir(nDrive));
+#ifdef DEBUG_OPENDLG
+ printf("OpenDlg_ScanDir // actual newPath='%s'\n", newPath);
+#endif
+ if (strlen(newPath) == 3) newPath[2] = '\0';
+ sprintf(str, "%s\\%s", newPath, fileSpec);
+ DlgDirList(hWnd, str, lst1, 0, 0x0000);
+ SendDlgItemMessage(hWnd, edt1, WM_SETTEXT, 0, (DWORD)str);
+ sprintf(str, "%s\\*.*", newPath);
+ DlgDirList(hWnd, str, lst2, 0, 0x8010);
+ if (strlen(newPath) == 2) strcat(newPath, "\\");
+ SendDlgItemMessage(hWnd, stc1, WM_SETTEXT, 0, (DWORD)newPath);
+ DOS_ChangeDir(nDrive, OldPath);
+ DOS_SetDefaultDrive(OldDrive);
+ return TRUE;
+}
+
+
+
+/***********************************************************************
+ * OpenDlg_GetFileType [internal]
+ */
+LPSTR OpenDlg_GetFileType(LPCSTR types, WORD index)
+{
+ int n;
+ int i = 1;
+ LPSTR ptr = (LPSTR) types;
+ if (ptr == NULL) return NULL;
+ while((n = strlen(ptr)) != 0) {
+#ifdef DEBUG_OPENDLG
+ printf("OpenDlg_GetFileType // file type '%s' !\n", ptr);
+#endif
+ ptr += ++n;
+#ifdef DEBUG_OPENDLG
+ printf("OpenDlg_GetFileType // file spec '%s' !\n", ptr);
+#endif
+ if (i++ == index) return ptr;
+ n = strlen(ptr);
+ ptr += ++n;
+ }
+ return NULL;
+}
+
+
+/***********************************************************************
+ * OpenDlg_ExtractCurDir [internal]
+ */
+LPSTR OpenDlg_ExtractCurDir(LPSTR FullPath, short MaxLen)
+{
+ LPSTR ptr;
+ if (MaxLen < 0) MaxLen = strlen(FullPath);
+ ptr = FullPath + MaxLen - 1;
+ if (*ptr == '\\') return NULL;
+ while (ptr > FullPath) {
+ if (*ptr == '\\') return (ptr + 1);
+ ptr--;
+ }
+ return NULL;
+}
+
+
+/***********************************************************************
+ * FileSaveDlgProc [COMMDLG.7]
+ */
+BOOL FileSaveDlgProc(HWND hWnd, WORD wMsg, WORD wParam, LONG lParam)
+{
+ int n;
+ LPSTR ptr;
+ LPSTR fspec;
+ char str[512];
+ char C2[128];
+ WORD wRet;
+ HBRUSH hBrush;
+ HDC hMemDC;
+ HBITMAP hBitmap;
+ BITMAP bm;
+ LPMEASUREITEMSTRUCT lpmeasure;
+ LPDRAWITEMSTRUCT lpdis;
+ static int nDrive;
+ static int OldDrive;
+ static char OldPath[512];
+ static char CurPath[512];
+ static LPOPENFILENAME lpofn;
+
+ switch (wMsg) {
+ case WM_INITDIALOG:
+#ifdef DEBUG_OPENDLG
+ printf("FileSaveDlgProc // WM_INITDIALOG lParam=%08X\n", lParam);
+#endif
+ if (!FileDlg_Init(hWnd, lParam)) return TRUE;
+ SendDlgItemMessage(hWnd, cmb1, CB_RESETCONTENT, 0, 0L);
+ lpofn = (LPOPENFILENAME)lParam;
+ ptr = (LPSTR)lpofn->lpstrFilter;
+ strcpy(CurPath, lpofn->lpstrInitialDir);
+ while((n = strlen(ptr)) != 0) {
+#ifdef DEBUG_OPENDLG
+ printf("FileSaveDlgProc // file type '%s' !\n", ptr);
+#endif
+ SendDlgItemMessage(hWnd, cmb1, CB_ADDSTRING, 0, (DWORD)ptr);
+ ptr += ++n;
+#ifdef DEBUG_OPENDLG
+ printf("FileSaveDlgProc // file spec '%s' !\n", ptr);
+#endif
+ n = strlen(ptr);
+ ptr += ++n;
+ }
+ SendDlgItemMessage(hWnd, edt1, WM_SETTEXT, 0, (DWORD)str);
+ SendDlgItemMessage(hWnd, cmb1, CB_SETCURSEL,
+ lpofn->nFilterIndex - 1, 0L);
+ DlgDirListComboBox(hWnd, "", cmb2, 0, 0xC000);
+ nDrive = 2; /* Drive 'C:' */
+ SendDlgItemMessage(hWnd, cmb2, CB_SETCURSEL, nDrive, 0L);
+ sprintf(str, "%c:\\%s", nDrive + 'A', DOS_GetCurrentDir(nDrive));
+ fspec = OpenDlg_GetFileType(lpofn->lpstrFilter,
+ lpofn->nFilterIndex);
+#ifdef DEBUG_OPENDLG
+ printf("FileSaveDlgProc // WM_INITDIALOG fspec #%d = '%s' !\n",
+ lpofn->nFilterIndex, fspec);
+#endif
+ if (!OpenDlg_ScanDir(hWnd, nDrive, str, fspec)) {
+ printf("OpenDlg_ScanDir // ChangeDir Error !\n");
+ }
+ else {
+ strcpy(CurPath, str);
+ }
+ ShowWindow(hWnd, SW_SHOWNORMAL);
+ return (TRUE);
+
+ case WM_SHOWWINDOW:
+ if (wParam == 0) break;
+ if (!(lpofn->Flags & OFN_SHOWHELP)) {
+ ShowWindow(GetDlgItem(hWnd, pshHelp), SW_HIDE);
+ }
+ if (lpofn->Flags & OFN_HIDEREADONLY) {
+ ShowWindow(GetDlgItem(hWnd, chx1), SW_HIDE);
+ }
+ return TRUE;
+
+ case WM_MEASUREITEM:
+ GetObject(hFolder2, sizeof(BITMAP), (LPSTR)&bm);
+ lpmeasure = (LPMEASUREITEMSTRUCT)lParam;
+ lpmeasure->itemHeight = bm.bmHeight;
+#ifdef DEBUG_OPENDLG_DRAW
+ printf("FileSaveDlgProc WM_MEASUREITEM Height=%d !\n", bm.bmHeight);
+#endif
+ return TRUE;
+
+ case WM_DRAWITEM:
+#ifdef DEBUG_OPENDLG_DRAW
+ printf("FileSaveDlgProc // WM_DRAWITEM w=%04X l=%08X\n", wParam, lParam);
+#endif
+ if (lParam == 0L) break;
+ lpdis = (LPDRAWITEMSTRUCT)lParam;
+#ifdef DEBUG_OPENDLG_DRAW
+ printf("FileSaveDlgProc // WM_DRAWITEM lpdis->CtlID=%04X\n", lpdis->CtlID);
+#endif
+ if ((lpdis->CtlType == ODT_LISTBOX) && (lpdis->CtlID == lst1)) {
+ hBrush = SelectObject(lpdis->hDC, GetStockObject(LTGRAY_BRUSH));
+ SelectObject(lpdis->hDC, hBrush);
+ FillRect(lpdis->hDC, &lpdis->rcItem, hBrush);
+ ptr = (LPSTR) lpdis->itemData;
+ if (ptr == NULL) break;
+ TextOut(lpdis->hDC, lpdis->rcItem.left, lpdis->rcItem.top,
+ ptr, strlen(ptr));
+ }
+ if ((lpdis->CtlType == ODT_LISTBOX) && (lpdis->CtlID == lst2)) {
+ hBrush = SelectObject(lpdis->hDC, GetStockObject(LTGRAY_BRUSH));
+ SelectObject(lpdis->hDC, hBrush);
+ FillRect(lpdis->hDC, &lpdis->rcItem, hBrush);
+ ptr = (LPSTR) lpdis->itemData;
+ if (ptr == NULL) break;
+ if (strcmp(ptr, "[.]") == 0) {
+ hBitmap = hFolder2;
+ ptr = CurPath;
+ }
+ else
+ hBitmap = hFolder;
+ GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&bm);
+ TextOut(lpdis->hDC, lpdis->rcItem.left + bm.bmWidth,
+ lpdis->rcItem.top, ptr, strlen(ptr));
+ hMemDC = CreateCompatibleDC(lpdis->hDC);
+ SelectObject(hMemDC, hBitmap);
+ BitBlt(lpdis->hDC, lpdis->rcItem.left, lpdis->rcItem.top,
+ bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+ DeleteDC(hMemDC);
+ }
+ if ((lpdis->CtlType == ODT_COMBOBOX) && (lpdis->CtlID == cmb2)) {
+ hBrush = SelectObject(lpdis->hDC, GetStockObject(LTGRAY_BRUSH));
+ SelectObject(lpdis->hDC, hBrush);
+ FillRect(lpdis->hDC, &lpdis->rcItem, hBrush);
+ ptr = (LPSTR) lpdis->itemData;
+ if (ptr == NULL) break;
+ switch(ptr[2]) {
+ case 'a':
+ case 'b':
+ hBitmap = hFloppy;
+ break;
+ default:
+ hBitmap = hHDisk;
+ }
+ GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&bm);
+ TextOut(lpdis->hDC, lpdis->rcItem.left + bm.bmWidth,
+ lpdis->rcItem.top, ptr, strlen(ptr));
+ hMemDC = CreateCompatibleDC(lpdis->hDC);
+ SelectObject(hMemDC, hBitmap);
+ BitBlt(lpdis->hDC, lpdis->rcItem.left, lpdis->rcItem.top,
+ bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+ DeleteDC(hMemDC);
+ }
+ break;
+
+ case WM_COMMAND:
+ switch (wParam) {
+ case lst1:
+ if (HIWORD(lParam) == LBN_DBLCLK ||
+ HIWORD(lParam) == LBN_SELCHANGE) {
+#ifdef DEBUG_OPENDLG
+ printf("FileSaveDlgProc // LBN_SELCHANGE on lst1 !\n");
+#endif
+ wRet = SendDlgItemMessage(hWnd, lst1, LB_GETCURSEL, 0, 0L);
+ SendDlgItemMessage(hWnd, lst1, LB_GETTEXT, wRet, (DWORD)C2);
+ }
+ if (HIWORD(lParam) == LBN_DBLCLK) {
+#ifdef DEBUG_OPENDLG
+ printf("FileSaveDlgProc // LBN_DBLCLK on lst1 !\n");
+#endif
+ return SendMessage(hWnd, WM_COMMAND, IDOK, 0L);
+ }
+ break;
+ case lst2:
+ if (HIWORD(lParam) == LBN_DBLCLK) {
+#ifdef DEBUG_OPENDLG
+ printf("FileSaveDlgProc // LBN_DBLCLK on lst2 !\n");
+#endif
+ wRet = SendDlgItemMessage(hWnd, cmb1, CB_GETCURSEL, 0, 0L);
+ fspec = OpenDlg_GetFileType(lpofn->lpstrFilter, wRet + 1);
+ C2[0] = '\0';
+ wRet = SendDlgItemMessage(hWnd, lst2, LB_GETCURSEL, 0, 0L);
+ SendDlgItemMessage(hWnd, lst2, LB_GETTEXT, wRet, (DWORD)C2);
+ if (C2[0] == '[') {
+ C2[strlen(C2) - 1] = '\0';
+ sprintf(str, "%s\\%s", CurPath, &C2[1]);
+ if (!OpenDlg_ScanDir(hWnd, nDrive, str, fspec)) {
+ printf("FileSaveDlgProc // ChangeDir Error !\n");
+ }
+ else {
+ strcpy(CurPath, str);
+ }
+ }
+ }
+ break;
+ case cmb1:
+ if (HIWORD(lParam) == CBN_SELCHANGE) {
+ wRet = SendDlgItemMessage(hWnd, cmb1, CB_GETCURSEL, 0, 0L);
+ fspec = OpenDlg_GetFileType(lpofn->lpstrFilter, wRet + 1);
+ printf("FileSaveDlgProc // new fspec #%d = '%s' !\n", wRet, fspec);
+ if (!OpenDlg_ScanFiles(hWnd, nDrive, CurPath, fspec)) {
+ printf("OpenDlg_ScanFile // Change FileType Error !\n");
+ }
+ }
+ break;
+ case cmb2:
+#ifdef DEBUG_OPENDLG
+ printf("FileSaveDlgProc // combo #2 changed !\n");
+#endif
+ wRet = SendDlgItemMessage(hWnd, cmb1, CB_GETCURSEL, 0, 0L);
+ if (wRet == (WORD)LB_ERR) return 0;
+ fspec = OpenDlg_GetFileType(lpofn->lpstrFilter, wRet + 1);
+ wRet = SendDlgItemMessage(hWnd, cmb2, CB_GETCURSEL, 0, 0L);
+ if (wRet == (WORD)LB_ERR) return 0;
+ printf("FileSaveDlgProc // combo #2 CB_GETCURSEL=%d !\n", wRet);
+ SendDlgItemMessage(hWnd, cmb2, CB_GETLBTEXT, wRet, (DWORD)C2);
+ nDrive = C2[2] - 'a';
+#ifdef DEBUG_OPENDLG
+ printf("FileSaveDlgProc // new drive selected=%d !\n", nDrive);
+#endif
+ sprintf(str, "%c:\\%s", nDrive + 'A', DOS_GetCurrentDir(nDrive));
+#ifdef DEBUG_OPENDLG
+ printf("FileSaveDlgProc // new drive , curPath='%s' !\n", str);
+#endif
+ if (!OpenDlg_ScanDir(hWnd, nDrive, str, fspec)) {
+ printf("FileSaveDlgProc // Change Drive Error !\n");
+ }
+ else {
+ strcpy(CurPath, str);
+ }
+ break;
+ case chx1:
+#ifdef DEBUG_OPENDLG
+ printf("FileSaveDlgProc // read-only toggled !\n");
+#endif
+ break;
+ case pshHelp:
+#ifdef DEBUG_OPENDLG
+ printf("FileSaveDlgProc // pshHelp pressed !\n");
+#endif
+ break;
+ case IDOK:
+ strcpy(lpofn->lpstrFile, "titi.txt");
+ if (lpofn->lpstrFileTitle != NULL) {
+ strcpy(lpofn->lpstrFileTitle, "titi.txt");
+ }
+ EndDialog(hWnd, TRUE);
+ return(TRUE);
+ case IDCANCEL:
+ EndDialog(hWnd, FALSE);
+ return(TRUE);
+ }
+ return(FALSE);
+ }
+ return FALSE;
+}
+
+
+/***********************************************************************
+ * ColorDlgProc [COMMDLG.8]
+ */
+BOOL ColorDlgProc(HWND hWnd, WORD wMsg, WORD wParam, LONG lParam)
+{
+ switch (wMsg) {
+ case WM_INITDIALOG:
+ printf("ColorDlgProc // WM_INITDIALOG lParam=%08X\n", lParam);
+ ShowWindow(hWnd, SW_SHOWNORMAL);
+ return (TRUE);
+
+ case WM_COMMAND:
+ switch (wParam) {
+ case IDOK:
+ EndDialog(hWnd, TRUE);
+ return(TRUE);
+ case IDCANCEL:
+ EndDialog(hWnd, FALSE);
+ return(TRUE);
+ }
+ return(FALSE);
+ }
+ return FALSE;
+}
+
+
+/***********************************************************************
+ * FindTextDlg [COMMDLG.11]
+ */
+BOOL FindText(LPFINDREPLACE lpFind)
+{
+ HANDLE hDlgTmpl;
+ HANDLE hResInfo;
+ WND *wndPtr;
+ BOOL bRet;
+ hResInfo = FindResource(hSysRes, MAKEINTRESOURCE(FINDDLG), RT_DIALOG);
+ if (hResInfo == 0) {
+ CommDlgLastError = CDERR_FINDRESFAILURE;
+ return FALSE;
+ }
+ hDlgTmpl = LoadResource(hSysRes, hResInfo);
+ if (hDlgTmpl == 0) {
+ CommDlgLastError = CDERR_LOADRESFAILURE;
+ return FALSE;
+ }
+ wndPtr = WIN_FindWndPtr(lpFind->hwndOwner);
+ bRet = DialogBoxIndirectParam(wndPtr->hInstance, hDlgTmpl,
+ lpFind->hwndOwner, (WNDPROC)FindTextDlgProc, (DWORD)lpFind);
+ return bRet;
+}
+
+
+/***********************************************************************
+ * ReplaceTextDlg [COMMDLG.12]
+ */
+BOOL ReplaceText(LPFINDREPLACE lpFind)
+{
+ HANDLE hDlgTmpl;
+ HANDLE hResInfo;
+ WND *wndPtr;
+ BOOL bRet;
+ hResInfo = FindResource(hSysRes, MAKEINTRESOURCE(REPLACEDLG), RT_DIALOG);
+ if (hResInfo == 0) {
+ CommDlgLastError = CDERR_FINDRESFAILURE;
+ return FALSE;
+ }
+ hDlgTmpl = LoadResource(hSysRes, hResInfo);
+ if (hDlgTmpl == 0) {
+ CommDlgLastError = CDERR_LOADRESFAILURE;
+ return FALSE;
+ }
+ wndPtr = WIN_FindWndPtr(lpFind->hwndOwner);
+ bRet = DialogBoxIndirectParam(wndPtr->hInstance, hDlgTmpl,
+ lpFind->hwndOwner, (WNDPROC)ReplaceTextDlgProc, (DWORD)lpFind);
+ return bRet;
+}
+
+
+/***********************************************************************
+ * FindTextDlgProc [COMMDLG.13]
+ */
+BOOL FindTextDlgProc(HWND hWnd, WORD wMsg, WORD wParam, LONG lParam)
+{
+ switch (wMsg) {
+ case WM_INITDIALOG:
+ printf("FindTextDlgProc // WM_INITDIALOG lParam=%08X\n", lParam);
+ ShowWindow(hWnd, SW_SHOWNORMAL);
+ return (TRUE);
+
+ case WM_COMMAND:
+ switch (wParam) {
+ case IDOK:
+ EndDialog(hWnd, TRUE);
+ return(TRUE);
+ case IDCANCEL:
+ EndDialog(hWnd, FALSE);
+ return(TRUE);
+ }
+ return(FALSE);
+ }
+ return FALSE;
+}
+
+
+/***********************************************************************
+ * ReplaceTextDlgProc [COMMDLG.14]
+ */
+BOOL ReplaceTextDlgProc(HWND hWnd, WORD wMsg, WORD wParam, LONG lParam)
+{
+ switch (wMsg) {
+ case WM_INITDIALOG:
+ printf("ReplaceTextDlgProc // WM_INITDIALOG lParam=%08X\n", lParam);
+ ShowWindow(hWnd, SW_SHOWNORMAL);
+ return (TRUE);
+
+ case WM_COMMAND:
+ switch (wParam) {
+ case IDOK:
+ EndDialog(hWnd, TRUE);
+ return(TRUE);
+ case IDCANCEL:
+ EndDialog(hWnd, FALSE);
+ return(TRUE);
+ }
+ return(FALSE);
+ }
+ return FALSE;
+}
+
+
+/***********************************************************************
+ * PrintDlg [COMMDLG.20]
+ */
+BOOL PrintDlg(LPPRINTDLG lpPrint)
+{
+ HANDLE hDlgTmpl;
+ HANDLE hResInfo;
+ WND *wndPtr;
+ BOOL bRet;
+ printf("PrintDlg(%08X) // Flags=%08X\n", lpPrint->Flags);
+ if (lpPrint->Flags & PD_PRINTSETUP)
+ hResInfo = FindResource(hSysRes, MAKEINTRESOURCE(PRINTSETUPDLG), RT_DIALOG);
+ else
+ hResInfo = FindResource(hSysRes, MAKEINTRESOURCE(PRINTDLG), RT_DIALOG);
+ if (hResInfo == 0) {
+ CommDlgLastError = CDERR_FINDRESFAILURE;
+ return FALSE;
+ }
+ hDlgTmpl = LoadResource(hSysRes, hResInfo);
+ if (hDlgTmpl == 0) {
+ CommDlgLastError = CDERR_LOADRESFAILURE;
+ return FALSE;
+ }
+ wndPtr = WIN_FindWndPtr(lpPrint->hwndOwner);
+ if (lpPrint->Flags & PD_PRINTSETUP)
+ bRet = DialogBoxIndirectParam(wndPtr->hInstance, hDlgTmpl,
+ lpPrint->hwndOwner, (WNDPROC)PrintSetupDlgProc, (DWORD)lpPrint);
+ else
+ bRet = DialogBoxIndirectParam(wndPtr->hInstance, hDlgTmpl,
+ lpPrint->hwndOwner, (WNDPROC)PrintDlgProc, (DWORD)lpPrint);
+ return bRet;
+}
+
+
+/***********************************************************************
+ * PrintDlgProc [COMMDLG.21]
+ */
+BOOL PrintDlgProc(HWND hWnd, WORD wMsg, WORD wParam, LONG lParam)
+{
+ switch (wMsg) {
+ case WM_INITDIALOG:
+ printf("PrintDlgProc // WM_INITDIALOG lParam=%08X\n", lParam);
+ ShowWindow(hWnd, SW_SHOWNORMAL);
+ return (TRUE);
+
+ case WM_COMMAND:
+ switch (wParam) {
+ case IDOK:
+ EndDialog(hWnd, TRUE);
+ return(TRUE);
+ case IDCANCEL:
+ EndDialog(hWnd, FALSE);
+ return(TRUE);
+ }
+ return(FALSE);
+ }
+ return FALSE;
+}
+
+
+/***********************************************************************
+ * PrintSetupDlgProc [COMMDLG.22]
+ */
+BOOL PrintSetupDlgProc(HWND hWnd, WORD wMsg, WORD wParam, LONG lParam)
+{
+ switch (wMsg) {
+ case WM_INITDIALOG:
+ printf("PrintSetupDlgProc // WM_INITDIALOG lParam=%08X\n", lParam);
+ ShowWindow(hWnd, SW_SHOWNORMAL);
+ return (TRUE);
+
+ case WM_COMMAND:
+ switch (wParam) {
+ case IDOK:
+ EndDialog(hWnd, TRUE);
+ return(TRUE);
+ case IDCANCEL:
+ EndDialog(hWnd, FALSE);
+ return(TRUE);
+ }
+ return(FALSE);
+ }
+ return FALSE;
+}
+
+
+/***********************************************************************
+ * CommDlgExtendError [COMMDLG.26]
+ */
+DWORD CommDlgExtendError(void)
+{
+ return CommDlgLastError;
+}
+
+
+/***********************************************************************
+ * GetFileTitle [COMMDLG.27]
+ */
+int GetFileTitle(LPCSTR lpFile, LPSTR lpTitle, UINT cbBuf)
+{
+ int i, len;
+ printf("GetFileTitle(%08X %08X %d); \n", lpFile, lpTitle, cbBuf);
+ if (lpFile == NULL || lpTitle == NULL) return -1;
+ len = strlen(lpFile);
+ if (len == 0) return -1;
+ if (strchr(lpFile, '*') != NULL) return -1;
+ if (strchr(lpFile, '[') != NULL) return -1;
+ if (strchr(lpFile, ']') != NULL) return -1;
+ len--;
+ if (lpFile[len] == '/' || lpFile[len] == '\\' || lpFile[len] == ':') return -1;
+ for (i = len; i >= 0; i--) {
+ if (lpFile[i] == '/' ||
+ lpFile[i] == '\\' ||
+ lpFile[i] == ':') {
+ i++;
+ break;
+ }
+ }
+ printf("\n---> '%s' ", &lpFile[i]);
+ len = min(cbBuf, strlen(&lpFile[i]) + 1);
+ strncpy(lpTitle, &lpFile[i], len + 1);
+ if (len != cbBuf)
+ return len;
+ else
+ return 0;
+}
+
+
+
diff --git a/misc/dos_fs.c b/misc/dos_fs.c
index 29a68ed..f6ba92f 100644
--- a/misc/dos_fs.c
+++ b/misc/dos_fs.c
@@ -382,9 +382,7 @@
ToUnix(rootdir);
-#ifdef DEBUG
- fprintf(stderr,"%s\n", rootdir);
-#endif
+ dprintf_dosfs(stddeb,"%s\n", rootdir);
}
@@ -440,7 +438,7 @@
{
/* should return 'WINDOWS\SYSTEM' */
- char temp[256];
+ static char temp[256];
if (!DOS_ValidDrive(drive))
return 0;
diff --git a/misc/exec.c b/misc/exec.c
index 31d3570..920cb27 100644
--- a/misc/exec.c
+++ b/misc/exec.c
@@ -129,14 +129,14 @@
dprintf_exec(stddeb,"StartNewTask() before CallToInit16() !\n");
rv = CallToInit16(cs_reg << 16 | ip_reg, ss_reg << 16 | sp_reg, ds_reg);
- printf ("rv = %x\n", rv);
+ dprintf_exec(stddeb,"rv = %x\n", rv);
}
#else
void StartNewTask (HINSTANCE hInst)
{
- printf ("Not yet implemented\n");
+ fprintf(stdnimp, "StartNewTask(): Not yet implemented\n");
}
#endif
diff --git a/misc/file.c b/misc/file.c
index 5a9d86a..2320a8b 100644
--- a/misc/file.c
+++ b/misc/file.c
@@ -186,12 +186,14 @@
if ( (!stat(GetUnixFileName(filename), &s)) && (S_ISREG(s.st_mode)) )
break;
GetWindowsDirectory (filename,MAX_PATH);
- if (filename[1] != ':') strcat(filename,"\\");
+ if ((!filename[0])||(filename[strlen(filename)-1]!='\\'))
+ strcat(filename, "\\");
strcat (filename, lpFileName);
if ( (!stat(GetUnixFileName(filename), &s)) && (S_ISREG(s.st_mode)) )
break;
GetSystemDirectory (filename,MAX_PATH);
- if (filename[1] != ':') strcat(filename,"\\");
+ if ((!filename[0])||(filename[strlen(filename)-1]!='\\'))
+ strcat(filename, "\\");
strcat (filename, lpFileName);
if ( (!stat(GetUnixFileName(filename), &s)) && (S_ISREG(s.st_mode)) )
break;
diff --git a/misc/main.c b/misc/main.c
index 5c2a1a4..3b9250e 100644
--- a/misc/main.c
+++ b/misc/main.c
@@ -201,6 +201,56 @@
}
/***********************************************************************
+ * ParseDebugOptions
+ *
+ * Turns specific debug messages on or off, according to "options".
+ * Returns TRUE if parsing was successfull
+ */
+#ifdef DEBUG_RUNTIME
+
+BOOL ParseDebugOptions(char *options)
+{
+ int l;
+ if (strlen(options)<3)
+ return FALSE;
+ do
+ {
+ if ((*options!='+')&&(*options!='-'))
+ return FALSE;
+ if (strchr(options,','))
+ l=strchr(options,',')-options;
+ else
+ l=strlen(options);
+ if (!strncasecmp(options+1,"all",l-1))
+ {
+ int i;
+ for (i=0;i<sizeof(debug_msg_enabled)/sizeof(short);i++)
+ debug_msg_enabled[i]=(*options=='+');
+ }
+ else
+ {
+ int i;
+ for (i=0;i<sizeof(debug_msg_enabled)/sizeof(short);i++)
+ if (debug_msg_name && (!strncasecmp(options+1,debug_msg_name[i],l-1)))
+ {
+ debug_msg_enabled[i]=(*options=='+');
+ break;
+ }
+ if (i==sizeof(debug_msg_enabled)/sizeof(short))
+ return FALSE;
+ }
+ options+=l;
+ }
+ while((*options==',')&&(*(++options)));
+ if (*options)
+ return FALSE;
+ else
+ return TRUE;
+}
+
+#endif
+
+/***********************************************************************
* MAIN_ParseOptions
*
* Parse command line options and open display.
@@ -209,7 +259,7 @@
{
char *display_name;
XrmValue value;
- XrmDatabase db = NULL;
+ XrmDatabase db = XrmGetFileDatabase("/usr/lib/X11/app-defaults/Wine");
/* Parse command line */
Options.programName = MAIN_GetProgramName( *argc, argv );
@@ -254,6 +304,10 @@
screenDepth = atoi( value.addr );
if (MAIN_GetResource( db, ".desktop", &value))
Options.desktopGeometry = value.addr;
+#ifdef DEBUG_RUNTIME
+ if (MAIN_GetResource( db, ".debugoptions", &value))
+ ParseDebugOptions((char*)value.addr);
+#endif
if (MAIN_GetResource( db, ".debugmsg", &value))
{
#ifndef DEBUG_RUNTIME
@@ -262,38 +316,19 @@
argv[0]);
exit(1);
#else
- char *p=(char*)value.addr;
- if (strlen(p)<3)
- goto msgerror;
- if ((*p!='+')&&(*p!='-'))
- goto msgerror;
- if (!strcasecmp(p+1,"all"))
+ if (ParseDebugOptions((char*)value.addr)==FALSE)
{
int i;
- for (i=0;i<sizeof(debug_msg_enabled)/sizeof(short);i++)
- debug_msg_enabled[i]=(*p=='+');
- }
- else
- {
- int i;
- for (i=0;i<sizeof(debug_msg_enabled)/sizeof(short);i++)
- if (debug_msg_name && (!strcasecmp(p+1,debug_msg_name[i])))
- {
- debug_msg_enabled[i]=(*p=='+');
- break;
- }
- if (i==sizeof(debug_msg_enabled)/sizeof(short))
- {
- msgerror:
- fprintf(stderr,"%s: Syntax: -debugmsg +xxx or -debugmsg -xxx with xxx one of\n",argv[0]);
- fprintf(stderr,"%-9s ","all");
- for(i=0;i<sizeof(debug_msg_enabled)/sizeof(short);i++)
- if(debug_msg_name[i])
- fprintf(stderr,"%-9s%c",debug_msg_name[i],
+ fprintf(stderr,"%s: Syntax: -debugmsg +xxx,... or -debugmsg -xxx,...\n",argv[0]);
+ fprintf(stderr,"Example: -debugmsg +all,-heap turn on all messages except heap messages\n");
+ fprintf(stderr,"Available message types:\n");
+ fprintf(stderr,"%-9s ","all");
+ for(i=0;i<sizeof(debug_msg_enabled)/sizeof(short);i++)
+ if(debug_msg_name[i])
+ fprintf(stderr,"%-9s%c",debug_msg_name[i],
(((i+2)%8==0)?'\n':' '));
- fprintf(stderr,"\n\n");
- exit(1);
- }
+ fprintf(stderr,"\n\n");
+ exit(1);
}
#endif
}
@@ -435,6 +470,7 @@
MAIN_SaveSetup();
DOS_InitFS();
Comm_Init();
+ Font_Init();
#ifndef WINELIB
INT21_Init();
#endif
diff --git a/misc/mcianim.c b/misc/mcianim.c
new file mode 100644
index 0000000..8a850f9
--- /dev/null
+++ b/misc/mcianim.c
@@ -0,0 +1,679 @@
+/*
+ * Sample MCI ANIMATION Wine Driver for Linux
+ *
+ * Copyright 1994 Martin Ayotte
+ */
+static char Copyright[] = "Copyright Martin Ayotte, 1994";
+
+#ifndef WINELIB
+#define BUILTIN_MMSYSTEM
+#endif
+
+#ifdef BUILTIN_MMSYSTEM
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include "win.h"
+#include "user.h"
+#include "driver.h"
+#include "mmsystem.h"
+#include "stddebug.h"
+/* #define DEBUG_ANIM /* */
+/* #undef DEBUG_ANIM /* */
+#include "debug.h"
+
+#define MAX_ANIMDRV 2
+
+#define ANIMFRAMES_PERSEC 30
+#define ANIMFRAMES_PERMIN 1800
+#define SECONDS_PERMIN 60
+
+#ifdef linux
+typedef struct {
+ int nUseCount; /* Incremented for each shared open */
+ BOOL fShareable; /* TRUE if first open was shareable */
+ WORD wNotifyDeviceID; /* MCI device ID with a pending notification */
+ HANDLE hCallback; /* Callback handle for pending notification */
+ MCI_OPEN_PARMS openParms;
+ DWORD dwTimeFormat;
+ int mode;
+ UINT nCurTrack;
+ DWORD dwCurFrame;
+ UINT nTracks;
+ DWORD dwTotalLen;
+ LPDWORD lpdwTrackLen;
+ LPDWORD lpdwTrackPos;
+ } LINUX_ANIM;
+
+static LINUX_ANIM AnimDev[MAX_ANIMDRV];
+#endif
+
+
+DWORD ANIM_CalcTime(UINT wDevID, DWORD dwFormatType, DWORD dwFrame);
+DWORD ANIM_CalcFrame(UINT wDevID, DWORD dwFormatType, DWORD dwTime);
+
+
+/*-----------------------------------------------------------------------*/
+
+/**************************************************************************
+* ANIM_mciOpen [internal]
+*/
+DWORD ANIM_mciOpen(DWORD dwFlags, LPMCI_OPEN_PARMS lpParms)
+{
+#ifdef linux
+ UINT wDevID;
+ int cdrom;
+ dprintf_mcianim(stddeb,"ANIM_mciOpen(%08X, %08X);\n",
+ dwFlags, lpParms);
+ if (lpParms == NULL) return MCIERR_INTERNAL;
+ wDevID = lpParms->wDeviceID;
+ if (AnimDev[wDevID].nUseCount > 0) {
+ /* The driver already open on this channel */
+ /* If the driver was opened shareable before and this open specifies */
+ /* shareable then increment the use count */
+ if (AnimDev[wDevID].fShareable && (dwFlags & MCI_OPEN_SHAREABLE))
+ ++AnimDev[wDevID].nUseCount;
+ else
+ return MCIERR_MUST_USE_SHAREABLE;
+ }
+ else {
+ AnimDev[wDevID].nUseCount = 1;
+ AnimDev[wDevID].fShareable = dwFlags & MCI_OPEN_SHAREABLE;
+ }
+ if (dwFlags & MCI_OPEN_ELEMENT) {
+ dprintf_mcianim(stddeb,"ANIM_mciOpen // MCI_OPEN_ELEMENT !\n");
+/* return MCIERR_NO_ELEMENT_ALLOWED; */
+ }
+ memcpy(&AnimDev[wDevID].openParms, lpParms, sizeof(MCI_OPEN_PARMS));
+ AnimDev[wDevID].wNotifyDeviceID = lpParms->wDeviceID;
+ AnimDev[wDevID].mode = 0;
+ AnimDev[wDevID].dwTimeFormat = MCI_FORMAT_TMSF;
+ AnimDev[wDevID].nCurTrack = 0;
+ AnimDev[wDevID].nTracks = 0;
+ AnimDev[wDevID].dwTotalLen = 0;
+ AnimDev[wDevID].lpdwTrackLen = NULL;
+ AnimDev[wDevID].lpdwTrackPos = NULL;
+ if (dwFlags & MCI_NOTIFY) {
+ dprintf_mcianim(stddeb,
+ "ANIM_mciOpen // MCI_NOTIFY_SUCCESSFUL %08X !\n",
+ lpParms->dwCallback);
+ mciDriverNotify((HWND)LOWORD(lpParms->dwCallback),
+ AnimDev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
+ }
+ return 0;
+#else
+ return MCIERR_HARDWARE;
+#endif
+}
+
+/**************************************************************************
+* ANIM_mciClose [internal]
+*/
+DWORD ANIM_mciClose(UINT wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lpParms)
+{
+#ifdef linux
+ dprintf_mcianim(stddeb,"ANIM_mciClose(%u, %08X, %08X);\n",
+ wDevID, dwParam, lpParms);
+ if (AnimDev[wDevID].lpdwTrackLen != NULL) free(AnimDev[wDevID].lpdwTrackLen);
+ if (AnimDev[wDevID].lpdwTrackPos != NULL) free(AnimDev[wDevID].lpdwTrackPos);
+#endif
+}
+
+/**************************************************************************
+* ANIM_mciGetDevCaps [internal]
+*/
+DWORD ANIM_mciGetDevCaps(UINT wDevID, DWORD dwFlags,
+ LPMCI_GETDEVCAPS_PARMS lpParms)
+{
+#ifdef linux
+ dprintf_mcianim(stddeb,"ANIM_mciGetDevCaps(%u, %08X, %08X);\n",
+ wDevID, dwFlags, lpParms);
+ if (lpParms == NULL) return MCIERR_INTERNAL;
+ if (dwFlags & MCI_GETDEVCAPS_ITEM) {
+ dprintf_mcianim(stddeb,
+ "ANIM_mciGetDevCaps // MCI_GETDEVCAPS_ITEM dwItem=%08X;\n",
+ lpParms->dwItem);
+ switch(lpParms->dwItem) {
+ case MCI_GETDEVCAPS_CAN_RECORD:
+ lpParms->dwReturn = FALSE;
+ break;
+ case MCI_GETDEVCAPS_HAS_AUDIO:
+ lpParms->dwReturn = FALSE;
+ break;
+ case MCI_GETDEVCAPS_HAS_VIDEO:
+ lpParms->dwReturn = FALSE;
+ break;
+ case MCI_GETDEVCAPS_DEVICE_TYPE:
+ lpParms->dwReturn = MCI_DEVTYPE_ANIMATION;
+ break;
+ case MCI_GETDEVCAPS_USES_FILES:
+ lpParms->dwReturn = TRUE;
+ break;
+ case MCI_GETDEVCAPS_COMPOUND_DEVICE:
+ lpParms->dwReturn = FALSE;
+ break;
+ case MCI_GETDEVCAPS_CAN_EJECT:
+ lpParms->dwReturn = TRUE;
+ break;
+ case MCI_GETDEVCAPS_CAN_PLAY:
+ lpParms->dwReturn = FALSE;
+ break;
+ case MCI_GETDEVCAPS_CAN_SAVE:
+ lpParms->dwReturn = FALSE;
+ break;
+ default:
+ return MCIERR_UNRECOGNIZED_COMMAND;
+ }
+ }
+ dprintf_mcianim(stddeb,
+ "ANIM_mciGetDevCaps // lpParms->dwReturn=%08X;\n",
+ lpParms->dwReturn);
+ return 0;
+#else
+ return MCIERR_INTERNAL;
+#endif
+}
+
+/**************************************************************************
+* ANIM_mciInfo [internal]
+*/
+DWORD ANIM_mciInfo(UINT wDevID, DWORD dwFlags, LPMCI_INFO_PARMS lpParms)
+{
+#ifdef linux
+ dprintf_mcianim(stddeb,"ANIM_mciInfo(%u, %08X, %08X);\n",
+ wDevID, dwFlags, lpParms);
+ if (lpParms == NULL) return MCIERR_INTERNAL;
+ lpParms->lpstrReturn = NULL;
+ switch(dwFlags) {
+ case MCI_INFO_PRODUCT:
+ lpParms->lpstrReturn = "Linux ANIMATION 0.5";
+ break;
+ case MCI_INFO_FILE:
+ lpParms->lpstrReturn =
+ (LPSTR)AnimDev[wDevID].openParms.lpstrElementName;
+ break;
+ case MCI_ANIM_INFO_TEXT:
+ lpParms->lpstrReturn = "Animation Window";
+ break;
+ default:
+ return MCIERR_UNRECOGNIZED_COMMAND;
+ }
+ if (lpParms->lpstrReturn != NULL)
+ lpParms->dwRetSize = strlen(lpParms->lpstrReturn);
+ else
+ lpParms->dwRetSize = 0;
+ return 0;
+#else
+ return MCIERR_INTERNAL;
+#endif
+}
+
+/**************************************************************************
+* ANIM_mciStatus [internal]
+*/
+DWORD ANIM_mciStatus(UINT wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpParms)
+{
+#ifdef linux
+ dprintf_mcianim(stddeb,"ANIM_mciStatus(%u, %08X, %08X);\n",
+ wDevID, dwFlags, lpParms);
+ if (lpParms == NULL) return MCIERR_INTERNAL;
+ if (dwFlags & MCI_NOTIFY) {
+ dprintf_mcianim(stddeb,
+ "ANIM_mciStatus // MCI_NOTIFY_SUCCESSFUL %08X !\n",
+ lpParms->dwCallback);
+ mciDriverNotify((HWND)LOWORD(lpParms->dwCallback),
+ AnimDev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
+ }
+ if (dwFlags & MCI_STATUS_ITEM) {
+ switch(lpParms->dwItem) {
+ case MCI_STATUS_CURRENT_TRACK:
+ lpParms->dwReturn = AnimDev[wDevID].nCurTrack;
+ dprintf_mcianim(stddeb,"ANIM_mciStatus // CURRENT_TRACK=%u!\n", lpParms->dwReturn);
+ return 0;
+ case MCI_STATUS_LENGTH:
+ if (dwFlags & MCI_TRACK) {
+ dprintf_mcianim(stddeb,"ANIM_mciStatus // MCI_TRACK #%u LENGTH=??? !\n",
+ lpParms->dwTrack);
+ if (lpParms->dwTrack > AnimDev[wDevID].nTracks)
+ return MCIERR_OUTOFRANGE;
+ lpParms->dwReturn = AnimDev[wDevID].lpdwTrackLen[lpParms->dwTrack];
+ }
+ else
+ lpParms->dwReturn = AnimDev[wDevID].dwTotalLen;
+ lpParms->dwReturn = ANIM_CalcTime(wDevID,
+ AnimDev[wDevID].dwTimeFormat, lpParms->dwReturn);
+ dprintf_mcianim(stddeb,"ANIM_mciStatus // LENGTH=%u !\n", lpParms->dwReturn);
+ return 0;
+ case MCI_STATUS_MODE:
+ lpParms->dwReturn = AnimDev[wDevID].mode;
+ dprintf_mcianim(stddeb,"ANIM_mciStatus // MCI_STATUS_MODE=%08X !\n",
+ lpParms->dwReturn);
+ return 0;
+ case MCI_STATUS_MEDIA_PRESENT:
+ lpParms->dwReturn = TRUE;
+ dprintf_mcianim(stddeb,"ANIM_mciStatus // MCI_STATUS_MEDIA_PRESENT !\n");
+ return 0;
+ case MCI_STATUS_NUMBER_OF_TRACKS:
+ lpParms->dwReturn = 1;
+ dprintf_mcianim(stddeb,"ANIM_mciStatus // MCI_STATUS_NUMBER_OF_TRACKS = %u !\n",
+ lpParms->dwReturn);
+ if (lpParms->dwReturn == (WORD)-1) return MCIERR_INTERNAL;
+ return 0;
+ case MCI_STATUS_POSITION:
+ lpParms->dwReturn = AnimDev[wDevID].dwCurFrame;
+ if (dwFlags & MCI_STATUS_START) {
+ lpParms->dwReturn = 0;
+ dprintf_mcianim(stddeb,"CDAUDIO_mciStatus // get MCI_STATUS_START !\n");
+ }
+ if (dwFlags & MCI_TRACK) {
+ if (lpParms->dwTrack > AnimDev[wDevID].nTracks)
+ return MCIERR_OUTOFRANGE;
+ lpParms->dwReturn = AnimDev[wDevID].lpdwTrackPos[lpParms->dwTrack - 1];
+ dprintf_mcianim(stddeb,"ANIM_mciStatus // get MCI_TRACK #%u !\n", lpParms->dwTrack);
+ }
+ lpParms->dwReturn = ANIM_CalcTime(wDevID,
+ AnimDev[wDevID].dwTimeFormat, lpParms->dwReturn);
+ dprintf_mcianim(stddeb,"ANIM_mciStatus // MCI_STATUS_POSITION=%08X !\n",
+ lpParms->dwReturn);
+ return 0;
+ case MCI_STATUS_READY:
+ dprintf_mcianim(stddeb,"ANIM_mciStatus // MCI_STATUS_READY !\n");
+ lpParms->dwReturn = TRUE;
+ return 0;
+ case MCI_STATUS_TIME_FORMAT:
+ dprintf_mcianim(stddeb,"ANIM_mciStatus // MCI_STATUS_TIME_FORMAT !\n");
+ lpParms->dwReturn = MCI_FORMAT_MILLISECONDS;
+ return 0;
+ default:
+ fprintf(stderr,"ANIM_mciStatus // unknown command %04X !\n", lpParms->dwItem);
+ return MCIERR_UNRECOGNIZED_COMMAND;
+ }
+ }
+ fprintf(stderr,"ANIM_mciStatus // not MCI_STATUS_ITEM !\n");
+ return 0;
+#else
+ return MMSYSERR_NOTENABLED;
+#endif
+}
+
+
+/**************************************************************************
+* ANIM_CalcTime [internal]
+*/
+DWORD ANIM_CalcTime(UINT wDevID, DWORD dwFormatType, DWORD dwFrame)
+{
+ DWORD dwTime = 0;
+#ifdef linux
+ UINT wTrack;
+ UINT wMinutes;
+ UINT wSeconds;
+ UINT wFrames;
+ dprintf_mcianim(stddeb,"ANIM_CalcTime(%u, %08X, %lu);\n",
+ wDevID, dwFormatType, dwFrame);
+TryAGAIN:
+ switch (dwFormatType) {
+ case MCI_FORMAT_MILLISECONDS:
+ dwTime = dwFrame / ANIMFRAMES_PERSEC * 1000;
+ dprintf_mcianim(stddeb,
+ "ANIM_CalcTime // MILLISECONDS %u\n", dwTime);
+ break;
+ case MCI_FORMAT_MSF:
+ wMinutes = dwFrame / ANIMFRAMES_PERMIN;
+ wSeconds = (dwFrame - ANIMFRAMES_PERMIN * wMinutes) / ANIMFRAMES_PERSEC;
+ wFrames = dwFrame - ANIMFRAMES_PERMIN * wMinutes -
+ ANIMFRAMES_PERSEC * wSeconds;
+ dwTime = MCI_MAKE_MSF(wMinutes, wSeconds, wFrames);
+ dprintf_mcianim(stddeb,"ANIM_CalcTime // MSF %02u:%02u:%02u -> dwTime=%u\n",
+ wMinutes, wSeconds, wFrames, dwTime);
+ break;
+ case MCI_FORMAT_TMSF:
+ for (wTrack = 0; wTrack < AnimDev[wDevID].nTracks; wTrack++) {
+/* dwTime += AnimDev[wDevID].lpdwTrackLen[wTrack - 1];
+ printf("Adding trk#%u curpos=%u \n", dwTime);
+ if (dwTime >= dwFrame) break; */
+ if (AnimDev[wDevID].lpdwTrackPos[wTrack - 1] >= dwFrame) break;
+ }
+ wMinutes = dwFrame / ANIMFRAMES_PERMIN;
+ wSeconds = (dwFrame - ANIMFRAMES_PERMIN * wMinutes) / ANIMFRAMES_PERSEC;
+ wFrames = dwFrame - ANIMFRAMES_PERMIN * wMinutes -
+ ANIMFRAMES_PERSEC * wSeconds;
+ dwTime = MCI_MAKE_TMSF(wTrack, wMinutes, wSeconds, wFrames);
+ dprintf_mcianim(stddeb,
+ "ANIM_CalcTime // %02u-%02u:%02u:%02u\n",
+ wTrack, wMinutes, wSeconds, wFrames);
+ break;
+ default:
+ /* unknown format ! force TMSF ! ... */
+ dwFormatType = MCI_FORMAT_TMSF;
+ goto TryAGAIN;
+ }
+#endif
+ return dwTime;
+}
+
+
+/**************************************************************************
+* ANIM_CalcFrame [internal]
+*/
+DWORD ANIM_CalcFrame(UINT wDevID, DWORD dwFormatType, DWORD dwTime)
+{
+ DWORD dwFrame = 0;
+#ifdef linux
+ UINT wTrack;
+ dprintf_mcianim(stddeb,"ANIM_CalcFrame(%u, %08X, %lu);\n",
+ wDevID, dwFormatType, dwTime);
+TryAGAIN:
+ switch (dwFormatType) {
+ case MCI_FORMAT_MILLISECONDS:
+ dwFrame = dwTime * ANIMFRAMES_PERSEC / 1000;
+ dprintf_mcianim(stddeb,
+ "ANIM_CalcFrame // MILLISECONDS %u\n", dwFrame);
+ break;
+ case MCI_FORMAT_MSF:
+ dprintf_mcianim(stddeb,
+ "ANIM_CalcFrame // MSF %02u:%02u:%02u\n",
+ MCI_MSF_MINUTE(dwTime), MCI_MSF_SECOND(dwTime),
+ MCI_MSF_FRAME(dwTime));
+ dwFrame += ANIMFRAMES_PERMIN * MCI_MSF_MINUTE(dwTime);
+ dwFrame += ANIMFRAMES_PERSEC * MCI_MSF_SECOND(dwTime);
+ dwFrame += MCI_MSF_FRAME(dwTime);
+ break;
+ case MCI_FORMAT_TMSF:
+ wTrack = MCI_TMSF_TRACK(dwTime);
+ dprintf_mcianim(stddeb,
+ "ANIM_CalcFrame // TMSF %02u-%02u:%02u:%02u\n",
+ MCI_TMSF_TRACK(dwTime), MCI_TMSF_MINUTE(dwTime),
+ MCI_TMSF_SECOND(dwTime), MCI_TMSF_FRAME(dwTime));
+ dprintf_mcianim(stddeb,
+ "ANIM_CalcFrame // TMSF trackpos[%u]=%u\n",
+ wTrack, AnimDev[wDevID].lpdwTrackPos[wTrack - 1]);
+ dwFrame = AnimDev[wDevID].lpdwTrackPos[wTrack - 1];
+ dwFrame += ANIMFRAMES_PERMIN * MCI_TMSF_MINUTE(dwTime);
+ dwFrame += ANIMFRAMES_PERSEC * MCI_TMSF_SECOND(dwTime);
+ dwFrame += MCI_TMSF_FRAME(dwTime);
+ break;
+ default:
+ /* unknown format ! force TMSF ! ... */
+ dwFormatType = MCI_FORMAT_TMSF;
+ goto TryAGAIN;
+ }
+#endif
+ return dwFrame;
+}
+
+
+
+/**************************************************************************
+* ANIM_mciPlay [internal]
+*/
+DWORD ANIM_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms)
+{
+#ifdef linux
+ int start, end;
+ dprintf_mcianim(stddeb,"ANIM_mciPlay(%u, %08X, %08X);\n",
+ wDevID, dwFlags, lpParms);
+ if (lpParms == NULL) return MCIERR_INTERNAL;
+ start = 0; end = AnimDev[wDevID].dwTotalLen;
+ AnimDev[wDevID].nCurTrack = 1;
+ if (dwFlags & MCI_FROM) {
+ start = ANIM_CalcFrame(wDevID,
+ AnimDev[wDevID].dwTimeFormat, lpParms->dwFrom);
+ dprintf_mcianim(stddeb,"ANIM_mciPlay // MCI_FROM=%08X -> %u \n",
+ lpParms->dwFrom, start);
+ }
+ if (dwFlags & MCI_TO) {
+ end = ANIM_CalcFrame(wDevID,
+ AnimDev[wDevID].dwTimeFormat, lpParms->dwTo);
+ dprintf_mcianim(stddeb,
+ "ANIM_mciPlay // MCI_TO=%08X -> %u \n",
+ lpParms->dwTo, end);
+ }
+ AnimDev[wDevID].mode = MCI_MODE_PLAY;
+ if (dwFlags & MCI_NOTIFY) {
+ dprintf_mcianim(stddeb,
+ "ANIM_mciPlay // MCI_NOTIFY_SUCCESSFUL %08X !\n",
+ lpParms->dwCallback);
+ mciDriverNotify((HWND)LOWORD(lpParms->dwCallback),
+ AnimDev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
+ }
+ return 0;
+#else
+ return MCIERR_HARDWARE;
+#endif
+}
+
+/**************************************************************************
+* ANIM_mciStop [internal]
+*/
+DWORD ANIM_mciStop(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
+{
+#ifdef linux
+ dprintf_mcianim(stddeb,"ANIM_mciStop(%u, %08X, %08X);\n",
+ wDevID, dwFlags, lpParms);
+ if (lpParms == NULL) return MCIERR_INTERNAL;
+ AnimDev[wDevID].mode = MCI_MODE_STOP;
+ if (dwFlags & MCI_NOTIFY) {
+ dprintf_mcianim(stddeb,
+ "ANIM_mciStop // MCI_NOTIFY_SUCCESSFUL %08X !\n",
+ lpParms->dwCallback);
+ mciDriverNotify((HWND)LOWORD(lpParms->dwCallback),
+ AnimDev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
+ }
+ return 0;
+#else
+ return MCIERR_HARDWARE;
+#endif
+}
+
+/**************************************************************************
+* ANIM_mciPause [internal]
+*/
+DWORD ANIM_mciPause(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
+{
+#ifdef linux
+ dprintf_mcianim(stddeb,"ANIM_mciPause(%u, %08X, %08X);\n",
+ wDevID, dwFlags, lpParms);
+ if (lpParms == NULL) return MCIERR_INTERNAL;
+ AnimDev[wDevID].mode = MCI_MODE_PAUSE;
+ if (dwFlags & MCI_NOTIFY) {
+ dprintf_mcianim(stddeb,
+ "ANIM_mciPause // MCI_NOTIFY_SUCCESSFUL %08X !\n",
+ lpParms->dwCallback);
+ mciDriverNotify((HWND)LOWORD(lpParms->dwCallback),
+ AnimDev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
+ }
+ return 0;
+#else
+ return MCIERR_HARDWARE;
+#endif
+}
+
+/**************************************************************************
+* ANIM_mciResume [internal]
+*/
+DWORD ANIM_mciResume(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
+{
+#ifdef linux
+ dprintf_mcianim(stddeb,"ANIM_mciResume(%u, %08X, %08X);\n",
+ wDevID, dwFlags, lpParms);
+ if (lpParms == NULL) return MCIERR_INTERNAL;
+ AnimDev[wDevID].mode = MCI_MODE_STOP;
+ if (dwFlags & MCI_NOTIFY) {
+ dprintf_mcianim(stddeb,
+ "ANIM_mciResume // MCI_NOTIFY_SUCCESSFUL %08X !\n",
+ lpParms->dwCallback);
+ mciDriverNotify((HWND)LOWORD(lpParms->dwCallback),
+ AnimDev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
+ }
+ return 0;
+#else
+ return MCIERR_HARDWARE;
+#endif
+}
+
+/**************************************************************************
+* ANIM_mciSeek [internal]
+*/
+DWORD ANIM_mciSeek(UINT wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lpParms)
+{
+#ifdef linux
+ DWORD dwRet;
+ MCI_PLAY_PARMS PlayParms;
+ dprintf_mcianim(stddeb,"ANIM_mciSeek(%u, %08X, %08X);\n",
+ wDevID, dwFlags, lpParms);
+ if (lpParms == NULL) return MCIERR_INTERNAL;
+ AnimDev[wDevID].mode = MCI_MODE_SEEK;
+ switch(dwFlags) {
+ case MCI_SEEK_TO_START:
+ PlayParms.dwFrom = 0;
+ break;
+ case MCI_SEEK_TO_END:
+ PlayParms.dwFrom = AnimDev[wDevID].dwTotalLen;
+ break;
+ case MCI_TO:
+ PlayParms.dwFrom = lpParms->dwTo;
+ break;
+ }
+ dwRet = ANIM_mciPlay(wDevID, MCI_WAIT | MCI_FROM, &PlayParms);
+ if (dwRet != 0) return dwRet;
+ dwRet = ANIM_mciStop(wDevID, MCI_WAIT, (LPMCI_GENERIC_PARMS)&PlayParms);
+ if (dwFlags & MCI_NOTIFY) {
+ dprintf_mcianim(stddeb,
+ "ANIM_mciSeek // MCI_NOTIFY_SUCCESSFUL %08X !\n",
+ lpParms->dwCallback);
+ mciDriverNotify((HWND)LOWORD(lpParms->dwCallback),
+ AnimDev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
+ }
+ return dwRet;
+#else
+ return MCIERR_HARDWARE;
+#endif
+}
+
+
+/**************************************************************************
+* ANIM_mciSet [internal]
+*/
+DWORD ANIM_mciSet(UINT wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParms)
+{
+#ifdef linux
+ dprintf_mcianim(stddeb,"ANIM_mciSet(%u, %08X, %08X);\n",
+ wDevID, dwFlags, lpParms);
+ if (lpParms == NULL) return MCIERR_INTERNAL;
+/*
+ printf("ANIM_mciSet // dwTimeFormat=%08X\n", lpParms->dwTimeFormat);
+ printf("ANIM_mciSet // dwAudio=%08X\n", lpParms->dwAudio);
+*/
+ if (dwFlags & MCI_SET_TIME_FORMAT) {
+ switch (lpParms->dwTimeFormat) {
+ case MCI_FORMAT_MILLISECONDS:
+ dprintf_mcianim(stddeb,
+ "ANIM_mciSet // MCI_FORMAT_MILLISECONDS !\n");
+ break;
+ case MCI_FORMAT_MSF:
+ dprintf_mcianim(stddeb,"ANIM_mciSet // MCI_FORMAT_MSF !\n");
+ break;
+ case MCI_FORMAT_TMSF:
+ dprintf_mcianim(stddeb,"ANIM_mciSet // MCI_FORMAT_TMSF !\n");
+ break;
+ default:
+ fprintf(stderr,"ANIM_mciSet // bad time format !\n");
+ return MCIERR_BAD_TIME_FORMAT;
+ }
+ AnimDev[wDevID].dwTimeFormat = lpParms->dwTimeFormat;
+ }
+ if (dwFlags & MCI_SET_VIDEO) return MCIERR_UNSUPPORTED_FUNCTION;
+ if (dwFlags & MCI_SET_ON) return MCIERR_UNSUPPORTED_FUNCTION;
+ if (dwFlags & MCI_SET_OFF) return MCIERR_UNSUPPORTED_FUNCTION;
+ if (dwFlags & MCI_NOTIFY) {
+ dprintf_mcianim(stddeb,
+ "ANIM_mciSet // MCI_NOTIFY_SUCCESSFUL %08X !\n",
+ lpParms->dwCallback);
+ mciDriverNotify((HWND)LOWORD(lpParms->dwCallback),
+ AnimDev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
+ }
+ return 0;
+#else
+ return MCIERR_HARDWARE;
+#endif
+}
+
+
+/**************************************************************************
+* ANIM_DriverProc [sample driver]
+*/
+LRESULT ANIM_DriverProc(DWORD dwDevID, HDRVR hDriv, WORD wMsg,
+ DWORD dwParam1, DWORD dwParam2)
+{
+#ifdef linux
+ switch(wMsg) {
+ case DRV_LOAD:
+ return (LRESULT)1L;
+ case DRV_FREE:
+ return (LRESULT)1L;
+ case DRV_OPEN:
+ case MCI_OPEN_DRIVER:
+ case MCI_OPEN:
+ return ANIM_mciOpen(dwParam1, (LPMCI_OPEN_PARMS)dwParam2);
+ case DRV_CLOSE:
+ case MCI_CLOSE_DRIVER:
+ case MCI_CLOSE:
+ return ANIM_mciClose(dwDevID, dwParam1,
+ (LPMCI_GENERIC_PARMS)dwParam2);
+ case DRV_ENABLE:
+ return (LRESULT)1L;
+ case DRV_DISABLE:
+ return (LRESULT)1L;
+ case DRV_QUERYCONFIGURE:
+ return (LRESULT)1L;
+ case DRV_CONFIGURE:
+ MessageBox((HWND)NULL, "Sample MultiMedia Linux Driver !",
+ "MMLinux Driver", MB_OK);
+ return (LRESULT)1L;
+ case DRV_INSTALL:
+ return (LRESULT)DRVCNF_RESTART;
+ case DRV_REMOVE:
+ return (LRESULT)DRVCNF_RESTART;
+ case MCI_GETDEVCAPS:
+ return ANIM_mciGetDevCaps(dwDevID, dwParam1,
+ (LPMCI_GETDEVCAPS_PARMS)dwParam2);
+ case MCI_INFO:
+ return ANIM_mciInfo(dwDevID, dwParam1,
+ (LPMCI_INFO_PARMS)dwParam2);
+ case MCI_STATUS:
+ return ANIM_mciStatus(dwDevID, dwParam1,
+ (LPMCI_STATUS_PARMS)dwParam2);
+ case MCI_SET:
+ return ANIM_mciSet(dwDevID, dwParam1,
+ (LPMCI_SET_PARMS)dwParam2);
+ case MCI_PLAY:
+ return ANIM_mciPlay(dwDevID, dwParam1,
+ (LPMCI_PLAY_PARMS)dwParam2);
+ case MCI_STOP:
+ return ANIM_mciStop(dwDevID, dwParam1,
+ (LPMCI_GENERIC_PARMS)dwParam2);
+ case MCI_PAUSE:
+ return ANIM_mciPause(dwDevID, dwParam1,
+ (LPMCI_GENERIC_PARMS)dwParam2);
+ case MCI_RESUME:
+ return ANIM_mciResume(dwDevID, dwParam1,
+ (LPMCI_GENERIC_PARMS)dwParam2);
+ case MCI_SEEK:
+ return ANIM_mciSeek(dwDevID, dwParam1,
+ (LPMCI_SEEK_PARMS)dwParam2);
+ default:
+ return DefDriverProc(dwDevID, hDriv, wMsg, dwParam1, dwParam2);
+ }
+#else
+ return MCIERR_HARDWARE;
+#endif
+}
+
+
+/*-----------------------------------------------------------------------*/
+
+#endif /* #ifdef BUILTIN_MMSYSTEM */
diff --git a/misc/mcicda.c b/misc/mcicda.c
index 213ebff..de2a3d8 100644
--- a/misc/mcicda.c
+++ b/misc/mcicda.c
@@ -93,7 +93,7 @@
wDevID = lpParms->wDeviceID;
if (CDADev[wDevID].nUseCount > 0) {
/* The driver already open on this channel */
- /* If the driver was% op, ened shareable before and this open specifies */
+ /* If the driver was opened shareable before and this open specifies */
/* shareable then increment the use count */
if (CDADev[wDevID].fShareable && (dwFlags & MCI_OPEN_SHAREABLE))
++CDADev[wDevID].nUseCount;
@@ -468,7 +468,7 @@
}
/**************************************************************************
-* CDAUDIO_GetNumberOfTracks [internal]
+* CDAUDIO_GetTracksInfo [internal]
*/
BOOL CDAUDIO_GetTracksInfo(UINT wDevID)
{
@@ -544,7 +544,7 @@
/**************************************************************************
-* CDAUDIO_GetNumberOfTracks [internal]
+* CDAUDIO_GetCDStatus [internal]
*/
BOOL CDAUDIO_GetCDStatus(UINT wDevID)
{
diff --git a/misc/message.c b/misc/message.c
index 3f766df..5063736 100644
--- a/misc/message.c
+++ b/misc/message.c
@@ -6,7 +6,6 @@
static char Copyright[] = "Copyright Martin Ayotte, 1993";
-#define DEBUG_MSGBOX
#include <stdlib.h>
#include <stdio.h>
@@ -21,7 +20,12 @@
#include "heap.h"
#include "win.h"
#include "texts.h"
-
+#include "stddebug.h"
+/* #define DEBUG_MSGBOX */
+/* #undef DEBUG_MSGBOX */
+#include "debug.h"
+
+
/*
* Defaults for button-texts
*/
@@ -76,17 +80,13 @@
wndPtr = WIN_FindWndPtr(hWnd);
if (wndPtr == NULL) {
hInst = hSysRes;
-#ifdef DEBUG_MSGBOX
- printf("MessageBox(NULL, %08X='%s', %08X='%s', %04X)\n",
+ dprintf_msgbox(stddeb,"MessageBox(NULL, %08X='%s', %08X='%s', %04X)\n",
str, str, title, title, type);
-#endif
}
else {
hInst = wndPtr->hInstance;
-#ifdef DEBUG_MSGBOX
- printf("MessageBox(%04X, %08X='%s', %08X='%s', %04X)\n",
+ dprintf_msgbox(stddeb,"MessageBox(%04X, %08X='%s', %08X='%s', %04X)\n",
hWnd, str, str, title, title, type);
-#endif
}
lpmb = (LPMSGBOX) malloc(sizeof(MSGBOX));
memset(lpmb, 0, sizeof(MSGBOX));
@@ -116,9 +116,7 @@
wndClass.hbrBackground = GetStockObject(WHITE_BRUSH);
wndClass.lpszMenuName = NULL;
wndClass.lpszClassName = "MESSAGEBOX";
-#ifdef DEBUG_MSGBOX
- printf( "MessageBox // before RegisterClass, '%s' '%s' !\n", str, title);
-#endif
+ dprintf_msgbox(stddeb, "MessageBox // before RegisterClass, '%s' '%s' !\n", str, title);
if (!RegisterClass(&wndClass)) {
printf("Unable to Register class 'MESSAGEBOX' !\n");
if (lpmb != NULL) free(lpmb);
@@ -134,9 +132,7 @@
if (lpmb != NULL) free(lpmb);
return 0;
}
-#ifdef DEBUG_MSGBOX
- printf( "MessageBox // before Msg Loop !\n");
-#endif
+ dprintf_msgbox(stddeb, "MessageBox // before Msg Loop !\n");
while(TRUE) {
if (!lpmb->ActiveFlg) break;
if (!GetMessage(&msg, (HWND)NULL, 0, 0)) break;
@@ -158,9 +154,7 @@
nRet = lpmb->wRetVal;
if (lpmb != NULL) free(lpmb);
if (!UnregisterClass("MESSAGEBOX", hInst)) return 0;
-#ifdef DEBUG_MSGBOX
- printf( "MessageBox return %04X !\n", nRet);
-#endif
+ dprintf_msgbox(stddeb, "MessageBox return %04X !\n", nRet);
return(nRet);
}
@@ -190,26 +184,17 @@
DWORD OldTextColor;
RECT rect;
LPMSGBOX lpmb;
- BITMAP bm;
- HBITMAP hBitMap;
- HDC hMemDC;
- HICON hIcon;
- HINSTANCE hInst2;
- int x;
+
switch(message) {
case WM_CREATE:
-#ifdef DEBUG_MSGBOX
- printf("MessageBox WM_CREATE hWnd=%04X !\n", hWnd);
-#endif
+ dprintf_msgbox(stddeb, "MessageBox WM_CREATE hWnd=%04X !\n", hWnd);
wndPtr = WIN_FindWndPtr(hWnd);
createStruct = (CREATESTRUCT *)lParam;
lpmb = (LPMSGBOX)createStruct->lpCreateParams;
if (lpmb == NULL) break;
*((LPMSGBOX *)&wndPtr->wExtra[1]) = lpmb;
-#ifdef DEBUG_MSGBOX
- printf("MessageBox WM_CREATE title='%s' str='%s' !\n",
+ dprintf_msgbox(stddeb, "MessageBox WM_CREATE title='%s' str='%s' !\n",
lpmb->Title, lpmb->Str);
-#endif
GetClientRect(hWnd, &rect);
CopyRect(&lpmb->rectStr, &rect);
lpmb->rectStr.bottom -= 32;
@@ -295,17 +280,13 @@
}
break;
case WM_SHOWWINDOW:
-#ifdef DEBUG_MSGBOX
- printf("MessageBox WM_SHOWWINDOW hWnd=%04X !\n", hWnd);
-#endif
+ dprintf_msgbox(stddeb, "MessageBox WM_SHOWWINDOW hWnd=%04X !\n", hWnd);
if (!(wParam == 0 && lParam == 0L)) {
InvalidateRect(hWnd, NULL, TRUE);
}
break;
case WM_PAINT:
-#ifdef DEBUG_MSGBOX
- printf("MessageBox WM_PAINT hWnd=%04X !\n", hWnd);
-#endif
+ dprintf_msgbox(stddeb, "MessageBox WM_PAINT hWnd=%04X !\n", hWnd);
lpmb = MsgBoxGetStorageHeader(hWnd);
if (lpmb == NULL) break;
if (!lpmb->ActiveFlg) break;
@@ -328,14 +309,10 @@
DrawText(hDC, lpmb->Str, -1, &rect, DT_CENTER | DT_WORDBREAK);
SetTextColor(hDC, OldTextColor);
EndPaint(hWnd, &ps);
-#ifdef DEBUG_MSGBOX
- printf("MessageBox End of WM_PAINT !\n");
-#endif
+ dprintf_msgbox(stddeb, "MessageBox End of WM_PAINT !\n");
break;
case WM_DESTROY:
-#ifdef DEBUG_MSGBOX
- printf("MessageBox WM_DESTROY !\n");
-#endif
+ dprintf_msgbox(stddeb, "MessageBox WM_DESTROY !\n");
ReleaseCapture();
lpmb = MsgBoxGetStorageHeader(hWnd);
if (lpmb == NULL) break;
@@ -343,9 +320,7 @@
if (lpmb->hWndYes) DestroyWindow(lpmb->hWndYes);
if (lpmb->hWndNo) DestroyWindow(lpmb->hWndNo);
if (lpmb->hWndCancel) DestroyWindow(lpmb->hWndCancel);
-#ifdef DEBUG_MSGBOX
- printf("MessageBox WM_DESTROY end !\n");
-#endif
+ dprintf_msgbox(stddeb, "MessageBox WM_DESTROY end !\n");
lpmb->ActiveFlg = FALSE;
break;
case WM_COMMAND:
@@ -353,9 +328,7 @@
if (lpmb == NULL) break;
if (wParam < IDOK || wParam > IDNO) return(0);
lpmb->wRetVal = wParam;
-#ifdef DEBUG_MSGBOX
- printf("MessageBox sending WM_CLOSE !\n");
-#endif
+ dprintf_msgbox(stddeb, "MessageBox sending WM_CLOSE !\n");
PostMessage(hWnd, WM_CLOSE, 0, 0L);
break;
case WM_CHAR:
@@ -398,12 +371,10 @@
HDC hDC;
HDC hMemDC;
PAINTSTRUCT ps;
- int OldBackMode;
- HFONT hOldFont;
RECT rect;
BITMAP bm;
- int X;
OFSTRUCT ofstruct;
+ HBITMAP hbmpOld;
static LPSTR ptr;
static char str[256];
static HBITMAP hBitMap = 0;
@@ -438,10 +409,11 @@
FrameRect(hDC, &rect, GetStockObject(BLACK_BRUSH));
InflateRect(&rect, -10, -10);
hMemDC = CreateCompatibleDC(hDC);
- SelectObject(hMemDC, hBitMap);
+ hbmpOld = SelectObject(hMemDC, hBitMap);
GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&bm);
BitBlt(hDC, rect.left, rect.top, bm.bmWidth, bm.bmHeight,
hMemDC, 0, 0, SRCCOPY);
+ SelectObject( hMemDC, hbmpOld );
DeleteDC(hMemDC);
EndPaint(hDlg, &ps);
return TRUE;
@@ -465,7 +437,7 @@
return TRUE;
case IDCANCEL:
case IDOK:
-CloseDLG: if (hBitMap != 0 ) DeleteObject(hBitMap);
+ if (hBitMap != 0 ) DeleteObject(hBitMap);
if (ptr != NULL) free(ptr);
EndDialog(hDlg, TRUE);
return TRUE;
diff --git a/misc/midi.c b/misc/midi.c
new file mode 100644
index 0000000..cc20a08
--- /dev/null
+++ b/misc/midi.c
@@ -0,0 +1,983 @@
+/*
+ * Sample MIDI Wine Driver for Linux
+ *
+ * Copyright 1994 Martin Ayotte
+ */
+static char Copyright[] = "Copyright Martin Ayotte, 1994";
+
+#ifndef WINELIB
+#define BUILTIN_MMSYSTEM
+#endif
+
+#ifdef BUILTIN_MMSYSTEM
+
+#define DEBUG_MCIMIDI
+
+#include "stdio.h"
+#include "win.h"
+#include "user.h"
+#include "driver.h"
+#include "mmsystem.h"
+
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#ifdef linux
+#include <linux/soundcard.h>
+#endif
+
+#ifdef linux
+#define MIDI_DEV "/dev/midi"
+
+#ifdef SOUND_VERSION
+#define IOCTL(a,b,c) ioctl(a,b,&c)
+#else
+#define IOCTL(a,b,c) (c = ioctl(a,b,c) )
+#endif
+
+#define MAX_MIDIINDRV 2
+#define MAX_MIDIOUTDRV 2
+#define MAX_MCIMIDIDRV 2
+
+typedef struct {
+ int unixdev;
+ int state;
+ DWORD bufsize;
+ MIDIOPENDESC midiDesc;
+ WORD wFlags;
+ MIDIHDR lpQueueHdr;
+ DWORD dwTotalPlayed;
+ } LINUX_MIDIIN;
+
+typedef struct {
+ int unixdev;
+ int state;
+ DWORD bufsize;
+ MIDIOPENDESC midiDesc;
+ WORD wFlags;
+ MIDIHDR lpQueueHdr;
+ DWORD dwTotalPlayed;
+ } LINUX_MIDIOUT;
+
+typedef struct {
+ int nUseCount; /* Incremented for each shared open */
+ BOOL fShareable; /* TRUE if first open was shareable */
+ WORD wNotifyDeviceID; /* MCI device ID with a pending notification */
+ HANDLE hCallback; /* Callback handle for pending notification */
+ HMMIO hFile; /* mmio file handle open as Element */
+ MCI_OPEN_PARMS openParms;
+ MIDIHDR MidiHdr;
+ WORD dwStatus;
+ } LINUX_MCIMIDI;
+
+static LINUX_MIDIIN MidiInDev[MAX_MIDIINDRV];
+static LINUX_MIDIOUT MidiOutDev[MAX_MIDIOUTDRV];
+static LINUX_MCIMIDI MCIMidiDev[MAX_MCIMIDIDRV];
+#endif
+
+DWORD MIDI_mciOpen(DWORD dwFlags, LPMCI_OPEN_PARMS lpParms);
+DWORD MIDI_mciClose(UINT wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lpParms);
+DWORD MIDI_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms);
+DWORD MIDI_mciRecord(UINT wDevID, DWORD dwFlags, LPMCI_RECORD_PARMS lpParms);
+DWORD MIDI_mciStop(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms);
+DWORD MIDI_mciPause(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms);
+DWORD MIDI_mciResume(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms);
+DWORD MIDI_mciSet(UINT wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParms);
+DWORD MIDI_mciStatus(UINT wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpParms);
+DWORD MIDI_mciGetDevCaps(UINT wDevID, DWORD dwFlags, LPMCI_GETDEVCAPS_PARMS lpParms);
+DWORD MIDI_mciInfo(UINT wDevID, DWORD dwFlags, LPMCI_INFO_PARMS lpParms);
+
+
+/**************************************************************************
+* MIDI_NotifyClient [internal]
+*/
+DWORD MIDI_NotifyClient(UINT wDevID, WORD wMsg,
+ DWORD dwParam1, DWORD dwParam2)
+{
+#ifdef linux
+ if (MidiInDev[wDevID].wFlags != DCB_NULL && !DriverCallback(
+ MidiInDev[wDevID].midiDesc.dwCallback, MidiInDev[wDevID].wFlags,
+ MidiInDev[wDevID].midiDesc.hMidi, wMsg,
+ MidiInDev[wDevID].midiDesc.dwInstance, dwParam1, dwParam2)) {
+ printf("MIDI_NotifyClient // can't notify client !\n");
+ return MMSYSERR_NOERROR;
+ }
+#else
+ return MMSYSERR_NOTENABLED;
+#endif
+}
+
+
+/**************************************************************************
+* AUDIO_DriverProc [sample driver]
+*/
+LRESULT MIDI_DriverProc(DWORD dwDevID, HDRVR hDriv, WORD wMsg,
+ DWORD dwParam1, DWORD dwParam2)
+{
+#ifdef linux
+ switch(wMsg) {
+ case DRV_LOAD:
+ return (LRESULT)1L;
+ case DRV_FREE:
+ return (LRESULT)1L;
+ case DRV_OPEN:
+ return (LRESULT)1L;
+ case DRV_CLOSE:
+ return (LRESULT)1L;
+ case DRV_ENABLE:
+ return (LRESULT)1L;
+ case DRV_DISABLE:
+ return (LRESULT)1L;
+ case DRV_QUERYCONFIGURE:
+ return (LRESULT)1L;
+ case DRV_CONFIGURE:
+ MessageBox((HWND)NULL, "Sample Midi Linux Driver !",
+ "MMLinux Driver", MB_OK);
+ return (LRESULT)1L;
+ case DRV_INSTALL:
+ return (LRESULT)DRVCNF_RESTART;
+ case DRV_REMOVE:
+ return (LRESULT)DRVCNF_RESTART;
+ case MCI_OPEN_DRIVER:
+ case MCI_OPEN:
+ return MIDI_mciOpen(dwParam1, (LPMCI_OPEN_PARMS)dwParam2);
+ case MCI_CLOSE_DRIVER:
+ case MCI_CLOSE:
+ return MIDI_mciClose(dwDevID, dwParam1, (LPMCI_GENERIC_PARMS)dwParam2);
+ case MCI_PLAY:
+ return MIDI_mciPlay(dwDevID, dwParam1, (LPMCI_PLAY_PARMS)dwParam2);
+ case MCI_RECORD:
+ return MIDI_mciRecord(dwDevID, dwParam1, (LPMCI_RECORD_PARMS)dwParam2);
+ case MCI_STOP:
+ return MIDI_mciStop(dwDevID, dwParam1, (LPMCI_GENERIC_PARMS)dwParam2);
+ case MCI_SET:
+ return MIDI_mciSet(dwDevID, dwParam1, (LPMCI_SET_PARMS)dwParam2);
+ case MCI_PAUSE:
+ return MIDI_mciPause(dwDevID, dwParam1, (LPMCI_GENERIC_PARMS)dwParam2);
+ case MCI_RESUME:
+ return MIDI_mciResume(dwDevID, dwParam1, (LPMCI_GENERIC_PARMS)dwParam2);
+ case MCI_STATUS:
+ return MIDI_mciStatus(dwDevID, dwParam1, (LPMCI_STATUS_PARMS)dwParam2);
+ case MCI_GETDEVCAPS:
+ return MIDI_mciGetDevCaps(dwDevID, dwParam1, (LPMCI_GETDEVCAPS_PARMS)dwParam2);
+ case MCI_INFO:
+ return MIDI_mciInfo(dwDevID, dwParam1, (LPMCI_INFO_PARMS)dwParam2);
+ default:
+ return DefDriverProc(dwDevID, hDriv, wMsg, dwParam1, dwParam2);
+ }
+#else
+ return MMSYSERR_NOTENABLED;
+#endif
+}
+
+/**************************************************************************
+* MIDI_mciOpen [internal]
+*/
+DWORD MIDI_mciOpen(DWORD dwFlags, LPMCI_OPEN_PARMS lpParms)
+{
+#ifdef linux
+ int hFile;
+ UINT wDevID;
+ OFSTRUCT OFstruct;
+ MIDIOPENDESC MidiDesc;
+ DWORD dwRet;
+ char str[128];
+ LPSTR ptr;
+#ifdef DEBUG_MCIMIDI
+ printf("MIDI_mciOpen(%08X, %08X)\n", dwFlags, lpParms);
+#endif
+ if (lpParms == NULL) return MCIERR_INTERNAL;
+ wDevID = lpParms->wDeviceID;
+ if (MCIMidiDev[wDevID].nUseCount > 0) {
+ /* The driver already open on this channel */
+ /* If the driver was opened shareable before and this open specifies */
+ /* shareable then increment the use count */
+ if (MCIMidiDev[wDevID].fShareable && (dwFlags & MCI_OPEN_SHAREABLE))
+ ++MCIMidiDev[wDevID].nUseCount;
+ else
+ return MCIERR_MUST_USE_SHAREABLE;
+ }
+ else {
+ MCIMidiDev[wDevID].nUseCount = 1;
+ MCIMidiDev[wDevID].fShareable = dwFlags & MCI_OPEN_SHAREABLE;
+ }
+ if (dwFlags & MCI_OPEN_ELEMENT) {
+ printf("MIDI_mciOpen // MCI_OPEN_ELEMENT '%s' !\n",
+ lpParms->lpstrElementName);
+/* printf("MIDI_mciOpen // cdw='%s'\n", DOS_GetCurrentDir(DOS_GetDefaultDrive())); */
+ if (strlen(lpParms->lpstrElementName) > 0) {
+ strcpy(str, lpParms->lpstrElementName);
+ AnsiUpper(str);
+ MCIMidiDev[wDevID].hFile = mmioOpen(str, NULL,
+ MMIO_ALLOCBUF | MMIO_READWRITE | MMIO_EXCLUSIVE);
+ if (MCIMidiDev[wDevID].hFile == 0) {
+ printf("MIDI_mciOpen // can't find file='%s' !\n", str);
+ return MCIERR_FILE_NOT_FOUND;
+ }
+ }
+ else
+ MCIMidiDev[wDevID].hFile = 0;
+ }
+ printf("MIDI_mciOpen // hFile=%u\n", MCIMidiDev[wDevID].hFile);
+ memcpy(&MCIMidiDev[wDevID].openParms, lpParms, sizeof(MCI_OPEN_PARMS));
+ MCIMidiDev[wDevID].wNotifyDeviceID = lpParms->wDeviceID;
+ MCIMidiDev[wDevID].dwStatus = MCI_MODE_STOP;
+ MidiDesc.hMidi = 0;
+ if (MCIMidiDev[wDevID].hFile != 0) {
+ MMCKINFO mmckInfo;
+ MMCKINFO ckMainRIFF;
+ if (mmioDescend(MCIMidiDev[wDevID].hFile, &ckMainRIFF, NULL, 0) != 0) {
+ return MCIERR_INTERNAL;
+ }
+#ifdef DEBUG_MCIMIDI
+ printf("MIDI_mciOpen // ParentChunk ckid=%.4s fccType=%.4s cksize=%08lX \n",
+ (LPSTR)&ckMainRIFF.ckid, (LPSTR)&ckMainRIFF.fccType,
+ ckMainRIFF.cksize);
+#endif
+ if (ckMainRIFF.ckid != FOURCC_RIFF) return MCIERR_INTERNAL;
+ if (ckMainRIFF.fccType != mmioFOURCC('R', 'M', 'I', 'D') &&
+ ckMainRIFF.fccType != mmioFOURCC('M', 'T', 'h', 'd')) {
+ return MCIERR_INTERNAL;
+ }
+ mmckInfo.ckid = mmioFOURCC('d', 'a', 't', 'a');
+ if (mmioDescend(MCIMidiDev[wDevID].hFile, &mmckInfo, &ckMainRIFF, MMIO_FINDCHUNK) != 0) {
+ return MCIERR_INTERNAL;
+ }
+#ifdef DEBUG_MCIMIDI
+ printf("MIDI_mciOpen // Chunk Found ckid=%.4s fccType=%.4s cksize=%08lX \n",
+ (LPSTR)&mmckInfo.ckid, (LPSTR)&mmckInfo.fccType,
+ mmckInfo.cksize);
+#endif
+ }
+ dwRet = modMessage(0, MODM_OPEN, 0, (DWORD)&MidiDesc, CALLBACK_NULL);
+ dwRet = midMessage(0, MIDM_OPEN, 0, (DWORD)&MidiDesc, CALLBACK_NULL);
+ return 0;
+#else
+ return MMSYSERR_NOTENABLED;
+#endif
+}
+
+
+/**************************************************************************
+* MIDI_mciClose [internal]
+*/
+DWORD MIDI_mciClose(UINT wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lpParms)
+{
+#ifdef linux
+ DWORD dwRet;
+#ifdef DEBUG_MCIMIDI
+ printf("MIDI_mciClose(%u, %08X, %08X);\n", wDevID, dwParam, lpParms);
+#endif
+ if (MCIMidiDev[wDevID].dwStatus != MCI_MODE_STOP) {
+ MIDI_mciStop(wDevID, MCI_WAIT, lpParms);
+ }
+ MCIMidiDev[wDevID].dwStatus = MCI_MODE_STOP;
+ MCIMidiDev[wDevID].nUseCount--;
+ if (MCIMidiDev[wDevID].nUseCount == 0) {
+ if (MCIMidiDev[wDevID].hFile != 0) {
+ close(MCIMidiDev[wDevID].hFile);
+ MCIMidiDev[wDevID].hFile = 0;
+ }
+ dwRet = modMessage(0, MODM_CLOSE, 0, 0L, 0L);
+ if (dwRet != MMSYSERR_NOERROR) return MCIERR_INTERNAL;
+ dwRet = midMessage(0, MIDM_CLOSE, 0, 0L, 0L);
+ if (dwRet != MMSYSERR_NOERROR) return MCIERR_INTERNAL;
+ }
+ return 0;
+#else
+ return 0;
+#endif
+}
+
+
+/**************************************************************************
+* MIDI_mciPlay [internal]
+*/
+DWORD MIDI_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms)
+{
+#ifdef linux
+ int count;
+ int start, end;
+ LPMIDIHDR lpMidiHdr;
+ DWORD dwRet;
+#ifdef DEBUG_MCIMIDI
+ printf("MIDI_mciPlay(%u, %08X, %08X);\n", wDevID, dwFlags, lpParms);
+#endif
+ if (MCIMidiDev[wDevID].hFile == 0) {
+ printf("MIDI_mciPlay // can't find file='%s' !\n",
+ MCIMidiDev[wDevID].openParms.lpstrElementName);
+ return MCIERR_FILE_NOT_FOUND;
+ }
+ start = 1; end = 99999;
+ if (dwFlags & MCI_FROM) {
+ start = lpParms->dwFrom;
+ printf("MIDI_mciPlay // MCI_FROM=%d \n", start);
+ }
+ if (dwFlags & MCI_TO) {
+ end = lpParms->dwTo;
+ printf("MIDI_mciPlay // MCI_TO=%d \n", end);
+ }
+/**/
+ if (dwFlags & MCI_NOTIFY) {
+ printf("MIDI_mciPlay // MCI_NOTIFY %08X !\n", lpParms->dwCallback);
+ switch(fork()) {
+ case -1:
+ printf("MIDI_mciPlay // Can't 'fork' process !\n");
+ break;
+ case 0:
+ printf("MIDI_mciPlay // process started ! play in background ...\n");
+ break;
+ default:
+ printf("MIDI_mciPlay // process started ! return to caller...\n");
+ return 0;
+ }
+ }
+/**/
+ lpMidiHdr = &MCIMidiDev[wDevID].MidiHdr;
+ lpMidiHdr->lpData = (LPSTR) malloc(64000);
+ lpMidiHdr->dwBufferLength = 32000;
+ lpMidiHdr->dwUser = 0L;
+ lpMidiHdr->dwFlags = 0L;
+ dwRet = modMessage(0, MODM_PREPARE, 0, (DWORD)lpMidiHdr, sizeof(MIDIHDR));
+/* printf("MIDI_mciPlay // after MODM_PREPARE \n"); */
+ MCIMidiDev[wDevID].dwStatus = MCI_MODE_PLAY;
+ while(MCIMidiDev[wDevID].dwStatus != MCI_MODE_STOP) {
+ printf("MIDI_mciPlay // MCIMidiDev[wDevID].dwStatus=%p %d\n",
+ &MCIMidiDev[wDevID].dwStatus, MCIMidiDev[wDevID].dwStatus);
+ count = mmioRead(MCIMidiDev[wDevID].hFile, lpMidiHdr->lpData, lpMidiHdr->dwBufferLength);
+ if (count < 1) break;
+ lpMidiHdr->dwBytesRecorded = count;
+#ifdef DEBUG_MCIMIDI
+ printf("MIDI_mciPlay // before MODM_LONGDATA lpMidiHdr=%08X dwBytesRecorded=%u\n",
+ lpMidiHdr, lpMidiHdr->dwBytesRecorded);
+#endif
+/* dwRet = modMessage(0, MODM_LONGDATA, 0, (DWORD)lpMidiHdr, sizeof(MIDIHDR)); */
+ }
+ dwRet = modMessage(0, MODM_UNPREPARE, 0, (DWORD)lpMidiHdr, sizeof(MIDIHDR));
+ if (lpMidiHdr->lpData != NULL) {
+ free(lpMidiHdr->lpData);
+ lpMidiHdr->lpData = NULL;
+ }
+ MCIMidiDev[wDevID].dwStatus = MCI_MODE_STOP;
+ if (dwFlags & MCI_NOTIFY) {
+#ifdef DEBUG_MCIMIDI
+ printf("MIDI_mciPlay // MCI_NOTIFY_SUCCESSFUL %08X !\n", lpParms->dwCallback);
+#endif
+ mciDriverNotify((HWND)LOWORD(lpParms->dwCallback),
+ MCIMidiDev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
+ exit(1);
+ }
+ return 0;
+#else
+ return MMSYSERR_NOTENABLED;
+#endif
+}
+
+
+/**************************************************************************
+* MIDI_mciRecord [internal]
+*/
+DWORD MIDI_mciRecord(UINT wDevID, DWORD dwFlags, LPMCI_RECORD_PARMS lpParms)
+{
+#ifdef linux
+ int count;
+ int start, end;
+ LPMIDIHDR lpMidiHdr;
+ DWORD dwRet;
+#ifdef DEBUG_MCIMIDI
+ printf("MIDI_mciRecord(%u, %08X, %08X);\n", wDevID, dwFlags, lpParms);
+#endif
+ if (MCIMidiDev[wDevID].hFile == 0) {
+ printf("MIDI_mciRecord // can't find file='%s' !\n",
+ MCIMidiDev[wDevID].openParms.lpstrElementName);
+ return MCIERR_FILE_NOT_FOUND;
+ }
+ start = 1; end = 99999;
+ if (dwFlags & MCI_FROM) {
+ start = lpParms->dwFrom;
+ printf("MIDI_mciRecord // MCI_FROM=%d \n", start);
+ }
+ if (dwFlags & MCI_TO) {
+ end = lpParms->dwTo;
+ printf("MIDI_mciRecord // MCI_TO=%d \n", end);
+ }
+ lpMidiHdr = &MCIMidiDev[wDevID].MidiHdr;
+ lpMidiHdr->lpData = (LPSTR) malloc(64000);
+ lpMidiHdr->dwBufferLength = 32000;
+ lpMidiHdr->dwUser = 0L;
+ lpMidiHdr->dwFlags = 0L;
+ dwRet = midMessage(0, MIDM_PREPARE, 0, (DWORD)lpMidiHdr, sizeof(MIDIHDR));
+ printf("MIDI_mciRecord // after MIDM_PREPARE \n");
+ MCIMidiDev[wDevID].dwStatus = MCI_MODE_RECORD;
+ while(MCIMidiDev[wDevID].dwStatus != MCI_MODE_STOP) {
+ printf("MIDI_mciRecord // MCIMidiDev[wDevID].dwStatus=%p %d\n",
+ &MCIMidiDev[wDevID].dwStatus, MCIMidiDev[wDevID].dwStatus);
+ lpMidiHdr->dwBytesRecorded = 0;
+ dwRet = midMessage(0, MIDM_START, 0, 0L, 0L);
+ printf("MIDI_mciRecord // after MIDM_START lpMidiHdr=%08X dwBytesRecorded=%u\n",
+ lpMidiHdr, lpMidiHdr->dwBytesRecorded);
+ if (lpMidiHdr->dwBytesRecorded == 0) break;
+ }
+ printf("MIDI_mciRecord // before MIDM_UNPREPARE \n");
+ dwRet = midMessage(0, MIDM_UNPREPARE, 0, (DWORD)lpMidiHdr, sizeof(MIDIHDR));
+ printf("MIDI_mciRecord // after MIDM_UNPREPARE \n");
+ if (lpMidiHdr->lpData != NULL) {
+ free(lpMidiHdr->lpData);
+ lpMidiHdr->lpData = NULL;
+ }
+ MCIMidiDev[wDevID].dwStatus = MCI_MODE_STOP;
+ if (dwFlags & MCI_NOTIFY) {
+#ifdef DEBUG_MCIMIDI
+ printf("MIDI_mciRecord // MCI_NOTIFY_SUCCESSFUL %08X !\n", lpParms->dwCallback);
+#endif
+ mciDriverNotify((HWND)LOWORD(lpParms->dwCallback),
+ MCIMidiDev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
+ }
+ return 0;
+#else
+ return MMSYSERR_NOTENABLED;
+#endif
+}
+
+
+/**************************************************************************
+* MIDI_mciStop [internal]
+*/
+DWORD MIDI_mciStop(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
+{
+#ifdef linux
+#ifdef DEBUG_MCIMIDI
+ printf("MIDI_mciStop(%u, %08X, %08X);\n", wDevID, dwFlags, lpParms);
+#endif
+ if (lpParms == NULL) return MCIERR_INTERNAL;
+ MCIMidiDev[wDevID].dwStatus = MCI_MODE_STOP;
+ printf("MIDI_mciStop // MCIMidiDev[wDevID].dwStatus=%p %d\n",
+ &MCIMidiDev[wDevID].dwStatus, MCIMidiDev[wDevID].dwStatus);
+ return 0;
+#else
+ return MCIERR_INTERNAL;
+#endif
+}
+
+
+/**************************************************************************
+* MIDI_mciPause [internal]
+*/
+DWORD MIDI_mciPause(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
+{
+#ifdef linux
+#ifdef DEBUG_MCIMIDI
+ printf("MIDI_mciPause(%u, %08X, %08X);\n", wDevID, dwFlags, lpParms);
+#endif
+ if (lpParms == NULL) return MCIERR_INTERNAL;
+ return 0;
+#else
+ return MCIERR_INTERNAL;
+#endif
+}
+
+
+/**************************************************************************
+* MIDI_mciResume [internal]
+*/
+DWORD MIDI_mciResume(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
+{
+#ifdef linux
+#ifdef DEBUG_MCIMIDI
+ printf("MIDI_mciResume(%u, %08X, %08X);\n", wDevID, dwFlags, lpParms);
+#endif
+ if (lpParms == NULL) return MCIERR_INTERNAL;
+ return 0;
+#else
+ return MCIERR_INTERNAL;
+#endif
+}
+
+
+/**************************************************************************
+* MIDI_mciSet [internal]
+*/
+DWORD MIDI_mciSet(UINT wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParms)
+{
+#ifdef linux
+#ifdef DEBUG_MCIMIDI
+ printf("MIDI_mciSet(%u, %08X, %08X);\n", wDevID, dwFlags, lpParms);
+#endif
+ if (lpParms == NULL) return MCIERR_INTERNAL;
+#ifdef DEBUG_MCIMIDI
+ printf("MIDI_mciSet // dwTimeFormat=%08X\n", lpParms->dwTimeFormat);
+ printf("MIDI_mciSet // dwAudio=%08X\n", lpParms->dwAudio);
+#endif
+ if (dwFlags & MCI_SET_TIME_FORMAT) {
+ switch (lpParms->dwTimeFormat) {
+ case MCI_FORMAT_MILLISECONDS:
+ printf("MIDI_mciSet // MCI_FORMAT_MILLISECONDS !\n");
+ break;
+ case MCI_FORMAT_BYTES:
+ printf("MIDI_mciSet // MCI_FORMAT_BYTES !\n");
+ break;
+ case MCI_FORMAT_SAMPLES:
+ printf("MIDI_mciSet // MCI_FORMAT_SAMPLES !\n");
+ break;
+ default:
+ printf("MIDI_mciSet // bad time format !\n");
+ return MCIERR_BAD_TIME_FORMAT;
+ }
+ }
+ if (dwFlags & MCI_SET_VIDEO) return MCIERR_UNSUPPORTED_FUNCTION;
+ if (dwFlags & MCI_SET_DOOR_OPEN) return MCIERR_UNSUPPORTED_FUNCTION;
+ if (dwFlags & MCI_SET_DOOR_CLOSED) return MCIERR_UNSUPPORTED_FUNCTION;
+ if (dwFlags & MCI_SET_AUDIO) {
+ printf("MIDI_mciSet // MCI_SET_AUDIO !\n");
+ }
+ if (dwFlags && MCI_SET_ON) {
+ printf("MIDI_mciSet // MCI_SET_ON !\n");
+ if (dwFlags && MCI_SET_AUDIO_LEFT) {
+ printf("MIDI_mciSet // MCI_SET_AUDIO_LEFT !\n");
+ }
+ if (dwFlags && MCI_SET_AUDIO_RIGHT) {
+ printf("MIDI_mciSet // MCI_SET_AUDIO_RIGHT !\n");
+ }
+ }
+ if (dwFlags & MCI_SET_OFF) {
+ printf("MIDI_mciSet // MCI_SET_OFF !\n");
+ }
+ if (dwFlags & MCI_SEQ_SET_MASTER) {
+ printf("MIDI_mciSet // MCI_SEQ_SET_MASTER !\n");
+ }
+ if (dwFlags & MCI_SEQ_SET_SLAVE) {
+ printf("MIDI_mciSet // MCI_SEQ_SET_SLAVE !\n");
+ }
+ if (dwFlags & MCI_SEQ_SET_OFFSET) {
+ printf("MIDI_mciSet // MCI_SEQ_SET_OFFSET !\n");
+ }
+ if (dwFlags & MCI_SEQ_SET_PORT) {
+ printf("MIDI_mciSet // MCI_SEQ_SET_PORT !\n");
+ }
+ if (dwFlags & MCI_SEQ_SET_TEMPO) {
+ printf("MIDI_mciSet // MCI_SEQ_SET_TEMPO !\n");
+ }
+ return 0;
+#else
+ return MCIERR_INTERNAL;
+#endif
+}
+
+
+/**************************************************************************
+* MIDI_mciStatus [internal]
+*/
+DWORD MIDI_mciStatus(UINT wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpParms)
+{
+#ifdef linux
+#ifdef DEBUG_MCIMIDI
+ printf("MIDI_mciStatus(%u, %08X, %08X);\n", wDevID, dwFlags, lpParms);
+#endif
+ if (lpParms == NULL) return MCIERR_INTERNAL;
+ if (dwFlags & MCI_STATUS_ITEM) {
+ switch(lpParms->dwItem) {
+ case MCI_STATUS_CURRENT_TRACK:
+ lpParms->dwReturn = 1;
+ break;
+ case MCI_STATUS_LENGTH:
+ lpParms->dwReturn = 5555;
+ if (dwFlags & MCI_TRACK) {
+ lpParms->dwTrack = 1;
+ lpParms->dwReturn = 2222;
+ }
+ break;
+ case MCI_STATUS_MODE:
+ lpParms->dwReturn = MCI_MODE_STOP;
+ break;
+ case MCI_STATUS_MEDIA_PRESENT:
+ printf("MIDI_mciStatus // MCI_STATUS_MEDIA_PRESENT !\n");
+ lpParms->dwReturn = TRUE;
+ break;
+ case MCI_STATUS_NUMBER_OF_TRACKS:
+ lpParms->dwReturn = 1;
+ break;
+ case MCI_STATUS_POSITION:
+ lpParms->dwReturn = 3333;
+ if (dwFlags & MCI_STATUS_START) {
+ lpParms->dwItem = 1;
+ }
+ if (dwFlags & MCI_TRACK) {
+ lpParms->dwTrack = 1;
+ lpParms->dwReturn = 777;
+ }
+ break;
+ case MCI_STATUS_READY:
+ printf("MIDI_mciStatus // MCI_STATUS_READY !\n");
+ lpParms->dwReturn = TRUE;
+ break;
+ case MCI_STATUS_TIME_FORMAT:
+ printf("MIDI_mciStatus // MCI_STATUS_TIME_FORMAT !\n");
+ lpParms->dwReturn = MCI_FORMAT_MILLISECONDS;
+ break;
+ case MCI_SEQ_STATUS_DIVTYPE:
+ printf("MIDI_mciStatus // MCI_SEQ_STATUS_DIVTYPE !\n");
+ lpParms->dwReturn = 0;
+ break;
+ case MCI_SEQ_STATUS_MASTER:
+ printf("MIDI_mciStatus // MCI_SEQ_STATUS_MASTER !\n");
+ lpParms->dwReturn = 0;
+ break;
+ case MCI_SEQ_STATUS_SLAVE:
+ printf("MIDI_mciStatus // MCI_SEQ_STATUS_SLAVE !\n");
+ lpParms->dwReturn = 0;
+ break;
+ case MCI_SEQ_STATUS_OFFSET:
+ printf("MIDI_mciStatus // MCI_SEQ_STATUS_OFFSET !\n");
+ lpParms->dwReturn = 0;
+ break;
+ case MCI_SEQ_STATUS_PORT:
+ printf("MIDI_mciStatus // MCI_SEQ_STATUS_PORT !\n");
+ lpParms->dwReturn = 0;
+ break;
+ case MCI_SEQ_STATUS_TEMPO:
+ printf("MIDI_mciStatus // MCI_SEQ_STATUS_TEMPO !\n");
+ lpParms->dwReturn = 0;
+ break;
+ default:
+ printf("MIDI_mciStatus // unknowm command %04X !\n", lpParms->dwItem);
+ return MCIERR_UNRECOGNIZED_COMMAND;
+ }
+ }
+ if (dwFlags & MCI_NOTIFY) {
+ printf("MIDI_mciStatus // MCI_NOTIFY_SUCCESSFUL %08X !\n", lpParms->dwCallback);
+ mciDriverNotify((HWND)LOWORD(lpParms->dwCallback),
+ MCIMidiDev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
+ }
+ return 0;
+#else
+ return MCIERR_INTERNAL;
+#endif
+}
+
+/**************************************************************************
+* MIDI_mciGetDevCaps [internal]
+*/
+DWORD MIDI_mciGetDevCaps(UINT wDevID, DWORD dwFlags,
+ LPMCI_GETDEVCAPS_PARMS lpParms)
+{
+#ifdef linux
+ printf("MIDI_mciGetDevCaps(%u, %08X, %08X);\n", wDevID, dwFlags, lpParms);
+ if (lpParms == NULL) return MCIERR_INTERNAL;
+ if (dwFlags & MCI_GETDEVCAPS_ITEM) {
+ switch(lpParms->dwItem) {
+ case MCI_GETDEVCAPS_CAN_RECORD:
+ lpParms->dwReturn = TRUE;
+ break;
+ case MCI_GETDEVCAPS_HAS_AUDIO:
+ lpParms->dwReturn = TRUE;
+ break;
+ case MCI_GETDEVCAPS_HAS_VIDEO:
+ lpParms->dwReturn = FALSE;
+ break;
+ case MCI_GETDEVCAPS_DEVICE_TYPE:
+ lpParms->dwReturn = MCI_DEVTYPE_SEQUENCER;
+ break;
+ case MCI_GETDEVCAPS_USES_FILES:
+ lpParms->dwReturn = TRUE;
+ break;
+ case MCI_GETDEVCAPS_COMPOUND_DEVICE:
+ lpParms->dwReturn = TRUE;
+ break;
+ case MCI_GETDEVCAPS_CAN_EJECT:
+ lpParms->dwReturn = FALSE;
+ break;
+ case MCI_GETDEVCAPS_CAN_PLAY:
+ lpParms->dwReturn = TRUE;
+ break;
+ case MCI_GETDEVCAPS_CAN_SAVE:
+ lpParms->dwReturn = FALSE;
+ break;
+ default:
+ return MCIERR_UNRECOGNIZED_COMMAND;
+ }
+ }
+ return 0;
+#else
+ return MCIERR_INTERNAL;
+#endif
+}
+
+/**************************************************************************
+* MIDI_mciInfo [internal]
+*/
+DWORD MIDI_mciInfo(UINT wDevID, DWORD dwFlags, LPMCI_INFO_PARMS lpParms)
+{
+#ifdef linux
+ printf("MIDI_mciInfo(%u, %08X, %08X);\n", wDevID, dwFlags, lpParms);
+ if (lpParms == NULL) return MCIERR_INTERNAL;
+ lpParms->lpstrReturn = NULL;
+ switch(dwFlags) {
+ case MCI_INFO_PRODUCT:
+ lpParms->lpstrReturn = "Linux Sound System 0.5";
+ break;
+ case MCI_INFO_FILE:
+ lpParms->lpstrReturn = "FileName";
+ break;
+ default:
+ return MCIERR_UNRECOGNIZED_COMMAND;
+ }
+ if (lpParms->lpstrReturn != NULL)
+ lpParms->dwRetSize = strlen(lpParms->lpstrReturn);
+ else
+ lpParms->dwRetSize = 0;
+ return 0;
+#else
+ return MCIERR_INTERNAL;
+#endif
+}
+
+
+/*-----------------------------------------------------------------------*/
+
+
+/**************************************************************************
+* midGetDevCaps [internal]
+*/
+DWORD midGetDevCaps(WORD wDevID, LPMIDIINCAPS lpCaps, DWORD dwSize)
+{
+ printf("midGetDevCaps(%u, %08X, %08X);\n", wDevID, lpCaps, dwSize);
+ return MMSYSERR_NOTENABLED;
+}
+
+/**************************************************************************
+* midOpen [internal]
+*/
+DWORD midOpen(WORD wDevID, LPMIDIOPENDESC lpDesc, DWORD dwFlags)
+{
+ printf("modOpen(%u, %08X, %08X);\n", wDevID, lpDesc, dwFlags);
+ return MMSYSERR_NOTENABLED;
+}
+
+/**************************************************************************
+* midClose [internal]
+*/
+DWORD midClose(WORD wDevID)
+{
+ printf("midClose(%u);\n", wDevID);
+ return MMSYSERR_NOTENABLED;
+}
+
+/**************************************************************************
+* midAddBuffer [internal]
+*/
+DWORD midAddBuffer(WORD wDevID, LPMIDIHDR lpMidiHdr, DWORD dwSize)
+{
+ printf("midAddBuffer(%u, %08X, %08X);\n", wDevID, lpMidiHdr, dwSize);
+ return MMSYSERR_NOTENABLED;
+}
+
+/**************************************************************************
+* midPrepare [internal]
+*/
+DWORD midPrepare(WORD wDevID, LPMIDIHDR lpMidiHdr, DWORD dwSize)
+{
+ printf("midPrepare(%u, %08X, %08X);\n", wDevID, lpMidiHdr, dwSize);
+ return MMSYSERR_NOTENABLED;
+}
+
+/**************************************************************************
+* midUnprepare [internal]
+*/
+DWORD midUnprepare(WORD wDevID, LPMIDIHDR lpMidiHdr, DWORD dwSize)
+{
+ printf("midUnprepare(%u, %08X, %08X);\n", wDevID, lpMidiHdr, dwSize);
+ return MMSYSERR_NOTENABLED;
+}
+
+/**************************************************************************
+* midReset [internal]
+*/
+DWORD midReset(WORD wDevID)
+{
+ printf("midReset(%u);\n", wDevID);
+ return MMSYSERR_NOTENABLED;
+}
+
+
+/**************************************************************************
+* midStart [internal]
+*/
+DWORD midStart(WORD wDevID)
+{
+ printf("midStart(%u);\n", wDevID);
+ return MMSYSERR_NOTENABLED;
+}
+
+
+/**************************************************************************
+* midStop [internal]
+*/
+DWORD midStop(WORD wDevID)
+{
+ printf("midStop(%u);\n", wDevID);
+ return MMSYSERR_NOTENABLED;
+}
+
+
+/**************************************************************************
+* midMessage [sample driver]
+*/
+DWORD midMessage(WORD wDevID, WORD wMsg, DWORD dwUser,
+ DWORD dwParam1, DWORD dwParam2)
+{
+ printf("midMessage(%u, %04X, %08X, %08X, %08X);\n",
+ wDevID, wMsg, dwUser, dwParam1, dwParam2);
+ switch(wMsg) {
+ case MIDM_OPEN:
+ return midOpen(wDevID, (LPMIDIOPENDESC)dwParam1, dwParam2);
+ case MIDM_CLOSE:
+ return midClose(wDevID);
+ case MIDM_ADDBUFFER:
+ return midAddBuffer(wDevID, (LPMIDIHDR)dwParam1, dwParam2);
+ case MIDM_PREPARE:
+ return midPrepare(wDevID, (LPMIDIHDR)dwParam1, dwParam2);
+ case MIDM_UNPREPARE:
+ return midUnprepare(wDevID, (LPMIDIHDR)dwParam1, dwParam2);
+ case MIDM_GETDEVCAPS:
+ return midGetDevCaps(wDevID, (LPMIDIINCAPS)dwParam1, dwParam2);
+ case MIDM_GETNUMDEVS:
+ return 1L;
+ case MIDM_RESET:
+ return midReset(wDevID);
+ case MIDM_START:
+ return midStart(wDevID);
+ case MIDM_STOP:
+ return midStop(wDevID);
+ }
+ return MMSYSERR_NOTSUPPORTED;
+}
+
+
+
+/*-----------------------------------------------------------------------*/
+
+
+/**************************************************************************
+* modGetDevCaps [internal]
+*/
+DWORD modGetDevCaps(WORD wDevID, LPMIDIOUTCAPS lpCaps, DWORD dwSize)
+{
+ printf("modGetDevCaps(%u, %08X, %08X);\n", wDevID, lpCaps, dwSize);
+ return MMSYSERR_NOTENABLED;
+}
+
+
+/**************************************************************************
+* modOpen [internal]
+*/
+DWORD modOpen(WORD wDevID, LPMIDIOPENDESC lpDesc, DWORD dwFlags)
+{
+ printf("modOpen(%u, %08X, %08X);\n", wDevID, lpDesc, dwFlags);
+ return MMSYSERR_NOTENABLED;
+}
+
+
+/**************************************************************************
+* modClose [internal]
+*/
+DWORD modClose(WORD wDevID)
+{
+ printf("modClose(%u);\n", wDevID);
+ return MMSYSERR_NOTENABLED;
+}
+
+/**************************************************************************
+* modData [internal]
+*/
+DWORD modData(WORD wDevID, LPMIDIHDR lpMidiHdr, DWORD dwSize)
+{
+ printf("modData(%u, %08X, %08X);\n", wDevID, lpMidiHdr, dwSize);
+ return MMSYSERR_NOTENABLED;
+}
+
+/**************************************************************************
+* modLongData [internal]
+*/
+DWORD modLongData(WORD wDevID, LPMIDIHDR lpMidiHdr, DWORD dwSize)
+{
+ printf("modLongData(%u, %08X, %08X);\n", wDevID, lpMidiHdr, dwSize);
+ return MMSYSERR_NOTENABLED;
+}
+
+/**************************************************************************
+* modPrepare [internal]
+*/
+DWORD modPrepare(WORD wDevID, LPMIDIHDR lpMidiHdr, DWORD dwSize)
+{
+ printf("modPrepare(%u, %08X, %08X);\n", wDevID, lpMidiHdr, dwSize);
+ return MMSYSERR_NOTENABLED;
+}
+
+/**************************************************************************
+* modUnprepare [internal]
+*/
+DWORD modUnprepare(WORD wDevID, LPMIDIHDR lpMidiHdr, DWORD dwSize)
+{
+ printf("modUnprepare(%u, %08X, %08X);\n", wDevID, lpMidiHdr, dwSize);
+ return MMSYSERR_NOTENABLED;
+}
+
+/**************************************************************************
+* modReset [internal]
+*/
+DWORD modReset(WORD wDevID)
+{
+ printf("modReset(%u);\n", wDevID);
+ return MMSYSERR_NOTENABLED;
+}
+
+
+/**************************************************************************
+* modGetPosition [internal]
+*/
+DWORD modGetPosition(WORD wDevID, LPMMTIME lpTime, DWORD uSize)
+{
+ printf("modGetposition(%u, %08X, %08X);\n", wDevID, lpTime, uSize);
+ return MMSYSERR_NOTENABLED;
+}
+
+
+/**************************************************************************
+* modMessage [sample driver]
+*/
+DWORD modMessage(WORD wDevID, WORD wMsg, DWORD dwUser,
+ DWORD dwParam1, DWORD dwParam2)
+{
+ printf("modMessage(%u, %04X, %08X, %08X, %08X);\n",
+ wDevID, wMsg, dwUser, dwParam1, dwParam2);
+ switch(wMsg) {
+ case MODM_OPEN:
+ return modOpen(wDevID, (LPMIDIOPENDESC)dwParam1, dwParam2);
+ case MODM_CLOSE:
+ return modClose(wDevID);
+ case MODM_DATA:
+ return modData(wDevID, (LPMIDIHDR)dwParam1, dwParam2);
+ case MODM_LONGDATA:
+ return modLongData(wDevID, (LPMIDIHDR)dwParam1, dwParam2);
+ case MODM_PREPARE:
+ return modPrepare(wDevID, (LPMIDIHDR)dwParam1, dwParam2);
+ case MODM_UNPREPARE:
+ return modUnprepare(wDevID, (LPMIDIHDR)dwParam1, dwParam2);
+ case MODM_GETDEVCAPS:
+ return modGetDevCaps(wDevID, (LPMIDIOUTCAPS)dwParam1, dwParam2);
+ case MODM_GETNUMDEVS:
+ return 1L;
+ case MODM_GETVOLUME:
+ return 0L;
+ case MODM_SETVOLUME:
+ return 0L;
+ case MODM_RESET:
+ return modReset(wDevID);
+ }
+ return MMSYSERR_NOTSUPPORTED;
+}
+
+
+/*-----------------------------------------------------------------------*/
+
+
+#endif /* #ifdef BUILTIN_MMSYSTEM */
diff --git a/misc/mmaux.c b/misc/mmaux.c
index 80ed111..1c4cc06 100644
--- a/misc/mmaux.c
+++ b/misc/mmaux.c
@@ -11,6 +11,8 @@
#ifdef BUILTIN_MMSYSTEM
+#define EMULATE_SB16
+
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
@@ -53,10 +55,55 @@
return MMSYSERR_NOTENABLED;
}
if (ioctl(mixer, SOUND_MIXER_READ_LINE, &volume) == -1) {
+ close(mixer);
printf("AUX_GetDevCaps // unable read mixer !\n");
return MMSYSERR_NOTENABLED;
}
close(mixer);
+#ifdef EMULATE_SB16
+ lpCaps->wMid = 0x0002;
+ lpCaps->vDriverVersion = 0x0200;
+ lpCaps->dwSupport = AUXCAPS_VOLUME | AUXCAPS_LRVOLUME;
+ switch (wDevID) {
+ case 0:
+ lpCaps->wPid = 0x0196;
+ strcpy(lpCaps->szPname, "SB16 Aux: Wave");
+ lpCaps->wTechnology = AUXCAPS_AUXIN;
+ break;
+ case 1:
+ lpCaps->wPid = 0x0197;
+ strcpy(lpCaps->szPname, "SB16 Aux: Midi Synth");
+ lpCaps->wTechnology = AUXCAPS_AUXIN;
+ break;
+ case 2:
+ lpCaps->wPid = 0x0191;
+ strcpy(lpCaps->szPname, "SB16 Aux: CD");
+ lpCaps->wTechnology = AUXCAPS_CDAUDIO;
+ break;
+ case 3:
+ lpCaps->wPid = 0x0192;
+ strcpy(lpCaps->szPname, "SB16 Aux: Line-In");
+ lpCaps->wTechnology = AUXCAPS_AUXIN;
+ break;
+ case 4:
+ lpCaps->wPid = 0x0193;
+ strcpy(lpCaps->szPname, "SB16 Aux: Mic");
+ lpCaps->wTechnology = AUXCAPS_AUXIN;
+ break;
+ case 5:
+ lpCaps->wPid = 0x0194;
+ strcpy(lpCaps->szPname, "SB16 Aux: Master");
+ lpCaps->wTechnology = AUXCAPS_AUXIN;
+ break;
+ }
+#else
+ lpCaps->wMid = 0xAA;
+ lpCaps->wPid = 0x55;
+ lpCaps->vDriverVersion = 0x0100;
+ strcpy(lpCaps->szPname, "Generic Linux Auxiliary Driver");
+ lpCaps->wTechnology = AUXCAPS_CDAUDIO;
+ lpCaps->dwSupport = AUXCAPS_VOLUME | AUXCAPS_LRVOLUME;
+#endif
return MMSYSERR_NOERROR;
#else
return MMSYSERR_NOTENABLED;
@@ -67,12 +114,13 @@
/**************************************************************************
* AUX_GetVolume [internal]
*/
-DWORD AUX_GetVolume(WORD wDevID, DWORD dwParam)
+DWORD AUX_GetVolume(WORD wDevID, LPDWORD lpdwVol)
{
#ifdef linux
int mixer;
int volume;
- printf("AUX_GetVolume(%u, %08X);\n", wDevID, dwParam);
+ printf("AUX_GetVolume(%u, %08X);\n", wDevID, lpdwVol);
+ if (lpdwVol == NULL) return MMSYSERR_NOTENABLED;
if ((mixer = open(MIXER_DEV, O_RDWR)) < 0) {
printf("Linux 'AUX_GetVolume' // mixer device not available !\n");
return MMSYSERR_NOTENABLED;
@@ -82,6 +130,7 @@
return MMSYSERR_NOTENABLED;
}
close(mixer);
+ *lpdwVol = MAKELONG(volume, volume);
return MMSYSERR_NOERROR;
#else
return MMSYSERR_NOTENABLED;
@@ -125,9 +174,10 @@
case AUXDM_GETDEVCAPS:
return AUX_GetDevCaps(wDevID, (LPAUXCAPS)dwParam1, dwParam2);
case AUXDM_GETNUMDEVS:
- return 0L;
+ printf("AUX_GetNumDevs();\n");
+ return 1L;
case AUXDM_GETVOLUME:
- return AUX_GetVolume(wDevID, dwParam1);
+ return AUX_GetVolume(wDevID, (LPDWORD)dwParam1);
case AUXDM_SETVOLUME:
return AUX_SetVolume(wDevID, dwParam1);
}
diff --git a/misc/mmsystem.c b/misc/mmsystem.c
index 4da49f9..db60012 100644
--- a/misc/mmsystem.c
+++ b/misc/mmsystem.c
@@ -16,6 +16,15 @@
#include "user.h"
#include "driver.h"
#include "mmsystem.h"
+#include "stddebug.h"
+/* #define DEBUG_MCI */
+/* #undef DEBUG_MCI */
+/* #define DEBUG_MMTIME */
+/* #undef DEBUG_MMTIME */
+/* #define DEBUG_MMIO */
+/* #undef DEBUG_MMIO */
+#include "debug.h"
+
static WORD mciActiveDev = 0;
static BOOL mmTimeStarted = FALSE;
@@ -291,8 +300,10 @@
*/
UINT WINAPI auxGetDevCaps(UINT uDeviceID, AUXCAPS FAR* lpCaps, UINT uSize)
{
- printf("auxGetDevCaps !\n");
- return 0;
+ printf("auxGetDevCaps(%04X, %08X, %d) !\n",
+ uDeviceID, lpCaps, uSize);
+ return auxMessage(uDeviceID, AUXDM_GETDEVCAPS,
+ 0L, (DWORD)lpCaps, (DWORD)uSize);
}
/**************************************************************************
@@ -300,8 +311,8 @@
*/
UINT WINAPI auxGetVolume(UINT uDeviceID, DWORD FAR* lpdwVolume)
{
- printf("auxGetVolume !\n");
- return 0;
+ printf("auxGetVolume(%04X, %08X) !\n", uDeviceID, lpdwVolume);
+ return auxMessage(uDeviceID, AUXDM_GETVOLUME, 0L, (DWORD)lpdwVolume, 0L);
}
/**************************************************************************
@@ -309,8 +320,8 @@
*/
UINT WINAPI auxSetVolume(UINT uDeviceID, DWORD dwVolume)
{
- printf("auxSetVolume !\n");
- return 0;
+ printf("auxSetVolume(%04X, %08X) !\n", uDeviceID, dwVolume);
+ return auxMessage(uDeviceID, AUXDM_SETVOLUME, 0L, dwVolume, 0L);
}
/**************************************************************************
@@ -318,8 +329,10 @@
*/
DWORD WINAPI auxOutMessage(UINT uDeviceID, UINT uMessage, DWORD dw1, DWORD dw2)
{
- printf("auxOutMessage !\n");
- return 0L;
+ LPMIDIOPENDESC lpDesc;
+ printf("auxOutMessage(%04X, %04X, %08X, %08X)\n",
+ uDeviceID, uMessage, dw1, dw2);
+ return auxMessage(uDeviceID, uMessage, 0L, dw1, dw2);
}
/**************************************************************************
@@ -656,11 +669,11 @@
return WAVE_DriverProc(0, 0, MCI_OPEN_DRIVER,
dwParam, (DWORD)lpParms);
case MCI_DEVTYPE_SEQUENCER:
- printf("MCI_OPEN // No SEQUENCER yet !\n");
- return MCIERR_DEVICE_NOT_INSTALLED;
+ return MIDI_DriverProc(0, 0, MCI_OPEN_DRIVER,
+ dwParam, (DWORD)lpParms);
case MCI_DEVTYPE_ANIMATION:
- printf("MCI_OPEN // No ANIMATION yet !\n");
- return MCIERR_DEVICE_NOT_INSTALLED;
+ return ANIM_DriverProc(0, 0, MCI_OPEN_DRIVER,
+ dwParam, (DWORD)lpParms);
case MCI_DEVTYPE_DIGITAL_VIDEO:
printf("MCI_OPEN // No DIGITAL_VIDEO yet !\n");
return MCIERR_DEVICE_NOT_INSTALLED;
@@ -691,6 +704,10 @@
dwRet = WAVE_DriverProc(mciDrv[wDevID].wDeviceID, 0,
MCI_CLOSE, dwParam, (DWORD)lpParms);
break;
+ case MCI_DEVTYPE_SEQUENCER:
+ dwRet = MIDI_DriverProc(mciDrv[wDevID].wDeviceID, 0,
+ MCI_CLOSE, dwParam, (DWORD)lpParms);
+ break;
default:
printf("mciClose() // unknown type=%04X !\n", mciDrv[wDevID].wType);
}
@@ -718,10 +735,8 @@
DWORD mciSendCommand(UINT wDevID, UINT wMsg, DWORD dwParam1, DWORD dwParam2)
{
HDRVR hDrv = 0;
-#ifdef DEBUG_MCI
- printf("mciSendCommand(%04X, %04X, %08X, %08X)\n",
+ dprintf_mci(stddeb, "mciSendCommand(%04X, %04X, %08X, %08X)\n",
wDevID, wMsg, dwParam1, dwParam2);
-#endif
switch(wMsg) {
case MCI_OPEN:
return mciOpen(dwParam1, (LPMCI_OPEN_PARMS)dwParam2);
@@ -738,6 +753,9 @@
case MCI_DEVTYPE_WAVEFORM_AUDIO:
return WAVE_DriverProc(mciDrv[wDevID].wDeviceID, hDrv,
wMsg, dwParam1, dwParam2);
+ case MCI_DEVTYPE_SEQUENCER:
+ return MIDI_DriverProc(mciDrv[wDevID].wDeviceID, hDrv,
+ wMsg, dwParam1, dwParam2);
default:
printf("mciSendCommand() // unknown type=%04X !\n",
mciDrv[wDevID].wType);
@@ -807,8 +825,11 @@
*/
UINT WINAPI midiOutGetNumDevs(void)
{
+ UINT count = 0;
printf("midiOutGetNumDevs\n");
- return 0;
+ count += modMessage(0, MODM_GETNUMDEVS, 0L, 0L, 0L);
+ printf("midiOutGetNumDevs return %u \n", count);
+ return count;
}
/**************************************************************************
@@ -885,9 +906,34 @@
UINT WINAPI midiOutOpen(HMIDIOUT FAR* lphMidiOut, UINT uDeviceID,
DWORD dwCallback, DWORD dwInstance, DWORD dwFlags)
{
- printf("midiOutOpen\n");
+ HMIDI hMidiOut;
+ LPMIDIOPENDESC lpDesc;
+ DWORD dwRet;
+ BOOL bMapperFlg = FALSE;
if (lphMidiOut != NULL) *lphMidiOut = 0;
- return 0;
+ printf("midiOutOpen(%08X, %d, %08X, %08X, %08X);\n",
+ lphMidiOut, uDeviceID, dwCallback, dwInstance, dwFlags);
+ if (uDeviceID == (UINT)MIDI_MAPPER) {
+ printf("midiOutOpen // MIDI_MAPPER mode requested !\n");
+ bMapperFlg = TRUE;
+ uDeviceID = 0;
+ }
+ hMidiOut = GlobalAlloc(GMEM_MOVEABLE, sizeof(MIDIOPENDESC));
+ if (lphMidiOut != NULL) *lphMidiOut = hMidiOut;
+ lpDesc = (LPMIDIOPENDESC) GlobalLock(hMidiOut);
+ if (lpDesc == NULL) return MMSYSERR_NOMEM;
+ lpDesc->hMidi = hMidiOut;
+ lpDesc->dwCallback = dwCallback;
+ lpDesc->dwInstance = dwInstance;
+ while(uDeviceID < MAXMIDIDRIVERS) {
+ dwRet = modMessage(uDeviceID, MODM_OPEN,
+ lpDesc->dwInstance, (DWORD)lpDesc, 0L);
+ if (dwRet == MMSYSERR_NOERROR) break;
+ if (!bMapperFlg) break;
+ uDeviceID++;
+ printf("midiOutOpen // MIDI_MAPPER mode ! try next driver...\n");
+ }
+ return dwRet;
}
/**************************************************************************
@@ -895,8 +941,11 @@
*/
UINT WINAPI midiOutClose(HMIDIOUT hMidiOut)
{
- printf("midiOutClose\n");
- return 0;
+ LPMIDIOPENDESC lpDesc;
+ printf("midiOutClose(%04X)\n", hMidiOut);
+ lpDesc = (LPMIDIOPENDESC) GlobalLock(hMidiOut);
+ if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
+ return modMessage(0, MODM_CLOSE, lpDesc->dwInstance, 0L, 0L);
}
/**************************************************************************
@@ -905,8 +954,13 @@
UINT WINAPI midiOutPrepareHeader(HMIDIOUT hMidiOut,
MIDIHDR FAR* lpMidiOutHdr, UINT uSize)
{
- printf("midiOutPrepareHeader\n");
- return 0;
+ LPMIDIOPENDESC lpDesc;
+ printf("midiOutPrepareHeader(%04X, %08X, %d)\n",
+ hMidiOut, lpMidiOutHdr, uSize);
+ lpDesc = (LPMIDIOPENDESC) GlobalLock(hMidiOut);
+ if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
+ return modMessage(0, MODM_PREPARE, lpDesc->dwInstance,
+ (DWORD)lpMidiOutHdr, (DWORD)uSize);
}
/**************************************************************************
@@ -915,8 +969,13 @@
UINT WINAPI midiOutUnprepareHeader(HMIDIOUT hMidiOut,
MIDIHDR FAR* lpMidiOutHdr, UINT uSize)
{
- printf("midiOutUnprepareHeader\n");
- return 0;
+ LPMIDIOPENDESC lpDesc;
+ printf("midiOutUnprepareHeader(%04X, %08X, %d)\n",
+ hMidiOut, lpMidiOutHdr, uSize);
+ lpDesc = (LPMIDIOPENDESC) GlobalLock(hMidiOut);
+ if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
+ return modMessage(0, MODM_UNPREPARE, lpDesc->dwInstance,
+ (DWORD)lpMidiOutHdr, (DWORD)uSize);
}
/**************************************************************************
@@ -924,8 +983,11 @@
*/
UINT WINAPI midiOutShortMsg(HMIDIOUT hMidiOut, DWORD dwMsg)
{
- printf("midiOutShortMsg\n");
- return 0;
+ LPMIDIOPENDESC lpDesc;
+ printf("midiOutShortMsg(%04X, %08X)\n", hMidiOut, dwMsg);
+ lpDesc = (LPMIDIOPENDESC) GlobalLock(hMidiOut);
+ if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
+ return modMessage(0, MODM_DATA, lpDesc->dwInstance, dwMsg, 0L);
}
/**************************************************************************
@@ -934,8 +996,13 @@
UINT WINAPI midiOutLongMsg(HMIDIOUT hMidiOut,
MIDIHDR FAR* lpMidiOutHdr, UINT uSize)
{
- printf("midiOutLongMsg\n");
- return 0;
+ LPMIDIOPENDESC lpDesc;
+ printf("midiOutLongMsg(%04X, %08X, %d)\n",
+ hMidiOut, lpMidiOutHdr, uSize);
+ lpDesc = (LPMIDIOPENDESC) GlobalLock(hMidiOut);
+ if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
+ return modMessage(0, MODM_LONGDATA, lpDesc->dwInstance,
+ (DWORD)lpMidiOutHdr, (DWORD)uSize);
}
/**************************************************************************
@@ -997,9 +1064,15 @@
/**************************************************************************
* midiOutMessage [MMSYSTEM.216]
*/
-DWORD WINAPI midiOutMessage(HMIDIOUT hMidiOut, UINT uMessage, DWORD dw1, DWORD dw2)
+DWORD WINAPI midiOutMessage(HMIDIOUT hMidiOut, UINT uMessage,
+ DWORD dwParam1, DWORD dwParam2)
{
- printf("midiOutMessage\n");
+ LPMIDIOPENDESC lpDesc;
+ printf("midiOutMessage(%04X, %04X, %08X, %08X)\n",
+ hMidiOut, uMessage, dwParam1, dwParam2);
+ lpDesc = (LPMIDIOPENDESC) GlobalLock(hMidiOut);
+ if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
+ return modMessage(0, uMessage, lpDesc->dwInstance, dwParam1, dwParam2);
return 0;
}
@@ -1037,9 +1110,34 @@
UINT WINAPI midiInOpen(HMIDIIN FAR* lphMidiIn, UINT uDeviceID,
DWORD dwCallback, DWORD dwInstance, DWORD dwFlags)
{
- printf("midiInOpen\n");
+ HMIDI hMidiIn;
+ LPMIDIOPENDESC lpDesc;
+ DWORD dwRet;
+ BOOL bMapperFlg = FALSE;
if (lphMidiIn != NULL) *lphMidiIn = 0;
- return 0;
+ printf("midiInOpen(%08X, %d, %08X, %08X, %08X);\n",
+ lphMidiIn, uDeviceID, dwCallback, dwInstance, dwFlags);
+ if (uDeviceID == (UINT)MIDI_MAPPER) {
+ printf("midiInOpen // MIDI_MAPPER mode requested !\n");
+ bMapperFlg = TRUE;
+ uDeviceID = 0;
+ }
+ hMidiIn = GlobalAlloc(GMEM_MOVEABLE, sizeof(MIDIOPENDESC));
+ if (lphMidiIn != NULL) *lphMidiIn = hMidiIn;
+ lpDesc = (LPMIDIOPENDESC) GlobalLock(hMidiIn);
+ if (lpDesc == NULL) return MMSYSERR_NOMEM;
+ lpDesc->hMidi = hMidiIn;
+ lpDesc->dwCallback = dwCallback;
+ lpDesc->dwInstance = dwInstance;
+ while(uDeviceID < MAXMIDIDRIVERS) {
+ dwRet = midMessage(uDeviceID, MIDM_OPEN,
+ lpDesc->dwInstance, (DWORD)lpDesc, 0L);
+ if (dwRet == MMSYSERR_NOERROR) break;
+ if (!bMapperFlg) break;
+ uDeviceID++;
+ printf("midiInOpen // MIDI_MAPPER mode ! try next driver...\n");
+ }
+ return dwRet;
}
/**************************************************************************
@@ -1047,8 +1145,11 @@
*/
UINT WINAPI midiInClose(HMIDIIN hMidiIn)
{
- printf("midiInClose\n");
- return 0;
+ LPMIDIOPENDESC lpDesc;
+ printf("midiInClose(%04X)\n", hMidiIn);
+ lpDesc = (LPMIDIOPENDESC) GlobalLock(hMidiIn);
+ if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
+ return midMessage(0, MIDM_CLOSE, lpDesc->dwInstance, 0L, 0L);
}
/**************************************************************************
@@ -1057,8 +1158,13 @@
UINT WINAPI midiInPrepareHeader(HMIDIIN hMidiIn,
MIDIHDR FAR* lpMidiInHdr, UINT uSize)
{
- printf("midiInPrepareHeader\n");
- return 0;
+ LPMIDIOPENDESC lpDesc;
+ printf("midiInPrepareHeader(%04X, %08X, %d)\n",
+ hMidiIn, lpMidiInHdr, uSize);
+ lpDesc = (LPMIDIOPENDESC) GlobalLock(hMidiIn);
+ if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
+ return midMessage(0, MIDM_PREPARE, lpDesc->dwInstance,
+ (DWORD)lpMidiInHdr, (DWORD)uSize);
}
/**************************************************************************
@@ -1067,8 +1173,13 @@
UINT WINAPI midiInUnprepareHeader(HMIDIIN hMidiIn,
MIDIHDR FAR* lpMidiInHdr, UINT uSize)
{
- printf("midiInUnprepareHeader\n");
- return 0;
+ LPMIDIOPENDESC lpDesc;
+ printf("midiInUnprepareHeader(%04X, %08X, %d)\n",
+ hMidiIn, lpMidiInHdr, uSize);
+ lpDesc = (LPMIDIOPENDESC) GlobalLock(hMidiIn);
+ if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
+ return midMessage(0, MIDM_UNPREPARE, lpDesc->dwInstance,
+ (DWORD)lpMidiInHdr, (DWORD)uSize);
}
/**************************************************************************
@@ -1123,8 +1234,12 @@
DWORD WINAPI midiInMessage(HMIDIIN hMidiIn, UINT uMessage,
DWORD dwParam1, DWORD dwParam2)
{
- printf("midiInMessage\n");
- return 0;
+ LPMIDIOPENDESC lpDesc;
+ printf("midiInMessage(%04X, %04X, %08X, %08X)\n",
+ hMidiIn, uMessage, dwParam1, dwParam2);
+ lpDesc = (LPMIDIOPENDESC) GlobalLock(hMidiIn);
+ if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
+ return midMessage(0, uMessage, lpDesc->dwInstance, dwParam1, dwParam2);
}
@@ -1445,6 +1560,12 @@
DWORD WINAPI waveOutMessage(HWAVEOUT hWaveOut, UINT uMessage,
DWORD dwParam1, DWORD dwParam2)
{
+ LPWAVEOPENDESC lpDesc;
+ printf("waveOutMessage(%04X, %04X, %08X, %08X)\n",
+ hWaveOut, uMessage, dwParam1, dwParam2);
+ lpDesc = (LPWAVEOPENDESC) GlobalLock(hWaveOut);
+ if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
+ return wodMessage(0, uMessage, lpDesc->dwInstance, dwParam1, dwParam2);
}
/**************************************************************************
@@ -1668,6 +1789,12 @@
DWORD WINAPI waveInMessage(HWAVEIN hWaveIn, UINT uMessage,
DWORD dwParam1, DWORD dwParam2)
{
+ LPWAVEOPENDESC lpDesc;
+ printf("waveInMessage(%04X, %04X, %08X, %08X)\n",
+ hWaveIn, uMessage, dwParam1, dwParam2);
+ lpDesc = (LPWAVEOPENDESC) GlobalLock(hWaveIn);
+ if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
+ return widMessage(0, uMessage, lpDesc->dwInstance, dwParam1, dwParam2);
}
@@ -1684,10 +1811,7 @@
if (lpTimer->wCurTime == 0) {
lpTimer->wCurTime = lpTimer->wDelay;
if (lpTimer->lpFunc != NULL) {
-#ifdef DEBUG_MMTIME
- printf("MMSysTimeCallback // before CallBack16 !\n");
- fflush(stdout);
-#endif
+ dprintf_mmtime(stddeb,"MMSysTimeCallback // before CallBack16 !\n");
#ifdef WINELIB
(*lpTimer->lpFunc)(lpTimer->wTimerID, (WORD)0,
lpTimer->dwUser, (DWORD)0, (DWORD)0);
@@ -1696,10 +1820,8 @@
0, (int)lpTimer->wTimerID, 0, (int)0,
2, lpTimer->dwUser, 2, 0, 2, 0);
#endif
-#ifdef DEBUG_MMTIME
- printf("MMSysTimeCallback // after CallBack16 !\n");
+ dprintf_mmtime(stddeb, "MMSysTimeCallback // after CallBack16 !\n");
fflush(stdout);
-#endif
}
if (lpTimer->wFlags & TIME_ONESHOT)
timeKillEvent(lpTimer->wTimerID);
@@ -1883,9 +2005,7 @@
{
int count;
LPMMIOINFO lpmminfo;
-#ifdef DEBUG_MMIO
- printf("mmioRead(%04X, %08X, %ld);\n", hmmio, pch, cch);
-#endif
+ dprintf_mmio(stddeb, "mmioRead(%04X, %08X, %ld);\n", hmmio, pch, cch);
lpmminfo = (LPMMIOINFO)GlobalLock(hmmio);
if (lpmminfo == NULL) return 0;
count = _lread(LOWORD(lpmminfo->dwReserved2), pch, cch);
@@ -2036,27 +2156,21 @@
{
DWORD dwfcc, dwOldPos;
LPMMIOINFO lpmminfo;
-#ifdef DEBUG_MMIO
- printf("mmioDescend(%04X, %08X, %08X, %04X);\n",
+ dprintf_mmio(stddeb, "mmioDescend(%04X, %08X, %08X, %04X);\n",
hmmio, lpck, lpckParent, uFlags);
-#endif
if (lpck == NULL) return 0;
lpmminfo = (LPMMIOINFO)GlobalLock(hmmio);
if (lpmminfo == NULL) return 0;
dwfcc = lpck->ckid;
dwOldPos = _llseek(LOWORD(lpmminfo->dwReserved2), 0, SEEK_CUR);
if (lpckParent != NULL) {
-#ifdef DEBUG_MMIO
- printf("mmioDescend // seek inside parent at %ld !\n", lpckParent->dwDataOffset);
-#endif
+ dprintf_mmio(stddeb, "mmioDescend // seek inside parent at %ld !\n", lpckParent->dwDataOffset);
dwOldPos = _llseek(LOWORD(lpmminfo->dwReserved2),
lpckParent->dwDataOffset, SEEK_SET);
}
if ((uFlags & MMIO_FINDCHUNK) || (uFlags & MMIO_FINDRIFF) ||
(uFlags & MMIO_FINDLIST)) {
-#ifdef DEBUG_MMIO
- printf("mmioDescend // MMIO_FINDxxxx dwfcc=%08X !\n", dwfcc);
-#endif
+ dprintf_mmio(stddeb, "mmioDescend // MMIO_FINDxxxx dwfcc=%08X !\n", dwfcc);
while (TRUE) {
if (_lread(LOWORD(lpmminfo->dwReserved2), (LPSTR)lpck,
sizeof(MMCKINFO)) < sizeof(MMCKINFO)) {
@@ -2064,10 +2178,8 @@
GlobalUnlock(hmmio);
return MMIOERR_CHUNKNOTFOUND;
}
-#ifdef DEBUG_MMIO
- printf("mmioDescend // dwfcc=%08X ckid=%08X cksize=%08X !\n",
+ dprintf_mmio(stddeb, "mmioDescend // dwfcc=%08X ckid=%08X cksize=%08X !\n",
dwfcc, lpck->ckid, lpck->cksize);
-#endif
if (dwfcc == lpck->ckid) break;
dwOldPos += lpck->cksize + 2 * sizeof(DWORD);
if (lpck->ckid == FOURCC_RIFF || lpck->ckid == FOURCC_LIST)
@@ -2089,11 +2201,9 @@
lpck->dwDataOffset += sizeof(DWORD);
lpmminfo->lDiskOffset = _llseek(LOWORD(lpmminfo->dwReserved2),
lpck->dwDataOffset, SEEK_SET);
-#ifdef DEBUG_MMIO
- printf("mmioDescend // lpck->ckid=%08X lpck->cksize=%ld !\n",
+ dprintf_mmio(stddeb, "mmioDescend // lpck->ckid=%08X lpck->cksize=%ld !\n",
lpck->ckid, lpck->cksize);
printf("mmioDescend // lpck->fccType=%08X !\n", lpck->fccType);
-#endif
return 0;
}
diff --git a/misc/profile.c b/misc/profile.c
index 7bd9488..12a961e 100644
--- a/misc/profile.c
+++ b/misc/profile.c
@@ -25,8 +25,11 @@
#include "wine.h"
#include "windows.h"
#include "prototypes.h"
+#include "stddebug.h"
+/* #define DEBUG_PROFILE */
+/* #undef DEBUG_PROFILE */
+#include "debug.h"
-/* #define DEBUG */
#define STRSIZE 255
#define xmalloc(x) malloc(x)
@@ -97,15 +100,11 @@
file = GetIniFileName(filename);
-#ifdef DEBUG
- printf("Load %s\n", file);
-#endif
+ dprintf_profile(stddeb,"Load %s\n", file);
if ((f = fopen (file, "r"))==NULL)
return NULL;
-#ifdef DEBUG
- printf("Loading %s\n", file);
-#endif
+ dprintf_profile(stddeb,"Loading %s\n", file);
state = FirstBrace;
@@ -121,9 +120,7 @@
next = CharBuffer;
SecHeader->AppName = strdup (CharBuffer);
state = IgnoreToEOL;
-#ifdef DEBUG
- printf("%s: section %s\n", file, CharBuffer);
-#endif
+ dprintf_profile(stddeb,"%s: section %s\n", file, CharBuffer);
} else
*next++ = c;
break;
@@ -151,7 +148,7 @@
if (state == FirstBrace) /* On first pass, don't allow dangling keys */
break;
- if (c == ' ' || c == '\t')
+ if (c == '\t')
break;
if (c == '\n' || c == ';' || overflow) /* Abort Definition */
@@ -167,15 +164,14 @@
TKeys *temp;
temp = SecHeader->Keys;
+ while(next[-1]==' ')next--;
*next = '\0';
SecHeader->Keys = (TKeys *) xmalloc (sizeof (TKeys));
SecHeader->Keys->link = temp;
SecHeader->Keys->KeyName = strdup (CharBuffer);
state = KeyValue;
next = CharBuffer;
-#ifdef DEBUG
- printf("%s: key %s\n", file, CharBuffer);
-#endif
+ dprintf_profile(stddeb,"%s: key %s\n", file, CharBuffer);
} else
*next++ = c;
break;
@@ -186,10 +182,8 @@
SecHeader->Keys->Value = strdup (CharBuffer);
state = c == '\n' ? KeyDef : IgnoreToEOL;
next = CharBuffer;
-#ifdef DEBUG
- printf ("[%s] (%s)=%s\n", SecHeader->AppName,
+ dprintf_profile (stddeb, "[%s] (%s)=%s\n", SecHeader->AppName,
SecHeader->Keys->KeyName, SecHeader->Keys->Value);
-#endif
} else
*next++ = c;
break;
@@ -243,28 +237,25 @@
char *p = ReturnedString;
int left = Size - 2;
int slen;
-#ifdef DEBUG_PROFILE
- printf("GetSetProfile // KeyName == NULL, Enumeration !\n");
-#endif
+
+ dprintf_profile(stddeb,"GetSetProfile // KeyName == NULL, Enumeration !\n");
for (key = section->Keys; key; key = key->link){
if (left < 1) {
- printf("GetSetProfile // No more storage for enum !\n");
+ dprintf_profile(stddeb,"GetSetProfile // No more storage for enum !\n");
return (Size - 2);
}
slen = min(strlen(key->KeyName) + 1, left);
-#ifdef DEBUG_PROFILE
- printf("GetSetProfile // strncpy(%08X, %08X, %d);\n",
+ dprintf_profile(stddeb,"GetSetProfile // strncpy(%08X, %08X, %d);\n",
ReturnedString, key->Value, slen);
-#endif
strncpy (p, key->KeyName, slen);
-#ifdef DEBUG_PROFILE
- printf("GetSetProfile // enum '%s' !\n", p);
-#endif
+ dprintf_profile(stddeb,"GetSetProfile // enum '%s' !\n", p);
left -= slen;
p += slen;
}
*p = '\0';
+#ifdef DEBUG_PROFILE
printf("GetSetProfile // normal end of enum !\n");
+#endif
return (Size - 2 - left);
}
for (key = section->Keys; key; key = key->link){
@@ -311,10 +302,8 @@
{
int v;
-#ifdef DEBUG_PROFILE
- printf("GetPrivateProfileString ('%s', '%s', '%s', %08X, %d, %s\n",
+ dprintf_profile(stddeb,"GetPrivateProfileString ('%s', '%s', '%s', %08X, %d, %s\n",
AppName, KeyName, Default, ReturnedString, Size, FileName);
-#endif
v = GetSetProfile (0,AppName,KeyName,Default,ReturnedString,Size,FileName);
if (AppName)
return strlen (ReturnedString);
diff --git a/misc/property.c b/misc/property.c
index b58d173..9733ae1 100644
--- a/misc/property.c
+++ b/misc/property.c
@@ -3,9 +3,6 @@
*/
static char Copyright[] = "Copyright Martin Ayotte, 1994";
-/*
-#define DEBUG_PROP
-*/
#include <stdlib.h>
#include <stdio.h>
@@ -14,6 +11,11 @@
#include "windows.h"
#include "heap.h"
#include "win.h"
+#include "callback.h"
+#include "stddebug.h"
+/* #define DEBUG_PROP */
+/* #undef DEBUG_PROP */
+#include "debug.h"
typedef struct tagPROPENTRY {
LPSTR PropName;
@@ -33,12 +35,10 @@
WND *wndPtr;
LPPROPENTRY lpProp;
HANDLE hOldData;
-#ifdef DEBUG_PROP
if (((DWORD)lpStr & 0xFFFF0000) == 0L)
- printf("RemoveProp(%04X, Atom %04X)\n", hWnd, LOWORD((DWORD)lpStr));
+ dprintf_prop(stddeb, "RemoveProp(%04X, Atom %04X)\n", hWnd, LOWORD((DWORD)lpStr));
else
- printf("RemoveProp(%04X, '%s')\n", hWnd, lpStr);
-#endif
+ dprintf_prop(stddeb, "RemoveProp(%04X, '%s')\n", hWnd, lpStr);
wndPtr = WIN_FindWndPtr(hWnd);
if (wndPtr == NULL) {
printf("RemoveProp // Bad Window handle !\n");
@@ -46,9 +46,7 @@
}
lpProp = (LPPROPENTRY) GlobalLock(wndPtr->hProp);
if (lpProp == NULL) {
-#ifdef DEBUG_PROP
- printf("Property List Empty !\n");
-#endif
+ dprintf_prop(stddeb, "Property List Empty !\n");
return 0;
}
while (TRUE) {
@@ -57,9 +55,7 @@
(((DWORD)lpStr & 0xFFFF0000) != 0L &&
lpProp->PropName != NULL &&
strcmp(lpProp->PropName, lpStr) == 0)) {
-#ifdef DEBUG_PROP
- printf("RemoveProp // Property found ! hData=%04X\n", lpProp->hData);
-#endif
+ dprintf_prop(stddeb, "RemoveProp // Property found ! hData=%04X\n", lpProp->hData);
hOldData = lpProp->hData;
if (lpProp->lpPrevProp != NULL)
lpProp->lpPrevProp->lpNextProp = lpProp->lpNextProp;
@@ -74,9 +70,7 @@
lpProp = lpProp->lpNextProp;
}
GlobalUnlock(wndPtr->hProp);
-#ifdef DEBUG_PROP
- printf("RemoveProp // Property not found !\n");
-#endif
+ dprintf_prop(stddeb, "RemoveProp // Property not found !\n");
return 0;
}
@@ -88,12 +82,10 @@
{
WND *wndPtr;
LPPROPENTRY lpProp;
-#ifdef DEBUG_PROP
if (((DWORD)lpStr & 0xFFFF0000) == 0L)
- printf("GetProp(%04X, Atom %04X)\n", hWnd, LOWORD((DWORD)lpStr));
+ dprintf_prop(stddeb, "GetProp(%04X, Atom %04X)\n", hWnd, LOWORD((DWORD)lpStr));
else
- printf("GetProp(%04X, '%s')\n", hWnd, lpStr);
-#endif
+ dprintf_prop(stddeb, "GetProp(%04X, '%s')\n", hWnd, lpStr);
wndPtr = WIN_FindWndPtr(hWnd);
if (wndPtr == NULL) {
printf("GetProp // Bad Window handle !\n");
@@ -101,9 +93,7 @@
}
lpProp = (LPPROPENTRY) GlobalLock(wndPtr->hProp);
if (lpProp == NULL) {
-#ifdef DEBUG_PROP
- printf("Property List Empty !\n");
-#endif
+ dprintf_prop(stddeb, "Property List Empty !\n");
return 0;
}
while (TRUE) {
@@ -112,18 +102,14 @@
(((DWORD)lpStr & 0xFFFF0000) != 0L &&
lpProp->PropName != NULL &&
strcmp(lpProp->PropName, lpStr) == 0)) {
-#ifdef DEBUG_PROP
- printf("GetProp // Property found ! hData=%04X\n", lpProp->hData);
-#endif
+ dprintf_prop(stddeb, "GetProp // Property found ! hData=%04X\n", lpProp->hData);
GlobalUnlock(wndPtr->hProp);
return lpProp->hData;
}
if (lpProp->lpNextProp == NULL) break;
lpProp = lpProp->lpNextProp;
}
-#ifdef DEBUG_PROP
- printf("GetProp // Property not found !\n");
-#endif
+ dprintf_prop(stddeb, "GetProp // Property not found !\n");
GlobalUnlock(wndPtr->hProp);
return 0;
}
@@ -138,13 +124,11 @@
HANDLE hNewProp;
LPPROPENTRY lpNewProp;
LPPROPENTRY lpProp;
-#ifdef DEBUG_PROP
if (((DWORD)lpStr & 0xFFFF0000) == 0L)
- printf("SetProp(%04X, Atom %04X, %04X)\n",
+ dprintf_prop(stddeb, "SetProp(%04X, Atom %04X, %04X)\n",
hWnd, LOWORD((DWORD)lpStr), hData);
else
- printf("SetProp(%04X, '%s', %04X)\n", hWnd, lpStr, hData);
-#endif
+ dprintf_prop(stddeb, "SetProp(%04X, '%s', %04X)\n", hWnd, lpStr, hData);
wndPtr = WIN_FindWndPtr(hWnd);
if (wndPtr == NULL) {
printf("SetProp // Bad Window handle !\n");
@@ -158,9 +142,7 @@
(((DWORD)lpStr & 0xFFFF0000) != 0L &&
lpProp->PropName != NULL &&
strcmp(lpProp->PropName, lpStr) == 0)) {
-#ifdef DEBUG_PROP
- printf("SetProp // change already exinsting property !\n");
-#endif
+ dprintf_prop(stddeb, "SetProp // change already exinsting property !\n");
lpProp->hData = hData;
GlobalUnlock(wndPtr->hProp);
return TRUE;
@@ -176,15 +158,11 @@
GlobalUnlock(wndPtr->hProp);
return FALSE;
}
-#ifdef DEBUG_PROP
- printf("SetProp // entry allocated %08X\n", lpNewProp);
-#endif
+ dprintf_prop(stddeb, "SetProp // entry allocated %08X\n", lpNewProp);
if (lpProp == NULL) {
wndPtr->hProp = hNewProp;
lpNewProp->lpPrevProp = NULL;
-#ifdef DEBUG_PROP
- printf("SetProp // first entry \n");
-#endif
+ dprintf_prop(stddeb, "SetProp // first entry \n");
}
else {
lpProp->lpNextProp = lpNewProp;
@@ -232,7 +210,7 @@
printf("Property List Empty !\n");
return 0;
}
- if (lpEnumFunc != NULL) return 0;
+ if (lpEnumFunc == NULL) return 0;
while (TRUE) {
printf("EnumProps // lpProp->Atom=%04X !\n", lpProp->Atom);
str = (LPSTR)MAKELONG(lpProp->Atom, 0);
@@ -244,8 +222,10 @@
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);
+ nRet = CallBack16(lpEnumFunc, 3,
+ CALLBACK_SIZE_WORD, (HWND)hWnd,
+ CALLBACK_SIZE_LONG, (LPSTR)str,
+ CALLBACK_SIZE_WORD, (HANDLE)lpProp->hData);
#endif
if (nRet == 0) break;
if (lpProp->lpNextProp == NULL) break;
diff --git a/misc/shell.c b/misc/shell.c
index 6682100..71af863 100644
--- a/misc/shell.c
+++ b/misc/shell.c
@@ -8,10 +8,11 @@
#include "prototypes.h"
#include "windows.h"
#include "shell.h"
+#include "stddebug.h"
+/* #define DEBUG_REG */
+/* #undef DEBUG_REG */
+#include "debug.h"
-/*
-#define DEBUG_REG
-*/
LPKEYSTRUCT lphRootKey = NULL;
@@ -27,31 +28,23 @@
LPKEYSTRUCT lpKey = lphRootKey;
LPSTR ptr;
char str[128];
- int size;
-#ifdef DEBUG_REG
- fprintf(stderr, "RegOpenKey(%04X, %08X='%s', %08X)\n",
+
+ dprintf_reg(stddeb, "RegOpenKey(%04X, %08X='%s', %08X)\n",
hKey, lpSubKey, lpSubKey, lphKey);
-#endif
if (lpKey == NULL) return ERROR_BADKEY;
if (lpSubKey == NULL) return ERROR_INVALID_PARAMETER;
if (lphKey == NULL) return ERROR_INVALID_PARAMETER;
if (hKey != HKEY_CLASSES_ROOT) {
-#ifdef DEBUG_REG
- printf("RegOpenKey // specific key = %04X !\n", hKey);
-#endif
+ dprintf_reg(stddeb,"RegOpenKey // specific key = %04X !\n", hKey);
lpKey = (LPKEYSTRUCT)GlobalLock(hKey);
}
while ( (ptr = strchr(lpSubKey, '\\')) != NULL ) {
strncpy(str, lpSubKey, (LONG)ptr - (LONG)lpSubKey);
str[(LONG)ptr - (LONG)lpSubKey] = '\0';
lpSubKey = ptr + 1;
-#ifdef DEBUG_REG
- printf("RegOpenKey // next level '%s' !\n", str);
-#endif
+ dprintf_reg(stddeb,"RegOpenKey // next level '%s' !\n", str);
while(TRUE) {
-#ifdef DEBUG_REG
- printf("RegOpenKey // '%s' <-> '%s' !\n", str, lpKey->lpSubKey);
-#endif
+ dprintf_reg(stddeb,"RegOpenKey // '%s' <-> '%s' !\n", str, lpKey->lpSubKey);
if (lpKey->lpSubKey != NULL && lpKey->lpSubKey[0] != '\0' &&
strcmp(lpKey->lpSubKey, str) == 0) {
lpKey = lpKey->lpSubLvl;
@@ -78,9 +71,7 @@
lpKey = lpKey->lpNextKey;
}
*lphKey = lpKey->hKey;
-#ifdef DEBUG_REG
- printf("RegOpenKey // return hKey=%04X !\n", lpKey->hKey);
-#endif
+ dprintf_reg(stddeb,"RegOpenKey // return hKey=%04X !\n", lpKey->hKey);
return ERROR_SUCCESS;
}
@@ -97,35 +88,25 @@
LONG dwRet;
LPSTR ptr;
char str[128];
-#ifdef DEBUG_REG
- fprintf(stderr, "RegCreateKey(%04X, '%s', %08X)\n", hKey, lpSubKey, lphKey);
-#endif
+ dprintf_reg(stddeb, "RegCreateKey(%04X, '%s', %08X)\n", hKey, lpSubKey, lphKey);
if (lpSubKey == NULL) return ERROR_INVALID_PARAMETER;
if (lphKey == NULL) return ERROR_INVALID_PARAMETER;
if (hKey != HKEY_CLASSES_ROOT) {
-#ifdef DEBUG_REG
- printf("RegCreateKey // specific key = %04X !\n", hKey);
-#endif
+ dprintf_reg(stddeb,"RegCreateKey // specific key = %04X !\n", hKey);
lpKey = (LPKEYSTRUCT)GlobalLock(hKey);
}
while ( (ptr = strchr(lpSubKey, '\\')) != NULL ) {
strncpy(str, lpSubKey, (LONG)ptr - (LONG)lpSubKey);
str[(LONG)ptr - (LONG)lpSubKey] = '\0';
lpSubKey = ptr + 1;
-#ifdef DEBUG_REG
- printf("RegCreateKey // next level '%s' !\n", str);
-#endif
+ dprintf_reg(stddeb,"RegCreateKey // next level '%s' !\n", str);
lpPrevKey = lpKey;
while(TRUE) {
-#ifdef DEBUG_REG
- printf("RegCreateKey // '%s' <-> '%s' !\n", str, lpKey->lpSubKey);
-#endif
+ dprintf_reg(stddeb,"RegCreateKey // '%s' <-> '%s' !\n", str, lpKey->lpSubKey);
if (lpKey->lpSubKey != NULL &&
strcmp(lpKey->lpSubKey, str) == 0) {
if (lpKey->lpSubLvl == NULL) {
-#ifdef DEBUG_REG
- printf("RegCreateKey // '%s' found !\n", str);
-#endif
+ dprintf_reg(stddeb,"RegCreateKey // '%s' found !\n", str);
if ( (ptr = strchr(lpSubKey, '\\')) != NULL ) {
strncpy(str, lpSubKey, (LONG)ptr - (LONG)lpSubKey);
str[(LONG)ptr - (LONG)lpSubKey] = '\0';
@@ -181,9 +162,7 @@
lpNewKey->lpNextKey = NULL;
lpNewKey->lpSubLvl = NULL;
*lphKey = hNewKey;
-#ifdef DEBUG_REG
- printf("RegCreateKey // successful '%s' key=%04X !\n", lpSubKey, hNewKey);
-#endif
+ dprintf_reg(stddeb,"RegCreateKey // successful '%s' key=%04X !\n", lpSubKey, hNewKey);
return ERROR_SUCCESS;
}
@@ -193,7 +172,7 @@
*/
LONG RegCloseKey(HKEY hKey)
{
- fprintf(stderr, "EMPTY STUB !!! RegCloseKey(%04X);\n", hKey);
+ dprintf_reg(stdnimp, "EMPTY STUB !!! RegCloseKey(%04X);\n", hKey);
return ERROR_INVALID_PARAMETER;
}
@@ -203,7 +182,7 @@
*/
LONG RegDeleteKey(HKEY hKey, LPCSTR lpSubKey)
{
- fprintf(stderr, "EMPTY STUB !!! RegDeleteKey(%04X, '%s');\n",
+ dprintf_reg(stdnimp, "EMPTY STUB !!! RegDeleteKey(%04X, '%s');\n",
hKey, lpSubKey);
return ERROR_INVALID_PARAMETER;
}
@@ -218,16 +197,12 @@
HKEY hRetKey;
LPKEYSTRUCT lpKey;
LONG dwRet;
-#ifdef DEBUG_REG
- fprintf(stderr, "RegSetValue(%04X, '%s', %08X, '%s', %08X);\n",
+ dprintf_reg(stddeb, "RegSetValue(%04X, '%s', %08X, '%s', %08X);\n",
hKey, lpSubKey, dwType, lpVal, dwIgnored);
-#endif
if (lpSubKey == NULL) return ERROR_INVALID_PARAMETER;
if (lpVal == NULL) return ERROR_INVALID_PARAMETER;
if ((dwRet = RegOpenKey(hKey, lpSubKey, &hRetKey)) != ERROR_SUCCESS) {
-#ifdef DEBUG_REG
- fprintf(stderr, "RegSetValue // key not found ... so create it !\n");
-#endif
+ dprintf_reg(stddeb, "RegSetValue // key not found ... so create it !\n");
if ((dwRet = RegCreateKey(hKey, lpSubKey, &hRetKey)) != ERROR_SUCCESS) {
fprintf(stderr, "RegSetValue // key creation error %04X !\n", dwRet);
return dwRet;
@@ -238,9 +213,7 @@
if (lpKey->lpValue != NULL) free(lpKey->lpValue);
lpKey->lpValue = malloc(strlen(lpVal) + 1);
strcpy(lpKey->lpValue, lpVal);
-#ifdef DEBUG_REG
- printf("RegSetValue // successful key='%s' val='%s' !\n", lpSubKey, lpVal);
-#endif
+ dprintf_reg(stddeb,"RegSetValue // successful key='%s' val='%s' !\n", lpSubKey, lpVal);
return ERROR_SUCCESS;
}
@@ -254,7 +227,7 @@
LPKEYSTRUCT lpKey;
LONG dwRet;
int size;
- fprintf(stderr, "RegQueryValue(%04X, '%s', %08X, %08X);\n",
+ dprintf_reg(stddeb, "RegQueryValue(%04X, '%s', %08X, %08X);\n",
hKey, lpSubKey, lpVal, lpcb);
if (lpSubKey == NULL) return ERROR_INVALID_PARAMETER;
if (lpVal == NULL) return ERROR_INVALID_PARAMETER;
@@ -274,7 +247,7 @@
lpVal[0] = '\0';
*lpcb = (LONG)0;
}
- printf("RegQueryValue // return '%s' !\n", lpVal);
+ dprintf_reg(stddeb,"RegQueryValue // return '%s' !\n", lpVal);
return ERROR_SUCCESS;
}
@@ -284,7 +257,7 @@
*/
LONG RegEnumKey(HKEY hKey, DWORD dwSubKey, LPSTR lpBuf, DWORD dwSize)
{
- fprintf(stderr, "RegEnumKey : Empty Stub !!!\n");
+ dprintf_reg(stdnimp, "RegEnumKey : Empty Stub !!!\n");
return ERROR_INVALID_PARAMETER;
}
@@ -293,7 +266,7 @@
*/
void DragAcceptFiles(HWND hWnd, BOOL b)
{
- fprintf(stderr, "DragAcceptFiles : Empty Stub !!!\n");
+ dprintf_reg(stdnimp, "DragAcceptFiles : Empty Stub !!!\n");
}
@@ -302,7 +275,7 @@
*/
void DragQueryFile(HDROP h, UINT u, LPSTR u2, UINT u3)
{
- fprintf(stderr, "DragQueryFile : Empty Stub !!!\n");
+ dprintf_reg(stdnimp, "DragQueryFile : Empty Stub !!!\n");
}
@@ -312,7 +285,7 @@
*/
void DragFinish(HDROP h)
{
- fprintf(stderr, "DragFinish : Empty Stub !!!\n");
+ dprintf_reg(stdnimp, "DragFinish : Empty Stub !!!\n");
}
@@ -322,8 +295,8 @@
*/
BOOL DragQueryPoint(HDROP h, POINT FAR *p)
{
- fprintf(stderr, "DragQueryPoinyt : Empty Stub !!!\n");
-
+ dprintf_reg(stdnimp, "DragQueryPoinyt : Empty Stub !!!\n");
+ return FALSE;
}
@@ -332,12 +305,12 @@
*/
HINSTANCE ShellExecute(HWND hWnd, LPCSTR lpOperation, LPCSTR lpFile, LPCSTR lpParameters, LPCSTR lpDirectory, int iShowCmd)
{
- fprintf(stderr, "ShellExecute // hWnd=%04X\n", hWnd);
- fprintf(stderr, "ShellExecute // lpOperation='%s'\n", lpOperation);
- fprintf(stderr, "ShellExecute // lpFile='%s'\n", lpFile);
- fprintf(stderr, "ShellExecute // lpParameters='%s'\n", lpParameters);
- fprintf(stderr, "ShellExecute // lpDirectory='%s'\n", lpDirectory);
- fprintf(stderr, "ShellExecute // iShowCmd=%04X\n", iShowCmd);
+ dprintf_reg(stdnimp, "ShellExecute // hWnd=%04X\n", hWnd);
+ dprintf_reg(stdnimp, "ShellExecute // lpOperation='%s'\n", lpOperation);
+ dprintf_reg(stdnimp, "ShellExecute // lpFile='%s'\n", lpFile);
+ dprintf_reg(stdnimp, "ShellExecute // lpParameters='%s'\n", lpParameters);
+ dprintf_reg(stdnimp, "ShellExecute // lpDirectory='%s'\n", lpDirectory);
+ dprintf_reg(stdnimp, "ShellExecute // iShowCmd=%04X\n", iShowCmd);
return 2; /* file not found */
}
@@ -347,7 +320,7 @@
*/
HINSTANCE FindExecutable(LPCSTR lpFile, LPCSTR lpDirectory, LPSTR lpResult)
{
- fprintf(stderr, "FindExecutable : Empty Stub !!!\n");
+ dprintf_reg(stdnimp, "FindExecutable : Empty Stub !!!\n");
}
@@ -371,7 +344,7 @@
else
*AppMisc = 0;
- return DialogBox(hSysRes, "SHELL_ABOUT_MSGBOX", hWnd, (FARPROC)AboutDlgProc);
+ return DialogBox(hSysRes, "SHELL_ABOUT_MSGBOX", hWnd, (WNDPROC)AboutDlgProc);
}
@@ -407,14 +380,14 @@
int count;
HICON hIcon = 0;
HINSTANCE hInst2 = hInst;
- fprintf(stderr, "ExtractIcon(%04X, '%s', %d\n",
+ dprintf_reg(stddeb, "ExtractIcon(%04X, '%s', %d\n",
hInst, lpszExeFileName, nIconIndex);
if (lpszExeFileName != NULL) {
hInst2 = LoadLibrary(lpszExeFileName);
}
if (hInst2 != 0 && nIconIndex == (UINT)-1) {
count = GetRsrcCount(hInst2, NE_RSCTYPE_GROUP_ICON);
- printf("ExtractIcon // '%s' has %d icons !\n", lpszExeFileName, count);
+ dprintf_reg(stddeb, "ExtractIcon // '%s' has %d icons !\n", lpszExeFileName, count);
return (HICON)count;
}
if (hInst2 != hInst && hInst2 != 0) {
@@ -429,7 +402,7 @@
*/
HICON ExtractAssociatedIcon(HINSTANCE hInst,LPSTR lpIconPath, LPWORD lpiIcon)
{
- fprintf(stderr, "ExtractAssociatedIcon : Empty Stub !!!\n");
+ dprintf_reg(stdnimp, "ExtractAssociatedIcon : Empty Stub !!!\n");
}
/*************************************************************************
@@ -437,7 +410,7 @@
*/
int RegisterShellHook(void *ptr)
{
- fprintf(stderr, "RegisterShellHook : Empty Stub !!!\n");
+ dprintf_reg(stdnimp, "RegisterShellHook : Empty Stub !!!\n");
return 0;
}
@@ -447,5 +420,5 @@
*/
int ShellHookProc(void)
{
- fprintf(stderr, "ShellHookProc : Empty Stub !!!\n");
+ dprintf_reg(stdnimp, "ShellHookProc : Empty Stub !!!\n");
}
diff --git a/misc/spy.c b/misc/spy.c
index 2598711..f121b18 100644
--- a/misc/spy.c
+++ b/misc/spy.c
@@ -268,7 +268,7 @@
strstr(SpyFilters, msg_name) == NULL)
{
msg_name[strlen(msg_name) - 1] = '\0';
- fprintf(SpyFp, "%04.4x %20.20s %04.4x %04.4x %08.8x\n",
+ fprintf(SpyFp, "%04x %20.20s %04x %04x %08lx\n",
hwnd, msg_name, msg, wParam, lParam);
}
#endif
diff --git a/misc/stress.c b/misc/stress.c
index e503ef9..3223fa7 100644
--- a/misc/stress.c
+++ b/misc/stress.c
@@ -2,23 +2,22 @@
#include <limits.h>
#include "windows.h"
#include "stress.h"
+#include "stddebug.h"
+/* #define DEBUG_STRESS */
+/* #undef DEBUG_STRESS */
+#include "debug.h"
-#define STRESS_DEBUG
int AllocDiskSpace(long lLeft, UINT uDrive)
{
-#ifdef STRESS_DEBUG
- fprintf(stderr, "stress.dll: AllocDiskSpace %d, %ld\n", uDrive, lLeft);
-#endif
+ dprintf_stress(stdnimp, "stress.dll: AllocDiskSpace %d, %ld\n", uDrive, lLeft);
return 1;
}
int AllocFileHandles(int Left)
{
-#ifdef STRESS_DEBUG
- fprintf(stderr, "stress.dll: AllocFileHandles %d\n", Left);
-#endif
+ dprintf_stress(stddeb, "stress.dll: AllocFileHandles %d\n", Left);
if (Left < 0)
return -1;
@@ -28,64 +27,48 @@
BOOL AllocGDIMem(UINT uLeft)
{
-#ifdef STRESS_DEBUG
- fprintf(stderr, "stress.dll: AllocGDIMem %d\n", uLeft);
-#endif
+ dprintf_stress(stddeb, "stress.dll: AllocGDIMem %d\n", uLeft);
return 1;
}
BOOL AllocMem(DWORD dwLeft)
{
-#ifdef STRESS_DEBUG
- fprintf(stderr, "stress.dll: AllocMem %ld\n", dwLeft);
-#endif
+ dprintf_stress(stdnimp, "stress.dll: AllocMem %ld\n", dwLeft);
return 1;
}
BOOL AllocUserMem(UINT uContig)
{
-#ifdef STRESS_DEBUG
- fprintf(stderr, "stress.dll: AllocUserMem %d\n", uContig);
-#endif
+ dprintf_stress(stddeb, "stress.dll: AllocUserMem %d\n", uContig);
return 1;
}
void FreeAllMem(void)
{
-#ifdef STRESS_DEBUG
- fprintf(stderr, "stress.dll: FreeAllMem\n");
-#endif
+ dprintf_stress(stddeb, "stress.dll: FreeAllMem\n");
}
void FreeAllGDIMem(void)
{
-#ifdef STRESS_DEBUG
- fprintf(stderr, "stress.dll: FreeAllGDIMem\n");
-#endif
+ dprintf_stress(stddeb, "stress.dll: FreeAllGDIMem\n");
}
void FreeAllUserMem(void)
{
-#ifdef STRESS_DEBUG
- fprintf(stderr, "stress.dll: FreeAllUserMem\n");
-#endif
+ dprintf_stress(stddeb, "stress.dll: FreeAllUserMem\n");
}
void GetFreeAllUserMem(void)
{
-#ifdef STRESS_DEBUG
- fprintf(stderr, "stress.dll: GetFreeAllUserMem\n");
-#endif
+ dprintf_stress(stddeb, "stress.dll: GetFreeAllUserMem\n");
}
int GetFreeFileHandles(void)
{
-#ifdef STRESS_DEBUG
- fprintf(stderr, "stress.dll: GetFreeFileHandles\n");
-#endif
+ dprintf_stress(stddeb, "stress.dll: GetFreeFileHandles\n");
#ifndef OPEN_MAX
return _POSIX_OPEN_MAX;
@@ -96,14 +79,10 @@
void UnAllocDiskSpace(UINT drive)
{
-#ifdef STRESS_DEBUG
- fprintf(stderr, "stress.dll: UnAllocDiskSpace %d\n", drive);
-#endif
+ dprintf_stress(stddeb, "stress.dll: UnAllocDiskSpace %d\n", drive);
}
void UnAllocFileHandles(void)
{
-#ifdef STRESS_DEBUG
- fprintf(stderr, "stress.dll: GetFreeAllUserMem\n");
-#endif
+ dprintf_stress(stddeb, "stress.dll: GetFreeAllUserMem\n");
}
diff --git a/misc/winsocket.c b/misc/winsocket.c
index 5195e2a..f9e2b1d 100644
--- a/misc/winsocket.c
+++ b/misc/winsocket.c
@@ -19,8 +19,11 @@
#include <unistd.h>
#include "heap.h"
#include "winsock.h"
+#include "stddebug.h"
+/* #define DEBUG_WINSOCK */
+/* #undef DEBUG_WINSOCK */
+#include "debug.h"
-#define DEBUG_WINSOCK
static WORD wsa_errno;
static int wsa_initted;
@@ -180,9 +183,7 @@
{
int sock;
-#ifdef DEBUG_WINSOCK
- fprintf(stderr, "WSA_accept: socket %d, ptr %8x, length %d\n", s, (int) addr, addrlen);
-#endif
+ dprintf_winsock(stddeb, "WSA_accept: socket %d, ptr %8x, length %d\n", s, (int) addr, addrlen);
if ((sock = accept(s, addr, (int *) addrlen)) < 0) {
errno_to_wsaerrno();
@@ -193,10 +194,8 @@
INT Winsock_bind(SOCKET s, struct sockaddr *name, INT namelen)
{
-#ifdef DEBUG_WINSOCK
- fprintf(stderr, "WSA_bind: socket %d, ptr %8x, length %d\n", s, (int) name, namelen);
+ dprintf_winsock(stddeb, "WSA_bind: socket %d, ptr %8x, length %d\n", s, (int) name, namelen);
dump_sockaddr(name);
-#endif
if (bind(s, name, namelen) < 0) {
errno_to_wsaerrno();
@@ -207,9 +206,7 @@
INT Winsock_closesocket(SOCKET s)
{
-#ifdef DEBUG_WINSOCK
- fprintf(stderr, "WSA_closesocket: socket %d\n", s);
-#endif
+ dprintf_winsock(stddeb, "WSA_closesocket: socket %d\n", s);
FD_CLR(s, &fd_in_use);
@@ -222,10 +219,8 @@
INT Winsock_connect(SOCKET s, struct sockaddr *name, INT namelen)
{
-#ifdef DEBUG_WINSOCK
- fprintf(stderr, "WSA_connect: socket %d, ptr %8x, length %d\n", s, (int) name, namelen);
+ dprintf_winsock(stddeb, "WSA_connect: socket %d, ptr %8x, length %d\n", s, (int) name, namelen);
dump_sockaddr(name);
-#endif
if (connect(s, name, namelen) < 0) {
errno_to_wsaerrno();
@@ -236,10 +231,8 @@
INT Winsock_getpeername(SOCKET s, struct sockaddr *name, INT *namelen)
{
-#ifdef DEBUG_WINSOCK
- fprintf(stderr, "WSA_getpeername: socket: %d, ptr %8x, ptr %8x\n", s, (int) name, *namelen);
+ dprintf_winsock(stddeb, "WSA_getpeername: socket: %d, ptr %8x, ptr %8x\n", s, (int) name, *namelen);
dump_sockaddr(name);
-#endif
if (getpeername(s, name, (int *) namelen) < 0) {
errno_to_wsaerrno();
@@ -250,9 +243,7 @@
INT Winsock_getsockname(SOCKET s, struct sockaddr *name, INT *namelen)
{
-#ifdef DEBUG_WINSOCK
- fprintf(stderr, "WSA_getsockname: socket: %d, ptr %8x, ptr %8x\n", s, (int) name, (int) *namelen);
-#endif
+ dprintf_winsock(stddeb, "WSA_getsockname: socket: %d, ptr %8x, ptr %8x\n", s, (int) name, (int) *namelen);
if (getsockname(s, name, (int *) namelen) < 0) {
errno_to_wsaerrno();
return SOCKET_ERROR;
@@ -263,9 +254,7 @@
INT
Winsock_getsockopt(SOCKET s, INT level, INT optname, char *optval, INT *optlen)
{
-#ifdef DEBUG_WINSOCK
- fprintf(stderr, "WSA_getsockopt: socket: %d, opt %d, ptr %8x, ptr %8x\n", s, level, (int) optval, (int) *optlen);
-#endif
+ dprintf_winsock(stddeb, "WSA_getsockopt: socket: %d, opt %d, ptr %8x, ptr %8x\n", s, level, (int) optval, (int) *optlen);
convert_sockopt(&level, &optname);
if (getsockopt(s, (int) level, optname, optval, (int *) optlen) < 0) {
@@ -294,9 +283,7 @@
{
char *s;
-#ifdef DEBUG_WINSOCK
- fprintf(stderr, "WSA_inet_ntoa: %8x\n", in);
-#endif
+ dprintf_winsock(stddeb, "WSA_inet_ntoa: %8x\n", in);
if ((s = inet_ntoa(in)) == NULL) {
errno_to_wsaerrno();
@@ -310,9 +297,7 @@
INT Winsock_ioctlsocket(SOCKET s, long cmd, u_long *argp)
{
-#ifdef DEBUG_WINSOCK
- fprintf(stderr, "WSA_ioctl: socket %d, cmd %d, ptr %8x\n", s, cmd, (int) argp);
-#endif
+ dprintf_winsock(stddeb, "WSA_ioctl: socket %d, cmd %d, ptr %8x\n", s, cmd, (int) argp);
if (ioctl(s, cmd, argp) < 0) {
errno_to_wsaerrno();
@@ -323,9 +308,7 @@
INT Winsock_listen(SOCKET s, INT backlog)
{
-#ifdef DEBUG_WINSOCK
- fprintf(stderr, "WSA_listen: socket %d, backlog %d\n", s, backlog);
-#endif
+ dprintf_winsock(stddeb, "WSA_listen: socket %d, backlog %d\n", s, backlog);
if (listen(s, backlog) < 0) {
errno_to_wsaerrno();
@@ -348,9 +331,7 @@
{
int length;
-#ifdef DEBUG_WINSOCK
- fprintf(stderr, "WSA_recv: socket %d, ptr %8x, length %d, flags %d\n", s, (int) buf, len, flags);
-#endif
+ dprintf_winsock(stddeb, "WSA_recv: socket %d, ptr %8x, length %d, flags %d\n", s, (int) buf, len, flags);
if ((length = recv(s, buf, len, flags)) < 0) {
errno_to_wsaerrno();
@@ -364,9 +345,7 @@
{
int length;
-#ifdef DEBUG_WINSOCK
- fprintf(stderr, "WSA_recvfrom: socket %d, ptr %8x, length %d, flags %d\n", s, buf, len, flags);
-#endif
+ dprintf_winsock(stddeb, "WSA_recvfrom: socket %d, ptr %8x, length %d, flags %d\n", s, buf, len, flags);
if ((length = recvfrom(s, buf, len, flags, from, fromlen)) < 0) {
errno_to_wsaerrno();
@@ -378,9 +357,7 @@
INT Winsock_select(INT nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout)
{
-#ifdef DEBUG_WINSOCK
- fprintf(stderr, "WSA_select: fd # %d, ptr %8x, ptr %8x, ptr %*X\n", nfds, readfds, writefds, exceptfds);
-#endif
+ dprintf_winsock(stddeb, "WSA_select: fd # %d, ptr %8x, ptr %8x, ptr %*X\n", nfds, readfds, writefds, exceptfds);
return(select(nfds, readfds, writefds, exceptfds, timeout));
}
@@ -389,9 +366,7 @@
{
int length;
-#ifdef DEBUG_WINSOCK
- fprintf(stderr, "WSA_send: socket %d, ptr %8x, length %d, flags %d\n", s, buf, len, flags);
-#endif
+ dprintf_winsock(stddeb, "WSA_send: socket %d, ptr %8x, length %d, flags %d\n", s, buf, len, flags);
if ((length = send(s, buf, len, flags)) < 0) {
errno_to_wsaerrno();
@@ -405,9 +380,7 @@
{
int length;
-#ifdef DEBUG_WINSOCK
- fprintf(stderr, "WSA_sendto: socket %d, ptr %8x, length %d, flags %d\n", s, buf, len, flags);
-#endif
+ dprintf_winsock(stddeb, "WSA_sendto: socket %d, ptr %8x, length %d, flags %d\n", s, buf, len, flags);
if ((length = sendto(s, buf, len, flags, to, tolen)) < 0) {
errno_to_wsaerrno();
@@ -419,9 +392,7 @@
INT Winsock_setsockopt(SOCKET s, INT level, INT optname, const char *optval,
INT optlen)
{
-#ifdef DEBUG_WINSOCK
- fprintf(stderr, "WSA_setsockopt: socket %d, level %d, opt %d, ptr %8x, len %d\n", s, level, optname, (int) optval, optlen);
-#endif
+ dprintf_winsock(stddeb, "WSA_setsockopt: socket %d, level %d, opt %d, ptr %8x, len %d\n", s, level, optname, (int) optval, optlen);
convert_sockopt(&level, &optname);
if (setsockopt(s, level, optname, optval, optlen) < 0) {
@@ -433,9 +404,7 @@
INT Winsock_shutdown(SOCKET s, INT how)
{
-#ifdef DEBUG_WINSOCK
- fprintf(stderr, "WSA_shutdown: socket s %d, how %d\n", s, how);
-#endif
+ dprintf_winsock(stddeb, "WSA_shutdown: socket s %d, how %d\n", s, how);
if (shutdown(s, how) < 0) {
errno_to_wsaerrno();
@@ -448,15 +417,11 @@
{
int sock;
-#ifdef DEBUG_WINSOCK
- fprintf(stderr, "WSA_socket: af=%d type=%d protocol=%d\n", af, type, protocol);
-#endif
+ dprintf_winsock(stddeb, "WSA_socket: af=%d type=%d protocol=%d\n", af, type, protocol);
if ((sock = socket(af, type, protocol)) < 0) {
errno_to_wsaerrno();
-#ifdef DEBUG_WINSOCK
- fprintf(stderr, "WSA_socket: failed !\n");
-#endif
+ dprintf_winsock(stddeb, "WSA_socket: failed !\n");
return INVALID_SOCKET;
}
@@ -467,9 +432,7 @@
FD_SET(sock, &fd_in_use);
-#ifdef DEBUG_WINSOCK
- fprintf(stderr, "WSA_socket: fd %d\n", sock);
-#endif
+ dprintf_winsock(stddeb, "WSA_socket: fd %d\n", sock);
return sock;
}
@@ -477,9 +440,7 @@
{
struct hostent *host;
-#ifdef DEBUG_WINSOCK
- fprintf(stderr, "WSA_gethostbyaddr: ptr %8x, len %d, type %d\n", (int) addr, len, type);
-#endif
+ dprintf_winsock(stddeb, "WSA_gethostbyaddr: ptr %8x, len %d, type %d\n", (int) addr, len, type);
if ((host = gethostbyaddr(addr, len, type)) == NULL) {
errno_to_wsaerrno();
@@ -494,9 +455,7 @@
{
struct hostent *host;
-#ifdef DEBUG_WINSOCK
- fprintf(stderr, "WSA_gethostbyname: name %s\n", name);
-#endif
+ dprintf_winsock(stddeb, "WSA_gethostbyname: name %s\n", name);
if ((host = gethostbyname(name)) == NULL) {
errno_to_wsaerrno();
@@ -510,9 +469,7 @@
int Winsock_gethostname(char *name, INT namelen)
{
-#ifdef DEBUG_WINSOCK
- fprintf(stderr, "WSA_gethostname: name %d, len %d\n", name, namelen);
-#endif
+ dprintf_winsock(stddeb, "WSA_gethostname: name %d, len %d\n", name, namelen);
if (gethostname(name, namelen) < 0) {
errno_to_wsaerrno();
@@ -525,9 +482,7 @@
{
struct protoent *proto;
-#ifdef DEBUG_WINSOCK
- fprintf(stderr, "WSA_getprotobyname: name %s\n", name);
-#endif
+ dprintf_winsock(stddeb, "WSA_getprotobyname: name %s\n", name);
if ((proto = getprotobyname(name)) == NULL) {
errno_to_wsaerrno();
@@ -542,9 +497,7 @@
{
struct protoent *proto;
-#ifdef DEBUG_WINSOCK
- fprintf(stderr, "WSA_getprotobynumber: num %d\n", number);
-#endif
+ dprintf_winsock(stddeb, "WSA_getprotobynumber: num %d\n", number);
if ((proto = getprotobynumber(number)) == NULL) {
errno_to_wsaerrno();
@@ -559,9 +512,7 @@
{
struct servent *service;
-#ifdef DEBUG_WINSOCK
- fprintf(stderr, "WSA_getservbyname: name %s, proto %s\n", name, proto);
-#endif
+ dprintf_winsock(stddeb, "WSA_getservbyname: name %s, proto %s\n", name, proto);
if ((service = getservbyname(name, proto)) == NULL) {
errno_to_wsaerrno();
@@ -576,9 +527,7 @@
{
struct servent *service;
-#ifdef DEBUG_WINSOCK
- fprintf(stderr, "WSA_getservbyport: port %d, name %s\n", port, proto);
-#endif
+ dprintf_winsock(stddeb, "WSA_getservbyport: port %d, name %s\n", port, proto);
if ((service = getservbyport(port, proto)) == NULL) {
errno_to_wsaerrno();
@@ -776,9 +725,7 @@
long event;
fd_set read_fds, write_fds, except_fds;
-#ifdef DEBUG_WINSOCK
- fprintf(stderr, "WSA_AsyncSelect: socket %d, HWND %d, wMsg %d, event %d\n", s, hWnd, wMsg, lEvent);
-#endif
+ dprintf_winsock(stddeb, "WSA_AsyncSelect: socket %d, HWND %d, wMsg %d, event %d\n", s, hWnd, wMsg, lEvent);
/* remove outstanding asyncselect() processes */
/* kill */
@@ -820,51 +767,39 @@
INT WSACancelAsyncRequest(HANDLE hAsyncTaskHandle)
{
-#ifdef DEBUG_WINSOCK
- fprintf(stderr, "WSA_AsyncRequest: handle %d\n", hAsyncTaskHandle);
-#endif
+ dprintf_winsock(stddeb, "WSA_AsyncRequest: handle %d\n", hAsyncTaskHandle);
return 0;
}
INT WSACancelBlockingCall(void)
{
-#ifdef DEBUG_WINSOCK
- fprintf(stderr, "WSA_CancelBlockCall\n");
-#endif
+ dprintf_winsock(stddeb, "WSA_CancelBlockCall\n");
return 0;
}
INT WSAGetLastError(void)
{
-#ifdef DEBUG_WINSOCK
- fprintf(stderr, "WSA_GetLastError\n");
-#endif
+ dprintf_winsock(stddeb, "WSA_GetLastError\n");
return wsa_errno;
}
void WSASetLastError(INT iError)
{
-#ifdef DEBUG_WINSOCK
- fprintf(stderr, "WSA_SetLastErorr %d\n", iError);
-#endif
+ dprintf_winsock(stddeb, "WSA_SetLastErorr %d\n", iError);
wsa_errno = iError;
}
BOOL WSAIsBlocking(void)
{
-#ifdef DEBUG_WINSOCK
- fprintf(stderr, "WSA_IsBlocking\n");
-#endif
+ dprintf_winsock(stddeb, "WSA_IsBlocking\n");
}
FARPROC WSASetBlockingHook(FARPROC lpBlockFunc)
{
-#ifdef DEBUG_WINSOCK
- fprintf(stderr, "WSA_SetBlockHook %8x, STUB!\n", lpBlockFunc);
-#endif
+ dprintf_winsock(stddeb, "WSA_SetBlockHook %8x, STUB!\n", lpBlockFunc);
BlockFunction = lpBlockFunc;
return lpBlockFunc;
@@ -872,9 +807,7 @@
INT WSAUnhookBlockingHook(void)
{
-#ifdef DEBUG_WINSOCK
- fprintf(stderr, "WSA_UnhookBlockingHook\n");
-#endif
+ dprintf_winsock(stddeb, "WSA_UnhookBlockingHook\n");
BlockFunction = NULL;
return 0;
@@ -903,9 +836,7 @@
int HeapHandle;
MDESC *MyHeap;
-#ifdef DEBUG_WINSOCK
- fprintf(stderr, "WSAStartup: verReq=%x\n", wVersionRequested);
-#endif
+ dprintf_winsock(stddeb, "WSAStartup: verReq=%x\n", wVersionRequested);
if (LOBYTE(wVersionRequested) < 1 ||
(LOBYTE(wVersionRequested) == 1 &&
diff --git a/miscemu/int10.c b/miscemu/int10.c
index 2260fff..123ddbb 100644
--- a/miscemu/int10.c
+++ b/miscemu/int10.c
@@ -9,8 +9,8 @@
void IntBarf(int i, struct sigcontext_struct *context)
{
- fprintf(stderr, "int%x: unknown/not implemented parameters:\n", i);
- fprintf(stderr, "int%x: AX %04x, BX %04x, CX %04x, DX %04x, "
+ fprintf(stdnimp, "int%x: unknown/not implemented parameters:\n", i);
+ fprintf(stdnimp, "int%x: AX %04x, BX %04x, CX %04x, DX %04x, "
"SI %04x, DI %04x, DS %04x, ES %04x\n",
i, AX, BX, CX, DX, SI, DI, DS, ES);
}
diff --git a/miscemu/int21.c b/miscemu/int21.c
index 84cb953..fae0a1b 100644
--- a/miscemu/int21.c
+++ b/miscemu/int21.c
@@ -97,8 +97,8 @@
/*
static void Barf(struct sigcontext_struct *context)
{
- fprintf(stderr, "int21: unknown/not implemented parameters:\n");
- fprintf(stderr, "int21: AX %04x, BX %04x, CX %04x, DX %04x, "
+ fprintf(stdnimp, "int21: unknown/not implemented parameters:\n");
+ fprintf(stdnimp, "int21: AX %04x, BX %04x, CX %04x, DX %04x, "
"SI %04x, DI %04x, DS %04x, ES %04x\n",
AX, BX, CX, DX, SI, DI, DS, ES);
}
@@ -235,7 +235,7 @@
return;
}
- ptr = pointer (DS,DX);
+ ptr = SAFEMAKEPTR (DS,DX);
if (BX == 0) {
*ptr = EOF;
Error (0,0,0);
@@ -261,7 +261,7 @@
char *ptr;
int x,size;
- ptr = pointer (DS,DX);
+ ptr = SAFEMAKEPTR (DS,DX);
if (BX == 0) {
Error (InvalidHandle, EC_Unknown, EL_Unknown);
@@ -312,7 +312,7 @@
case 0: fileoffset = SEEK_SET;
break;
}
- status = lseek(BX, (CX * 0x100) + DX, fileoffset);
+ status = lseek(BX, (CX << 16) + DX, fileoffset);
if (status == -1) {
errno_to_doserr();
AL = ExtendedError; SetCflag;
@@ -355,7 +355,7 @@
static void ioctlGenericBlkDevReq(struct sigcontext_struct *context)
{
- BYTE *dataptr = pointer(DS, DX);
+ BYTE *dataptr = SAFEMAKEPTR(DS, DX);
int drive;
if (BL == 0)
@@ -436,7 +436,7 @@
{
int handle;
- if ((handle = open(GetUnixFileName( pointer(DS,DX)),
+ if ((handle = open(GetUnixFileName( SAFEMAKEPTR(DS,DX)),
O_CREAT | O_TRUNC | O_RDWR )) == -1) {
errno_to_doserr();
AL = ExtendedError;
@@ -469,7 +469,7 @@
break;
}
- if ((handle = open(GetUnixFileName(pointer(DS,DX)), mode)) == -1) {
+ if ((handle = open(GetUnixFileName(SAFEMAKEPTR(DS,DX)), mode)) == -1) {
errno_to_doserr();
AL = ExtendedError;
SetCflag;
@@ -486,7 +486,7 @@
case 0x30: /* DENYREAD */
dprintf_int(stdnimp,
"OpenExistingFile (%s): DENYREAD changed to DENYALL\n",
- pointer(DS,DX));
+ SAFEMAKEPTR(DS,DX));
case 0x10: /* DENYALL */
lock = LOCK_EX;
break;
@@ -550,10 +550,10 @@
char *newname, *oldname;
dprintf_int(stddeb,"int21: renaming %s to %s\n",
- pointer(DS,DX), pointer(ES,DI) );
+ SAFEMAKEPTR(DS,DX), SAFEMAKEPTR(ES,DI) );
- oldname = GetUnixFileName( pointer(DS,DX) );
- newname = GetUnixFileName( pointer(ES,DI) );
+ oldname = GetUnixFileName( SAFEMAKEPTR(DS,DX) );
+ newname = GetUnixFileName( SAFEMAKEPTR(ES,DI) );
rename( oldname, newname);
ResetCflag;
@@ -564,9 +564,9 @@
{
char *dirname;
- dprintf_int(stddeb,"int21: makedir %s\n", pointer(DS,DX) );
+ dprintf_int(stddeb,"int21: makedir %s\n", SAFEMAKEPTR(DS,DX) );
- if ((dirname = GetUnixFileName( pointer(DS,DX) ))== NULL) {
+ if ((dirname = GetUnixFileName( SAFEMAKEPTR(DS,DX) ))== NULL) {
AL = CanNotMakeDir;
SetCflag;
return;
@@ -583,7 +583,7 @@
static void ChangeDir(struct sigcontext_struct *context)
{
int drive;
- char *dirname = pointer(DS,DX);
+ char *dirname = SAFEMAKEPTR(DS,DX);
drive = DOS_GetDefaultDrive();
dprintf_int(stddeb,"int21: changedir %s\n", dirname);
if (dirname != NULL && dirname[1] == ':') {
@@ -601,9 +601,9 @@
{
char *dirname;
- dprintf_int(stddeb,"int21: removedir %s\n", pointer(DS,DX) );
+ dprintf_int(stddeb,"int21: removedir %s\n", SAFEMAKEPTR(DS,DX) );
- if ((dirname = GetUnixFileName( pointer(DS,DX) ))== NULL) {
+ if ((dirname = GetUnixFileName( SAFEMAKEPTR(DS,DX) ))== NULL) {
AL = CanNotMakeDir;
SetCflag;
return;
@@ -624,7 +624,7 @@
static void ExecProgram(struct sigcontext_struct *context)
{
- execl("wine", GetUnixFileName( pointer(DS,DX)) );
+ execl("wine", GetUnixFileName( SAFEMAKEPTR(DS,DX)) );
}
static void FindNext(struct sigcontext_struct *context)
@@ -656,7 +656,7 @@
static void FindFirst(struct sigcontext_struct *context)
{
- BYTE drive, *path = pointer(DS, DX);
+ BYTE drive, *path = SAFEMAKEPTR(DS, DX);
struct dosdirent *dp;
if ((*path)&&(path[1] == ':')) {
@@ -704,7 +704,7 @@
struct stat filestat;
struct tm *now;
- if ((filename = GetUnixFileName( pointer(DS,DX) ))== NULL) {
+ if ((filename = GetUnixFileName( SAFEMAKEPTR(DS,DX) ))== NULL) {
AL = FileNotFound;
SetCflag;
return;
@@ -724,7 +724,7 @@
char *filename;
struct utimbuf filetime;
- filename = GetUnixFileName( pointer(DS,DX) );
+ filename = GetUnixFileName( SAFEMAKEPTR(DS,DX) );
filetime.actime = 0L;
filetime.modtime = filetime.actime;
@@ -750,7 +750,7 @@
return;
}
- strcpy(pointer(DS,DX), temp);
+ strcpy(SAFEMAKEPTR(DS,DX), temp);
AX = handle;
ResetCflag;
@@ -760,7 +760,7 @@
{
int handle;
- if ((handle = open(GetUnixFileName( pointer(DS,DX) ), O_CREAT | O_EXCL | O_RDWR)) == -1) {
+ if ((handle = open(GetUnixFileName( SAFEMAKEPTR(DS,DX) ), O_CREAT | O_EXCL | O_RDWR)) == -1) {
AL = WriteProtected;
SetCflag;
return;
@@ -785,14 +785,14 @@
return;
}
- strcpy(pointer(DS,SI), DOS_GetCurrentDir(drive) );
+ strcpy(SAFEMAKEPTR(DS,SI), DOS_GetCurrentDir(drive) );
ResetCflag;
}
static void GetDiskSerialNumber(struct sigcontext_struct *context)
{
int drive;
- BYTE *dataptr = pointer(DS, DX);
+ BYTE *dataptr = SAFEMAKEPTR(DS, DX);
DWORD serialnumber;
if (BL == 0)
@@ -820,7 +820,7 @@
static void SetDiskSerialNumber(struct sigcontext_struct *context)
{
int drive;
- BYTE *dataptr = pointer(DS, DX);
+ BYTE *dataptr = SAFEMAKEPTR(DS, DX);
DWORD serialnumber;
if (BL == 0)
@@ -860,7 +860,7 @@
static void FindFirstFCB(struct sigcontext_struct *context)
{
- BYTE *fcb = pointer(DS, DX);
+ BYTE *fcb = SAFEMAKEPTR(DS, DX);
struct fcb *standard_fcb;
struct fcb *output_fcb;
int drive;
@@ -927,7 +927,7 @@
static void DeleteFileFCB(struct sigcontext_struct *context)
{
- BYTE *fcb = pointer(DS, DX);
+ BYTE *fcb = SAFEMAKEPTR(DS, DX);
int drive;
struct dosdirent *dp;
char temp[256], *ptr;
@@ -969,7 +969,7 @@
static void RenameFileFCB(struct sigcontext_struct *context)
{
- BYTE *fcb = pointer(DS, DX);
+ BYTE *fcb = SAFEMAKEPTR(DS, DX);
int drive;
struct dosdirent *dp;
char temp[256], oldname[256], newname[256], *oldnameptr, *newnameptr;
@@ -1069,7 +1069,7 @@
static void GetFileAttribute (struct sigcontext_struct * context)
{
- char *filename = pointer (DS,DX);
+ char *filename = SAFEMAKEPTR (DS,DX);
struct stat s;
int res,cx;
@@ -1201,7 +1201,7 @@
break;
case 0x1a: /* SET DISK TRANSFER AREA ADDRESS */
- dta = pointer(DS, DX);
+ dta = SAFEMAKEPTR(DS, DX);
break;
case 0x1b: /* GET ALLOCATION INFORMATION FOR DEFAULT DRIVE */
@@ -1336,7 +1336,7 @@
break;
case 0x41: /* "UNLINK" - DELETE FILE */
- if (unlink( GetUnixFileName( pointer(DS,DX)) ) == -1) {
+ if (unlink( GetUnixFileName( SAFEMAKEPTR(DS,DX)) ) == -1) {
errno_to_doserr();
AL = ExtendedError;
SetCflag;
@@ -1526,7 +1526,7 @@
break;
case 0x60: /* "TRUENAME" - CANONICALIZE FILENAME OR PATH */
- strncpy(pointer(ES,DI), pointer(DS,SI), strlen(pointer(DS,SI)) & 0x7f);
+ strncpy(SAFEMAKEPTR(ES,DI), SAFEMAKEPTR(DS,SI), strlen(SAFEMAKEPTR(DS,SI)) & 0x7f);
ResetCflag;
break;
diff --git a/miscemu/int25.c b/miscemu/int25.c
index 7f95717..67c2ec6 100644
--- a/miscemu/int25.c
+++ b/miscemu/int25.c
@@ -2,6 +2,7 @@
#include <stdlib.h>
#include "registers.h"
#include "msdos.h"
+#include "segmem.h"
#include "wine.h"
#include "stddebug.h"
/* #define DEBUG_INT */
@@ -10,7 +11,7 @@
int do_int25(struct sigcontext_struct *context)
{
- BYTE *dataptr = pointer(DS, BX);
+ BYTE *dataptr = SAFEMAKEPTR(DS, BX);
DWORD begin, length;
if (CX == 0xffff) {
@@ -37,7 +38,7 @@
/* push flags on stack */
SP -= sizeof(WORD);
- setword(pointer(SS,SP), (WORD) EFL);
+ setword(SAFEMAKEPTR(SS,SP), (WORD) EFL);
return 1;
}
diff --git a/miscemu/int26.c b/miscemu/int26.c
index 6abe988..2b262ed 100644
--- a/miscemu/int26.c
+++ b/miscemu/int26.c
@@ -2,6 +2,7 @@
#include <stdlib.h>
#include "registers.h"
#include "msdos.h"
+#include "segmem.h"
#include "wine.h"
#include "stddebug.h"
/* #define DEBUG_INT */
@@ -12,7 +13,7 @@
int do_int26(struct sigcontext_struct *context)
{
- BYTE *dataptr = pointer(DS, BX);
+ BYTE *dataptr = SAFEMAKEPTR(DS, BX);
DWORD begin, length;
if (CX == 0xffff) {
@@ -32,7 +33,7 @@
/* push flags on stack */
SP -= sizeof(WORD);
- setword(pointer(SS,SP), (WORD) EFL);
+ setword(SAFEMAKEPTR(SS,SP), (WORD) EFL);
return 1;
}
diff --git a/objects/bitblt.c b/objects/bitblt.c
index 47aa35c..0aa4e9a 100644
--- a/objects/bitblt.c
+++ b/objects/bitblt.c
@@ -15,11 +15,12 @@
#include "metafile.h"
#include "options.h"
#include "stddebug.h"
-/* #define DEBUG_GDI /* */
-/* #undef DEBUG_GDI /* */
+/* #define DEBUG_GDI */
+/* #undef DEBUG_GDI */
#include "debug.h"
extern const int DC_XROPfunction[];
+extern Colormap COLOR_WinColormap;
#define MIN(a,b) ((a) < (b) ? (a) : (b))
#define MAX(a,b) ((a) > (b) ? (a) : (b))
@@ -41,7 +42,7 @@
return TRUE;
}
- dprintf_gdi(stddeb, "PatBlt: %d %d,%d %dx%d %06x\n",
+ dprintf_gdi(stddeb, "PatBlt: %d %d,%d %dx%d %06lx\n",
hdc, left, top, width, height, rop );
/* Convert ROP3 code to ROP2 code */
@@ -92,7 +93,7 @@
DWORD saverop = rop;
DC *dcDest, *dcSrc;
- dprintf_gdi(stddeb, "BitBlt: %04x %d,%d %dx%d %04x %d,%d %08x\n",
+ dprintf_gdi(stddeb, "BitBlt: %04x %d,%d %dx%d %04x %d,%d %06lx\n",
hdcDest, xDest, yDest, width, height, hdcSrc, xSrc, ySrc, rop);
if (width == 0 || height == 0) return FALSE;
@@ -100,12 +101,7 @@
return PatBlt( hdcDest, xDest, yDest, width, height, rop );
rop >>= 16;
- if ((rop & 0x0f) != (rop >> 4))
- {
- dprintf_gdi(stdnimp, "BitBlt: Unimplemented ROP %02x\n", rop );
- return FALSE;
- }
-
+
dcSrc = (DC *) GDI_GetObjPtr( hdcSrc, DC_MAGIC );
if (!dcSrc) return FALSE;
dcDest = (DC *) GDI_GetObjPtr( hdcDest, DC_MAGIC );
@@ -131,22 +127,128 @@
return FALSE; /* Should call StretchBlt here */
DC_SetupGCForText( dcDest );
- XSetFunction( display, dcDest->u.x.gc, DC_XROPfunction[rop & 0x0f] );
- if (dcSrc->w.bitsPerPixel == dcDest->w.bitsPerPixel)
- {
- XCopyArea( display, dcSrc->u.x.drawable,
- dcDest->u.x.drawable, dcDest->u.x.gc,
- min(xs1,xs2), min(ys1,ys2), abs(xs2-xs1), abs(ys2-ys1),
- min(xd1,xd2), min(yd1,yd2) );
- }
+ if (((rop & 0x0f) == (rop >> 4))&&(rop!=0xbb))
+ /* FIXME: Test, whether more than just 0xbb has to be excluded */
+ {
+ XSetFunction( display, dcDest->u.x.gc, DC_XROPfunction[rop & 0x0f] );
+ if (dcSrc->w.bitsPerPixel == dcDest->w.bitsPerPixel)
+ {
+ XCopyArea( display, dcSrc->u.x.drawable,
+ dcDest->u.x.drawable, dcDest->u.x.gc,
+ min(xs1,xs2), min(ys1,ys2), abs(xs2-xs1), abs(ys2-ys1),
+ min(xd1,xd2), min(yd1,yd2) );
+ }
+ else
+ {
+ if (dcSrc->w.bitsPerPixel != 1) return FALSE;
+ XCopyPlane( display, dcSrc->u.x.drawable,
+ dcDest->u.x.drawable, dcDest->u.x.gc,
+ min(xs1,xs2), min(ys1,ys2), abs(xs2-xs1), abs(ys2-ys1),
+ min(xd1,xd2), min(yd1,yd2), 1 );
+ }
+ }
else
- {
- if (dcSrc->w.bitsPerPixel != 1) return FALSE;
- XCopyPlane( display, dcSrc->u.x.drawable,
- dcDest->u.x.drawable, dcDest->u.x.gc,
- min(xs1,xs2), min(ys1,ys2), abs(xs2-xs1), abs(ys2-ys1),
- min(xd1,xd2), min(yd1,yd2), 1 );
- }
+ {
+ XImage *sxi, *dxi, *bxi;
+ int x,y,s,d,p,res,ofs,i,cp,cs,cd,cres;
+ XColor sentry,dentry,pentry,entry;
+ long colors[256];
+
+ /* HDC hdcBrush = CreateCompatibleDC(hdcDest);
+ DC *dcBrush;*/
+ RECT r = {min(xDest,xDest+width), min(yDest,yDest+height),
+ MAX(xDest,xDest+width), MAX(yDest,yDest+height)};
+ HBRUSH cur_brush=SelectObject(hdcDest, GetStockObject(BLACK_BRUSH));
+ SelectObject(hdcDest, cur_brush);
+ /* FillRect(hdcBrush, &r, cur_brush);*/
+ sxi=XGetImage(display, dcSrc->u.x.drawable, min(xs1,xs2), min(ys1,ys2),
+ abs(xs2-xs1), abs(ys2-ys1), AllPlanes, ZPixmap);
+ dxi=XGetImage(display, dcDest->u.x.drawable, min(xd1,xd2),min(yd1,yd2),
+ abs(xs2-xs1), abs(ys2-ys1), AllPlanes, ZPixmap);
+ /* dcBrush = (DC *) GDI_GetObjPtr( hdcBrush, DC_MAGIC );*/
+ /* bxi=XGetImage(display, dcBrush->u.x.drawable, min(xd1,xd2),min(yd1,yd2),
+ abs(xs2-xs1), abs(ys2-ys1), AllPlanes, ZPixmap);*/
+ /* FIXME: It's really not necessary to do this on the visible screen */
+ FillRect(hdcDest, &r, cur_brush);
+ bxi=XGetImage(display, dcDest->u.x.drawable, min(xd1,xd2),min(yd1,yd2),
+ abs(xs2-xs1), abs(ys2-ys1), AllPlanes, ZPixmap);
+ for (i=0; i<min(256,1<<(dcDest->w.bitsPerPixel)); i++)
+ {
+ entry.pixel = i;
+ XQueryColor ( display, COLOR_WinColormap, &entry);
+ colors[i] = (int) RGB( entry.red>>8, entry.green>>8, entry.blue>>8 );
+ }
+ if (dcSrc->w.bitsPerPixel == dcDest->w.bitsPerPixel)
+ {
+ for(x=0; x<abs(xs2-xs1); x++)
+ {
+ for(y=0; y<abs(ys2-ys1); y++)
+ {
+ s = XGetPixel(sxi, x, y);
+ d = XGetPixel(dxi, x, y);
+ p = XGetPixel(bxi, x, y);
+ if (s<256)
+ cs=colors[s];
+ else
+ {
+ sentry.pixel = s;
+ XQueryColor ( display, COLOR_WinColormap, &sentry);
+ cs = (int) RGB( sentry.red>>8,sentry.green>>8, sentry.blue>>8 );
+ }
+ if (d<256)
+ cd=colors[d];
+ else
+ {
+ dentry.pixel = d;
+ XQueryColor ( display, COLOR_WinColormap, &dentry);
+ cd = (int) RGB( dentry.red>>8, dentry.green>>8,dentry.blue>>8 );
+ }
+ if (p<256)
+ cp=colors[p];
+ else
+ {
+ pentry.pixel = p;
+ XQueryColor ( display, COLOR_WinColormap, &pentry);
+ cp = (int) RGB( pentry.red>>8, pentry.green>>8,pentry.blue>>8 );
+ }
+ cres = 0;
+ for(i=0; i<24; i++)
+ {
+ ofs=1<<(((cp>>i)&1)*4+((cs>>i)&1)*2+((cd>>i)&1));
+ if (rop & ofs)
+ cres |= (1<<i);
+ }
+ if (cres==cs)
+ res=s;
+ else if (cres==cd)
+ res=d;
+ else if (cres==cp)
+ res=p;
+ else
+ {
+ res = -1;
+ for (i=0; i<min(256,1<<(dcDest->w.bitsPerPixel)); i++)
+ if (colors[i]==cres)
+ {
+ res = i;
+ break;
+ }
+ if (res == -1)
+ res = GetNearestPaletteIndex(dcDest->w.hPalette, res);
+ }
+ XPutPixel(dxi, x, y, res);
+ }
+ }
+ }
+ else
+ fprintf(stderr,"BitBlt // depths different!\n");
+ XPutImage(display, dcDest->u.x.drawable, dcDest->u.x.gc,
+ dxi, 0, 0, min(xd1,xd2), min(yd1,yd2), abs(xs2-xs1), abs(ys2-ys1)+38);
+ XDestroyImage(sxi);
+ XDestroyImage(dxi);
+ XDestroyImage(bxi);
+ /*DeleteDC(hdcBrush);*/
+ }
return TRUE;
}
@@ -351,9 +453,8 @@
XImage *sxi, *dxi;
DWORD saverop = rop;
WORD stretchmode;
- BOOL flg;
- dprintf_gdi(stddeb, "StretchBlt: %d %d,%d %dx%d %d %d,%d %dx%d %08x\n",
+ dprintf_gdi(stddeb, "StretchBlt: %d %d,%d %dx%d %d %d,%d %dx%d %06lx\n",
hdcDest, xDest, yDest, widthDest, heightDest, hdcSrc, xSrc,
ySrc, widthSrc, heightSrc, rop );
dprintf_gdi(stddeb, "StretchMode is %x\n",
@@ -376,7 +477,7 @@
rop >>= 16;
if ((rop & 0x0f) != (rop >> 4))
{
- dprintf_gdi(stdnimp, "StretchBlt: Unimplemented ROP %02x\n", rop );
+ fprintf(stdnimp, "StretchBlt: Unimplemented ROP %02lx\n", rop );
return FALSE;
}
diff --git a/objects/bitmap.c b/objects/bitmap.c
index 0785559..2b540e6 100644
--- a/objects/bitmap.c
+++ b/objects/bitmap.c
@@ -27,7 +27,8 @@
/* GCs used for B&W and color bitmap operations */
GC BITMAP_monoGC = 0, BITMAP_colorGC = 0;
-extern void DC_InitDC( HDC hdc ); /* dc.c */
+extern void DC_InitDC( HDC hdc ); /* objects/dc.c */
+extern void CLIPPING_UpdateGCRegion( DC * dc ); /* objects/clipping.c */
/***********************************************************************
* BITMAP_Init
@@ -296,12 +297,16 @@
HBITMAP BITMAP_SelectObject( HDC hdc, DC * dc, HBITMAP hbitmap,
BITMAPOBJ * bmp )
{
+ HRGN hrgn;
HBITMAP prevHandle = dc->w.hBitmap;
if (!(dc->w.flags & DC_MEMORY)) return 0;
+ hrgn = CreateRectRgn( 0, 0, bmp->bitmap.bmWidth, bmp->bitmap.bmHeight );
+ if (!hrgn) return 0;
+
+ DeleteObject( dc->w.hVisRgn );
+ dc->w.hVisRgn = hrgn;
dc->u.x.drawable = bmp->pixmap;
- dc->w.DCSizeX = bmp->bitmap.bmWidth;
- dc->w.DCSizeY = bmp->bitmap.bmHeight;
dc->w.hBitmap = hbitmap;
/* Change GC depth if needed */
@@ -313,6 +318,7 @@
dc->w.bitsPerPixel = bmp->bitmap.bmBitsPixel;
DC_InitDC( hdc );
}
+ else CLIPPING_UpdateGCRegion( dc ); /* Just update GC clip region */
return prevHandle;
}
diff --git a/objects/brush.c b/objects/brush.c
index 1a4ff72..6555d6c 100644
--- a/objects/brush.c
+++ b/objects/brush.c
@@ -232,6 +232,8 @@
BITMAPINFO * bmpInfo;
HBRUSH prevHandle = dc->w.hBrush;
+ dprintf_gdi(stddeb, "Brush_SelectObject hdc=%04x hbrush=%04x\n",
+ hdc,hbrush);
if (dc->header.wMagic == METAFILE_DC_MAGIC)
{
switch (brush->logbrush.lbStyle)
@@ -264,13 +266,16 @@
switch(brush->logbrush.lbStyle)
{
case BS_NULL:
+ dprintf_gdi( stddeb,"BS_NULL\n" );
break;
case BS_SOLID:
+ dprintf_gdi( stddeb,"BS_SOLID\n" );
BRUSH_SelectSolidBrush( dc, brush->logbrush.lbColor );
break;
case BS_HATCHED:
+ dprintf_gdi( stddeb, "BS_HATCHED\n" );
dc->u.x.brush.pixel = COLOR_ToPhysical( dc, brush->logbrush.lbColor );
dc->u.x.brush.pixmap = XCreateBitmapFromData( display, rootWindow,
HatchBrushes[brush->logbrush.lbHatch], 8, 8 );
@@ -278,10 +283,12 @@
break;
case BS_PATTERN:
+ dprintf_gdi( stddeb, "BS_PATTERN\n");
BRUSH_SelectPatternBrush( dc, brush->logbrush.lbHatch );
break;
case BS_DIBPATTERN:
+ dprintf_gdi( stddeb, "BS_DIBPATTERN\n");
if ((bmpInfo = (BITMAPINFO *) GlobalLock( brush->logbrush.lbHatch )))
{
int size = DIB_BitmapInfoSize( bmpInfo, brush->logbrush.lbColor );
diff --git a/objects/clipping.c b/objects/clipping.c
index 26019dc..d6d8bba 100644
--- a/objects/clipping.c
+++ b/objects/clipping.c
@@ -10,8 +10,8 @@
#include "gdi.h"
#include "metafile.h"
#include "stddebug.h"
-/* #define DEBUG_CLIPPING /* */
-/* #undef DEBUG_CLIPPING /* */
+/* #define DEBUG_CLIPPING */
+/* #undef DEBUG_CLIPPING */
#include "debug.h"
/***********************************************************************
@@ -19,32 +19,29 @@
*
* Set the clip region of the physical device.
*/
-void CLIPPING_SetDeviceClipping( DC * dc )
+static void CLIPPING_SetDeviceClipping( DC * dc )
{
- if (dc->w.hGCClipRgn)
+ RGNOBJ *obj = (RGNOBJ *) GDI_GetObjPtr(dc->w.hGCClipRgn, REGION_MAGIC);
+ if (!obj)
{
- RGNOBJ *obj = (RGNOBJ *) GDI_GetObjPtr(dc->w.hGCClipRgn, REGION_MAGIC);
- if (obj->region.xrgn)
- {
- XSetRegion( display, dc->u.x.gc, obj->region.xrgn );
- XSetClipOrigin( display, dc->u.x.gc, dc->w.DCOrgX, dc->w.DCOrgY );
- }
- else if (obj->region.pixmap)
- {
- XSetClipMask( display, dc->u.x.gc, obj->region.pixmap );
- XSetClipOrigin( display, dc->u.x.gc,
- dc->w.DCOrgX + obj->region.box.left,
- dc->w.DCOrgY + obj->region.box.top );
- }
- else /* Clip everything */
- {
- XSetClipRectangles( display, dc->u.x.gc, 0, 0, NULL, 0, 0 );
- }
+ fprintf( stderr, "SetDeviceClipping: Rgn is 0. Please report this.\n");
+ exit(1);
}
- else
+ if (obj->region.xrgn)
{
- XSetClipMask( display, dc->u.x.gc, None );
- XSetClipOrigin( display, dc->u.x.gc, dc->w.DCOrgX, dc->w.DCOrgY );
+ XSetRegion( display, dc->u.x.gc, obj->region.xrgn );
+ XSetClipOrigin( display, dc->u.x.gc, dc->w.DCOrgX, dc->w.DCOrgY );
+ }
+ else if (obj->region.pixmap)
+ {
+ XSetClipMask( display, dc->u.x.gc, obj->region.pixmap );
+ XSetClipOrigin( display, dc->u.x.gc,
+ dc->w.DCOrgX + obj->region.box.left,
+ dc->w.DCOrgY + obj->region.box.top );
+ }
+ else /* Clip everything */
+ {
+ XSetClipRectangles( display, dc->u.x.gc, 0, 0, NULL, 0, 0 );
}
}
@@ -54,66 +51,47 @@
*
* Update the GC clip region when the ClipRgn or VisRgn have changed.
*/
-static void CLIPPING_UpdateGCRegion( DC * dc )
+void CLIPPING_UpdateGCRegion( DC * dc )
{
- if (!dc->w.hGCClipRgn) dc->w.hGCClipRgn = CreateRectRgn(0,0,0,0);
+ if (!dc->w.hGCClipRgn) dc->w.hGCClipRgn = CreateRectRgn( 0, 0, 0, 0 );
if (!dc->w.hVisRgn)
{
- if (!dc->w.hClipRgn)
- {
- DeleteObject( dc->w.hGCClipRgn );
- dc->w.hGCClipRgn = 0;
- }
- else
- CombineRgn( dc->w.hGCClipRgn, dc->w.hClipRgn, 0, RGN_COPY );
+ fprintf( stderr, "UpdateGCRegion: hVisRgn is zero. Please report this.\n" );
+ exit(1);
}
+ if (!dc->w.hClipRgn)
+ CombineRgn( dc->w.hGCClipRgn, dc->w.hVisRgn, 0, RGN_COPY );
else
- {
- if (!dc->w.hClipRgn)
- CombineRgn( dc->w.hGCClipRgn, dc->w.hVisRgn, 0, RGN_COPY );
- else
- CombineRgn( dc->w.hGCClipRgn, dc->w.hClipRgn, dc->w.hVisRgn, RGN_AND );
- }
+ CombineRgn( dc->w.hGCClipRgn, dc->w.hClipRgn, dc->w.hVisRgn, RGN_AND );
CLIPPING_SetDeviceClipping( dc );
}
/***********************************************************************
- * CLIPPING_SelectRgn
- *
- * Helper function for SelectClipRgn() and SelectVisRgn().
- */
-static int CLIPPING_SelectRgn( DC * dc, HRGN * hrgnPrev, HRGN hrgn )
-{
- int retval;
-
- if (hrgn)
- {
- if (!*hrgnPrev) *hrgnPrev = CreateRectRgn(0,0,0,0);
- retval = CombineRgn( *hrgnPrev, hrgn, 0, RGN_COPY );
- }
- else
- {
- if (*hrgnPrev) DeleteObject( *hrgnPrev );
- *hrgnPrev = 0;
- retval = SIMPLEREGION; /* Clip region == client area */
- }
- CLIPPING_UpdateGCRegion( dc );
- return retval;
-}
-
-
-/***********************************************************************
* SelectClipRgn (GDI.44)
*/
int SelectClipRgn( HDC hdc, HRGN hrgn )
{
+ int retval;
DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
if (!dc) return ERROR;
-
+
dprintf_clipping(stddeb, "SelectClipRgn: %d %d\n", hdc, hrgn );
- return CLIPPING_SelectRgn( dc, &dc->w.hClipRgn, hrgn );
+
+ if (hrgn)
+ {
+ if (!dc->w.hClipRgn) dc->w.hClipRgn = CreateRectRgn(0,0,0,0);
+ retval = CombineRgn( dc->w.hClipRgn, hrgn, 0, RGN_COPY );
+ }
+ else
+ {
+ if (dc->w.hClipRgn) DeleteObject( dc->w.hClipRgn );
+ dc->w.hClipRgn = 0;
+ retval = SIMPLEREGION; /* Clip region == whole DC */
+ }
+ CLIPPING_UpdateGCRegion( dc );
+ return retval;
}
@@ -122,11 +100,15 @@
*/
int SelectVisRgn( HDC hdc, HRGN hrgn )
{
+ int retval;
DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
- if (!dc) return ERROR;
-
+ if (!dc || !hrgn) return ERROR;
+
dprintf_clipping(stddeb, "SelectVisRgn: %d %d\n", hdc, hrgn );
- return CLIPPING_SelectRgn( dc, &dc->w.hVisRgn, hrgn );
+
+ retval = CombineRgn( dc->w.hVisRgn, hrgn, 0, RGN_COPY );
+ CLIPPING_UpdateGCRegion( dc );
+ return retval;
}
@@ -161,62 +143,45 @@
*/
int OffsetVisRgn( HDC hdc, short x, short y )
{
+ int retval;
DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
if (!dc) return ERROR;
dprintf_clipping(stddeb, "OffsetVisRgn: %d %d,%d\n", hdc, x, y );
-
- if (dc->w.hVisRgn)
- {
- int retval = OffsetRgn( dc->w.hVisRgn, x, y );
- CLIPPING_UpdateGCRegion( dc );
- return retval;
- }
- else return SIMPLEREGION; /* Clip region == client area */
+ retval = OffsetRgn( dc->w.hVisRgn, x, y );
+ CLIPPING_UpdateGCRegion( dc );
+ return retval;
}
/***********************************************************************
- * CLIPPING_IntersectRect
+ * CLIPPING_IntersectClipRect
*
- * Helper function for {Intersect,Exclude}{Clip,Vis}Rect
+ * Helper function for {Intersect,Exclude}ClipRect
*/
-int CLIPPING_IntersectRect( DC * dc, HRGN * hrgn, short left, short top,
- short right, short bottom, int exclude )
+static int CLIPPING_IntersectClipRect( DC * dc, short left, short top,
+ short right, short bottom, BOOL exclude)
{
- HRGN tempRgn = 0, prevRgn = 0, newRgn = 0;
- RGNOBJ *newObj, *prevObj;
- int retval;
+ HRGN tempRgn, newRgn;
+ int ret;
- if (!*hrgn)
+ if (!(newRgn = CreateRectRgn( 0, 0, 0, 0 ))) return ERROR;
+ if (!(tempRgn = CreateRectRgn( left, top, right, bottom )))
{
- if (!(*hrgn = CreateRectRgn( 0, 0, dc->w.DCSizeX, dc->w.DCSizeY )))
- goto Error;
- prevRgn = *hrgn;
+ DeleteObject( newRgn );
+ return ERROR;
}
- if (!(newRgn = CreateRectRgn( 0, 0, 0, 0))) goto Error;
- if (!(tempRgn = CreateRectRgn( left, top, right, bottom ))) goto Error;
-
- retval = CombineRgn( newRgn, *hrgn, tempRgn, exclude ? RGN_DIFF : RGN_AND);
- if (retval == ERROR) goto Error;
-
- newObj = (RGNOBJ *) GDI_GetObjPtr( newRgn, REGION_MAGIC );
- prevObj = (RGNOBJ *) GDI_GetObjPtr( *hrgn, REGION_MAGIC );
- if (newObj && prevObj) newObj->header.hNext = prevObj->header.hNext;
+ ret = CombineRgn( newRgn, dc->w.hClipRgn ? dc->w.hClipRgn : dc->w.hVisRgn,
+ tempRgn, exclude ? RGN_DIFF : RGN_AND);
DeleteObject( tempRgn );
- if (*hrgn) DeleteObject( *hrgn );
- *hrgn = newRgn;
- CLIPPING_UpdateGCRegion( dc );
- return retval;
- Error:
- if (tempRgn) DeleteObject( tempRgn );
- if (newRgn) DeleteObject( newRgn );
- if (prevRgn)
+ if (ret != ERROR)
{
- DeleteObject( prevRgn );
- *hrgn = 0;
+ if (dc->w.hClipRgn) DeleteObject( dc->w.hClipRgn );
+ dc->w.hClipRgn = newRgn;
+ CLIPPING_UpdateGCRegion( dc );
}
- return ERROR;
+ else DeleteObject( newRgn );
+ return ret;
}
@@ -237,8 +202,7 @@
dprintf_clipping(stddeb, "ExcludeClipRect: %d %dx%d,%dx%d\n",
hdc, left, top, right, bottom );
- return CLIPPING_IntersectRect( dc, &dc->w.hClipRgn, left, top,
- right, bottom, 1 );
+ return CLIPPING_IntersectClipRect( dc, left, top, right, bottom, TRUE );
}
@@ -259,23 +223,55 @@
dprintf_clipping(stddeb, "IntersectClipRect: %d %dx%d,%dx%d\n",
hdc, left, top, right, bottom );
- return CLIPPING_IntersectRect( dc, &dc->w.hClipRgn, left, top,
- right, bottom, 0 );
+ return CLIPPING_IntersectClipRect( dc, left, top, right, bottom, FALSE );
+}
+
+
+/***********************************************************************
+ * CLIPPING_IntersectVisRect
+ *
+ * Helper function for {Intersect,Exclude}VisRect
+ */
+static int CLIPPING_IntersectVisRect( DC * dc, short left, short top,
+ short right, short bottom, BOOL exclude )
+{
+ HRGN tempRgn, newRgn;
+ int ret;
+
+ if (!(newRgn = CreateRectRgn( 0, 0, 0, 0 ))) return ERROR;
+ if (!(tempRgn = CreateRectRgn( left, top, right, bottom )))
+ {
+ DeleteObject( newRgn );
+ return ERROR;
+ }
+ ret = CombineRgn( newRgn, dc->w.hVisRgn, tempRgn,
+ exclude ? RGN_DIFF : RGN_AND);
+ DeleteObject( tempRgn );
+
+ if (ret != ERROR)
+ {
+ RGNOBJ *newObj = (RGNOBJ*)GDI_GetObjPtr( newRgn, REGION_MAGIC);
+ RGNOBJ *prevObj = (RGNOBJ*)GDI_GetObjPtr( dc->w.hVisRgn, REGION_MAGIC);
+ if (newObj && prevObj) newObj->header.hNext = prevObj->header.hNext;
+ DeleteObject( dc->w.hVisRgn );
+ dc->w.hVisRgn = newRgn;
+ CLIPPING_UpdateGCRegion( dc );
+ }
+ else DeleteObject( newRgn );
+ return ret;
}
/***********************************************************************
* ExcludeVisRect (GDI.73)
*/
-int ExcludeVisRect( HDC hdc, short left, short top,
- short right, short bottom )
+int ExcludeVisRect( HDC hdc, short left, short top, short right, short bottom )
{
DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
if (!dc) return ERROR;
dprintf_clipping(stddeb, "ExcludeVisRect: %d %dx%d,%dx%d\n",
hdc, left, top, right, bottom );
- return CLIPPING_IntersectRect( dc, &dc->w.hVisRgn, left, top,
- right, bottom, 1 );
+ return CLIPPING_IntersectVisRect( dc, left, top, right, bottom, TRUE );
}
@@ -283,14 +279,13 @@
* IntersectVisRect (GDI.98)
*/
int IntersectVisRect( HDC hdc, short left, short top,
- short right, short bottom )
+ short right, short bottom )
{
DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
if (!dc) return ERROR;
dprintf_clipping(stddeb, "IntersectVisRect: %d %dx%d,%dx%d\n",
hdc, left, top, right, bottom );
- return CLIPPING_IntersectRect( dc, &dc->w.hVisRgn, left, top,
- right, bottom, 0 );
+ return CLIPPING_IntersectVisRect( dc, left, top, right, bottom, FALSE );
}
@@ -334,15 +329,7 @@
DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
if (!dc) return ERROR;
dprintf_clipping(stddeb, "GetClipBox: %d %p\n", hdc, rect );
-
- if (dc->w.hGCClipRgn) return GetRgnBox( dc->w.hGCClipRgn, rect );
- else
- {
- rect->top = rect->left = 0;
- rect->right = dc->w.DCSizeX;
- rect->bottom = dc->w.DCSizeY;
- return SIMPLEREGION;
- }
+ return GetRgnBox( dc->w.hGCClipRgn, rect );
}
@@ -356,7 +343,11 @@
DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
if (!dc) return 0;
dprintf_clipping(stddeb, "SaveVisRgn: %d\n", hdc );
- if (!dc->w.hVisRgn) return 0;
+ if (!dc->w.hVisRgn)
+ {
+ fprintf( stderr, "SaveVisRgn: hVisRgn is zero. Please report this.\n" );
+ exit(1);
+ }
if (!(obj = (RGNOBJ *) GDI_GetObjPtr( dc->w.hVisRgn, REGION_MAGIC )))
return 0;
if (!(copy = CreateRectRgn( 0, 0, 0, 0 ))) return 0;
@@ -377,9 +368,8 @@
HRGN saved;
RGNOBJ *obj, *savedObj;
DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
- if (!dc) return ERROR;
+ if (!dc || !dc->w.hVisRgn) return ERROR;
dprintf_clipping(stddeb, "RestoreVisRgn: %d\n", hdc );
- if (!dc->w.hVisRgn) return ERROR;
if (!(obj = (RGNOBJ *) GDI_GetObjPtr( dc->w.hVisRgn, REGION_MAGIC )))
return ERROR;
if (!(saved = obj->header.hNext)) return ERROR;
diff --git a/objects/dc.c b/objects/dc.c
index 5365efb..a38906c 100644
--- a/objects/dc.c
+++ b/objects/dc.c
@@ -21,7 +21,7 @@
extern const WIN_DC_INFO DCVAL_defaultValues;
-extern void CLIPPING_SetDeviceClipping( DC * dc ); /* objects/clipping.c */
+extern void CLIPPING_UpdateGCRegion( DC * dc ); /* objects/clipping.c */
extern WORD COLOR_ToPhysical( DC *dc, COLORREF color );/* objects/color.c */
extern void COLOR_SetMapping( DC *dc, HANDLE, WORD ); /* objects/color.c */
@@ -110,7 +110,7 @@
SelectObject( hdc, dc->w.hFont );
XSetGraphicsExposures( display, dc->u.x.gc, False );
XSetSubwindowMode( display, dc->u.x.gc, IncludeInferiors );
- CLIPPING_SetDeviceClipping( dc );
+ CLIPPING_UpdateGCRegion( dc );
}
@@ -242,17 +242,14 @@
newdc->saveLevel = 0;
newdc->w.flags |= DC_SAVED;
+ newdc->w.hGCClipRgn = 0;
+ newdc->w.hVisRgn = CreateRectRgn( 0, 0, 0, 0 );
+ CombineRgn( newdc->w.hVisRgn, dc->w.hVisRgn, 0, RGN_COPY );
if (dc->w.hClipRgn)
{
newdc->w.hClipRgn = CreateRectRgn( 0, 0, 0, 0 );
CombineRgn( newdc->w.hClipRgn, dc->w.hClipRgn, 0, RGN_COPY );
}
- if (dc->w.hVisRgn)
- {
- newdc->w.hVisRgn = CreateRectRgn( 0, 0, 0, 0 );
- CombineRgn( newdc->w.hVisRgn, dc->w.hVisRgn, 0, RGN_COPY );
- }
- newdc->w.hGCClipRgn = 0;
COLOR_SetMapping( newdc, dc->u.x.pal.hMapping, dc->u.x.pal.mappingSize );
return handle;
}
@@ -264,26 +261,31 @@
void SetDCState( HDC hdc, HDC hdcs )
{
DC * dc, * dcs;
-
+ HRGN hVisRgn, hClipRgn, hGCClipRgn;
+
if (!(dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ))) return;
if (!(dcs = (DC *) GDI_GetObjPtr( hdcs, DC_MAGIC ))) return;
if (!dcs->w.flags & DC_SAVED) return;
dprintf_dc(stddeb, "SetDCState: %d %d\n", hdc, hdcs );
- if (dc->w.hClipRgn) DeleteObject( dc->w.hClipRgn );
- if (dc->w.hVisRgn) DeleteObject( dc->w.hVisRgn );
- if (dc->w.hGCClipRgn) DeleteObject( dc->w.hGCClipRgn );
+ /* Save the regions before overwriting everything */
+ hVisRgn = dc->w.hVisRgn;
+ hClipRgn = dc->w.hClipRgn;
+ hGCClipRgn = dc->w.hGCClipRgn;
memcpy( &dc->w, &dcs->w, sizeof(dc->w) );
memcpy( &dc->u.x.pen, &dcs->u.x.pen, sizeof(dc->u.x.pen) );
- dc->w.hClipRgn = dc->w.hVisRgn = dc->w.hGCClipRgn = 0;
dc->w.flags &= ~DC_SAVED;
+ /* Restore the regions */
+ dc->w.hVisRgn = hVisRgn;
+ dc->w.hClipRgn = hClipRgn;
+ dc->w.hGCClipRgn = hGCClipRgn;
+ CombineRgn( dc->w.hVisRgn, dcs->w.hVisRgn, 0, RGN_COPY );
+ SelectClipRgn( hdc, dcs->w.hClipRgn );
+
SelectObject( hdc, dcs->w.hBrush );
SelectObject( hdc, dcs->w.hFont );
COLOR_SetMapping( dc, dcs->u.x.pal.hMapping, dcs->u.x.pal.mappingSize );
-
- SelectClipRgn( hdc, dcs->w.hClipRgn );
- SelectVisRgn( hdc, dcs->w.hVisRgn );
}
@@ -374,8 +376,13 @@
dc->w.flags = 0;
dc->w.devCaps = displayDevCaps;
dc->w.bitsPerPixel = displayDevCaps->bitsPixel;
- dc->w.DCSizeX = displayDevCaps->horzRes;
- dc->w.DCSizeY = displayDevCaps->vertRes;
+ dc->w.hVisRgn = CreateRectRgn( 0, 0, displayDevCaps->horzRes,
+ displayDevCaps->vertRes );
+ if (!dc->w.hVisRgn)
+ {
+ GDI_HEAP_FREE( handle );
+ return 0;
+ }
DC_InitDC( handle );
@@ -426,9 +433,15 @@
dc->w.flags = DC_MEMORY;
dc->w.bitsPerPixel = 1;
dc->w.devCaps = displayDevCaps;
- dc->w.DCSizeX = 1;
- dc->w.DCSizeY = 1;
dc->w.hBitmap = hbitmap;
+ dc->w.hVisRgn = CreateRectRgn( 0, 0, 1, 1 );
+
+ if (!dc->w.hVisRgn)
+ {
+ DeleteObject( hbitmap );
+ GDI_HEAP_FREE( handle );
+ return 0;
+ }
DC_InitDC( handle );
diff --git a/objects/dcvalues.c b/objects/dcvalues.c
index c1fafaf..2def05b 100644
--- a/objects/dcvalues.c
+++ b/objects/dcvalues.c
@@ -45,8 +45,6 @@
MM_TEXT, /* MapMode */
0, /* DCOrgX */
0, /* DCOrgY */
- 0, /* DCSizeX */
- 0, /* DCSizeY */
0, /* CursPosX */
0, /* CursPosY */
0, /* WndOrgX */
diff --git a/objects/font.c b/objects/font.c
index 1a28d6c..111984d 100644
--- a/objects/font.c
+++ b/objects/font.c
@@ -48,6 +48,47 @@
#define CI_GET_DEFAULT_INFO(fs,cs) \
CI_GET_CHAR_INFO(fs, fs->default_char, NULL, cs)
+struct FontStructure {
+ char *window;
+ char *x11;
+} FontNames[32];
+int FontSize;
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Font_Init
+ */
+
+void Font_Init( void )
+{
+ char temp[1024];
+ LPSTR ptr;
+ int i;
+
+ if( GetPrivateProfileString("fonts", NULL, "*", temp, sizeof(temp), WINE_INI) > 2 ) {
+ for( ptr = temp, i = 1; strlen(ptr) != 0; ptr += strlen(ptr) + 1, i++ )
+ if( strcmp( ptr, "default" ) )
+ FontNames[i].window = strdup( ptr );
+ FontSize = i;
+
+ for( i = 1; i < FontSize; i++ ) {
+ GetPrivateProfileString("fonts", FontNames[i].window, "*", temp, sizeof(temp), WINE_INI);
+ FontNames[i].x11 = strdup( temp );
+ }
+ GetPrivateProfileString("fonts", "default", "*", temp, sizeof(temp), WINE_INI);
+ if( *temp == '*' )
+ FontNames[0].x11 = strdup( temp );
+
+ } else {
+ FontNames[0].window = NULL; FontNames[0].x11 = "bitstream-courier";
+ FontNames[1].window = "ms sans serif"; FontNames[1].x11 = "*-helvetica";
+ FontNames[2].window = "ms serif"; FontNames[2].x11 = "*-times";
+ FontNames[3].window = "fixedsys"; FontNames[3].x11 = "*-fixed";
+ FontNames[4].window = "arial"; FontNames[4].x11 = "*-helvetica";
+ FontNames[5].window = "helv"; FontNames[5].x11 = "*-helvetica";
+ FontNames[6].window = "roman"; FontNames[6].x11 = "*-times";
+ FontSize = 7;
+ }
+}
/***********************************************************************
* FONT_TranslateName
@@ -57,26 +98,14 @@
*/
static const char *FONT_TranslateName( char *winFaceName )
{
- int i;
- static const char *mappings[] =
- {
- /*Windows name*/ /*X11 name*/
- "system", "helvetica",
- "ms sans serif", "helvetica",
- "ms serif", "times",
- "fixedsys", "fixed",
- "arial", "helvetica",
- "helv", "helvetica",
- "roman", "times"
- };
+ int i;
- for (i = 0; i < sizeof(mappings)/sizeof(mappings[0]); i += 2)
- if (!strcmp( winFaceName, mappings[i] ))
- {
- dprintf_font(stddeb, "---- Mapped %s to %s\n", winFaceName, mappings[i+1] );
- return mappings[i+1];
- }
- return winFaceName;
+ for (i = 1; i < FontSize; i ++)
+ if( !strcmp( winFaceName, FontNames[i].window ) ) {
+ dprintf_font(stddeb, "---- Mapped %s to %s\n", winFaceName, FontNames[i].x11 );
+ return FontNames[i].x11;
+ }
+ return FontNames[0].x11;
}
@@ -100,25 +129,37 @@
width = font->lfWidth * 10;
spacing = (font->lfPitchAndFamily & FIXED_PITCH) ? 'm' :
(font->lfPitchAndFamily & VARIABLE_PITCH) ? 'p' : '*';
- charset = (font->lfCharSet == ANSI_CHARSET) ? "iso8859-1" : "*";
+ charset = (font->lfCharSet == ANSI_CHARSET) ? "iso8859-1" : "*-*";
if (*font->lfFaceName) family = FONT_TranslateName( font->lfFaceName );
else switch(font->lfPitchAndFamily & 0xf0)
{
- case FF_ROMAN: family = "times"; break;
- case FF_SWISS: family = "helvetica"; break;
- case FF_MODERN: family = "courier"; break;
- case FF_SCRIPT: family = "*"; break;
- case FF_DECORATIVE: family = "*"; break;
- default: family = "*"; break;
+ case FF_ROMAN:
+ family = FONT_TranslateName( "roman" );
+ break;
+ case FF_SWISS:
+ family = FONT_TranslateName( "swiss" );
+ break;
+ case FF_MODERN:
+ family = FONT_TranslateName( "modern" );
+ break;
+ case FF_SCRIPT:
+ family = FONT_TranslateName( "script" );
+ break;
+ case FF_DECORATIVE:
+ family = FONT_TranslateName( "decorative" );
+ break;
+ default:
+ family = FontNames[0].x11;
+ break;
}
while (TRUE) {
/* Width==0 seems not to be a valid wildcard on SGI's, using * instead */
if ( width == 0 )
- sprintf( pattern, "-*-%s-%s-%c-normal-*-*-%d-*-*-%c-*-%s",
+ sprintf( pattern, "-%s-%s-%c-normal-*-*-%d-*-*-%c-*-%s",
family, weight, slant, height, spacing, charset);
else
- sprintf( pattern, "-*-%s-%s-%c-normal-*-*-%d-*-*-%c-%d-%s",
+ sprintf( pattern, "-%s-%s-%c-normal-*-*-%d-*-*-%c-%d-%s",
family, weight, slant, height, spacing, width, charset);
dprintf_font(stddeb, "FONT_MatchFont: '%s'\n", pattern );
names = XListFonts( display, pattern, 1, &count );
@@ -525,9 +566,9 @@
slant = 'r';
spacing = '*';
charset = "*";
- family = "*";
+ family = "*-*";
dprintf_font(stddeb,"InitFontsList !\n");
- sprintf( pattern, "-*-%s-%s-%c-normal-*-*-*-*-*-%c-*-%s",
+ sprintf( pattern, "-%s-%s-%c-normal-*-*-*-*-*-%c-*-%s",
family, weight, slant, spacing, charset);
names = XListFonts( display, pattern, MAX_FONTS, &count );
dprintf_font(stddeb,"InitFontsList // count=%d \n", count);
diff --git a/objects/metafile.c b/objects/metafile.c
index 83cf4c4..8715bf7 100644
--- a/objects/metafile.c
+++ b/objects/metafile.c
@@ -897,7 +897,7 @@
BOOL MF_BitBlt(DC *dcDest, short xDest, short yDest, short width,
short height, HDC hdcSrc, short xSrc, short ySrc, DWORD rop)
{
- dprintf_metafile(stdnimp,"MF_BitBlt: not implemented yet\n");
+ fprintf(stdnimp,"MF_BitBlt: not implemented yet\n");
}
@@ -908,5 +908,5 @@
short heightDest, HDC hdcSrc, short xSrc, short ySrc,
short widthSrc, short heightSrc, DWORD rop)
{
- dprintf_metafile(stdnimp,"MF_StretchBlt: not implemented yet\n");
+ fprintf(stdnimp,"MF_StretchBlt: not implemented yet\n");
}
diff --git a/objects/text.c b/objects/text.c
index 95b2eb7..e45973e 100644
--- a/objects/text.c
+++ b/objects/text.c
@@ -62,9 +62,9 @@
case LF:
if (!(format & DT_SINGLELINE))
{
- i++;
- if (str[i] == CR || str[i] == LF)
+ if (str[i] == CR && str[i+1] == LF)
i++;
+ i++;
*len = j;
return (&str[i]);
}
@@ -188,6 +188,7 @@
TEXTMETRIC tm;
int x = rect->left, y = rect->top;
int width = rect->right - rect->left;
+ int max_width = 0;
dprintf_text(stddeb,"DrawText: '%s', %d , [(%d,%d),(%d,%d)]\n", str, count,
rect->left, rect->top, rect->right, rect->bottom);
@@ -237,8 +238,12 @@
else if (flags & DT_BOTTOM) y = rect->bottom - size.cy;
}
if (!(flags & DT_CALCRECT))
+ {
if (!ExtTextOut( hdc, x, y, (flags & DT_NOCLIP) ? 0 : ETO_CLIPPED,
rect, line, len, NULL )) return 0;
+ }
+ else if (size.cx > max_width)
+ max_width = size.cx;
if (prefix_offset != -1)
{
@@ -250,9 +255,9 @@
DeleteObject( hpen );
}
+ y += lh;
if (strPtr)
{
- y += lh;
if (!(flags & DT_NOCLIP))
{
if (y > rect->bottom - lh)
@@ -261,7 +266,11 @@
}
}
while (strPtr);
- if (flags & DT_CALCRECT) rect->bottom = y;
+ if (flags & DT_CALCRECT)
+ {
+ rect->right = rect->left + max_width;
+ rect->bottom = y;
+ }
return 1;
}
diff --git a/rc/ChangeLog b/rc/ChangeLog
new file mode 100644
index 0000000..c08835f
--- /dev/null
+++ b/rc/ChangeLog
@@ -0,0 +1,5 @@
+----------------------------------------------------------------------
+Sun Sep 25 12:00:00 PDT 1994 <martin@osiris.cs.csufresno.edu>
+
+ * [rc/rc.y] [rc/rc.h] [rc/rc.l] [rc/winerc.c]
+ Files created
diff --git a/rc/Imakefile b/rc/Imakefile
new file mode 100644
index 0000000..74c7064
--- /dev/null
+++ b/rc/Imakefile
@@ -0,0 +1,44 @@
+#include "../Wine.tmpl"
+
+.SUFFIXES: .rc
+
+.rc.c:
+ echo "#include \"windows.h\"" >$*.rct
+ echo WINDOWS_H_ENDS_HERE >>$*.rct
+ cat $< >>$*.rct
+ gcc -E -x c $(CFLAGS) $*.rct | sed -e '1,/^WINDOWS_H_ENDS_HERE/d' | winerc -v -p $* >$@
+ $(RM) $*.rct
+
+AllTarget(sysres.c)
+
+sysres.c: winerc $(TOP)/include/windows.h
+
+includes::
+
+clean::
+ $(RM) sysres.c
+
+
+XCOMM Rules to build the winerc program
+
+SRCS = \
+ lex.yy.c \
+ rc.tab.c \
+ winerc.c
+
+OBJS = $(SRCS:.c=.o)
+
+depend:: rc.tab.c rc.tab.h lex.yy.c
+
+clean::
+ $(RM) lex.yy.c rc.tab* y.tab.c
+
+ComplexProgramTarget(winerc)
+
+rc.tab.c rc.tab.h: rc.y
+ $(YACC) -b rc -d --debug rc.y
+
+lex.yy.c: rc.l
+ $(LEX) -I rc.l
+
+
diff --git a/rc/README b/rc/README
new file mode 100644
index 0000000..d436c18
--- /dev/null
+++ b/rc/README
@@ -0,0 +1,38 @@
+This is winerc, the resource compiler for the Wine project. It takes the
+same input as rc.exe, but generates C files as output. These C files can
+be linked together with the application, which can access the resource
+data directly instead of using FindResource/LoadResource/LockResource.
+The generated C code contains arrays, which represent the resource as if
+it was obtained from LoadResource. A table to map resource names to
+pointers is also available.
+Primary applications are the resources of sysres.dll and a future
+commdlg.dll, but the use in the library version is possible as well.
+The expected advantage of using winerc over sysres.dll is a speed
+improvement, however, actual data to support that claim are not
+available. The use of winerc might also simplifies the source code. For
+example, the system menu is managed in the function CopySysMenu
+(controls/menu.c). A winerc-based implementation would just call
+ return LoadMenuIndirect(_Sysres_SYSMENU);
+As the resources are already in the Wine image, they are loaded on
+demand as any other part of a Unix executable image.
+
+Current State
+This is the first release of winerc. It is alpha software, as the rest
+of Wine is. If you use it for replacing sysres.dll, or if you write
+other parts of Wine which require resource (like commdlg), you will
+probably notice a loss in stability. This is especially true for cursor
+and icon resources, as they are unlikely to work at all. See the TODO
+file for details.
+
+Copying
+The license for Wine applies for winerc as well. Read the files LICENSE
+and WARRANTY in the current or any future distribution for details. You
+can change any source files, and you can add your own copyright notice,
+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.
diff --git a/rc/README.sysres b/rc/README.sysres
new file mode 100644
index 0000000..df59f95
--- /dev/null
+++ b/rc/README.sysres
@@ -0,0 +1,19 @@
+This release of winerc contains a resource script for sysres.dll,
+obtained by saving it as RC in Borland's Resource Workshop. Obsolete
+or duplicate resources where removed. If you find that I deleted to
+little or to much, drop me a note.
+You are encouraged to create sysres dumps using your favoured resource
+editor. If the output cannot be compiled, or the generated C code is
+different from mine, report this as a bug. When comparing the results,
+note that only the order might be different, which is not considered a
+bug.
+systest.c is a Windows program which shows how to use winerc generated
+resources. Compile it with your Windows compiler, and link it with
+sysres.c. It also shows how to prevent curious people from spying your
+bitmaps, dialogs, and menus :-)
+
+Deleted resources:
+Bitmap: OBMCLOSE
+Menu: 1, 0xF140+2
+Dialog: 0XF140+3, EXCLAMATION_MSGBOX, QUESTION_MSGBOX, STOP_MSGBOX
+Icon: SYSIDI_STOPICON
diff --git a/rc/TODO b/rc/TODO
new file mode 100644
index 0000000..c00d31e
--- /dev/null
+++ b/rc/TODO
@@ -0,0 +1,63 @@
+1. User interface
+- use GNU's long_getopt
+- allow to pass input and output files via command line
+- add options for various not-yet-implemented features (Unicode, Win32
+format, non-native/native alignment and endianness, compact output
+format)
+
+2. Input format
+- improve input file processing
+ Currently, certain pre- and postprocessing is required. winerc
+ should accept an arbitrary resource script and generate the C file
+ with as little intermediate files as possible. I'm not sure how to
+ handle the symbols from windows.h. There are certain options:
+ * winerc predefines the symbols via the cpp command line
+ * windows.h is #include'd, and the resulting C code is dropped
+ (Should winerc do C parsing here?)
+ * a stripped-down version of windows.h is included,
+ generated by "grep '^#' windows.h"
+ * windows.h #ifdef's every C code with _RC_INVOKED
+ (commercial solution)
+- complete input syntax
+ The goal here is to support every existing resource file which is
+ accepted by another resource compiler, not to put as much fancy
+ features into the compiler as possible. Every correct resource file
+ which generates a parse error can be reported as a bug, a problem
+ analysis and a fix would be appreciated.
+
+3. Output file format
+- add missing resources (fonts, versioninfo, stringtables,rcdata)
+- check style handling
+ The semantics of control and dialog styles is somewhat poorly
+ documented. For example, I couldn't find a reference that every
+ control has the WS_VISIBLE and WS_CHILD style, even if they are
+ not specified. What other styles are considered default?
+ The existance of default styles implies support for disabling these,
+ unlike any other proper programming language,
+ NOT WS_VISIBLE | WS_GROUP
+ does *not* mean ~WS_VISIBLE, but WS_CHILD|WS_GROUP (in C semantics).
+ What other strange semantics are there?
+- check cursor and icon handling
+ At the moment, the .CUR and .ICO files are copied byte-by-byte into
+ the C array. This is probably wrong, as there are things like cursor
+ and icon groups. In which way should they be present in a Wine image?
+ Should we have arrays for every cursor, as well as the cursor group?
+ Is one cursor per group enough, in the context of X? If so, do we
+ still need the group?
+- create a more compact output file
+ The current format is well-suited for debugging, as one can easily
+ match it with a resource' hex dump. A more compact format would use
+ strings instead of integer lists. A clever algorithm for embedding
+ values <32 and >127 is required.
+- platform independence
+ Currently, the lay-out of the resources is just as it is in Win3.1 -
+ packed structures, little endian. Although this format can be used
+ on any architecture, aligned data and native endianness would speed-up
+ the resource manipulation and simplify the code. OTOH, this would
+ break applications that rely on the lay-out. All this is of interest
+ for the library version only.
+- Win32 support
+
+4. Programming Style
+- memory management
+ No memory is freed in the current implementation.
diff --git a/rc/rc.h b/rc/rc.h
new file mode 100644
index 0000000..d080882
--- /dev/null
+++ b/rc/rc.h
@@ -0,0 +1,105 @@
+/*
+ *
+ * Copyright Martin von Loewis, 1994
+ *
+ */
+
+/* resource types */
+enum rt {acc,bmp,cur,dlg,fnt,ico,men,rdt,str};
+/* generic resource
+ Bytes can be inserted at arbitrary positions, the data field (res)
+ grows as required. As the dialog header contains the number of
+ controls, this number is generated in num_entries. If n_type if 0,
+ the resource name is i_name, and s_name otherwise. Top level
+ resources are linked via next. All gen_res objects are linked via
+ g_prev, g_next for debugging purposes. space is the length of res,
+ size is the used part of res.
+ As most bison rules are right recursive, new items are usually
+ inserted at the beginning
+*/
+typedef struct gen_res{
+ int size,space;
+ int num_entries;
+ enum rt type;
+ union{
+ int i_name;
+ char* s_name;
+ }n;
+ int n_type; /*0 - integer, 1 = string*/
+ struct gen_res *next;
+ struct gen_res *g_prev,*g_next;
+ unsigned char res[0];
+} gen_res;
+
+/* control/dialog style. or collects styles, and collects NOT styles */
+typedef struct rc_style{
+ int and, or;
+}rc_style;
+
+/* create a new resource */
+gen_res *new_res(void);
+/* double the space of the resource */
+gen_res* grow(gen_res*);
+/* insert byte array at the beginning, increase count */
+gen_res* insert_at_beginning(gen_res*,char*,int);
+/* insert byte array at offset */
+gen_res* insert_bytes(gen_res*,char*,int,int);
+/* delete bytes at offset */
+gen_res* delete_bytes(gen_res*,int,int);
+/* create a new style */
+rc_style* new_style(void);
+/* convert \t to tab etc. */
+char* parse_c_string(char*);
+/* get the resources type, convert dlg to "DIALOG" and so on */
+char* get_typename(gen_res*);
+
+gen_res* add_accelerator(int,int,int,gen_res*);
+gen_res* add_string_accelerator(char*,int,int,gen_res*);
+gen_res* add_ascii_accelerator(int,int,int,gen_res*);
+gen_res* add_vk_accelerator(int,int,int,gen_res*);
+
+gen_res* new_dialog(void);
+gen_res* dialog_style(rc_style*,gen_res*);
+int dialog_get_menu(gen_res*);
+int dialog_get_class(gen_res*);
+int dialog_get_caption(gen_res*);
+int dialog_get_fontsize(gen_res*);
+gen_res* dialog_caption(char*,gen_res*);
+gen_res* dialog_font(short,char*,gen_res*);
+gen_res* dialog_class(char*,gen_res*);
+gen_res* dialog_menu(char*,gen_res*);
+gen_res* create_control_desc(int,int,int,int,int,rc_style*);
+gen_res* label_control_desc(char*,gen_res*);
+gen_res* create_generic_control(char*,int,char*,rc_style*,int,int,int,int);
+gen_res* add_control(int,int,gen_res*,gen_res*);
+gen_res* add_icon(char*,int,int,int,gen_res*,gen_res*);
+gen_res* add_generic_control(gen_res*,gen_res*);
+gen_res* make_dialog(gen_res*,int,int,int,int,gen_res*);
+
+gen_res *hex_to_raw(char*,gen_res*);
+gen_res *make_bitmap(gen_res*);
+gen_res *make_icon(gen_res*);
+gen_res *make_cursor(gen_res*);
+gen_res *load_file(char*);
+
+gen_res *add_menuitem(char*,int,int,gen_res*);
+gen_res *add_popup(char*,short,gen_res*,gen_res*);
+gen_res *make_menu(gen_res*);
+
+gen_res *add_resource(gen_res*,gen_res*);
+
+void create_output(gen_res*);
+
+#define CT_BUTTON 0x80
+#define CT_EDIT 0x81
+#define CT_STATIC 0x82
+#define CT_LISTBOX 0x83
+#define CT_SCROLLBAR 0x84
+#define CT_COMBOBOX 0x85
+
+extern int verbose;
+
+#ifdef __sun__
+#define strtoul strtol
+#endif
+
diff --git a/rc/rc.l b/rc/rc.l
new file mode 100644
index 0000000..a09819f
--- /dev/null
+++ b/rc/rc.l
@@ -0,0 +1,76 @@
+%{
+/*
+ *
+ * Copyright Martin von Loewis, 1994
+ *
+ */
+
+static char Copyright[] = "Copyright Martin von Loewis, 1994";
+
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "rc.h"
+#include "rc.tab.h"
+%}
+%%
+ACCELERATORS return ACCELERATORS;
+ALT return ALT;
+ASCII return ASCII;
+BEGIN return tBEGIN;
+BITMAP return tBITMAP;
+CAPTION return CAPTION;
+CHECKBOX return CHECKBOX;
+CHECKED return CHECKED;
+CLASS return CLASS;
+COMBOBOX return COMBOBOX;
+CONTROL return CONTROL;
+CTEXT return CTEXT;
+CURSOR return CURSOR;
+DEFPUSHBUTTON return DEFPUSHBUTTON;
+DIALOG return DIALOG;
+DISCARDABLE return DISCARDABLE;
+EDITTEXT return EDITTEXT;
+END return tEND;
+FIXED return FIXED;
+FONT return FONT;
+GRAYED return GRAYED;
+GROUPBOX return GROUPBOX;
+HELP return HELP;
+ICON return ICON;
+INACTIVE return INACTIVE;
+LISTBOX return LISTBOX;
+LTEXT return LTEXT;
+MENU return MENU;
+MENUBARBREAK return MENUBARBREAK;
+MENUBREAK return MENUBREAK;
+MENUITEM return MENUITEM;
+MOVEABLE return MOVEABLE;
+LOADONCALL return LOADONCALL;
+NOINVERT return NOINVERT;
+NOT return NOT;
+NUMBER return NUMBER;
+POPUP return POPUP;
+PRELOAD return PRELOAD;
+PUSHBUTTON return PUSHBUTTON;
+PURE return PURE;
+RADIOBUTTON return RADIOBUTTON;
+RCDATA return RCDATA;
+RTEXT return RTEXT;
+SCROLLBAR return SCROLLBAR;
+SHIFT return SHIFT;
+SEPARATOR return SEPARATOR;
+STRING return STRING;
+STRINGTABLE return STRINGTABLE;
+STYLE return STYLE;
+VERSIONINFO return VERSIONINFO;
+VIRTKEY return VIRTKEY;
+\{ return tBEGIN;
+\} return tEND;
+[+-]?[0-9]+ yylval.num=atoi(yytext);return NUMBER;
+0x[0-9A-Fa-f]+L? yylval.num=strtoul(yytext,0,16);return NUMBER;
+[A-Za-z][A-Za-z_0-9]* yylval.str=strdup(yytext);return IDENT;
+\"[^"]*\" yylval.str=parse_c_string(yytext);return STRING;
+\'[^']*\' yylval.str=strdup(yytext+1);return SINGLE_QUOTED;
+[ \t\n\r] ;
+. return yytext[0];
diff --git a/rc/rc.y b/rc/rc.y
new file mode 100644
index 0000000..bfdaafc
--- /dev/null
+++ b/rc/rc.y
@@ -0,0 +1,211 @@
+%{
+/*
+ *
+ * Copyright Martin von Loewis, 1994
+ *
+ */
+
+static char Copyright[] = "Copyright Martin von Loewis, 1994";
+
+#include <stdio.h>
+#include "rc.h"
+#include "windows.h"
+%}
+%union{
+ gen_res *res;
+ char *str;
+ int num;
+ struct rc_style *style;
+}
+%token <num> NUMBER
+%token <str> STRING SINGLE_QUOTED IDENT
+%token ACCELERATORS ALT ASCII tBEGIN tBITMAP CAPTION CHECKBOX CHECKED
+%token CLASS COMBOBOX CONTROL CTEXT CURSOR DEFPUSHBUTTON DIALOG
+%token DISCARDABLE EDITTEXT tEND FIXED FONT GRAYED GROUPBOX HELP ICON
+%token IDENT INACTIVE LISTBOX LTEXT MENU MENUBARBREAK MENUBREAK MENUITEM
+%token MOVEABLE LOADONCALL NOINVERT NOT NOT_SUPPORTED POPUP PRELOAD
+%token PURE PUSHBUTTON RADIOBUTTON RCDATA RTEXT SCROLLBAR SHIFT SEPARATOR
+%token SINGLE_QUOTED STRING STRINGTABLE STYLE VERSIONINFO VIRTKEY
+%type <res> resource_file resource resources resource_definition accelerators
+%type <res> events bitmap cursor dialog dlg_attributes controls
+%type <res> generic_control labeled_control control_desc font icon
+%type <res> iconinfo menu menu_body item_definitions rcdata raw_data raw_elements
+%type <res> stringtable strings versioninfo
+%type <num> acc_options item_options
+%type <style> style optional_style
+%%
+
+resource_file: resources {create_output($1)}
+
+/*resources are put into a linked list*/
+resources: {$$=0;}
+ |resource resources {$$=add_resource($1,$2);}
+ ;
+
+/* get the name for a single resource*/
+resource: NUMBER resource_definition
+ {$$=$2;$$->n.i_name=$1;$$->n_type=0;
+ if(verbose)fprintf(stderr,"Got %s %d\n",get_typename($2),$1);
+ }
+ | IDENT resource_definition
+ {$$=$2;$$->n.s_name=$1;$$->n_type=1;
+ if(verbose)fprintf(stderr,"Got %s %s\n",get_typename($2),$1);
+ }
+
+/* get the value for a single resource*/
+resource_definition: accelerators {$$=$1;}
+ | bitmap {$$=$1;}
+ | cursor {$$=$1;}
+ | dialog {$$=$1;}
+ | font {$$=$1;}
+ | icon {$$=$1;}
+ | menu {$$=$1;}
+ | rcdata {$$=$1;}
+ | stringtable {$$=$1;}
+ | versioninfo {$$=$1;}
+
+/* have to use tBEGIN because BEGIN is predefined */
+accelerators: ACCELERATORS tBEGIN events tEND {$$=$3;$$->type=acc;}
+/* the events are collected in a gen_res, as the accelerator resource is just
+ an array of events */
+events: {$$=new_res();}
+ | STRING ',' NUMBER acc_options events
+ {$$=add_string_accelerator($1,$3,$4,$5);}
+ | NUMBER ',' NUMBER ',' ASCII acc_options events
+ {$$=add_ascii_accelerator($1,$3,$6,$7);}
+ | NUMBER ',' NUMBER ',' VIRTKEY acc_options events
+ {$$=add_vk_accelerator($1,$3,$6,$7);}
+acc_options: {$$=0;}
+ | ',' NOINVERT acc_options {$$=$3|2;}
+ | ',' ALT acc_options {$$=$3|16;}
+ | ',' SHIFT acc_options {$$=$3|4;}
+ | ',' CONTROL acc_options {$$=$3|8;}
+
+bitmap: tBITMAP load_and_memoption STRING {$$=make_bitmap(load_file($3));}
+ | tBITMAP load_and_memoption raw_data {$$=make_bitmap($3);}
+
+/* load and memory options are ignored */
+load_and_memoption: | lamo load_and_memoption
+lamo: PRELOAD | LOADONCALL | FIXED | MOVEABLE | DISCARDABLE | PURE
+
+cursor: CURSOR load_and_memoption STRING {$$=make_cursor(load_file($3));}
+ |CURSOR load_and_memoption raw_data {$$=make_cursor($3);}
+
+dialog: DIALOG load_and_memoption NUMBER ',' NUMBER ',' NUMBER ',' NUMBER
+ dlg_attributes
+ tBEGIN controls tEND
+ {$$=make_dialog($10,$3,$5,$7,$9,$12);}
+
+dlg_attributes: {$$=new_dialog();}
+ | STYLE style dlg_attributes
+ {$$=dialog_style($2,$3);}
+ | CAPTION STRING dlg_attributes
+ {$$=dialog_caption($2,$3);}
+ | FONT NUMBER ',' STRING dlg_attributes
+ {$$=dialog_font($2,$4,$5);}
+ | CLASS STRING dlg_attributes
+ {$$=dialog_class($2,$3);}
+ | MENU STRING dlg_attributes
+ {$$=dialog_menu($2,$3);}
+
+/* the controls are collected into a gen_res, and finally the dialog header
+ is put at the beginning */
+controls: {$$=new_res();}
+ | CHECKBOX labeled_control controls
+ {$$=add_control(CT_BUTTON, BS_CHECKBOX, $2, $3);}
+ | COMBOBOX control_desc controls
+ {$$=add_control(CT_COMBOBOX, 0, $2, $3);}
+ | CONTROL generic_control controls
+ {$$=add_generic_control($2, $3);}
+ | CTEXT labeled_control controls
+ {$$=add_control(CT_STATIC, SS_CENTER, $2, $3);}
+ | DEFPUSHBUTTON labeled_control controls
+ {$$=add_control(CT_BUTTON, BS_DEFPUSHBUTTON, $2, $3);}
+ | EDITTEXT control_desc controls
+ {$$=add_control(CT_EDIT, 0, $2, $3);}
+ | GROUPBOX labeled_control controls
+ {$$=add_control(CT_BUTTON, BS_GROUPBOX, $2, $3);}
+ /*special treatment for icons, as the extent is optional*/
+ | ICON STRING ',' NUMBER ',' NUMBER ',' NUMBER iconinfo controls
+ {$$=add_icon($2, $4, $6, $8, $9, $10);}
+ | LISTBOX control_desc controls
+ {$$=add_control(CT_LISTBOX, 0, $2, $3);}
+ | LTEXT labeled_control controls
+ {$$=add_control(CT_STATIC, SS_LEFT, $2, $3);}
+ | PUSHBUTTON labeled_control controls
+ {$$=add_control(CT_BUTTON, BS_PUSHBUTTON, $2, $3);}
+ | RADIOBUTTON labeled_control controls
+ {$$=add_control(CT_BUTTON, BS_RADIOBUTTON, $2, $3);}
+ | RTEXT labeled_control controls
+ {$$=add_control(CT_STATIC, SS_RIGHT, $2, $3);}
+ | SCROLLBAR control_desc controls
+ {$$=add_control(CT_SCROLLBAR, 0, $2, $3);}
+
+
+labeled_control: STRING ',' control_desc {$$=label_control_desc($1,$3);}
+control_desc: NUMBER ',' NUMBER ',' NUMBER ',' NUMBER ',' NUMBER optional_style
+ {$$=create_control_desc($1,$3,$5,$7,$9,$10);}
+
+optional_style: {$$=0;}|
+ ',' style {$$=$2;}
+
+iconinfo: /*set extent and style to 0 if they are not provided */
+ {$$=create_control_desc(0,0,0,0,0,0);}
+ /* x and y are overwritten later */
+ | ',' NUMBER ',' NUMBER optional_style
+ {$$=create_control_desc(0,0,0,$2,$4,$5);}
+
+generic_control: STRING ',' NUMBER ',' STRING ',' style ',' NUMBER
+ ',' NUMBER ',' NUMBER ',' NUMBER
+ {$$=create_generic_control($1,$3,$5,$7,$9,$11,$13,$15);}
+
+font: FONT load_and_memoption STRING {$$=make_font(load_file($3));}
+
+icon: ICON load_and_memoption STRING {$$=make_icon(load_file($3));}
+ | ICON load_and_memoption raw_data {$$=make_icon($3);}
+
+menu: MENU load_and_memoption menu_body {$$=make_menu($3);}
+/* menu items are collected in a gen_res and prefixed with the menu header*/
+menu_body: tBEGIN item_definitions tEND {$$=$2;}
+item_definitions: {$$=new_res();}
+ | MENUITEM STRING ',' NUMBER item_options item_definitions
+ {$$=add_menuitem($2,$4,$5,$6);}
+ | MENUITEM SEPARATOR item_definitions
+ {$$=add_menuitem("",0,0,$3);}
+ | POPUP STRING item_options menu_body item_definitions
+ {$$=add_popup($2,$3,$4,$5);}
+item_options: {$$=0;}
+ | ',' CHECKED item_options {$$=$3|MF_CHECKED;}
+ | ',' GRAYED item_options {$$=$3|MF_GRAYED;}
+ | ',' HELP item_options {$$=$3|MF_HELP;}
+ | ',' INACTIVE item_options {$$=$3|MF_DISABLED;}
+ | ',' MENUBARBREAK item_options {$$=$3|MF_MENUBARBREAK;}
+ | ',' MENUBREAK item_options {$$=$3|MF_MENUBREAK;}
+
+rcdata: RCDATA load_and_memoption raw_data {$$=make_raw($3);}
+
+raw_data: tBEGIN raw_elements tEND {$$=$2;}
+raw_elements: SINGLE_QUOTED {$$=hex_to_raw($1,new_res());}
+ | NUMBER {$$=int_to_raw($1,new_res());}
+ | SINGLE_QUOTED raw_elements {$$=hex_to_raw($1,$2);}
+ | NUMBER ',' raw_elements {$$=int_to_raw($1,$3);}
+
+stringtable: STRINGTABLE load_and_memoption tBEGIN strings tEND
+ {$$=$4;}
+strings: {$$=0;}|
+ NUMBER STRING strings {$$=0;}
+
+versioninfo: VERSIONINFO NOT_SUPPORTED {$$=0;}
+
+/* NOT x | NOT y | a | b means (a|b)& ~x & ~y
+ NOT is used to disable default styles */
+style: NUMBER {$$=new_style();$$->or=$1;}
+ | NOT NUMBER {$$=new_style();$$->and=~($2);}
+ | NUMBER '|' style {$$=$3;$$->or|=$1;}
+ | NOT NUMBER '|' style {$$=$4;$$->and&=~($2);}
+%%
+yyerror(char *s)
+{
+ puts(s);
+}
+
diff --git a/rc/sysres.rc b/rc/sysres.rc
new file mode 100644
index 0000000..508cb16
--- /dev/null
+++ b/rc/sysres.rc
@@ -0,0 +1,1626 @@
+
+32512 ICON
+{
+'00 00 01 00 01 00 20 20 10 00 00 00 00 00 E8 02'
+'00 00 16 00 00 00 28 00 00 00 20 00 00 00 40 00'
+'00 00 01 00 04 00 00 00 00 00 00 02 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 BF 00 00 BF 00 00 00 BF BF 00 BF 00'
+'00 00 BF 00 BF 00 BF BF 00 00 C0 C0 C0 00 80 80'
+'80 00 00 00 FF 00 00 FF 00 00 00 FF FF 00 FF 00'
+'00 00 FF 00 FF 00 FF FF 00 00 FF FF FF 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'77 77 77 77 77 77 77 77 77 77 77 70 00 00 00 00'
+'77 77 77 77 77 77 77 77 77 77 77 70 00 00 00 00'
+'77 77 77 77 77 77 77 77 77 77 77 70 00 00 00 00'
+'77 77 77 77 77 77 77 77 77 77 77 70 00 00 00 00'
+'77 77 77 77 77 77 77 77 77 77 77 70 00 00 00 00'
+'77 77 77 77 77 77 77 77 77 77 77 70 00 00 00 00'
+'77 77 77 77 77 77 77 77 77 77 77 70 00 00 00 00'
+'77 77 77 77 77 77 77 77 77 77 77 70 00 00 00 00'
+'77 77 77 77 77 77 77 77 77 77 77 70 00 00 00 00'
+'77 77 77 77 77 77 77 77 77 77 77 70 00 00 00 00'
+'77 77 77 77 77 77 77 77 77 77 77 70 00 00 00 00'
+'77 77 77 77 77 77 77 77 77 77 77 70 00 00 00 00'
+'77 77 77 77 77 77 77 77 77 77 77 70 00 00 00 00'
+'77 77 77 77 77 77 77 77 77 77 77 70 00 00 00 00'
+'77 77 77 77 77 77 77 77 77 77 77 70 00 00 00 00'
+'77 77 77 77 77 77 77 77 77 77 77 70 00 00 00 00'
+'77 77 77 77 77 77 77 77 77 77 77 70 00 00 00 00'
+'77 77 77 77 77 77 77 77 77 77 77 70 00 00 00 00'
+'77 77 77 77 77 77 77 77 77 77 77 70 00 00 00 00'
+'77 77 77 77 77 77 77 77 77 77 77 70 00 00 00 00'
+'77 77 77 77 77 77 77 77 77 77 77 70 00 00 00 00'
+'77 77 77 77 77 77 77 77 77 77 77 70 00 00 00 00'
+'77 77 77 77 77 77 77 77 77 77 77 70 00 00 00 00'
+'77 77 77 77 77 77 77 77 70 00 00 00 00 00 00 00'
+'77 77 77 77 77 77 77 77 70 88 88 00 00 00 00 00'
+'77 77 77 77 77 77 77 77 70 88 80 00 00 00 00 00'
+'77 77 77 77 77 77 77 77 70 88 00 00 00 00 00 00'
+'77 77 77 77 77 77 77 77 70 80 00 00 00 00 00 00'
+'77 77 77 77 77 77 77 77 70 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 F0 00'
+'00 07 E0 00 00 07 E0 00 00 07 E0 00 00 07 E0 00'
+'00 07 E0 00 00 07 E0 00 00 07 E0 00 00 07 E0 00'
+'00 07 E0 00 00 07 E0 00 00 07 E0 00 00 07 E0 00'
+'00 07 E0 00 00 07 E0 00 00 07 E0 00 00 07 E0 00'
+'00 07 E0 00 00 07 E0 00 00 07 E0 00 00 07 E0 00'
+'00 07 E0 00 00 07 E0 00 00 07 E0 00 00 07 E0 00'
+'00 07 E0 00 00 0F E0 00 00 1F E0 00 00 3F E0 00'
+'00 7F E0 00 00 FF E0 00 01 FF E0 00 03 FF'
+
+}
+
+
+32513 ICON
+{
+'00 00 01 00 01 00 20 20 10 00 00 00 00 00 E8 02'
+'00 00 16 00 00 00 28 00 00 00 20 00 00 00 40 00'
+'00 00 01 00 04 00 00 00 00 00 00 02 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 BF 00 00 BF 00 00 00 BF BF 00 BF 00'
+'00 00 BF 00 BF 00 BF BF 00 00 C0 C0 C0 00 80 80'
+'80 00 00 00 FF 00 00 FF 00 00 00 FF FF 00 FF 00'
+'00 00 FF 00 FF 00 FF FF 00 00 FF FF FF 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 88 88 88 88 88 88 88 80 00 00 00 00 00 00'
+'00 0F 88 88 88 88 88 88 88 88 00 00 00 00 00 00'
+'00 FF 99 99 99 99 99 99 99 98 80 00 00 00 00 00'
+'0F F9 99 99 99 99 99 99 99 99 88 00 00 00 00 00'
+'FF 99 99 99 99 99 99 99 99 99 98 80 00 00 00 0F'
+'F9 99 99 99 99 99 99 99 99 99 99 88 00 00 00 FF'
+'99 99 99 99 99 99 99 99 99 99 99 98 80 00 0F F9'
+'99 99 99 99 99 99 99 99 99 99 99 99 88 00 FF 99'
+'99 99 99 99 99 99 99 99 99 99 99 99 98 80 FF 99'
+'99 99 99 99 99 99 99 99 99 99 99 99 98 80 FF 99'
+'99 99 99 99 99 99 99 99 99 99 99 99 98 80 FF 99'
+'FF F9 99 9F 99 99 FF F9 99 F9 99 99 98 80 FF 99'
+'99 9F 99 9F 99 9F 99 9F 99 F9 99 99 98 80 FF 99'
+'99 9F 99 9F 99 9F 99 9F 99 F9 99 99 98 80 FF 99'
+'99 9F 99 9F 99 9F 99 9F 99 F9 99 99 98 80 FF 99'
+'9F F9 99 9F 99 9F 99 9F 99 FF FF 99 98 80 FF 99'
+'F9 99 99 9F 99 9F 99 9F 99 F9 99 F9 98 80 FF 99'
+'F9 99 99 9F 99 9F 99 9F 99 F9 99 F9 98 80 FF 99'
+'F9 99 99 9F 99 9F 99 9F 99 F9 99 F9 98 80 FF 99'
+'9F FF 9F FF FF 99 FF F9 99 FF FF 99 98 80 FF 99'
+'99 99 99 99 99 99 99 99 99 99 99 99 98 80 FF 99'
+'99 99 99 99 99 99 99 99 99 99 99 99 98 80 FF 99'
+'99 99 99 99 99 99 99 99 99 99 99 99 98 00 0F F9'
+'99 99 99 99 99 99 99 99 99 99 99 99 88 00 00 FF'
+'99 99 99 99 99 99 99 99 99 99 99 98 80 00 00 0F'
+'F9 99 99 99 99 99 99 99 99 99 99 88 00 00 00 00'
+'FF 99 99 99 99 99 99 99 99 99 98 80 00 00 00 00'
+'0F F9 99 99 99 99 99 99 99 99 88 00 00 00 00 00'
+'00 FF 99 99 99 99 99 99 99 98 80 00 00 00 00 00'
+'00 0F FF FF FF FF FF FF FF F8 00 00 00 00 00 00'
+'00 00 FF FF FF FF FF FF FF F0 00 00 00 00 FF FF'
+'FF FF FF 00 01 FF FE 00 00 FF FC 00 00 7F F8 00'
+'00 3F F0 00 00 1F E0 00 00 0F C0 00 00 07 80 00'
+'00 03 00 00 00 01 00 00 00 01 00 00 00 01 00 00'
+'00 01 00 00 00 01 00 00 00 01 00 00 00 01 00 00'
+'00 01 00 00 00 01 00 00 00 01 00 00 00 01 00 00'
+'00 01 00 00 00 01 00 00 00 01 00 00 00 03 80 00'
+'00 03 C0 00 00 07 E0 00 00 0F F0 00 00 1F F8 00'
+'00 3F FC 00 00 7F FE 00 00 FF FF 00 01 FF'
+
+}
+
+
+32514 ICON
+{
+'00 00 01 00 01 00 20 20 10 00 00 00 00 00 E8 02'
+'00 00 16 00 00 00 28 00 00 00 20 00 00 00 40 00'
+'00 00 01 00 04 00 00 00 00 00 00 02 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 BF 00 00 BF 00 00 00 BF BF 00 BF 00'
+'00 00 BF 00 BF 00 BF BF 00 00 C0 C0 C0 00 80 80'
+'80 00 00 00 FF 00 00 FF 00 00 00 FF FF 00 FF 00'
+'00 00 FF 00 FF 00 FF FF 00 00 FF FF FF 00 FF FF'
+'FF FF FF FF 00 00 00 00 FF FF FF FF FF FF FF FF'
+'FF FF F0 00 BB BB BB BB 00 0F FF FF FF FF FF FF'
+'FF F0 0B BB BB B8 8B BB BB B0 0F FF FF FF FF FF'
+'FF 0B BB BB B7 88 88 8B BB BB B0 FF FF FF FF FF'
+'F0 BB BB BB B7 11 11 8B BB BB BB 0F FF FF FF FF'
+'0B BB BB BB 77 11 11 88 BB BB BB B0 FF FF FF F0'
+'BB BB BB BB 77 11 11 88 BB BB BB BB 0F FF FF 0B'
+'BB BB BB BB B7 11 11 8B BB BB BB BB B0 FF FF 0B'
+'BB BB BB BB B7 77 77 8B BB BB BB BB B0 FF F0 BB'
+'BB BB BB BB BB B7 7B BB BB BB BB BB BB 0F F0 BB'
+'BB BB BB BB BB BB BB BB BB BB BB BB BB 0F F0 BB'
+'BB BB BB BB 78 88 88 88 BB BB BB BB BB 0F 0B BB'
+'BB BB BB BB 77 88 88 88 BB BB BB BB BB B0 0B BB'
+'BB BB BB BB 77 11 11 88 BB BB BB BB BB B0 0B BB'
+'BB BB BB BB 77 11 11 88 8B BB BB BB BB B0 0B BB'
+'BB BB BB BB B7 71 11 18 8B BB BB BB BB B0 0B BB'
+'BB BB BB BB B7 71 11 18 88 BB BB BB BB B0 0B BB'
+'BB BB BB BB B7 77 11 11 88 8B BB BB BB B0 0B BB'
+'BB BB BB BB BB 77 11 11 18 88 BB BB BB B0 0B BB'
+'BB BB BB BB BB 77 71 11 11 88 8B BB BB B0 F0 BB'
+'BB BB BB BB BB B7 77 71 11 18 88 BB BB 0F F0 BB'
+'BB B7 88 88 88 BB B7 77 11 11 88 BB BB 0F F0 BB'
+'BB B7 78 88 88 8B BB 77 11 11 88 BB BB 0F FF 0B'
+'BB B7 71 11 18 88 88 77 11 11 88 BB B0 FF FF 0B'
+'BB B7 77 11 11 88 88 71 11 18 88 BB B0 FF FF F0'
+'BB BB 77 71 11 11 11 11 11 88 8B BB 0F FF FF FF'
+'0B BB B7 77 11 11 11 11 88 88 BB B0 FF FF FF FF'
+'F0 BB BB 77 77 77 77 77 88 8B BB 0F FF FF FF FF'
+'FF 0B BB B7 77 77 77 77 7B BB B0 FF FF FF FF FF'
+'FF F0 0B BB BB BB BB BB BB B0 0F FF FF FF FF FF'
+'FF FF F0 00 BB BB BB BB 00 0F FF FF FF FF FF FF'
+'FF FF FF FF 00 00 00 00 FF FF FF FF FF FF 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+
+}
+
+
+32515 ICON
+{
+'00 00 01 00 01 00 20 20 10 00 00 00 00 00 E8 02'
+'00 00 16 00 00 00 28 00 00 00 20 00 00 00 40 00'
+'00 00 01 00 04 00 00 00 00 00 00 02 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 BF 00 00 BF 00 00 00 BF BF 00 BF 00'
+'00 00 BF 00 BF 00 BF BF 00 00 C0 C0 C0 00 80 80'
+'80 00 00 00 FF 00 00 FF 00 00 00 FF FF 00 FF 00'
+'00 00 FF 00 FF 00 FF FF 00 00 FF FF FF 00 FF FF'
+'FF FF FF FF 00 00 00 00 FF FF FF FF FF FF FF FF'
+'FF FF F0 00 BB BB BB BB 00 0F FF FF FF FF FF FF'
+'FF F0 0B BB BB B8 8B BB BB B0 0F FF FF FF FF FF'
+'FF 0B BB BB B7 88 88 8B BB BB B0 FF FF FF FF FF'
+'F0 BB BB BB B7 11 11 8B BB BB BB 0F FF FF FF FF'
+'0B BB BB BB 77 11 11 88 BB BB BB B0 FF FF FF F0'
+'BB BB BB BB 77 11 11 88 BB BB BB BB 0F FF FF 0B'
+'BB BB BB BB B7 11 11 8B BB BB BB BB B0 FF FF 0B'
+'BB BB BB BB B7 77 77 8B BB BB BB BB B0 FF F0 BB'
+'BB BB BB BB BB B7 7B BB BB BB BB BB BB 0F F0 BB'
+'BB BB BB BB BB BB BB BB BB BB BB BB BB 0F F0 BB'
+'BB BB BB BB 78 88 88 88 BB BB BB BB BB 0F 0B BB'
+'BB BB BB BB 77 88 88 88 BB BB BB BB BB B0 0B BB'
+'BB BB BB BB 77 11 11 88 BB BB BB BB BB B0 0B BB'
+'BB BB BB BB 77 11 11 88 BB BB BB BB BB B0 0B BB'
+'BB BB BB BB 77 11 11 88 BB BB BB BB BB B0 0B BB'
+'BB BB BB BB 77 11 11 88 BB BB BB BB BB B0 0B BB'
+'BB BB BB BB 77 11 11 88 BB BB BB BB BB B0 0B BB'
+'BB BB BB BB 77 11 11 88 BB BB BB BB BB B0 0B BB'
+'BB BB BB BB 77 11 11 88 BB BB BB BB BB B0 F0 BB'
+'BB BB BB BB 77 11 11 88 BB BB BB BB BB 0F F0 BB'
+'BB BB BB BB 77 11 11 88 BB BB BB BB BB 0F F0 BB'
+'BB BB BB BB 77 11 11 88 BB BB BB BB BB 0F FF 0B'
+'BB BB BB BB 77 11 11 88 BB BB BB BB B0 FF FF 0B'
+'BB BB BB BB 77 11 11 88 BB BB BB BB B0 FF FF F0'
+'BB BB BB BB 77 11 11 88 BB BB BB BB 0F FF FF FF'
+'0B BB BB BB 77 11 11 88 BB BB BB B0 FF FF FF FF'
+'F0 BB BB BB 77 77 77 88 BB BB BB 0F FF FF FF FF'
+'FF 0B BB BB 77 77 77 78 BB BB B0 FF FF FF FF FF'
+'FF F0 0B BB BB BB BB BB BB B0 0F FF FF FF FF FF'
+'FF FF F0 00 BB BB BB BB 00 0F FF FF FF FF FF FF'
+'FF FF FF FF 00 00 00 00 FF FF FF FF FF FF 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+
+}
+
+
+32516 ICON
+{
+'00 00 01 00 01 00 20 20 10 00 00 00 00 00 E8 02'
+'00 00 16 00 00 00 28 00 00 00 20 00 00 00 40 00'
+'00 00 01 00 04 00 00 00 00 00 00 02 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 BF 00 00 BF 00 00 00 BF BF 00 BF 00'
+'00 00 BF 00 BF 00 BF BF 00 00 C0 C0 C0 00 80 80'
+'80 00 00 00 FF 00 00 FF 00 00 00 FF FF 00 FF 00'
+'00 00 FF 00 FF 00 FF FF 00 00 FF FF FF 00 FF FF'
+'FF FF FF FF 00 00 00 00 FF FF FF FF FF FF FF FF'
+'FF FF F0 00 EE EE EE EE 00 0F FF FF FF FF FF FF'
+'FF F0 0E EE EE EE EE EE EE E0 0F FF FF FF FF FF'
+'FF 0E EE EE 78 88 88 88 EE EE E0 FF FF FF FF FF'
+'F0 EE EE EE 77 88 88 88 EE EE EE 0F FF FF FF FF'
+'0E EE EE EE 77 11 11 88 EE EE EE E0 FF FF FF F0'
+'EE EE EE EE 77 11 11 88 EE EE EE EE 0F FF FF 0E'
+'EE EE EE EE 77 11 11 88 EE EE EE EE E0 FF FF 0E'
+'EE EE EE EE 77 11 11 88 EE EE EE EE E0 FF F0 EE'
+'EE EE EE EE 77 11 11 88 EE EE EE EE EE 0F F0 EE'
+'EE EE EE EE 77 11 11 88 EE EE EE EE EE 0F F0 EE'
+'EE EE EE EE 77 11 11 88 EE EE EE EE EE 0F 0E EE'
+'EE EE EE EE 77 11 11 88 EE EE EE EE EE E0 0E EE'
+'EE EE EE EE 77 11 11 88 EE EE EE EE EE E0 0E EE'
+'EE EE EE EE 77 11 11 88 EE EE EE EE EE E0 0E EE'
+'EE EE EE EE 77 11 11 88 EE EE EE EE EE E0 0E EE'
+'EE EE EE EE 77 11 11 88 EE EE EE EE EE E0 0E EE'
+'EE EE EE EE 77 11 11 88 EE EE EE EE EE E0 0E EE'
+'EE EE EE EE 77 11 11 88 EE EE EE EE EE E0 0E EE'
+'EE EE EE EE 77 77 77 88 EE EE EE EE EE E0 F0 EE'
+'EE EE EE EE 77 77 77 78 EE EE EE EE EE 0F F0 EE'
+'EE EE EE EE EE EE EE EE EE EE EE EE EE 0F F0 EE'
+'EE EE EE EE EE E8 8E EE EE EE EE EE EE 0F FF 0E'
+'EE EE EE EE E7 88 88 8E EE EE EE EE E0 FF FF 0E'
+'EE EE EE EE E7 11 11 8E EE EE EE EE E0 FF FF F0'
+'EE EE EE EE 77 11 11 88 EE EE EE EE 0F FF FF FF'
+'0E EE EE EE 77 11 11 88 EE EE EE E0 FF FF FF FF'
+'F0 EE EE EE E7 11 11 8E EE EE EE 0F FF FF FF FF'
+'FF 0E EE EE E7 77 77 8E EE EE E0 FF FF FF FF FF'
+'FF F0 0E EE EE E7 7E EE EE E0 0F FF FF FF FF FF'
+'FF FF F0 00 EE EE EE EE 00 0F FF FF FF FF FF FF'
+'FF FF FF FF 00 00 00 00 FF FF FF FF FF FF 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+
+}
+
+
+SYSIDI_HANDHAND ICON
+{
+'00 00 01 00 01 00 20 20 10 00 00 00 00 00 E8 02'
+'00 00 16 00 00 00 28 00 00 00 20 00 00 00 40 00'
+'00 00 01 00 04 00 00 00 00 00 00 02 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 BF 00 00 BF 00 00 00 BF BF 00 BF 00'
+'00 00 BF 00 BF 00 BF BF 00 00 C0 C0 C0 00 80 80'
+'80 00 00 00 FF 00 00 FF 00 00 00 FF FF 00 FF 00'
+'00 00 FF 00 FF 00 FF FF 00 00 FF FF FF 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 FF FF FF FF F0 00 00 00 00 00 00 00 00'
+'00 00 00 FF FF FF FF F0 00 00 00 00 00 00 00 00'
+'00 00 00 FF FF FF FF F0 00 00 00 00 00 00 00 00'
+'00 00 0F FF FF FF FF FF 00 00 00 00 00 00 00 00'
+'00 00 FF FF FF FF FF FF F0 00 00 00 00 00 00 00'
+'00 00 FF FF FF FF FF FF FF 00 00 00 00 00 00 00'
+'00 0F FF FF FF FF FF FF FF F0 00 00 00 00 00 00'
+'00 FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00'
+'0F FF FF FF FF FF FF FF FF FF F0 00 00 00 00 00'
+'FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 0F'
+'FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 0F'
+'FF 00 FF FF FF FF FF FF FF FF FF F0 00 00 00 0F'
+'F0 00 0F FF FF FF FF FF FF FF FF F0 00 00 00 0F'
+'F0 00 0F FF FF FF FF FF FF F0 0F F0 00 00 00 0F'
+'F0 00 00 FF FF FF FF FF FF F0 00 F0 00 00 00 0F'
+'F0 00 00 FF FF FF FF FF FF F0 00 F0 00 00 00 0F'
+'F0 00 00 FF F0 0F FF FF 0F FF 00 00 00 00 00 00'
+'00 00 00 FF F0 00 FF F0 00 FF 00 00 00 00 00 00'
+'00 00 00 FF 00 00 0F F0 00 FF 00 00 00 00 00 00'
+'00 00 00 FF 00 00 0F F0 00 FF 00 00 00 00 00 00'
+'00 00 00 FF 00 00 0F F0 00 0F 00 00 00 00 00 00'
+'00 00 00 FF 00 00 0F F0 00 0F 00 00 00 00 00 00'
+'00 00 00 FF 00 00 0F F0 00 00 00 00 00 00 00 00'
+'00 00 00 FF 00 00 0F F0 00 00 00 00 00 00 00 00'
+'00 00 00 FF 00 00 0F F0 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF'
+'FF FF FF FF FF FF FF 00 07 FF FF 00 07 FF FF 00'
+'07 FF FE 00 03 FF FC 00 01 FF FC 00 00 FF F8 00'
+'00 FF F0 00 00 7F F0 00 00 3F E0 00 00 1F C0 00'
+'00 0F 80 00 00 0F 80 00 00 07 80 00 00 07 80 00'
+'00 07 82 00 00 07 83 00 00 07 83 00 00 07 83 00'
+'00 0F C7 00 00 3F FF 02 00 3F FF 02 00 3F FF 02'
+'00 3F FF 02 04 7F FF 02 04 FF FF 02 07 FF FF 06'
+'0F FF FF 8F 1F FF FF FF FF FF FF FF FF FF'
+
+}
+
+
+WINEICON ICON
+{
+'00 00 01 00 01 00 20 20 10 00 00 00 00 00 E8 02'
+'00 00 16 00 00 00 28 00 00 00 20 00 00 00 40 00'
+'00 00 01 00 04 00 00 00 00 00 00 02 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 80 00 00 80 00 00 00 80 80 00 80 00'
+'00 00 80 00 80 00 80 80 00 00 80 80 80 00 40 40'
+'40 00 00 00 FF 00 00 FF 00 00 00 FF FF 00 FF 00'
+'00 00 FF 00 FF 00 FF FF 00 00 FF FF FF 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 03 33 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 03 33 99 55 00 00 00 00 00 00 00 00'
+'00 00 00 00 33 39 99 95 30 00 00 00 00 00 00 00'
+'00 00 00 03 33 33 99 35 53 00 00 00 00 00 00 00'
+'00 00 00 33 33 33 33 33 55 30 00 00 00 00 00 00'
+'00 00 03 33 33 33 33 33 55 33 00 00 00 00 00 00'
+'00 00 33 33 33 33 33 33 35 53 30 00 00 00 00 00'
+'00 03 33 33 33 33 33 33 35 53 33 00 00 00 00 00'
+'00 33 3B BB BB BB BB BB BB 55 33 30 00 00 00 00'
+'00 00 33 BB BE BB BB BB EB B5 50 00 00 00 00 00'
+'00 00 E0 00 00 00 00 00 00 05 50 00 00 00 00 00'
+'00 00 00 00 E0 00 00 0E 00 00 55 00 00 00 00 00'
+'00 00 0E 00 00 00 0E 00 00 00 05 50 00 00 00 00'
+'00 0E 00 00 00 0E 00 00 00 0E 05 55 50 00 00 00'
+'00 00 00 E0 00 00 00 0E 00 00 55 55 00 00 00 00'
+'00 00 00 00 00 E0 00 00 00 00 00 55 00 00 00 00'
+'00 00 E0 0E 00 00 0E 00 0E 00 0E 05 50 00 FF E0'
+'03 FF FC 1F FC 1F FB FF FF EF FB FB EF EF FC 1D'
+'DC 1F FF E0 83 FF FF FE BF FF FF FE BF FF FF FE'
+'BF FF FF FE BF FF FF FE BF FF FF FE BF FF FF FE'
+'BF FF FF FE BF FF FF FE 3F FF FF F8 0F FF FF F0'
+'07 FF FF E0 03 FF FF C0 01 FF FF 80 00 FF FF 00'
+'00 7F FE 00 00 3F FC 00 00 1F F8 00 00 0F F7 00'
+'00 77 EE 00 00 3B C1 F7 EF 01 FE 00 00 1F FE FE'
+'FE 87 FF DF EF 0F FF FD FF CF FF 6F BB A7'
+
+}
+
+
+32514 CURSOR
+{
+'00 00 02 00 01 00 20 20 00 00 00 00 00 00 30 01'
+'00 00 16 00 00 00 28 00 00 00 20 00 00 00 40 00'
+'00 00 01 00 01 00 00 00 00 00 80 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 FF FF FF 00 00 00 00 00 00 00 00 00 3F FF'
+'F8 00 1F FF F0 00 0F FF E0 00 07 FF C0 00 03 FF'
+'80 00 01 FF 00 00 00 FE 00 00 00 7C 00 00 00 38'
+'00 00 00 10 00 00 00 10 00 00 00 10 00 00 00 10'
+'00 00 00 10 00 00 00 38 00 00 00 38 00 00 00 7C'
+'00 00 00 FE 00 00 01 FF 00 00 03 FF 80 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 01 FF 00 00 01 FF 80 00'
+'03 FF A0 00 0B FF B0 00 1B FF B8 00 3B FF BC 00'
+'7B FF 9E 00 F3 FF CF 01 E7 FF E7 83 CF FF F3 C7'
+'9F FF F9 EF 3F FF FC EE 7F FF FE 6C FF FF FF 6D'
+'FF FF FF 6D FF FF FF 45 FF FF FF 01 FF FF FE 00'
+'FF FF FC 00 7F FF F8 00 3F FF F0 00 1F FF E7 FF'
+'CF FF CF FF E7 FF 9F FF F3 FF BF FF FB FF BF FF'
+'FB FF BF FF FB FF BF FF FB FF BF FF FB FF 00 00'
+'01 FF 00 00 01 FF'
+
+}
+
+
+32648 CURSOR
+{
+'00 00 02 00 01 00 20 20 00 00 0A 00 09 00 30 01'
+'00 00 16 00 00 00 28 00 00 00 20 00 00 00 40 00'
+'00 00 01 00 01 00 00 00 00 00 80 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 FC 00 00 01 FE'
+'00 00 03 FF 00 00 07 FF 80 00 07 FF 80 00 07 FF'
+'80 00 07 FF 80 00 07 FF 80 00 03 FF 00 00 01 FE'
+'00 00 00 FC 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 FF FF FF FF FF FF FF FF FF FF'
+'FF FF FF FF FF FF FF FF FF EF FF FF FF E7 FF FF'
+'FF C3 FF FF FF 8F FF FF FF 1F FF FF FE 3F FF FF'
+'FC 7F FF FF F8 FF FF FF F1 FF FF FF E3 FF FF FF'
+'C7 FF FF 03 8F FF FC 00 1F FF F8 FC 3F FF F1 FE'
+'3F FF F3 FF 3F FF E7 FF 9F FF E7 FF 9F FF E7 FF'
+'9F FF E7 FF 9F FF E7 FF 9F FF F3 FF 3F FF F1 FE'
+'3F FF F8 FC 7F FF FC 00 FF FF FF 03 FF FF FF FF'
+'FF FF FF FF FF FF'
+
+}
+
+
+32734 BITMAP
+{
+'42 4D 4E 01 00 00 00 00 00 00 76 00 00 00 28 00'
+'00 00 12 00 00 00 12 00 00 00 01 00 04 00 00 00'
+'00 00 D8 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 BF 00 00 BF'
+'00 00 00 BF BF 00 BF 00 00 00 BF 00 BF 00 BF BF'
+'00 00 C0 C0 C0 00 80 80 80 00 00 00 FF 00 00 FF'
+'00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF'
+'00 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 08 88 88 88 88 88 88 88 80 00 00 00 0F 88'
+'88 88 88 88 88 88 80 00 00 00 0F 77 77 77 77 77'
+'77 78 80 00 00 00 0F 77 77 70 77 77 77 78 80 00'
+'00 00 0F 77 77 00 77 77 77 78 80 00 00 00 0F 77'
+'70 00 00 00 00 78 80 00 00 00 0F 77 00 00 00 00'
+'00 78 80 00 00 00 0F 70 00 00 00 00 07 78 80 00'
+'00 00 0F 70 00 00 00 00 07 78 80 00 00 00 0F 77'
+'00 00 00 00 00 78 80 00 00 00 0F 77 70 00 00 00'
+'00 78 80 00 00 00 0F 77 77 00 77 77 77 78 80 00'
+'00 00 0F 77 77 70 77 77 77 78 80 00 00 00 0F 77'
+'77 77 77 77 77 78 80 00 00 00 0F 77 77 77 77 77'
+'77 78 80 00 00 00 0F FF FF FF FF FF FF FF 80 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+
+}
+
+
+32735 BITMAP
+{
+'42 4D 4E 01 00 00 00 00 00 00 76 00 00 00 28 00'
+'00 00 12 00 00 00 12 00 00 00 01 00 04 00 00 00'
+'00 00 D8 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 BF 00 00 BF'
+'00 00 00 BF BF 00 BF 00 00 00 BF 00 BF 00 BF BF'
+'00 00 C0 C0 C0 00 80 80 80 00 00 00 FF 00 00 FF'
+'00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF'
+'00 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 08 88 88 88 88 88 88 88 80 00 00 00 0F 87'
+'77 77 77 77 77 78 80 00 00 00 0F 77 77 77 77 77'
+'77 78 80 00 00 00 0F 77 77 77 70 77 77 78 80 00'
+'00 00 0F 77 77 77 70 07 77 78 80 00 00 00 0F 77'
+'00 00 00 00 77 78 80 00 00 00 0F 77 00 00 00 00'
+'07 78 80 00 00 00 0F 77 70 00 00 00 00 78 80 00'
+'00 00 0F 77 70 00 00 00 00 78 80 00 00 00 0F 77'
+'00 00 00 00 07 78 80 00 00 00 0F 77 00 00 00 00'
+'77 78 80 00 00 00 0F 77 77 77 70 07 77 78 80 00'
+'00 00 0F 77 77 77 70 77 77 78 80 00 00 00 0F 77'
+'77 77 77 77 77 78 80 00 00 00 0F 77 77 77 77 77'
+'77 78 80 00 00 00 0F FF FF FF FF FF FF FF 80 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+
+}
+
+
+32736 BITMAP
+{
+'42 4D 4E 01 00 00 00 00 00 00 76 00 00 00 28 00'
+'00 00 12 00 00 00 12 00 00 00 01 00 04 00 00 00'
+'00 00 D8 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 BF 00 00 BF'
+'00 00 00 BF BF 00 BF 00 00 00 BF 00 BF 00 BF BF'
+'00 00 C0 C0 C0 00 80 80 80 00 00 00 FF 00 00 FF'
+'00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF'
+'00 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 08 88 88 88 88 88 88 88 80 00 00 00 0F 88'
+'88 88 88 88 88 88 80 00 00 00 0F 77 77 77 77 77'
+'77 78 80 00 00 00 0F 77 77 77 00 77 77 78 80 00'
+'00 00 0F 77 77 70 00 07 77 78 80 00 00 00 0F 77'
+'77 00 00 00 77 78 80 00 00 00 0F 77 70 00 00 00'
+'07 78 80 00 00 00 0F 77 00 00 00 00 00 78 80 00'
+'00 00 0F 77 77 00 00 00 77 78 80 00 00 00 0F 77'
+'77 00 00 00 77 78 80 00 00 00 0F 77 77 00 00 00'
+'77 78 80 00 00 00 0F 77 77 00 00 00 77 78 80 00'
+'00 00 0F 77 77 00 77 00 77 78 80 00 00 00 0F 77'
+'77 77 77 77 77 78 80 00 00 00 0F 77 77 77 77 77'
+'77 78 80 00 00 00 0F FF FF FF FF FF FF FF 80 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+
+}
+
+
+32737 BITMAP
+{
+'42 4D 4E 01 00 00 00 00 00 00 76 00 00 00 28 00'
+'00 00 12 00 00 00 12 00 00 00 01 00 04 00 00 00'
+'00 00 D8 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 BF 00 00 BF'
+'00 00 00 BF BF 00 BF 00 00 00 BF 00 BF 00 BF BF'
+'00 00 C0 C0 C0 00 80 80 80 00 00 00 FF 00 00 FF'
+'00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF'
+'00 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 08 88 88 88 88 88 88 88 80 00 00 00 0F 88'
+'88 88 88 88 88 88 80 00 00 00 0F 77 77 77 77 77'
+'77 78 80 00 00 00 0F 77 77 00 77 00 77 78 80 00'
+'00 00 0F 77 77 00 00 00 77 78 80 00 00 00 0F 77'
+'77 00 00 00 77 78 80 00 00 00 0F 77 77 00 00 00'
+'77 78 80 00 00 00 0F 77 77 00 00 00 77 78 80 00'
+'00 00 0F 77 00 00 00 00 00 78 80 00 00 00 0F 77'
+'70 00 00 00 07 78 80 00 00 00 0F 77 77 00 00 00'
+'77 78 80 00 00 00 0F 77 77 70 00 07 77 78 80 00'
+'00 00 0F 77 77 77 00 77 77 78 80 00 00 00 0F 77'
+'77 77 77 77 77 78 80 00 00 00 0F 77 77 77 77 77'
+'77 78 80 00 00 00 0F FF FF FF FF FF FF FF 80 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+
+}
+
+
+32738 BITMAP
+{
+'42 4D 4E 01 00 00 00 00 00 00 76 00 00 00 28 00'
+'00 00 12 00 00 00 12 00 00 00 01 00 04 00 00 00'
+'00 00 D8 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 BF 00 00 BF'
+'00 00 00 BF BF 00 BF 00 00 00 BF 00 BF 00 BF BF'
+'00 00 C0 C0 C0 00 80 80 80 00 00 00 FF 00 00 FF'
+'00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF'
+'00 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 08 88 88 88 88 88 88 88 80 00 00 00 0F 88'
+'88 88 88 88 88 88 80 00 00 00 0F 77 77 77 77 77'
+'77 78 80 00 00 00 0F 77 00 00 00 00 00 78 80 00'
+'00 00 0F 77 77 77 77 77 77 78 80 00 00 00 0F 77'
+'77 77 00 77 77 78 80 00 00 00 0F 77 77 70 00 07'
+'77 78 80 00 00 00 0F 77 77 00 CC 00 77 78 80 00'
+'00 00 0F 77 70 0C CC C0 07 78 80 00 00 00 0F 77'
+'00 0C CC C0 00 78 80 00 00 00 0F 77 77 0C CC C0'
+'77 78 80 00 00 00 0F 77 77 0C CC C0 77 78 80 00'
+'00 00 0F 77 77 00 00 00 77 78 80 00 00 00 0F 77'
+'77 00 77 00 77 78 80 00 00 00 0F 77 77 77 77 77'
+'77 78 80 00 00 00 0F FF FF FF FF FF FF FF 80 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+
+}
+
+
+32739 BITMAP
+{
+'42 4D 7E 00 00 00 00 00 00 00 3E 00 00 00 28 00'
+'00 00 10 00 00 00 10 00 00 00 01 00 01 00 00 00'
+'00 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 FF FF FF 00 FF FF'
+'4C 00 FF FF 40 00 FD FF 00 00 FC FF 7C 00 FC 7F'
+'00 00 FE 3F 40 00 FE 1F 94 03 FE 0F 01 10 FE 0F'
+'00 00 FE 1F FA 00 FE 3F 41 8A FC 7F E2 8D FC FF'
+'00 00 FD FF BE 00 FF FF 00 00 FF FF F4 00'
+
+}
+
+
+32740 BITMAP
+{
+'42 4D 4E 01 00 00 00 00 00 00 76 00 00 00 28 00'
+'00 00 12 00 00 00 12 00 00 00 01 00 04 00 00 00'
+'00 00 D8 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 BF 00 00 BF'
+'00 00 00 BF BF 00 BF 00 00 00 BF 00 BF 00 BF BF'
+'00 00 C0 C0 C0 00 80 80 80 00 00 00 FF 00 00 FF'
+'00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF'
+'00 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 0F FF FF FF FF FF FF FF F0 00 00 00 08 FF'
+'FF FF FF FF FF FF F0 00 00 00 08 77 77 77 77 77'
+'77 7F F0 00 00 00 08 77 77 70 77 77 77 7F F0 00'
+'00 00 08 77 77 00 77 77 77 7F F0 00 00 00 08 77'
+'70 00 00 00 00 7F F0 00 00 00 08 77 00 00 00 00'
+'00 7F F0 00 00 00 08 70 00 00 00 00 07 7F F0 00'
+'00 00 08 70 00 00 00 00 07 7F F0 00 00 00 08 77'
+'00 00 00 00 00 7F F0 00 00 00 08 77 70 00 00 00'
+'00 7F F0 00 00 00 08 77 77 00 77 77 77 7F F0 00'
+'00 00 08 77 77 70 77 77 77 7F F0 00 00 00 08 77'
+'77 77 77 77 77 7F F0 00 00 00 08 77 77 77 77 77'
+'77 7F F0 00 00 00 08 88 88 88 88 88 88 88 F0 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+
+}
+
+
+32741 BITMAP
+{
+'42 4D 4E 01 00 00 00 00 00 00 76 00 00 00 28 00'
+'00 00 12 00 00 00 12 00 00 00 01 00 04 00 00 00'
+'00 00 D8 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 BF 00 00 BF'
+'00 00 00 BF BF 00 BF 00 00 00 BF 00 BF 00 BF BF'
+'00 00 C0 C0 C0 00 80 80 80 00 00 00 FF 00 00 FF'
+'00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF'
+'00 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 0F FF FF FF FF FF FF FF F0 00 00 00 08 FF'
+'FF FF FF FF FF FF F0 00 00 00 08 77 77 77 77 77'
+'77 7F F0 00 00 00 08 77 77 77 70 77 77 7F F0 00'
+'00 00 08 77 77 77 70 07 77 7F F0 00 00 00 08 77'
+'00 00 00 00 77 7F F0 00 00 00 08 77 00 00 00 00'
+'07 7F F0 00 00 00 08 77 70 00 00 00 00 7F F0 00'
+'00 00 08 77 70 00 00 00 00 7F F0 00 00 00 08 77'
+'00 00 00 00 07 7F F0 00 00 00 08 77 00 00 00 00'
+'77 7F F0 00 00 00 08 77 77 77 70 07 77 7F F0 00'
+'00 00 08 77 77 77 70 77 77 7F F0 00 00 00 08 77'
+'77 77 77 77 77 7F F0 00 00 00 08 77 77 77 77 77'
+'77 7F F0 00 00 00 08 88 88 88 88 88 88 88 F0 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+
+}
+
+
+32742 BITMAP
+{
+'42 4D 4E 01 00 00 00 00 00 00 76 00 00 00 28 00'
+'00 00 12 00 00 00 12 00 00 00 01 00 04 00 00 00'
+'00 00 D8 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 BF 00 00 BF'
+'00 00 00 BF BF 00 BF 00 00 00 BF 00 BF 00 BF BF'
+'00 00 C0 C0 C0 00 80 80 80 00 00 00 FF 00 00 FF'
+'00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF'
+'00 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 0F FF FF FF FF FF FF FF F0 00 00 00 08 FF'
+'FF FF FF FF FF FF F0 00 00 00 08 77 77 77 77 77'
+'77 7F F0 00 00 00 08 77 77 77 00 77 77 7F F0 00'
+'00 00 08 77 77 70 00 07 77 7F F0 00 00 00 08 77'
+'77 00 00 00 77 7F F0 00 00 00 08 77 70 00 00 00'
+'07 7F F0 00 00 00 08 77 00 00 00 00 00 7F F0 00'
+'00 00 08 77 77 00 00 00 77 7F F0 00 00 00 08 77'
+'77 00 00 00 77 7F F0 00 00 00 08 77 77 00 00 00'
+'77 7F F0 00 00 00 08 77 77 00 00 00 77 7F F0 00'
+'00 00 08 77 77 00 77 00 77 7F F0 00 00 00 08 77'
+'77 77 77 77 77 7F F0 00 00 00 08 77 77 77 77 77'
+'77 7F F0 00 00 00 08 88 88 88 88 88 88 88 F0 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+
+}
+
+
+32743 BITMAP
+{
+'42 4D 4E 01 00 00 00 00 00 00 76 00 00 00 28 00'
+'00 00 12 00 00 00 12 00 00 00 01 00 04 00 00 00'
+'00 00 D8 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 BF 00 00 BF'
+'00 00 00 BF BF 00 BF 00 00 00 BF 00 BF 00 BF BF'
+'00 00 C0 C0 C0 00 80 80 80 00 00 00 FF 00 00 FF'
+'00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF'
+'00 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 0F FF FF FF FF FF FF FF F0 00 00 00 08 FF'
+'FF FF FF FF FF FF F0 00 00 00 08 77 77 77 77 77'
+'77 7F F0 00 00 00 08 77 77 00 77 00 77 7F F0 00'
+'00 00 08 77 77 00 00 00 77 7F F0 00 00 00 08 77'
+'77 00 00 00 77 7F F0 00 00 00 08 77 77 00 00 00'
+'77 7F F0 00 00 00 08 77 77 00 00 00 77 7F F0 00'
+'00 00 08 77 00 00 00 00 00 7F F0 00 00 00 08 77'
+'70 00 00 00 07 7F F0 00 00 00 08 77 77 00 00 00'
+'77 7F F0 00 00 00 08 77 77 70 00 07 77 7F F0 00'
+'00 00 08 77 77 77 00 77 77 7F F0 00 00 00 08 77'
+'77 77 77 77 77 7F F0 00 00 00 08 77 77 77 77 77'
+'77 7F F0 00 00 00 08 88 88 88 88 88 88 88 F0 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+
+}
+
+
+32744 BITMAP
+{
+'42 4D 66 01 00 00 00 00 00 00 76 00 00 00 28 00'
+'00 00 14 00 00 00 14 00 00 00 01 00 04 00 00 00'
+'00 00 F0 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 BF 00 00 BF'
+'00 00 00 BF BF 00 BF 00 00 00 BF 00 BF 00 BF BF'
+'00 00 C0 C0 C0 00 80 80 80 00 00 00 FF 00 00 FF'
+'00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF'
+'00 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 08 88 88 88 88 88 88 88 88 80 00 00 0F 88'
+'88 88 88 88 88 88 88 80 00 00 0F 77 77 77 77 77'
+'77 77 78 80 00 00 0F 77 77 77 77 77 77 77 78 80'
+'00 00 0F 77 77 77 70 07 77 77 78 80 00 00 0F 77'
+'77 77 00 00 77 77 78 80 00 00 0F 77 77 70 08 80'
+'07 77 78 80 00 00 0F 77 77 00 88 88 00 77 78 80'
+'00 00 0F 77 70 00 00 00 00 07 78 80 00 00 0F 77'
+'77 77 77 77 77 77 78 80 00 00 0F 77 70 00 00 00'
+'00 07 78 80 00 00 0F 77 77 00 88 88 00 77 78 80'
+'00 00 0F 77 77 70 08 80 07 77 78 80 00 00 0F 77'
+'77 77 00 00 77 77 78 80 00 00 0F 77 77 77 70 07'
+'77 77 78 80 00 00 0F 77 77 77 77 77 77 77 78 80'
+'00 00 0F 77 77 77 77 77 77 77 78 80 00 00 0F FF'
+'FF FF FF FF FF FF FF 80 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00'
+
+}
+
+
+32745 BITMAP
+{
+'42 4D 66 01 00 00 00 00 00 00 76 00 00 00 28 00'
+'00 00 14 00 00 00 14 00 00 00 01 00 04 00 00 00'
+'00 00 F0 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 BF 00 00 BF'
+'00 00 00 BF BF 00 BF 00 00 00 BF 00 BF 00 BF BF'
+'00 00 C0 C0 C0 00 80 80 80 00 00 00 FF 00 00 FF'
+'00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF'
+'00 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 0F FF FF FF FF FF FF FF FF F0 00 00 08 FF'
+'FF FF FF FF FF FF FF F0 00 00 08 77 77 77 77 77'
+'77 77 7F F0 00 00 08 77 77 77 77 77 77 77 7F F0'
+'00 00 08 77 77 77 77 77 77 77 7F F0 00 00 08 77'
+'77 77 77 77 77 77 7F F0 00 00 08 77 77 77 77 77'
+'77 77 7F F0 00 00 08 77 70 00 00 00 00 07 7F F0'
+'00 00 08 77 77 00 00 00 00 77 7F F0 00 00 08 77'
+'77 70 00 00 07 77 7F F0 00 00 08 77 77 77 00 00'
+'77 77 7F F0 00 00 08 77 77 77 70 07 77 77 7F F0'
+'00 00 08 77 77 77 77 77 77 77 7F F0 00 00 08 77'
+'77 77 77 77 77 77 7F F0 00 00 08 77 77 77 77 77'
+'77 77 7F F0 00 00 08 77 77 77 77 77 77 77 7F F0'
+'00 00 08 77 77 77 77 77 77 77 7F F0 00 00 08 88'
+'88 88 88 88 88 88 88 F0 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00'
+
+}
+
+
+32746 BITMAP
+{
+'42 4D 66 01 00 00 00 00 00 00 76 00 00 00 28 00'
+'00 00 14 00 00 00 14 00 00 00 01 00 04 00 00 00'
+'00 00 F0 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 BF 00 00 BF'
+'00 00 00 BF BF 00 BF 00 00 00 BF 00 BF 00 BF BF'
+'00 00 C0 C0 C0 00 80 80 80 00 00 00 FF 00 00 FF'
+'00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF'
+'00 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 08 FF FF FF FF FF FF FF FF F0 00 00 08 FF'
+'FF FF FF FF FF FF FF F0 00 00 08 77 77 77 77 77'
+'77 77 7F F0 00 00 08 77 77 77 77 77 77 77 7F F0'
+'00 00 08 77 77 77 70 07 77 77 7F F0 00 00 08 77'
+'77 77 00 00 77 77 7F F0 00 00 08 77 77 70 08 80'
+'07 77 7F F0 00 00 08 77 77 00 88 88 00 77 7F F0'
+'00 00 08 77 70 00 88 88 00 07 7F F0 00 00 08 77'
+'77 70 88 88 07 77 7F F0 00 00 08 77 77 70 88 88'
+'07 77 7F F0 00 00 08 77 77 70 88 88 07 77 7F F0'
+'00 00 08 77 77 70 00 00 07 77 7F F0 00 00 08 77'
+'77 70 07 70 07 77 7F F0 00 00 08 77 77 77 77 77'
+'77 77 7F F0 00 00 08 77 77 77 77 77 77 77 7F F0'
+'00 00 08 77 77 77 77 77 77 77 7F F0 00 00 08 88'
+'88 88 88 88 88 88 88 80 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00'
+
+}
+
+
+32747 BITMAP
+{
+'42 4D 66 01 00 00 00 00 00 00 76 00 00 00 28 00'
+'00 00 14 00 00 00 14 00 00 00 01 00 04 00 00 00'
+'00 00 F0 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 BF 00 00 BF'
+'00 00 00 BF BF 00 BF 00 00 00 BF 00 BF 00 BF BF'
+'00 00 C0 C0 C0 00 80 80 80 00 00 00 FF 00 00 FF'
+'00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF'
+'00 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 08 88 88 88 88 88 88 88 88 80 00 00 0F 88'
+'88 88 88 88 88 88 88 80 00 00 0F 77 77 77 77 77'
+'77 77 78 80 00 00 0F 77 77 77 77 77 77 77 78 80'
+'00 00 0F 77 77 77 70 07 77 77 78 80 00 00 0F 77'
+'77 77 00 00 77 77 78 80 00 00 0F 77 77 70 08 80'
+'07 77 78 80 00 00 0F 77 77 00 88 88 00 77 78 80'
+'00 00 0F 77 70 00 00 00 00 07 78 80 00 00 0F 77'
+'77 77 77 77 77 77 78 80 00 00 0F 77 70 00 00 00'
+'00 07 78 80 00 00 0F 77 77 00 88 88 00 77 78 80'
+'00 00 0F 77 77 70 08 80 07 77 78 80 00 00 0F 77'
+'77 77 00 00 77 77 78 80 00 00 0F 77 77 77 70 07'
+'77 77 78 80 00 00 0F 77 77 77 77 77 77 77 78 80'
+'00 00 0F 77 77 77 77 77 77 77 78 80 00 00 0F FF'
+'FF FF FF FF FF FF FF 80 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00'
+
+}
+
+
+32748 BITMAP
+{
+'42 4D 66 01 00 00 00 00 00 00 76 00 00 00 28 00'
+'00 00 14 00 00 00 14 00 00 00 01 00 04 00 00 00'
+'00 00 F0 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 BF 00 00 BF'
+'00 00 00 BF BF 00 BF 00 00 00 BF 00 BF 00 BF BF'
+'00 00 C0 C0 C0 00 80 80 80 00 00 00 FF 00 00 FF'
+'00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF'
+'00 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 08 88 88 88 88 88 88 88 88 80 00 00 0F 88'
+'88 88 88 88 88 88 88 80 00 00 0F 77 77 77 77 77'
+'77 77 78 80 00 00 0F 77 77 77 77 77 77 77 78 80'
+'00 00 0F 77 77 77 77 77 77 77 78 80 00 00 0F 77'
+'77 77 77 77 77 77 78 80 00 00 0F 77 77 77 77 77'
+'77 77 78 80 00 00 0F 77 70 00 00 00 00 07 78 80'
+'00 00 0F 77 77 00 00 00 00 77 78 80 00 00 0F 77'
+'77 70 00 00 07 77 78 80 00 00 0F 77 77 77 00 00'
+'77 77 78 80 00 00 0F 77 77 77 70 07 77 77 78 80'
+'00 00 0F 77 77 77 77 77 77 77 78 80 00 00 0F 77'
+'77 77 77 77 77 77 78 80 00 00 0F 77 77 77 77 77'
+'77 77 78 80 00 00 0F 77 77 77 77 77 77 77 78 80'
+'00 00 0F 77 77 77 77 77 77 77 78 80 00 00 0F FF'
+'FF FF FF FF FF FF FF 80 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00'
+
+}
+
+
+32749 BITMAP
+{
+'42 4D 66 01 00 00 00 00 00 00 76 00 00 00 28 00'
+'00 00 14 00 00 00 14 00 00 00 01 00 04 00 00 00'
+'00 00 F0 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 BF 00 00 BF'
+'00 00 00 BF BF 00 BF 00 00 00 BF 00 BF 00 BF BF'
+'00 00 C0 C0 C0 00 80 80 80 00 00 00 FF 00 00 FF'
+'00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF'
+'00 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 08 88 88 88 88 88 88 88 88 80 00 00 0F 88'
+'88 88 88 88 88 88 88 80 00 00 0F 77 77 77 77 77'
+'77 77 78 80 00 00 0F 77 77 77 77 77 77 77 78 80'
+'00 00 0F 77 77 77 70 07 77 77 78 80 00 00 0F 77'
+'77 77 00 00 77 77 78 80 00 00 0F 77 77 70 08 80'
+'07 77 78 80 00 00 0F 77 77 00 88 88 00 77 78 80'
+'00 00 0F 77 70 00 88 88 00 07 78 80 00 00 0F 77'
+'77 70 88 88 07 77 78 80 00 00 0F 77 77 70 88 88'
+'07 77 78 80 00 00 0F 77 77 70 88 88 07 77 78 80'
+'00 00 0F 77 77 70 00 00 07 77 78 80 00 00 0F 77'
+'77 70 07 70 07 77 78 80 00 00 0F 77 77 77 77 77'
+'77 77 78 80 00 00 0F 77 77 77 77 77 77 77 78 80'
+'00 00 0F 77 77 77 77 77 77 77 78 80 00 00 0F FF'
+'FF FF FF FF FF FF FF 80 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00'
+
+}
+
+
+32750 BITMAP
+{
+'42 4D 4E 01 00 00 00 00 00 00 76 00 00 00 28 00'
+'00 00 12 00 00 00 12 00 00 00 01 00 04 00 00 00'
+'00 00 D8 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 BF 00 00 BF'
+'00 00 00 BF BF 00 BF 00 00 00 BF 00 BF 00 BF BF'
+'00 00 C0 C0 C0 00 80 80 80 00 00 00 FF 00 00 FF'
+'00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF'
+'00 00 FF FF FF 00 FF FF FF FF FF FF FF FF FF 00'
+'00 00 FF FF FF FF FF FF FF FF FF 00 00 00 FF FF'
+'FF FF FF FF FF FF FF 00 00 00 FF FF FF FF FF FF'
+'FF FF FF 00 00 00 FF FF FF F0 FF FF FF FF FF 00'
+'00 00 FF FF FF 00 FF FF FF FF FF 00 00 00 FF FF'
+'F0 00 00 00 00 FF FF 00 00 00 FF FF 00 00 00 00'
+'00 FF FF 00 00 00 FF F0 00 00 00 00 0F FF FF 00'
+'00 00 FF F0 00 00 00 00 0F FF FF 00 00 00 FF FF'
+'00 00 00 00 00 FF FF 00 00 00 FF FF F0 00 00 00'
+'00 FF FF 00 00 00 FF FF FF 00 FF FF FF FF FF 00'
+'00 00 FF FF FF F0 FF FF FF FF FF 00 00 00 FF FF'
+'FF FF FF FF FF FF FF 00 00 00 FF FF FF FF FF FF'
+'FF FF FF 00 00 00 FF FF FF FF FF FF FF FF FF 00'
+'00 00 FF FF FF FF FF FF FF FF FF 00 00 00'
+
+}
+
+
+32751 BITMAP
+{
+'42 4D 4E 01 00 00 00 00 00 00 76 00 00 00 28 00'
+'00 00 12 00 00 00 12 00 00 00 01 00 04 00 00 00'
+'00 00 D8 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 BF 00 00 BF'
+'00 00 00 BF BF 00 BF 00 00 00 BF 00 BF 00 BF BF'
+'00 00 C0 C0 C0 00 80 80 80 00 00 00 FF 00 00 FF'
+'00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF'
+'00 00 FF FF FF 00 FF FF FF FF FF FF FF FF FF 00'
+'00 00 FF FF FF FF FF FF FF FF FF 00 00 00 FF FF'
+'FF FF FF FF FF FF FF 00 00 00 FF FF FF FF FF FF'
+'FF FF FF 00 00 00 FF FF FF FF F0 FF FF FF FF 00'
+'00 00 FF FF FF FF F0 0F FF FF FF 00 00 00 FF FF'
+'00 00 00 00 FF FF FF 00 00 00 FF FF 00 00 00 00'
+'0F FF FF 00 00 00 FF FF F0 00 00 00 00 FF FF 00'
+'00 00 FF FF F0 00 00 00 00 FF FF 00 00 00 FF FF'
+'00 00 00 00 0F FF FF 00 00 00 FF FF 00 00 00 00'
+'FF FF FF 00 00 00 FF FF FF FF F0 0F FF FF FF 00'
+'00 00 FF FF FF FF F0 FF FF FF FF 00 00 00 FF FF'
+'FF FF FF FF FF FF FF 00 00 00 FF FF FF FF FF FF'
+'FF FF FF 00 00 00 FF FF FF FF FF FF FF FF FF 00'
+'00 00 FF FF FF FF FF FF FF FF FF 00 00 00'
+
+}
+
+
+32752 BITMAP
+{
+'42 4D 4E 01 00 00 00 00 00 00 76 00 00 00 28 00'
+'00 00 12 00 00 00 12 00 00 00 01 00 04 00 00 00'
+'00 00 D8 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 BF 00 00 BF'
+'00 00 00 BF BF 00 BF 00 00 00 BF 00 BF 00 BF BF'
+'00 00 C0 C0 C0 00 80 80 80 00 00 00 FF 00 00 FF'
+'00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF'
+'00 00 FF FF FF 00 FF FF FF FF FF FF FF FF FF 00'
+'00 00 FF FF FF FF FF FF FF FF FF 00 00 00 FF FF'
+'FF FF FF FF FF FF FF 00 00 00 FF FF FF FF FF FF'
+'FF FF FF 00 00 00 FF FF FF FF 00 FF FF FF FF 00'
+'00 00 FF FF FF F0 00 0F FF FF FF 00 00 00 FF FF'
+'FF 00 00 00 FF FF FF 00 00 00 FF FF F0 00 00 00'
+'0F FF FF 00 00 00 FF FF 00 00 00 00 00 FF FF 00'
+'00 00 FF FF FF 00 00 00 FF FF FF 00 00 00 FF FF'
+'FF 00 00 00 FF FF FF 00 00 00 FF FF FF 00 00 00'
+'FF FF FF 00 00 00 FF FF FF 00 00 00 FF FF FF 00'
+'00 00 FF FF FF 00 FF 00 FF FF FF 00 00 00 FF FF'
+'FF FF FF FF FF FF FF 00 00 00 FF FF FF FF FF FF'
+'FF FF FF 00 00 00 FF FF FF FF FF FF FF FF FF 00'
+'00 00 FF FF FF FF FF FF FF FF FF 00 00 00'
+
+}
+
+
+32753 BITMAP
+{
+'42 4D 4E 01 00 00 00 00 00 00 76 00 00 00 28 00'
+'00 00 12 00 00 00 12 00 00 00 01 00 04 00 00 00'
+'00 00 D8 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 BF 00 00 BF'
+'00 00 00 BF BF 00 BF 00 00 00 BF 00 BF 00 BF BF'
+'00 00 C0 C0 C0 00 80 80 80 00 00 00 FF 00 00 FF'
+'00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF'
+'00 00 FF FF FF 00 FF FF FF FF FF FF FF FF FF 00'
+'00 00 FF FF FF FF FF FF FF FF FF 00 00 00 FF FF'
+'FF FF FF FF FF FF FF 00 00 00 FF FF FF FF FF FF'
+'FF FF FF 00 00 00 FF FF FF 00 FF 00 FF FF FF 00'
+'00 00 FF FF FF 00 00 00 FF FF FF 00 00 00 FF FF'
+'FF 00 00 00 FF FF FF 00 00 00 FF FF FF 00 00 00'
+'FF FF FF 00 00 00 FF FF FF 00 00 00 FF FF FF 00'
+'00 00 FF FF 00 00 00 00 00 FF FF 00 00 00 FF FF'
+'F0 00 00 00 0F FF FF 00 00 00 FF FF FF 00 00 00'
+'FF FF FF 00 00 00 FF FF FF F0 00 0F FF FF FF 00'
+'00 00 FF FF FF FF 00 FF FF FF FF 00 00 00 FF FF'
+'FF FF FF FF FF FF FF 00 00 00 FF FF FF FF FF FF'
+'FF FF FF 00 00 00 FF FF FF FF FF FF FF FF FF 00'
+'00 00 FF FF FF FF FF FF FF FF FF 00 00 00'
+
+}
+
+
+32754 BITMAP
+{
+'42 4D 66 01 00 00 00 00 00 00 76 00 00 00 28 00'
+'00 00 14 00 00 00 14 00 00 00 01 00 04 00 00 00'
+'00 00 F0 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 BF 00 00 BF'
+'00 00 00 BF BF 00 BF 00 00 00 BF 00 BF 00 BF BF'
+'00 00 C0 C0 C0 00 80 80 80 00 00 00 FF 00 00 FF'
+'00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF'
+'00 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 08 88 88 88 88 88 88 88 88 80 00 00 0F 88'
+'88 88 88 88 88 88 88 80 00 00 0F 77 77 77 77 77'
+'77 77 78 80 00 00 0F 77 77 77 77 77 77 77 78 80'
+'00 00 0F 77 77 7F FF FF 77 77 78 80 00 00 0F 77'
+'77 FF FF FF F7 77 78 80 00 00 0F 77 7F F9 99 99'
+'FF 77 78 80 00 00 0F 77 88 99 99 99 9F F7 78 80'
+'00 00 0F 77 88 99 99 99 9F F7 78 80 00 00 0F 77'
+'88 99 99 99 9F F7 78 80 00 00 0F 77 88 99 99 99'
+'9F F7 78 80 00 00 0F 77 88 99 99 99 9F F7 78 80'
+'00 00 0F 77 78 89 99 99 FF 77 78 80 00 00 0F 77'
+'77 88 88 88 F7 77 78 80 00 00 0F 77 77 78 88 88'
+'77 77 78 80 00 00 0F 77 77 77 77 77 77 77 78 80'
+'00 00 0F 77 77 77 77 77 77 77 78 80 00 00 0F FF'
+'FF FF FF FF FF FF FF 80 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00'
+
+}
+
+
+32755 BITMAP
+{
+'42 4D 66 01 00 00 00 00 00 00 76 00 00 00 28 00'
+'00 00 14 00 00 00 14 00 00 00 01 00 04 00 00 00'
+'00 00 F0 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 BF 00 00 BF'
+'00 00 00 BF BF 00 BF 00 00 00 BF 00 BF 00 BF BF'
+'00 00 C0 C0 C0 00 80 80 80 00 00 00 FF 00 00 FF'
+'00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF'
+'00 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 08 88 88 88 88 88 88 88 88 80 00 00 0F 88'
+'88 88 88 88 88 88 88 80 00 00 0F 77 77 77 77 77'
+'77 77 78 80 00 00 0F 77 77 77 77 77 77 77 78 80'
+'00 00 0F 77 77 77 70 07 77 77 78 80 00 00 0F 77'
+'77 77 00 00 77 77 78 80 00 00 0F 77 77 70 08 80'
+'07 77 78 80 00 00 0F 77 77 00 88 88 00 77 78 80'
+'00 00 0F 77 70 00 00 00 00 07 78 80 00 00 0F 77'
+'77 77 77 77 77 77 78 80 00 00 0F 77 70 00 00 00'
+'00 07 78 80 00 00 0F 77 77 00 88 88 00 77 78 80'
+'00 00 0F 77 77 70 08 80 07 77 78 80 00 00 0F 77'
+'77 77 00 00 77 77 78 80 00 00 0F 77 77 77 70 07'
+'77 77 78 80 00 00 0F 77 77 77 77 77 77 77 78 80'
+'00 00 0F 77 77 77 77 77 77 77 78 80 00 00 0F FF'
+'FF FF FF FF FF FF FF 80 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00'
+
+}
+
+
+32756 BITMAP
+{
+'42 4D 66 01 00 00 00 00 00 00 76 00 00 00 28 00'
+'00 00 14 00 00 00 14 00 00 00 01 00 04 00 00 00'
+'00 00 F0 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 BF 00 00 BF'
+'00 00 00 BF BF 00 BF 00 00 00 BF 00 BF 00 BF BF'
+'00 00 C0 C0 C0 00 80 80 80 00 00 00 FF 00 00 FF'
+'00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF'
+'00 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 08 88 88 88 88 88 88 88 88 80 00 00 0F 88'
+'88 88 88 88 88 88 88 80 00 00 0F 77 77 77 77 77'
+'77 77 78 80 00 00 0F 77 77 77 77 77 77 77 78 80'
+'00 00 0F 77 77 77 77 77 77 77 78 80 00 00 0F 77'
+'77 77 77 77 77 77 78 80 00 00 0F 77 77 77 77 77'
+'77 77 78 80 00 00 0F 77 70 00 00 00 00 07 78 80'
+'00 00 0F 77 77 00 00 00 00 77 78 80 00 00 0F 77'
+'77 70 00 00 07 77 78 80 00 00 0F 77 77 77 00 00'
+'77 77 78 80 00 00 0F 77 77 77 70 07 77 77 78 80'
+'00 00 0F 77 77 77 77 77 77 77 78 80 00 00 0F 77'
+'77 77 77 77 77 77 78 80 00 00 0F 77 77 77 77 77'
+'77 77 78 80 00 00 0F 77 77 77 77 77 77 77 78 80'
+'00 00 0F 77 77 77 77 77 77 77 78 80 00 00 0F FF'
+'FF FF FF FF FF FF FF 80 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00'
+
+}
+
+
+32757 BITMAP
+{
+'42 4D 66 01 00 00 00 00 00 00 76 00 00 00 28 00'
+'00 00 14 00 00 00 14 00 00 00 01 00 04 00 00 00'
+'00 00 F0 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 BF 00 00 BF'
+'00 00 00 BF BF 00 BF 00 00 00 BF 00 BF 00 BF BF'
+'00 00 C0 C0 C0 00 80 80 80 00 00 00 FF 00 00 FF'
+'00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF'
+'00 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 08 88 88 88 88 88 88 88 88 80 00 00 0F 88'
+'88 88 88 88 88 88 88 80 00 00 0F 77 77 77 77 77'
+'77 77 78 80 00 00 0F 77 77 77 77 77 77 77 78 80'
+'00 00 0F 77 77 77 70 07 77 77 78 80 00 00 0F 77'
+'77 77 00 00 77 77 78 80 00 00 0F 77 77 70 08 80'
+'07 77 78 80 00 00 0F 77 77 00 88 88 00 77 78 80'
+'00 00 0F 77 70 00 88 88 00 07 78 80 00 00 0F 77'
+'77 70 88 88 07 77 78 80 00 00 0F 77 77 70 88 88'
+'07 77 78 80 00 00 0F 77 77 70 88 88 07 77 78 80'
+'00 00 0F 77 77 70 00 00 07 77 78 80 00 00 0F 77'
+'77 70 07 70 07 77 78 80 00 00 0F 77 77 77 77 77'
+'77 77 78 80 00 00 0F 77 77 77 77 77 77 77 78 80'
+'00 00 0F 77 77 77 77 77 77 77 78 80 00 00 0F FF'
+'FF FF FF FF FF FF FF 80 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00'
+
+}
+
+
+32758 BITMAP
+{
+'42 4D 4E 01 00 00 00 00 00 00 76 00 00 00 28 00'
+'00 00 12 00 00 00 12 00 00 00 01 00 04 00 00 00'
+'00 00 D8 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 BF 00 00 BF'
+'00 00 00 BF BF 00 BF 00 00 00 BF 00 BF 00 BF BF'
+'00 00 C0 C0 C0 00 80 80 80 00 00 00 FF 00 00 FF'
+'00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF'
+'00 00 FF FF FF 00 FF FF FF FF FF FF FF FF FF 00'
+'00 00 FF FF FF FF FF FF FF FF FF 00 00 00 FF FF'
+'FF FF FF FF FF FF FF 00 00 00 FF FF FF FF FF FF'
+'FF FF FF 00 00 00 FF FF FF FF FF FF FF FF FF 00'
+'00 00 FF FF FF FF FF FF FF FF FF 00 00 00 FF FF'
+'FF FF FF FF FF FF FF 00 00 00 FF FF FF FF FF FF'
+'FF FF FF 00 00 00 FF FF FF FF FF FF FF FF FF 00'
+'00 00 FF F0 00 FF FF FF FF FF FF 00 00 00 FF 0F'
+'FF 0F FF FF FF FF FF 00 00 00 F0 FF FF F0 FF FF'
+'00 00 FF 00 00 00 0F FF FF FF 0F F0 00 00 0F 00'
+'00 00 0F FF FF FF 0F F0 00 00 0F 00 00 00 0F FF'
+'FF FF 0F F0 00 00 0F 00 00 00 F0 FF FF F0 FF F0'
+'00 00 0F 00 00 00 FF 0F FF 0F FF FF 00 00 FF 00'
+'00 00 FF F0 00 FF FF FF FF FF FF 00 00 00'
+
+}
+
+
+32759 BITMAP
+{
+'42 4D 36 02 00 00 00 00 00 00 76 00 00 00 28 00'
+'00 00 1C 00 00 00 1C 00 00 00 01 00 04 00 00 00'
+'00 00 C0 01 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 BF 00 00 BF'
+'00 00 00 BF BF 00 BF 00 00 00 BF 00 BF 00 BF BF'
+'00 00 C0 C0 C0 00 80 80 80 00 00 00 FF 00 00 FF'
+'00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF'
+'00 00 FF FF FF 00 FF FF 00 00 0F FF FF FF FF 00'
+'00 0F FF FF 00 00 FF F0 FF FF F0 FF FF FF F0 FF'
+'FF F0 FF FF 00 00 FF 0F FF FF FF 0F FF FF 0F FF'
+'FF FF 0F FF 00 00 F0 FF FF FF FF F0 FF F0 FF F0'
+'00 FF F0 FF 00 00 0F FF FF FF FF FF 0F 0F FF 00'
+'00 0F FF 0F 00 00 0F FF FF FF FF FF 0F 0F F0 00'
+'00 00 FF 0F 00 00 0F FF FF FF FF FF 0F 0F F0 00'
+'00 00 FF 0F 00 00 0F FF FF FF FF FF 0F 0F F0 00'
+'00 00 FF 0F 00 00 0F FF FF FF FF FF 0F 0F FF 00'
+'00 0F FF 0F 00 00 F0 FF FF FF FF F0 FF F0 FF F0'
+'00 FF F0 FF 00 00 FF 0F FF FF FF 0F FF FF 0F FF'
+'FF FF 0F FF 00 00 FF F0 FF FF F0 FF FF FF F0 FF'
+'FF F0 FF FF 00 00 FF FF 00 00 0F FF FF FF FF 00'
+'00 0F FF FF 00 00 FF FF FF FF FF FF FF FF FF FF'
+'FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 0F FF FF FF FF FF F0 00 FF FF'
+'FF FF FF 00 00 00 0F FF FF FF FF FF F0 0F 0F FF'
+'FF FF F0 F0 00 00 0F FF FF FF FF FF F0 0F F0 FF'
+'FF FF 0F F0 00 00 0F FF FF FF FF FF F0 0F FF 0F'
+'FF F0 FF F0 00 00 0F FF FF FF FF FF F0 0F FF F0'
+'FF 0F FF F0 00 00 0F FF FF FF FF FF F0 0F FF FF'
+'00 FF FF F0 00 00 0F FF FF FF FF FF F0 0F FF FF'
+'00 FF FF F0 00 00 0F FF FF FF FF FF F0 0F FF F0'
+'FF 0F FF F0 00 00 0F FF FF FF FF FF F0 0F FF 0F'
+'FF F0 FF F0 00 00 0F FF FF FF FF FF F0 0F F0 FF'
+'FF FF 0F F0 00 00 0F FF FF FF FF FF F0 0F 0F FF'
+'FF FF F0 F0 00 00 0F FF FF FF FF FF F0 00 FF FF'
+'FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00'
+
+}
+
+
+32760 BITMAP
+{
+'42 4D 36 05 00 00 00 00 00 00 36 04 00 00 28 00'
+'00 00 10 00 00 00 10 00 00 00 01 00 08 00 00 00'
+'00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 BF 00 00 BF'
+'00 00 00 BF BF 00 BF 00 00 00 BF 00 BF 00 BF BF'
+'00 00 C0 C0 C0 00 C0 DC C0 00 F0 CA A6 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 F0 FB'
+'FF 00 A4 A0 A0 00 80 80 80 00 00 00 FF 00 00 FF'
+'00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF'
+'00 00 FF FF FF 00 FF FF FF FF FF FF FF FF FF FF'
+'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF'
+'FF FF FF FF FF FF FF FF FF FF FF FF 00 FF FF FF'
+'FF FF FF FF FF FF FF FF FF FF FF 00 00 00 FF FF'
+'FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 FF'
+'FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00'
+'FF FF FF FF FF FF FF 00 00 00 00 00 FF FF 00 00'
+'00 FF FF FF FF FF FF FF FF 00 00 FF FF FF FF 00'
+'00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF'
+'00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF'
+'FF 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF'
+'FF FF 00 00 FF FF FF FF FF FF FF FF FF FF FF FF'
+'FF FF FF 00 FF FF FF FF FF FF FF FF FF FF FF FF'
+'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF'
+'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF'
+'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF'
+'FF FF FF FF FF FF'
+
+}
+
+
+32761 BITMAP
+{
+'42 4D 4E 01 00 00 00 00 00 00 76 00 00 00 28 00'
+'00 00 12 00 00 00 12 00 00 00 01 00 04 00 00 00'
+'00 00 D8 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 BF 00 00 BF'
+'00 00 00 BF BF 00 BF 00 00 00 BF 00 BF 00 BF BF'
+'00 00 C0 C0 C0 00 80 80 80 00 00 00 FF 00 00 FF'
+'00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF'
+'00 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 08 88 88 88 88 88 88 88 80 00 00 00 0F 88'
+'88 88 88 88 88 88 80 00 00 00 0F 77 77 77 77 77'
+'77 78 80 00 00 00 0F 77 77 77 00 00 00 78 80 00'
+'00 00 0F 77 77 77 77 00 00 78 80 00 00 00 0F 77'
+'77 77 70 00 00 78 80 00 00 00 0F 77 77 77 00 00'
+'00 78 80 00 00 00 0F 77 77 77 70 00 70 78 80 00'
+'00 00 0F 70 77 07 77 07 70 78 80 00 00 00 0F 70'
+'70 00 77 77 77 78 80 00 00 00 0F 70 00 00 07 77'
+'77 78 80 00 00 00 0F 70 00 00 77 77 77 78 80 00'
+'00 00 0F 70 00 07 77 77 77 78 80 00 00 00 0F 70'
+'00 00 07 77 77 78 80 00 00 00 0F 77 77 77 77 77'
+'77 78 80 00 00 00 0F FF FF FF FF FF FF FF 80 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+
+}
+
+
+32762 BITMAP
+{
+'42 4D 4E 01 00 00 00 00 00 00 76 00 00 00 28 00'
+'00 00 12 00 00 00 12 00 00 00 01 00 04 00 00 00'
+'00 00 D8 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 BF 00 00 BF'
+'00 00 00 BF BF 00 BF 00 00 00 BF 00 BF 00 BF BF'
+'00 00 C0 C0 C0 00 80 80 80 00 00 00 FF 00 00 FF'
+'00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF'
+'00 00 FF FF FF 00 FF FF FF FF FF FF FF FF FF 00'
+'00 00 FF FF FF FF FF FF FF FF FF 00 00 00 FF FF'
+'FF FF FF FF FF FF FF 00 00 00 FF FF FF FF FF FF'
+'FF FF FF 00 00 00 FF FF FF F0 FF FF FF FF FF 00'
+'00 00 FF FF FF 00 FF FF FF FF FF 00 00 00 FF FF'
+'F0 00 00 00 00 FF FF 00 00 00 FF FF 00 00 00 00'
+'00 FF FF 00 00 00 FF F0 00 00 00 00 0F FF FF 00'
+'00 00 FF F0 00 00 00 00 0F FF FF 00 00 00 FF FF'
+'00 00 00 00 00 FF FF 00 00 00 FF FF F0 00 00 00'
+'00 FF FF 00 00 00 FF FF FF 00 FF FF FF FF FF 00'
+'00 00 FF FF FF F0 FF FF FF FF FF 00 00 00 FF FF'
+'FF FF FF FF FF FF FF 00 00 00 FF FF FF FF FF FF'
+'FF FF FF 00 00 00 FF FF FF FF FF FF FF FF FF 00'
+'00 00 FF FF FF FF FF FF FF FF FF 00 00 00'
+
+}
+
+
+32763 BITMAP
+{
+'42 4D 4E 01 00 00 00 00 00 00 76 00 00 00 28 00'
+'00 00 12 00 00 00 12 00 00 00 01 00 04 00 00 00'
+'00 00 D8 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 BF 00 00 BF'
+'00 00 00 BF BF 00 BF 00 00 00 BF 00 BF 00 BF BF'
+'00 00 C0 C0 C0 00 80 80 80 00 00 00 FF 00 00 FF'
+'00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF'
+'00 00 FF FF FF 00 FF FF FF FF FF FF FF FF FF 00'
+'00 00 FF FF FF FF FF FF FF FF FF 00 00 00 FF FF'
+'FF FF FF FF FF FF FF 00 00 00 FF FF FF FF FF FF'
+'FF FF FF 00 00 00 FF FF FF FF F0 FF FF FF FF 00'
+'00 00 FF FF FF FF F0 0F FF FF FF 00 00 00 FF FF'
+'00 00 00 00 FF FF FF 00 00 00 FF FF 00 00 00 00'
+'0F FF FF 00 00 00 FF FF F0 00 00 00 00 FF FF 00'
+'00 00 FF FF F0 00 00 00 00 FF FF 00 00 00 FF FF'
+'00 00 00 00 0F FF FF 00 00 00 FF FF 00 00 00 00'
+'FF FF FF 00 00 00 FF FF FF FF F0 0F FF FF FF 00'
+'00 00 FF FF FF FF F0 FF FF FF FF 00 00 00 FF FF'
+'FF FF FF FF FF FF FF 00 00 00 FF FF FF FF FF FF'
+'FF FF FF 00 00 00 FF FF FF FF FF FF FF FF FF 00'
+'00 00 FF FF FF FF FF FF FF FF FF 00 00 00'
+
+}
+
+
+32764 BITMAP
+{
+'42 4D 4E 01 00 00 00 00 00 00 76 00 00 00 28 00'
+'00 00 12 00 00 00 12 00 00 00 01 00 04 00 00 00'
+'00 00 D8 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 BF 00 00 BF'
+'00 00 00 BF BF 00 BF 00 00 00 BF 00 BF 00 BF BF'
+'00 00 C0 C0 C0 00 80 80 80 00 00 00 FF 00 00 FF'
+'00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF'
+'00 00 FF FF FF 00 FF FF FF FF FF FF FF FF FF 00'
+'00 00 FF FF FF FF FF FF FF FF FF 00 00 00 FF FF'
+'FF FF FF FF FF FF FF 00 00 00 FF FF FF FF FF FF'
+'FF FF FF 00 00 00 FF FF FF FF 00 FF FF FF FF 00'
+'00 00 FF FF FF F0 00 0F FF FF FF 00 00 00 FF FF'
+'FF 00 00 00 FF FF FF 00 00 00 FF FF F0 00 00 00'
+'0F FF FF 00 00 00 FF FF 00 00 00 00 00 FF FF 00'
+'00 00 FF FF FF 00 00 00 FF FF FF 00 00 00 FF FF'
+'FF 00 00 00 FF FF FF 00 00 00 FF FF FF 00 00 00'
+'FF FF FF 00 00 00 FF FF FF 00 00 00 FF FF FF 00'
+'00 00 FF FF FF 00 FF 00 FF FF FF 00 00 00 FF FF'
+'FF FF FF FF FF FF FF 00 00 00 FF FF FF FF FF FF'
+'FF FF FF 00 00 00 FF FF FF FF FF FF FF FF FF 00'
+'00 00 FF FF FF FF FF FF FF FF FF 00 00 00'
+
+}
+
+
+32765 BITMAP
+{
+'42 4D 4E 01 00 00 00 00 00 00 76 00 00 00 28 00'
+'00 00 12 00 00 00 12 00 00 00 01 00 04 00 00 00'
+'00 00 D8 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 BF 00 00 BF'
+'00 00 00 BF BF 00 BF 00 00 00 BF 00 BF 00 BF BF'
+'00 00 C0 C0 C0 00 80 80 80 00 00 00 FF 00 00 FF'
+'00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF'
+'00 00 FF FF FF 00 FF FF FF FF FF FF FF FF FF 00'
+'00 00 FF FF FF FF FF FF FF FF FF 00 00 00 FF FF'
+'FF FF FF FF FF FF FF 00 00 00 FF FF FF FF FF FF'
+'FF FF FF 00 00 00 FF FF FF 00 FF 00 FF FF FF 00'
+'00 00 FF FF FF 00 00 00 FF FF FF 00 00 00 FF FF'
+'FF 00 00 00 FF FF FF 00 00 00 FF FF FF 00 00 00'
+'FF FF FF 00 00 00 FF FF FF 00 00 00 FF FF FF 00'
+'00 00 FF FF 00 00 00 00 00 FF FF 00 00 00 FF FF'
+'F0 00 00 00 0F FF FF 00 00 00 FF FF FF 00 00 00'
+'FF FF FF 00 00 00 FF FF FF F0 00 0F FF FF FF 00'
+'00 00 FF FF FF FF 00 FF FF FF FF 00 00 00 FF FF'
+'FF FF FF FF FF FF FF 00 00 00 FF FF FF FF FF FF'
+'FF FF FF 00 00 00 FF FF FF FF FF FF FF FF FF 00'
+'00 00 FF FF FF FF FF FF FF FF FF 00 00 00'
+
+}
+
+
+32766 BITMAP
+{
+'42 4D 4E 01 00 00 00 00 00 00 76 00 00 00 28 00'
+'00 00 12 00 00 00 12 00 00 00 01 00 04 00 00 00'
+'00 00 D8 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 BF 00 00 BF'
+'00 00 00 BF BF 00 BF 00 00 00 BF 00 BF 00 BF BF'
+'00 00 C0 C0 C0 00 80 80 80 00 00 00 FF 00 00 FF'
+'00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF'
+'00 00 FF FF FF 00 FF FF FF FF FF FF FF FF FF 00'
+'00 00 FF FF FF FF FF FF FF FF FF 00 00 00 FF FF'
+'FF FF FF FF FF FF FF 00 00 00 FF FF FF FF FF FF'
+'FF FF FF 00 00 00 FF FF FF FF FF FF FF FF FF 00'
+'00 00 FF FF FF FF FF F0 0F FF FF 00 00 00 FF FF'
+'FF FF FF F0 0F FF FF 00 00 00 FF FF FF FF FF F0'
+'0F FF FF 00 00 00 FF FF FF FF FF F0 0F FF FF 00'
+'00 00 FF FF FF FF FF F0 0F FF FF 00 00 00 FF FF'
+'FF FF FF F0 0F FF FF 00 00 00 FF FF F0 00 00 00'
+'0F FF FF 00 00 00 FF FF F0 00 00 00 0F FF FF 00'
+'00 00 FF FF FF FF FF FF FF FF FF 00 00 00 FF FF'
+'FF FF FF FF FF FF FF 00 00 00 FF FF FF FF FF FF'
+'FF FF FF 00 00 00 FF FF FF FF FF FF FF FF FF 00'
+'00 00 FF FF FF FF FF FF FF FF FF 00 00 00'
+
+}
+
+
+32767 BITMAP
+{
+'42 4D 66 01 00 00 00 00 00 00 76 00 00 00 28 00'
+'00 00 14 00 00 00 14 00 00 00 01 00 04 00 00 00'
+'00 00 F0 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 BF 00 00 BF'
+'00 00 00 BF BF 00 BF 00 00 00 BF 00 BF 00 BF BF'
+'00 00 C0 C0 C0 00 80 80 80 00 00 00 FF 00 00 FF'
+'00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF'
+'00 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 08 88 88 88 88 88 88 88 88 80 00 00 0F 88'
+'88 88 88 88 88 88 88 80 F8 F8 0F 77 77 77 77 77'
+'77 77 78 80 F8 F8 0F 77 77 77 77 77 77 77 78 80'
+'F8 F8 0F 77 77 77 77 77 77 77 78 80 F8 F8 0F 77'
+'77 7F FF FF 77 77 78 80 F8 F8 0F 77 77 8F FF FF'
+'F7 77 78 80 F8 F8 0F 77 78 88 99 9F FF 77 78 80'
+'4E 04 0F 77 78 89 99 99 FF 77 78 80 4D 00 0F 77'
+'78 89 99 99 FF 77 78 80 06 03 0F 77 78 89 99 99'
+'FF 77 78 80 27 00 0F 77 78 88 99 9F FF 77 78 80'
+'C9 0B 0F 77 77 88 88 88 F7 77 78 80 34 00 0F 77'
+'77 78 88 88 77 77 78 80 45 09 0F 77 77 77 77 77'
+'77 77 78 80 D9 00 0F 77 77 77 77 77 77 77 78 80'
+'0E 0C 0F 77 77 77 77 77 77 77 78 80 38 00 0F FF'
+'FF FF FF FF FF FF FF 80 69 03 00 00 00 00 00 00'
+'00 00 00 00 44 00'
+
+}
+
+
+SMILE BITMAP
+{
+'42 4D E6 08 00 00 00 00 00 00 36 04 00 00 28 00'
+'00 00 3C 00 00 00 14 00 00 00 01 00 08 00 00 00'
+'00 00 B0 04 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 BF 00 00 BF'
+'00 00 00 BF BF 00 BF 00 00 00 BF 00 BF 00 BF BF'
+'00 00 C0 C0 C0 00 C0 DC C0 00 F0 CA A6 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 F0 FB'
+'FF 00 A4 A0 A0 00 80 80 80 00 00 00 FF 00 00 FF'
+'00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF'
+'00 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 FF F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8'
+'F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8'
+'F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8'
+'F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 00 00 FF'
+'07 07 07 07 07 07 07 07 07 07 07 07 07 07 07 07'
+'07 07 07 07 07 07 07 07 07 07 07 07 07 07 07 07'
+'07 07 07 07 07 07 07 07 07 07 07 07 07 07 07 07'
+'07 07 07 07 07 07 07 07 F8 00 00 FF 07 F8 FF FF'
+'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF'
+'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF'
+'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF'
+'FF FF FF 07 F8 00 00 FF 07 F8 07 07 07 07 07 07'
+'07 07 07 07 07 07 07 07 07 07 07 07 07 07 07 07'
+'07 07 07 07 07 07 07 07 07 07 07 07 07 07 07 07'
+'07 07 07 07 07 07 07 07 07 07 07 07 07 07 FF 07'
+'F8 00 00 FF 07 F8 07 07 07 07 07 07 F9 F9 F9 F9'
+'F9 F9 07 07 07 07 07 07 07 07 07 07 07 07 00 00'
+'00 00 00 00 00 00 00 00 07 07 07 07 07 07 07 07'
+'07 07 07 07 07 07 07 07 07 07 FF 07 F8 00 00 FF'
+'07 F8 07 07 07 07 07 F9 07 07 07 07 07 07 F9 07'
+'07 07 07 07 07 07 07 07 07 07 00 FF FF FF FF FF'
+'FF FF FF 00 07 07 07 07 07 07 07 07 07 07 07 07'
+'07 07 07 07 07 07 FF 07 F8 00 00 FF 07 F8 07 07'
+'07 07 F9 07 07 FA FA FA FA 07 07 F9 07 07 07 07'
+'07 07 07 07 07 07 00 FF 00 00 00 00 00 00 FF 00'
+'07 07 07 07 07 07 07 07 07 07 07 07 07 07 07 07'
+'07 07 FF 07 F8 00 00 FF 07 F8 07 07 07 07 F9 07'
+'FA 07 07 07 07 FA 07 F9 07 07 07 07 07 07 07 07'
+'07 07 00 FF 00 00 00 00 00 00 FF 00 07 07 07 07'
+'07 07 07 07 07 07 07 07 07 07 07 07 07 07 FF 07'
+'F8 00 00 FF 07 F8 07 07 07 07 F9 07 07 07 FB FB'
+'07 07 07 F9 07 07 07 07 07 07 07 07 07 07 00 FF'
+'FF FF FF FF FF FF FF 00 07 07 07 07 07 07 07 07'
+'07 07 07 07 07 07 07 07 07 07 FF 07 F8 00 00 FF'
+'07 F8 07 07 07 07 F9 07 07 07 FB FB 07 07 07 F9'
+'07 07 07 07 07 07 07 07 07 07 00 FF FF FF FF FF'
+'FF FF FF 00 07 07 07 07 07 07 07 07 07 07 07 07'
+'07 07 07 07 07 07 FF 07 F8 00 00 FF 07 F8 07 07'
+'07 07 F9 07 FC 07 07 07 07 FC 07 F9 07 07 07 07'
+'07 07 07 07 07 07 00 FF 00 00 00 00 00 00 FF 00'
+'07 07 07 07 07 07 07 07 07 07 07 07 07 07 07 07'
+'07 07 FF 07 F8 00 00 FF 07 F8 07 07 07 07 F9 07'
+'FC FC 07 07 FC FC 07 F9 07 07 07 07 07 07 07 07'
+'07 07 00 FF 00 00 00 00 00 00 FF 00 07 07 07 07'
+'07 07 07 07 07 07 07 07 07 07 07 07 07 07 FF 07'
+'F8 00 00 FF 07 F8 07 07 07 07 07 F9 07 07 07 07'
+'07 07 F9 07 07 07 07 07 07 07 07 07 07 07 00 FF'
+'FF FF FF FF FF FF FF 00 07 07 07 07 07 07 07 07'
+'07 07 07 07 07 07 07 07 07 07 FF 07 F8 00 00 FF'
+'07 F8 07 07 07 07 07 07 F9 F9 F9 F9 F9 F9 07 07'
+'07 07 07 07 07 07 07 07 07 07 00 00 00 00 00 00'
+'00 00 00 00 07 07 07 07 07 07 07 07 07 07 07 07'
+'07 07 07 07 07 07 FF 07 F8 00 00 FF 07 F8 07 07'
+'07 07 07 07 07 07 07 07 07 07 07 07 07 07 07 07'
+'07 07 07 07 07 07 07 07 07 07 07 07 07 07 07 07'
+'07 07 07 07 07 07 07 07 07 07 07 07 07 07 07 07'
+'07 07 FF 07 F8 00 00 FF 07 F8 F8 F8 F8 F8 F8 F8'
+'F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8'
+'F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8'
+'F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 07'
+'F8 00 00 FF 07 07 07 07 07 07 07 07 07 07 07 07'
+'07 07 07 07 07 07 07 07 07 07 07 07 07 07 07 07'
+'07 07 07 07 07 07 07 07 07 07 07 07 07 07 07 07'
+'07 07 07 07 07 07 07 07 07 07 07 07 F8 00 00 FF'
+'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF'
+'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF'
+'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF'
+'FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+'00 00 00 00 00 00'
+
+}
+
+
+WINELOGO BITMAP "winelogo.bmp"
+
+
+SYSMENU MENU
+{
+ MENUITEM "&Restore", 61728
+ MENUITEM "&Move", 61456
+ MENUITEM "&Size", 61440
+ MENUITEM "Mi&nimize", 61472
+ MENUITEM "Ma&ximize", 61488
+ MENUITEM SEPARATOR
+ MENUITEM "&Close\tAlt-F4", 61536
+ MENUITEM SEPARATOR
+ MENUITEM "&Switch to ...\tCtrl-Esc", 61744
+ MENUITEM SEPARATOR
+ MENUITEM "&About WINE ...", 61761
+}
+
+
+2 DIALOG 80, 80, 150, 170
+STYLE WS_POPUP | WS_VISIBLE | WS_DLGFRAME
+{
+ PUSHBUTTON "Credit & License", 6, 30, 150, 40, 14, WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "Cancel", 2, 60, 250, 40, 14, WS_GROUP | WS_TABSTOP
+ DEFPUSHBUTTON "Ok", 1, 80, 150, 40, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
+}
+
+
+SHELL_ABOUT_MSGBOX DIALOG 50, 44, 213, 149
+STYLE DS_LOCALEDIT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "about X"
+FONT 10, "System"
+{
+ DEFPUSHBUTTON "OK", 1, 86, 130, 40, 14
+ CONTROL "", -1, "STATIC", SS_BLACKFRAME | WS_CHILD | WS_VISIBLE | WS_DISABLED, 4, 35, 205, 90
+ LTEXT "Text", 100, 11, 40, 190, 80, SS_NOPREFIX | WS_GROUP
+ ICON "WINEICON", -1, 185, 10, 18, 20
+}
+
diff --git a/rc/systest.c b/rc/systest.c
new file mode 100644
index 0000000..3939e1d
--- /dev/null
+++ b/rc/systest.c
@@ -0,0 +1,109 @@
+#include <windows.h>
+
+LRESULT CALLBACK _export WndProc(HWND hWnd, UINT message,
+ WPARAM wParam, LPARAM lParam);
+
+BOOL CALLBACK _export DlgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam);
+
+HINSTANCE hInst;
+HMENU hMenu,dummy;
+extern char sysres_MENU_SYSMENU[],sysres_BITMAP_WINELOGO[],sysres_DIALOG_2[];
+
+int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
+ LPSTR lpszCmdLine, int cmdShow)
+{
+ MSG msg;
+ WNDCLASS wcHdumpClass;
+ HWND hWndMain;
+
+ hInst=hInstance;
+
+ // Define the window class for this application.
+ wcHdumpClass.lpszClassName = "WrcTestClass";
+ wcHdumpClass.hInstance = hInstance;
+ wcHdumpClass.lpfnWndProc = WndProc;
+ wcHdumpClass.hCursor = 0;
+ wcHdumpClass.hIcon = 0;
+ wcHdumpClass.lpszMenuName = 0;
+ wcHdumpClass.hbrBackground = GetStockObject(WHITE_BRUSH);
+ wcHdumpClass.style = CS_HREDRAW | CS_VREDRAW;
+ wcHdumpClass.cbClsExtra = 0;
+ wcHdumpClass.cbWndExtra = 0;
+ RegisterClass(&wcHdumpClass);
+
+ hWndMain = CreateWindow("WrcTestClass","WrcTest",
+ WS_OVERLAPPEDWINDOW,
+ CW_USEDEFAULT, // x window location
+ CW_USEDEFAULT, // y
+ CW_USEDEFAULT, // cx and size
+ CW_USEDEFAULT, // cy
+ NULL, // no parent for this window
+ NULL, // use the class menu
+ hInstance, // who created this window
+ NULL // no parms to pass on
+ );
+ ShowWindow(hWndMain,SW_SHOW);
+ UpdateWindow(hWndMain);
+ hMenu=LoadMenuIndirect(sysres_MENU_SYSMENU);
+
+ /* see Q75254 on how to create a popup menu via LoadMenuIndirect */
+ dummy=CreateMenu();
+ InsertMenu(dummy,0,MF_POPUP,hMenu,NULL);
+ hMenu=GetSubMenu(dummy,0);
+
+ while (GetMessage(&msg, NULL, NULL, NULL))
+ {
+ TranslateMessage(&msg);
+ DispatchMessage(&msg);
+ }
+
+ return(msg.wParam);
+}
+
+LRESULT CALLBACK _export WndProc(HWND hWnd, UINT message,
+ WPARAM wParam, LPARAM lParam)
+{
+ POINT ptCurrent;
+ switch(message)
+ {
+ case WM_LBUTTONDOWN:
+ ptCurrent=MAKEPOINT(lParam);
+ ClientToScreen(hWnd,&ptCurrent);
+ TrackPopupMenu(hMenu,0,ptCurrent.x,ptCurrent.y,0,hWnd,0);
+ break;
+ case WM_PAINT:
+ { PAINTSTRUCT ps;
+ BITMAPINFO *bm=sysres_BITMAP_WINELOGO;
+ char *bits=bm;
+ bits+=bm->bmiHeader.biSize;
+ bits+=(1<<bm->bmiHeader.biBitCount)*sizeof(RGBQUAD);
+ BeginPaint(hWnd,&ps);
+ SetDIBitsToDevice(ps.hdc,0,0,bm->bmiHeader.biWidth,
+ bm->bmiHeader.biHeight,0,0,0,bm->bmiHeader.biHeight,
+ bits,bm,DIB_RGB_COLORS);
+ EndPaint(hWnd,&ps);
+ break;
+ }
+ case WM_COMMAND:
+ CreateDialogIndirect(hInst,sysres_DIALOG_2,hWnd,DlgProc);
+ break;
+ case WM_DESTROY:
+ PostQuitMessage(0);
+ break;
+ default:return DefWindowProc(hWnd,message,wParam,lParam);
+ }
+ return 0L;
+}
+
+BOOL CALLBACK _export DlgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
+{
+ switch(msg)
+ {
+ case WM_INITDIALOG:
+ return 1;
+ case WM_COMMAND:
+ DestroyWindow(hWnd);
+ return 0;
+ }
+ return 0;
+}
diff --git a/rc/winelogo.bmp b/rc/winelogo.bmp
new file mode 100644
index 0000000..dbac0e6
--- /dev/null
+++ b/rc/winelogo.bmp
Binary files differ
diff --git a/rc/winerc.c b/rc/winerc.c
new file mode 100644
index 0000000..13f37ee
--- /dev/null
+++ b/rc/winerc.c
@@ -0,0 +1,574 @@
+/*
+ *
+ * Copyright Martin von Loewis, 1994
+ *
+ */
+
+static char Copyright[] = "Copyright Martin von Loewis, 1994";
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+#include <sys/fcntl.h>
+#include <sys/types.h>
+#include <windows.h>
+#include <neexe.h>
+#include "rc.h"
+#include "rc.tab.h"
+
+char usage[]="winerc -dv -p <prefix> < infile > outfile\n";
+
+/*might be overwritten by command line*/
+char *prefix="_Resource";
+int verbose;
+gen_res* g_start;
+
+main(int argc,char *argv[])
+{
+ extern int yydebug;
+ extern char* optarg;
+ int optc,lose;
+ lose=0;
+ while((optc=getopt(argc,argv,"dp:v",0))!=EOF)
+ switch(optc)
+ {
+ /* bison will print state transitions on stderr */
+ case 'd':yydebug=1;
+ setbuf(stdout,0);
+ setbuf(stderr,0);
+ break;
+ case 'p':prefix=optarg;break;
+ case 'v':verbose=1;
+ setbuf(stderr,0);
+ break;
+ default: lose++;break;
+ }
+ if(lose)return fprintf(stderr,usage),1;
+ yyparse();
+ return 0;
+}
+
+/* SunOS' memcpy is wrong for overlapping arrays */
+char *save_memcpy(char *d,char* s,int l)
+{
+ if(d<s)
+ for(;l;l--)*d++=*s++;
+ else
+ for(d+=l-1,s+=l-1;l;l--)*d--=*s--;
+ return d;
+}
+
+/*allow unaligned access*/
+void put_WORD(unsigned char* p,WORD w)
+{
+ *p=w&0xFF;
+ *(p+1)=w>>8;
+}
+
+void put_DWORD(unsigned char* p,DWORD d)
+{
+ put_WORD(p,d&0xFFFF);
+ put_WORD(p+2,d>>16);
+}
+
+WORD get_WORD(unsigned char* p)
+{
+ return *p|(*(p+1)<<8);
+}
+
+DWORD get_DWORD(unsigned char* p)
+{
+ return get_WORD(p)|(get_WORD(p+2)<<16);
+}
+
+
+/*create a new gen_res, initial size 100*/
+gen_res *new_res()
+{ gen_res* ret=malloc(sizeof(gen_res)+100);
+ int i;
+ if(!ret)
+ fprintf(stderr,"Out of memory\n"),exit(1);
+ for(i=0;i<sizeof(gen_res)+100;i++)*((char*)ret+i)='\0';
+ ret->g_next=g_start;
+ ret->g_prev=0;
+ g_start=ret;
+ ret->space=100;
+ return ret;
+}
+
+/*double the space*/
+gen_res* grow(gen_res* res)
+{
+ res=realloc(res,sizeof(gen_res)+2*res->space);
+ if(!res)
+ fprintf(stderr,"Out of memory\n"),exit(1);
+ if(!res->g_prev)g_start=res;
+ else res->g_prev->g_next=res;
+ if(res->g_next)res->g_next->g_prev=res;
+ res->space=2*res->space;
+ return res;
+}
+
+
+/* insert bytes at offset 0, increase num_entries */
+gen_res* insert_at_beginning(gen_res* res,char* entry,int size)
+{
+ while(res->size+size>res->space)res=grow(res);
+ save_memcpy(res->res+size,res->res,res->size);
+ save_memcpy(res->res,entry,size);
+ res->size+=size;
+ res->num_entries++;
+ return res;
+}
+
+/* insert length characters from bytes into res, starting at start */
+gen_res* insert_bytes(gen_res* res,char* bytes,int start,int length)
+{
+ while(res->size+length>res->space)res=grow(res);
+ save_memcpy(res->res+start+length,res->res+start,res->size-start);
+ save_memcpy(res->res+start,bytes,length);
+ res->size+=length;
+ return res;
+}
+
+/*delete len bytes from res, starting at start*/
+gen_res* delete_bytes(gen_res* res,int start,int len)
+{
+ save_memcpy(res->res+start,res->res+start+len,res->size-start-len);
+ res->size-=len;
+ return res;
+}
+
+/*create a new style*/
+rc_style *new_style()
+{
+ rc_style *ret=malloc(sizeof(rc_style));
+ /*initially, no bits have to be reset*/
+ ret->and=-1;
+ /*initially, no bits are set*/
+ ret->or=0;
+ return ret;
+}
+
+/* entries are inserted at the beginning, starting from the last one */
+gen_res* add_accelerator(int ev, int id, int flags, gen_res* prev)
+{
+ char accel_entry[5];
+ if(prev->num_entries==0)flags|=0x80; /* last entry */
+ accel_entry[0]=flags;
+ put_WORD(accel_entry+1,ev);
+ put_WORD(accel_entry+3,id);
+ return insert_at_beginning(prev,accel_entry,5);
+}
+
+
+/* create an integer from the event, taking things as "^c" into account
+ add this as new entry */
+gen_res* add_string_accelerator(char *ev, int id, int flags, gen_res* prev)
+{
+ int event;
+ if(*ev=='^')
+ event=ev[1]-'a';
+ else
+ event=ev[0];
+ return add_accelerator(event,id,flags,prev);
+}
+
+/*is there a difference between ASCII and VIRTKEY accelerators? */
+
+gen_res* add_ascii_accelerator(int ev, int id, int flags, gen_res* prev)
+{
+ return add_accelerator(ev,id,flags,prev);
+}
+
+gen_res* add_vk_accelerator(int ev, int id, int flags, gen_res* prev)
+{
+ return add_accelerator(ev,id,flags,prev);
+}
+
+/* create a new dialog header, set all items to 0 */
+gen_res* new_dialog()
+{ gen_res* ret=new_res();
+ ret->size=16; /*all strings "\0", no font*/
+ return ret;
+}
+
+/* the STYLE option was specified */
+gen_res* dialog_style(rc_style* style, gen_res* attr)
+{
+ /* default dialog styles? Do we need style->and? */
+ /* DS_SETFONT might have been specified before */
+ put_DWORD(attr->res,get_DWORD(attr->res)|style->or);
+ return attr;
+}
+
+/* menu name is at offset 13 */
+int dialog_get_menu(gen_res* attr)
+{
+ return 13;
+}
+
+/* the class is after the menu name */
+int dialog_get_class(gen_res* attr)
+{
+ int offs=dialog_get_menu(attr);
+ while(attr->res[offs])offs++;
+ offs++;
+ return offs;
+}
+
+/* the caption is after the class */
+int dialog_get_caption(gen_res* attr)
+{
+ int offs=dialog_get_class(attr);
+ while(attr->res[offs])offs++;
+ offs++;
+ return offs;
+}
+
+/* the fontsize, if present, is after the caption, followed by the font name */
+int dialog_get_fontsize(gen_res* attr)
+{
+ int offs=dialog_get_caption(attr);
+ while(attr->res[offs])offs++;
+ offs++;
+ return offs;
+}
+
+
+/* the CAPTION option was specified */
+gen_res* dialog_caption(char* cap, gen_res*attr)
+{
+ /* we don't need the terminating 0 as it's already there */
+ return insert_bytes(attr,cap,dialog_get_caption(attr),strlen(cap));
+}
+
+
+/* the FONT option was specified, set the DS_SETFONT flag */
+gen_res* dialog_font(short size,char* font,gen_res *attr)
+{
+ char c_size[2];
+ int offs=dialog_get_fontsize(attr);
+ put_DWORD(attr->res,get_DWORD(attr->res)|DS_SETFONT);
+ put_WORD(c_size,size);
+ attr=insert_bytes(attr,c_size,offs,2);
+ offs+=2;
+ /* as there is no font name by default, copy the '\0' */
+ return insert_bytes(attr,font,offs,strlen(font)+1);
+}
+
+gen_res* dialog_class(char* cap, gen_res*attr)
+{
+ return insert_bytes(attr,cap,dialog_get_class(attr),strlen(cap));
+}
+
+gen_res* dialog_menu(char* cap, gen_res*attr)
+{
+ return insert_bytes(attr,cap,dialog_get_menu(attr),strlen(cap));
+}
+
+/* set the dialogs id, position, extent, and style */
+gen_res* create_control_desc(int id,int x,int y,int cx, int cy,rc_style *style)
+{ gen_res* ret=new_res();
+ int s=WS_VISIBLE|WS_CHILD; /*defaults styles for any control*/
+ put_WORD(ret->res+0,x);
+ put_WORD(ret->res+2,y);
+ put_WORD(ret->res+4,cx);
+ put_WORD(ret->res+6,cy);
+ put_WORD(ret->res+8,id);
+ if(style)s=(s|style->or)&style->and;
+ put_DWORD(ret->res+10,s);
+ ret->size=17; /*empty strings, unused byte*/
+ return ret;
+}
+
+/* insert the control's label */
+gen_res* label_control_desc(char* label,gen_res* cd)
+{
+ int offs;
+ if(cd->res[14]&0x80)offs=15; /* one-character class */
+ else {
+ for(offs=14;cd->res[offs];offs++);
+ offs++;
+ }
+ return insert_bytes(cd,label,offs,strlen(label));
+}
+
+/* a CONTROL was specified */
+gen_res* create_generic_control(char* label,int id,char* class,
+ rc_style*style,int x,int y,int cx,int cy)
+{ char cl;
+ gen_res* ret=new_res();
+ put_WORD(ret->res+0,x);
+ put_WORD(ret->res+2,y);
+ put_WORD(ret->res+4,cx);
+ put_WORD(ret->res+6,cy);
+ put_WORD(ret->res+8,id);
+ put_DWORD(ret->res+10,style->or);
+ ret->size=17;
+ ret=insert_bytes(ret,label,15,strlen(label));
+ /* is it a predefined class? */
+ cl=0;
+ if(!strcmp(class,"BUTTON"))cl=CT_BUTTON;
+ if(!strcmp(class,"EDIT"))cl=CT_EDIT;
+ if(!strcmp(class,"STATIC"))cl=CT_STATIC;
+ if(!strcmp(class,"LISTBOX"))cl=CT_LISTBOX;
+ if(!strcmp(class,"SCROLLBAR"))cl=CT_SCROLLBAR;
+ if(!strcmp(class,"COMBOBOX"))cl=CT_COMBOBOX;
+ if(cl)ret->res[14]=cl;
+ else ret=insert_bytes(ret,class,14,strlen(class));
+ return ret;
+}
+
+/* insert cd into rest, set the type, add flags */
+gen_res* add_control(int type,int flags,gen_res*cd,gen_res* rest)
+{
+ put_DWORD(cd->res+10,get_DWORD(cd->res+10)|flags);
+ cd->res[14]=type;
+ return insert_at_beginning(rest,cd->res,cd->size);
+}
+
+/* an ICON control was specified, whf contains width, height, and flags */
+gen_res* add_icon(char* name,int id,int x,int y,gen_res* whf,gen_res* rest)
+{
+ put_WORD(whf->res+0,x);
+ put_WORD(whf->res+2,y);
+ put_WORD(whf->res+8,id);
+ whf=label_control_desc(name,whf);
+ return add_control(CT_STATIC,SS_ICON,whf,rest);
+}
+
+/* insert the generic control into rest */
+gen_res* add_generic_control(gen_res* ctl, gen_res* rest)
+{
+ return insert_at_beginning(rest,ctl->res,ctl->size);
+}
+
+/* create a dialog resource by inserting the header into the controls.
+ Set position and extent */
+gen_res* make_dialog(gen_res* header,int x,int y,int cx,int cy,gen_res* ctls)
+{
+ header->res[4]=ctls->num_entries;
+ header->type=dlg;
+ put_WORD(header->res+5,x);
+ put_WORD(header->res+7,y);
+ put_WORD(header->res+9,cx);
+ put_WORD(header->res+11,cy);
+ return insert_bytes(header,ctls->res,header->size,ctls->size);
+}
+
+/* create {0x15,0x16,0xFF} from '15 16 FF' */
+gen_res *hex_to_raw(char *hex, gen_res*rest)
+{
+ char r2[16];
+ int i;
+ for(i=0;*hex!='\'';i++)r2[i]=strtoul(hex,&hex,16);
+ return insert_bytes(rest,r2,0,i);
+}
+
+/* create a bitmap resource */
+gen_res *make_bitmap(gen_res* res)
+{
+ res=delete_bytes(res,0,14); /* skip bitmap file header*/
+ res->type=bmp;
+ return res;
+}
+
+gen_res *make_icon(gen_res* res)
+{
+ res->type=ico;
+ return res;
+}
+
+gen_res *make_cursor(gen_res* res)
+{
+ res->type=cur;
+ return res;
+}
+
+/* load resource bytes from the file name */
+gen_res *load_file(char* name)
+{
+ gen_res *res;
+ struct stat st;
+ int f=open(name,O_RDONLY);
+ if(!f)perror(name);
+ fstat(f,&st);
+ res=new_res();
+ while(res->space<st.st_size)res=grow(res);
+ read(f,res->res,st.st_size);
+ res->size=st.st_size;
+ close(f);
+ return res;
+}
+
+/* insert a normal menu item into res, starting from the last item */
+gen_res *add_menuitem(char* name,int id,int flags,gen_res *res)
+{
+ char item[4];
+ if(res->num_entries==0)flags|=MF_END;
+ put_WORD(item,flags);
+ put_WORD(item+2,id);
+ res=insert_at_beginning(res,name,strlen(name)+1);
+ res=insert_bytes(res,item,0,4);
+ return res;
+}
+
+/* insert a popup item into res */
+gen_res *add_popup(char *name,short flags, gen_res* body, gen_res*res)
+{
+ char c_flags[2];
+ if(res->num_entries==0)flags|=MF_END;
+ put_WORD(c_flags,flags);
+ res=insert_at_beginning(res,body->res,body->size);
+ res=insert_bytes(res,name,0,strlen(name)+1);
+ res=insert_bytes(res,c_flags,0,2);
+ return res;
+}
+
+/* prefix the menu header into res */
+gen_res *make_menu(gen_res* res)
+{
+ static char header[4]={0,0,0,0};
+ res=insert_at_beginning(res,header,4);
+ res->type=men;
+ return res;
+}
+
+/* link top-level resources */
+gen_res *add_resource(gen_res* first,gen_res *rest)
+{
+ first->next=rest;
+ return first;
+}
+
+char *get_typename(gen_res* t)
+{
+ switch(t->type){
+ case acc:return "ACCELERATOR";
+ case bmp:return "BITMAP";
+ case cur:return "CURSOR";
+ case dlg:return "DIALOG";
+ case fnt:return "FONT";
+ case ico:return "ICON";
+ case men:return "MENU";
+ case rdt:return "RCDATA";
+ case str:return "STRINGTABLE";
+ default: return "UNKNOWN";
+ }
+}
+
+/* create strings like _Sysres_DIALOG_2 */
+char *get_resource_name(gen_res*it)
+{
+ static char buf[1000];
+ if(it->n_type)
+ sprintf(buf,"%s_%s_%s",prefix,get_typename(it),it->n.s_name);
+ else
+ sprintf(buf,"%s_%s_%d",prefix,get_typename(it),it->n.i_name);
+ return buf;
+}
+
+/* create the final output */
+void create_output(gen_res* top)
+{
+ gen_res *it;
+ /* print the type */
+ printf("struct ResourceTable{\n\tint id,type;\n\t"
+ "char *name;\n\tconst unsigned char* value;\n};\n\n");
+ /* declare the resources */
+ for(it=top;it;it=it->next)
+ printf("const unsigned char %s[];\n",get_resource_name(it));
+
+ /* print the resource table (0 terminated) */
+ printf("\nconst struct ResourceTable %sTable[]={\n",prefix);
+ for(it=top;it;it=it->next)
+ { int type;
+ switch(it->type)
+ {case acc:type=NE_RSCTYPE_ACCELERATOR;break;
+ case bmp:type=NE_RSCTYPE_BITMAP;break;
+ case cur:type=NE_RSCTYPE_CURSOR;break;
+ case dlg:type=NE_RSCTYPE_DIALOG;break;
+ case fnt:type=NE_RSCTYPE_FONT;break;
+ case ico:type=NE_RSCTYPE_ICON;break;
+ case men:type=NE_RSCTYPE_MENU;break;
+ case rdt:type=NE_RSCTYPE_RCDATA;break;
+ case str:type=NE_RSCTYPE_STRING;break;
+ default:fprintf(stderr,"Unknown restype\n");type=-1;break;
+ }
+ if(it->n_type)
+ printf("{0,%d,\"%s\",%s},\n",
+ type,it->n.s_name,get_resource_name(it));
+ else
+ printf("{%d,%d,\"@%d\",%s},\n",
+ it->n.i_name,type,it->n.i_name,get_resource_name(it));
+ }
+ printf("{0,0,0,0}};\n\n");
+
+ /* print the resources */
+ for(it=top;it;it=it->next)
+ { int i;
+ printf("const unsigned char %s[]={\n",get_resource_name(it));
+ for(i=0;i<it->size-1;i++)
+ {
+ printf("%#4x,",it->res[i]);
+ if((i&7)==7)putchar('\n');
+ }
+ printf("%#4x};\n",it->res[i]);
+ }
+}
+
+void make_font()
+{
+ fprintf(stderr,"Fonts not supported\n");
+}
+
+void make_raw()
+{
+ fprintf(stderr,"RCData not supported\n");
+}
+
+void int_to_raw()
+{
+ fprintf(stderr,"IntToRaw not supported\n");
+}
+
+/* translate "Hello,\\tworld!\\10" to "Hello,\tworld!\n" */
+char *parse_c_string(char *in)
+{
+ char *out=malloc(strlen(in)-1);
+ char *it;
+ char tmp[5],*tend;
+ for(it=out,in++;*in;in++)
+ if(*in=='\\')
+ switch(*++in)
+ {case 't':*it++='\t';break;
+ case 'r':*it++='\r';break;
+ case 'n':*it++='\n';break;
+ case 'a':*it++='\a';break;
+ case '0':
+ memset(tmp,0,5);/*make sure it doesn't use more than 4 chars*/
+ memcpy(tmp,in,4);
+ *it++=strtoul(tmp,&tend,0);
+ in+=tend-tmp-1;
+ break;
+ case '1':case '2':case '3':case '4':case '5':
+ case '6':case '7':case '8':case '9':
+ memset(tmp,0,5);
+ memcpy(tmp,in,3);
+ *it++=strtoul(tmp,&tend,10);
+ in+=tend-tmp-1;
+ break;
+ case 'x':
+ memset(tmp,0,5);
+ memcpy(tmp,++in,2);
+ *it++=strtoul(tmp,&tend,16);
+ in+=tend-tmp-1;
+ break;
+ default:*it++=*in;
+ }
+ else
+ *it++=*in;
+ *(it-1)='\0';
+ return out;
+}
diff --git a/tools/build.c b/tools/build.c
index 160d0fb..b375036 100644
--- a/tools/build.c
+++ b/tools/build.c
@@ -14,6 +14,13 @@
#define UTEXTSEL 0x1f
#endif
+/* ELF symbols do not have an underscore in front */
+#ifdef __ELF__
+#define PREFIX
+#else
+#define PREFIX "_"
+#endif
+
#define VARTYPE_BYTE 0
#define VARTYPE_SIGNEDWORD 0
#define VARTYPE_WORD 1
@@ -671,7 +678,7 @@
ORDVARDEF *vdp;
int i;
- fprintf(fp, "_%s_Ordinal_%d:\n", UpperDLLName, i);
+ fprintf(fp, PREFIX "%s_Ordinal_%d:\n", UpperDLLName, i);
vdp = odp->additional_data;
for (i = 0; i < vdp->n_values; i++)
@@ -752,31 +759,31 @@
sprintf(filename, "dll_%s.S", LowerDLLName);
fp = fopen(filename, "w");
- fprintf(fp, "\t.globl _%s_Dispatch\n", UpperDLLName);
- fprintf(fp, "_%s_Dispatch:\n", UpperDLLName);
+ fprintf(fp, "\t.globl " PREFIX "%s_Dispatch\n", UpperDLLName);
+ fprintf(fp, PREFIX "%s_Dispatch:\n", UpperDLLName);
fprintf(fp, "\tandl\t$0x0000ffff,%%esp\n");
fprintf(fp, "\tandl\t$0x0000ffff,%%ebp\n");
fprintf(fp, "\torl\t$0x%08x,%%eax\n", DLLId << 16);
- fprintf(fp, "\tjmp\t_CallTo32\n\n");
+ fprintf(fp, "\tjmp\t" PREFIX "CallTo32\n\n");
- fprintf(fp, "\t.globl _%s_Dispatch_16\n", UpperDLLName);
- fprintf(fp, "_%s_Dispatch_16:\n", UpperDLLName);
+ fprintf(fp, "\t.globl " PREFIX "%s_Dispatch_16\n", UpperDLLName);
+ fprintf(fp, PREFIX "%s_Dispatch_16:\n", UpperDLLName);
fprintf(fp, "\tandl\t$0x0000ffff,%%esp\n");
fprintf(fp, "\tandl\t$0x0000ffff,%%ebp\n");
fprintf(fp, "\torl\t$0x%08x,%%eax\n", DLLId << 16);
- fprintf(fp, "\tjmp\t_CallTo32_16\n\n");
+ fprintf(fp, "\tjmp\t" PREFIX "CallTo32_16\n\n");
odp = OrdinalDefinitions;
for (i = 0; i <= Limit; i++, odp++)
{
- fprintf(fp, "\t.globl _%s_Ordinal_%d\n", UpperDLLName, i);
+ fprintf(fp, "\t.globl " PREFIX "%s_Ordinal_%d\n", UpperDLLName, i);
if (!odp->valid)
{
- fprintf(fp, "_%s_Ordinal_%d:\n", UpperDLLName, i);
+ fprintf(fp, PREFIX "%s_Ordinal_%d:\n", UpperDLLName, i);
fprintf(fp, "\tmovl\t$%d,%%eax\n", i);
fprintf(fp, "\tpushw\t$0\n");
- fprintf(fp, "\tjmp\t_%s_Dispatch\n\n", UpperDLLName);
+ fprintf(fp, "\tjmp\t" PREFIX "%s_Dispatch\n\n", UpperDLLName);
}
else
{
@@ -786,7 +793,7 @@
switch (odp->type)
{
case EQUATETYPE_ABS:
- fprintf(fp, "_%s_Ordinal_%d = %d\n\n",
+ fprintf(fp, PREFIX "%s_Ordinal_%d = %d\n\n",
UpperDLLName, i, (int) odp->additional_data);
break;
@@ -803,7 +810,7 @@
break;
case TYPE_RETURN:
- fprintf(fp, "_%s_Ordinal_%d:\n", UpperDLLName, i);
+ fprintf(fp, PREFIX "%s_Ordinal_%d:\n", UpperDLLName, i);
fprintf(fp, "\tmovw\t$%d,%%ax\n", rdp->ret_value & 0xffff);
fprintf(fp, "\tmovw\t$%d,%%dx\n",
(rdp->ret_value >> 16) & 0xffff);
@@ -815,7 +822,7 @@
break;
case FUNCTYPE_REG:
- fprintf(fp, "_%s_Ordinal_%d:\n", UpperDLLName, i);
+ fprintf(fp, PREFIX "%s_Ordinal_%d:\n", UpperDLLName, i);
fprintf(fp, "\tandl\t$0x0000ffff,%%esp\n");
fprintf(fp, "\tandl\t$0x0000ffff,%%ebp\n");
@@ -830,29 +837,29 @@
fprintf(fp, "\tmovl\t$%d,%%eax\n", i);
fprintf(fp, "\tpushw\t$%d\n",
sizeof(struct sigcontext_struct) + 4);
- fprintf(fp, "\tjmp\t_%s_Dispatch\n\n", UpperDLLName);
+ fprintf(fp, "\tjmp\t" PREFIX "%s_Dispatch\n\n", UpperDLLName);
break;
case FUNCTYPE_PASCAL:
- fprintf(fp, "_%s_Ordinal_%d:\n", UpperDLLName, i);
+ fprintf(fp, PREFIX "%s_Ordinal_%d:\n", UpperDLLName, i);
fprintf(fp, "\tmovl\t$%d,%%eax\n", i);
fprintf(fp, "\tpushw\t$%d\n", fdp->arg_16_size);
- fprintf(fp, "\tjmp\t_%s_Dispatch\n\n", UpperDLLName);
+ fprintf(fp, "\tjmp\t" PREFIX "%s_Dispatch\n\n", UpperDLLName);
break;
case FUNCTYPE_PASCAL_16:
- fprintf(fp, "_%s_Ordinal_%d:\n", UpperDLLName, i);
+ fprintf(fp, PREFIX "%s_Ordinal_%d:\n", UpperDLLName, i);
fprintf(fp, "\tmovl\t$%d,%%eax\n", i);
fprintf(fp, "\tpushw\t$%d\n", fdp->arg_16_size);
- fprintf(fp, "\tjmp\t_%s_Dispatch_16\n\n", UpperDLLName);
+ fprintf(fp, "\tjmp\t" PREFIX "%s_Dispatch_16\n\n", UpperDLLName);
break;
case FUNCTYPE_C:
default:
- fprintf(fp, "_%s_Ordinal_%d:\n", UpperDLLName, i);
+ fprintf(fp, PREFIX "%s_Ordinal_%d:\n", UpperDLLName, i);
fprintf(fp, "\tmovl\t$%d,%%eax\n", i);
fprintf(fp, "\tpushw\t$0\n");
- fprintf(fp, "\tjmp\t_%s_Dispatch\n\n", UpperDLLName);
+ fprintf(fp, "\tjmp\t" PREFIX "%s_Dispatch\n\n", UpperDLLName);
break;
}
}
diff --git a/tools/make_debug b/tools/make_debug
index 09a63f9..1d0ee5a 100755
--- a/tools/make_debug
+++ b/tools/make_debug
@@ -9,8 +9,8 @@
#
makedepend -s"# /* Do not remove this line or change anything below this line */" -finclude/debug.h
echo " " >> include/debug.h
-grep -h dprintf_ */*.c | tr -d '[:blank:]' | cut -d"(" -f1 | sort | uniq | \
- cut -d"_" -f2 > temp.$$
+grep -h dprintf_ */*.c | tr -d '[:blank:]' | cut -d"(" -f1 | \
+ cut -d"_" -f2 | sort | uniq > temp.$$
echo " " >> include/debug.h
echo "#ifdef DEBUG_NONE_EXT" >> include/debug.h
cat temp.$$ |
diff --git a/windows/caret.c b/windows/caret.c
index ae835b4..f567fc3 100644
--- a/windows/caret.c
+++ b/windows/caret.c
@@ -8,8 +8,8 @@
#include "windows.h"
#include "stddebug.h"
-/* #define DEBUG_CARET /* */
-/* #undef DEBUG_CARET /* */
+/* #define DEBUG_CARET */
+/* #undef DEBUG_CARET */
#include "debug.h"
@@ -167,10 +167,6 @@
void SetCaretPos(short x, short y)
{
- HDC hdc;
- HBRUSH hBrush;
- HRGN rgn;
-
if (!Caret.hwnd) return;
dprintf_caret(stddeb,"SetCaretPos: x=%d, y=%d\n", x, y);
@@ -237,8 +233,7 @@
WORD GetCaretBlinkTime()
{
- if (!Caret.hwnd) return;
-
+ if (!Caret.hwnd) return 0;
return Caret.timeout;
}
diff --git a/windows/class.c b/windows/class.c
index 639d2da..5999d69 100644
--- a/windows/class.c
+++ b/windows/class.c
@@ -14,8 +14,8 @@
#include "win.h"
#include "dce.h"
#include "stddebug.h"
-/* #define DEBUG_CLASS /* */
-/* #undef DEBUG_CLASS /* */
+/* #define DEBUG_CLASS */
+/* #undef DEBUG_CLASS */
#include "debug.h"
@@ -95,7 +95,7 @@
HCLASS handle, prevClass;
int classExtra;
- dprintf_class(stddeb, "RegisterClass: wndproc=%08x hinst=%d name='%s' background %x\n",
+ dprintf_class(stddeb, "RegisterClass: wndproc=%p hinst=%d name='%s' background %x\n",
class->lpfnWndProc, class->hInstance, class->lpszClassName,
class->hbrBackground );
diff --git a/windows/cursor.c b/windows/cursor.c
index 1c866d1..ec9fadd 100644
--- a/windows/cursor.c
+++ b/windows/cursor.c
@@ -19,10 +19,10 @@
#include "wine.h"
#include "cursor.h"
#include "stddebug.h"
-/* #define DEBUG_CURSOR /* */
-/* #undef DEBUG_CURSOR /* */
-/* #define DEBUG_RESOURCE /* */
-/* #undef DEBUG_RESOURCE /* */
+/* #define DEBUG_CURSOR */
+/* #undef DEBUG_CURSOR */
+/* #define DEBUG_RESOURCE */
+/* #undef DEBUG_RESOURCE */
#include "debug.h"
static int ShowCursCount = 0;
@@ -65,7 +65,7 @@
HDC hdc;
int i, j, image_size;
- dprintf_resource(stddeb,"LoadCursor: instance = %04x, name = %08x\n",
+ dprintf_resource(stddeb,"LoadCursor: instance = %04x, name = %p\n",
instance, cursor_name);
if (!instance)
{
@@ -132,7 +132,7 @@
rsc_mem = RSC_LoadResource(instance, cursor_name, NE_RSCTYPE_GROUP_CURSOR,
&image_size);
if (rsc_mem == (HANDLE)NULL) {
- fprintf(stderr,"LoadCursor / Cursor %08X not Found !\n", cursor_name);
+ fprintf(stderr,"LoadCursor / Cursor %p not Found !\n", cursor_name);
ReleaseDC(GetDesktopWindow(), hdc);
return 0;
}
@@ -167,7 +167,7 @@
NE_RSCTYPE_CURSOR, &image_size);
if (rsc_mem == (HANDLE)NULL) {
fprintf(stderr,
- "LoadCursor / Cursor %08X Bitmap not Found !\n", cursor_name);
+ "LoadCursor / Cursor %p Bitmap not Found !\n", cursor_name);
ReleaseDC(GetDesktopWindow(), hdc);
return 0;
}
@@ -240,14 +240,11 @@
XColor fgcolor;
HCURSOR hCursor;
CURSORALLOC *lpcur;
- BITMAP BitMap;
- HBITMAP hBitMap;
- HDC hMemDC;
HDC hdc;
dprintf_resource(stddeb,"CreateCursor: inst=%04x nXhotspot=%d nYhotspot=%d nWidth=%d nHeight=%d\n",
instance, nXhotspot, nYhotspot, nWidth, nHeight);
- dprintf_resource(stddeb,"CreateCursor: inst=%04x lpANDbitPlane=%08X lpXORbitPlane=%08X\n",
+ dprintf_resource(stddeb,"CreateCursor: inst=%04x lpANDbitPlane=%p lpXORbitPlane=%p\n",
instance, lpANDbitPlane, lpXORbitPlane);
if (!(hdc = GetDC(GetDesktopWindow()))) return 0;
@@ -308,7 +305,7 @@
*
* Internal helper function for SetCursor() and ShowCursor().
*/
-static BOOL CURSOR_SetCursor( HCURSOR hCursor )
+static void CURSOR_SetCursor( HCURSOR hCursor )
{
CURSORALLOC *lpcur;
@@ -397,8 +394,6 @@
*/
int ShowCursor(BOOL bShow)
{
- HCURSOR hCursor;
-
dprintf_cursor(stddeb, "ShowCursor(%d), count=%d\n", bShow, ShowCursCount);
if (bShow)
diff --git a/windows/dce.c b/windows/dce.c
index 4508fcb..9ddc1f4 100644
--- a/windows/dce.c
+++ b/windows/dce.c
@@ -13,8 +13,8 @@
#include "user.h"
#include "sysmetrics.h"
#include "stddebug.h"
-/* #define DEBUG_DC /* */
-/* #undef DEBUG_DC /* */
+/* #define DEBUG_DC */
+/* #undef DEBUG_DC */
#include "debug.h"
@@ -264,8 +264,6 @@
{
dc->w.DCOrgX = 0;
dc->w.DCOrgY = 0;
- dc->w.DCSizeX = SYSMETRICS_CXSCREEN;
- dc->w.DCSizeY = SYSMETRICS_CYSCREEN;
dc->u.x.drawable = rootWindow;
XSetSubwindowMode( display, dc->u.x.gc, IncludeInferiors );
}
@@ -275,15 +273,11 @@
{
dc->w.DCOrgX = wndPtr->rectWindow.left;
dc->w.DCOrgY = wndPtr->rectWindow.top;
- dc->w.DCSizeX = wndPtr->rectWindow.right - wndPtr->rectWindow.left;
- dc->w.DCSizeY = wndPtr->rectWindow.bottom - wndPtr->rectWindow.top;
}
else
{
dc->w.DCOrgX = wndPtr->rectClient.left;
dc->w.DCOrgY = wndPtr->rectClient.top;
- dc->w.DCSizeX = wndPtr->rectClient.right - wndPtr->rectClient.left;
- dc->w.DCSizeY = wndPtr->rectClient.bottom - wndPtr->rectClient.top;
}
while (!wndPtr->window)
{
@@ -338,8 +332,8 @@
/* Can only use PARENTCLIP on child windows */
if (!wndPtr || !(wndPtr->dwStyle & WS_CHILD)) flags &= ~DCX_PARENTCLIP;
- /* Whole window DC implies children are not clipped */
- if (flags & DCX_WINDOW) flags &= ~DCX_CLIPCHILDREN;
+ /* Whole window DC implies using cache DC and not clipping children */
+ if (flags & DCX_WINDOW) flags = (flags & ~DCX_CLIPCHILDREN) | DCX_CACHE;
if (flags & DCX_CACHE)
{
@@ -402,7 +396,7 @@
SelectVisRgn( hdc, hrgnVisible );
DeleteObject( hrgnVisible );
- dprintf_dc(stddeb, "GetDCEx(%d,%d,0x%x): returning %d\n",
+ dprintf_dc(stddeb, "GetDCEx(%d,%d,0x%lx): returning %d\n",
hwnd, hrgnClip, flags, hdc);
return hdc;
}
diff --git a/windows/defwnd.c b/windows/defwnd.c
index 501ad78..2022e635 100644
--- a/windows/defwnd.c
+++ b/windows/defwnd.c
@@ -84,7 +84,6 @@
case WM_NCPAINT:
return NC_HandleNCPaint( hwnd, (HRGN)wParam );
-
case WM_NCHITTEST:
return NC_HandleNCHitTest( hwnd, MAKEPOINT(lParam) );
@@ -239,7 +238,11 @@
case WM_SYSKEYDOWN:
if (wParam == VK_MENU)
- SendMessage( hwnd, WM_SYSCOMMAND, SC_KEYMENU, 0L );
+ { /* Send to WS_OVERLAPPED parent. TODO: Handle MDI */
+ HWND top;
+ for(top=hwnd;GetParent(top)!=0;top=GetParent(top));
+ SendMessage( top, WM_SYSCOMMAND, SC_KEYMENU, 0L );
+ }
break;
case WM_SYSKEYUP:
diff --git a/windows/dialog.c b/windows/dialog.c
index fed61e0..688f560 100644
--- a/windows/dialog.c
+++ b/windows/dialog.c
@@ -17,8 +17,8 @@
#include "message.h"
#include "heap.h"
#include "stddebug.h"
-/* #define DEBUG_DIALOG /* */
-/* #undef DEBUG_DIALOG /* */
+/* #define DEBUG_DIALOG */
+/* #undef DEBUG_DIALOG */
#include "debug.h"
@@ -189,7 +189,7 @@
HANDLE hres, hmem;
LPCSTR data;
- dprintf_dialog(stddeb, "CreateDialogParam: %d,'%x',%d,%p,%d\n",
+ dprintf_dialog(stddeb, "CreateDialogParam: %d,'%p',%d,%p,%ld\n",
hInst, dlgTemplate, owner, dlgProc, param );
/* FIXME: MAKEINTRESOURCE should be replaced by RT_DIALOG */
@@ -231,8 +231,6 @@
DWORD exStyle = 0;
WORD xUnit = xBaseUnit;
WORD yUnit = yBaseUnit;
- void *dlgHeapBase;
- MDESC *dlgHeap;
/* Parse dialog template */
@@ -326,7 +324,7 @@
dprintf_dialog(stddeb,"'%s'", text);
else
dprintf_dialog(stddeb,"%4X", (int)text & 0xffff);
- dprintf_dialog(stddeb," %d, %d, %d, %d, %d, %08x\n",
+ dprintf_dialog(stddeb," %d, %d, %d, %d, %d, %08lx\n",
header->id, header->x, header->y,
header->cx, header->cy, header->style );
@@ -335,12 +333,10 @@
if (!dlgInfo->hDialogHeap) {
dlgInfo->hDialogHeap = GlobalAlloc(GMEM_FIXED, 0x10000);
if (!dlgInfo->hDialogHeap) {
- fprintf(stderr,"CreateDialogIndirectParam: Insufficient memory ",
- "to create heap for edit control\n");
+ fprintf(stderr,"CreateDialogIndirectParam: Insufficient memory to create heap for edit control\n");
continue;
}
- dlgHeapBase = GlobalLock(dlgInfo->hDialogHeap);
- HEAP_Init(dlgHeapBase,dlgHeapBase+sizeof(char*), 0x10000-sizeof(char*));
+ HEAP_LocalInit(dlgInfo->hDialogHeap, GlobalLock(dlgInfo->hDialogHeap), 0x10000);
}
header->style |= WS_CHILD;
hwndCtrl = CreateWindowEx( WS_EX_NOPARENTNOTIFY,
diff --git a/windows/event.c b/windows/event.c
index 9da6617..b1efb40 100644
--- a/windows/event.c
+++ b/windows/event.c
@@ -11,6 +11,7 @@
#include <X11/Xlib.h>
#include <X11/Xresource.h>
#include <X11/Xutil.h>
+#include <X11/Xatom.h>
#include "windows.h"
#include "win.h"
@@ -140,6 +141,9 @@
static void EVENT_FocusOut( HWND hwnd, XFocusChangeEvent *event );
static void EVENT_Expose( HWND hwnd, XExposeEvent *event );
static void EVENT_ConfigureNotify( HWND hwnd, XConfigureEvent *event );
+static void EVENT_SelectionRequest( HWND hwnd, XSelectionRequestEvent *event);
+static void EVENT_SelectionNotify( HWND hwnd, XSelectionEvent *event);
+static void EVENT_SelectionClear( HWND hwnd, XSelectionClearEvent *event);
/***********************************************************************
@@ -199,6 +203,18 @@
EVENT_ConfigureNotify( hwnd, (XConfigureEvent*)event );
break;
+ case SelectionRequest:
+ EVENT_SelectionRequest( hwnd, (XSelectionRequestEvent*)event );
+ break;
+
+ case SelectionNotify:
+ EVENT_SelectionNotify( hwnd, (XSelectionEvent*)event );
+ break;
+
+ case SelectionClear:
+ EVENT_SelectionClear( hwnd, (XSelectionClearEvent*) event );
+ break;
+
default:
dprintf_event(stddeb, "Unprocessed event %s for hwnd %d\n",
event_names[event->type], hwnd );
@@ -444,6 +460,65 @@
}
+/***********************************************************************
+ * EVENT_SelectionRequest
+ */
+static void EVENT_SelectionRequest( HWND hwnd, XSelectionRequestEvent *event )
+{
+ XSelectionEvent result;
+ Atom rprop;
+ Window request=event->requestor;
+ rprop=None;
+ if(event->target == XA_STRING)
+ {
+ HANDLE hText;
+ LPSTR text;
+ rprop=event->property;
+ if(rprop == None)rprop=event->target;
+ if(event->selection!=XA_PRIMARY)rprop=None;
+ else if(!IsClipboardFormatAvailable(CF_TEXT))rprop=None;
+ else{
+ /* don't open the clipboard, just get the data */
+ hText=GetClipboardData(CF_TEXT);
+ text=GlobalLock(hText);
+ XChangeProperty(display,request,rprop,XA_STRING,
+ 8,PropModeReplace,text,strlen(text));
+ GlobalUnlock(hText);
+ }
+ }
+ if(rprop==None) dprintf_event(stddeb,"Request for %s ignored\n",
+ XGetAtomName(display,event->target));
+ result.type=SelectionNotify;
+ result.display=display;
+ result.requestor=request;
+ result.selection=event->selection;
+ result.property=rprop;
+ result.target=event->target;
+ result.time=event->time;
+ XSendEvent(display,event->requestor,False,NoEventMask,(XEvent*)&result);
+}
+
+
+/***********************************************************************
+ * EVENT_SelectionNotify
+ */
+static void EVENT_SelectionNotify(HWND hwnd, XSelectionEvent *event)
+{
+ if(event->selection!=XA_PRIMARY)return;
+ if(event->target!=XA_STRING)CLIPBOARD_ReadSelection(0,None);
+ CLIPBOARD_ReadSelection(event->requestor,event->property);
+}
+
+
+/***********************************************************************
+ * EVENT_SelectionClear
+ */
+static void EVENT_SelectionClear(HWND hwnd, XSelectionClearEvent *event)
+{
+ if(event->selection!=XA_PRIMARY)return;
+ CLIPBOARD_ReleaseSelection();
+}
+
/**********************************************************************
* SetCapture (USER.18)
*/
diff --git a/windows/graphics.c b/windows/graphics.c
index 4f69b02..500f4a1 100644
--- a/windows/graphics.c
+++ b/windows/graphics.c
@@ -318,10 +318,8 @@
ell_width, ell_height);
return TRUE;
}
-/*
- printf("RoundRect(%d %d %d %d %d %d\n",
+ dprintf_graphics(stddeb, "RoundRect(%d %d %d %d %d %d\n",
left, top, right, bottom, ell_width, ell_height);
-*/
x1 = XLPTODP(dc, left);
y1 = YLPTODP(dc, top);
x2 = XLPTODP(dc, right - ell_width);
@@ -518,19 +516,15 @@
/* Modify visible region */
- prevVisRgn = SaveVisRgn( hdc );
- if (prevVisRgn)
+ if (!(prevVisRgn = SaveVisRgn( hdc ))) return FALSE;
+ if (!(tmpVisRgn = CreateRectRgn( 0, 0, 0, 0 )))
{
- if (!(tmpVisRgn = CreateRectRgn( 0, 0, 0, 0 )))
- {
- RestoreVisRgn( hdc );
- return FALSE;
- }
- CombineRgn( tmpVisRgn, prevVisRgn, hrgn, RGN_AND );
- SelectVisRgn( hdc, tmpVisRgn );
- DeleteObject( tmpVisRgn );
+ RestoreVisRgn( hdc );
+ return FALSE;
}
- else SelectVisRgn( hdc, hrgn );
+ CombineRgn( tmpVisRgn, prevVisRgn, hrgn, RGN_AND );
+ SelectVisRgn( hdc, tmpVisRgn );
+ DeleteObject( tmpVisRgn );
/* Fill the region */
@@ -542,8 +536,7 @@
/* Restore the visible region */
- if (prevVisRgn) RestoreVisRgn( hdc );
- else SelectVisRgn( hdc, 0 );
+ RestoreVisRgn( hdc );
return TRUE;
}
diff --git a/windows/message.c b/windows/message.c
index 137ffe0..6a6f90a 100644
--- a/windows/message.c
+++ b/windows/message.c
@@ -641,7 +641,7 @@
* Return TRUE if an event is pending, FALSE on timeout or error
* (for instance lost connection with the server).
*/
-static BOOL MSG_WaitXEvent( LONG maxWait )
+BOOL MSG_WaitXEvent( LONG maxWait )
{
fd_set read_set;
struct timeval timeout;
@@ -854,7 +854,7 @@
/* {
char str[128];
GetWindowText(hwnd, str, sizeof(str));
- printf("BROADCAST GetWindowText()='%s' !\n", str);
+ dprintf_msg(stddeb, "BROADCAST GetWindowText()='%s' !\n", str);
}*/
hwnd = wndPtr->hwndNext;
}
diff --git a/windows/nonclient.c b/windows/nonclient.c
index b0c71ef..e76e79c 100644
--- a/windows/nonclient.c
+++ b/windows/nonclient.c
@@ -112,7 +112,7 @@
style |= WS_CAPTION;
if (exStyle & WS_EX_DLGMODALFRAME) style &= ~WS_THICKFRAME;
- dprintf_nonclient(stddeb, "AdjustWindowRectEx: (%d,%d)-(%d,%d) %08x %d %08x\n",
+ dprintf_nonclient(stddeb, "AdjustWindowRectEx: (%d,%d)-(%d,%d) %08lx %d %08lx\n",
rect->left, rect->top, rect->right, rect->bottom, style, menu, exStyle );
NC_AdjustRect( rect, style, menu, exStyle );
@@ -587,8 +587,6 @@
if (hIcon)
{
SendMessage(hwnd, WM_ICONERASEBKGND, hdc, 0);
- Rectangle(hdc, wndPtr->rectWindow.left, wndPtr->rectWindow.top,
- wndPtr->rectWindow.right, wndPtr->rectWindow.bottom);
DrawIcon(hdc, 0, 0, hIcon);
}
ReleaseDC(hwnd, hdc);
@@ -1265,7 +1263,7 @@
case SC_SCREENSAVE:
if (wParam == SC_ABOUTWINE)
DialogBox( hSysRes, MAKEINTRESOURCE(2),
- hwnd, (FARPROC)AboutWine_Proc );
+ hwnd, (WNDPROC)AboutWine_Proc );
break;
}
return 0;
diff --git a/windows/painting.c b/windows/painting.c
index 878e9d8..f1ffd3f 100644
--- a/windows/painting.c
+++ b/windows/painting.c
@@ -100,14 +100,6 @@
if (!(wndPtr->dwStyle & WS_VISIBLE) || (wndPtr->flags & WIN_NO_REDRAW))
return TRUE; /* No redraw needed */
- /*
- * I can't help but feel that this belongs somewhere upstream...
- *
- * Don't redraw the window if it is iconified and we have an
- * icon to draw for it
- */
-/* if (IsIconic(hwnd) && wndPtr->hIcon) return FALSE; */
-
GetClientRect( hwnd, &rectClient );
rectWindow = wndPtr->rectWindow;
OffsetRect(&rectWindow, -wndPtr->rectClient.left, -wndPtr->rectClient.top);
@@ -240,8 +232,13 @@
DCX_INTERSECTRGN | DCX_USESTYLE );
if (hdc)
{
- SendMessage( hwnd, WM_NCPAINT, wndPtr->hrgnUpdate, 0 );
- SendMessage( hwnd, WM_ERASEBKGND, hdc, 0 );
+ SendMessage( hwnd, WM_NCPAINT, wndPtr->hrgnUpdate, 0 );
+
+ /* Don't send WM_ERASEBKGND to icons */
+ /* (WM_ICONERASEBKGND is sent during processing of WM_NCPAINT) */
+ if (!(wndPtr->dwStyle & WS_MINIMIZE)
+ || !WIN_CLASS_INFO(wndPtr).hIcon)
+ SendMessage( hwnd, WM_ERASEBKGND, hdc, 0 );
ReleaseDC( hwnd, hdc );
}
}
@@ -400,7 +397,7 @@
*/
int ExcludeUpdateRgn( HDC hdc, HWND hwnd )
{
- int retval;
+ int retval = ERROR;
HRGN hrgn;
WND * wndPtr;
@@ -414,3 +411,5 @@
}
return retval;
}
+
+
diff --git a/windows/scroll.c b/windows/scroll.c
index 5afef8e..e472a16 100644
--- a/windows/scroll.c
+++ b/windows/scroll.c
@@ -35,11 +35,11 @@
hdc = GetDC(hwnd);
if (rect == NULL)
- GetWindowRect(hwnd, &rc);
+ GetClientRect(hwnd, &rc);
else
CopyRect(&rc, rect);
if (clipRect == NULL)
- GetWindowRect(hwnd, &cliprc);
+ GetClientRect(hwnd, &cliprc);
else
CopyRect(&cliprc, clipRect);
@@ -143,11 +143,11 @@
hdc = GetDC(hwnd);
if (rect == NULL)
- GetWindowRect(hwnd, &rc);
+ GetClientRect(hwnd, &rc);
else
CopyRect(&rc, rect);
if (clipRect == NULL)
- GetWindowRect(hwnd, &cliprc);
+ GetClientRect(hwnd, &cliprc);
else
CopyRect(&cliprc, clipRect);
diff --git a/windows/win.c b/windows/win.c
index 9e90dcc..10236e0 100644
--- a/windows/win.c
+++ b/windows/win.c
@@ -20,6 +20,7 @@
#include "icon.h"
#include "cursor.h"
#include "stddebug.h"
+#include "callback.h"
/* #define DEBUG_WIN /* */
/* #undef DEBUG_WIN /* */
/* #define DEBUG_MENU /* */
@@ -54,6 +55,7 @@
if (!hwnd) return NULL;
ptr = (WND *) USER_HEAP_ADDR( hwnd );
+ if (IsBadReadPtr(ptr, sizeof *ptr)) return NULL;
if (ptr->dwMagic != WND_MAGIC) return NULL;
return ptr;
}
@@ -153,6 +155,8 @@
if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
if (!(wndPtr->dwStyle & WS_VISIBLE) || (wndPtr->flags & WIN_NO_REDRAW))
continue;
+ if ((wndPtr->dwStyle & WS_MINIMIZE) && (WIN_CLASS_INFO(wndPtr).hIcon))
+ continue;
if (wndPtr->hrgnUpdate || (wndPtr->flags & WIN_INTERNAL_PAINT))
return hwnd;
if (wndPtr->hwndChild)
@@ -253,7 +257,7 @@
wndPtr->ptMaxPos.y = -1;
wndPtr->hmemTaskQ = 0; /* Desktop does not belong to a task */
wndPtr->hrgnUpdate = 0;
- wndPtr->hwndLastActive = 0;
+ wndPtr->hwndLastActive = hwndDesktop;
wndPtr->lpfnWndProc = classPtr->wc.lpfnWndProc;
wndPtr->dwStyle = WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
wndPtr->dwExStyle = 0;
@@ -374,7 +378,7 @@
wndPtr->hmemTaskQ = GetTaskQueue(0);
wndPtr->hrgnUpdate = 0;
wndPtr->hwndPrevActive = 0;
- wndPtr->hwndLastActive = 0;
+ wndPtr->hwndLastActive = hwnd;
wndPtr->lpfnWndProc = classPtr->wc.lpfnWndProc;
wndPtr->dwStyle = style;
wndPtr->dwExStyle = exStyle;
@@ -526,6 +530,8 @@
{
WND * wndPtr;
CLASS * classPtr;
+
+ dprintf_win(stddeb, "DestroyWindow (%04x)\n", hwnd);
/* Initialisation */
@@ -933,6 +939,17 @@
+/*******************************************************************
+ * GetLastActivePopup (USER.287)
+ */
+HWND GetLastActivePopup(HWND hwnd)
+{
+ WND *wndPtr;
+ wndPtr = WIN_FindWndPtr(hwnd);
+ if (wndPtr == NULL) return hwnd;
+ return wndPtr->hwndLastActive;
+}
+
/*******************************************************************
* EnumWindows (USER.54)
@@ -966,7 +983,9 @@
#ifdef WINELIB
(*wndenumprc)(hwnd, lParam);
#else
- result = CallBack16(wndenumprc, 2, lParam, (int) hwnd);
+ result = CallBack16(wndenumprc, 2,
+ CALLBACK_SIZE_WORD, (int) hwnd,
+ CALLBACK_SIZE_LONG, lParam);
#endif
if ( ! result ) {
return 0;
@@ -1001,7 +1020,9 @@
#ifdef WINELIB
if (!(*wndenumprc)( 2, lParam, (int) hwnd)) {
#else
- if (!CallBack16(wndenumprc, 2, lParam, (int) hwnd)) {
+ if (!CallBack16(wndenumprc, 2,
+ CALLBACK_SIZE_WORD, (int) hwnd,
+ CALLBACK_SIZE_LONG, lParam)) {
#endif
return 0;
}
diff --git a/windows/winpos.c b/windows/winpos.c
index f9b274d..7d1c574 100644
--- a/windows/winpos.c
+++ b/windows/winpos.c
@@ -1,10 +1,10 @@
/*
* Window position related functions.
*
- * Copyright 1993 Alexandre Julliard
+ * Copyright 1993, 1994 Alexandre Julliard
*/
-static char Copyright[] = "Copyright Alexandre Julliard, 1993";
+static char Copyright[] = "Copyright Alexandre Julliard, 1993, 1994";
#include "sysmetrics.h"
#include "user.h"
@@ -12,8 +12,8 @@
#include "message.h"
#include "winpos.h"
#include "stddebug.h"
-/* #define DEBUG_WIN /* */
-/* #undef DEBUG_WIN /* */
+/* #define DEBUG_WIN */
+/* #undef DEBUG_WIN */
#include "debug.h"
static HWND hwndActive = 0; /* Currently active window */
@@ -90,9 +90,11 @@
(wndPtr->dwStyle & WS_VISIBLE) &&
!(wndPtr->dwExStyle & WS_EX_TRANSPARENT))
{
+ hwndRet = hwnd;
+ /* If window is minimized, ignore its children */
+ if (wndPtr->dwStyle & WS_MINIMIZE) break;
pt.x -= wndPtr->rectClient.left;
pt.y -= wndPtr->rectClient.top;
- hwndRet = hwnd;
hwnd = wndPtr->hwndChild;
}
else hwnd = wndPtr->hwndNext;
@@ -224,47 +226,6 @@
}
-#if 0
-/*
- * hwnd is the handle to the first child window to hide
- */
-static void WINPOS_hideChildren(HWND hwnd)
-{
- WND *wndPtr;
-
- while (hwnd) {
- ShowWindow(hwnd, SW_HIDE);
- wndPtr = WIN_FindWndPtr(hwnd);
- assert(wndPtr);
- WINPOS_hideChildren(wndPtr->hwndChild);
- hwnd = wndPtr->hwndNext;
- }
-}
-
-
-static void WINPOS_ChildrenComeOutToPlay(HWND hwnd)
-{
- WND *wndPtr;
-
- while (hwnd) {
- /*
- * we shouldn't really be calling SW_SHOWNOACTIVATE
- * here because we wake up all windows, even the ones
- * the user has decided to iconify or hide
- *
- * have to use SHOWNOACTIVATE instead of SHOWNORMAL
- * since we are traversing the window tree and don't
- * want windows linked/unlined under us
- */
- ShowWindow(hwnd, SW_SHOWNOACTIVATE);
- wndPtr = WIN_FindWndPtr(hwnd);
- assert(wndPtr);
- WINPOS_ChildrenComeOutToPlay(wndPtr->hwndChild);
- hwnd = wndPtr->hwndNext;
- }
-}
-#endif
-
/***********************************************************************
* ShowWindow (USER.42)
*/
@@ -305,13 +266,6 @@
swpflags |= SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE |
SWP_NOACTIVATE | SWP_NOZORDER;
-#if 0
- /*
- * tell children that they are getting hidden
- */
- WINPOS_hideChildren(wndPtr->hwndChild);
-#endif
-
/* store the size and position of the window, so we can
* deiconify it to the same size and position
*/
@@ -323,10 +277,9 @@
*/
MoveWindow(hwnd, wndPtr->ptIconPos.x, wndPtr->ptIconPos.y,
SYSMETRICS_CXICON, SYSMETRICS_CYICON, FALSE);
- SendMessage(hwnd, WM_PAINTICON, 0, 0);
+ RedrawWindow( hwnd, NULL, 0, RDW_FRAME | RDW_ERASENOW );
break;
-
case SW_SHOWNA:
case SW_SHOWMAXIMIZED: /* same as SW_MAXIMIZE: */
case SW_SHOW:
@@ -353,9 +306,6 @@
wndPtr->rectNormal.bottom - wndPtr->rectNormal.top,
FALSE);
}
-#if 0
- WINPOS_ChildrenComeOutToPlay(wndPtr->hwndChild);
-#endif
break;
}
@@ -894,6 +844,7 @@
pDWP->suggestedCount = count;
pDWP->valid = TRUE;
pDWP->wMagic = DWP_MAGIC;
+ pDWP->hwndParent = 0;
return handle;
}
@@ -910,6 +861,16 @@
pDWP = (DWP *) USER_HEAP_ADDR( hdwp );
if (!pDWP) return 0;
+
+ /* All the windows of a DeferWindowPos() must have the same parent */
+
+ if (pDWP->actualCount == 0) pDWP->hwndParent = GetParent( hwnd );
+ else if (GetParent( hwnd ) != pDWP->hwndParent)
+ {
+ USER_HEAP_FREE( hdwp );
+ return 0;
+ }
+
for (i = 0; i < pDWP->actualCount; i++)
{
if (pDWP->winPos[i].hwnd == hwnd)
@@ -986,12 +947,35 @@
{
HDWP hdwp;
-#ifdef DEBUG_WIN
- printf( "SetWindowPos: %04X %d %d,%d %dx%d 0x%x\n",
+ dprintf_win(stddeb, "SetWindowPos: %04X %d %d,%d %dx%d 0x%x\n",
hwnd, hwndInsertAfter, x, y, cx, cy, flags );
-#endif
if (!(hdwp = BeginDeferWindowPos( 1 ))) return FALSE;
if (!(hdwp = DeferWindowPos( hdwp, hwnd, hwndInsertAfter,
x, y, cx, cy, flags ))) return FALSE;
return EndDeferWindowPos( hdwp );
}
+
+/***********************************************************************
+ * TileChildWindows (USER.199)
+ */
+void TileChildWindows( HWND parent, WORD action )
+{
+ printf("STUB TileChildWindows(%04X, %d)\n", parent, action);
+}
+
+/***********************************************************************
+ * CascageChildWindows (USER.198)
+ */
+void CascadeChildWindows( HWND parent, WORD action )
+{
+ printf("STUB CascadeChildWindows(%04X, %d)\n", parent, action);
+}
+
+/***********************************************************************
+ * ArrangeIconicWindows (USER.170)
+ */
+WORD ArrangeIconicWindows( HWND parent )
+{
+ printf("STUB ArrangeIconicWindows(%04X)\n", parent);
+ return 0;
+}
diff --git a/wine.ini b/wine.ini
index b791ef8..b9139b8 100644
--- a/wine.ini
+++ b/wine.ini
@@ -12,9 +12,21 @@
Temp=c:\temp
Path=c:\windows;c:\windows\system;e:\;e:\test;f:\
+[fonts]
+system=bitstream-courier
+mssansserif=*-helvetica
+msserif=*-times
+fixedsys=*-fixed
+arial=*-helvetica
+helv=*-helvetica
+roman=*-times
+default=*-*
+
[serialports]
Com1=/dev/cua0
Com2=/dev/cua1
+Com3=/dev/modem,38400
+Com4=/dev/modem
[parallelports]
Lpt1=/dev/lp0