diff options
author | emersion <contact@emersion.fr> | 2017-11-20 21:15:58 +0100 |
---|---|---|
committer | emersion <contact@emersion.fr> | 2017-11-20 21:15:58 +0100 |
commit | 151901123f0f59d0a05b5494e91d5425c99e6b1a (patch) | |
tree | 3c4f5cdb49dee27867fca017a89ff54262011822 /rootston/xwayland.c | |
parent | 016744ef4d2692c800d613e40fbf5d6267fab2e9 (diff) | |
parent | becd75fd2ebd31fec9fdcf9cc2f37c5957d31b37 (diff) |
Merge branch 'master' into refactor-wlr-list
Diffstat (limited to 'rootston/xwayland.c')
-rw-r--r-- | rootston/xwayland.c | 22 |
1 files changed, 10 insertions, 12 deletions
diff --git a/rootston/xwayland.c b/rootston/xwayland.c index f4e100dc..dfa602b1 100644 --- a/rootston/xwayland.c +++ b/rootston/xwayland.c @@ -95,7 +95,8 @@ static void maximize(struct roots_view *view, bool maximized) { static void handle_destroy(struct wl_listener *listener, void *data) { struct roots_xwayland_surface *roots_surface = wl_container_of(listener, roots_surface, destroy); - view_teardown(roots_surface->view); + struct wlr_xwayland_surface *xwayland_surface = + roots_surface->view->xwayland_surface; wl_list_remove(&roots_surface->destroy.link); wl_list_remove(&roots_surface->request_configure.link); wl_list_remove(&roots_surface->request_move.link); @@ -103,6 +104,9 @@ static void handle_destroy(struct wl_listener *listener, void *data) { wl_list_remove(&roots_surface->request_maximize.link); wl_list_remove(&roots_surface->map_notify.link); wl_list_remove(&roots_surface->unmap_notify.link); + if (xwayland_surface->mapped) { + wl_list_remove(&roots_surface->view->link); + } view_destroy(roots_surface->view); free(roots_surface); } @@ -174,29 +178,23 @@ static void handle_request_maximize(struct wl_listener *listener, void *data) { static void handle_map_notify(struct wl_listener *listener, void *data) { struct roots_xwayland_surface *roots_surface = wl_container_of(listener, roots_surface, map_notify); + struct wlr_xwayland_surface *xsurface = data; struct roots_view *view = roots_surface->view; - struct wlr_xwayland_surface *xsurface = view->xwayland_surface; struct roots_desktop *desktop = view->desktop; view->wlr_surface = xsurface->surface; view->x = (double)xsurface->x; view->y = (double)xsurface->y; - wlr_list_push(desktop->views, roots_surface->view); + wl_list_insert(&desktop->views, &view->link); } static void handle_unmap_notify(struct wl_listener *listener, void *data) { struct roots_xwayland_surface *roots_surface = wl_container_of(listener, roots_surface, unmap_notify); - struct roots_desktop *desktop = roots_surface->view->desktop; roots_surface->view->wlr_surface = NULL; - for (size_t i = 0; i < desktop->views->length; i++) { - if (desktop->views->items[i] == roots_surface->view) { - wlr_list_del(desktop->views, i); - break; - } - } + wl_list_remove(&roots_surface->view->link); } void handle_xwayland_surface(struct wl_listener *listener, void *data) { @@ -242,7 +240,6 @@ void handle_xwayland_surface(struct wl_listener *listener, void *data) { view->xwayland_surface = surface; view->roots_xwayland_surface = roots_surface; view->wlr_surface = surface->surface; - view->desktop = desktop; view->activate = activate; view->resize = resize; view->move = move; @@ -250,7 +247,8 @@ void handle_xwayland_surface(struct wl_listener *listener, void *data) { view->maximize = maximize; view->close = close; roots_surface->view = view; - wlr_list_add(desktop->views, view); + view_init(view, desktop); + wl_list_insert(&desktop->views, &view->link); if (!surface->override_redirect) { view_setup(view); |