From 50d0da2604f79c4246312681c9e1cb0a5e5402d5 Mon Sep 17 00:00:00 2001 From: maiconpintoabreu Date: Tue, 30 Sep 2025 11:16:16 +0100 Subject: [PATCH] Add monitor drawing and more information --- examples/core/core_monitor_change.c | 113 +++++++++++++++++++++----- examples/core/core_monitor_change.png | Bin 6062 -> 16852 bytes 2 files changed, 94 insertions(+), 19 deletions(-) diff --git a/examples/core/core_monitor_change.c b/examples/core/core_monitor_change.c index f9c9e3040..bcbb7c990 100644 --- a/examples/core/core_monitor_change.c +++ b/examples/core/core_monitor_change.c @@ -17,6 +17,19 @@ #include "raylib.h" +#define MAX_MONITORS 10 + +// Monitor Details +typedef struct Monitor { + Vector2 position; + char *name; + int width; + int height; + int physicalWidth; + int physicalHeight; + int refreshRate; +} Monitor; + //------------------------------------------------------------------------------------ // Program main entry point //------------------------------------------------------------------------------------ @@ -27,9 +40,12 @@ int main(void) const int screenWidth = 800; const int screenHeight = 450; + Monitor monitors[MAX_MONITORS] = { 0 }; + InitWindow(screenWidth, screenHeight, "raylib [core] example - monitor change"); - int currentMonitor = GetCurrentMonitor(); + int currentMonitorIndex = GetCurrentMonitor(); + int monitorCount = 0; SetTargetFPS(60); // Set our game to run at 60 frames-per-second //-------------------------------------------------------------------------------------- @@ -40,18 +56,43 @@ int main(void) // Update //---------------------------------------------------------------------------------- - if (IsKeyPressed(KEY_ENTER)) { - currentMonitor += 1; - if(currentMonitor == GetMonitorCount()) { - currentMonitor = 0; + // Rebuild monitors array with the new monitor count + if (monitorCount != GetMonitorCount()) + { + monitorCount = GetMonitorCount(); + for (int i = 0; i < monitorCount; i++) + { + monitors[i] = (Monitor){ + GetMonitorPosition(i), + GetMonitorName(i), + GetMonitorWidth(i), + GetMonitorHeight(i), + GetMonitorPhysicalWidth(i), + GetMonitorPhysicalHeight(i), + GetMonitorRefreshRate(i) + }; } - SetWindowMonitor(currentMonitor); - } else { - currentMonitor = GetCurrentMonitor(); } - - const Vector2 resolution = (Vector2){(float)GetMonitorWidth(currentMonitor), (float)GetMonitorHeight(currentMonitor)}; - const int refreshRate = GetMonitorRefreshRate(currentMonitor); + + if (IsKeyPressed(KEY_ENTER) && monitorCount > 1) + { + currentMonitorIndex += 1; + + // Set index to 0 if the last one + if(currentMonitorIndex == GetMonitorCount()) + { + currentMonitorIndex = 0; + } + SetWindowMonitor(currentMonitorIndex); // Move window to currentMonitorIndex + } + else + { + // Get currentMonitorIndex if manually moved + currentMonitorIndex = GetCurrentMonitor(); + } + const Monitor currentMonitor = monitors[currentMonitorIndex]; + + const float monitorScale = 0.2 / monitorCount; // Draw //---------------------------------------------------------------------------------- @@ -59,16 +100,50 @@ int main(void) ClearBackground(RAYWHITE); - DrawText("[Enter] Move to the next monitor available", 20, 20, 20, DARKGRAY); + DrawText("Press [Enter] to move window to next monitor available", 20, 20, 20, DARKGRAY); DrawText( - TextFormat("%3.0f x %3.0f [%ihz]", - resolution.x, - resolution.y, - refreshRate - ), 20, 70, 20, GRAY); - DrawText(TextFormat("%i", currentMonitor), screenWidth * 0.5, screenHeight * 0.5, 70, GRAY); - DrawRectangleLines(20, 100, screenWidth - 40, screenHeight - 120, DARKGRAY); + TextFormat("Resolution: [%ipx x %ipx]\nRefreshRate: [%ihz]\nPhysical Size: [%imm x %imm]\nPosition: %3.2f x %3.2f", + currentMonitor.width, + currentMonitor.height, + currentMonitor.refreshRate, + currentMonitor.physicalWidth, + currentMonitor.physicalHeight, + currentMonitor.position.x, + currentMonitor.position.y + ), 30, 80, 20, GRAY); + + // List available Monitors + for (int i = 0; i < monitorCount; i++) + { + DrawText(TextFormat("%s", monitors[i].name), 40, 180 + 20*i, 20, GRAY); + if (i == currentMonitorIndex) + { + DrawCircle(30, 190 + 20*i, 5, RED); + } + } + DrawRectangleLines(20, 60, screenWidth - 40, screenHeight - 100, DARKGRAY); + + // Draw Monitors + for (int i = 0; i < monitorCount; i++) + { + const Rectangle rec = (Rectangle){ + monitors[i].position.x * monitorScale + 140, + monitors[i].position.y * monitorScale + 180, + monitors[i].width * monitorScale, + monitors[i].height * monitorScale + }; + if (i == currentMonitorIndex) + { + DrawRectangleLinesEx(rec, 5, RED); + } + else + { + DrawRectangleLinesEx(rec, 5, GRAY); + } + DrawText(TextFormat("%i", i), rec.x + rec.width * 0.5 - 10, rec.y + rec.height * 0.5 - 25, 50, GRAY); + + } EndDrawing(); diff --git a/examples/core/core_monitor_change.png b/examples/core/core_monitor_change.png index ceb984ccb10910ff48681ad568e058f339d6eb32..5b8d1aedbd658c271c540ce2dba40dc61eca28a7 100644 GIT binary patch literal 16852 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 literal 6062 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