mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-03-22 05:33:45 -04:00
term: enabling application synchronized updates clear pending grid refresh
This fixes issues with de-synchronized frames being rendered; we may have scheduled a redraw earlier, that hasn’t yet triggered (probably because we’re waiting for a frame callback), when we enable application synchronized updates. This means we risk rendering a partially updated state when the frame callback finally arrives, if the application hasn’t yet ended its synchronized update.
This commit is contained in:
parent
602dbdb9f6
commit
6c8b034aff
3 changed files with 15 additions and 10 deletions
|
|
@ -131,6 +131,8 @@ means foot can be PGO:d in e.g. sandboxed build scripts. See
|
||||||
dragging the cursor outside the grid.
|
dragging the cursor outside the grid.
|
||||||
* Parsing of the sub-parameter versions of indexed SGR color escapes
|
* Parsing of the sub-parameter versions of indexed SGR color escapes
|
||||||
(e.g. `\E[38:5...m`)
|
(e.g. `\E[38:5...m`)
|
||||||
|
* Frames occasionally being rendered while application synchronized
|
||||||
|
updates is in effect.
|
||||||
|
|
||||||
|
|
||||||
### Security
|
### Security
|
||||||
|
|
|
||||||
22
terminal.c
22
terminal.c
|
|
@ -224,8 +224,6 @@ fdm_ptmx(struct fdm *fdm, int fd, int events, void *data)
|
||||||
cursor_blink_rearm_timer(term);
|
cursor_blink_rearm_timer(term);
|
||||||
}
|
}
|
||||||
|
|
||||||
term->render.app_sync_updates.flipped = false;
|
|
||||||
|
|
||||||
uint8_t buf[24 * 1024];
|
uint8_t buf[24 * 1024];
|
||||||
ssize_t count = sizeof(buf);
|
ssize_t count = sizeof(buf);
|
||||||
|
|
||||||
|
|
@ -246,9 +244,7 @@ fdm_ptmx(struct fdm *fdm, int fd, int events, void *data)
|
||||||
vt_from_slave(term, buf, count);
|
vt_from_slave(term, buf, count);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!term->render.app_sync_updates.enabled &&
|
if (!term->render.app_sync_updates.enabled) {
|
||||||
!term->render.app_sync_updates.flipped)
|
|
||||||
{
|
|
||||||
/*
|
/*
|
||||||
* We likely need to re-render. But, we don't want to do it
|
* We likely need to re-render. But, we don't want to do it
|
||||||
* immediately. Often, a single client update is done through
|
* immediately. Often, a single client update is done through
|
||||||
|
|
@ -325,6 +321,7 @@ fdm_ptmx(struct fdm *fdm, int fd, int events, void *data)
|
||||||
} else
|
} else
|
||||||
return term_shutdown(term);
|
return term_shutdown(term);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2546,9 +2543,6 @@ term_spawn_new(const struct terminal *term)
|
||||||
void
|
void
|
||||||
term_enable_app_sync_updates(struct terminal *term)
|
term_enable_app_sync_updates(struct terminal *term)
|
||||||
{
|
{
|
||||||
if (!term->render.app_sync_updates.enabled)
|
|
||||||
term->render.app_sync_updates.flipped = true;
|
|
||||||
|
|
||||||
term->render.app_sync_updates.enabled = true;
|
term->render.app_sync_updates.enabled = true;
|
||||||
|
|
||||||
if (timerfd_settime(
|
if (timerfd_settime(
|
||||||
|
|
@ -2558,6 +2552,17 @@ term_enable_app_sync_updates(struct terminal *term)
|
||||||
LOG_ERR("failed to arm timer for application synchronized updates");
|
LOG_ERR("failed to arm timer for application synchronized updates");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Disable pending refresh *iff* the grid is the *only* thing
|
||||||
|
* scheduled to be re-rendered */
|
||||||
|
if (!term->render.refresh.csd && !term->render.refresh.search &&
|
||||||
|
!term->render.refresh.title &&
|
||||||
|
!term->render.pending.csd && !term->render.pending.search &&
|
||||||
|
!term->render.pending.title)
|
||||||
|
{
|
||||||
|
term->render.refresh.grid = false;
|
||||||
|
term->render.pending.grid = false;
|
||||||
|
}
|
||||||
|
|
||||||
/* Disarm delayed rendering timers */
|
/* Disarm delayed rendering timers */
|
||||||
timerfd_settime(
|
timerfd_settime(
|
||||||
term->delayed_render_timer.lower_fd, 0,
|
term->delayed_render_timer.lower_fd, 0,
|
||||||
|
|
@ -2575,7 +2580,6 @@ term_disable_app_sync_updates(struct terminal *term)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
term->render.app_sync_updates.enabled = false;
|
term->render.app_sync_updates.enabled = false;
|
||||||
term->render.app_sync_updates.flipped = true;
|
|
||||||
render_refresh(term);
|
render_refresh(term);
|
||||||
|
|
||||||
/* Reset timers */
|
/* Reset timers */
|
||||||
|
|
|
||||||
|
|
@ -410,7 +410,6 @@ struct terminal {
|
||||||
struct {
|
struct {
|
||||||
bool enabled;
|
bool enabled;
|
||||||
int timer_fd;
|
int timer_fd;
|
||||||
bool flipped;
|
|
||||||
} app_sync_updates;
|
} app_sync_updates;
|
||||||
|
|
||||||
/* Render threads + synchronization primitives */
|
/* Render threads + synchronization primitives */
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue