[digesting_libdecor] simplifying shared memory buffer
parent
c4f50c6f6e
commit
5568053e96
|
|
@ -1834,13 +1834,8 @@ 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 = {
|
||||||
buffer_release
|
buffer_release
|
||||||
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue