Release 940510
May 9, 94 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte)
* [controls/scroll.c]
Make thumbtrack button disappear if scroll box ratio < 3:1.
Make arrow buttons rectangular if scroll box ratio < 2:1.
Add code for SBS_TOPALIGN, SBS_BOTTOMALIGN,
SBS_LEFTALIGN & SBS_RIGHTALIGN.
Bug fix in NC_CreateScrollBars(), no more bigbutt in calendar.exe... :-)
* [loader/library.c] [loader/task.c] [misc/exec.c]
Continue playing around trying to get a second task running.
* [windows/mdi.c]
Change OBM_CLOSE for OBM_OLD_CLOSE, a smaller dot button when maximized.
* [everywhere]
Adding previous works of the Apr 25, 94.
Tue May 10 18:09:14 1994 Erik Bos (erik@trashcan.hacktic.nl)
* [if1632/mmsystem.spec] [misc/mmsystem.c] [include/mmsystem.h]
Added Martin's mmsystem.dll stubs.
* [misc/sound.c]
Added remaining stubs for sound.dll.
* [if1632/shell.spec] [misc/shell.c]
Fixed prototypes (I found them in BC 4) and added ShellAbout()
and AboutDlgProc().
diff --git a/ChangeLog b/ChangeLog
index 87a97a5..ed79d40 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,35 @@
----------------------------------------------------------------------
+May 9, 94 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte)
+
+ * [controls/scroll.c]
+ Make thumbtrack button disappear if scroll box ratio < 3:1.
+ Make arrow buttons rectangular if scroll box ratio < 2:1.
+ Add code for SBS_TOPALIGN, SBS_BOTTOMALIGN,
+ SBS_LEFTALIGN & SBS_RIGHTALIGN.
+ Bug fix in NC_CreateScrollBars(), no more bigbutt in calendar.exe... :-)
+
+ * [loader/library.c] [loader/task.c] [misc/exec.c]
+ Continue playing around trying to get a second task running.
+
+ * [windows/mdi.c]
+ Change OBM_CLOSE for OBM_OLD_CLOSE, a smaller dot button when maximized.
+
+ * [everywhere]
+ Adding previous works of the Apr 25, 94.
+
+Tue May 10 18:09:14 1994 Erik Bos (erik@trashcan.hacktic.nl)
+
+ * [if1632/mmsystem.spec] [misc/mmsystem.c] [include/mmsystem.h]
+ Added Martin's mmsystem.dll stubs.
+
+ * [misc/sound.c]
+ Added remaining stubs for sound.dll.
+
+ * [if1632/shell.spec] [misc/shell.c]
+ Fixed prototypes (I found them in BC 4) and added ShellAbout()
+ and AboutDlgProc().
+
+----------------------------------------------------------------------
May 1, 94 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte)
* [loader/signal.c]
@@ -39,7 +70,42 @@
path when given a simple file name. Fixed GetSetProfile to allow
enumerating all key names when KeyName is null.
+Apr 25, 94 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte)
+
+ * [objects/bitblt.c]
+ Add protection to BitBlt() & StretchBlt() for width or height = 0.
+
+ * [windows/nonclient.c]
+ Avoid painting in NC_DoNCPaint() if IsWindowVisible().
+ Simplify NC_TrackMouseMenuBar() because code moved to MenuFocusLoop().
+
+ * [windows/win.c]
+ CreateWindowEx() & DestroyWindow() now call respectively
+ AddWindowToTask() & RemoveWindowFromTask().
+ New empty stub for function AnyPopup().
+
+ * [loader/library.c]
+ Bug Fix : GetModuleFileName() now return full path filename.
+
+ * [include/menu.h] [controls/menu.c]
+ Add hText handle and remove obsolete MENUITEM struct members.
+ Add a ReleaseCapture() in SetMenu() when menubar changed while captured.
+ Add MenuMouseMove() MenuButtonUp() in function MenuFocusLoop().
+
+ * [misc/file.c]
+ GetTempFilename() now create a file.
+ _lcreate() use unix open (name, mode, perm), with perm=O666.
+
+ * [if1632/relay.c]
+ Remove temporarly builtin SHELL.DLL, Add MMSYSTEM.DLL in builtin list.
+
+ * New file [misc/mmsystem.c]
+ * New file [include/mmsystem.h]
+ * New file [if1632/mmsystem.spec]
+ Many, many empty stubs ... :-)
+
----------------------------------------------------------------------
+
Wed Apr 20 14:53:35 1994 Bob Amstadt (bob@pooh)
* [tools/build.c] [if1632/call.S] [if1632/Imakefile]
@@ -68,8 +134,6 @@
Move functions GetWindowTask(), GetNumTask(), EnumTaskWindows()
from 'loader/library.c'.
- * [loader/library.c]
-
* [if1632/user.c] [if1632/kernel.c]
Put Atoms functions entries.
diff --git a/Imakefile b/Imakefile
index 89039f0..5f12665 100644
--- a/Imakefile
+++ b/Imakefile
@@ -1,7 +1,7 @@
#include "autoconf.h"
#include "Wine.tmpl"
-#if defined(i386FreeBsd)
+#if defined(i386FreeBsd) || defined(FreeBSDArchitecture)
MAKE = gmake
CC = gcc -D__FreeBSD__
#endif
@@ -77,7 +77,7 @@
#ifdef i386BsdArchitecture
SYSLIBS = -ll -lm -li386 -lgnumalloc
#endif
-#ifdef i386FreeBsd
+#if defined(i386FreeBsd) || defined(FreeBSDArchitecture)
SYSLIBS = -ll -lm -lgnumalloc
#endif
#ifdef LinuxArchitecture
diff --git a/README b/README
index 668a0c6..40aadbc 100644
--- a/README
+++ b/README
@@ -171,6 +171,12 @@
7. WHAT'S NEW
+WHAT'S NEW with Wine-940510: (see ChangeLog for details)
+ - debugger improvements
+ - mmsystem
+ - ShellAbout() and AboutDlgProc()
+ - and many many bug fixes!
+
WHAT'S NEW with Wine-940505: (see ChangeLog for details)
- faster color_stretch()
- SetSysMenu(), GetCursor(), GetDesktopWindow()
diff --git a/controls/combo.c b/controls/combo.c
index 06fac4c..48d0519 100644
--- a/controls/combo.c
+++ b/controls/combo.c
@@ -5,6 +5,7 @@
*
*/
+#define DEBUG_COMBO
/*
#define DEBUG_COMBO
*/
@@ -66,7 +67,8 @@
lphc = ComboGetStorageHeader(hwnd);
if (lphc == NULL) return 0;
if (wndPtr->dwStyle & CBS_SIMPLE)
- lphc->hWndEdit = CreateWindow("EDIT", "",
+/* 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);
@@ -114,7 +116,7 @@
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(lphc->hWndEdit, WM_SETTEXT, (WORD)y, (LPARAM)str);
}
SendMessage(GetParent(hwnd), WM_COMMAND, wndPtr->wIDmenu,
MAKELONG(hwnd, CBN_SELCHANGE));
@@ -136,20 +138,26 @@
ReleaseDC(hwnd, hDC);
wndPtr = WIN_FindWndPtr(hwnd);
lphc = ComboGetStorageHeader(hwnd);
+ if (lphc == NULL) return 0;
lphc->dwState = lphc->dwState ^ CB_SHOWDROPDOWN;
if ((lphc->dwState & CB_SHOWDROPDOWN) == CB_SHOWDROPDOWN) {
ShowWindow(lphc->hWndLBox, SW_SHOW);
SetFocus(lphc->hWndLBox);
}
else {
- SetFocus(lphc->hWndEdit);
+ printf("before Combo Restore Focus !\n");
+ SetFocus(lphc->hWndEdit);
+ printf("before Combo List Hide !\n");
ShowWindow(lphc->hWndLBox, SW_HIDE);
+ printf("before Combo List GetCurSel !\n");
y = SendMessage(lphc->hWndLBox, LB_GETCURSEL, 0, 0L);
if (y != LB_ERR) {
+ printf("before Combo List GetText !\n");
SendMessage(lphc->hWndLBox, LB_GETTEXT, (WORD)y, (LPARAM)str);
SendMessage(lphc->hWndEdit, WM_SETTEXT, (WORD)y, (LPARAM)str);
+ }
+ printf("End of Combo List Hide !\n");
}
- }
break;
case WM_LBUTTONUP:
printf("Combo WM_LBUTTONUP wParam=%x lParam=%lX !\n", wParam, lParam);
@@ -163,6 +171,7 @@
case WM_KEYDOWN:
wndPtr = WIN_FindWndPtr(hwnd);
lphc = ComboGetStorageHeader(hwnd);
+ if (lphc == NULL) return 0;
y = SendMessage(lphc->hWndLBox, LB_GETCURSEL, 0, 0L);
count = SendMessage(lphc->hWndLBox, LB_GETCOUNT, 0, 0L);
printf("COMBOBOX // GetKeyState(VK_MENU)=%d\n", GetKeyState(VK_MENU));
@@ -214,13 +223,16 @@
GetClientRect(hwnd, &rect);
hDC = BeginPaint(hwnd, &paintstruct);
hMemDC = CreateCompatibleDC(hDC);
- GetObject(hComboBit, sizeof(BITMAP), (LPSTR)&bm);
- SelectObject(hMemDC, hComboBit);
- BitBlt(hDC, rect.right - bm.bmWidth, 0,
- bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+ if (hMemDC != 0 && hComboBit != 0) {
+ GetObject(hComboBit, sizeof(BITMAP), (LPSTR)&bm);
+ SelectObject(hMemDC, hComboBit);
+ BitBlt(hDC, rect.right - bm.bmWidth, 0,
+ bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+ }
DeleteDC(hMemDC);
EndPaint(hwnd, &paintstruct);
lphc = ComboGetStorageHeader(hwnd);
+ if (lphc == NULL) return 0;
InvalidateRect(lphc->hWndEdit, NULL, TRUE);
UpdateWindow(lphc->hWndEdit);
if ((lphc->dwState & CB_SHOWDROPDOWN) == CB_SHOWDROPDOWN) {
@@ -230,10 +242,12 @@
break;
case WM_SETFOCUS:
lphc = ComboGetStorageHeader(hwnd);
+ if (lphc == NULL) return 0;
SetFocus(lphc->hWndEdit);
break;
case WM_KILLFOCUS:
lphc = ComboGetStorageHeader(hwnd);
+ if (lphc == NULL) return 0;
ShowWindow(lphc->hWndLBox, SW_HIDE);
y = SendMessage(lphc->hWndLBox, LB_GETCURSEL, 0, 0L);
if (y != LB_ERR) {
@@ -246,62 +260,76 @@
printf("CB_ADDSTRING '%s' !\n", (LPSTR)lParam);
#endif
lphc = ComboGetStorageHeader(hwnd);
+ if (lphc == NULL) return 0;
return(SendMessage(lphc->hWndLBox, LB_ADDSTRING, wParam, lParam));
case CB_GETLBTEXT:
printf("CB_GETLBTEXT #%u !\n", wParam);
lphc = ComboGetStorageHeader(hwnd);
+ if (lphc == NULL) return 0;
return(SendMessage(lphc->hWndLBox, LB_GETTEXT, wParam, lParam));
case CB_GETLBTEXTLEN:
printf("CB_GETLBTEXTLEN !\n");
lphc = ComboGetStorageHeader(hwnd);
+ if (lphc == NULL) return 0;
return(SendMessage(lphc->hWndLBox, LB_GETTEXTLEN, wParam, lParam));
case CB_INSERTSTRING:
printf("CB_INSERTSTRING '%s' !\n", (LPSTR)lParam);
lphc = ComboGetStorageHeader(hwnd);
+ if (lphc == NULL) return 0;
return(SendMessage(lphc->hWndLBox, LB_INSERTSTRING, wParam, lParam));
case CB_DELETESTRING:
printf("CB_DELETESTRING #%u !\n", wParam);
lphc = ComboGetStorageHeader(hwnd);
+ if (lphc == NULL) return 0;
return(SendMessage(lphc->hWndLBox, LB_DELETESTRING, wParam, 0L));
case CB_RESETCONTENT:
printf("CB_RESETCONTENT !\n");
lphc = ComboGetStorageHeader(hwnd);
+ if (lphc == NULL) return 0;
return(SendMessage(lphc->hWndLBox, LB_RESETCONTENT, 0, 0L));
case CB_DIR:
printf("ComboBox CB_DIR !\n");
lphc = ComboGetStorageHeader(hwnd);
+ if (lphc == NULL) return 0;
return(SendMessage(lphc->hWndLBox, LB_DIR, wParam, lParam));
case CB_FINDSTRING:
lphc = ComboGetStorageHeader(hwnd);
return(SendMessage(lphc->hWndLBox, LB_FINDSTRING, wParam, lParam));
case CB_GETCOUNT:
lphc = ComboGetStorageHeader(hwnd);
+ if (lphc == NULL) return 0;
return(SendMessage(lphc->hWndLBox, LB_GETCOUNT, 0, 0L));
case CB_GETCURSEL:
printf("ComboBox CB_GETCURSEL !\n");
lphc = ComboGetStorageHeader(hwnd);
+ if (lphc == NULL) return 0;
return(SendMessage(lphc->hWndLBox, LB_GETCURSEL, 0, 0L));
case CB_SETCURSEL:
printf("ComboBox CB_SETCURSEL wParam=%X !\n", wParam);
lphc = ComboGetStorageHeader(hwnd);
+ if (lphc == NULL) return 0;
return(SendMessage(lphc->hWndLBox, LB_SETCURSEL, wParam, 0L));
case CB_GETEDITSEL:
printf("ComboBox CB_GETEDITSEL !\n");
lphc = ComboGetStorageHeader(hwnd);
+ if (lphc == NULL) return 0;
/* return(SendMessage(lphc->hWndEdit, EM_GETSEL, 0, 0L)); */
break;
case CB_SETEDITSEL:
printf("ComboBox CB_SETEDITSEL lParam=%lX !\n", lParam);
lphc = ComboGetStorageHeader(hwnd);
+ if (lphc == NULL) return 0;
/* return(SendMessage(lphc->hWndEdit, EM_SETSEL, 0, lParam)); */
break;
case CB_SELECTSTRING:
printf("ComboBox CB_SELECTSTRING !\n");
lphc = ComboGetStorageHeader(hwnd);
+ if (lphc == NULL) return 0;
break;
case CB_SHOWDROPDOWN:
printf("ComboBox CB_SHOWDROPDOWN !\n");
lphc = ComboGetStorageHeader(hwnd);
+ if (lphc == NULL) return 0;
lphc->dwState = lphc->dwState | CB_SHOWDROPDOWN;
if (wParam != 0) {
ShowWindow(lphc->hWndLBox, SW_SHOW);
@@ -316,16 +344,19 @@
case CB_GETITEMDATA:
printf("ComboBox CB_GETITEMDATA wParam=%X !\n", wParam);
lphc = ComboGetStorageHeader(hwnd);
+ if (lphc == NULL) return 0;
return(SendMessage(lphc->hWndLBox, LB_GETITEMDATA, wParam, 0L));
break;
case CB_SETITEMDATA:
printf("ComboBox CB_SETITEMDATA wParam=%X lParam=%lX !\n", wParam, lParam);
lphc = ComboGetStorageHeader(hwnd);
+ if (lphc == NULL) return 0;
return(SendMessage(lphc->hWndLBox, LB_SETITEMDATA, wParam, lParam));
break;
case CB_LIMITTEXT:
printf("ComboBox CB_LIMITTEXT !\n");
lphc = ComboGetStorageHeader(hwnd);
+ if (lphc == NULL) return 0;
/* return(SendMessage(lphc->hWndEdit, EM_LIMITTEXT, wParam, 0L)); */
break;
@@ -390,6 +421,7 @@
hDlg, lpPathSpec, nIDLBox, nIDStat, wType);
hWnd = GetDlgItem(hDlg, nIDLBox);
lphc = ComboGetStorageHeader(hWnd);
+ if (lphc == NULL) return 0;
SendMessage(lphc->hWndLBox, LB_RESETCONTENT, 0, 0L);
return SendMessage(lphc->hWndLBox, LB_DIR, wType, (DWORD)lpPathSpec);
}
diff --git a/controls/listbox.c b/controls/listbox.c
index 70a6c54..cb5f14c 100644
--- a/controls/listbox.c
+++ b/controls/listbox.c
@@ -72,6 +72,7 @@
#ifdef DEBUG_LISTBOX
printf("ListBox WM_CREATE %lX !\n", lphl);
#endif
+ if (lphl == NULL) return 0;
createStruct = (CREATESTRUCT *)lParam;
if (HIWORD(createStruct->lpCreateParams) != 0)
lphl->hWndLogicParent = (HWND)HIWORD(createStruct->lpCreateParams);
@@ -91,7 +92,7 @@
return 0;
case WM_DESTROY:
lphl = ListBoxGetWindowAndStorage(hwnd, &wndPtr);
- if (lphl == 0) return 0;
+ if (lphl == NULL) return 0;
ListBoxResetContent(hwnd);
free(lphl);
*((LPHEADLIST *)&wndPtr->wExtra[1]) = 0;
@@ -189,7 +190,7 @@
SetFocus(hwnd);
SetCapture(hwnd);
lphl = ListBoxGetWindowAndStorage(hwnd, &wndPtr);
- if (lphl == NULL) return 0;
+ if (lphl == NULL) return 0;
lphl->PrevFocused = lphl->ItemFocused;
y = ListBoxFindMouse(hwnd, LOWORD(lParam), HIWORD(lParam));
if ((wndPtr->dwStyle & LBS_MULTIPLESEL) == LBS_MULTIPLESEL) {
@@ -225,6 +226,7 @@
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)
@@ -237,6 +239,7 @@
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)
@@ -248,6 +251,8 @@
}
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;
@@ -722,7 +727,10 @@
MEASUREITEMSTRUCT *measure;
HANDLE hTemp = USER_HEAP_ALLOC(GMEM_MOVEABLE, sizeof(MEASUREITEMSTRUCT));
measure = (MEASUREITEMSTRUCT *) USER_HEAP_ADDR(hTemp);
- if (measure == NULL) return;
+ if (measure == NULL) {
+ printf("ListBoxAskMeasure() // Bad allocation of Measure struct !\n");
+ return;
+ }
measure->CtlType = ODT_LISTBOX;
measure->CtlID = wndPtr->wIDmenu;
measure->itemID = lpls->dis.itemID;
@@ -747,6 +755,10 @@
if (lphl == NULL) return LB_ERR;
hTemp = USER_HEAP_ALLOC(GMEM_MOVEABLE, sizeof(LISTSTRUCT));
lplsnew = (LPLISTSTRUCT) USER_HEAP_ADDR(hTemp);
+ if (lplsnew == NULL) {
+ printf("ListBoxAddString() // Bad allocation of new item !\n");
+ return LB_ERRSPACE;
+ }
lpls = lphl->lpFirst;
if (lpls != NULL) {
while(lpls->lpNext != NULL) {
@@ -822,6 +834,10 @@
}
hTemp = USER_HEAP_ALLOC(GMEM_MOVEABLE, sizeof(LISTSTRUCT));
lplsnew = (LPLISTSTRUCT) USER_HEAP_ADDR(hTemp);
+ if (lplsnew == NULL) {
+ printf("ListBoxAddString() // Bad allocation of new item !\n");
+ return LB_ERRSPACE;
+ }
ListBoxDefaultItem(hwnd, wndPtr, lphl, lplsnew);
lplsnew->hMem = hTemp;
lpls->lpNext = lplsnew;
@@ -981,9 +997,8 @@
lphl->ItemFocused = 0;
lphl->PrevFocused = 0;
if ((wndPtr->dwStyle && LBS_NOTIFY) != 0)
- SendMessage(wndPtr->hwndParent, WM_COMMAND,
+ SendMessage(lphl->hWndLogicParent, WM_COMMAND,
wndPtr->wIDmenu, MAKELONG(hwnd, LBN_SELCHANGE));
-
if (wndPtr->dwStyle & WS_VSCROLL)
SetScrollRange(hwnd, SB_VERT, 1, lphl->ItemsCount, TRUE);
if ((wndPtr->dwStyle & WS_HSCROLL) && lphl->ItemsPerColumn != 0)
@@ -1007,7 +1022,7 @@
UINT i;
lphl = ListBoxGetWindowAndStorage(hwnd, &wndPtr);
if (lphl == NULL) return LB_ERR;
- lphl->ItemFocused = LB_ERR;
+ lphl->ItemFocused = LB_ERR;
if (wIndex >= lphl->ItemsCount) return LB_ERR;
lpls = lphl->lpFirst;
if (lpls == NULL) return LB_ERR;
@@ -1023,7 +1038,7 @@
}
lphl->ItemFocused = wIndex;
if ((wndPtr->dwStyle && LBS_NOTIFY) != 0)
- SendMessage(wndPtr->hwndParent, WM_COMMAND,
+ SendMessage(lphl->hWndLogicParent, WM_COMMAND,
wndPtr->wIDmenu, MAKELONG(hwnd, LBN_SELCHANGE));
return LB_ERR;
}
@@ -1183,6 +1198,10 @@
LPHEADLIST lphl, LPLISTSTRUCT lpls)
{
RECT rect;
+ if (wndPtr == NULL || lphl == NULL || lpls == NULL) {
+ printf("ListBoxDefaultItem() // Bad Pointers !\n");
+ return FALSE;
+ }
GetClientRect(hwnd, &rect);
SetRect(&lpls->dis.rcItem, 0, 0, rect.right, lphl->StdItemHeight);
lpls->dis.CtlType = lphl->DrawCtlType;
@@ -1193,6 +1212,7 @@
lpls->dis.hwndItem = hwnd;
lpls->dis.hDC = 0;
lpls->dis.itemData = 0;
+ return TRUE;
}
diff --git a/controls/menu.c b/controls/menu.c
index 00cc095..9ef90f41 100644
--- a/controls/menu.c
+++ b/controls/menu.c
@@ -408,8 +408,6 @@
LPPOPUPMENU lppop2;
if (lppop == NULL) return;
lpitem = MenuFindItem(lppop, x, y, &wRet);
- printf("MenuButtonDown hWnd=%04X x=%d y=%d // wRet=%d lpitem=%08X !\n",
- hWnd, x, y, wRet, lpitem);
#ifdef DEBUG_MENU
printf("MenuButtonDown hWnd=%04X x=%d y=%d // wRet=%d lpitem=%08X !\n",
hWnd, x, y, wRet, lpitem);
@@ -449,6 +447,10 @@
0, lppop->ownerWnd, (LPRECT)NULL);
}
GlobalUnlock(hSubMenu);
+ return TRUE;
+ }
+ if (lppop->BarFlag && !MenuHasFocus) {
+ MenuFocusLoop(hWnd, lppop);
}
return TRUE;
}
@@ -506,7 +508,8 @@
LPMENUITEM lpitem, lpitem2;
LPPOPUPMENU lppop2;
WORD wRet;
- if ((wParam & MK_LBUTTON) != 0) {
+/* if ((wParam & MK_LBUTTON) != 0) { */
+ if (GetKeyState(VK_LBUTTON) != 0) {
lpitem = MenuFindItem(lppop, x, y, &wRet);
#ifdef DEBUG_MENU
printf("MenuMouseMove // x=%d y=%d // wRet=%d lpitem=%08X !\n",
@@ -1319,12 +1322,13 @@
GlobalUnlock(hMenu);
return FALSE;
}
+ lpitem2->hItem = hNewItem;
lpitem2->item_flags = wFlags;
lpitem2->item_id = wItemID;
if (!(wFlags & (MF_BITMAP | MF_OWNERDRAW | MF_MENUBARBREAK |
MF_MENUBREAK | MF_SEPARATOR))) {
-/* lpitem2->item_text = GlobalQuickAlloc(strlen(lpNewItem) + 1); */
- lpitem2->item_text = GlobalLock(GlobalAlloc(GMEM_MOVEABLE, strlen(lpNewItem) + 1));
+ lpitem2->hText = GlobalAlloc(GMEM_MOVEABLE, strlen(lpNewItem) + 1);
+ lpitem2->item_text = GlobalLock(lpitem2->hText);
if (lpitem2->item_text != NULL)
strcpy(lpitem2->item_text, lpNewItem);
else {
@@ -1347,8 +1351,6 @@
if (lpitem2->next != NULL) lpitem2->next->prev = lpitem2;
lpitem->next = lpitem2;
}
- lpitem2->child = NULL;
- lpitem2->parent = NULL;
menu->nItems++;
GlobalUnlock(hMenu);
return TRUE;
@@ -1386,6 +1388,7 @@
return FALSE;
}
lpitem2 = (LPMENUITEM)GlobalLock(hNewItem);
+ lpitem2->hItem = hNewItem;
if (lpitem2 == NULL) {
GlobalFree(hNewItem);
GlobalUnlock(hMenu);
@@ -1395,8 +1398,8 @@
lpitem2->item_id = wItemID;
if (!(wFlags & (MF_BITMAP | MF_OWNERDRAW | MF_MENUBARBREAK |
MF_MENUBREAK | MF_SEPARATOR))) {
-/* lpitem2->item_text = GlobalQuickAlloc(strlen(lpNewItem) + 1); */
- lpitem2->item_text = GlobalLock(GlobalAlloc(GMEM_MOVEABLE, strlen(lpNewItem) + 1));
+ lpitem2->hText = GlobalAlloc(GMEM_MOVEABLE, strlen(lpNewItem) + 1);
+ lpitem2->item_text = GlobalLock(lpitem2->hText);
if (lpitem2->item_text != NULL)
strcpy(lpitem2->item_text, lpNewItem);
else {
@@ -1414,8 +1417,6 @@
lpitem->next = lpitem2;
lpitem2->prev = lpitem;
lpitem2->next = NULL;
- lpitem2->child = NULL;
- lpitem2->parent = NULL;
lpitem2->hCheckBit = (HBITMAP)NULL;
lpitem2->hUnCheckBit = (HBITMAP)NULL;
menu->nItems++;
@@ -1447,9 +1448,10 @@
if (!(lpitem->item_flags &
(MF_BITMAP | MF_OWNERDRAW | MF_MENUBARBREAK |
MF_MENUBREAK | MF_SEPARATOR))) {
- GlobalFree((HANDLE)lpitem->item_text);
+ GlobalUnlock(lpitem->hText);
+ GlobalFree(lpitem->hText);
}
- GlobalFree(lpitem);
+ GlobalFree(lpitem->hItem);
GlobalUnlock(hMenu);
return TRUE;
}
@@ -1485,11 +1487,12 @@
if (!(lpitem->item_flags &
(MF_BITMAP | MF_OWNERDRAW | MF_MENUBARBREAK |
MF_MENUBREAK | MF_SEPARATOR))) {
- GlobalFree((HANDLE)lpitem->item_text);
+ GlobalUnlock(lpitem->hText);
+ GlobalFree(lpitem->hText);
}
if (lpitem->prev) lpitem->prev->next = lpitem->next;
if (lpitem->next) lpitem->next->prev = lpitem->prev;
- GlobalFree(lpitem);
+ GlobalFree(lpitem->hItem);
GlobalUnlock(hMenu);
return TRUE;
}
@@ -1522,9 +1525,10 @@
if (!(lpitem->item_flags &
(MF_BITMAP | MF_OWNERDRAW | MF_MENUBARBREAK |
MF_MENUBREAK | MF_SEPARATOR))) {
- GlobalFree((HANDLE)lpitem->item_text);
-/* lpitem->item_text = GlobalQuickAlloc(strlen(lpNewItem) + 1); */
- lpitem->item_text = GlobalLock(GlobalAlloc(GMEM_MOVEABLE, strlen(lpNewItem) + 1));
+ GlobalUnlock(lpitem->hText);
+ GlobalFree(lpitem->hText);
+ lpitem->hText = GlobalAlloc(GMEM_MOVEABLE, strlen(lpNewItem) + 1);
+ lpitem->item_text = GlobalLock(lpitem->hText);
printf("ModifyMenu %08X %08X '%s') !\n",
lpitem->item_text, lpNewItem, lpNewItem);
if (lpitem->item_text != NULL)
@@ -1689,13 +1693,26 @@
HideAllSubPopupMenu(lpmenu);
break;
}
+ ScreenToClient(hWnd, &msg.pt);
+ msg.pt.y += lpmenu->rect.bottom;
switch(msg.message) {
+ case WM_LBUTTONDOWN:
+ case WM_NCLBUTTONDOWN:
+ SetCapture(hWnd);
+ MenuButtonDown(hWnd, lpmenu, msg.pt.x, msg.pt.y);
+ break;
+ case WM_LBUTTONUP:
+ case WM_NCLBUTTONUP:
+ MenuButtonUp(hWnd, lpmenu, msg.pt.x, msg.pt.y);
+ ReleaseCapture();
+ break;
+ case WM_MOUSEMOVE:
+ case WM_NCMOUSEMOVE:
+ MenuMouseMove(hWnd, lpmenu, msg.wParam, msg.pt.x, msg.pt.y);
+ break;
case WM_KEYDOWN:
case WM_KEYUP:
case WM_CHAR:
- case WM_LBUTTONDOWN:
- case WM_LBUTTONUP:
- case WM_MOUSEMOVE:
PopupMenuWndProc(hWnd, msg.message, msg.wParam, msg.lParam);
default:
DispatchMessage(&msg);
@@ -1967,12 +1984,15 @@
return FALSE;
}
lpmenu->ownerWnd = hWnd;
+ printf("SetMenu(%04X, %04X) // %04X\n", hWnd, hMenu, lpmenu->ownerWnd);
ResetHiliteFlags(lpmenu);
+ if (GetCapture() == hWnd) ReleaseCapture();
GlobalUnlock(hMenu);
return TRUE;
}
+
/**********************************************************************
* GetSubMenu [USER.159]
*/
diff --git a/controls/scroll.c b/controls/scroll.c
index 1d05ee3..af1d12d 100644
--- a/controls/scroll.c
+++ b/controls/scroll.c
@@ -47,97 +47,115 @@
*/
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;
- static RECT rectsel;
- switch(message)
- {
+ WORD wRet;
+ short x, y;
+ short width, height;
+ WND *wndPtr;
+ LPHEADSCROLL lphs;
+ PAINTSTRUCT ps;
+ HDC hDC;
+ BITMAP bm;
+ RECT rect, rect2;
+ LPCREATESTRUCT lpCreat;
+ static RECT rectsel;
+ switch(message) {
case WM_CREATE:
- CreateScrollBarStruct(hWnd);
+ lpCreat = (LPCREATESTRUCT)lParam;
+ if (lpCreat->style & SBS_VERT) {
+ if (lpCreat->style & SBS_LEFTALIGN)
+ SetWindowPos(hWnd, 0, 0, 0, 16, lpCreat->cy,
+ SWP_NOZORDER | SWP_NOMOVE);
+ if (lpCreat->style & SBS_RIGHTALIGN)
+ SetWindowPos(hWnd, 0, lpCreat->x + lpCreat->cx - 16,
+ lpCreat->y, 16, lpCreat->cy, SWP_NOZORDER);
+ }
+ if (lpCreat->style & SBS_HORZ) {
+ if (lpCreat->style & SBS_TOPALIGN)
+ SetWindowPos(hWnd, 0, 0, 0, lpCreat->cx, 16,
+ SWP_NOZORDER | SWP_NOMOVE);
+ if (lpCreat->style & SBS_BOTTOMALIGN)
+ SetWindowPos(hWnd, 0, lpCreat->x,
+ lpCreat->y + lpCreat->cy - 16,
+ lpCreat->cx, 16, SWP_NOZORDER);
+ }
+ CreateScrollBarStruct(hWnd);
#ifdef DEBUG_SCROLL
- printf("ScrollBar Creation !\n");
+ printf("ScrollBar Creation !\n");
#endif
- return 0;
- case WM_DESTROY:
- lphs = ScrollBarGetWindowAndStorage(hWnd, &wndPtr);
- if (lphs == 0) return 0;
+ return 0;
+ case WM_DESTROY:
+ lphs = ScrollBarGetWindowAndStorage(hWnd, &wndPtr);
+ if (lphs == 0) return 0;
#ifdef DEBUG_SCROLL
- printf("ScrollBar WM_DESTROY %lX !\n", lphs);
+ printf("ScrollBar WM_DESTROY %lX !\n", lphs);
#endif
- free(lphs);
- *((LPHEADSCROLL *)&wndPtr->wExtra[1]) = 0;
- return 0;
+ free(lphs);
+ *((LPHEADSCROLL *)&wndPtr->wExtra[1]) = 0;
+ return 0;
- case WM_LBUTTONDOWN:
- SetCapture(hWnd);
- ScrollBarButtonDown(hWnd, SB_CTL, LOWORD(lParam), HIWORD(lParam));
- break;
- case WM_LBUTTONUP:
- ReleaseCapture();
- ScrollBarButtonUp(hWnd, SB_CTL, LOWORD(lParam), HIWORD(lParam));
- break;
+ case WM_LBUTTONDOWN:
+ SetCapture(hWnd);
+ ScrollBarButtonDown(hWnd, SB_CTL, LOWORD(lParam), HIWORD(lParam));
+ break;
+ case WM_LBUTTONUP:
+ ReleaseCapture();
+ ScrollBarButtonUp(hWnd, SB_CTL, LOWORD(lParam), HIWORD(lParam));
+ break;
- case WM_MOUSEMOVE:
- ScrollBarMouseMove(hWnd, SB_CTL, wParam, LOWORD(lParam), HIWORD(lParam));
- break;
- case WM_KEYDOWN:
- case WM_KEYUP:
- case WM_CHAR:
- lphs = ScrollBarGetWindowAndStorage(hWnd, &wndPtr);
- return(SendMessage(wndPtr->hwndParent, message, wParam, lParam));
+ case WM_MOUSEMOVE:
+ ScrollBarMouseMove(hWnd, SB_CTL, wParam, LOWORD(lParam), HIWORD(lParam));
+ break;
+ case WM_KEYDOWN:
+ case WM_KEYUP:
+ case WM_CHAR:
+ lphs = ScrollBarGetWindowAndStorage(hWnd, &wndPtr);
+ return(SendMessage(wndPtr->hwndParent, message, wParam, lParam));
case WM_TIMER:
#ifdef DEBUG_SCROLL
- printf("ScrollBar WM_TIMER wParam=%X lParam=%lX !\n", wParam, lParam);
+ printf("ScrollBar WM_TIMER wParam=%X lParam=%lX !\n", wParam, lParam);
#endif
- lphs = ScrollBarGetWindowAndStorage(hWnd, &wndPtr);
- KillTimer(hWnd, wParam);
- switch(lphs->ButtonDown) {
- case 0:
- lphs->TimerPending = FALSE;
+ lphs = ScrollBarGetWindowAndStorage(hWnd, &wndPtr);
+ KillTimer(hWnd, wParam);
+ switch(lphs->ButtonDown) {
+ case 0:
+ lphs->TimerPending = FALSE;
+ return 0;
+ case 1:
+ case 3:
+ SendMessage(wndPtr->hwndParent, lphs->Direction,
+ SB_LINEUP, MAKELONG(0, hWnd));
+ break;
+ case 2:
+ case 4:
+ SendMessage(wndPtr->hwndParent, lphs->Direction,
+ SB_LINEDOWN, MAKELONG(0, hWnd));
+ break;
+ case 5:
+ SendMessage(wndPtr->hwndParent, lphs->Direction,
+ SB_PAGEUP, MAKELONG(0, hWnd));
+ break;
+ case 6:
+ SendMessage(wndPtr->hwndParent, lphs->Direction,
+ SB_PAGEDOWN, MAKELONG(0, hWnd));
+ break;
+ }
+ SetTimer(hWnd, 1, 100, NULL);
return 0;
- case 1:
- case 3:
- SendMessage(wndPtr->hwndParent, lphs->Direction,
- SB_LINEUP, MAKELONG(0, hWnd));
- break;
- case 2:
- case 4:
- SendMessage(wndPtr->hwndParent, lphs->Direction,
- SB_LINEDOWN, MAKELONG(0, hWnd));
- break;
- case 5:
- SendMessage(wndPtr->hwndParent, lphs->Direction,
- SB_PAGEUP, MAKELONG(0, hWnd));
- break;
- case 6:
- SendMessage(wndPtr->hwndParent, lphs->Direction,
- SB_PAGEDOWN, MAKELONG(0, hWnd));
- break;
- }
- SetTimer(hWnd, 1, 100, NULL);
- return 0;
- case WM_PAINT:
- hDC = BeginPaint(hWnd, &ps);
- lphs = ScrollBarGetStorageHeader(hWnd);
- if (lphs != NULL) {
- GetClientRect(hWnd, &rect);
- StdDrawScrollBar(hWnd, hDC, SB_CTL, &rect, lphs);
- }
- EndPaint(hWnd, &ps);
- break;
- default:
- return DefWindowProc( hWnd, message, wParam, lParam );
- }
-return(0);
+ case WM_PAINT:
+ hDC = BeginPaint(hWnd, &ps);
+ lphs = ScrollBarGetStorageHeader(hWnd);
+ if (lphs != NULL) {
+ GetClientRect(hWnd, &rect);
+ StdDrawScrollBar(hWnd, hDC, SB_CTL, &rect, lphs);
+ }
+ EndPaint(hWnd, &ps);
+ break;
+ default:
+ return DefWindowProc( hWnd, message, wParam, lParam );
+ }
+ return(0);
}
@@ -174,50 +192,42 @@
#endif
if (lphs->Direction == WM_VSCROLL) {
width = rect.right - rect.left;
- if (y < (lphs->CurPix + width)) {
- if (y < width) {
- lphs->ButtonDown = 1;
- CopyRect(&rect2, &rect);
- rect2.bottom = rect2.top + width;
- InvalidateRect(lphs->hWndOwner, &rect2, TRUE);
+ if (y <= lphs->rectUp.bottom) {
+ lphs->ButtonDown = 1;
+ InvalidateRect(lphs->hWndOwner, &lphs->rectUp, TRUE);
#ifdef DEBUG_SCROLL
- printf("ScrollBarButtonDown send SB_LINEUP\n");
+ printf("ScrollBarButtonDown send SB_LINEUP\n");
#endif
- SendMessage(hWndParent, lphs->Direction,
- SB_LINEUP, dwOwner);
- }
- else {
- lphs->ButtonDown = 5;
-#ifdef DEBUG_SCROLL
- printf("ScrollBarButtonDown send SB_PAGEUP\n");
-#endif
- SendMessage(hWndParent, lphs->Direction,
- SB_PAGEUP, dwOwner);
- }
+ SendMessage(hWndParent, lphs->Direction,
+ SB_LINEUP, dwOwner);
}
- if (y > (lphs->CurPix + (width << 1))) {
- if (y > (rect.bottom - rect.top - width)) {
- lphs->ButtonDown = 2;
- CopyRect(&rect2, &rect);
- rect2.top = rect2.bottom - width;
- InvalidateRect(lphs->hWndOwner, &rect2, TRUE);
+ if (y >= lphs->rectDown.top) {
+ lphs->ButtonDown = 2;
+ InvalidateRect(lphs->hWndOwner, &lphs->rectDown, TRUE);
#ifdef DEBUG_SCROLL
- printf("ScrollBarButtonDown send SB_LINEDOWN\n");
+ printf("ScrollBarButtonDown send SB_LINEDOWN\n");
#endif
- SendMessage(hWndParent, lphs->Direction,
- SB_LINEDOWN, dwOwner);
- }
- else {
- lphs->ButtonDown = 6;
-#ifdef DEBUG_SCROLL
- printf("ScrollBarButtonDown send SB_PAGEDOWN\n");
-#endif
- SendMessage(hWndParent, lphs->Direction,
- SB_PAGEDOWN, dwOwner);
- }
+ SendMessage(hWndParent, lphs->Direction,
+ SB_LINEDOWN, dwOwner);
}
- if ((y > (lphs->CurPix + width)) &&
- (y < (lphs->CurPix + (width << 1)))) {
+ if (y > lphs->rectUp.bottom && y < (lphs->CurPix + width)) {
+ lphs->ButtonDown = 5;
+#ifdef DEBUG_SCROLL
+ printf("ScrollBarButtonDown send SB_PAGEUP\n");
+#endif
+ SendMessage(hWndParent, lphs->Direction,
+ SB_PAGEUP, dwOwner);
+ }
+ if (y < lphs->rectDown.top && y > (lphs->CurPix + (width << 1))) {
+ lphs->ButtonDown = 6;
+#ifdef DEBUG_SCROLL
+ printf("ScrollBarButtonDown send SB_PAGEDOWN\n");
+#endif
+ SendMessage(hWndParent, lphs->Direction,
+ SB_PAGEDOWN, dwOwner);
+ }
+ if (lphs->MaxPix > 0 && y > (lphs->CurPix + width) &&
+ y < (lphs->CurPix + (width << 1))) {
lphs->ThumbActive = TRUE;
#ifdef DEBUG_SCROLL
printf("THUMB DOWN !\n");
@@ -226,50 +236,42 @@
}
else {
height = rect.bottom - rect.top;
- if (x < (lphs->CurPix + height)) {
- if (x < height) {
- lphs->ButtonDown = 3;
- CopyRect(&rect2, &rect);
- rect2.right = rect2.left + height;
- InvalidateRect(lphs->hWndOwner, &rect2, TRUE);
+ if (x <= lphs->rectUp.right) {
+ lphs->ButtonDown = 3;
+ InvalidateRect(lphs->hWndOwner, &lphs->rectUp, TRUE);
#ifdef DEBUG_SCROLL
- printf("ScrollBarButtonDown send SB_LINEUP\n");
+ printf("ScrollBarButtonDown send SB_LINEUP\n");
#endif
- SendMessage(hWndParent, lphs->Direction,
- SB_LINEUP, dwOwner);
- }
- else {
- lphs->ButtonDown = 5;
-#ifdef DEBUG_SCROLL
- printf("ScrollBarButtonDown send SB_PAGEUP\n");
-#endif
- SendMessage(hWndParent, lphs->Direction,
- SB_PAGEUP, dwOwner);
- }
+ SendMessage(hWndParent, lphs->Direction,
+ SB_LINEUP, dwOwner);
}
- if (x > (lphs->CurPix + (height << 1))) {
- if (x > (rect.right - rect.left - height)) {
- lphs->ButtonDown = 4;
- CopyRect(&rect2, &rect);
- rect2.left = rect2.right - height;
- InvalidateRect(lphs->hWndOwner, &rect2, TRUE);
+ if (x >= lphs->rectDown.left) {
+ lphs->ButtonDown = 4;
+ InvalidateRect(lphs->hWndOwner, &lphs->rectDown, TRUE);
#ifdef DEBUG_SCROLL
- printf("ScrollBarButtonDown send SB_LINEDOWN\n");
+ printf("ScrollBarButtonDown send SB_LINEDOWN\n");
#endif
- SendMessage(hWndParent, lphs->Direction,
- SB_LINEDOWN, dwOwner);
- }
- else {
- lphs->ButtonDown = 6;
-#ifdef DEBUG_SCROLL
- printf("ScrollBarButtonDown send SB_PAGEDOWN\n");
-#endif
- SendMessage(hWndParent, lphs->Direction,
- SB_PAGEDOWN, dwOwner);
- }
+ SendMessage(hWndParent, lphs->Direction,
+ SB_LINEDOWN, dwOwner);
}
- if ((x > (lphs->CurPix + height)) &&
- (x < (lphs->CurPix + (height << 1)))) {
+ if (x > lphs->rectUp.right && x < (lphs->CurPix + height)) {
+ lphs->ButtonDown = 5;
+#ifdef DEBUG_SCROLL
+ printf("ScrollBarButtonDown send SB_PAGEUP\n");
+#endif
+ SendMessage(hWndParent, lphs->Direction,
+ SB_PAGEUP, dwOwner);
+ }
+ if (x < lphs->rectDown.left && x > (lphs->CurPix + (height << 1))) {
+ lphs->ButtonDown = 6;
+#ifdef DEBUG_SCROLL
+ printf("ScrollBarButtonDown send SB_PAGEDOWN\n");
+#endif
+ SendMessage(hWndParent, lphs->Direction,
+ SB_PAGEDOWN, dwOwner);
+ }
+ if (lphs->MaxPix > 0 && x > (lphs->CurPix + height) &&
+ x < (lphs->CurPix + (height << 1))) {
lphs->ThumbActive = TRUE;
#ifdef DEBUG_SCROLL
printf("THUMB DOWN !\n");
@@ -298,8 +300,8 @@
lphs->ThumbActive = FALSE;
if (lphs->ButtonDown != 0) {
lphs->ButtonDown = 0;
- GetClientRect(lphs->hWndOwner, &rect);
if (nBar == SB_CTL) {
+ GetClientRect(lphs->hWndOwner, &rect);
InvalidateRect(lphs->hWndOwner, &rect, TRUE);
UpdateWindow(lphs->hWndOwner);
}
@@ -384,100 +386,118 @@
void StdDrawScrollBar(HWND hWnd, HDC hDC, int nBar, LPRECT lprect, LPHEADSCROLL lphs)
{
- HWND hWndParent;
- HBRUSH hBrush;
- HDC hMemDC;
- BITMAP bm;
- RECT rect;
- UINT i, w, h, siz;
- char C[128];
- if (lphs == NULL) return;
+ HWND hWndParent;
+ HBRUSH hBrush;
+ HDC hMemDC;
+ BITMAP bm;
+ RECT rect;
+ UINT i, w, w2, h, h2, siz;
+ char C[128];
+ if (lphs == NULL) return;
#ifdef DEBUG_SCROLL
- if (lphs->Direction == WM_VSCROLL)
- printf("StdDrawScrollBar Vertical left=%d top=%d right=%d bottom=%d !\n",
- lprect->left, lprect->top, lprect->right, lprect->bottom);
- else
- printf("StdDrawScrollBar Horizontal left=%d top=%d right=%d bottom=%d !\n",
- lprect->left, lprect->top, lprect->right, lprect->bottom);
+ printf("StdDrawScrollBar nBar=%04X !\n", nBar);
+ if (lphs->Direction == WM_VSCROLL)
+ printf("StdDrawScrollBar Vertical left=%d top=%d right=%d bottom=%d !\n",
+ lprect->left, lprect->top, lprect->right, lprect->bottom);
+ else
+ printf("StdDrawScrollBar Horizontal left=%d top=%d right=%d bottom=%d !\n",
+ lprect->left, lprect->top, lprect->right, lprect->bottom);
#endif
- if (nBar == SB_CTL)
- hWndParent = GetParent(hWnd);
- else
- hWndParent = lphs->hWndOwner;
- hBrush = SendMessage(hWndParent, WM_CTLCOLOR, (WORD)hDC,
- MAKELONG(hWnd, CTLCOLOR_SCROLLBAR));
- if (hBrush == (HBRUSH)NULL) hBrush = GetStockObject(LTGRAY_BRUSH);
- CopyRect(&lphs->rect, lprect);
- CopyRect(&rect, lprect);
- w = rect.right - rect.left;
- h = rect.bottom - rect.top;
- if (lphs->Direction == WM_VSCROLL)
- lphs->MaxPix = h - 3 * w;
- else
- lphs->MaxPix = w - 3 * h;
- if (lphs->MaxVal != lphs->MinVal)
+ if (nBar == SB_CTL)
+ hWndParent = GetParent(hWnd);
+ else
+ hWndParent = lphs->hWndOwner;
+ hBrush = SendMessage(hWndParent, WM_CTLCOLOR, (WORD)hDC,
+ MAKELONG(hWnd, CTLCOLOR_SCROLLBAR));
+ if (hBrush == (HBRUSH)NULL) hBrush = GetStockObject(LTGRAY_BRUSH);
+ CopyRect(&lphs->rect, lprect);
+ CopyRect(&lphs->rectUp, lprect);
+ CopyRect(&lphs->rectDown, lprect);
+ CopyRect(&rect, lprect);
+ w = rect.right - rect.left;
+ h = rect.bottom - rect.top;
+ if (w == 0 || h == 0) return;
+ if (lphs->Direction == WM_VSCROLL) {
+ if (h > 3 * w)
+ lphs->MaxPix = h - 3 * w;
+ else
+ lphs->MaxPix = 0;
+ if (h > 2 * w)
+ h2 = w;
+ else
+ h2 = (h - 4) / 2;
+ lphs->rectUp.bottom = h2;
+ lphs->rectDown.top = rect.bottom - h2;
+ }
+ else {
+ if (w > 3 * h)
+ lphs->MaxPix = w - 3 * h;
+ else
+ lphs->MaxPix = 0;
+ if (w > 2 * h)
+ w2 = h;
+ else
+ w2 = (w - 4) / 2;
+ lphs->rectUp.right = w2;
+ lphs->rectDown.left = rect.right - w2;
+ }
+ if (lphs->MaxVal != lphs->MinVal)
lphs->CurPix = lphs->MaxPix * (abs((short)lphs->CurVal) - abs(lphs->MinVal)) /
(abs(lphs->MaxVal) - abs(lphs->MinVal));
- if (lphs->CurPix > lphs->MaxPix) lphs->CurPix = lphs->MaxPix;
- hMemDC = CreateCompatibleDC(hDC);
- if (lphs->Direction == WM_VSCROLL) {
- GetObject(hUpArrow, sizeof(BITMAP), (LPSTR)&bm);
- if (lphs->ButtonDown == 1)
- SelectObject(hMemDC, hUpArrowD);
- else
- SelectObject(hMemDC, hUpArrow);
- StretchBlt(hDC, rect.left, rect.top, w, w, hMemDC,
+ if (lphs->CurPix > lphs->MaxPix) lphs->CurPix = lphs->MaxPix;
+ hMemDC = CreateCompatibleDC(hDC);
+ if (lphs->Direction == WM_VSCROLL) {
+ GetObject(hUpArrow, sizeof(BITMAP), (LPSTR)&bm);
+ if (lphs->ButtonDown == 1)
+ SelectObject(hMemDC, hUpArrowD);
+ else
+ SelectObject(hMemDC, hUpArrow);
+ StretchBlt(hDC, rect.left, rect.top, w, h2, hMemDC,
0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
- GetObject(hDnArrow, sizeof(BITMAP), (LPSTR)&bm);
- if (lphs->ButtonDown == 2)
- SelectObject(hMemDC, hDnArrowD);
- else
- SelectObject(hMemDC, hDnArrow);
- StretchBlt(hDC, rect.left, rect.bottom - w, w, w, hMemDC,
+ GetObject(hDnArrow, sizeof(BITMAP), (LPSTR)&bm);
+ if (lphs->ButtonDown == 2)
+ SelectObject(hMemDC, hDnArrowD);
+ else
+ SelectObject(hMemDC, hDnArrow);
+ StretchBlt(hDC, rect.left, rect.bottom - h2, w, h2, hMemDC,
0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
- rect.top += w;
- rect.bottom -= w;
- }
- else {
- GetObject(hLfArrow, sizeof(BITMAP), (LPSTR)&bm);
- if (lphs->ButtonDown == 3)
- SelectObject(hMemDC, hLfArrowD);
- else
- SelectObject(hMemDC, hLfArrow);
- StretchBlt(hDC, rect.left, rect.top, h, h, hMemDC,
+ rect.top += h2;
+ rect.bottom -= h2;
+ }
+ else {
+ GetObject(hLfArrow, sizeof(BITMAP), (LPSTR)&bm);
+ if (lphs->ButtonDown == 3)
+ SelectObject(hMemDC, hLfArrowD);
+ else
+ SelectObject(hMemDC, hLfArrow);
+ StretchBlt(hDC, rect.left, rect.top, w2, h, hMemDC,
0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
- GetObject(hRgArrow, sizeof(BITMAP), (LPSTR)&bm);
- if (lphs->ButtonDown == 4)
- SelectObject(hMemDC, hRgArrowD);
- else
- SelectObject(hMemDC, hRgArrow);
- StretchBlt(hDC, rect.right - h, rect.top, h, h, hMemDC,
+ GetObject(hRgArrow, sizeof(BITMAP), (LPSTR)&bm);
+ if (lphs->ButtonDown == 4)
+ SelectObject(hMemDC, hRgArrowD);
+ else
+ SelectObject(hMemDC, hRgArrow);
+ StretchBlt(hDC, rect.right - w2, rect.top, w2, h, hMemDC,
0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
- rect.left += h;
- rect.right -= h;
- }
- DeleteDC(hMemDC);
- FillRect(hDC, &rect, hBrush);
- if (lphs->Direction == WM_VSCROLL)
- SetRect(&rect, rect.left, rect.top + lphs->CurPix,
- rect.left + w, rect.top + lphs->CurPix + w);
- else
- SetRect(&rect, rect.left + lphs->CurPix, rect.top,
- rect.left + lphs->CurPix + h, rect.top + h);
-/*
- if (lphs->Direction == WM_VSCROLL)
- SetRect(&rect, rect.left, rect.top + lphs->CurPix + w,
- rect.left + w, rect.top + lphs->CurPix + (w << 1));
- else
- SetRect(&rect, rect.left + lphs->CurPix + h, rect.top,
- rect.left + lphs->CurPix + (h << 1), rect.top + h);
-*/
- FrameRect(hDC, &rect, GetStockObject(BLACK_BRUSH));
- InflateRect(&rect, -1, -1);
- FillRect(hDC, &rect, GetStockObject(LTGRAY_BRUSH));
- DrawReliefRect(hDC, rect, 2, 0);
- InflateRect(&rect, -3, -3);
- DrawReliefRect(hDC, rect, 1, 1);
+ rect.left += w2;
+ rect.right -= w2;
+ }
+ DeleteDC(hMemDC);
+ FillRect(hDC, &rect, hBrush);
+ if (lphs->MaxPix != 0) {
+ if (lphs->Direction == WM_VSCROLL)
+ SetRect(&rect, rect.left, rect.top + lphs->CurPix,
+ rect.left + w, rect.top + lphs->CurPix + h2);
+ else
+ SetRect(&rect, rect.left + lphs->CurPix, rect.top,
+ rect.left + lphs->CurPix + w2, rect.top + h);
+ FrameRect(hDC, &rect, GetStockObject(BLACK_BRUSH));
+ InflateRect(&rect, -1, -1);
+ FillRect(hDC, &rect, GetStockObject(LTGRAY_BRUSH));
+ DrawReliefRect(hDC, rect, 2, 0);
+ InflateRect(&rect, -3, -3);
+ DrawReliefRect(hDC, rect, 1, 1);
+ }
}
@@ -508,75 +528,88 @@
LPHEADSCROLL AllocScrollBar(DWORD dwStyle, int width, int height)
{
- LPHEADSCROLL lphs;
- if (hUpArrow == (HBITMAP)NULL)
- hUpArrow = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_UPARROWI));
- if (hDnArrow == (HBITMAP)NULL)
- hDnArrow = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_DNARROWI));
- if (hLfArrow == (HBITMAP)NULL)
- hLfArrow = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_LFARROWI));
- if (hRgArrow == (HBITMAP)NULL)
- hRgArrow = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_RGARROWI));
- if (hUpArrowD == (HBITMAP)NULL)
- hUpArrowD = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_UPARROWD));
- if (hDnArrowD == (HBITMAP)NULL)
- hDnArrowD = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_DNARROWD));
- if (hLfArrowD == (HBITMAP)NULL)
- hLfArrowD = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_LFARROWD));
- if (hRgArrowD == (HBITMAP)NULL)
- hRgArrowD = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_RGARROWD));
- lphs = (LPHEADSCROLL)malloc(sizeof(HEADSCROLL));
- if (lphs == 0) {
- printf("Bad Memory Alloc on ScrollBar !\n");
- return NULL;
- }
- lphs->ThumbActive = FALSE;
- lphs->TimerPending = FALSE;
- lphs->ButtonDown = 0;
- lphs->MinVal = 0;
- lphs->MaxVal = 100;
- lphs->CurVal = 0;
- lphs->CurPix = 0;
- if (dwStyle & WS_VSCROLL) {
- lphs->MaxPix = height - 3 * width;
- lphs->Direction = WM_VSCROLL;
- }
- else {
- lphs->MaxPix = width - 3 * height;
- lphs->Direction = WM_HSCROLL;
- }
- if (lphs->MaxPix < 1) lphs->MaxPix = 1;
- return lphs;
+ LPHEADSCROLL lphs;
+ if (hUpArrow == (HBITMAP)NULL)
+ hUpArrow = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_UPARROWI));
+ if (hDnArrow == (HBITMAP)NULL)
+ hDnArrow = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_DNARROWI));
+ if (hLfArrow == (HBITMAP)NULL)
+ hLfArrow = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_LFARROWI));
+ if (hRgArrow == (HBITMAP)NULL)
+ hRgArrow = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_RGARROWI));
+ if (hUpArrowD == (HBITMAP)NULL)
+ hUpArrowD = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_UPARROWD));
+ if (hDnArrowD == (HBITMAP)NULL)
+ hDnArrowD = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_DNARROWD));
+ if (hLfArrowD == (HBITMAP)NULL)
+ hLfArrowD = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_LFARROWD));
+ if (hRgArrowD == (HBITMAP)NULL)
+ hRgArrowD = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_RGARROWD));
+ lphs = (LPHEADSCROLL)malloc(sizeof(HEADSCROLL));
+ if (lphs == 0) {
+ printf("Bad Memory Alloc on ScrollBar !\n");
+ return NULL;
+ }
+ lphs->ThumbActive = FALSE;
+ lphs->TimerPending = FALSE;
+ lphs->ButtonDown = 0;
+ lphs->MinVal = 0;
+ lphs->MaxVal = 100;
+ lphs->CurVal = 0;
+ lphs->CurPix = 0;
+ SetRect(&lphs->rect, 0, 0, width, height);
+ if (dwStyle & WS_VSCROLL) {
+ if (height > 3 * width)
+ lphs->MaxPix = height - 3 * width;
+ else
+ lphs->MaxPix = 0;
+ lphs->Direction = WM_VSCROLL;
+ }
+ else {
+ if (width > 3 * height)
+ lphs->MaxPix = width - 3 * height;
+ else
+ lphs->MaxPix = 0;
+ lphs->Direction = WM_HSCROLL;
+ }
+ if (lphs->MaxPix < 1) lphs->MaxPix = 1;
+ return lphs;
}
void NC_CreateScrollBars(HWND hWnd)
{
- RECT rect;
- int width, height;
- WND *wndPtr;
- LPHEADSCROLL lphs;
- wndPtr = WIN_FindWndPtr(hWnd);
- width = wndPtr->rectClient.right - wndPtr->rectClient.left;
- height = wndPtr->rectClient.bottom - wndPtr->rectClient.top;
- if (wndPtr->dwStyle & WS_VSCROLL) {
- if (wndPtr->dwStyle & WS_HSCROLL) height -= SYSMETRICS_CYHSCROLL;
- lphs = AllocScrollBar(WS_VSCROLL, SYSMETRICS_CXVSCROLL, height);
+ RECT rect;
+ int width, height;
+ WND *wndPtr;
+ LPHEADSCROLL lphs;
+ wndPtr = WIN_FindWndPtr(hWnd);
+ GetWindowRect(hWnd, &rect);
+ width = rect.right - rect.left;
+ height = rect.bottom - rect.top;
+ if (wndPtr->dwStyle & WS_VSCROLL) {
+ if (wndPtr->dwStyle & WS_HSCROLL) height -= SYSMETRICS_CYHSCROLL;
+ lphs = AllocScrollBar(WS_VSCROLL, SYSMETRICS_CXVSCROLL, height);
#ifdef DEBUG_SCROLL
- printf("NC_CreateScrollBars Vertical %lX !\n", lphs);
+ printf("NC_CreateScrollBars Vertical %lX !\n", lphs);
#endif
- lphs->hWndOwner = hWnd;
- wndPtr->VScroll = lphs;
- }
- if (wndPtr->dwStyle & WS_HSCROLL) {
- if (wndPtr->dwStyle & WS_VSCROLL) width -= SYSMETRICS_CYVSCROLL;
- lphs = AllocScrollBar(WS_HSCROLL, width, SYSMETRICS_CYHSCROLL);
+ lphs->rect.left = width - SYSMETRICS_CYVSCROLL;
+ lphs->rect.right = width;
+ lphs->hWndOwner = hWnd;
+ wndPtr->VScroll = lphs;
+ if (wndPtr->dwStyle & WS_HSCROLL) height += SYSMETRICS_CYHSCROLL;
+ }
+ if (wndPtr->dwStyle & WS_HSCROLL) {
+ if (wndPtr->dwStyle & WS_VSCROLL) width -= SYSMETRICS_CYVSCROLL;
+ lphs = AllocScrollBar(WS_HSCROLL, width, SYSMETRICS_CYHSCROLL);
#ifdef DEBUG_SCROLL
- printf("NC_CreateScrollBars Horizontal %lX !\n", lphs);
+ printf("NC_CreateScrollBars Horizontal %lX !\n", lphs);
#endif
- lphs->hWndOwner = hWnd;
- wndPtr->HScroll = lphs;
- }
+ lphs->rect.top = height - SYSMETRICS_CYHSCROLL;
+ lphs->rect.bottom = height;
+ lphs->hWndOwner = hWnd;
+ wndPtr->HScroll = lphs;
+ }
}
diff --git a/debugger/Imakefile b/debugger/Imakefile
index 2e481f0..5958e7d 100644
--- a/debugger/Imakefile
+++ b/debugger/Imakefile
@@ -1,18 +1,21 @@
#include "../Wine.tmpl"
#define IHavSubDirs
-#define PassCDebugFlags 'CDEBUGFLAGS=$(CDEBUGFLAGS)' 'CC=$(CC)'
+#define PassCDebugFlags 'CDEBUGFLAGS=$(CDEBUGFLAGS)' 'CC=$(CC)' 'MAKE=$(MAKE)'
MODULE = debugger
SUBDIRS = readline
+DEFINES = -DUSE_READLINE
+
/* Quick and dirt hack, since i386 is defined as 1. sigh */
#define temp i386
#undef i386
SRCS = \
dbg.tab.c \
+ break.c \
hash.c \
lex.yy.c \
info.c \
@@ -20,6 +23,7 @@
OBJS = \
dbg.tab.o \
+ break.o \
hash.o \
lex.yy.o \
info.o \
diff --git a/debugger/dbg.y b/debugger/dbg.y
index a627962..7dea72f 100644
--- a/debugger/dbg.y
+++ b/debugger/dbg.y
@@ -9,6 +9,8 @@
*/
#include <stdio.h>
+#include <signal.h>
+
#define YYSTYPE int
#include "regpos.h"
@@ -24,12 +26,17 @@
%token CONT
%token QUIT
%token HELP
+%token BACKTRACE
%token INFO
%token STACK
%token REG
%token REGS
%token NUM
+%token ENABLE
+%token DISABLE
+%token BREAK
%token SET
+%token MODE
%token PRINT
%token IDENTIFIER
%token NO_SYMBOL
@@ -49,12 +56,17 @@
| CONT '\n' { return; };
| SYMBOLFILE IDENTIFIER '\n' { read_symboltable($2); };
| DEFINE IDENTIFIER expr '\n' { add_hash($2, $3); };
+ | MODE NUM { mode_command($2); };
+ | ENABLE NUM { enable_break($2); };
+ | DISABLE NUM { disable_break($2); };
+ | BREAK '*' expr { add_break($3); };
| x_command
+ | BACKTRACE '\n' { dbg_bt(); };
| print_command
| deposit_command
deposit_command:
- SET REG '=' expr '\n' { regval[$2] = $4; }
+ SET REG '=' expr '\n' { if(regval) regval[$2] = $4; else application_not_running();}
| SET '*' expr '=' expr '\n' { *((unsigned int *) $3) = $5; }
| SET symbol '=' expr '\n' { *((unsigned int *) $2) = $4; }
@@ -83,7 +95,7 @@
};
expr: NUM { $$ = $1; }
- | REG { $$ = regval[$1]; }
+ | REG { if(regval) $$ = regval[$1]; else application_not_running();}
| symbol { $$ = *((unsigned int *) $1); }
| expr '+' NUM { $$ = $1 + $3; }
| expr '-' NUM { $$ = $1 - $3; };
@@ -92,6 +104,7 @@
infocmd: INFO REGS { info_reg(); }
| INFO STACK { info_stack(); };
+ | INFO BREAK { info_break(); };
%%
@@ -103,10 +116,25 @@
#endif
}
+void mode_command(int newmode)
+{
+ if(newmode == 16){
+ dbg_mask = 0xffff;
+ dbg_mode = 16;
+ return;
+ }
+ if(newmode == 32){
+ dbg_mask = 0xffffffff;
+ dbg_mode = 32;
+ return;
+ }
+ fprintf(stderr,"Invalid mode (use 16 or 32)\n");
+}
+
static int loaded_symbols = 0;
void
-wine_debug(int * regs)
+wine_debug(int signal, int * regs)
{
int i;
#ifdef YYDEBUG
@@ -143,13 +171,31 @@
};
#endif
+ /* Remove the breakpoints from memory... */
+ insert_break(0);
+
+ /* If we stopped on a breakpoint, report this fact */
+ if(signal == SIGTRAP)
+ {
+ unsigned int addr;
+ addr = SC_EIP(dbg_mask);
+ if((addr & 0xffff0000) == 0 && dbg_mode == 16)
+ addr |= SC_CS << 16;
+ fprintf(stderr,"Stopped on breakpoint %d\n", get_bpnum(addr));
+ }
+
/* Show where we crashed */
- examine_memory(SC_EIP(dbg_mask), 1, 'i');
+ if(regval)
+ examine_memory(SC_EIP(dbg_mask), 1, 'i');
issue_prompt();
yyparse();
flush_symbols();
+
+ /* Re-insert the breakpoints from memory... */
+ insert_break(1);
+
fprintf(stderr,"Returning to Wine...\n");
}
diff --git a/debugger/debug.l b/debugger/debug.l
index 005c556..90effe0 100644
--- a/debugger/debug.l
+++ b/debugger/debug.l
@@ -58,7 +58,7 @@
}
{DIGIT}+ {
- sscanf(yytext, "%lx", &yylval);
+ sscanf(yytext, "%ld", &yylval);
return NUM;
}
@@ -74,14 +74,25 @@
$esi { yylval = RN_ESI; return REG;}
$edi { yylval = RN_EDI; return REG;}
+$es { yylval = RN_ES; return REG;}
+$ds { yylval = RN_DS; return REG;}
+$cs { yylval = RN_CS; return REG;}
+$ss { yylval = RN_SS; return REG;}
+
info|inf|in { return INFO; }
+break|brea|bre { return BREAK; }
+enable|enabl|enab|ena { return ENABLE;}
+disable|disabl|disab|disa|dis { return DISABLE; }
+
quit|qui|qu { return QUIT; }
help|hel|he { return HELP; }
set|se { return SET; }
+bt { return BACKTRACE; }
+
cont|con|co { return CONT; }
symbolfile|symbolfil|symbolfi|symbolf|symbol|symbo|symb { return SYMBOLFILE; }
@@ -89,6 +100,8 @@
define|defin|defi|def|de { return DEFINE; }
print|prin|pri|pr { return PRINT; }
+mode { return MODE; }
+
regs|reg|re { return REGS; }
stack|stac|sta|st { return STACK; }
diff --git a/debugger/info.c b/debugger/info.c
index 87aec59..0a98d89 100644
--- a/debugger/info.c
+++ b/debugger/info.c
@@ -16,6 +16,11 @@
/* THese three helper functions eliminate the need for patching the
module from gdb for disassembly of code */
+void application_not_running()
+{
+ fprintf(stderr,"Application not running\n");
+}
+
void read_memory(char * memaddr, char * buffer, int len){
memcpy(buffer, memaddr, len);
}
@@ -36,6 +41,12 @@
void info_reg(){
+
+ if(!regval) {
+ application_not_running();
+ return 0;
+ }
+
fprintf(stderr,"Register dump:\n");
/* First get the segment registers out of the way */
fprintf(stderr," CS:%4.4x SS:%4.4x DS:%4.4x ES:%4.4x GS:%4.4x FS:%4.4x\n",
@@ -60,6 +71,10 @@
unsigned int * dump;
int i;
+ if(!regval) {
+ application_not_running();
+ return 0;
+ }
fprintf(stderr,"Stack dump:\n");
dump = (int*) SC_EIP(dbg_mask);
@@ -192,11 +207,15 @@
"The commands accepted by the Wine debugger are a small subset",
"of the commands that gdb would accept. The commands currently",
"are:\n",
-" info reg",
-" info stack",
+" info [reg,stack,break]",
+" break <addr>",
+" enable bpnum",
+" disable bpnum",
" help",
" quit",
" print <expr>",
+" bt",
+" mode [16,32]",
" symbolfile <filename>",
" define <identifier> <expr>",
" x <expr>",
@@ -228,3 +247,52 @@
while(helptext[i]) fprintf(stderr,"%s\n", helptext[i++]);
}
+
+struct frame{
+ union{
+ struct {
+ unsigned short saved_bp;
+ unsigned short saved_ip;
+ unsigned short saved_cs;
+ } win16;
+ struct {
+ unsigned long saved_bp;
+ unsigned long saved_ip;
+ unsigned short saved_cs;
+ } win32;
+ } u;
+};
+
+
+void dbg_bt(){
+ struct frame * frame;
+ unsigned short cs;
+ int frameno = 0;
+
+ if(!regval) {
+ application_not_running();
+ return 0;
+ }
+
+ fprintf(stderr,"Backtrace:\n");
+ fprintf(stderr,"%d: %4.4x:%4.4x\n", frameno++, SC_CS, SC_EIP(dbg_mask));
+ cs = SC_CS;
+
+ frame = (struct frame *) ((SC_EBP(dbg_mask) & ~1) | (SC_SS << 16));
+ while((cs & 3) == 3) {
+ /* See if in 32 bit mode or not. Assume GDT means 32 bit. */
+ if ((cs & 7) != 7) {
+ cs = frame->u.win32.saved_cs;
+ fprintf(stderr,"%d %4.4x:%4.4x\n", frameno++, cs,
+ frame->u.win32.saved_ip);
+ frame = (struct frame *) frame->u.win32.saved_bp;
+ } else {
+ cs = frame->u.win16.saved_cs;
+ fprintf(stderr,"%d %4.4x:%4.4x\n", frameno++, cs,
+ frame->u.win16.saved_ip);
+ frame = (struct frame *) ((frame->u.win16.saved_bp & ~1) |
+ (SC_SS << 16));
+ }
+ }
+}
+
diff --git a/if1632/Imakefile b/if1632/Imakefile
index 72d1b09..d1ff205 100644
--- a/if1632/Imakefile
+++ b/if1632/Imakefile
@@ -12,6 +12,7 @@
dll_gdi.o \
dll_kernel.o \
dll_keyboard.o \
+ dll_mmsystem.o \
dll_shell.o \
dll_sound.o \
dll_stress.o \
@@ -35,6 +36,7 @@
MakeDllFromSpec(kernel,$(TOP)/$(MODULE))
MakeDllFromSpec(keyboard,$(TOP)/$(MODULE))
MakeDllFromSpec(shell,$(TOP)/$(MODULE))
+MakeDllFromSpec(mmsystem,$(TOP)/$(MODULE))
MakeDllFromSpec(sound,$(TOP)/$(MODULE))
MakeDllFromSpec(stress,$(TOP)/$(MODULE))
MakeDllFromSpec(unixlib,$(TOP)/$(MODULE))
diff --git a/if1632/kernel.spec b/if1632/kernel.spec
index 327e37c..0744f78 100644
--- a/if1632/kernel.spec
+++ b/if1632/kernel.spec
@@ -31,7 +31,7 @@
25 pascal GlobalCompact(long) GlobalCompact(1)
#26 GLOBALFREEALL
#28 GLOBALMASTERHANDLE
-29 pascal Yield() Yield()
+29 return Yield 0 0
30 pascal WaitEvent(word) KERNEL_WaitEvent(1)
#31 POSTEVENT
#32 SETPRIORITY
@@ -119,7 +119,7 @@
#114 __AHINCR
115 pascal OutputDebugString(ptr) OutputDebugString(1)
#116 INITLIB
-117 pascal OldYield() Yield()
+117 return OldYield 0 0
#118 GETTASKQUEUEDS
#119 GETTASKQUEUEES
#120 UNDEFDYNLINK
@@ -147,7 +147,7 @@
#139 DOSIGNAL
#140 SETSIGHANDLER
#141 INITTASK1
-150 pascal DirectedYield() Yield()
+150 return DirectedYield 2 0
#151 WINOLDAPCALL
152 pascal GetNumTasks() GetNumTasks()
154 return GlobalNotify 4 0
diff --git a/if1632/pop.h b/if1632/pop.h
deleted file mode 100644
index ff2d961..0000000
--- a/if1632/pop.h
+++ /dev/null
@@ -1,16 +0,0 @@
- add $8,%esp
- popw %es
- add $2,%esp
- popw %ds
- add $2,%esp
- popl %edi
- popl %esi
- popl %ebp
- add $4,%esp
- popl %ebx
- popl %edx
- popl %ecx
- popl %eax
- add $16,%esp
- popfl
- add $20,%esp
diff --git a/if1632/relay.c b/if1632/relay.c
index 2189855..f5b08b0 100644
--- a/if1632/relay.c
+++ b/if1632/relay.c
@@ -24,7 +24,7 @@
#define DEBUG_RELAY /* */
-#define N_BUILTINS 10
+#define N_BUILTINS 11
struct dll_name_table_entry_s dll_builtin_table[N_BUILTINS] =
{
@@ -37,7 +37,8 @@
{ "SOUND", SOUND_table, 20, 7 },
{ "KEYBOARD",KEYBOARD_table,137, 8 },
{ "WINSOCK", WINSOCK_table, 155, 9 },
- { "STRESS", STRESS_table, 15,10 },
+ { "STRESS", STRESS_table, 15, 10},
+ { "MMSYSTEM",MMSYSTEM_table,1023,11},
};
unsigned short *Stack16Frame;
diff --git a/if1632/shell.spec b/if1632/shell.spec
index 062a9f6..52499e3 100644
--- a/if1632/shell.spec
+++ b/if1632/shell.spec
@@ -13,6 +13,7 @@
2 pascal RegCreateKey() RegCreateKey()
3 pascal RegCloseKey() RegCloseKey()
4 pascal RegDeleteKey() RegDeleteKey()
+ 9 pascal DragAcceptFiles() DragAcceptFiles()
20 pascal ShellExecute(ptr) ShellExecute(1)
102 pascal RegisterShellHook(ptr) RegisterShellHook(1)
103 pascal ShellHookProc() ShellHookProc()
@@ -21,7 +22,6 @@
# 33 9 0136 ABOUTDLGPROC exported, shared data
# 34 10 021a EXTRACTICON exported, shared data
# 21 4 1154 FINDEXECUTABLE exported, shared data
-# 9 6 0052 DRAGACCEPTFILES exported, shared data
#100 4 0550 HERETHARBETYGARS exported, shared data
# 38 5 0000 FINDENVIRONMENTSTRING exported, shared data
# 7 2 14dc REGENUMKEY exported, shared data
diff --git a/if1632/sound.spec b/if1632/sound.spec
index be0a2f4..9ce9349 100644
--- a/if1632/sound.spec
+++ b/if1632/sound.spec
@@ -15,3 +15,10 @@
8 pascal SETVOICESOUND(word long word) SetVoiceSound(1 2 3)
9 pascal STARTSOUND() StartSound()
10 pascal STOPSOUND() StopSound()
+11 pascal WAITSOUNDSTATE(word) WaitSoundState(1)
+12 pascal SYNCALLVOICES() SyncAllVoices()
+13 pascal COUNTVOICENOTES(word) CountVoiceNotes(1)
+14 pascal GETTHRESHOLDEVENT() GetThresholdEvent()
+15 pascal GETTHRESHOLDSTATUS() GetThresholdStatus()
+16 pascal SETVOICETHRESHOLD(word word) SetVoiceThreshold(1 2)
+17 pascal DOBEEP() DoBeep()
diff --git a/if1632/user.spec b/if1632/user.spec
index 1c4129d..a2aa4bd 100644
--- a/if1632/user.spec
+++ b/if1632/user.spec
@@ -54,7 +54,7 @@
49 pascal IsWindowVisible(word) IsWindowVisible(1)
50 pascal FindWindow(ptr ptr) FindWindow(1 2)
#51 BEAR51
-#52 ANYPOPUP
+52 pascal AnyPopup() AnyPopup()
53 pascal DestroyWindow(word) DestroyWindow(1)
54 pascal EnumWindows(ptr long) EnumWindows(1 2)
55 pascal EnumChildWindows(word ptr long) EnumChildWindows(1 2 3)
@@ -317,7 +317,7 @@
325 pascal PaintRect(word word word word ptr) PaintRect(1 2 3 4 5)
#326 GETCONTROLBRUSH
#331 ENABLEHARDWAREINPUT
-332 pascal UserYield() Yield()
+332 return UserYield 0 0
#333 ISUSERIDLE
334 pascal GetQueueStatus(word) GetQueueStatus(1)
335 pascal GetInputState() GetInputState()
diff --git a/include/dlls.h b/include/dlls.h
index 19a2dfb..9c59b48 100644
--- a/include/dlls.h
+++ b/include/dlls.h
@@ -59,6 +59,7 @@
extern struct dll_table_entry_s GDI_table[];
extern struct dll_table_entry_s UNIXLIB_table[];
extern struct dll_table_entry_s WIN87EM_table[];
+extern struct dll_table_entry_s MMSYSTEM_table[];
extern struct dll_table_entry_s SHELL_table[];
extern struct dll_table_entry_s SOUND_table[];
extern struct dll_table_entry_s KEYBOARD_table[];
diff --git a/include/menu.h b/include/menu.h
index c5f513a..c877618 100644
--- a/include/menu.h
+++ b/include/menu.h
@@ -12,14 +12,12 @@
{
struct tagMENUITEM *next;
struct tagMENUITEM *prev;
- struct tagMENUITEM *child;
- struct tagMENUITEM *parent;
+ HANDLE hItem;
WORD item_flags;
WORD item_id;
WORD sel_key;
- char *shortcut;
char *item_text;
- char menu_name[10];
+ HANDLE hText;
RECT rect;
HBITMAP hCheckBit;
HBITMAP hUnCheckBit;
diff --git a/include/options.h b/include/options.h
index ae38f73..da5b598 100644
--- a/include/options.h
+++ b/include/options.h
@@ -16,6 +16,7 @@
int synchronous;
short cmdShow;
int relay_debug;
+ int debug;
};
extern struct options Options;
diff --git a/include/scroll.h b/include/scroll.h
index 2804a46..76e94f5 100644
--- a/include/scroll.h
+++ b/include/scroll.h
@@ -10,6 +10,8 @@
short MaxPix;
short CurPix;
RECT rect;
+ RECT rectUp;
+ RECT rectDown;
BOOL ThumbActive;
BOOL TimerPending;
WORD ButtonDown;
diff --git a/include/wine.h b/include/wine.h
index 69505e6..92e0f9b 100644
--- a/include/wine.h
+++ b/include/wine.h
@@ -65,6 +65,15 @@
};
#endif
+#ifdef linux
+#define WINE_DATA_SELECTOR 0x2b
+#define WINE_CODE_SELECTOR 0x23
+#endif
+#if defined(__NetBSD__) || defined(__FreeBSD__)
+#define WINE_DATA_SELECTOR 0x27
+#define WINE_CODE_SELECTOR 0x1f
+#endif
+
#if defined(__NetBSD__) || defined(__FreeBSD__)
#include <signal.h>
#define sigcontext_struct sigcontext
diff --git a/loader/library.c b/loader/library.c
index 4e60f1d..cede6ec 100644
--- a/loader/library.c
+++ b/loader/library.c
@@ -3,6 +3,10 @@
*/
static char Copyright[] = "Copyright Martin Ayotte, 1994";
+/*
+#define DEBUG_MODULE
+*/
+
#ifndef WINELIB
#include <stdio.h>
#include <stdlib.h>
@@ -31,7 +35,7 @@
static LPMODULEENTRY lpModList = NULL;
extern struct w_files * wine_files;
-#define N_BUILTINS 10
+#define N_BUILTINS 11
extern struct dll_name_table_entry_s dll_builtin_table[N_BUILTINS];
@@ -43,6 +47,7 @@
register struct w_files *w = wine_files;
int i;
printf("GetModuleHandle('%s');\n", lpModuleName);
+ printf("GetModuleHandle // searching in loaded modules\n");
while (w) {
/* printf("GetModuleHandle // '%s' \n", w->name); */
if (strcmp(w->name, lpModuleName) == 0) {
@@ -52,7 +57,9 @@
}
w = w->next;
}
+ printf("GetModuleHandle // searching in builtin libraries\n");
for (i = 0; i < N_BUILTINS; i++) {
+ if (dll_builtin_table[i].dll_name == NULL) break;
if (strcmp(dll_builtin_table[i].dll_name, lpModuleName) == 0) {
printf("GetModuleHandle('%s') return %04X \n",
lpModuleName, 0xFF00 + i);
@@ -83,12 +90,17 @@
int GetModuleFileName(HANDLE hModule, LPSTR lpFileName, short nSize)
{
struct w_files *w;
+ LPSTR str;
printf("GetModuleFileName(%04X, %08X, %d);\n", hModule, lpFileName, nSize);
if (lpFileName == NULL) return 0;
+ if (nSize < 1) return 0;
w = GetFileInfo(hModule);
if (w == NULL) return 0;
- if (nSize > strlen(w->name)) nSize = strlen(w->name) + 1;
- strncpy(lpFileName, w->name, nSize);
+ str = w->filename;
+ if (str[0] == '/') str++;
+ if (nSize > strlen(str)) nSize = strlen(str) + 1;
+ strncpy(lpFileName, str, nSize);
+ ToDos(lpFileName);
printf("GetModuleFileName copied '%s' return %d \n", lpFileName, nSize);
return nSize - 1;
}
@@ -100,43 +112,59 @@
HANDLE LoadLibrary(LPSTR libname)
{
HANDLE hModule;
- LPMODULEENTRY lpMod = lpModList;
- LPMODULEENTRY lpNewMod;
+ LPMODULEENTRY lpMod = lpModList;
+ LPMODULEENTRY lpNewMod;
+
+ if (FindDLLTable(libname))
+ {
+ return WINE_CODE_SELECTOR;
+ }
+
printf("LoadLibrary '%s'\n", libname);
- if (lpMod != NULL) {
- while (TRUE) {
- if (strcmp(libname, lpMod->FileName) == 0) {
- lpMod->Count++;
- printf("LoadLibrary // already loaded hInst=%04X\n", lpMod->hInst);
- return lpMod->hInst;
- }
- if (lpMod->lpNextModule == NULL) break;
- lpMod = lpMod->lpNextModule;
- }
- }
- hModule = GlobalAlloc(GMEM_MOVEABLE, sizeof(MODULEENTRY));
- lpNewMod = (LPMODULEENTRY) GlobalLock(hModule);
+ if (lpMod != NULL)
+ {
+ while (TRUE)
+ {
+ if (strcmp(libname, lpMod->FileName) == 0)
+ {
+ lpMod->Count++;
+ printf("LoadLibrary // already loaded hInst=%04X\n",
+ lpMod->hInst);
+ return lpMod->hInst;
+ }
+ if (lpMod->lpNextModule == NULL) break;
+ lpMod = lpMod->lpNextModule;
+ }
+ }
+
+ hModule = GlobalAlloc(GMEM_MOVEABLE, sizeof(MODULEENTRY));
+ lpNewMod = (LPMODULEENTRY) GlobalLock(hModule);
#ifdef DEBUG_LIBRARY
printf("LoadLibrary // creating new module entry %08X\n", lpNewMod);
#endif
- if (lpNewMod == NULL) return 0;
- if (lpModList == NULL) {
- lpModList = lpNewMod;
- lpNewMod->lpPrevModule = NULL;
- }
- else {
- lpMod->lpNextModule = lpNewMod;
- lpNewMod->lpPrevModule = lpMod;
- }
- lpNewMod->lpNextModule = NULL;
- lpNewMod->hModule = hModule;
- lpNewMod->ModuleName = NULL;
- lpNewMod->FileName = (LPSTR) malloc(strlen(libname));
- if (lpNewMod->FileName != NULL) strcpy(lpNewMod->FileName, libname);
- lpNewMod->hInst = LoadImage(libname, DLL);
- lpNewMod->Count = 1;
+ if (lpNewMod == NULL)
+ return 0;
+ if (lpModList == NULL)
+ {
+ lpModList = lpNewMod;
+ lpNewMod->lpPrevModule = NULL;
+ }
+ else
+ {
+ lpMod->lpNextModule = lpNewMod;
+ lpNewMod->lpPrevModule = lpMod;
+ }
+
+ lpNewMod->lpNextModule = NULL;
+ lpNewMod->hModule = hModule;
+ lpNewMod->ModuleName = NULL;
+ lpNewMod->FileName = (LPSTR) malloc(strlen(libname));
+ if (lpNewMod->FileName != NULL)
+ strcpy(lpNewMod->FileName, libname);
+ lpNewMod->hInst = LoadImage(libname, DLL);
+ lpNewMod->Count = 1;
printf("LoadLibrary returned Library hInst=%04X\n", lpNewMod->hInst);
- GlobalUnlock(hModule);
+ GlobalUnlock(hModule);
return lpNewMod->hInst;
}
@@ -219,10 +247,11 @@
strncpy(C, cpnt, len);
C[len] = '\0';
#ifdef DEBUG_MODULE
- printf("pointing Function '%s' !\n", C);
+ printf("pointing Function '%s' ordinal=%d !\n",
+ C, *((unsigned short *)(cpnt + len)));
#endif
if (strncmp(cpnt, proc_name, len) == 0) {
- ordinal = *((unsigned short *) (cpnt + len));
+ ordinal = *((unsigned short *)(cpnt + len));
break;
}
cpnt += len + 2;
diff --git a/loader/resource.c b/loader/resource.c
index 4ff3c28..dbd7d92 100644
--- a/loader/resource.c
+++ b/loader/resource.c
@@ -890,9 +890,14 @@
p += *p + 1;
i = MIN(buflen - 1, *p);
- memcpy(buffer, p + 1, i);
- buffer[i] = '\0';
-
+ if (i > 0) {
+ memcpy(buffer, p + 1, i);
+ buffer[i] = '\0';
+ }
+ else {
+ printf("LoadString // I dont know why , but caller give buflen=%d *p=%d !\n", buflen, *p);
+ printf("LoadString // and try to obtain string '%s'\n", p + 1);
+ }
GlobalFree(hmem);
#ifdef DEBUG_RESOURCE
diff --git a/loader/signal.c b/loader/signal.c
index f00a348..92aecd5 100644
--- a/loader/signal.c
+++ b/loader/signal.c
@@ -56,8 +56,15 @@
/* First take care of a few preliminaries */
#ifdef linux
- if(signal != SIGSEGV)
+ if(signal != SIGSEGV && signal != SIGTRAP)
exit(1);
+
+ /* And back up over the int3 instruction. */
+ if(signal == SIGTRAP) {
+ scp->sc_eip--;
+ goto oops;
+ };
+
if((scp->sc_cs & 7) != 7)
{
#endif
@@ -168,7 +175,7 @@
XFlush(display);
fprintf(stderr,"In win_fault %x:%x\n", scp->sc_cs, scp->sc_eip);
#ifdef linux
- wine_debug(scp); /* Enter our debugger */
+ wine_debug(signal, scp); /* Enter our debugger */
#else
fprintf(stderr,"Stack: %x:%x\n", scp->sc_ss, scp->sc_esp);
dump = (int*) scp;
@@ -192,6 +199,7 @@
segv_act.sa_restorer =
(void (*)()) (((unsigned int)(cstack) + sizeof(cstack) - 4) & ~3);
wine_sigaction(SIGSEGV, &segv_act, NULL);
+ wine_sigaction(SIGTRAP, &segv_act, NULL); /* For breakpoints */
#endif
#if defined(__NetBSD__) || defined(__FreeBSD__)
struct sigstack ss;
diff --git a/loader/task.c b/loader/task.c
index 46bb89b..980ddc7 100644
--- a/loader/task.c
+++ b/loader/task.c
@@ -3,6 +3,10 @@
*/
static char Copyright[] = "Copyright Martin Ayotte, 1994";
+/*
+#define DEBUG_TASK
+*/
+
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -14,7 +18,6 @@
static int nTaskCount = 0;
-
/**********************************************************************
* GetCurrentTask [KERNEL.36]
*/
@@ -22,15 +25,18 @@
{
LPTASKENTRY lpTask = lpTaskList;
int pid = getpid();
+#ifdef DEBUG_TASK
printf("GetCurrentTask() // unix_pid=%08X !\n", pid);
+#endif
if (lpTask == NULL) return 0;
while (TRUE) {
- printf("GetCurrentTask() // searching lpTask->unix_pid=%08 !\n", lpTask->unix_pid);
if (lpTask->unix_pid == pid) break;
if (lpTask->lpNextTask == NULL) return 0;
lpTask = lpTask->lpNextTask;
}
+#ifdef DEBUG_TASK
printf("GetCurrentTask() returned hTask=%04X !\n", lpTask->hTask);
+#endif
return lpTask->hTask;
}
@@ -50,7 +56,27 @@
*/
HTASK GetWindowTask(HWND hWnd)
{
+ HWND *wptr;
+ int count;
+ LPTASKENTRY lpTask = lpTaskList;
printf("GetWindowTask(%04X) !\n", hWnd);
+ while (lpTask != NULL) {
+ wptr = lpTask->lpWndList;
+ if (wptr != NULL) {
+ count = 0;
+ while (++count < MAXWIN_PER_TASK) {
+ printf("GetWindowTask // searching %04X %04X !\n",
+ lpTask->hTask, *(wptr));
+ if (*(wptr) == hWnd) {
+ printf("GetWindowTask(%04X) found hTask=%04X !\n",
+ hWnd, lpTask->hTask);
+ return lpTask->hTask;
+ }
+ wptr++;
+ }
+ }
+ lpTask = lpTask->lpNextTask;
+ }
return 0;
}
@@ -60,8 +86,34 @@
*/
BOOL EnumTaskWindows(HANDLE hTask, FARPROC lpEnumFunc, LONG lParam)
{
+ HWND *wptr, hWnd;
+ BOOL bRet;
+ int count = 0;
+ LPTASKENTRY lpTask = lpTaskList;
printf("EnumTaskWindows(%04X, %08X, %08X) !\n", hTask, lpEnumFunc, lParam);
- return FALSE;
+ while (TRUE) {
+ if (lpTask->hTask == hTask) break;
+ if (lpTask == NULL) {
+ printf("EnumTaskWindows // hTask=%04X not found !\n", hTask);
+ return FALSE;
+ }
+ lpTask = lpTask->lpNextTask;
+ }
+ printf("EnumTaskWindows // found hTask=%04X !\n", hTask);
+ wptr = lpTask->lpWndList;
+ if (wptr == NULL) return FALSE;
+ while ((hWnd = *(wptr++)) != 0) {
+ if (++count >= MAXWIN_PER_TASK) return FALSE;
+ printf("EnumTaskWindows // hWnd=%04X count=%d !\n", hWnd, count);
+#ifdef WINELIB
+ if (lpEnumFunc != NULL) bRet = (*lpEnumFunc)(hWnd, lParam);
+#else
+ if (lpEnumFunc != NULL)
+ bRet = CallBack16(lpEnumFunc, 2, lParam, (int) hWnd);
+#endif
+ if (bRet == 0) break;
+ }
+ return TRUE;
}
@@ -96,15 +148,18 @@
lpNewTask->lpNextTask = NULL;
lpNewTask->hIcon = 0;
lpNewTask->hModule = 0;
+ lpNewTask->hInst = hInst;
lpNewTask->hTask = hTask;
+ lpNewTask->unix_pid = getpid();
lpNewTask->lpWndList = (HWND *) malloc(MAXWIN_PER_TASK * sizeof(HWND));
if (lpNewTask->lpWndList != NULL)
memset((LPSTR)lpNewTask->lpWndList, 0, MAXWIN_PER_TASK * sizeof(HWND));
- lpNewTask->hInst = hInst;
- lpNewTask->unix_pid = getpid();
+#ifdef DEBUG_TASK
printf("CreateNewTask // unix_pid=%08X return hTask=%04X\n",
lpNewTask->unix_pid, hTask);
+#endif
GlobalUnlock(hTask);
+ nTaskCount++;
return hTask;
}
@@ -117,18 +172,27 @@
HWND *wptr;
int count = 0;
LPTASKENTRY lpTask = lpTaskList;
+#ifdef DEBUG_TASK
printf("AddWindowToTask(%04X, %04X); !\n", hTask, hWnd);
+#endif
while (TRUE) {
if (lpTask->hTask == hTask) break;
- if (lpTask == NULL) return FALSE;
+ if (lpTask == NULL) {
+ printf("AddWindowToTask // hTask=%04X not found !\n", hTask);
+ return FALSE;
+ }
lpTask = lpTask->lpNextTask;
}
wptr = lpTask->lpWndList;
if (wptr == NULL) return FALSE;
- while (*(wptr++) != 0) {
+ while (*(wptr) != 0) {
if (++count >= MAXWIN_PER_TASK) return FALSE;
+ wptr++;
}
*wptr = hWnd;
+#ifdef DEBUG_TASK
+ printf("AddWindowToTask // window added, count=%d !\n", count);
+#endif
return TRUE;
}
@@ -141,18 +205,31 @@
HWND *wptr;
int count = 0;
LPTASKENTRY lpTask = lpTaskList;
- printf("AddWindowToTask(%04X, %04X); !\n", hTask, hWnd);
+#ifdef DEBUG_TASK
+ printf("RemoveWindowToTask(%04X, %04X); !\n", hTask, hWnd);
+#endif
while (TRUE) {
if (lpTask->hTask == hTask) break;
- if (lpTask == NULL) return FALSE;
+ if (lpTask == NULL) {
+ printf("RemoveWindowFromTask // hTask=%04X not found !\n", hTask);
+ return FALSE;
+ }
lpTask = lpTask->lpNextTask;
}
wptr = lpTask->lpWndList;
if (wptr == NULL) return FALSE;
- while (*(wptr++) != hWnd) {
+ while (*(wptr) != hWnd) {
if (++count >= MAXWIN_PER_TASK) return FALSE;
+ wptr++;
}
- *wptr = 0;
+ while (*(wptr) != 0) {
+ *(wptr) = *(wptr + 1);
+ if (++count >= MAXWIN_PER_TASK) return FALSE;
+ wptr++;
+ }
+#ifdef DEBUG_TASK
+ printf("RemoveWindowFromTask // window removed, count=%d !\n", --count);
+#endif
return TRUE;
}
diff --git a/loader/wine.c b/loader/wine.c
index fc26d71..896ed06 100644
--- a/loader/wine.c
+++ b/loader/wine.c
@@ -23,6 +23,7 @@
#include "windows.h"
#include "wineopts.h"
#include "arch.h"
+#include "options.h"
/* #define DEBUG_FIXUP */
@@ -350,6 +351,8 @@
ss_reg = wine_files->selector_table[wine_files->ne_header->ss-1].selector;
sp_reg = wine_files->ne_header->sp;
+ if (Options.debug) wine_debug(0, NULL);
+
rv = CallToInit16(cs_reg << 16 | ip_reg, ss_reg << 16 | sp_reg, ds_reg);
printf ("rv = %x\n", rv);
}
diff --git a/memory/global.c b/memory/global.c
index 11ab363..29717e0 100644
--- a/memory/global.c
+++ b/memory/global.c
@@ -163,6 +163,10 @@
GDESC *g_prev;
void *m;
+#ifdef DEBUG_HEAP
+ printf("GlobalAlloc flags %4X, size %d\n", flags, size);
+#endif
+
/*
* If this block is fixed or very big we need to allocate entire
* segments.
diff --git a/memory/heap.c b/memory/heap.c
index 71cb561..471d5fe 100644
--- a/memory/heap.c
+++ b/memory/heap.c
@@ -116,14 +116,23 @@
{
MDESC *m_free;
MDESC *m;
-
/*
* Check validity of block
*/
m = (MDESC *) old_block - 1;
- if (m->prev != m || m->next != m ||
+#ifdef DEBUG_HEAP
+ printf("HEAP_ReAlloc new_size=%d !\n", new_size);
+ printf("HEAP_ReAlloc old_block=%08X !\n", old_block);
+ printf("HEAP_ReAlloc m=%08X free_list=%08X !\n", m, free_list);
+ printf("HEAP_ReAlloc m->prev=%08X !\n", m->prev);
+ printf("HEAP_ReAlloc m->next=%08X !\n", m->next);
+ printf("HEAP_ReAlloc *free_list=%08X !\n", *free_list);
+#endif
+ if (m->prev != m || m->next != m ||
((int) m & 0xffff0000) != ((int) *free_list & 0xffff0000))
{
+ printf("Attempt to resize bad pointer, m = %08x, *free_list = %08x\n",
+ m, free_list);
#ifdef DEBUG_HEAP
printf("Attempt to resize bad pointer, m = %08x, *free_list = %08x\n",
m, free_list);
@@ -134,6 +143,9 @@
/*
* Check for grow block
*/
+#ifdef DEBUG_HEAP
+ printf("HEAP_ReAlloc Check for grow block !\n");
+#endif
if (new_size > m->length)
{
m_free = m + 1 + m->length / sizeof(MDESC);
@@ -142,7 +154,6 @@
m_free->length + sizeof(MDESC) < new_size)
{
void *new_p = HEAP_Alloc(free_list, flags, new_size);
-
if (new_p ==NULL)
return NULL;
memcpy(new_p, old_block, m->length);
@@ -159,6 +170,9 @@
m_free->next->prev = m_free->prev;
m->length += sizeof(MDESC) + m_free->length;
+#ifdef DEBUG_HEAP
+ printf("HEAP_ReAlloc before GLOBAL_FLAGS_ZEROINIT !\n");
+#endif
if (flags & GLOBAL_FLAGS_ZEROINIT)
memset(m_free, '\0', sizeof(MDESC) + m_free->length);
}
@@ -166,6 +180,9 @@
/*
* Check for shrink block.
*/
+#ifdef DEBUG_HEAP
+ printf("HEAP_ReAlloc Check for shrink block !\n");
+#endif
if (new_size < m->length - 4 * sizeof(MDESC))
{
m_free = m + new_size / sizeof(MDESC) + 2;
@@ -422,7 +439,7 @@
HEAP_Init(&lh->free_list,
(void *) ((segment << 16) | start), end - start + 1);
}
-
+ printf("WIN16_LocalInit // return segment=%04X !\n", segment);
return segment;
}
@@ -447,10 +464,14 @@
* WIN16_LocalReAlloc
*/
void *
-WIN16_LocalReAlloc(unsigned int handle, int flags, int bytes)
+WIN16_LocalReAlloc(unsigned int handle, int bytes, int flags)
{
void *m;
-
+#ifdef DEBUG_HEAP
+ printf("WIN16_LocalReAlloc(%04X, %d, %04X); !\n", handle, bytes, flags);
+ printf("WIN16_LocalReAlloc // LOCALHEAP()=%08X !\n", LOCALHEAP());
+ printf("WIN16_LocalReAlloc // *LOCALHEAP()=%08X !\n", *LOCALHEAP());
+#endif
m = HEAP_ReAlloc(LOCALHEAP(), (void *)
(((int) *LOCALHEAP() & 0xffff0000) | (handle & 0xffff)),
bytes, flags);
diff --git a/misc/Imakefile b/misc/Imakefile
index e081262..dffb628 100644
--- a/misc/Imakefile
+++ b/misc/Imakefile
@@ -14,6 +14,7 @@
lstr.c \
main.c \
message.c \
+ mmsystem.c \
profile.c \
property.c \
rect.c \
diff --git a/misc/dos_fs.c b/misc/dos_fs.c
index 78ee54c..6d34222 100644
--- a/misc/dos_fs.c
+++ b/misc/dos_fs.c
@@ -53,23 +53,30 @@
static void ExpandTildeString(char *s)
{
- struct passwd *entry;
- char temp[1024], *ptr = temp;
+ struct passwd *entry;
+ char temp[1024], *ptr = temp;
- strcpy(temp, s);
- while (*ptr)
- {
- if (*ptr != '~') {
- *s++ = *ptr++;
- continue;
- }
- ptr++;
- if ( (entry = getpwuid(getuid())) == NULL) {
- continue;
- }
- strcpy(s, entry->pw_dir);
- s += strlen(entry->pw_dir);
+ strcpy(temp, s);
+
+ while (*ptr)
+ {
+ if (*ptr != '~')
+ {
+ *s++ = *ptr++;
+ continue;
}
+
+ ptr++;
+
+ if ( (entry = getpwuid(getuid())) == NULL)
+ {
+ continue;
+ }
+
+ strcpy(s, entry->pw_dir);
+ s += strlen(entry->pw_dir);
+ }
+ *s = 0;
}
void ChopOffSlash(char *path)
diff --git a/misc/exec.c b/misc/exec.c
index bb37237..daccb03 100644
--- a/misc/exec.c
+++ b/misc/exec.c
@@ -7,6 +7,11 @@
#include <stdio.h>
#include <string.h>
#include <unistd.h>
+#include "neexe.h"
+#include "segmem.h"
+#include "prototypes.h"
+#include "dlls.h"
+#include "wine.h"
#include "windows.h"
#define HELP_CONTEXT 0x0001
@@ -24,6 +29,8 @@
#define HELP_MULTIKEY 0x0201
#define HELP_SETWINPOS 0x0203
+extern struct w_files * wine_files;
+
typedef struct {
WORD wEnvSeg;
LPSTR lpCmdLine;
@@ -31,8 +38,97 @@
DWORD dwReserved;
} PARAMBLOCK;
+typedef BOOL (CALLBACK * LPFNWINMAIN)(HANDLE, HANDLE, LPSTR, int);
+
+
+extern int CallToInit16(unsigned long csip, unsigned long sssp,
+ unsigned short ds);
HANDLE CreateNewTask(HINSTANCE hInst);
+
+void InitializeLoadedNewDLLs(HINSTANCE hInst)
+{
+ struct w_files * w;
+ struct w_files * wpnt;
+ int cs_reg, ds_reg, ip_reg;
+ int rv;
+
+ fprintf(stderr, "Initializing New DLLs\n");
+
+ /*
+ * Initialize libraries
+ */
+ printf("InitializeLoadedNewDLLs() before searching hInst=%04X !\n", hInst);
+ w = wine_files;
+ while (w && w->hinstance != hInst) w = w->next;
+ if (w == NULL) return;
+ printf("InitializeLoadedNewDLLs() // before InitLoop !\n");
+ for(wpnt = w; wpnt; wpnt = wpnt->next)
+ {
+ /*
+ * Is this a library?
+ */
+ if (wpnt->ne_header->format_flags & 0x8000)
+ {
+ if (!(wpnt->ne_header->format_flags & 0x0001))
+ {
+ /* Not SINGLEDATA */
+ fprintf(stderr, "Library is not marked SINGLEDATA\n");
+ exit(1);
+ }
+
+ ds_reg = wpnt->selector_table[wpnt->
+ ne_header->auto_data_seg-1].selector;
+ cs_reg = wpnt->selector_table[wpnt->ne_header->cs-1].selector;
+ ip_reg = wpnt->ne_header->ip;
+
+ fprintf(stderr, "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);
+ }
+ }
+}
+
+
+void StartNewTask(HINSTANCE hInst)
+{
+ struct w_files * wpnt;
+ struct w_files * w;
+ int cs_reg, ds_reg, ss_reg, ip_reg, sp_reg;
+ int rv;
+ int segment;
+
+ printf("StartNewTask() before searching hInst=%04X !\n", hInst);
+ wpnt = wine_files;
+ while (wpnt && wpnt->hinstance != hInst) wpnt = wpnt->next;
+ if (wpnt == NULL) return;
+ printf("StartNewTask() // before FixupSegment !\n");
+ for(w = wpnt; w; w = w->next) {
+ for (segment = 0; segment < w->ne_header->n_segment_tab; segment++) {
+ if (FixupSegment(w, segment) < 0) {
+ myerror("fixup failed.");
+ }
+ }
+ }
+ printf("StartNewTask() before InitializeLoadedNewDLLs !\n");
+ InitializeLoadedNewDLLs(hInst);
+ printf("StartNewTask() before setup register !\n");
+ ds_reg = (wpnt->selector_table[wpnt->ne_header->auto_data_seg-1].selector);
+ cs_reg = wpnt->selector_table[wpnt->ne_header->cs-1].selector;
+ ip_reg = wpnt->ne_header->ip;
+ ss_reg = wpnt->selector_table[wpnt->ne_header->ss-1].selector;
+ sp_reg = wpnt->ne_header->sp;
+
+ printf("StartNewTask() before CallToInit16() !\n");
+ rv = CallToInit16(cs_reg << 16 | ip_reg, ss_reg << 16 | sp_reg, ds_reg);
+ printf ("rv = %x\n", rv);
+
+}
+
+
+
/**********************************************************************
* LoadModule [KERNEL.45]
*/
@@ -52,43 +148,57 @@
*/
WORD WinExec(LPSTR lpCmdLine, WORD nCmdShow)
{
- int X, X2, C;
- char *ArgV[20];
- HANDLE hTask = 0;
+ int c = 0;
+ int x, x2;
+ char *ArgV[20];
+ LPFNWINMAIN lpfnMain;
+ HINSTANCE hInst = 0;
+ HANDLE hTask = 0;
printf("WinExec('%s', %04X)\n", lpCmdLine, nCmdShow);
- ArgV[0] = "wine";
- C = 1;
- for (X = X2 = 0; X < strlen(lpCmdLine) + 1; X++) {
- if ((lpCmdLine[X] == ' ') || (lpCmdLine[X] == '\0')) {
- ArgV[C] = (char *)malloc(X - X2 + 1);
- strncpy(ArgV[C], &lpCmdLine[X2], X - X2);
- ArgV[C][X - X2] = '\0';
- C++; X2 = X + 1;
+/* ArgV[0] = "wine";
+ c = 1; */
+ for (x = x2 = 0; x < strlen(lpCmdLine) + 1; x++) {
+ if ((lpCmdLine[x] == ' ') || (lpCmdLine[x] == '\0')) {
+ ArgV[c] = (char *)malloc(x - x2 + 1);
+ strncpy(ArgV[c], &lpCmdLine[x2], x - x2);
+ ArgV[c][x - x2] = '\0';
+ c++; x2 = x + 1;
}
}
- ArgV[C] = NULL;
- for (C = 0; ; C++) {
- if (ArgV[C] == NULL) break;
- printf("--> '%s' \n", ArgV[C]);
- }
+ ArgV[c] = NULL;
+ for (c = 0; ArgV[c] != NULL; c++) printf("--> '%s' \n", ArgV[c]);
switch(fork()) {
case -1:
printf("Can't 'fork' process !\n");
break;
case 0:
- hTask = CreateNewTask(0);
+ if ((hInst = LoadImage(ArgV[0], EXE)) == (HINSTANCE) NULL ) {
+ fprintf(stderr, "wine: can't find %s!.\n", ArgV[0]);
+ printf("Child process died !\n");
+ exit(1);
+ }
+ hTask = CreateNewTask(hInst);
+ printf("WinExec // hTask=%04X hInst=%04X !\n", hTask, hInst);
+ StartNewTask(hInst);
+/*
+ lpfnMain = (LPFNWINMAIN)GetProcAddress(hInst, (LPSTR)0L);
+ printf("WineExec() // lpfnMain=%08X\n", (LONG)lpfnMain);
+ if (lpfnMain != NULL) {
+ (lpfnMain)(hInst, 0, lpCmdLine, nCmdShow);
+ printf("WineExec() // after lpfnMain\n");
+ }
+*/
+/* hTask = CreateNewTask(0);
printf("WinExec // New Task hTask=%04X !\n", hTask);
- execvp(ArgV[0], ArgV);
+ execvp(ArgV[0], ArgV); */
+
printf("Child process died !\n");
exit(1);
default:
printf("WinExec (Main process stay alive) hTask=%04X !\n", hTask);
break;
}
- for (C = 0; ; C++) {
- if (ArgV[C] == NULL) break;
- free(ArgV[C]);
- }
+ for (c = 0; ArgV[c] != NULL; c++) free(ArgV[c]);
return hTask;
}
diff --git a/misc/file.c b/misc/file.c
index 47beada..ff4bcba 100644
--- a/misc/file.c
+++ b/misc/file.c
@@ -27,6 +27,8 @@
#include <windows.h>
#include "prototypes.h"
+#define DEBUG_FILE
+
char WindowsDirectory[256], SystemDirectory[256], TempDirectory[256];
/***************************************************************************
@@ -119,33 +121,38 @@
**************************************************************************/
INT OpenFile (LPSTR lpFileName, LPOFSTRUCT ofs, WORD wStyle)
{
- int base,flags;
+ int base,flags;
+ int handle;
+#ifdef DEBUG_FILE
+ fprintf(stderr,"Openfile(%s,<struct>,%d) ",lpFileName,wStyle);
+#endif
+ base=wStyle&0xF;
+ flags=wStyle&0xFFF0;
+
+ flags&=0xFF0F; /* strip SHARE bits for now */
+ flags&=0xD7FF; /* strip PROMPT & CANCEL bits for now */
+ flags&=0x7FFF; /* strip REOPEN bit for now */
+ flags&=0xFBFF; /* strib VERIFY bit for now */
+
+ if(flags&OF_CREATE) { base |=O_CREAT; flags &=0xEFFF; }
#ifdef DEBUG_FILE
- fprintf(stderr,"Openfile(%s,<struct>,%d) ",lpFileName,wStyle);
+ fprintf(stderr,"now %d,%d\n",base,flags);
#endif
- base=wStyle&0xF;
- flags=wStyle&0xFFF0;
-
- flags&=0xFF0F; /* strip SHARE bits for now */
- flags&=0xD7FF; /* strip PROMPT & CANCEL bits for now */
- flags&=0x7FFF; /* strip REOPEN bit for now */
- flags&=0xFBFF; /* strib VERIFY bit for now */
-
- if(flags&OF_CREATE) { base |=O_CREAT; flags &=0xEFFF; }
-
- fprintf(stderr,"now %d,%d\n",base,flags);
-
- if(flags&(OF_DELETE|OF_EXIST))
- {
- fprintf(stderr,"Unsupported OpenFile option\n");
- return -1;
- }
- else
- {
- return _lopen (lpFileName, wStyle);
- }
+ if (flags & OF_EXIST) {
+ printf("OpenFile // OF_EXIST '%s' !\n", lpFileName);
+ handle = _lopen (lpFileName, wStyle);
+ close(handle);
+ return handle;
+ }
+ if (flags & OF_DELETE) {
+ printf("OpenFile // OF_DELETE '%s' !\n", lpFileName);
+ return unlink(lpFileName);
+ }
+ else {
+ return _lopen (lpFileName, wStyle);
+ }
}
/**************************************************************************
@@ -200,11 +207,9 @@
fprintf(stderr, "_lcreate: filename %s, attributes %d\n",lpszFilename,
fnAttribute);
#endif
-
if ((UnixFileName = GetUnixFileName(lpszFilename)) == NULL)
return HFILE_ERROR;
-
- handle = open (UnixFileName, O_CREAT | O_TRUNC | O_WRONLY );
+ handle = open (UnixFileName, O_CREAT | O_TRUNC | O_WRONLY, 426);
if (handle == -1)
return HFILE_ERROR;
@@ -282,6 +287,7 @@
INT GetTempFileName(BYTE bDriveLetter, LPCSTR lpszPrefixString, UINT uUnique, LPSTR lpszTempFileName)
{
int unique;
+ int handle;
char tempname[256];
if (uUnique == 0)
@@ -301,6 +307,11 @@
fprintf(stderr,"GetTempFilename: %c %s %d => %s\n",bDriveLetter,
lpszPrefixString,uUnique,lpszTempFileName);
#endif
+ if ((handle = _lcreate (lpszTempFileName, 0x0000)) == -1) {
+ fprintf(stderr,"GetTempFilename: can't create temp file '%s' !\n", lpszTempFileName);
+ }
+ else
+ close(handle);
return unique;
}
diff --git a/misc/lstr.c b/misc/lstr.c
index e6dc701..eeaf7c2 100644
--- a/misc/lstr.c
+++ b/misc/lstr.c
@@ -18,7 +18,9 @@
/* KERNEL.89 */
LPSTR lstrcat(LPSTR target,LPCSTR source)
{
+#ifdef DEBUG_STRING
fprintf(stderr,"lstrcat(%s,%s)\n",target,source);
+#endif
return strcat(target,source);
}
diff --git a/misc/main.c b/misc/main.c
index 6efa211..d5784f3 100644
--- a/misc/main.c
+++ b/misc/main.c
@@ -54,6 +54,7 @@
{ "-privatemap", ".privatemap", XrmoptionNoArg, (caddr_t)"on" },
{ "-synchronous", ".synchronous", XrmoptionNoArg, (caddr_t)"on" },
{ "-spy", ".spy", XrmoptionSepArg, (caddr_t)NULL },
+ { "-debug", ".debug", XrmoptionNoArg, (caddr_t)"on" },
{ "-relaydbg", ".relaydbg", XrmoptionNoArg, (caddr_t)"on" }
};
@@ -67,6 +68,7 @@
" -desktop geom Use a desktop window of the given geometry\n" \
" -display name Use the specified display\n" \
" -iconic Start as an icon\n" \
+ " -debug Enter debugger before starting application\n" \
" -name name Set the application name\n" \
" -privatemap Use a private color map\n" \
" -synchronous Turn on synchronous display mode\n" \
@@ -176,6 +178,8 @@
Options.synchronous = TRUE;
if (MAIN_GetResource( db, ".relaydbg", &value ))
Options.relay_debug = TRUE;
+ if (MAIN_GetResource( db, ".debug", &value ))
+ Options.debug = TRUE;
if (MAIN_GetResource( db, ".spy", &value))
Options.spyFilename = value.addr;
if (MAIN_GetResource( db, ".depth", &value))
@@ -274,6 +278,7 @@
Comm_DeInit();
sync_profiles();
MAIN_RestoreSetup();
+ WSACleanup();
}
/***********************************************************************
@@ -506,14 +511,6 @@
}
/***********************************************************************
-* YIELD (KERNEL.29)
-*/
-void Yield(void)
-{
- ;
-}
-
-/***********************************************************************
* SWAPMOUSEBUTTON (USER.186)
*/
BOOL SwapMouseButton(BOOL fSwap)
diff --git a/misc/message.c b/misc/message.c
index c545963..23e1be6 100644
--- a/misc/message.c
+++ b/misc/message.c
@@ -50,9 +50,10 @@
WND *wndPtr;
WNDCLASS wndClass;
MSG msg;
- MSGBOX mb;
+ LPMSGBOX lpmb;
DWORD dwStyle;
HINSTANCE hInst;
+ int nRet;
wndPtr = WIN_FindWndPtr(hWnd);
if (wndPtr == NULL) {
hInst = hSysRes;
@@ -66,6 +67,16 @@
printf("MessageBox(%04X, '%s', '%s', %04X)\n", hWnd, str, title, type);
#endif
}
+ lpmb = (LPMSGBOX) malloc(sizeof(MSGBOX));
+ memset(lpmb, 0, sizeof(MSGBOX));
+/* lpmb->Title = title;*/
+ lpmb->Title = (LPSTR) malloc(strlen(title) + 1);
+ strcpy(lpmb->Title, title);
+/* lpmb->Str = str;*/
+ lpmb->Str = (LPSTR) malloc(strlen(str) + 1);
+ strcpy(lpmb->Str, str);
+ lpmb->wType = type;
+ lpmb->ActiveFlg = TRUE;
wndClass.style = CS_HREDRAW | CS_VREDRAW ;
wndClass.lpfnWndProc = (WNDPROC)SystemMessageBoxProc;
wndClass.cbClsExtra = 0;
@@ -76,29 +87,29 @@
wndClass.hbrBackground = GetStockObject(WHITE_BRUSH);
wndClass.lpszMenuName = NULL;
wndClass.lpszClassName = "MESSAGEBOX";
+#ifdef DEBUG_MSGBOX
+ printf( "MessageBox // before RegisterClass, '%s' '%s' !\n", str, title);
+#endif
if (!RegisterClass(&wndClass)) {
printf("Unable to Register class 'MESSAGEBOX' !\n");
+ if (lpmb != NULL) free(lpmb);
return 0;
}
- memset(&mb, 0, sizeof(MSGBOX));
- mb.Title = title;
- mb.Str = str;
- mb.wType = type;
- mb.ActiveFlg = TRUE;
dwStyle = WS_POPUP | WS_DLGFRAME | WS_VISIBLE;
if ((type & (MB_SYSTEMMODAL | MB_TASKMODAL)) == 0) dwStyle |= WS_CAPTION;
hWndOld = GetFocus();
- hDlg = CreateWindow("MESSAGEBOX", title, dwStyle, 100, 150, 400, 120,
- (HWND)NULL, (HMENU)NULL, hInst, (LPSTR)&mb);
+ hDlg = CreateWindow("MESSAGEBOX", lpmb->Title, dwStyle, 100, 150, 400, 160,
+ (HWND)NULL, (HMENU)NULL, hInst, (LPSTR)lpmb);
if (hDlg == 0) {
printf("Unable to create 'MESSAGEBOX' window !\n");
+ if (lpmb != NULL) free(lpmb);
return 0;
}
#ifdef DEBUG_MSGBOX
printf( "MessageBox // before Msg Loop !\n");
#endif
while(TRUE) {
- if (!mb.ActiveFlg) break;
+ if (!lpmb->ActiveFlg) break;
if (!GetMessage(&msg, (HWND)NULL, 0, 0)) break;
TranslateMessage(&msg);
if ((type & (MB_SYSTEMMODAL | MB_TASKMODAL)) != 0 &&
@@ -115,11 +126,13 @@
DispatchMessage(&msg);
}
SetFocus(hWndOld);
+ nRet = lpmb->wRetVal;
+ if (lpmb != NULL) free(lpmb);
if (!UnregisterClass("MESSAGEBOX", hInst)) return 0;
#ifdef DEBUG_MSGBOX
- printf( "MessageBox return %04X !\n", mb.wRetVal);
+ printf( "MessageBox return %04X !\n", nRet);
#endif
- return(mb.wRetVal);
+ return(nRet);
}
@@ -148,7 +161,6 @@
DWORD OldTextColor;
RECT rect;
LPMSGBOX lpmb;
- LPMSGBOX lpmbInit;
BITMAP bm;
HBITMAP hBitMap;
HDC hMemDC;
@@ -162,10 +174,13 @@
#endif
wndPtr = WIN_FindWndPtr(hWnd);
createStruct = (CREATESTRUCT *)lParam;
- lpmbInit = (LPMSGBOX)createStruct->lpCreateParams;
- if (lpmbInit == 0) break;
- *((LPMSGBOX *)&wndPtr->wExtra[1]) = lpmbInit;
- lpmb = MsgBoxGetStorageHeader(hWnd);
+ 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",
+ lpmb->Title, lpmb->Str);
+#endif
GetClientRect(hWnd, &rect);
CopyRect(&lpmb->rectStr, &rect);
lpmb->rectStr.bottom -= 32;
@@ -255,6 +270,7 @@
printf("MessageBox WM_PAINT !\n");
#endif
lpmb = MsgBoxGetStorageHeader(hWnd);
+ if (lpmb == NULL) break;
CopyRect(&rect, &lpmb->rectStr);
hDC = BeginPaint(hWnd, &ps);
OldTextColor = SetTextColor(hDC, 0x00000000);
@@ -278,6 +294,7 @@
#endif
ReleaseCapture();
lpmb = MsgBoxGetStorageHeader(hWnd);
+ if (lpmb == NULL) break;
lpmb->ActiveFlg = FALSE;
if (lpmb->hIcon) DestroyIcon(lpmb->hIcon);
if (lpmb->hWndYes) DestroyWindow(lpmb->hWndYes);
@@ -289,6 +306,7 @@
break;
case WM_COMMAND:
lpmb = MsgBoxGetStorageHeader(hWnd);
+ if (lpmb == NULL) break;
if (wParam < IDOK || wParam > IDNO) return(0);
lpmb->wRetVal = wParam;
#ifdef DEBUG_MSGBOX
@@ -298,6 +316,7 @@
break;
case WM_CHAR:
lpmb = MsgBoxGetStorageHeader(hWnd);
+ if (lpmb == NULL) break;
if (wParam >= 'a' || wParam <= 'z') wParam -= 'a' - 'A';
switch(wParam) {
case 'Y':
diff --git a/misc/shell.c b/misc/shell.c
index f60d9ff..bb86353 100644
--- a/misc/shell.c
+++ b/misc/shell.c
@@ -8,64 +8,202 @@
#include <unistd.h>
#include "windows.h"
+typedef DWORD HKEY;
+typedef FAR LONG *LPWORD;
+DECLARE_HANDLE(HDROP);
+
+extern HINSTANCE hSysRes;
/*************************************************************************
- * RegOpenKey [SHELL.1]
+ * RegOpenKey [SHELL.1]
*/
-int RegOpenKey(void)
+LONG RegOpenKey(HKEY k, LPCSTR s, HKEY FAR *p)
{
- printf("RegOpenKey : Empty Stub !!!\n");
+ fprintf(stderr, "RegOpenKey : Empty Stub !!!\n");
}
+
/*************************************************************************
* RegCreateKey [SHELL.2]
*/
-int RegCreateKey(void)
+LONG RegCreateKey(HKEY k, LPCSTR s, HKEY FAR *p)
{
- printf("RegCreateKey : Empty Stub !!!\n");
+ fprintf(stderr, "RegCreateKey : Empty Stub !!!\n");
}
+
/*************************************************************************
- * RegCloseKey [SHELL.3]
+ * RegCloseKey [SHELL.3]
*/
-int RegCloseKey(void)
+LONG RegCloseKey(HKEY k)
{
- printf("RegCloseKey : Empty Stub !!!\n");
+ fprintf(stderr, "RegCloseKey : Empty Stub !!!\n");
}
+
/*************************************************************************
* RegDeleteKey [SHELL.4]
*/
-int RegDeleteKey(void)
+LONG RegDeleteKey(HKEY k, LPCSTR s)
{
- printf("RegDeleteKey : Empty Stub !!!\n");
+ fprintf(stderr, "RegDeleteKey : Empty Stub !!!\n");
+}
+
+
+/*************************************************************************
+ * RegSetValue [SHELL.5]
+ */
+LONG RegSetValue(HKEY k, LPCSTR s1, DWORD dw, LPCSTR s2, DWORD dw2)
+{
+ fprintf(stderr, "RegSetValue : Empty Stub !!!\n");
+}
+
+
+/*************************************************************************
+ * RegQueryValue [SHELL.6]
+ */
+LONG RegQueryValue(HKEY k, LPCSTR s, LPSTR s2, LONG FAR *p)
+{
+ fprintf(stderr, "RegQueryValue : Empty Stub !!!\n");
+}
+
+
+/*************************************************************************
+ * RegEnumKey [SHELL.7]
+ */
+LONG RegEnumKey(HKEY k, DWORD dw, LPSTR s, DWORD dw2)
+{
+ fprintf(stderr, "RegEnumKey : Empty Stub !!!\n");
+}
+
+/*************************************************************************
+ * DragAcceptFiles [SHELL.9]
+ */
+void DragAcceptFiles(HWND hWnd, BOOL b)
+{
+ fprintf(stderr, "DragAcceptFiles : Empty Stub !!!\n");
+}
+
+
+/*************************************************************************
+ * DragQueryFile [SHELL.11]
+ */
+void DragQueryFile(HDROP h, UINT u, LPSTR u2, UINT u3)
+{
+ fprintf(stderr, "DragQueryFile : Empty Stub !!!\n");
+
+}
+
+
+/*************************************************************************
+ * DragFinish [SHELL.12]
+ */
+void DragFinish(HDROP h)
+{
+ fprintf(stderr, "DragFinish : Empty Stub !!!\n");
+
+}
+
+
+/*************************************************************************
+ * DragQueryPoint [SHELL.13]
+ */
+BOOL DragQueryPoint(HDROP h, POINT FAR *p)
+{
+ fprintf(stderr, "DragQueryPoinyt : Empty Stub !!!\n");
+
}
/*************************************************************************
* ShellExecute [SHELL.20]
*/
-int ShellExecute(LPSTR ptr)
+HINSTANCE ShellExecute(HWND hwnd, LPCSTR lpOperation, LPCSTR lpFile, LPCSTR lpParameters, LPCSTR lpDirectory, int iShowCmd)
{
- printf("ShellExecute : Empty Stub !!!\n");
+ fprintf(stderr, "ShellExecute : Empty Stub !!!\n");
}
/*************************************************************************
+ * FindExecutable [SHELL.21]
+ */
+HINSTANCE FindExecutable(LPCSTR lpFile, LPCSTR lpDirectory, LPSTR lpResult)
+{
+ fprintf(stderr, "FindExecutable : Empty Stub !!!\n");
+
+}
+
+char AppName[256], AppMisc[256];
+
+/*************************************************************************
+ * AboutDlgProc [SHELL.33]
+ */
+INT AboutDlgProc(HWND hWnd, WORD msg, WORD wParam, LONG lParam)
+{
+ char temp[256];
+
+ switch(msg) {
+ case WM_INITDIALOG:
+ sprintf(temp, "About %s", AppName);
+/* SetDlgItemText(hWnd, 0, temp);*/
+ SetDlgItemText(hWnd, 100, AppMisc);
+ break;
+
+ case WM_COMMAND:
+ switch (wParam) {
+ case IDOK:
+ EndDialog(hWnd, TRUE);
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+/*************************************************************************
+ * ShellAbout [SHELL.22]
+ */
+INT ShellAbout(HWND hWnd, LPCSTR szApp, LPCSTR szOtherStuff, HICON hIcon)
+{
+ fprintf(stderr, "ShellAbout ! (%s, %s)\n", szApp, szOtherStuff);
+
+ strcpy(AppName, szApp);
+ strcpy(AppMisc, szOtherStuff);
+
+ return DialogBox(hSysRes, "SHELL_ABOUT_MSGBOX", hWnd, (FARPROC)AboutDlgProc);
+}
+
+
+/*************************************************************************
+ * ExtractIcon [SHELL.34]
+ */
+HICON ExtractIcon(HINSTANCE hInst, LPCSTR lpszExeFileName, UINT nIconIndex)
+{
+ fprintf(stderr, "ExtractIcon : Empty Stub !!!\n");
+
+}
+
+
+/*************************************************************************
+ * ExtractAssociatedIcon [SHELL.36]
+ */
+HICON ExtractAssociatedIcon(HINSTANCE hInst,LPSTR lpIconPath, LPWORD lpiIcon)
+{
+ fprintf(stderr, "ExtractAssociatedIcon : Empty Stub !!!\n");
+}
+
+/*************************************************************************
* RegisterShellHook [SHELL.102]
*/
int RegisterShellHook(void *ptr)
{
- printf("RegisterShellHook : Empty Stub !!!\n");
+ fprintf(stderr, "RegisterShellHook : Empty Stub !!!\n");
}
+
/*************************************************************************
* ShellHookProc [SHELL.103]
*/
int ShellHookProc(void)
{
- printf("ShellHookProc : Empty Stub !!!\n");
+ fprintf(stderr, "ShellHookProc : Empty Stub !!!\n");
}
-
-
-
diff --git a/misc/sound.c b/misc/sound.c
index c976a97..0728953 100644
--- a/misc/sound.c
+++ b/misc/sound.c
@@ -63,6 +63,40 @@
return 0;
}
+int WaitSoundState(int x)
+{
+ fprintf(stderr, "WaitSoundState(%d)\n", x);
+}
+
+SyncAllVoices(void)
+{
+ fprintf(stderr, "SyncAllVoices()\n");
+}
+
+int CountVoiceNotes(int x)
+{
+ fprintf(stderr, "CountVoiceNotes(%d)\n", x);
+}
+
+LPINT GetThresholdEvent(void)
+{
+ fprintf(stderr, "GetThresholdEvent()\n");
+}
+
+GetThresholdStatus(void)
+{
+ fprintf(stderr, "GetThresholdStatus()\n");
+}
+
+int SetVoiceThreshold(int a, int b)
+{
+ fprintf(stderr, "SetVoiceThreshold(%d,%d)\n", a, b);
+}
+
+void DoBeep(void)
+{
+ fprintf(stderr, "BEEP!\n");
+}
/*
11 pascal WAITSOUNDSTATE(word) WaitSoundState(1)
@@ -71,7 +105,4 @@
14 pascal GETTHRESHOLDEVENT() GetThresholdEvent()
15 pascal GETTHRESHOLDSTATUS() GetThresholdStatus()
16 pascal SETVOICETHRESHOLD(word word) SetVoiceThreshold(1 2)
-
-
-
*/
diff --git a/miscemu/emulate.c b/miscemu/emulate.c
index b43f9f3..fd9cc05 100644
--- a/miscemu/emulate.c
+++ b/miscemu/emulate.c
@@ -18,8 +18,8 @@
int
WIN87_fpmath()
{
- printf( "_fpmath: (%d)\n",_BX);
-
+ printf( "_fpmath: (%x:%x %x %x)\n",_CONTEXT->sc_cs, _CONTEXT->sc_eip,
+ _CONTEXT->sc_es, _BX);
switch(_BX )
{
diff --git a/objects/bitblt.c b/objects/bitblt.c
index 24f05e0..4302362 100644
--- a/objects/bitblt.c
+++ b/objects/bitblt.c
@@ -63,7 +63,7 @@
printf( "BitBlt: %d %d,%d %dx%d %d %d,%d %08x\n",
hdcDest, xDest, yDest, width, height, hdcSrc, xSrc, ySrc, rop );
#endif
-
+ if (width == 0 || height == 0) return FALSE;
if ((rop & 0xcc0000) == ((rop & 0x330000) << 2))
return PatBlt( hdcDest, xDest, yDest, width, height, rop );
@@ -311,6 +311,7 @@
DC *dcDest, *dcSrc;
XImage *sxi, *dxi;
WORD stretchmode;
+ BOOL flg;
#ifdef DEBUG_GDI
fprintf(stderr, "StretchBlt: %d %d,%d %dx%d %d %d,%d %dx%d %08x\n",
@@ -320,6 +321,8 @@
((DC *)GDI_GetObjPtr(hdcDest, DC_MAGIC))->w.stretchBltMode);
#endif
+ if (widthDest == 0 || heightDest == 0) return FALSE;
+ if (widthSrc == 0 || heightSrc == 0) return FALSE;
if ((rop & 0xcc0000) == ((rop & 0x330000) << 2))
return PatBlt( hdcDest, xDest, yDest, widthDest, heightDest, rop );
diff --git a/windows/event.c b/windows/event.c
index b69223e..f2402b3 100644
--- a/windows/event.c
+++ b/windows/event.c
@@ -17,9 +17,11 @@
#include "class.h"
#include "message.h"
+#ifdef ndef
#ifndef FamilyAmoeba
typedef char *XPointer;
#endif
+#endif
#define NB_BUTTONS 3 /* Windows can handle 3 buttons */
diff --git a/windows/mdi.c b/windows/mdi.c
index ae04cd4..b2aadff 100644
--- a/windows/mdi.c
+++ b/windows/mdi.c
@@ -531,7 +531,7 @@
if (hbitmapClose == 0)
{
- hbitmapClose = LoadBitmap(0, MAKEINTRESOURCE(OBM_CLOSE));
+ hbitmapClose = LoadBitmap(0, MAKEINTRESOURCE(OBM_OLD_CLOSE));
hbitmapMaximized = LoadBitmap(0, MAKEINTRESOURCE(OBM_RESTORE));
}
diff --git a/windows/nonclient.c b/windows/nonclient.c
index 078bd00..a717031 100644
--- a/windows/nonclient.c
+++ b/windows/nonclient.c
@@ -524,9 +524,9 @@
WND *wndPtr = WIN_FindWndPtr( hwnd );
#ifdef DEBUG_NONCLIENT
- printf( "NC_HandleNCPaint: %d %d\n", hwnd, hrgn );
+ printf( "NC_DoNCPaint: %d %d\n", hwnd, hrgn );
#endif
-
+ if (!IsWindowVisible(hwnd)) return;
if (!wndPtr || !hrgn) return;
if (!(wndPtr->dwStyle & (WS_BORDER | WS_DLGFRAME | WS_THICKFRAME)))
return; /* Nothing to do! */
@@ -1058,26 +1058,7 @@
ScreenToClient(hwnd, &pt);
pt.y += lppop->rect.bottom;
SetCapture(hwnd);
- if (!MenuButtonDown(hwnd, lppop, pt.x, pt.y)) {
- do {
- if (!GetMessage(&msg, (HWND)NULL, 0, 0)) break;
- ScreenToClient(hwnd, &msg.pt);
- msg.pt.y += lppop->rect.bottom;
- switch(msg.message) {
- case WM_LBUTTONUP:
- MenuButtonUp(hwnd, lppop, msg.pt.x, msg.pt.y);
- break;
- case WM_MOUSEMOVE:
- MenuMouseMove(hwnd, lppop, msg.wParam, msg.pt.x, msg.pt.y);
- break;
- default:
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- break;
- }
- } while (msg.message != WM_LBUTTONUP);
- ReleaseCapture();
- }
+ MenuButtonDown(hwnd, lppop, pt.x, pt.y);
GlobalUnlock(wndPtr->wIDmenu);
}
diff --git a/windows/win.c b/windows/win.c
index 799cf7e..aac7dcd 100644
--- a/windows/win.c
+++ b/windows/win.c
@@ -245,8 +245,9 @@
XSetWindowAttributes win_attr;
#ifdef DEBUG_WIN
- printf( "CreateWindowEx: %d '%s' '%s' %d,%d %dx%d %08x %x\n",
- exStyle, className, windowName, x, y, width, height, style, parent);
+ printf( "CreateWindowEx: %04X '%s' '%s' %04X %d,%d %dx%d %04X %04X %04X %08X\n",
+ exStyle, className, windowName, style, x, y, width, height,
+ parent, menu, instance, data);
#endif
if (x == CW_USEDEFAULT) x = y = 0;
@@ -431,6 +432,9 @@
/* Create a copy of SysMenu */
if (style & WS_SYSMENU) wndPtr->hSysMenu = CopySysMenu();
+ /* Register window in current task windows list */
+ AddWindowToTask(GetCurrentTask(), hwnd);
+
/* Set window cursor */
if (classPtr->wc.hCursor) CURSOR_SetWinCursor( hwnd, classPtr->wc.hCursor);
else CURSOR_SetWinCursor( hwnd, LoadCursor( 0, IDC_ARROW ));
@@ -474,8 +478,10 @@
DestroyWindow( wndPtr->hwndChild );
SendMessage( hwnd, WM_NCDESTROY, 0, 0 );
- /* Remove the window from the linked list */
+ /* Remove the window from current task windows list */
+ RemoveWindowFromTask(GetCurrentTask(), hwnd);
+ /* Remove the window from the linked list */
WIN_UnlinkWindow( hwnd );
/* Destroy the window */
@@ -957,6 +963,16 @@
}
/*******************************************************************
+ * AnyPopup [USER.52]
+ */
+BOOL AnyPopup()
+{
+ printf("EMPTY STUB !! AnyPopup !\n");
+ return FALSE;
+}
+
+
+/*******************************************************************
* SetSysModalWindow [USER.188]
*/
HWND SetSysModalWindow(HWND hWnd)
@@ -967,6 +983,7 @@
return hWndOldModal;
}
+
/*******************************************************************
* GetSysModalWindow [USER.189]
*/