From 7c407ab6a1a92a59a0fd6e200d8b7b52a5b8c0c0 Mon Sep 17 00:00:00 2001 From: maiconpintoabreu Date: Mon, 29 Sep 2025 16:57:28 +0100 Subject: [PATCH 1/4] Add core monitor change example --- examples/core/core_monitor_change.c | 84 ++++++++++++++++++++++++++ examples/core/core_monitor_change.png | Bin 0 -> 6062 bytes 2 files changed, 84 insertions(+) create mode 100644 examples/core/core_monitor_change.c create mode 100644 examples/core/core_monitor_change.png diff --git a/examples/core/core_monitor_change.c b/examples/core/core_monitor_change.c new file mode 100644 index 000000000000..f9c9e304067c --- /dev/null +++ b/examples/core/core_monitor_change.c @@ -0,0 +1,84 @@ +/******************************************************************************************* +* +* raylib [core] example - monitor change +* +* Example complexity rating: [★☆☆☆] 1/4 +* +* Example originally created with raylib 5.5, last time updated with raylib 5.6 +* +* Example contributed by Maicon Santana (@maiconpintoabreu) and reviewed by Ramon Santamaria (@raysan5) +* +* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified, +* BSD-like license that allows static linking with closed source software +* +* Copyright (c) 2025-2025 Maicon Santana (@maiconpintoabreu) +* +********************************************************************************************/ + +#include "raylib.h" + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +int main(void) +{ + // Initialization + //-------------------------------------------------------------------------------------- + const int screenWidth = 800; + const int screenHeight = 450; + + InitWindow(screenWidth, screenHeight, "raylib [core] example - monitor change"); + + int currentMonitor = GetCurrentMonitor(); + + SetTargetFPS(60); // Set our game to run at 60 frames-per-second + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!WindowShouldClose()) // Detect window close button or ESC key + { + // Update + //---------------------------------------------------------------------------------- + + if (IsKeyPressed(KEY_ENTER)) { + currentMonitor += 1; + if(currentMonitor == GetMonitorCount()) { + currentMonitor = 0; + } + SetWindowMonitor(currentMonitor); + } else { + currentMonitor = GetCurrentMonitor(); + } + + const Vector2 resolution = (Vector2){(float)GetMonitorWidth(currentMonitor), (float)GetMonitorHeight(currentMonitor)}; + const int refreshRate = GetMonitorRefreshRate(currentMonitor); + + // Draw + //---------------------------------------------------------------------------------- + BeginDrawing(); + + ClearBackground(RAYWHITE); + + DrawText("[Enter] Move to the 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); + + + EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} \ No newline at end of file diff --git a/examples/core/core_monitor_change.png b/examples/core/core_monitor_change.png new file mode 100644 index 0000000000000000000000000000000000000000..ceb984ccb10910ff48681ad568e058f339d6eb32 GIT binary patch literal 6062 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 literal 0 HcmV?d00001 From 50d0da2604f79c4246312681c9e1cb0a5e5402d5 Mon Sep 17 00:00:00 2001 From: maiconpintoabreu Date: Tue, 30 Sep 2025 11:16:16 +0100 Subject: [PATCH 2/4] 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 f9c9e304067c..bcbb7c990b2a 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) + }; + } + } + + if (IsKeyPressed(KEY_ENTER) && monitorCount > 1) + { + currentMonitorIndex += 1; + + // Set index to 0 if the last one + if(currentMonitorIndex == GetMonitorCount()) + { + currentMonitorIndex = 0; } - SetWindowMonitor(currentMonitor); - } else { - currentMonitor = GetCurrentMonitor(); + SetWindowMonitor(currentMonitorIndex); // Move window to currentMonitorIndex } - - const Vector2 resolution = (Vector2){(float)GetMonitorWidth(currentMonitor), (float)GetMonitorHeight(currentMonitor)}; - const int refreshRate = GetMonitorRefreshRate(currentMonitor); + 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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 From f3b7831ccc5d029c1649af6bc2b2673ae57bd26c Mon Sep 17 00:00:00 2001 From: maiconpintoabreu Date: Tue, 30 Sep 2025 17:19:36 +0100 Subject: [PATCH 3/4] Update monitor information every frame --- examples/core/core_monitor_change.c | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/examples/core/core_monitor_change.c b/examples/core/core_monitor_change.c index bcbb7c990b2a..14758c3a50fa 100644 --- a/examples/core/core_monitor_change.c +++ b/examples/core/core_monitor_change.c @@ -56,22 +56,19 @@ int main(void) // Update //---------------------------------------------------------------------------------- - // Rebuild monitors array with the new monitor count - if (monitorCount != GetMonitorCount()) + // Rebuild monitors array every frame + monitorCount = GetMonitorCount(); + for (int i = 0; i < monitorCount; i++) { - 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) - }; - } + monitors[i] = (Monitor){ + GetMonitorPosition(i), + GetMonitorName(i), + GetMonitorWidth(i), + GetMonitorHeight(i), + GetMonitorPhysicalWidth(i), + GetMonitorPhysicalHeight(i), + GetMonitorRefreshRate(i) + }; } if (IsKeyPressed(KEY_ENTER) && monitorCount > 1) From 5a221e5e2498ed5134584aad7fd1a66c49feb5f7 Mon Sep 17 00:00:00 2001 From: maiconpintoabreu Date: Tue, 30 Sep 2025 23:24:25 +0100 Subject: [PATCH 4/4] Show info and window position inside the rectangle --- examples/core/core_monitor_change.c | 72 +++++++++++++++----------- examples/core/core_monitor_change.png | Bin 16852 -> 17430 bytes 2 files changed, 43 insertions(+), 29 deletions(-) diff --git a/examples/core/core_monitor_change.c b/examples/core/core_monitor_change.c index 14758c3a50fa..8983556afab0 100644 --- a/examples/core/core_monitor_change.c +++ b/examples/core/core_monitor_change.c @@ -56,6 +56,13 @@ int main(void) // Update //---------------------------------------------------------------------------------- + // Variables to find the max x and Y to calculate the scale + int maxWidth = 1; + int maxHeight = 1; + + // Monitor offset is to fix when monitor position x is negative + int monitorOffsetX = 0; + // Rebuild monitors array every frame monitorCount = GetMonitorCount(); for (int i = 0; i < monitorCount; i++) @@ -69,6 +76,13 @@ int main(void) GetMonitorPhysicalHeight(i), GetMonitorRefreshRate(i) }; + if (monitors[i].position.x < monitorOffsetX) monitorOffsetX = monitors[i].position.x*-1; + + const int width = monitors[i].position.x + monitors[i].width; + const int height = monitors[i].position.y + monitors[i].height; + + if (maxWidth < width) maxWidth = width; + if (maxHeight < height) maxHeight = height; } if (IsKeyPressed(KEY_ENTER) && monitorCount > 1) @@ -76,10 +90,8 @@ int main(void) currentMonitorIndex += 1; // Set index to 0 if the last one - if(currentMonitorIndex == GetMonitorCount()) - { - currentMonitorIndex = 0; - } + if(currentMonitorIndex == monitorCount) currentMonitorIndex = 0; + SetWindowMonitor(currentMonitorIndex); // Move window to currentMonitorIndex } else @@ -89,7 +101,10 @@ int main(void) } const Monitor currentMonitor = monitors[currentMonitorIndex]; - const float monitorScale = 0.2 / monitorCount; + float monitorScale = 0.6; + + if(maxHeight > maxWidth + monitorOffsetX) monitorScale *= ((float)screenHeight/(float)maxHeight); + else monitorScale *= ((float)screenWidth/(float)(maxWidth + monitorOffsetX)); // Draw //---------------------------------------------------------------------------------- @@ -99,46 +114,45 @@ int main(void) DrawText("Press [Enter] to move window to next monitor available", 20, 20, 20, DARKGRAY); - DrawText( - 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 + // Draw Monitor Rectangles with information inside for (int i = 0; i < monitorCount; i++) { + // Calculate retangle position and size using monitorScale const Rectangle rec = (Rectangle){ - monitors[i].position.x * monitorScale + 140, - monitors[i].position.y * monitorScale + 180, + (monitors[i].position.x + monitorOffsetX) * monitorScale + 140, + monitors[i].position.y * monitorScale + 80, monitors[i].width * monitorScale, monitors[i].height * monitorScale }; + + // Draw monitor name and information inside the rectangle + DrawText(TextFormat("[%i] %s", i, monitors[i].name), rec.x + 10, rec.y + (int)(100*monitorScale), (int)(120*monitorScale), BLUE); + DrawText( + TextFormat("Resolution: [%ipx x %ipx]\nRefreshRate: [%ihz]\nPhysical Size: [%imm x %imm]\nPosition: %3.0f x %3.0f", + monitors[i].width, + monitors[i].height, + monitors[i].refreshRate, + monitors[i].physicalWidth, + monitors[i].physicalHeight, + monitors[i].position.x, + monitors[i].position.y + ), rec.x + 10, rec.y + (int)(200*monitorScale), (int)(120*monitorScale), DARKGRAY); + + // Highlight current monitor if (i == currentMonitorIndex) { DrawRectangleLinesEx(rec, 5, RED); + Vector2 windowPosition = (Vector2){ (GetWindowPosition().x + monitorOffsetX)*monitorScale + 140, GetWindowPosition().y*monitorScale + 80 }; + + // Draw window position based on monitors + DrawRectangleV(windowPosition, (Vector2){screenWidth * monitorScale, screenHeight * monitorScale}, Fade(GREEN, 0.5)); } 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); } diff --git a/examples/core/core_monitor_change.png b/examples/core/core_monitor_change.png index 5b8d1aedbd658c271c540ce2dba40dc61eca28a7..81f9eed875bf8edf2c11e911cad5265418e054ed 100644 GIT binary patch literal 17430 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