diff options
| author | allusive-dev <[email protected]> | 2023-09-19 17:47:33 +1000 |
|---|---|---|
| committer | allusive-dev <[email protected]> | 2023-09-19 17:47:33 +1000 |
| commit | a93aba600b1c5d019b680b9f4ff3fa85d5d43a60 (patch) | |
| tree | 77f8152222655657472a70e0bfa413a0495dd555 /src/backend/dummy | |
| parent | reset (diff) | |
| download | compfy-a93aba600b1c5d019b680b9f4ff3fa85d5d43a60.tar.xz compfy-a93aba600b1c5d019b680b9f4ff3fa85d5d43a60.zip | |
Fixed broken files/code and other errors
Diffstat (limited to 'src/backend/dummy')
| -rw-r--r-- | src/backend/dummy/dummy.c | 174 |
1 files changed, 174 insertions, 0 deletions
diff --git a/src/backend/dummy/dummy.c b/src/backend/dummy/dummy.c new file mode 100644 index 0000000..a057b97 --- /dev/null +++ b/src/backend/dummy/dummy.c @@ -0,0 +1,174 @@ +#include <uthash.h> +#include <xcb/xcb.h> + +#include "backend/backend.h" +#include "backend/backend_common.h" +#include "common.h" +#include "compiler.h" +#include "config.h" +#include "log.h" +#include "region.h" +#include "types.h" +#include "uthash_extra.h" +#include "utils.h" +#include "x.h" + +struct dummy_image { + xcb_pixmap_t pixmap; + bool transparent; + int *refcount; + UT_hash_handle hh; +}; + +struct dummy_data { + struct backend_base base; + struct dummy_image *images; +}; + +struct backend_base *dummy_init(struct session *ps attr_unused) { + auto ret = (struct backend_base *)ccalloc(1, struct dummy_data); + ret->c = ps->c; + ret->loop = ps->loop; + ret->root = ps->root; + ret->busy = false; + return ret; +} + +void dummy_deinit(struct backend_base *data) { + auto dummy = (struct dummy_data *)data; + HASH_ITER2(dummy->images, img) { + log_warn("Backend image for pixmap %#010x is not freed", img->pixmap); + HASH_DEL(dummy->images, img); + free(img->refcount); + free(img); + } + free(dummy); +} + +static void dummy_check_image(struct backend_base *base, const struct dummy_image *img) { + auto dummy = (struct dummy_data *)base; + struct dummy_image *tmp = NULL; + HASH_FIND_INT(dummy->images, &img->pixmap, tmp); + if (!tmp) { + log_warn("Using an invalid (possibly freed) image"); + assert(false); + } + assert(*tmp->refcount > 0); +} + +void dummy_compose(struct backend_base *base, void *image, int dst_x1 attr_unused, + int dst_y1 attr_unused, int dst_x2 attr_unused, int dst_y2 attr_unused, + const region_t *reg_paint attr_unused, const region_t *reg_visible attr_unused) { + dummy_check_image(base, image); +} + +void dummy_fill(struct backend_base *backend_data attr_unused, struct color c attr_unused, + const region_t *clip attr_unused) { +} + +bool dummy_blur(struct backend_base *backend_data attr_unused, double opacity attr_unused, + void *blur_ctx attr_unused, const region_t *reg_blur attr_unused, + const region_t *reg_visible attr_unused) { + return true; +} + +void *dummy_bind_pixmap(struct backend_base *base, xcb_pixmap_t pixmap, + struct xvisual_info fmt, bool owned attr_unused) { + auto dummy = (struct dummy_data *)base; + struct dummy_image *img = NULL; + HASH_FIND_INT(dummy->images, &pixmap, img); + if (img) { + (*img->refcount)++; + return img; + } + + img = ccalloc(1, struct dummy_image); + img->pixmap = pixmap; + img->transparent = fmt.alpha_size != 0; + img->refcount = ccalloc(1, int); + *img->refcount = 1; + + HASH_ADD_INT(dummy->images, pixmap, img); + return (void *)img; +} + +void dummy_release_image(backend_t *base, void *image) { + auto dummy = (struct dummy_data *)base; + auto img = (struct dummy_image *)image; + assert(*img->refcount > 0); + (*img->refcount)--; + if (*img->refcount == 0) { + HASH_DEL(dummy->images, img); + free(img->refcount); + free(img); + } +} + +bool dummy_is_image_transparent(struct backend_base *base, void *image) { + auto img = (struct dummy_image *)image; + dummy_check_image(base, img); + return img->transparent; +} + +int dummy_buffer_age(struct backend_base *base attr_unused) { + return 2; +} + +bool dummy_image_op(struct backend_base *base, enum image_operations op attr_unused, + void *image, const region_t *reg_op attr_unused, + const region_t *reg_visible attr_unused, void *args attr_unused) { + dummy_check_image(base, image); + return true; +} + +bool dummy_set_image_property(struct backend_base *base, enum image_properties prop attr_unused, + void *image, void *arg attr_unused) { + dummy_check_image(base, image); + return true; +} + +void *dummy_clone_image(struct backend_base *base, const void *image, + const region_t *reg_visible attr_unused) { + auto img = (const struct dummy_image *)image; + dummy_check_image(base, img); + (*img->refcount)++; + return (void *)img; +} + +void *dummy_create_blur_context(struct backend_base *base attr_unused, + enum blur_method method attr_unused, void *args attr_unused) { + static int dummy_context; + return &dummy_context; +} + +void dummy_destroy_blur_context(struct backend_base *base attr_unused, void *ctx attr_unused) { +} + +void dummy_get_blur_size(void *ctx attr_unused, int *width, int *height) { + // These numbers are arbitrary, to make sure the reisze_region code path is + // covered. + *width = 5; + *height = 5; +} + +struct backend_operations dummy_ops = { + .init = dummy_init, + .deinit = dummy_deinit, + .compose = dummy_compose, + .fill = dummy_fill, + .blur = dummy_blur, + .bind_pixmap = dummy_bind_pixmap, + .render_shadow = default_backend_render_shadow, + .release_image = dummy_release_image, + .is_image_transparent = dummy_is_image_transparent, + .buffer_age = dummy_buffer_age, + .max_buffer_age = 5, + + .image_op = dummy_image_op, + .clone_image = dummy_clone_image, + .set_image_property = dummy_set_image_property, + .create_blur_context = dummy_create_blur_context, + .destroy_blur_context = dummy_destroy_blur_context, + .get_blur_size = dummy_get_blur_size, + +}; |