diff --git a/AppleWin/docs/History.txt b/AppleWin/docs/History.txt index 2b64bd77..35d4d676 100644 --- a/AppleWin/docs/History.txt +++ b/AppleWin/docs/History.txt @@ -17,6 +17,11 @@ Restrictions/bugs: - SSI263 emulation is very basic: there is no attempt to emulate rate, inflection or filters. - During Mockingboard playback, Speaker emulation isn't precise +1.14.1.2 - 2 Dec 2007 (beta) +---------------------------- +. Change: Removed crosshairs in mouse-mode +. Change: Hide Windows' mouse cursor when over Apple's screen (in mouse-mode) +. Fix: Use mouse position delta (fixes GEOS) 1.14.1.1 - 13 Aug 2007 (beta) ----------------------------- diff --git a/AppleWin/resource/Applewin.rc b/AppleWin/resource/Applewin.rc index bdb807f3..bf3b6adc 100644 --- a/AppleWin/resource/Applewin.rc +++ b/AppleWin/resource/Applewin.rc @@ -210,8 +210,8 @@ DISK_ICON ICON "DISK.ICO" // VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,14,1,1 - PRODUCTVERSION 1,14,1,1 + FILEVERSION 1,14,1,2 + PRODUCTVERSION 1,14,1,2 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -229,12 +229,12 @@ BEGIN VALUE "Comments", "http://applewin.berlios.de" VALUE "CompanyName", "Michael O'Brien, Oliver Schmidt, Tom Charlesworth" VALUE "FileDescription", "Apple //e Emulator for Windows" - VALUE "FileVersion", "1, 14, 1, 1" + VALUE "FileVersion", "1, 14, 1, 2" VALUE "InternalName", "APPLEWIN" VALUE "LegalCopyright", "© 1994-2007 Michael O'Brien, Oliver Schmidt, Tom Charlesworth, Michael Pohoreski, Nick Westgate, Linards Ticmanis" VALUE "OriginalFilename", "APPLEWIN.EXE" VALUE "ProductName", "Apple //e Emulator" - VALUE "ProductVersion", "1, 14, 1, 1" + VALUE "ProductVersion", "1, 14, 1, 2" END END BLOCK "VarFileInfo" diff --git a/AppleWin/source/Frame.cpp b/AppleWin/source/Frame.cpp index a68fc004..4803fc17 100644 --- a/AppleWin/source/Frame.cpp +++ b/AppleWin/source/Frame.cpp @@ -55,7 +55,6 @@ static HBITMAP diskbitmap[ NUM_DISK_STATUS ]; static HBITMAP buttonbitmap[BUTTONS]; -//static BOOL active = 0; static bool g_bAppActive = false; static HBRUSH btnfacebrush = (HBRUSH)0; static HPEN btnfacepen = (HPEN)0; @@ -82,6 +81,11 @@ static int viewporty = VIEWPORTY; static LPDIRECTDRAW directdraw = (LPDIRECTDRAW)0; static LPDIRECTDRAWSURFACE surface = (LPDIRECTDRAWSURFACE)0; +static UINT g_uPrevMouseX = 0; +static UINT g_uPrevMouseY = 0; +static bool g_bShowingCursor = true; +static bool g_bOldShowingCursor = true; // Used during MODE_PAUSE + void DrawStatusArea (HDC passdc, BOOL drawflags); void ProcessButtonClick (int button); void ProcessDiskPopupMenu(HWND hwnd, POINT pt, const int iDrive); @@ -623,10 +627,23 @@ LRESULT CALLBACK FrameWndProc ( case MODE_RUNNING: g_nAppMode = MODE_PAUSED; SoundCore_SetFade(FADE_OUT); + g_bOldShowingCursor = g_bShowingCursor; + if (sg_Mouse.Active() && !g_bShowingCursor) + { + int nCount = ShowCursor(1); + _ASSERT(nCount >= 0); + g_bShowingCursor = true; + } break; case MODE_PAUSED: g_nAppMode = MODE_RUNNING; SoundCore_SetFade(FADE_IN); + if (sg_Mouse.Active() && !g_bOldShowingCursor) + { + int nCount = ShowCursor(0); + _ASSERT(nCount < 0); + g_bShowingCursor = false; + } break; case MODE_STEPPING: DebuggerInputConsoleChar( DEBUG_EXIT_KEY ); @@ -699,17 +716,17 @@ LRESULT CALLBACK FrameWndProc ( } else { - if (sg_Mouse.Active()) - sg_Mouse.SetButton(BUTTON0, BUTTON_DOWN); - else - JoySetButton(BUTTON0, BUTTON_DOWN); + JoySetButton(BUTTON0, BUTTON_DOWN); } } - else if ( ((x < buttonx) && JoyUsingMouse() && ((g_nAppMode == MODE_RUNNING) || (g_nAppMode == MODE_STEPPING))) || - (sg_Mouse.Active()) ) + else if ( ((x < buttonx) && JoyUsingMouse() && ((g_nAppMode == MODE_RUNNING) || (g_nAppMode == MODE_STEPPING))) ) { SetUsingCursor(1); } + else if (sg_Mouse.Active()) + { + sg_Mouse.SetButton(BUTTON0, BUTTON_DOWN); + } DebuggerMouseClick( x, y ); } RelayEvent(WM_LBUTTONDOWN,wparam,lparam); @@ -730,10 +747,11 @@ LRESULT CALLBACK FrameWndProc ( } else if (usingcursor) { - if (sg_Mouse.Active()) - sg_Mouse.SetButton(BUTTON0, BUTTON_UP); - else - JoySetButton(BUTTON0, BUTTON_UP); + JoySetButton(BUTTON0, BUTTON_UP); + } + else if (sg_Mouse.Active()) + { + sg_Mouse.SetButton(BUTTON0, BUTTON_UP); } RelayEvent(WM_LBUTTONUP,wparam,lparam); break; @@ -763,12 +781,36 @@ LRESULT CALLBACK FrameWndProc ( else if (usingcursor) { DrawCrosshairs(x,y); - if (sg_Mouse.Active()) - sg_Mouse.SetPosition(x-viewportx-2, VIEWPORTCX-4, y-viewporty-2, VIEWPORTCY-4); - else - JoySetPosition(x-viewportx-2, VIEWPORTCX-4, y-viewporty-2, VIEWPORTCY-4); + JoySetPosition(x-viewportx-2, VIEWPORTCX-4, y-viewporty-2, VIEWPORTCY-4); } + else if (sg_Mouse.Active() && (g_nAppMode == MODE_RUNNING)) + { + if ((x >= viewportx+2) && + (x < buttonx) && + (y >= viewporty+2) && + (y <= viewporty+VIEWPORTCY-1)) + { + if (g_bShowingCursor) + { + int nCount = ShowCursor(0); + _ASSERT(nCount < 0); + g_bShowingCursor = false; + } + sg_Mouse.SetPositionRel(x-g_uPrevMouseX, y-g_uPrevMouseY); + } + else + { + if (!g_bShowingCursor) + { + int nCount = ShowCursor(1); + _ASSERT(nCount >= 0); + g_bShowingCursor = true; + } + } + } RelayEvent(WM_MOUSEMOVE,wparam,lparam); + g_uPrevMouseX = x; + g_uPrevMouseY = y; break; } diff --git a/AppleWin/source/MouseInterface.cpp b/AppleWin/source/MouseInterface.cpp index 3373903c..164b3968 100644 --- a/AppleWin/source/MouseInterface.cpp +++ b/AppleWin/source/MouseInterface.cpp @@ -103,9 +103,9 @@ void CMouseInterface::Initialize(LPBYTE pCxRomPeripheral, UINT uSlot) // - SetSlotRom(); - RegisterIoHandler(uSlot, &CMouseInterface::IORead, &CMouseInterface::IOWrite, NULL, NULL, this, NULL); m_bActive = true; + SetSlotRom(); // Pre: m_bActive == true + RegisterIoHandler(uSlot, &CMouseInterface::IORead, &CMouseInterface::IOWrite, NULL, NULL, this, NULL); } void CMouseInterface::Uninitialize() @@ -122,15 +122,16 @@ void CMouseInterface::Reset() // + m_nX = 0; + m_nY = 0; + m_iX = 0; m_iMinX = 0; m_iMaxX = 1023; - m_iRangeX = 0; m_iY = 0; m_iMinY = 0; m_iMaxY = 1023; - m_iRangeY = 0; m_bButtons[0] = m_bButtons[1] = FALSE; @@ -285,7 +286,7 @@ void CMouseInterface::OnCommand() break; case MOUSE_HOME: m_nDataLen = 1; - SetPosition( 0, 0 ); + SetPositionAbs( 0, 0 ); break; case MOUSE_TIME: // 0x90 switch( m_byBuff[0] & 0x0C ) @@ -321,21 +322,21 @@ void CMouseInterface::OnWrite() nMin = ( m_byBuff[3] << 8 ) | m_byBuff[1]; nMax = ( m_byBuff[4] << 8 ) | m_byBuff[2]; if ( m_byBuff[0] & 1 ) // Clamp Y - ClampY( nMin, nMax ); + SetClampY( nMin, nMax ); else // Clamp X - ClampX( nMin, nMax ); + SetClampX( nMin, nMax ); break; case MOUSE_POS: m_nX = ( m_byBuff[2] << 8 ) | m_byBuff[1]; m_nY = ( m_byBuff[4] << 8 ) | m_byBuff[3]; - SetPosition( m_nX, m_nY ); + SetPositionAbs( m_nX, m_nY ); break; case MOUSE_INIT: m_nX = 0; m_nY = 0; - ClampX( 0, 1023 ); - ClampY( 0, 1023 ); - SetPosition( 0, 0 ); + SetClampX( 0, 1023 ); + SetClampY( 0, 1023 ); + SetPositionAbs( 0, 0 ); break; } } @@ -386,74 +387,61 @@ void CMouseInterface::Clear() m_nY = 0; m_bBtn0 = 0; m_bBtn1 = 0; - SetPosition( 0, 0 ); + SetPositionAbs( 0, 0 ); // CpuIrqDeassert(IS_MOUSE); } //=========================================================================== -void CMouseInterface::ClampX(int iMinX, int iMaxX) +void CMouseInterface::ClampX() +{ + if ( m_iX > m_iMaxX ) + m_iX = m_iMaxX; + else if ( m_iX < m_iMinX ) + m_iX = m_iMinX; +} + +void CMouseInterface::ClampY() +{ + if ( m_iY > m_iMaxY ) + m_iY = m_iMaxY; + else if ( m_iY < m_iMinY ) + m_iY = m_iMinY; +} + +void CMouseInterface::SetClampX(int iMinX, int iMaxX) { if ( iMinX < 0 || iMinX > iMaxX ) return; m_iMaxX = iMaxX; m_iMinX = iMinX; - if ( m_iX > m_iMaxX ) m_iX = m_iMaxX; else if ( m_iX < m_iMinX ) m_iX = m_iMinX; + ClampX(); } -void CMouseInterface::ClampY(int iMinY, int iMaxY) +void CMouseInterface::SetClampY(int iMinY, int iMaxY) { if ( iMinY < 0 || iMinY > iMaxY ) return; m_iMaxY = iMaxY; m_iMinY = iMinY; - if ( m_iY > m_iMaxY ) m_iY = m_iMaxY; else if ( m_iY < m_iMinX ) m_iY = m_iMinY; + ClampY(); } -void CMouseInterface::SetPosition(int xvalue, int yvalue) +void CMouseInterface::SetPositionAbs(int x, int y) { - if ((m_iRangeX == 0) || (m_iRangeY == 0)) - { - m_nX = m_iX = m_iMinX; - m_nY = m_iY = m_iMinY; - return; - } - -#if NDEBUG - m_iX = (UINT) ((xvalue*m_iMaxX) / m_iRangeX); - m_iY = (UINT) ((yvalue*m_iMaxY) / m_iRangeY); -#else - if (m_iMaxX <= m_iRangeX) - { - m_iX = (UINT) ((xvalue*m_iMaxX) / m_iRangeX); - m_iY = (UINT) ((yvalue*m_iMaxY) / m_iRangeY); - } - else - { -// m_iX = (UINT) ((xvalue*m_iRangeX) / m_iMaxX); -// m_iY = (UINT) ((yvalue*m_iRangeY) / m_iMaxY); - m_iX = xvalue; - m_iY = yvalue; - } -#endif + m_iX = x; + m_iY = y; } -void CMouseInterface::SetPosition(int xvalue, int xrange, int yvalue, int yrange) +void CMouseInterface::SetPositionRel(int dx, int dy) { - m_iRangeX = (UINT) xrange; - m_iRangeY = (UINT) yrange; + m_iX += dx; + ClampX(); -#if NDEBUG -#else - if (m_iMaxX > m_iRangeX) - { - xvalue = (int) ( ((float)xvalue / (float)m_iRangeX) * (float)m_iMaxX ); - yvalue = (int) ( ((float)yvalue / (float)m_iRangeY) * (float)m_iMaxY ); - } -#endif + m_iY += dy; + ClampY(); - SetPosition(xvalue, yvalue); OnMouseEvent(); } diff --git a/AppleWin/source/MouseInterface.h b/AppleWin/source/MouseInterface.h index 170e391c..112785bc 100644 --- a/AppleWin/source/MouseInterface.h +++ b/AppleWin/source/MouseInterface.h @@ -19,7 +19,7 @@ public: static BYTE __stdcall IORead(WORD PC, WORD uAddr, BYTE bWrite, BYTE uValue, ULONG nCyclesLeft); static BYTE __stdcall IOWrite(WORD PC, WORD uAddr, BYTE bWrite, BYTE uValue, ULONG nCyclesLeft); - void SetPosition(int xvalue, int xrange, int yvalue, int yrange); + void SetPositionRel(int dx, int dy); void SetButton(eBUTTON Button, eBUTTONSTATE State); bool Active() { return m_bActive; } void SetVBlank(bool bVBL); @@ -36,9 +36,11 @@ protected: friend WRITE_HANDLER( M6821_Listener_B ); //friend CALLBACK_HANDLER( MouseHandler ); - void SetPosition(int xvalue, int yvalue); - void ClampX(int iMinX, int iMaxX); - void ClampY(int iMinY, int iMaxY); + void SetPositionAbs(int x, int y); + void ClampX(); + void ClampY(); + void SetClampX(int iMinX, int iMaxX); + void SetClampY(int iMinY, int iMaxY); C6821 m_6821; @@ -61,14 +63,12 @@ protected: // - UINT m_iX; - UINT m_iRangeX; - UINT m_iMinX; - UINT m_iMaxX; - UINT m_iY; - UINT m_iRangeY; - UINT m_iMinY; - UINT m_iMaxY; + int m_iX; + int m_iMinX; + int m_iMaxX; + int m_iY; + int m_iMinY; + int m_iMaxY; BOOL m_bButtons[2];