Workaround for empty systray icon in Google Chrome (misbehaving) - fix sorting

This commit is contained in:
o9000 2015-05-13 21:17:02 +02:00
parent 8795f50bb8
commit a08491c122
3 changed files with 36 additions and 22 deletions

View file

@ -613,13 +613,13 @@ void add_entry (char *key, char *value)
} }
else if (strcmp(key, "systray_sort") == 0) { else if (strcmp(key, "systray_sort") == 0) {
if (strcmp(value, "descending") == 0) if (strcmp(value, "descending") == 0)
systray.sort = -1; systray.sort = SYSTRAY_SORT_DESCENDING;
else if (strcmp(value, "ascending") == 0) else if (strcmp(value, "ascending") == 0)
systray.sort = 1; systray.sort = SYSTRAY_SORT_ASCENDING;
else if (strcmp(value, "left2right") == 0) else if (strcmp(value, "left2right") == 0)
systray.sort = 2; systray.sort = SYSTRAY_SORT_LEFT2RIGHT;
else if (strcmp(value, "right2left") == 0) else if (strcmp(value, "right2left") == 0)
systray.sort = 3; systray.sort = SYSTRAY_SORT_RIGHT2LEFT;
} }
else if (strcmp(key, "systray_icon_size") == 0) { else if (strcmp(key, "systray_icon_size") == 0) {
systray_max_icon_size = atoi(value); systray_max_icon_size = atoi(value);

View file

@ -52,7 +52,7 @@ int refresh_systray;
int systray_enabled; int systray_enabled;
int systray_max_icon_size; int systray_max_icon_size;
int systray_monitor; int systray_monitor;
int chrono;
// background pixmap if we render ourselves the icons // background pixmap if we render ourselves the icons
static Pixmap render_background; static Pixmap render_background;
@ -61,8 +61,9 @@ void default_systray()
{ {
memset(&systray, 0, sizeof(Systraybar)); memset(&systray, 0, sizeof(Systraybar));
render_background = 0; render_background = 0;
chrono = 0;
systray.alpha = 100; systray.alpha = 100;
systray.sort = 3; systray.sort = SYSTRAY_SORT_LEFT2RIGHT;
systray.area._draw_foreground = draw_systray; systray.area._draw_foreground = draw_systray;
systray.area._on_change_layout = on_change_systray; systray.area._on_change_layout = on_change_systray;
systray.area.size_mode = SIZE_BY_CONTENT; systray.area.size_mode = SIZE_BY_CONTENT;
@ -345,24 +346,33 @@ static gint compare_traywindows(gconstpointer a, gconstpointer b)
if (!traywin_a->empty && traywin_b->empty) if (!traywin_a->empty && traywin_b->empty)
return -1; return -1;
if (systray.sort < 2) if (systray.sort == SYSTRAY_SORT_ASCENDING ||
return 0; systray.sort == SYSTRAY_SORT_DESCENDING) {
XTextProperty name_a, name_b;
XTextProperty name_a, name_b; if (XGetWMName(server.dsp, traywin_a->tray_id, &name_a) == 0) {
return -1;
}
else if (XGetWMName(server.dsp, traywin_b->tray_id, &name_b) == 0) {
XFree(name_a.value);
return 1;
}
else {
gint retval = g_ascii_strncasecmp((char*)name_a.value, (char*)name_b.value, -1) *
(systray.sort == SYSTRAY_SORT_ASCENDING ? 1 : -1);
XFree(name_a.value);
XFree(name_b.value);
return retval;
}
}
if(XGetWMName(server.dsp, traywin_a->tray_id, &name_a) == 0) { if (systray.sort == SYSTRAY_SORT_LEFT2RIGHT ||
return -1; systray.sort == SYSTRAY_SORT_RIGHT2LEFT) {
} return (traywin_a->chrono - traywin_b->chrono) *
else if(XGetWMName(server.dsp, traywin_b->tray_id, &name_b) == 0) { (systray.sort == SYSTRAY_SORT_LEFT2RIGHT ? 1 : -1);
XFree(name_a.value);
return 1;
}
else {
gint retval = g_ascii_strncasecmp((char*)name_a.value, (char*)name_b.value, -1) * systray.sort;
XFree(name_a.value);
XFree(name_b.value);
return retval;
} }
return 0;
} }
@ -489,11 +499,13 @@ gboolean add_icon(Window id)
traywin->damage = 0; traywin->damage = 0;
traywin->empty = 0; traywin->empty = 0;
traywin->pid = pid; traywin->pid = pid;
traywin->chrono = chrono;
chrono++;
if (systray.area.on_screen == 0) if (systray.area.on_screen == 0)
show(&systray.area); show(&systray.area);
if (systray.sort == 3) if (systray.sort == SYSTRAY_SORT_RIGHT2LEFT)
systray.list_icons = g_slist_prepend(systray.list_icons, traywin); systray.list_icons = g_slist_prepend(systray.list_icons, traywin);
else else
systray.list_icons = g_slist_append(systray.list_icons, traywin); systray.list_icons = g_slist_append(systray.list_icons, traywin);

View file

@ -20,6 +20,7 @@
// Flags for _XEMBED_INFO // Flags for _XEMBED_INFO
#define XEMBED_MAPPED (1 << 0) #define XEMBED_MAPPED (1 << 0)
enum { SYSTRAY_SORT_ASCENDING, SYSTRAY_SORT_DESCENDING, SYSTRAY_SORT_LEFT2RIGHT, SYSTRAY_SORT_RIGHT2LEFT };
typedef struct { typedef struct {
// always start with area // always start with area
@ -45,6 +46,7 @@ typedef struct
timeout* render_timeout; timeout* render_timeout;
int empty; int empty;
int pid; int pid;
int chrono;
} TrayWindow; } TrayWindow;