From 4bd46fb079fb5a32ee6eb2b297de273b261a9c71 Mon Sep 17 00:00:00 2001
From: Connor E <38229097+c-edw@users.noreply.github.com>
Date: Sat, 17 Nov 2018 16:11:28 +0000
Subject: Implement strip_workspace_name.

---
 swaybar/bar.c    |  1 +
 swaybar/config.c |  1 +
 swaybar/ipc.c    | 29 ++++++++++++++++++++++++++---
 swaybar/render.c | 22 ++--------------------
 4 files changed, 30 insertions(+), 23 deletions(-)

(limited to 'swaybar')

diff --git a/swaybar/bar.c b/swaybar/bar.c
index 08c386a7..2178f542 100644
--- a/swaybar/bar.c
+++ b/swaybar/bar.c
@@ -31,6 +31,7 @@ void free_workspaces(struct wl_list *list) {
 	wl_list_for_each_safe(ws, tmp, list, link) {
 		wl_list_remove(&ws->link);
 		free(ws->name);
+		free(ws->label);
 		free(ws);
 	}
 }
diff --git a/swaybar/config.c b/swaybar/config.c
index 1293cdae..98d94168 100644
--- a/swaybar/config.c
+++ b/swaybar/config.c
@@ -30,6 +30,7 @@ struct swaybar_config *init_config(void) {
 	config->hidden_state = strdup("hide");
 	config->sep_symbol = NULL;
 	config->strip_workspace_numbers = false;
+	config->strip_workspace_name = false;
 	config->binding_mode_indicator = true;
 	config->wrap_scroll = false;
 	config->workspace_buttons = true;
diff --git a/swaybar/ipc.c b/swaybar/ipc.c
index 706f968d..db4360c1 100644
--- a/swaybar/ipc.c
+++ b/swaybar/ipc.c
@@ -153,9 +153,10 @@ static bool ipc_parse_config(
 		return false;
 	}
 	json_object *markup, *mode, *hidden_state, *position, *status_command;
-	json_object *font, *bar_height, *wrap_scroll, *workspace_buttons, *strip_workspace_numbers;
-	json_object *binding_mode_indicator, *verbose, *colors, *sep_symbol, *outputs;
-	json_object *bindings;
+	json_object *font, *bar_height, *wrap_scroll, *workspace_buttons;
+	json_object *strip_workspace_numbers, *strip_workspace_name;
+	json_object *binding_mode_indicator, *verbose, *colors, *sep_symbol;
+	json_object *outputs, *bindings;
 	json_object_object_get_ex(bar_config, "mode", &mode);
 	json_object_object_get_ex(bar_config, "hidden_state", &hidden_state);
 	json_object_object_get_ex(bar_config, "position", &position);
@@ -165,6 +166,7 @@ static bool ipc_parse_config(
 	json_object_object_get_ex(bar_config, "wrap_scroll", &wrap_scroll);
 	json_object_object_get_ex(bar_config, "workspace_buttons", &workspace_buttons);
 	json_object_object_get_ex(bar_config, "strip_workspace_numbers", &strip_workspace_numbers);
+	json_object_object_get_ex(bar_config, "strip_workspace_name", &strip_workspace_name);
 	json_object_object_get_ex(bar_config, "binding_mode_indicator", &binding_mode_indicator);
 	json_object_object_get_ex(bar_config, "verbose", &verbose);
 	json_object_object_get_ex(bar_config, "separator_symbol", &sep_symbol);
@@ -190,6 +192,9 @@ static bool ipc_parse_config(
 	if (strip_workspace_numbers) {
 		config->strip_workspace_numbers = json_object_get_boolean(strip_workspace_numbers);
 	}
+	if (strip_workspace_name) {
+		config->strip_workspace_name = json_object_get_boolean(strip_workspace_name);
+	}
 	if (binding_mode_indicator) {
 		config->binding_mode_indicator = json_object_get_boolean(binding_mode_indicator);
 	}
@@ -298,6 +303,24 @@ bool ipc_get_workspaces(struct swaybar *bar) {
 					calloc(1, sizeof(struct swaybar_workspace));
 				ws->num = json_object_get_int(num);
 				ws->name = strdup(json_object_get_string(name));
+				ws->label = strdup(ws->name);
+				// ws->num will be -1 if workspace name doesn't begin with int.
+				if (ws->num != -1) {
+					size_t len_offset = numlen(ws->num);
+					if (bar->config->strip_workspace_name) {
+						free(ws->label);
+						ws->label = malloc(len_offset + 1 * sizeof(char));
+						ws->label[len_offset] = '\0';
+						strncpy(ws->label, ws->name, len_offset);
+					} else if (bar->config->strip_workspace_numbers) {
+						len_offset += ws->label[len_offset] == ':';
+						if (strlen(ws->name) > len_offset) {
+							free(ws->label);
+							// Strip number prefix [1-?:] using len_offset.
+							ws->label = strdup(ws->name + len_offset);
+						}
+					}
+				}
 				ws->visible = json_object_get_boolean(visible);
 				ws->focused = json_object_get_boolean(focused);
 				if (ws->focused) {
diff --git a/swaybar/render.c b/swaybar/render.c
index 4ebf922e..8269a840 100644
--- a/swaybar/render.c
+++ b/swaybar/render.c
@@ -342,19 +342,6 @@ static uint32_t render_binding_mode_indicator(cairo_t *cairo,
 	return output->height;
 }
 
-static const char *strip_workspace_number(const char *ws_name) {
-	size_t len = strlen(ws_name);
-	for (size_t i = 0; i < len; ++i) {
-		if (ws_name[i] < '0' || ws_name[i] > '9') {
-			if (':' == ws_name[i] && i < len - 1 && i > 0) {
-				return ws_name + i + 1;
-			}
-			return ws_name;
-		}
-	}
-	return ws_name;
-}
-
 static enum hotspot_event_handling workspace_hotspot_callback(struct swaybar_output *output,
 			int x, int y, enum x11_button button, void *data) {
 	if (button != LEFT) {
@@ -368,11 +355,6 @@ static uint32_t render_workspace_button(cairo_t *cairo,
 		struct swaybar_output *output,
 		struct swaybar_workspace *ws, double *x) {
 	struct swaybar_config *config = output->bar->config;
-	const char *name = ws->name;
-	if (config->strip_workspace_numbers) {
-		name = strip_workspace_number(ws->name);
-	}
-
 	struct box_colors box_colors;
 	if (ws->urgent) {
 		box_colors = config->colors.urgent_workspace;
@@ -388,7 +370,7 @@ static uint32_t render_workspace_button(cairo_t *cairo,
 
 	int text_width, text_height;
 	get_text_size(cairo, config->font, &text_width, &text_height, NULL,
-			output->scale, config->pango_markup, "%s", name);
+			output->scale, config->pango_markup, "%s", ws->label);
 
 	int ws_vertical_padding = WS_VERTICAL_PADDING * output->scale;
 	int ws_horizontal_padding = WS_HORIZONTAL_PADDING * output->scale;
@@ -421,7 +403,7 @@ static uint32_t render_workspace_button(cairo_t *cairo,
 	cairo_set_source_u32(cairo, box_colors.text);
 	cairo_move_to(cairo, *x + width / 2 - text_width / 2, (int)floor(text_y));
 	pango_printf(cairo, config->font, output->scale, config->pango_markup,
-			"%s", name);
+			"%s", ws->label);
 
 	struct swaybar_hotspot *hotspot = calloc(1, sizeof(struct swaybar_hotspot));
 	hotspot->x = *x;
-- 
cgit v1.2.3