|
|
|
@ -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; |
|
|
|
} |