mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-02-05 04:06:08 -05:00
This lessens the burden on (primarily) the compositor, since we no longer tear down and re-create the SHM pool when scrolling. The SHM pool is setup once, and its size is fixed at the maximum allowed (512MB for now, 2GB would be possible). This also allows us to mmap() the memfd once. The exposed raw pointer is simply an offset from the memfd mmapping. Note that this means e.g. rouge rendering code will be able to write outside the buffer. Finally, only do this if the caller explicitly wants to enable scrolling. The memfd of other buffers are sized to the requested size.
50 lines
1.5 KiB
C
50 lines
1.5 KiB
C
#pragma once
|
|
|
|
#include <stdbool.h>
|
|
#include <stddef.h>
|
|
#include <sys/types.h>
|
|
|
|
#include <pixman.h>
|
|
#include <wayland-client.h>
|
|
|
|
struct buffer {
|
|
unsigned long cookie;
|
|
|
|
int width;
|
|
int height;
|
|
int stride;
|
|
|
|
bool busy;
|
|
size_t size; /* Buffer size */
|
|
void *mmapped; /* Raw data (TODO: rename) */
|
|
|
|
struct wl_buffer *wl_buf;
|
|
pixman_image_t *pix;
|
|
|
|
/* Internal */
|
|
int fd; /* memfd */
|
|
struct wl_shm_pool *pool;
|
|
|
|
void *real_mmapped; /* Address returned from mmap */
|
|
size_t mmap_size; /* Size of mmap (>= size) */
|
|
off_t offset; /* Offset into memfd where data begins */
|
|
|
|
bool scrollable;
|
|
bool purge; /* True if this buffer should be destroyed */
|
|
};
|
|
|
|
struct buffer *shm_get_buffer(
|
|
struct wl_shm *shm, int width, int height, unsigned long cookie, bool scrollable);
|
|
void shm_fini(void);
|
|
|
|
bool shm_can_scroll(const struct buffer *buf);
|
|
bool shm_scroll(struct wl_shm *shm, struct buffer *buf, int rows,
|
|
int top_margin, int top_keep_rows,
|
|
int bottom_margin, int bottom_keep_rows);
|
|
|
|
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_csd(const struct terminal *term, int n) { return (unsigned long)((uintptr_t)term + 2 + (n)); }
|