Add option to sort taskbar by application name (contributed by Fabian Carlstrom)

This commit is contained in:
Chris Lee 2018-05-28 21:23:05 +00:00
parent 21e9303502
commit 5875015c11
16 changed files with 2392 additions and 2299 deletions

View file

@ -385,6 +385,7 @@ panel_size = 94% 30
* `taskbar_sort_order = none/title/center` : Specifies the sort order of the tasks on the taskbar. *(since 0.12)*
* `none` : No sorting. New tasks are simply appended at the end of the taskbar when they appear.
* `title` : Sorts the tasks by title.
* `application` : Sorts the tasks by application name. *(since 16.3)*
* `center` : Sorts the tasks by their window centers.
* `mru` : Shows the most recently used tasks first. *(since 0.12.4)*
* `lru` : Shows the most recently used tasks last. *(since 0.12.4)*

View file

@ -1016,6 +1016,8 @@ void add_entry(char *key, char *value)
taskbar_sort_method = TASKBAR_SORT_CENTER;
} else if (strcmp(value, "title") == 0) {
taskbar_sort_method = TASKBAR_SORT_TITLE;
} else if (strcmp(value, "application") == 0) {
taskbar_sort_method = TASKBAR_SORT_APPLICATION;
} else if (strcmp(value, "lru") == 0) {
taskbar_sort_method = TASKBAR_SORT_LRU;
} else if (strcmp(value, "mru") == 0) {

View file

@ -107,6 +107,21 @@ Task *add_task(Window win)
(int)win,
task_template.title ? task_template.title : "null");
// get application name
// use res_class property of WM_CLASS as res_name is easily overridable by user
XClassHint *classhint = XAllocClassHint();
if (classhint && XGetClassHint(server.display, win, classhint))
task_template.application = strdup(classhint->res_class);
else
task_template.application = strdup("Untitled");
if (classhint) {
if (classhint->res_name)
XFree(classhint->res_name);
if (classhint->res_class)
XFree(classhint->res_class);
XFree(classhint);
}
GPtrArray *task_buttons = g_ptr_array_new();
for (int j = 0; j < panels[monitor].num_desktops; j++) {
if (task_template.desktop != ALL_DESKTOPS && task_template.desktop != j)
@ -132,6 +147,7 @@ Task *add_task(Window win)
task_instance->area.on_screen = always_show_all_desktop_tasks;
}
task_instance->title = task_template.title;
task_instance->application = task_template.application;
if (panels[monitor].g_task.tooltip_enabled) {
task_instance->area._get_tooltip_text = task_get_tooltip;
task_instance->area._get_tooltip_image = task_get_thumbnail;
@ -208,12 +224,14 @@ void remove_task(Task *task)
Window win = task->win;
// free title and icon just for the first task
// free title, icon and application name just for the first task
// even with task_on_all_desktop and with task_on_all_panel
if (task->title)
free(task->title);
if (task->thumbnail)
cairo_surface_destroy(task->thumbnail);
if (task->application)
free(task->application);
task_remove_icon(task);
GPtrArray *task_buttons = g_hash_table_lookup(win_to_task, &win);

View file

@ -68,6 +68,7 @@ typedef struct Task {
Color icon_color_hover;
Color icon_color_press;
char *title;
char *application;
int urgent_tick;
// These may not be up-to-date
int win_x;

View file

@ -735,6 +735,14 @@ gint compare_task_titles(Task *a, Task *b, Taskbar *taskbar)
return strnatcasecmp(a->title ? a->title : "", b->title ? b->title : "");
}
gint compare_task_applications(Task *a, Task *b, Taskbar *taskbar)
{
int trivial = compare_tasks_trivial(a, b, taskbar);
if (trivial != NONTRIVIAL)
return trivial;
return strnatcasecmp(a->application ? a->application : "", b->application ? b->application : "");
}
gint compare_tasks(Task *a, Task *b, Taskbar *taskbar)
{
int trivial = compare_tasks_trivial(a, b, taskbar);
@ -746,6 +754,8 @@ gint compare_tasks(Task *a, Task *b, Taskbar *taskbar)
return compare_task_centers(a, b, taskbar);
} else if (taskbar_sort_method == TASKBAR_SORT_TITLE) {
return compare_task_titles(a, b, taskbar);
} else if (taskbar_sort_method == TASKBAR_SORT_APPLICATION) {
return compare_task_applications(a, b, taskbar);
} else if (taskbar_sort_method == TASKBAR_SORT_LRU) {
return compare_timespecs(&a->last_activation_time, &b->last_activation_time);
} else if (taskbar_sort_method == TASKBAR_SORT_MRU) {

View file

@ -21,6 +21,7 @@ typedef enum TaskbarSortMethod {
TASKBAR_NOSORT = 0,
TASKBAR_SORT_CENTER,
TASKBAR_SORT_TITLE,
TASKBAR_SORT_APPLICATION,
TASKBAR_SORT_LRU,
TASKBAR_SORT_MRU,
} TaskbarSortMethod;

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -2718,6 +2718,7 @@ void create_taskbar(GtkWidget *parent)
col++;
gtk_combo_box_append_text(GTK_COMBO_BOX(taskbar_sort_order), _("None"));
gtk_combo_box_append_text(GTK_COMBO_BOX(taskbar_sort_order), _("By title"));
gtk_combo_box_append_text(GTK_COMBO_BOX(taskbar_sort_order), _("By application"));
gtk_combo_box_append_text(GTK_COMBO_BOX(taskbar_sort_order), _("By center"));
gtk_combo_box_append_text(GTK_COMBO_BOX(taskbar_sort_order), _("Most recently used first"));
gtk_combo_box_append_text(GTK_COMBO_BOX(taskbar_sort_order), _("Most recently used last"));
@ -2728,6 +2729,7 @@ void create_taskbar(GtkWidget *parent)
"'None' means that new tasks are added to the end, and the user can also reorder task "
"buttons by mouse dragging. \n"
"'By title' means that tasks are sorted by their window titles. \n"
"'By application' means that tasks are sorted by their application names. \n"
"'By center' means that tasks are sorted geometrically by their window centers."),
NULL);

