X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Ftint.c;h=c95c3171a2e823063a2db8c674029dc7aa722283;hb=1fd834384c65cbfc592b7b5d593b31db0d163f3c;hp=d9e02334173f2d0ed4d006a94e6bf78eb824ba98;hpb=8abd6d423bffc9cd35928e1911c138163f7dbda9;p=chaz%2Ftint2 diff --git a/src/tint.c b/src/tint.c index d9e0233..c95c317 100644 --- a/src/tint.c +++ b/src/tint.c @@ -31,6 +31,7 @@ #include #include +#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")) { @@ -139,6 +140,7 @@ void init_X11() void cleanup() { + stop_all_timeouts(); cleanup_systray(); stop_net(); cleanup_panel(); @@ -156,7 +158,7 @@ void cleanup() if (snapshot_path) g_free(snapshot_path); cleanup_server(); - XCloseDisplay(server.dsp); + if (server.dsp) XCloseDisplay(server.dsp); } @@ -262,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; @@ -309,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; } @@ -380,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; @@ -414,10 +417,10 @@ void event_property_notify (XEvent *e) // redraw both taskbar if (server.nb_desktop > old_desktop) { // can happen if last desktop is deleted and we've been on the last desktop - panel->taskbar[old_desktop].area.is_active = 0; + panel->taskbar[old_desktop].area.bg = panel->g_taskbar.bg; panel->taskbar[old_desktop].area.resize = 1; } - panel->taskbar[server.desktop].area.is_active = 1; + panel->taskbar[server.desktop].area.bg = panel->g_taskbar.bg_active; panel->taskbar[server.desktop].area.resize = 1; panel_refresh = 1; } @@ -491,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; - tsk2->area.redraw = 1; - } - } - } + if (g_tooltip.mapped && (g_tooltip.area == (Area*)tsk)) { + tooltip_copy_text((Area*)tsk); + tooltip_update(); } panel_refresh = 1; } @@ -518,49 +511,17 @@ void event_property_notify (XEvent *e) panel_refresh = 1; } } -// We do not check for the iconified state, since it only unsets our active window -// but in openbox a shaded window is considered iconified. So we would loose the active window -// property on unshading it again (commented 01.10.2009) -// else if (at == server.atom.WM_STATE) { -// // Iconic state -// // TODO : try to delete following code -// if (window_is_iconified (win)) { -// if (task_active) { -// if (task_active->win == tsk->win) { -// Task *tsk2; -// GSList *l0; -// 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; -// tsk2->area.is_active = 0; -// } -// } -// } -// task_active = 0; -// } -// } -// } -// } + else if (at == server.atom.WM_STATE) { + // Iconic state + int state = (task_active && tsk->win == task_active->win ? TASK_ACTIVE : TASK_NORMAL); + if (window_is_iconified(win)) + state = TASK_ICONIFIED; + 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 *l0; - 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->icon_width = tsk->icon_width; - tsk2->icon_height = tsk->icon_height; - tsk2->icon = tsk->icon; - tsk2->icon_active = tsk->icon_active; - tsk2->area.redraw = 1; - } - } - } - } panel_refresh = 1; } // Window desktop changed @@ -632,15 +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); - while (task_list) { - Task *tsk = task_list->data; - tsk->area.is_active = 1; - task_active = tsk; - task_list = task_list->next; - } + set_task_state(tsk, TASK_ACTIVE); + task_active = tsk; } panel_refresh = 1; } @@ -728,8 +684,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); @@ -805,11 +763,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; @@ -850,12 +803,14 @@ 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 ) { + if ( traywin->id == de->drawable && !de->more ) { systray_render_icon(traywin); break; }