Add option to sort taskbar by application name (contributed by Fabian Carlstrom)
This commit is contained in:
parent
21e9303502
commit
5875015c11
16 changed files with 2392 additions and 2299 deletions
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
|
|
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
|
@ -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) {
|
||||
|
|
Loading…
Reference in a new issue