do not skip frames if a client is stopped and have a pending resize

This commit is contained in:
Leonardo Hernández Hernández 2022-12-21 14:28:27 -06:00
parent 7eaa01ac1f
commit 6ca011430a
Failed to generate hash of commit
2 changed files with 27 additions and 1 deletions

View file

@ -255,6 +255,32 @@ client_is_rendered_on_mon(Client *c, Monitor *m)
return 0; return 0;
} }
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 static inline int
client_is_unmanaged(Client *c) client_is_unmanaged(Client *c)
{ {

2
dwl.c
View file

@ -1836,7 +1836,7 @@ rendermon(struct wl_listener *listener, void *data)
/* Render if no XDG clients have an outstanding resize and are visible on /* Render if no XDG clients have an outstanding resize and are visible on
* this monitor. */ * this monitor. */
wl_list_for_each(c, &clients, link) 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; goto skip;
if (!wlr_scene_output_commit(m->scene_output)) if (!wlr_scene_output_commit(m->scene_output))
return; return;