Fix incorrect UI scaling after changing monitors DPI under Wayland

Add a GHOST_kEventWindowDPIHintChanged event to ensure the UI is
properly updated.
This commit is contained in:
Campbell Barton 2022-08-26 11:46:28 +10:00
parent 047d0e6c4a
commit ef51825c06
2 changed files with 9 additions and 2 deletions

View File

@ -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<GHOST_WindowWayland *>(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. */
}
}
}

View File

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