render: never render CSD and/or search box "immediately"

Handle the CSDs and the search box the same way we handle the main
grid; when we need to redraw them, call
render_refresh_{csd,search}(). This sets a flag that is checked after
each FDM iteration. All actual rendering is done here.

This also ties the commits of the Wayland sub-surfaces to the commit
of the main surface.
This commit is contained in:
Daniel Eklöf 2020-03-06 19:16:54 +01:00
parent e5540a0d2e
commit c5a1af4e53
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
6 changed files with 118 additions and 81 deletions

11
input.c
View file

@ -711,13 +711,9 @@ wl_pointer_enter(void *data, struct wl_pointer *wl_pointer,
case TERM_SURF_BUTTON_MINIMIZE:
case TERM_SURF_BUTTON_MAXIMIZE:
case TERM_SURF_BUTTON_CLOSE:
quirk_weston_csd_on(term);
render_csd(term);
quirk_weston_csd_off(term);
render_refresh(term);
term->xcursor = "left_ptr";
render_xcursor_set(term);
render_refresh_csd(term);
break;
case TERM_SURF_NONE:
@ -771,10 +767,7 @@ wl_pointer_leave(void *data, struct wl_pointer *wl_pointer,
if (old_moused->is_shutting_down)
break;
quirk_weston_csd_on(old_moused);
render_csd(old_moused);
quirk_weston_csd_off(old_moused);
render_refresh(old_moused);
render_refresh_csd(old_moused);
break;
case TERM_SURF_NONE:

145
render.c
View file

@ -730,14 +730,10 @@ render_csd_part(struct terminal *term,
pixman_image_unref(src);
}
void
static void
render_csd_title(struct terminal *term)
{
if (term->window->use_csd != CSD_YES)
return;
if (term->is_shutting_down)
return;
assert(term->window->use_csd == CSD_YES);
struct csd_data info = get_csd_data(term, CSD_SURF_TITLE);
struct wl_surface *surf = term->window->csd.surface[CSD_SURF_TITLE];
@ -766,11 +762,9 @@ render_csd_title(struct terminal *term)
static void
render_csd_border(struct terminal *term, enum csd_surface surf_idx)
{
assert(term->window->use_csd == CSD_YES);
assert(surf_idx >= CSD_SURF_LEFT && surf_idx <= CSD_SURF_BOTTOM);
if (term->window->use_csd != CSD_YES)
return;
struct csd_data info = get_csd_data(term, surf_idx);
struct wl_surface *surf = term->window->csd.surface[surf_idx];
@ -934,16 +928,11 @@ render_csd_button_close(struct terminal *term, struct buffer *buf)
pixman_image_unref(src);
}
void
static void
render_csd_button(struct terminal *term, enum csd_surface surf_idx)
{
assert(surf_idx >= CSD_SURF_MINIMIZE);
if (term->window->use_csd != CSD_YES)
return;
if (term->is_shutting_down)
return;
assert(term->window->use_csd == CSD_YES);
assert(surf_idx >= CSD_SURF_MINIMIZE && surf_idx <= CSD_SURF_CLOSE);
struct csd_data info = get_csd_data(term, surf_idx);
struct wl_surface *surf = term->window->csd.surface[surf_idx];
@ -1017,14 +1006,10 @@ render_csd_button(struct terminal *term, enum csd_surface surf_idx)
csd_commit(term, surf, buf);
}
void
static void
render_csd(struct terminal *term)
{
if (term->window->use_csd != CSD_YES)
return;
if (term->is_shutting_down)
return;
assert(term->window->use_csd == CSD_YES);
if (term->window->is_fullscreen)
return;
@ -1365,21 +1350,6 @@ grid_render(struct terminal *term)
}
static void
frame_callback(void *data, struct wl_callback *wl_callback, uint32_t callback_data)
{
struct terminal *term = data;
assert(term->window->frame_callback == wl_callback);
wl_callback_destroy(wl_callback);
term->window->frame_callback = NULL;
if (term->render.pending) {
term->render.pending = false;
grid_render(term);
}
}
void
render_search_box(struct terminal *term)
{
assert(term->window->search_sub_surface != NULL);
@ -1479,6 +1449,38 @@ render_search_box(struct terminal *term)
quirk_weston_subsurface_desync_off(term->window->search_sub_surface);
}
static void
frame_callback(void *data, struct wl_callback *wl_callback, uint32_t callback_data)
{
struct terminal *term = data;
assert(term->window->frame_callback == wl_callback);
wl_callback_destroy(wl_callback);
term->window->frame_callback = NULL;
if (term->render.pending.csd) {
term->render.pending.csd = false;
if (term->window->use_csd == CSD_YES) {
quirk_weston_csd_on(term);
render_csd(term);
quirk_weston_csd_off(term);
}
}
if (term->render.pending.search) {
term->render.pending.search = false;
if (term->is_searching)
render_search_box(term);
}
if (term->render.pending.grid) {
term->render.pending.grid = false;
grid_render(term);
}
}
/* Move to terminal.c? */
static bool
maybe_resize(struct terminal *term, int width, int height, bool force)
@ -1651,8 +1653,6 @@ damage_view:
term->unmaximized_height = term->height;
}
render_csd(term);
#if 0
/* TODO: doesn't include CSD title bar */
xdg_toplevel_set_min_size(
@ -1672,14 +1672,13 @@ damage_view:
term->height / term->scale + title_height);
}
if (term->is_searching)
render_search_box(term);
tll_free(term->normal.scroll_damage);
tll_free(term->alt.scroll_damage);
term->render.last_buf = NULL;
term_damage_view(term);
render_refresh_csd(term);
render_refresh_search(term);
render_refresh(term);
return true;
@ -1767,20 +1766,50 @@ fdm_hook_refresh_pending_terminals(struct fdm *fdm, void *data)
tll_foreach(renderer->wayl->terms, it) {
struct terminal *term = it->item;
if (!term->render.refresh_needed)
if (!term->render.refresh.grid &&
!term->render.refresh.csd &&
!term->render.refresh.search)
{
continue;
}
if (term->render.app_sync_updates.enabled)
if (term->render.app_sync_updates.enabled &&
!term->render.refresh.csd &&
!term->render.refresh.search)
{
continue;
}
if (term->render.refresh.csd || term->render.refresh.search) {
/* Force update of parent surface */
term->render.refresh.grid = true;
}
assert(term->window->is_configured);
term->render.refresh_needed = false;
if (term->window->frame_callback == NULL)
grid_render(term);
else {
bool grid = term->render.refresh.grid;
bool csd = term->render.refresh.csd;
bool search = term->render.refresh.search;
term->render.refresh.grid = false;
term->render.refresh.csd = false;
term->render.refresh.search = false;
if (term->window->frame_callback == NULL) {
if (csd && term->window->use_csd == CSD_YES) {
quirk_weston_csd_on(term);
render_csd(term);
quirk_weston_csd_off(term);
}
if (search)
render_search_box(term);
if (grid)
grid_render(term);
} else {
/* Tells the frame callback to render again */
term->render.pending = true;
term->render.pending.grid = grid;
term->render.pending.csd = csd;
term->render.pending.search = search;
}
}
@ -1815,7 +1844,21 @@ render_set_title(struct terminal *term, const char *_title)
void
render_refresh(struct terminal *term)
{
term->render.refresh_needed = true;
term->render.refresh.grid = true;
}
void
render_refresh_csd(struct terminal *term)
{
if (term->window->use_csd == CSD_YES)
term->render.refresh.csd = true;
}
void
render_refresh_search(struct terminal *term)
{
if (term->is_searching)
term->render.refresh.search = true;
}
bool

View file

@ -14,13 +14,10 @@ bool render_resize_force(struct terminal *term, int width, int height);
void render_set_title(struct terminal *term, const char *title);
void render_refresh(struct terminal *term);
void render_refresh_csd(struct terminal *term);
void render_refresh_search(struct terminal *term);
bool render_xcursor_set(struct terminal *term);
void render_search_box(struct terminal *term);
void render_csd(struct terminal *term);
void render_csd_title(struct terminal *term);
void render_csd_button(struct terminal *term, enum csd_surface surf_idx);
struct render_worker_context {
int my_id;
struct terminal *term;

View file

@ -86,8 +86,7 @@ search_begin(struct terminal *term)
term->is_searching = true;
term_xcursor_update(term);
render_search_box(term);
render_refresh(term);
render_refresh_search(term);
}
void
@ -616,6 +615,5 @@ search_input(struct terminal *term, uint32_t key, xkb_keysym_t sym, xkb_mod_mask
LOG_DBG("search: buffer: %S", term->search.buf);
search_find_next(term);
render_search_box(term);
render_refresh(term);
render_refresh_search(term);
}

View file

@ -199,7 +199,7 @@ fdm_ptmx(struct fdm *fdm, int fd, int events, void *data)
*/
if (term->window->frame_callback == NULL) {
if (term->render.app_sync_updates.enabled)
term->render.refresh_needed = true;
term->render.refresh.grid = true;
else {
/* First timeout - reset each time we receive input. */
@ -235,7 +235,7 @@ fdm_ptmx(struct fdm *fdm, int fd, int events, void *data)
}
}
} else
term->render.pending = true;
term->render.pending.grid = true;
if (hup) {
if (term->hold_at_exit) {
@ -1637,10 +1637,7 @@ term_visual_focus_in(struct terminal *term)
if (term->cursor_blink.active)
cursor_blink_start_timer(term);
quirk_weston_csd_on(term);
render_csd(term);
quirk_weston_csd_off(term);
render_refresh_csd(term);
cursor_refresh(term);
}
@ -1654,10 +1651,7 @@ term_visual_focus_out(struct terminal *term)
if (term->cursor_blink.active)
cursor_blink_stop_timer(term);
quirk_weston_csd_on(term);
render_csd(term);
quirk_weston_csd_off(term);
render_refresh_csd(term);
cursor_refresh(term);
}

View file

@ -331,7 +331,20 @@ struct terminal {
enum term_surface active_surface;
struct {
bool refresh_needed; /* Terminal needs to be re-rendered, as soon-as-possible */
/* Scheduled for rendering, as soon-as-possible */
struct {
bool grid;
bool csd;
bool search;
} refresh;
/* Scheduled for rendering, in the next frame callback */
struct {
bool grid;
bool csd;
bool search;
} pending;
int scrollback_lines; /* Number of scrollback lines, from conf (TODO: move out from render struct?) */
struct {
@ -358,7 +371,6 @@ struct terminal {
struct cell *cell; /* For easy access to content */
} last_cursor;
bool pending; /* Need to re-render again, after next frame-callback */
struct buffer *last_buf; /* Buffer we rendered to last time */
bool was_flashing; /* Flash was active last time we rendered */
bool was_searching;