From 6c7ed7e7cb1f25429db05103b98e6fcee11d0362 Mon Sep 17 00:00:00 2001
From: Mikkel Oscar Lyderik <mikkeloscar@gmail.com>
Date: Sun, 24 Apr 2016 01:47:57 +0200
Subject: Add title to nested tabbed/stacked containers

---
 sway/border.c   | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 sway/commands.c | 12 +++++++++++
 2 files changed, 78 insertions(+)

(limited to 'sway')

diff --git a/sway/border.c b/sway/border.c
index cc329b6a..cec443f4 100644
--- a/sway/border.c
+++ b/sway/border.c
@@ -203,6 +203,62 @@ void map_update_view_border(swayc_t *view, void *data) {
 	}
 }
 
+/**
+ * Generate nested container title for tabbed/stacked layouts
+ */
+static char *generate_container_title(swayc_t *container) {
+	char layout = 'H';
+	char *name, *prev_name = NULL;
+	switch (container->layout) {
+	case L_TABBED:
+		layout = 'T';
+		break;
+	case L_STACKED:
+		layout = 'S';
+		break;
+	case L_VERT:
+		layout = 'V';
+		break;
+	default:
+		layout = 'H';
+	}
+	int len = 9;
+	name = malloc(len * sizeof(char));
+	snprintf(name, len, "sway: %c[", layout);
+
+	int i;
+	for (i = 0; i < container->children->length; ++i) {
+		prev_name = name;
+		swayc_t* child = container->children->items[i];
+		const char *title = child->name;
+		if (child->type == C_CONTAINER) {
+			title = generate_container_title(child);
+		}
+
+		len = strlen(name) + strlen(title) + 1;
+		if (i < container->children->length-1) {
+			len++;
+		}
+
+		name = malloc(len * sizeof(char));
+		if (i < container->children->length-1) {
+			snprintf(name, len, "%s%s ", prev_name, title);
+		} else {
+			snprintf(name, len, "%s%s", prev_name, title);
+		}
+		free(prev_name);
+	}
+
+	prev_name = name;
+	len = strlen(name) + 2;
+	name = malloc(len * sizeof(char));
+	snprintf(name, len, "%s]", prev_name);
+	free(prev_name);
+	free(container->name);
+	container->name = name;
+	return container->name + 6; // don't include "sway: "
+}
+
 void update_tabbed_stacked_titlebars(swayc_t *c, cairo_t *cr, struct wlc_geometry *g, swayc_t *focused, swayc_t *focused_inactive) {
 	if (c->type == C_CONTAINER) {
 		if (c->parent->focused == c) {
@@ -277,6 +333,16 @@ void update_view_border(swayc_t *view) {
 		} else {
 			render_borders(view, cr, &config->border_colors.focused_inactive, false);
 		}
+
+		// generate container titles
+		int i;
+		for (i = 0; i < p->children->length; ++i) {
+			swayc_t *child = p->children->items[i];
+			if (child->type == C_CONTAINER) {
+				generate_container_title(child);
+			}
+		}
+
 		update_tabbed_stacked_titlebars(p, cr, &g, focused, focused_inactive);
 	} else {
 		switch (view->border_type) {
diff --git a/sway/commands.c b/sway/commands.c
index ff1ddc5b..34364917 100644
--- a/sway/commands.c
+++ b/sway/commands.c
@@ -1,6 +1,7 @@
 #include <xkbcommon/xkbcommon.h>
 #include <xkbcommon/xkbcommon-names.h>
 #include <wlc/wlc.h>
+#include <wlc/wlc-render.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <errno.h>
@@ -2041,6 +2042,17 @@ static struct cmd_results *_do_split(int argc, char **argv, int layout) {
 		set_focused_container(focused);
 		arrange_windows(parent, -1, -1);
 	}
+
+	// update container title if tabbed/stacked
+	if (swayc_tabbed_stacked_parent(focused)) {
+		update_view_border(focused);
+		swayc_t *output = swayc_parent_by_type(focused, C_OUTPUT);
+		// schedule render to make changes take effect right away,
+		// otherwise we would have to wait for the view to render,
+		// which is unpredictable.
+		wlc_output_schedule_render(output->handle);
+	}
+
 	return cmd_results_new(CMD_SUCCESS, NULL, NULL);
 }
 
-- 
cgit v1.2.3