From 28cb412b0d083355507875459e6c5f412e81ce43 Mon Sep 17 00:00:00 2001 From: emersion Date: Fri, 30 Mar 2018 10:09:56 -0400 Subject: Unify initial xwayland view mapping with map handler --- sway/desktop/xwayland.c | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) (limited to 'sway/desktop/xwayland.c') diff --git a/sway/desktop/xwayland.c b/sway/desktop/xwayland.c index 38ee4656..c3697b4c 100644 --- a/sway/desktop/xwayland.c +++ b/sway/desktop/xwayland.c @@ -150,7 +150,8 @@ static void handle_map_notify(struct wl_listener *listener, void *data) { sway_surface->view->surface = xsurface->surface; // put it back into the tree - if (xsurface->override_redirect) { + if (wlr_xwayland_surface_is_unmanaged(xsurface) || + xsurface->override_redirect) { wl_list_insert(&root_container.sway_root->unmanaged_views, &sway_surface->view->unmanaged_view_link); } else { @@ -230,18 +231,5 @@ void handle_xwayland_surface(struct wl_listener *listener, void *data) { wl_signal_add(&xsurface->events.map_notify, &sway_surface->map_notify); sway_surface->map_notify.notify = handle_map_notify; - if (wlr_xwayland_surface_is_unmanaged(xsurface)) { - // these don't get a container in the tree - wl_list_insert(&root_container.sway_root->unmanaged_views, - &sway_view->unmanaged_view_link); - return; - } - - struct sway_seat *seat = input_manager_current_seat(input_manager); - struct sway_container *focus = sway_seat_get_focus_inactive(seat, &root_container); - struct sway_container *cont = container_view_create(focus, sway_view); - sway_view->swayc = cont; - - arrange_windows(cont->parent, -1, -1); - sway_input_manager_set_focus(input_manager, cont); + handle_map_notify(&sway_surface->map_notify, xsurface); } -- cgit v1.2.3 From 681f38c8783c14723a8cf88114e5af824d4952b8 Mon Sep 17 00:00:00 2001 From: emersion Date: Fri, 30 Mar 2018 11:22:12 -0400 Subject: Fix segfault on xwayland unmanaged view unmap --- sway/desktop/xwayland.c | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) (limited to 'sway/desktop/xwayland.c') diff --git a/sway/desktop/xwayland.c b/sway/desktop/xwayland.c index c3697b4c..d608c8b6 100644 --- a/sway/desktop/xwayland.c +++ b/sway/desktop/xwayland.c @@ -104,14 +104,11 @@ static void handle_commit(struct wl_listener *listener, void *data) { static void handle_destroy(struct wl_listener *listener, void *data) { struct sway_xwayland_surface *sway_surface = wl_container_of(listener, sway_surface, destroy); - struct wlr_xwayland_surface *xsurface = data; + wl_list_remove(&sway_surface->commit.link); wl_list_remove(&sway_surface->destroy.link); wl_list_remove(&sway_surface->request_configure.link); - if (xsurface->override_redirect && xsurface->mapped) { - wl_list_remove(&sway_surface->view->unmanaged_view_link); - wl_list_init(&sway_surface->view->unmanaged_view_link); - } + wl_list_remove(&sway_surface->view->unmanaged_view_link); struct sway_container *parent = container_view_destroy(sway_surface->view->swayc); if (parent) { @@ -125,11 +122,9 @@ static void handle_destroy(struct wl_listener *listener, void *data) { static void handle_unmap_notify(struct wl_listener *listener, void *data) { struct sway_xwayland_surface *sway_surface = wl_container_of(listener, sway_surface, unmap_notify); - struct wlr_xwayland_surface *xsurface = data; - if (xsurface->override_redirect && xsurface->mapped) { - wl_list_remove(&sway_surface->view->unmanaged_view_link); - wl_list_init(&sway_surface->view->unmanaged_view_link); - } + + wl_list_remove(&sway_surface->view->unmanaged_view_link); + wl_list_init(&sway_surface->view->unmanaged_view_link); // take it out of the tree struct sway_container *parent = container_view_destroy(sway_surface->view->swayc); @@ -152,6 +147,7 @@ static void handle_map_notify(struct wl_listener *listener, void *data) { // put it back into the tree if (wlr_xwayland_surface_is_unmanaged(xsurface) || xsurface->override_redirect) { + wl_list_remove(&sway_surface->view->unmanaged_view_link); wl_list_insert(&root_container.sway_root->unmanaged_views, &sway_surface->view->unmanaged_view_link); } else { @@ -210,6 +206,8 @@ void handle_xwayland_surface(struct wl_listener *listener, void *data) { sway_view->surface = xsurface->surface; sway_surface->view = sway_view; + wl_list_init(&sway_view->unmanaged_view_link); + // TODO: // - Look up pid and open on appropriate workspace // - Set new view to maximized so it behaves nicely -- cgit v1.2.3 From a5e457d59aaa4add10ddddaba81b7c64f2f1c689 Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Fri, 30 Mar 2018 12:06:45 -0400 Subject: Add xwayland views to focused container --- sway/desktop/xwayland.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) (limited to 'sway/desktop/xwayland.c') diff --git a/sway/desktop/xwayland.c b/sway/desktop/xwayland.c index d608c8b6..3e08b20e 100644 --- a/sway/desktop/xwayland.c +++ b/sway/desktop/xwayland.c @@ -154,12 +154,10 @@ static void handle_map_notify(struct wl_listener *listener, void *data) { struct sway_view *view = sway_surface->view; container_view_destroy(view->swayc); - struct sway_container *parent = root_container.children->items[0]; - parent = parent->children->items[0]; // workspace - - struct sway_container *cont = container_view_create(parent, view); + struct sway_seat *seat = input_manager_current_seat(input_manager); + struct sway_container *focus = sway_seat_get_focus_inactive(seat, &root_container); + struct sway_container *cont = container_view_create(focus, view); view->swayc = cont; - arrange_windows(cont->parent, -1, -1); sway_input_manager_set_focus(input_manager, cont); } -- cgit v1.2.3 From cf09ea184b891594331240eb860f28975dcb8b8c Mon Sep 17 00:00:00 2001 From: emersion Date: Fri, 30 Mar 2018 13:34:25 -0400 Subject: Use the new map/unmap events for xwayland views --- include/sway/tree/view.h | 4 ++-- sway/desktop/xwayland.c | 18 +++++++++--------- 2 files changed, 11 insertions(+), 11 deletions(-) (limited to 'sway/desktop/xwayland.c') diff --git a/include/sway/tree/view.h b/include/sway/tree/view.h index e5f53f4e..54f6d90e 100644 --- a/include/sway/tree/view.h +++ b/include/sway/tree/view.h @@ -28,8 +28,8 @@ struct sway_xwayland_surface { struct wl_listener request_resize; struct wl_listener request_maximize; struct wl_listener request_configure; - struct wl_listener unmap_notify; - struct wl_listener map_notify; + struct wl_listener unmap; + struct wl_listener map; struct wl_listener destroy; int pending_width, pending_height; diff --git a/sway/desktop/xwayland.c b/sway/desktop/xwayland.c index 3e08b20e..13eaf79a 100644 --- a/sway/desktop/xwayland.c +++ b/sway/desktop/xwayland.c @@ -119,9 +119,9 @@ static void handle_destroy(struct wl_listener *listener, void *data) { free(sway_surface); } -static void handle_unmap_notify(struct wl_listener *listener, void *data) { +static void handle_unmap(struct wl_listener *listener, void *data) { struct sway_xwayland_surface *sway_surface = - wl_container_of(listener, sway_surface, unmap_notify); + wl_container_of(listener, sway_surface, unmap); wl_list_remove(&sway_surface->view->unmanaged_view_link); wl_list_init(&sway_surface->view->unmanaged_view_link); @@ -136,10 +136,10 @@ static void handle_unmap_notify(struct wl_listener *listener, void *data) { sway_surface->view->surface = NULL; } -static void handle_map_notify(struct wl_listener *listener, void *data) { +static void handle_map(struct wl_listener *listener, void *data) { // TODO put the view back into the tree struct sway_xwayland_surface *sway_surface = - wl_container_of(listener, sway_surface, map_notify); + wl_container_of(listener, sway_surface, map); struct wlr_xwayland_surface *xsurface = data; sway_surface->view->surface = xsurface->surface; @@ -221,11 +221,11 @@ void handle_xwayland_surface(struct wl_listener *listener, void *data) { &sway_surface->request_configure); sway_surface->request_configure.notify = handle_configure_request; - wl_signal_add(&xsurface->events.unmap_notify, &sway_surface->unmap_notify); - sway_surface->unmap_notify.notify = handle_unmap_notify; + wl_signal_add(&xsurface->events.unmap, &sway_surface->unmap); + sway_surface->unmap.notify = handle_unmap; - wl_signal_add(&xsurface->events.map_notify, &sway_surface->map_notify); - sway_surface->map_notify.notify = handle_map_notify; + wl_signal_add(&xsurface->events.map, &sway_surface->map); + sway_surface->map.notify = handle_map; - handle_map_notify(&sway_surface->map_notify, xsurface); + handle_map(&sway_surface->map, xsurface); } -- cgit v1.2.3 From 49379dd0fc0758f89d7f4fa4fb5b08c7f4c26ae6 Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Fri, 30 Mar 2018 11:58:17 -0400 Subject: Fix workspace deletion edge cases --- include/sway/tree/container.h | 2 +- include/sway/tree/layout.h | 2 + include/sway/tree/workspace.h | 2 + sway/desktop/xdg_shell_v6.c | 3 +- sway/desktop/xwayland.c | 20 ++------- sway/meson.build | 1 + sway/tree/container.c | 101 +++--------------------------------------- sway/tree/layout.c | 58 +++++++++++------------- sway/tree/output.c | 36 +++++++++++++++ sway/tree/view.c | 11 +++++ sway/tree/workspace.c | 56 ++++++++++++++++++++++- 11 files changed, 145 insertions(+), 147 deletions(-) create mode 100644 sway/tree/output.c (limited to 'sway/desktop/xwayland.c') diff --git a/include/sway/tree/container.h b/include/sway/tree/container.h index 24e8468e..6aa66da0 100644 --- a/include/sway/tree/container.h +++ b/include/sway/tree/container.h @@ -104,7 +104,7 @@ struct sway_container *container_workspace_destroy( struct sway_container *container_view_destroy(struct sway_container *view); -void container_destroy(struct sway_container *cont); +struct sway_container *container_destroy(struct sway_container *cont); struct sway_container *container_set_layout(struct sway_container *container, enum sway_container_layout layout); diff --git a/include/sway/tree/layout.h b/include/sway/tree/layout.h index 8239366b..0a904c4b 100644 --- a/include/sway/tree/layout.h +++ b/include/sway/tree/layout.h @@ -39,6 +39,8 @@ struct sway_container *container_add_sibling(struct sway_container *parent, struct sway_container *container_remove_child(struct sway_container *child); +struct sway_container *container_reap_empty(struct sway_container *container); + void container_move_to(struct sway_container* container, struct sway_container* destination); diff --git a/include/sway/tree/workspace.h b/include/sway/tree/workspace.h index d73b29c1..4e4c3450 100644 --- a/include/sway/tree/workspace.h +++ b/include/sway/tree/workspace.h @@ -23,4 +23,6 @@ struct sway_container *workspace_output_prev(struct sway_container *current); struct sway_container *workspace_prev(struct sway_container *current); +bool workspace_is_visible(struct sway_container *ws); + #endif diff --git a/sway/desktop/xdg_shell_v6.c b/sway/desktop/xdg_shell_v6.c index 25c0cbca..01f38d16 100644 --- a/sway/desktop/xdg_shell_v6.c +++ b/sway/desktop/xdg_shell_v6.c @@ -83,10 +83,9 @@ static void handle_destroy(struct wl_listener *listener, void *data) { wl_container_of(listener, sway_xdg_surface, destroy); wl_list_remove(&sway_xdg_surface->commit.link); wl_list_remove(&sway_xdg_surface->destroy.link); - struct sway_container *parent = container_view_destroy(sway_xdg_surface->view->swayc); + container_view_destroy(sway_xdg_surface->view->swayc); free(sway_xdg_surface->view); free(sway_xdg_surface); - arrange_windows(parent, -1, -1); } void handle_xdg_shell_v6_surface(struct wl_listener *listener, void *data) { diff --git a/sway/desktop/xwayland.c b/sway/desktop/xwayland.c index 3e08b20e..357c8883 100644 --- a/sway/desktop/xwayland.c +++ b/sway/desktop/xwayland.c @@ -109,29 +109,17 @@ static void handle_destroy(struct wl_listener *listener, void *data) { wl_list_remove(&sway_surface->destroy.link); wl_list_remove(&sway_surface->request_configure.link); wl_list_remove(&sway_surface->view->unmanaged_view_link); - - struct sway_container *parent = container_view_destroy(sway_surface->view->swayc); - if (parent) { - arrange_windows(parent, -1, -1); - } - - free(sway_surface->view); - free(sway_surface); + container_view_destroy(sway_surface->view->swayc); + sway_surface->view->swayc = NULL; + sway_surface->view->surface = NULL; } static void handle_unmap_notify(struct wl_listener *listener, void *data) { struct sway_xwayland_surface *sway_surface = wl_container_of(listener, sway_surface, unmap_notify); - wl_list_remove(&sway_surface->view->unmanaged_view_link); wl_list_init(&sway_surface->view->unmanaged_view_link); - - // take it out of the tree - struct sway_container *parent = container_view_destroy(sway_surface->view->swayc); - if (parent) { - arrange_windows(parent, -1, -1); - } - + container_view_destroy(sway_surface->view->swayc); sway_surface->view->swayc = NULL; sway_surface->view->surface = NULL; } diff --git a/sway/meson.build b/sway/meson.build index 9c5e4a00..e8a192f0 100644 --- a/sway/meson.build +++ b/sway/meson.build @@ -82,6 +82,7 @@ sway_sources = files( 'security.c', 'tree/container.c', 'tree/layout.c', + 'tree/output.c', 'tree/view.c', 'tree/workspace.c', ) diff --git a/sway/tree/container.c b/sway/tree/container.c index ed39a154..778108b4 100644 --- a/sway/tree/container.c +++ b/sway/tree/container.c @@ -10,12 +10,12 @@ #include "sway/tree/container.h" #include "sway/input/input-manager.h" #include "sway/input/seat.h" -#include "sway/tree/layout.h" +#include "sway/ipc-server.h" #include "sway/output.h" #include "sway/server.h" +#include "sway/tree/layout.h" #include "sway/tree/view.h" #include "sway/tree/workspace.h" -#include "sway/ipc-server.h" #include "log.h" static list_t *bfs_queue; @@ -58,13 +58,14 @@ static struct sway_container *container_create(enum sway_container_type type) { return c; } -void container_destroy(struct sway_container *cont) { +struct sway_container *container_destroy(struct sway_container *cont) { if (cont == NULL) { - return; + return NULL; } wl_signal_emit(&cont->events.destroy, cont); + struct sway_container *parent = cont->parent; if (cont->children) { // remove children until there are no more, container_destroy calls // container_remove_child, which removes child from this container @@ -77,13 +78,14 @@ void container_destroy(struct sway_container *cont) { list_foreach(cont->marks, free); list_free(cont->marks); } - if (cont->parent) { + if (parent) { container_remove_child(cont); } if (cont->name) { free(cont->name); } free(cont); + return parent; } struct sway_container *container_output_create( @@ -202,95 +204,6 @@ struct sway_container *container_view_create(struct sway_container *sibling, return swayc; } -struct sway_container *container_output_destroy(struct sway_container *output) { - if (!sway_assert(output, "cannot destroy null output")) { - return NULL; - } - - if (output->children->length > 0) { - // TODO save workspaces when there are no outputs. - // TODO also check if there will ever be no outputs except for exiting - // program - if (root_container.children->length > 1) { - int p = root_container.children->items[0] == output; - // Move workspace from this output to another output - while (output->children->length) { - struct sway_container *child = output->children->items[0]; - container_remove_child(child); - container_add_child(root_container.children->items[p], child); - } - container_sort_workspaces(root_container.children->items[p]); - arrange_windows(root_container.children->items[p], - -1, -1); - } - } - - wl_list_remove(&output->sway_output->frame.link); - wl_list_remove(&output->sway_output->destroy.link); - wl_list_remove(&output->sway_output->mode.link); - - wlr_log(L_DEBUG, "OUTPUT: Destroying output '%s'", output->name); - container_destroy(output); - - return &root_container; -} - -struct sway_container *container_workspace_destroy( - struct sway_container *workspace) { - if (!sway_assert(workspace, "cannot destroy null workspace")) { - return NULL; - } - - // Do not destroy this if it's the last workspace on this output - struct sway_container *output = container_parent(workspace, C_OUTPUT); - if (output && output->children->length == 1) { - return NULL; - } - - struct sway_container *parent = workspace->parent; - if (workspace->children->length == 0) { - // destroy the WS if there are no children (TODO check for floating) - wlr_log(L_DEBUG, "destroying workspace '%s'", workspace->name); - ipc_event_workspace(workspace, NULL, "empty"); - } else { - // Move children to a different workspace on this output - struct sway_container *new_workspace = NULL; - // TODO move floating - for (int i = 0; i < output->children->length; i++) { - if (output->children->items[i] != workspace) { - new_workspace = output->children->items[i]; - break; - } - } - - wlr_log(L_DEBUG, "moving children to different workspace '%s' -> '%s'", - workspace->name, new_workspace->name); - for (int i = 0; i < workspace->children->length; i++) { - container_move_to(workspace->children->items[i], new_workspace); - } - } - - container_destroy(workspace); - return parent; -} - -struct sway_container *container_view_destroy(struct sway_container *view) { - if (!view) { - return NULL; - } - wlr_log(L_DEBUG, "Destroying view '%s'", view->name); - struct sway_container *parent = view->parent; - container_destroy(view); - - // TODO WLR: Destroy empty containers - /* - if (parent && parent->type == C_CONTAINER) { - return destroy_container(parent); - } - */ - return parent; -} - struct sway_container *container_set_layout(struct sway_container *container, enum sway_container_layout layout) { if (container->type == C_WORKSPACE) { diff --git a/sway/tree/layout.c b/sway/tree/layout.c index 73c4849b..32e6a77c 100644 --- a/sway/tree/layout.c +++ b/sway/tree/layout.c @@ -9,6 +9,7 @@ #include "sway/tree/container.h" #include "sway/tree/layout.h" #include "sway/output.h" +#include "sway/tree/workspace.h" #include "sway/tree/view.h" #include "sway/input/seat.h" #include "sway/ipc-server.h" @@ -99,40 +100,40 @@ void container_add_child(struct sway_container *parent, parent, parent->type, parent->width, parent->height); list_add(parent->children, child); child->parent = parent; - // set focus for this container - /* TODO WLR - if (parent->type == C_WORKSPACE && child->type == C_VIEW && - (parent->workspace_layout == L_TABBED || parent->workspace_layout == - L_STACKED)) { - child = new_container(child, parent->workspace_layout); +} + +struct sway_container *container_reap_empty(struct sway_container *container) { + if (!sway_assert(container, "reaping null container")) { + return NULL; } - */ + wlr_log(L_DEBUG, "reaping %p %s", container, container->name); + while (container->children->length == 0) { + if (container->type == C_WORKSPACE) { + if (!workspace_is_visible(container)) { + container_workspace_destroy(container); + } + break; + } else if (container->type == C_CONTAINER) { + struct sway_container *parent = container->parent; + container_destroy(container); + container = parent; + } else { + container = container->parent; + } + } + return container; } struct sway_container *container_remove_child(struct sway_container *child) { - int i; struct sway_container *parent = child->parent; - for (i = 0; i < parent->children->length; ++i) { + for (int i = 0; i < parent->children->length; ++i) { if (parent->children->items[i] == child) { list_del(parent->children, i); break; } } child->parent = NULL; - return parent; -} - -struct sway_container *container_reap_empty(struct sway_container *container) { - if (!sway_assert(container, "reaping null container")) { - return NULL; - } - while (container->children->length == 0 && container->type == C_CONTAINER) { - wlr_log(L_DEBUG, "Container: Destroying container '%p'", container); - struct sway_container *parent = container->parent; - container_destroy(container); - container = parent; - } - return container; + return container_reap_empty(parent); } void container_move_to(struct sway_container* container, @@ -145,16 +146,9 @@ void container_move_to(struct sway_container* container, container->width = container->height = 0; struct sway_container *new_parent = container_add_sibling(destination, container); - if (destination->type == C_WORKSPACE) { - // If the workspace only has one child after adding one, it - // means that the workspace was just initialized. - // TODO: Consider floating views in this test - if (destination->children->length == 1) { - ipc_event_workspace(NULL, destination, "init"); - } + if (old_parent) { + arrange_windows(old_parent, -1, -1); } - old_parent = container_reap_empty(old_parent); - arrange_windows(old_parent, -1, -1); arrange_windows(new_parent, -1, -1); } diff --git a/sway/tree/output.c b/sway/tree/output.c new file mode 100644 index 00000000..2246cb11 --- /dev/null +++ b/sway/tree/output.c @@ -0,0 +1,36 @@ +#include "sway/tree/container.h" +#include "sway/tree/layout.h" +#include "sway/output.h" +#include "log.h" + +struct sway_container *container_output_destroy(struct sway_container *output) { + if (!sway_assert(output, "cannot destroy null output")) { + return NULL; + } + + if (output->children->length > 0) { + // TODO save workspaces when there are no outputs. + // TODO also check if there will ever be no outputs except for exiting + // program + if (root_container.children->length > 1) { + int p = root_container.children->items[0] == output; + // Move workspace from this output to another output + while (output->children->length) { + struct sway_container *child = output->children->items[0]; + container_remove_child(child); + container_add_child(root_container.children->items[p], child); + } + container_sort_workspaces(root_container.children->items[p]); + arrange_windows(root_container.children->items[p], + -1, -1); + } + } + + wl_list_remove(&output->sway_output->frame.link); + wl_list_remove(&output->sway_output->destroy.link); + wl_list_remove(&output->sway_output->mode.link); + + wlr_log(L_DEBUG, "OUTPUT: Destroying output '%s'", output->name); + container_destroy(output); + return &root_container; +} diff --git a/sway/tree/view.c b/sway/tree/view.c index d5325c31..480ff693 100644 --- a/sway/tree/view.c +++ b/sway/tree/view.c @@ -3,6 +3,7 @@ #include "sway/tree/container.h" #include "sway/tree/layout.h" #include "sway/tree/view.h" +#include "log.h" const char *view_get_title(struct sway_view *view) { if (view->iface.get_prop) { @@ -94,3 +95,13 @@ void view_update_outputs(struct sway_view *view, const struct wlr_box *before) { } } } + +struct sway_container *container_view_destroy(struct sway_container *view) { + if (!view) { + return NULL; + } + wlr_log(L_DEBUG, "Destroying view '%s'", view->name); + struct sway_container *parent = container_destroy(view); + arrange_windows(parent, -1, -1); + return parent; +} diff --git a/sway/tree/workspace.c b/sway/tree/workspace.c index 5800ea09..c629f1f1 100644 --- a/sway/tree/workspace.c +++ b/sway/tree/workspace.c @@ -6,9 +6,10 @@ #include #include #include "stringop.h" -#include "sway/tree/container.h" #include "sway/input/input-manager.h" #include "sway/input/seat.h" +#include "sway/ipc-server.h" +#include "sway/tree/container.h" #include "sway/tree/workspace.h" #include "log.h" #include "util.h" @@ -202,7 +203,48 @@ struct sway_container *workspace_create(const char *name) { sway_seat_get_focus_inactive(seat, &root_container); parent = focus; parent = container_parent(parent, C_OUTPUT); - return container_workspace_create(parent, name); + struct sway_container *new_ws = container_workspace_create(parent, name); + ipc_event_workspace(NULL, new_ws, "init"); + return new_ws; +} + +struct sway_container *container_workspace_destroy( + struct sway_container *workspace) { + if (!sway_assert(workspace, "cannot destroy null workspace")) { + return NULL; + } + + // Do not destroy this if it's the last workspace on this output + struct sway_container *output = container_parent(workspace, C_OUTPUT); + if (output && output->children->length == 1) { + return NULL; + } + + struct sway_container *parent = workspace->parent; + if (workspace->children->length == 0) { + // destroy the WS if there are no children (TODO check for floating) + wlr_log(L_DEBUG, "destroying workspace '%s'", workspace->name); + ipc_event_workspace(workspace, NULL, "empty"); + } else { + // Move children to a different workspace on this output + struct sway_container *new_workspace = NULL; + // TODO move floating + for (int i = 0; i < output->children->length; i++) { + if (output->children->items[i] != workspace) { + new_workspace = output->children->items[i]; + break; + } + } + + wlr_log(L_DEBUG, "moving children to different workspace '%s' -> '%s'", + workspace->name, new_workspace->name); + for (int i = 0; i < workspace->children->length; i++) { + container_move_to(workspace->children->items[i], new_workspace); + } + } + + container_destroy(workspace); + return parent; } /** @@ -343,3 +385,13 @@ bool workspace_switch(struct sway_container *workspace) { arrange_windows(output, -1, -1); return true; } + +bool workspace_is_visible(struct sway_container *ws) { + struct sway_container *output = container_parent(ws, C_OUTPUT); + struct sway_seat *seat = input_manager_current_seat(input_manager); + struct sway_container *focus = sway_seat_get_focus_inactive(seat, output); + if (focus->type != C_WORKSPACE) { + focus = container_parent(focus, C_WORKSPACE); + } + return focus == ws; +} -- cgit v1.2.3 From a776ecbb860608e0f75430a53ea75a6ed19ac746 Mon Sep 17 00:00:00 2001 From: emersion Date: Fri, 30 Mar 2018 13:18:50 -0400 Subject: Add lite damage tracking This skips the renderer if nothing has changed, and renders everything otherwise. --- include/sway/output.h | 14 ++++- include/sway/server.h | 1 - include/sway/tree/view.h | 4 ++ sway/desktop/layer_shell.c | 26 +++++--- sway/desktop/output.c | 148 ++++++++++++++++++++++++++++++-------------- sway/desktop/wl_shell.c | 1 + sway/desktop/xdg_shell_v6.c | 5 +- sway/desktop/xwayland.c | 13 ++-- sway/tree/container.c | 2 +- sway/tree/output.c | 5 +- sway/tree/view.c | 18 +++++- 11 files changed, 171 insertions(+), 66 deletions(-) (limited to 'sway/desktop/xwayland.c') diff --git a/include/sway/output.h b/include/sway/output.h index 6fb79987..b4980cd8 100644 --- a/include/sway/output.h +++ b/include/sway/output.h @@ -5,6 +5,7 @@ #include #include #include +#include "sway/tree/view.h" struct sway_server; struct sway_container; @@ -13,17 +14,26 @@ struct sway_output { struct wlr_output *wlr_output; struct sway_container *swayc; struct sway_server *server; - struct timespec last_frame; struct wl_list layers[4]; // sway_layer_surface::link struct wlr_box usable_area; - struct wl_listener frame; + struct timespec last_frame; + struct wlr_output_damage *damage; + struct wl_listener destroy; struct wl_listener mode; struct wl_listener transform; + struct wl_listener damage_destroy; + struct wl_listener damage_frame; + pid_t bg_pid; }; +void output_damage_whole(struct sway_output *output); + +void output_damage_whole_view(struct sway_output *output, + struct sway_view *view); + #endif diff --git a/include/sway/server.h b/include/sway/server.h index db81932f..61f21cdb 100644 --- a/include/sway/server.h +++ b/include/sway/server.h @@ -25,7 +25,6 @@ struct sway_server { struct sway_input_manager *input; struct wl_listener new_output; - struct wl_listener output_frame; struct wlr_layer_shell *layer_shell; struct wl_listener layer_shell_surface; diff --git a/include/sway/tree/view.h b/include/sway/tree/view.h index 54f6d90e..526a8485 100644 --- a/include/sway/tree/view.h +++ b/include/sway/tree/view.h @@ -113,4 +113,8 @@ void view_close(struct sway_view *view); void view_update_outputs(struct sway_view *view, const struct wlr_box *before); +void view_damage_whole(struct sway_view *view); + +void view_damage_from(struct sway_view *view); + #endif diff --git a/sway/desktop/layer_shell.c b/sway/desktop/layer_shell.c index f7e5d19c..5c96659a 100644 --- a/sway/desktop/layer_shell.c +++ b/sway/desktop/layer_shell.c @@ -4,12 +4,13 @@ #include #include #include +#include #include #include #include "sway/layers.h" -#include "sway/tree/layout.h" #include "sway/output.h" #include "sway/server.h" +#include "sway/tree/layout.h" static void apply_exclusive(struct wlr_box *usable_area, uint32_t anchor, int32_t exclusive, @@ -210,20 +211,26 @@ static void handle_surface_commit(struct wl_listener *listener, void *data) { } else { // TODO DAMAGE from surface damage } + wlr_output_damage_add_box(output->damage, &old_geo); + wlr_output_damage_add_box(output->damage, &layer->geo); } } -static void unmap(struct wlr_layer_surface *layer_surface) { - // TODO DAMAGE +static void unmap(struct sway_layer_surface *sway_layer) { + struct wlr_output *wlr_output = sway_layer->layer_surface->output; + if (wlr_output != NULL) { + struct sway_output *output = wlr_output->data; + wlr_output_damage_add_box(output->damage, &sway_layer->geo); + } } static void handle_destroy(struct wl_listener *listener, void *data) { - struct sway_layer_surface *sway_layer = wl_container_of( - listener, sway_layer, destroy); + struct sway_layer_surface *sway_layer = wl_container_of(listener, + sway_layer, destroy); wlr_log(L_DEBUG, "Layer surface destroyed (%s)", sway_layer->layer_surface->namespace); if (sway_layer->layer_surface->mapped) { - unmap(sway_layer->layer_surface); + unmap(sway_layer); } wl_list_remove(&sway_layer->link); wl_list_remove(&sway_layer->destroy.link); @@ -239,13 +246,16 @@ static void handle_destroy(struct wl_listener *listener, void *data) { } static void handle_map(struct wl_listener *listener, void *data) { - // TODO DAMAGE + struct sway_layer_surface *sway_layer = wl_container_of(listener, + sway_layer, map); + struct sway_output *output = sway_layer->layer_surface->output->data; + wlr_output_damage_add_box(output->damage, &sway_layer->geo); } static void handle_unmap(struct wl_listener *listener, void *data) { struct sway_layer_surface *sway_layer = wl_container_of( listener, sway_layer, unmap); - unmap(sway_layer->layer_surface); + unmap(sway_layer); } void handle_layer_shell_surface(struct wl_listener *listener, void *data) { diff --git a/sway/desktop/output.c b/sway/desktop/output.c index f3416c03..ea457996 100644 --- a/sway/desktop/output.c +++ b/sway/desktop/output.c @@ -6,18 +6,19 @@ #include #include #include -#include +#include #include +#include #include #include #include "log.h" -#include "sway/tree/container.h" #include "sway/input/input-manager.h" #include "sway/input/seat.h" #include "sway/layers.h" -#include "sway/tree/layout.h" #include "sway/output.h" #include "sway/server.h" +#include "sway/tree/container.h" +#include "sway/tree/layout.h" #include "sway/tree/view.h" /** @@ -145,13 +146,13 @@ static void render_wl_shell_surface(struct wlr_wl_shell_surface *surface, struct render_data { struct sway_output *output; - struct timespec *now; + struct timespec *when; }; -static void output_frame_view(struct sway_container *view, void *data) { +static void render_view(struct sway_container *view, void *data) { struct render_data *rdata = data; struct sway_output *output = rdata->output; - struct timespec *now = rdata->now; + struct timespec *when = rdata->when; struct wlr_output *wlr_output = output->wlr_output; struct sway_view *sway_view = view->sway_view; struct wlr_surface *surface = sway_view->surface; @@ -164,18 +165,18 @@ static void output_frame_view(struct sway_container *view, void *data) { case SWAY_XDG_SHELL_V6_VIEW: { int window_offset_x = view->sway_view->wlr_xdg_surface_v6->geometry.x; int window_offset_y = view->sway_view->wlr_xdg_surface_v6->geometry.y; - render_surface(surface, wlr_output, now, + render_surface(surface, wlr_output, when, view->x - window_offset_x, view->y - window_offset_y, 0); render_xdg_v6_popups(sway_view->wlr_xdg_surface_v6, wlr_output, - now, view->x - window_offset_x, view->y - window_offset_y, 0); + when, view->x - window_offset_x, view->y - window_offset_y, 0); break; } case SWAY_WL_SHELL_VIEW: render_wl_shell_surface(sway_view->wlr_wl_shell_surface, wlr_output, - now, view->x, view->y, 0, false); + when, view->x, view->y, 0, false); break; case SWAY_XWAYLAND_VIEW: - render_surface(surface, wlr_output, now, view->x, view->y, 0); + render_surface(surface, wlr_output, when, view->x, view->y, 0); break; default: break; @@ -195,82 +196,134 @@ static void render_layer(struct sway_output *output, } } -static void handle_output_frame(struct wl_listener *listener, void *data) { - struct sway_output *soutput = wl_container_of(listener, soutput, frame); - struct wlr_output *wlr_output = data; +static void render_output(struct sway_output *output, struct timespec *when, + pixman_region32_t *damage) { + wlr_log(L_DEBUG, "render"); + struct wlr_output *wlr_output = output->wlr_output; struct wlr_renderer *renderer = wlr_backend_get_renderer(wlr_output->backend); - wlr_output_make_current(wlr_output, NULL); wlr_renderer_begin(renderer, wlr_output->width, wlr_output->height); + if (!pixman_region32_not_empty(damage)) { + // Output isn't damaged but needs buffer swap + goto renderer_end; + } + + // TODO + int width, height; + wlr_output_transformed_resolution(wlr_output, &width, &height); + pixman_region32_union_rect(damage, damage, 0, 0, width, height); + float clear_color[] = {0.25f, 0.25f, 0.25f, 1.0f}; wlr_renderer_clear(renderer, clear_color); - struct timespec now; - clock_gettime(CLOCK_MONOTONIC, &now); - struct wlr_output_layout *layout = root_container.sway_root->output_layout; - const struct wlr_box *output_box = wlr_output_layout_get_box( - layout, wlr_output); + const struct wlr_box *output_box = + wlr_output_layout_get_box(layout, wlr_output); - render_layer(soutput, output_box, &now, - &soutput->layers[ZWLR_LAYER_SHELL_V1_LAYER_BACKGROUND]); - render_layer(soutput, output_box, &now, - &soutput->layers[ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM]); + render_layer(output, output_box, when, + &output->layers[ZWLR_LAYER_SHELL_V1_LAYER_BACKGROUND]); + render_layer(output, output_box, when, + &output->layers[ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM]); struct sway_seat *seat = input_manager_current_seat(input_manager); struct sway_container *focus = - sway_seat_get_focus_inactive(seat, soutput->swayc); + sway_seat_get_focus_inactive(seat, output->swayc); struct sway_container *workspace = (focus->type == C_WORKSPACE ? focus : container_parent(focus, C_WORKSPACE)); struct render_data rdata = { - .output = soutput, - .now = &now, + .output = output, + .when = when, }; - container_descendants(workspace, C_VIEW, output_frame_view, &rdata); + container_descendants(workspace, C_VIEW, render_view, &rdata); // render unmanaged views on top struct sway_view *view; wl_list_for_each(view, &root_container.sway_root->unmanaged_views, unmanaged_view_link) { if (view->type == SWAY_XWAYLAND_VIEW) { - // the only kind of unamanged view right now is xwayland override redirect + // the only kind of unamanged view right now is xwayland override + // redirect int view_x = view->wlr_xwayland_surface->x; int view_y = view->wlr_xwayland_surface->y; - render_surface(view->surface, wlr_output, &soutput->last_frame, + render_surface(view->surface, wlr_output, &output->last_frame, view_x, view_y, 0); } } // TODO: Consider revising this when fullscreen windows are supported - render_layer(soutput, output_box, &now, - &soutput->layers[ZWLR_LAYER_SHELL_V1_LAYER_TOP]); - render_layer(soutput, output_box, &now, - &soutput->layers[ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY]); + render_layer(output, output_box, when, + &output->layers[ZWLR_LAYER_SHELL_V1_LAYER_TOP]); + render_layer(output, output_box, when, + &output->layers[ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY]); +renderer_end: wlr_renderer_end(renderer); - wlr_output_swap_buffers(wlr_output, &now, NULL); - soutput->last_frame = now; + if (!wlr_output_damage_swap_buffers(output->damage, when, damage)) { + return; + } + output->last_frame = *when; } -static void handle_output_destroy(struct wl_listener *listener, void *data) { - struct sway_output *output = wl_container_of(listener, output, destroy); +static void damage_handle_frame(struct wl_listener *listener, void *data) { + struct sway_output *output = + wl_container_of(listener, output, damage_frame); struct wlr_output *wlr_output = data; - wlr_log(L_DEBUG, "Output %p %s removed", wlr_output, wlr_output->name); + if (!wlr_output->enabled) { + return; + } + + struct timespec now; + clock_gettime(CLOCK_MONOTONIC, &now); + + bool needs_swap; + pixman_region32_t damage; + pixman_region32_init(&damage); + if (!wlr_output_damage_make_current(output->damage, &needs_swap, &damage)) { + return; + } + + if (needs_swap) { + render_output(output, &now, &damage); + } + + pixman_region32_fini(&damage); + + // TODO: send frame done events here instead of inside render_surface +} + +void output_damage_whole(struct sway_output *output) { + wlr_output_damage_add_whole(output->damage); +} + +void output_damage_whole_view(struct sway_output *output, + struct sway_view *view) { + // TODO + output_damage_whole(output); +} + +static void damage_handle_destroy(struct wl_listener *listener, void *data) { + struct sway_output *output = + wl_container_of(listener, output, damage_destroy); + container_output_destroy(output->swayc); +} + +static void handle_destroy(struct wl_listener *listener, void *data) { + struct sway_output *output = wl_container_of(listener, output, destroy); container_output_destroy(output->swayc); } -static void handle_output_mode(struct wl_listener *listener, void *data) { +static void handle_mode(struct wl_listener *listener, void *data) { struct sway_output *output = wl_container_of(listener, output, mode); arrange_layers(output); arrange_windows(output->swayc, -1, -1); } -static void handle_output_transform(struct wl_listener *listener, void *data) { +static void handle_transform(struct wl_listener *listener, void *data) { struct sway_output *output = wl_container_of(listener, output, transform); arrange_layers(output); arrange_windows(output->swayc, -1, -1); @@ -295,6 +348,8 @@ void handle_new_output(struct wl_listener *listener, void *data) { wlr_output_set_mode(wlr_output, mode); } + output->damage = wlr_output_damage_create(wlr_output); + output->swayc = container_output_create(output); if (!output->swayc) { free(output); @@ -308,14 +363,17 @@ void handle_new_output(struct wl_listener *listener, void *data) { sway_input_manager_configure_xcursor(input_manager); - wl_signal_add(&wlr_output->events.frame, &output->frame); - output->frame.notify = handle_output_frame; wl_signal_add(&wlr_output->events.destroy, &output->destroy); - output->destroy.notify = handle_output_destroy; + output->destroy.notify = handle_destroy; wl_signal_add(&wlr_output->events.mode, &output->mode); - output->mode.notify = handle_output_mode; + output->mode.notify = handle_mode; wl_signal_add(&wlr_output->events.transform, &output->transform); - output->transform.notify = handle_output_transform; + output->transform.notify = handle_transform; + + wl_signal_add(&output->damage->events.frame, &output->damage_frame); + output->damage_frame.notify = damage_handle_frame; + wl_signal_add(&output->damage->events.destroy, &output->damage_destroy); + output->damage_destroy.notify = damage_handle_destroy; arrange_layers(output); arrange_windows(&root_container, -1, -1); diff --git a/sway/desktop/wl_shell.c b/sway/desktop/wl_shell.c index 4d4d1ed7..4fcc6317 100644 --- a/sway/desktop/wl_shell.c +++ b/sway/desktop/wl_shell.c @@ -67,6 +67,7 @@ static void handle_commit(struct wl_listener *listener, void *data) { // TODO: Let floating views do whatever view->width = sway_surface->pending_width; view->height = sway_surface->pending_height; + view_damage_from(view); } static void handle_destroy(struct wl_listener *listener, void *data) { diff --git a/sway/desktop/xdg_shell_v6.c b/sway/desktop/xdg_shell_v6.c index 01f38d16..68abc120 100644 --- a/sway/desktop/xdg_shell_v6.c +++ b/sway/desktop/xdg_shell_v6.c @@ -76,6 +76,7 @@ static void handle_commit(struct wl_listener *listener, void *data) { // TODO: Let floating views do whatever view->width = sway_surface->pending_width; view->height = sway_surface->pending_height; + view_damage_from(view); } static void handle_destroy(struct wl_listener *listener, void *data) { @@ -123,12 +124,12 @@ void handle_xdg_shell_v6_surface(struct wl_listener *listener, void *data) { sway_view->sway_xdg_surface_v6 = sway_surface; sway_view->surface = xdg_surface->surface; sway_surface->view = sway_view; - + // TODO: // - Look up pid and open on appropriate workspace // - Set new view to maximized so it behaves nicely // - Criteria - + sway_surface->commit.notify = handle_commit; wl_signal_add(&xdg_surface->surface->events.commit, &sway_surface->commit); diff --git a/sway/desktop/xwayland.c b/sway/desktop/xwayland.c index dfc54e86..79c675a0 100644 --- a/sway/desktop/xwayland.c +++ b/sway/desktop/xwayland.c @@ -14,10 +14,10 @@ #include "sway/input/input-manager.h" #include "log.h" - static bool assert_xwayland(struct sway_view *view) { - return sway_assert(view->type == SWAY_XWAYLAND_VIEW && view->wlr_xwayland_surface, - "Expected xwayland view!"); - } +static bool assert_xwayland(struct sway_view *view) { + return sway_assert(view->type == SWAY_XWAYLAND_VIEW, + "Expected xwayland view!"); +} static const char *get_prop(struct sway_view *view, enum sway_view_prop prop) { if (!assert_xwayland(view)) { @@ -99,6 +99,7 @@ static void handle_commit(struct wl_listener *listener, void *data) { // TODO: Let floating views do whatever view->width = sway_surface->pending_width; view->height = sway_surface->pending_height; + view_damage_from(view); } static void handle_destroy(struct wl_listener *listener, void *data) { @@ -117,7 +118,7 @@ static void handle_destroy(struct wl_listener *listener, void *data) { static void handle_unmap(struct wl_listener *listener, void *data) { struct sway_xwayland_surface *sway_surface = wl_container_of(listener, sway_surface, unmap); - + view_damage_whole(sway_surface->view); wl_list_remove(&sway_surface->view->unmanaged_view_link); wl_list_init(&sway_surface->view->unmanaged_view_link); container_view_destroy(sway_surface->view->swayc); @@ -150,6 +151,8 @@ static void handle_map(struct wl_listener *listener, void *data) { arrange_windows(cont->parent, -1, -1); sway_input_manager_set_focus(input_manager, cont); } + + view_damage_whole(sway_surface->view); } static void handle_configure_request(struct wl_listener *listener, void *data) { diff --git a/sway/tree/container.c b/sway/tree/container.c index c3cf6c64..8705edc7 100644 --- a/sway/tree/container.c +++ b/sway/tree/container.c @@ -6,8 +6,8 @@ #include #include #include +#include "log.h" #include "sway/config.h" -#include "sway/tree/container.h" #include "sway/input/input-manager.h" #include "sway/input/seat.h" #include "sway/ipc-server.h" diff --git a/sway/tree/output.c b/sway/tree/output.c index 2246cb11..7248fd00 100644 --- a/sway/tree/output.c +++ b/sway/tree/output.c @@ -26,9 +26,12 @@ struct sway_container *container_output_destroy(struct sway_container *output) { } } - wl_list_remove(&output->sway_output->frame.link); wl_list_remove(&output->sway_output->destroy.link); wl_list_remove(&output->sway_output->mode.link); + wl_list_remove(&output->sway_output->transform.link); + + wl_list_remove(&output->sway_output->damage_destroy.link); + wl_list_remove(&output->sway_output->damage_frame.link); wlr_log(L_DEBUG, "OUTPUT: Destroying output '%s'", output->name); container_destroy(output); diff --git a/sway/tree/view.c b/sway/tree/view.c index 480ff693..b7d1a41b 100644 --- a/sway/tree/view.c +++ b/sway/tree/view.c @@ -1,9 +1,10 @@ #include #include +#include "log.h" +#include "sway/output.h" #include "sway/tree/container.h" #include "sway/tree/layout.h" #include "sway/tree/view.h" -#include "log.h" const char *view_get_title(struct sway_view *view) { if (view->iface.get_prop) { @@ -105,3 +106,18 @@ struct sway_container *container_view_destroy(struct sway_container *view) { arrange_windows(parent, -1, -1); return parent; } + +void view_damage_whole(struct sway_view *view) { + struct sway_container *cont = NULL; + for (int i = 0; i < root_container.children->length; ++i) { + cont = root_container.children->items[i]; + if (cont->type == C_OUTPUT) { + output_damage_whole_view(cont->sway_output, view); + } + } +} + +void view_damage_from(struct sway_view *view) { + // TODO + view_damage_whole(view); +} -- cgit v1.2.3 From 139f80b0f03cd772e408604203df81f285ca3f67 Mon Sep 17 00:00:00 2001 From: emersion Date: Fri, 30 Mar 2018 17:43:43 -0400 Subject: Handle map/unmap events in xdg-shell-v6 --- include/sway/tree/view.h | 4 +++- sway/desktop/xdg_shell_v6.c | 44 ++++++++++++++++++++++++++++++++++---------- sway/desktop/xwayland.c | 2 -- 3 files changed, 37 insertions(+), 13 deletions(-) (limited to 'sway/desktop/xwayland.c') diff --git a/include/sway/tree/view.h b/include/sway/tree/view.h index 526a8485..3965d2b7 100644 --- a/include/sway/tree/view.h +++ b/include/sway/tree/view.h @@ -15,6 +15,8 @@ struct sway_xdg_surface_v6 { struct wl_listener request_move; struct wl_listener request_resize; struct wl_listener request_maximize; + struct wl_listener map; + struct wl_listener unmap; struct wl_listener destroy; int pending_width, pending_height; @@ -28,8 +30,8 @@ struct sway_xwayland_surface { struct wl_listener request_resize; struct wl_listener request_maximize; struct wl_listener request_configure; - struct wl_listener unmap; struct wl_listener map; + struct wl_listener unmap; struct wl_listener destroy; int pending_width, pending_height; diff --git a/sway/desktop/xdg_shell_v6.c b/sway/desktop/xdg_shell_v6.c index 68abc120..713437f2 100644 --- a/sway/desktop/xdg_shell_v6.c +++ b/sway/desktop/xdg_shell_v6.c @@ -79,6 +79,34 @@ static void handle_commit(struct wl_listener *listener, void *data) { view_damage_from(view); } +static void handle_unmap(struct wl_listener *listener, void *data) { + struct sway_xdg_surface_v6 *sway_surface = + wl_container_of(listener, sway_surface, unmap); + view_damage_whole(sway_surface->view); + container_view_destroy(sway_surface->view->swayc); + sway_surface->view->swayc = NULL; + sway_surface->view->surface = NULL; +} + +static void handle_map(struct wl_listener *listener, void *data) { + struct sway_xdg_surface_v6 *sway_surface = + wl_container_of(listener, sway_surface, map); + struct sway_view *view = sway_surface->view; + + sway_surface->view->surface = view->wlr_xdg_surface_v6->surface; + + container_view_destroy(view->swayc); + + struct sway_seat *seat = input_manager_current_seat(input_manager); + struct sway_container *focus = sway_seat_get_focus_inactive(seat, &root_container); + struct sway_container *cont = container_view_create(focus, view); + view->swayc = cont; + arrange_windows(cont->parent, -1, -1); + sway_input_manager_set_focus(input_manager, cont); + + view_damage_whole(sway_surface->view); +} + static void handle_destroy(struct wl_listener *listener, void *data) { struct sway_xdg_surface_v6 *sway_xdg_surface = wl_container_of(listener, sway_xdg_surface, destroy); @@ -122,7 +150,6 @@ void handle_xdg_shell_v6_surface(struct wl_listener *listener, void *data) { sway_view->iface.close = close; sway_view->wlr_xdg_surface_v6 = xdg_surface; sway_view->sway_xdg_surface_v6 = sway_surface; - sway_view->surface = xdg_surface->surface; sway_surface->view = sway_view; // TODO: @@ -133,15 +160,12 @@ void handle_xdg_shell_v6_surface(struct wl_listener *listener, void *data) { sway_surface->commit.notify = handle_commit; wl_signal_add(&xdg_surface->surface->events.commit, &sway_surface->commit); - sway_surface->destroy.notify = handle_destroy; - wl_signal_add(&xdg_surface->events.destroy, &sway_surface->destroy); - - struct sway_seat *seat = input_manager_current_seat(input_manager); - struct sway_container *focus = sway_seat_get_focus_inactive(seat, &root_container); - struct sway_container *cont = container_view_create(focus, sway_view); - sway_view->swayc = cont; + sway_surface->map.notify = handle_map; + wl_signal_add(&xdg_surface->events.map, &sway_surface->map); - arrange_windows(cont->parent, -1, -1); + sway_surface->unmap.notify = handle_unmap; + wl_signal_add(&xdg_surface->events.unmap, &sway_surface->unmap); - sway_input_manager_set_focus(input_manager, cont); + sway_surface->destroy.notify = handle_destroy; + wl_signal_add(&xdg_surface->events.destroy, &sway_surface->destroy); } diff --git a/sway/desktop/xwayland.c b/sway/desktop/xwayland.c index 79c675a0..01c993b3 100644 --- a/sway/desktop/xwayland.c +++ b/sway/desktop/xwayland.c @@ -127,7 +127,6 @@ static void handle_unmap(struct wl_listener *listener, void *data) { } static void handle_map(struct wl_listener *listener, void *data) { - // TODO put the view back into the tree struct sway_xwayland_surface *sway_surface = wl_container_of(listener, sway_surface, map); struct wlr_xwayland_surface *xsurface = data; @@ -193,7 +192,6 @@ void handle_xwayland_surface(struct wl_listener *listener, void *data) { sway_view->iface.close = close_view; sway_view->wlr_xwayland_surface = xsurface; sway_view->sway_xwayland_surface = sway_surface; - sway_view->surface = xsurface->surface; sway_surface->view = sway_view; wl_list_init(&sway_view->unmanaged_view_link); -- cgit v1.2.3