aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/sway/tree/view.h2
-rw-r--r--sway/desktop/xdg_shell.c16
-rw-r--r--sway/desktop/xdg_shell_v6.c16
-rw-r--r--sway/desktop/xwayland.c2
-rw-r--r--sway/tree/view.c16
5 files changed, 46 insertions, 6 deletions
diff --git a/include/sway/tree/view.h b/include/sway/tree/view.h
index ac203ac7..bdd8960c 100644
--- a/include/sway/tree/view.h
+++ b/include/sway/tree/view.h
@@ -314,7 +314,7 @@ void view_destroy(struct sway_view *view);
void view_begin_destroy(struct sway_view *view);
void view_map(struct sway_view *view, struct wlr_surface *wlr_surface,
- bool fullscreen, bool decoration);
+ bool fullscreen, struct wlr_output *fullscreen_output, bool decoration);
void view_unmap(struct sway_view *view);
diff --git a/sway/desktop/xdg_shell.c b/sway/desktop/xdg_shell.c
index ea5dcd16..9e914f14 100644
--- a/sway/desktop/xdg_shell.c
+++ b/sway/desktop/xdg_shell.c
@@ -339,6 +339,18 @@ static void handle_request_fullscreen(struct wl_listener *listener, void *data)
return;
}
+ if (e->fullscreen && e->output && e->output->data) {
+ struct sway_output *output = e->output->data;
+ struct sway_workspace *ws = output_get_active_workspace(output);
+ if (ws && !container_is_scratchpad_hidden(view->container)) {
+ if (container_is_floating(view->container)) {
+ workspace_add_floating(ws, view->container);
+ } else {
+ workspace_add_tiling(ws, view->container);
+ }
+ }
+ }
+
container_set_fullscreen(view->container, e->fullscreen);
arrange_root();
@@ -417,7 +429,9 @@ static void handle_map(struct wl_listener *listener, void *data) {
}
view_map(view, view->wlr_xdg_surface->surface,
- xdg_surface->toplevel->client_pending.fullscreen, csd);
+ xdg_surface->toplevel->client_pending.fullscreen,
+ xdg_surface->toplevel->client_pending.fullscreen_output,
+ csd);
transaction_commit_dirty();
diff --git a/sway/desktop/xdg_shell_v6.c b/sway/desktop/xdg_shell_v6.c
index 7ff4c4de..5ac589cf 100644
--- a/sway/desktop/xdg_shell_v6.c
+++ b/sway/desktop/xdg_shell_v6.c
@@ -339,6 +339,18 @@ static void handle_request_fullscreen(struct wl_listener *listener, void *data)
return;
}
+ if (e->fullscreen && e->output && e->output->data) {
+ struct sway_output *output = e->output->data;
+ struct sway_workspace *ws = output_get_active_workspace(output);
+ if (ws && !container_is_scratchpad_hidden(view->container)) {
+ if (container_is_floating(view->container)) {
+ workspace_add_floating(ws, view->container);
+ } else {
+ workspace_add_tiling(ws, view->container);
+ }
+ }
+ }
+
container_set_fullscreen(view->container, e->fullscreen);
arrange_root();
@@ -411,7 +423,9 @@ static void handle_map(struct wl_listener *listener, void *data) {
== WLR_SERVER_DECORATION_MANAGER_MODE_CLIENT;
view_map(view, view->wlr_xdg_surface_v6->surface,
- xdg_surface->toplevel->client_pending.fullscreen, csd);
+ xdg_surface->toplevel->client_pending.fullscreen,
+ xdg_surface->toplevel->client_pending.fullscreen_output,
+ csd);
transaction_commit_dirty();
diff --git a/sway/desktop/xwayland.c b/sway/desktop/xwayland.c
index 37d0b986..f6ca8f81 100644
--- a/sway/desktop/xwayland.c
+++ b/sway/desktop/xwayland.c
@@ -415,7 +415,7 @@ static void handle_map(struct wl_listener *listener, void *data) {
xwayland_view->commit.notify = handle_commit;
// Put it back into the tree
- view_map(view, xsurface->surface, xsurface->fullscreen, false);
+ view_map(view, xsurface->surface, xsurface->fullscreen, NULL, false);
transaction_commit_dirty();
}
diff --git a/sway/tree/view.c b/sway/tree/view.c
index 4759c998..2c8839f5 100644
--- a/sway/tree/view.c
+++ b/sway/tree/view.c
@@ -561,14 +561,26 @@ static bool should_focus(struct sway_view *view) {
}
void view_map(struct sway_view *view, struct wlr_surface *wlr_surface,
- bool fullscreen, bool decoration) {
+ bool fullscreen, struct wlr_output *fullscreen_output,
+ bool decoration) {
if (!sway_assert(view->surface == NULL, "cannot map mapped view")) {
return;
}
view->surface = wlr_surface;
+ // If there is a request to be opened fullscreen on a specific output, try
+ // to honor that request. Otherwise, fallback to assigns, pid mappings,
+ // focused workspace, etc
+ struct sway_workspace *ws = NULL;
+ if (fullscreen_output && fullscreen_output->data) {
+ struct sway_output *output = fullscreen_output->data;
+ ws = output_get_active_workspace(output);
+ }
+ if (!ws) {
+ ws = select_workspace(view);
+ }
+
struct sway_seat *seat = input_manager_current_seat();
- struct sway_workspace *ws = select_workspace(view);
struct sway_node *node = seat_get_focus_inactive(seat, &ws->node);
struct sway_container *target_sibling = node->type == N_CONTAINER ?
node->sway_container : NULL;