From ef51825c06242c12892337f87c82299c2996fa50 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 26 Aug 2022 11:46:28 +1000 Subject: Fix incorrect UI scaling after changing monitors DPI under Wayland Add a GHOST_kEventWindowDPIHintChanged event to ensure the UI is properly updated. --- intern/ghost/intern/GHOST_SystemWayland.cpp | 2 -- intern/ghost/intern/GHOST_WindowWayland.cpp | 9 +++++++++ 2 files changed, 9 insertions(+), 2 deletions(-) (limited to 'intern') diff --git a/intern/ghost/intern/GHOST_SystemWayland.cpp b/intern/ghost/intern/GHOST_SystemWayland.cpp index 57b1a9bb434..13357a3d31a 100644 --- a/intern/ghost/intern/GHOST_SystemWayland.cpp +++ b/intern/ghost/intern/GHOST_SystemWayland.cpp @@ -2727,8 +2727,6 @@ static void output_handle_scale(void *data, struct wl_output * /*wl_output*/, co for (GHOST_IWindow *iwin : window_manager->getWindows()) { GHOST_WindowWayland *win = static_cast(iwin); win->outputs_changed_update_scale(); - /* TODO(@campbellbarton): support refreshing the UI when the DPI changes. - * There are glitches when resizing the monitor which would be nice to solve. */ } } } diff --git a/intern/ghost/intern/GHOST_WindowWayland.cpp b/intern/ghost/intern/GHOST_WindowWayland.cpp index e303bd5b6aa..d06ec872eca 100644 --- a/intern/ghost/intern/GHOST_WindowWayland.cpp +++ b/intern/ghost/intern/GHOST_WindowWayland.cpp @@ -935,6 +935,9 @@ GHOST_TSuccess GHOST_WindowWayland::notify_size() * Functionality only used for the WAYLAND implementation. * \{ */ +/** + * Return true when the windows scale or DPI changes. + */ bool GHOST_WindowWayland::outputs_changed_update_scale() { uint32_t dpi_next; @@ -963,6 +966,12 @@ bool GHOST_WindowWayland::outputs_changed_update_scale() * use a multiplier for the default DPI as workaround. */ win->dpi = dpi_next; changed = true; + + /* As this is a low-level function, we might want adding this event to be optional, + * always add the event unless it causes issues. */ + GHOST_System *system = (GHOST_System *)GHOST_ISystem::getSystem(); + system->pushEvent( + new GHOST_Event(system->getMilliSeconds(), GHOST_kEventWindowDPIHintChanged, this)); } return changed; -- cgit v1.2.3