Cleanup: tweaks to Wayland scale updating for new windows

- Remove redundant lock.
- Use a variable to skip resizing instead of faking unchanged values.
This commit is contained in:
Campbell Barton 2023-12-18 10:46:40 +11:00
parent 004420af8f
commit 17aca68146

@ -2344,10 +2344,11 @@ bool GHOST_WindowWayland::outputs_changed_update_scale()
return false;
}
if (window_->wp.fractional_scale_handle) {
#ifdef USE_EVENT_BACKGROUND_THREAD
std::lock_guard lock_frame_guard{window_->frame_pending_mutex};
std::lock_guard lock_frame_guard{window_->frame_pending_mutex};
#endif
if (window_->wp.fractional_scale_handle) {
/* Let the #wp_fractional_scale_v1_listener::preferred_scale callback handle
* changes to the windows scale. */
if (window_->frame_pending.fractional_scale_preferred != 0) {
@ -2363,13 +2364,7 @@ bool GHOST_WindowWayland::outputs_changed_update_scale()
bool changed = false;
#ifdef USE_EVENT_BACKGROUND_THREAD
std::lock_guard lock_frame_guard{window_->frame_pending_mutex};
#endif
bool force_frame_update = false;
bool is_fractional_prev = window_->frame.fractional_scale != 0;
const bool is_fractional_prev = window_->frame.fractional_scale != 0;
const bool is_fractional_next = (fractional_scale_next % FRACTIONAL_DENOMINATOR) != 0;
/* When non-fractional, never use fractional scaling! */
@ -2378,11 +2373,14 @@ bool GHOST_WindowWayland::outputs_changed_update_scale()
1 :
fractional_scale_next / FRACTIONAL_DENOMINATOR;
int fractional_scale_prev = window_->frame.fractional_scale ?
window_->frame.fractional_scale :
window_->frame.buffer_scale * FRACTIONAL_DENOMINATOR;
int scale_prev = fractional_scale_prev / FRACTIONAL_DENOMINATOR;
bool do_frame_resize = true;
const int fractional_scale_prev = window_->frame.fractional_scale ?
window_->frame.fractional_scale :
window_->frame.buffer_scale * FRACTIONAL_DENOMINATOR;
const int scale_prev = fractional_scale_prev / FRACTIONAL_DENOMINATOR;
/* Resizing implies updating. */
bool do_frame_resize = false;
bool do_frame_update = false;
if (window_->frame_pending.is_scale_init == false) {
window_->frame_pending.is_scale_init = true;
@ -2428,52 +2426,47 @@ bool GHOST_WindowWayland::outputs_changed_update_scale()
libdecor_frame_commit(decor.frame, state, nullptr);
libdecor_state_free(state);
}
do_frame_resize = false;
force_frame_update = true;
}
else
#endif /* WITH_GHOST_WAYLAND_LIBDECOR */
/* Leave `window_->frame_pending` as-is, so changes are detected and updates are applied. */
do_frame_resize = false;
do_frame_update = true;
}
else {
/* Test if the scale changed. */
if ((fractional_scale_prev != fractional_scale_next) ||
(window_->frame_pending.buffer_scale != window_->frame.buffer_scale))
{
is_fractional_prev = is_fractional_next;
scale_prev = scale_next;
fractional_scale_prev = fractional_scale_next;
/* Leave `window_->frame_pending` as-is, so changes are detected and updates are applied. */
force_frame_update = true;
do_frame_resize = true;
}
}
if ((fractional_scale_prev != fractional_scale_next) ||
(window_->frame_pending.buffer_scale != window_->frame.buffer_scale) ||
(force_frame_update == true))
{
if (do_frame_resize) {
/* Resize the window failing to do so results in severe flickering with a
* multi-monitor setup when multiple monitors have different scales.
*
* NOTE: some flickering is still possible even when resizing this
* happens when dragging the right hand side of the title-bar in KDE
* as expanding changed the size on the RHS, this may be up to the compositor to fix. */
if (do_frame_resize) {
for (size_t i = 0; i < ARRAY_SIZE(window_->frame_pending.size); i++) {
const int value = window_->frame_pending.size[i] ? window_->frame_pending.size[i] :
window_->frame.size[i];
if (is_fractional_prev || is_fractional_next) {
window_->frame_pending.size[i] = lroundf(
(value * (double(fractional_scale_next)) / double(fractional_scale_prev)));
}
else {
window_->frame_pending.size[i] = (value * scale_next) / scale_prev;
}
if (window_->frame_pending.buffer_scale > 1) {
gwl_round_int_by(&window_->frame_pending.size[i], window_->frame_pending.buffer_scale);
}
for (size_t i = 0; i < ARRAY_SIZE(window_->frame_pending.size); i++) {
const int value = window_->frame_pending.size[i] ? window_->frame_pending.size[i] :
window_->frame.size[i];
if (is_fractional_prev || is_fractional_next) {
window_->frame_pending.size[i] = lroundf((value * double(fractional_scale_next)) /
double(fractional_scale_prev));
}
else {
window_->frame_pending.size[i] = (value * scale_next) / scale_prev;
}
if (window_->frame_pending.buffer_scale > 1) {
gwl_round_int_by(&window_->frame_pending.size[i], window_->frame_pending.buffer_scale);
}
}
do_frame_update = true;
}
if (do_frame_update) {
gwl_window_frame_update_from_pending_no_lock(window_);
changed = true;
}