aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDrew DeVault <sir@cmpwn.com>2018-04-05 16:09:41 -0400
committerGitHub <noreply@github.com>2018-04-05 16:09:41 -0400
commit268c68b41707a664e5059699c720f000f20e2276 (patch)
tree523748eb922a50f9e74a485b86f445f8bc759464
parent842a3ea45c07ab5ed8e3c20af5ef0dc92fff22de (diff)
parentf242362e7e521a8f35f47572038a20d404d25327 (diff)
Merge pull request #1745 from swaywm/swaybar-hotplugging
Handle output removal on swaybar
-rw-r--r--client/pool-buffer.c2
-rw-r--r--include/pool-buffer.h1
-rw-r--r--include/swaybar/bar.h1
-rw-r--r--sway/tree/container.c4
-rw-r--r--swaybar/bar.c42
-rw-r--r--swaybar/ipc.c2
-rw-r--r--swaybar/render.c2
7 files changed, 45 insertions, 9 deletions
diff --git a/client/pool-buffer.c b/client/pool-buffer.c
index b5ed9c98..1f54a77c 100644
--- a/client/pool-buffer.c
+++ b/client/pool-buffer.c
@@ -79,7 +79,7 @@ static struct pool_buffer *create_buffer(struct wl_shm *shm,
return buf;
}
-static void destroy_buffer(struct pool_buffer *buffer) {
+void destroy_buffer(struct pool_buffer *buffer) {
if (buffer->buffer) {
wl_buffer_destroy(buffer->buffer);
}
diff --git a/include/pool-buffer.h b/include/pool-buffer.h
index cdebd64d..856f7c8c 100644
--- a/include/pool-buffer.h
+++ b/include/pool-buffer.h
@@ -17,5 +17,6 @@ struct pool_buffer {
struct pool_buffer *get_next_buffer(struct wl_shm *shm,
struct pool_buffer pool[static 2], uint32_t width, uint32_t height);
+void destroy_buffer(struct pool_buffer *buffer);
#endif
diff --git a/include/swaybar/bar.h b/include/swaybar/bar.h
index 503b961c..0037190b 100644
--- a/include/swaybar/bar.h
+++ b/include/swaybar/bar.h
@@ -49,6 +49,7 @@ struct swaybar_output {
struct wl_output *output;
struct wl_surface *surface;
struct zwlr_layer_surface_v1 *layer_surface;
+ uint32_t wl_name;
struct wl_list workspaces;
struct wl_list hotspots;
diff --git a/sway/tree/container.c b/sway/tree/container.c
index 8fc9e3e8..3e8c1c75 100644
--- a/sway/tree/container.c
+++ b/sway/tree/container.c
@@ -64,7 +64,9 @@ static void container_close_notify(struct sway_container *container) {
return;
}
// TODO send ipc event type based on the container type
- ipc_event_window(container, "close");
+ if (container->type == C_VIEW || container->type == C_WORKSPACE) {
+ ipc_event_window(container, "close");
+ }
}
struct sway_container *container_create(enum sway_container_type type) {
diff --git a/swaybar/bar.c b/swaybar/bar.c
index ea0141cc..f1a701b9 100644
--- a/swaybar/bar.c
+++ b/swaybar/bar.c
@@ -34,6 +34,34 @@ static void bar_init(struct swaybar *bar) {
wl_list_init(&bar->outputs);
}
+static void swaybar_output_free(struct swaybar_output *output) {
+ if (!output) {
+ return;
+ }
+ wlr_log(L_DEBUG, "Removing output %s", output->name);
+ zwlr_layer_surface_v1_destroy(output->layer_surface);
+ wl_surface_destroy(output->surface);
+ wl_output_destroy(output->output);
+ destroy_buffer(&output->buffers[0]);
+ destroy_buffer(&output->buffers[1]);
+ struct swaybar_workspace *ws, *ws_tmp;
+ wl_list_for_each_safe(ws, ws_tmp, &output->workspaces, link) {
+ wl_list_remove(&ws->link);
+ free(ws->name);
+ free(ws);
+ }
+ struct swaybar_hotspot *hotspot, *hotspot_tmp;
+ wl_list_for_each_safe(hotspot, hotspot_tmp, &output->hotspots, link) {
+ if (hotspot->destroy) {
+ hotspot->destroy(hotspot->data);
+ }
+ free(hotspot);
+ }
+ wl_list_remove(&output->link);
+ free(output->name);
+ free(output);
+}
+
static void layer_surface_configure(void *data,
struct zwlr_layer_surface_v1 *surface,
uint32_t serial, uint32_t width, uint32_t height) {
@@ -46,10 +74,8 @@ static void layer_surface_configure(void *data,
static void layer_surface_closed(void *_output,
struct zwlr_layer_surface_v1 *surface) {
- // TODO: Deal with hotplugging
struct swaybar_output *output = _output;
- zwlr_layer_surface_v1_destroy(output->layer_surface);
- wl_surface_destroy(output->surface);
+ swaybar_output_free(output);
}
struct zwlr_layer_surface_v1_listener layer_surface_listener = {
@@ -261,6 +287,7 @@ static void handle_global(void *data, struct wl_registry *registry,
wl_output_add_listener(output->output, &output_listener, output);
output->scale = 1;
output->index = index++;
+ output->wl_name = name;
wl_list_init(&output->workspaces);
wl_list_init(&output->hotspots);
wl_list_insert(&bar->outputs, &output->link);
@@ -272,7 +299,14 @@ static void handle_global(void *data, struct wl_registry *registry,
static void handle_global_remove(void *data, struct wl_registry *registry,
uint32_t name) {
- // who cares
+ struct swaybar *bar = data;
+ struct swaybar_output *output, *tmp;
+ wl_list_for_each_safe(output, tmp, &bar->outputs, link) {
+ if (output->wl_name == name) {
+ swaybar_output_free(output);
+ break;
+ }
+ }
}
static const struct wl_registry_listener registry_listener = {
diff --git a/swaybar/ipc.c b/swaybar/ipc.c
index ed5d9a31..92dbb8ea 100644
--- a/swaybar/ipc.c
+++ b/swaybar/ipc.c
@@ -367,5 +367,5 @@ bool handle_ipc_readable(struct swaybar *bar) {
return false;
}
free_ipc_response(resp);
- return true;
+ return false;
}
diff --git a/swaybar/render.c b/swaybar/render.c
index be58301d..53e578f0 100644
--- a/swaybar/render.c
+++ b/swaybar/render.c
@@ -421,8 +421,6 @@ static uint32_t render_workspace_button(cairo_t *cairo,
static uint32_t render_to_cairo(cairo_t *cairo,
struct swaybar *bar, struct swaybar_output *output) {
struct swaybar_config *config = bar->config;
- wlr_log(L_DEBUG, "output %p", output);
-
cairo_set_operator(cairo, CAIRO_OPERATOR_SOURCE);
if (output->focused) {
cairo_set_source_u32(cairo, config->colors.focused_background);