]> Dogcows Code - chaz/tint2/commitdiff
*add* more real_transparency things added... whole panel works now, but systray still...
authorAndreas Fink <andreas.fink85@googlemail.com>
Wed, 30 Dec 2009 16:25:19 +0000 (16:25 +0000)
committerAndreas Fink <andreas.fink85@googlemail.com>
Wed, 30 Dec 2009 16:25:19 +0000 (16:25 +0000)
src/panel.c
src/server.c
src/server.h
src/tint.c
src/util/area.c

index e2bbf9f69f1b1d1f13043af5b08028bd7743d074..ee3e27df6bb6042eca449152538c98cf102ce962 100644 (file)
@@ -160,6 +160,13 @@ void init_panel()
                        XMoveResizeWindow(server.dsp, p->main_win, p->posx, p->posy, p->area.width, p->area.height);
                }
 
+               if (!server.gc) {
+                       XGCValues  gcv;
+                       if (real_transparency)
+                               server.gc = XCreateGC(server.dsp, p->main_win, 0, &gcv);
+                       else
+                               server.gc = XCreateGC (server.dsp, server.root_win, (unsigned long)0, &gcv);
+               }
                //printf("panel %d : %d, %d, %d, %d\n", i, p->posx, p->posy, p->area.width, p->area.height);
                set_panel_properties(p);
                set_panel_background(p);
