From 129e0f34d0c17a975d446733fa2d400e0f986ebc Mon Sep 17 00:00:00 2001 From: marcelofg55 Date: Sat, 2 Dec 2017 16:48:14 -0300 Subject: [PATCH] Added OS::center_window to center the window precisely on desktop platforms --- core/bind/core_bind.cpp | 11 +++++++++++ core/bind/core_bind.h | 2 ++ core/os/os.cpp | 11 +++++++++++ core/os/os.h | 2 ++ platform/osx/os_osx.h | 1 + platform/osx/os_osx.mm | 6 ++++++ platform/windows/os_windows.cpp | 6 ++++++ platform/windows/os_windows.h | 3 ++- platform/x11/os_x11.cpp | 20 ++++++++++++++++++++ platform/x11/os_x11.h | 1 + 10 files changed, 62 insertions(+), 1 deletion(-) diff --git a/core/bind/core_bind.cpp b/core/bind/core_bind.cpp index b7b8cefa40e..585b9f7ac99 100644 --- a/core/bind/core_bind.cpp +++ b/core/bind/core_bind.cpp @@ -261,6 +261,10 @@ Size2 _OS::get_window_size() const { return OS::get_singleton()->get_window_size(); } +Size2 _OS::get_real_window_size() const { + return OS::get_singleton()->get_real_window_size(); +} + void _OS::set_window_size(const Size2 &p_size) { OS::get_singleton()->set_window_size(p_size); } @@ -935,6 +939,11 @@ void _OS::request_attention() { OS::get_singleton()->request_attention(); } +void _OS::center_window() { + + OS::get_singleton()->center_window(); +} + bool _OS::is_debug_build() const { #ifdef DEBUG_ENABLED @@ -1032,6 +1041,8 @@ void _OS::_bind_methods() { ObjectTypeDB::bind_method(_MD("set_window_maximized", "enabled"), &_OS::set_window_maximized); ObjectTypeDB::bind_method(_MD("is_window_maximized"), &_OS::is_window_maximized); ObjectTypeDB::bind_method(_MD("request_attention"), &_OS::request_attention); + ObjectTypeDB::bind_method(_MD("get_real_window_size"), &_OS::get_real_window_size); + ObjectTypeDB::bind_method(_MD("center_window"), &_OS::center_window); ObjectTypeDB::bind_method(_MD("set_borderless_window", "borderless"), &_OS::set_borderless_window); ObjectTypeDB::bind_method(_MD("get_borderless_window"), &_OS::get_borderless_window); diff --git a/core/bind/core_bind.h b/core/bind/core_bind.h index 278c8ac18e4..2631bbf69f6 100644 --- a/core/bind/core_bind.h +++ b/core/bind/core_bind.h @@ -142,6 +142,7 @@ public: virtual Point2 get_window_position() const; virtual void set_window_position(const Point2 &p_position); virtual Size2 get_window_size() const; + virtual Size2 get_real_window_size() const; virtual void set_window_size(const Size2 &p_size); virtual void set_window_fullscreen(bool p_enabled); virtual bool is_window_fullscreen() const; @@ -152,6 +153,7 @@ public: virtual void set_window_maximized(bool p_enabled); virtual bool is_window_maximized() const; virtual void request_attention(); + virtual void center_window(); virtual void set_borderless_window(bool p_borderless); virtual bool get_borderless_window() const; diff --git a/core/os/os.cpp b/core/os/os.cpp index 0e4ebb1099c..8d6cfe1f8ec 100644 --- a/core/os/os.cpp +++ b/core/os/os.cpp @@ -546,6 +546,17 @@ Dictionary OS::get_engine_version() const { return dict; } +void OS::center_window() { + + if (is_window_fullscreen()) return; + + Size2 scr = get_screen_size(get_current_screen()); + Size2 wnd = get_real_window_size(); + int x = scr.width / 2 - wnd.width / 2; + int y = scr.height / 2 - wnd.height / 2; + set_window_position(Vector2(x, y)); +} + OS::OS() { last_error = NULL; frames_drawn = 0; diff --git a/core/os/os.h b/core/os/os.h index 12b06966449..fa9b332a494 100644 --- a/core/os/os.h +++ b/core/os/os.h @@ -168,6 +168,7 @@ public: virtual Point2 get_window_position() const { return Vector2(); } virtual void set_window_position(const Point2 &p_position) {} virtual Size2 get_window_size() const = 0; + virtual Size2 get_real_window_size() const { return get_window_size(); } virtual void set_window_size(const Size2 p_size) {} virtual void set_window_fullscreen(bool p_enabled) {} virtual bool is_window_fullscreen() const { return true; } @@ -178,6 +179,7 @@ public: virtual void set_window_maximized(bool p_enabled) {} virtual bool is_window_maximized() const { return true; } virtual void request_attention() {} + virtual void center_window(); virtual void set_borderless_window(int p_borderless) {} virtual bool get_borderless_window() { return 0; } diff --git a/platform/osx/os_osx.h b/platform/osx/os_osx.h index 3cbfdf3aa24..12ab2b1823c 100644 --- a/platform/osx/os_osx.h +++ b/platform/osx/os_osx.h @@ -159,6 +159,7 @@ public: virtual void set_window_title(const String &p_title); virtual Size2 get_window_size() const; + virtual Size2 get_real_window_size() const; virtual void set_icon(const Image &p_icon); diff --git a/platform/osx/os_osx.mm b/platform/osx/os_osx.mm index 1faad3c4cda..19a15837a94 100644 --- a/platform/osx/os_osx.mm +++ b/platform/osx/os_osx.mm @@ -1549,6 +1549,12 @@ Size2 OS_OSX::get_window_size() const { return window_size; }; +Size2 OS_OSX::get_real_window_size() const { + + NSRect frame = [window_object frame]; + return Size2(frame.size.width, frame.size.height); +} + void OS_OSX::set_window_size(const Size2 p_size) { Size2 size = p_size; diff --git a/platform/windows/os_windows.cpp b/platform/windows/os_windows.cpp index d10c470b700..5fa560a947f 100644 --- a/platform/windows/os_windows.cpp +++ b/platform/windows/os_windows.cpp @@ -1486,6 +1486,12 @@ Size2 OS_Windows::get_window_size() const { GetClientRect(hWnd, &r); return Vector2(r.right - r.left, r.bottom - r.top); } +Size2 OS_Windows::get_real_window_size() const { + + RECT r; + GetWindowRect(hWnd, &r); + return Vector2(r.right - r.left, r.bottom - r.top); +} void OS_Windows::set_window_size(const Size2 p_size) { video_mode.width = p_size.width; diff --git a/platform/windows/os_windows.h b/platform/windows/os_windows.h index f9090c7e30f..abb31f6cddf 100644 --- a/platform/windows/os_windows.h +++ b/platform/windows/os_windows.h @@ -211,6 +211,7 @@ public: virtual Point2 get_window_position() const; virtual void set_window_position(const Point2 &p_position); virtual Size2 get_window_size() const; + virtual Size2 get_real_window_size() const; virtual void set_window_size(const Size2 p_size); virtual void set_window_fullscreen(bool p_enabled); virtual bool is_window_fullscreen() const; @@ -279,7 +280,7 @@ public: virtual void set_use_vsync(bool p_enable); virtual bool is_vsync_enabled() const; - + virtual Error move_path_to_trash(String p_dir); void disable_crash_handler(); diff --git a/platform/x11/os_x11.cpp b/platform/x11/os_x11.cpp index 527ad1ae641..1c73bbdd4e4 100644 --- a/platform/x11/os_x11.cpp +++ b/platform/x11/os_x11.cpp @@ -801,6 +801,26 @@ Size2 OS_X11::get_window_size() const { return Size2i(current_videomode.width, current_videomode.height); } +Size2 OS_X11::get_real_window_size() const { + XWindowAttributes xwa; + XSync(x11_display, False); + XGetWindowAttributes(x11_display, x11_window, &xwa); + int w = xwa.width; + int h = xwa.height; + Atom prop = XInternAtom(x11_display, "_NET_FRAME_EXTENTS", True); + Atom type; + int format; + unsigned long len; + unsigned long remaining; + unsigned char *data = NULL; + if (XGetWindowProperty(x11_display, x11_window, prop, 0, 4, False, AnyPropertyType, &type, &format, &len, &remaining, &data) == Success) { + long *extents = (long*) data; + w += extents[0] + extents[1]; // left, right + h += extents[2] + extents[3]; // top, bottom + } + return Size2(w, h); +} + void OS_X11::set_window_size(const Size2 p_size) { // If window resizable is disabled we need to update the attributes first if (is_window_resizable() == false) { diff --git a/platform/x11/os_x11.h b/platform/x11/os_x11.h index 6c6492a9fb4..09331ee86cf 100644 --- a/platform/x11/os_x11.h +++ b/platform/x11/os_x11.h @@ -246,6 +246,7 @@ public: virtual Point2 get_window_position() const; virtual void set_window_position(const Point2 &p_position); virtual Size2 get_window_size() const; + virtual Size2 get_real_window_size() const; virtual void set_window_size(const Size2 p_size); virtual void set_window_fullscreen(bool p_enabled); virtual bool is_window_fullscreen() const;