Task *task_active;
Task *task_drag;
-Task *task_urgent;
-int tick_urgent;
+GSList *urgent_list;
int max_tick_urgent;
// panel's initial config
task_active = 0;
task_drag = 0;
- task_urgent = 0;
+ urgent_list = 0;
cleanup_taskbar();
int i;
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;
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) {
}
}
+
+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;
+}
void get_title(Task *tsk);
void active_task();
+void add_urgent(Task *tsk);
+void del_urgent(Task *tsk);
+int is_urgent(Task *tsk);
+
#endif
// 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 );
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);
}
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