514 lines
14 KiB
C++
514 lines
14 KiB
C++
|
//----------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
// Copyright (C) Microsoft Corporation, 1992 - 1994.
|
||
|
//
|
||
|
// File: win2mac.cpp
|
||
|
//
|
||
|
// Contents: All functions that are not implemented for the Macintosh
|
||
|
// Stubs are coded so that we can link cleanly.
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
#ifndef PEGASUS
|
||
|
#include "_common.h"
|
||
|
#include <mbstring.h>
|
||
|
#include "stdio.h"
|
||
|
|
||
|
#if defined(MACPORT) && defined(UNICODE)
|
||
|
|
||
|
#include <macname1.h>
|
||
|
#include <quickdraw.h>
|
||
|
#include <macname2.h>
|
||
|
|
||
|
AssertData
|
||
|
|
||
|
//----------------------------------------------------------------------------
|
||
|
//
|
||
|
// Mac wrapper functions
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
//----------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: MacCLSIDFromProgID
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
#undef CLSIDFromProgID
|
||
|
STDAPI MacCLSIDFromProgID (LPCWSTR lpszProgID, LPCLSID lpclsid)
|
||
|
{
|
||
|
CStrIn str(lpszProgID);
|
||
|
return CLSIDFromProgID((LPOLESTR)str, lpclsid);
|
||
|
}
|
||
|
|
||
|
//----------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: MacCoTaskMemAlloc
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
STDAPI_(LPVOID) MacCoTaskMemAlloc(ULONG cb)
|
||
|
{
|
||
|
IMalloc *pIMalloc = NULL;
|
||
|
HRESULT hr;
|
||
|
HGLOBAL pMem = NULL;
|
||
|
|
||
|
hr = CoGetMalloc ( MEMCTX_TASK, &pIMalloc);
|
||
|
if (hr)
|
||
|
{
|
||
|
goto Cleanup;
|
||
|
}
|
||
|
|
||
|
pMem = pIMalloc->Alloc(cb);
|
||
|
|
||
|
Cleanup:
|
||
|
if( pIMalloc )
|
||
|
pIMalloc->Release();
|
||
|
return (LPVOID)pMem;
|
||
|
|
||
|
}
|
||
|
|
||
|
//----------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: MacCoTaskMemFree
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
STDAPI_(void) MacCoTaskMemFree(LPVOID pv)
|
||
|
{
|
||
|
IMalloc *pIMalloc = NULL;
|
||
|
HRESULT hr;
|
||
|
HGLOBAL pMem = NULL;
|
||
|
|
||
|
hr = CoGetMalloc ( MEMCTX_TASK, &pIMalloc);
|
||
|
if (hr)
|
||
|
{
|
||
|
goto Cleanup;
|
||
|
}
|
||
|
pIMalloc->Free(pv);
|
||
|
|
||
|
Cleanup:
|
||
|
if( pIMalloc )
|
||
|
pIMalloc->Release();
|
||
|
|
||
|
}
|
||
|
//----------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: MacCoTaskMemRealloc
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
STDAPI_(LPVOID) MacCoTaskMemRealloc(LPVOID pv, ULONG cb)
|
||
|
{
|
||
|
IMalloc *pIMalloc = NULL;
|
||
|
HRESULT hr;
|
||
|
HGLOBAL pMem = NULL;
|
||
|
|
||
|
hr = CoGetMalloc ( MEMCTX_TASK, &pIMalloc);
|
||
|
if (hr)
|
||
|
{
|
||
|
goto Cleanup;
|
||
|
}
|
||
|
|
||
|
pMem = pIMalloc->Realloc(pv,cb);
|
||
|
|
||
|
Cleanup:
|
||
|
if( pIMalloc )
|
||
|
pIMalloc->Release();
|
||
|
return (LPVOID)pMem;
|
||
|
|
||
|
}
|
||
|
|
||
|
//----------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: MacGetCurrentObject
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
HGDIOBJ WINAPI MacGetCurrentObject(HDC hdc, // handle of device context
|
||
|
UINT uObjectType) // object-type identifier
|
||
|
{
|
||
|
// GetCurrentObject is not supported under wlm, so we always simulate failure
|
||
|
// by returning NULL
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
//----------------------------------------------------------------------------
|
||
|
// NOTE WELL: GetDoubleClickTime() maps to GetDblTime() in the VC++ 4.0 header
|
||
|
// file MSDEV\MAC\INCLUDE\MACOS\EVENTS.H. The only problem is that
|
||
|
// GetDblTime() returns the count in "Ticks" (1/60th second) and
|
||
|
// we want milliseconds (0.001 sec). This should be fixed when the
|
||
|
// bug in the VC4 header file is fixed. - DAS 1/16/96
|
||
|
//----------------------------------------------------------------------------
|
||
|
UINT MacGetDoubleClickTime()
|
||
|
{
|
||
|
return MulDiv(100,GetDblTime(),6);
|
||
|
}
|
||
|
|
||
|
//----------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: MacGetMetaFileBitsEx
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
UINT WINAPI MacGetMetaFileBitsEx(HMETAFILE hmf, UINT nSize, LPVOID lpvData )
|
||
|
{
|
||
|
Assert (0 && "GetMetaFileBitsEx is not implemented for Macintosh");
|
||
|
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
//----------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: MacIsValidCodePage
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
WINBASEAPI BOOL WINAPI MacIsValidCodePage(UINT CodePage)
|
||
|
{
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
//----------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: MacOleDraw
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
#undef OleDraw
|
||
|
STDAPI MacOleDraw(
|
||
|
IUnknown * pUnk, //Points to the view object to be drawn
|
||
|
DWORD dwAspect, //Specifies how the object is to be represented
|
||
|
HDC hdcDraw, //Identifies the device context on which to draw
|
||
|
LPCRECT lprcBounds //Specifies the rectangle in which the object is drawn
|
||
|
)
|
||
|
{
|
||
|
Rect rect;
|
||
|
HRESULT ret;
|
||
|
GrafPtr grafptr = CheckoutPort(hdcDraw, CA_NONE);
|
||
|
Assert(grafptr);
|
||
|
|
||
|
rect.top = lprcBounds->top;
|
||
|
rect.bottom = lprcBounds->bottom;
|
||
|
rect.left = lprcBounds->left;
|
||
|
rect.right = lprcBounds->right;
|
||
|
|
||
|
ret = OleDraw(pUnk, dwAspect, grafptr, &rect);
|
||
|
|
||
|
CheckinPort(hdcDraw, CA_ALL);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
//----------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: MacProgIDFromCLSID
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
#undef ProgIDFromCLSID
|
||
|
STDAPI MacProgIDFromCLSID (REFCLSID clsid, LPWSTR FAR* lplpszProgID)
|
||
|
{
|
||
|
CStrIn str(*lplpszProgID);
|
||
|
return ProgIDFromCLSID(clsid, (LPSTR FAR*)&str);
|
||
|
}
|
||
|
|
||
|
//-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: MacRichEditWndProc
|
||
|
//
|
||
|
// Synopsis: This is the Mac WndProc callback function.
|
||
|
//
|
||
|
// Arguments: HWND hwnd,
|
||
|
// UINT msg,
|
||
|
// WPARAM wparam,
|
||
|
// LPARAM lparam
|
||
|
//
|
||
|
// Returns: LRESULT
|
||
|
//
|
||
|
// Notes: The function processes the messages, then often calls
|
||
|
// the normal PC callback function (RichEditANSIWndProc);
|
||
|
//
|
||
|
//
|
||
|
//-------------------------------------------------------------------------
|
||
|
LRESULT CALLBACK MacRichEditWndProc(
|
||
|
HWND hwnd,
|
||
|
UINT msg,
|
||
|
WPARAM wparam,
|
||
|
LPARAM lparam)
|
||
|
{
|
||
|
TRACEBEGINPARAM(TRCSUBSYSHOST, TRCSCOPEINTERN, "MacRichEditWndProc", msg);
|
||
|
|
||
|
|
||
|
switch( msg )
|
||
|
{
|
||
|
|
||
|
|
||
|
case WM_MACINTOSH:
|
||
|
{
|
||
|
if (LOWORD(wparam) == WLM_SETMENUBAR)
|
||
|
return TRUE; // dont change the menu bar
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case WM_LBUTTONDOWN:
|
||
|
case WM_LBUTTONUP:
|
||
|
case WM_LBUTTONDBLCLK:
|
||
|
{
|
||
|
MacSimulateMouseButtons(msg,wparam);
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case WM_KEYDOWN:
|
||
|
case WM_KEYUP:
|
||
|
{
|
||
|
MacSimulateKey(msg,wparam);
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case WM_SIZE:
|
||
|
//case WM_SETFOCUS:
|
||
|
//case WM_SYSCOLORCHANGE:
|
||
|
//case WM_MOVE:
|
||
|
//case WM_MACINTOSH:
|
||
|
{
|
||
|
return DefWindowProc(hwnd, msg, wparam, lparam);
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case WM_CHAR:
|
||
|
{
|
||
|
return RichEditWndProc(hwnd, msg, wparam, lparam);
|
||
|
}
|
||
|
break;
|
||
|
default:
|
||
|
return RichEditANSIWndProc(hwnd, msg, wparam, lparam);
|
||
|
|
||
|
}
|
||
|
return RichEditANSIWndProc(hwnd, msg, wparam, lparam);
|
||
|
}
|
||
|
|
||
|
//----------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: MacSelectPalette
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
HPALETTE WINAPI MacSelectPalette(HDC hdc, HPALETTE hpal, BOOL bForceBackground)
|
||
|
{
|
||
|
if (hpal)
|
||
|
return ::SelectPalette(hdc,hpal,bForceBackground);
|
||
|
else
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
//----------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: MacportSetCursor
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
HCURSOR MacportSetCursor(HCURSOR hCursor)
|
||
|
{
|
||
|
if (hCursor)
|
||
|
return SetCursor(hCursor);
|
||
|
else
|
||
|
{
|
||
|
ObscureCursor();
|
||
|
return NULL;
|
||
|
}
|
||
|
}
|
||
|
//----------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: MacSetMetaFileBitsEx
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
HMETAFILE WINAPI MacSetMetaFileBitsEx(UINT nSize,CONST BYTE * lpData )
|
||
|
{
|
||
|
Assert (0 && "SetMetaFileBitsEx is not implemented for Macintosh");
|
||
|
|
||
|
return NULL;
|
||
|
|
||
|
}
|
||
|
|
||
|
//-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: MacSimulateKey
|
||
|
//
|
||
|
// Synopsis: Simulates menu enabler keys for the mac
|
||
|
//
|
||
|
// Arguments: [msg]
|
||
|
// [wParam]
|
||
|
//
|
||
|
// Returns: UINT
|
||
|
//
|
||
|
// Notes: The key is changed to accommodate the mac.
|
||
|
//
|
||
|
//
|
||
|
//-------------------------------------------------------------------------
|
||
|
|
||
|
UINT MacSimulateKey (UINT& msg, WPARAM& wParam)
|
||
|
{
|
||
|
BYTE rgbKeyState[256];
|
||
|
|
||
|
GetKeyboardState(rgbKeyState);
|
||
|
|
||
|
if (rgbKeyState[VK_CONTROL])
|
||
|
{
|
||
|
rgbKeyState[VK_CONTROL] = 0;
|
||
|
}
|
||
|
|
||
|
SetKeyboardState(rgbKeyState);
|
||
|
|
||
|
return msg;
|
||
|
}
|
||
|
|
||
|
//-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: MacSimulateMouseButtons
|
||
|
//
|
||
|
// Synopsis: Simulates the right and middle mouse Windows buttons.
|
||
|
//
|
||
|
// Arguments: [msg]
|
||
|
// [wParam]
|
||
|
//
|
||
|
// Returns: UINT
|
||
|
//
|
||
|
// Notes: The right mouse is simulated by CTRL (or COMMAND) click. The
|
||
|
// middle mouse is simulated by SHIFT click. Because CTRL is already
|
||
|
// in use the CTRL click is simulated using the OPTION key.
|
||
|
//
|
||
|
// The command key is used the same as the control key because
|
||
|
// WLM likes to pick up the CTRL mouse as a user break. This makes
|
||
|
// debugging the right mouse simulation very difficult.
|
||
|
//
|
||
|
//-------------------------------------------------------------------------
|
||
|
|
||
|
//-------------------------------------------------------------------------
|
||
|
typedef struct tagUISim
|
||
|
{
|
||
|
UINT msg;
|
||
|
UINT wParam;
|
||
|
BYTE control; // Value for VK_CONTROL key state
|
||
|
BYTE menu; // Value for VK_MENU key state
|
||
|
} UISim;
|
||
|
//-------------------------------------------------------------------------
|
||
|
|
||
|
UINT MacSimulateMouseButtons (UINT& msg, WPARAM& wParam)
|
||
|
{
|
||
|
BYTE rgbKeyState[256];
|
||
|
WORD stateIndex = 0;
|
||
|
|
||
|
UISim UISim[] = // 8 4 2 1
|
||
|
{ // cmd shift ctrl option
|
||
|
WM_LBUTTONDOWN, MK_LBUTTON, 0x00, 0x00, // - - - -
|
||
|
WM_LBUTTONDOWN, MK_LBUTTON|MK_CONTROL, 0x80, 0x00, // - - - x
|
||
|
WM_RBUTTONDOWN, MK_RBUTTON, 0x00, 0x00, // - - x -
|
||
|
WM_RBUTTONDOWN, MK_RBUTTON|MK_CONTROL, 0x80, 0x00, // - - x x
|
||
|
WM_MBUTTONDOWN, MK_MBUTTON, 0x00, 0x00, // - x - -
|
||
|
WM_MBUTTONDOWN, MK_MBUTTON|MK_CONTROL, 0x80, 0x00, // - x - x
|
||
|
WM_RBUTTONDOWN, MK_RBUTTON|MK_MBUTTON, 0x00, 0x00, // - x x -
|
||
|
WM_RBUTTONDOWN, MK_RBUTTON|MK_MBUTTON|MK_CONTROL, 0x80, 0x00, // - x x x
|
||
|
WM_LBUTTONDOWN, MK_LBUTTON, 0x00, 0x10, // x - - -
|
||
|
WM_LBUTTONDOWN, MK_LBUTTON|MK_CONTROL, 0x80, 0x10, // x - - x
|
||
|
WM_RBUTTONDOWN, MK_RBUTTON, 0x00, 0x10, // x - x -
|
||
|
WM_RBUTTONDOWN, MK_RBUTTON|MK_CONTROL, 0x80, 0x10, // x - x x
|
||
|
WM_MBUTTONDOWN, MK_MBUTTON, 0x00, 0x10, // x x - -
|
||
|
WM_MBUTTONDOWN, MK_MBUTTON|MK_CONTROL, 0x80, 0x10, // x x - x
|
||
|
WM_RBUTTONDOWN, MK_RBUTTON|MK_MBUTTON, 0x00, 0x10, // x x x -
|
||
|
WM_RBUTTONDOWN, MK_RBUTTON|MK_MBUTTON|MK_CONTROL, 0x80, 0x10 // x x x x
|
||
|
};
|
||
|
|
||
|
|
||
|
|
||
|
// Determine which keys were pressed, and clean out the state variables
|
||
|
|
||
|
GetKeyboardState(rgbKeyState);
|
||
|
|
||
|
if (rgbKeyState[VK_OPTION])
|
||
|
{
|
||
|
rgbKeyState[VK_OPTION] = 0; // Clear key state
|
||
|
stateIndex |= 0x01; // Set option key bit in index
|
||
|
}
|
||
|
|
||
|
if (rgbKeyState[VK_CONTROL])
|
||
|
{
|
||
|
rgbKeyState[VK_CONTROL] = 0; // Clear key state
|
||
|
stateIndex |= 0x02; // Set control key bit in index
|
||
|
}
|
||
|
|
||
|
if (rgbKeyState[VK_COMMAND]) // Use command key like control key due to WLM debug issues
|
||
|
{
|
||
|
rgbKeyState[VK_COMMAND] = 0; // Clear key state
|
||
|
stateIndex |= 0x08; // Set command key bit in index
|
||
|
}
|
||
|
|
||
|
if (rgbKeyState[VK_SHIFT])
|
||
|
{
|
||
|
rgbKeyState[VK_SHIFT] = 0; // Clear key state
|
||
|
stateIndex |= 0x04; // Set shift key bit in index
|
||
|
}
|
||
|
|
||
|
// Now set the return values
|
||
|
|
||
|
if (stateIndex) // Only do this is the mouse is being simulated
|
||
|
{
|
||
|
msg = (msg - WM_LBUTTONDOWN) + UISim[stateIndex].msg;
|
||
|
wParam = UISim[stateIndex].wParam;
|
||
|
|
||
|
rgbKeyState[VK_CONTROL] = UISim[stateIndex].control;
|
||
|
rgbKeyState[VK_MENU] = UISim[stateIndex].menu;
|
||
|
SetKeyboardState(rgbKeyState);
|
||
|
}
|
||
|
return msg;
|
||
|
}
|
||
|
|
||
|
//----------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: MacSysAllocStringLen
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
STDAPI_(BSTR) MacSysAllocStringLen(LPCWSTR lpStringW, UINT lenChars)
|
||
|
{
|
||
|
|
||
|
TRACEBEGIN(TRCSUBSYSWRAP, TRCSCOPEINTERN, "SysAllocStringLenMac");
|
||
|
|
||
|
int lenStrBytes;
|
||
|
LPSTR lpStringMB;
|
||
|
|
||
|
if ((lpStringW) && (*lpStringW != NULL))
|
||
|
{
|
||
|
lenStrBytes = MsoWideCharToMultiByte(CP_ACP,0,lpStringW,lenChars,NULL,NULL,NULL,NULL);
|
||
|
lpStringMB = (LPSTR)CoTaskMemAlloc( lenStrBytes + sizeof(INT) );
|
||
|
memcpy(lpStringMB, &lenStrBytes, sizeof(INT)); //copy BSTR lenghth in integer before BSTR
|
||
|
lpStringMB += sizeof(INT);
|
||
|
MsoWideCharToMultiByte(CP_ACP,0,lpStringW,lenChars,lpStringMB,lenStrBytes,NULL,NULL);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// note that in every case so far used on RichEdit the first parm is NULL
|
||
|
// so no way to determine how big to make the buffer
|
||
|
// therefore making it the lenghth of a unicode buffer - max size it could be for mbcs
|
||
|
|
||
|
lenStrBytes = lenChars*sizeof(WCHAR);
|
||
|
|
||
|
lpStringMB = (LPSTR)CoTaskMemAlloc( lenStrBytes + sizeof(INT) );
|
||
|
// not sure if this should be lenChars or lenStrBytes
|
||
|
// note that lenStrBytes is wchar lenghth - the max length it could be for mbcs
|
||
|
// memcpy(lpStringMB, &lenStrBytes, sizeof(INT)); //copy BSTR lenghth in integer before BSTR
|
||
|
memcpy(lpStringMB, &lenChars, sizeof(INT)); //copy BSTR lenghth in integer before BSTR
|
||
|
lpStringMB += sizeof(INT);
|
||
|
}
|
||
|
return (BSTR)lpStringMB;
|
||
|
}
|
||
|
|
||
|
//----------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: MacWordSwapLong
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
ULONG MacWordSwapLong ( ULONG ul)
|
||
|
{
|
||
|
|
||
|
WORD w1,w2;
|
||
|
|
||
|
w1 = (WORD)ul;
|
||
|
w2 = (WORD)(ul>>16);
|
||
|
|
||
|
return (((ULONG)w1)<<16) | w2;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
#endif //MACPORT
|
||
|
|
||
|
#endif
|