From 843ad38b3c427adb0bf319e9613d9813c8d9246c Mon Sep 17 00:00:00 2001 From: Calvin Lee Date: Wed, 7 Jun 2017 16:45:28 -0700 Subject: Implement Tray Icons This commit implements the StatusNotifierItem protocol, and enables swaybar to show tray icons. It also uses `xembedsniproxy` in order to communicate with xembed applications. The tray is completely optional, and can be disabled on compile time with the `enable-tray` option. Or on runtime with the bar config option `tray_output none`. Overview of changes: In swaybar very little is changed outside the tray subfolder except that all events are now polled in `event_loop.c`, this creates no functional difference. Six bar configuration options were added, these are detailed in sway-bar(5) The tray subfolder is where all protocol implementation takes place and is organised as follows: tray/sni_watcher.c: This file contains the StatusNotifierWatcher. It keeps track of items and hosts and reports when they come or go. tray/tray.c This file contains the StatusNotifierHost. It keeps track of sway's version of the items and represents the tray itself. tray/sni.c This file contains the StatusNotifierItem struct and all communication with individual items. tray/icon.c This file implements the icon theme protocol. It allows for finding icons by name, rather than by pixmap. tray/dbus.c This file allows for asynchronous DBus communication. See #986 #343 --- include/client/cairo.h | 2 + include/sway/commands.h | 4 ++ include/sway/config.h | 12 +++++- include/swaybar/bar.h | 6 +++ include/swaybar/config.h | 11 ++++++ include/swaybar/event_loop.h | 26 ++++++++++++ include/swaybar/tray/dbus.h | 18 +++++++++ include/swaybar/tray/icon.h | 16 ++++++++ include/swaybar/tray/sni.h | 81 ++++++++++++++++++++++++++++++++++++++ include/swaybar/tray/sni_watcher.h | 10 +++++ include/swaybar/tray/tray.h | 26 ++++++++++++ 11 files changed, 211 insertions(+), 1 deletion(-) create mode 100644 include/swaybar/event_loop.h create mode 100644 include/swaybar/tray/dbus.h create mode 100644 include/swaybar/tray/icon.h create mode 100644 include/swaybar/tray/sni.h create mode 100644 include/swaybar/tray/sni_watcher.h create mode 100644 include/swaybar/tray/tray.h (limited to 'include') diff --git a/include/client/cairo.h b/include/client/cairo.h index 46c53566..e7ef7c7e 100644 --- a/include/client/cairo.h +++ b/include/client/cairo.h @@ -6,6 +6,8 @@ void cairo_set_source_u32(cairo_t *cairo, uint32_t color); +cairo_surface_t *cairo_image_surface_scale(cairo_surface_t *image, int width, int height); + #ifdef WITH_GDK_PIXBUF #include diff --git a/include/sway/commands.h b/include/sway/commands.h index 078652e7..f67df10f 100644 --- a/include/sway/commands.h +++ b/include/sway/commands.h @@ -157,17 +157,21 @@ sway_cmd cmd_workspace; sway_cmd cmd_ws_auto_back_and_forth; sway_cmd cmd_workspace_layout; +sway_cmd bar_cmd_activate_button; sway_cmd bar_cmd_binding_mode_indicator; sway_cmd bar_cmd_bindsym; sway_cmd bar_cmd_colors; +sway_cmd bar_cmd_context_button; sway_cmd bar_cmd_font; sway_cmd bar_cmd_mode; sway_cmd bar_cmd_modifier; sway_cmd bar_cmd_output; sway_cmd bar_cmd_height; sway_cmd bar_cmd_hidden_state; +sway_cmd bar_cmd_icon_theme; sway_cmd bar_cmd_id; sway_cmd bar_cmd_position; +sway_cmd bar_cmd_secondary_button; sway_cmd bar_cmd_separator_symbol; sway_cmd bar_cmd_status_command; sway_cmd bar_cmd_pango_markup; diff --git a/include/sway/config.h b/include/sway/config.h index 35f8d5f7..999a471a 100644 --- a/include/sway/config.h +++ b/include/sway/config.h @@ -133,7 +133,17 @@ struct bar_config { char *swaybar_command; char *font; int height; // -1 not defined - int tray_padding; + +#ifdef ENABLE_TRAY + // Tray + char *tray_output; + char *icon_theme; + uint32_t tray_padding; + uint32_t activate_button; + uint32_t context_button; + uint32_t secondary_button; +#endif + bool workspace_buttons; bool wrap_scroll; char *separator_symbol; diff --git a/include/swaybar/bar.h b/include/swaybar/bar.h index 697a48c2..010e1f84 100644 --- a/include/swaybar/bar.h +++ b/include/swaybar/bar.h @@ -21,6 +21,9 @@ struct output { struct window *window; struct registry *registry; list_t *workspaces; +#ifdef ENABLE_TRAY + list_t *items; +#endif char *name; int idx; bool focused; @@ -37,6 +40,9 @@ struct workspace { /** Global bar state */ extern struct bar swaybar; +/** True if sway needs to render */ +extern bool dirty; + /** * Setup bar. */ diff --git a/include/swaybar/config.h b/include/swaybar/config.h index 04b12cd4..651f0ee3 100644 --- a/include/swaybar/config.h +++ b/include/swaybar/config.h @@ -33,6 +33,17 @@ struct config { bool all_outputs; list_t *outputs; +#ifdef ENABLE_TRAY + // Tray + char *tray_output; + char *icon_theme; + + uint32_t tray_padding; + uint32_t activate_button; + uint32_t context_button; + uint32_t secondary_button; +#endif + int height; struct { diff --git a/include/swaybar/event_loop.h b/include/swaybar/event_loop.h new file mode 100644 index 00000000..a0cde07f --- /dev/null +++ b/include/swaybar/event_loop.h @@ -0,0 +1,26 @@ +#ifndef _SWAYBAR_EVENT_LOOP_H +#define _SWAYBAR_EVENT_LOOP_H + +#include +#include + +void add_event(int fd, short mask, + void(*cb)(int fd, short mask, void *data), + void *data); + +// Not guaranteed to notify cb immediately +void add_timer(timer_t timer, + void(*cb)(timer_t timer, void *data), + void *data); + +// Returns false if nothing exists, true otherwise +bool remove_event(int fd); + +// Returns false if nothing exists, true otherwise +bool remove_timer(timer_t timer); + +// Blocks and returns after sending callbacks +void event_loop_poll(); + +void init_event_loop(); +#endif /*_SWAYBAR_EVENT_LOOP_H */ diff --git a/include/swaybar/tray/dbus.h b/include/swaybar/tray/dbus.h new file mode 100644 index 00000000..eb9cfea7 --- /dev/null +++ b/include/swaybar/tray/dbus.h @@ -0,0 +1,18 @@ +#ifndef _SWAYBAR_DBUS_H +#define _SWAYBAR_DBUS_H + +#include +#include +extern DBusConnection *conn; + +/** + * Should be called in main loop to dispatch events + */ +void dispatch_dbus(); + +/** + * Initializes async dbus communication + */ +int dbus_init(); + +#endif /* _SWAYBAR_DBUS_H */ diff --git a/include/swaybar/tray/icon.h b/include/swaybar/tray/icon.h new file mode 100644 index 00000000..1cc6ff9c --- /dev/null +++ b/include/swaybar/tray/icon.h @@ -0,0 +1,16 @@ +#ifndef _SWAYBAR_ICON_H +#define _SWAYBAR_ICON_H + +#include +#include +#include + +/** + * Returns the image found by `name` that is closest to `size` + */ +cairo_surface_t *find_icon(const char *name, int size); + +/* Struct used internally only */ +struct subdir; + +#endif /* _SWAYBAR_ICON_H */ diff --git a/include/swaybar/tray/sni.h b/include/swaybar/tray/sni.h new file mode 100644 index 00000000..83809b2d --- /dev/null +++ b/include/swaybar/tray/sni.h @@ -0,0 +1,81 @@ +#ifndef _SWAYBAR_SNI_H +#define _SWAYBAR_SNI_H + +#include +#include + +struct StatusNotifierItem { + /* Name registered to sni watcher */ + char *name; + /* Unique bus name, needed for determining signal origins */ + char *unique_name; + bool kde_special_snowflake; + + cairo_surface_t *image; + bool dirty; +}; + +/* Each output holds an sni_icon_ref of each item to render */ +struct sni_icon_ref { + cairo_surface_t *icon; + struct StatusNotifierItem *ref; +}; + +struct sni_icon_ref *sni_icon_ref_create(struct StatusNotifierItem *item, + int height); + +void sni_icon_ref_free(struct sni_icon_ref *sni_ref); + +/** + * Will return a new item and get its icon. (see warning below) + */ +struct StatusNotifierItem *sni_create(const char *name); + +/** + * `item` must be a struct StatusNotifierItem * + * `str` must be a NUL terminated char * + * + * Returns 0 if `item` has a name of `str` + */ +int sni_str_cmp(const void *item, const void *str); + +/** + * Returns 0 if `item` has a unique name of `str` or if + * `item->unique_name == NULL` + */ +int sni_uniq_cmp(const void *item, const void *str); + +/** + * Gets an icon for the given item if found. + * + * XXX + * This function keeps a reference to the item until it gets responses, make + * sure that the reference and item are valid during this time. + */ +void get_icon(struct StatusNotifierItem *item); + +/** + * Calls the "activate" method on the given StatusNotifierItem + * + * x and y should be where the item was clicked + */ +void sni_activate(struct StatusNotifierItem *item, uint32_t x, uint32_t y); + +/** + * Asks the item to draw a context menu at the given x and y coords + */ +void sni_context_menu(struct StatusNotifierItem *item, uint32_t x, uint32_t y); + +/** + * Calls the "secondary activate" method on the given StatusNotifierItem + * + * x and y should be where the item was clicked + */ +void sni_secondary(struct StatusNotifierItem *item, uint32_t x, uint32_t y); + +/** + * Deconstructs `item` + */ +void sni_free(struct StatusNotifierItem *item); + +#endif /* _SWAYBAR_SNI_H */ diff --git a/include/swaybar/tray/sni_watcher.h b/include/swaybar/tray/sni_watcher.h new file mode 100644 index 00000000..25ddfcd2 --- /dev/null +++ b/include/swaybar/tray/sni_watcher.h @@ -0,0 +1,10 @@ +#ifndef _SWAYBAR_SNI_WATCHER_H +#define _SWAYBAR_SNI_WATCHER_H + +/** + * Starts the sni_watcher, the watcher is practically a black box and should + * only be accessed though functions described in its spec + */ +int init_sni_watcher(); + +#endif /* _SWAYBAR_SNI_WATCHER_H */ diff --git a/include/swaybar/tray/tray.h b/include/swaybar/tray/tray.h new file mode 100644 index 00000000..7d371008 --- /dev/null +++ b/include/swaybar/tray/tray.h @@ -0,0 +1,26 @@ +#ifndef _SWAYBAR_TRAY_H +#define _SWAYBAR_TRAY_H + +#include +#include +#include "swaybar/tray/dbus.h" +#include "swaybar/tray/sni.h" +#include "list.h" + +extern struct tray *tray; + +struct tray { + list_t *items; +}; + +/** + * Initializes the tray host with D-Bus + */ +int init_tray(); + +/** + * Returns an item if `x` and `y` collide with it and NULL otherwise + */ +struct StatusNotifierItem *collides_with_sni(int x, int y); + +#endif /* _SWAYBAR_TRAY_H */ -- cgit v1.2.3-54-g00ecf From 1451ee8fd13dd35227d11e393c80871c70ad90f0 Mon Sep 17 00:00:00 2001 From: Calvin Lee Date: Wed, 7 Jun 2017 21:32:48 -0700 Subject: Reorganize Tray Code Remove tray code from bar.c and render.c --- include/swaybar/bar.h | 3 + include/swaybar/tray/tray.h | 14 +++-- swaybar/bar.c | 60 +++----------------- swaybar/render.c | 67 +--------------------- swaybar/tray/tray.c | 131 +++++++++++++++++++++++++++++++++++++++++++- 5 files changed, 152 insertions(+), 123 deletions(-) (limited to 'include') diff --git a/include/swaybar/bar.h b/include/swaybar/bar.h index 010e1f84..9f5bf400 100644 --- a/include/swaybar/bar.h +++ b/include/swaybar/bar.h @@ -15,6 +15,9 @@ struct bar { int ipc_socketfd; int status_read_fd; pid_t status_command_pid; +#ifdef ENABLE_TRAY + pid_t xembed_pid; +#endif }; struct output { diff --git a/include/swaybar/tray/tray.h b/include/swaybar/tray/tray.h index 7d371008..b718e555 100644 --- a/include/swaybar/tray/tray.h +++ b/include/swaybar/tray/tray.h @@ -5,6 +5,7 @@ #include #include "swaybar/tray/dbus.h" #include "swaybar/tray/sni.h" +#include "swaybar/bar.h" #include "list.h" extern struct tray *tray; @@ -14,13 +15,18 @@ struct tray { }; /** - * Initializes the tray host with D-Bus + * Processes a mouse event on the bar */ -int init_tray(); +void tray_mouse_event(struct output *output, int x, int y, + uint32_t button, uint32_t state); + +uint32_t tray_render(struct output *output, struct config *config); + +void tray_upkeep(struct bar *bar); /** - * Returns an item if `x` and `y` collide with it and NULL otherwise + * Initializes the tray with D-Bus */ -struct StatusNotifierItem *collides_with_sni(int x, int y); +void init_tray(); #endif /* _SWAYBAR_TRAY_H */ diff --git a/swaybar/bar.c b/swaybar/bar.c index cdaf6a37..5d480b63 100644 --- a/swaybar/bar.c +++ b/swaybar/bar.c @@ -27,6 +27,9 @@ static void bar_init(struct bar *bar) { bar->config = init_config(); bar->status = init_status_line(); bar->outputs = create_list(); +#ifdef ENABLE_TRAY + bar->xembed_pid = 0; +#endif } static void spawn_status_cmd_proc(struct bar *bar) { @@ -57,24 +60,6 @@ static void spawn_status_cmd_proc(struct bar *bar) { } } -#ifdef ENABLE_TRAY -static void spawn_xembed_sni_proxy() { - pid_t pid = fork(); - if (pid == 0) { - int wstatus; - do { - pid = fork(); - if (pid == 0) { - execlp("xembedsniproxy", "xembedsniproxy", NULL); - _exit(EXIT_FAILURE); - } - waitpid(pid, &wstatus, 0); - } while (!WIFEXITED(wstatus)); - _exit(EXIT_FAILURE); - } -} -#endif - struct output *new_output(const char *name) { struct output *output = malloc(sizeof(struct output)); output->name = strdup(name); @@ -122,27 +107,7 @@ static void mouse_button_notify(struct window *window, int x, int y, } #ifdef ENABLE_TRAY - uint32_t tray_padding = swaybar.config->tray_padding; - int tray_width = window->width * window->scale; - - for (int i = 0; i < clicked_output->items->length; ++i) { - struct sni_icon_ref *item = - clicked_output->items->items[i]; - int icon_width = cairo_image_surface_get_width(item->icon); - - tray_width -= tray_padding; - if (x <= tray_width && x >= tray_width - icon_width) { - if (button == swaybar.config->activate_button) { - sni_activate(item->ref, x, y); - } else if (button == swaybar.config->context_button) { - sni_context_menu(item->ref, x, y); - } else if (button == swaybar.config->secondary_button) { - sni_secondary(item->ref, x, y); - } - break; - } - tray_width -= icon_width; - } + tray_mouse_event(clicked_output, x, y, button, state_w); #endif } @@ -235,20 +200,7 @@ void bar_setup(struct bar *bar, const char *socket_path, const char *bar_id) { spawn_status_cmd_proc(bar); #ifdef ENABLE_TRAY - // We should have at least one output to serve the tray to - if (!swaybar.config->tray_output || strcmp(swaybar.config->tray_output, "none") != 0) { - /* Connect to the D-Bus */ - dbus_init(); - - /* Start the SNI watcher */ - init_sni_watcher(); - - /* Start the SNI host */ - init_tray(); - - /* Start xembedsniproxy */ - spawn_xembed_sni_proxy(); - } + init_tray(bar); #endif } @@ -300,6 +252,8 @@ void bar_run(struct bar *bar) { event_loop_poll(); #ifdef ENABLE_TRAY + tray_upkeep(bar); + dispatch_dbus(); #endif } diff --git a/swaybar/render.c b/swaybar/render.c index d02ecbbb..6ec47e79 100644 --- a/swaybar/render.c +++ b/swaybar/render.c @@ -302,72 +302,9 @@ void render(struct output *output, struct config *config, struct status_line *li cairo_paint(cairo); #ifdef ENABLE_TRAY - // Tray icons - uint32_t tray_padding = config->tray_padding; - unsigned int tray_width = window->width * window->scale; - const int item_size = (window->height * window->scale) - (2 * tray_padding); - - if (item_size < 0) { - // Can't render items if the padding is too large - goto no_tray; - } - - if (config->tray_output && strcmp(config->tray_output, output->name) != 0) { - goto no_tray; - } - - for (int i = 0; i < tray->items->length; ++i) { - struct StatusNotifierItem *item = - tray->items->items[i]; - if (!item->image) { - continue; - } - - struct sni_icon_ref *render_item = NULL; - int j; - for (j = i; j < output->items->length; ++j) { - struct sni_icon_ref *ref = - output->items->items[j]; - if (ref->ref == item) { - render_item = ref; - break; - } else { - sni_icon_ref_free(ref); - list_del(output->items, j); - } - } - - if (!render_item) { - render_item = sni_icon_ref_create(item, item_size); - list_add(output->items, render_item); - } else if (item->dirty) { - // item needs re-render - sni_icon_ref_free(render_item); - output->items->items[j] = render_item = - sni_icon_ref_create(item, item_size); - } - - tray_width -= tray_padding; - tray_width -= item_size; - - cairo_operator_t op = cairo_get_operator(cairo); - cairo_set_operator(cairo, CAIRO_OPERATOR_OVER); - cairo_set_source_surface(cairo, render_item->icon, tray_width, tray_padding); - cairo_rectangle(cairo, tray_width, tray_padding, item_size, item_size); - cairo_fill(cairo); - cairo_set_operator(cairo, op); - - item->dirty = false; - } - - - if (tray_width != window->width * window->scale) { - tray_width -= tray_padding; - } - -no_tray: + uint32_t tray_width = tray_render(output, config); #else - const int tray_width = window->width * window->scale; + const uint32_t tray_width = window->width * window->scale; #endif // Command output diff --git a/swaybar/tray/tray.c b/swaybar/tray/tray.c index 9a709fe4..ca8b1341 100644 --- a/swaybar/tray/tray.c +++ b/swaybar/tray/tray.c @@ -2,12 +2,15 @@ #include #include #include +#include #include #include "swaybar/bar.h" #include "swaybar/tray/tray.h" #include "swaybar/tray/dbus.h" #include "swaybar/tray/sni.h" +#include "swaybar/tray/sni_watcher.h" #include "swaybar/bar.h" +#include "swaybar/config.h" #include "list.h" #include "log.h" @@ -184,7 +187,7 @@ static DBusHandlerResult signal_handler(DBusConnection *connection, return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } -int init_tray() { +static int init_host() { tray = (struct tray *)malloc(sizeof(tray)); tray->items = create_list(); @@ -277,3 +280,129 @@ err: free(name); return -1; } + +void tray_mouse_event(struct output *output, int x, int y, + uint32_t button, uint32_t state) { + + struct window *window = output->window; + uint32_t tray_padding = swaybar.config->tray_padding; + int tray_width = window->width * window->scale; + + for (int i = 0; i < output->items->length; ++i) { + struct sni_icon_ref *item = + output->items->items[i]; + int icon_width = cairo_image_surface_get_width(item->icon); + + tray_width -= tray_padding; + if (x <= tray_width && x >= tray_width - icon_width) { + if (button == swaybar.config->activate_button) { + sni_activate(item->ref, x, y); + } else if (button == swaybar.config->context_button) { + sni_context_menu(item->ref, x, y); + } else if (button == swaybar.config->secondary_button) { + sni_secondary(item->ref, x, y); + } + break; + } + tray_width -= icon_width; + } +} + +uint32_t tray_render(struct output *output, struct config *config) { + struct window *window = output->window; + cairo_t *cairo = window->cairo; + + // Tray icons + uint32_t tray_padding = config->tray_padding; + uint32_t tray_width = window->width * window->scale; + const int item_size = (window->height * window->scale) - (2 * tray_padding); + + if (item_size < 0) { + // Can't render items if the padding is too large + return tray_width; + } + + if (config->tray_output && strcmp(config->tray_output, output->name) != 0) { + return tray_width; + } + + for (int i = 0; i < tray->items->length; ++i) { + struct StatusNotifierItem *item = + tray->items->items[i]; + if (!item->image) { + continue; + } + + struct sni_icon_ref *render_item = NULL; + int j; + for (j = i; j < output->items->length; ++j) { + struct sni_icon_ref *ref = + output->items->items[j]; + if (ref->ref == item) { + render_item = ref; + break; + } else { + sni_icon_ref_free(ref); + list_del(output->items, j); + } + } + + if (!render_item) { + render_item = sni_icon_ref_create(item, item_size); + list_add(output->items, render_item); + } else if (item->dirty) { + // item needs re-render + sni_icon_ref_free(render_item); + output->items->items[j] = render_item = + sni_icon_ref_create(item, item_size); + } + + tray_width -= tray_padding; + tray_width -= item_size; + + cairo_operator_t op = cairo_get_operator(cairo); + cairo_set_operator(cairo, CAIRO_OPERATOR_OVER); + cairo_set_source_surface(cairo, render_item->icon, tray_width, tray_padding); + cairo_rectangle(cairo, tray_width, tray_padding, item_size, item_size); + cairo_fill(cairo); + cairo_set_operator(cairo, op); + + item->dirty = false; + } + + + if (tray_width != window->width * window->scale) { + tray_width -= tray_padding; + } + + return tray_width; +} + +void tray_upkeep(struct bar *bar) { + if (!bar->xembed_pid || + (bar->xembed_pid == waitpid(bar->xembed_pid, NULL, WNOHANG))) { + pid_t pid = fork(); + if (pid == 0) { + execlp("xembedsniproxy", "xembedsniproxy", NULL); + _exit(EXIT_FAILURE); + } else { + bar->xembed_pid = pid; + } + } +} + +void init_tray(struct bar *bar) { + if (!bar->config->tray_output || strcmp(bar->config->tray_output, "none") != 0) { + /* Connect to the D-Bus */ + dbus_init(); + + /* Start the SNI watcher */ + init_sni_watcher(); + + /* Start the SNI host */ + init_host(); + + /* Start xembedsniproxy */ + tray_upkeep(bar); + } +} -- cgit v1.2.3-54-g00ecf From 33fdae2001f489c40667797ce3bc50eedb352ee0 Mon Sep 17 00:00:00 2001 From: Calvin Lee Date: Tue, 13 Jun 2017 12:42:11 -0700 Subject: Remove Xembed Support Xembed support is premature in sway and should be postponed. This commit only removes swaybar starting xembedsniproxy, if users would like, they can still start xembedsniproxy manually, however there will be no official support. --- include/swaybar/bar.h | 3 --- swaybar/bar.c | 5 ----- swaybar/tray/tray.c | 16 ---------------- 3 files changed, 24 deletions(-) (limited to 'include') diff --git a/include/swaybar/bar.h b/include/swaybar/bar.h index 9f5bf400..010e1f84 100644 --- a/include/swaybar/bar.h +++ b/include/swaybar/bar.h @@ -15,9 +15,6 @@ struct bar { int ipc_socketfd; int status_read_fd; pid_t status_command_pid; -#ifdef ENABLE_TRAY - pid_t xembed_pid; -#endif }; struct output { diff --git a/swaybar/bar.c b/swaybar/bar.c index 5d480b63..5e87eac9 100644 --- a/swaybar/bar.c +++ b/swaybar/bar.c @@ -27,9 +27,6 @@ static void bar_init(struct bar *bar) { bar->config = init_config(); bar->status = init_status_line(); bar->outputs = create_list(); -#ifdef ENABLE_TRAY - bar->xembed_pid = 0; -#endif } static void spawn_status_cmd_proc(struct bar *bar) { @@ -252,8 +249,6 @@ void bar_run(struct bar *bar) { event_loop_poll(); #ifdef ENABLE_TRAY - tray_upkeep(bar); - dispatch_dbus(); #endif } diff --git a/swaybar/tray/tray.c b/swaybar/tray/tray.c index b2fa647e..00f1a44f 100644 --- a/swaybar/tray/tray.c +++ b/swaybar/tray/tray.c @@ -379,19 +379,6 @@ uint32_t tray_render(struct output *output, struct config *config) { return tray_width; } -void tray_upkeep(struct bar *bar) { - if (!bar->xembed_pid || - (bar->xembed_pid == waitpid(bar->xembed_pid, NULL, WNOHANG))) { - pid_t pid = fork(); - if (pid == 0) { - execlp("xembedsniproxy", "xembedsniproxy", NULL); - _exit(EXIT_FAILURE); - } else { - bar->xembed_pid = pid; - } - } -} - void init_tray(struct bar *bar) { if (!bar->config->tray_output || strcmp(bar->config->tray_output, "none") != 0) { /* Connect to the D-Bus */ @@ -402,8 +389,5 @@ void init_tray(struct bar *bar) { /* Start the SNI host */ init_host(); - - /* Start xembedsniproxy */ - tray_upkeep(bar); } } -- cgit v1.2.3-54-g00ecf