mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-04-01 07:15:32 -04:00
shm: refactor: move away from a single, global, buffer list
Up until now, *all* buffers have been tracked in a single, global buffer list. We've used 'cookies' to separate buffers from different contexts (so that shm_get_buffer() doesn't try to re-use e.g. a search-box buffer for the main grid). This patch refactors this, and completely removes the global list. Instead of cookies, we now use 'chains'. A chain tracks both the properties to apply to newly created buffers (scrollable, number of pixman instances to instantiate etc), as well as the instantiated buffers themselves. This means there's strictly speaking not much use for shm_fini() anymore, since its up to the chain owner to call shm_chain_free(), which will also purge all buffers. However, since purging a buffer may be deferred, if the buffer is owned by the compositor at the time of the call to shm_purge() or shm_chain_free(), we still keep a global 'deferred' list, on to which deferred buffers are pushed. shm_fini() iterates this list and destroys the buffers _even_ if they are still owned by the compositor. This only happens at program termination, and not when destroying a terminal instance. I.e. closing a window in a “foot --server” does *not* trigger this. Each terminal instatiates a number of chains, and these chains are destroyed when the terminal instance is destroyed. Note that some buffers may be put on the deferred list, as mentioned above.
This commit is contained in:
parent
4efb34927e
commit
53851e13ec
6 changed files with 190 additions and 164 deletions
39
shm.h
39
shm.h
|
|
@ -7,6 +7,8 @@
|
|||
#include <pixman.h>
|
||||
#include <wayland-client.h>
|
||||
|
||||
#include <tllist.h>
|
||||
|
||||
struct damage;
|
||||
|
||||
struct buffer {
|
||||
|
|
@ -27,28 +29,24 @@ struct buffer {
|
|||
pixman_region32_t dirty;
|
||||
};
|
||||
|
||||
struct buffer_description {
|
||||
int width;
|
||||
int height;
|
||||
unsigned long cookie;
|
||||
};
|
||||
|
||||
void shm_fini(void);
|
||||
void shm_set_max_pool_size(off_t max_pool_size);
|
||||
|
||||
struct buffer_chain;
|
||||
struct buffer_chain *shm_chain_new(
|
||||
struct wl_shm *shm, bool scrollable, size_t pix_instances);
|
||||
void shm_chain_free(struct buffer_chain *chain);
|
||||
|
||||
/*
|
||||
* Returns a single buffer.
|
||||
*
|
||||
* May returned a cached buffer. If so, the buffer’s age indicates how
|
||||
* many shm_get_buffer() calls have been made for the same
|
||||
* width/height/cookie while the buffer was still busy.
|
||||
* width/height while the buffer was still busy.
|
||||
*
|
||||
* A newly allocated buffer has an age of 1234.
|
||||
*/
|
||||
struct buffer *shm_get_buffer(
|
||||
struct wl_shm *shm, int width, int height, unsigned long cookie,
|
||||
bool scrollable, size_t pix_instances);
|
||||
|
||||
struct buffer *shm_get_buffer(struct buffer_chain *chain, int width, int height);
|
||||
/*
|
||||
* Returns many buffers, described by ‘info’, all sharing the same SHM
|
||||
* buffer pool.
|
||||
|
|
@ -64,25 +62,16 @@ struct buffer *shm_get_buffer(
|
|||
* soon as the compositor releases them.
|
||||
*/
|
||||
void shm_get_many(
|
||||
struct wl_shm *shm, size_t count,
|
||||
struct buffer_description info[static count],
|
||||
struct buffer *bufs[static count], size_t pix_instances);
|
||||
struct buffer_chain *chain, size_t count,
|
||||
int widths[static count], int heights[static count],
|
||||
struct buffer *bufs[static count]);
|
||||
|
||||
bool shm_can_scroll(const struct buffer *buf);
|
||||
bool shm_scroll(struct wl_shm *shm, struct buffer *buf, int rows,
|
||||
bool shm_scroll(struct buffer *buf, int rows,
|
||||
int top_margin, int top_keep_rows,
|
||||
int bottom_margin, int bottom_keep_rows);
|
||||
|
||||
void shm_addref(struct buffer *buf);
|
||||
void shm_unref(struct buffer *buf);
|
||||
void shm_purge(struct wl_shm *shm, unsigned long cookie);
|
||||
|
||||
struct terminal;
|
||||
static inline unsigned long shm_cookie_grid(const struct terminal *term) { return (unsigned long)((uintptr_t)term + 0); }
|
||||
static inline unsigned long shm_cookie_search(const struct terminal *term) { return (unsigned long)((uintptr_t)term + 1); }
|
||||
static inline unsigned long shm_cookie_scrollback_indicator(const struct terminal *term) { return (unsigned long)(uintptr_t)term + 2; }
|
||||
static inline unsigned long shm_cookie_render_timer(const struct terminal *term) { return (unsigned long)(uintptr_t)term + 3; }
|
||||
static inline unsigned long shm_cookie_csd(const struct terminal *term, int n) { return (unsigned long)((uintptr_t)term + 4 + (n)); }
|
||||
|
||||
struct url;
|
||||
static inline unsigned long shm_cookie_url(const struct url *url) { return (unsigned long)(uintptr_t)url; }
|
||||
void shm_purge(struct buffer_chain *chain);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue