aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Ashworth <bosrsf04@gmail.com>2019-03-24 23:24:02 -0400
committerDrew DeVault <sir@cmpwn.com>2019-04-11 09:18:48 -0600
commit195226120fcf4854c90e544a6e7e0ec0b1c3312c (patch)
tree55d6d0e2c7a737897f8941be79ff20697ab3317a
parente0324fc88c4a9041e8c97bdf99ee33eb198c1310 (diff)
Honor output for xdg_toplevel_set_fullscreen
This honors the fullscreen output request for `xdg_toplevel_set_fullscreen` and `zxdg_toplevel_v6_set_fullscreen`. If the request was sent before mapping, the fullscreen output request will be retrieved from the client_pending state for the toplevel. The output will be passed to `view_map` and if there is a workspace on the output, the view will be placed on that workspace. If the request comes in after being mapped, the view will be moved to the workspace on the output (if there is one) before becoming fullscreen.
-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;