]> Dogcows Code - chaz/tint2/commitdiff
Fix for incorrect task cycling when windows visible on all desktops are present
authorThierry Lorthiois <lorthiois@bbsoft.fr>
Sun, 14 Oct 2012 22:00:48 +0000 (22:00 +0000)
committerThierry Lorthiois <lorthiois@bbsoft.fr>
Sun, 14 Oct 2012 22:00:48 +0000 (22:00 +0000)
src/taskbar/task.c
src/taskbar/task.h
src/tint.c

index 4d717ac5b858710ba8d91bee87e4acf327e1eb10..994ff3f3893c7dce39965513e5900af05098eae8 100644 (file)
@@ -405,6 +405,35 @@ void on_change_task (void *obj)
        set_task_redraw(tsk);
 }
 
        set_task_redraw(tsk);
 }
 
+// Given a pointer to the active task (active_task) and a pointer
+// to the task that is currently under the mouse (current_task),
+// return a pointer to the active task that is on the same desktop
+// as current_task. Normally this is simply active_task, except when
+// it is set to appear on all desktops. In that case we search for
+// another Task on current_task's taskbar, with the same window as
+// active_task.
+Task *find_active_task(Task *current_task, Task *active_task)
+{
+       if (active_task == 0)
+               return current_task;
+       if (active_task->desktop != ALLDESKTOP)
+               return active_task;
+       if (current_task == 0)
+               return active_task;
+
+       GSList *l0;
+       Task *tsk;
+       Taskbar* tskbar = current_task->area.parent;
+
+       l0 = tskbar->area.list;
+       if (taskbarname_enabled) l0 = l0->next;
+       for (; l0 ; l0 = l0->next) {
+               tsk = l0->data;
+               if (tsk->win == active_task->win)
+                       return tsk;
+       }
+       return active_task;
+}
 
 Task *next_task(Task *tsk)
 {
 
 Task *next_task(Task *tsk)
 {
index d701c70d7bb3d989e1da1ba59afe02a1c105672e..50eed31d5d1df77f4f0a4b0ddf75f30c70c4df07 100644 (file)
@@ -78,6 +78,7 @@ void active_task();
 void set_task_state(Task* tsk, int state);
 void set_task_redraw(Task* tsk);
 
 void set_task_state(Task* tsk, int state);
 void set_task_redraw(Task* tsk);
 
+Task *find_active_task(Task *current_task, Task *active_task);
 Task *next_task (Task *tsk);
 Task *prev_task (Task *tsk);
 
 Task *next_task (Task *tsk);
 Task *prev_task (Task *tsk);
 
index 7b6e637594b65db025e2e6c9dc9398d5a6bffe6e..5767f2b53bd4704606b9968634ed6ec542959106 100644 (file)
@@ -331,14 +331,14 @@ void window_action (Task *tsk, int action)
                case NEXT_TASK:
                        if (task_active) {
                                Task *tsk1;
                case NEXT_TASK:
                        if (task_active) {
                                Task *tsk1;
-                               tsk1 = next_task(task_active);
+                               tsk1 = next_task(find_active_task(tsk, task_active));
                                set_active(tsk1->win);
                        }
                        break;
                case PREV_TASK:
                        if (task_active) {
                                Task *tsk1;
                                set_active(tsk1->win);
                        }
                        break;
                case PREV_TASK:
                        if (task_active) {
                                Task *tsk1;
-                               tsk1 = prev_task(task_active);
+                               tsk1 = prev_task(find_active_task(tsk, task_active));
                                set_active(tsk1->win);
                        }
        }
                                set_active(tsk1->win);
                        }
        }
This page took 0.023568 seconds and 4 git commands to generate.