X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2Ftint.c;h=1380d657dce79f36431581024c3f0d15ab321ef1;hb=1b1f2a1a069edcf3db99ae07020eeedae3023f76;hp=a25e0947448949e4e7b29c6da0b0c04341f7fa8d;hpb=1488f5525f69428d66b0cb2da6e610edae2ebf55;p=chaz%2Ftint2 diff --git a/src/tint.c b/src/tint.c index a25e094..1380d65 100644 --- a/src/tint.c +++ b/src/tint.c @@ -80,7 +80,6 @@ void init (int argc, char *argv[]) sigaction(SIGTERM, &sa, 0); sigaction(SIGHUP, &sa, 0); signal(SIGCHLD, SIG_IGN); // don't have to wait() after fork() - signal(SIGALRM, tooltip_sighandler); // block all signals, such that no race conditions occur before pselect in our main loop sigset_t block_mask; sigaddset(&block_mask, SIGINT); @@ -179,86 +178,6 @@ void get_snapshot(const char *path) } -Taskbar *click_taskbar (Panel *panel, int x, int y) -{ - Taskbar *tskbar; - int i; - - if (panel_horizontal) { - for (i=0; i < panel->nb_desktop ; i++) { - tskbar = &panel->taskbar[i]; - if (tskbar->area.on_screen && x >= tskbar->area.posx && x <= (tskbar->area.posx + tskbar->area.width)) - return tskbar; - } - } - else { - for (i=0; i < panel->nb_desktop ; i++) { - tskbar = &panel->taskbar[i]; - if (tskbar->area.on_screen && y >= tskbar->area.posy && y <= (tskbar->area.posy + tskbar->area.height)) - return tskbar; - } - } - return NULL; -} - - -Task *click_task (Panel *panel, int x, int y) -{ - GSList *l0; - Taskbar *tskbar; - - if ( (tskbar = click_taskbar(panel, x, y)) ) { - if (panel_horizontal) { - Task *tsk; - for (l0 = tskbar->area.list; l0 ; l0 = l0->next) { - tsk = l0->data; - if (tsk->area.on_screen && x >= tsk->area.posx && x <= (tsk->area.posx + tsk->area.width)) { - return tsk; - } - } - } - else { - Task *tsk; - for (l0 = tskbar->area.list; l0 ; l0 = l0->next) { - tsk = l0->data; - if (tsk->area.on_screen && y >= tsk->area.posy && y <= (tsk->area.posy + tsk->area.height)) { - return tsk; - } - } - } - } - return NULL; -} - - -int click_padding(Panel *panel, int x, int y) -{ - if (panel_horizontal) { - if (x < panel->area.paddingxlr || x > panel->area.width-panel->area.paddingxlr) - return 1; - } - else { - if (y < panel->area.paddingxlr || y > panel->area.height-panel->area.paddingxlr) - return 1; - } - return 0; -} - - -int click_clock(Panel *panel, int x, int y) -{ - Clock clk = panel->clock; - if (panel_horizontal) { - if (clk.area.on_screen && x >= clk.area.posx && x <= (clk.area.posx + clk.area.width)) - return TRUE; - } else { - if (clk.area.on_screen && y >= clk.area.posy && y <= (clk.area.posy + clk.area.height)) - return TRUE; - } - return FALSE; -} - - void window_action (Task *tsk, int action) { if (!tsk) return; @@ -304,6 +223,20 @@ void window_action (Task *tsk, int action) windows_set_desktop(tsk->win, desk); if (desk == server.desktop) set_active(tsk->win); + break; + case NEXT_TASK: + if (task_active) { + Task *tsk1; + tsk1 = next_task(task_active); + set_active(tsk1->win); + } + break; + case PREV_TASK: + if (task_active) { + Task *tsk1; + tsk1 = prev_task(task_active); + set_active(tsk1->win); + } } } @@ -611,15 +544,11 @@ void event_property_notify (XEvent *e) void event_expose (XEvent *e) { - if (e->xany.window == g_tooltip.window) - tooltip_update(); - else { - Panel *panel; - panel = get_panel(e->xany.window); - if (!panel) return; - // TODO : one panel_refresh per panel ? - panel_refresh = 1; - } + Panel *panel; + panel = get_panel(e->xany.window); + if (!panel) return; + // TODO : one panel_refresh per panel ? + panel_refresh = 1; } @@ -667,11 +596,6 @@ void event_configure_notify (Window win) } -void event_timer() -{ -} - - void dnd_message(XClientMessageEvent *e) { Panel *panel = get_panel(e->window); @@ -705,7 +629,7 @@ void dnd_message(XClientMessageEvent *e) int main (int argc, char *argv[]) { XEvent e; - fd_set fd_set; + fd_set fdset; int x11_fd, i; Panel *panel; GSList *it; @@ -740,21 +664,49 @@ int main (int argc, char *argv[]) sigemptyset(&empty_mask); while (1) { + if (panel_refresh) { + panel_refresh = 0; + + 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->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); + + refresh(&panel->area); + XCopyArea(server.dsp, panel->temp_pmap, panel->main_win, server.gc, 0, 0, panel->area.width, panel->area.height, 0, 0); + } + XFlush (server.dsp); + + if (refresh_systray) { + 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 + refresh_systray_icon(); + } + } + // thanks to AngryLlama for the timer // Create a File Description Set containing x11_fd, and every timer_fd - FD_ZERO (&fd_set); - FD_SET (x11_fd, &fd_set); + FD_ZERO (&fdset); + FD_SET (x11_fd, &fdset); int max_fd = x11_fd; timer_iter = timer_list; while (timer_iter) { timer = timer_iter->data; max_fd = timer->id > max_fd ? timer->id : max_fd; - FD_SET(timer->id, &fd_set); + FD_SET(timer->id, &fdset); timer_iter = timer_iter->next; } // Wait for X Event or a Timer - if (pselect(max_fd+1, &fd_set, 0, 0, 0, &empty_mask) > 0) { + if (pselect(max_fd+1, &fdset, 0, 0, 0, &empty_mask) > 0) { while (XPending (server.dsp)) { XNextEvent(server.dsp, &e); @@ -771,9 +723,10 @@ int main (int argc, char *argv[]) case MotionNotify: { if (!g_tooltip.enabled) break; Panel* panel = get_panel(e.xmotion.window); - Task* task = click_task(panel, e.xmotion.x, e.xmotion.y); - if (task) - tooltip_trigger_show(task, e.xmotion.x_root, e.xmotion.y_root); + Area* area = click_area(panel, e.xmotion.x, e.xmotion.y); + if (area->_get_tooltip_text) { + tooltip_trigger_show(area, panel, e.xmotion.x_root, e.xmotion.y_root); + } else tooltip_trigger_hide(); break; @@ -787,6 +740,11 @@ 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; @@ -805,7 +763,7 @@ int main (int argc, char *argv[]) break; case UnmapNotify: case DestroyNotify: - if (!systray.area.on_screen) + if (e.xany.window == g_tooltip.window || !systray.area.on_screen) break; for (it = systray.list_icons; it; it = g_slist_next(it)) { if (((TrayWindow*)it->data)->id == e.xany.window) { @@ -827,10 +785,12 @@ int main (int argc, char *argv[]) } } + // we need to iterate over the whole timer list, since fd_set can only be checked with the + // brute force method FD_ISSET for every possible timer timer_iter = timer_list; while (timer_iter) { timer = timer_iter->data; - if (FD_ISSET(timer->id, &fd_set)) { + if (FD_ISSET(timer->id, &fdset)) { uint64_t dummy; read(timer->id, &dummy, sizeof(uint64_t)); timer->_callback(); @@ -853,34 +813,6 @@ int main (int argc, char *argv[]) cleanup (); return 0; } - - if (panel_refresh) { - panel_refresh = 0; - - 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->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); - - refresh(&panel->area); - XCopyArea(server.dsp, panel->temp_pmap, panel->main_win, server.gc, 0, 0, panel->area.width, panel->area.height, 0, 0); - } - XFlush (server.dsp); - - if (refresh_systray) { - 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 - refresh_systray_icon(); - } - } } }