Fix xwayland unmanaged surfaces

This commit is contained in:
emersion 2018-04-05 17:08:30 -04:00
parent f5e5b1819b
commit 7ce1038478
No known key found for this signature in database
GPG key ID: 0FDE7BE0E88F5E48
4 changed files with 57 additions and 16 deletions

View file

@ -87,6 +87,9 @@ struct sway_xwayland_unmanaged {
struct wlr_xwayland_surface *wlr_xwayland_surface; struct wlr_xwayland_surface *wlr_xwayland_surface;
struct wl_list link; struct wl_list link;
struct wl_listener commit;
struct wl_listener map;
struct wl_listener unmap;
struct wl_listener destroy; struct wl_listener destroy;
}; };

View file

@ -68,6 +68,7 @@ static const struct sway_view_impl view_impl = {
.get_prop = get_prop, .get_prop = get_prop,
.configure = configure, .configure = configure,
.close = _close, .close = _close,
.destroy = destroy,
}; };
static void handle_commit(struct wl_listener *listener, void *data) { static void handle_commit(struct wl_listener *listener, void *data) {

View file

@ -147,6 +147,7 @@ static const struct sway_view_impl view_impl = {
.configure = configure, .configure = configure,
.set_activated = set_activated, .set_activated = set_activated,
.close = _close, .close = _close,
.destroy = destroy,
}; };
static void handle_commit(struct wl_listener *listener, void *data) { static void handle_commit(struct wl_listener *listener, void *data) {

View file

@ -14,32 +14,67 @@
#include "sway/input/input-manager.h" #include "sway/input/input-manager.h"
#include "log.h" #include "log.h"
static void unmanaged_handle_destroy(struct wl_listener *listener, void *data) { static void unmanaged_handle_commit(struct wl_listener *listener, void *data) {
struct sway_xwayland_unmanaged *sway_surface = struct sway_xwayland_unmanaged *surface =
wl_container_of(listener, sway_surface, destroy); wl_container_of(listener, surface, commit);
wl_list_remove(&sway_surface->destroy.link);
wl_list_remove(&sway_surface->link);
free(sway_surface);
}
static void create_unmanaged(struct wlr_xwayland_surface *xsurface) {
struct sway_xwayland_unmanaged *sway_surface =
calloc(1, sizeof(struct sway_xwayland_unmanaged));
if (!sway_assert(sway_surface, "Failed to allocate surface")) {
return;
}
sway_surface->wlr_xwayland_surface = xsurface;
wl_signal_add(&xsurface->events.destroy, &sway_surface->destroy);
sway_surface->destroy.notify = unmanaged_handle_destroy;
wl_list_insert(&root_container.sway_root->xwayland_unmanaged,
&sway_surface->link);
// TODO: damage tracking // TODO: damage tracking
} }
static void unmanaged_handle_map(struct wl_listener *listener, void *data) {
struct sway_xwayland_unmanaged *surface =
wl_container_of(listener, surface, map);
struct wlr_xwayland_surface *xsurface = surface->wlr_xwayland_surface;
wl_list_insert(&root_container.sway_root->xwayland_unmanaged,
&surface->link);
wl_signal_add(&xsurface->surface->events.commit, &surface->commit);
surface->commit.notify = unmanaged_handle_commit;
// TODO: damage tracking
}
static void unmanaged_handle_unmap(struct wl_listener *listener, void *data) {
struct sway_xwayland_unmanaged *surface =
wl_container_of(listener, surface, unmap);
wl_list_remove(&surface->link);
wl_list_remove(&surface->commit.link);
// TODO: damage tracking
}
static void unmanaged_handle_destroy(struct wl_listener *listener, void *data) {
struct sway_xwayland_unmanaged *surface =
wl_container_of(listener, surface, destroy);
struct wlr_xwayland_surface *xsurface = surface->wlr_xwayland_surface;
if (xsurface->mapped) {
unmanaged_handle_unmap(&surface->unmap, xsurface);
}
wl_list_remove(&surface->map.link);
wl_list_remove(&surface->unmap.link);
wl_list_remove(&surface->destroy.link);
free(surface);
}
static struct sway_xwayland_unmanaged *create_unmanaged(
struct wlr_xwayland_surface *xsurface) {
struct sway_xwayland_unmanaged *surface =
calloc(1, sizeof(struct sway_xwayland_unmanaged));
if (surface == NULL) {
wlr_log(L_ERROR, "Allocation failed");
return NULL;
}
surface->wlr_xwayland_surface = xsurface;
wl_signal_add(&xsurface->events.map, &surface->map);
surface->map.notify = unmanaged_handle_map;
wl_signal_add(&xsurface->events.unmap, &surface->unmap);
surface->unmap.notify = unmanaged_handle_unmap;
wl_signal_add(&xsurface->events.destroy, &surface->destroy);
surface->destroy.notify = unmanaged_handle_destroy;
unmanaged_handle_map(&surface->map, xsurface);
return surface;
}
static struct sway_xwayland_view *xwayland_view_from_view( static struct sway_xwayland_view *xwayland_view_from_view(
struct sway_view *view) { struct sway_view *view) {
@ -127,6 +162,7 @@ static const struct sway_view_impl view_impl = {
.configure = configure, .configure = configure,
.set_activated = set_activated, .set_activated = set_activated,
.close = _close, .close = _close,
.destroy = destroy,
}; };
static void handle_commit(struct wl_listener *listener, void *data) { static void handle_commit(struct wl_listener *listener, void *data) {