all repos — tint2 @ e966c20f75d1b15f3e7e3435e6be2d18f166f018

fork of the tint2 desktop panel for my custom setup - only minimized windows across all desktops for the taskbar

*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
commit

e966c20f75d1b15f3e7e3435e6be2d18f166f018

parent

9f4e539f0b226b5c5200c56497bf3b99e74025d6

5 files changed, 71 insertions(+), 18 deletions(-)

jump to
M src/panel.csrc/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.hsrc/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.csrc/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.hsrc/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.csrc/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