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

git-svn-id: http://tint2.googlecode.com/svn/trunk@359 121b4492-b84c-0410-8b4c-0d4edfb3f3cc
This commit is contained in:
thilor77
2010-01-17 13:43:44 +00:00
parent 8efe25f851
commit 5b645eeffb
3 changed files with 33 additions and 5 deletions

View File

@@ -92,6 +92,10 @@ void server_init_atoms ()
server.atom.XdndAware = XInternAtom(server.dsp, "XdndAware", False); server.atom.XdndAware = XInternAtom(server.dsp, "XdndAware", False);
server.atom.XdndPosition = XInternAtom(server.dsp, "XdndPosition", False); server.atom.XdndPosition = XInternAtom(server.dsp, "XdndPosition", False);
server.atom.XdndStatus = XInternAtom(server.dsp, "XdndStatus", False); server.atom.XdndStatus = XInternAtom(server.dsp, "XdndStatus", False);
server.colormap = 0;
server.monitor = 0;
server.gc = 0;
} }
@@ -328,18 +332,23 @@ void server_init_visual()
XFree (xvi); XFree (xvi);
// check composite manager // check composite manager
if (XGetSelectionOwner(server.dsp, server.atom._NET_WM_CM_S0) == None) server.composite_manager = XGetSelectionOwner(server.dsp, server.atom._NET_WM_CM_S0);
real_transparency = 0; if (server.colormap)
else XFreeColormap(server.dsp, server.colormap);
real_transparency = 1;
if (visual && real_transparency) { if (visual && server.composite_manager != None) {
XSetWindowAttributes attrs;
attrs.event_mask = StructureNotifyMask;
XChangeWindowAttributes (server.dsp, server.composite_manager, CWEventMask, &attrs);
real_transparency = 1;
server.depth = 32; server.depth = 32;
printf("real transparency on... depth: %d\n", server.depth); printf("real transparency on... depth: %d\n", server.depth);
server.colormap = XCreateColormap(server.dsp, server.root_win, visual, AllocNone); server.colormap = XCreateColormap(server.dsp, server.root_win, visual, AllocNone);
server.visual = visual; server.visual = visual;
} }
else { else {
real_transparency = 0;
server.depth = DefaultDepth(server.dsp, server.screen); server.depth = DefaultDepth(server.dsp, server.screen);
printf("real transparency off.... depth: %d\n", server.depth); printf("real transparency off.... depth: %d\n", server.depth);
server.colormap = DefaultColormap(server.dsp, server.screen); server.colormap = DefaultColormap(server.dsp, server.screen);

View File

@@ -84,6 +84,7 @@ typedef struct
{ {
Display *dsp; Display *dsp;
Window root_win; Window root_win;
Window composite_manager;
// current desktop // current desktop
int desktop; int desktop;
int screen; int screen;

View File

@@ -636,6 +636,7 @@ void dnd_message(XClientMessageEvent *e)
int main (int argc, char *argv[]) int main (int argc, char *argv[])
{ {
XEvent e; XEvent e;
XClientMessageEvent *ev;
fd_set fdset; fd_set fdset;
int x11_fd, i; int x11_fd, i;
Panel *panel; Panel *panel;
@@ -677,6 +678,8 @@ int main (int argc, char *argv[])
panel_refresh = 0; panel_refresh = 0;
// QUESTION: do we need this first refresh_systray, because we check refresh_systray once again later... // 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) { if (refresh_systray) {
panel = (Panel*)systray.area.panel; panel = (Panel*)systray.area.panel;
XSetWindowBackgroundPixmap (server.dsp, panel->main_win, None); XSetWindowBackgroundPixmap (server.dsp, panel->main_win, None);
@@ -781,6 +784,12 @@ int main (int argc, char *argv[])
break; break;
case UnmapNotify: case UnmapNotify:
case DestroyNotify: 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) if (e.xany.window == g_tooltip.window || !systray.area.on_screen)
break; break;
for (it = systray.list_icons; it; it = g_slist_next(it)) { for (it = systray.list_icons; it; it = g_slist_next(it)) {
@@ -792,6 +801,15 @@ int main (int argc, char *argv[])
break; break;
case ClientMessage: 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 (!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) { 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); net_message(&e.xclient);