]> Dogcows Code - chaz/tint2/commitdiff
*add* real transparency is now supported... most systray applications work out of...
authorAndreas Fink <andreas.fink85@googlemail.com>
Wed, 30 Dec 2009 23:27:31 +0000 (23:27 +0000)
committerAndreas Fink <andreas.fink85@googlemail.com>
Wed, 30 Dec 2009 23:27:31 +0000 (23:27 +0000)
freedesktops standard

src/config.c
src/panel.c
src/panel.h
src/server.c
src/server.h
src/systray/systraybar.c
src/taskbar/taskbar.c
src/tint.c
src/tooltip/tooltip.c
src/util/area.c
src/util/area.h

index cbb9d664e4dc1a0c5977a0d87a8b47647e30bfa5..41d3f3fd39c2a95a2c377c49d02f52b53a2736fe 100644 (file)
@@ -293,6 +293,16 @@ void add_entry (char *key, char *value)
                panel_dock = atoi (value);
        else if (strcmp (key, "urgent_nb_of_blink") == 0)
                max_tick_urgent = (atoi (value) * 2) + 1;
+       else if (strcmp (key, "real_transparency") == 0)
+               real_transparency = atoi(value);
+       else if (strcmp (key, "panel_layer") == 0) {
+               if (strcmp(value, "bottom") == 0)
+                       panel_layer = BOTTOM_LAYER;
+               else if (strcmp(value, "normal") == 0)
+                       panel_layer = NORMAL_LAYER;
+               else if (strcmp(value, "top") == 0)
+                       panel_layer = TOP_LAYER;
+       }
 
        /* Battery */
        else if (strcmp (key, "battery") == 0) {
index ee3e27df6bb6042eca449152538c98cf102ce962..34954f7eba02b56bc1e0679282a98bcfe15c13d4 100644 (file)
@@ -46,6 +46,7 @@ int mouse_tilt_right;
 int panel_mode;
 int wm_menu;
 int panel_dock=0;  // default not in the dock
+int panel_layer=BOTTOM_LAYER;  // default is bottom layer
 int panel_position;
 int panel_horizontal;
 int panel_refresh;
@@ -162,10 +163,7 @@ void init_panel()
 
                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);
+                       server.gc = XCreateGC(server.dsp, p->main_win, 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);
@@ -397,14 +395,14 @@ void set_panel_properties(Panel *p)
        XChangeProperty (server.dsp, p->main_win, server.atom._NET_WM_WINDOW_TYPE, XA_ATOM, 32, PropModeReplace, (unsigned char *) &val, 1);
 
        // Sticky and below other window
-       val = 0xFFFFFFFF;
+       val = ALLDESKTOP;
        XChangeProperty (server.dsp, p->main_win, server.atom._NET_WM_DESKTOP, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &val, 1);
        Atom state[4];
        state[0] = server.atom._NET_WM_STATE_SKIP_PAGER;
        state[1] = server.atom._NET_WM_STATE_SKIP_TASKBAR;
        state[2] = server.atom._NET_WM_STATE_STICKY;
-       state[3] = server.atom._NET_WM_STATE_BELOW;
-       XChangeProperty (server.dsp, p->main_win, server.atom._NET_WM_STATE, XA_ATOM, 32, PropModeReplace, (unsigned char *) state, 4);
+       state[3] = panel_layer == BOTTOM_LAYER ? server.atom._NET_WM_STATE_BELOW : server.atom._NET_WM_STATE_ABOVE;
+       XChangeProperty (server.dsp, p->main_win, server.atom._NET_WM_STATE, XA_ATOM, 32, PropModeReplace, (unsigned char *) state, panel_layer == NORMAL_LAYER ? 3 : 4);
 
        // Unfocusable
        XWMHints wmhints;
@@ -490,15 +488,8 @@ void set_panel_background(Panel *p)
        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;
+               clear_pixmap(p->area.pix.pmap, 0, 0, p->area.width, p->area.height);
+               return;  // no need for background pixmap, a transparent one is enough
        }
 
        get_root_pixmap();
index 73d7f50adce9838ad15659df4f169b4b9cb36620..52665cd19f09003eee62639abed69b32e3c4d07d 100644 (file)
@@ -37,9 +37,11 @@ extern int mouse_tilt_right;
 
 //panel mode
 enum { SINGLE_DESKTOP=0, MULTI_DESKTOP };
+enum { BOTTOM_LAYER, NORMAL_LAYER, TOP_LAYER };
 extern int panel_mode;
 extern int wm_menu;
 extern int panel_dock;
