*add* multiple tasks can be urgent now git-svn-id: http://tint2.googlecode.com/svn/trunk@264 121b4492-b84c-0410-8b4c-0d4edfb3f3cc
Andreas.Fink85 Andreas.Fink85@121b4492-b84c-0410-8b4c-0d4edfb3f3cc
5 files changed,
71 insertions(+),
18 deletions(-)
M
src/panel.c
→
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 @@ if (!panel1) return;
task_active = 0; task_drag = 0; - task_urgent = 0; + urgent_list = 0; cleanup_taskbar(); int i;
M
src/panel.h
→
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;
M
src/taskbar/task.c
→
src/taskbar/task.c
@@ -391,9 +391,8 @@ Window w2;
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 @@ task_active = 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; +}
M
src/taskbar/task.h
→
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
M
src/tint.c
→
src/tint.c
@@ -519,9 +519,7 @@ }
// 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 @@ }
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 @@ time_clock.tv_sec = stv.tv_sec;
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