mirror of
https://github.com/swaywm/sway.git
synced 2024-12-29 00:16:22 +01:00
Fix smart gaps
This commit is contained in:
parent
51f68e10ad
commit
742d1764a6
5 changed files with 63 additions and 24 deletions
|
@ -255,6 +255,13 @@ void view_get_constraints(struct sway_view *view, double *min_width,
|
||||||
uint32_t view_configure(struct sway_view *view, double lx, double ly, int width,
|
uint32_t view_configure(struct sway_view *view, double lx, double ly, int width,
|
||||||
int height);
|
int height);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether or not the view is the only visible view in its tree. If the view
|
||||||
|
* is tiling, there may be floating views. If the view is floating, there may
|
||||||
|
* be tiling views or views in a different floating container.
|
||||||
|
*/
|
||||||
|
bool view_is_only_visible(struct sway_view *view);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Configure the view's position and size based on the container's position and
|
* Configure the view's position and size based on the container's position and
|
||||||
* size, taking borders into consideration.
|
* size, taking borders into consideration.
|
||||||
|
|
|
@ -760,6 +760,12 @@ void seat_set_focus_warp(struct sway_seat *seat, struct sway_node *node,
|
||||||
|
|
||||||
seat->has_focus = true;
|
seat->has_focus = true;
|
||||||
|
|
||||||
|
if (config->smart_gaps) {
|
||||||
|
// When smart gaps is on, gaps may change when the focus changes so
|
||||||
|
// the workspace needs to be arranged
|
||||||
|
arrange_workspace(new_workspace);
|
||||||
|
}
|
||||||
|
|
||||||
update_debug_tree();
|
update_debug_tree();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1021,10 +1021,28 @@ void container_add_gaps(struct sway_container *c) {
|
||||||
if (!c->view && c->layout != L_TABBED && c->layout != L_STACKED) {
|
if (!c->view && c->layout != L_TABBED && c->layout != L_STACKED) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// Children of tabbed/stacked containers re-use the gaps of the container
|
// Descendants of tabbed/stacked containers re-use the gaps of the container
|
||||||
enum sway_container_layout layout = container_parent_layout(c);
|
struct sway_container *temp = c;
|
||||||
if (layout == L_TABBED || layout == L_STACKED) {
|
while (temp) {
|
||||||
return;
|
enum sway_container_layout layout = container_parent_layout(temp);
|
||||||
|
if (layout == L_TABBED || layout == L_STACKED) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
temp = temp->parent;
|
||||||
|
}
|
||||||
|
// If smart gaps is on, don't add gaps if there is only one view visible
|
||||||
|
if (config->smart_gaps) {
|
||||||
|
struct sway_view *view = c->view;
|
||||||
|
if (!view) {
|
||||||
|
struct sway_seat *seat =
|
||||||
|
input_manager_get_default_seat(input_manager);
|
||||||
|
struct sway_container *focus =
|
||||||
|
seat_get_focus_inactive_view(seat, &c->node);
|
||||||
|
view = focus ? focus->view : NULL;
|
||||||
|
}
|
||||||
|
if (view && view_is_only_visible(view)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct sway_workspace *ws = c->workspace;
|
struct sway_workspace *ws = c->workspace;
|
||||||
|
|
|
@ -162,6 +162,23 @@ uint32_t view_configure(struct sway_view *view, double lx, double ly, int width,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool view_is_only_visible(struct sway_view *view) {
|
||||||
|
bool only_view = true;
|
||||||
|
struct sway_container *con = view->container;
|
||||||
|
while (con) {
|
||||||
|
enum sway_container_layout layout = container_parent_layout(con);
|
||||||
|
if (layout != L_TABBED && layout != L_STACKED) {
|
||||||
|
list_t *siblings = container_get_siblings(con);
|
||||||
|
if (siblings && siblings->length > 1) {
|
||||||
|
only_view = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
con = con->parent;
|
||||||
|
}
|
||||||
|
return only_view;
|
||||||
|
}
|
||||||
|
|
||||||
void view_autoconfigure(struct sway_view *view) {
|
void view_autoconfigure(struct sway_view *view) {
|
||||||
if (!view->container->workspace) {
|
if (!view->container->workspace) {
|
||||||
// Hidden in the scratchpad
|
// Hidden in the scratchpad
|
||||||
|
@ -178,24 +195,9 @@ void view_autoconfigure(struct sway_view *view) {
|
||||||
}
|
}
|
||||||
|
|
||||||
struct sway_workspace *ws = view->container->workspace;
|
struct sway_workspace *ws = view->container->workspace;
|
||||||
|
|
||||||
bool other_views = false;
|
|
||||||
if (config->hide_edge_borders == E_SMART) {
|
|
||||||
struct sway_container *con = view->container;
|
|
||||||
while (con) {
|
|
||||||
enum sway_container_layout layout = container_parent_layout(con);
|
|
||||||
if (layout != L_TABBED && layout != L_STACKED) {
|
|
||||||
list_t *siblings = container_get_siblings(con);
|
|
||||||
if (siblings && siblings->length > 1) {
|
|
||||||
other_views = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
con = con->parent;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct sway_container *con = view->container;
|
struct sway_container *con = view->container;
|
||||||
|
bool other_views = config->hide_edge_borders == E_SMART ?
|
||||||
|
!view_is_only_visible(view) : false;
|
||||||
|
|
||||||
view->border_top = view->border_bottom = true;
|
view->border_top = view->border_bottom = true;
|
||||||
view->border_left = view->border_right = true;
|
view->border_left = view->border_right = true;
|
||||||
|
|
|
@ -640,11 +640,17 @@ void workspace_add_gaps(struct sway_workspace *ws) {
|
||||||
if (ws->current_gaps > 0) {
|
if (ws->current_gaps > 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
bool should_apply =
|
if (!config->edge_gaps) {
|
||||||
config->edge_gaps || (config->smart_gaps && ws->tiling->length > 1);
|
|
||||||
if (!should_apply) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (config->smart_gaps) {
|
||||||
|
struct sway_seat *seat = input_manager_get_default_seat(input_manager);
|
||||||
|
struct sway_container *focus =
|
||||||
|
seat_get_focus_inactive_view(seat, &ws->node);
|
||||||
|
if (focus && focus->view && view_is_only_visible(focus->view)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ws->current_gaps = ws->gaps_outer;
|
ws->current_gaps = ws->gaps_outer;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue