mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-02-04 04:06:06 -05:00
With a bad behaving client (e.g. 'less' with mouse support enabled), we can end up with a *lot* of xcursor updates (so much, that we flooded the wayland socket before we implemented a blocking wayl_flush()). Since there's little point in updating the cursor more than once per frame interval, use frame callbacks to throttle the updates. This works more or lesslike normal terminal refreshes: render_xcursor_set() stores the last terminal (window) that had (and updated) the cursor. The renderer's FDM hook checks if we have such a pending terminal set, and if so, tries to refresh the cursor. This is done by first checking if we're already waiting for a callback from a previous cursor update, and if so we do nothing; the callback will update the cursor for the next frame. If we're *not* already waiting for a callback, we update the cursor immediately.
22 lines
596 B
C
22 lines
596 B
C
#pragma once
|
|
|
|
#include "terminal.h"
|
|
#include "fdm.h"
|
|
#include "wayland.h"
|
|
|
|
struct renderer;
|
|
struct renderer *render_init(struct fdm *fdm, struct wayland *wayl);
|
|
void render_destroy(struct renderer *renderer);
|
|
|
|
void render_resize(struct terminal *term, int width, int height);
|
|
void render_set_title(struct terminal *term, const char *title);
|
|
void render_refresh(struct terminal *term);
|
|
bool render_xcursor_set(struct terminal *term);
|
|
|
|
void render_search_box(struct terminal *term);
|
|
|
|
struct render_worker_context {
|
|
int my_id;
|
|
struct terminal *term;
|
|
};
|
|
int render_worker_thread(void *_ctx);
|