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

このコミットが含まれているのは:
Leonardo Hernández Hernández 2022-12-21 14:28:27 -06:00
コミット 6ca011430a
この署名に対応する既知のキーがデータベースに存在しません
GPGキーID: E538897EE11B9624
2個のファイルの変更27行の追加1行の削除

ファイルの表示

@ -255,6 +255,32 @@ client_is_rendered_on_mon(Client *c, Monitor *m)
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
client_is_unmanaged(Client *c)
{

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