aboutsummaryrefslogtreecommitdiff
path: root/src/backend/dummy
diff options
context:
space:
mode:
authorallusive-dev <[email protected]>2023-09-19 17:47:33 +1000
committerallusive-dev <[email protected]>2023-09-19 17:47:33 +1000
commita93aba600b1c5d019b680b9f4ff3fa85d5d43a60 (patch)
tree77f8152222655657472a70e0bfa413a0495dd555 /src/backend/dummy
parentreset (diff)
downloadcompfy-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.c174
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,
+
+};