]> Dogcows Code - chaz/tint2/blobdiff - src/tint.c
*fix* removed warnings
[chaz/tint2] / src / tint.c
index 7ea802060026b579f3899d0cae84716e257d4c88..502c7b1812670159cb688471b6e8f06481c21582 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")) {
@@ -157,7 +158,7 @@ void cleanup()
        if (snapshot_path) g_free(snapshot_path);
 
        cleanup_server();
-       XCloseDisplay(server.dsp);
+       if (server.dsp) XCloseDisplay(server.dsp);
 }
 
 
@@ -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;
@@ -310,6 +311,7 @@ void event_button_release (XEvent *e)
 
        if (wm_menu && !tint2_handles_click(panel, &e->xbutton)) {
                forward_click(e);
+               XLowerWindow (server.dsp, panel->main_win);
                task_drag = 0;
                return;
        }
@@ -381,7 +383,7 @@ void event_button_release (XEvent *e)
 
 void event_property_notify (XEvent *e)
 {
-       int i, j;
+       int i;
        Task *tsk;
        Window win = e->xproperty.window;
        Atom at = e->xproperty.atom;
@@ -492,20 +494,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) {
-                       Task *tsk2;
-                       GSList *l0;
                        get_title(tsk);
-                       // changed other tsk->title
-                       for (i=0 ; i < nb_panel ; i++) {
-                               for (j=0 ; j < panel1[i].nb_desktop ; j++) {
-                                       for (l0 = panel1[i].taskbar[j].area.list; l0 ; l0 = l0->next) {
-                                               tsk2 = l0->data;
-                                               if (tsk->win == tsk2->win && tsk != tsk2) {
-                                                       tsk2->title = tsk->title;
-                                                       set_task_redraw(tsk2);
-                                               }
-                                       }
-                               }
+                       if (g_tooltip.mapped && (g_tooltip.area == (Area*)tsk)) {
+                               tooltip_copy_text((Area*)tsk);
+                               tooltip_update();
                        }
                        panel_refresh = 1;
                }
@@ -521,38 +513,15 @@ void event_property_notify (XEvent *e)
                }
                else if (at == server.atom.WM_STATE) {
                        // Iconic state
-                       int state = tsk->current_state;
+                       int state = (task_active && tsk->win == task_active->win ? TASK_ACTIVE : TASK_NORMAL);
                        if (window_is_iconified(win))
                                state = TASK_ICONIFIED;
-                       GSList* task_list = task_get_tasks(win);
-                       GSList* it = task_list;
-                       while (it) {
-                               Task* t = it->data;
-                               set_task_state(t, state);
-                               it = it->next;
-                       }
-                       g_slist_free(task_list);
+                       set_task_state(tsk, state);
                        panel_refresh = 1;
                }
                // Window icon changed
                else if (at == server.atom._NET_WM_ICON) {
                        get_icon(tsk);
-                       Task *tsk2;
-                       GSList* task_list = task_get_tasks(tsk->win);
-                       GSList *l0 = task_list;
-                       while (l0) {
-                               tsk2 = l0->data;
-                               if (tsk2 !=  tsk) {
-                                       tsk2->icon_width = tsk->icon_width;
-                                       tsk2->icon_height = tsk->icon_height;
-                                       int k=0;
-                                       for ( ; k<TASK_STATE_COUNT; ++k)
-                                               tsk2->icon[k] = tsk->icon[k];
-                                       set_task_redraw(tsk2);
-                               }
-                               l0 = l0->next;
-                       }
-                       g_slist_free(task_list);
                        panel_refresh = 1;
                }
                // Window desktop changed
@@ -624,17 +593,10 @@ void event_configure_notify (Window win)
        Panel *p = tsk->area.panel;
        if (p->monitor != window_get_monitor (win)) {
                remove_task (tsk);
-               add_task (win);
+               tsk = add_task (win);
                if (win == window_get_active ()) {
-                       GSList* task_list = task_get_tasks(win);
-                       GSList* it = task_list;
-                       while (it) {
-                               Task *tsk = it->data;
-                               set_task_state(tsk, TASK_ACTIVE);
-                               task_active = tsk;
-                               it = task_list->next;
-                       }
-                       g_slist_free(task_list);
+                       set_task_state(tsk, TASK_ACTIVE);
+                       task_active = tsk;
                }
                panel_refresh = 1;
        }
@@ -674,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;
@@ -714,16 +677,13 @@ int main (int argc, char *argv[])
                if (panel_refresh) {
                        panel_refresh = 0;
 
-                       // QUESTION: do we need this first refresh_systray, because we check refresh_systray once again later...
-                       if (refresh_systray) {
-                               panel = (Panel*)systray.area.panel;
-                               XSetWindowBackgroundPixmap (server.dsp, panel->main_win, None);
-                       }
                        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);
@@ -736,7 +696,6 @@ int main (int argc, char *argv[])
                        panel = (Panel*)systray.area.panel;
                        if (refresh_systray && !panel->is_hidden) {
                                refresh_systray = 0;
-                               panel = (Panel*)systray.area.panel;
                                // tint2 doen't draw systray icons. it just redraw background.
                                XSetWindowBackgroundPixmap (server.dsp, panel->main_win, panel->temp_pmap);
                                // force icon's refresh
@@ -799,11 +758,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;
@@ -822,6 +776,11 @@ int main (int argc, char *argv[])
                                                break;
                                        case UnmapNotify:
                                        case DestroyNotify:
+                                               if (e.xany.window == server.composite_manager) {
+                                                       // TODO: Stop real_transparency
+                                                       //signal_pending = SIGUSR2;
+                                                       break;
+                                               }
                                                if (e.xany.window == g_tooltip.window || !systray.area.on_screen)
                                                        break;
                                                for (it = systray.list_icons; it; it = g_slist_next(it)) {
@@ -833,6 +792,17 @@ int main (int argc, char *argv[])
                                        break;
 
                                        case ClientMessage:
+                                               ev = &e.xclient;
+                                               if (ev->data.l[1] == server.atom._NET_WM_CM_S0) {
+                                                       if (ev->data.l[2] == None)
+                                                               // TODO: Stop real_transparency
+                                                               //signal_pending = SIGUSR2;
+                                                               ;
+                                                       else
+                                                               // TODO: Start real_transparency
+                                                               //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);
@@ -844,9 +814,11 @@ int main (int argc, char *argv[])
 
                                        default:
                                                if (e.type == XDamageNotify+damage_event) {
+                                                       // union needed to avoid strict-aliasing warnings by gcc
+                                                       union { XEvent e; XDamageNotifyEvent de; } event_union = {.e=e};
                                                        TrayWindow *traywin;
                                                        GSList *l;
-                                                       XDamageNotifyEvent* de = (XDamageNotifyEvent*)&e;
+                                                       XDamageNotifyEvent* de = &event_union.de;
                                                        for (l = systray.list_icons; l ; l = l->next) {
                                                                traywin = (TrayWindow*)l->data;
                                                                if ( traywin->id == de->drawable && !de->more ) {
This page took 0.037156 seconds and 4 git commands to generate.