From f53dc2147589290077d31c5258b05f5459053ff4 Mon Sep 17 00:00:00 2001 From: elasota Date: Wed, 20 May 2020 17:20:50 -0400 Subject: [PATCH] Window API refactor --- GpApp/DialogUtils.cpp | 2 +- GpApp/Events.cpp | 3 +- GpApp/HouseInfo.cpp | 2 +- GpApp/Input.cpp | 2 +- GpApp/Link.cpp | 2 +- GpApp/MainWindow.cpp | 16 +++---- GpApp/Map.cpp | 6 +-- GpApp/Marquee.cpp | 2 +- GpApp/Play.cpp | 4 +- GpApp/Render.cpp | 8 ++-- GpApp/RoomInfo.cpp | 4 +- GpApp/Scoreboard.cpp | 22 +++++----- GpApp/Settings.cpp | 12 +++--- GpApp/Tools.cpp | 4 +- GpApp/Transitions.cpp | 6 +-- GpApp/WindowUtils.cpp | 7 +-- PortabilityLayer/BitmapImage.cpp | 2 +- PortabilityLayer/DialogManager.cpp | 20 ++++----- PortabilityLayer/PLButtonWidget.cpp | 2 +- PortabilityLayer/PLCore.cpp | 28 +++++++++--- PortabilityLayer/PLCore.h | 23 ++++++---- PortabilityLayer/PLPopupMenuWidget.cpp | 6 +-- PortabilityLayer/PLQDraw.cpp | 15 +------ PortabilityLayer/PLQDraw.h | 4 -- PortabilityLayer/QDGraf.h | 2 +- PortabilityLayer/WindowManager.cpp | 60 +++++++++++++------------- 26 files changed, 137 insertions(+), 127 deletions(-) diff --git a/GpApp/DialogUtils.cpp b/GpApp/DialogUtils.cpp index 69b2bc2..32a2c4b 100644 --- a/GpApp/DialogUtils.cpp +++ b/GpApp/DialogUtils.cpp @@ -36,7 +36,7 @@ void BringUpDialog (Dialog **theDialog, short dialogID, const DialogTextSubstitu // CenterDialog(dialogID); if (*theDialog == nil) RedAlert(kErrDialogDidntLoad); - SetGraphicsPort(&(*theDialog)->GetWindow()->m_surface); + SetGraphicsPort((*theDialog)->GetWindow()->GetDrawSurface()); ShowWindow((*theDialog)->GetWindow()); DrawDefaultButton(*theDialog); } diff --git a/GpApp/Events.cpp b/GpApp/Events.cpp index f6fffe2..2581c39 100644 --- a/GpApp/Events.cpp +++ b/GpApp/Events.cpp @@ -454,8 +454,7 @@ void KeepWindowInBounds(Window *window) int32_t leftNudge = std::max(-windowRect.Left(), 0); int32_t rightNudge = std::min(thisMac.fullScreen.right - windowRect.Right(), 0); - window->m_wmX += leftNudge + rightNudge; - window->m_wmY += topNudge + bottomNudge; + window->SetPosition(window->GetPosition() + PortabilityLayer::Vec2i(leftNudge + rightNudge, topNudge + bottomNudge)); } void HandleEditorResolutionChange(void) diff --git a/GpApp/HouseInfo.cpp b/GpApp/HouseInfo.cpp index 53da7af..936d5ef 100644 --- a/GpApp/HouseInfo.cpp +++ b/GpApp/HouseInfo.cpp @@ -173,7 +173,7 @@ int16_t HouseFilter(Dialog *dial, const TimeTaggedVOSEvent *evt) if (mouseEvt.m_eventType == GpMouseEventTypes::kMove) { mouseIs = Point::Create(mouseEvt.m_x, mouseEvt.m_y); - mouseIs -= dial->GetWindow()->TopLeftCoord(); + mouseIs -= dial->GetWindow()->GetTopLeftCoord(); if ((houseEditText1.Contains(mouseIs)) || (houseEditText2.Contains(mouseIs))) { diff --git a/GpApp/Input.cpp b/GpApp/Input.cpp index 06a8453..f7e9888 100644 --- a/GpApp/Input.cpp +++ b/GpApp/Input.cpp @@ -119,7 +119,7 @@ void DoPause (void) } CopyBits((BitMap *)*GetGWorldPixMap(workSrcMap), - GetPortBitMapForCopyBits(GetWindowPort(mainWindow)), + GetPortBitMapForCopyBits(mainWindow->GetDrawSurface()), &bounds, &bounds, srcCopy); do diff --git a/GpApp/Link.cpp b/GpApp/Link.cpp index 855fc46..83607dc 100644 --- a/GpApp/Link.cpp +++ b/GpApp/Link.cpp @@ -379,7 +379,7 @@ void HandleLinkClick (Point wherePt) return; SetPortWindowPort(linkWindow); - wherePt -= linkWindow->TopLeftCoord(); + wherePt -= linkWindow->GetTopLeftCoord(); part = FindControl(wherePt, linkWindow, &theControl); if ((theControl != nil) && (part != 0)) diff --git a/GpApp/MainWindow.cpp b/GpApp/MainWindow.cpp index 1474326..32d3e27 100644 --- a/GpApp/MainWindow.cpp +++ b/GpApp/MainWindow.cpp @@ -117,7 +117,7 @@ void RedrawSplashScreen (void) SetPortWindowPort(mainWindow); CopyBits((BitMap *)*GetGWorldPixMap(workSrcMap), - GetPortBitMapForCopyBits(GetWindowPort(mainWindow)), + GetPortBitMapForCopyBits(mainWindow->GetDrawSurface()), &workSrcRect, &workSrcRect, srcCopy); // if (quickerTransitions) @@ -126,7 +126,7 @@ void RedrawSplashScreen (void) // DissBits(&workSrcRect); CopyRectMainToWork(&workSrcRect); - mainWindow->m_surface.m_port.SetDirty(PortabilityLayer::QDPortDirtyFlag_Contents); + mainWindow->GetDrawSurface()->m_port.SetDirty(PortabilityLayer::QDPortDirtyFlag_Contents); PortabilityLayer::MenuManager::GetInstance()->SetMenuVisible(true); } @@ -144,7 +144,7 @@ void UpdateMainWindow (void) { PauseMarquee(); CopyBits((BitMap *)*GetGWorldPixMap(workSrcMap), - GetPortBitMapForCopyBits(GetWindowPort(mainWindow)), + GetPortBitMapForCopyBits(mainWindow->GetDrawSurface()), &mainWindowRect, &mainWindowRect, srcCopy); ResumeMarquee(); } @@ -155,14 +155,14 @@ void UpdateMainWindow (void) QOffsetRect(&tempRect, splashOriginH, splashOriginV); LoadScaledGraphic(workSrcMap, kSplash8BitPICT, &tempRect); CopyBits((BitMap *)*GetGWorldPixMap(workSrcMap), - GetPortBitMapForCopyBits(GetWindowPort(mainWindow)), + GetPortBitMapForCopyBits(mainWindow->GetDrawSurface()), &workSrcRect, &mainWindowRect, srcCopy); SetPortWindowPort(mainWindow); DrawOnSplash(mainWindow->GetDrawSurface()); } - mainWindow->m_surface.m_port.SetDirty(PortabilityLayer::QDPortDirtyFlag_Contents); + mainWindow->GetDrawSurface()->m_port.SetDirty(PortabilityLayer::QDPortDirtyFlag_Contents); splashDrawn = true; } @@ -279,10 +279,10 @@ void OpenMainWindow (void) } CopyBits((BitMap *)*GetGWorldPixMap(workSrcMap), - GetPortBitMapForCopyBits(GetWindowPort(mainWindow)), + GetPortBitMapForCopyBits(mainWindow->GetDrawSurface()), &mainWindowRect, &mainWindowRect, srcCopy); - mainWindow->m_surface.m_port.SetDirty(PortabilityLayer::QDPortDirtyFlag_Contents); + mainWindow->GetDrawSurface()->m_port.SetDirty(PortabilityLayer::QDPortDirtyFlag_Contents); } //-------------------------------------------------------------- CloseMainWindow @@ -373,7 +373,7 @@ void HandleMainClick (Point wherePt, Boolean isDoubleClick) return; SetPortWindowPort(mainWindow); - wherePt -= mainWindow->TopLeftCoord(); + wherePt -= mainWindow->GetTopLeftCoord(); DrawSurface *mainWindowSurface = mainWindow->GetDrawSurface(); diff --git a/GpApp/Map.cpp b/GpApp/Map.cpp index 1d750f5..fa7a2f4 100644 --- a/GpApp/Map.cpp +++ b/GpApp/Map.cpp @@ -237,7 +237,7 @@ void RedrawMapContents (void) QSetRect(&src, 0, 0, kMapRoomWidth, kMapRoomHeight); QOffsetRect(&src, 0, type * kMapRoomHeight); CopyBits((BitMap *)*GetGWorldPixMap(nailSrcMap), - GetPortBitMapForCopyBits(GetWindowPort(mapWindow)), + GetPortBitMapForCopyBits(mapWindow->GetDrawSurface()), &src, &aRoom, srcCopy); } @@ -299,7 +299,7 @@ void RedrawMapContents (void) //-------------------------------------------------------------- UpdateMapWindow void DrawMapResizeBox(void) { - DrawSurface *surface = &mapWindow->m_surface; + DrawSurface *surface = mapWindow->GetDrawSurface(); const Rect windowRect = surface->m_port.GetRect(); Rect growBoxRect = Rect::Create(windowRect.bottom - 14, windowRect.right - 14, windowRect.bottom, windowRect.right); @@ -625,7 +625,7 @@ void HandleMapClick (const GpMouseInputEvent &theEvent) SetPortWindowPort(mapWindow); globalWhere = wherePt; - wherePt -= mapWindow->TopLeftCoord(); + wherePt -= mapWindow->GetTopLeftCoord(); wherePt.h -= 1; wherePt.v -= 1; diff --git a/GpApp/Marquee.cpp b/GpApp/Marquee.cpp index 9b16c16..8d6ce07 100644 --- a/GpApp/Marquee.cpp +++ b/GpApp/Marquee.cpp @@ -432,7 +432,7 @@ Boolean PtInMarqueeHandle (Point where) void DrawGliderMarquee (void) { - DrawSurface *surface = GetWindowPort(mainWindow); + DrawSurface *surface = mainWindow->GetDrawSurface(); ImageInvert(*GetGWorldPixMap(blowerMaskMap), GetPortBitMapForCopyBits(surface), leftStartGliderSrc, marqueeGliderRect); surface->m_port.SetDirty(PortabilityLayer::QDPortDirtyFlag_Contents); } diff --git a/GpApp/Play.cpp b/GpApp/Play.cpp index 93842fd..18479a7 100644 --- a/GpApp/Play.cpp +++ b/GpApp/Play.cpp @@ -143,7 +143,7 @@ void NewGame (short mode) #ifdef COMPILEQT if ((thisMac.hasQT) && (hasMovie)) { - theMovie.m_surface = &mainWindow->m_surface; + theMovie.m_surface = mainWindow->GetDrawSurface(); } #endif @@ -374,7 +374,7 @@ void HandleGameResolutionChange(void) OpenMainWindow(); if (hasMovie) - theMovie.m_surface = &mainWindow->m_surface; + theMovie.m_surface = mainWindow->GetDrawSurface(); ResetLocale(true); InitScoreboardMap(); diff --git a/GpApp/Render.cpp b/GpApp/Render.cpp index d2a0ad4..f022e69 100644 --- a/GpApp/Render.cpp +++ b/GpApp/Render.cpp @@ -612,7 +612,7 @@ void CopyRectsQD (void) { short i; - DrawSurface *mainWindowGraf = GetWindowPort(mainWindow); + DrawSurface *mainWindowGraf = mainWindow->GetDrawSurface(); for (i = 0; i < numWork2Main; i++) { @@ -713,7 +713,7 @@ void CopyRectWorkToBack (Rect *theRect) void CopyRectWorkToMain (Rect *theRect) { CopyBits((BitMap *)*GetGWorldPixMap(workSrcMap), - GetPortBitMapForCopyBits(GetWindowPort(mainWindow)), + GetPortBitMapForCopyBits(mainWindow->GetDrawSurface()), theRect, theRect, srcCopy); } @@ -721,7 +721,7 @@ void CopyRectWorkToMain (Rect *theRect) void CopyRectMainToWork (Rect *theRect) { - CopyBits(GetPortBitMapForCopyBits(GetWindowPort(mainWindow)), + CopyBits(GetPortBitMapForCopyBits(mainWindow->GetDrawSurface()), (BitMap *)*GetGWorldPixMap(workSrcMap), theRect, theRect, srcCopy); } @@ -730,7 +730,7 @@ void CopyRectMainToWork (Rect *theRect) void CopyRectMainToBack (Rect *theRect) { - CopyBits(GetPortBitMapForCopyBits(GetWindowPort(mainWindow)), + CopyBits(GetPortBitMapForCopyBits(mainWindow->GetDrawSurface()), (BitMap *)*GetGWorldPixMap(backSrcMap), theRect, theRect, srcCopy); } diff --git a/GpApp/RoomInfo.cpp b/GpApp/RoomInfo.cpp index 8c4cdf2..ae087c3 100644 --- a/GpApp/RoomInfo.cpp +++ b/GpApp/RoomInfo.cpp @@ -391,7 +391,7 @@ int16_t RoomFilter(Dialog *dial, const TimeTaggedVOSEvent *evt) if (evt->IsLMouseDownEvent()) { mouseIs = Point::Create(mouseEvent.m_x, mouseEvent.m_y); - mouseIs -= dial->GetWindow()->TopLeftCoord(); + mouseIs -= dial->GetWindow()->GetTopLeftCoord(); if (tileSrc.Contains(mouseIs)) { if (StillDown()) @@ -681,7 +681,7 @@ int16_t OriginalArtFilter(Dialog *dial, const TimeTaggedVOSEvent *evt) const GpMouseInputEvent &mouseEvt = evt->m_vosEvent.m_event.m_mouseInputEvent; mouseIs = Point::Create(mouseEvt.m_x, mouseEvt.m_y); - mouseIs -= dial->GetWindow()->TopLeftCoord(); + mouseIs -= dial->GetWindow()->GetTopLeftCoord(); if (leftBound.Contains(mouseIs)) return 7; else if (topBound.Contains(mouseIs)) diff --git a/GpApp/Scoreboard.cpp b/GpApp/Scoreboard.cpp index b070741..0e0462b 100644 --- a/GpApp/Scoreboard.cpp +++ b/GpApp/Scoreboard.cpp @@ -56,7 +56,7 @@ extern Boolean evenFrame, onePlayerLeft; void MarkScoreboardPortDirty(void) { - GetWindowPort(boardWindow)->m_port.SetDirty(PortabilityLayer::QDPortDirtyFlag_Contents); + boardWindow->GetDrawSurface()->m_port.SetDirty(PortabilityLayer::QDPortDirtyFlag_Contents); } //-------------------------------------------------------------- RefreshScoreboard @@ -71,7 +71,7 @@ void RefreshScoreboard (SInt16 mode) RefreshPoints(); CopyBits((BitMap *)*GetGWorldPixMap(boardSrcMap), - GetPortBitMapForCopyBits(GetWindowPort(boardWindow)), + GetPortBitMapForCopyBits(boardWindow->GetDrawSurface()), &boardSrcRect, &boardDestRect, srcCopy); MarkScoreboardPortDirty(); @@ -293,7 +293,7 @@ void QuickGlidersRefresh (void) surface->DrawString(textPoint, nGlidersStr, true); CopyBits((BitMap *)*GetGWorldPixMap(boardGSrcMap), - GetPortBitMapForCopyBits(GetWindowPort(boardWindow)), + GetPortBitMapForCopyBits(boardWindow->GetDrawSurface()), &boardGSrcRect, &boardGQDestRect, srcCopy); MarkScoreboardPortDirty(); @@ -323,7 +323,7 @@ void QuickScoreRefresh (void) surface->DrawString(textPoint, scoreStr, true); CopyBits((BitMap *)*GetGWorldPixMap(boardPSrcMap), - GetPortBitMapForCopyBits(GetWindowPort(boardWindow)), + GetPortBitMapForCopyBits(boardWindow->GetDrawSurface()), &boardPSrcRect, &boardPQDestRect, srcCopy); MarkScoreboardPortDirty(); @@ -336,7 +336,7 @@ void QuickBatteryRefresh (Boolean flash) if ((batteryTotal > 0) && (!flash)) { CopyBits((BitMap *)*GetGWorldPixMap(badgeSrcMap), - GetPortBitMapForCopyBits(GetWindowPort(boardWindow)), + GetPortBitMapForCopyBits(boardWindow->GetDrawSurface()), &badgesBadgesRects[kBatteryBadge], &badgesDestRects[kBatteryBadge], srcCopy); @@ -344,7 +344,7 @@ void QuickBatteryRefresh (Boolean flash) else if ((batteryTotal < 0) && (!flash)) { CopyBits((BitMap *)*GetGWorldPixMap(badgeSrcMap), - GetPortBitMapForCopyBits(GetWindowPort(boardWindow)), + GetPortBitMapForCopyBits(boardWindow->GetDrawSurface()), &badgesBadgesRects[kHeliumBadge], &badgesDestRects[kHeliumBadge], srcCopy); @@ -352,7 +352,7 @@ void QuickBatteryRefresh (Boolean flash) else { CopyBits((BitMap *)*GetGWorldPixMap(badgeSrcMap), - GetPortBitMapForCopyBits(GetWindowPort(boardWindow)), + GetPortBitMapForCopyBits(boardWindow->GetDrawSurface()), &badgesBlankRects[kBatteryBadge], &badgesDestRects[kBatteryBadge], srcCopy); @@ -368,7 +368,7 @@ void QuickBandsRefresh (Boolean flash) if ((bandsTotal > 0) && (!flash)) { CopyBits((BitMap *)*GetGWorldPixMap(badgeSrcMap), - GetPortBitMapForCopyBits(GetWindowPort(boardWindow)), + GetPortBitMapForCopyBits(boardWindow->GetDrawSurface()), &badgesBadgesRects[kBandsBadge], &badgesDestRects[kBandsBadge], srcCopy); @@ -376,7 +376,7 @@ void QuickBandsRefresh (Boolean flash) else { CopyBits((BitMap *)*GetGWorldPixMap(badgeSrcMap), - GetPortBitMapForCopyBits(GetWindowPort(boardWindow)), + GetPortBitMapForCopyBits(boardWindow->GetDrawSurface()), &badgesBlankRects[kBandsBadge], &badgesDestRects[kBandsBadge], srcCopy); @@ -392,7 +392,7 @@ void QuickFoilRefresh (Boolean flash) if ((foilTotal > 0) && (!flash)) { CopyBits((BitMap *)*GetGWorldPixMap(badgeSrcMap), - GetPortBitMapForCopyBits(GetWindowPort(boardWindow)), + GetPortBitMapForCopyBits(boardWindow->GetDrawSurface()), &badgesBadgesRects[kFoilBadge], &badgesDestRects[kFoilBadge], srcCopy); @@ -400,7 +400,7 @@ void QuickFoilRefresh (Boolean flash) else { CopyBits((BitMap *)*GetGWorldPixMap(badgeSrcMap), - GetPortBitMapForCopyBits(GetWindowPort(boardWindow)), + GetPortBitMapForCopyBits(boardWindow->GetDrawSurface()), &badgesBlankRects[kFoilBadge], &badgesDestRects[kFoilBadge], srcCopy); diff --git a/GpApp/Settings.cpp b/GpApp/Settings.cpp index 78d9aa9..c81d76b 100644 --- a/GpApp/Settings.cpp +++ b/GpApp/Settings.cpp @@ -494,7 +494,7 @@ void DoControlPrefs (void) prefDlg = PortabilityLayer::DialogManager::GetInstance()->LoadDialog(kControlPrefsDialID, kPutInFront, nullptr); if (prefDlg == nil) RedAlert(kErrDialogDidntLoad); - SetGraphicsPort(&prefDlg->GetWindow()->m_surface); + SetGraphicsPort(prefDlg->GetWindow()->GetDrawSurface()); for (i = 0; i < 4; i++) { GetDialogItemRect(prefDlg, i + kRightControl, &controlRects[i]); @@ -1204,7 +1204,7 @@ int16_t PrefsFilter (Dialog *dial, const TimeTaggedVOSEvent *evt) const Window *window = dial->GetWindow(); const GpMouseInputEvent &mouseEvent = evt->m_vosEvent.m_event.m_mouseInputEvent; - const Point testPt = Point::Create(mouseEvent.m_x - window->m_wmX, mouseEvent.m_y - window->m_wmY); + const Point testPt = window->MouseToLocal(evt->m_vosEvent.m_event.m_mouseInputEvent); int16_t hitCode = -1; @@ -1263,20 +1263,20 @@ void DoSettingsMain (void) case kDisplayButton: FlashSettingsButton(surface, 0); DoDisplayPrefs(); - SetGraphicsPort(&prefDlg->GetWindow()->m_surface); + SetGraphicsPort(prefDlg->GetWindow()->GetDrawSurface()); break; case kSoundButton: FlashSettingsButton(surface, 1); DoSoundPrefs(); - SetGraphicsPort(&prefDlg->GetWindow()->m_surface); + SetGraphicsPort(prefDlg->GetWindow()->GetDrawSurface()); FlushEvents(everyEvent, 0); break; case kControlsButton: FlashSettingsButton(surface, 2); DoControlPrefs(); - SetGraphicsPort(&prefDlg->GetWindow()->m_surface); + SetGraphicsPort(prefDlg->GetWindow()->GetDrawSurface()); break; case kBrainsButton: @@ -1288,7 +1288,7 @@ void DoSettingsMain (void) } FlashSettingsButton(surface, 3); DoBrainsPrefs(); - SetGraphicsPort(&prefDlg->GetWindow()->m_surface); + SetGraphicsPort(prefDlg->GetWindow()->GetDrawSurface()); break; case kAllDefaultsButton: diff --git a/GpApp/Tools.cpp b/GpApp/Tools.cpp index d199a44..42cbaa2 100644 --- a/GpApp/Tools.cpp +++ b/GpApp/Tools.cpp @@ -182,7 +182,7 @@ void DrawToolTiles (DrawSurface *surface) QOffsetRect(&destRect, toolRects[i + 1].left + 2, toolRects[i + 1].top + 2); CopyBits((BitMap *)*GetGWorldPixMap(toolSrcMap), - GetPortBitMapForCopyBits(GetWindowPort(toolsWindow)), + GetPortBitMapForCopyBits(toolsWindow->GetDrawSurface()), &srcRect, &destRect, srcCopy); } } @@ -472,7 +472,7 @@ void HandleToolsClick (Point wherePt) return; SetPortWindowPort(toolsWindow); - wherePt -= toolsWindow->TopLeftCoord(); + wherePt -= toolsWindow->GetTopLeftCoord(); part = FindControl(wherePt, toolsWindow, &theControl); if ((theControl != nil) && (part != 0)) diff --git a/GpApp/Transitions.cpp b/GpApp/Transitions.cpp index b394071..9f6a066 100644 --- a/GpApp/Transitions.cpp +++ b/GpApp/Transitions.cpp @@ -57,7 +57,7 @@ void PourScreenOn (Rect *theRect) columnRects[i].bottom = theRect->bottom; CopyBits((BitMap *)*GetGWorldPixMap(workSrcMap), - GetPortBitMapForCopyBits(GetWindowPort(mainWindow)), + GetPortBitMapForCopyBits(mainWindow->GetDrawSurface()), &columnRects[i], &columnRects[i], srcCopy); QOffsetRect(&columnRects[i], 0, kChipHigh); @@ -115,7 +115,7 @@ void WipeScreenOn (short direction, Rect *theRect) for (i = 0; i < count; i++) { CopyBits((BitMap *)*GetGWorldPixMap(workSrcMap), - GetPortBitMapForCopyBits(GetWindowPort(mainWindow)), + GetPortBitMapForCopyBits(mainWindow->GetDrawSurface()), &wipeRect, &wipeRect, srcCopy); QOffsetRect(&wipeRect, hOffset, vOffset); @@ -135,7 +135,7 @@ void WipeScreenOn (short direction, Rect *theRect) void DumpScreenOn (Rect *theRect) { - DrawSurface *graf = GetWindowPort(mainWindow); + DrawSurface *graf = mainWindow->GetDrawSurface(); CopyBits((BitMap *)*GetGWorldPixMap(workSrcMap), GetPortBitMapForCopyBits(graf), diff --git a/GpApp/WindowUtils.cpp b/GpApp/WindowUtils.cpp index 1e547c8..3ced9b5 100644 --- a/GpApp/WindowUtils.cpp +++ b/GpApp/WindowUtils.cpp @@ -36,8 +36,9 @@ void GetWindowLeftTop (WindowPtr theWindow, short *left, short *top) } else { - *left = static_cast(theWindow->m_wmX); - *top = static_cast(theWindow->m_wmY); + const Point windowPos = theWindow->GetTopLeftCoord(); + *left = windowPos.h; + *top = windowPos.v; } } @@ -51,7 +52,7 @@ void GetWindowRect (WindowPtr theWindow, Rect *bounds) { Point upperLeft; GetWindowLeftTop(theWindow, &upperLeft.h, &upperLeft.v); - *bounds = theWindow->m_surface.m_port.GetRect() + upperLeft; + *bounds = theWindow->GetSurfaceRect() + upperLeft; } } diff --git a/PortabilityLayer/BitmapImage.cpp b/PortabilityLayer/BitmapImage.cpp index 100695a..a72e440 100644 --- a/PortabilityLayer/BitmapImage.cpp +++ b/PortabilityLayer/BitmapImage.cpp @@ -8,5 +8,5 @@ Rect BitmapImage::GetRect() const const uint32_t width = infoHeader->m_width; const uint32_t height = infoHeader->m_height; - return Rect::Create(0, 0, static_cast(height), static_cast(width)); + return Rect::Create(0, 0, static_cast(height), static_cast(width)); } diff --git a/PortabilityLayer/DialogManager.cpp b/PortabilityLayer/DialogManager.cpp index b870e43..dcdddd4 100644 --- a/PortabilityLayer/DialogManager.cpp +++ b/PortabilityLayer/DialogManager.cpp @@ -511,11 +511,7 @@ namespace PortabilityLayer Point DialogImpl::MouseToDialog(const GpMouseInputEvent &evt) { - const Window *window = m_window; - const int32_t x = evt.m_x - window->m_wmX; - const int32_t y = evt.m_y - window->m_wmY; - - return Point::Create(x, y); + return Point::Create(evt.m_x, evt.m_y) - m_window->GetTopLeftCoord(); } void DialogImpl::MakeStringSubstitutions(uint8_t *outStr, const uint8_t *inStr, const DialogTextSubstitutions *substitutions) @@ -843,7 +839,9 @@ namespace PortabilityLayer const uint16_t dialogWidth = rect.Width(); const uint16_t dialogHeight = rect.Height(); - window->m_wmX = (static_cast(displayWidth) - static_cast(dialogWidth)) / 2; + Vec2i newPosition; + + newPosition.m_x = (static_cast(displayWidth) - static_cast(dialogWidth)) / 2; // We center dialogs vertically in one of 3 ways in this priority: // - Centered at 1/3 until the top edge is at the 1/4 mark @@ -853,13 +851,15 @@ namespace PortabilityLayer //if (displayHeight / 3 - dialogHeight / 2 >= displayHeight / 4) if (static_cast(displayHeight * 4) - static_cast(dialogHeight * 6) >= static_cast(displayHeight * 3)) { - //window->m_wmY = displayHeight / 3 - dialogHeight / 2; - window->m_wmY = (static_cast(displayHeight * 2) - static_cast(dialogHeight * 3)) / 6; + //newPosition.m_y = displayHeight / 3 - dialogHeight / 2; + newPosition.m_y = (static_cast(displayHeight * 2) - static_cast(dialogHeight * 3)) / 6; } else if (dialogHeight * 2U <= displayHeight) - window->m_wmY = displayHeight / 4; + newPosition.m_y = displayHeight / 4; else - window->m_wmY = (static_cast(displayHeight) - static_cast(dialogHeight)) / 2; + newPosition.m_y = (static_cast(displayHeight) - static_cast(dialogHeight)) / 2; + + window->SetPosition(newPosition); } DialogManagerImpl *DialogManagerImpl::GetInstance() diff --git a/PortabilityLayer/PLButtonWidget.cpp b/PortabilityLayer/PLButtonWidget.cpp index e8a10d7..8ea017a 100644 --- a/PortabilityLayer/PLButtonWidget.cpp +++ b/PortabilityLayer/PLButtonWidget.cpp @@ -649,7 +649,7 @@ namespace PortabilityLayer if (m_haveHighlightOverride != enabled) { m_haveHighlightOverride = enabled; - DrawControl(&m_window->m_surface); + DrawControl(m_window->GetDrawSurface()); } } } diff --git a/PortabilityLayer/PLCore.cpp b/PortabilityLayer/PLCore.cpp index 3ed82ba..3c431f5 100644 --- a/PortabilityLayer/PLCore.cpp +++ b/PortabilityLayer/PLCore.cpp @@ -128,7 +128,7 @@ PortabilityLayer::Vec2i TrackResize(WindowPtr window, Point start, uint16_t minW { PortabilityLayer::WindowManager *wm = PortabilityLayer::WindowManager::GetInstance(); - const Rect baseRect = window->m_surface.m_port.GetRect(); + const Rect baseRect = window->GetSurfaceRect(); const PortabilityLayer::Vec2i baseSize = PortabilityLayer::Vec2i(baseRect.Width(), baseRect.Height()); const PortabilityLayer::Vec2i basePoint = PortabilityLayer::Vec2i(start.h, start.v); @@ -498,8 +498,9 @@ void DisposeDirectoryFiles(DirectoryFileListEntry *firstDFL) void GetMouse(Window *window, Point *point) { const PortabilityLayer::Vec2i mousePos = PortabilityLayer::InputManager::GetInstance()->GetMousePosition(); - point->h = mousePos.m_x - window->m_wmX; - point->v = mousePos.m_y - window->m_wmY; + const PortabilityLayer::Vec2i relativePos = mousePos - window->GetPosition(); + point->h = relativePos.m_x; + point->v = relativePos.m_y; } Boolean Button() @@ -691,9 +692,26 @@ Point Window::MouseToLocal(const GpMouseInputEvent &evt) const return Point::Create(evt.m_x - m_wmX, evt.m_y - m_wmY); } -Point Window::TopLeftCoord() const +Point Window::GetTopLeftCoord() const { - return Point::Create(m_wmX, m_wmY); + const PortabilityLayer::Vec2i position = GetPosition(); + return Point::Create(position.m_x, position.m_y); +} + +Rect Window::GetSurfaceRect() const +{ + return m_surface.m_port.GetRect(); +} + +void Window::SetPosition(const PortabilityLayer::Vec2i &pos) +{ + m_wmX = pos.m_x; + m_wmY = pos.m_y; +} + +PortabilityLayer::Vec2i Window::GetPosition() const +{ + return PortabilityLayer::Vec2i(m_wmX, m_wmY); } bool Window::AddWidget(PortabilityLayer::Widget *widget) diff --git a/PortabilityLayer/PLCore.h b/PortabilityLayer/PLCore.h index d021e1d..7f2ba48 100644 --- a/PortabilityLayer/PLCore.h +++ b/PortabilityLayer/PLCore.h @@ -91,13 +91,17 @@ struct Window { Window(); - DrawSurface *GetDrawSurface() const; + void SetPosition(const PortabilityLayer::Vec2i &pos); + PortabilityLayer::Vec2i GetPosition() const; // Convenience method to convert a mouse event to local point Point MouseToLocal(const GpMouseInputEvent &evt) const; // Convenience method that returns a 16-bit precision X/Y - Point TopLeftCoord() const; + Point GetTopLeftCoord() const; + + // Returns the bounds rect of the draw surface (which is always 0,0 based + Rect GetSurfaceRect() const; bool AddWidget(PortabilityLayer::Widget *widget); ArrayView GetWidgets() const; @@ -112,15 +116,9 @@ struct Window void OnTick(); + DrawSurface *GetDrawSurface() const; DrawSurface *GetChromeSurface(WindowChromeSide_t aChromeSide) const; - DrawSurface m_surface; // Must be the first item until the immediate mode draw API is completely removed - - // The port is always at 0,0 - // These are the WM coordinates - int32_t m_wmX; - int32_t m_wmY; - protected: ~Window(); @@ -130,6 +128,13 @@ protected: size_t m_numWidgets; size_t m_numTickReceivingWidgets; + DrawSurface m_surface; + + // The surface is always at 0,0 + // These are the WM coordinates + int32_t m_wmX; + int32_t m_wmY; + PortabilityLayer::Widget *m_widgetWithFocus; }; diff --git a/PortabilityLayer/PLPopupMenuWidget.cpp b/PortabilityLayer/PLPopupMenuWidget.cpp index 9dd75bc..130d93f 100644 --- a/PortabilityLayer/PLPopupMenuWidget.cpp +++ b/PortabilityLayer/PLPopupMenuWidget.cpp @@ -41,7 +41,7 @@ namespace PortabilityLayer { const GpMouseInputEvent &mouseEvent = evt.m_vosEvent.m_event.m_mouseInputEvent; const Vec2i globalPoint = Vec2i(mouseEvent.m_x, mouseEvent.m_y); - const Vec2i localPoint = globalPoint - Vec2i(m_window->m_wmX, m_window->m_wmY); + const Vec2i localPoint = globalPoint - m_window->GetPosition(); if (this->m_rect.Contains(Point::Create(localPoint.m_x, localPoint.m_y))) { @@ -60,8 +60,8 @@ namespace PortabilityLayer { MenuManager *mm = PortabilityLayer::MenuManager::GetInstance(); - const Vec2i popupMenuPos = Vec2i(m_window->m_wmX, m_window->m_wmY) + Vec2i(m_rect.left, m_rect.top); - const Vec2i globalPos = Vec2i(pos.h, pos.v) + Vec2i(m_window->m_wmX, m_window->m_wmY); + const Vec2i popupMenuPos = m_window->GetPosition() + Vec2i(m_rect.left, m_rect.top); + const Vec2i globalPos = Vec2i(pos.h, pos.v) + m_window->GetPosition(); uint16_t item = 0; mm->PopupMenuSelect(m_menu, popupMenuPos, globalPos, m_state - 1, &item); diff --git a/PortabilityLayer/PLQDraw.cpp b/PortabilityLayer/PLQDraw.cpp index 4e381fa..f07f882 100644 --- a/PortabilityLayer/PLQDraw.cpp +++ b/PortabilityLayer/PLQDraw.cpp @@ -51,7 +51,7 @@ void SetPort(GrafPtr graf) void EndUpdate(WindowPtr graf) { - graf->m_surface.m_port.SetDirty(PortabilityLayer::QDPortDirtyFlag_Contents); + graf->GetDrawSurface()->m_port.SetDirty(PortabilityLayer::QDPortDirtyFlag_Contents); } void SetRect(Rect *rect, short left, short top, short right, short bottom) @@ -65,7 +65,7 @@ void SetRect(Rect *rect, short left, short top, short right, short bottom) void SetPortWindowPort(WindowPtr window) { PortabilityLayer::WindowManager *wm = PortabilityLayer::WindowManager::GetInstance(); - PortabilityLayer::QDManager::GetInstance()->SetPort(&window->m_surface.m_port); + PortabilityLayer::QDManager::GetInstance()->SetPort(&window->GetDrawSurface()->m_port); } void SetPortDialogPort(Dialog *dialog) @@ -1708,17 +1708,6 @@ PixMap *GetPortBitMapForCopyBits(DrawSurface *grafPtr) return *grafPtr->m_port.GetPixMap(); } -DrawSurface *GetWindowPort(WindowPtr window) -{ - return &window->m_surface; -} - -void SubPt(Point srcPoint, Point *destPoint) -{ - PL_NotYetImplemented(); -} - - Boolean SectRect(const Rect *rectA, const Rect *rectB, Rect *outIntersection) { *outIntersection = rectA->Intersect(*rectB); diff --git a/PortabilityLayer/PLQDraw.h b/PortabilityLayer/PLQDraw.h index 3c529ba..961103c 100644 --- a/PortabilityLayer/PLQDraw.h +++ b/PortabilityLayer/PLQDraw.h @@ -99,10 +99,6 @@ void ImageInvert(const PixMap *invertMask, PixMap *targetBitmap, const Rect &src bool PointInScanlineMask(Point point, PortabilityLayer::ScanlineMask *scanlineMask); PixMap *GetPortBitMapForCopyBits(DrawSurface *grafPtr); -DrawSurface *GetWindowPort(WindowPtr window); - -// Subtracts srcPoint from destPoint (reverse of DeltaPoint) -void SubPt(Point srcPoint, Point *destPoint); Boolean SectRect(const Rect *rectA, const Rect *rectB, Rect *outIntersection); diff --git a/PortabilityLayer/QDGraf.h b/PortabilityLayer/QDGraf.h index 98bf22f..33fcd0b 100644 --- a/PortabilityLayer/QDGraf.h +++ b/PortabilityLayer/QDGraf.h @@ -24,7 +24,7 @@ struct IGpDisplayDriver; struct IGpDisplayDriverSurface; class PLPasStr; -struct DrawSurface final +struct DrawSurface { DrawSurface() : m_port(PortabilityLayer::QDPortType_DrawSurface) diff --git a/PortabilityLayer/WindowManager.cpp b/PortabilityLayer/WindowManager.cpp index 34a748c..2d7b45a 100644 --- a/PortabilityLayer/WindowManager.cpp +++ b/PortabilityLayer/WindowManager.cpp @@ -1059,10 +1059,11 @@ namespace PortabilityLayer WindowImpl *window = m_windowStackTop; while (window) { - const Rect windowRect = window->m_surface.m_port.GetRect(); + const Rect windowRect = window->GetSurfaceRect(); + const Vec2i windowPos = window->GetPosition(); - const int32_t localX = point.h - window->m_wmX; - const int32_t localY = point.v - window->m_wmY; + const int32_t localX = point.h - windowPos.m_x; + const int32_t localY = point.v - windowPos.m_y; RegionID_t chromeInteractionZone = RegionIDs::kContent; if (window->GetChromeInteractionZone(Vec2i(localX, localY), chromeInteractionZone)) @@ -1101,7 +1102,7 @@ namespace PortabilityLayer DetachWindow(window); - if (PortabilityLayer::QDManager::GetInstance()->GetPort() == &windowImpl->m_surface.m_port) + if (PortabilityLayer::QDManager::GetInstance()->GetPort() == &windowImpl->GetDrawSurface()->m_port) PortabilityLayer::QDManager::GetInstance()->SetPort(nullptr); windowImpl->~WindowImpl(); @@ -1133,8 +1134,7 @@ namespace PortabilityLayer if (y >= constraintRect.bottom) y = constraintRect.bottom - 1; - window->m_wmX += x - baseX; - window->m_wmY += y - baseY; + window->SetPosition(window->GetPosition() + Vec2i(x - baseX, y - baseY)); baseX = x; baseY = y; @@ -1150,7 +1150,7 @@ namespace PortabilityLayer { bool isInBounds = false; - const Vec2i windowCoord = Vec2i(window->m_wmX, window->m_wmY); + const Vec2i windowCoord = window->GetPosition(); Rect2i closeBoxRect; if (!static_cast(window)->GetChromeRegionRect(RegionIDs::kClose, closeBoxRect)) @@ -1216,9 +1216,10 @@ namespace PortabilityLayer uint16_t padding[WindowChromeSides::kCount]; windowImpl->GetChromePadding(padding); - const Rect portRect = windowImpl->m_surface.m_port.GetRect(); + const Rect portRect = windowImpl->GetSurfaceRect(); + const Vec2i windowPos = windowImpl->GetPosition(); - return Rect2i(window->m_wmY - padding[WindowChromeSides::kTop], window->m_wmX - padding[WindowChromeSides::kLeft], window->m_wmY + portRect.Height() + padding[WindowChromeSides::kBottom], window->m_wmX + portRect.Width() + padding[WindowChromeSides::kRight]); + return Rect2i(windowPos.m_y - padding[WindowChromeSides::kTop], windowPos.m_x - padding[WindowChromeSides::kLeft], windowPos.m_y + portRect.Height() + padding[WindowChromeSides::kBottom], windowPos.m_x + portRect.Width() + padding[WindowChromeSides::kRight]); } bool WindowManagerImpl::GetWindowChromeInteractionZone(Window *window, const Vec2i &point, RegionID_t &outRegion) const @@ -1242,7 +1243,7 @@ namespace PortabilityLayer const Rect windowRect = window->GetDrawSurface()->m_port.GetRect(); - Vec2i topLeft = Vec2i(m_flickerWindow->m_wmX, m_flickerWindow->m_wmY); + Vec2i topLeft = m_flickerWindow->GetPosition(); Vec2i dimensions = Vec2i(windowRect.Width(), windowRect.Height()); m_flickerAxis = Vec2i(1, 1); @@ -1269,9 +1270,9 @@ namespace PortabilityLayer int32_t chromeLead = 64; int32_t flickerZoneSize = 128; - const Rect windowRect = window->GetDrawSurface()->m_port.GetRect(); + const Rect windowRect = window->GetSurfaceRect(); - Vec2i topLeft = Vec2i(m_flickerWindow->m_wmX, m_flickerWindow->m_wmY); + Vec2i topLeft = m_flickerWindow->GetPosition(); Vec2i dimensions = Vec2i(windowRect.Width(), windowRect.Height()); m_flickerAxis = Vec2i(-1, -1); @@ -1323,7 +1324,7 @@ namespace PortabilityLayer return; } - const PortabilityLayer::Vec2i topLeft = PortabilityLayer::Vec2i(window->m_wmX, window->m_wmY); + const PortabilityLayer::Vec2i topLeft = window->GetPosition(); m_resizeInProgressRect = PortabilityLayer::Rect2i(topLeft, topLeft + size); } @@ -1379,12 +1380,13 @@ namespace PortabilityLayer { uint32_t prevClearanceX = prevWidth - paddedWidth; uint32_t newClearanceX = newWidth - paddedWidth; - newX = static_cast(window->m_wmX) * static_cast(newClearanceX) / static_cast(prevClearanceX); + newX = static_cast(window->GetPosition().m_x) * static_cast(newClearanceX) / static_cast(prevClearanceX); } int64_t newY = 0; - if (window->m_wmY < static_cast(menuBarHeight)) - newY = window->m_wmY; + int32_t currentY = window->GetPosition().m_y; + if (currentY < static_cast(menuBarHeight)) + newY = currentY; else { if (newHeight <= (paddedHeight + menuBarHeight) || prevHeight <= paddedHeight + menuBarHeight) @@ -1393,15 +1395,14 @@ namespace PortabilityLayer { uint32_t prevClearanceY = prevHeight - paddedHeight - menuBarHeight; uint32_t newClearanceY = newHeight - paddedHeight - menuBarHeight; - newY = (static_cast(window->m_wmY) - static_cast(menuBarHeight) - chromePadding[WindowChromeSides::kTop]) * static_cast(newClearanceY) / static_cast(prevClearanceY) + menuBarHeight + chromePadding[WindowChromeSides::kTop]; + newY = (static_cast(currentY) - static_cast(menuBarHeight) - chromePadding[WindowChromeSides::kTop]) * static_cast(newClearanceY) / static_cast(prevClearanceY) + menuBarHeight + chromePadding[WindowChromeSides::kTop]; } } newX = std::max(0, std::min(newX, newWidth - 1)); newY = std::max(0, std::min(newY, newHeight - 1)); - window->m_wmX = static_cast(newX); - window->m_wmY = static_cast(newY); + window->SetPosition(Vec2i(newX, newY)); } } @@ -1412,8 +1413,7 @@ namespace PortabilityLayer void WindowManagerImpl::MoveWindow(Window *window, int x, int y) { - window->m_wmX = x; - window->m_wmY = y; + window->SetPosition(Vec2i(x, y)); } void WindowManagerImpl::DetachWindow(Window *window) @@ -1477,7 +1477,7 @@ namespace PortabilityLayer bool hasFlicker = (m_flickerWindow == window); - DrawSurface &graf = window->m_surface; + DrawSurface &graf = *window->GetDrawSurface(); graf.PushToDDSurface(displayDriver); @@ -1485,10 +1485,12 @@ namespace PortabilityLayer const uint16_t width = pixMap->m_rect.Width(); const uint16_t height = pixMap->m_rect.Height(); - if (hasFlicker) - ComputeFlickerEffects(Vec2i(window->m_wmX, window->m_wmY), 0, effects); + const Vec2i windowPos = window->GetPosition(); - displayDriver->DrawSurface(graf.m_ddSurface, window->m_wmX, window->m_wmY, width, height, &effects); + if (hasFlicker) + ComputeFlickerEffects(windowPos, 0, effects); + + displayDriver->DrawSurface(graf.m_ddSurface, windowPos.m_x, windowPos.m_y, width, height, &effects); if (!window->IsBorderless()) { @@ -1496,10 +1498,10 @@ namespace PortabilityLayer window->GetChromePadding(chromePadding); Vec2i chromeOrigins[WindowChromeSides::kCount]; - chromeOrigins[WindowChromeSides::kTop] = Vec2i(window->m_wmX - chromePadding[WindowChromeSides::kLeft], window->m_wmY - chromePadding[WindowChromeSides::kTop]); - chromeOrigins[WindowChromeSides::kLeft] = Vec2i(window->m_wmX - chromePadding[WindowChromeSides::kLeft], window->m_wmY); - chromeOrigins[WindowChromeSides::kRight] = Vec2i(window->m_wmX + width, window->m_wmY); - chromeOrigins[WindowChromeSides::kBottom] = Vec2i(window->m_wmX - chromePadding[WindowChromeSides::kLeft], window->m_wmY + height); + chromeOrigins[WindowChromeSides::kTop] = Vec2i(windowPos.m_x - chromePadding[WindowChromeSides::kLeft], windowPos.m_y - chromePadding[WindowChromeSides::kTop]); + chromeOrigins[WindowChromeSides::kLeft] = Vec2i(windowPos.m_x - chromePadding[WindowChromeSides::kLeft], windowPos.m_y); + chromeOrigins[WindowChromeSides::kRight] = Vec2i(windowPos.m_x + width, windowPos.m_y); + chromeOrigins[WindowChromeSides::kBottom] = Vec2i(windowPos.m_x - chromePadding[WindowChromeSides::kLeft], windowPos.m_y + height); Vec2i chromeDimensions[WindowChromeSides::kCount]; chromeDimensions[WindowChromeSides::kTop] = Vec2i(chromePadding[WindowChromeSides::kLeft] + chromePadding[WindowChromeSides::kRight] + width, chromePadding[WindowChromeSides::kTop]);