Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Hiding lone titlebar scenegraph #8076

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions include/sway/config.h
Expand Up @@ -564,6 +564,7 @@ struct sway_config {
enum edge_border_types hide_edge_borders;
enum edge_border_smart_types hide_edge_borders_smart;
bool hide_lone_tab;
bool hide_lone_title;

// border colors
struct {
Expand Down
9 changes: 8 additions & 1 deletion sway/commands/hide_edge_borders.c
Expand Up @@ -13,7 +13,13 @@ struct cmd_results *cmd_hide_edge_borders(int argc, char **argv) {
}

bool hide_lone_tab = false;
if (strcmp(*argv, "--i3") == 0) {
bool hide_lone_title = false;
if (strcmp(*argv, "--smart-titles") == 0) {
hide_lone_tab = true;
hide_lone_title = true;
++argv;
--argc;
} else if (strcmp(*argv, "--i3") == 0) {
hide_lone_tab = true;
++argv;
--argc;
Expand Down Expand Up @@ -41,6 +47,7 @@ struct cmd_results *cmd_hide_edge_borders(int argc, char **argv) {
return cmd_results_new(CMD_INVALID, "%s", expected_syntax);
}
config->hide_lone_tab = hide_lone_tab;
config->hide_lone_title = hide_lone_title;

arrange_root();

Expand Down
1 change: 1 addition & 0 deletions sway/config.c
Expand Up @@ -306,6 +306,7 @@ static void config_defaults(struct sway_config *config) {
config->hide_edge_borders = E_NONE;
config->hide_edge_borders_smart = ESMART_OFF;
config->hide_lone_tab = false;
config->hide_lone_title = false;

config->has_focused_tab_title = false;

Expand Down
34 changes: 17 additions & 17 deletions sway/desktop/transaction.c
Expand Up @@ -287,14 +287,13 @@ static void arrange_container(struct sway_container *con,

static void arrange_children(enum sway_container_layout layout, list_t *children,
struct sway_container *active, struct wlr_scene_tree *content,
int width, int height, int gaps) {
int width, int height, int gaps, bool parent_asks_for_title_bars) {
int title_bar_height = container_titlebar_height();

if (layout == L_TABBED) {
struct sway_container *first = children->length == 1 ?
((struct sway_container *)children->items[0]) : NULL;
if (config->hide_lone_tab && first && first->view &&
first->current.border != B_NORMAL) {
bool show_titlebar = parent_asks_for_title_bars || !config->hide_lone_tab ||
(children->length > 1);
if (!show_titlebar) {
title_bar_height = 0;
}

Expand All @@ -312,19 +311,17 @@ static void arrange_children(enum sway_container_layout layout, list_t *children
wlr_scene_node_reparent(&child->scene_tree->node, content);

if (activated) {
arrange_container(child, width, height - title_bar_height,
false, 0);
arrange_container(child, width, height - title_bar_height, false, 0);
} else {
disable_container(child);
}

title_offset = next_title_offset;
}
} else if (layout == L_STACKED) {
struct sway_container *first = children->length == 1 ?
((struct sway_container *)children->items[0]) : NULL;
if (config->hide_lone_tab && first && first->view &&
first->current.border != B_NORMAL) {
bool show_titlebar = parent_asks_for_title_bars || !config->hide_lone_tab ||
(children->length > 1);
if (!show_titlebar) {
title_bar_height = 0;
}

Expand All @@ -341,8 +338,7 @@ static void arrange_children(enum sway_container_layout layout, list_t *children
wlr_scene_node_reparent(&child->scene_tree->node, content);

if (activated) {
arrange_container(child, width, height - title_height,
false, 0);
arrange_container(child, width, height - title_height, false, 0);
} else {
disable_container(child);
}
Expand All @@ -351,26 +347,30 @@ static void arrange_children(enum sway_container_layout layout, list_t *children
}
} else if (layout == L_VERT) {
int off = 0;
bool show_titlebar = parent_asks_for_title_bars || !config->hide_lone_tab ||
(children->length > 1);
for (int i = 0; i < children->length; i++) {
struct sway_container *child = children->items[i];
int cheight = child->current.height;

wlr_scene_node_set_enabled(&child->border.tree->node, true);
wlr_scene_node_set_position(&child->scene_tree->node, 0, off);
wlr_scene_node_reparent(&child->scene_tree->node, content);
arrange_container(child, width, cheight, true, gaps);
arrange_container(child, width, cheight, show_titlebar, gaps);
off += cheight + gaps;
}
} else if (layout == L_HORIZ) {
int off = 0;
bool show_titlebar = parent_asks_for_title_bars || !config->hide_lone_tab ||
(children->length > 1);
for (int i = 0; i < children->length; i++) {
struct sway_container *child = children->items[i];
int cwidth = child->current.width;

wlr_scene_node_set_enabled(&child->border.tree->node, true);
wlr_scene_node_set_position(&child->scene_tree->node, off, 0);
wlr_scene_node_reparent(&child->scene_tree->node, content);
arrange_container(child, cwidth, height, true, gaps);
arrange_container(child, cwidth, height, show_titlebar, gaps);
off += cwidth + gaps;
}
} else {
Expand Down Expand Up @@ -452,7 +452,7 @@ static void arrange_container(struct sway_container *con,

arrange_children(con->current.layout, con->current.children,
con->current.focused_inactive_child, con->content_tree,
width, height, gaps);
width, height, gaps, title_bar);
}
}

Expand Down Expand Up @@ -532,7 +532,7 @@ static void arrange_workspace_tiling(struct sway_workspace *ws,
int width, int height) {
arrange_children(ws->current.layout, ws->current.tiling,
ws->current.focused_inactive_child, ws->layers.tiling,
width, height, ws->gaps_inner);
width, height, ws->gaps_inner, false);
}

static void disable_workspace(struct sway_workspace *ws) {
Expand Down
5 changes: 3 additions & 2 deletions sway/sway.5.scd
Expand Up @@ -747,10 +747,11 @@ The default colors are:
This affects new workspaces only, and is used when the workspace doesn't
have its own gaps settings (see: workspace <ws> gaps ...).

*hide_edge_borders* [--i3] none|vertical|horizontal|both|smart|smart_no_gaps
*hide_edge_borders* [--i3 | --smart-titles] none|vertical|horizontal|both|smart|smart_no_gaps
Hides window borders adjacent to the screen edges. Default is _none_. The
_--i3_ option enables i3-compatible behavior to hide the title bar on
tabbed and stacked containers with one child. The _smart_|_smart_no_gaps_
tabbed and stacked containers with one child. The --smart-titles option
hide the title bar on workspaces with only one child. The _smart_|_smart_no_gaps_
options are equivalent to setting _smart_borders_ smart|no_gaps and
_hide_edge_borders_ none.

Expand Down
10 changes: 8 additions & 2 deletions sway/tree/view.c
Expand Up @@ -356,8 +356,14 @@ void view_autoconfigure(struct sway_view *view) {
height = con->pending.height - y_offset
- con->pending.border_thickness * con->pending.border_bottom;
} else {
y = con->pending.y + container_titlebar_height();
height = con->pending.height - container_titlebar_height()
int titlebar_height;
if (config->hide_lone_title && view_is_only_visible(view)) {
titlebar_height = con->pending.border_thickness * con->pending.border_top + y_offset;
} else {
titlebar_height = container_titlebar_height();
}
y = con->pending.y + titlebar_height;
height = con->pending.height - titlebar_height
- con->pending.border_thickness * con->pending.border_bottom;
}
break;
Expand Down