i3bar: set _NET_SYSTEM_TRAY_COLORS for symbolic icons (gtk3+)
This commit is contained in:
parent
e9503a1fa3
commit
f2ca568202
@ -88,6 +88,15 @@ void get_atoms(void);
|
|||||||
*/
|
*/
|
||||||
void kick_tray_clients(i3_output *output);
|
void kick_tray_clients(i3_output *output);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We need to set the _NET_SYSTEM_TRAY_COLORS atom on the tray selection window
|
||||||
|
* to make GTK+ 3 applets with Symbolic Icons visible. If the colors are unset,
|
||||||
|
* they assume a light background.
|
||||||
|
* See also https://bugzilla.gnome.org/show_bug.cgi?id=679591
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void init_tray_colors(void);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Destroy the bar of the specified output
|
* Destroy the bar of the specified output
|
||||||
*
|
*
|
||||||
|
@ -6,6 +6,7 @@ ATOM_DO(MANAGER)
|
|||||||
ATOM_DO(_NET_SYSTEM_TRAY_ORIENTATION)
|
ATOM_DO(_NET_SYSTEM_TRAY_ORIENTATION)
|
||||||
ATOM_DO(_NET_SYSTEM_TRAY_VISUAL)
|
ATOM_DO(_NET_SYSTEM_TRAY_VISUAL)
|
||||||
ATOM_DO(_NET_SYSTEM_TRAY_OPCODE)
|
ATOM_DO(_NET_SYSTEM_TRAY_OPCODE)
|
||||||
|
ATOM_DO(_NET_SYSTEM_TRAY_COLORS)
|
||||||
ATOM_DO(_XEMBED_INFO)
|
ATOM_DO(_XEMBED_INFO)
|
||||||
ATOM_DO(_XEMBED)
|
ATOM_DO(_XEMBED)
|
||||||
#undef ATOM_DO
|
#undef ATOM_DO
|
||||||
|
@ -84,6 +84,8 @@ void got_bar_config(char *reply) {
|
|||||||
* workspaces. Everything else (creating the bars, showing the right workspace-
|
* workspaces. Everything else (creating the bars, showing the right workspace-
|
||||||
* buttons and more) is taken care of by the event-drivenness of the code */
|
* buttons and more) is taken care of by the event-drivenness of the code */
|
||||||
i3_send_msg(I3_IPC_MESSAGE_TYPE_GET_OUTPUTS, NULL);
|
i3_send_msg(I3_IPC_MESSAGE_TYPE_GET_OUTPUTS, NULL);
|
||||||
|
|
||||||
|
free_colors(&(config.colors));
|
||||||
parse_config_json(reply);
|
parse_config_json(reply);
|
||||||
|
|
||||||
/* Now we can actually use 'config', so let's subscribe to the appropriate
|
/* Now we can actually use 'config', so let's subscribe to the appropriate
|
||||||
@ -97,7 +99,6 @@ void got_bar_config(char *reply) {
|
|||||||
|
|
||||||
/* Resolve color strings to colorpixels and save them, then free the strings. */
|
/* Resolve color strings to colorpixels and save them, then free the strings. */
|
||||||
init_colors(&(config.colors));
|
init_colors(&(config.colors));
|
||||||
free_colors(&(config.colors));
|
|
||||||
|
|
||||||
/* The name of this function is actually misleading. Even if no command is
|
/* The name of this function is actually misleading. Even if no command is
|
||||||
* specified, this function initiates the watchers to listen on stdin and
|
* specified, this function initiates the watchers to listen on stdin and
|
||||||
|
@ -272,6 +272,9 @@ void init_colors(const struct xcb_color_strings_t *new_colors) {
|
|||||||
PARSE_COLOR(focus_ws_bg, "#285577");
|
PARSE_COLOR(focus_ws_bg, "#285577");
|
||||||
PARSE_COLOR(focus_ws_border, "#4c7899");
|
PARSE_COLOR(focus_ws_border, "#4c7899");
|
||||||
#undef PARSE_COLOR
|
#undef PARSE_COLOR
|
||||||
|
|
||||||
|
init_tray_colors();
|
||||||
|
xcb_flush(xcb_connection);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1062,6 +1065,8 @@ void init_tray(void) {
|
|||||||
1,
|
1,
|
||||||
&orientation);
|
&orientation);
|
||||||
|
|
||||||
|
init_tray_colors();
|
||||||
|
|
||||||
if (tray_reply == NULL) {
|
if (tray_reply == NULL) {
|
||||||
if (!(tray_reply = xcb_intern_atom_reply(xcb_connection, tray_cookie, NULL))) {
|
if (!(tray_reply = xcb_intern_atom_reply(xcb_connection, tray_cookie, NULL))) {
|
||||||
ELOG("Could not get atom %s\n", atomname);
|
ELOG("Could not get atom %s\n", atomname);
|
||||||
@ -1096,6 +1101,47 @@ void init_tray(void) {
|
|||||||
send_tray_clientmessage();
|
send_tray_clientmessage();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We need to set the _NET_SYSTEM_TRAY_COLORS atom on the tray selection window
|
||||||
|
* to make GTK+ 3 applets with Symbolic Icons visible. If the colors are unset,
|
||||||
|
* they assume a light background.
|
||||||
|
* See also https://bugzilla.gnome.org/show_bug.cgi?id=679591
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void init_tray_colors(void) {
|
||||||
|
/* Convert colors.bar_fg (#rrggbb) to 16-bit RGB */
|
||||||
|
const char *bar_fg = (config.colors.bar_fg ? config.colors.bar_fg : "#FFFFFF");
|
||||||
|
|
||||||
|
DLOG("Setting bar_fg = %s as _NET_SYSTEM_TRAY_COLORS\n", bar_fg);
|
||||||
|
|
||||||
|
char strgroups[3][3] = {{bar_fg[1], bar_fg[2], '\0'},
|
||||||
|
{bar_fg[3], bar_fg[4], '\0'},
|
||||||
|
{bar_fg[5], bar_fg[6], '\0'}};
|
||||||
|
const uint8_t r = strtol(strgroups[0], NULL, 16);
|
||||||
|
const uint8_t g = strtol(strgroups[1], NULL, 16);
|
||||||
|
const uint8_t b = strtol(strgroups[2], NULL, 16);
|
||||||
|
|
||||||
|
const uint16_t r16 = ((uint16_t)r << 8) | r;
|
||||||
|
const uint16_t g16 = ((uint16_t)g << 8) | g;
|
||||||
|
const uint16_t b16 = ((uint16_t)b << 8) | b;
|
||||||
|
|
||||||
|
const uint32_t tray_colors[12] = {
|
||||||
|
r16, g16, b16, /* foreground color */
|
||||||
|
r16, g16, b16, /* error color */
|
||||||
|
r16, g16, b16, /* warning color */
|
||||||
|
r16, g16, b16, /* success color */
|
||||||
|
};
|
||||||
|
|
||||||
|
xcb_change_property(xcb_connection,
|
||||||
|
XCB_PROP_MODE_REPLACE,
|
||||||
|
selwin,
|
||||||
|
atoms[_NET_SYSTEM_TRAY_COLORS],
|
||||||
|
XCB_ATOM_CARDINAL,
|
||||||
|
32,
|
||||||
|
12,
|
||||||
|
tray_colors);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Cleanup the xcb-stuff.
|
* Cleanup the xcb-stuff.
|
||||||
* Called once, before the program terminates.
|
* Called once, before the program terminates.
|
||||||
|
Loading…
Reference in New Issue
Block a user