From: Andreas Fink Date: Wed, 11 Nov 2009 20:09:34 +0000 (+0000) Subject: *add* multiple tasks can be urgent now X-Git-Url: https://git.brokenzipper.com/gitweb?a=commitdiff_plain;h=76d87d447e391bb097fd2b7ae1fbcb4bd6655622;p=chaz%2Ftint2 *add* multiple tasks can be urgent now --- diff --git a/src/panel.c b/src/panel.c index 3151be2..a84bd76 100644 --- a/src/panel.c +++ b/src/panel.c @@ -52,8 +52,7 @@ int panel_refresh; Task *task_active; Task *task_drag; -Task *task_urgent; -int tick_urgent; +GSList *urgent_list; int max_tick_urgent; // panel's initial config @@ -239,7 +238,7 @@ void cleanup_panel() task_active = 0; task_drag = 0; - task_urgent = 0; + urgent_list = 0; cleanup_taskbar(); int i; diff --git a/src/panel.h b/src/panel.h index 6f76232..30faf5f 100644 --- a/src/panel.h +++ b/src/panel.h @@ -50,7 +50,7 @@ extern int panel_refresh; extern Task *task_active; extern Task *task_drag; -extern Task *task_urgent; +extern GSList *urgent_list; extern int tick_urgent; extern int max_tick_urgent; diff --git a/src/taskbar/task.c b/src/taskbar/task.c index 0586854..07db372 100644 --- a/src/taskbar/task.c +++ b/src/taskbar/task.c @@ -391,9 +391,8 @@ void active_task() if (XGetTransientForHint(server.dsp, w1, &w2) != 0) if (w2) tsk2 = task_get_task(w2); } - if (task_urgent == tsk2) { - init_precision(); - task_urgent = 0; + if ( is_urgent(tsk2) ) { + del_urgent(tsk2); } // put active state on all task (multi_desktop) if (tsk2) { @@ -411,3 +410,55 @@ void active_task() } } + +void add_urgent(Task *tsk) +{ + // first check if task is already in the list and reset the counter + GSList* urgent_task = urgent_list; + while (urgent_task) { + Task_urgent* t = urgent_task->data; + if (t->tsk == tsk) { + t->tick = 0; + return; + } + urgent_task = urgent_task->next; + } + + // not yet in the list, so we have to add it + Task_urgent* t = malloc(sizeof(Task_urgent)); + if (!t) + return; + t->tsk = tsk; + t->tick = 0; + urgent_list = g_slist_prepend(urgent_list, t); + time_precision = 1; +} + + +void del_urgent(Task *tsk) +{ + GSList* urgent_task = urgent_list; + while (urgent_task) { + Task_urgent* t = urgent_task->data; + if (t->tsk == tsk) { + urgent_list = g_slist_remove(urgent_list, t); + free(t); + if (!urgent_list) + init_precision(); + return; + } + urgent_task = urgent_task->next; + } +} + +int is_urgent(Task *tsk) +{ + GSList* urgent_task = urgent_list; + while (urgent_task) { + Task_urgent* t = urgent_task->data; + if (t->tsk == tsk) + return 1; + urgent_task = urgent_task->next; + } + return 0; +} diff --git a/src/taskbar/task.h b/src/taskbar/task.h index 492c425..994870e 100644 --- a/src/taskbar/task.h +++ b/src/taskbar/task.h @@ -70,5 +70,9 @@ void get_icon (Task *tsk); void get_title(Task *tsk); void active_task(); +void add_urgent(Task *tsk); +void del_urgent(Task *tsk); +int is_urgent(Task *tsk); + #endif diff --git a/src/tint.c b/src/tint.c index d33ea38..192fa36 100644 --- a/src/tint.c +++ b/src/tint.c @@ -519,9 +519,7 @@ void event_property_notify (XEvent *e) // Demand attention else if (at == server.atom._NET_WM_STATE) { if (window_is_urgent (win)) { - task_urgent = tsk; - tick_urgent = 0; - time_precision = 1; + add_urgent(tsk); } if (window_is_skip_taskbar(win)) { remove_task( tsk ); @@ -592,9 +590,7 @@ void event_property_notify (XEvent *e) else if (at == server.atom.WM_HINTS) { XWMHints* wmhints = XGetWMHints(server.dsp, win); if (wmhints && wmhints->flags & XUrgencyHint) { - task_urgent = tsk; - tick_urgent = 0; - time_precision = 1; + add_urgent(tsk); } XFree(wmhints); } @@ -674,12 +670,15 @@ void event_timer() time_clock.tv_sec -= time_clock.tv_sec % time_precision; // urgent task - if (task_urgent) { - if (tick_urgent < max_tick_urgent) { - task_urgent->area.is_active = !task_urgent->area.is_active; - task_urgent->area.redraw = 1; - tick_urgent++; + GSList* urgent_task = urgent_list; + while (urgent_task) { + Task_urgent* t = urgent_task->data; + if ( t->tick < max_tick_urgent) { + t->tsk->area.is_active = !t->tsk->area.is_active; + t->tsk->area.redraw = 1; + t->tick++; } + urgent_task = urgent_task->next; } // update battery