Release 940614
Tue Jun 14 08:09:14 1994 Bob Amstadt (bob@pooh)
* loader/selector.c (GetCurrentPDB):
Added trivial function GetCurrentPDB() which returns the program
segment prefix selector.
* memory/heap.c (HEAP_Free):
If free list is empty, make the freed block the free list.
Fri Jun 10 07:56:49 1994 Bob Amstadt (bob@pooh)
* controls/edit.c (EDIT_SetTextMsg):
Do not append a newline at the end of the last line.
* windows/event.c (SetCapture):
Set winHasCursor if mouse capture succeeds.
Jun 13, 94 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte)
* [controls/listbox.c]
Fix bug in listbox : InsertString should call AddString if -1.
* [controls/menu.c]
New function GetMenuState().
* [controls/scroll.c] [windows/nonclient.c]
Try to make ShowScrollBar() recalc NC_ regions. Not finished !
* [objects/text.c]
Add Stub for TabbedTextOut(), which temporarely call Textout().
* [windows/keyboard.c] [windows/event.c]
New function GetKeyBoardState() with an KeyStateTable array
& associated handling in function EVENT_key().
Mon Jun 13 16:45:24 MET DST 1994 (erik@hacktic.nl)
* [controls/menu.c]
IsMenu() added.
* [loader/library.c]
ModuleFirst(), ModuleNext(), ModuleFindName(), ModuleFindHandle()
added.
* [object/gdiobj.c]
IsGDIObject() added.
* [miscemu/int2[56].c]
bugfix: both didn't leave flags pushed on 16bit-stack.
(winfile gets a bit further)
* [miscemu/int16.c]
Added (empty).
Sat Jun 11 22:56:48 1994 Jon Tombs (jon@esix2.us.es)
* windows/event.c:
Added code to drop redundant motion Events in the XEvent queue.
Thu Jun 9 10:55:55 MET DST 1994 Jochen Hein ( Hein@Student.TU-Clausthal.de )
* [misc/main.c misc/message.c include/texts.h]
Removed the text-constants from message.c into variables
which may be changed from X-resources.
* [misc/main.c misc/message.c]
added <locale.h> and setlocale() to main.c, used toupper() in message.c
Mon, 13 Jun 94 09:41:16 -0500 Paul Bramel <paulbr@comm.mot.com>
* controls/button.c ( [CR]B_LButton* )
left rc.right at full window width so click on label also
activates the control (MSWin behavior)
Sat Jun 11 19:05:40 1994 Olaf Flebbe (flebbe@tat.physik.uni-tuebingen.de)
* include/windows.h:
functions pointers can not be packed.
(annoying warnings with forthcomming gcc-2.6.x)
* loader/main.c (InitDLL):
Fixed a printf statement. (for control.exe)
(InitializeLoadedDLLs):
deleted shadow definition of *wpnt.
(Breaks many programs, because now COMMDLG will be
initialized :-(
* windows/win.c (SetWindowText):
added missing breaks; (PENSATE starts)
* windows/graphics.c (FloodFill):
Proper boundarys. (BANGBANG starts) FloodFile_rec should
be rewritten.
* objects/font.c (FONT_GetMetrics):
TYPO: use font->perchar only if it is defined. (WRITE starts)
Sun June 12, Peter Broadhurst (pbr@ua.nwl.ac.uk)
controls/scroll.c:
Fixes for improved behaviour when dragging thumb;
Added SB_THUMBPOSITION message when thumb is released.
diff --git a/ChangeLog b/ChangeLog
index 407674d..001d4ad 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,107 @@
+----------------------------------------------------------------------
+Tue Jun 14 08:09:14 1994 Bob Amstadt (bob@pooh)
+
+ * loader/selector.c (GetCurrentPDB):
+ Added trivial function GetCurrentPDB() which returns the program
+ segment prefix selector.
+
+ * memory/heap.c (HEAP_Free):
+ If free list is empty, make the freed block the free list.
+
+Fri Jun 10 07:56:49 1994 Bob Amstadt (bob@pooh)
+
+ * controls/edit.c (EDIT_SetTextMsg):
+ Do not append a newline at the end of the last line.
+
+ * windows/event.c (SetCapture):
+ Set winHasCursor if mouse capture succeeds.
+
+Jun 6, 94 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte)
+
+ * [controls/listbox.c]
+ Fix bug in listbox : InsertString should call AddString if -1.
+
+ * [controls/menu.c]
+ New function GetMenuState().
+
+ * [controls/scroll.c] [windows/nonclient.c]
+ Try to make ShowScrollBar() recalc NC_ regions. Not finished !
+
+ * [objects/text.c]
+ Add Stub for TabbedTextOut(), which temporarely call Textout().
+
+ * [windows/keyboard.c] [windows/event.c]
+ New function GetKeyBoardState() with an KeyStateTable array
+ & associated handling in function EVENT_key().
+
+Mon Jun 13 16:45:24 MET DST 1994 (erik@hacktic.nl)
+
+ * [controls/menu.c]
+ IsMenu() added.
+
+ * [loader/library.c]
+ ModuleFirst(), ModuleNext(), ModuleFindName(), ModuleFindHandle()
+ added.
+
+ * [object/gdiobj.c]
+ IsGDIObject() added.
+
+ * [miscemu/int2[56].c]
+ bugfix: both didn't leave flags pushed on 16bit-stack.
+ (winfile gets a bit further)
+
+ * [miscemu/int16.c]
+ Added (empty).
+
+Sat Jun 11 22:56:48 1994 Jon Tombs (jon@esix2.us.es)
+ * windows/event.c:
+ Added code to drop redundant motion Events in the XEvent queue.
+
+Thu Jun 9 10:55:55 MET DST 1994 Jochen Hein ( Hein@Student.TU-Clausthal.de )
+
+ * [misc/main.c misc/message.c include/texts.h]
+ Removed the text-constants from message.c into variables
+ which may be changed from X-resources.
+
+ * [misc/main.c misc/message.c]
+ added <locale.h> and setlocale() to main.c, used toupper() in message.c
+
+Mon, 13 Jun 94 09:41:16 -0500 Paul Bramel <paulbr@comm.mot.com>
+
+ * controls/button.c ( [CR]B_LButton* )
+ left rc.right at full window width so click on label also
+ activates the control (MSWin behavior)
+
+Sat Jun 11 19:05:40 1994 Olaf Flebbe (flebbe@tat.physik.uni-tuebingen.de)
+
+ * include/windows.h:
+ functions pointers can not be packed.
+ (annoying warnings with forthcomming gcc-2.6.x)
+
+ * loader/main.c (InitDLL):
+ Fixed a printf statement. (for control.exe)
+
+ (InitializeLoadedDLLs):
+ deleted shadow definition of *wpnt.
+ (Breaks many programs, because now COMMDLG will be
+ initialized :-(
+
+ * windows/win.c (SetWindowText):
+ added missing breaks; (PENSATE starts)
+
+ * windows/graphics.c (FloodFill):
+ Proper boundarys. (BANGBANG starts) FloodFile_rec should
+ be rewritten.
+
+ * objects/font.c (FONT_GetMetrics):
+ TYPO: use font->perchar only if it is defined. (WRITE starts)
+
+Sun June 12, Peter Broadhurst (pbr@ua.nwl.ac.uk)
+ controls/scroll.c:
+ Fixes for improved behaviour when dragging thumb;
+ Added SB_THUMBPOSITION message when thumb is released.
+
+----------------------------------------------------------------------
Tue Jun 7 08:41:27 1994 Bob Amstadt (bob@pooh)
* loader/selector.c (FixupFunctionPrologs):
@@ -69,7 +173,7 @@
Jun 6, 94 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte)
- * [tools/.c]
+ * [tools/build.c]
Change MAX_ORDINALS define to higher value, 1299 entries.
(MMSYSTEM doesn't have succesive numbers, some are around 1200).
@@ -83,9 +187,6 @@
* [misc/message.c] [controls/combo.c]
Add an InvalidateRect() in WM_SHOWWINDOW to statisfy the new 'saveunder'.
- * [windows/winpos.c]
- Bug fix in SetWindowPos(), (redraw was done if SWP_NOREDRAW set).
-
* [windows/win.c]
In CreateWindowEx(), do SetMenu() calls after window creation,
just before sending to WM_NCCALCSIZE.
diff --git a/DEVELOPERS-HINTS b/DEVELOPERS-HINTS
index da8a598..2ea1e9f 100644
--- a/DEVELOPERS-HINTS
+++ b/DEVELOPERS-HINTS
@@ -1,16 +1,10 @@
This is intend to be a document to help new developers get started.
Existing developers should feel free to add there comments.
-RESERVING WINE PROJECT ARES:
-
-If you wish to work on a specific set of API functions. Send
-mail to wine-project@amscons.com. The automatic mail handler
-will provide you with instructions.
-
SUBMITTING YOUR WORK:
Submissions of code for inclussion into Wine should be sent to
-bob@amscons.com (Bob Amstadt). You MUST provide a suitable
+wine-new@amscons.com (Bob Amstadt). You MUST provide a suitable
ChangeLog entry for any work that you submit. I prefer new code
to be submitted as unified diffs (diff -u) off of the latest release.
Releases are every Tuesday evening (approximately 17:00 PST or
diff --git a/Imakefile b/Imakefile
index f87fc8f..fec5a48 100644
--- a/Imakefile
+++ b/Imakefile
@@ -100,4 +100,4 @@
install::
etags::
- etags `find . -name '*.[chS]'`
\ No newline at end of file
+ etags `find . -name '*.[chS]'`
diff --git a/README b/README
index 5432ca5..20e5748 100644
--- a/README
+++ b/README
@@ -38,9 +38,9 @@
NetBSD-current
FreeBSD-current or FreeBSD 1.1
-To build Wine, first do a "./Configure" and then a "make". The
-executable "wine" will be built. "wine" will load and run 16-bit
-Windows' executables.
+To build Wine, first do a "./Configure" and then a "make" (or "gmake"
+if you're running *BSD). The executable "wine" will be built. "wine"
+will load and run 16-bit Windows' executables.
diff --git a/controls/button.c b/controls/button.c
index 8d96819..67de0ab 100644
--- a/controls/button.c
+++ b/controls/button.c
@@ -540,7 +540,6 @@
delta = (rc.bottom - rc.top - tm.tmHeight) >> 1;
rc.top += delta;
rc.bottom = tm.tmHeight + delta;
- rc.right = tm.tmHeight;
if (PtInRect(&rc, MAKEPOINT(lParam)))
{
SetFocus(hWnd);
@@ -569,7 +568,6 @@
delta = (rc.bottom - rc.top - tm.tmHeight) >> 1;
rc.top += delta;
rc.bottom = tm.tmHeight + delta;
- rc.right = tm.tmHeight;
if (PtInRect(&rc, MAKEPOINT(lParam)))
{
@@ -625,7 +623,6 @@
delta = (rc.bottom - rc.top - tm.tmHeight) >> 1;
rc.top += delta;
rc.bottom = tm.tmHeight + delta;
- rc.right = tm.tmHeight;
if (PtInRect(&rc, MAKEPOINT(lParam)))
NOTIFY_PARENT(hWnd, BN_DOUBLECLICKED);
}
@@ -744,7 +741,6 @@
delta = (rc.bottom - rc.top - tm.tmHeight) >> 1;
rc.top += delta;
rc.bottom = tm.tmHeight + delta;
- rc.right = tm.tmHeight;
if (PtInRect(&rc, MAKEPOINT(lParam)))
{
SetFocus(hWnd);
@@ -773,7 +769,6 @@
delta = (rc.bottom - rc.top - tm.tmHeight) >> 1;
rc.top += delta;
rc.bottom = tm.tmHeight + delta;
- rc.right = tm.tmHeight;
if (PtInRect(&rc, MAKEPOINT(lParam)))
{
@@ -801,7 +796,6 @@
delta = (rc.bottom - rc.top - tm.tmHeight) >> 1;
rc.top += delta;
rc.bottom = tm.tmHeight + delta;
- rc.right = tm.tmHeight;
if (PtInRect(&rc, MAKEPOINT(lParam)))
NOTIFY_PARENT(hWnd, BN_DOUBLECLICKED);
}
diff --git a/controls/combo.c b/controls/combo.c
index 22a1b08..ef6c3b7 100644
--- a/controls/combo.c
+++ b/controls/combo.c
@@ -103,6 +103,14 @@
printf("Combo WM_DESTROY %lX !\n", lphc);
#endif
return DefWindowProc( hwnd, message, wParam, lParam );
+ case WM_SHOWWINDOW:
+#ifdef DEBUG_COMBO
+ printf("ComboBox WM_SHOWWINDOW hWnd=%04X !\n", hwnd);
+#endif
+ if (!(wParam == 0 && lParam == 0L)) {
+ InvalidateRect(hwnd, NULL, TRUE);
+ }
+ break;
case WM_COMMAND:
wndPtr = WIN_FindWndPtr(hwnd);
diff --git a/controls/edit.c b/controls/edit.c
index 8d43172..abafcfe 100644
--- a/controls/edit.c
+++ b/controls/edit.c
@@ -15,9 +15,7 @@
#include "class.h"
#include "user.h"
-/*
-#define DEBUG_EDIT
-*/
+#define DEBUG_EDIT /* */
#define NOTIFY_PARENT(hWndCntrl, wNotifyCode) \
SendMessage(GetParent(hWndCntrl), WM_COMMAND, \
@@ -1993,7 +1991,7 @@
es->hText = EDIT_HEAP_REALLOC(es->hText, len + 3);
text = EDIT_HEAP_ADDR(es->hText);
strcpy(text, (char *)lParam);
- text[len] = '\n';
+/* text[len] = '\n'; */ /* Removed by Bob Amstadt */
text[len + 1] = '\0';
text[len + 2] = '\0';
EDIT_BuildTextPointers(hwnd);
diff --git a/controls/listbox.c b/controls/listbox.c
index 522131a..196cb9b 100644
--- a/controls/listbox.c
+++ b/controls/listbox.c
@@ -833,6 +833,10 @@
HANDLE hTemp;
LPSTR str;
UINT Count;
+#ifdef DEBUG_LISTBOX
+ printf("ListBoxInsertString(%04X, %d, %08X);\n", hwnd, uIndex, newstr);
+#endif
+ if (uIndex == (UINT)-1) return ListBoxAddString(hwnd, newstr);
lphl = ListBoxGetWindowAndStorage(hwnd, &wndPtr);
if (lphl == NULL) return LB_ERR;
if (uIndex >= lphl->ItemsCount) return LB_ERR;
@@ -846,7 +850,7 @@
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");
+ printf("ListBoxInsertString() // Bad allocation of new item !\n");
return LB_ERRSPACE;
}
ListBoxDefaultItem(hwnd, wndPtr, lphl, lplsnew);
@@ -862,6 +866,9 @@
if (str == NULL) return LB_ERRSPACE;
strcpy(str, newstr);
newstr = str;
+#ifdef DEBUG_LISTBOX
+ printf("ListBoxInsertString // after strcpy '%s'\n", str);
+#endif
}
}
lplsnew->lpNext = NULL;
@@ -886,6 +893,9 @@
InvalidateRect(hwnd, NULL, TRUE);
UpdateWindow(hwnd);
}
+#ifdef DEBUG_LISTBOX
+ printf("ListBoxInsertString // count=%d\n", lphl->ItemsCount);
+#endif
return lphl->ItemsCount;
}
diff --git a/controls/menu.c b/controls/menu.c
index 6470497..58a9865 100644
--- a/controls/menu.c
+++ b/controls/menu.c
@@ -845,6 +845,9 @@
if (lpitem == NULL) goto EndOfPaint;
for(i = 0; i < lppop->nItems; i++) {
CopyRect(&rect2, &lpitem->rect);
+#ifdef DEBUG_MENU
+ printf("StdDrawMenuBar // start left=%d\n", rect2.left);
+#endif
if ((lpitem->item_flags & MF_CHECKED) == MF_CHECKED) {
hMemDC = CreateCompatibleDC(hDC);
if (lpitem->hCheckBit == 0) {
@@ -856,7 +859,11 @@
GetObject(lpitem->hCheckBit, sizeof(BITMAP), (LPSTR)&bm);
}
BitBlt(hDC, rect2.left, rect2.top + 1,
- bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+ bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+ rect2.left += bm.bmWidth;
+#ifdef DEBUG_MENU
+ printf("StdDrawMenuBar // MF_CHECKED bm.bmWidth=%d\n", bm.bmWidth);
+#endif
DeleteDC(hMemDC);
}
else {
@@ -866,6 +873,10 @@
GetObject(lpitem->hUnCheckBit, sizeof(BITMAP), (LPSTR)&bm);
BitBlt(hDC, rect2.left, rect2.top + 1,
bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+ rect2.left += bm.bmWidth;
+#ifdef DEBUG_MENU
+ printf("StdDrawMenuBar // MF_UNCHECKED bm.bmWidth=%d\n", bm.bmWidth);
+#endif
DeleteDC(hMemDC);
}
}
@@ -898,6 +909,9 @@
}
if ((lpitem->item_flags & MF_HILITE) == MF_HILITE)
FillRect(hDC, &rect2, GetStockObject(BLACK_BRUSH));
+#ifdef DEBUG_MENU
+ printf("StdDrawMenuBar // rect2.left=%d\n", rect2.left);
+#endif
DrawText(hDC, lpitem->item_text, -1, &rect2,
DT_LEFT | DT_VCENTER | DT_SINGLELINE);
SetTextColor(hDC, OldTextColor);
@@ -1073,13 +1087,15 @@
lprect->left, lprect->top, lprect->right, lprect->bottom);
#endif
hOldFont = SelectObject(hDC, GetStockObject(SYSTEM_FONT));
- LineHeight = OldHeight = SYSMETRICS_CYMENU + 1;
+ lppop->CheckWidth = 0;
+ LineHeight = OldHeight = SYSMETRICS_CYMENU + 2;
SetRect(&rect, lprect->left, lprect->top, 0, lprect->top + LineHeight);
lpitem2 = lppop->firstItem;
while (lpitem != NULL) {
lpitem = lpitem2;
while(rect.right < lprect->right) {
if (lpitem == NULL) break;
+ rect.right = rect.left;
if ((lpitem->item_flags & MF_BITMAP) == MF_BITMAP) {
hBitMap = (HBITMAP)LOWORD((LONG)lpitem->item_text);
GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&bm);
@@ -1095,6 +1111,21 @@
dwRet = max(SYSMETRICS_CYMENU, (HIWORD(dwRet) + 6));
LineHeight = max(LineHeight, (WORD)dwRet);
}
+ if ((lpitem->item_flags & MF_CHECKED) == MF_CHECKED) {
+ if (lpitem->hCheckBit != 0)
+ GetObject(lpitem->hCheckBit, sizeof(BITMAP), (LPSTR)&bm);
+ else
+ GetObject(hStdCheck, sizeof(BITMAP), (LPSTR)&bm);
+ rect.right += bm.bmWidth;
+ LineHeight = max(LineHeight, bm.bmHeight);
+ }
+ else {
+ if (lpitem->hUnCheckBit != 0) {
+ GetObject(lpitem->hUnCheckBit, sizeof(BITMAP), (LPSTR)&bm);
+ rect.right += bm.bmWidth;
+ LineHeight = max(LineHeight, bm.bmHeight);
+ }
+ }
CopyRect(&lpitem->rect, &rect);
rect.left = rect.right;
lpitem = (LPMENUITEM)lpitem->next;
@@ -1112,7 +1143,7 @@
}
}
lppop->Width = lprect->right - lprect->left;
- lppop->Height = rect.bottom - lprect->top;
+ lppop->Height = rect.bottom - lprect->top;
lprect->bottom = lprect->top + lppop->Height;
CopyRect(&lppop->rect, lprect);
#ifdef DEBUG_MENUCALC
@@ -1362,8 +1393,10 @@
{
LPPOPUPMENU menu;
LPMENUITEM lpitem;
+#ifdef DEBUG_MENU
printf("HiliteMenuItem(%04X, %04X, %04X, %04X);\n",
hWnd, hMenu, wItemID, wHilite);
+#endif
menu = (LPPOPUPMENU) GlobalLock(hMenu);
if (menu == NULL) return FALSE;
lpitem = FindMenuItem(hMenu, wItemID, wHilite);
@@ -1373,6 +1406,24 @@
/**********************************************************************
+ * GetMenuState [USER.250]
+ */
+WORD GetMenuState(HMENU hMenu, WORD wItemID, WORD wFlags)
+{
+ LPPOPUPMENU menu;
+ LPMENUITEM lpitem;
+#ifdef DEBUG_MENU
+ printf("GetMenuState(%04X, %04X, %04X);\n", hMenu, wItemID, wFlags);
+#endif
+ menu = (LPPOPUPMENU) GlobalLock(hMenu);
+ if (menu == NULL) return -1;
+ lpitem = FindMenuItem(hMenu, wItemID, wFlags);
+ if (lpitem == NULL) return -1;
+ return lpitem->item_flags;
+}
+
+
+/**********************************************************************
* GetMenuItemCount [USER.263]
*/
WORD GetMenuItemCount(HMENU hMenu)
@@ -2186,10 +2237,20 @@
#endif
lppop = (LPPOPUPMENU) GlobalLock(wndPtr->wIDmenu);
if (lppop == NULL) return;
- if ((lppop->rect.bottom - lppop->rect.top) != 0) {
+ if (lppop->Height != 0) {
+ int oldHeight;
+ oldHeight = lppop->Height;
hDC = GetWindowDC(hWnd);
StdDrawMenuBar(hDC, &lppop->rect, lppop, FALSE);
ReleaseDC(hWnd, hDC);
+ if (oldHeight != lppop->Height) {
+ printf("DrawMenuBar // menubar changed oldHeight=%d != lppop->Height=%d\n",
+ oldHeight, lppop->Height);
+ /* Reduce ClientRect according to MenuBar height */
+ wndPtr->rectClient.top -= oldHeight;
+ wndPtr->rectClient.top += lppop->Height;
+ SendMessage(hWnd, WM_NCPAINT, 1, 0L);
+ }
}
else
SendMessage(hWnd, WM_NCPAINT, 1, 0L);
@@ -2319,4 +2380,17 @@
return next_item;
}
+/**********************************************************************
+ * IsMenu(USER.358)
+ */
+BOOL IsMenu(HMENU hMenu)
+{
+ LPPOPUPMENU menu;
+ menu = (LPPOPUPMENU) GlobalLock(hMenu);
+ if (menu == NULL)
+ return FALSE;
+
+ GlobalUnlock(hMenu);
+ return TRUE;
+}
diff --git a/controls/scroll.c b/controls/scroll.c
index af1d12d..e962e8c 100644
--- a/controls/scroll.c
+++ b/controls/scroll.c
@@ -1,8 +1,10 @@
-/*
+/*
* Interface code to SCROLLBAR widget
*
* Copyright Martin Ayotte, 1993
*
+ * Small fixes and implemented SB_THUMBPOSITION
+ * by Peter Broadhurst, 940611
*/
/*
@@ -58,6 +60,8 @@
RECT rect, rect2;
LPCREATESTRUCT lpCreat;
static RECT rectsel;
+ POINT *pt;
+ pt=(POINT*)&lParam;
switch(message) {
case WM_CREATE:
lpCreat = (LPCREATESTRUCT)lParam;
@@ -95,15 +99,15 @@
case WM_LBUTTONDOWN:
SetCapture(hWnd);
- ScrollBarButtonDown(hWnd, SB_CTL, LOWORD(lParam), HIWORD(lParam));
+ ScrollBarButtonDown(hWnd, SB_CTL, pt->x,pt->y);
break;
case WM_LBUTTONUP:
ReleaseCapture();
- ScrollBarButtonUp(hWnd, SB_CTL, LOWORD(lParam), HIWORD(lParam));
+ ScrollBarButtonUp(hWnd, SB_CTL, pt->x,pt->y);
break;
case WM_MOUSEMOVE:
- ScrollBarMouseMove(hWnd, SB_CTL, wParam, LOWORD(lParam), HIWORD(lParam));
+ ScrollBarMouseMove(hWnd, SB_CTL, wParam, pt->x,pt->y);
break;
case WM_KEYDOWN:
case WM_KEYUP:
@@ -297,7 +301,24 @@
printf("ScrollBarButtonUp // x=%d y=%d\n", x, y);
#endif
lphs = GetScrollObjectStruct(hWnd, nBar);
- lphs->ThumbActive = FALSE;
+ if(lphs->ThumbActive)
+ {
+ HWND hWndOwner,hWndParent;
+ if (nBar == SB_CTL) {
+ hWndParent = GetParent(hWnd);
+ hWndOwner = lphs->hWndOwner;
+ }
+ else {
+ hWndParent = hWnd;
+ hWndOwner = 0;
+ }
+
+
+ SendMessage(hWndParent, lphs->Direction,
+ SB_THUMBPOSITION, MAKELONG(lphs->ThumbVal, hWndOwner));
+ lphs->ThumbActive = FALSE;
+ }
+
if (lphs->ButtonDown != 0) {
lphs->ButtonDown = 0;
if (nBar == SB_CTL) {
@@ -337,21 +358,38 @@
printf("ScrollBarButtonMove SB_?SCROLL // x=%d y=%d\n", x, y);
#endif
}
- if (lphs->Direction == WM_VSCROLL) {
- int butsiz = lphs->rect.right - lphs->rect.left;
- y = y - butsiz - (butsiz >> 1);
- }
- else {
- int butsiz = lphs->rect.bottom - lphs->rect.top;
- y = x - butsiz - (butsiz >> 1);
- }
- x = (y * (lphs->MaxVal - lphs->MinVal) /
- lphs->MaxPix) + lphs->MinVal;
+
+ if(x<lphs->rect.left||x>lphs->rect.right||
+ y<lphs->rect.top||y>lphs->rect.bottom)
+ {
+
#ifdef DEBUG_SCROLL
- printf("Scroll WM_MOUSEMOVE val=%d pix=%d\n", x, y);
+ printf("Rejecting thumb position !\n");
+#endif
+ lphs->ThumbVal=lphs->CurVal;/*revert to last set position*/
+ }
+ else
+ {
+
+ if (lphs->Direction == WM_VSCROLL) {
+ int butsiz = lphs->rect.right - lphs->rect.left;
+ y = y - butsiz - (butsiz >> 1);
+ }
+ else {
+ int butsiz = lphs->rect.bottom - lphs->rect.top;
+ y = x - butsiz - (butsiz >> 1);
+ }
+ if(y<0)y=0;
+ if(y>lphs->MaxPix)y=lphs->MaxPix;
+ lphs->ThumbVal = (y * (lphs->MaxVal - lphs->MinVal) /
+ lphs->MaxPix) + lphs->MinVal;
+ }
+
+#ifdef DEBUG_SCROLL
+ printf("Scroll WM_MOUSEMOVE val=%d pix=%d\n", lphs->ThumbVal, y);
#endif
SendMessage(hWndParent, lphs->Direction,
- SB_THUMBTRACK, MAKELONG(x, hWndOwner));
+ SB_THUMBTRACK, MAKELONG(lphs->ThumbVal, hWndOwner));
}
@@ -442,9 +480,11 @@
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));
+ lphs->CurPix = lphs->MaxPix * (lphs->CurVal - lphs->MinVal) /
+ (lphs->MaxVal - lphs->MinVal);
+ if(lphs->CurPix <0)lphs->CurPix=0;
if (lphs->CurPix > lphs->MaxPix) lphs->CurPix = lphs->MaxPix;
+
hMemDC = CreateCompatibleDC(hDC);
if (lphs->Direction == WM_VSCROLL) {
GetObject(hUpArrow, sizeof(BITMAP), (LPSTR)&bm);
@@ -597,6 +637,7 @@
lphs->rect.right = width;
lphs->hWndOwner = hWnd;
wndPtr->VScroll = lphs;
+ wndPtr->scroll_flags |= 0x0001;
if (wndPtr->dwStyle & WS_HSCROLL) height += SYSMETRICS_CYHSCROLL;
}
if (wndPtr->dwStyle & WS_HSCROLL) {
@@ -609,6 +650,7 @@
lphs->rect.bottom = height;
lphs->hWndOwner = hWnd;
wndPtr->HScroll = lphs;
+ wndPtr->scroll_flags |= 0x0002;
}
}
@@ -642,8 +684,10 @@
nRet = lphs->CurVal;
lphs->CurVal = (short)nPos;
if (lphs->MaxVal != lphs->MinVal)
- lphs->CurPix = lphs->MaxPix * (abs((short)nPos) - abs(lphs->MinVal)) /
- (abs(lphs->MaxVal) - abs(lphs->MinVal));
+ lphs->CurPix = lphs->MaxPix * (lphs->CurVal - lphs->MinVal) /
+ (lphs->MaxVal - lphs->MinVal);
+ if(lphs->CurPix <0)lphs->CurPix=0;
+
if (lphs->CurPix > lphs->MaxPix) lphs->CurPix = lphs->MaxPix;
#ifdef DEBUG_SCROLL
printf("SetScrollPos val=%d pixval=%d pixmax%d\n",
@@ -691,12 +735,15 @@
HDC hDC;
lphs = GetScrollObjectStruct(hWnd, nBar);
if (lphs == NULL) return;
+
+/* should a bad range be rejected here?
+ */
lphs->MinVal = (short)MinPos;
lphs->MaxVal = (short)MaxPos;
if (lphs->MaxVal != lphs->MinVal)
- lphs->CurPix = abs(lphs->MaxVal) *
- (abs(lphs->CurVal) - abs(lphs->MinVal)) /
- (abs(lphs->MaxVal) - abs(lphs->MinVal));
+ lphs->CurPix = lphs->MaxPix * (lphs->CurVal - lphs->MinVal) /
+ (lphs->MaxVal - lphs->MinVal);
+ if(lphs->CurPix <0)lphs->CurPix=0;
if (lphs->CurPix > lphs->MaxPix) lphs->CurPix = lphs->MaxPix;
#ifdef DEBUG_SCROLL
printf("SetScrollRange min=%d max=%d\n", lphs->MinVal, lphs->MaxVal);
@@ -737,32 +784,32 @@
*/
void ShowScrollBar(HWND hWnd, WORD wBar, BOOL bFlag)
{
- WND *wndPtr;
+ WND *wndPtr;
+ printf("ShowScrollBar hWnd=%04X wBar=%d bFlag=%d\n", hWnd, wBar, bFlag);
#ifdef DEBUG_SCROLL
- printf("ShowScrollBar hWnd=%04X wBar=%d bFlag=%d\n", hWnd, wBar, bFlag);
+ printf("ShowScrollBar hWnd=%04X wBar=%d bFlag=%d\n", hWnd, wBar, bFlag);
#endif
- if (wBar == SB_CTL) {
- if (bFlag)
- ShowWindow(hWnd, SW_SHOW);
- else
- ShowWindow(hWnd, SW_HIDE);
- return;
- }
- wndPtr = WIN_FindWndPtr(hWnd);
-/*
- if ((wBar == SB_VERT) || (wBar == SB_BOTH)) {
- if (bFlag)
- wndPtr->dwStyle |= WS_VSCROLL;
- else
- wndPtr->dwStyle &= 0xFFFFFFFFL ^ WS_VSCROLL;
- }
- if ((wBar == SB_HORZ) || (wBar == SB_BOTH)) {
- if (bFlag)
- wndPtr->dwStyle |= WS_HSCROLL;
- else
- wndPtr->dwStyle &= 0xFFFFFFFFL ^ WS_HSCROLL;
- }
-*/
+ if (wBar == SB_CTL) {
+ if (bFlag)
+ ShowWindow(hWnd, SW_SHOW);
+ else
+ ShowWindow(hWnd, SW_HIDE);
+ return;
+ }
+ wndPtr = WIN_FindWndPtr(hWnd);
+ if ((wBar == SB_VERT) || (wBar == SB_BOTH)) {
+ if (bFlag)
+ wndPtr->scroll_flags != 0x0001;
+ else
+ wndPtr->scroll_flags &= 0xFFFE;
+ }
+ if ((wBar == SB_HORZ) || (wBar == SB_BOTH)) {
+ if (bFlag)
+ wndPtr->scroll_flags != 0x0002;
+ else
+ wndPtr->scroll_flags &= 0xFFFD;
+ }
+ SetWindowPos(hWnd, 0, 0, 0, 0, 0,
+ SWP_NOZORDER | SWP_NOMOVE |
+ SWP_NOSIZE | SWP_FRAMECHANGED);
}
-
-
diff --git a/if1632/gdi.spec b/if1632/gdi.spec
index b63e283..bc4a231 100644
--- a/if1632/gdi.spec
+++ b/if1632/gdi.spec
@@ -279,7 +279,7 @@
#452 pascal GDISEEGDIDO
#460 pascal GDITASKTERMINATION
461 return SetObjectOwner 4 0
-#462 pascal ISGDIOBJECT
+462 pascal IsGDIObject(word) IsGDIObject(1)
#463 pascal MAKEOBJECTPRIVATE
#464 pascal FIXUPBOGUSPUBLISHERMETAFILE
465 pascal RectVisible(word ptr) RectVisible(1 2)
diff --git a/if1632/kernel.spec b/if1632/kernel.spec
index 5f0ed34..668b05a 100644
--- a/if1632/kernel.spec
+++ b/if1632/kernel.spec
@@ -39,7 +39,7 @@
34 pascal SetTaskQueue(word word) SetTaskQueue(1 2)
35 pascal GetTaskQueue(word) GetTaskQueue(1)
36 pascal GetCurrentTask() GetCurrentTask()
-#37 GETCURRENTPDB
+37 pascal GetCurrentPDB() GetCurrentPDB()
#38 SETTASKSIGNALPROC
#41 ENABLEDOS
#42 DISABLEDOS
diff --git a/if1632/relay.c b/if1632/relay.c
index 752fc37..bfd7fcb 100644
--- a/if1632/relay.c
+++ b/if1632/relay.c
@@ -288,9 +288,9 @@
perc = implemented * 100.00 / used;
else
perc = 0.0;
- printf("%s: %d %d %3.1f\n", dll_builtin_table[i].dll_name, implemented, used, perc);
+ printf("%s: %d of %d (%3.1f %%)\n", dll_builtin_table[i].dll_name, implemented, used, perc);
};
perc = timplemented * 100.00 / tused;
- printf("TOTAL: %d %d %3.1f\n",timplemented, tused, perc);
+ printf("TOTAL: %d of %d implemented (%3.1f %%)\n",timplemented, tused, perc);
}
#endif /* WINESTAT */
diff --git a/if1632/toolhelp.spec b/if1632/toolhelp.spec
index 0037da9..fe1e180 100644
--- a/if1632/toolhelp.spec
+++ b/if1632/toolhelp.spec
@@ -1,3 +1,38 @@
name toolhelp
id 13
length 83
+
+# 50 1 057b GLOBALHANDLETOSEL exported, shared data
+# 51 1 0318 GLOBALFIRST exported, shared data
+# 52 1 0399 GLOBALNEXT exported, shared data
+# 53 1 02a2 GLOBALINFO exported, shared data
+# 54 1 0417 GLOBALENTRYHANDLE exported, shared data
+# 55 1 04a9 GLOBALENTRYMODULE exported, shared data
+# 56 1 090e LOCALINFO exported, shared data
+# 57 1 095e LOCALFIRST exported, shared data
+# 58 1 09e9 LOCALNEXT exported, shared data
+#59 pascal ModuleFirst(ptr) ModuleFirst(1)
+#60 pascal ModuleNext(ptr) ModuleNext(1)
+#61 pascal ModuleFindName(ptr ptr) ModuleFindName(1 2)
+#62 pascal ModuleFindHandle(ptr word) ModuleFindHandle(1 2)
+# 63 1 0caa TASKFIRST exported, shared data
+# 64 1 0ced TASKNEXT exported, shared data
+# 65 1 0d2e TASKFINDHANDLE exported, shared data
+# 66 1 0f1c STACKTRACEFIRST exported, shared data
+# 67 1 0f67 STACKTRACECSIPFIRST exported, shared data
+# 68 1 0fca STACKTRACENEXT exported, shared data
+# 69 1 28b0 CLASSFIRST exported, shared data
+# 70 1 2925 CLASSNEXT exported, shared data
+# 71 1 11ce SYSTEMHEAPINFO exported, shared data
+# 72 1 13f4 MEMMANINFO exported, shared data
+# 73 1 1b72 NOTIFYREGISTER exported, shared data
+# 74 1 1c29 NOTIFYUNREGISTER exported, shared data
+# 75 1 2060 INTERRUPTREGISTER exported, shared data
+# 76 1 2111 INTERRUPTUNREGISTER exported, shared data
+# 77 1 26ea TERMINATEAPP exported, shared data
+# 78 1 29c4 MEMORYREAD exported, shared data
+# 79 1 2b6c MEMORYWRITE exported, shared data
+# 80 1 2dae TIMERCOUNT exported, shared data
+# 81 1 0d68 TASKSETCSIP exported, shared data
+# 82 1 0d97 TASKGETCSIP exported, shared data
+# 83 1 0dc0 TASKSWITCH exported, shared data
diff --git a/if1632/user.spec b/if1632/user.spec
index 259f377..2023ed5 100644
--- a/if1632/user.spec
+++ b/if1632/user.spec
@@ -199,7 +199,8 @@
193 pascal IsClipboardFormatAvailable(word) IsClipboardFormatAvailable(1)
194 pascal DlgDirSelectComboBox(word ptr word) DlgDirSelectComboBox(1 2 3)
195 pascal DlgDirListComboBox(word ptr word word word) DlgDirListComboBox(1 2 3 4 5)
-#196 TABBEDTEXTOUT
+196 pascal TabbedTextOut(word s_word s_word ptr s_word s_word ptr s_word)
+ TabbedTextOut(1 2 3 4 5 6 7 8)
#197 GETTABBEDTEXTEXTENT
#198 CASCADECHILDWINDOWS
#199 TILECHILDWINDOWS
@@ -227,7 +228,7 @@
220 pascal LoadMenuIndirect(ptr) LoadMenuIndirect(1)
221 pascal ScrollDC(word s_word s_word ptr ptr word ptr)
ScrollDC(1 2 3 4 5 6 7)
-#222 GETKEYBOARDSTATE
+222 pascal GetKeyboardState(ptr) GetKeyboardState(1)
#223 SETKEYBOARDSTATE
224 pascal GetWindowTask(word) GetWindowTask(1)
225 pascal EnumTaskWindows(word ptr long) EnumTaskWindows(1 2 3)
@@ -259,7 +260,7 @@
247 pascal GetCursor() GetCursor()
248 pascal GetOpenClipboardWindow() GetOpenClipboardWindow()
249 pascal GetAsyncKeyState(word) GetAsyncKeyState(1)
-#250 GETMENUSTATE
+250 pascal GetMenuState(word word word) GetMenuState(1 2 3)
#251 SENDDRIVERMESSAGE
#252 OPENDRIVER
#253 CLOSEDRIVER
@@ -328,7 +329,7 @@
#343 GETFILEPORTNAME
#356 LOADDIBCURSORHANDLER
#357 LOADDIBICONHANDLER
-#358 ISMENU
+358 pascal IsMenu(word) IsMenu(1)
359 pascal GetDCEx(word word long) GetDCEx(1 2 3)
#362 DCHOOK
#368 COPYICON
@@ -414,7 +415,7 @@
#510 WNETLOCKQUEUEDATA
#511 WNETUNLOCKQUEUEDATA
512 pascal WNetGetConnection(ptr ptr ptr) WNetGetConnection(1 2 3)
-#513 WNETGETCAPS
+513 pascal WNetGetCaps(word) WNetGetCaps(1)
#514 WNETDEVICEMODE
#515 WNETBROWSEDIALOG
516 pascal WNetGetUser(ptr ptr ptr) WNetGetUser(1 2 3)
diff --git a/include/msdos.h b/include/msdos.h
index b394555..99eccef 100644
--- a/include/msdos.h
+++ b/include/msdos.h
@@ -30,10 +30,11 @@
#define CS context->sc_cs
#define DS context->sc_ds
#define ES context->sc_es
+#define SS context->sc_ss
#define DI context->sc_edi
#define SI context->sc_esi
-
+#define SP context->sc_esp
#define EFL context->sc_efl
#define SetCflag (EFL |= 0x00000001L)
@@ -43,8 +44,8 @@
#define segment(a) ((DWORD)a >> 16)
#define offset(a) ((DWORD)a & 0xffff)
-#define setword(a,b) *(BYTE*)a = b & 0xff; \
- *((BYTE*)a + 1) = (b>>8) & 0xff;
+#define setword(a,b) *(BYTE*)(a) = b & 0xff; \
+ *((BYTE*)(a + 1)) = (b>>8) & 0xff;
#define setdword(a,b) *(BYTE*)a = b & 0xff; \
*((BYTE*)a + 1) = (b>>8) & 0xff; \
diff --git a/include/scroll.h b/include/scroll.h
index 76e94f5..02ce9d1 100644
--- a/include/scroll.h
+++ b/include/scroll.h
@@ -9,6 +9,7 @@
short MaxVal;
short MaxPix;
short CurPix;
+ short ThumbVal;
RECT rect;
RECT rectUp;
RECT rectDown;
diff --git a/include/task.h b/include/task.h
index 05aba51..1c05265 100644
--- a/include/task.h
+++ b/include/task.h
@@ -5,21 +5,42 @@
#ifndef TASK_H
#define TASK_H
+#include "toolhelp.h"
+
+typedef HANDLE HGLOBAL;
+
typedef struct {
- HANDLE hTask;
- HANDLE hModule;
+ DWORD dwSize;
+ HTASK hTask;
+ HTASK hTaskParent;
HINSTANCE hInst;
+ HMODULE hModule;
+ WORD wSS;
+ WORD wSP;
+ WORD wStackTop;
+ WORD wStackMinimum;
+ WORD wStackBottom;
+ WORD wcEvents;
+ HGLOBAL hQueue;
+ char szModule[MAX_MODULE_NAME + 1];
+ WORD wPSPOffset;
+ HANDLE hNext;
+} TASKENTRY;
+typedef TASKENTRY *LPTASKENTRY;
+
+typedef struct {
+ TASKENTRY te;
int unix_pid;
HICON hIcon;
HWND *lpWndList;
void *lpPrevTask;
void *lpNextTask;
-} TASKENTRY;
-typedef TASKENTRY *LPTASKENTRY;
+} WINETASKENTRY;
+typedef WINETASKENTRY *LPWINETASKENTRY;
#define MAXWIN_PER_TASK 256
-HANDLE CreateNewTask(HINSTANCE hInst);
+HANDLE CreateNewTask(HINSTANCE hInst, HTASK hTaskParent);
BOOL RemoveWindowFromTask(HTASK hTask, HWND hWnd);
BOOL AddWindowToTask(HTASK hTask, HWND hWnd);
diff --git a/include/texts.h b/include/texts.h
new file mode 100644
index 0000000..343b399
--- /dev/null
+++ b/include/texts.h
@@ -0,0 +1,26 @@
+
+/*
+ * texts.h - String constants are read from Xresources/app-defaults
+ * (c) 1994 Jochen Hein ( Hein@Student.TU-Clausthal.de )
+ */
+
+/*
+ * Type-description for buttons
+ */
+
+typedef struct tButtonDesc {
+ char *Label; /* Label of the Button */
+ char Hotkey; /* Hotkey to press this Button */
+} ButtonDesc;
+
+typedef struct tButtonTexts {
+ ButtonDesc Yes;
+ ButtonDesc No;
+ ButtonDesc Ok;
+ ButtonDesc Cancel;
+ ButtonDesc Abort;
+ ButtonDesc Retry;
+ ButtonDesc Ignore;
+} ButtonTexts;
+
+
diff --git a/include/win.h b/include/win.h
index 0a4a566..1928632 100644
--- a/include/win.h
+++ b/include/win.h
@@ -44,6 +44,7 @@
HANDLE hdce; /* Window DCE (if CS_OWNDC or CS_CLASSDC) */
void *VScroll; /* Vertical ScrollBar Struct Pointer */
void *HScroll; /* Horizontal ScrollBar Struct Pointer */
+ WORD scroll_flags; /* scrolls flags (vert & horz visible) */
WORD wIDmenu; /* ID or hmenu (from CreateWindow) */
HANDLE hText; /* Handle of window text */
WORD flags; /* Misc. flags (see below) */
diff --git a/include/windows.h b/include/windows.h
index e4ca0e2..5281abd 100644
--- a/include/windows.h
+++ b/include/windows.h
@@ -161,7 +161,7 @@
#ifdef WINELIB
typedef LONG (*WNDPROC)(HWND, UINT, WPARAM, LPARAM);
#else
-typedef LONG (* WNDPROC)() WINE_PACKED;
+typedef LONG (* WNDPROC)();
#endif
typedef struct {
@@ -3008,7 +3008,7 @@
Fg(BOOL,SetWindowPos,HWND,a,HWND,b,short,c,short,d,short,e,short,f,WORD,g)
Fh(BOOL,ExtTextOut,HDC,a,short,b,short,c,WORD,d,LPRECT,e,LPSTR,f,WORD,g,LPINT,h)
Fh(HANDLE,DeferWindowPos,HANDLE,hWinPosInfo,HWND,hWnd,HWND,hWndInsertAfter,int,x,int,y,int,cx,int,cy,WORD,wFlags)
-Fh(LONG,TabbedTextOut,HDC,a,int,b,int,c,LPSTR,d,int,e,int,f,LPINT,g,int,h)
+Fh(LONG,TabbedTextOut,HDC,a,short,b,short,c,LPSTR,d,short,e,short,f,LPINT,g,short,h)
Fh(int,ScrollWindowEx,HWND,a,short,b,short,c,LPRECT,d,LPRECT,e,HRGN,f,LPRECT,g,WORD,h)
Fi(BOOL,Arc,HDC,a,int,xLeft,int,yTop,int,xRight,int,yBottom,int,xStart,int,yStart,int,xEnd,int,yEnd)
Fi(BOOL,Chord,HDC,a,int,xLeft,int,yTop,int,xRight,int,yBottom,int,xStart,int,yStart,int,xEnd,int,yEnd)
diff --git a/loader/library.c b/loader/library.c
index 02b74d2..21898e9 100644
--- a/loader/library.c
+++ b/loader/library.c
@@ -20,10 +20,14 @@
#include "wine.h"
#include "dlls.h"
#include "task.h"
+#include "toolhelp.h"
extern struct w_files *wine_files;
extern struct dll_name_table_entry_s dll_builtin_table[];
+struct w_files *GetFileInfo(HANDLE);
+char *GetDosFileName(char *);
+
#define IS_BUILTIN_DLL(handle) ((handle >> 8) == 0xff)
/**********************************************************************/
@@ -53,12 +57,17 @@
{
register struct w_files *w = wine_files;
int i;
+ char dllname[256];
+
+ if ((int) lpModuleName & 0xffff0000)
+ ExtractDLLName(lpModuleName, dllname);
+
if ((int) lpModuleName & 0xffff0000)
printf("GetModuleHandle('%s');\n", lpModuleName);
else
printf("GetModuleHandle('%x');\n", lpModuleName);
- printf("GetModuleHandle // searching in builtin libraries\n");
+/* printf("GetModuleHandle // searching in builtin libraries\n");*/
for (i = 0; i < N_BUILTINS; i++) {
if (dll_builtin_table[i].dll_name == NULL) break;
if (((int) lpModuleName & 0xffff0000) == 0) {
@@ -68,7 +77,7 @@
return 0xFF00 + i;
}
}
- else if (strcasecmp(dll_builtin_table[i].dll_name, lpModuleName) == 0) {
+ else if (strcasecmp(dll_builtin_table[i].dll_name, dllname) == 0) {
printf("GetModuleHandle('%x') return %04X \n",
lpModuleName, 0xFF00 + i);
return (0xFF00 + i);
@@ -85,7 +94,7 @@
return w->hinstance;
}
}
- else if (strcasecmp(w->name, lpModuleName) == 0) {
+ else if (strcasecmp(w->name, dllname) == 0) {
printf("GetModuleHandle('%s') return %04X \n",
lpModuleName, w->hinstance);
return w->hinstance;
@@ -309,3 +318,97 @@
#endif /* ifndef WINELIB */
+/* internal dlls */
+static void
+FillModStructBuiltIn(MODULEENTRY *lpModule, struct dll_name_table_entry_s *dll)
+{
+ lpModule->dwSize = dll->dll_table_length * 1024;
+ strcpy(lpModule->szModule, dll->dll_name);
+ lpModule->hModule = 0xff00 + dll->dll_number;
+ lpModule->wcUsage = GetModuleUsage(lpModule->hModule);
+ GetModuleFileName(lpModule->hModule, lpModule->szExePath, MAX_PATH + 1);
+ lpModule->wNext = 0;
+}
+
+/* loaded dlls */
+static void
+FillModStructLoaded(MODULEENTRY *lpModule, struct w_files *dll)
+{
+ lpModule->dwSize = 16384;
+ strcpy(lpModule->szModule, dll->name);
+ lpModule->hModule = dll->hinstance;
+ lpModule->wcUsage = GetModuleUsage(lpModule->hModule);
+ GetModuleFileName(lpModule->hModule, lpModule->szExePath, MAX_PATH + 1);
+ lpModule->wNext = 0;
+}
+
+/**********************************************************************
+ * ModuleFirst [TOOHELP.59]
+ */
+BOOL ModuleFirst(MODULEENTRY *lpModule)
+{
+ printf("ModuleFirst(%08X)\n", lpModule);
+
+ FillModStructBuiltIn(lpModule, &dll_builtin_table[0]);
+ return TRUE;
+}
+
+/**********************************************************************
+ * ModuleNext [TOOHELP.60]
+ */
+BOOL ModuleNext(MODULEENTRY *lpModule)
+{
+ struct w_files *w;
+
+ printf("ModuleNext(%08X)\n", lpModule);
+
+ if (IS_BUILTIN_DLL(lpModule->hModule)) {
+ /* last built-in ? */
+ if ((lpModule->hModule & 0xff) == (N_BUILTINS - 1) ) {
+ if (wine_files) {
+ FillModStructLoaded(lpModule, wine_files);
+ return TRUE;
+ } else
+ return FALSE;
+ }
+ FillModStructBuiltIn(lpModule, &dll_builtin_table[(lpModule->hModule & 0xff)+1]);
+ return TRUE;
+ }
+ w = GetFileInfo(lpModule->hModule);
+ if (w->next) {
+ FillModStructLoaded(lpModule, w->next);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/**********************************************************************
+ * ModuleFindHandle [TOOHELP.62]
+ */
+HMODULE ModuleFindHandle(MODULEENTRY *lpModule, HMODULE hModule)
+{
+ struct w_files *w;
+
+ printf("ModuleFindHandle(%08X, %04X)\n", lpModule, hModule);
+
+ /* built-in dll ? */
+ if (IS_BUILTIN_DLL(hModule)) {
+ FillModStructBuiltIn(lpModule, &dll_builtin_table[hModule & 0xff]);
+ return hModule;
+ }
+
+ /* check loaded dlls */
+ if ((w = GetFileInfo(hModule)) == NULL)
+ return (HMODULE) NULL;
+
+ FillModStructLoaded(lpModule, w);
+ return w->hinstance;
+}
+
+/**********************************************************************
+ * ModuleFindName [TOOHELP.61]
+ */
+HMODULE ModuleFindName(MODULEENTRY *lpModule, LPCSTR lpstrName)
+{
+ return (ModuleFindHandle(lpModule, GetModuleHandle((char*)lpstrName)));
+}
diff --git a/loader/main.c b/loader/main.c
index 119d00f..90ec7e5 100644
--- a/loader/main.c
+++ b/loader/main.c
@@ -132,7 +132,7 @@
char buffer[256], header[2], modulename[64], *fullname;
ExtractDLLName(module, modulename);
-
+ printf("%sLoadImage \n", module);
/* built-in one ? */
if (FindDLLTable(modulename)) {
return GetModuleHandle(modulename);
@@ -212,7 +212,8 @@
wpnt->mz_header = (struct mz_header_s *) malloc(sizeof(struct mz_header_s));;
status = lseek(wpnt->fd, 0, SEEK_SET);
load_mz_header (wpnt->fd, wpnt->mz_header);
- if (wpnt->mz_header->must_be_0x40 != 0x40)
+ if (wpnt->mz_header->must_be_0x40 != 0x40 &&
+ wpnt->mz_header->must_be_0x40 != 0x1e)
myerror("This is not a Windows program");
/* read first two bytes to determine filetype */
@@ -361,7 +362,8 @@
{
static flagReadyToRun = 0;
struct w_files *final_wpnt;
- struct w_files * wpnt;
+
+ printf("InitializeLoadedDLLs %08X\n", wpnt);
if (wpnt == NULL)
{
diff --git a/loader/selector.c b/loader/selector.c
index b9b66bd..c2faab8 100644
--- a/loader/selector.c
+++ b/loader/selector.c
@@ -824,6 +824,13 @@
}
/**********************************************************************
+ */
+WORD GetCurrentPDB()
+{
+ return PSPSelector;
+}
+
+/**********************************************************************
* CreatePSP
*/
static SEGDESC *
diff --git a/loader/signal.c b/loader/signal.c
index 7e8bc0f..861c04e 100644
--- a/loader/signal.c
+++ b/loader/signal.c
@@ -57,6 +57,7 @@
return 1; /* get base mem size */
case 0x15: return do_int15(scp);
+ case 0x16: return do_int16(scp);
case 0x1A: return do_int1A(scp);
case 0x21: return do_int21(scp);
diff --git a/loader/task.c b/loader/task.c
index 856f634..569c64b 100644
--- a/loader/task.c
+++ b/loader/task.c
@@ -14,7 +14,7 @@
#include "wine.h"
#include "task.h"
-static LPTASKENTRY lpTaskList = NULL;
+static LPWINETASKENTRY lpTaskList = NULL;
static int nTaskCount = 0;
@@ -23,7 +23,7 @@
*/
HTASK GetCurrentTask()
{
- LPTASKENTRY lpTask = lpTaskList;
+ LPWINETASKENTRY lpTask = lpTaskList;
int pid = getpid();
#ifdef DEBUG_TASK
printf("GetCurrentTask() // unix_pid=%08X !\n", pid);
@@ -35,9 +35,9 @@
lpTask = lpTask->lpNextTask;
}
#ifdef DEBUG_TASK
- printf("GetCurrentTask() returned hTask=%04X !\n", lpTask->hTask);
+ printf("GetCurrentTask() returned hTask=%04X !\n", lpTask->te.hTask);
#endif
- return lpTask->hTask;
+ return lpTask->te.hTask;
}
@@ -58,7 +58,7 @@
{
HWND *wptr;
int count;
- LPTASKENTRY lpTask = lpTaskList;
+ LPWINETASKENTRY lpTask = lpTaskList;
printf("GetWindowTask(%04X) !\n", hWnd);
while (lpTask != NULL) {
wptr = lpTask->lpWndList;
@@ -66,11 +66,11 @@
count = 0;
while (++count < MAXWIN_PER_TASK) {
printf("GetWindowTask // searching %04X %04X !\n",
- lpTask->hTask, *(wptr));
+ lpTask->te.hTask, *(wptr));
if (*(wptr) == hWnd) {
printf("GetWindowTask(%04X) found hTask=%04X !\n",
- hWnd, lpTask->hTask);
- return lpTask->hTask;
+ hWnd, lpTask->te.hTask);
+ return lpTask->te.hTask;
}
wptr++;
}
@@ -89,10 +89,10 @@
HWND *wptr, hWnd;
BOOL bRet;
int count = 0;
- LPTASKENTRY lpTask = lpTaskList;
+ LPWINETASKENTRY lpTask = lpTaskList;
printf("EnumTaskWindows(%04X, %08X, %08X) !\n", hTask, lpEnumFunc, lParam);
while (TRUE) {
- if (lpTask->hTask == hTask) break;
+ if (lpTask->te.hTask == hTask) break;
if (lpTask == NULL) {
printf("EnumTaskWindows // hTask=%04X not found !\n", hTask);
return FALSE;
@@ -120,19 +120,19 @@
/**********************************************************************
* CreateNewTask [internal]
*/
-HANDLE CreateNewTask(HINSTANCE hInst)
+HANDLE CreateNewTask(HINSTANCE hInst, HTASK hTaskParent)
{
HANDLE hTask;
- LPTASKENTRY lpTask = lpTaskList;
- LPTASKENTRY lpNewTask;
+ LPWINETASKENTRY lpTask = lpTaskList;
+ LPWINETASKENTRY lpNewTask;
if (lpTask != NULL) {
while (TRUE) {
if (lpTask->lpNextTask == NULL) break;
lpTask = lpTask->lpNextTask;
}
}
- hTask = GlobalAlloc(GMEM_MOVEABLE, sizeof(TASKENTRY));
- lpNewTask = (LPTASKENTRY) GlobalLock(hTask);
+ hTask = GlobalAlloc(GMEM_MOVEABLE, sizeof(WINETASKENTRY));
+ lpNewTask = (LPWINETASKENTRY) GlobalLock(hTask);
#ifdef DEBUG_TASK
printf("CreateNewTask entry allocated %08X\n", lpNewTask);
#endif
@@ -143,13 +143,25 @@
}
else {
lpTask->lpNextTask = lpNewTask;
+ lpTask->te.hNext = lpNewTask->te.hTask;
lpNewTask->lpPrevTask = lpTask;
}
lpNewTask->lpNextTask = NULL;
lpNewTask->hIcon = 0;
- lpNewTask->hModule = 0;
- lpNewTask->hInst = hInst;
- lpNewTask->hTask = hTask;
+ lpNewTask->te.dwSize = sizeof(TASKENTRY);
+ lpNewTask->te.hModule = 0;
+ lpNewTask->te.hInst = hInst;
+ lpNewTask->te.hTask = hTask;
+ lpNewTask->te.hTaskParent = hTaskParent;
+ lpNewTask->te.wSS = 0;
+ lpNewTask->te.wSP = 0;
+ lpNewTask->te.wStackTop = 0;
+ lpNewTask->te.wStackMinimum = 0;
+ lpNewTask->te.wStackBottom = 0;
+ lpNewTask->te.wcEvents = 0;
+ lpNewTask->te.hQueue = 0;
+ sprintf(lpNewTask->te.szModule, "TASK%04X", hInst);
+ lpNewTask->te.wPSPOffset = 0;
lpNewTask->unix_pid = getpid();
lpNewTask->lpWndList = (HWND *) malloc(MAXWIN_PER_TASK * sizeof(HWND));
if (lpNewTask->lpWndList != NULL)
@@ -171,12 +183,12 @@
{
HWND *wptr;
int count = 0;
- LPTASKENTRY lpTask = lpTaskList;
+ LPWINETASKENTRY lpTask = lpTaskList;
#ifdef DEBUG_TASK
printf("AddWindowToTask(%04X, %04X); !\n", hTask, hWnd);
#endif
while (TRUE) {
- if (lpTask->hTask == hTask) break;
+ if (lpTask->te.hTask == hTask) break;
if (lpTask == NULL) {
printf("AddWindowToTask // hTask=%04X not found !\n", hTask);
return FALSE;
@@ -204,12 +216,12 @@
{
HWND *wptr;
int count = 0;
- LPTASKENTRY lpTask = lpTaskList;
+ LPWINETASKENTRY lpTask = lpTaskList;
#ifdef DEBUG_TASK
printf("RemoveWindowToTask(%04X, %04X); !\n", hTask, hWnd);
#endif
while (TRUE) {
- if (lpTask->hTask == hTask) break;
+ if (lpTask->te.hTask == hTask) break;
if (lpTask == NULL) {
printf("RemoveWindowFromTask // hTask=%04X not found !\n", hTask);
return FALSE;
diff --git a/memory/heap.c b/memory/heap.c
index ceaa85b..734520a 100644
--- a/memory/heap.c
+++ b/memory/heap.c
@@ -245,8 +245,24 @@
* Validate pointer.
*/
m_free = (MDESC *) block - 1;
- if (m_free->prev != m_free || m_free->next != m_free ||
- ((int) m_free & 0xffff0000) != ((int) *free_list & 0xffff0000))
+ if (m_free->prev != m_free || m_free->next != m_free)
+ {
+#ifdef DEBUG_HEAP
+ printf("Attempt to free bad pointer,"
+ "m_free = %08x, *free_list = %08x\n",
+ m_free, free_list);
+#endif
+ return -1;
+ }
+
+ if (*free_list == NULL)
+ {
+ *free_list = m_free;
+ (*free_list)->next = NULL;
+ (*free_list)->prev = NULL;
+ return 0;
+ }
+ else if (((int) m_free & 0xffff0000) != ((int) *free_list & 0xffff0000))
{
#ifdef DEBUG_HEAP
printf("Attempt to free bad pointer,"
diff --git a/misc/main.c b/misc/main.c
index ab3c2e7..ae0d5c9 100644
--- a/misc/main.c
+++ b/misc/main.c
@@ -9,6 +9,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <locale.h>
#include <X11/Xlib.h>
#include <X11/Xresource.h>
#include <X11/Xutil.h>
@@ -17,6 +18,7 @@
#include "windows.h"
#include "options.h"
#include "prototypes.h"
+#include "texts.h"
#define WINE_CLASS "Wine" /* Class name for resources */
@@ -32,6 +34,7 @@
int desktopX = 0, desktopY = 0; /* Desktop window position (if any) */
char *ProgramName; /* Used by resource.c with WINELIB */
+extern ButtonTexts ButtonText;
struct options Options =
{ /* default options */
@@ -141,6 +144,54 @@
/***********************************************************************
+ * MAIN_GetButtonText
+ *
+ * Fetch the value of resource 'name' using the correct instance name.
+ * 'name' must begin with '.' or '*'
+ *
+ * The address of the string got from the XResoure is stored in Button.Label.
+ * The corresponding hotkey is taken from this string.
+ */
+
+static void MAIN_GetButtonText( XrmDatabase db, char *name, ButtonDesc *Button)
+{
+ XrmValue value;
+ char Hotkey;
+ char *i;
+
+ if (MAIN_GetResource( db, name, &value))
+ {
+ Button->Label = value.addr;
+ i = strchr(Button->Label,'&');
+ if ( i == NULL )
+ Button->Hotkey = '\0';
+ else if ( i++ == '\0' )
+ Button->Hotkey = '\0';
+ else
+ Button->Hotkey = *i;
+ }
+ Button->Hotkey = toupper(Button->Hotkey);
+}
+
+/***********************************************************************
+ * MAIN_GetAllButtonTexts
+ *
+ * Read all Button-labels from X11-resources if they exist.
+ */
+
+static void MAIN_GetAllButtonTexts(XrmDatabase db)
+{
+ MAIN_GetButtonText(db, ".YesLabel", &ButtonText.Yes);
+ MAIN_GetButtonText(db, ".NoLabel", &ButtonText.No);
+ MAIN_GetButtonText(db, ".OkLabel", &ButtonText.Ok);
+ MAIN_GetButtonText(db, ".CancelLabel", &ButtonText.Cancel);
+ MAIN_GetButtonText(db, ".AbortLabel", &ButtonText.Abort);
+ MAIN_GetButtonText(db, ".RetryLabel", &ButtonText.Retry);
+ MAIN_GetButtonText(db, ".IgnoreLabel", &ButtonText.Ignore);
+ MAIN_GetButtonText(db, ".CancelLabel", &ButtonText.Cancel);
+}
+
+/***********************************************************************
* MAIN_ParseOptions
*
* Parse command line options and open display.
@@ -152,10 +203,10 @@
XrmDatabase db = NULL;
/* Parse command line */
-
Options.programName = MAIN_GetProgramName( *argc, argv );
XrmParseCommand( &db, optionsTable, NB_OPTIONS,
Options.programName, argc, argv );
+
#ifdef WINELIB
/* Need to assemble command line and pass it to WinMain */
#else
@@ -175,8 +226,10 @@
exit(1);
}
- /* Get all options */
+ /* Use app-defaults */
+ display->db = db;
+ /* Get all options */
if (MAIN_GetResource( db, ".iconic", &value ))
Options.cmdShow = SW_SHOWMINIMIZED;
if (MAIN_GetResource( db, ".privatemap", &value ))
@@ -197,6 +250,9 @@
screenDepth = atoi( value.addr );
if (MAIN_GetResource( db, ".desktop", &value))
Options.desktopGeometry = value.addr;
+
+/* MAIN_GetAllButtonTexts(db); */
+
}
@@ -311,7 +367,9 @@
int ret_val;
int depth_count, i;
int *depth_list;
-
+
+ setlocale(LC_CTYPE,"");
+
XrmInitialize();
MAIN_ParseOptions( &argc, argv );
diff --git a/misc/message.c b/misc/message.c
index d9669b6..825e224 100644
--- a/misc/message.c
+++ b/misc/message.c
@@ -19,6 +19,21 @@
#include "prototypes.h"
#include "heap.h"
#include "win.h"
+#include "texts.h"
+
+/*
+ * Defaults for button-texts
+ */
+
+ButtonTexts ButtonText = {
+ "&Yes", 'Y',
+ "&No", 'N',
+ "&Ok", 'O',
+ "&Cancel", 'C',
+ "&Abort", 'A',
+ "&Retry", 'R',
+ "&Ignore", 'I'
+};
extern HINSTANCE hSysRes;
extern HBITMAP hUpArrow;
@@ -175,7 +190,7 @@
switch(message) {
case WM_CREATE:
#ifdef DEBUG_MSGBOX
- printf("MessageBox WM_CREATE !\n");
+ printf("MessageBox WM_CREATE hWnd=%04X !\n", hWnd);
#endif
wndPtr = WIN_FindWndPtr(hWnd);
createStruct = (CREATESTRUCT *)lParam;
@@ -191,55 +206,55 @@
lpmb->rectStr.bottom -= 32;
switch(lpmb->wType & MB_TYPEMASK) {
case MB_OK :
- lpmb->hWndYes = CreateWindow("BUTTON", "&Ok",
+ lpmb->hWndYes = CreateWindow("BUTTON", ButtonText.Ok.Label,
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
rect.right / 2 - 30, rect.bottom - 25,
60, 18, hWnd, IDOK, wndPtr->hInstance, 0L);
break;
case MB_OKCANCEL :
- lpmb->hWndYes = CreateWindow("BUTTON", "&Ok",
+ lpmb->hWndYes = CreateWindow("BUTTON", ButtonText.Ok.Label,
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
rect.right / 2 - 65, rect.bottom - 25,
60, 18, hWnd, IDOK, wndPtr->hInstance, 0L);
- lpmb->hWndCancel = CreateWindow("BUTTON", "&Cancel",
+ lpmb->hWndCancel = CreateWindow("BUTTON", ButtonText.Cancel.Label,
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
rect.right / 2 + 5, rect.bottom - 25,
60, 18, hWnd, IDCANCEL, wndPtr->hInstance, 0L);
break;
case MB_ABORTRETRYIGNORE :
- lpmb->hWndYes = CreateWindow("BUTTON", "&Retry",
+ lpmb->hWndYes = CreateWindow("BUTTON", ButtonText.Retry.Label,
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
rect.right / 2 - 100, rect.bottom - 25,
60, 18, hWnd, IDRETRY, wndPtr->hInstance, 0L);
- lpmb->hWndNo = CreateWindow("BUTTON", "&Ignore",
+ lpmb->hWndNo = CreateWindow("BUTTON", ButtonText.Ignore.Label,
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
rect.right / 2 - 30, rect.bottom - 25,
60, 18, hWnd, IDIGNORE, wndPtr->hInstance, 0L);
- lpmb->hWndCancel = CreateWindow("BUTTON", "&Abort",
+ lpmb->hWndCancel = CreateWindow("BUTTON", ButtonText.Abort.Label,
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
rect.right / 2 + 40, rect.bottom - 25,
60, 18, hWnd, IDABORT, wndPtr->hInstance, 0L);
break;
case MB_YESNO :
- lpmb->hWndYes = CreateWindow("BUTTON", "&Yes",
+ lpmb->hWndYes = CreateWindow("BUTTON", ButtonText.Yes.Label,
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
rect.right / 2 - 65, rect.bottom - 25,
60, 18, hWnd, IDYES, wndPtr->hInstance, 0L);
- lpmb->hWndNo = CreateWindow("BUTTON", "&No",
+ lpmb->hWndNo = CreateWindow("BUTTON", ButtonText.No.Label,
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
rect.right / 2 + 5, rect.bottom - 25,
60, 18, hWnd, IDNO, wndPtr->hInstance, 0L);
break;
case MB_YESNOCANCEL :
- lpmb->hWndYes = CreateWindow("BUTTON", "&Yes",
+ lpmb->hWndYes = CreateWindow("BUTTON", ButtonText.Yes.Label,
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
rect.right / 2 - 100, rect.bottom - 25,
60, 18, hWnd, IDYES, wndPtr->hInstance, 0L);
- lpmb->hWndNo = CreateWindow("BUTTON", "&No",
+ lpmb->hWndNo = CreateWindow("BUTTON", ButtonText.No.Label,
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
rect.right / 2 - 30, rect.bottom - 25,
60, 18, hWnd, IDNO, wndPtr->hInstance, 0L);
- lpmb->hWndCancel = CreateWindow("BUTTON", "&Cancel",
+ lpmb->hWndCancel = CreateWindow("BUTTON", ButtonText.Cancel.Label,
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
rect.right / 2 + 40, rect.bottom - 25,
60, 18, hWnd, IDCANCEL, wndPtr->hInstance, 0L);
@@ -271,6 +286,9 @@
}
break;
case WM_SHOWWINDOW:
+#ifdef DEBUG_MSGBOX
+ printf("MessageBox WM_SHOWWINDOW hWnd=%04X !\n", hWnd);
+#endif
if (!(wParam == 0 && lParam == 0L)) {
InvalidateRect(hWnd, NULL, TRUE);
}
@@ -281,7 +299,12 @@
#endif
lpmb = MsgBoxGetStorageHeader(hWnd);
if (lpmb == NULL) break;
+ if (!lpmb->ActiveFlg) break;
hDC = BeginPaint(hWnd, &ps);
+ if (hDC == 0) {
+ printf("MessageBox WM_PAINT // BeginPaint returned BAD hDC !\n");
+ break;
+ }
GetClientRect(hWnd, &rect);
FillRect(hDC, &rect, GetStockObject(WHITE_BRUSH));
CopyRect(&rect, &lpmb->rectStr);
@@ -307,7 +330,6 @@
ReleaseCapture();
lpmb = MsgBoxGetStorageHeader(hWnd);
if (lpmb == NULL) break;
- lpmb->ActiveFlg = FALSE;
if (lpmb->hIcon) DestroyIcon(lpmb->hIcon);
if (lpmb->hWndYes) DestroyWindow(lpmb->hWndYes);
if (lpmb->hWndNo) DestroyWindow(lpmb->hWndNo);
@@ -315,6 +337,7 @@
#ifdef DEBUG_MSGBOX
printf("MessageBox WM_DESTROY end !\n");
#endif
+ lpmb->ActiveFlg = FALSE;
break;
case WM_COMMAND:
lpmb = MsgBoxGetStorageHeader(hWnd);
@@ -328,36 +351,28 @@
break;
case WM_CHAR:
lpmb = MsgBoxGetStorageHeader(hWnd);
+/* if (wParam >= 'a' || wParam <= 'z') wParam -= 'a' - 'A'; */
+ wParam = toupper(wParam);
+ if (wParam == ButtonText.Yes.Hotkey)
+ lpmb->wRetVal = IDYES;
+ else if (wParam == ButtonText.Ok.Hotkey)
+ lpmb->wRetVal = IDOK;
+ else if (wParam == ButtonText.Retry.Hotkey)
+ lpmb->wRetVal = IDRETRY;
+ else if (wParam == ButtonText.Abort.Hotkey)
+ lpmb->wRetVal = IDABORT;
+ else if (wParam == ButtonText.No.Hotkey)
+ lpmb->wRetVal = IDNO;
+ else if (wParam == ButtonText.Ignore.Hotkey)
+ lpmb->wRetVal = IDIGNORE;
+ else if ((wParam == ButtonText.Ok.Hotkey) || (wParam == VK_ESCAPE))
+ lpmb->wRetVal = IDCANCEL;
+ else
+ return 0;
if (lpmb == NULL) break;
- if (wParam >= 'a' || wParam <= 'z') wParam -= 'a' - 'A';
- switch(wParam) {
- case 'Y':
- lpmb->wRetVal = IDYES;
- break;
- case 'O':
- lpmb->wRetVal = IDOK;
- break;
- case 'R':
- lpmb->wRetVal = IDRETRY;
- break;
- case 'A':
- lpmb->wRetVal = IDABORT;
- break;
- case 'N':
- lpmb->wRetVal = IDNO;
- break;
- case 'I':
- lpmb->wRetVal = IDIGNORE;
- break;
- case 'C':
- case VK_ESCAPE:
- lpmb->wRetVal = IDCANCEL;
- break;
- default:
- return 0;
- }
- PostMessage(hWnd, WM_CLOSE, 0, 0L);
- break;
+ ShowWindow(hWnd, SW_HIDE);
+ PostMessage(hWnd, WM_CLOSE, 0, 0L);
+ break;
default:
return DefWindowProc(hWnd, message, wParam, lParam );
}
diff --git a/misc/network.c b/misc/network.c
index 60a4bb3..779d6aa 100644
--- a/misc/network.c
+++ b/misc/network.c
@@ -43,6 +43,14 @@
}
/**************************************************************************
+ * WNetGetCaps [USER.513]
+ */
+int WNetGetCaps(WORD capability)
+{
+ return 0;
+}
+
+/**************************************************************************
* WNetGetUser [USER.516]
*/
UINT WNetGetUser(LPSTR lpLocalName, LPSTR lpUserName, DWORD *lpSize)
diff --git a/miscemu/Imakefile b/miscemu/Imakefile
index 65c043f..27798bb 100644
--- a/miscemu/Imakefile
+++ b/miscemu/Imakefile
@@ -6,6 +6,7 @@
emulate.c \
int10.c \
int15.c \
+ int16.c \
int1a.c \
int21.c \
int25.c \
diff --git a/miscemu/int16.c b/miscemu/int16.c
new file mode 100644
index 0000000..88ff49d
--- /dev/null
+++ b/miscemu/int16.c
@@ -0,0 +1,16 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include "msdos.h"
+#include "wine.h"
+
+int do_int16(struct sigcontext_struct *context)
+{
+ switch((context->sc_eax >> 8) & 0xff)
+ {
+ case 0xc0:
+
+ default:
+ IntBarf(0x16, context);
+ };
+ return 1;
+}
diff --git a/miscemu/int25.c b/miscemu/int25.c
index 89d188d..9a9a366 100644
--- a/miscemu/int25.c
+++ b/miscemu/int25.c
@@ -11,9 +11,7 @@
if( (ECX & 0xffff) == 0xffff)
{
begin = getdword(dataptr);
-
length = getword(&dataptr[4]);
-
dataptr = (BYTE *) getdword(&dataptr[6]);
} else {
@@ -23,6 +21,19 @@
fprintf(stderr, "int25: abs diskread, drive %d, sector %d, "
"count %d, buffer %d\n", EAX & 0xff, begin, length, (int) dataptr);
+ memset(dataptr, 0, length * 512);
+
+ if (begin == 0 && length > 1)
+ *(dataptr + 512) = 0xf8;
+
+ if (begin == 1)
+ *dataptr = 0xf8;
+
ResetCflag;
+
+ /* push flags on stack */
+ SP -= sizeof(WORD);
+ setword(pointer(SS,SP), (WORD) EFL);
+
return 1;
}
diff --git a/miscemu/int26.c b/miscemu/int26.c
index 5fb86a3..0308d37 100644
--- a/miscemu/int26.c
+++ b/miscemu/int26.c
@@ -23,5 +23,10 @@
" buffer %d\n", EAX & 0xff, begin, length, (int) dataptr);
ResetCflag;
+
+ /* push flags on stack */
+ SP -= sizeof(WORD);
+ setword(pointer(SS,SP), (WORD) EFL);
+
return 1;
}
diff --git a/miscemu/int2f.c b/miscemu/int2f.c
index 8c50267..0a7d14e 100644
--- a/miscemu/int2f.c
+++ b/miscemu/int2f.c
@@ -5,11 +5,21 @@
int do_int2f(struct sigcontext_struct *context)
{
- switch(context->sc_eax & 0xffff)
+ switch((context->sc_eax >> 8) & 0xff)
{
- case 0x1600: /* windows enhanced mode install check */
- /* don't return anything as we're running in standard mode */
- break;
+ case 0x15: /* mscdex */
+ /* ignore requests */
+ return 1;
+
+ case 0x16:
+ switch(context->sc_eax & 0xff)
+ {
+ case 0x00: /* windows enhanced mode install check */
+ /* don't return anything as we're running in standard mode */
+ return 1;
+
+ default:
+ }
default:
IntBarf(0x2f, context);
diff --git a/objects/font.c b/objects/font.c
index 5963b96..fba3ab2 100644
--- a/objects/font.c
+++ b/objects/font.c
@@ -47,7 +47,8 @@
case FF_DECORATIVE: family = "*"; break;
default: family = "*"; break;
}
- AnsiLower(family);
+ else
+ AnsiLower(family);
while (TRUE) {
/* Width==0 seems not to be a valid wildcard on SGI's, using * instead */
@@ -111,7 +112,7 @@
metrics->tmDigitizedAspectX = 1;
metrics->tmDigitizedAspectY = 1;
- if (xfont->per_char) average = metrics->tmMaxCharWidth;
+ if (!xfont->per_char) average = metrics->tmMaxCharWidth;
else
{
XCharStruct * charPtr = xfont->per_char;
diff --git a/objects/gdiobj.c b/objects/gdiobj.c
index 4f7fa67..7937282 100644
--- a/objects/gdiobj.c
+++ b/objects/gdiobj.c
@@ -553,3 +553,17 @@
printf("EnumObjects // End of enumeration !\n");
return 0;
}
+
+/***********************************************************************
+ * IsGDIObject(GDI.462)
+ */
+BOOL IsGDIObject(HANDLE handle)
+{
+ GDIOBJHDR *object;
+
+ object = (GDIOBJHDR *) GDI_HEAP_ADDR( handle );
+ if (object)
+ return TRUE;
+ else
+ return FALSE;
+}
diff --git a/objects/text.c b/objects/text.c
index d4448a9..53c5bb0 100644
--- a/objects/text.c
+++ b/objects/text.c
@@ -422,6 +422,21 @@
}
/***********************************************************************
+ * TabbedTextOut [USER.196]
+ */
+LONG TabbedTextOut(HDC hDC, short x, short y, LPSTR lpStr, short nCount,
+ short nTabCount, LPINT lpTabPos, short nTabOrg)
+{
+ WORD width, height;
+ printf("EMPTY STUB !!! TabbedTextOut(); ! call TextOut() for now !\n");
+ height = HIWORD(GetTextExtent(hDC, lpStr, nCount));
+ width = LOWORD(GetTextExtent(hDC, lpStr, nCount));
+ TextOut(hDC, x, y, lpStr, nCount);
+ return MAKELONG(width, height);
+}
+
+
+/***********************************************************************
* ExtTextOut [GDI.351]
*/
BOOL ExtTextOut(HDC hDC, short x, short y, WORD wOptions, LPRECT lprect,
@@ -432,3 +447,4 @@
return FALSE;
}
+
diff --git a/windows/event.c b/windows/event.c
index 861f95f..b873bef 100644
--- a/windows/event.c
+++ b/windows/event.c
@@ -35,6 +35,7 @@
/* State variables */
BOOL MouseButtonsStates[NB_BUTTONS] = { FALSE, FALSE, FALSE };
BOOL AsyncMouseButtonsStates[NB_BUTTONS] = { FALSE, FALSE, FALSE };
+BYTE KeyStateTable[256];
static WORD ALTKeyState;
static HWND captureWnd = 0;
Window winHasCursor = 0;
@@ -164,6 +165,16 @@
break;
case MotionNotify:
+ /* Wine between two fast machines across the overloaded campus
+ ethernet gets very boged down in MotionEvents. The following
+ simply finds the last motion event in the queue and drops
+ the rest. On a good link events are servered before they build
+ up so this doesn't take place. On a slow link this may cause
+ problems if the event order is important. I'm not yet seen
+ of any problems. Jon 7/6/96.
+ */
+ while (XCheckTypedWindowEvent(display, ((XAnyEvent *)event)->window,
+ MotionNotify, event));
EVENT_MotionNotify( (XMotionEvent*)event );
break;
@@ -310,6 +321,7 @@
if (event->type == KeyPress)
{
if (vkey == VK_MENU) ALTKeyState = TRUE;
+ KeyStateTable[vkey] = 1;
keylp.lp1.count = 1;
keylp.lp1.code = LOBYTE(event->keycode);
keylp.lp1.extended = (extended ? 1 : 0);
@@ -341,6 +353,7 @@
else
{
if (vkey == VK_MENU) ALTKeyState = FALSE;
+ KeyStateTable[vkey] = 1;
keylp.lp1.count = 1;
keylp.lp1.code = LOBYTE(event->keycode);
keylp.lp1.extended = (extended ? 1 : 0);
@@ -462,6 +475,7 @@
if (rv == GrabSuccess)
{
+ winHasCursor = wnd_p->window;
captureWnd = wnd;
return old_capture_wnd;
}
diff --git a/windows/graphics.c b/windows/graphics.c
index 4a1abe1..dda491a 100644
--- a/windows/graphics.c
+++ b/windows/graphics.c
@@ -673,24 +673,31 @@
if (x > endx || x < orgx || y > endy || y < orgy)
return FALSE;
XPutPixel(image, x, y, fillp);
-
- testp = XGetPixel(image, x+1, y+1);
- if (testp != borderp && testp != fillp)
- FloodFill_rec(image, x+1, y+1, orgx, orgy,
- endx, endy, borderp, fillp);
-
- testp = XGetPixel(image, x+1, y-1);
- if (testp != borderp && testp != fillp)
+
+ if ((x+1 <= endx) && (y+1 <= endy)) {
+ testp = XGetPixel(image, x+1, y+1);
+ if (testp != borderp && testp != fillp)
+ FloodFill_rec(image, x+1, y+1, orgx, orgy,
+ endx, endy, borderp, fillp);
+ }
+ if ((x+1 <= endx) && (y-1 >= orgy)) {
+ testp = XGetPixel(image, x+1, y-1);
+ if (testp != borderp && testp != fillp)
FloodFill_rec(image, x+1, y-1, orgx, orgy,
endx, endy, borderp, fillp);
- testp = XGetPixel(image, x-1, y+1);
- if (testp != borderp && testp != fillp)
- FloodFill_rec(image, x-1, y+1, orgx, orgy,
- endx, endy, borderp, fillp);
- testp = XGetPixel(image, x-1, y-1);
- if (testp != borderp && testp != fillp)
- FloodFill_rec(image, x-1, y-1, orgx, orgy,
- endx, endy, borderp, fillp);
+ }
+ if ((x-1 >= orgx) && (y+1 <= endy)) {
+ testp = XGetPixel(image, x-1, y+1);
+ if (testp != borderp && testp != fillp)
+ FloodFill_rec(image, x-1, y+1, orgx, orgy,
+ endx, endy, borderp, fillp);
+ }
+ if ((x-1 >= orgx) && (y-1 >= orgy)) {
+ testp = XGetPixel(image, x-1, y-1);
+ if (testp != borderp && testp != fillp)
+ FloodFill_rec(image, x-1, y-1, orgx, orgy,
+ endx, endy, borderp, fillp);
+ }
return TRUE;
}
@@ -737,8 +744,8 @@
return FALSE;
if (!FloodFill_rec(image, x, y,
0, 0,
- dc->w.DCOrgX + dc->w.DCSizeX,
- dc->w.DCOrgY + dc->w.DCSizeY,
+ dc->w.DCSizeX-1,
+ dc->w.DCSizeY-1,
boundrypixel, dc->u.x.brush.pixel)) {
XDestroyImage(image);
return FALSE;
diff --git a/windows/keyboard.c b/windows/keyboard.c
index ffa5777..bdde31e 100644
--- a/windows/keyboard.c
+++ b/windows/keyboard.c
@@ -11,9 +11,10 @@
extern BOOL MouseButtonsStates[3];
extern BOOL AsyncMouseButtonsStates[3];
+extern BYTE KeyStateTable[256];
/**********************************************************************
- * GetKeyState (USER.106)
+ * GetKeyState [USER.106]
*/
int GetKeyState(int keycode)
{
@@ -29,6 +30,15 @@
}
}
+/**********************************************************************
+ * GetKeyboardState [USER.222]
+ */
+void GetKeyboardState(BYTE FAR *lpKeyState)
+{
+ if (lpKeyState != NULL) {
+ memcpy(lpKeyState, KeyStateTable, 256);
+ }
+}
/**********************************************************************
*
diff --git a/windows/mdi.c b/windows/mdi.c
index 00c02f1..08f45bb 100644
--- a/windows/mdi.c
+++ b/windows/mdi.c
@@ -14,7 +14,7 @@
#include "sysmetrics.h"
#include "menu.h"
-/* #define DEBUG_MDI /* */
+#define DEBUG_MDI /* */
/**********************************************************************
* MDIRecreateMenuList
@@ -683,32 +683,37 @@
DefFrameProc(HWND hwnd, HWND hwndMDIClient, WORD message,
WORD wParam, LONG lParam)
{
- switch (message)
+ if (hwndMDIClient)
{
- case WM_COMMAND:
- MDIBringChildToTop(hwndMDIClient, wParam, TRUE, FALSE);
- break;
+ switch (message)
+ {
+ case WM_COMMAND:
+ MDIBringChildToTop(hwndMDIClient, wParam, TRUE, FALSE);
+ break;
- case WM_NCLBUTTONDOWN:
- if (MDIHandleLButton(hwnd, hwndMDIClient, wParam, lParam))
- return 0;
- break;
+ case WM_NCLBUTTONDOWN:
+ if (MDIHandleLButton(hwnd, hwndMDIClient, wParam, lParam))
+ return 0;
+ break;
+
+ case WM_NCACTIVATE:
+ SendMessage(hwndMDIClient, message, wParam, lParam);
+ return MDIPaintMaximized(hwnd, hwndMDIClient,
+ message, wParam, lParam);
- case WM_NCACTIVATE:
- SendMessage(hwndMDIClient, message, wParam, lParam);
- return MDIPaintMaximized(hwnd, hwndMDIClient, message, wParam, lParam);
-
- case WM_NCPAINT:
- return MDIPaintMaximized(hwnd, hwndMDIClient, message, wParam, lParam);
+ case WM_NCPAINT:
+ return MDIPaintMaximized(hwnd, hwndMDIClient,
+ message, wParam, lParam);
- case WM_SETFOCUS:
- SendMessage(hwndMDIClient, WM_SETFOCUS, wParam, lParam);
- break;
+ case WM_SETFOCUS:
+ SendMessage(hwndMDIClient, WM_SETFOCUS, wParam, lParam);
+ break;
- case WM_SIZE:
- MoveWindow(hwndMDIClient, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE);
- break;
-
+ case WM_SIZE:
+ MoveWindow(hwndMDIClient, 0, 0,
+ LOWORD(lParam), HIWORD(lParam), TRUE);
+ break;
+ }
}
return DefWindowProc(hwnd, message, wParam, lParam);
diff --git a/windows/nonclient.c b/windows/nonclient.c
index d8fedc0..e31a875 100644
--- a/windows/nonclient.c
+++ b/windows/nonclient.c
@@ -599,22 +599,24 @@
if (lpMenu->Height == 0) lpMenu->Height = SYSMETRICS_CYMENU + 1;
oldHeight = lpMenu->Height;
rect2.bottom = rect2.top + oldHeight;
-/* printf("NC_DoNCPaint // menubar old Height=%d\n", oldHeight); */
StdDrawMenuBar(hdc, &rect2, lpMenu, suppress_menupaint);
- GlobalUnlock(wndPtr->wIDmenu);
-/* printf("NC_DoNCPaint // menubar new Height=%d\n", lpMenu->Height); */
if (oldHeight != lpMenu->Height) {
+ printf("NC_DoNCPaint // menubar changed oldHeight=%d != lpMenu->Height=%d\n",
+ oldHeight, lpMenu->Height);
/* Reduce ClientRect according to MenuBar height */
wndPtr->rectClient.top -= oldHeight;
wndPtr->rectClient.top += lpMenu->Height;
}
+ GlobalUnlock(wndPtr->wIDmenu);
}
}
if (wndPtr->dwStyle & (WS_VSCROLL | WS_HSCROLL)) {
- if (wndPtr->dwStyle & WS_VSCROLL) {
+ if ((wndPtr->dwStyle & WS_VSCROLL) && (wndPtr->VScroll != NULL) &&
+ (wndPtr->scroll_flags & 0x0001)) {
int bottom = rect.bottom;
- if (wndPtr->dwStyle & WS_HSCROLL) bottom -= SYSMETRICS_CYHSCROLL;
+ if ((wndPtr->dwStyle & WS_HSCROLL) && (wndPtr->scroll_flags & 0x0001))
+ bottom -= SYSMETRICS_CYHSCROLL;
SetRect(&rect2, rect.right - SYSMETRICS_CXVSCROLL,
rect.top, rect.right, bottom);
if (wndPtr->dwStyle & WS_CAPTION) rect.top += SYSMETRICS_CYSIZE;
@@ -622,21 +624,23 @@
rect2.top += SYSMETRICS_CYMENU + 1;
StdDrawScrollBar(hwnd, hdc, SB_VERT, &rect2, (LPHEADSCROLL)wndPtr->VScroll);
}
- if (wndPtr->dwStyle & WS_HSCROLL) {
+ if ((wndPtr->dwStyle & WS_HSCROLL) && wndPtr->HScroll != NULL &&
+ (wndPtr->scroll_flags & 0x0002)) {
int right = rect.right;
- if (wndPtr->dwStyle & WS_VSCROLL) right -= SYSMETRICS_CYVSCROLL;
+ if ((wndPtr->dwStyle & WS_VSCROLL) && (wndPtr->scroll_flags & 0x0001))
+ right -= SYSMETRICS_CYVSCROLL;
SetRect(&rect2, rect.left, rect.bottom - SYSMETRICS_CYHSCROLL,
right, rect.bottom);
StdDrawScrollBar(hwnd, hdc, SB_HORZ, &rect2, (LPHEADSCROLL)wndPtr->HScroll);
}
- if ((wndPtr->dwStyle & WS_VSCROLL) && (wndPtr->dwStyle & WS_HSCROLL))
- {
- RECT r = rect;
- r.left = r.right - SYSMETRICS_CXVSCROLL;
- r.top = r.bottom - SYSMETRICS_CYHSCROLL;
- FillRect( hdc, &r, sysColorObjects.hbrushScrollbar );
- }
+ if ((wndPtr->dwStyle & WS_VSCROLL) && (wndPtr->dwStyle & WS_HSCROLL) &&
+ (wndPtr->scroll_flags & 0x0003) == 0x0003) {
+ RECT r = rect;
+ r.left = r.right - SYSMETRICS_CXVSCROLL;
+ r.top = r.bottom - SYSMETRICS_CYHSCROLL;
+ FillRect( hdc, &r, sysColorObjects.hbrushScrollbar );
+ }
}
ReleaseDC( hwnd, hdc );
diff --git a/windows/win.c b/windows/win.c
index 1f0a8f7..041c227 100644
--- a/windows/win.c
+++ b/windows/win.c
@@ -201,6 +201,7 @@
wndPtr->hdce = 0;
wndPtr->VScroll = NULL;
wndPtr->HScroll = NULL;
+ wndPtr->scroll_flags = 0;
wndPtr->wIDmenu = 0;
wndPtr->hText = 0;
wndPtr->flags = 0;
@@ -318,6 +319,7 @@
wndPtr->flags = 0;
wndPtr->VScroll = NULL;
wndPtr->HScroll = NULL;
+ wndPtr->scroll_flags = 0;
wndPtr->hSysMenu = 0;
wndPtr->hProp = 0;
wndPtr->hTask = 0;
@@ -692,8 +694,11 @@
else switch(offset)
{
case GWL_STYLE: ptr = &wndPtr->dwStyle;
+ break;
case GWL_EXSTYLE: ptr = &wndPtr->dwExStyle;
+ break;
case GWL_WNDPROC: ptr = (LONG *)(&wndPtr->lpfnWndProc);
+ break;
default: return 0;
}
retval = *ptr;