]> Dogcows Code - chaz/tint2/blobdiff - src/tint.c
detect start/stop composite manager. and answer to question.
[chaz/tint2] / src / tint.c
index 609a8d7cea645406314785276a21e4367098fbee..3a7b82b8415f8590d29723dd0899a7589dac8327 100644 (file)
@@ -31,6 +31,7 @@
 #include <Imlib2.h>
 #include <signal.h>
 
+#include "version.h"
 #include "server.h"
 #include "window.h"
 #include "config.h"
@@ -59,7 +60,7 @@ void init (int argc, char *argv[])
                        exit(0);
                }
                if (!strcmp(argv[i], "-v") || !strcmp(argv[i], "--version"))    {
-                       printf("tint2 version 0.8\n");
+                       printf("tint2 version %s\n", VERSION_STRING);
                        exit(0);
                }
                if (!strcmp(argv[i], "-c")) {
@@ -263,7 +264,7 @@ int tint2_handles_click(Panel* panel, XButtonEvent* e)
        if (tskbar && e->button == 1 && panel_mode == MULTI_DESKTOP)
                return 1;
        if (click_clock(panel, e->x, e->y)) {
-               if ( (e->button == 1 && clock_lclick_command) || (e->button == 2 && clock_rclick_command) )
+               if ( (e->button == 1 && clock_lclick_command) || (e->button == 3 && clock_rclick_command) )
                        return 1;
                else
                        return 0;
@@ -494,6 +495,10 @@ void event_property_notify (XEvent *e)
                // Window title changed
                if (at == server.atom._NET_WM_VISIBLE_NAME || at == server.atom._NET_WM_NAME || at == server.atom.WM_NAME) {
                        get_title(tsk);
+                       if (g_tooltip.mapped && (g_tooltip.area == (Area*)tsk)) {
+                               tooltip_copy_text((Area*)tsk);
+                               tooltip_update();
+                       }
                        panel_refresh = 1;
                }
                // Demand attention
@@ -631,6 +636,7 @@ void dnd_message(XClientMessageEvent *e)
 int main (int argc, char *argv[])
 {
        XEvent e;
+       XClientMessageEvent *ev;
        fd_set fdset;
        int x11_fd, i;
        Panel *panel;
@@ -672,6 +678,8 @@ int main (int argc, char *argv[])
                        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);
@@ -679,8 +687,10 @@ int main (int argc, char *argv[])
                        for (i=0 ; i < nb_panel ; i++) {
                                panel = &panel1[i];
 
-                               if (panel->is_hidden)
+                               if (panel->is_hidden) {
                                        XCopyArea(server.dsp, panel->hidden_pixmap, panel->main_win, server.gc, 0, 0, panel->hidden_width, panel->hidden_height, 0, 0);
+                                       XSetWindowBackgroundPixmap(server.dsp, panel->main_win, panel->hidden_pixmap);
+                               }
                                else {
                                        if (panel->temp_pmap) XFreePixmap(server.dsp, panel->temp_pmap);
                                        panel->temp_pmap = XCreatePixmap(server.dsp, server.root_win, panel->area.width, panel->area.height, server.depth);
@@ -756,11 +766,6 @@ int main (int argc, char *argv[])
                                                event_expose(&e);
                                                break;
 
-                                       case MapNotify:
-                                               if (e.xany.window == g_tooltip.window)
-                                                       tooltip_update();
-                                               break;
-
                                        case PropertyNotify:
                                                event_property_notify(&e);
                                                break;
@@ -779,6 +784,12 @@ int main (int argc, char *argv[])
                                                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)) {
@@ -790,6 +801,15 @@ int main (int argc, char *argv[])
                                        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);
This page took 0.029881 seconds and 4 git commands to generate.