From f2aeb848ec6e3157be9b3443042e4aea43f2bdf3 Mon Sep 17 00:00:00 2001 From: Yuxuan Shui Date: Thu, 7 Mar 2019 21:08:37 +0000 Subject: [PATCH] Put the whole vtable in backend_list Signed-off-by: Yuxuan Shui --- src/backend/backend.c | 13 +++++++++---- src/backend/backend.h | 7 +++---- src/backend/gl/glx.c | 2 ++ src/backend/xrender.c | 40 ++++++++++++++++++++-------------------- src/compton.c | 13 +++++++++++-- 5 files changed, 45 insertions(+), 30 deletions(-) diff --git a/src/backend/backend.c b/src/backend/backend.c index 975d859..0547cd5 100644 --- a/src/backend/backend.c +++ b/src/backend/backend.c @@ -10,10 +10,15 @@ #include "region.h" #include "win.h" -backend_init_fn backend_list[NUM_BKEND] = { - [BKEND_XRENDER] = backend_xrender_init, +extern struct backend_operations xrender_ops; #ifdef CONFIG_OPENGL - [BKEND_GLX] = backend_glx_init, +extern struct backend_operations glx_ops; +#endif + +struct backend_operations *backend_list[NUM_BKEND] = { + [BKEND_XRENDER] = &xrender_ops, +#ifdef CONFIG_OPENGL + [BKEND_GLX] = &glx_ops, #endif }; @@ -240,7 +245,7 @@ void paint_all_new(session_t *ps, win *const t, bool ignore_damage) { } pixman_region32_fini(®_damage); - if (ps->o.monitor_repaint && ps->backend_data->ops->fill_rectangle) { + if (ps->o.monitor_repaint) { reg_damage = get_damage(ps, false); auto extent = pixman_region32_extents(®_damage); ps->backend_data->ops->fill_rectangle( diff --git a/src/backend/backend.h b/src/backend/backend.h index 899afc8..4dbacbf 100644 --- a/src/backend/backend.h +++ b/src/backend/backend.h @@ -43,6 +43,7 @@ struct backend_operations { /// 1) if ps->overlay is not XCB_NONE, use that /// 2) use ps->root otherwise /// XXX make the target window a parameter + backend_t *(*init)(session_t *) attr_nonnull(1); void (*deinit)(backend_t *backend_data) __attribute__((nonnull(1))); /// Called when rendering will be stopped for an unknown amount of @@ -172,11 +173,9 @@ struct backend_operations { /// Let the backend hook into the event handling queue }; -typedef backend_t *(*backend_init_fn)(session_t *ps) __attribute__((nonnull(1))); +typedef backend_t *(*backend_init_fn)(session_t *ps) attr_nonnull(1); -extern backend_t *backend_xrender_init(session_t *ps); -extern backend_t *backend_glx_init(session_t *ps); -extern backend_init_fn backend_list[]; +extern struct backend_operations *backend_list[]; bool default_is_win_transparent(void *, win *, void *); bool default_is_frame_transparent(void *, win *, void *); diff --git a/src/backend/gl/glx.c b/src/backend/gl/glx.c index 8008fa5..62c6832 100644 --- a/src/backend/gl/glx.c +++ b/src/backend/gl/glx.c @@ -532,6 +532,8 @@ void glx_compose(void *backend_data, session_t *ps, win *w, void *win_data, pixman_region32_fini(®ion_yflipped); } +struct backend_operations glx_ops; + /* backend_info_t glx_backend = { */ /* .init = glx_init, */ /* .deinit = glx_deinit, */ diff --git a/src/backend/xrender.c b/src/backend/xrender.c index 16b1808..da75d46 100644 --- a/src/backend/xrender.c +++ b/src/backend/xrender.c @@ -453,31 +453,11 @@ static void *copy(backend_t *base, const void *image, const region_t *reg) { return new_img; } -static struct backend_operations xrender_ops = { - .deinit = deinit, - .blur = blur, - .present = present, - .compose = compose, - .fill_rectangle = fill_rectangle, - .bind_pixmap = bind_pixmap, - .release_image = release_image, - .render_shadow = default_backend_render_shadow, - //.prepare_win = prepare_win, - //.release_win = release_win, - .is_image_transparent = is_image_transparent, - .buffer_age = buffer_age, - .max_buffer_age = 2, - - .image_op = image_op, - .copy = copy, -}; - backend_t *backend_xrender_init(session_t *ps) { auto xd = ccalloc(1, struct _xrender_data); xd->base.c = ps->c; xd->base.root = ps->root; - xd->base.ops = &xrender_ops; for (int i = 0; i < 256; ++i) { double o = (double)i / 255.0; @@ -567,4 +547,24 @@ err: return NULL; } +struct backend_operations xrender_ops = { + .init = backend_xrender_init, + .deinit = deinit, + .blur = blur, + .present = present, + .compose = compose, + .fill_rectangle = fill_rectangle, + .bind_pixmap = bind_pixmap, + .release_image = release_image, + .render_shadow = default_backend_render_shadow, + //.prepare_win = prepare_win, + //.release_win = release_win, + .is_image_transparent = is_image_transparent, + .buffer_age = buffer_age, + .max_buffer_age = 2, + + .image_op = image_op, + .copy = copy, +}; + // vim: set noet sw=8 ts=8: diff --git a/src/compton.c b/src/compton.c index a720554..520677c 100644 --- a/src/compton.c +++ b/src/compton.c @@ -838,7 +838,8 @@ void configure_root(session_t *ps, int width, int height) { if (has_root_change) { ps->backend_data->ops->root_change(ps->backend_data, ps); } else { - ps->backend_data = backend_list[ps->o.backend](ps); + ps->backend_data = backend_list[ps->o.backend]->init(ps); + ps->backend_data->ops = backend_list[ps->o.backend]; if (!ps->backend_data) { log_fatal("Failed to re-initialize backend after root change, aborting..."); ps->quit = true; @@ -1991,7 +1992,8 @@ redir_start(session_t *ps) { if (ps->o.experimental_backends) { // Reinitialize win_data - ps->backend_data = backend_list[ps->o.backend](ps); + ps->backend_data = backend_list[ps->o.backend]->init(ps); + ps->backend_data->ops = backend_list[ps->o.backend]; if (!ps->backend_data) { log_fatal("Failed to initialize backend, aborting..."); ps->quit = true; @@ -2721,6 +2723,13 @@ session_init(int argc, char **argv, Display *dpy, const char *config_file, } } + if (ps->o.experimental_backends) { + if (ps->o.monitor_repaint && !backend_list[ps->o.backend]->fill_rectangle) { + log_warn("--monitor-repaint is not supported by the backend, disabling"); + ps->o.monitor_repaint = false; + } + } + // Initialize software optimization if (ps->o.sw_opti) ps->o.sw_opti = swopti_init(ps);