2019-01-04 20:23:01 +01:00
|
|
|
#ifndef CG_XWAYLAND_H
|
|
|
|
|
#define CG_XWAYLAND_H
|
2018-12-31 17:24:21 +01:00
|
|
|
|
2019-12-20 17:16:53 +01:00
|
|
|
#include <wayland-server-core.h>
|
2019-01-30 17:01:16 +01:00
|
|
|
#include <wlr/xwayland.h>
|
2018-12-31 17:24:21 +01:00
|
|
|
|
2019-01-30 17:01:16 +01:00
|
|
|
#include "view.h"
|
|
|
|
|
|
|
|
|
|
struct cg_xwayland_view {
|
|
|
|
|
struct cg_view view;
|
|
|
|
|
struct wlr_xwayland_surface *xwayland_surface;
|
|
|
|
|
|
2019-01-30 17:19:40 +01:00
|
|
|
/* Some applications that aren't yet Wayland-native or
|
|
|
|
|
otherwise "special" (e.g. Firefox Nightly and Google
|
|
|
|
|
Chrome/Chromium) spawn an XWayland surface upon startup
|
|
|
|
|
that is almost immediately closed again. This makes Cage
|
|
|
|
|
think there are no views left, which results in it
|
|
|
|
|
exiting. However, after this initial (unmapped) surface,
|
|
|
|
|
the "real" application surface is opened. This leads to
|
|
|
|
|
these applications' startup sequences being interrupted by
|
|
|
|
|
Cage exiting. Hence, to work around this issue, Cage checks
|
|
|
|
|
whether an XWayland surface has ever been mapped and exits
|
|
|
|
|
only if 1) the XWayland surface has ever been mapped and 2)
|
|
|
|
|
this was the last surface Cage manages. */
|
|
|
|
|
bool ever_been_mapped;
|
|
|
|
|
|
2019-01-30 17:01:16 +01:00
|
|
|
struct wl_listener destroy;
|
|
|
|
|
struct wl_listener unmap;
|
|
|
|
|
struct wl_listener map;
|
2019-01-20 13:42:36 +01:00
|
|
|
struct wl_listener commit;
|
2019-02-14 11:38:29 +01:00
|
|
|
struct wl_listener request_fullscreen;
|
2019-01-30 17:01:16 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct cg_xwayland_view *xwayland_view_from_view(struct cg_view *view);
|
2019-01-31 18:29:03 +01:00
|
|
|
bool xwayland_view_should_manage(struct cg_view *view);
|
2018-12-31 17:24:21 +01:00
|
|
|
void handle_xwayland_surface_new(struct wl_listener *listener, void *data);
|
|
|
|
|
|
|
|
|
|
#endif
|