From b21a8973b0459e8bdafb1be26aa38d6e69279d83 Mon Sep 17 00:00:00 2001 From: Bobby Battista Date: Tue, 7 Jul 2026 23:48:58 +0400 Subject: [PATCH] fix(gui): Stop game time clock from jittering horizontally --- .../GameEngine/Include/GameClient/InGameUI.h | 2 ++ .../GameEngine/Source/GameClient/InGameUI.cpp | 29 +++++++++++++++++-- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/GeneralsMD/Code/GameEngine/Include/GameClient/InGameUI.h b/GeneralsMD/Code/GameEngine/Include/GameClient/InGameUI.h index 21a5b2d292d..6a5c582663f 100644 --- a/GeneralsMD/Code/GameEngine/Include/GameClient/InGameUI.h +++ b/GeneralsMD/Code/GameEngine/Include/GameClient/InGameUI.h @@ -800,6 +800,8 @@ friend class Drawable; // for selection/deselection transactions Coord2D m_gameTimePosition; Color m_gameTimeColor; Color m_gameTimeDropColor; + Int m_gameTimeReservedWidth; + Int m_gameTimeFrameReservedWidth; struct PlayerInfoList { diff --git a/GeneralsMD/Code/GameEngine/Source/GameClient/InGameUI.cpp b/GeneralsMD/Code/GameEngine/Source/GameClient/InGameUI.cpp index 50bf693fc67..b4b473c7850 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameClient/InGameUI.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameClient/InGameUI.cpp @@ -1195,6 +1195,8 @@ InGameUI::InGameUI() m_gameTimePosition.y = kHudAnchorY; m_gameTimeColor = GameMakeColor( 255, 255, 255, 255 ); m_gameTimeDropColor = GameMakeColor( 0, 0, 0, 255 ); + m_gameTimeReservedWidth = 0; + m_gameTimeFrameReservedWidth = 0; m_playerInfoListFont = "Tahoma"; m_playerInfoListPointSize = TheGlobalData->m_playerInfoListFontSize; @@ -6096,6 +6098,28 @@ void InGameUI::refreshGameTimeResources() GameFont* gameTimeFont = TheWindowManager->winFindFont(m_gameTimeFont, adjustedGameTimeFontSize, m_gameTimeBold); m_gameTimeString->setFont(gameTimeFont); m_gameTimeFrameString->setFont(gameTimeFont); + + // TheSuperHackers @fix bobtista 07/07/2026 Reserve widths from the widest digit so the clock does not jitter + Int maxDigitWidth = 0; + for (WideChar digit = L'0'; digit <= L'9'; ++digit) + { + UnicodeString digitString; + digitString.concat(digit); + m_gameTimeString->setText(digitString); + Int digitWidth = m_gameTimeString->getWidth(); + if (digitWidth > maxDigitWidth) + { + maxDigitWidth = digitWidth; + } + } + + m_gameTimeString->setText(UnicodeString(L":")); + Int colonWidth = m_gameTimeString->getWidth(); + m_gameTimeString->setText(UnicodeString(L".")); + Int dotWidth = m_gameTimeString->getWidth(); + + m_gameTimeReservedWidth = 6 * maxDigitWidth + 2 * colonWidth; + m_gameTimeFrameReservedWidth = dotWidth + 2 * maxDigitWidth; } void InGameUI::refreshPlayerInfoListResources() @@ -6287,8 +6311,9 @@ void InGameUI::drawGameTime() m_gameTimeFrameString->setText(gameTimeFrameString); // TheSuperHackers @info this implicitly offsets the game timer from the right instead of left of the screen - int horizontalTimerOffset = TheDisplay->getWidth() - (Int)m_gameTimePosition.x - m_gameTimeString->getWidth() - m_gameTimeFrameString->getWidth(); - int horizontalFrameOffset = TheDisplay->getWidth() - (Int)m_gameTimePosition.x - m_gameTimeFrameString->getWidth(); + // TheSuperHackers @fix bobtista 07/07/2026 Anchor timer left to reserved widths so it stops jittering; butt frame against its live right edge + int horizontalTimerOffset = TheDisplay->getWidth() - (Int)m_gameTimePosition.x - m_gameTimeReservedWidth - m_gameTimeFrameReservedWidth; + int horizontalFrameOffset = horizontalTimerOffset + m_gameTimeString->getWidth(); m_gameTimeString->draw(horizontalTimerOffset, m_gameTimePosition.y, m_gameTimeColor, m_gameTimeDropColor); m_gameTimeFrameString->draw(horizontalFrameOffset, m_gameTimePosition.y, GameMakeColor(180,180,180,255), m_gameTimeDropColor);