@@ -479,11 +486,23 @@ void set_panel_properties(Panel *p)
 
 void set_panel_background(Panel *p)
 {
-       get_root_pixmap();
-
        if (p->area.pix.pmap) XFreePixmap (server.dsp, p->area.pix.pmap);
        p->area.pix.pmap = XCreatePixmap (server.dsp, server.root_win, p->area.width, p->area.height, server.depth);
 
+       if (real_transparency) {
+               cairo_surface_t *tmp = cairo_xlib_surface_create (server.dsp, p->area.pix.pmap, server.visual, p->area.width, p->area.height);
+               cairo_t *cr = cairo_create(tmp);
+               cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
+               cairo_rectangle(cr, 0, 0, p->area.width, p->area.height);
+               cairo_set_source_rgba(cr, 1, 1, 1, 0);
+               cairo_paint (cr);
+               cairo_destroy (cr);
+               cairo_surface_destroy (tmp);
+               return;
+       }
+
+       get_root_pixmap();
+
        // copy background (server.root_pmap) in panel.area.pix.pmap
        Window dummy;
        int  x, y;
index 475c0b6272565a74e6e66c9357e3d4f868973f4f..f84396319efbcaf0dfbcbe9285c02b386c225fd3 100644 (file)
@@ -32,6 +32,7 @@ void server_catch_error (Display *d, XErrorEvent *ev){}
 
 static char *name_trayer = 0;
 
+int real_transparency = 0;
 
 void server_init_atoms ()
 {
@@ -97,6 +98,8 @@ void cleanup_server()
 {
        if (name_trayer) free(name_trayer);
        XFreeColormap(server.dsp, server.colormap);
+       free(server.monitor);
+       XFreeGC(server.dsp, server.gc);
 }
 
 
@@ -304,7 +307,6 @@ void get_desktops()
 
 void server_init_visual()
 {
-       int real_transparency = 0;
        XVisualInfo *xvi;
        XVisualInfo templ = { .screen=server.screen, .depth=32, .class=TrueColor };
        int nvi;
@@ -325,8 +327,8 @@ void server_init_visual()
        XFree (xvi);
 
        if (visual && real_transparency) {
-               printf("real transparency on... depth: %d\n", server.depth);
                server.depth = 32;
+               printf("real transparency on... depth: %d\n", server.depth);
                server.colormap = XCreateColormap(server.dsp, server.root_win, visual, AllocNone);
                server.visual = visual;
        }
index 2769ff87dd516dc245ab93c63e12e9a30b556ace..7a86ca4b8b6b3adbb7b5b3414fe109a389943505 100644 (file)
@@ -13,7 +13,7 @@
 #include <X11/Xatom.h>
 #include <X11/extensions/Xinerama.h>
 
-
+extern int real_transparency;
 typedef struct Global_atom
 {
        Atom _XROOTPMAP_ID;
@@ -112,6 +112,7 @@ void server_refresh_main_pixmap ();
 void server_catch_error (Display *d, XErrorEvent *ev);
 void server_init_atoms ();
 void server_init_visual();
+void cleanup_server();
 
 // detect root background
 void get_root_pixmap();
index cd0b2b87df8e2c3183fd262955f704d3654c5041..987003cacd9a75ee0ae430dca78a9769d625dcbf 100644 (file)
@@ -102,8 +102,6 @@ void init (int argc, char *argv[])
        server.screen = DefaultScreen (server.dsp);
        server.root_win = RootWindow(server.dsp, server.screen);
        server.desktop = server_get_current_desktop ();
-       XGCValues  gcv;
-       server.gc = XCreateGC (server.dsp, server.root_win, (unsigned long)0, &gcv);
        server_init_visual();
        XSetErrorHandler ((XErrorHandler) server_catch_error);
 
@@ -151,8 +149,7 @@ void cleanup()
        if (config_path) g_free(config_path);
        if (snapshot_path) g_free(snapshot_path);
 
-       if (server.monitor) free(server.monitor);
-       XFreeGC(server.dsp, server.gc);
+       cleanup_server();
        XCloseDisplay(server.dsp);
 }
 
index 827e118a40e7fe41f9cd846e7816bb18487ba560..fc80a89d629584c1e6dc2a19a11015adc1fd15ed 100644 (file)
 #include "server.h"
 #include "panel.h"
 
+// QUESTION: Why do we need Pixmaps for drawing? Can't we draw directly in the Window???
+// Parent could pass a cairo_surface_t to the children, and children use it, for drawing...
+
+
 // 1) resize child
 // 2) resize parent
 // 3) redraw parent
@@ -55,9 +59,9 @@ void refresh (Area *a)
        }
 
        // draw current Area
-       Pixmap *pmap = (a->is_active == 0) ? (&a->pix.pmap) : (&a->pix_active.pmap);
-       if (*pmap == 0) printf("empty area posx %d, width %d\n", a->posx, a->width);
-       XCopyArea (server.dsp, *pmap, ((Panel *)a->panel)->temp_pmap, server.gc, 0, 0, a->width, a->height, a->posx, a->posy);
+       Pixmap pmap = (a->is_active == 0) ? (a->pix.pmap) : (a->pix_active.pmap);
+       if (pmap == 0) printf("empty area posx %d, width %d\n", a->posx, a->width);
+       XCopyArea (server.dsp, pmap, ((Panel *)a->panel)->temp_pmap, server.gc, 0, 0, a->width, a->height, a->posx, a->posy);
 
        // and then refresh child object
        GSList *l;
@@ -104,7 +108,18 @@ void draw (Area *a, int active)
        *pmap = XCreatePixmap (server.dsp, server.root_win, a->width, a->height, server.depth);
 
        // add layer of root pixmap
-       XCopyArea (server.dsp, ((Panel *)a->panel)->temp_pmap, *pmap, server.gc, a->posx, a->posy, a->width, a->height, 0, 0);
+       if (real_transparency) {
+               cairo_surface_t *tmp = cairo_xlib_surface_create (server.dsp, *pmap, server.visual, a->width, a->height);
+               cairo_t *cr = cairo_create(tmp);
+               cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
+               cairo_rectangle(cr, 0, 0, a->width, a->height);
+               cairo_set_source_rgba(cr, 1, 1, 1, 0);
+               cairo_paint (cr);
+               cairo_destroy (cr);
+               cairo_surface_destroy (tmp);
+       }
+       else
+               XCopyArea (server.dsp, ((Panel *)a->panel)->temp_pmap, *pmap, server.gc, a->posx, a->posy, a->width, a->height, 0, 0);
 
        cairo_surface_t *cs;
        cairo_t *c;
This page took 0.030105 seconds and 4 git commands to generate.