From 1f57929b17869d8aba8cea76e14b79d9d8f67cd6 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Wed, 25 May 1994 16:25:21 +0000 Subject: [PATCH] Release 940524 Mon May 23 15:07:36 1994 Bob Amstadt (bob@pooh) * [loader/selector.c] Allocate heap and stack segments as 64k. Sat May 21 01:15:49 1994 Rick Sladkey (jrs@world.std.com) * [loader/selector.c] Correct typos where memcpy is used instead of memset. * [loader/resource.c] Allow for legitimate cases where biSizeImage is 0 in LoadIcon by calculating the value when the bitmap is not compressed. * [miscemu/int21.c] Fix NULL dereference caused by superfluous DOS_closedir in FindNext. * [loader/resource.c] New function type_match to handle string resource types as well as IDs. In addition, compare only low 4 bits of type_id when both numbers are IDs so that 0x0002 matches 0x8002. In FindResourceByNumber and FindResourceByName use type_match instead of comparing numbers. In FindResource handle the "#number" syntax and empty strings in both the resource and type names. Mon May 23 00:48:25 1994 Rick Sladkey (jrs@world.std.com) * [windows/dialog.c] Fix inadvertent printing of string IDs as strings. May 23, 94 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte) * [controls/menu.c] New functions GetMenuItemCount(), GetMenuItemID(). GetMenuString() & HiliteMenuItem(). Bug fix in CheckMenuItem(). Function SetMenu() now make client area recalc if menu removed. * [windows/winpos.c] Bug fix in SetWindowPos(), no more XMapping or XConfiguring of windows with initial width or height equal zero. * [objects/gdiobj.c] New function EnumObjects(), using new lpPenBrushList buildup from calls to new function GDI_AppendToPenBrushList(). ('pbrush.exe' don't show its face yet ! ... :-( ) New EMPTY STUB for function SetObjectOwner(), ('mplayer.exe' call it via GetProcAddress() ...) * [objects/font.c] New internal functions ParseFontParms() & InitFontsList(). EnumFonts() & EnumFontFamilies() enumerates fonts (no more dummies). FONT_MatchFont now make retries to find closest-smallest font. ('charmap.exe' can now show the differents fonts available) * [windows/nonclient.c] Use small dos OBM_OLD_CLOSE button for MDI windows. * [windows/graphics.c] [objects/bitmap.c] Start to remove obsolete globals such XT_screen ... * [loader/library.c] Make function GetProcAddress() working also with builtin DLLs. Tue May 24 20:18:02 1994 Erik Bos (erik@hacktic.nl) * [if1632/system.spec] [if1632/toolhelp.spec] system.dll & toolhelp.dll added. * [loader/library.c] Modified GetModuleFileName() to return the full filename. Added a check to LoadLibrary() to prevent loading built in dlls. (eg. user.exe) Added a check to FreeLibrary() to prevent built-in dlls from being freed. Modified GetProcAddress() to support builtin dlls. * [loader/signal.c] [miscemu/int2f.c] Added => pifedit runs. * [misc/dos_fs.c] Added a NULL-ptr check to DOS_closedir(). --- ChangeLog | 86 +++++++++++ LICENSE | 31 +++- README | 37 ++++- controls/Imakefile | 2 +- controls/combo.c | 2 + controls/edit.c | 1 - controls/menu.c | 234 ++++++++++++++++++++++-------- if1632/Imakefile | 4 + if1632/gdi.spec | 8 +- if1632/mmsystem.spec | 25 ++++ if1632/relay.c | 7 +- if1632/user.spec | 8 +- include/dlls.h | 4 + include/gdi.h | 2 - include/windows.h | 2 +- loader/library.c | 238 +++++++++++++++++++------------ loader/resource.c | 97 +++++++++++-- loader/selector.c | 17 +-- loader/signal.c | 5 + memory/global.c | 1 + misc/cursor.c | 2 +- misc/dos_fs.c | 30 +++- misc/lstr.c | 24 +++- misc/main.c | 24 +++- misc/message.c | 8 +- misc/mmsystem.c | 331 ++++++++++++++++++++++++++++--------------- misc/property.c | 20 ++- miscemu/Imakefile | 1 + miscemu/emulate.c | 7 +- miscemu/int21.c | 3 - objects/bitmap.c | 2 +- objects/font.c | 307 ++++++++++++++++++++++++++++----------- objects/gdiobj.c | 174 +++++++++++++++++++++++ objects/text.c | 2 +- windows/dialog.c | 13 +- windows/graphics.c | 58 ++++---- windows/nonclient.c | 9 +- windows/utility.c | 99 ++++--------- windows/win.c | 3 + windows/winpos.c | 14 +- 40 files changed, 1407 insertions(+), 535 deletions(-) diff --git a/ChangeLog b/ChangeLog index ed36b230216..1d124764314 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,89 @@ +---------------------------------------------------------------------- +Mon May 23 15:07:36 1994 Bob Amstadt (bob@pooh) + + * [loader/selector.c] + Allocate heap and stack segments as 64k. + +Sat May 21 01:15:49 1994 Rick Sladkey (jrs@world.std.com) + + * [loader/selector.c] + Correct typos where memcpy is used instead of memset. + + * [loader/resource.c] + Allow for legitimate cases where biSizeImage is 0 in LoadIcon + by calculating the value when the bitmap is not compressed. + + * [miscemu/int21.c] + Fix NULL dereference caused by superfluous DOS_closedir in FindNext. + + * [loader/resource.c] + New function type_match to handle string resource types as + well as IDs. In addition, compare only low 4 bits of type_id + when both numbers are IDs so that 0x0002 matches 0x8002. + In FindResourceByNumber and FindResourceByName use type_match + instead of comparing numbers. In FindResource handle the + "#number" syntax and empty strings in both the resource and + type names. + +Mon May 23 00:48:25 1994 Rick Sladkey (jrs@world.std.com) + + * [windows/dialog.c] + Fix inadvertent printing of string IDs as strings. + +May 16, 94 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte) + + * [controls/menu.c] + New functions GetMenuItemCount(), GetMenuItemID(). + GetMenuString() & HiliteMenuItem(). + Bug fix in CheckMenuItem(). + Function SetMenu() now make client area recalc if menu removed. + + * [windows/winpos.c] + Bug fix in SetWindowPos(), no more XMapping or XConfiguring of + windows with initial width or height equal zero. + + * [objects/gdiobj.c] + New function EnumObjects(), using new lpPenBrushList buildup + from calls to new function GDI_AppendToPenBrushList(). + ('pbrush.exe' don't show its face yet ! ... :-( ) + New EMPTY STUB for function SetObjectOwner(), + ('mplayer.exe' call it via GetProcAddress() ...) + + * [objects/font.c] + New internal functions ParseFontParms() & InitFontsList(). + EnumFonts() & EnumFontFamilies() enumerates fonts (no more dummies). + FONT_MatchFont now make retries to find closest-smallest font. + ('charmap.exe' can now show the differents fonts available) + + * [windows/nonclient.c] + Use small dos OBM_OLD_CLOSE button for MDI windows. + + * [windows/graphics.c] [objects/bitmap.c] + Start to remove obsolete globals such XT_screen ... + + * [loader/library.c] + Make function GetProcAddress() working also with builtin DLLs. + +Tue May 24 20:18:02 1994 Erik Bos (erik@hacktic.nl) + + * [if1632/system.spec] [if1632/toolhelp.spec] + system.dll & toolhelp.dll added. + + * [loader/library.c] + Modified GetModuleFileName() to return the full + filename. + Added a check to LoadLibrary() to prevent loading + built in dlls. (eg. user.exe) + Added a check to FreeLibrary() to prevent built-in + dlls from being freed. + Modified GetProcAddress() to support builtin dlls. + + * [loader/signal.c] [miscemu/int2f.c] + Added => pifedit runs. + + * [misc/dos_fs.c] + Added a NULL-ptr check to DOS_closedir(). + ---------------------------------------------------------------------- Tue May 17 23:03:16 1994 Bob Amstadt (bob@pooh) diff --git a/LICENSE b/LICENSE index 3854e932ad3..88add0b5de8 100644 --- a/LICENSE +++ b/LICENSE @@ -1 +1,30 @@ -All code unless stated otherwise is covered by the GNU Pubic License. +You may without charge, royalty or other payment, copy and +distribute copies of this work and derivative works of this work +in source or binary form provided that: (1) +you appropriately publish on each copy an appropriate copyright +notice; (2) faithfully reproduce all prior copyright notices +included in the original work (you may also add your own +copyright notice); and (3) agree to indemnify and hold all prior +authors, copyright holders and licensors of the work harmless +from and against all damages arising from use of the work. + +You may distribute sources of derivative works of the work +provided that (1) (a) all source files of the original work that +have been modified, (b) all source files of the derivative work +that contain any party of the original work, and (c) all source +files of the derivative work that are necessary to compile, link +and run the derivative work without unresolved external calls and +with the same functionality of the original work ("Necessary +Sources") carry a prominent notice explaining the nature and date +of the modification and/or creation. You are encouraged to make +the Necessary Sources available under this license in order to +further the development and acceptance of the work. + +EXCEPT AS OTHERWISE RESTRICTED BY LAW, THIS WORK IS PROVIDED +WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES OF ANY KIND, INCLUDING +BUT NOT LIMITED TO, ANY IMPLIED WARRANTIES OF FITNESS FOR A +PARTICULAR PURPOSE, MERCHANTABILITY OR TITLE. EXCEPT AS +OTHERWISE PROVIDED BY LAW, NO AUTHOR, COPYRIGHT HOLDER OR +LICENSOR SHALL BE LIABLE TO YOU FOR DAMAGES OF ANY KIND, EVEN IF +ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + diff --git a/README b/README index 1d735be87ea..4df0e041937 100644 --- a/README +++ b/README @@ -1,8 +1,34 @@ -Copyright Robert J. Amstadt, 1993. All code is provided without -warranty. All code is covered by the license contained in the file -LICENSE unless explicitly stated in the individual source file. +0. LICENSE +You may without charge, royalty or other payment, copy and +distribute copies of this work and derivative works of this work +in source or binary form provided that: (1) +you appropriately publish on each copy an appropriate copyright +notice; (2) faithfully reproduce all prior copyright notices +included in the original work (you may also add your own +copyright notice); and (3) agree to indemnify and hold all prior +authors, copyright holders and licensors of the work harmless +from and against all damages arising from use of the work. +You may distribute sources of derivative works of the work +provided that (1) (a) all source files of the original work that +have been modified, (b) all source files of the derivative work +that contain any party of the original work, and (c) all source +files of the derivative work that are necessary to compile, link +and run the derivative work without unresolved external calls and +with the same functionality of the original work ("Necessary +Sources") carry a prominent notice explaining the nature and date +of the modification and/or creation. You are encouraged to make +the Necessary Sources available under this license in order to +further the development and acceptance of the work. + +EXCEPT AS OTHERWISE RESTRICTED BY LAW, THIS WORK IS PROVIDED +WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES OF ANY KIND, INCLUDING +BUT NOT LIMITED TO, ANY IMPLIED WARRANTIES OF FITNESS FOR A +PARTICULAR PURPOSE, MERCHANTABILITY OR TITLE. EXCEPT AS +OTHERWISE PROVIDED BY LAW, NO AUTHOR, COPYRIGHT HOLDER OR +LICENSOR SHALL BE LIABLE TO YOU FOR DAMAGES OF ANY KIND, EVEN IF +ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 1. COMPILATION: @@ -171,6 +197,11 @@ bob@amscons.com 7. WHAT'S NEW +WHAT'S NEW with Wine-940524: (see ChangeLog for details) + - New menu functions + - EnumObjects() + - and many many bug fixes! + WHAT'S NEW with Wine-940518: (see ChangeLog for details) - debugger improvements - bug fixes to get some dialog boxes working. diff --git a/controls/Imakefile b/controls/Imakefile index 261529412c8..4556b4c8aa6 100644 --- a/controls/Imakefile +++ b/controls/Imakefile @@ -9,7 +9,7 @@ SRCS = \ menu.c \ scroll.c \ static.c \ - edit.o \ + edit.c \ desktop.c \ widgets.c diff --git a/controls/combo.c b/controls/combo.c index 48d0519ffde..22a1b08fb5e 100644 --- a/controls/combo.c +++ b/controls/combo.c @@ -263,7 +263,9 @@ LONG ComboBoxWndProc( HWND hwnd, WORD message, WORD wParam, LONG lParam ) if (lphc == NULL) return 0; return(SendMessage(lphc->hWndLBox, LB_ADDSTRING, wParam, lParam)); case CB_GETLBTEXT: +#ifdef DEBUG_COMBO printf("CB_GETLBTEXT #%u !\n", wParam); +#endif lphc = ComboGetStorageHeader(hwnd); if (lphc == NULL) return 0; return(SendMessage(lphc->hWndLBox, LB_GETTEXT, wParam, lParam)); diff --git a/controls/edit.c b/controls/edit.c index 552824726e4..5e43c3b01e7 100644 --- a/controls/edit.c +++ b/controls/edit.c @@ -309,7 +309,6 @@ LONG EditWndProc(HWND hwnd, WORD uMsg, WORD wParam, LONG lParam) break; case WM_KEYDOWN: - printf("EDIT WM_KEYDOWN w=%04X !\n", wParam); EDIT_KeyDownMsg(hwnd, wParam); break; diff --git a/controls/menu.c b/controls/menu.c index e41c96837f8..dd9c880d9ad 100644 --- a/controls/menu.c +++ b/controls/menu.c @@ -14,6 +14,7 @@ static char Copyright[] = "Copyright Martin Ayotte, 1993"; #include "sysmetrics.h" #include "prototypes.h" #include "menu.h" +#include "user.h" #include "heap.h" #include "win.h" @@ -50,6 +51,7 @@ WORD GetSelectionKey(LPSTR str); LPSTR GetShortCutString(LPSTR str); WORD GetShortCutPos(LPSTR str); BOOL HideAllSubPopupMenu(LPPOPUPMENU menu); +void InitStdBitmaps(); HMENU CopySysMenu(); WORD * ParseMenuResource(WORD *first_item, int level, HMENU hMenu); void SetMenuLogicalParent(HMENU hMenu, HWND hWnd); @@ -84,10 +86,7 @@ LONG PopupMenuWndProc( HWND hwnd, WORD message, WORD wParam, LONG lParam ) #ifdef DEBUG_MENU printf("PopupMenu WM_CREATE lppop=%08X !\n", lppop); #endif - if (hStdCheck == (HBITMAP)NULL) - hStdCheck = LoadBitmap((HANDLE)NULL, (LPSTR)OBM_CHECK); - if (hStdMnArrow == (HBITMAP)NULL) - hStdMnArrow = LoadBitmap((HANDLE)NULL, (LPSTR)OBM_MNARROW); + InitStdBitmaps(); #ifdef DEBUG_MENU printf("PopupMenu End of WM_CREATE !\n"); #endif @@ -215,6 +214,7 @@ LONG PopupMenuWndProc( HWND hwnd, WORD message, WORD wParam, LONG lParam ) ShowWindow(hwnd, SW_HIDE); hwnd = lppop->hWndParent; lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr); + printf("VK_LEFT // try to put focus on MenuBar %08X !\n", lppop); if (lppop == NULL) break; MenuItemSelect(hwnd, lppop, lppop->nItems - 1); break; @@ -241,6 +241,7 @@ LONG PopupMenuWndProc( HWND hwnd, WORD message, WORD wParam, LONG lParam ) ShowWindow(hwnd, SW_HIDE); hwnd = lppop->hWndParent; lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr); + printf("VK_RIGHT // try to put focus on MenuBar %08X !\n", lppop); if (lppop == NULL) break; MenuItemSelect(hwnd, lppop, 0); break; @@ -262,11 +263,6 @@ LONG PopupMenuWndProc( HWND hwnd, WORD message, WORD wParam, LONG lParam ) } MenuItemSelect(hwnd, lppop, lppop->FocusedItem + 1); break; - case VK_RETURN: - case VK_SPACE: -ProceedSPACE: lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr); - ExecFocusedMenuItem(hwnd, lppop); - break; default: break; } @@ -280,6 +276,11 @@ ProceedSPACE: lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr); lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr); if (lppop == NULL) break; switch(wParam) { + case VK_RETURN: + case VK_SPACE: +ProceedSPACE: lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr); + ExecFocusedMenuItem(hwnd, lppop); + break; case VK_ESCAPE: if (lppop->BarFlag) { #ifdef DEBUG_MENU @@ -686,6 +687,7 @@ void StdDrawPopupMenu(HWND hwnd) EndPaint(hwnd, &ps); return; } + InitStdBitmaps(); lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr); if (lppop == NULL) goto EndOfPaint; hBrush = GetStockObject(WHITE_BRUSH); @@ -734,8 +736,13 @@ void StdDrawPopupMenu(HWND hwnd) hMemDC = CreateCompatibleDC(hDC); SelectObject(hMemDC, hBitMap); GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&bm); +#ifdef DEBUG_MENU + printf("StdDrawPopupMenu // MF_BITMAP hBit=%04X w=%d h=%d\n", + hBitMap, bm.bmWidth, bm.bmHeight); +#endif BitBlt(hDC, rect2.left, rect2.top, - bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY); + bm.bmWidth, bm.bmHeight, + hMemDC, 0, 0, SRCCOPY); DeleteDC(hMemDC); if ((lpitem->item_flags & MF_HILITE) == MF_HILITE) InvertRect(hDC, &lpitem->rect); @@ -812,9 +819,7 @@ void StdDrawMenuBar(HDC hDC, LPRECT lprect, LPPOPUPMENU lppop, printf("StdDrawMenuBar(%04X, %08X, %08X); !\n", hDC, lprect, lppop); #endif MenuBarCalcSize(hDC, lprect, lppop); - if (suppress_draw) - return; - + if (suppress_draw) return; hOldFont = SelectObject(hDC, GetStockObject(SYSTEM_FONT)); hOldPen = SelectObject(hDC, GetStockObject(BLACK_PEN)); hBrush = GetStockObject(WHITE_BRUSH); @@ -855,8 +860,13 @@ void StdDrawMenuBar(HDC hDC, LPRECT lprect, LPPOPUPMENU lppop, hMemDC = CreateCompatibleDC(hDC); SelectObject(hMemDC, hBitMap); GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&bm); +#ifdef DEBUG_MENU + printf("StdDrawMenuBar // MF_BITMAP hBit=%04X w=%d h=%d\n", + hBitMap, bm.bmWidth, bm.bmHeight); +#endif BitBlt(hDC, rect2.left, rect2.top, - bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY); + bm.bmWidth, bm.bmHeight, + hMemDC, 0, 0, SRCCOPY); DeleteDC(hMemDC); } if (((lpitem->item_flags & MF_BITMAP) != MF_BITMAP) && @@ -955,6 +965,7 @@ void PopupMenuCalcSize(HWND hwnd) #ifdef DEBUG_MENUCALC printf("PopupMenuCalcSize hWnd=%04X !\n", hWnd); #endif + InitStdBitmaps(); lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr); if (lppop == NULL) return; if (lppop->nItems == 0) return; @@ -1039,6 +1050,7 @@ void MenuBarCalcSize(HDC hDC, LPRECT lprect, LPPOPUPMENU lppop) DWORD dwRet; if (lppop == NULL) return; if (lppop->nItems == 0) return; + InitStdBitmaps(); #ifdef DEBUG_MENUCALC printf("MenuBarCalcSize left=%d top=%d right=%d bottom=%d !\n", lprect->left, lprect->top, lprect->right, lprect->bottom); @@ -1245,29 +1257,21 @@ BOOL ChangeMenu(HMENU hMenu, WORD nPos, LPSTR lpNewItem, */ BOOL CheckMenuItem(HMENU hMenu, WORD wItemID, WORD wFlags) { - WND *wndPtr; - LPPOPUPMENU menu; LPMENUITEM lpitem; - int i; #ifdef DEBUG_MENU printf("CheckMenuItem (%04X, %04X, %04X) !\n", hMenu, wItemID, wFlags); #endif - menu = (LPPOPUPMENU) GlobalLock(hMenu); - if (menu == NULL) return FALSE; - lpitem = menu->firstItem; - for (i = 0; i < menu->nItems; i++) { - if (lpitem == NULL) break; - if (i == wItemID) { - if (wFlags && MF_CHECKED) - lpitem->item_flags |= MF_CHECKED; - else - lpitem->item_flags &= ((WORD)-1 ^ MF_CHECKED); - GlobalUnlock(hMenu); - return(TRUE); - } - lpitem = (LPMENUITEM)lpitem->next; + lpitem = FindMenuItem(hMenu, wItemID, wFlags); + if (lpitem != NULL) { + if ((wFlags & MF_CHECKED) == MF_CHECKED) + lpitem->item_flags |= MF_CHECKED; + else + lpitem->item_flags &= ((WORD)-1 ^ MF_CHECKED); +#ifdef DEBUG_MENU + printf("CheckMenuItem // Found !\n"); +#endif + return(TRUE); } - GlobalUnlock(hMenu); return FALSE; } @@ -1277,30 +1281,113 @@ BOOL CheckMenuItem(HMENU hMenu, WORD wItemID, WORD wFlags) */ BOOL EnableMenuItem(HMENU hMenu, WORD wItemID, WORD wFlags) { - WND *wndPtr; - LPPOPUPMENU menu; LPMENUITEM lpitem; - int i; #ifdef DEBUG_MENU printf("EnableMenuItem (%04X, %04X, %04X) !\n", hMenu, wItemID, wFlags); #endif + lpitem = FindMenuItem(hMenu, wItemID, wFlags); + if (lpitem != NULL) { + if (wFlags && MF_DISABLED) + lpitem->item_flags |= MF_DISABLED; + else + lpitem->item_flags &= ((WORD)-1 ^ MF_DISABLED); +#ifdef DEBUG_MENU + printf("EnableMenuItem // Found !\n"); +#endif + return(TRUE); + } + return FALSE; +} + + +/********************************************************************** + * GetMenuString [USER.161] + */ +int GetMenuString(HMENU hMenu, WORD wItemID, + LPSTR str, short nMaxSiz, WORD wFlags) +{ + LPMENUITEM lpitem; + int maxsiz; +#ifdef DEBUG_MENU + printf("GetMenuString(%04X, %04X, %08X, %d, %04X);\n", + hMenu, wItemID, str, nMaxSiz, wFlags); +#endif + if (str == NULL) return FALSE; + lpitem = FindMenuItem(hMenu, wItemID, wFlags); + if (lpitem != NULL) { + if (lpitem->item_text != NULL) { + maxsiz = min(nMaxSiz - 1, strlen(lpitem->item_text)); + strncpy(str, lpitem->item_text, maxsiz + 1); + } + else + maxsiz = 0; +#ifdef DEBUG_MENU + printf("GetMenuString // Found !\n"); +#endif + return maxsiz; + } + return 0; +} + + +/********************************************************************** + * HiliteMenuItem [USER.162] + */ +BOOL HiliteMenuItem(HWND hWnd, HMENU hMenu, WORD wItemID, WORD wHilite) +{ + LPPOPUPMENU menu; + LPMENUITEM lpitem; + printf("HiliteMenuItem(%04X, %04X, %04X, %04X);\n", + hWnd, hMenu, wItemID, wHilite); menu = (LPPOPUPMENU) GlobalLock(hMenu); if (menu == NULL) return FALSE; + lpitem = FindMenuItem(hMenu, wItemID, wHilite); + if (lpitem == NULL) return FALSE; + return FALSE; +} + + +/********************************************************************** + * GetMenuItemCount [USER.263] + */ +WORD GetMenuItemCount(HMENU hMenu) +{ + LPPOPUPMENU menu; +#ifdef DEBUG_MENU + printf("GetMenuItemCount(%04X);\n", hMenu); +#endif + menu = (LPPOPUPMENU) GlobalLock(hMenu); + if (menu == NULL) return (WORD)-1; +#ifdef DEBUG_MENU + printf("GetMenuItemCount(%04X) return %d \n", hMenu, menu->nItems); +#endif + return menu->nItems; +} + + +/********************************************************************** + * GetMenuItemID [USER.264] + */ +WORD GetMenuItemID(HMENU hMenu, int nPos) +{ + WORD i; + LPPOPUPMENU menu; + LPMENUITEM lpitem; + printf("GetMenuItemID(%04X, %d);\n", hMenu, nPos); + menu = (LPPOPUPMENU) GlobalLock(hMenu); + if (menu == NULL) return -1; lpitem = menu->firstItem; for (i = 0; i < menu->nItems; i++) { if (lpitem == NULL) break; - if (i == wItemID) { - if (wFlags && MF_DISABLED) - lpitem->item_flags |= MF_DISABLED; - else - lpitem->item_flags &= ((WORD)-1 ^ MF_DISABLED); - GlobalUnlock(hMenu); - return(TRUE); + if (i == nPos) { +#ifdef DEBUG_MENU + printf("GetMenuItemID // Found !\n"); +#endif + return lpitem->item_id; } lpitem = (LPMENUITEM)lpitem->next; } - GlobalUnlock(hMenu); - return FALSE; + return -1; } @@ -1309,13 +1396,11 @@ BOOL EnableMenuItem(HMENU hMenu, WORD wItemID, WORD wFlags) */ BOOL InsertMenu(HMENU hMenu, WORD nPos, WORD wFlags, WORD wItemID, LPSTR lpNewItem) { - WND *wndPtr; LPPOPUPMENU menu; HANDLE hNewItem; LPMENUITEM lpitem, lpitem2; - int i; #ifdef DEBUG_MENU - if (wFlags & MF_STRING) + if ((wFlags & (MF_BITMAP | MF_SEPARATOR | MF_MENUBREAK | MF_OWNERDRAW)) == 0) printf("InsertMenu (%04X, %04X, %04X, '%s') !\n", hMenu, wFlags, wItemID, lpNewItem); else @@ -1377,7 +1462,6 @@ BOOL InsertMenu(HMENU hMenu, WORD nPos, WORD wFlags, WORD wItemID, LPSTR lpNewIt */ BOOL AppendMenu(HMENU hMenu, WORD wFlags, WORD wItemID, LPSTR lpNewItem) { - WND *wndPtr; LPPOPUPMENU menu; HANDLE hNewItem; LPMENUITEM lpitem, lpitem2; @@ -1445,7 +1529,6 @@ BOOL AppendMenu(HMENU hMenu, WORD wFlags, WORD wItemID, LPSTR lpNewItem) */ BOOL RemoveMenu(HMENU hMenu, WORD nPos, WORD wFlags) { - WND *wndPtr; LPPOPUPMENU menu; LPMENUITEM lpitem; int i; @@ -1521,13 +1604,16 @@ BOOL DeleteMenu(HMENU hMenu, WORD nPos, WORD wFlags) */ BOOL ModifyMenu(HMENU hMenu, WORD nPos, WORD wFlags, WORD wItemID, LPSTR lpNewItem) { - WND *wndPtr; LPPOPUPMENU menu; LPMENUITEM lpitem; int i; #ifdef DEBUG_MENU - printf("ModifyMenu (%04X, %04X, %04X, %04X, %08X) !\n", - hMenu, nPos, wFlags, wItemID, lpNewItem); + if ((wFlags & (MF_BITMAP | MF_SEPARATOR | MF_MENUBREAK | MF_OWNERDRAW)) == 0) + printf("ModifyMenu (%04X, %04X, %04X, %04X, '%s') !\n", + hMenu, nPos, wFlags, wItemID, lpNewItem); + else + printf("ModifyMenu (%04X, %04X, %04X, %04X, %08X) !\n", + hMenu, nPos, wFlags, wItemID, lpNewItem); #endif menu = (LPPOPUPMENU) GlobalLock(hMenu); if (menu == NULL) return FALSE; @@ -1593,6 +1679,9 @@ HMENU CreatePopupMenu() menu->Width = 100; menu->Height = 0; GlobalUnlock(hMenu); +#ifdef DEBUG_MENU + printf("CreatePopupMenu // return %04X\n", hMenu); +#endif return hMenu; } @@ -1692,7 +1781,6 @@ BOOL ActivateMenuBarFocus(HWND hWnd) BOOL MenuFocusLoop(HWND hWnd, LPPOPUPMENU lpmenu) { - WND *wndPtr; MSG msg; #ifdef DEBUG_MENU printf("Enter in Menu Focus Loop !\n"); @@ -1808,8 +1896,7 @@ void NC_TrackSysMenu(HWND hWnd) DWORD GetMenuCheckMarkDimensions() { BITMAP bm; - if (hStdCheck == (HBITMAP)NULL) - hStdCheck = LoadBitmap((HANDLE)NULL, (LPSTR)OBM_CHECK); + InitStdBitmaps(); GetObject(hStdCheck, sizeof(BITMAP), (LPSTR)&bm); return MAKELONG(bm.bmWidth, bm.bmHeight); } @@ -1821,7 +1908,6 @@ DWORD GetMenuCheckMarkDimensions() BOOL SetMenuItemBitmaps(HMENU hMenu, WORD nPos, WORD wFlags, HBITMAP hNewCheck, HBITMAP hNewUnCheck) { - WND *wndPtr; LPPOPUPMENU menu; LPMENUITEM lpitem; int i; @@ -1856,7 +1942,7 @@ HMENU CreateMenu() HMENU hMenu; LPPOPUPMENU menu; #ifdef DEBUG_MENU - printf("CreatePopupMenu !\n"); + printf("CreateMenu !\n"); #endif hMenu = GlobalAlloc(GMEM_MOVEABLE, sizeof(POPUPMENU)); menu = (LPPOPUPMENU) GlobalLock(hMenu); @@ -1877,6 +1963,9 @@ HMENU CreateMenu() menu->Width = 100; menu->Height = 0; GlobalUnlock(hMenu); +#ifdef DEBUG_MENU + printf("CreateMenu // return %04X\n", hMenu); +#endif return hMenu; } @@ -1983,7 +2072,10 @@ HMENU GetMenu(HWND hWnd) */ BOOL SetMenu(HWND hWnd, HMENU hMenu) { + RECT rect; LPPOPUPMENU lpmenu; + NCCALCSIZE_PARAMS *params; + HANDLE hparams; WND * wndPtr = WIN_FindWndPtr(hWnd); if (wndPtr == NULL) { printf("SetMenu(%04X, %04X) // Bad window handle !\n", hWnd, hMenu); @@ -1992,7 +2084,22 @@ BOOL SetMenu(HWND hWnd, HMENU hMenu) #ifdef DEBUG_MENU printf("SetMenu(%04X, %04X);\n", hWnd, hMenu); #endif + if (GetCapture() == hWnd) ReleaseCapture(); wndPtr->wIDmenu = hMenu; + if (hMenu == 0) { + printf("SetMenu(%04X, %04X) // Menu removed !\n", hWnd, hMenu); + hparams = USER_HEAP_ALLOC(GMEM_MOVEABLE, sizeof(NCCALCSIZE_PARAMS)); + if (hparams) { + params = (NCCALCSIZE_PARAMS *) USER_HEAP_ADDR(hparams); + params->rgrc[0] = wndPtr->rectWindow; + params->lppos = NULL; + SendMessage(hWnd, WM_NCCALCSIZE, FALSE, (LONG)params); + wndPtr->rectClient = params->rgrc[0]; + USER_HEAP_FREE(hparams); + } + SendMessage(hWnd, WM_NCPAINT, 0, 0L); + return TRUE; + } lpmenu = (LPPOPUPMENU) GlobalLock(hMenu); if (lpmenu == NULL) { printf("SetMenu(%04X, %04X) // Bad menu handle !\n", hWnd, hMenu); @@ -2000,7 +2107,6 @@ BOOL SetMenu(HWND hWnd, HMENU hMenu) } lpmenu->ownerWnd = hWnd; ResetHiliteFlags(lpmenu); - if (GetCapture() == hWnd) ReleaseCapture(); GlobalUnlock(hMenu); return TRUE; } @@ -2092,6 +2198,18 @@ HMENU LoadMenuIndirect(LPSTR menu_template) } +/********************************************************************** + * InitStdBitmaps (Internal) + */ +void InitStdBitmaps() +{ + if (hStdCheck == (HBITMAP)NULL) + hStdCheck = LoadBitmap((HANDLE)NULL, (LPSTR)OBM_CHECK); + if (hStdMnArrow == (HBITMAP)NULL) + hStdMnArrow = LoadBitmap((HANDLE)NULL, (LPSTR)OBM_MNARROW); +} + + /********************************************************************** * CopySysMenu (Internal) */ diff --git a/if1632/Imakefile b/if1632/Imakefile index d1ff205c3e7..601424d3ee1 100644 --- a/if1632/Imakefile +++ b/if1632/Imakefile @@ -16,6 +16,8 @@ DLLOBJS = \ dll_shell.o \ dll_sound.o \ dll_stress.o \ + dll_system.o \ + dll_toolhelp.o \ dll_unixlib.o \ dll_user.o \ dll_win87em.o \ @@ -39,6 +41,8 @@ MakeDllFromSpec(shell,$(TOP)/$(MODULE)) MakeDllFromSpec(mmsystem,$(TOP)/$(MODULE)) MakeDllFromSpec(sound,$(TOP)/$(MODULE)) MakeDllFromSpec(stress,$(TOP)/$(MODULE)) +MakeDllFromSpec(system,$(TOP)/$(MODULE)) +MakeDllFromSpec(toolhelp,$(TOP)/$(MODULE)) MakeDllFromSpec(unixlib,$(TOP)/$(MODULE)) MakeDllFromSpec(user,$(TOP)/$(MODULE)) MakeDllFromSpec(win87em,$(TOP)/$(MODULE)) diff --git a/if1632/gdi.spec b/if1632/gdi.spec index 10c2ba9bd60..82247c51ac5 100644 --- a/if1632/gdi.spec +++ b/if1632/gdi.spec @@ -85,7 +85,7 @@ length 490 68 pascal DeleteDC(word) DeleteDC(1) 69 pascal DeleteObject(word) DeleteObject(1) 70 pascal EnumFonts(word ptr ptr ptr) EnumFonts(1 2 3 4) -#71 pascal EnumObjects +71 pascal EnumObjects(word word ptr ptr) EnumObjects(1 2 3 4) 72 pascal EqualRgn(word word) EqualRgn(1 2) 73 pascal ExcludeVisRect(word s_word s_word s_word s_word) ExcludeVisRect(1 2 3 4 5) @@ -136,8 +136,8 @@ length 490 129 pascal SaveVisRgn(word) SaveVisRgn(1) 130 pascal RestoreVisRgn(word) RestoreVisRgn(1) 131 pascal InquireVisRgn(word) InquireVisRgn(1) -#132 pascal SetEnvironment -#133 pascal GetEnvironment +132 pascal SetEnvironment(ptr ptr word) SetEnvironment(1 2 3) +133 pascal GetEnvironment(ptr ptr word) GetEnvironment(1 2 3) 134 pascal GetRgnBox(word ptr) GetRgnBox(1 2) #135 pascal ScanLr #136 pascal RemoveFontResource @@ -276,7 +276,7 @@ length 490 CreatePolyPolygonRgn(1 2 3 4) #452 pascal GDISEEGDIDO #460 pascal GDITASKTERMINATION -#461 pascal SETOBJECTOWNER +461 pascal SetObjectOwner(word) SetObjectOwner(1) #462 pascal ISGDIOBJECT #463 pascal MAKEOBJECTPRIVATE #464 pascal FIXUPBOGUSPUBLISHERMETAFILE diff --git a/if1632/mmsystem.spec b/if1632/mmsystem.spec index b9d01e78f1e..22bdf4611ac 100644 --- a/if1632/mmsystem.spec +++ b/if1632/mmsystem.spec @@ -67,8 +67,33 @@ length 706 509 pascal WAVEINSTART(word) waveInStart(1) 510 pascal WAVEINSTOP(word) waveInStop(1) 511 pascal WAVEINRESET(word) waveInReset(1) +512 pascal WAVEINGETPOSITION(word ptr word) waveInGetPosition(1 2 3) 513 pascal WAVEINGETID(word ptr) waveInGetID(1 2) 701 pascal MCISENDCOMMAND(word word long long) mciSendCommand(1 2 3 4) 702 pascal MCISENDSTRING(ptr ptr word word) mciSendString(1 2 3 4) 703 pascal MCIGETDEVICEID(ptr) mciSendCommand(1) 706 pascal MCIGETERRORSTRING(long ptr word) mciGetErrorString(1 2 3) +#1100 pascal DRVOPEN +#1101 pascal DRVCLOSE +#1102 pascal DRVSENDMESSAGE +#1103 pascal DRVGETMODULEHANDLE +#1104 pascal DRVDEFDRIVERPROC +#1210 pascal MMIOOPEN +#1211 pascal MMIOCLOSE +#1212 pascal MMIOREAD +#1213 pascal MMIOWRITE +#1214 pascal MMIOSEEK +#1215 pascal MMIOGETINFO +#1216 pascal MMIOSETINFO +#1217 pascal MMIOSETBUFFER +#1218 pascal MMIOFLUSH +#1219 pascal MMIOADVANCE +#1220 pascal MMIOSTRINGTOFOURCC +#1221 pascal MMIOINSTALLIOPROC +#1222 pascal MMIOSENDMESSAGE +#1223 pascal MMIODESCEND +#1224 pascal MMIOASCEND +#1225 pascal MMIOCREATECHUNK +#1226 pascal MMIORENAME + + diff --git a/if1632/relay.c b/if1632/relay.c index f5b08b09f19..ddbf8c90259 100644 --- a/if1632/relay.c +++ b/if1632/relay.c @@ -24,8 +24,6 @@ static char Copyright[] = "Copyright Robert J. Amstadt, 1993"; #define DEBUG_RELAY /* */ -#define N_BUILTINS 11 - struct dll_name_table_entry_s dll_builtin_table[N_BUILTINS] = { { "KERNEL", KERNEL_table, 410, 1 }, @@ -39,7 +37,10 @@ struct dll_name_table_entry_s dll_builtin_table[N_BUILTINS] = { "WINSOCK", WINSOCK_table, 155, 9 }, { "STRESS", STRESS_table, 15, 10}, { "MMSYSTEM",MMSYSTEM_table,1023,11}, + { "SYSTEM", SYSTEM_table, 20 ,12}, + { "TOOLHELP",TOOLHELP_table, 83, 13}, }; +/* don't forget to increase N_BUILTINS in dll.h if you add a dll */ unsigned short *Stack16Frame; @@ -220,7 +221,7 @@ FindDLLTable(char *dll_name) int i; for (i = 0; i < N_BUILTINS; i++) - if (strcmp(dll_builtin_table[i].dll_name, dll_name) == 0) + if (strcasecmp(dll_builtin_table[i].dll_name, dll_name) == 0) return dll_builtin_table[i].dll_table; return NULL; diff --git a/if1632/user.spec b/if1632/user.spec index 1bb9eed9dc6..2b4c0eeded6 100644 --- a/if1632/user.spec +++ b/if1632/user.spec @@ -163,8 +163,8 @@ length 540 158 pascal SetMenu(word word) SetMenu(1 2) 159 pascal GetSubMenu(word word) GetSubMenu(1 2) 160 pascal DrawMenuBar(word) DrawMenuBar(1) -#161 GETMENUSTRING -#162 HILITEMENUITEM +161 pascal GetMenuString(word word ptr s_word word) GetMenuString(1 2 3 4 5) +162 pascal HiliteMenuItem(word word word word) HiliteMenuItem(1 2 3 4) 163 pascal CreateCaret(word word word word) CreateCaret(1 2 3 4) 164 pascal DestroyCaret() DestroyCaret() 165 pascal SetCaretPos(word word) SetCaretPos(1 2) @@ -272,8 +272,8 @@ length 540 #260 DEFERWINDOWPOS #261 ENDDEFERWINDOWPOS 262 pascal GetWindow(word word) GetWindow(1 2) -#263 GETMENUITEMCOUNT -#264 GETMENUITEMID +263 pascal GetMenuItemCount(word) GetMenuItemCount(1) +264 pascal GetMenuItemID(word word) GetMenuItemID(1 2) #265 SHOWOWNEDPOPUPS 266 pascal SetMessageQueue(word) SetMessageQueue(1) 267 pascal ShowScrollBar(word word word) ShowScrollBar(1 2 3) diff --git a/include/dlls.h b/include/dlls.h index 9c59b48608a..574db1e70d9 100644 --- a/include/dlls.h +++ b/include/dlls.h @@ -65,5 +65,9 @@ extern struct dll_table_entry_s SOUND_table[]; extern struct dll_table_entry_s KEYBOARD_table[]; extern struct dll_table_entry_s WINSOCK_table[]; extern struct dll_table_entry_s STRESS_table[]; +extern struct dll_table_entry_s SYSTEM_table[]; +extern struct dll_table_entry_s TOOLHELP_table[]; + +#define N_BUILTINS 13 #endif /* DLLS_H */ diff --git a/include/gdi.h b/include/gdi.h index 27b4d3d38db..1920d07a719 100644 --- a/include/gdi.h +++ b/include/gdi.h @@ -301,8 +301,6 @@ extern BOOL GDI_FreeObject( HANDLE ); extern GDIOBJHDR * GDI_GetObjPtr( HANDLE, WORD ); extern Display * XT_display; /* Will be removed */ -extern Screen * XT_screen; /* Will be removed */ - extern Display * display; extern Screen * screen; extern Window rootWindow; diff --git a/include/windows.h b/include/windows.h index 0b2756829fe..96a29fe6848 100644 --- a/include/windows.h +++ b/include/windows.h @@ -2975,7 +2975,7 @@ Fe(int,DlgDirListComboBox,HWND,a,LPSTR,b,int,c,int,d,WORD,e) Fe(int,Escape,HDC,a,int,b,int,c,LPSTR,d,LPSTR,e) Fe(int,ExcludeClipRect,HDC,a,short,b,short,c,short,d,short,e) Fe(int,ExcludeVisRect,HDC,a,short,b,short,c,short,d,short,e) -Fe(int,GetMenuString,HMENU,a,WORD,b,LPSTR,c,int,d,WORD,e) +Fe(int,GetMenuString,HMENU,a,WORD,b,LPSTR,c,short,d,WORD,e) Fe(int,GetProfileString,LPSTR,a,LPSTR,b,LPSTR,c,LPSTR,d,int,e) Fe(int,IntersectClipRect,HDC,a,short,b,short,c,short,d,short,e) Fe(int,IntersectVisRect,HDC,a,short,b,short,c,short,d,short,e) diff --git a/loader/library.c b/loader/library.c index 6cfbe080eee..c53f00383c8 100644 --- a/loader/library.c +++ b/loader/library.c @@ -35,9 +35,9 @@ typedef MODULEENTRY *LPMODULEENTRY; static LPMODULEENTRY lpModList = NULL; extern struct w_files * wine_files; -#define N_BUILTINS 11 -extern struct dll_name_table_entry_s dll_builtin_table[N_BUILTINS]; +extern struct dll_name_table_entry_s dll_builtin_table[]; +#define IS_BUILTIN_DLL(handle) ((handle >> 16) == 0xff) /********************************************************************** * GetModuleHandle [KERNEL.47] @@ -50,7 +50,7 @@ HANDLE GetModuleHandle(LPSTR lpModuleName) printf("GetModuleHandle // searching in loaded modules\n"); while (w) { /* printf("GetModuleHandle // '%s' \n", w->name); */ - if (strcmp(w->name, lpModuleName) == 0) { + if (strcasecmp(w->name, lpModuleName) == 0) { printf("GetModuleHandle('%s') return %04X \n", lpModuleName, w->hinstance); return w->hinstance; @@ -60,7 +60,7 @@ HANDLE GetModuleHandle(LPSTR lpModuleName) 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) { + if (strcasecmp(dll_builtin_table[i].dll_name, lpModuleName) == 0) { printf("GetModuleHandle('%s') return %04X \n", lpModuleName, 0xFF00 + i); return (0xFF00 + i); @@ -90,17 +90,30 @@ int GetModuleUsage(HANDLE hModule) int GetModuleFileName(HANDLE hModule, LPSTR lpFileName, short nSize) { struct w_files *w; - LPSTR str; + LPSTR str; + char windir[256], temp[256]; + 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; - str = w->filename; - if (str[0] == '/') str++; + if (nSize < 1) return 0; + + /* built-in dll ? */ + if (IS_BUILTIN_DLL(hModule)) { + GetWindowsDirectory(windir, sizeof(windir)); + sprintf(temp, "%s\\%s.DLL", windir, dll_builtin_table[hModule & 0x00ff].dll_name); + ToDos(temp); + strncpy(lpFileName, temp, nSize); + printf("GetModuleFileName copied '%s' (internal dll) return %d \n", lpFileName, nSize); + return strlen(lpFileName); + } + + /* check loaded dlls */ + if ((w = GetFileInfo(hModule)) == NULL) + return 0; + str = GetDosFileName(w->filename); 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; } @@ -114,14 +127,31 @@ HANDLE LoadLibrary(LPSTR libname) HANDLE hModule; LPMODULEENTRY lpMod = lpModList; LPMODULEENTRY lpNewMod; - - if (FindDLLTable(libname)) - { - printf("Library was a builtin - returning 0x23\n"); - return WINE_CODE_SELECTOR; - } + int i; + char temp[64]; printf("LoadLibrary '%s'\n", libname); + + /* extract dllname */ + strcpy(temp, libname); + if (strchr(temp, '\\') || strchr(temp, '/')) + for (i = strlen(temp) - 1; i ; i--) + if (temp[i] == '\\' || temp[i] == '/') { + strcpy(temp, temp + i + 1); + break; + } + for (i = strlen(temp) - 1; i ; i--) + if (temp[i] == '.') { + temp[i] = 0; + break; + } + + if (FindDLLTable(temp)) + { + printf("Library was a builtin - \n"); + return GetModuleHandle(temp); + } + if (lpMod != NULL) { while (TRUE) @@ -176,7 +206,13 @@ HANDLE LoadLibrary(LPSTR libname) void FreeLibrary(HANDLE hLib) { LPMODULEENTRY lpMod = lpModList; + printf("FreeLibrary(%04X);\n", hLib); + + /* built-in dll ? */ + if (IS_BUILTIN_DLL(hLib)) + return; + while (lpMod != NULL) { if (lpMod->hInst == hLib) { if (lpMod->Count == 1) { @@ -201,80 +237,106 @@ void FreeLibrary(HANDLE hLib) */ FARPROC GetProcAddress(HANDLE hModule, char *proc_name) { - WORD wOrdin; - int sel, addr, ret; + int i, sel, addr, ret; register struct w_files *w = wine_files; - int ordinal, len; - char * cpnt; - char C[128]; - HTASK hTask; - LPTASKENTRY lpTask; - if (hModule >= 0xF000) { - if ((int) proc_name & 0xffff0000) { - printf("GetProcAddress: builtin %#04X, '%s'\n", - hModule, proc_name); -/* wOrdin = FindOrdinalFromName(struct dll_table_entry_s *dll_table, proc_name); */ - } - else { - printf("GetProcAddress: builtin %#04X, %d\n", - hModule, (int)proc_name); - } - return NULL; - } - if (hModule == 0) { - hTask = GetCurrentTask(); - printf("GetProcAddress // GetCurrentTask()=%04X\n", hTask); - lpTask = (LPTASKENTRY) GlobalLock(hTask); - if (lpTask == NULL) { - printf("GetProcAddress: can't find current module handle !\n"); - return NULL; - } - hModule = lpTask->hInst; - printf("GetProcAddress: current module=%04X instance=%04X!\n", - lpTask->hModule, lpTask->hInst); - GlobalUnlock(hTask); - } - while (w && w->hinstance != hModule) w = w->next; - if (w == NULL) return NULL; - printf("GetProcAddress // Module Found ! w->filename='%s'\n", w->filename); - if ((int)proc_name & 0xFFFF0000) { - AnsiUpper(proc_name); - printf("GetProcAddress: %04X, '%s'\n", hModule, proc_name); - cpnt = w->nrname_table; - while(TRUE) { - if (((int) cpnt) - ((int)w->nrname_table) > - w->ne_header->nrname_tab_length) return NULL; - len = *cpnt++; - strncpy(C, cpnt, len); - C[len] = '\0'; + int ordinal, len; + char * cpnt; + char C[128]; + HTASK hTask; + LPTASKENTRY lpTask; + + /* built-in dll ? */ + if (IS_BUILTIN_DLL(hModule)) + { + if ((int) proc_name & 0xffff0000) + { + printf("GetProcAddress: builtin %#04X, '%s'\n", + hModule, proc_name); + if (GetEntryDLLName(dll_builtin_table[hModule - 0xFF00].dll_name, + proc_name, &sel, &addr)) + { + printf("Address not found !\n"); + } + } + else + { + printf("GetProcAddress: builtin %#04X, %d\n", + hModule, (int)proc_name); + if (GetEntryDLLOrdinal(dll_builtin_table[hModule-0xFF00].dll_name, + (int)proc_name & 0x0000FFFF, &sel, &addr)) + { + printf("Address not found !\n"); + } + } + ret = MAKELONG(addr, sel); + printf("GetProcAddress // ret=%08X sel=%04X addr=%04X\n", + ret, sel, addr); + return (FARPROC)ret; + } + if (hModule == 0) + { + hTask = GetCurrentTask(); + printf("GetProcAddress // GetCurrentTask()=%04X\n", hTask); + lpTask = (LPTASKENTRY) GlobalLock(hTask); + if (lpTask == NULL) + { + printf("GetProcAddress: can't find current module handle !\n"); + return NULL; + } + hModule = lpTask->hInst; + printf("GetProcAddress: current module=%04X instance=%04X!\n", + lpTask->hModule, lpTask->hInst); + GlobalUnlock(hTask); + } + while (w && w->hinstance != hModule) + w = w->next; + if (w == NULL) + return NULL; + printf("GetProcAddress // Module Found ! w->filename='%s'\n", w->filename); + if ((int)proc_name & 0xFFFF0000) + { + AnsiUpper(proc_name); + printf("GetProcAddress: %04X, '%s'\n", hModule, proc_name); + cpnt = w->nrname_table; + while(TRUE) + { + if (((int) cpnt) - ((int)w->nrname_table) > + w->ne_header->nrname_tab_length) return NULL; + len = *cpnt++; + strncpy(C, cpnt, len); + C[len] = '\0'; #ifdef DEBUG_MODULE - printf("pointing Function '%s' ordinal=%d !\n", - C, *((unsigned short *)(cpnt + len))); + 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)); - break; - } - cpnt += len + 2; - }; - if (ordinal == 0) { - printf("GetProcAddress // function '%s' not found !\n", proc_name); - return NULL; - } - } - else { - printf("GetProcAddress: %#04x, %d\n", hModule, (int) proc_name); - ordinal = (int)proc_name; - } - ret = GetEntryPointFromOrdinal(w, ordinal); - if (ret == -1) { - printf("GetProcAddress // Function #%d not found !\n", ordinal); - return NULL; - } - addr = ret & 0xffff; - sel = (ret >> 16); - printf("GetProcAddress // ret=%08X sel=%04X addr=%04X\n", ret, sel, addr); - return (FARPROC) ret; + if (strncmp(cpnt, proc_name, len) == 0) + { + ordinal = *((unsigned short *)(cpnt + len)); + break; + } + cpnt += len + 2; + }; + if (ordinal == 0) + { + printf("GetProcAddress // function '%s' not found !\n", proc_name); + return NULL; + } + } + else + { + printf("GetProcAddress: %#04x, %d\n", hModule, (int) proc_name); + ordinal = (int)proc_name; + } + ret = GetEntryPointFromOrdinal(w, ordinal); + if (ret == -1) + { + printf("GetProcAddress // Function #%d not found !\n", ordinal); + return NULL; + } + addr = ret & 0xffff; + sel = (ret >> 16); + printf("GetProcAddress // ret=%08X sel=%04X addr=%04X\n", ret, sel, addr); + return (FARPROC) ret; } #endif /* ifndef WINELIB */ diff --git a/loader/resource.c b/loader/resource.c index a5fb3c8544e..a4f9c1fe8cb 100644 --- a/loader/resource.c +++ b/loader/resource.c @@ -248,6 +248,43 @@ load_typeinfo (int fd, struct resource_typeinfo_s *typeinfo) return read (fd, typeinfo, sizeof (*typeinfo)) == sizeof (*typeinfo); } #endif + +int +type_match(int type_id1, int type_id2, int fd, off_t off) +{ + off_t old_pos; + unsigned char c; + size_t nbytes; + char name[256]; + + if (type_id1 == -1) + return 1; + if ((type_id1 & 0xffff0000) == 0) { + if ((type_id2 & 0x8000) == 0) + return 0; + return (type_id1 & 0x000f) == (type_id2 & 0x000f); + } + if ((type_id2 & 0x8000) != 0) + return 0; +#ifdef DEBUG_RESOURCE + printf("type_compare: type_id2=%04X !\n", type_id2); +#endif + old_pos = lseek(fd, 0, SEEK_CUR); + lseek(fd, off + type_id2, SEEK_SET); + read(fd, &c, 1); + nbytes = CONV_CHAR_TO_LONG (c); +#ifdef DEBUG_RESOURCE + printf("type_compare: namesize=%d\n", nbytes); +#endif + read(fd, name, nbytes); + lseek(fd, old_pos, SEEK_SET); + name[nbytes] = '\0'; +#ifdef DEBUG_RESOURCE + printf("type_compare: name=`%s'\n", name); +#endif + return strcasecmp((char *) type_id1, name) == 0; +} + /********************************************************************** * FindResourceByNumber */ @@ -281,8 +318,7 @@ FindResourceByNumber(struct resource_nameinfo_s *result_p, /* * Find resource. */ - typeinfo.type_id = 0xffff; - while (typeinfo.type_id != 0) { + for (;;) { if (!load_typeinfo (ResourceFd, &typeinfo)){ printf("FindResourceByNumber (%X) bad typeinfo size !\n", resource_id); return -1; @@ -292,7 +328,8 @@ FindResourceByNumber(struct resource_nameinfo_s *result_p, typeinfo.type_id, typeinfo.count, type_id); #endif if (typeinfo.type_id == 0) break; - if (typeinfo.type_id == type_id || type_id == -1) { + if (type_match(type_id, typeinfo.type_id, ResourceFd, rtoff)) { + for (i = 0; i < typeinfo.count; i++) { #ifndef WINELIB if (read(ResourceFd, &nameinfo, sizeof(nameinfo)) != @@ -306,7 +343,7 @@ FindResourceByNumber(struct resource_nameinfo_s *result_p, } #ifdef DEBUG_RESOURCE printf("FindResource: search type=%X id=%X // type=%X id=%X\n", - type_id, resource_id, typeinfo.type_id, nameinfo.id); + type_id, resource_id, typeinfo.type_id, type_id2); #endif if (nameinfo.id == resource_id) { memcpy(result_p, &nameinfo, sizeof(nameinfo)); @@ -377,8 +414,7 @@ FindResourceByName(struct resource_nameinfo_s *result_p, /* * Find resource. */ - typeinfo.type_id = 0xffff; - while (typeinfo.type_id != 0) + for (;;) { if (!load_typeinfo (ResourceFd, &typeinfo)) { @@ -390,7 +426,7 @@ FindResourceByName(struct resource_nameinfo_s *result_p, typeinfo.type_id, typeinfo.count, type_id); #endif if (typeinfo.type_id == 0) break; - if (typeinfo.type_id == type_id || type_id == -1) + if (type_match(type_id, typeinfo.type_id, ResourceFd, rtoff)) { for (i = 0; i < typeinfo.count; i++) { @@ -529,6 +565,16 @@ HICON LoadIcon(HANDLE instance, LPSTR icon_name) rgbq[1].rgbGreen = 0x00; rgbq[1].rgbRed = 0x00; rgbq[1].rgbReserved = 0x00; + if (bih->biSizeImage == 0) { + if (bih->biCompression != BI_RGB) { + printf("Unknown size for compressed Icon bitmap.\n"); + GlobalFree(rsc_mem); + ReleaseDC(GetDesktopWindow(), hdc); + return 0; + } + bih->biSizeImage = (bih->biWidth * bih->biHeight * bih->biBitCount + + 7) / 8; + } lpico->hBitMask = CreateDIBitmap(hdc, bih, CBM_INIT, (LPSTR)lp + bih->biSizeImage - sizeof(BITMAPINFOHEADER) / 2 - 4, (BITMAPINFO *)bih, DIB_RGB_COLORS ); @@ -667,6 +713,7 @@ HANDLE FindResource(HANDLE instance, LPSTR resource_name, LPSTR type_name) { RESOURCE *r; HANDLE rh; + int type; if (instance == 0) return 0; @@ -688,15 +735,39 @@ HANDLE FindResource(HANDLE instance, LPSTR resource_name, LPSTR type_name) r->info_mem = rh; r->rsc_mem = 0; - if (((int) resource_name & 0xffff0000) == 0) + if (((int) type_name & 0xffff0000) == 0) { - r->size_shift = FindResourceByNumber(&r->nameinfo, (int)type_name, - (int) resource_name | 0x8000); + type = (int) type_name; + } + else if (type_name[0] == '\0') + { + type = -1; + } + else if (type_name[0] == '#') + { + type = atoi(type_name + 1); } else { - r->size_shift = FindResourceByName(&r->nameinfo, (int)type_name, - resource_name); + type = (int) type_name; + } + if (((int) resource_name & 0xffff0000) == 0) + { + r->size_shift = FindResourceByNumber(&r->nameinfo, type, + (int) resource_name | 0x8000); + } + else if (resource_name[0] == '\0') + { + r->size_shift = FindResourceByNumber(&r->nameinfo, type, -1); + } + else if (resource_name[0] == '#') + { + r->size_shift = FindResourceByNumber(&r->nameinfo, type, + atoi(resource_name + 1)); + } + else + { + r->size_shift = FindResourceByName(&r->nameinfo, type, resource_name); } if (r->size_shift == -1) @@ -906,7 +977,7 @@ LoadString(HANDLE instance, WORD resource_id, LPSTR buffer, int buflen) GlobalFree(hmem); #ifdef DEBUG_RESOURCE - printf(" '%s'\n", buffer); + printf("LoadString // '%s' copied !\n", buffer); #endif return i; } diff --git a/loader/selector.c b/loader/selector.c index 834e25229a2..fea7a6f881c 100644 --- a/loader/selector.c +++ b/loader/selector.c @@ -417,7 +417,7 @@ WORD FreeSelector(WORD sel) if (s->shm_key == 0) { munmap(s->base_addr, ((s->length + PAGE_SIZE) & ~(PAGE_SIZE - 1))); - memcpy(s, 0, sizeof(*s)); + memset(s, 0, sizeof(*s)); SelectorMap[sel_idx] = 0; } else @@ -432,7 +432,7 @@ WORD FreeSelector(WORD sel) if (alias_count == 1) shmctl(s->shm_key, IPC_RMID, NULL); - memcpy(s, 0, sizeof(*s)); + memset(s, 0, sizeof(*s)); SelectorMap[sel_idx] = 0; } @@ -457,7 +457,7 @@ WORD FreeSelector(WORD sel) { s = &Segments[sel_idx]; munmap(s->base_addr, ((s->length + PAGE_SIZE) & ~(PAGE_SIZE - 1))); - memcpy(s, 0, sizeof(*s)); + memset(s, 0, sizeof(*s)); SelectorMap[sel >> 3] = 0; } #endif /* HAVE_IPC */ @@ -847,15 +847,10 @@ CreateSelectors(struct w_files * wpnt) * First we need to check for local heap. Second we nee to see if * this is also the stack segment. */ - if (i + 1 == ne_header->auto_data_seg) + if (i + 1 == ne_header->auto_data_seg || i + 1 == ne_header->ss) { - s->length += ne_header->local_heap_length; - - if (i + 1 == ne_header->ss) - { - s->length += ne_header->stack_length; - ne_header->sp = s->length; - } + s->length = 0x10000; + ne_header->sp = s->length - 2; } /* diff --git a/loader/signal.c b/loader/signal.c index 92aecd5eaca..7de706437ed 100644 --- a/loader/signal.c +++ b/loader/signal.c @@ -131,6 +131,11 @@ static void win_fault(int signal, int code, struct sigcontext *scp) if (!do_int26(scp)) goto oops; break; + + case 0x2f: + if (!do_int2f(scp)) + goto oops; + break; default: fprintf(stderr,"Unexpected Windows interrupt %x\n", *instr); diff --git a/memory/global.c b/memory/global.c index c257027ac5b..0a21566a638 100644 --- a/memory/global.c +++ b/memory/global.c @@ -790,5 +790,6 @@ DWORD GetFreeSpace(UINT wFlags) if (free_map[i] == 1) total_free++; + printf("GetFreeSpace // return %ld !\n", total_free << 16); return total_free << 16; } diff --git a/misc/cursor.c b/misc/cursor.c index 49ce26c0d91..15bc1454bd7 100644 --- a/misc/cursor.c +++ b/misc/cursor.c @@ -171,7 +171,7 @@ HCURSOR LoadCursor(HANDLE instance, LPSTR cursor_name) ReleaseDC(GetDesktopWindow(), hdc); return 0; } - (char *)lp += 2; + lp++; for (j = 0; j < 16; j++) printf("%04X ", *(lp + j)); /* diff --git a/misc/dos_fs.c b/misc/dos_fs.c index 6d342224a84..77b24290613 100644 --- a/misc/dos_fs.c +++ b/misc/dos_fs.c @@ -273,7 +273,7 @@ void ToDos(char *s) *s++ = toupper(*p); else { *s++ = '\\'; - if (*s == '/' || *s == '\\') + if (*(p+1) == '/' || *(p+1) == '\\') p++; } } @@ -390,6 +390,26 @@ char *GetUnixFileName(char *dosfilename) return(temp); } +char *GetDosFileName(char *unixfilename) +{ + int i; + char temp[256]; + /* /dos/windows/system.ini => c:\windows\system.ini */ + + for (i = 0 ; i != MAX_DOS_DRIVES; i++) { + if (DosDrives[i].rootdir != NULL) { + if (strncmp(DosDrives[i].rootdir, unixfilename, strlen(DosDrives[i].rootdir)) == 0) { + sprintf(temp, "%c:\\%s", 'A' + i, unixfilename + strlen(DosDrives[i].rootdir) + 1); + ToDos(temp); + return temp; + } + } + } + strcpy(temp, unixfilename); + ToDos(temp); + return(temp); +} + char *DOS_GetCurrentDir(int drive) { /* should return 'WINDOWS\SYSTEM' */ @@ -734,11 +754,7 @@ struct dosdirent *DOS_readdir(struct dosdirent *de) do { if ((d = readdir(de->ds)) == NULL) - { - closedir(de->ds); - de->inuse = 0; - return de; - } + return NULL; strcpy(de->filename, d->d_name); if (d->d_reclen > 12) @@ -765,7 +781,7 @@ struct dosdirent *DOS_readdir(struct dosdirent *de) void DOS_closedir(struct dosdirent *de) { - if (de->inuse) + if (de && de->inuse) { closedir(de->ds); de->inuse = 0; diff --git a/misc/lstr.c b/misc/lstr.c index eeaf7c2d7cc..361ea10b699 100644 --- a/misc/lstr.c +++ b/misc/lstr.c @@ -58,19 +58,25 @@ INT lstrlen(LPCSTR str) return strlen(str); } + /* AnsiUpper USER.431 */ char FAR* AnsiUpper(char FAR* strOrChar) { /* I am not sure if the locale stuff works with toupper, but then again I am not sure if the Linux libc locale stuffs works at all */ - if((int)strOrChar<256) +/* if((int)strOrChar<256) return (char FAR*) toupper((int)strOrChar); - else { + else { int i; - for(i=0;(i<65536)&&strOrChar[i];i++) - strOrChar[i]=toupper(strOrChar[i]); + for(i=0;(i<65536) && strOrChar[i];i++) + strOrChar[i]=toupper(strOrChar[i]); return strOrChar; - } + } */ + int i; + for (i = 0; (i < 65536 && strOrChar[i]);i++) + strOrChar[i] = (strOrChar[i] >= 'a' && strOrChar[i] <= 'z') ? + strOrChar[i] - ('a' - 'A') : strOrChar[i]; + return strOrChar; } /* AnsiLower USER.432 */ @@ -78,14 +84,18 @@ char FAR* AnsiLower(char FAR* strOrChar) { /* I am not sure if the locale stuff works with tolower, but then again I am not sure if the Linux libc locale stuffs works at all */ - if((int)strOrChar<256) +/* if((int)strOrChar<256) return (char FAR*)tolower((int)strOrChar); else { int i; for(i=0;(i<65536)&&strOrChar[i];i++) strOrChar[i]=tolower(strOrChar[i]); return strOrChar; - } + }*/ + int i; + for (i = 0; (i < 65536 && strOrChar[i]);i++) + strOrChar[i] = (strOrChar[i] >= 'A' && strOrChar[i] <= 'Z') ? + strOrChar[i] + ('a' - 'A') : strOrChar[i]; } /* AnsiUpperBuff USER.437 */ diff --git a/misc/main.c b/misc/main.c index d5784f3f254..245b5c92d20 100644 --- a/misc/main.c +++ b/misc/main.c @@ -20,8 +20,9 @@ static char Copyright[] = "Copyright Alexandre Julliard, 1994"; #define WINE_CLASS "Wine" /* Class name for resources */ +LPSTR lpEnvList; + Display * XT_display; /* To be removed */ -Screen * XT_screen; /* To be removed */ Display *display; Screen *screen; @@ -298,7 +299,6 @@ int main( int argc, char *argv[] ) screenWidth = WidthOfScreen( screen ); screenHeight = HeightOfScreen( screen ); XT_display = display; - XT_screen = screen; if (screenDepth) /* -depth option specified */ { depth_list = XListDepths(display,DefaultScreen(display),&depth_count); @@ -359,6 +359,26 @@ LONG GetWinFlags(void) return (WF_STANDARD | WF_CPU286 | WF_PMODE | WF_80x87); } +/*********************************************************************** + * SetEnvironment (GDI.132) + */ +int SetEnvironment(LPSTR lpPortName, LPSTR lpEnviron, WORD nCount) +{ + printf("EMPTY STUB ! // SetEnvironnement('%s', '%s', %d) !\n", + lpPortName, lpEnviron, nCount); + return 0; +} + +/*********************************************************************** + * GetEnvironment (GDI.134) + */ +int GetEnvironment(LPSTR lpPortName, LPSTR lpEnviron, WORD nMaxSiz) +{ + printf("EMPTY STUB ! // GetEnvironnement('%s', '%s', %d) !\n", + lpPortName, lpEnviron, nMaxSiz); + return 0; +} + /*********************************************************************** * GetTimerResolution (USER.14) */ diff --git a/misc/message.c b/misc/message.c index 23e1be66f93..0a8da32818f 100644 --- a/misc/message.c +++ b/misc/message.c @@ -58,13 +58,15 @@ int MessageBox(HWND hWnd, LPSTR str, LPSTR title, WORD type) if (wndPtr == NULL) { hInst = hSysRes; #ifdef DEBUG_MSGBOX - printf("MessageBox(NULL, '%s', '%s', %04X)\n", str, title, type); + printf("MessageBox(NULL, %08X='%s', %08X='%s', %04X)\n", + str, str, title, title, type); #endif } else { hInst = wndPtr->hInstance; #ifdef DEBUG_MSGBOX - printf("MessageBox(%04X, '%s', '%s', %04X)\n", hWnd, str, title, type); + printf("MessageBox(%04X, %08X='%s', %08X='%s', %04X)\n", + hWnd, str, str, title, title, type); #endif } lpmb = (LPMSGBOX) malloc(sizeof(MSGBOX)); @@ -379,7 +381,7 @@ BOOL FAR PASCAL AboutWine_Proc(HWND hDlg, WORD msg, WORD wParam, LONG lParam) strcpy(str, "WINELOGO"); hBitMap = LoadBitmap((HINSTANCE)NULL, (LPSTR)str); - strcpy(str, "PROPOSED_LICENSE"); + strcpy(str, "LICENSE"); printf("str = '%s'\n", str); hFile = OpenFile((LPSTR)str, &ofstruct, OF_READ); ptr = (LPSTR)malloc(2048); diff --git a/misc/mmsystem.c b/misc/mmsystem.c index 9332079d78a..e4c6a2e629f 100644 --- a/misc/mmsystem.c +++ b/misc/mmsystem.c @@ -13,6 +13,10 @@ static char Copyright[] = "Copyright Martin Ayotte, 1993"; static WORD mciActiveDev = 0; +UINT WINAPI midiGetErrorText(UINT uError, LPSTR lpText, UINT uSize); +UINT WINAPI waveGetErrorText(UINT uError, LPSTR lpText, UINT uSize); + + int MCI_LibMain(HANDLE hInstance, WORD wDataSeg, WORD cbHeapSize, LPSTR lpCmdLine) { @@ -87,6 +91,7 @@ BOOL mciGetErrorString (DWORD wError, LPSTR lpstrBuffer, UINT uLength) { LPSTR msgptr; int maxbuf; + printf("mciGetErrorString(%04X, %08X, %d);\n", wError, lpstrBuffer, uLength); if ((lpstrBuffer == NULL) || (uLength < 1)) return(FALSE); lpstrBuffer[0] = '\0'; switch(wError) { @@ -358,6 +363,7 @@ DWORD mciWaveOpen(UINT wDevID, DWORD dwParam, LPMCI_WAVE_OPEN_PARMS lpParms) */ DWORD mciOpen(UINT wDevID, DWORD dwParam, LPMCI_OPEN_PARMS lpParms) { + char str[128]; DWORD dwDevTyp = 0; if (lpParms == NULL) return MCIERR_INTERNAL; printf("mciOpen(%04X, %08X, %08X)\n", wDevID, dwParam, lpParms); @@ -368,19 +374,22 @@ DWORD mciOpen(UINT wDevID, DWORD dwParam, LPMCI_OPEN_PARMS lpParms) dwDevTyp = (DWORD)lpParms->lpstrDeviceType; } else { - if (strcmp(lpParms->lpstrDeviceType, "cdaudio") == 0) { + printf("MCI_OPEN // Dev='%s' !\n", lpParms->lpstrDeviceType); + strcpy(str, lpParms->lpstrDeviceType); + AnsiUpper(str); + if (strcmp(str, "CDAUDIO") == 0) { dwDevTyp = MCI_DEVTYPE_CD_AUDIO; } else - if (strcmp(lpParms->lpstrDeviceType, "waveaudio") == 0) { + if (strcmp(str, "WAVEAUDIO") == 0) { dwDevTyp = MCI_DEVTYPE_WAVEFORM_AUDIO; } else - if (strcmp(lpParms->lpstrDeviceType, "Sequencer") == 0) { + if (strcmp(str, "SEQUENCER") == 0) { dwDevTyp = MCI_DEVTYPE_SEQUENCER; } else - if (strcmp(lpParms->lpstrDeviceType, "Animation1") == 0) { + if (strcmp(str, "ANIMATION1") == 0) { dwDevTyp = MCI_DEVTYPE_ANIMATION; } } @@ -393,7 +402,8 @@ DWORD mciOpen(UINT wDevID, DWORD dwParam, LPMCI_OPEN_PARMS lpParms) return MCIERR_DEVICE_NOT_INSTALLED; case MCI_DEVTYPE_SEQUENCER: printf("MCI_OPEN // No SEQUENCER yet !\n"); - return MCIERR_DEVICE_NOT_INSTALLED; + break; +/* return MCIERR_DEVICE_NOT_INSTALLED; */ case MCI_DEVTYPE_ANIMATION: printf("MCI_OPEN // No ANIMATION yet !\n"); return MCIERR_DEVICE_NOT_INSTALLED; @@ -556,45 +566,6 @@ DWORD WINAPI mciSendString (LPCSTR lpstrCommand, -HMMIO WINAPI mmioOpen(LPSTR szFileName, MMIOINFO FAR* lpmmioinfo, DWORD dwOpenFlags) -{ - printf("mmioOpen('%s', %08X, %08X);\n", szFileName, lpmmioinfo, dwOpenFlags); - return 0; -} - - - -UINT WINAPI mmioClose(HMMIO hmmio, UINT uFlags) -{ - printf("mmioClose(%04X, %04X);\n", hmmio, uFlags); - return 0; -} - - - -LONG WINAPI mmioRead(HMMIO hmmio, HPSTR pch, LONG cch) -{ - printf("mmioRead\n"); - return 0; -} - - - -LONG WINAPI mmioWrite(HMMIO hmmio, HPCSTR pch, LONG cch) -{ - printf("mmioWrite\n"); - return 0; -} - - -LONG WINAPI mmioSeek(HMMIO hmmio, LONG lOffset, int iOrigin) -{ - printf("mmioSeek\n"); - return 0; -} - - - UINT WINAPI midiOutGetNumDevs(void) { printf("midiOutGetNumDevs\n"); @@ -625,6 +596,9 @@ UINT WINAPI midiOutSetVolume(UINT uDeviceID, DWORD dwVolume) } +/************************************************************************** +* midiOutGetErrorText [MMSYSTEM.203] +*/ UINT WINAPI midiOutGetErrorText(UINT uError, LPSTR lpText, UINT uSize) { printf("midiOutGetErrorText\n"); @@ -632,6 +606,9 @@ UINT WINAPI midiOutGetErrorText(UINT uError, LPSTR lpText, UINT uSize) } +/************************************************************************** +* midiGetErrorText [internal] +*/ UINT WINAPI midiGetErrorText(UINT uError, LPSTR lpText, UINT uSize) { LPSTR msgptr; @@ -781,6 +758,9 @@ UINT WINAPI midiInGetDevCaps(UINT uDeviceID, +/************************************************************************** +* midiInGetErrorText [MMSYSTEM.303] +*/ UINT WINAPI midiInGetErrorText(UINT uError, LPSTR lpText, UINT uSize) { printf("midiInGetErrorText\n"); @@ -851,35 +831,38 @@ UINT WINAPI midiInStart(HMIDIIN hMidiIn) UINT WINAPI midiInStop(HMIDIIN hMidiIn) { -printf("midiInStop\n"); -return 0; + printf("midiInStop\n"); + return 0; } UINT WINAPI midiInReset(HMIDIIN hMidiIn) { -printf("midiInReset\n"); -return 0; + printf("midiInReset\n"); + return 0; } UINT WINAPI waveOutGetNumDevs() { -printf("waveOutGetNumDevs\n"); -return 0; + printf("waveOutGetNumDevs\n"); + return 0; } UINT WINAPI waveOutGetDevCaps(UINT uDeviceID, WAVEOUTCAPS FAR* lpCaps, UINT uSize) { -printf("waveOutGetDevCaps\n"); -return 0; + printf("waveOutGetDevCaps\n"); + return MMSYSERR_INVALHANDLE; } +/************************************************************************** +* waveOutGetErrorText [MMSYSTEM.403] +*/ UINT WINAPI waveOutGetErrorText(UINT uError, LPSTR lpText, UINT uSize) { printf("waveOutGetErrorText\n"); @@ -887,6 +870,9 @@ UINT WINAPI waveOutGetErrorText(UINT uError, LPSTR lpText, UINT uSize) } +/************************************************************************** +* waveGetErrorText [internal] +*/ UINT WINAPI waveGetErrorText(UINT uError, LPSTR lpText, UINT uSize) { LPSTR msgptr; @@ -957,17 +943,17 @@ UINT WINAPI waveGetErrorText(UINT uError, LPSTR lpText, UINT uSize) UINT WINAPI waveOutOpen(HWAVEOUT FAR* lphWaveOut, UINT uDeviceID, const WAVEFORMAT FAR* lpFormat, DWORD dwCallback, DWORD dwInstance, DWORD dwFlags) { -printf("waveOutOpen\n"); -if (lphWaveOut != NULL) *lphWaveOut = 0; -return 0; + printf("waveOutOpen\n"); + if (lphWaveOut != NULL) *lphWaveOut = 0; + return MMSYSERR_BADDEVICEID; } UINT WINAPI waveOutClose(HWAVEOUT hWaveOut) { -printf("waveOutClose\n"); -return 0; + printf("waveOutClose\n"); + return MMSYSERR_INVALHANDLE; } @@ -975,8 +961,8 @@ return 0; UINT WINAPI waveOutPrepareHeader(HWAVEOUT hWaveOut, WAVEHDR FAR* lpWaveOutHdr, UINT uSize) { -printf("waveOutPrepareHeader\n"); -return 0; + printf("waveOutPrepareHeader\n"); + return MMSYSERR_INVALHANDLE; } @@ -984,99 +970,99 @@ return 0; UINT WINAPI waveOutUnprepareHeader(HWAVEOUT hWaveOut, WAVEHDR FAR* lpWaveOutHdr, UINT uSize) { -printf("waveOutUnprepareHeader\n"); -return 0; + printf("waveOutUnprepareHeader\n"); + return MMSYSERR_INVALHANDLE; } UINT WINAPI waveOutWrite(HWAVEOUT hWaveOut, WAVEHDR FAR* lpWaveOutHdr, UINT uSize) { -printf("waveOutWrite\n"); -return 0; + printf("waveOutWrite\n"); + return MMSYSERR_INVALHANDLE; } UINT WINAPI waveOutPause(HWAVEOUT hWaveOut) { -printf("waveOutPause\n"); -return 0; + printf("waveOutPause\n"); + return MMSYSERR_INVALHANDLE; } UINT WINAPI waveOutRestart(HWAVEOUT hWaveOut) { -printf("waveOutRestart\n"); -return 0; + printf("waveOutRestart\n"); + return MMSYSERR_INVALHANDLE; } UINT WINAPI waveOutReset(HWAVEOUT hWaveOut) { -printf("waveOutReset\n"); -return 0; + printf("waveOutReset\n"); + return MMSYSERR_INVALHANDLE; } UINT WINAPI waveOutGetPosition(HWAVEOUT hWaveOut, MMTIME FAR* lpInfo, UINT uSize) { -printf("waveOutGetPosition\n"); -return 0; + printf("waveOutGetPosition\n"); + return MMSYSERR_INVALHANDLE; } UINT WINAPI waveOutGetVolume(UINT uDeviceID, DWORD FAR* lpdwVolume) { -printf("waveOutGetVolume\n"); -return 0; + printf("waveOutGetVolume\n"); + return MMSYSERR_INVALHANDLE; } UINT WINAPI waveOutSetVolume(UINT uDeviceID, DWORD dwVolume) { -printf("waveOutSetVolume\n"); -return 0; + printf("waveOutSetVolume\n"); + return MMSYSERR_INVALHANDLE; } UINT WINAPI waveOutGetID(HWAVEOUT hWaveOut, UINT FAR* lpuDeviceID) { -printf("waveOutGetID\n"); -return 0; + printf("waveOutGetID\n"); + return MMSYSERR_INVALHANDLE; } UINT WINAPI waveOutGetPitch(HWAVEOUT hWaveOut, DWORD FAR* lpdwPitch) { -printf("waveOutGetPitch\n"); -return 0; + printf("waveOutGetPitch\n"); + return MMSYSERR_INVALHANDLE; } UINT WINAPI waveOutSetPitch(HWAVEOUT hWaveOut, DWORD dwPitch) { -printf("waveOutSetPitch\n"); -return 0; + printf("waveOutSetPitch\n"); + return MMSYSERR_INVALHANDLE; } UINT WINAPI waveOutGetPlaybackRate(HWAVEOUT hWaveOut, DWORD FAR* lpdwRate) { -printf("waveOutGetPlaybackRate\n"); -return 0; + printf("waveOutGetPlaybackRate\n"); + return MMSYSERR_INVALHANDLE; } UINT WINAPI waveOutSetPlaybackRate(HWAVEOUT hWaveOut, DWORD dwRate) { -printf("waveOutSetPlaybackRate\n"); -return 0; + printf("waveOutSetPlaybackRate\n"); + return MMSYSERR_INVALHANDLE; } @@ -1084,26 +1070,29 @@ return 0; UINT WINAPI waveOutBreakLoop(HWAVEOUT hWaveOut) { -printf("waveOutBreakLoop\n"); -return 0; + printf("waveOutBreakLoop\n"); + return MMSYSERR_INVALHANDLE; } UINT WINAPI waveInGetNumDevs() { -printf("waveInGetNumDevs\n"); -return 0; +/* printf("waveInGetNumDevs\n"); */ + return 0; } UINT WINAPI waveInGetDevCaps(UINT uDeviceID, WAVEINCAPS FAR* lpCaps, UINT uSize) { -printf("waveInGetDevCaps\n"); -return 0; + printf("waveInGetDevCaps\n"); + return MMSYSERR_INVALHANDLE; } +/************************************************************************** +* waveInGetErrorText [MMSYSTEM.503] +*/ UINT WINAPI waveInGetErrorText(UINT uError, LPSTR lpText, UINT uSize) { printf("waveInGetErrorText\n"); @@ -1111,83 +1100,191 @@ UINT WINAPI waveInGetErrorText(UINT uError, LPSTR lpText, UINT uSize) } +/************************************************************************** +* waveInOpen [MMSYSTEM.504] +*/ UINT WINAPI waveInOpen(HWAVEIN FAR* lphWaveIn, UINT uDeviceID, const WAVEFORMAT FAR* lpFormat, DWORD dwCallback, DWORD dwInstance, DWORD dwFlags) { -printf("waveInOpen\n"); -if (lphWaveIn != NULL) *lphWaveIn = 0; -return 0; + printf("waveInOpen\n"); + if (lphWaveIn != NULL) *lphWaveIn = 0; + return MMSYSERR_BADDEVICEID; } +/************************************************************************** +* waveInClose [MMSYSTEM.505] +*/ UINT WINAPI waveInClose(HWAVEIN hWaveIn) { -printf("waveInClose\n"); -return 0; + printf("waveInClose\n"); + return MMSYSERR_INVALHANDLE; } +/************************************************************************** +* waveInPrepareHeader [MMSYSTEM.506] +*/ UINT WINAPI waveInPrepareHeader(HWAVEIN hWaveIn, WAVEHDR FAR* lpWaveInHdr, UINT uSize) { -printf("waveInPrepareHeader\n"); -return 0; + printf("waveInPrepareHeader\n"); + return MMSYSERR_INVALHANDLE; } +/************************************************************************** +* waveInUnprepareHeader [MMSYSTEM.507] +*/ UINT WINAPI waveInUnprepareHeader(HWAVEIN hWaveIn, WAVEHDR FAR* lpWaveInHdr, UINT uSize) { -printf("waveInUnprepareHeader\n"); -return 0; + printf("waveInUnprepareHeader\n"); + return MMSYSERR_INVALHANDLE; } +/************************************************************************** +* waveInAddBuffer [MMSYSTEM.508] +*/ UINT WINAPI waveInAddBuffer(HWAVEIN hWaveIn, WAVEHDR FAR* lpWaveInHdr, UINT uSize) { -printf("waveInAddBuffer\n"); -return 0; -} - -UINT WINAPI waveInReset(HWAVEIN hWaveIn) -{ -printf("waveInReset\n"); -return 0; + printf("waveInAddBuffer\n"); + return 0; } +/************************************************************************** +* waveInStart [MMSYSTEM.509] +*/ UINT WINAPI waveInStart(HWAVEIN hWaveIn) { -printf("waveInStart\n"); -return 0; + printf("waveInStart\n"); + return MMSYSERR_INVALHANDLE; } +/************************************************************************** +* waveInStop [MMSYSTEM.510] +*/ UINT WINAPI waveInStop(HWAVEIN hWaveIn) { -printf("waveInStop\n"); -return 0; + printf("waveInStop\n"); + return MMSYSERR_INVALHANDLE; } +/************************************************************************** +* waveInReset [MMSYSTEM.511] +*/ +UINT WINAPI waveInReset(HWAVEIN hWaveIn) +{ + printf("waveInReset\n"); + return MMSYSERR_INVALHANDLE; +} + +/************************************************************************** +* waveInGetPosition [MMSYSTEM.512] +*/ UINT WINAPI waveInGetPosition(HWAVEIN hWaveIn, MMTIME FAR* lpInfo, UINT uSize) { -printf("waveInGetPosition\n"); -return 0; + printf("waveInGetPosition\n"); + return MMSYSERR_INVALHANDLE; } +/************************************************************************** +* waveInGetID [MMSYSTEM.513] +*/ UINT WINAPI waveInGetID(HWAVEIN hWaveIn, UINT FAR* lpuDeviceID) { -printf("waveInGetID\n"); -return 0; + printf("waveInGetID\n"); + return 0; +} + + +/************************************************************************** +* mmioOpen [MMSYSTEM.1210] +*/ +HMMIO WINAPI mmioOpen(LPSTR szFileName, MMIOINFO FAR* lpmmioinfo, DWORD dwOpenFlags) +{ + printf("mmioOpen('%s', %08X, %08X);\n", szFileName, lpmmioinfo, dwOpenFlags); + return 0; +} + + + +/************************************************************************** +* mmioClose [MMSYSTEM.1211] +*/ +UINT WINAPI mmioClose(HMMIO hmmio, UINT uFlags) +{ + printf("mmioClose(%04X, %04X);\n", hmmio, uFlags); + return 0; +} + + + +/************************************************************************** +* mmioRead [MMSYSTEM.1212] +*/ +LONG WINAPI mmioRead(HMMIO hmmio, HPSTR pch, LONG cch) +{ + printf("mmioRead\n"); + return 0; +} + + + +/************************************************************************** +* mmioWrite [MMSYSTEM.1213] +*/ +LONG WINAPI mmioWrite(HMMIO hmmio, HPCSTR pch, LONG cch) +{ + printf("mmioWrite\n"); + return 0; +} + + +/************************************************************************** +* mmioSeek [MMSYSTEM.1214] +*/ +LONG WINAPI mmioSeek(HMMIO hmmio, LONG lOffset, int iOrigin) +{ + printf("mmioSeek\n"); + return 0; +} + + +/************************************************************************** +* mmioGetInfo [MMSYSTEM.1215] +*/ +UINT WINAPI mmioGetInfo(HMMIO hmmio, MMIOINFO FAR* lpmmioinfo, UINT uFlags) +{ + printf("mmioGetInfo\n"); + return 0; +} + + +/************************************************************************** +* mmioGetInfo [MMSYSTEM.1216] +*/ +UINT WINAPI mmioSetInfo(HMMIO hmmio, const MMIOINFO FAR* lpmmioinfo, UINT uFlags) +{ + printf("mmioSetInfo\n"); + return 0; } /* +#1100 pascal DRVOPEN +#1101 pascal DRVCLOSE +#1102 pascal DRVSENDMESSAGE +#1103 pascal DRVGETMODULEHANDLE +#1104 pascal DRVDEFDRIVERPROC UINT WINAPI mciGetDeviceIDFromElementID (DWORD dwElementID, LPCSTR lpstrType); @@ -1201,8 +1298,6 @@ YIELDPROC WINAPI mciGetYieldProc (UINT uDeviceID, DWORD FAR* lpdwYieldData); FOURCC WINAPI mmioStringToFOURCC(LPCSTR sz, UINT uFlags); LPMMIOPROC WINAPI mmioInstallIOProc(FOURCC fccIOProc, LPMMIOPROC pIOProc, DWORD dwFlags); -UINT WINAPI mmioGetInfo(HMMIO hmmio, MMIOINFO FAR* lpmmioinfo, UINT uFlags); -UINT WINAPI mmioSetInfo(HMMIO hmmio, const MMIOINFO FAR* lpmmioinfo, UINT uFlags); UINT WINAPI mmioSetBuffer(HMMIO hmmio, LPSTR pchBuffer, LONG cchBuffer, UINT uFlags); UINT WINAPI mmioFlush(HMMIO hmmio, UINT uFlags); diff --git a/misc/property.c b/misc/property.c index 3ce34c8a464..18119c6f9b0 100644 --- a/misc/property.c +++ b/misc/property.c @@ -43,11 +43,15 @@ HANDLE RemoveProp(HWND hWnd, LPSTR lpStr) return FALSE; } lpProp = (LPPROPENTRY) GlobalLock(wndPtr->hProp); - if (lpProp == NULL) return 0; + if (lpProp == NULL) { + printf("Property List Empty !\n"); + return 0; + } while (TRUE) { if ((((DWORD)lpStr & 0xFFFF0000) == 0L && lpProp->Atom == LOWORD((DWORD)lpStr)) || (((DWORD)lpStr & 0xFFFF0000) != 0L && + lpProp->PropName != NULL && strcmp(lpProp->PropName, lpStr) == 0)) { printf("RemoveProp // Property found ! hData=%04X\n", lpProp->hData); hOldData = lpProp->hData; @@ -90,11 +94,15 @@ HANDLE GetProp(HWND hWnd, LPSTR lpStr) return 0; } lpProp = (LPPROPENTRY) GlobalLock(wndPtr->hProp); - if (lpProp == NULL) return 0; + if (lpProp == NULL) { + printf("Property List Empty !\n"); + return 0; + } while (TRUE) { if ((((DWORD)lpStr & 0xFFFF0000) == 0L && lpProp->Atom == LOWORD((DWORD)lpStr)) || (((DWORD)lpStr & 0xFFFF0000) != 0L && + lpProp->PropName != NULL && strcmp(lpProp->PropName, lpStr) == 0)) { printf("GetProp // Property found ! hData=%04X\n", lpProp->hData); GlobalUnlock(wndPtr->hProp); @@ -136,6 +144,7 @@ BOOL SetProp(HWND hWnd, LPSTR lpStr, HANDLE hData) if ((((DWORD)lpStr & 0xFFFF0000) == 0L && lpProp->Atom == LOWORD((DWORD)lpStr)) || (((DWORD)lpStr & 0xFFFF0000) != 0L && + lpProp->PropName != NULL && strcmp(lpProp->PropName, lpStr) == 0)) { #ifdef DEBUG_PROP printf("SetProp // change already exinsting property !\n"); @@ -177,7 +186,7 @@ BOOL SetProp(HWND hWnd, LPSTR lpStr, HANDLE hData) } else { lpNewProp->Atom = 0; - lpNewProp->PropName = malloc(strlen(lpStr)); + lpNewProp->PropName = malloc(strlen(lpStr) + 1); if (lpNewProp->PropName == NULL) { printf("SetProp // Can't allocate memory for Property Name !\n"); GlobalUnlock(wndPtr->hProp); @@ -207,7 +216,10 @@ int EnumProps(HWND hWnd, FARPROC lpEnumFunc) return 0; } lpProp = (LPPROPENTRY) GlobalLock(wndPtr->hProp); - if (lpProp == NULL) return 0; + if (lpProp == NULL) { + printf("Property List Empty !\n"); + return 0; + } if (lpEnumFunc != NULL) return 0; while (TRUE) { printf("EnumProps // lpProp->Atom=%04X !\n", lpProp->Atom); diff --git a/miscemu/Imakefile b/miscemu/Imakefile index c9c9db8897c..4b258c44f09 100644 --- a/miscemu/Imakefile +++ b/miscemu/Imakefile @@ -9,6 +9,7 @@ SRCS = \ int21.c \ int25.c \ int26.c \ + int2f.c \ ioports.c \ kernel.c diff --git a/miscemu/emulate.c b/miscemu/emulate.c index fd9cc053972..1b695031ea6 100644 --- a/miscemu/emulate.c +++ b/miscemu/emulate.c @@ -1,6 +1,3 @@ -static char RCSId[] = "$Id: heap.c,v 1.3 1993/07/04 04:04:21 root Exp root $"; -static char Copyright[] = "Copyright Robert J. Amstadt, 1993"; - #include #include #include "prototypes.h" @@ -19,9 +16,9 @@ int WIN87_fpmath() { printf( "_fpmath: (%x:%x %x %x)\n",_CONTEXT->sc_cs, _CONTEXT->sc_eip, - _CONTEXT->sc_es, _BX); + _CONTEXT->sc_es, _BX & 0xffff); - switch(_BX ) + switch(_BX & 0xffff) { case 11: return 1; diff --git a/miscemu/int21.c b/miscemu/int21.c index d0f8003eb95..cefe3ae2fba 100644 --- a/miscemu/int21.c +++ b/miscemu/int21.c @@ -709,7 +709,6 @@ static void FindNext(struct sigcontext_struct *context) do { if ((dp = DOS_readdir(dp)) == NULL) { - DOS_closedir(dp); Error(NoMoreFiles, EC_MediaError , EL_Disk); EAX = (EAX & 0xffffff00L) | NoMoreFiles; SetCflag; @@ -1026,7 +1025,6 @@ static void DeleteFileFCB(struct sigcontext_struct *context) fprintf(stderr, "int21: delete file %s\n", temp); /* unlink(GetUnixFileName(temp)); */ } - DOS_closedir(dp); EAX = (EAX & 0xffffff00L); } @@ -1072,7 +1070,6 @@ static void RenameFileFCB(struct sigcontext_struct *context) strcpy(newnameptr, fcb + 1); fprintf(stderr, "int21: renamefile %s -> %s\n", oldname, newname); } - DOS_closedir(dp); EAX = (EAX & 0xffffff00L); } diff --git a/objects/bitmap.c b/objects/bitmap.c index 6c21e0c8ee5..38fabec927b 100644 --- a/objects/bitmap.c +++ b/objects/bitmap.c @@ -61,7 +61,7 @@ static XImage *BITMAP_BmpToImage( BITMAP * bmp, void * bmpData ) extern void _XInitImageFuncPtrs( XImage* ); XImage * image; - image = XCreateImage( XT_display, DefaultVisualOfScreen(XT_screen), + image = XCreateImage( XT_display, DefaultVisualOfScreen(screen), bmp->bmBitsPixel, ZPixmap, 0, bmpData, bmp->bmWidth, bmp->bmHeight, 16, bmp->bmWidthBytes ); if (!image) return 0; diff --git a/objects/font.c b/objects/font.c index 2ff21c51404..6129981b3e3 100644 --- a/objects/font.c +++ b/objects/font.c @@ -13,6 +13,8 @@ static char Copyright[] = "Copyright Alexandre Julliard, 1993"; #include "user.h" #include "gdi.h" +#define MAX_FONTS 256 +static LPLOGFONT lpLogFontList[MAX_FONTS] = { NULL }; /*********************************************************************** * FONT_MatchFont @@ -45,34 +47,35 @@ static XFontStruct * FONT_MatchFont( LOGFONT * font ) case FF_DECORATIVE: family = "*"; break; default: family = "*"; break; } + AnsiLower(family); - /* Width==0 seems not to be a valid wildcard on SGI's, using * instead */ - if ( width == 0 ) - sprintf( pattern, "-*-%s-%s-%c-normal--*-%d-*-*-%c-*-%s", - family, weight, slant, height, spacing, charset - ); - else - sprintf( pattern, "-*-%s-%s-%c-normal--*-%d-*-*-%c-%d-%s", - family, weight, slant, height, spacing, width, charset - ); - + while (TRUE) { + /* Width==0 seems not to be a valid wildcard on SGI's, using * instead */ + if ( width == 0 ) + sprintf( pattern, "-*-%s-%s-%c-normal--*-%d-*-*-%c-*-%s", + family, weight, slant, height, spacing, charset); + else + sprintf( pattern, "-*-%s-%s-%c-normal--*-%d-*-*-%c-%d-%s", + family, weight, slant, height, spacing, width, charset); #ifdef DEBUG_FONT - printf( "FONT_MatchFont: '%s'\n", pattern ); + printf( "FONT_MatchFont: '%s'\n", pattern ); #endif - names = XListFonts( XT_display, pattern, 1, &count ); - if (!count) - { + names = XListFonts( XT_display, pattern, 1, &count ); + if (count > 0) break; + height -= 10; + if (height < 10) { #ifdef DEBUG_FONT - printf( " No matching font found\n" ); + printf( " No matching font found\n" ); #endif - return NULL; - } + return NULL; + } + } #ifdef DEBUG_FONT - printf( " Found '%s'\n", *names ); + printf( " Found '%s'\n", *names ); #endif - fontStruct = XLoadQueryFont( XT_display, *names ); - XFreeFontNames( names ); - return fontStruct; + fontStruct = XLoadQueryFont( XT_display, *names ); + XFreeFontNames( names ); + return fontStruct; } @@ -134,6 +137,9 @@ HFONT CreateFontIndirect( LOGFONT * font ) if (!hfont) return 0; fontPtr = (FONTOBJ *) GDI_HEAP_ADDR( hfont ); memcpy( &fontPtr->logfont, font, sizeof(LOGFONT) ); +#ifdef DEBUG_FONT + printf("CreateFontIndirect(%08X); return %04X !\n", font, hfont); +#endif return hfont; } @@ -173,7 +179,9 @@ HFONT FONT_SelectObject( DC * dc, HFONT hfont, FONTOBJ * font ) X_PHYSFONT * stockPtr; HFONT prevHandle = dc->w.hFont; XFontStruct * fontStruct; - +#ifdef DEBUG_FONT + printf("FONT_SelectObject(%04X, %04X, %08X); !\n", dc, hfont, font); +#endif /* Load font if necessary */ if (!font) @@ -422,6 +430,117 @@ BOOL GetCharWidth(HDC hdc, WORD wFirstChar, WORD wLastChar, LPINT lpBuffer) return TRUE; } +/************************************************************************* + * ParseFontParms [internal] + */ +int ParseFontParms(LPSTR lpFont, WORD wParmsNo, LPSTR lpRetStr, WORD wMaxSiz) +{ + int i, j; +#ifdef DEBUG_FONT + printf("ParseFontParms('%s', %d, %08X, %d);\n", + lpFont, wParmsNo, lpRetStr, wMaxSiz); +#endif + if (lpFont == NULL) return 0; + if (lpRetStr == NULL) return 0; + for (i = 0; (*lpFont != '\0' && i != wParmsNo); ) { + if (*lpFont == '-') i++; + lpFont++; + } + if (i == wParmsNo) { + if (*lpFont == '-') lpFont++; + wMaxSiz--; + for (i = 0; (*lpFont != '\0' && *lpFont != '-' && i < wMaxSiz); i++) + *(lpRetStr + i) = *lpFont++; + *(lpRetStr + i) = '\0'; +#ifdef DEBUG_FONT + printf("ParseFontParms // '%s'\n", lpRetStr); +#endif + return i; + } + else + lpRetStr[0] = '\0'; + return 0; +} + + +/************************************************************************* + * InitFontsList [internal] + */ +void InitFontsList() +{ + char str[32]; + char pattern[100]; + char *family, *weight, *charset; + char **names; + char slant, spacing; + int i, width, count; + LPLOGFONT lpNewFont; + weight = "medium"; + slant = 'r'; + spacing = '*'; + charset = "*"; + family = "*"; + printf("InitFontsList !\n"); + sprintf( pattern, "-*-%s-%s-%c-normal--*-*-*-*-%c-*-%s", + family, weight, slant, spacing, charset); + names = XListFonts( XT_display, pattern, MAX_FONTS, &count ); +#ifdef DEBUG_FONT + printf("InitFontsList // count=%d \n", count); +#endif + for (i = 0; i < count; i++) { + lpNewFont = malloc(sizeof(LOGFONT) + LF_FACESIZE); + if (lpNewFont == NULL) { + printf("InitFontsList // Error alloc new font structure !\n"); + break; + } +#ifdef DEBUG_FONT + printf("InitFontsList // names[%d]='%s' \n", i, names[i]); +#endif + ParseFontParms(names[i], 2, str, sizeof(str)); + if (strcmp(str, "fixed") == 0) strcat(str, "sys"); + AnsiUpper(str); + strcpy(lpNewFont->lfFaceName, str); + ParseFontParms(names[i], 7, str, sizeof(str)); + lpNewFont->lfHeight = atoi(str) / 10; + ParseFontParms(names[i], 12, str, sizeof(str)); + lpNewFont->lfWidth = atoi(str) / 10; + lpNewFont->lfEscapement = 0; + lpNewFont->lfOrientation = 0; + lpNewFont->lfWeight = FW_REGULAR; + lpNewFont->lfItalic = 0; + lpNewFont->lfUnderline = 0; + lpNewFont->lfStrikeOut = 0; + ParseFontParms(names[i], 13, str, sizeof(str)); + if (strcmp(str, "iso8859") == 0) + lpNewFont->lfCharSet = ANSI_CHARSET; + else + lpNewFont->lfCharSet = OEM_CHARSET; + lpNewFont->lfOutPrecision = OUT_DEFAULT_PRECIS; + lpNewFont->lfClipPrecision = CLIP_DEFAULT_PRECIS; + lpNewFont->lfQuality = DEFAULT_QUALITY; + ParseFontParms(names[i], 11, str, sizeof(str)); + switch(str[0]) { + case 'p': + lpNewFont->lfPitchAndFamily = VARIABLE_PITCH | FF_SWISS; + break; + case 'm': + lpNewFont->lfPitchAndFamily = FIXED_PITCH | FF_MODERN; + break; + default: + lpNewFont->lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE; + break; + } +#ifdef DEBUG_FONT + printf("InitFontsList // lpNewFont->lfHeight=%d \n", lpNewFont->lfHeight); + printf("InitFontsList // lpNewFont->lfWidth=%d \n", lpNewFont->lfWidth); + printf("InitFontsList // lfFaceName='%s' \n", lpNewFont->lfFaceName); +#endif + lpLogFontList[i] = lpNewFont; + lpLogFontList[i+1] = NULL; + } + XFreeFontNames(names); +} + /************************************************************************* * EnumFonts [GDI.70] @@ -430,11 +549,16 @@ int EnumFonts(HDC hDC, LPSTR lpFaceName, FARPROC lpEnumFunc, LPSTR lpData) { HANDLE hLog; HANDLE hMet; + HFONT hFont; + HFONT hOldFont; LPLOGFONT lpLogFont; LPTEXTMETRIC lptm; + LPSTR lpFaceList[MAX_FONTS]; + char FaceName[LF_FACESIZE]; int nRet; - printf("EnumFonts(%04X, %08X, %08X, %08X)\n", - hDC, lpFaceName, lpEnumFunc, lpData); + int j, i = 0; + printf("EnumFonts(%04X, %08X='%s', %08X, %08X)\n", + hDC, lpFaceName, lpFaceName, lpEnumFunc, lpData); if (lpEnumFunc == NULL) return 0; hLog = USER_HEAP_ALLOC(GMEM_MOVEABLE, sizeof(LOGFONT) + LF_FACESIZE); lpLogFont = (LPLOGFONT) USER_HEAP_ADDR(hLog); @@ -449,41 +573,49 @@ int EnumFonts(HDC hDC, LPSTR lpFaceName, FARPROC lpEnumFunc, LPSTR lpData) printf("EnumFonts // can't alloc TEXTMETRIC struct !\n"); return 0; } + if (lpFaceName != NULL) { + strcpy(FaceName, lpFaceName); + AnsiUpper(FaceName); + } + if (lpLogFontList[0] == NULL) InitFontsList(); + memset(lpFaceList, 0, MAX_FONTS * sizeof(LPSTR)); while (TRUE) { - printf("EnumFonts // !\n"); - lpLogFont->lfHeight = 18; - lpLogFont->lfWidth = 12; - lpLogFont->lfEscapement = 0; - lpLogFont->lfOrientation = 0; - lpLogFont->lfWeight = FW_REGULAR; - lpLogFont->lfItalic = 0; - lpLogFont->lfUnderline = 0; - lpLogFont->lfStrikeOut = 0; - lpLogFont->lfCharSet = ANSI_CHARSET; - lpLogFont->lfOutPrecision = OUT_DEFAULT_PRECIS; - lpLogFont->lfClipPrecision = CLIP_DEFAULT_PRECIS; - lpLogFont->lfQuality = DEFAULT_QUALITY; - lpLogFont->lfPitchAndFamily = FIXED_PITCH | FF_MODERN; - strcpy(lpLogFont->lfFaceName, "Courier"); - printf("lpLogFont=%08X lptm=%08X\n", lpLogFont, lptm); + if (lpLogFontList[i] == NULL) break; + if (lpFaceName == NULL) { + for (j = 0; j < MAX_FONTS; j++) { + if (lpFaceList[j] == NULL) break; + if (strcmp(lpFaceList[j], lpLogFontList[i]->lfFaceName) == 0) { + i++; j = 0; + } + } + if (lpLogFontList[i] == NULL) break; + lpFaceList[j] = lpLogFontList[i]->lfFaceName; + printf("EnumFonts // enum all 'lpFaceName' '%s' !\n", lpFaceList[j]); + } + else { + while(lpLogFontList[i] != NULL) { + if (strcmp(FaceName, lpLogFontList[i]->lfFaceName) == 0) break; + i++; + } + if (lpLogFontList[i] == NULL) break; + } + memcpy(lpLogFont, lpLogFontList[i++], sizeof(LOGFONT) + LF_FACESIZE); + hFont = CreateFontIndirect(lpLogFont); + hOldFont = SelectObject(hDC, hFont); + GetTextMetrics(hDC, lptm); + SelectObject(hDC, hOldFont); + DeleteObject(hFont); + printf("EnumFonts // i=%d lpLogFont=%08X lptm=%08X\n", i, lpLogFont, lptm); #ifdef WINELIB nRet = (*lpEnumFunc)(lpLogFont, lptm, 0, lpData); #else nRet = CallBack16(lpEnumFunc, 4, 2, (int)lpLogFont, 2, (int)lptm, 0, (int)0, 2, (int)lpData); #endif - if (nRet == 0) break; - lpLogFont->lfPitchAndFamily = VARIABLE_PITCH | FF_SWISS; - strcpy(lpLogFont->lfFaceName, "Helvetica"); - printf("lpLogFont=%08X lptm=%08X\n", lpLogFont, lptm); -#ifdef WINELIB - nRet = (*lpEnumFunc)(lpLogFont, lptm, 0, lpData); -#else - nRet = CallBack16(lpEnumFunc, 4, 2, (int)lpLogFont, - 2, (int)lptm, 0, (int)0, 2, (int)lpData); -#endif - if (nRet == 0) break; - else break; + if (nRet == 0) { + printf("EnumFonts // EnumEnd requested by application !\n"); + break; + } } USER_HEAP_FREE(hMet); USER_HEAP_FREE(hLog); @@ -498,9 +630,14 @@ int EnumFontFamilies(HDC hDC, LPSTR lpszFamily, FARPROC lpEnumFunc, LPSTR lpData { HANDLE hLog; HANDLE hMet; + HFONT hFont; + HFONT hOldFont; LPLOGFONT lpLogFont; LPTEXTMETRIC lptm; + LPSTR lpFaceList[MAX_FONTS]; + char FaceName[LF_FACESIZE]; int nRet; + int j, i = 0; printf("EnumFontFamilies(%04X, %08X, %08X, %08X)\n", hDC, lpszFamily, lpEnumFunc, lpData); if (lpEnumFunc == NULL) return 0; @@ -517,43 +654,49 @@ int EnumFontFamilies(HDC hDC, LPSTR lpszFamily, FARPROC lpEnumFunc, LPSTR lpData printf("EnumFontFamilies // can't alloc TEXTMETRIC struct !\n"); return 0; } + if (lpszFamily != NULL) { + strcpy(FaceName, lpszFamily); + AnsiUpper(FaceName); + } + if (lpLogFontList[0] == NULL) InitFontsList(); + memset(lpFaceList, 0, MAX_FONTS * sizeof(LPSTR)); while (TRUE) { - printf("EnumFontFamilies // !\n"); - lpLogFont->lfHeight = 12; - lpLogFont->lfWidth = 8; - lpLogFont->lfEscapement = 0; - lpLogFont->lfOrientation = 0; - lpLogFont->lfWeight = FW_REGULAR; - lpLogFont->lfItalic = 0; - lpLogFont->lfUnderline = 0; - lpLogFont->lfStrikeOut = 0; - lpLogFont->lfCharSet = ANSI_CHARSET; - lpLogFont->lfOutPrecision = OUT_DEFAULT_PRECIS; - lpLogFont->lfClipPrecision = CLIP_DEFAULT_PRECIS; - lpLogFont->lfQuality = DEFAULT_QUALITY; - lpLogFont->lfPitchAndFamily = FIXED_PITCH | FF_MODERN; - strcpy(lpLogFont->lfFaceName, "Courier"); -/* lpLogFont->lfFullName[LF_FACESIZE] = 12; - lpLogFont->lfStyle[LF_FACESIZE] = 12; */ - printf("lpLogFont=%08X lptm=%08X\n", lpLogFont, lptm); + if (lpLogFontList[i] == NULL) break; + if (lpszFamily == NULL) { + for (j = 0; j < MAX_FONTS; j++) { + if (lpFaceList[j] == NULL) break; + if (strcmp(lpFaceList[j], lpLogFontList[i]->lfFaceName) == 0) { + i++; j = 0; + } + } + if (lpLogFontList[i] == NULL) break; + lpFaceList[j] = lpLogFontList[i]->lfFaceName; + printf("EnumFontFamilies // enum all 'lpszFamily' '%s' !\n", lpFaceList[j]); + } + else { + while(lpLogFontList[i] != NULL) { + if (strcmp(FaceName, lpLogFontList[i]->lfFaceName) == 0) break; + i++; + } + if (lpLogFontList[i] == NULL) break; + } + memcpy(lpLogFont, lpLogFontList[i++], sizeof(LOGFONT) + LF_FACESIZE); + hFont = CreateFontIndirect(lpLogFont); + hOldFont = SelectObject(hDC, hFont); + GetTextMetrics(hDC, lptm); + SelectObject(hDC, hOldFont); + DeleteObject(hFont); + printf("EnumFontFamilies // i=%d lpLogFont=%08X lptm=%08X\n", i, lpLogFont, lptm); #ifdef WINELIB nRet = (*lpEnumFunc)(lpLogFont, lptm, 0, lpData); #else nRet = CallBack16(lpEnumFunc, 4, 2, (int)lpLogFont, 2, (int)lptm, 0, (int)0, 2, (int)lpData); #endif - if (nRet == 0) break; - lpLogFont->lfPitchAndFamily = VARIABLE_PITCH | FF_SWISS; - strcpy(lpLogFont->lfFaceName, "Helvetica"); - printf("lpLogFont=%08X lptm=%08X\n", lpLogFont, lptm); -#ifdef WINELIB - nRet = (*lpEnumFunc)(lpLogFont, lptm, 0, lpData); -#else - nRet = CallBack16(lpEnumFunc, 4, 2, (int)lpLogFont, - 2, (int)lptm, 0, (int)0, 2, (int)lpData); -#endif - if (nRet == 0) break; - else break; + if (nRet == 0) { + printf("EnumFontFamilies // EnumEnd requested by application !\n"); + break; + } } USER_HEAP_FREE(hMet); USER_HEAP_FREE(hLog); diff --git a/objects/gdiobj.c b/objects/gdiobj.c index 6243fd2700d..9248c32c4b1 100644 --- a/objects/gdiobj.c +++ b/objects/gdiobj.c @@ -8,11 +8,19 @@ static char Copyright[] = "Copyright Alexandre Julliard, 1993"; #include #include +#include "user.h" #include "gdi.h" #include "prototypes.h" MDESC *GDI_Heap = NULL; +/* Object types for EnumObjects() */ +#define OBJ_PEN 1 +#define OBJ_BRUSH 2 + +#define MAX_OBJ 1024 +HANDLE *lpPenBrushList = NULL; + extern HPALETTE COLOR_Init(); /* color.c */ /*********************************************************************** @@ -177,6 +185,36 @@ BOOL GDI_Init() } +/*********************************************************************** + * GDI_AppendToPenBrushList + */ +BOOL GDI_AppendToPenBrushList(HANDLE hNewObj) +{ + HANDLE *lphObj; + int i = 1; + if (hNewObj == 0) return FALSE; + if (lpPenBrushList == NULL) { + lpPenBrushList = malloc(MAX_OBJ * sizeof(HANDLE)); + lpPenBrushList[0] = 0; +#ifdef DEBUG_GDI + printf("GDI_AppendToPenBrushList() lpPenBrushList allocated !\n"); +#endif + } + for (lphObj = lpPenBrushList; i < MAX_OBJ; i++) { + if (*lphObj == 0) { + *lphObj = hNewObj; + *(lphObj + 1) = 0; +#ifdef DEBUG_GDI + printf("GDI_AppendToPenBrushList(%04X) appended (count=%d)\n", hNewObj, i); +#endif + return TRUE; + } + lphObj++; + } + return FALSE; +} + + /*********************************************************************** * GDI_FindPrevObject * @@ -212,6 +250,9 @@ HANDLE GDI_AllocObject( WORD size, WORD magic ) obj->hNext = 0; obj->wMagic = magic; obj->dwCount = ++count; + if (magic == PEN_MAGIC || magic == BRUSH_MAGIC) { + GDI_AppendToPenBrushList(handle); + } return handle; } @@ -389,3 +430,136 @@ BOOL UnrealizeObject( HANDLE handle ) #endif return TRUE; } + + +/*********************************************************************** + * EnumObjects (GDI.71) + */ +int EnumObjects(HDC hDC, int nObjType, FARPROC lpEnumFunc, LPSTR lpData) +{ + HANDLE handle; + DC *dc; + HANDLE *lphObj; + GDIOBJHDR *header; + WORD wMagic; + LPSTR lpLog; /* Point to a LOGBRUSH or LOGPEN struct */ + HANDLE hLog; + int i, nRet; + if (lpEnumFunc == NULL) { + printf("EnumObjects // Bad EnumProc callback address !\n"); + return 0; + } + switch (nObjType) { + case OBJ_PEN: + wMagic = PEN_MAGIC; + printf("EnumObjects(%04X, OBJ_PEN, %08X, %08X);\n", + hDC, lpEnumFunc, lpData); + hLog = USER_HEAP_ALLOC(GMEM_MOVEABLE, sizeof(LOGPEN)); + lpLog = (LPSTR) USER_HEAP_ADDR(hLog); + if (lpLog == NULL) { + printf("EnumObjects // Unable to alloc LOGPEN struct !\n"); + return 0; + } + break; + case OBJ_BRUSH: + wMagic = BRUSH_MAGIC; + printf("EnumObjects(%04X, OBJ_BRUSH, %08X, %08X);\n", + hDC, lpEnumFunc, lpData); + hLog = USER_HEAP_ALLOC(GMEM_MOVEABLE, sizeof(LOGBRUSH)); + lpLog = (LPSTR) USER_HEAP_ADDR(hLog); + if (lpLog == NULL) { + printf("EnumObjects // Unable to alloc LOGBRUSH struct !\n"); + return 0; + } + break; + default: + printf("EnumObjects(%04X, %04X, %08X, %08X); // Unknown OBJ type !\n", + hDC, nObjType, lpEnumFunc, lpData); + return 0; + } + printf("EnumObjects // Stock Objects first !\n"); + for (i = 0; i < NB_STOCK_OBJECTS; i++) { + header = StockObjects[i]; + if (header->wMagic == wMagic) { + PEN_GetObject( (PENOBJ *)header, sizeof(LOGPEN), (LPLOGPEN)lpLog); + BRUSH_GetObject( (BRUSHOBJ *)header, sizeof(LOGBRUSH), (LPLOGBRUSH)lpLog); + printf("EnumObjects // StockObj lpLog=%08X lpData=%08X\n", lpLog, lpData); + if (header->wMagic == BRUSH_MAGIC) { + printf("EnumObjects // StockBrush lbStyle=%04X\n", ((LPLOGBRUSH)lpLog)->lbStyle); + printf("EnumObjects // StockBrush lbColor=%08X\n", ((LPLOGBRUSH)lpLog)->lbColor); + printf("EnumObjects // StockBrush lbHatch=%04X\n", ((LPLOGBRUSH)lpLog)->lbHatch); + } + if (header->wMagic == PEN_MAGIC) { + printf("EnumObjects // StockPen lopnStyle=%04X\n", ((LPLOGPEN)lpLog)->lopnStyle); + printf("EnumObjects // StockPen lopnWidth=%08X\n", ((LPLOGPEN)lpLog)->lopnWidth); + printf("EnumObjects // StockPen lopnColor=%08X\n", ((LPLOGPEN)lpLog)->lopnColor); + } + nRet = 1; +/* +#ifdef WINELIB + nRet = (*lpEnumFunc)(lpLog, lpData); +#else + nRet = CallBack16(lpEnumFunc, 4, 2, (int)lpLog, 2, (int)lpData); +#endif +*/ + printf("EnumObjects // after CallBack16 !\n"); + if (nRet == 0) { + USER_HEAP_FREE(hLog); + printf("EnumObjects // EnumEnd requested by application !\n"); + return 0; + } + } + } + if (lpPenBrushList == NULL) return 0; + printf("EnumObjects // Now DC owned objects %08X !\n", header); + for (lphObj = lpPenBrushList; *lphObj != 0; ) { +#ifdef DEBUG_GDI + printf("EnumObjects // *lphObj=%04X\n", *lphObj); +#endif + header = (GDIOBJHDR *) GDI_HEAP_ADDR(*lphObj++); + if (header->wMagic == wMagic) { +#ifdef DEBUG_GDI + printf("EnumObjects // DC_Obj lpLog=%08X lpData=%08X\n", lpLog, lpData); +#endif + if (header->wMagic == BRUSH_MAGIC) { + BRUSH_GetObject( (BRUSHOBJ *)header, sizeof(LOGBRUSH), (LPLOGBRUSH)lpLog); + printf("EnumObjects // DC_Brush lbStyle=%04X\n", ((LPLOGBRUSH)lpLog)->lbStyle); + printf("EnumObjects // DC_Brush lbColor=%08X\n", ((LPLOGBRUSH)lpLog)->lbColor); + printf("EnumObjects // DC_Brush lbHatch=%04X\n", ((LPLOGBRUSH)lpLog)->lbHatch); + } + if (header->wMagic == PEN_MAGIC) { + PEN_GetObject( (PENOBJ *)header, sizeof(LOGPEN), (LPLOGPEN)lpLog); + printf("EnumObjects // DC_Pen lopnStyle=%04X\n", ((LPLOGPEN)lpLog)->lopnStyle); + printf("EnumObjects // DC_Pen lopnWidth=%08X\n", ((LPLOGPEN)lpLog)->lopnWidth); + printf("EnumObjects // DC_Pen lopnColor=%08X\n", ((LPLOGPEN)lpLog)->lopnColor); + } +/* +#ifdef WINELIB + nRet = (*lpEnumFunc)(lpLog, lpData); +#else + nRet = CallBack16(lpEnumFunc, 4, 2, (int)lpLog, 2, (int)lpData); +#endif +*/ + nRet = 1; + printf("EnumObjects // after CallBack16 !\n"); + if (nRet == 0) { + USER_HEAP_FREE(hLog); + printf("EnumObjects // EnumEnd requested by application !\n"); + return 0; + } + } + } + USER_HEAP_FREE(hLog); + printf("EnumObjects // End of enumeration !\n"); + return 0; +} + +/*********************************************************************** + * SetObjectOwner (GDI.461) + */ +int SetObjectOwner(HANDLE hObj) +{ + printf("EMPTY STUB !!! SetObjectOwner() (I don't know its prototype !\n"); + return 0; +} + diff --git a/objects/text.c b/objects/text.c index 0d9690b8bd3..e7d3cdb47c8 100644 --- a/objects/text.c +++ b/objects/text.c @@ -418,7 +418,7 @@ BOOL GrayString(HDC hdc, HBRUSH hbr, FARPROC gsprc, LPARAM lParam, BOOL ExtTextOut(HDC hDC, short x, short y, WORD wOptions, LPRECT lprect, LPSTR str, WORD count, LPINT lpDx) { - printf("EMPTY STUB !!! ExtTextOut(); ! (call TextOut() for new)\n"); + printf("EMPTY STUB !!! ExtTextOut(); ! call TextOut() for now !\n"); TextOut(hDC, x, y, str, count); return FALSE; } diff --git a/windows/dialog.c b/windows/dialog.c index 772408452e7..2e5b6e33d3d 100644 --- a/windows/dialog.c +++ b/windows/dialog.c @@ -156,7 +156,7 @@ HWND CreateDialogParam( HINSTANCE hInst, LPCSTR dlgTemplate, LPCSTR data; #ifdef DEBUG_DIALOG - printf( "CreateDialogParam: %d,'%s',%d,%p,%d\n", + printf( "CreateDialogParam: %d,'%x',%d,%p,%d\n", hInst, dlgTemplate, owner, dlgProc, param ); #endif @@ -295,10 +295,10 @@ HWND CreateDialogIndirectParam( HINSTANCE hInst, LPCSTR dlgTemplate, } header->style |= WS_CHILD; CreateWindowEx( WS_EX_NOPARENTNOTIFY, - class, text, header->style, - header->x * xUnit / 4, header->y * yUnit / 8, - header->cx * xUnit / 4, header->cy * yUnit / 8, - hwnd, header->id, hInst, NULL ); + class, text, header->style, + header->x * xUnit / 4, header->y * yUnit / 8, + header->cx * xUnit / 4, header->cy * yUnit / 8, + hwnd, header->id, hInst, NULL ); header = next_header; } @@ -381,7 +381,7 @@ int DialogBoxParam( HINSTANCE hInst, LPCSTR dlgTemplate, HWND hwnd; #ifdef DEBUG_DIALOG - printf( "DialogBoxParam: %d,'%s',%d,%p,%d\n", + printf( "DialogBoxParam: %d,'%x',%d,%p,%d\n", hInst, dlgTemplate, owner, dlgProc, param ); #endif hwnd = CreateDialogParam( hInst, dlgTemplate, owner, dlgProc, param ); @@ -451,6 +451,7 @@ BOOL IsDialogMessage( HWND hwndDlg, LPMSG msg ) int dlgCode = SendMessage( msg->hwnd, WM_GETDLGCODE, 0, 0 ); /* Process key message */ /* .... */ + SendMessage( msg->hwnd, msg->message, msg->wParam, msg->lParam ); } return TRUE; } diff --git a/windows/graphics.c b/windows/graphics.c index a80d5cf63b8..4a1abe13535 100644 --- a/windows/graphics.c +++ b/windows/graphics.c @@ -35,7 +35,7 @@ BOOL LineTo( HDC hdc, short x, short y ) } if (DC_SetupGCForPen( dc )) - XDrawLine(XT_display, dc->u.x.drawable, dc->u.x.gc, + XDrawLine(display, dc->u.x.drawable, dc->u.x.gc, dc->w.DCOrgX + XLPTODP( dc, dc->w.CursPosX ), dc->w.DCOrgY + YLPTODP( dc, dc->w.CursPosY ), dc->w.DCOrgX + XLPTODP( dc, x ), @@ -145,7 +145,7 @@ BOOL GRAPH_DrawArc( HDC hdc, int left, int top, int right, int bottom, diff_angle = end_angle - start_angle; if (diff_angle < 0.0) diff_angle += 2*PI; - XDrawArc( XT_display, dc->u.x.drawable, dc->u.x.gc, + XDrawArc( display, dc->u.x.drawable, dc->u.x.gc, dc->w.DCOrgX + left, dc->w.DCOrgY + top, right-left-1, bottom-top-1, (int)(start_angle * 180 * 64 / PI), @@ -162,7 +162,7 @@ BOOL GRAPH_DrawArc( HDC hdc, int left, int top, int right, int bottom, points[1].x = dc->w.DCOrgX + xcenter; points[1].y = dc->w.DCOrgY + ycenter; } - XDrawLines( XT_display, dc->u.x.drawable, dc->u.x.gc, + XDrawLines( display, dc->u.x.drawable, dc->u.x.gc, points, lines+1, CoordModeOrigin ); return TRUE; } @@ -222,11 +222,11 @@ BOOL Ellipse( HDC hdc, int left, int top, int right, int bottom ) if ((left == right) || (top == bottom)) return FALSE; if (DC_SetupGCForBrush( dc )) - XFillArc( XT_display, dc->u.x.drawable, dc->u.x.gc, + XFillArc( display, dc->u.x.drawable, dc->u.x.gc, dc->w.DCOrgX + left, dc->w.DCOrgY + top, right-left-1, bottom-top-1, 0, 360*64 ); if (DC_SetupGCForPen( dc )) - XDrawArc( XT_display, dc->u.x.drawable, dc->u.x.gc, + XDrawArc( display, dc->u.x.drawable, dc->u.x.gc, dc->w.DCOrgX + left, dc->w.DCOrgY + top, right-left-1, bottom-top-1, 0, 360*64 ); return TRUE; @@ -253,11 +253,11 @@ BOOL Rectangle( HDC hdc, int left, int top, int right, int bottom ) bottom = YLPTODP( dc, bottom ); if (DC_SetupGCForBrush( dc )) - XFillRectangle( XT_display, dc->u.x.drawable, dc->u.x.gc, + XFillRectangle( display, dc->u.x.drawable, dc->u.x.gc, dc->w.DCOrgX + left, dc->w.DCOrgY + top, right-left-1, bottom-top-1 ); if (DC_SetupGCForPen( dc )) - XDrawRectangle( XT_display, dc->u.x.drawable, dc->u.x.gc, + XDrawRectangle( display, dc->u.x.drawable, dc->u.x.gc, dc->w.DCOrgX + left, dc->w.DCOrgY + top, right-left-1, bottom-top-1 ); return TRUE; @@ -289,41 +289,41 @@ BOOL RoundRect( HDC hDC, short left, short top, short right, short bottom, x2 = XLPTODP(dc, right - ell_width); y2 = YLPTODP(dc, bottom - ell_height); if (DC_SetupGCForBrush(dc)) { - XFillArc(XT_display, dc->u.x.drawable, dc->u.x.gc, + XFillArc(display, dc->u.x.drawable, dc->u.x.gc, dc->w.DCOrgX + x1, dc->w.DCOrgY + y1, ell_width, ell_height, 90 * 64, 90 * 64); - XFillArc(XT_display, dc->u.x.drawable, dc->u.x.gc, + XFillArc(display, dc->u.x.drawable, dc->u.x.gc, dc->w.DCOrgX + x1, dc->w.DCOrgY + y2, ell_width, ell_height, 180 * 64, 90 * 64); - XFillArc(XT_display, dc->u.x.drawable, dc->u.x.gc, + XFillArc(display, dc->u.x.drawable, dc->u.x.gc, dc->w.DCOrgX + x2, dc->w.DCOrgY + y2, ell_width, ell_height, 270 * 64, 90 * 64); - XFillArc(XT_display, dc->u.x.drawable, dc->u.x.gc, + XFillArc(display, dc->u.x.drawable, dc->u.x.gc, dc->w.DCOrgX + x2, dc->w.DCOrgY + y1, ell_width, ell_height, 0, 90 * 64); ell_width /= 2; ell_height /= 2; - XFillRectangle(XT_display, dc->u.x.drawable, dc->u.x.gc, + XFillRectangle(display, dc->u.x.drawable, dc->u.x.gc, dc->w.DCOrgX + left + ell_width, dc->w.DCOrgY + top, right - left - 2 * ell_width, bottom - top); - XFillRectangle(XT_display, dc->u.x.drawable, dc->u.x.gc, + XFillRectangle(display, dc->u.x.drawable, dc->u.x.gc, dc->w.DCOrgX + left, dc->w.DCOrgY + top + ell_height, ell_width, bottom - top - 2 * ell_height); - XFillRectangle(XT_display, dc->u.x.drawable, dc->u.x.gc, + XFillRectangle(display, dc->u.x.drawable, dc->u.x.gc, dc->w.DCOrgX + right - ell_width, dc->w.DCOrgY + top + ell_height, ell_width, bottom - top - 2 * ell_height); ell_width *= 2; ell_height *= 2; } if (DC_SetupGCForPen(dc)) { - XDrawArc(XT_display, dc->u.x.drawable, dc->u.x.gc, + XDrawArc(display, dc->u.x.drawable, dc->u.x.gc, dc->w.DCOrgX + x1, dc->w.DCOrgY + y1, ell_width, ell_height, 90 * 64, 90 * 64); - XDrawArc(XT_display, dc->u.x.drawable, dc->u.x.gc, + XDrawArc(display, dc->u.x.drawable, dc->u.x.gc, dc->w.DCOrgX + x1, dc->w.DCOrgY + y2, ell_width, ell_height, 180 * 64, 90 * 64); - XDrawArc(XT_display, dc->u.x.drawable, dc->u.x.gc, + XDrawArc(display, dc->u.x.drawable, dc->u.x.gc, dc->w.DCOrgX + x2, dc->w.DCOrgY + y2, ell_width, ell_height, 270 * 64, 90 * 64); - XDrawArc(XT_display, dc->u.x.drawable, dc->u.x.gc, + XDrawArc(display, dc->u.x.drawable, dc->u.x.gc, dc->w.DCOrgX + x2, dc->w.DCOrgY + y1, ell_width, ell_height, 0, 90 * 64); } @@ -423,9 +423,9 @@ COLORREF SetPixel( HDC hdc, short x, short y, COLORREF color ) pixel = COLOR_ToPhysical( dc, color ); GetPaletteEntries( dc->w.hPalette, pixel, 1, &entry ); - XSetForeground( XT_display, dc->u.x.gc, pixel ); - XSetFunction( XT_display, dc->u.x.gc, GXcopy ); - XDrawPoint( XT_display, dc->u.x.drawable, dc->u.x.gc, x, y ); + XSetForeground( display, dc->u.x.gc, pixel ); + XSetFunction( display, dc->u.x.gc, GXcopy ); + XDrawPoint( display, dc->u.x.drawable, dc->u.x.gc, x, y ); return RGB( entry.peRed, entry.peGreen, entry.peBlue ); } @@ -450,13 +450,13 @@ COLORREF GetPixel( HDC hdc, short x, short y ) { XWindowAttributes win_attr; - if (!XGetWindowAttributes( XT_display, dc->u.x.drawable, &win_attr )) + if (!XGetWindowAttributes( display, dc->u.x.drawable, &win_attr )) return 0; if (win_attr.map_state != IsViewable) return 0; if ((x >= win_attr.width) || (y >= win_attr.height)) return 0; } - image = XGetImage( XT_display, dc->u.x.drawable, x, y, + image = XGetImage( display, dc->u.x.drawable, x, y, 1, 1, AllPlanes, ZPixmap ); GetPaletteEntries( dc->w.hPalette, XGetPixel( image, 0, 0 ), 1, &entry ); XDestroyImage( image ); @@ -494,7 +494,7 @@ BOOL PaintRgn( HDC hdc, HRGN hrgn ) GetClipBox( hdc, &box ); if (DC_SetupGCForBrush( dc )) - XFillRectangle( XT_display, dc->u.x.drawable, dc->u.x.gc, + XFillRectangle( display, dc->u.x.drawable, dc->u.x.gc, dc->w.DCOrgX + box.left, dc->w.DCOrgY + box.top, box.right-box.left, box.bottom-box.top ); @@ -541,7 +541,7 @@ void DrawFocusRect( HDC hdc, LPRECT rc ) oldBkMode = SetBkMode(hdc, TRANSPARENT); if (DC_SetupGCForPen( dc )) - XDrawRectangle( XT_display, dc->u.x.drawable, dc->u.x.gc, + XDrawRectangle( display, dc->u.x.drawable, dc->u.x.gc, dc->w.DCOrgX + left, dc->w.DCOrgY + top, right-left-1, bottom-top-1 ); @@ -601,12 +601,12 @@ BOOL Polyline (HDC hdc, LPPOINT pt, int count) if (DC_SetupGCForPen( dc )) { for (i = 0; i < count-1; i ++) - XDrawLine (XT_display, dc->u.x.drawable, dc->u.x.gc, + XDrawLine (display, dc->u.x.drawable, dc->u.x.gc, dc->w.DCOrgX + XLPTODP(dc, pt [i].x), dc->w.DCOrgY + YLPTODP(dc, pt [i].y), dc->w.DCOrgX + XLPTODP(dc, pt [i+1].x), dc->w.DCOrgY + YLPTODP(dc, pt [i+1].y)); - XDrawLine (XT_display, dc->u.x.drawable, dc->u.x.gc, + XDrawLine (display, dc->u.x.drawable, dc->u.x.gc, dc->w.DCOrgX + XLPTODP(dc, pt [count-1].x), dc->w.DCOrgY + YLPTODP(dc, pt [count-1].y), dc->w.DCOrgX + XLPTODP(dc, pt [0].x), @@ -644,12 +644,12 @@ BOOL Polygon (HDC hdc, LPPOINT pt, int count) } points [count] = points [0]; - XFillPolygon( XT_display, dc->u.x.drawable, dc->u.x.gc, + XFillPolygon( display, dc->u.x.drawable, dc->u.x.gc, points, count, Complex, CoordModeOrigin); if (DC_SetupGCForPen ( dc )) { - XDrawLines( XT_display, dc->u.x.drawable, dc->u.x.gc, + XDrawLines( display, dc->u.x.drawable, dc->u.x.gc, points, count, CoordModeOrigin ); } } diff --git a/windows/nonclient.c b/windows/nonclient.c index a7170314a88..45ca0d88bf4 100644 --- a/windows/nonclient.c +++ b/windows/nonclient.c @@ -16,6 +16,7 @@ static char Copyright[] = "Copyright Alexandre Julliard, 1994"; #include "syscolor.h" static HBITMAP hbitmapClose = 0; +static HBITMAP hbitmapMDIClose = 0; static HBITMAP hbitmapMinimize = 0; static HBITMAP hbitmapMinimizeD = 0; static HBITMAP hbitmapMaximize = 0; @@ -287,11 +288,15 @@ LONG NC_HandleNCHitTest( HWND hwnd, POINT pt ) static void NC_DrawSysButton( HWND hwnd, HDC hdc, BOOL down ) { RECT rect; + WND *wndPtr = WIN_FindWndPtr( hwnd ); HDC hdcMem = CreateCompatibleDC( hdc ); if (hdcMem) { NC_GetInsideRect( hwnd, &rect ); - SelectObject( hdcMem, hbitmapClose ); + if (wndPtr->dwStyle & WS_CHILD) + SelectObject( hdcMem, hbitmapMDIClose ); + else + SelectObject( hdcMem, hbitmapClose ); BitBlt( hdc, rect.left, rect.top, SYSMETRICS_CXSIZE, SYSMETRICS_CYSIZE, hdcMem, 1, 1, down ? NOTSRCCOPY : SRCCOPY ); DeleteDC( hdcMem ); @@ -457,6 +462,8 @@ static void NC_DrawCaption( HDC hdc, RECT *rect, HWND hwnd, { if (!(hbitmapClose = LoadBitmap( 0, MAKEINTRESOURCE(OBM_CLOSE) ))) return; + if (!(hbitmapMDIClose = LoadBitmap( 0, MAKEINTRESOURCE(OBM_OLD_CLOSE) ))) + return; hbitmapMinimize = LoadBitmap( 0, MAKEINTRESOURCE(OBM_REDUCE) ); hbitmapMinimizeD = LoadBitmap( 0, MAKEINTRESOURCE(OBM_REDUCED) ); hbitmapMaximize = LoadBitmap( 0, MAKEINTRESOURCE(OBM_ZOOM) ); diff --git a/windows/utility.c b/windows/utility.c index c16616d21b4..a1e0d0e8ece 100644 --- a/windows/utility.c +++ b/windows/utility.c @@ -285,113 +285,72 @@ char *UTILITY_convertArgs(char *format, char *winarg) #ifndef WINELIB INT windows_wsprintf(BYTE *win_stack) { - LPSTR lpOutput, lpFormat; - BYTE *new_stack, *stack_ptr, *ptr; - int stacklength, result; + LPSTR lpOutput, lpFormat, ptr; + BYTE new_stack[1024], *stack_ptr; lpOutput = (LPSTR) *(DWORD*)win_stack; win_stack += 4; lpFormat = (LPSTR) *(DWORD*)win_stack; win_stack += 4; - /* determine # of bytes pushed on 16-bit stack by checking printf's - format string */ - - ptr = lpFormat; - stacklength = 0; - do { - if (*ptr++ != '%') - continue; - - /* skip width/precision */ - while ( *ptr == '-' || *ptr == '+' || *ptr == '.' || - *ptr == ' ' || isdigit(*ptr)) - ptr++; - - switch(*ptr++) { - case 'l': ptr++; /* skip next type character */ - stacklength += 4; - continue; - case 's': - stacklength += 4; - continue; - case 'c': - case 'd': - case 'i': - case 'u': - case 'x': - case 'X': - stacklength += 2; - continue; - default: - fprintf(stderr, "wsprintf: oops, unknown formattype `%c' used!\n", *ptr); - } - } while (*ptr); - /* create 32-bit stack for libc's vsprintf() */ - new_stack = malloc(2 * stacklength); - stack_ptr = new_stack + 2 * stacklength; - win_stack += stacklength; - ptr = lpFormat; - do { - if (*ptr++ != '%') + for (ptr = lpFormat, stack_ptr = new_stack; *ptr; ptr++) { + if (*ptr != '%' || *++ptr == '%') continue; /* skip width/precision */ - while ( *ptr == '-' || *ptr == '+' || *ptr == '.' || - *ptr == ' ' || isdigit(*ptr)) + while (*ptr == '-' || *ptr == '+' || *ptr == '.' || + *ptr == ' ' || isdigit(*ptr)) ptr++; - switch(*ptr++) { + switch (*ptr++) { case 's': - stack_ptr -= 4; - win_stack -= 4; *(DWORD*)stack_ptr = *(DWORD*)win_stack; - continue; + stack_ptr += 4; + win_stack += 4; + break; case 'l': - stack_ptr -= 4; - win_stack -= 4; *(DWORD*)stack_ptr = *(DWORD*)win_stack; + stack_ptr += 4; + win_stack += 4; ptr++; /* skip next type character */ - continue; + break; case 'c': - stack_ptr -= 4; - win_stack -= 2; -/* windows' wsprintf() %c ignores 0's, we replace 0 with 1 to make sure +/* windows' wsprintf() %c ignores 0's, we replace 0 with SPACE to make sure that the remaining part of the string isn't ignored by the winapp */ if (*(WORD*)win_stack) *(DWORD*)stack_ptr = *(WORD*)win_stack; else - *(DWORD*)stack_ptr = 1; - continue; + *(DWORD*)stack_ptr = ' '; + stack_ptr += 4; + win_stack += 2; + break; case 'd': case 'i': - stack_ptr -= 4; - win_stack -= 2; *(int*)stack_ptr = *(INT*)win_stack; - continue; + stack_ptr += 4; + win_stack += 2; + break; case 'u': case 'x': case 'X': - stack_ptr -= 4; - win_stack -= 2; *(DWORD*)stack_ptr = *(WORD*)win_stack; - continue; + stack_ptr += 4; + win_stack += 2; + break; default: - stack_ptr -= 4; - win_stack -= 4; *(DWORD*)stack_ptr = 0; + stack_ptr += 4; + win_stack += 4; fprintf(stderr, "wsprintf: oops, unknown formattype %c used!\n", *ptr); + break; } - } while (*ptr); + } - result = vsprintf(lpOutput, lpFormat, stack_ptr); - free(new_stack); - - return result; + return vsprintf(lpOutput, lpFormat, new_stack); } #endif diff --git a/windows/win.c b/windows/win.c index 572dfe6c67a..cbd72f2b105 100644 --- a/windows/win.c +++ b/windows/win.c @@ -444,6 +444,9 @@ HWND CreateWindowEx( DWORD exStyle, LPSTR className, LPSTR windowName, WIN_SendParentNotify( hwnd, WM_CREATE, MAKELONG( hwnd, wndPtr->wIDmenu ) ); if (style & WS_VISIBLE) ShowWindow( hwnd, SW_SHOW ); +#ifdef DEBUG_WIN + printf( "CreateWindowEx: return %04X \n", hwnd); +#endif return hwnd; } diff --git a/windows/winpos.c b/windows/winpos.c index f236d4973e3..98cfa1110f9 100644 --- a/windows/winpos.c +++ b/windows/winpos.c @@ -230,7 +230,7 @@ BOOL ShowWindow( HWND hwnd, int cmd ) int swpflags = 0; #ifdef DEBUG_WIN - printf("ShowWindow: hwnd=%d, cmd=%d\n", hwnd, cmd); + printf("ShowWindow: hwnd=%04X, cmd=%d\n", hwnd, cmd); #endif if (!wndPtr) return FALSE; @@ -456,7 +456,7 @@ BOOL SetWindowPos( HWND hwnd, HWND hwndInsertAfter, short x, short y, int changeMask = 0; #ifdef DEBUG_WIN - printf( "SetWindowPos: %d %d %d,%d %dx%d 0x%x\n", + printf( "SetWindowPos: %04X %d %d,%d %dx%d 0x%x\n", hwnd, hwndInsertAfter, x, y, cx, cy, flags ); #endif @@ -592,10 +592,14 @@ BOOL SetWindowPos( HWND hwnd, HWND hwndInsertAfter, short x, short y, } changeMask |= CWStackMode; } - if (changeMask) XConfigureWindow( display, wndPtr->window, - changeMask, &winChanges ); + if ((newWindowRect.right - newWindowRect.left) != 0 && + (newWindowRect.bottom - newWindowRect.top) != 0) + if (changeMask) XConfigureWindow( display, wndPtr->window, + changeMask, &winChanges ); - if (winPos->flags & SWP_SHOWWINDOW) + if ((newWindowRect.right - newWindowRect.left) != 0 && + (newWindowRect.bottom - newWindowRect.top) != 0 && + (winPos->flags & SWP_SHOWWINDOW)) { wndPtr->dwStyle |= WS_VISIBLE; XMapWindow( display, wndPtr->window );