aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Mikkel Oscar Lyderik <mikkeloscar@gmail.com>2016-04-24 01:47:57 +0200
committerLibravatar Mikkel Oscar Lyderik <mikkeloscar@gmail.com>2016-04-25 00:00:49 +0200
commit6c7ed7e7cb1f25429db05103b98e6fcee11d0362 (patch)
tree1e17e7ff8c2957ee96a22751533e71da4a6e9790
parentDisable inner gaps when in tabbed/stacked mode (diff)
downloadsway-6c7ed7e7cb1f25429db05103b98e6fcee11d0362.tar.gz
sway-6c7ed7e7cb1f25429db05103b98e6fcee11d0362.tar.zst
sway-6c7ed7e7cb1f25429db05103b98e6fcee11d0362.zip
Add title to nested tabbed/stacked containers
-rw-r--r--sway/border.c66
-rw-r--r--sway/commands.c12
2 files changed, 78 insertions, 0 deletions
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) {
203 } 203 }
204} 204}
205 205
206/**
207 * Generate nested container title for tabbed/stacked layouts
208 */
209static char *generate_container_title(swayc_t *container) {
210 char layout = 'H';
211 char *name, *prev_name = NULL;
212 switch (container->layout) {
213 case L_TABBED:
214 layout = 'T';
215 break;
216 case L_STACKED:
217 layout = 'S';
218 break;
219 case L_VERT:
220 layout = 'V';
221 break;
222 default:
223 layout = 'H';
224 }
225 int len = 9;
226 name = malloc(len * sizeof(char));
227 snprintf(name, len, "sway: %c[", layout);
228
229 int i;
230 for (i = 0; i < container->children->length; ++i) {
231 prev_name = name;
232 swayc_t* child = container->children->items[i];
233 const char *title = child->name;
234 if (child->type == C_CONTAINER) {
235 title = generate_container_title(child);
236 }
237
238 len = strlen(name) + strlen(title) + 1;
239 if (i < container->children->length-1) {
240 len++;
241 }
242
243 name = malloc(len * sizeof(char));
244 if (i < container->children->length-1) {
245 snprintf(name, len, "%s%s ", prev_name, title);
246 } else {
247 snprintf(name, len, "%s%s", prev_name, title);
248 }
249 free(prev_name);
250 }
251
252 prev_name = name;
253 len = strlen(name) + 2;
254 name = malloc(len * sizeof(char));
255 snprintf(name, len, "%s]", prev_name);
256 free(prev_name);
257 free(container->name);
258 container->name = name;
259 return container->name + 6; // don't include "sway: "
260}
261
206void update_tabbed_stacked_titlebars(swayc_t *c, cairo_t *cr, struct wlc_geometry *g, swayc_t *focused, swayc_t *focused_inactive) { 262void update_tabbed_stacked_titlebars(swayc_t *c, cairo_t *cr, struct wlc_geometry *g, swayc_t *focused, swayc_t *focused_inactive) {
207 if (c->type == C_CONTAINER) { 263 if (c->type == C_CONTAINER) {
208 if (c->parent->focused == c) { 264 if (c->parent->focused == c) {
@@ -277,6 +333,16 @@ void update_view_border(swayc_t *view) {
277 } else { 333 } else {
278 render_borders(view, cr, &config->border_colors.focused_inactive, false); 334 render_borders(view, cr, &config->border_colors.focused_inactive, false);
279 } 335 }
336
337 // generate container titles
338 int i;
339 for (i = 0; i < p->children->length; ++i) {
340 swayc_t *child = p->children->items[i];
341 if (child->type == C_CONTAINER) {
342 generate_container_title(child);
343 }
344 }
345
280 update_tabbed_stacked_titlebars(p, cr, &g, focused, focused_inactive); 346 update_tabbed_stacked_titlebars(p, cr, &g, focused, focused_inactive);
281 } else { 347 } else {
282 switch (view->border_type) { 348 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 @@
1#include <xkbcommon/xkbcommon.h> 1#include <xkbcommon/xkbcommon.h>
2#include <xkbcommon/xkbcommon-names.h> 2#include <xkbcommon/xkbcommon-names.h>
3#include <wlc/wlc.h> 3#include <wlc/wlc.h>
4#include <wlc/wlc-render.h>
4#include <stdio.h> 5#include <stdio.h>
5#include <stdlib.h> 6#include <stdlib.h>
6#include <errno.h> 7#include <errno.h>
@@ -2041,6 +2042,17 @@ static struct cmd_results *_do_split(int argc, char **argv, int layout) {
2041 set_focused_container(focused); 2042 set_focused_container(focused);
2042 arrange_windows(parent, -1, -1); 2043 arrange_windows(parent, -1, -1);
2043 } 2044 }
2045
2046 // update container title if tabbed/stacked
2047 if (swayc_tabbed_stacked_parent(focused)) {
2048 update_view_border(focused);
2049 swayc_t *output = swayc_parent_by_type(focused, C_OUTPUT);
2050 // schedule render to make changes take effect right away,
2051 // otherwise we would have to wait for the view to render,
2052 // which is unpredictable.
2053 wlc_output_schedule_render(output->handle);
2054 }
2055
2044 return cmd_results_new(CMD_SUCCESS, NULL, NULL); 2056 return cmd_results_new(CMD_SUCCESS, NULL, NULL);
2045} 2057}
2046 2058