all repos — tint2 @ 5b645eeffb321cbd2fb9e9b38690a508de21d80f

fork of the tint2 desktop panel for my custom setup - only minimized windows across all desktops for the taskbar

detect start/stop composite manager. and answer to question.

git-svn-id: http://tint2.googlecode.com/svn/trunk@359 121b4492-b84c-0410-8b4c-0d4edfb3f3cc
thilor77 thilor77@121b4492-b84c-0410-8b4c-0d4edfb3f3cc
commit

5b645eeffb321cbd2fb9e9b38690a508de21d80f

parent

8efe25f8511bb99c23beaf60c28fd37e0e9c775b

3 files changed, 33 insertions(+), 5 deletions(-)

jump to
M src/server.csrc/server.c

@@ -92,6 +92,10 @@ // drag 'n' drop

server.atom.XdndAware = XInternAtom(server.dsp, "XdndAware", False); server.atom.XdndPosition = XInternAtom(server.dsp, "XdndPosition", False); server.atom.XdndStatus = XInternAtom(server.dsp, "XdndStatus", False); + + server.colormap = 0; + server.monitor = 0; + server.gc = 0; }

@@ -328,18 +332,23 @@ }

XFree (xvi); // check composite manager - if (XGetSelectionOwner(server.dsp, server.atom._NET_WM_CM_S0) == None) - real_transparency = 0; - else - real_transparency = 1; + server.composite_manager = XGetSelectionOwner(server.dsp, server.atom._NET_WM_CM_S0); + if (server.colormap) + XFreeColormap(server.dsp, server.colormap); + + if (visual && server.composite_manager != None) { + XSetWindowAttributes attrs; + attrs.event_mask = StructureNotifyMask; + XChangeWindowAttributes (server.dsp, server.composite_manager, CWEventMask, &attrs); - if (visual && real_transparency) { + real_transparency = 1; 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; } else { + real_transparency = 0; server.depth = DefaultDepth(server.dsp, server.screen); printf("real transparency off.... depth: %d\n", server.depth); server.colormap = DefaultColormap(server.dsp, server.screen);
M src/server.hsrc/server.h

@@ -84,6 +84,7 @@ typedef struct

{ Display *dsp; Window root_win; + Window composite_manager; // current desktop int desktop; int screen;
M src/tint.csrc/tint.c

@@ -636,6 +636,7 @@

int main (int argc, char *argv[]) { XEvent e; + XClientMessageEvent *ev; fd_set fdset; int x11_fd, i; Panel *panel;

@@ -677,6 +678,8 @@ if (panel_refresh) {

panel_refresh = 0; // QUESTION: do we need this first refresh_systray, because we check refresh_systray once again later... + // ANSWER: yes, panel->temp_pmap is freeded in the loop. + // we change background to None to avoid tray icon using freeded pixmap. if (refresh_systray) { panel = (Panel*)systray.area.panel; XSetWindowBackgroundPixmap (server.dsp, panel->main_win, None);

@@ -781,6 +784,12 @@ // FIXME: 'reparent to us' badly detected => disabled

break; case UnmapNotify: case DestroyNotify: + if (e.xany.window == server.composite_manager) { + printf("Stop composite.\n"); + //signal_pending = SIGUSR2; + server_init_visual(); + break; + } if (e.xany.window == g_tooltip.window || !systray.area.on_screen) break; for (it = systray.list_icons; it; it = g_slist_next(it)) {

@@ -792,6 +801,15 @@ }

break; case ClientMessage: + ev = &e; + if (ev->data.l[1] == server.atom._NET_WM_CM_S0) { + if (ev->data.l[2] == None) + printf("Stop composite 2.\n"); + else + printf("Start composite.\n"); + server_init_visual(); + //signal_pending = SIGUSR2; + } if (!systray.area.on_screen) break; if (e.xclient.message_type == server.atom._NET_SYSTEM_TRAY_OPCODE && e.xclient.format == 32 && e.xclient.window == net_sel_win) { net_message(&e.xclient);