X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2Ftint.c;h=e64f8d90cfed4df81b5723f4569c31f71d418d1a;hb=087b91a75cfdc6203f397cd8dddd9c02df65455f;hp=42581ffbe616c85888ef8145da2c52013b20903a;hpb=d1123a0ede12eb1126eb5eb932d9177de67d46c5;p=chaz%2Ftint2 diff --git a/src/tint.c b/src/tint.c index 42581ff..e64f8d9 100644 --- a/src/tint.c +++ b/src/tint.c @@ -1,10 +1,10 @@ /************************************************************************** * * Tint2 panel -* +* * Copyright (C) 2007 PÃ¥l Staurland (staura@gmail.com) * Modified (C) 2008 thierry lorthiois (lorthiois@bbsoft.fr) -* +* * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License version 2 * as published by the Free Software Foundation. @@ -63,11 +63,7 @@ void init () panel.clock.area.draw_foreground = draw_foreground_clock; g_task.area.draw_foreground = draw_foreground_task; window.main_win = 0; - - // append full transparency background - //Area *back = calloc(1, sizeof(Area)); - list_back = g_slist_append(0, calloc(1, sizeof(Area))); - + server.dsp = XOpenDisplay (NULL); if (!server.dsp) { fprintf(stderr, "Could not open display.\n"); @@ -75,7 +71,7 @@ void init () } server_init_atoms (); server.screen = DefaultScreen (server.dsp); - server.root_win = RootWindow (server.dsp, server.screen); + server.root_win = RootWindow(server.dsp, server.screen); server.depth = DefaultDepth (server.dsp, server.screen); server.visual = DefaultVisual (server.dsp, server.screen); server.desktop = server_get_current_desktop (); @@ -89,7 +85,7 @@ void init () //kde_init(); //net_init(); //printf("ici 4\n"); - + imlib_context_set_display (server.dsp); imlib_context_set_visual (server.visual); imlib_context_set_colormap (DefaultColormap (server.dsp, server.screen)); @@ -97,7 +93,7 @@ void init () /* Catch events */ XSelectInput (server.dsp, server.root_win, PropertyChangeMask|StructureNotifyMask); - setlocale(LC_ALL, ""); + setlocale (LC_ALL, ""); } @@ -125,13 +121,13 @@ void window_action (Task *tsk, int action) void event_button_press (int x, int y) -{ +{ if (panel.mode == SINGLE_DESKTOP) { // drag and drop disabled XLowerWindow (server.dsp, window.main_win); return; } - + Taskbar *tskbar; GSList *l0; for (l0 = panel.area.list; l0 ; l0 = l0->next) { @@ -150,7 +146,7 @@ void event_button_press (int x, int y) } } } - + XLowerWindow (server.dsp, window.main_win); } @@ -158,6 +154,8 @@ void event_button_press (int x, int y) void event_button_release (int button, int x, int y) { int action = TOGGLE_ICONIFY; + // TODO: convert event_button_press(int x, int y) to area->event_button_press() + // if systray is ok switch (button) { case 2: @@ -174,9 +172,6 @@ void event_button_release (int button, int x, int y) break; } - // TODO: ne pas afficher les taskbar invisibles - //if (panel.mode != MULTI_DESKTOP && desktop != server.desktop) continue; - // search taskbar Taskbar *tskbar; GSList *l0; @@ -195,15 +190,17 @@ suite: // drag and drop task if (panel.task_drag) { if (tskbar != panel.task_drag->area.parent && action == TOGGLE_ICONIFY) { - windows_set_desktop(panel.task_drag->win, tskbar->desktop); - if (tskbar->desktop == server.desktop) - set_active(panel.task_drag->win); - panel.task_drag = 0; + if (!panel.task_drag->all_desktop && panel.mode == MULTI_DESKTOP) { + windows_set_desktop(panel.task_drag->win, tskbar->desktop); + if (tskbar->desktop == server.desktop) + set_active(panel.task_drag->win); + panel.task_drag = 0; + } return; } else panel.task_drag = 0; } - + // switch desktop if (panel.mode == MULTI_DESKTOP) if (tskbar->desktop != server.desktop && action != CLOSE) @@ -219,15 +216,15 @@ suite: break; } } - + // to keep window below XLowerWindow (server.dsp, window.main_win); } void event_property_notify (Window win, Atom at) -{ - +{ + if (win == server.root_win) { if (!server.got_root_win) { XSelectInput (server.dsp, server.root_win, PropertyChangeMask|StructureNotifyMask); @@ -237,37 +234,70 @@ void event_property_notify (Window win, Atom at) /* Change number of desktops */ else if (at == server.atom._NET_NUMBER_OF_DESKTOPS) { config_taskbar(); - redraw(&panel.area); - panel.refresh = 1; + visible_object(); } /* Change desktop */ else if (at == server.atom._NET_CURRENT_DESKTOP) { server.desktop = server_get_current_desktop (); - if (panel.mode != MULTI_DESKTOP) panel.refresh = 1; + if (panel.mode != MULTI_DESKTOP) { + visible_object(); + } } /* Window list */ else if (at == server.atom._NET_CLIENT_LIST) { task_refresh_tasklist (); panel.refresh = 1; } - /* Active */ + /* Change active */ else if (at == server.atom._NET_ACTIVE_WINDOW) { + if (panel.task_active) { + if (panel.task_active->all_desktop) { + Task *tsk; + GSList *l0; + int i, nb; + nb = server.nb_desktop * server.nb_monitor; + for (i=0 ; i < nb ; i++) { + for (l0 = panel.taskbar[i].area.list; l0 ; l0 = l0->next) { + tsk = l0->data; + tsk->area.is_active = 0; + } + } + } + else + panel.task_active->area.is_active = 0; + panel.task_active = 0; + } Window w1 = window_get_active (); Task *t = task_get_task(w1); - if (t) panel.task_active = t; - else { + if (!t) { Window w2; if (XGetTransientForHint(server.dsp, w1, &w2) != 0) - if (w2) panel.task_active = task_get_task(w2); + if (w2) t = task_get_task(w2); } + if (t) { + if (t->all_desktop) { + Task *tsk; + GSList *l0; + int i, nb; + nb = server.nb_desktop * server.nb_monitor; + for (i=0 ; i < nb ; i++) { + for (l0 = panel.taskbar[i].area.list; l0 ; l0 = l0->next) { + tsk = l0->data; + if (tsk->win == t->win) + tsk->area.is_active = 1; + } + } + } + else + t->area.is_active = 1; + panel.task_active = t; + } panel.refresh = 1; } /* Wallpaper changed */ else if (at == server.atom._XROOTPMAP_ID) { - XFreePixmap (server.dsp, server.root_pmap); - server.root_pmap = 0; - redraw(&panel.area); - panel.clock.area.redraw = 1; + XFreePixmap (server.dsp, panel.area.pix.pmap); + panel.area.pix.pmap = 0; panel.refresh = 1; } } @@ -279,26 +309,63 @@ void event_property_notify (Window win, Atom at) /* 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); - tsk->area.redraw = 1; + if (tsk->all_desktop) { + Task *tsk2; + GSList *l0; + int i, nb; + nb = server.nb_desktop * server.nb_monitor; + for (i=0 ; i < nb ; i++) { + for (l0 = panel.taskbar[i].area.list; l0 ; l0 = l0->next) { + tsk2 = l0->data; + if (tsk->win == tsk2->win) { + get_title(tsk2); + tsk2->area.redraw = 1; + } + } + } + } + else { + get_title(tsk); + tsk->area.redraw = 1; + } panel.refresh = 1; } /* Iconic state */ else if (at == server.atom.WM_STATE) { if (window_is_iconified (win)) - if (panel.task_active == tsk) panel.task_active = 0; + if (panel.task_active) { + if (panel.task_active->win == tsk->win) { + if (tsk->all_desktop) { + Task *tsk2; + GSList *l0; + int i, nb; + nb = server.nb_desktop * server.nb_monitor; + for (i=0 ; i < nb ; i++) { + for (l0 = panel.taskbar[i].area.list; l0 ; l0 = l0->next) { + tsk2 = l0->data; + tsk2->area.is_active = 0; + } + } + } + else + panel.task_active->area.is_active = 0; + panel.task_active = 0; + } + } } /* Window icon changed */ else if (at == server.atom._NET_WM_ICON) { - if (tsk->icon_data != 0) XFree (tsk->icon_data); + if (tsk->icon_data) { + free (tsk->icon_data); + tsk->icon_data = 0; + } tsk->area.redraw = 1; - tsk->icon_data = 0; panel.refresh = 1; } /* Window desktop changed */ else if (at == server.atom._NET_WM_DESKTOP) { - add_task (tsk->win); - remove_task (tsk); + remove_task (tsk); + add_task (win); panel.refresh = 1; } @@ -308,25 +375,19 @@ void event_property_notify (Window win, Atom at) void event_configure_notify (Window win) -{ - Task *tsk; +{ + if (panel.mode != MULTI_MONITOR) return; - tsk = task_get_task (win); + Task *tsk = task_get_task (win); if (!tsk) return; -/* TODO ??? voir ancien code !! - Taskbar *tskbar; - tskbar = tsk->area.parent; - int new_monitor = window_get_monitor (win); - int desktop = tskbar->desktop; - - // task on the same monitor - if (tsk->id_taskbar == index(desktop, new_monitor)) return; - - add_task (tsk->win); - remove_task (tsk); - panel.refresh = 1; - */ + Taskbar *tskbar = tsk->area.parent; + if (tskbar->monitor != window_get_monitor (win)) { + // task on another monitor + remove_task (tsk); + add_task (win); + panel.refresh = 1; + } } @@ -335,11 +396,11 @@ void event_timer() struct timeval stv; if (!panel.clock.time1_format) return; - + if (gettimeofday(&stv, 0)) return; - + if (abs(stv.tv_sec - panel.clock.clock.tv_sec) < panel.clock.time_precision) return; - + // update clock panel.clock.clock.tv_sec = stv.tv_sec; panel.clock.clock.tv_sec -= panel.clock.clock.tv_sec % panel.clock.time_precision; @@ -359,8 +420,11 @@ int main (int argc, char *argv[]) init (); load_config: - if (server.root_pmap) XFreePixmap (server.dsp, server.root_pmap); - server.root_pmap = 0; + if (panel.area.pix.pmap) XFreePixmap (server.dsp, panel.area.pix.pmap); + panel.area.pix.pmap = 0; + // append full transparency background + list_back = g_slist_append(0, calloc(1, sizeof(Area))); + // read tint2rc config i = 0; if (c != -1) @@ -373,12 +437,15 @@ load_config: exit(1); } config_finish (); - + window_draw_panel (); + // BUG: refresh(clock) is needed here, but 'on the paper' it's not necessary. + refresh(&panel.clock.area); + x11_fd = ConnectionNumber (server.dsp); XSync (server.dsp, False); - + while (1) { // thanks to AngryLlama for the timer // Create a File Description Set containing x11_fd @@ -387,12 +454,12 @@ load_config: tv.tv_usec = 500000; tv.tv_sec = 0; - + // Wait for X Event or a Timer if (select(x11_fd+1, &fd, 0, 0, &tv)) { while (XPending (server.dsp)) { XNextEvent(server.dsp, &e); - + switch (e.type) { case ButtonPress: if (e.xbutton.button == 1) event_button_press (e.xbutton.x, e.xbutton.y); @@ -401,12 +468,14 @@ load_config: case ButtonRelease: event_button_release (e.xbutton.button, e.xbutton.x, e.xbutton.y); break; - + case Expose: - XCopyArea (server.dsp, server.pmap, window.main_win, server.gc, 0, 0, panel.area.width, panel.area.height, 0, 0); + XCopyArea (server.dsp, panel.area.pix.pmap, server.root_win, server.gc_root, 0, 0, panel.area.width, panel.area.height, server.posx, server.posy); + XCopyArea (server.dsp, server.pmap, window.main_win, server.gc, panel.area.paddingx, 0, panel.area.width-(2*panel.area.paddingx), panel.area.height, 0, 0); break; case PropertyNotify: + //printf("PropertyNotify\n"); event_property_notify (e.xproperty.window, e.xproperty.atom); break; @@ -414,8 +483,7 @@ load_config: if (e.xconfigure.window == server.root_win) goto load_config; else - if (panel.mode == MULTI_MONITOR) - event_configure_notify (e.xconfigure.window); + event_configure_notify (e.xconfigure.window); break; } } @@ -434,7 +502,7 @@ load_config: if (panel.refresh && !panel.sleep_mode) { visual_refresh (); //printf(" *** visual_refresh\n"); - } + } } }