all repos — tint2 @ e38ccf5376aca7849811f472e2acc77f2c4ddc97

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

Remember window order on panel restart (issue #615)
o9000 mrovi9000@gmail.com
commit

e38ccf5376aca7849811f472e2acc77f2c4ddc97

parent

3c9a0ff2f7123f77bef3f85c232246c29c1e59ba

1 files changed, 92 insertions(+), 3 deletions(-)

jump to
M src/taskbar/taskbar.csrc/taskbar/taskbar.c

@@ -47,6 +47,8 @@ gboolean always_show_all_desktop_tasks;

TaskbarSortMethod taskbar_sort_method; Alignment taskbar_alignment; +static GList *taskbar_task_orderings = NULL; + void taskbar_init_fonts(); int taskbar_compute_desired_size(void *obj);

@@ -85,8 +87,40 @@ taskbar_alignment = ALIGN_LEFT;

default_taskbarname(); } +void taskbar_clear_orderings() +{ + if (!taskbar_task_orderings) + return; + for (GList *order = taskbar_task_orderings; order; order = order->next) { + g_list_free_full((GList *)order->data, free); + } + g_list_free(taskbar_task_orderings); + taskbar_task_orderings = NULL; +} + +void taskbar_save_orderings() +{ + taskbar_clear_orderings(); + taskbar_task_orderings = NULL; + for (int i = 0; i < num_panels; i++) { + Panel *panel = &panels[i]; + for (int j = 0; j < panel->num_desktops; j++) { + Taskbar *taskbar = &panel->taskbar[j]; + GList *task_order = NULL; + for (GList *c = (taskbar->area.children && taskbarname_enabled) ? taskbar->area.children->next : taskbar->area.children; c; c = c->next) { + Task *t = (Task *)c->data; + Window *window = calloc(1, sizeof(Window)); + *window = t->win; + task_order = g_list_append(task_order, window); + } + taskbar_task_orderings = g_list_append(taskbar_task_orderings, task_order); + } + } +} + void cleanup_taskbar() { + taskbar_save_orderings(); if (win_to_task) { while (g_hash_table_size(win_to_task)) { GHashTableIter iter;

@@ -381,6 +415,54 @@ return g_hash_table_lookup(win_to_task, &win);

return NULL; } +static Window *sort_windows = NULL; + +int compare_windows(const void *a, const void *b) +{ + if (!sort_windows) + return 0; + + int ia = *(int*)a; + int ib = *(int*)b; + + Window wina = sort_windows[ia]; + Window winb = sort_windows[ib]; + + for (GList *order = taskbar_task_orderings; order; order = order->next) { + int posa = -1; + int posb = -1; + int pos = 0; + for (GList *item = (GList *)order->data; item; item = item->next, pos++) { + Window win = *(Window*)item->data; + if (win == wina) + posa = pos; + if (win == winb) + posb = pos; + } + if (posa >= 0 && posb >= 0) { + return posa - posb; + } + } + + return ia - ib; +} + +void sort_win_list(Window *windows, int count) +{ + int *indices = (int *)calloc(count, sizeof(int)); + for (int i = 0; i < count; i++) + indices[i] = i; + sort_windows = windows; + qsort(indices, count, sizeof(int), compare_windows); + Window *result = (Window *)calloc(count, sizeof(Window)); + for (int i = 0; i < count; i++) + result[i] = windows[indices[i]]; + memcpy(windows, result, count * sizeof(Window)); + free(result); + free(indices); + sort_windows = NULL; +} + void taskbar_refresh_tasklist() { if (!taskbar_enabled)

@@ -389,6 +471,12 @@ // fprintf(stderr, "tint2: %s %d:\n", __FUNCTION__, __LINE__);

int num_results; Window *win = server_get_property(server.root_win, server.atom._NET_CLIENT_LIST, XA_WINDOW, &num_results); + Window *sorted = (Window *)calloc(num_results, sizeof(Window)); + memcpy(sorted, win, num_results * sizeof(Window)); + if (taskbar_task_orderings) { + sort_win_list(sorted, num_results); + taskbar_clear_orderings(); + } if (!win) return;

@@ -396,7 +484,7 @@ GList *win_list = g_hash_table_get_keys(win_to_task);

for (GList *it = win_list; it; it = it->next) { int i; for (i = 0; i < num_results; i++) - if (*((Window *)it->data) == win[i]) + if (*((Window *)it->data) == sorted[i]) break; if (i == num_results) taskbar_remove_task(it->data);

@@ -405,10 +493,11 @@ g_list_free(win_list);

// Add any new for (int i = 0; i < num_results; i++) - if (!get_task(win[i])) - add_task(win[i]); + if (!get_task(sorted[i])) + add_task(sorted[i]); XFree(win); + free(sorted); } int taskbar_compute_desired_size(void *obj)