+extern int panel_layer;
 
 //panel position
 enum { LEFT=0x01, RIGHT=0x02, CENTER=0X04, TOP=0X08, BOTTOM=0x10 };
index f84396319efbcaf0dfbcbe9285c02b386c225fd3..202af942c4274815219f9d65014c0c1d86729424 100644 (file)
@@ -61,6 +61,7 @@ void server_init_atoms ()
        server.atom._NET_WM_STATE_MAXIMIZED_HORZ = XInternAtom (server.dsp, "_NET_WM_STATE_MAXIMIZED_HORZ", False);
        server.atom._NET_WM_STATE_SHADED = XInternAtom (server.dsp, "_NET_WM_STATE_SHADED", False);
        server.atom._NET_WM_STATE_BELOW = XInternAtom (server.dsp, "_NET_WM_STATE_BELOW", False);
+       server.atom._NET_WM_STATE_ABOVE = XInternAtom (server.dsp, "_NET_WM_STATE_ABOVE", False);
        server.atom._NET_WM_STATE_MODAL = XInternAtom (server.dsp, "_NET_WM_STATE_MODAL", False);
        server.atom._NET_CLIENT_LIST = XInternAtom (server.dsp, "_NET_CLIENT_LIST", False);
        server.atom._NET_WM_VISIBLE_NAME = XInternAtom (server.dsp, "_NET_WM_VISIBLE_NAME", False);
