[digesting_libdecor] simplifying shared memory buffer

main
Allen Webster 2026-02-28 13:07:26 -08:00
parent c4f50c6f6e
commit 5568053e96
2 changed files with 17 additions and 42 deletions

View File

@ -1834,12 +1834,7 @@ toggle_maximized(void){
static void static void
buffer_release(void *user_data, struct wl_buffer *wl_buffer){ buffer_release(void *user_data, struct wl_buffer *wl_buffer){
struct buffer *buffer = user_data; struct buffer *buffer = user_data;
if (buffer->is_detached){
buffer_free(buffer);
}
else{
buffer->in_use = false; buffer->in_use = false;
}
} }
const struct wl_buffer_listener buffer_listener = { const struct wl_buffer_listener buffer_listener = {
@ -1848,13 +1843,11 @@ const struct wl_buffer_listener buffer_listener = {
static void static void
buffer_free(struct buffer *buffer){ buffer_free(struct buffer *buffer){
if (buffer->wl_buffer) { if (buffer->wl_buffer != 0){
wl_buffer_destroy(buffer->wl_buffer); wl_buffer_destroy(buffer->wl_buffer);
munmap(buffer->data, buffer->data_size); munmap(buffer->data, buffer->data_size);
buffer->wl_buffer = NULL;
buffer->in_use = false;
} }
free(buffer); memset(buffer, 0, sizeof *buffer);
} }
static void static void
@ -2152,7 +2145,6 @@ set_component_input_region(enum component_slot slot){
static void static void
draw_border_component(enum component_slot slot){ draw_border_component(enum component_slot slot){
struct buffer *old_buffer;
struct buffer *buffer = 0; struct buffer *buffer = 0;
if (slot < COMPONENT_SLOT_COUNT && if (slot < COMPONENT_SLOT_COUNT &&
@ -2160,11 +2152,11 @@ draw_border_component(enum component_slot slot){
Extent2D extent = extent2d_from_component_slot(slot); Extent2D extent = extent2d_from_component_slot(slot);
set_component_input_region(slot); set_component_input_region(slot);
old_buffer = ctx.component_slot[slot].buffer; struct buffer *old_buffer = ctx.component_slot[slot].buffer;
if (old_buffer != 0){ if (old_buffer != 0){
if (!old_buffer->in_use && if (!old_buffer->in_use &&
old_buffer->buffer_width == extent.w && old_buffer->width == extent.w &&
old_buffer->buffer_height == extent.h){ old_buffer->height == extent.h){
buffer = old_buffer; buffer = old_buffer;
} }
else{ else{
@ -2176,30 +2168,20 @@ draw_border_component(enum component_slot slot){
if (buffer == 0){ if (buffer == 0){
int width = extent.w; int width = extent.w;
int height = extent.h; int height = extent.h;
bool opaque = ctx.component_slot[slot].opaque; int stride = 4*width;
int size = stride*height;
struct wl_shm_pool *pool; int fd = libdecor_os_create_anonymous_file(size);
int fd, size, buffer_width, buffer_height, stride;
void *data;
enum wl_shm_format buf_fmt;
buffer_width = width;
buffer_height = height;
stride = buffer_width * 4;
size = stride * buffer_height;
fd = libdecor_os_create_anonymous_file(size);
if (fd >= 0){ if (fd >= 0){
data = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); void *data = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (data != MAP_FAILED){ if (data != MAP_FAILED){
buf_fmt = opaque ? WL_SHM_FORMAT_XRGB8888 : WL_SHM_FORMAT_ARGB8888; enum wl_shm_format buf_fmt = (ctx.component_slot[slot].opaque ?
WL_SHM_FORMAT_XRGB8888 :
WL_SHM_FORMAT_ARGB8888);
pool = wl_shm_create_pool(ctx.wl_shm, fd, size); struct wl_shm_pool *pool = wl_shm_create_pool(ctx.wl_shm, fd, size);
buffer = calloc(1, sizeof *buffer); buffer = calloc(1, sizeof *buffer);
buffer->wl_buffer = wl_shm_pool_create_buffer(pool, 0, buffer->wl_buffer = wl_shm_pool_create_buffer(pool, 0, width, height, stride, buf_fmt);
buffer_width, buffer_height,
stride,
buf_fmt);
wl_buffer_add_listener(buffer->wl_buffer, &buffer_listener, buffer); wl_buffer_add_listener(buffer->wl_buffer, &buffer_listener, buffer);
wl_shm_pool_destroy(pool); wl_shm_pool_destroy(pool);
@ -2207,8 +2189,6 @@ draw_border_component(enum component_slot slot){
buffer->data_size = size; buffer->data_size = size;
buffer->width = width; buffer->width = width;
buffer->height = height; buffer->height = height;
buffer->buffer_width = buffer_width;
buffer->buffer_height = buffer_height;
} }
close(fd); close(fd);
@ -2218,9 +2198,8 @@ draw_border_component(enum component_slot slot){
memset(buffer->data, 0, buffer->data_size); memset(buffer->data, 0, buffer->data_size);
{ {
int stride = cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, buffer->buffer_width); int stride = cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, buffer->width);
cairo_surface_t *surface = cairo_image_surface_create_for_data(buffer->data, CAIRO_FORMAT_ARGB32, cairo_surface_t *surface = cairo_image_surface_create_for_data(buffer->data, CAIRO_FORMAT_ARGB32, buffer->width, buffer->height, stride);
buffer->buffer_width, buffer->buffer_height, stride);
cairo_t *cr = cairo_create(surface); cairo_t *cr = cairo_create(surface);
cairo_surface_set_device_scale(surface, 1, 1); cairo_surface_set_device_scale(surface, 1, 1);

View File

@ -166,14 +166,10 @@ enum component_slot {
struct buffer { struct buffer {
struct wl_buffer *wl_buffer; struct wl_buffer *wl_buffer;
bool in_use; bool in_use;
bool is_detached;
void *data; void *data;
size_t data_size; size_t data_size;
int width; int width;
int height; int height;
int buffer_width;
int buffer_height;
}; };
struct border_component { struct border_component {