Wayland: Use suspended event only if supported
In a previous PR I made an oversight and checked for the new `suspended` event even on legacy compositors, breaking suspension for them. This patch goes trough the trouble of checking for the xdg_toplevel version and seeing whether we have to use one method or the other.
This commit is contained in:
parent
f7c567e2f5
commit
5ef07b9ce9
|
@ -1219,9 +1219,27 @@ void DisplayServerWayland::process_events() {
|
||||||
} else {
|
} else {
|
||||||
try_suspend();
|
try_suspend();
|
||||||
}
|
}
|
||||||
} else if (!wayland_thread.is_suspended() || wayland_thread.get_reset_frame()) {
|
} else {
|
||||||
// At last, a sign of life! We're no longer suspended.
|
// We have to pick into the Wayland thread to figure out if suspension events
|
||||||
suspended = false;
|
// are supported or if we have to use an heuristic as a fallback.
|
||||||
|
WaylandThread::WindowState *ws = wayland_thread.wl_surface_get_window_state(wayland_thread.window_get_wl_surface(MAIN_WINDOW_ID));
|
||||||
|
ERR_FAIL_NULL(ws);
|
||||||
|
|
||||||
|
struct xdg_toplevel *xdg_toplevel = ws->xdg_toplevel;
|
||||||
|
if (!xdg_toplevel) {
|
||||||
|
xdg_toplevel = libdecor_frame_get_xdg_toplevel(ws->libdecor_frame);
|
||||||
|
}
|
||||||
|
ERR_FAIL_NULL(xdg_toplevel);
|
||||||
|
|
||||||
|
bool suspend_supported = xdg_toplevel_get_version(xdg_toplevel) >= 6;
|
||||||
|
|
||||||
|
if (suspend_supported) {
|
||||||
|
suspended = wayland_thread.is_suspended();
|
||||||
|
} else {
|
||||||
|
// Older compositors don't have any way of telling us that a window is
|
||||||
|
// suspended so we'll kick us out of the suspended state with a frame event.
|
||||||
|
suspended = !wayland_thread.get_reset_frame();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DBUS_ENABLED
|
#ifdef DBUS_ENABLED
|
||||||
|
|
Loading…
Reference in New Issue