commit 6ca011430a18980f12f7314cdeeff36051268a67
parent 7eaa01ac1f074511ae1013326172d51c6fdf8866
Author: Leonardo Hernández Hernández <leohdz172@protonmail.com>
Date: Wed, 21 Dec 2022 14:28:27 -0600
do not skip frames if a client is stopped and have a pending resize
Diffstat:
2 files changed, 27 insertions(+), 1 deletion(-)
diff --git a/client.h b/client.h
@@ -256,6 +256,32 @@ client_is_rendered_on_mon(Client *c, Monitor *m)
}
static inline int
+client_is_stopped(Client *c)
+{
+ int pid;
+ siginfo_t in = {0};
+#ifdef XWAYLAND
+ if (client_is_x11(c))
+ return 0;
+#endif
+
+ wl_client_get_credentials(c->surface.xdg->client->client, &pid, NULL, NULL);
+ if (waitid(P_PID, pid, &in, WNOHANG|WCONTINUED|WSTOPPED|WNOWAIT) < 0) {
+ /* This process is not our child process, while is very unluckely that
+ * it is stopped, in order to do not skip frames assume that it is. */
+ if (errno == ECHILD)
+ return 1;
+ } else if (in.si_pid) {
+ if (in.si_code == CLD_STOPPED || in.si_code == CLD_TRAPPED)
+ return 1;
+ if (in.si_code == CLD_CONTINUED)
+ return 0;
+ }
+
+ return 0;
+}
+
+static inline int
client_is_unmanaged(Client *c)
{
#ifdef XWAYLAND
diff --git a/dwl.c b/dwl.c
@@ -1836,7 +1836,7 @@ rendermon(struct wl_listener *listener, void *data)
/* Render if no XDG clients have an outstanding resize and are visible on
* this monitor. */
wl_list_for_each(c, &clients, link)
- if (client_is_rendered_on_mon(c, m) && (!c->isfloating && c->resize))
+ if (client_is_rendered_on_mon(c, m) && (!c->isfloating && c->resize) && !client_is_stopped(c))
goto skip;
if (!wlr_scene_output_commit(m->scene_output))
return;