aboutsummaryrefslogtreecommitdiff
path: root/sway
diff options
context:
space:
mode:
Diffstat (limited to 'sway')
-rw-r--r--sway/desktop/output.c2
-rw-r--r--sway/desktop/xdg_shell.c16
-rw-r--r--sway/desktop/xdg_shell_v6.c10
-rw-r--r--sway/desktop/xwayland.c10
-rw-r--r--sway/tree/container.c13
-rw-r--r--sway/tree/view.c13
6 files changed, 48 insertions, 16 deletions
diff --git a/sway/desktop/output.c b/sway/desktop/output.c
index b55a3962..541d765d 100644
--- a/sway/desktop/output.c
+++ b/sway/desktop/output.c
@@ -870,7 +870,7 @@ static void render_floating_container(struct sway_output *soutput,
render_titlebar(soutput, damage, con, con->current.swayc_x,
con->current.swayc_y, con->current.swayc_width, colors,
title_texture, marks_texture);
- } else {
+ } else if (con->current.border != B_NONE) {
render_top_border(soutput, damage, con, colors);
}
render_view(soutput, damage, con, colors);
diff --git a/sway/desktop/xdg_shell.c b/sway/desktop/xdg_shell.c
index 0f45399d..da3a1cdd 100644
--- a/sway/desktop/xdg_shell.c
+++ b/sway/desktop/xdg_shell.c
@@ -108,6 +108,19 @@ static void set_activated(struct sway_view *view, bool activated) {
}
}
+static void set_tiled(struct sway_view *view, bool tiled) {
+ if (xdg_shell_view_from_view(view) == NULL) {
+ return;
+ }
+ struct wlr_xdg_surface *surface = view->wlr_xdg_surface;
+ enum wlr_edges edges = WLR_EDGE_NONE;
+ if (tiled) {
+ edges = WLR_EDGE_LEFT | WLR_EDGE_RIGHT | WLR_EDGE_TOP |
+ WLR_EDGE_BOTTOM;
+ }
+ wlr_xdg_toplevel_set_tiled(surface, edges);
+}
+
static void set_fullscreen(struct sway_view *view, bool fullscreen) {
if (xdg_shell_view_from_view(view) == NULL) {
return;
@@ -157,6 +170,7 @@ static const struct sway_view_impl view_impl = {
.get_string_prop = get_string_prop,
.configure = configure,
.set_activated = set_activated,
+ .set_tiled = set_tiled,
.set_fullscreen = set_fullscreen,
.wants_floating = wants_floating,
.for_each_surface = for_each_surface,
@@ -288,8 +302,6 @@ void handle_xdg_shell_surface(struct wl_listener *listener, void *data) {
wlr_log(L_DEBUG, "New xdg_shell toplevel title='%s' app_id='%s'",
xdg_surface->toplevel->title, xdg_surface->toplevel->app_id);
wlr_xdg_surface_ping(xdg_surface);
- wlr_xdg_toplevel_set_tiled(xdg_surface, WLR_EDGE_LEFT | WLR_EDGE_RIGHT |
- WLR_EDGE_TOP | WLR_EDGE_BOTTOM);
struct sway_xdg_shell_view *xdg_shell_view =
calloc(1, sizeof(struct sway_xdg_shell_view));
diff --git a/sway/desktop/xdg_shell_v6.c b/sway/desktop/xdg_shell_v6.c
index b296f1a8..69819280 100644
--- a/sway/desktop/xdg_shell_v6.c
+++ b/sway/desktop/xdg_shell_v6.c
@@ -108,6 +108,14 @@ static void set_activated(struct sway_view *view, bool activated) {
}
}
+static void set_tiled(struct sway_view *view, bool tiled) {
+ if (xdg_shell_v6_view_from_view(view) == NULL) {
+ return;
+ }
+ struct wlr_xdg_surface_v6 *surface = view->wlr_xdg_surface_v6;
+ wlr_xdg_toplevel_v6_set_maximized(surface, tiled);
+}
+
static void set_fullscreen(struct sway_view *view, bool fullscreen) {
if (xdg_shell_v6_view_from_view(view) == NULL) {
return;
@@ -158,6 +166,7 @@ static const struct sway_view_impl view_impl = {
.get_string_prop = get_string_prop,
.configure = configure,
.set_activated = set_activated,
+ .set_tiled = set_tiled,
.set_fullscreen = set_fullscreen,
.wants_floating = wants_floating,
.for_each_surface = for_each_surface,
@@ -284,7 +293,6 @@ void handle_xdg_shell_v6_surface(struct wl_listener *listener, void *data) {
wlr_log(L_DEBUG, "New xdg_shell_v6 toplevel title='%s' app_id='%s'",
xdg_surface->toplevel->title, xdg_surface->toplevel->app_id);
wlr_xdg_surface_v6_ping(xdg_surface);
- wlr_xdg_toplevel_v6_set_maximized(xdg_surface, true);
struct sway_xdg_shell_v6_view *xdg_shell_v6_view =
calloc(1, sizeof(struct sway_xdg_shell_v6_view));
diff --git a/sway/desktop/xwayland.c b/sway/desktop/xwayland.c
index ad893248..6e63c505 100644
--- a/sway/desktop/xwayland.c
+++ b/sway/desktop/xwayland.c
@@ -200,6 +200,14 @@ static void set_activated(struct sway_view *view, bool activated) {
wlr_xwayland_surface_activate(surface, activated);
}
+static void set_tiled(struct sway_view *view, bool tiled) {
+ if (xwayland_view_from_view(view) == NULL) {
+ return;
+ }
+ struct wlr_xwayland_surface *surface = view->wlr_xwayland_surface;
+ wlr_xwayland_surface_set_maximized(surface, tiled);
+}
+
static void set_fullscreen(struct sway_view *view, bool fullscreen) {
if (xwayland_view_from_view(view) == NULL) {
return;
@@ -258,6 +266,7 @@ static const struct sway_view_impl view_impl = {
.get_int_prop = get_int_prop,
.configure = configure,
.set_activated = set_activated,
+ .set_tiled = set_tiled,
.set_fullscreen = set_fullscreen,
.wants_floating = wants_floating,
.close = _close,
@@ -307,7 +316,6 @@ static void handle_map(struct wl_listener *listener, void *data) {
xwayland_view->commit.notify = handle_commit;
// Put it back into the tree
- wlr_xwayland_surface_set_maximized(xsurface, true);
view_map(view, xsurface->surface);
if (xsurface->fullscreen) {
diff --git a/sway/tree/container.c b/sway/tree/container.c
index ab3d9dbd..6f6137c4 100644
--- a/sway/tree/container.c
+++ b/sway/tree/container.c
@@ -522,21 +522,11 @@ static struct sway_container *container_at_view(struct sway_container *swayc,
view_sx, view_sy, &_sx, &_sy);
break;
case SWAY_VIEW_XDG_SHELL_V6:
- // the top left corner of the sway container is the
- // coordinate of the top left corner of the window geometry
- view_sx += sview->wlr_xdg_surface_v6->geometry.x;
- view_sy += sview->wlr_xdg_surface_v6->geometry.y;
-
_surface = wlr_xdg_surface_v6_surface_at(
sview->wlr_xdg_surface_v6,
view_sx, view_sy, &_sx, &_sy);
break;
case SWAY_VIEW_XDG_SHELL:
- // the top left corner of the sway container is the
- // coordinate of the top left corner of the window geometry
- view_sx += sview->wlr_xdg_surface->geometry.x;
- view_sy += sview->wlr_xdg_surface->geometry.y;
-
_surface = wlr_xdg_surface_surface_at(
sview->wlr_xdg_surface,
view_sx, view_sy, &_sx, &_sy);
@@ -954,6 +944,9 @@ void container_set_floating(struct sway_container *container, bool enable) {
container_add_child(workspace, container);
container->width = container->parent->width;
container->height = container->parent->height;
+ if (container->type == C_VIEW) {
+ view_set_tiled(container->sway_view, true);
+ }
container->is_sticky = false;
container_reap_empty_recursive(workspace->sway_workspace->floating);
}
diff --git a/sway/tree/view.c b/sway/tree/view.c
index 9f85bac0..6263bfb0 100644
--- a/sway/tree/view.c
+++ b/sway/tree/view.c
@@ -164,6 +164,9 @@ void view_init_floating(struct sway_view *view) {
view->border_left = view->border_right = true;
container_set_geometry_from_floating_view(view->swayc);
+
+ // Don't maximize floating windows
+ view_set_tiled(view, false);
}
void view_autoconfigure(struct sway_view *view) {
@@ -275,6 +278,7 @@ void view_autoconfigure(struct sway_view *view) {
view->y = y;
view->width = width;
view->height = height;
+ view_set_tiled(view, true);
}
void view_set_activated(struct sway_view *view, bool activated) {
@@ -283,6 +287,13 @@ void view_set_activated(struct sway_view *view, bool activated) {
}
}
+void view_set_tiled(struct sway_view *view, bool tiled) {
+ view->border = tiled ? config->border : B_NONE;
+ if (view->impl->set_tiled) {
+ view->impl->set_tiled(view, tiled);
+ }
+}
+
void view_set_fullscreen(struct sway_view *view, bool fullscreen) {
if (view->is_fullscreen == fullscreen) {
return;
@@ -948,7 +959,7 @@ bool view_is_visible(struct sway_view *view) {
// Check view isn't in a tabbed or stacked container on an inactive tab
struct sway_seat *seat = input_manager_current_seat(input_manager);
struct sway_container *container = view->swayc;
- while (container->type != C_WORKSPACE) {
+ while (container->type != C_WORKSPACE && container->layout != L_FLOATING) {
if (container->parent->layout == L_TABBED ||
container->parent->layout == L_STACKED) {
if (seat_get_active_child(seat, container->parent) != container) {