diff options
| author | Leonardo Hernández Hernández <leohdz172@protonmail.com> | 2022-12-21 14:28:27 -0600 | 
|---|---|---|
| committer | Leonardo Hernández Hernández <leohdz172@protonmail.com> | 2022-12-24 16:44:09 -0600 | 
| commit | 6ca011430a18980f12f7314cdeeff36051268a67 (patch) | |
| tree | 460cdb3606acb99d33dfc8cc8c2f2201603d239a | |
| parent | 7eaa01ac1f074511ae1013326172d51c6fdf8866 (diff) | |
do not skip frames if a client is stopped and have a pending resize
| -rw-r--r-- | client.h | 26 | ||||
| -rw-r--r-- | dwl.c | 2 | 
2 files changed, 27 insertions, 1 deletions
| @@ -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 @@ -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; | 
