Skip to content

Commit

Permalink
view: move arrange_workspace into view_map
Browse files Browse the repository at this point in the history
For mouse_warping cursor to correctly work on newly spawned containers,
the workspace needs to be arranged before the cursor is warped.

The shell functions each implement their own fullscreen and arrange checks,
move them into the view_map function and pass their states via boolean arguments.

Fixes swaywm#2819
  • Loading branch information
Emantor committed Oct 16, 2018
1 parent 8dadfd4 commit c7c301c
Show file tree
Hide file tree
Showing 5 changed files with 34 additions and 47 deletions.
3 changes: 2 additions & 1 deletion include/sway/tree/view.h
Original file line number Diff line number Diff line change
Expand Up @@ -329,7 +329,8 @@ 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);
void view_map(struct sway_view *view, struct wlr_surface *wlr_surface,
bool fullscreen, bool decoration);

void view_unmap(struct sway_view *view);

Expand Down
20 changes: 6 additions & 14 deletions sway/desktop/xdg_shell.c
Original file line number Diff line number Diff line change
Expand Up @@ -406,27 +406,19 @@ static void handle_map(struct wl_listener *listener, void *data) {
view->natural_height = view->wlr_xdg_surface->surface->current.height;
}

view_map(view, view->wlr_xdg_surface->surface);
bool csd = false;

if (!view->xdg_decoration) {
struct sway_server_decoration *deco =
decoration_from_surface(xdg_surface->surface);
bool csd = !deco || deco->wlr_server_decoration->mode ==
decoration_from_surface(xdg_surface->surface);
csd = !deco || deco->wlr_server_decoration->mode ==
WLR_SERVER_DECORATION_MANAGER_MODE_CLIENT;
view_update_csd_from_client(view, csd);
}

if (xdg_surface->toplevel->client_pending.fullscreen) {
container_set_fullscreen(view->container, true);
arrange_workspace(view->container->workspace);
} else {
if (view->container->parent) {
arrange_container(view->container->parent);
} else if (view->container->workspace) {
arrange_workspace(view->container->workspace);
}
}

view_map(view, view->wlr_xdg_surface->surface,
xdg_surface->toplevel->client_pending.fullscreen, csd);

transaction_commit_dirty();

xdg_shell_view->commit.notify = handle_commit;
Expand Down
20 changes: 4 additions & 16 deletions sway/desktop/xdg_shell_v6.c
Original file line number Diff line number Diff line change
Expand Up @@ -402,25 +402,13 @@ static void handle_map(struct wl_listener *listener, void *data) {
view->natural_width = view->wlr_xdg_surface_v6->surface->current.width;
view->natural_height = view->wlr_xdg_surface_v6->surface->current.height;
}

view_map(view, view->wlr_xdg_surface_v6->surface);

struct sway_server_decoration *deco =
decoration_from_surface(xdg_surface->surface);
decoration_from_surface(xdg_surface->surface);
bool csd = !deco || deco->wlr_server_decoration->mode ==
WLR_SERVER_DECORATION_MANAGER_MODE_CLIENT;
view_update_csd_from_client(view, csd);
WLR_SERVER_DECORATION_MANAGER_MODE_CLIENT;

view_map(view, view->wlr_xdg_surface_v6->surface, xdg_surface->toplevel->client_pending.fullscreen, csd);

if (xdg_surface->toplevel->client_pending.fullscreen) {
container_set_fullscreen(view->container, true);
arrange_workspace(view->container->workspace);
} else {
if (view->container->parent) {
arrange_container(view->container->parent);
} else if (view->container->workspace) {
arrange_workspace(view->container->workspace);
}
}
transaction_commit_dirty();

xdg_shell_v6_view->commit.notify = handle_commit;
Expand Down
12 changes: 1 addition & 11 deletions sway/desktop/xwayland.c
Original file line number Diff line number Diff line change
Expand Up @@ -405,18 +405,8 @@ 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);
view_map(view, xsurface->surface, xsurface->fullscreen, false);

if (xsurface->fullscreen) {
container_set_fullscreen(view->container, true);
arrange_workspace(view->container->workspace);
} else {
if (view->container->parent) {
arrange_container(view->container->parent);
} else if (view->container->workspace) {
arrange_workspace(view->container->workspace);
}
}
transaction_commit_dirty();
}

Expand Down
26 changes: 21 additions & 5 deletions sway/tree/view.c
Original file line number Diff line number Diff line change
Expand Up @@ -535,7 +535,8 @@ static bool should_focus(struct sway_view *view) {
return len == 0;
}

void view_map(struct sway_view *view, struct wlr_surface *wlr_surface) {
void view_map(struct sway_view *view, struct wlr_surface *wlr_surface,
bool fullscreen, bool decoration) {
if (!sway_assert(view->surface == NULL, "cannot map mapped view")) {
return;
}
Expand Down Expand Up @@ -586,13 +587,28 @@ void view_map(struct sway_view *view, struct wlr_surface *wlr_surface) {
}
}

if (should_focus(view)) {
input_manager_set_focus(input_manager, &view->container->node);
}

view_update_title(view, false);
container_update_representation(view->container);
view_execute_criteria(view);

if (decoration) {
view_update_csd_from_client(view, decoration);
}

if (fullscreen) {
container_set_fullscreen(view->container, true);
arrange_workspace(view->container->workspace);
} else {
if (view->container->parent) {
arrange_container(view->container->parent);
} else if (view->container->workspace) {
arrange_workspace(view->container->workspace);
}
}

if (should_focus(view)) {
input_manager_set_focus(input_manager, &view->container->node);
}
}

void view_unmap(struct sway_view *view) {
Expand Down

0 comments on commit c7c301c

Please sign in to comment.