@@ -307,6 +308,7 @@ void get_desktops()
 
 void server_init_visual()
 {
+       // inspired by freedesktops fdclock ;)
        XVisualInfo *xvi;
        XVisualInfo templ = { .screen=server.screen, .depth=32, .class=TrueColor };
        int nvi;
index 7a86ca4b8b6b3adbb7b5b3414fe109a389943505..d010875c9bad0dacb5c39cfe34df1ece18bbb27a 100644 (file)
@@ -41,6 +41,7 @@ typedef struct Global_atom
        Atom _NET_WM_STATE_MAXIMIZED_HORZ;
        Atom _NET_WM_STATE_SHADED;
        Atom _NET_WM_STATE_BELOW;
+       Atom _NET_WM_STATE_ABOVE;
        Atom _NET_WM_STATE_MODAL;
        Atom _NET_CLIENT_LIST;
        Atom _NET_WM_NAME;
index 85431967d8128266aa48c9757859863bf1ee8d34..273d9bb8e2d9879a05c7582ae48ad384d55f96e5 100644 (file)
@@ -214,6 +214,8 @@ void start_net()
        // Vertical panel will draw the systray horizontal.
        int orient = 0;
        XChangeProperty(server.dsp, net_sel_win, server.atom._NET_SYSTEM_TRAY_ORIENTATION, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &orient, 1);
+       VisualID vid = XVisualIDFromVisual(server.visual);
+       XChangeProperty(server.dsp, net_sel_win, XInternAtom(server.dsp, "_NET_SYSTEM_TRAY_VISUAL", False), XA_VISUALID, 32, PropModeReplace, (unsigned char*)&vid, 1);
 
        XSetSelectionOwner(server.dsp, server.atom._NET_SYSTEM_TRAY_SCREEN, net_sel_win, CurrentTime);
        if (XGetSelectionOwner(server.dsp, server.atom._NET_SYSTEM_TRAY_SCREEN) != net_sel_win) {
index f7197c13cda0f2597c089c99a053bf5b8eefc1ed..6ea6b4d18ef260220dcb1005b37cd04b016b55d0 100644 (file)
@@ -190,7 +190,7 @@ GSList* task_get_tasks(Window win)
 
 void task_refresh_tasklist ()
 {
-       Window *win, active_win;
+       Window *win;
        int num_results, i, j, k;
        GSList *l0;
        Task *tsk;
index 987003cacd9a75ee0ae430dca78a9769d625dcbf..27458b8d87a4569c4487179012f391d81cf141e7 100644 (file)
@@ -61,7 +61,7 @@ void init (int argc, char *argv[])
                        printf("tint2 version 0.8\n");
                        exit(0);
                }
-               if (!strcmp(argv[i], "-c"))     {
+               if (!strcmp(argv[i], "-c")) {
                        i++;
                        if (i < argc)
                                config_path = strdup(argv[i]);
@@ -91,7 +91,7 @@ void init (int argc, char *argv[])
 
        // set global data
        memset(&server, 0, sizeof(Server_global));
-       memset(&systray, 0, sizeof(Systraybar));
+//     memset(&systray, 0, sizeof(Systraybar));
 
        server.dsp = XOpenDisplay (NULL);
        if (!server.dsp) {
@@ -679,10 +679,8 @@ int main (int argc, char *argv[])
        GSList *it;
        const struct timespec* timeout;
 
-       init (argc, argv);
-
-       i = 0;
        init_config();
+       i = 0;
        if (config_path)
                i = config_read_file (config_path);
        else
@@ -692,6 +690,9 @@ int main (int argc, char *argv[])
                cleanup();
                exit(1);
        }
+
+       init (argc, argv);
+
        init_panel();
        cleanup_config();
        if (snapshot_path) {
index e63c1eb1ce9e3cfbd681dd197ad8f6ba971f0181..d606047f2d85b4270a2b89db0e61f8a45baa0d93 100644 (file)
@@ -215,13 +215,20 @@ void tooltip_update()
        cs = cairo_xlib_surface_create(server.dsp, g_tooltip.window, server.visual, width, height);
        c = cairo_create(cs);
        Color bc = g_tooltip.background_color;
-       cairo_rectangle(c, 0, 0, width, height);
-       cairo_set_source_rgba(c, bc.color[0], bc.color[1], bc.color[2], bc.alpha);
-       cairo_fill(c);
        Border b = g_tooltip.border;
-       cairo_set_source_rgba(c, b.color[0], b.color[1], b.color[2], b.alpha);
+       if (real_transparency) {
+               draw_rect(c, b.width, b.width, width-2*b.width, height-2*b.width, b.rounded-b.width/1.571);
+               cairo_set_source_rgba(c, bc.color[0], bc.color[1], bc.color[2], bc.alpha);
+       }
+       else {
+               cairo_rectangle(c, 0., 0, width, height);
+               cairo_set_source_rgb(c, bc.color[0], bc.color[1], bc.color[2]);
+       }
+       cairo_fill(c);
        cairo_set_line_width(c, b.width);
-       cairo_rectangle(c, b.width/2.0, b.width/2.0, width-b.width, height-b.width);
+       if (real_transparency) draw_rect(c, b.width/2.0, b.width/2.0, width - b.width, height - b.width, b.rounded);
+       else cairo_rectangle(c, b.width/2.0, b.width/2.0, width-b.width, height-b.width);
+       cairo_set_source_rgba(c, b.color[0], b.color[1], b.color[2], b.alpha);
        cairo_stroke(c);
 
        config_color fc = g_tooltip.font_color;
index fc80a89d629584c1e6dc2a19a11015adc1fd15ed..62bb2f212ad720be929d4b0a211929611b298676 100644 (file)
@@ -107,17 +107,9 @@ void draw (Area *a, int active)
        if (*pmap) XFreePixmap (server.dsp, *pmap);
        *pmap = XCreatePixmap (server.dsp, server.root_win, a->width, a->height, server.depth);
 
-       // add layer of root pixmap
-       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);
-       }
+       // add layer of root pixmap (or clear pixmap if real_transparency==true)
+       if (real_transparency)
+               clear_pixmap(*pmap, 0 ,0, a->width, a->height);
        else
                XCopyArea (server.dsp, ((Panel *)a->panel)->temp_pmap, *pmap, server.gc, a->posx, a->posy, a->width, a->height, 0, 0);
 
@@ -259,3 +251,15 @@ void draw_rect(cairo_t *c, double x, double y, double w, double h, double r)
 }
 
 
+void clear_pixmap(Pixmap p, int x, int y, int w, int h)
+{
+       cairo_surface_t *tmp = cairo_xlib_surface_create (server.dsp, p, server.visual, w, h);
+       cairo_t *cr = cairo_create(tmp);
+       cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
+       cairo_rectangle(cr, x, y, w, h);
+       cairo_set_source_rgba(cr, 1, 1, 1, 0);
+       cairo_fill(cr);
+       cairo_destroy(cr);
+       cairo_surface_destroy (tmp);
+
+}
index a45b7b8e031e89c727d46a7535db95bd5f60a880..47c265ab9bd26eb1f57a4e262b7b0d6d34a3a79a 100644 (file)
@@ -102,5 +102,8 @@ void free_area (Area *a);
 
 // draw rounded rectangle
 void draw_rect(cairo_t *c, double x, double y, double w, double h, double r);
+
+// clear pixmap with transparent color
+void clear_pixmap(Pixmap p, int x, int y, int w, int h);
 #endif
 
This page took 0.032704 seconds and 4 git commands to generate.