From f72072590417bee9e45d08cedef3c1d2759f7816 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Sat, 23 Jul 1994 07:57:48 +0000 Subject: [PATCH] Release 940722 Mon Jul 18 23:55:13 MET DST 1994 * [if1632/call.S] CallTo16(): added `mov %eax,%edx' just before lcall, to make sure that DX contain the DLL's hinstance when initialised. CallTo32_16() added, equal to CallTo32() except for one thing: it saves DX and * [tools/build.c] Added some code to support 16 and 32 bit return values. * [1632/{kernel,user}.spec] Changed most of the `pascal' style to pascal_16 when function returned a 16bit value. Tue Jul 19 18:40:25 1994 Alexandre Julliard (julliard@lamisun.epfl.ch) * [controls/menu.c] Reorganized sizing and drawing code to implement multi-line menus. Implemented MENUBREAK style. Use system colors to draw menus. * [objects/color.c] Bug fix in COLOR_IsSolid(). * [objects/font.c] Bug fix in FONT_GetMetrics(): calculate average character width only on existing chars (dialogs look much better). * [objects/text.c] Bug fix in DrawText(): use text color to underline mnemonic. * [windows/nonclient.c] Changed WM_NCHITTEST handling to cope with multi-line menu bars. * [windows/syscolor.c] Added system objects for menu colors. Mon Jul 18 19:32:08 PDT 1994 Andrew Lagodzinski (andrew@netcom.com) * [controls/menu.c] Fixed bug in SelectPrevItem that caused seperators to not be skipped when using the up arrow key. --- ChangeLog | 47 +++ controls/menu.c | 939 ++++++++++++++++++++++------------------------------ controls/widgets.c | 2 +- if1632/call.S | 100 ++++++ if1632/kernel.spec | 148 ++++----- if1632/user.spec | 30 +- include/syscolor.h | 4 +- loader/signal.c | 45 ++- misc/audio.c | 137 +++++++- misc/mcicda.c | 66 ++++ misc/mmaux.c | 14 + objects/color.c | 2 +- objects/font.c | 67 ++-- objects/text.c | 4 + tools/build.c | 31 +- windows/nonclient.c | 165 ++++----- windows/syscolor.c | 8 + windows/win.c | 7 +- windows/winpos.c | 25 +- 19 files changed, 1077 insertions(+), 764 deletions(-) diff --git a/ChangeLog b/ChangeLog index 96b0bbbbd56..e1c6f0a8b02 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,51 @@ ---------------------------------------------------------------------- +Mon Jul 18 23:55:13 MET DST 1994 + + * [if1632/call.S] + CallTo16(): added `mov %eax,%edx' just before lcall, + to make sure that DX contain the DLL's hinstance when + initialised. + + CallTo32_16() added, equal to CallTo32() except for + one thing: it saves DX and + + * [tools/build.c] + Added some code to support 16 and 32 bit return values. + + * [1632/{kernel,user}.spec] + Changed most of the `pascal' style to pascal_16 when + function returned a 16bit value. + +Tue Jul 19 18:40:25 1994 Alexandre Julliard (julliard@lamisun.epfl.ch) + + * [controls/menu.c] + Reorganized sizing and drawing code to implement multi-line menus. + Implemented MENUBREAK style. + Use system colors to draw menus. + + * [objects/color.c] + Bug fix in COLOR_IsSolid(). + + * [objects/font.c] + Bug fix in FONT_GetMetrics(): calculate average character width + only on existing chars (dialogs look much better). + + * [objects/text.c] + Bug fix in DrawText(): use text color to underline mnemonic. + + * [windows/nonclient.c] + Changed WM_NCHITTEST handling to cope with multi-line menu bars. + + * [windows/syscolor.c] + Added system objects for menu colors. + +Mon Jul 18 19:32:08 PDT 1994 Andrew Lagodzinski (andrew@netcom.com) + + * [controls/menu.c] + Fixed bug in SelectPrevItem that caused seperators to not be + skipped when using the up arrow key. + +---------------------------------------------------------------------- Thu Jul 14 17:50:45 1994 Bob Amstadt (bob@pooh) * [Configure] diff --git a/controls/menu.c b/controls/menu.c index 5e3dee5f452..18ca83298fb 100644 --- a/controls/menu.c +++ b/controls/menu.c @@ -11,6 +11,7 @@ static char Copyright[] = "Copyright Martin Ayotte, 1993"; #include #include #include "windows.h" +#include "syscolor.h" #include "sysmetrics.h" #include "prototypes.h" #include "menu.h" @@ -22,6 +23,16 @@ static char Copyright[] = "Copyright Martin Ayotte, 1993"; #define SC_SYSMENU SC_SCREENSAVE+2 #define SC_ABOUTWINEDLG SC_SCREENSAVE+3 + /* Dimension of the menu bitmaps */ +static WORD check_bitmap_width = 0, check_bitmap_height = 0; +static WORD arrow_bitmap_width = 0, arrow_bitmap_height = 0; + + /* Space between 2 menu bar items */ +#define MENU_BAR_ITEMS_SPACE 16 + + /* Height of a separator item */ +#define SEPARATOR_HEIGHT 5 + extern HINSTANCE hSysRes; HMENU hSysMenu = 0; HBITMAP hStdCheck = 0; @@ -45,13 +56,11 @@ LPMENUITEM MenuFindItem(LPPOPUPMENU lppop, int x, int y, WORD *lpRet); LPMENUITEM MenuFindItemBySelKey(LPPOPUPMENU lppop, WORD key, WORD *lpRet); BOOL ActivateMenuBarFocus(HWND hWnd); BOOL MenuFocusLoop(HWND hWnd, LPPOPUPMENU lpmenu); -void PopupMenuCalcSize(HWND hwnd); -void MenuBarCalcSize(HDC hDC, LPRECT lprect, LPPOPUPMENU lppop); LPMENUITEM FindMenuItem(HMENU hMenu, WORD nPos, WORD wFlags); LPMENUITEM GetMenuItemPtr(LPPOPUPMENU menu, WORD nPos); WORD GetSelectionKey(LPSTR str); LPSTR GetShortCutString(LPSTR str); -WORD GetShortCutPos(LPSTR str); +int GetShortCutPos(LPSTR str); BOOL HideAllSubPopupMenu(LPPOPUPMENU menu); void InitStdBitmaps(); HMENU CopySysMenu(); @@ -60,10 +69,287 @@ void SetMenuLogicalParent(HMENU hMenu, HWND hWnd); BOOL FAR PASCAL AboutWine_Proc(HWND hDlg, WORD msg, WORD wParam, LONG lParam); + +/*********************************************************************** + * MENU_CalcItemSize + * + * Calculate the size of the menu item and store it in lpitem->rect. + */ +static void MENU_CalcItemSize( HDC hdc, LPMENUITEM lpitem, + int orgX, int orgY, BOOL menuBar ) +{ + DWORD dwSize; + SetRect( &lpitem->rect, orgX, orgY, orgX, orgY ); + + if (lpitem->item_flags & MF_SEPARATOR) + { + lpitem->rect.bottom += SEPARATOR_HEIGHT; + return; + } + + if (!menuBar) lpitem->rect.right += check_bitmap_width+arrow_bitmap_width; + + if (lpitem->item_flags & MF_BITMAP) + { + BITMAP bm; + HBITMAP hbitmap = (HBITMAP)LOWORD((LONG)lpitem->item_text); + GetObject(hbitmap, sizeof(BITMAP), (LPSTR)&bm); + lpitem->rect.right += bm.bmWidth; + lpitem->rect.bottom += bm.bmHeight; + return; + } + + /* If we get here, then it is a text item */ + + if (menuBar) lpitem->rect.right += MENU_BAR_ITEMS_SPACE; + dwSize = GetTextExtent( hdc, lpitem->item_text, strlen(lpitem->item_text)); + lpitem->rect.right += LOWORD(dwSize); + lpitem->rect.bottom += max( HIWORD(dwSize), SYSMETRICS_CYMENU ); +} + + +/*********************************************************************** + * MENU_PopupMenuCalcSize + * + * Calculate the size of a popup menu. + */ +static void MENU_PopupMenuCalcSize( HWND hwnd ) +{ + LPPOPUPMENU lppop; + LPMENUITEM lpitem, lpitemStart, lptmp; + WND *wndPtr; + HDC hdc; + int orgX, orgY, maxX; + + if (!(lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr))) return; + SetRect( &lppop->rect, 0, 0, 0, 0 ); + lppop->Width = lppop->Height = 0; + if (lppop->nItems == 0) return; + hdc = GetDC( hwnd ); + maxX = 0; + lpitemStart = lppop->firstItem; + while (lpitemStart != NULL) + { + orgX = maxX; + orgY = 0; + + /* Parse items until column break or end of menu */ + for (lpitem = lpitemStart; lpitem != NULL; lpitem = lpitem->next) + { + if ((lpitem != lpitemStart) && + (lpitem->item_flags & (MF_MENUBREAK | MF_MENUBARBREAK))) break; + MENU_CalcItemSize( hdc, lpitem, orgX, orgY, FALSE ); + maxX = max( maxX, lpitem->rect.right ); + orgY = lpitem->rect.bottom; + } + + /* Finish the column (set all items to the largest width found) */ + for (lptmp = lpitemStart; lptmp != lpitem; lptmp = lptmp->next) + { + lptmp->rect.right = maxX; + } + + /* And go to the next column */ + lppop->Height = max( lppop->Height, orgY ); + lpitemStart = lpitem; + } + + lppop->Width = maxX; + SetRect( &lppop->rect, 0, 0, lppop->Width, lppop->Height ); + ReleaseDC( hwnd, hdc ); +} + + +/*********************************************************************** + * MENU_MenuBarCalcSize + * + * Calculate the size of the menu bar. + */ +static void MENU_MenuBarCalcSize( HDC hdc, LPRECT lprect, LPPOPUPMENU lppop ) +{ + LPMENUITEM lpitem, lpitemStart, lptmp; + int orgX, orgY, maxY; + + if ((lprect == NULL) || (lppop == NULL)) return; + if (lppop->nItems == 0) return; +#ifdef DEBUG_MENUCALC + printf("MenuBarCalcSize left=%d top=%d right=%d bottom=%d !\n", + lprect->left, lprect->top, lprect->right, lprect->bottom); +#endif + lppop->Width = lprect->right - lprect->left; + lppop->Height = 0; + maxY = lprect->top; + + lpitemStart = lppop->firstItem; + while (lpitemStart != NULL) + { + orgX = lprect->left; + orgY = maxY; + + /* Parse items until line break or end of menu */ + for (lpitem = lpitemStart; lpitem != NULL; lpitem = lpitem->next) + { + if ((lpitem != lpitemStart) && + (lpitem->item_flags & (MF_MENUBREAK | MF_MENUBARBREAK))) break; + MENU_CalcItemSize( hdc, lpitem, orgX, orgY, TRUE ); + if (lpitem->rect.right > lprect->right) + { + if (lpitem != lpitemStart) break; + else lpitem->rect.right = lprect->right; + } + maxY = max( maxY, lpitem->rect.bottom ); + orgX = lpitem->rect.right; + } + + /* Finish the line (set all items to the largest height found) */ + for (lptmp = lpitemStart; lptmp != lpitem; lptmp = lptmp->next) + { + lptmp->rect.bottom = maxY; + } + + /* And go to the next line */ + lpitemStart = lpitem; + } + + lprect->bottom = maxY; + lppop->Height = lprect->bottom - lprect->top; + CopyRect( &lppop->rect, lprect ); +} + + +/*********************************************************************** + * MENU_DrawMenuItem + * + * Draw a single menu item. + */ +static void MENU_DrawMenuItem( HDC hdc, LPMENUITEM lpitem, + LPRECT menuRect, BOOL menuBar ) +{ + RECT rect; + + if (menuBar && (lpitem->item_flags & MF_SEPARATOR)) return; + rect = lpitem->rect; + + /* Draw the background */ + + if (lpitem->item_flags & MF_HILITE) + FillRect( hdc, &rect, sysColorObjects.hbrushHighlight ); + else FillRect( hdc, &rect, sysColorObjects.hbrushMenu ); + SetBkMode( hdc, TRANSPARENT ); + + /* Draw the separator bar (if any) */ + + if (!menuBar && (lpitem->item_flags & MF_MENUBARBREAK)) + { + SelectObject( hdc, sysColorObjects.hpenWindowFrame ); + MoveTo( hdc, rect.left, menuRect->top ); + LineTo( hdc, rect.left, menuRect->bottom ); + } + if (lpitem->item_flags & MF_SEPARATOR) + { + SelectObject( hdc, sysColorObjects.hpenWindowFrame ); + MoveTo( hdc, rect.left, rect.top + SEPARATOR_HEIGHT/2 ); + LineTo( hdc, rect.right, rect.top + SEPARATOR_HEIGHT/2 ); + } + + if (!menuBar) + { + /* Draw the check mark */ + + if (lpitem->item_flags & MF_CHECKED) + { + HDC hMemDC = CreateCompatibleDC( hdc ); + if (lpitem->hCheckBit == 0) SelectObject(hMemDC, hStdCheck); + else SelectObject(hMemDC, lpitem->hCheckBit); + BitBlt( hdc, rect.left, + (rect.top + rect.bottom - check_bitmap_height) / 2, + check_bitmap_width, check_bitmap_height, + hMemDC, 0, 0, SRCCOPY ); + DeleteDC( hMemDC ); + } + else /* Not checked */ + { + if (lpitem->hUnCheckBit != 0) + { + HDC hMemDC = CreateCompatibleDC( hdc ); + SelectObject(hMemDC, lpitem->hUnCheckBit); + BitBlt( hdc, rect.left, + (rect.top + rect.bottom - check_bitmap_height) / 2, + check_bitmap_width, check_bitmap_height, + hMemDC, 0, 0, SRCCOPY ); + DeleteDC( hMemDC ); + } + } + + /* Draw the popup-menu arrow */ + + if (lpitem->item_flags & MF_POPUP) + { + HDC hMemDC = CreateCompatibleDC( hdc ); + SelectObject(hMemDC, hStdMnArrow); + BitBlt( hdc, rect.right-arrow_bitmap_width, + (rect.top + rect.bottom - arrow_bitmap_height) / 2, + arrow_bitmap_width, arrow_bitmap_height, + hMemDC, 0, 0, SRCCOPY ); + DeleteDC(hMemDC); + } + + rect.left += check_bitmap_width; + rect.right -= arrow_bitmap_width; + } + + /* Setup colors */ + + if (lpitem->item_flags & MF_HILITE) + { + SetTextColor( hdc, GetSysColor( COLOR_HIGHLIGHTTEXT ) ); + SetBkColor( hdc, GetSysColor( COLOR_HIGHLIGHT ) ); + } + else + { + if (lpitem->item_flags & MF_GRAYED) + SetTextColor( hdc, GetSysColor( COLOR_GRAYTEXT ) ); + else + SetTextColor( hdc, GetSysColor( COLOR_MENUTEXT ) ); + SetBkColor( hdc, GetSysColor( COLOR_MENU ) ); + } + + /* Draw the item text or bitmap */ + + if (lpitem->item_flags & MF_BITMAP) + { + HBITMAP hbitmap = (HBITMAP)LOWORD((LONG)lpitem->item_text); + HDC hMemDC = CreateCompatibleDC( hdc ); + SelectObject( hMemDC, hbitmap ); + BitBlt( hdc, rect.left, rect.top, + rect.right-rect.left, rect.bottom-rect.top, + hMemDC, 0, 0, SRCCOPY ); + DeleteDC( hMemDC ); + return; + } + else /* No bitmap */ + { + int x = GetShortCutPos(lpitem->item_text); + if (menuBar) + { + rect.left += MENU_BAR_ITEMS_SPACE / 2; + rect.right -= MENU_BAR_ITEMS_SPACE / 2; + } + if (x != -1) + { + DrawText( hdc, lpitem->item_text, x, &rect, + DT_LEFT | DT_VCENTER | DT_SINGLELINE ); + DrawText( hdc, lpitem->item_text + x, -1, &rect, + DT_RIGHT | DT_VCENTER | DT_SINGLELINE ); + } + else DrawText( hdc, lpitem->item_text, -1, &rect, + DT_LEFT | DT_VCENTER | DT_SINGLELINE ); + } +} + + /*********************************************************************** * PopupMenuWndProc - SetWindow - SetWindow */ LONG PopupMenuWndProc( HWND hwnd, WORD message, WORD wParam, LONG lParam ) { @@ -148,19 +434,6 @@ LONG PopupMenuWndProc( HWND hwnd, WORD message, WORD wParam, LONG lParam ) break; } lppop->FocusedItem = (WORD)-1; - if (!lppop->BarFlag) { - PopupMenuCalcSize(hwnd); -/* ResetHiliteFlags(lppop); */ -#ifdef DEBUG_MENU - printf("PopupMenuWndProc hWnd=%04X WM_SHOWWINDOW Width=%d Height=%d !\n", - hwnd, lppop->Width, lppop->Height); -#endif - SetWindowPos(hwnd, 0, 0, 0, lppop->Width + 2, lppop->Height, - SWP_NOZORDER | SWP_NOMOVE | SWP_NOACTIVATE ); -#ifdef DEBUG_MENU - printf("PopupMenuWndProc // End of WM_SHOWWINDOW !\n"); -#endif - } break; case WM_LBUTTONDOWN: lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr); @@ -335,12 +608,7 @@ ProceedSPACE: lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr); #ifdef DEBUG_MENU printf("PopupMenuWndProc // WM_PAINT received !\n"); #endif - lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr); - if (lppop == NULL) break; - if (!lppop->BarFlag) { - PopupMenuCalcSize(hwnd); - StdDrawPopupMenu(hwnd); - } + StdDrawPopupMenu(hwnd); break; default: return DefWindowProc(hwnd, message, wParam, lParam); @@ -365,7 +633,7 @@ BOOL ExecFocusedMenuItem(HWND hWnd, LPPOPUPMENU lppop) GetClientRect(hWnd, &rect); if (lppop->BarFlag) { GetWindowRect(hWnd, &rect); - y = rect.top + lppop->rect.bottom; + y = rect.top + lpitem->rect.bottom; TrackPopupMenu(hSubMenu, TPM_LEFTBUTTON, rect.left + lpitem->rect.left, y, 0, lppop->ownerWnd, (LPRECT)NULL); @@ -432,7 +700,7 @@ BOOL MenuButtonDown(HWND hWnd, LPPOPUPMENU lppop, int x, int y) lppop2->hWndParent = hWnd; if (lppop->BarFlag) { GetWindowRect(hWnd, &rect); - y = rect.top + lppop->rect.bottom; + y = rect.top + lpitem->rect.bottom; ReleaseCapture(); if (MenuHasFocus) { TrackPopupMenu(hSubMenu, TPM_LEFTBUTTON, @@ -551,7 +819,7 @@ void MenuMouseMove(HWND hWnd, LPPOPUPMENU lppop, WORD wParam, int x, int y) { lppop2->hWndParent = hWnd; GetWindowRect(hWnd, &rect); - rect.top += lppop->rect.bottom; + rect.top += lpitem->rect.bottom; TrackPopupMenu(hSubMenu, TPM_LEFTBUTTON, rect.left + lpitem->rect.left, rect.top, 0, lppop->ownerWnd, (LPRECT)NULL); @@ -581,7 +849,7 @@ void SelectPrevItem(LPPOPUPMENU lppop) nIndex--; lpitem = GetMenuItemPtr(lppop, nIndex); } - while (lpitem != NULL && lpitem->item_flags & MF_HILITE) { + while (lpitem != NULL && lpitem->item_flags & MF_SEPARATOR) { nIndex--; lpitem = GetMenuItemPtr(lppop, nIndex); } @@ -622,63 +890,46 @@ void ResetHiliteFlags(LPPOPUPMENU lppop) lpitem = lppop->firstItem; for(i = 0; i < lppop->nItems; i++) { if (lpitem == NULL) return; - lpitem->item_flags &= 0xFFFF ^ MF_HILITE; + lpitem->item_flags &= ~MF_HILITE; lpitem = (LPMENUITEM)lpitem->next; } } -void MenuItemSelect0(HWND hWnd, LPPOPUPMENU lppop, - LPMENUITEM lpitem, WORD wIndex) +void MenuItemSelect(HWND hWnd, LPPOPUPMENU lppop, WORD wIndex) { - LPMENUITEM lpprev; - - if (lppop == NULL) - return; + LPMENUITEM lpitem; + HDC hdc; + + if (lppop == NULL) return; + if (lppop->BarFlag) hdc = GetDCEx( hWnd, 0, DCX_CACHE | DCX_WINDOW ); + else hdc = GetDC( hWnd ); + + /* Clear previous highlighted item */ if (lppop->FocusedItem != (WORD)-1) { - lpprev = GetMenuItemPtr(lppop, lppop->FocusedItem); - if (lpprev != NULL) + if ((lpitem = GetMenuItemPtr(lppop, lppop->FocusedItem)) != NULL) { - lpprev->item_flags &= MF_HILITE ^ 0xFFFF; - if ((lpprev->item_flags & MF_POPUP) == MF_POPUP) + lpitem->item_flags &= ~MF_HILITE; + if ((lpitem->item_flags & MF_POPUP) == MF_POPUP) HideAllSubPopupMenu(lppop); - if (lppop->BarFlag) - DrawMenuBar(hWnd); - else - { - InvalidateRect(hWnd, &lpprev->rect, TRUE); - UpdateWindow(hWnd); - } + MENU_DrawMenuItem( hdc, lpitem, &lppop->rect, lppop->BarFlag ); } } + + /* Highlight new item (if any) */ lppop->FocusedItem = wIndex; - if (lpitem == NULL || wIndex == (WORD)-1) - { - ResetHiliteFlags(lppop); - if (lppop->BarFlag) DrawMenuBar(hWnd); - } - else + if (lppop->FocusedItem != (WORD)-1) { - lpitem->item_flags |= MF_HILITE; - if (lppop->BarFlag) - DrawMenuBar(hWnd); - else + if ((lpitem = GetMenuItemPtr(lppop, lppop->FocusedItem)) != NULL) { - InvalidateRect(hWnd, &lpitem->rect, TRUE); - UpdateWindow(hWnd); + lpitem->item_flags |= MF_HILITE; + MENU_DrawMenuItem( hdc, lpitem, &lppop->rect, lppop->BarFlag ); + SendMessage(hWnd, WM_MENUSELECT, lpitem->item_id, + MAKELONG(0, lpitem->item_flags)); } - SendMessage(hWnd, WM_MENUSELECT, lpitem->item_id, - MAKELONG(0, lpitem->item_flags)); } -} - - -void MenuItemSelect(HWND hWnd, LPPOPUPMENU lppop, WORD wIndex) -{ - LPMENUITEM lpitem; - lpitem = GetMenuItemPtr(lppop, wIndex); - MenuItemSelect0(hWnd, lppop, lpitem, wIndex); + ReleaseDC( hWnd, hdc ); } @@ -728,249 +979,47 @@ void SetMenuLogicalParent(HMENU hMenu, HWND hWnd) void StdDrawPopupMenu(HWND hwnd) { - WND *wndPtr; + WND *wndPtr; LPPOPUPMENU lppop; - LPMENUITEM lpitem; + LPMENUITEM lpitem; PAINTSTRUCT ps; - HBRUSH hBrush; - HPEN hOldPen; - HWND hWndParent; - HDC hDC, hMemDC; - RECT rect, rect2, rect3; - DWORD OldTextColor; - int OldBkMode; - HFONT hOldFont; - HBITMAP hBitMap; - BITMAP bm; - UINT i, x; + RECT rect; + HDC hDC; + hDC = BeginPaint(hwnd, &ps); - if (!IsWindowVisible(hwnd)) { - EndPaint(hwnd, &ps); - return; - } - InitStdBitmaps(); - lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr); - if (lppop == NULL) goto EndOfPaint; - hBrush = GetStockObject(WHITE_BRUSH); GetClientRect(hwnd, &rect); - GetClientRect(hwnd, &rect2); - FillRect(hDC, &rect, hBrush); - FrameRect(hDC, &rect, GetStockObject(BLACK_BRUSH)); - if (lppop->nItems == 0) goto EndOfPaint; - lpitem = lppop->firstItem; - if (lpitem == NULL) goto EndOfPaint; - for(i = 0; i < lppop->nItems; i++) { - CopyRect(&rect2, &lpitem->rect); - if ((lpitem->item_flags & MF_SEPARATOR) == MF_SEPARATOR) { - hOldPen = SelectObject(hDC, GetStockObject(BLACK_PEN)); - MoveTo(hDC, rect2.left, rect2.top + 1); - LineTo(hDC, rect2.right, rect2.top + 1); - SelectObject(hDC, hOldPen); - } - if ((lpitem->item_flags & MF_CHECKED) == MF_CHECKED) { - hMemDC = CreateCompatibleDC(hDC); - if (lpitem->hCheckBit == 0) { - SelectObject(hMemDC, hStdCheck); - GetObject(hStdCheck, sizeof(BITMAP), (LPSTR)&bm); - } - else { - SelectObject(hMemDC, lpitem->hCheckBit); - GetObject(lpitem->hCheckBit, sizeof(BITMAP), (LPSTR)&bm); - } - BitBlt(hDC, rect2.left, rect2.top + 1, - bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY); - DeleteDC(hMemDC); - } - else { - if (lpitem->hUnCheckBit != 0) { - hMemDC = CreateCompatibleDC(hDC); - SelectObject(hMemDC, lpitem->hUnCheckBit); - GetObject(lpitem->hUnCheckBit, sizeof(BITMAP), (LPSTR)&bm); - BitBlt(hDC, rect2.left, rect2.top + 1, - bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY); - DeleteDC(hMemDC); - } - } - if ((lpitem->item_flags & MF_BITMAP) == MF_BITMAP) { - hBitMap = (HBITMAP)LOWORD((LONG)lpitem->item_text); - rect2.left += lppop->CheckWidth; - 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); - DeleteDC(hMemDC); - if ((lpitem->item_flags & MF_HILITE) == MF_HILITE) - InvertRect(hDC, &lpitem->rect); - } - if (((lpitem->item_flags & MF_BITMAP) != MF_BITMAP) && - ((lpitem->item_flags & MF_SEPARATOR) != MF_SEPARATOR) && - ((lpitem->item_flags & MF_MENUBREAK) != MF_MENUBREAK)) { - hOldFont = SelectObject(hDC, GetStockObject(SYSTEM_FONT)); - OldBkMode = SetBkMode(hDC, TRANSPARENT); - if ((lpitem->item_flags & MF_DISABLED) == MF_DISABLED) - OldTextColor = SetTextColor(hDC, 0x00C0C0C0L); - else { - if ((lpitem->item_flags & MF_HILITE) == MF_HILITE) - OldTextColor = SetTextColor(hDC, 0x00FFFFFFL); - else - OldTextColor = SetTextColor(hDC, 0x00000000L); - } - CopyRect(&rect3, &lpitem->rect); - if ((lpitem->item_flags & MF_HILITE) == MF_HILITE) - FillRect(hDC, &rect3, GetStockObject(BLACK_BRUSH)); - InflateRect(&rect3, 0, -2); - rect3.left += lppop->CheckWidth; - hOldPen = SelectObject(hDC, GetStockObject(BLACK_PEN)); - if ((x = GetShortCutPos(lpitem->item_text)) != (WORD)-1) { - DrawText(hDC, lpitem->item_text, x, &rect3, - DT_LEFT | DT_VCENTER | DT_SINGLELINE); - DrawText(hDC, &lpitem->item_text[x], -1, &rect3, - DT_RIGHT | DT_VCENTER | DT_SINGLELINE); - } - else - DrawText(hDC, lpitem->item_text, -1, &rect3, - DT_LEFT | DT_VCENTER | DT_SINGLELINE); - SelectObject(hDC, hOldPen); - SetTextColor(hDC, OldTextColor); - SetBkMode(hDC, OldBkMode); - SelectObject(hDC, hOldFont); - CopyRect(&rect2, &lpitem->rect); - } - if ((lpitem->item_flags & MF_POPUP) == MF_POPUP) { - CopyRect(&rect3, &lpitem->rect); - rect3.left = rect3.right - lppop->PopWidth; - hMemDC = CreateCompatibleDC(hDC); - SelectObject(hMemDC, hStdMnArrow); - GetObject(hStdMnArrow, sizeof(BITMAP), (LPSTR)&bm); - BitBlt(hDC, rect3.left, rect3.top + 1, - bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY); - DeleteDC(hMemDC); - } - if (lpitem->next == NULL) goto EndOfPaint; - lpitem = (LPMENUITEM)lpitem->next; + FillRect(hDC, &rect, sysColorObjects.hbrushMenu ); + + lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr); + for (lpitem = lppop->firstItem; lpitem != NULL; lpitem = lpitem->next ) + { + MENU_DrawMenuItem( hDC, lpitem, &rect, FALSE ); } -EndOfPaint: EndPaint( hwnd, &ps ); } - void StdDrawMenuBar(HDC hDC, LPRECT lprect, LPPOPUPMENU lppop, BOOL suppress_draw) { LPMENUITEM lpitem; - HBRUSH hBrush; - HPEN hOldPen; - HDC hMemDC; - RECT rect, rect2, rect3; - HFONT hOldFont; - DWORD OldTextColor; - int OldBkMode; - HBITMAP hBitMap; - BITMAP bm; - UINT i, textwidth; if (lppop == NULL || lprect == NULL) return; #ifdef DEBUG_MENU printf("StdDrawMenuBar(%04X, %08X, %08X); !\n", hDC, lprect, lppop); #endif - MenuBarCalcSize(hDC, lprect, lppop); + if (lppop->Height == 0) MENU_MenuBarCalcSize(hDC, lprect, lppop); if (suppress_draw) return; - hOldFont = SelectObject(hDC, GetStockObject(SYSTEM_FONT)); - hOldPen = SelectObject(hDC, GetStockObject(BLACK_PEN)); - hBrush = GetStockObject(WHITE_BRUSH); - CopyRect(&rect, lprect); - FillRect(hDC, &rect, hBrush); - FrameRect(hDC, &rect, GetStockObject(BLACK_BRUSH)); - if (lppop->nItems == 0) goto EndOfPaint; - lpitem = lppop->firstItem; - if (lpitem == NULL) goto EndOfPaint; - for(i = 0; i < lppop->nItems; i++) { - CopyRect(&rect2, &lpitem->rect); -#ifdef DEBUG_MENU - printf("StdDrawMenuBar // start left=%d\n", rect2.left); -#endif - if ((lpitem->item_flags & MF_CHECKED) == MF_CHECKED) { - hMemDC = CreateCompatibleDC(hDC); - if (lpitem->hCheckBit == 0) { - SelectObject(hMemDC, hStdCheck); - GetObject(hStdCheck, sizeof(BITMAP), (LPSTR)&bm); - } - else { - SelectObject(hMemDC, lpitem->hCheckBit); - GetObject(lpitem->hCheckBit, sizeof(BITMAP), (LPSTR)&bm); - } - BitBlt(hDC, rect2.left, rect2.top + 1, - bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY); - rect2.left += bm.bmWidth; -#ifdef DEBUG_MENU - printf("StdDrawMenuBar // MF_CHECKED bm.bmWidth=%d\n", bm.bmWidth); -#endif - DeleteDC(hMemDC); - } - else { - if (lpitem->hUnCheckBit != 0) { - hMemDC = CreateCompatibleDC(hDC); - SelectObject(hMemDC, lpitem->hUnCheckBit); - GetObject(lpitem->hUnCheckBit, sizeof(BITMAP), (LPSTR)&bm); - BitBlt(hDC, rect2.left, rect2.top + 1, - bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY); - rect2.left += bm.bmWidth; -#ifdef DEBUG_MENU - printf("StdDrawMenuBar // MF_UNCHECKED bm.bmWidth=%d\n", bm.bmWidth); -#endif - DeleteDC(hMemDC); - } - } - if ((lpitem->item_flags & MF_BITMAP) == MF_BITMAP) { - hBitMap = (HBITMAP)LOWORD((LONG)lpitem->item_text); - 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); - DeleteDC(hMemDC); - } - if (((lpitem->item_flags & MF_BITMAP) != MF_BITMAP) && - ((lpitem->item_flags & MF_SEPARATOR) != MF_SEPARATOR) && - ((lpitem->item_flags & MF_MENUBREAK) != MF_MENUBREAK)) { - hOldFont = SelectObject(hDC, GetStockObject(SYSTEM_FONT)); - OldBkMode = SetBkMode(hDC, TRANSPARENT); - if ((lpitem->item_flags & MF_DISABLED) == MF_DISABLED) - OldTextColor = SetTextColor(hDC, 0x00C0C0C0L); - else { - if ((lpitem->item_flags & MF_HILITE) == MF_HILITE) - OldTextColor = SetTextColor(hDC, 0x00FFFFFFL); - else - OldTextColor = SetTextColor(hDC, 0x00000000L); - } - if ((lpitem->item_flags & MF_HILITE) == MF_HILITE) - FillRect(hDC, &rect2, GetStockObject(BLACK_BRUSH)); -#ifdef DEBUG_MENU - printf("StdDrawMenuBar // rect2.left=%d\n", rect2.left); -#endif - DrawText(hDC, lpitem->item_text, -1, &rect2, - DT_LEFT | DT_VCENTER | DT_SINGLELINE); - SetTextColor(hDC, OldTextColor); - SetBkMode(hDC, OldBkMode); - SelectObject(hDC, hOldFont); - } - if (lpitem->next == NULL) goto EndOfPaint; - lpitem = (LPMENUITEM)lpitem->next; - } -EndOfPaint: - SelectObject(hDC, hOldPen); - SelectObject(hDC, hOldFont); + + FillRect(hDC, lprect, sysColorObjects.hbrushMenu ); + SelectObject( hDC, sysColorObjects.hpenWindowFrame ); + MoveTo( hDC, lprect->left, lprect->bottom ); + LineTo( hDC, lprect->right, lprect->bottom ); + + if (lppop->nItems == 0) return; + for (lpitem = lppop->firstItem; lpitem != NULL; lpitem = lpitem->next ) + { + MENU_DrawMenuItem( hDC, lpitem, lprect, TRUE ); + } } @@ -1025,179 +1074,7 @@ LPMENUITEM MenuFindItemBySelKey(LPPOPUPMENU lppop, WORD key, WORD *lpRet) } -void PopupMenuCalcSize(HWND hwnd) -{ - WND *wndPtr; - LPPOPUPMENU lppop; - LPMENUITEM lpitem; - HDC hDC; - RECT rect; - HBITMAP hBitMap; - BITMAP bm; - HFONT hOldFont; - UINT i, OldWidth, TempWidth; - DWORD dwRet; -#ifdef DEBUG_MENUCALC - printf("PopupMenuCalcSize hWnd=%04X !\n", hWnd); -#endif - InitStdBitmaps(); - lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr); - if (lppop == NULL) return; - if (lppop->nItems == 0) return; - hDC = GetDC(hwnd); - lppop->Width = 20; - lppop->CheckWidth = lppop->PopWidth = 0; - hOldFont = SelectObject(hDC, GetStockObject(SYSTEM_FONT)); -CalcAGAIN: - OldWidth = lppop->Width; - SetRect(&rect, 1, 1, OldWidth, 0); - lpitem = lppop->firstItem; - for(i = 0; i < lppop->nItems; i++) { - if (lpitem == NULL) break; -#ifdef DEBUG_MENUCALC - printf("PopupMenuCalcSize item #%d !\n", i); -#endif - rect.right = rect.left + lppop->Width; - if ((lpitem->item_flags & MF_CHECKED) == MF_CHECKED) { - if (lpitem->hCheckBit != 0) - GetObject(lpitem->hCheckBit, sizeof(BITMAP), (LPSTR)&bm); - else - GetObject(hStdCheck, sizeof(BITMAP), (LPSTR)&bm); - lppop->CheckWidth = max(lppop->CheckWidth, bm.bmWidth); - } - else { - if (lpitem->hUnCheckBit != 0) { - GetObject(lpitem->hUnCheckBit, sizeof(BITMAP), (LPSTR)&bm); - lppop->CheckWidth = max(lppop->CheckWidth, bm.bmWidth); - } - } - if ((lpitem->item_flags & MF_POPUP) == MF_POPUP) { - GetObject(hStdMnArrow, sizeof(BITMAP), (LPSTR)&bm); - lppop->PopWidth = max(lppop->PopWidth, bm.bmWidth); - } - if ((lpitem->item_flags & MF_SEPARATOR) == MF_SEPARATOR) { - rect.bottom = rect.top + 3; - } - if ((lpitem->item_flags & MF_BITMAP) == MF_BITMAP) { - hBitMap = (HBITMAP)LOWORD((LONG)lpitem->item_text); - GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&bm); - rect.bottom = rect.top + bm.bmHeight; - lppop->Width = max(lppop->Width, bm.bmWidth); - } - if (((lpitem->item_flags & MF_BITMAP) != MF_BITMAP) && - ((lpitem->item_flags & MF_SEPARATOR) != MF_SEPARATOR) && - ((lpitem->item_flags & MF_MENUBREAK) != MF_MENUBREAK)) { - dwRet = GetTextExtent(hDC, (char *)lpitem->item_text, - strlen((char *)lpitem->item_text)); - rect.bottom = rect.top + HIWORD(dwRet); - InflateRect(&rect, 0, 2); - TempWidth = LOWORD(dwRet); - if (GetShortCutPos(lpitem->item_text) != (WORD)-1) - TempWidth += 15; - TempWidth += lppop->CheckWidth; - TempWidth += lppop->PopWidth; - lppop->Width = max(lppop->Width, TempWidth); - } - CopyRect(&lpitem->rect, &rect); - rect.top = rect.bottom; - lpitem = (LPMENUITEM)lpitem->next; - } - if (OldWidth < lppop->Width) goto CalcAGAIN; - lppop->Height = rect.bottom; - SetRect(&lppop->rect, 1, 1, lppop->Width, lppop->Height); -#ifdef DEBUG_MENUCALC - printf("PopupMenuCalcSize w=%d h=%d !\n", lppop->Width, lppop->Height); -#endif - SelectObject(hDC, hOldFont); - ReleaseDC(hwnd, hDC); -} - - -void MenuBarCalcSize(HDC hDC, LPRECT lprect, LPPOPUPMENU lppop) -{ - LPMENUITEM lpitem; - LPMENUITEM lpitem2; - RECT rect; - HBITMAP hBitMap; - BITMAP bm; - HFONT hOldFont; - UINT i, j; - UINT OldHeight, LineHeight; - DWORD dwRet; - if (lprect == NULL) return; - 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); -#endif - hOldFont = SelectObject(hDC, GetStockObject(SYSTEM_FONT)); - lppop->CheckWidth = 0; - LineHeight = OldHeight = SYSMETRICS_CYMENU + 1; - SetRect(&rect, lprect->left, lprect->top, 0, lprect->top + LineHeight); - lpitem2 = lppop->firstItem; - while (lpitem != NULL) { - lpitem = lpitem2; - while(rect.right < lprect->right) { - if (lpitem == NULL) break; - rect.right = rect.left; - if ((lpitem->item_flags & MF_BITMAP) == MF_BITMAP) { - hBitMap = (HBITMAP)LOWORD((LONG)lpitem->item_text); - GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&bm); - rect.right = rect.left + bm.bmWidth; - LineHeight = max(LineHeight, bm.bmHeight); - } - if (((lpitem->item_flags & MF_BITMAP) != MF_BITMAP) && - ((lpitem->item_flags & MF_SEPARATOR) != MF_SEPARATOR) && - ((lpitem->item_flags & MF_MENUBREAK) != MF_MENUBREAK)) { - dwRet = GetTextExtent(hDC, (char *)lpitem->item_text, - strlen((char *)lpitem->item_text)); - rect.right = rect.left + LOWORD(dwRet) + 10; - dwRet = max(SYSMETRICS_CYMENU, (HIWORD(dwRet) + 6)); - LineHeight = max(LineHeight, (WORD)dwRet); - } - if ((lpitem->item_flags & MF_CHECKED) == MF_CHECKED) { - if (lpitem->hCheckBit != 0) - GetObject(lpitem->hCheckBit, sizeof(BITMAP), (LPSTR)&bm); - else - GetObject(hStdCheck, sizeof(BITMAP), (LPSTR)&bm); - rect.right += bm.bmWidth; - LineHeight = max(LineHeight, bm.bmHeight); - } - else { - if (lpitem->hUnCheckBit != 0) { - GetObject(lpitem->hUnCheckBit, sizeof(BITMAP), (LPSTR)&bm); - rect.right += bm.bmWidth; - LineHeight = max(LineHeight, bm.bmHeight); - } - } - CopyRect(&lpitem->rect, &rect); - rect.left = rect.right; - lpitem = (LPMENUITEM)lpitem->next; - } - if (LineHeight == OldHeight) { - lpitem2 = lpitem; - LineHeight = OldHeight = SYSMETRICS_CYMENU + 1; - if (lpitem != NULL) - SetRect(&rect, lprect->left, rect.bottom, - 0, rect.bottom + LineHeight); - } - else { - OldHeight = LineHeight; - SetRect(&rect, lprect->left, rect.top, 0, rect.top + LineHeight); - } - } - lppop->Width = lprect->right - lprect->left; - lppop->Height = rect.bottom - lprect->top; - lprect->bottom = lprect->top + lppop->Height; - CopyRect(&lppop->rect, lprect); -#ifdef DEBUG_MENUCALC - printf("MenuBarCalcSize w=%d h=%d !\n", lppop->Width, lppop->Height); -#endif - SelectObject(hDC, hOldFont); -} @@ -1206,7 +1083,7 @@ void MenuBarCalcSize(HDC hDC, LPRECT lprect, LPPOPUPMENU lppop) * * Compute the size of the menu bar height. Used by NC_HandleNCCalcSize(). */ -WORD MENU_GetMenuBarHeight( HWND hwnd, WORD menubarWidth ) +WORD MENU_GetMenuBarHeight( HWND hwnd, WORD menubarWidth, int orgX, int orgY ) { HDC hdc; RECT rectBar; @@ -1216,8 +1093,8 @@ WORD MENU_GetMenuBarHeight( HWND hwnd, WORD menubarWidth ) if (!(lppop = PopupMenuGetWindowAndStorage( hwnd, &wndPtr ))) return 0; if (!wndPtr) return 0; hdc = GetDC( hwnd ); - SetRect( &rectBar, 0, 0, menubarWidth, SYSMETRICS_CYMENU ); - MenuBarCalcSize( hdc, &rectBar, lppop ); + SetRect( &rectBar, orgX, orgY, orgX+menubarWidth, orgY+SYSMETRICS_CYMENU ); + MENU_MenuBarCalcSize( hdc, &rectBar, lppop ); ReleaseDC( hwnd, hdc ); printf( "MENU_GetMenuBarHeight: returning %d\n", lppop->Height ); return lppop->Height; @@ -1311,7 +1188,7 @@ LPSTR GetShortCutString(LPSTR str) -WORD GetShortCutPos(LPSTR str) +int GetShortCutPos(LPSTR str) { int i; for (i = 0; i < strlen(str); i++) { @@ -1407,22 +1284,26 @@ BOOL CheckMenuItem(HMENU hMenu, WORD wItemID, WORD wFlags) */ BOOL EnableMenuItem(HMENU hMenu, WORD wItemID, WORD wFlags) { - LPMENUITEM lpitem; -#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); + LPMENUITEM lpitem; #ifdef DEBUG_MENU - printf("EnableMenuItem // Found !\n"); + printf("EnableMenuItem (%04X, %04X, %04X) !\n", hMenu, wItemID, wFlags); #endif - return(TRUE); - } - return FALSE; + if (!(lpitem = FindMenuItem(hMenu, wItemID, wFlags))) return FALSE; + + /* We can't have MF_GRAYED and MF_DISABLED together */ + if (wFlags & MF_GRAYED) + { + lpitem->item_flags = (lpitem->item_flags & ~MF_DISABLED) | MF_GRAYED; + } + else if (wFlags & MF_DISABLED) + { + lpitem->item_flags = (lpitem->item_flags & ~MF_GRAYED) | MF_DISABLED; + } + else /* MF_ENABLED */ + { + lpitem->item_flags &= ~(MF_GRAYED | MF_DISABLED); + } + return TRUE; } @@ -1858,7 +1739,8 @@ BOOL TrackPopupMenu(HMENU hMenu, WORD wFlags, short x, short y, lppop->ownerWnd = hWnd; lppop->hWndPrev = GetFocus(); if (lppop->hWnd == (HWND)NULL) { - lppop->hWnd = CreateWindow("POPUPMENU", "", WS_POPUP | WS_VISIBLE, + lppop->hWnd = CreateWindow(POPUPMENU_CLASS_NAME, "", + WS_POPUP | WS_BORDER, x, y, lppop->Width, lppop->Height, (HWND)NULL, 0, wndPtr->hInstance, (LPSTR)lppop); if (lppop->hWnd == 0) { @@ -1866,18 +1748,16 @@ BOOL TrackPopupMenu(HMENU hMenu, WORD wFlags, short x, short y, return FALSE; } } - else { - ShowWindow(lppop->hWnd, SW_SHOWNOACTIVATE); - } if (!lppop->BarFlag) { - PopupMenuCalcSize(lppop->hWnd); + MENU_PopupMenuCalcSize(lppop->hWnd); #ifdef DEBUG_MENU printf("TrackPopupMenu // x=%d y=%d Width=%d Height=%d\n", x, y, lppop->Width, lppop->Height); #endif - SetWindowPos(lppop->hWnd, 0, x, y, lppop->Width + 2, lppop->Height, + SetWindowPos(lppop->hWnd, 0, x, y, lppop->Width + 2, lppop->Height + 2, SWP_NOACTIVATE | SWP_NOZORDER); } + ShowWindow(lppop->hWnd, SW_SHOWNOACTIVATE); SetFocus(lppop->hWnd); if (!MenuHasFocus) { #ifdef DEBUG_MENU @@ -2041,10 +1921,8 @@ void NC_TrackSysMenu(HWND hWnd) */ DWORD GetMenuCheckMarkDimensions() { - BITMAP bm; - InitStdBitmaps(); - GetObject(hStdCheck, sizeof(BITMAP), (LPSTR)&bm); - return MAKELONG(bm.bmWidth, bm.bmHeight); + InitStdBitmaps(); + return MAKELONG( check_bitmap_width, check_bitmap_height ); } @@ -2230,27 +2108,21 @@ BOOL SetMenu(HWND hWnd, HMENU hMenu) printf("SetMenu(%04X, %04X);\n", hWnd, hMenu); #endif if (GetCapture() == hWnd) ReleaseCapture(); - if (wndPtr->window != 0) { - flags = SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED; -/* if (!IsWindowVisible(hWnd)) flags |= SWP_NOREDRAW; */ - flags |= SWP_NOREDRAW; - if (hMenu == 0) { - wndPtr->wIDmenu = hMenu; - printf("SetMenu(%04X, %04X) // Menu removed, need NC recalc!\n", hWnd, hMenu); - SetWindowPos(hWnd, 0, 0, 0, 0, 0, flags); - return TRUE; - } - wndPtr->wIDmenu = hMenu; - SetWindowPos(hWnd, 0, 0, 0, 0, 0, flags); - } - lpmenu = (LPPOPUPMENU) GlobalLock(hMenu); - if (lpmenu == NULL) { + wndPtr->wIDmenu = hMenu; + if (hMenu != 0) + { + lpmenu = (LPPOPUPMENU) GlobalLock(hMenu); + if (lpmenu == NULL) { printf("SetMenu(%04X, %04X) // Bad menu handle !\n", hWnd, hMenu); return FALSE; } - lpmenu->ownerWnd = hWnd; - ResetHiliteFlags(lpmenu); - GlobalUnlock(hMenu); + lpmenu->ownerWnd = hWnd; + lpmenu->Height = 0; /* Make sure we recalculate the size */ + ResetHiliteFlags(lpmenu); + GlobalUnlock(hMenu); + } + SetWindowPos( hWnd, 0, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | + SWP_NOACTIVATE | SWP_NOZORDER | SWP_FRAMECHANGED ); return TRUE; } @@ -2296,7 +2168,6 @@ void DrawMenuBar(HWND hWnd) { WND *wndPtr; LPPOPUPMENU lppop; - HDC hDC; #ifdef DEBUG_MENU printf("DrawMenuBar (%04X)\n", hWnd); #endif @@ -2308,27 +2179,12 @@ void DrawMenuBar(HWND hWnd) #endif lppop = (LPPOPUPMENU) GlobalLock(wndPtr->wIDmenu); if (lppop == NULL) return; - if (lppop->Height != 0) { - int oldHeight; - oldHeight = lppop->Height; - hDC = GetWindowDC(hWnd); - StdDrawMenuBar(hDC, &lppop->rect, lppop, TRUE); - ReleaseDC(hWnd, hDC); - if (oldHeight != lppop->Height) { - printf("DrawMenuBar // menubar changed oldHeight=%d != lppop->Height=%d\n", - oldHeight, lppop->Height); - /* Reduce ClientRect according to MenuBar height */ - wndPtr->rectClient.top -= oldHeight; - wndPtr->rectClient.top += lppop->Height; - SendMessage(hWnd, WM_NCPAINT, 1, 0L); - } - else - StdDrawMenuBar(hDC, &lppop->rect, lppop, FALSE); - } - else - SendMessage(hWnd, WM_NCPAINT, 1, 0L); + + lppop->Height = 0; /* Make sure we call MENU_MenuBarCalcSize */ + SetWindowPos( hWnd, 0, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | + SWP_NOACTIVATE | SWP_NOZORDER | SWP_FRAMECHANGED ); GlobalUnlock(wndPtr->wIDmenu); - } + } } @@ -2358,10 +2214,21 @@ HMENU LoadMenuIndirect(LPSTR menu_template) */ void InitStdBitmaps() { - if (hStdCheck == (HBITMAP)NULL) - hStdCheck = LoadBitmap((HANDLE)NULL, (LPSTR)OBM_CHECK); - if (hStdMnArrow == (HBITMAP)NULL) - hStdMnArrow = LoadBitmap((HANDLE)NULL, (LPSTR)OBM_MNARROW); + BITMAP bm; + if (hStdCheck == (HBITMAP)NULL) + { + hStdCheck = LoadBitmap((HANDLE)NULL, (LPSTR)OBM_CHECK); + GetObject( hStdCheck, sizeof(BITMAP), (LPSTR)&bm ); + check_bitmap_width = bm.bmWidth; + check_bitmap_height = bm.bmHeight; + } + if (hStdMnArrow == (HBITMAP)NULL) + { + hStdMnArrow = LoadBitmap((HANDLE)NULL, (LPSTR)OBM_MNARROW); + GetObject( hStdMnArrow, sizeof(BITMAP), (LPSTR)&bm ); + arrow_bitmap_width = bm.bmWidth; + arrow_bitmap_height = bm.bmHeight; + } } diff --git a/controls/widgets.c b/controls/widgets.c index 204b65f639d..c6866c696f9 100644 --- a/controls/widgets.c +++ b/controls/widgets.c @@ -37,7 +37,7 @@ static WNDCLASS WIDGETS_BuiltinClasses[] = { CS_GLOBALCLASS, (LONG(*)())EditWndProc, 0, 4, 0, 0, 0, 0, NULL, "EDIT" }, { CS_GLOBALCLASS | CS_SAVEBITS, (LONG(*)())PopupMenuWndProc, 0, 8, - 0, 0, 0, 0, NULL, "POPUPMENU" }, + 0, 0, 0, 0, NULL, POPUPMENU_CLASS_NAME }, { CS_GLOBALCLASS, (LONG(*)())DesktopWndProc, 0, sizeof(DESKTOPINFO), 0, 0, 0, 0, NULL, DESKTOP_CLASS_NAME }, { CS_GLOBALCLASS, (LONG(*)())DefDlgProc, 0, DLGWINDOWEXTRA, diff --git a/if1632/call.S b/if1632/call.S index 7c42967103e..48f6d759f3b 100644 --- a/if1632/call.S +++ b/if1632/call.S @@ -190,6 +190,7 @@ _CallTo16: * Call entry point */ movw %ax,%ds + movw %ax,%di .byte 0x66 lcall %fs:(%edx) @@ -284,11 +285,16 @@ _CallTo32: /* * Call entry point */ + pushl %edx pushw _IF1632_Saved16_ss pushw _IF1632_Saved16_esp pushl %eax call _DLLRelay + popl %edx + popl %edx + popl %edx + /* * Restore registers, but do not destroy return value. */ @@ -327,6 +333,7 @@ noargs: /* * Last, but not least we need to move the high word from eax to dx */ + pushl %eax popw %dx popw %dx @@ -335,6 +342,99 @@ noargs: lret /********************************************************************** + * CallTo32_16() + * + * This function is same one as CallTo32() except that the high + * word of EAX won't be moved to DX. + */ + .align 4 + .globl _CallTo32_16 +_CallTo32_16: + pushl %ebp + movl %esp,%ebp + + /* + * Save registers. 286 mode does not have fs or gs. + */ + pushw %ds + pushw %es + + /* + * Restore segment registers. + */ + pushl %eax + movw $UDATASEL,%ax + movw %ax,%ds + movw %ax,%es + popl %eax + + /* + * Save old stack save variables, save stack registers, reload + * stack registers. + */ + pushl _IF1632_Saved16_esp + pushl _IF1632_Saved16_ebp + pushw _IF1632_Saved16_ss + + movw %ss,_IF1632_Saved16_ss + movl %esp,_IF1632_Saved16_esp + movl %ebp,_IF1632_Saved16_ebp + + movw _IF1632_Saved32_ss,%ss + movl _IF1632_Saved32_esp,%esp + movl _IF1632_Saved32_ebp,%ebp + + /* + * Call entry point + */ + pushl %edx + pushw _IF1632_Saved16_ss + pushw _IF1632_Saved16_esp + pushl %eax + call _DLLRelay + + popl %edx + popl %edx + popl %edx + + /* + * Restore registers, but do not destroy return value. + */ + movw _IF1632_Saved16_ss,%ss + movl _IF1632_Saved16_esp,%esp + movl _IF1632_Saved16_ebp,%ebp + + popw _IF1632_Saved16_ss + popl _IF1632_Saved16_ebp + popl _IF1632_Saved16_esp + + popw %es + popw %ds + + .align 2,0x90 + leave + /* + * Now we need to ditch the parameter bytes that were left on the + * stack. We do this by effectively popping the number of bytes, + * and the return address, removing the parameters and then putting + * the return address back on the stack. + * Normally this field is filled in by the relevant function in + * the emulation library, since it should know how many bytes to + * expect. + */ + popw %gs:nbytes + cmpw $0,%gs:nbytes + je noargs2 + popw %gs:offset + popw %gs:selector + addw %gs:nbytes,%esp + pushw %gs:selector + pushw %gs:offset +noargs2: + .byte 0x66 + lret + +/********************************************************************** * ReturnFromRegisterFunc() */ .globl _ReturnFromRegisterFunc diff --git a/if1632/kernel.spec b/if1632/kernel.spec index 4cba3a68bb6..663e14e2bf9 100644 --- a/if1632/kernel.spec +++ b/if1632/kernel.spec @@ -7,26 +7,26 @@ length 415 #1 FATALEXIT #2 EXITKERNEL 3 pascal GetVersion() GetVersion() -4 pascal LocalInit(word word word) WIN16_LocalInit(1 2 3) -5 pascal LocalAlloc(word word) WIN16_LocalAlloc(1 2) -6 pascal LocalReAlloc(word word word) WIN16_LocalReAlloc(1 2 3) -7 pascal LocalFree(word) WIN16_LocalFree(1) +4 pascal16 LocalInit(word word word) WIN16_LocalInit(1 2 3) +5 pascal16 LocalAlloc(word word) WIN16_LocalAlloc(1 2) +6 pascal16 LocalReAlloc(word word word) WIN16_LocalReAlloc(1 2 3) +7 pascal16 LocalFree(word) WIN16_LocalFree(1) 8 pascal LocalLock(word) WIN16_LocalLock(1) -9 pascal LocalUnlock(word) WIN16_LocalUnlock(1) +9 pascal16 LocalUnlock(word) WIN16_LocalUnlock(1) 10 pascal LocalSize(word) WIN16_LocalSize(1) -11 pascal LocalHandle(word) ReturnArg(1) -12 pascal LocalFlags(word) WIN16_LocalFlags(1) -13 pascal LocalCompact(word) WIN16_LocalCompact(1) +11 pascal16 LocalHandle(word) ReturnArg(1) +12 pascal16 LocalFlags(word) WIN16_LocalFlags(1) +13 pascal16 LocalCompact(word) WIN16_LocalCompact(1) 14 return LocalNotify 4 0 -15 pascal GlobalAlloc(word long) WIN16_GlobalAlloc(1 2) -16 pascal GlobalReAlloc(word long word) GlobalReAlloc(1 2 3) -17 pascal GlobalFree(word) GlobalFree(1) +15 pascal16 GlobalAlloc(word long) WIN16_GlobalAlloc(1 2) +16 pascal16 GlobalReAlloc(word long word) GlobalReAlloc(1 2 3) +17 pascal16 GlobalFree(word) GlobalFree(1) 18 pascal GlobalLock(word) GlobalLock(1) -19 pascal GlobalUnlock(word) GlobalUnlock(1) +19 pascal16 GlobalUnlock(word) GlobalUnlock(1) 20 pascal GlobalSize(word) GlobalSize(1) 21 pascal GlobalHandle(word) GlobalHandle(1) -22 pascal GlobalFlags(word) GlobalFlags(1) -23 pascal LockSegment(s_word) KERNEL_LockSegment(1) +22 pascal16 GlobalFlags(word) GlobalFlags(1) +23 pascal16 LockSegment(s_word) KERNEL_LockSegment(1) 24 pascal UnlockSegment(s_word) KERNEL_UnlockSegment(1) 25 pascal GlobalCompact(long) GlobalCompact(1) #26 GLOBALFREEALL @@ -38,66 +38,66 @@ length 415 #33 LOCKCURRENTTASK 34 pascal SetTaskQueue(word word) SetTaskQueue(1 2) 35 pascal GetTaskQueue(word) GetTaskQueue(1) -36 pascal GetCurrentTask() GetCurrentTask() -37 pascal GetCurrentPDB() GetCurrentPDB() +36 pascal16 GetCurrentTask() GetCurrentTask() +37 pascal16 GetCurrentPDB() GetCurrentPDB() #38 SETTASKSIGNALPROC #41 ENABLEDOS #42 DISABLEDOS -45 pascal LoadModule(ptr ptr) LoadModule(1 2) -46 pascal FreeModule(word) FreeLibrary(1) -47 pascal GetModuleHandle(ptr) GetModuleHandle(1) -48 pascal GetModuleUsage(word) GetModuleUsage(1) -49 pascal GetModuleFileName(word ptr s_word) GetModuleFileName(1 2 3) +45 pascal16 LoadModule(ptr ptr) LoadModule(1 2) +46 pascal16 FreeModule(word) FreeLibrary(1) +47 pascal16 GetModuleHandle(ptr) GetModuleHandle(1) +48 pascal16 GetModuleUsage(word) GetModuleUsage(1) +49 pascal16 GetModuleFileName(word ptr s_word) GetModuleFileName(1 2 3) 50 pascal GetProcAddress(word ptr) GetProcAddress(1 2) 51 pascal MakeProcInstance(ptr word) CALLBACK_MakeProcInstance(1 2) 52 pascal FreeProcInstance(ptr) FreeProcInstance(1) #53 CALLPROCINSTANCE -#54 GETINSTANCEDATA -55 pascal Catch(ptr) Catch (1) +#54 pascal16 GETINSTANCEDATA +55 pascal16 Catch(ptr) Catch (1) 56 pascal Throw(ptr word) Throw(1 2) -57 pascal GetProfileInt(ptr ptr word) GetProfileInt(1 2 3) -58 pascal GetProfileString(ptr ptr ptr ptr word) GetProfileString(1 2 3 4 5) -59 pascal WriteProfileString(ptr ptr ptr) WriteProfileString(1 2 3) -60 pascal FindResource(word ptr ptr) FindResource(1 2 3) -61 pascal LoadResource(word word) LoadResource(1 2) +57 pascal16 GetProfileInt(ptr ptr word) GetProfileInt(1 2 3) +58 pascal16 GetProfileString(ptr ptr ptr ptr word) GetProfileString(1 2 3 4 5) +59 pascal16 WriteProfileString(ptr ptr ptr) WriteProfileString(1 2 3) +60 pascal16 FindResource(word ptr ptr) FindResource(1 2 3) +61 pascal16 LoadResource(word word) LoadResource(1 2) 62 pascal LockResource(word) LockResource(1) -63 pascal FreeResource(word) FreeResource(1) -64 pascal AccessResource(word word) AccessResource(1 2) +63 pascal16 FreeResource(word) FreeResource(1) +64 pascal16 AccessResource(word word) AccessResource(1 2) 65 pascal SizeofResource(word word) SizeofResource(1 2) -66 pascal AllocResource(word word long) AllocResource(1 2 3) +66 pascal16 AllocResource(word word long) AllocResource(1 2 3) #67 SETRESOURCEHANDLER -68 pascal InitAtomTable(word) InitAtomTable(1) -69 pascal FindAtom(ptr) FindAtom(1) -70 pascal AddAtom(ptr) AddAtom(1) -71 pascal DeleteAtom(word) DeleteAtom(1) -72 pascal GetAtomName(word ptr word) GetAtomName(1 2 3) -73 pascal GetAtomHandle(word) GetAtomHandle(1) -74 pascal OpenFile(ptr ptr word) OpenFile(1 2 3) +68 pascal16 InitAtomTable(word) InitAtomTable(1) +69 pascal16 FindAtom(ptr) FindAtom(1) +70 pascal16 AddAtom(ptr) AddAtom(1) +71 pascal16 DeleteAtom(word) DeleteAtom(1) +72 pascal16 GetAtomName(word ptr word) GetAtomName(1 2 3) +73 pascal16 GetAtomHandle(word) GetAtomHandle(1) +74 pascal16 OpenFile(ptr ptr word) OpenFile(1 2 3) #75 OPENPATHNAME #76 DELETEPATHNAME #77 RESERVED1 #78 RESERVED2 #79 RESERVED3 #80 RESERVED4 -81 pascal _lclose(word) _lclose(1) -82 pascal _lread(word ptr word) _lread(1 2 3) -83 pascal _lcreat(ptr word) _lcreat(1 2) +81 pascal16 _lclose(word) _lclose(1) +82 pascal16 _lread(word ptr word) _lread(1 2 3) +83 pascal16 _lcreat(ptr word) _lcreat(1 2) 84 pascal _llseek(word long word) _llseek(1 2 3) -85 pascal _lopen(ptr word) _lopen(1 2) -86 pascal _lwrite(word ptr word) _lwrite(1 2 3) +85 pascal16 _lopen(ptr word) _lopen(1 2) +86 pascal16 _lwrite(word ptr word) _lwrite(1 2 3) #87 RESERVED5 88 pascal lstrcpy(ptr ptr) lstrcpy(1 2) 89 pascal lstrcat(ptr ptr) lstrcat(1 2) -90 pascal lstrlen(ptr) lstrlen(1) +90 pascal16 lstrlen(ptr) lstrlen(1) 91 register InitTask(word word word word word word word word word word) KERNEL_InitTask() -92 pascal GetTempDrive(byte) GetTempDrive(1) -#93 GETCODEHANDLE +92 pascal16 GetTempDrive(byte) GetTempDrive(1) +#93 pascal16 GETCODEHANDLE #94 DEFINEHANDLETABLE -95 pascal LoadLibrary(ptr) LoadLibrary(1) -96 pascal FreeLibrary(word) FreeLibrary(1) -97 pascal GetTempFileName(byte ptr word ptr) GetTempFileName(1 2 3 4) +95 pascal16 LoadLibrary(ptr) LoadLibrary(1) +96 pascal16 FreeLibrary(word) FreeLibrary(1) +97 pascal16 GetTempFileName(byte ptr word ptr) GetTempFileName(1 2 3 4) #98 GETLASTDISKCHANGE #99 GETLPERRMODE #100 VALIDATECODESEGMENTS @@ -114,9 +114,9 @@ length 415 #109 SWITCHSTACKBACK #110 PATCHCODEHANDLE 111 pascal GlobalWire(word) GlobalLock(1) -112 pascal GlobalUnWire(word) GlobalUnlock(1) -#113 __AHSHIFT -#114 __AHINCR +112 pascal16 GlobalUnWire(word) GlobalUnlock(1) +113 equate __AHSHIFT 3 +114 equate __AHINCR 8 115 pascal OutputDebugString(ptr) OutputDebugString(1) #116 INITLIB 117 return OldYield 0 0 @@ -129,19 +129,19 @@ length 415 #124 ENABLEKERNEL #125 DISABLEKERNEL #126 MEMORYFREED -127 pascal GetPrivateProfileInt(ptr ptr s_word ptr) - GetPrivateProfileInt(1 2 3 4) -128 pascal GetPrivateProfileString(ptr ptr ptr ptr s_word ptr) - GetPrivateProfileString(1 2 3 4 5 6) -129 pascal WritePrivateProfileString(ptr ptr ptr ptr) - WritePrivateProfileString(1 2 3 4) +127 pascal16 GetPrivateProfileInt(ptr ptr s_word ptr) + GetPrivateProfileInt(1 2 3 4) +128 pascal16 GetPrivateProfileString(ptr ptr ptr ptr s_word ptr) + GetPrivateProfileString(1 2 3 4 5 6) +129 pascal16 WritePrivateProfileString(ptr ptr ptr ptr) + WritePrivateProfileString(1 2 3 4) #130 FILECBR 131 pascal GetDOSEnvironment() GetDOSEnvironment() 132 pascal GetWinFlags() GetWinFlags() #133 GETEXEPTR -134 pascal GetWindowsDirectory(ptr word) GetWindowsDirectory(1 2) -135 pascal GetSystemDirectory(ptr word) GetSystemDirectory(1 2) -136 pascal GetDriveType(byte) GetDriveType(1) +134 pascal16 GetWindowsDirectory(ptr word) GetWindowsDirectory(1 2) +135 pascal16 GetSystemDirectory(ptr word) GetSystemDirectory(1 2) +136 pascal16 GetDriveType(byte) GetDriveType(1) 137 pascal FatalAppExit(word ptr) FatalAppExit(1 2) #138 GETHEAPSPACES - This is not correct but may fake out most apps 138 return GetHeapSpaces 2 0x80004000 @@ -150,7 +150,7 @@ length 415 #141 INITTASK1 150 return DirectedYield 2 0 #151 WINOLDAPCALL -152 pascal GetNumTasks() GetNumTasks() +152 pascal16 GetNumTasks() GetNumTasks() 154 return GlobalNotify 4 0 #155 GETTASKDS #156 LIMITEMSPAGES @@ -160,10 +160,10 @@ length 415 #160 EMSCOPY #161 LOCALCOUNTFREE #162 LOCALHEAPSIZE -163 pascal GlobalLRUOldest(word) ReturnArg(1) -164 pascal GlobalLRUNewest(word) ReturnArg(1) +163 pascal16 GlobalLRUOldest(word) ReturnArg(1) +164 pascal16 GlobalLRUNewest(word) ReturnArg(1) #165 A20PROC -166 pascal WinExec(ptr word) WinExec(1 2) +166 pascal16 WinExec(ptr word) WinExec(1 2) #167 GETEXPWINVER #168 DIRECTRESALLOC 169 pascal GetFreeSpace(word) GetFreeSpace(1) @@ -172,9 +172,9 @@ length 415 #172 ALLOCALIAS #173 __ROMBIOS #174 __A000H -175 pascal AllocSelector(word) AllocSelector(1) -176 pascal FreeSelector(word) FreeSelector(1) -177 pascal PrestoChangoSelector(word word) PrestoChangoSelector(1 2) +175 pascal16 AllocSelector(word) AllocSelector(1) +176 pascal16 FreeSelector(word) FreeSelector(1) +177 pascal16 PrestoChangoSelector(word word) PrestoChangoSelector(1 2) 178 equate __WINFLAGS 0x413 #179 __D000H #180 LONGPTRADD @@ -183,10 +183,10 @@ length 415 #183 __0000H 184 return GlobalDOSAlloc 4 0 185 return GlobalDOSFree 2 0 -186 pascal GetSelectorBase(word) GetSelectorBase(1) -187 pascal SetSelectorBase(word long) SetSelectorBase(1 2) +186 pascal16 GetSelectorBase(word) GetSelectorBase(1) +187 pascal16 SetSelectorBase(word long) SetSelectorBase(1 2) 188 pascal GetSelectorLimit(word) GetSelectorLimit(1) -189 pascal SetSelectorLimit(word long) SetSelectorLimit(1 2) +189 pascal16 SetSelectorLimit(word long) SetSelectorLimit(1 2) #190 __E000H 191 pascal GlobalPageLock(word) GlobalLock(1) 192 pascal GlobalPageUnlock(word) GlobalUnlock(1) @@ -196,7 +196,7 @@ length 415 #196 SELECTORACCESSRIGHTS 197 pascal GlobalFix(word) GlobalLock(1) 198 pascal GlobalUnfix(word) GlobalUnlock(1) -199 pascal SetHandleCount(word) SetHandleCount(1) +199 pascal16 SetHandleCount(word) SetHandleCount(1) #200 VALIDATEFREESPACES #201 REPLACEINST #202 REGISTERPTRACE @@ -236,8 +236,8 @@ length 415 #346 ISBADHUGEREADPTR #347 ISBADHUGEWRITEPTR 348 pascal hmemcpy(ptr ptr long) hmemcpy(1 2 3) -349 pascal _hread(word ptr long) _hread(1 2 3) -350 pascal _hwrite(word ptr long) _hwrite(1 2 3) +349 pascal16 _hread(word ptr long) _hread(1 2 3) +350 pascal16 _hwrite(word ptr long) _hwrite(1 2 3) #351 BUNNY_351 353 pascal lstrcpyn(ptr ptr word) lstrcpyn(1 2 3) #354 GETAPPCOMPATFLAGS diff --git a/if1632/user.spec b/if1632/user.spec index edb86b9f723..a8e55975832 100644 --- a/if1632/user.spec +++ b/if1632/user.spec @@ -178,7 +178,7 @@ length 540 173 pascal LoadCursor(word ptr) LoadCursor(1 2) 174 pascal LoadIcon(word ptr) LoadIcon(1 2) 175 pascal LoadBitmap(word ptr) LoadBitmap(1 2) -176 pascal LoadString(word word ptr s_word) LoadString(1 2 3 4) +176 pascal16 LoadString(word word ptr s_word) LoadString(1 2 3 4) 177 pascal LoadAccelerators(word ptr) LoadAccelerators(1 2) 178 pascal TranslateAccelerator(word word ptr) TranslateAccelerator(1 2 3) 179 pascal GetSystemMetrics(word) GetSystemMetrics(1) @@ -228,9 +228,9 @@ length 540 220 pascal LoadMenuIndirect(ptr) LoadMenuIndirect(1) 221 pascal ScrollDC(word s_word s_word ptr ptr word ptr) ScrollDC(1 2 3 4 5 6 7) -222 pascal GetKeyboardState(ptr) GetKeyboardState(1) +222 pascal16 GetKeyboardState(ptr) GetKeyboardState(1) #223 SETKEYBOARDSTATE -224 pascal GetWindowTask(word) GetWindowTask(1) +224 pascal16 GetWindowTask(word) GetWindowTask(1) 225 pascal EnumTaskWindows(word ptr long) EnumTaskWindows(1 2 3) #226 LOCKINPUT 227 pascal GetNextDlgGroupItem(word word word) GetNextDlgGroupItem(1 2 3) @@ -294,7 +294,7 @@ length 540 281 pascal GetSysColorBrush(word) GetSysColorBrush(1) 282 pascal SelectPalette(word word word) SelectPalette(1 2 3) 283 pascal RealizePalette(word) RealizePalette(1) -284 pascal GetFreeSystemResources(word) GetFreeSystemResources(1) +284 pascal16 GetFreeSystemResources(word) GetFreeSystemResources(1) #285 BEAR285 286 pascal GetDesktopWindow() GetDesktopWindow() #287 GETLASTACTIVEPOPUP @@ -366,15 +366,15 @@ length 540 421 pascal wvsprintf(ptr ptr ptr) wvsprintf(1 2 3) #422 DLGDIRSELECTEX #423 DLGDIRSELECTCOMBOBOXEX -430 pascal lstrcmp(ptr ptr) lstrcmp(1 2) +430 pascal16 lstrcmp(ptr ptr) lstrcmp(1 2) 431 pascal AnsiUpper(ptr) AnsiUpper(1) 432 pascal AnsiLower(ptr) AnsiLower(1) -433 pascal IsCharAlpha(byte) IsCharAlpha(1) -434 pascal IsCharAlphanumeric(byte) IsCharAlphanumeric(1) -435 pascal IsCharUpper(byte) IsCharUpper(1) -436 pascal IsCharLower(byte) IsCharLower(1) -437 pascal AnsiUpperBuff(ptr word) AnsiUpperBuff(1 2) -438 pascal AnsiLowerBuff(ptr word) AnsiLowerBuff(1 2) +433 pascal16 IsCharAlpha(byte) IsCharAlpha(1) +434 pascal16 IsCharAlphanumeric(byte) IsCharAlphanumeric(1) +435 pascal16 IsCharUpper(byte) IsCharUpper(1) +436 pascal16 IsCharLower(byte) IsCharLower(1) +437 pascal16 AnsiUpperBuff(ptr word) AnsiUpperBuff(1 2) +438 pascal16 AnsiLowerBuff(ptr word) AnsiLowerBuff(1 2) 445 pascal DefFrameProc(word word word word long) DefFrameProc(1 2 3 4 5) 447 pascal DefMDIChildProc(word word word long) DefMDIChildProc(1 2 3 4) 451 pascal TranslateMDISysAccel(word ptr) TranslateMDISysAccel(1 2) @@ -395,7 +395,7 @@ length 540 #465 DRAGDETECT 466 pascal DrawFocusRect(word ptr) DrawFocusRect(1 2) #470 STRINGFUNC -471 pascal lstrcmpi(ptr ptr) lstrcmpi(1 2) +471 pascal16 lstrcmpi(ptr ptr) lstrcmpi(1 2) 472 pascal AnsiNext(ptr) AnsiNext(1 ) 473 pascal AnsiPrev(ptr ptr) AnsiPrev(1 2) #480 GETUSERLOCALOBJTYPE @@ -415,13 +415,13 @@ length 540 #509 WNETUNWATCHQUEUE #510 WNETLOCKQUEUEDATA #511 WNETUNLOCKQUEUEDATA -512 pascal WNetGetConnection(ptr ptr ptr) WNetGetConnection(1 2 3) +512 pascal16 WNetGetConnection(ptr ptr ptr) WNetGetConnection(1 2 3) 513 pascal WNetGetCaps(word) WNetGetCaps(1) #514 WNETDEVICEMODE #515 WNETBROWSEDIALOG 516 pascal WNetGetUser(ptr ptr ptr) WNetGetUser(1 2 3) -517 pascal WNetAddConnection(ptr ptr ptr) WNetAddConnection(1 2 3) -518 pascal WNetCancelConnection(ptr word) WNetCancelConnection(1 2) +517 pascal16 WNetAddConnection(ptr ptr ptr) WNetAddConnection(1 2 3) +518 pascal16 WNetCancelConnection(ptr word) WNetCancelConnection(1 2) #519 WNETGETERROR #520 WNETGETERRORTEXT #521 WNETENABLE diff --git a/include/syscolor.h b/include/syscolor.h index 9bd12d546b6..70014487cf2 100644 --- a/include/syscolor.h +++ b/include/syscolor.h @@ -15,7 +15,7 @@ struct SysColorObjects /* COLOR_BACKGROUND */ HBRUSH hbrushActiveCaption; /* COLOR_ACTIVECAPTION */ HBRUSH hbrushInactiveCaption; /* COLOR_INACTIVECAPTION */ - /* COLOR_MENU */ + HBRUSH hbrushMenu; /* COLOR_MENU */ HBRUSH hbrushWindow; /* COLOR_WINDOW */ HPEN hpenWindowFrame; /* COLOR_WINDOWFRAME */ /* COLOR_MENUTEXT */ @@ -24,7 +24,7 @@ struct SysColorObjects HBRUSH hbrushActiveBorder; /* COLOR_ACTIVEBORDER */ HBRUSH hbrushInactiveBorder; /* COLOR_INACTIVEBORDER */ /* COLOR_APPWORKSPACE */ - /* COLOR_HIGHLIGHT */ + HBRUSH hbrushHighlight; /* COLOR_HIGHLIGHT */ /* COLOR_HIGHLIGHTTEXT */ HBRUSH hbrushBtnFace; /* COLOR_BTNFACE */ HBRUSH hbrushBtnShadow; /* COLOR_BTNSHADOW */ diff --git a/loader/signal.c b/loader/signal.c index c0c52fb0f3c..9b8e851e148 100644 --- a/loader/signal.c +++ b/loader/signal.c @@ -7,6 +7,7 @@ #if defined(__NetBSD__) || defined(__FreeBSD__) #include +#include #else #include #endif @@ -20,13 +21,14 @@ #include "prototypes.h" #include "win.h" +#if !defined(BSD4_4) || defined(linux) char * cstack[4096]; +#endif struct sigaction segv_act; #ifdef linux extern void ___sig_restore(); extern void ___masksig_restore(); -#endif /* Similar to the sigaction function in libc, except it leaves alone the restorer field */ @@ -41,6 +43,7 @@ wine_sigaction(int sig,struct sigaction * new, struct sigaction * old) errno = -sig; return -1; } +#endif int do_int(int intnum, struct sigcontext_struct *scp) { @@ -111,7 +114,7 @@ static void win_fault(int signal, int code, struct sigcontext *scp) #endif #if defined(__NetBSD__) || defined(__FreeBSD__) /* set_es(0x27); set_ds(0x27); */ - if(signal != SIGBUS) + if(signal != SIGBUS && signal != SIGSEGV && signal != SIGTRAP) exit(1); if(scp->sc_cs == 0x1f) { @@ -181,7 +184,7 @@ static void win_fault(int signal, int code, struct sigcontext *scp) XUngrabServer(display); XFlush(display); fprintf(stderr,"In win_fault %x:%x\n", scp->sc_cs, scp->sc_eip); -#ifdef linux +#if defined(linux) || defined(__NetBSD__) wine_debug(signal, scp); /* Enter our debugger */ #else fprintf(stderr,"Stack: %x:%x\n", scp->sc_ss, scp->sc_esp); @@ -213,8 +216,23 @@ int init_wine_signals(void) wine_sigaction(SIGTRAP, &segv_act, NULL); /* For breakpoints */ #endif #if defined(__NetBSD__) || defined(__FreeBSD__) - struct sigstack ss; sigset_t sig_mask; +#ifdef BSD4_4 + struct sigaltstack ss; + + if ((ss.ss_base = malloc(MINSIGSTKSZ)) == NULL) { + fprintf(stderr, "Unable to allocate signal stack (%d bytes)\n", + MINSIGSTKSZ); + exit(1); + } + ss.ss_size = MINSIGSTKSZ; + ss.ss_flags = 0; + if (sigaltstack(&ss, NULL) < 0) { + perror("sigstack"); + exit(1); + } +#else + struct sigstack ss; ss.ss_sp = (char *) (((unsigned int)(cstack) + sizeof(cstack) - 4) & ~3); ss.ss_onstack = 0; @@ -222,12 +240,27 @@ int init_wine_signals(void) perror("sigstack"); exit(1); } +#endif sigemptyset(&sig_mask); - segv_act.sa_handler = (__sighandler_t) win_fault; + segv_act.sa_handler = (void (*)) win_fault; segv_act.sa_flags = SA_ONSTACK; segv_act.sa_mask = sig_mask; if (sigaction(SIGBUS, &segv_act, NULL) < 0) { - perror("sigaction"); + perror("sigaction: SIGBUS"); + exit(1); + } + segv_act.sa_handler = (void (*)) win_fault; + segv_act.sa_flags = SA_ONSTACK; + segv_act.sa_mask = sig_mask; + if (sigaction(SIGSEGV, &segv_act, NULL) < 0) { + perror("sigaction: SIGSEGV"); + exit(1); + } + segv_act.sa_handler = (void (*)) win_fault; /* For breakpoints */ + segv_act.sa_flags = SA_ONSTACK; + segv_act.sa_mask = sig_mask; + if (sigaction(SIGTRAP, &segv_act, NULL) < 0) { + perror("sigaction: SIGTRAP"); exit(1); } #endif diff --git a/misc/audio.c b/misc/audio.c index dcdee0d10e8..98ab81cb001 100644 --- a/misc/audio.c +++ b/misc/audio.c @@ -16,8 +16,11 @@ static char Copyright[] = "Copyright Martin Ayotte, 1994"; #include #include +#ifdef linux #include +#endif +#ifdef linux #define SOUND_DEV "/dev/dsp" #ifdef SOUND_VERSION @@ -66,6 +69,7 @@ typedef struct { static LINUX_WAVEOUT WOutDev[MAX_WAVOUTDRV]; static LINUX_WAVEIN WInDev[MAX_WAVOUTDRV]; static LINUX_MCIWAVE MCIWavDev[MAX_MCIWAVDRV]; +#endif DWORD WAVE_mciOpen(DWORD dwFlags, LPMCI_WAVE_OPEN_PARMS lpParms); DWORD WAVE_mciClose(UINT wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lpParms); @@ -93,6 +97,7 @@ DWORD wodUnprepare(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize); DWORD WAVE_NotifyClient(UINT wDevID, WORD wMsg, DWORD dwParam1, DWORD dwParam2) { +#ifdef linux if (WInDev[wDevID].wFlags != DCB_NULL && !DriverCallback( WInDev[wDevID].waveDesc.dwCallBack, WInDev[wDevID].wFlags, WInDev[wDevID].waveDesc.hWave, wMsg, @@ -100,6 +105,9 @@ DWORD WAVE_NotifyClient(UINT wDevID, WORD wMsg, printf("WAVE_NotifyClient // can't notify client !\n"); return MMSYSERR_NOERROR; } +#else + return MMSYSERR_NOTENABLED; +#endif } @@ -109,6 +117,7 @@ DWORD WAVE_NotifyClient(UINT wDevID, WORD wMsg, LRESULT WAVE_DriverProc(DWORD dwDevID, HDRVR hDriv, WORD wMsg, DWORD dwParam1, DWORD dwParam2) { +#ifdef linux switch(wMsg) { case DRV_LOAD: return (LRESULT)1L; @@ -159,12 +168,16 @@ LRESULT WAVE_DriverProc(DWORD dwDevID, HDRVR hDriv, WORD wMsg, default: return DefDriverProc(dwDevID, hDriv, wMsg, dwParam1, dwParam2); } +#else + return MMSYSERR_NOTENABLED; +#endif } /************************************************************************** * WAVE_mciOpen */ DWORD WAVE_mciOpen(DWORD dwFlags, LPMCI_WAVE_OPEN_PARMS lpParms) { +#ifdef linux int hFile; UINT wDevID; OFSTRUCT OFstruct; @@ -223,6 +236,9 @@ DWORD WAVE_mciOpen(DWORD dwFlags, LPMCI_WAVE_OPEN_PARMS lpParms) dwRet = wodMessage(0, WODM_OPEN, 0, (DWORD)&WaveDesc, CALLBACK_NULL); dwRet = widMessage(0, WIDM_OPEN, 0, (DWORD)&WaveDesc, CALLBACK_NULL); return 0; +#else + return MMSYSERR_NOTENABLED; +#endif } /************************************************************************** @@ -230,6 +246,7 @@ DWORD WAVE_mciOpen(DWORD dwFlags, LPMCI_WAVE_OPEN_PARMS lpParms) */ DWORD WAVE_mciClose(UINT wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lpParms) { +#ifdef linux DWORD dwRet; #ifdef DEBUG_MCIWAVE printf("WAVE_mciClose(%u, %08X, %08X);\n", wDevID, dwParam, lpParms); @@ -246,6 +263,9 @@ DWORD WAVE_mciClose(UINT wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lpParms) if (dwRet != MMSYSERR_NOERROR) return MCIERR_INTERNAL; } return 0; +#else + return 0; +#endif } @@ -254,6 +274,7 @@ DWORD WAVE_mciClose(UINT wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lpParms) */ DWORD WAVE_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms) { +#ifdef linux int count; int start, end; LPWAVEHDR lpWaveHdr; @@ -323,6 +344,9 @@ DWORD WAVE_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms) MCIWavDev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL); } return 0; +#else + return MMSYSERR_NOTENABLED; +#endif } @@ -331,6 +355,7 @@ DWORD WAVE_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms) */ DWORD WAVE_mciRecord(UINT wDevID, DWORD dwFlags, LPMCI_RECORD_PARMS lpParms) { +#ifdef linux int count; int start, end; LPWAVEHDR lpWaveHdr; @@ -382,6 +407,9 @@ DWORD WAVE_mciRecord(UINT wDevID, DWORD dwFlags, LPMCI_RECORD_PARMS lpParms) MCIWavDev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL); } return 0; +#else + return MMSYSERR_NOTENABLED; +#endif } @@ -390,11 +418,15 @@ DWORD WAVE_mciRecord(UINT wDevID, DWORD dwFlags, LPMCI_RECORD_PARMS lpParms) */ DWORD WAVE_mciStop(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms) { +#ifdef linux #ifdef DEBUG_MCIWAVE printf("WAVE_mciStop(%u, %08X, %08X);\n", wDevID, dwFlags, lpParms); #endif if (lpParms == NULL) return MCIERR_INTERNAL; return 0; +#else + return MCIERR_INTERNAL; +#endif } @@ -403,11 +435,15 @@ DWORD WAVE_mciStop(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms) */ DWORD WAVE_mciPause(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms) { +#ifdef linux #ifdef DEBUG_MCIWAVE printf("WAVE_mciPause(%u, %08X, %08X);\n", wDevID, dwFlags, lpParms); #endif if (lpParms == NULL) return MCIERR_INTERNAL; return 0; +#else + return MCIERR_INTERNAL; +#endif } @@ -416,11 +452,15 @@ DWORD WAVE_mciPause(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms) */ DWORD WAVE_mciResume(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms) { +#ifdef linux #ifdef DEBUG_MCIWAVE printf("WAVE_mciResume(%u, %08X, %08X);\n", wDevID, dwFlags, lpParms); #endif if (lpParms == NULL) return MCIERR_INTERNAL; return 0; +#else + return MCIERR_INTERNAL; +#endif } @@ -429,6 +469,7 @@ DWORD WAVE_mciResume(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms) */ DWORD WAVE_mciSet(UINT wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParms) { +#ifdef linux #ifdef DEBUG_MCIWAVE printf("WAVE_mciSet(%u, %08X, %08X);\n", wDevID, dwFlags, lpParms); #endif @@ -502,6 +543,9 @@ DWORD WAVE_mciSet(UINT wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParms) printf("WAVE_mciSet // MCI_WAVE_SET_SAMPLESPERSEC !\n"); } return 0; +#else + return MCIERR_INTERNAL; +#endif } @@ -510,6 +554,7 @@ DWORD WAVE_mciSet(UINT wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParms) */ DWORD WAVE_mciStatus(UINT wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpParms) { +#ifdef linux #ifdef DEBUG_MCIWAVE printf("WAVE_mciStatus(%u, %08X, %08X);\n", wDevID, dwFlags, lpParms); #endif @@ -601,6 +646,9 @@ DWORD WAVE_mciStatus(UINT wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpParms) MCIWavDev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL); } return 0; +#else + return MCIERR_INTERNAL; +#endif } /************************************************************************** @@ -609,6 +657,7 @@ DWORD WAVE_mciStatus(UINT wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpParms) DWORD WAVE_mciGetDevCaps(UINT wDevID, DWORD dwFlags, LPMCI_GETDEVCAPS_PARMS lpParms) { +#ifdef linux printf("WAVE_mciGetDevCaps(%u, %08X, %08X);\n", wDevID, dwFlags, lpParms); if (lpParms == NULL) return MCIERR_INTERNAL; if (dwFlags & MCI_GETDEVCAPS_ITEM) { @@ -651,6 +700,9 @@ DWORD WAVE_mciGetDevCaps(UINT wDevID, DWORD dwFlags, } } return 0; +#else + return MCIERR_INTERNAL; +#endif } /************************************************************************** @@ -658,6 +710,7 @@ DWORD WAVE_mciGetDevCaps(UINT wDevID, DWORD dwFlags, */ DWORD WAVE_mciInfo(UINT wDevID, DWORD dwFlags, LPMCI_INFO_PARMS lpParms) { +#ifdef linux printf("WAVE_mciInfo(%u, %08X, %08X);\n", wDevID, dwFlags, lpParms); if (lpParms == NULL) return MCIERR_INTERNAL; lpParms->lpstrReturn = NULL; @@ -682,6 +735,9 @@ DWORD WAVE_mciInfo(UINT wDevID, DWORD dwFlags, LPMCI_INFO_PARMS lpParms) else lpParms->dwRetSize = 0; return 0; +#else + return MCIERR_INTERNAL; +#endif } @@ -693,6 +749,7 @@ DWORD WAVE_mciInfo(UINT wDevID, DWORD dwFlags, LPMCI_INFO_PARMS lpParms) */ DWORD wodGetDevCaps(WORD wDevID, LPWAVEOUTCAPS lpCaps, DWORD dwSize) { +#ifdef linux int audio; int smplrate; int samplesize = 16; @@ -739,6 +796,9 @@ DWORD wodGetDevCaps(WORD wDevID, LPWAVEOUTCAPS lpCaps, DWORD dwSize) close(audio); printf("wodGetDevCaps // dwFormats = %08X\n", lpCaps->dwFormats); return MMSYSERR_NOERROR; +#else + return MMSYSERR_NOTENABLED; +#endif } @@ -747,6 +807,7 @@ DWORD wodGetDevCaps(WORD wDevID, LPWAVEOUTCAPS lpCaps, DWORD dwSize) */ DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags) { +#ifdef linux int audio; int abuf_size; int smplrate; @@ -826,6 +887,9 @@ DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags) return MMSYSERR_INVALPARAM; } return MMSYSERR_NOERROR; +#else + return MMSYSERR_NOTENABLED; +#endif } /************************************************************************** @@ -833,6 +897,7 @@ DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags) */ DWORD wodClose(WORD wDevID) { +#ifdef linux printf("wodClose(%u);\n", wDevID); if (WOutDev[wDevID].unixdev == 0) { printf("Linux 'wodClose' // can't close !\n"); @@ -846,6 +911,9 @@ DWORD wodClose(WORD wDevID) return MMSYSERR_INVALPARAM; } return MMSYSERR_NOERROR; +#else + return MMSYSERR_NOTENABLED; +#endif } /************************************************************************** @@ -853,6 +921,7 @@ DWORD wodClose(WORD wDevID) */ DWORD wodWrite(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize) { +#ifdef linux printf("wodWrite(%u, %08X, %08X);\n", wDevID, lpWaveHdr, dwSize); if (WOutDev[wDevID].unixdev == 0) { printf("Linux 'wodWrite' // can't play !\n"); @@ -875,6 +944,9 @@ DWORD wodWrite(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize) return MMSYSERR_INVALPARAM; } return MMSYSERR_NOERROR; +#else + return MMSYSERR_NOTENABLED; +#endif } /************************************************************************** @@ -882,6 +954,7 @@ DWORD wodWrite(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize) */ DWORD wodPrepare(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize) { +#ifdef linux printf("wodPrepare(%u, %08X, %08X);\n", wDevID, lpWaveHdr, dwSize); if (WOutDev[wDevID].unixdev == 0) { printf("Linux 'wodPrepare' // can't prepare !\n"); @@ -897,6 +970,9 @@ DWORD wodPrepare(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize) lpWaveHdr->dwFlags |= WHDR_PREPARED; lpWaveHdr->dwFlags &= ~WHDR_DONE; return MMSYSERR_NOERROR; +#else + return MMSYSERR_NOTENABLED; +#endif } /************************************************************************** @@ -904,12 +980,16 @@ DWORD wodPrepare(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize) */ DWORD wodUnprepare(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize) { +#ifdef linux printf("wodUnprepare(%u, %08X, %08X);\n", wDevID, lpWaveHdr, dwSize); if (WOutDev[wDevID].unixdev == 0) { printf("Linux 'wodUnprepare' // can't unprepare !\n"); return MMSYSERR_NOTENABLED; } return MMSYSERR_NOERROR; +#else + return MMSYSERR_NOTENABLED; +#endif } /************************************************************************** @@ -917,12 +997,16 @@ DWORD wodUnprepare(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize) */ DWORD wodRestart(WORD wDevID) { +#ifdef linux printf("wodRestart(%u);\n", wDevID); if (WOutDev[wDevID].unixdev == 0) { printf("Linux 'wodRestart' // can't restart !\n"); return MMSYSERR_NOTENABLED; } return MMSYSERR_NOERROR; +#else + return MMSYSERR_NOTENABLED; +#endif } /************************************************************************** @@ -930,12 +1014,16 @@ DWORD wodRestart(WORD wDevID) */ DWORD wodReset(WORD wDevID) { +#ifdef linux printf("wodReset(%u);\n", wDevID); if (WOutDev[wDevID].unixdev == 0) { printf("Linux 'wodReset' // can't reset !\n"); return MMSYSERR_NOTENABLED; } return MMSYSERR_NOERROR; +#else + return MMSYSERR_NOTENABLED; +#endif } @@ -944,6 +1032,7 @@ DWORD wodReset(WORD wDevID) */ DWORD wodGetPosition(WORD wDevID, LPMMTIME lpTime, DWORD uSize) { +#ifdef linux int time; printf("wodGetPosition(%u, %08X, %u);\n", wDevID, lpTime, uSize); if (WOutDev[wDevID].unixdev == 0) { @@ -988,6 +1077,9 @@ TryAGAIN: goto TryAGAIN; } return MMSYSERR_NOERROR; +#else + return MMSYSERR_NOTENABLED; +#endif } /************************************************************************** @@ -995,6 +1087,7 @@ TryAGAIN: */ DWORD wodSetVolume(WORD wDevID, DWORD dwParam) { +#ifdef linux int mixer; int volume = 50; printf("wodSetVolume(%u, %08X);\n", wDevID, dwParam); @@ -1012,6 +1105,9 @@ DWORD wodSetVolume(WORD wDevID, DWORD dwParam) } close(mixer); return MMSYSERR_NOERROR; +#else + return MMSYSERR_NOTENABLED; +#endif } @@ -1072,6 +1168,7 @@ DWORD wodMessage(WORD wDevID, WORD wMsg, DWORD dwUser, */ DWORD widGetDevCaps(WORD wDevID, LPWAVEINCAPS lpCaps, DWORD dwSize) { +#ifdef linux int audio; int smplrate; int samplesize = 16; @@ -1117,6 +1214,9 @@ DWORD widGetDevCaps(WORD wDevID, LPWAVEINCAPS lpCaps, DWORD dwSize) close(audio); printf("widGetDevCaps // dwFormats = %08X\n", lpCaps->dwFormats); return MMSYSERR_NOERROR; +#else + return MMSYSERR_NOTENABLED; +#endif } @@ -1125,6 +1225,7 @@ DWORD widGetDevCaps(WORD wDevID, LPWAVEINCAPS lpCaps, DWORD dwSize) */ DWORD widOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags) { +#ifdef linux int audio; int abuf_size; int smplrate; @@ -1209,6 +1310,9 @@ DWORD widOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags) return MMSYSERR_INVALPARAM; } return MMSYSERR_NOERROR; +#else + return MMSYSERR_NOTENABLED; +#endif } /************************************************************************** @@ -1216,6 +1320,7 @@ DWORD widOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags) */ DWORD widClose(WORD wDevID) { +#ifdef linux printf("widClose(%u);\n", wDevID); if (WInDev[wDevID].unixdev == 0) { printf("Linux 'widClose' // can't close !\n"); @@ -1229,6 +1334,9 @@ DWORD widClose(WORD wDevID) return MMSYSERR_INVALPARAM; } return MMSYSERR_NOERROR; +#else + return MMSYSERR_NOTENABLED; +#endif } /************************************************************************** @@ -1236,6 +1344,7 @@ DWORD widClose(WORD wDevID) */ DWORD widAddBuffer(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize) { +#ifdef linux int count = 1; LPWAVEHDR lpWIHdr; printf("widAddBuffer(%u, %08X, %08X);\n", wDevID, lpWaveHdr, dwSize); @@ -1270,6 +1379,9 @@ DWORD widAddBuffer(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize) } printf("widAddBuffer // buffer added ! (now %u in queue)\n", count); return MMSYSERR_NOERROR; +#else + return MMSYSERR_NOTENABLED; +#endif } /************************************************************************** @@ -1277,6 +1389,7 @@ DWORD widAddBuffer(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize) */ DWORD widPrepare(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize) { +#ifdef linux printf("widPrepare(%u, %08X, %08X);\n", wDevID, lpWaveHdr, dwSize); if (WInDev[wDevID].unixdev == 0) { printf("Linux 'widPrepare' // can't prepare !\n"); @@ -1295,6 +1408,9 @@ DWORD widPrepare(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize) lpWaveHdr->dwBytesRecorded = 0; printf("Linux 'widPrepare' // header prepared !\n"); return MMSYSERR_NOERROR; +#else + return MMSYSERR_NOTENABLED; +#endif } /************************************************************************** @@ -1302,6 +1418,7 @@ DWORD widPrepare(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize) */ DWORD widUnprepare(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize) { +#ifdef linux printf("widUnprepare(%u, %08X, %08X);\n", wDevID, lpWaveHdr, dwSize); if (WInDev[wDevID].unixdev == 0) { printf("Linux 'widUnprepare' // can't unprepare !\n"); @@ -1313,6 +1430,9 @@ DWORD widUnprepare(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize) WInDev[wDevID].lpQueueHdr = NULL; printf("Linux 'widUnprepare' // all headers unprepared !\n"); return MMSYSERR_NOERROR; +#else + return MMSYSERR_NOTENABLED; +#endif } /************************************************************************** @@ -1320,6 +1440,7 @@ DWORD widUnprepare(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize) */ DWORD widStart(WORD wDevID) { +#ifdef linux int count = 1; LPWAVEHDR lpWIHdr; printf("widStart(%u);\n", wDevID); @@ -1355,6 +1476,9 @@ DWORD widStart(WORD wDevID) printf("widStart // end of recording !\n"); fflush(stdout); return MMSYSERR_NOERROR; +#else + return MMSYSERR_NOTENABLED; +#endif } /************************************************************************** @@ -1362,12 +1486,16 @@ DWORD widStart(WORD wDevID) */ DWORD widStop(WORD wDevID) { +#ifdef linux printf("widStop(%u);\n", wDevID); if (WInDev[wDevID].unixdev == 0) { printf("Linux 'widStop' // can't stop !\n"); return MMSYSERR_NOTENABLED; } return MMSYSERR_NOERROR; +#else + return MMSYSERR_NOTENABLED; +#endif } /************************************************************************** @@ -1375,12 +1503,16 @@ DWORD widStop(WORD wDevID) */ DWORD widReset(WORD wDevID) { +#ifdef linux printf("widReset(%u);\n", wDevID); if (WInDev[wDevID].unixdev == 0) { printf("Linux 'widReset' // can't reset !\n"); return MMSYSERR_NOTENABLED; } return MMSYSERR_NOERROR; +#else + return MMSYSERR_NOTENABLED; +#endif } /************************************************************************** @@ -1388,6 +1520,7 @@ DWORD widReset(WORD wDevID) */ DWORD widGetPosition(WORD wDevID, LPMMTIME lpTime, DWORD uSize) { +#ifdef linux int time; #ifdef DEBUG_MCIWAVE printf("widGetPosition(%u, %08X, %u);\n", wDevID, lpTime, uSize); @@ -1446,6 +1579,9 @@ TryAGAIN: goto TryAGAIN; } return MMSYSERR_NOERROR; +#else + return MMSYSERR_NOTENABLED; +#endif } /************************************************************************** @@ -1506,5 +1642,4 @@ DWORD modMessage(WORD wDevID, WORD wMsg, DWORD dwUser, return MMSYSERR_NOTENABLED; } - #endif /* !WINELIB */ diff --git a/misc/mcicda.c b/misc/mcicda.c index 3b49cdeeb10..c96fb279cd9 100644 --- a/misc/mcicda.c +++ b/misc/mcicda.c @@ -18,8 +18,10 @@ static char Copyright[] = "Copyright Martin Ayotte, 1994"; #include #include +#ifdef linux #include #include +#endif #define SOUND_DEV "/dev/dsp" #define CDAUDIO_DEV "/dev/sbpcd" @@ -37,6 +39,7 @@ static char Copyright[] = "Copyright Martin Ayotte, 1994"; #define CDFRAMES_PERMIN 4500 #define SECONDS_PERMIN 60 +#ifdef linux typedef struct { int nUseCount; /* Incremented for each shared open */ BOOL fShareable; /* TRUE if first open was shareable */ @@ -57,6 +60,7 @@ typedef struct { } LINUX_CDAUDIO; static LINUX_CDAUDIO CDADev[MAX_CDAUDIODRV]; +#endif UINT CDAUDIO_GetNumberOfTracks(UINT wDevID); BOOL CDAUDIO_GetTracksInfo(UINT wDevID); @@ -72,6 +76,7 @@ DWORD CDAUDIO_CalcTime(UINT wDevID, DWORD dwFormatType, DWORD dwFrame); */ DWORD CDAUDIO_mciOpen(DWORD dwFlags, LPMCI_OPEN_PARMS lpParms) { +#ifdef linux UINT wDevID; int cdrom; #ifdef DEBUG_CDAUDIO @@ -121,6 +126,9 @@ DWORD CDAUDIO_mciOpen(DWORD dwFlags, LPMCI_OPEN_PARMS lpParms) CDADev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL); } return 0; +#else + return MCIERR_HARDWARE; +#endif } /************************************************************************** @@ -128,12 +136,14 @@ DWORD CDAUDIO_mciOpen(DWORD dwFlags, LPMCI_OPEN_PARMS lpParms) */ DWORD CDAUDIO_mciClose(UINT wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lpParms) { +#ifdef linux #ifdef DEBUG_CDAUDIO printf("CDAUDIO_mciClose(%u, %08X, %08X);\n", wDevID, dwParam, lpParms); #endif if (CDADev[wDevID].lpdwTrackLen != NULL) free(CDADev[wDevID].lpdwTrackLen); if (CDADev[wDevID].lpdwTrackPos != NULL) free(CDADev[wDevID].lpdwTrackPos); close(CDADev[wDevID].unixdev); +#endif } /************************************************************************** @@ -142,6 +152,7 @@ DWORD CDAUDIO_mciClose(UINT wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lpParms) DWORD CDAUDIO_mciGetDevCaps(UINT wDevID, DWORD dwFlags, LPMCI_GETDEVCAPS_PARMS lpParms) { +#ifdef linux #ifdef DEBUG_CDAUDIO printf("CDAUDIO_mciGetDevCaps(%u, %08X, %08X);\n", wDevID, dwFlags, lpParms); #endif @@ -183,6 +194,9 @@ DWORD CDAUDIO_mciGetDevCaps(UINT wDevID, DWORD dwFlags, } printf("CDAUDIO_mciGetDevCaps // lpParms->dwReturn=%08X);\n", lpParms->dwReturn); return 0; +#else + return MCIERR_INTERNAL; +#endif } /************************************************************************** @@ -190,6 +204,7 @@ DWORD CDAUDIO_mciGetDevCaps(UINT wDevID, DWORD dwFlags, */ DWORD CDAUDIO_mciInfo(UINT wDevID, DWORD dwFlags, LPMCI_INFO_PARMS lpParms) { +#ifdef linux #ifdef DEBUG_CDAUDIO printf("CDAUDIO_mciInfo(%u, %08X, %08X);\n", wDevID, dwFlags, lpParms); #endif @@ -207,6 +222,9 @@ DWORD CDAUDIO_mciInfo(UINT wDevID, DWORD dwFlags, LPMCI_INFO_PARMS lpParms) else lpParms->dwRetSize = 0; return 0; +#else + return MCIERR_INTERNAL; +#endif } /************************************************************************** @@ -214,6 +232,7 @@ DWORD CDAUDIO_mciInfo(UINT wDevID, DWORD dwFlags, LPMCI_INFO_PARMS lpParms) */ DWORD CDAUDIO_mciStatus(UINT wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpParms) { +#ifdef linux #ifdef DEBUG_CDAUDIO printf("CDAUDIO_mciStatus(%u, %08X, %08X);\n", wDevID, dwFlags, lpParms); #endif @@ -315,6 +334,9 @@ DWORD CDAUDIO_mciStatus(UINT wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpParms) } printf("CDAUDIO_mciStatus // not MCI_STATUS_ITEM !\n"); return 0; +#else + return MMSYSERR_NOTENABLED; +#endif } @@ -324,6 +346,7 @@ DWORD CDAUDIO_mciStatus(UINT wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpParms) DWORD CDAUDIO_CalcTime(UINT wDevID, DWORD dwFormatType, DWORD dwFrame) { DWORD dwTime = 0; +#ifdef linux UINT wTrack; UINT wMinutes; UINT wSeconds; @@ -372,6 +395,7 @@ TryAGAIN: dwFormatType = MCI_FORMAT_TMSF; goto TryAGAIN; } +#endif return dwTime; } @@ -382,6 +406,7 @@ TryAGAIN: DWORD CDAUDIO_CalcFrame(UINT wDevID, DWORD dwFormatType, DWORD dwTime) { DWORD dwFrame = 0; +#ifdef linux UINT wTrack; #ifdef DEBUG_CDAUDIO printf("CDAUDIO_CalcFrame(%u, %08X, %lu);\n", wDevID, dwFormatType, dwTime); @@ -423,6 +448,7 @@ TryAGAIN: dwFormatType = MCI_FORMAT_TMSF; goto TryAGAIN; } +#endif return dwFrame; } @@ -432,6 +458,7 @@ TryAGAIN: */ UINT CDAUDIO_GetNumberOfTracks(UINT wDevID) { +#ifdef linux struct cdrom_tochdr hdr; if (CDADev[wDevID].nTracks == 0) { if (ioctl(CDADev[wDevID].unixdev, CDROMREADTOCHDR, &hdr)) { @@ -441,6 +468,9 @@ UINT CDAUDIO_GetNumberOfTracks(UINT wDevID) CDADev[wDevID].nTracks = hdr.cdth_trk1; } return CDADev[wDevID].nTracks; +#else + return (WORD)-1; +#endif } /************************************************************************** @@ -448,6 +478,7 @@ UINT CDAUDIO_GetNumberOfTracks(UINT wDevID) */ BOOL CDAUDIO_GetTracksInfo(UINT wDevID) { +#ifdef linux int i, length; int start, last_start; int total_length = 0; @@ -503,6 +534,9 @@ BOOL CDAUDIO_GetTracksInfo(UINT wDevID) CDADev[wDevID].dwTotalLen = total_length; printf("CDAUDIO_GetTracksInfo // total_len=%u\n", total_length); return TRUE; +#else + return FALSE; +#endif } @@ -511,6 +545,7 @@ BOOL CDAUDIO_GetTracksInfo(UINT wDevID) */ BOOL CDAUDIO_GetCDStatus(UINT wDevID) { +#ifdef linux int oldmode = CDADev[wDevID].mode; CDADev[wDevID].sc.cdsc_format = CDROM_MSF; if (ioctl(CDADev[wDevID].unixdev, CDROMSUBCHNL, &CDADev[wDevID].sc)) { @@ -565,6 +600,9 @@ BOOL CDAUDIO_GetCDStatus(UINT wDevID) } } return TRUE; +#else + return FALSE; +#endif } /************************************************************************** @@ -572,6 +610,7 @@ BOOL CDAUDIO_GetCDStatus(UINT wDevID) */ DWORD CDAUDIO_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms) { +#ifdef linux int start, end; struct cdrom_msf msf; #ifdef DEBUG_CDAUDIO @@ -625,6 +664,9 @@ DWORD CDAUDIO_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms) CDADev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL); } return 0; +#else + return MCIERR_HARDWARE; +#endif } /************************************************************************** @@ -632,6 +674,7 @@ DWORD CDAUDIO_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms) */ DWORD CDAUDIO_mciStop(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms) { +#ifdef linux #ifdef DEBUG_CDAUDIO printf("CDAUDIO_mciStop(%u, %08X, %08X);\n", wDevID, dwFlags, lpParms); #endif @@ -644,6 +687,9 @@ DWORD CDAUDIO_mciStop(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms) CDADev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL); } return 0; +#else + return MCIERR_HARDWARE; +#endif } /************************************************************************** @@ -651,6 +697,7 @@ DWORD CDAUDIO_mciStop(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms) */ DWORD CDAUDIO_mciPause(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms) { +#ifdef linux #ifdef DEBUG_CDAUDIO printf("CDAUDIO_mciPause(%u, %08X, %08X);\n", wDevID, dwFlags, lpParms); #endif @@ -663,6 +710,9 @@ DWORD CDAUDIO_mciPause(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms) CDADev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL); } return 0; +#else + return MCIERR_HARDWARE; +#endif } /************************************************************************** @@ -670,6 +720,7 @@ DWORD CDAUDIO_mciPause(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms) */ DWORD CDAUDIO_mciResume(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms) { +#ifdef linux #ifdef DEBUG_CDAUDIO printf("CDAUDIO_mciResume(%u, %08X, %08X);\n", wDevID, dwFlags, lpParms); #endif @@ -682,6 +733,9 @@ DWORD CDAUDIO_mciResume(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms) CDADev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL); } return 0; +#else + return MCIERR_HARDWARE; +#endif } /************************************************************************** @@ -689,6 +743,7 @@ DWORD CDAUDIO_mciResume(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms) */ DWORD CDAUDIO_mciSeek(UINT wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lpParms) { +#ifdef linux DWORD dwRet; MCI_PLAY_PARMS PlayParms; #ifdef DEBUG_CDAUDIO @@ -717,6 +772,9 @@ DWORD CDAUDIO_mciSeek(UINT wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lpParms) CDADev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL); } return dwRet; +#else + return MCIERR_HARDWARE; +#endif } @@ -725,6 +783,7 @@ DWORD CDAUDIO_mciSeek(UINT wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lpParms) */ DWORD CDAUDIO_mciSet(UINT wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParms) { +#ifdef linux #ifdef DEBUG_CDAUDIO printf("CDAUDIO_mciSet(%u, %08X, %08X);\n", wDevID, dwFlags, lpParms); #endif @@ -775,6 +834,9 @@ DWORD CDAUDIO_mciSet(UINT wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParms) CDADev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL); } return 0; +#else + return MCIERR_HARDWARE; +#endif } @@ -784,6 +846,7 @@ DWORD CDAUDIO_mciSet(UINT wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParms) LRESULT CDAUDIO_DriverProc(DWORD dwDevID, HDRVR hDriv, WORD wMsg, DWORD dwParam1, DWORD dwParam2) { +#ifdef linux switch(wMsg) { case DRV_LOAD: return (LRESULT)1L; @@ -852,6 +915,9 @@ LRESULT CDAUDIO_DriverProc(DWORD dwDevID, HDRVR hDriv, WORD wMsg, default: return DefDriverProc(dwDevID, hDriv, wMsg, dwParam1, dwParam2); } +#else + return MCIERR_HARDWARE; +#endif } diff --git a/misc/mmaux.c b/misc/mmaux.c index 58bc85dcf60..a83bf459b1b 100644 --- a/misc/mmaux.c +++ b/misc/mmaux.c @@ -14,7 +14,9 @@ static char Copyright[] = "Copyright Martin Ayotte, 1994"; #include #include +#ifdef linux #include +#endif #define SOUND_DEV "/dev/dsp" #define MIXER_DEV "/dev/mixer" @@ -34,6 +36,7 @@ static char Copyright[] = "Copyright Martin Ayotte, 1994"; */ DWORD AUX_GetDevCaps(WORD wDevID, LPAUXCAPS lpCaps, DWORD dwSize) { +#ifdef linux int mixer; int volume; printf("AUX_GetDevCaps(%u, %08X, %u);\n", wDevID, lpCaps, dwSize); @@ -48,6 +51,9 @@ DWORD AUX_GetDevCaps(WORD wDevID, LPAUXCAPS lpCaps, DWORD dwSize) } close(mixer); return MMSYSERR_NOERROR; +#else + return MMSYSERR_NOTENABLED; +#endif } @@ -56,6 +62,7 @@ DWORD AUX_GetDevCaps(WORD wDevID, LPAUXCAPS lpCaps, DWORD dwSize) */ DWORD AUX_GetVolume(WORD wDevID, DWORD dwParam) { +#ifdef linux int mixer; int volume; printf("AUX_GetVolume(%u, %08X);\n", wDevID, dwParam); @@ -69,6 +76,9 @@ DWORD AUX_GetVolume(WORD wDevID, DWORD dwParam) } close(mixer); return MMSYSERR_NOERROR; +#else + return MMSYSERR_NOTENABLED; +#endif } /************************************************************************** @@ -76,6 +86,7 @@ DWORD AUX_GetVolume(WORD wDevID, DWORD dwParam) */ DWORD AUX_SetVolume(WORD wDevID, DWORD dwParam) { +#ifdef linux int mixer; int volume = 50; printf("AUX_SetVolume(%u, %08X);\n", wDevID, dwParam); @@ -89,6 +100,9 @@ DWORD AUX_SetVolume(WORD wDevID, DWORD dwParam) } close(mixer); return MMSYSERR_NOERROR; +#else + return MMSYSERR_NOTENABLED; +#endif } diff --git a/objects/color.c b/objects/color.c index 41f3ae63700..c6cbddc1bc3 100644 --- a/objects/color.c +++ b/objects/color.c @@ -233,7 +233,7 @@ WORD COLOR_ToPhysical( DC *dc, COLORREF color ) WORD *mapping; if (!dc->u.x.pal.hMapping) return 0; - switch(color & 0xff000000) + switch(color >> 24) { case 0: /* RGB */ index = GetNearestPaletteIndex( STOCK_DEFAULT_PALETTE, color ); diff --git a/objects/font.c b/objects/font.c index 63a5543be4c..3f3b4cb0434 100644 --- a/objects/font.c +++ b/objects/font.c @@ -16,6 +16,34 @@ static char Copyright[] = "Copyright Alexandre Julliard, 1993"; #define MAX_FONTS 256 static LPLOGFONT lpLogFontList[MAX_FONTS] = { NULL }; + +#define CI_NONEXISTCHAR(cs) (((cs)->width == 0) && \ + (((cs)->rbearing|(cs)->lbearing| \ + (cs)->ascent|(cs)->descent) == 0)) + +/* + * CI_GET_CHAR_INFO - return the charinfo struct for the indicated 8bit + * character. If the character is in the column and exists, then return the + * appropriate metrics (note that fonts with common per-character metrics will + * return min_bounds). If none of these hold true, try again with the default + * char. + */ +#define CI_GET_CHAR_INFO(fs,col,def,cs) \ +{ \ + cs = def; \ + if (col >= fs->min_char_or_byte2 && col <= fs->max_char_or_byte2) { \ + if (fs->per_char == NULL) { \ + cs = &fs->min_bounds; \ + } else { \ + cs = &fs->per_char[(col - fs->min_char_or_byte2)]; \ + if (CI_NONEXISTCHAR(cs)) cs = def; \ + } \ + } \ +} + +#define CI_GET_DEFAULT_INFO(fs,cs) \ + CI_GET_CHAR_INFO(fs, fs->default_char, NULL, cs) + /*********************************************************************** * FONT_MatchFont * @@ -86,7 +114,7 @@ static XFontStruct * FONT_MatchFont( LOGFONT * font ) void FONT_GetMetrics( LOGFONT * logfont, XFontStruct * xfont, TEXTMETRIC * metrics ) { - int average, i; + int average, i, count; unsigned long prop; metrics->tmAscent = xfont->ascent; @@ -116,13 +144,17 @@ void FONT_GetMetrics( LOGFONT * logfont, XFontStruct * xfont, else { XCharStruct * charPtr = xfont->per_char; - average = 0; + average = count = 0; for (i = metrics->tmFirstChar; i <= metrics->tmLastChar; i++) { - average += charPtr->width; + if (!CI_NONEXISTCHAR( charPtr )) + { + average += charPtr->width; + count++; + } charPtr++; } - average /= metrics->tmLastChar - metrics->tmFirstChar + 1; + if (count) average = (average + count/2) / count; } metrics->tmAveCharWidth = average; } @@ -373,33 +405,6 @@ DWORD SetMapperFlags(HDC hDC, DWORD dwFlag) /***********************************************************************/ -#define CI_NONEXISTCHAR(cs) (((cs)->width == 0) && \ - (((cs)->rbearing|(cs)->lbearing| \ - (cs)->ascent|(cs)->descent) == 0)) - -/* - * CI_GET_CHAR_INFO - return the charinfo struct for the indicated 8bit - * character. If the character is in the column and exists, then return the - * appropriate metrics (note that fonts with common per-character metrics will - * return min_bounds). If none of these hold true, try again with the default - * char. - */ -#define CI_GET_CHAR_INFO(fs,col,def,cs) \ -{ \ - cs = def; \ - if (col >= fs->min_char_or_byte2 && col <= fs->max_char_or_byte2) { \ - if (fs->per_char == NULL) { \ - cs = &fs->min_bounds; \ - } else { \ - cs = &fs->per_char[(col - fs->min_char_or_byte2)]; \ - if (CI_NONEXISTCHAR(cs)) cs = def; \ - } \ - } \ -} - -#define CI_GET_DEFAULT_INFO(fs,cs) \ - CI_GET_CHAR_INFO(fs, fs->default_char, NULL, cs) - /*********************************************************************** * GetCharWidth (GDI.350) diff --git a/objects/text.c b/objects/text.c index 0cb0686f3e9..f8be278eadf 100644 --- a/objects/text.c +++ b/objects/text.c @@ -235,8 +235,12 @@ int DrawText( HDC hdc, LPSTR str, int count, LPRECT rect, WORD flags ) if (!TextOut(hdc, x, y, line, len)) return 0; if (prefix_offset != -1) { + HPEN hpen = CreatePen( PS_SOLID, 1, GetTextColor(hdc) ); + HPEN oldPen = SelectObject( hdc, hpen ); MoveTo(hdc, x + prefix_x, y + tm.tmAscent + 1 ); LineTo(hdc, x + prefix_end, y + tm.tmAscent + 1 ); + SelectObject( hdc, oldPen ); + DeleteObject( hpen ); } if (strPtr) diff --git a/tools/build.c b/tools/build.c index 096c1d69bf2..160d0fb2785 100644 --- a/tools/build.c +++ b/tools/build.c @@ -20,9 +20,10 @@ static char Copyright[] = "Copyright Robert J. Amstadt, 1993"; #define VARTYPE_LONG 2 #define VARTYPE_FARPTR 3 -#define FUNCTYPE_PASCAL 16 -#define FUNCTYPE_C 17 -#define FUNCTYPE_REG 19 +#define FUNCTYPE_PASCAL_16 15 +#define FUNCTYPE_PASCAL 16 +#define FUNCTYPE_C 17 +#define FUNCTYPE_REG 19 #define EQUATETYPE_ABS 18 #define TYPE_RETURN 20 @@ -372,7 +373,8 @@ ParseExportFunction(int ordinal, int type) } fdp->n_args_16 = i; - if (type == FUNCTYPE_PASCAL || type == FUNCTYPE_REG) + if (type == FUNCTYPE_PASCAL_16 || type == FUNCTYPE_PASCAL || + type == FUNCTYPE_REG ) { current_offset = 0; for (i--; i >= 0; i--) @@ -521,6 +523,8 @@ ParseOrdinal(int ordinal) return ParseExportFunction(ordinal, FUNCTYPE_PASCAL); else if (stricmp(token, "pascal") == 0) return ParseExportFunction(ordinal, FUNCTYPE_PASCAL); + else if (stricmp(token, "pascal16") == 0) + return ParseExportFunction(ordinal, FUNCTYPE_PASCAL_16); else if (stricmp(token, "register") == 0) return ParseExportFunction(ordinal, FUNCTYPE_REG); else if (stricmp(token, "equate") == 0) @@ -755,6 +759,13 @@ main(int argc, char **argv) fprintf(fp, "\torl\t$0x%08x,%%eax\n", DLLId << 16); fprintf(fp, "\tjmp\t_CallTo32\n\n"); + fprintf(fp, "\t.globl _%s_Dispatch_16\n", UpperDLLName); + fprintf(fp, "_%s_Dispatch_16:\n", UpperDLLName); + fprintf(fp, "\tandl\t$0x0000ffff,%%esp\n"); + fprintf(fp, "\tandl\t$0x0000ffff,%%ebp\n"); + fprintf(fp, "\torl\t$0x%08x,%%eax\n", DLLId << 16); + fprintf(fp, "\tjmp\t_CallTo32_16\n\n"); + odp = OrdinalDefinitions; for (i = 0; i <= Limit; i++, odp++) { @@ -829,6 +840,13 @@ main(int argc, char **argv) fprintf(fp, "\tjmp\t_%s_Dispatch\n\n", UpperDLLName); break; + case FUNCTYPE_PASCAL_16: + fprintf(fp, "_%s_Ordinal_%d:\n", UpperDLLName, i); + fprintf(fp, "\tmovl\t$%d,%%eax\n", i); + fprintf(fp, "\tpushw\t$%d\n", fdp->arg_16_size); + fprintf(fp, "\tjmp\t_%s_Dispatch_16\n\n", UpperDLLName); + break; + case FUNCTYPE_C: default: fprintf(fp, "_%s_Ordinal_%d:\n", UpperDLLName, i); @@ -862,8 +880,8 @@ main(int argc, char **argv) for (i = 0; i <= Limit; i++, odp++) { if (odp->valid && - (odp->type == FUNCTYPE_PASCAL || odp->type == FUNCTYPE_C || - odp->type == FUNCTYPE_REG)) + (odp->type == FUNCTYPE_PASCAL || odp->type == FUNCTYPE_PASCAL_16 || + odp->type == FUNCTYPE_REG || odp->type == FUNCTYPE_C )) { fdp = odp->additional_data; fprintf(fp, "extern int %s();\n", fdp->internal_name); @@ -884,6 +902,7 @@ main(int argc, char **argv) switch (odp->type) { case FUNCTYPE_PASCAL: + case FUNCTYPE_PASCAL_16: case FUNCTYPE_REG: fprintf(fp, " { 0x%x, %s_Ordinal_%d, ", UTEXTSEL, UpperDLLName, i); fprintf(fp, "\042%s\042, ", odp->export_name); diff --git a/windows/nonclient.c b/windows/nonclient.c index edc5ac2c38f..c364b029ee6 100644 --- a/windows/nonclient.c +++ b/windows/nonclient.c @@ -27,7 +27,8 @@ static HBITMAP hbitmapRestoreD = 0; extern void WINPOS_GetMinMaxInfo( HWND hwnd, POINT *maxSize, POINT *maxPos, POINT *minTrack, POINT *maxTrack ); /* winpos.c */ extern void CURSOR_SetWinCursor( HWND hwnd, HCURSOR hcursor ); /* cursor.c */ -extern WORD MENU_GetMenuBarHeight( HWND hwnd, WORD menubarWidth ); /* menu.c */ +extern WORD MENU_GetMenuBarHeight( HWND hwnd, WORD menubarWidth, + int orgX, int orgY ); /* menu.c */ /* Some useful macros */ @@ -127,7 +128,8 @@ LONG NC_HandleNCCalcSize( HWND hwnd, NCCALCSIZE_PARAMS *params ) if (HAS_MENU(wndPtr)) { params->rgrc[0].top += MENU_GetMenuBarHeight( hwnd, - params->rgrc[0].right - params->rgrc[0].left ); + params->rgrc[0].right - params->rgrc[0].left, + -tmpRect.left, -tmpRect.top ) + 1; } return 0; } @@ -178,43 +180,61 @@ static LONG NC_InternalNCHitTest( HWND hwnd, POINT pt ) GetWindowRect( hwnd, &rect ); if (!PtInRect( &rect, pt )) return HTNOWHERE; - ScreenToClient( hwnd, &pt ); - GetClientRect( hwnd, &rect ); - - if (PtInRect( &rect, pt )) return HTCLIENT; - /* Check vertical scroll bar */ - if (wndPtr->dwStyle & WS_VSCROLL) - { - rect.right += SYSMETRICS_CXVSCROLL; - if (PtInRect( &rect, pt )) return HTVSCROLL; - } + /* Check borders */ - /* Check horizontal scroll bar */ - if (wndPtr->dwStyle & WS_HSCROLL) + if (HAS_THICKFRAME( wndPtr->dwStyle )) { - rect.bottom += SYSMETRICS_CYHSCROLL; - if (PtInRect( &rect, pt )) + InflateRect( &rect, -SYSMETRICS_CXFRAME, -SYSMETRICS_CYFRAME ); + if (wndPtr->dwStyle & WS_BORDER) + InflateRect( &rect, -SYSMETRICS_CXBORDER, -SYSMETRICS_CYBORDER ); + if (!PtInRect( &rect, pt )) { - /* Check size box */ - if ((wndPtr->dwStyle & WS_VSCROLL) && - (pt.x >= rect.right - SYSMETRICS_CXVSCROLL)) return HTSIZE; - return HTHSCROLL; + /* Check top sizing border */ + if (pt.y < rect.top) + { + if (pt.x < rect.left+SYSMETRICS_CXSIZE) return HTTOPLEFT; + if (pt.x >= rect.right-SYSMETRICS_CXSIZE) return HTTOPRIGHT; + return HTTOP; + } + /* Check bottom sizing border */ + if (pt.y >= rect.bottom) + { + if (pt.x < rect.left+SYSMETRICS_CXSIZE) return HTBOTTOMLEFT; + if (pt.x >= rect.right-SYSMETRICS_CXSIZE) return HTBOTTOMRIGHT; + return HTBOTTOM; + } + /* Check left sizing border */ + if (pt.x < rect.left) + { + if (pt.y < rect.top+SYSMETRICS_CYSIZE) return HTTOPLEFT; + if (pt.y >= rect.bottom-SYSMETRICS_CYSIZE) return HTBOTTOMLEFT; + return HTLEFT; + } + /* Check right sizing border */ + if (pt.x >= rect.right) + { + if (pt.y < rect.top+SYSMETRICS_CYSIZE) return HTTOPRIGHT; + if (pt.y >= rect.bottom-SYSMETRICS_CYSIZE) return HTBOTTOMRIGHT; + return HTRIGHT; + } } } - - /* Check menu */ - if (HAS_MENU(wndPtr)) + else /* No thick frame */ { - rect.top -= SYSMETRICS_CYMENU + 1; - if (PtInRect( &rect, pt )) return HTMENU; + if (HAS_DLGFRAME( wndPtr->dwStyle, wndPtr->dwExStyle )) + InflateRect(&rect, -SYSMETRICS_CXDLGFRAME, -SYSMETRICS_CYDLGFRAME); + else if (wndPtr->dwStyle & WS_BORDER) + InflateRect(&rect, -SYSMETRICS_CXBORDER, -SYSMETRICS_CYBORDER); + if (!PtInRect( &rect, pt )) return HTBORDER; } /* Check caption */ + if ((wndPtr->dwStyle & WS_CAPTION) == WS_CAPTION) { - rect.top -= SYSMETRICS_CYCAPTION - 1; - if (PtInRect( &rect, pt )) + rect.top += SYSMETRICS_CYCAPTION - 1; + if (!PtInRect( &rect, pt )) { /* Check system menu */ if ((wndPtr->dwStyle & WS_SYSMENU) && (pt.x <= SYSMETRICS_CXSIZE)) @@ -230,40 +250,42 @@ static LONG NC_InternalNCHitTest( HWND hwnd, POINT pt ) return HTCAPTION; } } - - /* Check non-sizing border */ - if (!HAS_THICKFRAME( wndPtr->dwStyle )) return HTBORDER; - /* Check top sizing border */ - if (pt.y < rect.top) - { - if (pt.x < rect.left+SYSMETRICS_CXSIZE) return HTTOPLEFT; - if (pt.x >= rect.right-SYSMETRICS_CXSIZE) return HTTOPRIGHT; - return HTTOP; - } + /* Check client area */ + + ScreenToClient( hwnd, &pt ); + GetClientRect( hwnd, &rect ); + if (PtInRect( &rect, pt )) return HTCLIENT; + + /* Check vertical scroll bar */ - /* Check bottom sizing border */ - if (pt.y >= rect.bottom) + if (wndPtr->dwStyle & WS_VSCROLL) { - if (pt.x < rect.left+SYSMETRICS_CXSIZE) return HTBOTTOMLEFT; - if (pt.x >= rect.right-SYSMETRICS_CXSIZE) return HTBOTTOMRIGHT; - return HTBOTTOM; + rect.right += SYSMETRICS_CXVSCROLL; + if (PtInRect( &rect, pt )) return HTVSCROLL; } - - /* Check left sizing border */ - if (pt.x < rect.left) + + /* Check horizontal scroll bar */ + + if (wndPtr->dwStyle & WS_HSCROLL) { - if (pt.y < rect.top+SYSMETRICS_CYSIZE) return HTTOPLEFT; - if (pt.y >= rect.bottom-SYSMETRICS_CYSIZE) return HTBOTTOMLEFT; - return HTLEFT; + rect.bottom += SYSMETRICS_CYHSCROLL; + if (PtInRect( &rect, pt )) + { + /* Check size box */ + if ((wndPtr->dwStyle & WS_VSCROLL) && + (pt.x >= rect.right - SYSMETRICS_CXVSCROLL)) + return HTSIZE; + return HTHSCROLL; + } } - /* Check right sizing border */ - if (pt.x >= rect.right) + /* Check menu bar */ + + if (HAS_MENU(wndPtr)) { - if (pt.y < rect.top+SYSMETRICS_CYSIZE) return HTTOPRIGHT; - if (pt.y >= rect.bottom-SYSMETRICS_CYSIZE) return HTBOTTOMRIGHT; - return HTRIGHT; + if ((pt.y < 0) && (pt.x >= 0) && (pt.x < rect.right)) + return HTMENU; } /* Should never get here */ @@ -537,9 +559,9 @@ void NC_DoNCPaint( HWND hwnd, HRGN hrgn, BOOL active, BOOL suppress_menupaint ) #ifdef DEBUG_NONCLIENT printf( "NC_DoNCPaint: %d %d\n", hwnd, hrgn ); #endif - if (!IsWindowVisible(hwnd)) return; if (!wndPtr || !hrgn) return; - if (!(wndPtr->dwStyle & (WS_BORDER | WS_DLGFRAME | WS_THICKFRAME))) + if ((!(wndPtr->dwStyle & (WS_BORDER | WS_DLGFRAME | WS_THICKFRAME))) || + (!(wndPtr->dwStyle & WS_VISIBLE))) return; /* Nothing to do! */ if (hrgn == 1) hdc = GetDCEx( hwnd, 0, DCX_CACHE | DCX_WINDOW ); @@ -594,27 +616,15 @@ void NC_DoNCPaint( HWND hwnd, HRGN hrgn, BOOL active, BOOL suppress_menupaint ) NC_DrawCaption( hdc, &r, hwnd, wndPtr->dwStyle, active ); } - if (wndPtr->wIDmenu != 0 && - (wndPtr->dwStyle & WS_CHILD) != WS_CHILD) { - LPPOPUPMENU lpMenu = (LPPOPUPMENU) GlobalLock(wndPtr->wIDmenu); - if (lpMenu != NULL) { - int oldHeight; - CopyRect(&rect2, &rect); - /* Default MenuBar height */ - if (lpMenu->Height == 0) lpMenu->Height = SYSMETRICS_CYMENU + 1; - oldHeight = lpMenu->Height; - rect2.bottom = rect2.top + oldHeight; - StdDrawMenuBar(hdc, &rect2, lpMenu, suppress_menupaint); - if (oldHeight != lpMenu->Height) { - printf("NC_DoNCPaint // menubar changed oldHeight=%d != lpMenu->Height=%d\n", - oldHeight, lpMenu->Height); - /* Reduce ClientRect according to MenuBar height */ - wndPtr->rectClient.top -= oldHeight; - wndPtr->rectClient.top += lpMenu->Height; - } - GlobalUnlock(wndPtr->wIDmenu); - } - } + if (HAS_MENU(wndPtr)) + { + LPPOPUPMENU lpMenu = (LPPOPUPMENU) GlobalLock( wndPtr->wIDmenu ); + RECT r = rect; + r.bottom = rect.top + lpMenu->Height; + rect.top += lpMenu->Height; + StdDrawMenuBar( hdc, &r, lpMenu, suppress_menupaint ); + GlobalUnlock( wndPtr->wIDmenu ); + } if (wndPtr->dwStyle & (WS_VSCROLL | WS_HSCROLL)) { if ((wndPtr->dwStyle & WS_VSCROLL) && (wndPtr->VScroll != NULL) && @@ -624,9 +634,6 @@ void NC_DoNCPaint( HWND hwnd, HRGN hrgn, BOOL active, BOOL suppress_menupaint ) bottom -= SYSMETRICS_CYHSCROLL; SetRect(&rect2, rect.right - SYSMETRICS_CXVSCROLL, rect.top, rect.right, bottom); - if (wndPtr->dwStyle & WS_CAPTION) rect.top += SYSMETRICS_CYSIZE; - if (wndPtr->wIDmenu != 0 && (wndPtr->dwStyle & WS_CHILD) != WS_CHILD) - rect2.top += SYSMETRICS_CYMENU + 1; StdDrawScrollBar(hwnd, hdc, SB_VERT, &rect2, (LPHEADSCROLL)wndPtr->VScroll); } if ((wndPtr->dwStyle & WS_HSCROLL) && wndPtr->HScroll != NULL && diff --git a/windows/syscolor.c b/windows/syscolor.c index c92d5497ced..8d0cda39d75 100644 --- a/windows/syscolor.c +++ b/windows/syscolor.c @@ -45,6 +45,8 @@ static char * DefSysColors[] = static COLORREF SysColors[NUM_SYS_COLORS]; +#define MAKE_SOLID(color) \ + (PALETTEINDEX(GetNearestPaletteIndex(STOCK_DEFAULT_PALETTE,(color)))) /************************************************************************* * SYSCOLOR_SetColor @@ -69,6 +71,8 @@ static void SYSCOLOR_SetColor( int index, COLORREF color ) sysColorObjects.hbrushInactiveCaption = CreateSolidBrush( color ); break; case COLOR_MENU: + DeleteObject( sysColorObjects.hbrushMenu ); + sysColorObjects.hbrushMenu = CreateSolidBrush( MAKE_SOLID(color) ); break; case COLOR_WINDOW: DeleteObject( sysColorObjects.hbrushWindow ); @@ -95,7 +99,11 @@ static void SYSCOLOR_SetColor( int index, COLORREF color ) sysColorObjects.hbrushInactiveBorder = CreateSolidBrush( color ); break; case COLOR_APPWORKSPACE: + break; case COLOR_HIGHLIGHT: + DeleteObject( sysColorObjects.hbrushHighlight ); + sysColorObjects.hbrushHighlight = CreateSolidBrush( MAKE_SOLID(color)); + break; case COLOR_HIGHLIGHTTEXT: break; case COLOR_BTNFACE: diff --git a/windows/win.c b/windows/win.c index f03902d18c9..8aeba56b514 100644 --- a/windows/win.c +++ b/windows/win.c @@ -260,8 +260,11 @@ HWND CreateWindowEx( DWORD exStyle, LPSTR className, LPSTR windowName, #endif /* 'soundrec.exe' has negative position ! Why ? For now, here a patch : */ - if (x < 0) x = 0; - if (y < 0) y = 0; + if (!strcmp(className, "SoundRec")) + { + if (x < 0) x = 0; + if (y < 0) y = 0; + } if (x == CW_USEDEFAULT) x = y = 0; if (width == CW_USEDEFAULT) { diff --git a/windows/winpos.c b/windows/winpos.c index f60ea4ac07a..8e013e73829 100644 --- a/windows/winpos.c +++ b/windows/winpos.c @@ -647,16 +647,21 @@ static BOOL WINPOS_InternalSetWindowPos( WINDOWPOS *winpos ) /* Send WM_NCPAINT message if needed */ - if ((flags & (SWP_FRAMECHANGED | SWP_SHOWWINDOW)) || - (!(flags & SWP_NOSIZE)) || (!(flags & SWP_NOMOVE)) || - (!(flags & SWP_NOACTIVATE)) || (!(flags & SWP_NOZORDER))) - SendMessage( winpos->hwnd, WM_NCPAINT, 1, 0L ); -#if 0 - if ((flags & (SWP_FRAMECHANGED | SWP_SHOWWINDOW)) && - (!(flags & SWP_NOREDRAW)) && - (wndPtr->dwStyle & WS_VISIBLE)) - InvalidateRect(winpos->hwnd, NULL, TRUE); -#endif + if (flags & SWP_SHOWWINDOW) + { + /* Repaint the window frame and background */ + RedrawWindow( winpos->hwnd, NULL, 0, + RDW_INVALIDATE | RDW_FRAME | RDW_ERASENOW ); + } + else + { + if ((flags & SWP_FRAMECHANGED) || + (!(flags & SWP_NOSIZE)) || + (!(flags & SWP_NOMOVE)) || + (!(flags & SWP_NOACTIVATE)) || + (!(flags & SWP_NOZORDER))) + SendMessage( winpos->hwnd, WM_NCPAINT, 1, 0L ); + } /* And last, send the WM_WINDOWPOSCHANGED message */ -- 2.11.4.GIT