blend argb windows, but just blit non-argb windows which is faster
authorDana Jansens <danakj@orodu.net>
Thu, 6 Mar 2008 03:57:44 +0000 (22:57 -0500)
committerDana Jansens <danakj@orodu.net>
Thu, 6 Mar 2008 03:57:44 +0000 (22:57 -0500)
render.c
window.c
window.h

index c1d181a..b5369ed 100644 (file)
--- a/render.c
+++ b/render.c
@@ -338,7 +338,6 @@ static void
 paint_window(d_window_t *w, data_t *d)
 {
     window_data_t *wd;
-    int x, y, width, height, bwidth;
 
     wd = window_find_plugin_data(w, plugin_id);
 
@@ -347,10 +346,14 @@ paint_window(d_window_t *w, data_t *d)
 
     //printf("-- paint window 0x%x picture 0x%x --\n", w->id, wd->picture);
     if (wd->picture) {
+        int x, y, width, height, bwidth;
+        int op;
+
         window_get_area(w, &x, &y, &width, &height, &bwidth);
+        op = (window_is_argb(w) ?
+              XCB_RENDER_PICT_OP_OVER : XCB_RENDER_PICT_OP_SRC);
         xcb_render_composite(w->sc->dpy->conn,
-                             //XCB_RENDER_PICT_OP_SRC,  /* - for solid */
-                             XCB_RENDER_PICT_OP_OVER, /* - for argb */
+                             op,
                              wd->picture,
                              XCB_NONE,
                              d->overlay_buffer,
index 3aa9a95..794a1e4 100644 (file)
--- a/window.c
+++ b/window.c
@@ -23,6 +23,7 @@ typedef struct {
     int              x, y, w, h, bw;
     gboolean         attr_mapped;
     gboolean         input_only;
+    gboolean         argb;
     xcb_visualid_t   visual;
     xcb_pixmap_t     pixmap;
 
@@ -253,12 +254,14 @@ window_get_geometry_reply(d_window_priv_t *w)
         w->w = rep->width;
         w->h = rep->height;
         w->bw = rep->border_width;
+        w->argb = rep->depth == 32;
         free(rep);
     }
     else {
         w->x = w->y = -1;
         w->w = w->h = 1;
         w->bw = 0;
+        w->argb = FALSE;
     }
     if (err) {
         printf("error getting geometry for window 0x%x\n", w->id);
@@ -283,6 +286,15 @@ window_is_attr_mapped(d_window_t *pubw)
     return w->attr_mapped;
 }
 
+gboolean
+window_is_argb(d_window_t *pubw)
+{
+    d_window_priv_t *w = (d_window_priv_t*)pubw;
+    if (w->waiting_geom)
+        window_get_geometry_reply(w);
+    return w->argb;
+}
+
 xcb_visualid_t
 window_get_visual(d_window_t *pubw)
 {
index 7e6784a..a3fc770 100644 (file)
--- a/window.h
+++ b/window.h
@@ -31,6 +31,7 @@ gboolean window_is_zombie(d_window_t *w);
 gboolean window_is_input_only(d_window_t *w);
 gboolean window_is_mapped(d_window_t *w);
 gboolean window_is_attr_mapped(d_window_t *w);
+gboolean window_is_argb(d_window_t *w);
 
 void window_get_area(d_window_t *pubw, int *x, int *y, int *width, int *height,
                      int *border_width);