aboutsummaryrefslogtreecommitdiff
path: root/swaybar
diff options
context:
space:
mode:
Diffstat (limited to 'swaybar')
-rw-r--r--swaybar/bar.c42
-rw-r--r--swaybar/ipc.c2
-rw-r--r--swaybar/render.c2
3 files changed, 39 insertions, 7 deletions
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);