|
|
@@ -0,0 +1,170 @@
|
|
|
+/*******************************************************************************************
|
|
|
+*
|
|
|
+* 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"
|
|
|
+
|
|
|
+#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
|
|
|
+//------------------------------------------------------------------------------------
|
|
|
+int main(void)
|
|
|
+{
|
|
|
+ // Initialization
|
|
|
+ //--------------------------------------------------------------------------------------
|
|
|
+ const int screenWidth = 800;
|
|
|
+ const int screenHeight = 450;
|
|
|
+
|
|
|
+ Monitor monitors[MAX_MONITORS] = { 0 };
|
|
|
+
|
|
|
+ InitWindow(screenWidth, screenHeight, "raylib [core] example - monitor change");
|
|
|
+
|
|
|
+ int currentMonitorIndex = GetCurrentMonitor();
|
|
|
+ int monitorCount = 0;
|
|
|
+
|
|
|
+ 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
|
|
|
+ //----------------------------------------------------------------------------------
|
|
|
+
|
|
|
+ // 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++)
|
|
|
+ {
|
|
|
+ monitors[i] = (Monitor){
|
|
|
+ GetMonitorPosition(i),
|
|
|
+ GetMonitorName(i),
|
|
|
+ GetMonitorWidth(i),
|
|
|
+ GetMonitorHeight(i),
|
|
|
+ GetMonitorPhysicalWidth(i),
|
|
|
+ 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)
|
|
|
+ {
|
|
|
+ currentMonitorIndex += 1;
|
|
|
+
|
|
|
+ // Set index to 0 if the last one
|
|
|
+ if(currentMonitorIndex == monitorCount) currentMonitorIndex = 0;
|
|
|
+
|
|
|
+ SetWindowMonitor(currentMonitorIndex); // Move window to currentMonitorIndex
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ // Get currentMonitorIndex if manually moved
|
|
|
+ currentMonitorIndex = GetCurrentMonitor();
|
|
|
+ }
|
|
|
+ const Monitor currentMonitor = monitors[currentMonitorIndex];
|
|
|
+
|
|
|
+ float monitorScale = 0.6;
|
|
|
+
|
|
|
+ if(maxHeight > maxWidth + monitorOffsetX) monitorScale *= ((float)screenHeight/(float)maxHeight);
|
|
|
+ else monitorScale *= ((float)screenWidth/(float)(maxWidth + monitorOffsetX));
|
|
|
+
|
|
|
+ // Draw
|
|
|
+ //----------------------------------------------------------------------------------
|
|
|
+ BeginDrawing();
|
|
|
+
|
|
|
+ ClearBackground(RAYWHITE);
|
|
|
+
|
|
|
+ DrawText("Press [Enter] to move window to next monitor available", 20, 20, 20, DARKGRAY);
|
|
|
+
|
|
|
+ DrawRectangleLines(20, 60, screenWidth - 40, screenHeight - 100, DARKGRAY);
|
|
|
+
|
|
|
+ // 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 + 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);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ EndDrawing();
|
|
|
+ //----------------------------------------------------------------------------------
|
|
|
+ }
|
|
|
+
|
|
|
+ // De-Initialization
|
|
|
+ //--------------------------------------------------------------------------------------
|
|
|
+ CloseWindow(); // Close window and OpenGL context
|
|
|
+ //--------------------------------------------------------------------------------------
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|