Add option to sort taskbar by application name (contributed by Fabian Carlstrom)
This commit is contained in:
@@ -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)*
|
||||
|
||||
@@ -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) {
|
||||
|
||||
+19
-1
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
+294
-287
File diff suppressed because it is too large
Load Diff
+294
-287
File diff suppressed because it is too large
Load Diff
+294
-287
File diff suppressed because it is too large
Load Diff
+294
-287
File diff suppressed because it is too large
Load Diff
+294
-287
File diff suppressed because it is too large
Load Diff
+294
-287
File diff suppressed because it is too large
Load Diff
+294
-287
File diff suppressed because it is too large
Load Diff
+289
-284
File diff suppressed because it is too large
Load Diff
@@ -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);
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user