X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Ftint.c;h=fef466a279401b5bc723dbc3ac45dcaa0fc72495;hb=8182075c682f9609c916a840da9c591b58f13c7c;hp=0d7865726eb8ace74668d69d17df3928eb14a8be;hpb=c1041d7d49d93ed151830bdd93e9b007622d2578;p=chaz%2Ftint2 diff --git a/src/tint.c b/src/tint.c index 0d78657..fef466a 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; } @@ -680,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; @@ -720,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); @@ -742,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 @@ -805,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; @@ -828,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)) { @@ -839,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); @@ -850,12 +814,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 && !de->more ) { + if ( traywin->id == de->drawable ) { systray_render_icon(traywin); break; }