+#include "efence.h"
+
#include "render.h"
#include "screen.h"
#include "window.h"
#include "display.h"
#include "list.h"
#include <stdio.h>
+#include <assert.h>
#include <stdlib.h>
#include <xcb/render.h>
-#define PLUGIN_NAME "render"
+static int plugin_id;
typedef struct {
void (*screen_paint)(d_screen_t *sc);
void (*window_show)(d_window_t *w);
void (*window_hide)(d_window_t *w);
- void (*window_reconfigure)(d_window_t *w);
+ void (*window_resize)(d_window_t *w);
xcb_render_query_pict_formats_reply_t *pict_formats;
xcb_render_picture_t overlay_picture;
typedef struct {
xcb_render_picture_t picture;
+ gboolean waiting_picture;
xcb_void_cookie_t ck_picture;
} window_data_t;
static void render_screen_paint(d_screen_t *sc);
static void paint_root(d_screen_t *sc, data_t *d);
-static void paint_window(d_window_t *window);
+static void paint_window(d_window_t *window, data_t *d);
static void render_update_picture(d_window_t *w, data_t *d, window_data_t *wd,
gboolean children);
static void render_free_picture(d_window_t *w, window_data_t *wd);
static void render_window_show(d_window_t *window);
static void render_window_hide(d_window_t *window);
-static void render_window_reconfigure(d_window_t *window);
+static void render_window_resize(d_window_t *window);
void
-render_init(d_screen_t *sc)
+render_init(d_screen_t *sc, int id)
{
xcb_render_query_pict_formats_cookie_t ck;
xcb_render_pictformat_t format;
xcb_pixmap_t px;
+ plugin_id = id;
+
data_t *d = malloc(sizeof(data_t));
d->screen_paint = sc->screen_paint;
d->window_show = sc->window_show;
d->window_hide = sc->window_hide;
- d->window_reconfigure = sc->window_reconfigure;
- screen_add_plugin_data(sc, PLUGIN_NAME, d);
+ d->window_resize = sc->window_resize;
+ screen_add_plugin_data(sc, plugin_id, d);
sc->screen_paint = render_screen_paint;
sc->window_show = render_window_show;
sc->window_hide = render_window_hide;
- sc->window_reconfigure = render_window_reconfigure;
+ sc->window_resize = render_window_resize;
ck = xcb_render_query_pict_formats_unchecked(sc->dpy->conn);
d->pict_formats = xcb_render_query_pict_formats_reply(sc->dpy->conn, ck,
void
render_free(d_screen_t *sc)
{
- data_t *d = screen_find_plugin_data(sc, PLUGIN_NAME);
+ data_t *d = screen_find_plugin_data(sc, plugin_id);
free(d->pict_formats);
xcb_render_free_picture(sc->dpy->conn, d->solid_bg);
xcb_render_free_picture(sc->dpy->conn, d->overlay_picture);
xcb_render_free_picture(sc->dpy->conn, d->overlay_buffer);
free(d);
+ screen_remove_plugin_data(sc, plugin_id);
}
void
data_t *d;
window_data_t *wd;
- d = screen_find_plugin_data(w->sc, PLUGIN_NAME);
+ d = screen_find_plugin_data(w->sc, plugin_id);
/* pass it on */
d->window_show(w);
- wd = window_find_plugin_data(w, PLUGIN_NAME);
+ wd = window_find_plugin_data(w, plugin_id);
if (wd)
render_window_free(w, wd);
wd = malloc(sizeof(window_data_t));
wd->picture = XCB_NONE;
- wd->ck_picture.sequence = 0;
- window_add_plugin_data(w, PLUGIN_NAME, wd);
+ wd->waiting_picture = FALSE;
+ window_add_plugin_data(w, plugin_id, wd);
window_ref(w);
}
data_t *d;
window_data_t *wd;
- d = screen_find_plugin_data(w->sc, PLUGIN_NAME);
- wd = window_find_plugin_data(w, PLUGIN_NAME);
+ d = screen_find_plugin_data(w->sc, plugin_id);
+ wd = window_find_plugin_data(w, plugin_id);
if (wd) {
render_window_free(w, wd);
- window_remove_plugin_data(w, PLUGIN_NAME);
+ window_remove_plugin_data(w, plugin_id);
}
- window_unref(w);
-
/* pass it on */
d->window_hide(w);
}
static xcb_render_picture_t
render_get_picture(d_window_t *w, window_data_t *wd)
{
- if (wd->ck_picture.sequence) {
+ if (wd->waiting_picture) {
xcb_generic_error_t *err;
//printf("** checking create picture 0x%x\n", w->id);
err = xcb_request_check(w->sc->dpy->conn, wd->ck_picture);
printf("error creating picture for window 0x%x\n", w->id);
free(err);
}
- wd->ck_picture.sequence = 0;
+ wd->waiting_picture = FALSE;
}
//printf("returning picture 0x%x for window 0x%x\n", wd->picture, w->id);
return wd->picture;
wd->picture, px, format,
XCB_RENDER_CP_SUBWINDOW_MODE,
&vals);
+ wd->waiting_picture = TRUE;
}
}
static void
-render_window_reconfigure(d_window_t *w)
+render_window_resize(d_window_t *w)
{
data_t *d;
window_data_t *wd;
- d = screen_find_plugin_data(w->sc, PLUGIN_NAME);
- wd = window_find_plugin_data(w, PLUGIN_NAME);
+ d = screen_find_plugin_data(w->sc, plugin_id);
+ wd = window_find_plugin_data(w, plugin_id);
+ assert(wd != NULL);
render_free_picture(w, wd);
/* pass it on */
- d->window_hide(w);
+ d->window_resize(w);
}
static void
render_screen_paint(d_screen_t *sc)
{
- data_t *d = screen_find_plugin_data(sc, PLUGIN_NAME);
+ data_t *d = screen_find_plugin_data(sc, plugin_id);
d_list_it_t *it;
//printf("-- painting --\n");
for (it = list_bottom(sc->stacking); it; it = it->prev) {
d_window_t *w = it->data;
if (!window_is_input_only(w) && window_is_mapped(w))
- paint_window(w);
+ paint_window(w, d);
}
#endif
}
static void
-paint_window(d_window_t *w)
+paint_window(d_window_t *w, data_t *d)
{
- data_t *d;
window_data_t *wd;
xcb_render_picture_t pict;
int x, y, width, height, bwidth;
- d = screen_find_plugin_data(w->sc, PLUGIN_NAME);
- wd = window_find_plugin_data(w, PLUGIN_NAME);
+ wd = window_find_plugin_data(w, plugin_id);
if (!wd->picture)
render_update_picture(w, d, wd, TRUE);
//printf("-- paint window 0x%x picture 0x%x --\n", w->id, wd->picture);
window_get_area(w, &x, &y, &width, &height, &bwidth);
xcb_render_composite(w->sc->dpy->conn,
- XCB_RENDER_PICT_OP_SRC,
- /*XCB_RENDER_PICT_OP_OVER, - for argb */
+ //XCB_RENDER_PICT_OP_SRC, /* - for solid */
+ XCB_RENDER_PICT_OP_OVER, /* - for argb */
wd->picture,
XCB_NONE,
d->overlay_buffer,