View file

@ -457,10 +457,12 @@ void config_write_taskbar(FILE *fp)
} else if (gtk_combo_box_get_active(GTK_COMBO_BOX(taskbar_sort_order)) == 1) {
fprintf(fp, "title");
} else if (gtk_combo_box_get_active(GTK_COMBO_BOX(taskbar_sort_order)) == 2) {
fprintf(fp, "center");
fprintf(fp, "application");
} else if (gtk_combo_box_get_active(GTK_COMBO_BOX(taskbar_sort_order)) == 3) {
fprintf(fp, "mru");
fprintf(fp, "center");
} else if (gtk_combo_box_get_active(GTK_COMBO_BOX(taskbar_sort_order)) == 4) {
fprintf(fp, "mru");
} else if (gtk_combo_box_get_active(GTK_COMBO_BOX(taskbar_sort_order)) == 5) {
fprintf(fp, "lru");
} else {
fprintf(fp, "none");
@ -1559,12 +1561,14 @@ void add_entry(char *key, char *value)
gtk_combo_box_set_active(GTK_COMBO_BOX(taskbar_sort_order), 0);
else if (strcmp(value, "title") == 0)
gtk_combo_box_set_active(GTK_COMBO_BOX(taskbar_sort_order), 1);
else if (strcmp(value, "center") == 0)
else if (strcmp(value, "application") == 0)
gtk_combo_box_set_active(GTK_COMBO_BOX(taskbar_sort_order), 2);
else if (strcmp(value, "mru") == 0)
else if (strcmp(value, "center") == 0)
gtk_combo_box_set_active(GTK_COMBO_BOX(taskbar_sort_order), 3);
else if (strcmp(value, "lru") == 0)
else if (strcmp(value, "mru") == 0)
gtk_combo_box_set_active(GTK_COMBO_BOX(taskbar_sort_order), 4);
else if (strcmp(value, "lru") == 0)
gtk_combo_box_set_active(GTK_COMBO_BOX(taskbar_sort_order), 5);
else
gtk_combo_box_set_active(GTK_COMBO_BOX(taskbar_sort_order), 0);
} else if (strcmp(key, "task_align") == 0) {