diff options
author | Drew DeVault <sir@cmpwn.com> | 2017-09-28 19:06:41 -0400 |
---|---|---|
committer | Drew DeVault <sir@cmpwn.com> | 2017-09-28 19:06:41 -0400 |
commit | 033036712ade73a872f1034ddb47235be11a74aa (patch) | |
tree | ecae511da6a408177369858ac43d200bae427472 /rootston/xwayland.c | |
parent | 2850a9360b23eaf27f6437a889b13bdcbe506863 (diff) | |
parent | e4ad534ab41b01a08b6b4f19aa47805f6040f7b4 (diff) |
Merge branch 'rootston'
Diffstat (limited to 'rootston/xwayland.c')
-rw-r--r-- | rootston/xwayland.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/rootston/xwayland.c b/rootston/xwayland.c new file mode 100644 index 00000000..88965f0d --- /dev/null +++ b/rootston/xwayland.c @@ -0,0 +1,49 @@ +#include <assert.h> +#include <stdlib.h> +#include <stdbool.h> +#include <wayland-server.h> +#include <wlr/types/wlr_box.h> +#include <wlr/types/wlr_surface.h> +#include <wlr/xwayland.h> +#include <wlr/util/log.h> +#include "rootston/desktop.h" +#include "rootston/server.h" + +static void handle_destroy(struct wl_listener *listener, void *data) { + struct roots_xwayland_surface *roots_surface = + wl_container_of(listener, roots_surface, destroy); + wl_list_remove(&roots_surface->destroy.link); + view_destroy(roots_surface->view); + free(roots_surface); +} + +static void x11_activate(struct roots_view *view, bool active) { + wlr_xwayland_surface_activate(view->desktop->xwayland, + view->xwayland_surface); +} + +void handle_xwayland_surface(struct wl_listener *listener, void *data) { + struct roots_desktop *desktop = + wl_container_of(listener, desktop, xwayland_surface); + + struct wlr_xwayland_surface *surface = data; + // TODO: get and log title, class, etc + wlr_log(L_DEBUG, "new xwayland surface"); + + struct roots_xwayland_surface *roots_surface = + calloc(1, sizeof(struct roots_xwayland_surface)); + wl_list_init(&roots_surface->destroy.link); + roots_surface->destroy.notify = handle_destroy; + wl_signal_add(&surface->events.destroy, &roots_surface->destroy); + + struct roots_view *view = calloc(1, sizeof(struct roots_view)); + view->type = ROOTS_XWAYLAND_VIEW; + view->x = view->y = 200; + view->xwayland_surface = surface; + view->roots_xwayland_surface = roots_surface; + view->wlr_surface = surface->surface; + view->desktop = desktop; + view->activate = x11_activate; + roots_surface->view = view; + wl_list_insert(&desktop->views, &view->link); +} |