X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Ftint.c;h=502c7b1812670159cb688471b6e8f06481c21582;hb=5579c4ee23c4f4ca02a75e6f7f40b51e9f017117;hp=d6f4f1a7de5ecc15d8bb87600d39a62e8a5040bc;hpb=bab0811f845cedb817a3c3a29dd91ade07d5a886;p=chaz%2Ftint2 diff --git a/src/tint.c b/src/tint.c index d6f4f1a..502c7b1 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")) { @@ -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; - tsk2->area.redraw = 1; - } - } - } + 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 = task_active == tsk ? TASK_ACTIVE : TASK_NORMAL; + 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 ( ; kicon[k] = tsk->icon[k]; - tsk2->area.redraw = 1; - } - 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; - tsk->current_state = 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 ) {