@@ -104,99 +104,16 @@ Error EditorRun::run(const String &p_scene, const String &p_write_movie, const V
104104 }
105105 }
106106
107- int screen = EDITOR_GET (" run/window_placement/screen" );
108- if (screen == -5 ) {
109- // Same as editor
110- screen = DisplayServer::get_singleton ()->window_get_current_screen ();
111- } else if (screen == -4 ) {
112- // Previous monitor (wrap to the other end if needed)
113- screen = Math::wrapi (
114- DisplayServer::get_singleton ()->window_get_current_screen () - 1 ,
115- 0 ,
116- DisplayServer::get_singleton ()->get_screen_count ());
117- } else if (screen == -3 ) {
118- // Next monitor (wrap to the other end if needed)
119- screen = Math::wrapi (
120- DisplayServer::get_singleton ()->window_get_current_screen () + 1 ,
121- 0 ,
122- DisplayServer::get_singleton ()->get_screen_count ());
107+ WindowPlacement window_placement = get_window_placement ();
108+ if (window_placement.position != Point2i (INT_MAX, INT_MAX)) {
109+ args.push_back (" --position" );
110+ args.push_back (itos (window_placement.position .x ) + " ," + itos (window_placement.position .y ));
123111 }
124112
125- Rect2 screen_rect = DisplayServer::get_singleton ()->screen_get_usable_rect (screen);
126-
127- int window_placement = EDITOR_GET (" run/window_placement/rect" );
128- if (screen_rect != Rect2 ()) {
129- Size2 window_size;
130- window_size.x = GLOBAL_GET (" display/window/size/viewport_width" );
131- window_size.y = GLOBAL_GET (" display/window/size/viewport_height" );
132-
133- Size2 desired_size;
134- desired_size.x = GLOBAL_GET (" display/window/size/window_width_override" );
135- desired_size.y = GLOBAL_GET (" display/window/size/window_height_override" );
136- if (desired_size.x > 0 && desired_size.y > 0 ) {
137- window_size = desired_size;
138- }
139-
140- if (DisplayServer::get_singleton ()->has_feature (DisplayServer::FEATURE_HIDPI)) {
141- bool hidpi_proj = GLOBAL_GET (" display/window/dpi/allow_hidpi" );
142- int display_scale = 1 ;
143-
144- if (OS::get_singleton ()->is_hidpi_allowed ()) {
145- if (hidpi_proj) {
146- display_scale = 1 ; // Both editor and project runs in hiDPI mode, do not scale.
147- } else {
148- display_scale = DisplayServer::get_singleton ()->screen_get_max_scale (); // Editor is in hiDPI mode, project is not, scale down.
149- }
150- } else {
151- if (hidpi_proj) {
152- display_scale = (1 .f / DisplayServer::get_singleton ()->screen_get_max_scale ()); // Editor is not in hiDPI mode, project is, scale up.
153- } else {
154- display_scale = 1 ; // Both editor and project runs in lowDPI mode, do not scale.
155- }
156- }
157- screen_rect.position /= display_scale;
158- screen_rect.size /= display_scale;
159- }
160-
161- switch (window_placement) {
162- case 0 : { // top left
163- args.push_back (" --position" );
164- args.push_back (itos (screen_rect.position .x ) + " ," + itos (screen_rect.position .y ));
165- } break ;
166- case 1 : { // centered
167- Vector2 pos = (screen_rect.position ) + ((screen_rect.size - window_size) / 2 ).floor ();
168- args.push_back (" --position" );
169- args.push_back (itos (pos.x ) + " ," + itos (pos.y ));
170- } break ;
171- case 2 : { // custom pos
172- Vector2 pos = EDITOR_GET (" run/window_placement/rect_custom_position" );
173- pos += screen_rect.position ;
174- args.push_back (" --position" );
175- args.push_back (itos (pos.x ) + " ," + itos (pos.y ));
176- } break ;
177- case 3 : { // force maximized
178- Vector2 pos = screen_rect.position + screen_rect.size / 2 ;
179- args.push_back (" --position" );
180- args.push_back (itos (pos.x ) + " ," + itos (pos.y ));
181- args.push_back (" --maximized" );
182- } break ;
183- case 4 : { // force fullscreen
184- Vector2 pos = screen_rect.position + screen_rect.size / 2 ;
185- args.push_back (" --position" );
186- args.push_back (itos (pos.x ) + " ," + itos (pos.y ));
187- args.push_back (" --fullscreen" );
188- } break ;
189- }
190- } else {
191- // Unable to get screen info, skip setting position.
192- switch (window_placement) {
193- case 3 : { // force maximized
194- args.push_back (" --maximized" );
195- } break ;
196- case 4 : { // force fullscreen
197- args.push_back (" --fullscreen" );
198- } break ;
199- }
113+ if (window_placement.force_maximized ) {
114+ args.push_back (" --maximized" );
115+ } else if (window_placement.force_fullscreen ) {
116+ args.push_back (" --fullscreen" );
200117 }
201118
202119 List<String> breakpoints;
@@ -297,6 +214,98 @@ OS::ProcessID EditorRun::get_current_process() const {
297214 return pids.front ()->get ();
298215}
299216
217+ EditorRun::WindowPlacement EditorRun::get_window_placement () {
218+ WindowPlacement placement = WindowPlacement ();
219+ placement.screen = EDITOR_GET (" run/window_placement/screen" );
220+ if (placement.screen == -5 ) {
221+ // Same as editor
222+ placement.screen = DisplayServer::get_singleton ()->window_get_current_screen ();
223+ } else if (placement.screen == -4 ) {
224+ // Previous monitor (wrap to the other end if needed)
225+ placement.screen = Math::wrapi (
226+ DisplayServer::get_singleton ()->window_get_current_screen () - 1 ,
227+ 0 ,
228+ DisplayServer::get_singleton ()->get_screen_count ());
229+ } else if (placement.screen == -3 ) {
230+ // Next monitor (wrap to the other end if needed)
231+ placement.screen = Math::wrapi (
232+ DisplayServer::get_singleton ()->window_get_current_screen () + 1 ,
233+ 0 ,
234+ DisplayServer::get_singleton ()->get_screen_count ());
235+ } else if (placement.screen == -2 ) {
236+ // Primary screen
237+ placement.screen = DisplayServer::get_singleton ()->get_primary_screen ();
238+ }
239+
240+ placement.size .x = GLOBAL_GET (" display/window/size/viewport_width" );
241+ placement.size .y = GLOBAL_GET (" display/window/size/viewport_height" );
242+
243+ Size2 desired_size;
244+ desired_size.x = GLOBAL_GET (" display/window/size/window_width_override" );
245+ desired_size.y = GLOBAL_GET (" display/window/size/window_height_override" );
246+ if (desired_size.x > 0 && desired_size.y > 0 ) {
247+ placement.size = desired_size;
248+ }
249+
250+ Rect2 screen_rect = DisplayServer::get_singleton ()->screen_get_usable_rect (placement.screen );
251+
252+ int window_placement = EDITOR_GET (" run/window_placement/rect" );
253+ if (screen_rect != Rect2 ()) {
254+ if (DisplayServer::get_singleton ()->has_feature (DisplayServer::FEATURE_HIDPI)) {
255+ bool hidpi_proj = GLOBAL_GET (" display/window/dpi/allow_hidpi" );
256+ int display_scale = 1 ;
257+
258+ if (OS::get_singleton ()->is_hidpi_allowed ()) {
259+ if (hidpi_proj) {
260+ display_scale = 1 ; // Both editor and project runs in hiDPI mode, do not scale.
261+ } else {
262+ display_scale = DisplayServer::get_singleton ()->screen_get_max_scale (); // Editor is in hiDPI mode, project is not, scale down.
263+ }
264+ } else {
265+ if (hidpi_proj) {
266+ display_scale = (1 .f / DisplayServer::get_singleton ()->screen_get_max_scale ()); // Editor is not in hiDPI mode, project is, scale up.
267+ } else {
268+ display_scale = 1 ; // Both editor and project runs in lowDPI mode, do not scale.
269+ }
270+ }
271+ screen_rect.position /= display_scale;
272+ screen_rect.size /= display_scale;
273+ }
274+
275+ switch (window_placement) {
276+ case 0 : { // top left
277+ placement.position = screen_rect.position ;
278+ } break ;
279+ case 1 : { // centered
280+ placement.position = (screen_rect.position ) + ((screen_rect.size - placement.size ) / 2 ).floor ();
281+ } break ;
282+ case 2 : { // custom pos
283+ Vector2 pos = EDITOR_GET (" run/window_placement/rect_custom_position" );
284+ pos += screen_rect.position ;
285+ placement.position = pos;
286+ } break ;
287+ case 3 : { // force maximized
288+ placement.force_maximized = true ;
289+ } break ;
290+ case 4 : { // force fullscreen
291+ placement.force_fullscreen = true ;
292+ } break ;
293+ }
294+ } else {
295+ // Unable to get screen info, skip setting position.
296+ switch (window_placement) {
297+ case 3 : { // force maximized
298+ placement.force_maximized = true ;
299+ } break ;
300+ case 4 : { // force fullscreen
301+ placement.force_fullscreen = true ;
302+ } break ;
303+ }
304+ }
305+
306+ return placement;
307+ }
308+
300309EditorRun::EditorRun () {
301310 status = STATUS_STOP;
302311 running_scene = " " ;
0 commit comments