1
+ /*******************************************************************************************
2
+ *
3
+ * raylib [core] example - monitor change
4
+ *
5
+ * Example complexity rating: [★☆☆☆] 1/4
6
+ *
7
+ * Example originally created with raylib 5.5, last time updated with raylib 5.6
8
+ *
9
+ * Example contributed by Maicon Santana (@maiconpintoabreu) and reviewed by Ramon Santamaria (@raysan5)
10
+ *
11
+ * Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
12
+ * BSD-like license that allows static linking with closed source software
13
+ *
14
+ * Copyright (c) 2025-2025 Maicon Santana (@maiconpintoabreu)
15
+ *
16
+ ********************************************************************************************/
17
+
18
+ #include "raylib.h"
19
+
20
+ #define MAX_MONITORS 10
21
+
22
+ // Monitor Details
23
+ typedef struct Monitor {
24
+ Vector2 position ;
25
+ char * name ;
26
+ int width ;
27
+ int height ;
28
+ int physicalWidth ;
29
+ int physicalHeight ;
30
+ int refreshRate ;
31
+ } Monitor ;
32
+
33
+ //------------------------------------------------------------------------------------
34
+ // Program main entry point
35
+ //------------------------------------------------------------------------------------
36
+ int main (void )
37
+ {
38
+ // Initialization
39
+ //--------------------------------------------------------------------------------------
40
+ const int screenWidth = 800 ;
41
+ const int screenHeight = 450 ;
42
+
43
+ Monitor monitors [MAX_MONITORS ] = { 0 };
44
+
45
+ InitWindow (screenWidth , screenHeight , "raylib [core] example - monitor change" );
46
+
47
+ int currentMonitorIndex = GetCurrentMonitor ();
48
+ int monitorCount = 0 ;
49
+
50
+ SetTargetFPS (60 ); // Set our game to run at 60 frames-per-second
51
+ //--------------------------------------------------------------------------------------
52
+
53
+ // Main game loop
54
+ while (!WindowShouldClose ()) // Detect window close button or ESC key
55
+ {
56
+ // Update
57
+ //----------------------------------------------------------------------------------
58
+
59
+ // Variables to find the max x and Y to calculate the scale
60
+ int maxWidth = 1 ;
61
+ int maxHeight = 1 ;
62
+
63
+ // Monitor offset is to fix when monitor position x is negative
64
+ int monitorOffsetX = 0 ;
65
+
66
+ // Rebuild monitors array every frame
67
+ monitorCount = GetMonitorCount ();
68
+ for (int i = 0 ; i < monitorCount ; i ++ )
69
+ {
70
+ monitors [i ] = (Monitor ){
71
+ GetMonitorPosition (i ),
72
+ GetMonitorName (i ),
73
+ GetMonitorWidth (i ),
74
+ GetMonitorHeight (i ),
75
+ GetMonitorPhysicalWidth (i ),
76
+ GetMonitorPhysicalHeight (i ),
77
+ GetMonitorRefreshRate (i )
78
+ };
79
+ if (monitors [i ].position .x < monitorOffsetX ) monitorOffsetX = monitors [i ].position .x * -1 ;
80
+
81
+ const int width = monitors [i ].position .x + monitors [i ].width ;
82
+ const int height = monitors [i ].position .y + monitors [i ].height ;
83
+
84
+ if (maxWidth < width ) maxWidth = width ;
85
+ if (maxHeight < height ) maxHeight = height ;
86
+ }
87
+
88
+ if (IsKeyPressed (KEY_ENTER ) && monitorCount > 1 )
89
+ {
90
+ currentMonitorIndex += 1 ;
91
+
92
+ // Set index to 0 if the last one
93
+ if (currentMonitorIndex == monitorCount ) currentMonitorIndex = 0 ;
94
+
95
+ SetWindowMonitor (currentMonitorIndex ); // Move window to currentMonitorIndex
96
+ }
97
+ else
98
+ {
99
+ // Get currentMonitorIndex if manually moved
100
+ currentMonitorIndex = GetCurrentMonitor ();
101
+ }
102
+ const Monitor currentMonitor = monitors [currentMonitorIndex ];
103
+
104
+ float monitorScale = 0.6 ;
105
+
106
+ if (maxHeight > maxWidth + monitorOffsetX ) monitorScale *= ((float )screenHeight /(float )maxHeight );
107
+ else monitorScale *= ((float )screenWidth /(float )(maxWidth + monitorOffsetX ));
108
+
109
+ // Draw
110
+ //----------------------------------------------------------------------------------
111
+ BeginDrawing ();
112
+
113
+ ClearBackground (RAYWHITE );
114
+
115
+ DrawText ("Press [Enter] to move window to next monitor available" , 20 , 20 , 20 , DARKGRAY );
116
+
117
+ DrawRectangleLines (20 , 60 , screenWidth - 40 , screenHeight - 100 , DARKGRAY );
118
+
119
+ // Draw Monitor Rectangles with information inside
120
+ for (int i = 0 ; i < monitorCount ; i ++ )
121
+ {
122
+ // Calculate retangle position and size using monitorScale
123
+ const Rectangle rec = (Rectangle ){
124
+ (monitors [i ].position .x + monitorOffsetX ) * monitorScale + 140 ,
125
+ monitors [i ].position .y * monitorScale + 80 ,
126
+ monitors [i ].width * monitorScale ,
127
+ monitors [i ].height * monitorScale
128
+ };
129
+
130
+ // Draw monitor name and information inside the rectangle
131
+ DrawText (TextFormat ("[%i] %s" , i , monitors [i ].name ), rec .x + 10 , rec .y + (int )(100 * monitorScale ), (int )(120 * monitorScale ), BLUE );
132
+ DrawText (
133
+ TextFormat ("Resolution: [%ipx x %ipx]\nRefreshRate: [%ihz]\nPhysical Size: [%imm x %imm]\nPosition: %3.0f x %3.0f" ,
134
+ monitors [i ].width ,
135
+ monitors [i ].height ,
136
+ monitors [i ].refreshRate ,
137
+ monitors [i ].physicalWidth ,
138
+ monitors [i ].physicalHeight ,
139
+ monitors [i ].position .x ,
140
+ monitors [i ].position .y
141
+ ), rec .x + 10 , rec .y + (int )(200 * monitorScale ), (int )(120 * monitorScale ), DARKGRAY );
142
+
143
+ // Highlight current monitor
144
+ if (i == currentMonitorIndex )
145
+ {
146
+ DrawRectangleLinesEx (rec , 5 , RED );
147
+ Vector2 windowPosition = (Vector2 ){ (GetWindowPosition ().x + monitorOffsetX )* monitorScale + 140 , GetWindowPosition ().y * monitorScale + 80 };
148
+
149
+ // Draw window position based on monitors
150
+ DrawRectangleV (windowPosition , (Vector2 ){screenWidth * monitorScale , screenHeight * monitorScale }, Fade (GREEN , 0.5 ));
151
+ }
152
+ else
153
+ {
154
+ DrawRectangleLinesEx (rec , 5 , GRAY );
155
+ }
156
+
157
+ }
158
+
159
+
160
+ EndDrawing ();
161
+ //----------------------------------------------------------------------------------
162
+ }
163
+
164
+ // De-Initialization
165
+ //--------------------------------------------------------------------------------------
166
+ CloseWindow (); // Close window and OpenGL context
167
+ //--------------------------------------------------------------------------------------
168
+
169
+ return 0 ;
170
+ }
0 commit comments