Documentation for <wlr/xwayland/xwayland.h>

Back to index

Table of contents

struct wlr_xwayland

struct wlr_xwayland {
	struct wlr_xwayland_server *server;
	bool own_server;
	struct wlr_xwm *xwm;
	struct wlr_xwayland_shell_v1 *shell_v1;
	struct wlr_xwayland_cursor *cursor;
	
	const char *display_name;
	
	struct wl_display *wl_display;
	struct wlr_compositor *compositor;
	struct wlr_seat *seat;
	
	struct {
		struct wl_signal ready;
		struct wl_signal new_surface; // struct wlr_xwayland_surface
		struct wl_signal remove_startup_info; // struct wlr_xwayland_remove_startup_info_event
	} events;
	
	/**
	 * Add a custom event handler to xwayland. Return 1 if the event was
	 * handled or 0 to use the default wlr-xwayland handler. wlr-xwayland will
	 * free the event.
	 */
	int (*user_event_handler)(​struct wlr_xwm *xwm, xcb_generic_event_t *event);
	
	struct wl_listener server_start;
	struct wl_listener server_ready;
	struct wl_listener server_destroy;
	struct wl_listener seat_destroy;
	struct wl_listener shell_destroy;
	
	void *data;
};

wlr_xwayland_create()

struct wlr_xwayland *wlr_xwayland_create(​struct wl_display *wl_display, struct wlr_compositor *compositor, bool lazy);

Create an Xwayland server and XWM.

The server supports a lazy mode in which Xwayland is only started when a client tries to connect.

wlr_xwayland_create_with_server()

struct wlr_xwayland *wlr_xwayland_create_with_server(​struct wl_display *display, struct wlr_compositor *compositor, struct wlr_xwayland_server *server);

Create an XWM from an existing Xwayland server.

wlr_xwayland_destroy()

void wlr_xwayland_destroy(​struct wlr_xwayland *wlr_xwayland);

wlr_xwayland_icccm_input_model()

enum wlr_xwayland_icccm_input_model wlr_xwayland_icccm_input_model(​const struct wlr_xwayland_surface *xsurface);

enum wlr_xwayland_icccm_input_model

enum wlr_xwayland_icccm_input_model {
	WLR_ICCCM_INPUT_MODEL_NONE,
	WLR_ICCCM_INPUT_MODEL_PASSIVE,
	WLR_ICCCM_INPUT_MODEL_LOCAL,
	WLR_ICCCM_INPUT_MODEL_GLOBAL,
};

This represents the input focus described as follows:

https://www.x.org/releases/X11R7.6/doc/xorg-docs/specs/ICCCM/icccm.html#input_focus

struct wlr_xwayland_minimize_event

struct wlr_xwayland_minimize_event {
	struct wlr_xwayland_surface *surface;
	bool minimize;
};

wlr_xwayland_or_surface_wants_focus()

bool wlr_xwayland_or_surface_wants_focus(​const struct wlr_xwayland_surface *xsurface);

struct wlr_xwayland_remove_startup_info_event

struct wlr_xwayland_remove_startup_info_event {
	const char *id;
	xcb_window_t window;
};

struct wlr_xwayland_resize_event

struct wlr_xwayland_resize_event {
	struct wlr_xwayland_surface *surface;
	uint32_t edges;
};

wlr_xwayland_set_cursor()

void wlr_xwayland_set_cursor(​struct wlr_xwayland *wlr_xwayland, uint8_t *pixels, uint32_t stride, uint32_t width, uint32_t height, int32_t hotspot_x, int32_t hotspot_y);

wlr_xwayland_set_seat()

void wlr_xwayland_set_seat(​struct wlr_xwayland *xwayland, struct wlr_seat *seat);

wlr_xwayland_set_workareas()

void wlr_xwayland_set_workareas(​struct wlr_xwayland *wlr_xwayland, const struct wlr_box *workareas, size_t num_workareas);

Sets the _NET_WORKAREA root window property. The compositor should set one workarea per virtual desktop. This indicates the usable geometry (relative to the virtual desktop viewport) that is not covered by panels, docks, etc. Unfortunately, it is not possible to specify per-output workareas.

struct wlr_xwayland_surface

struct wlr_xwayland_surface {
	xcb_window_t window_id;
	struct wlr_xwm *xwm;
	uint32_t surface_id;
	uint64_t serial;
	
	struct wl_list link;
	struct wl_list stack_link;
	struct wl_list unpaired_link;
	
	struct wlr_surface *surface;
	struct wlr_addon surface_addon;
	struct wl_listener surface_commit;
	struct wl_listener surface_map;
	struct wl_listener surface_unmap;
	
	int16_t x, y;
	uint16_t width, height;
	uint16_t saved_width, saved_height;
	bool override_redirect;
	
	char *title;
	char *class;
	char *instance;
	char *role;
	char *startup_id;
	pid_t pid;
	bool has_utf8_title;
	
	struct wl_list children; // wlr_xwayland_surface.parent_link
	struct wlr_xwayland_surface *parent;
	struct wl_list parent_link; // wlr_xwayland_surface.children
	
	xcb_atom_t *window_type;
	size_t window_type_len;
	
	xcb_atom_t *protocols;
	size_t protocols_len;
	
	uint32_t decorations;
	xcb_icccm_wm_hints_t *hints;
	xcb_size_hints_t *size_hints;
	/*
	 * _NET_WM_STRUT_PARTIAL (used by e.g. XWayland panels).
	 * Note that right/bottom values are offsets from the lower
	 * right corner of the X11 screen, and the exact relation
	 * between X11 screen coordinates and the wlr_output_layout
	 * depends on the XWayland implementation.
	 */
	xcb_ewmh_wm_strut_partial_t *strut_partial;
	
	bool pinging;
	struct wl_event_source *ping_timer;
	
	// _NET_WM_STATE
	 bool modal;
	bool fullscreen;
	bool maximized_vert, maximized_horz;
	bool minimized;
	bool withdrawn;
	
	bool has_alpha;
	
	struct {
		struct wl_signal destroy;
		struct wl_signal request_configure; // struct wlr_xwayland_surface_configure_event
		struct wl_signal request_move;
		struct wl_signal request_resize; // struct wlr_xwayland_resize_event
		struct wl_signal request_minimize; // struct wlr_xwayland_minimize_event
		struct wl_signal request_maximize;
		struct wl_signal request_fullscreen;
		struct wl_signal request_activate;
		
		struct wl_signal associate;
		struct wl_signal dissociate;
		
		struct wl_signal set_title;
		struct wl_signal set_class;
		struct wl_signal set_role;
		struct wl_signal set_parent;
		struct wl_signal set_startup_id;
		struct wl_signal set_window_type;
		struct wl_signal set_hints;
		struct wl_signal set_decorations;
		struct wl_signal set_strut_partial;
		struct wl_signal set_override_redirect;
		struct wl_signal set_geometry;
		struct wl_signal ping_timeout;
	} events;
	
	void *data;
};

An Xwayland user interface component. It has an absolute position in layout-local coordinates.

The inner struct wlr_surface is valid once the associate event is emitted. Compositors can set up e.g. map and unmap listeners at this point. The struct wlr_surface becomes invalid when the dissociate event is emitted.

wlr_xwayland_surface_activate()

void wlr_xwayland_surface_activate(​struct wlr_xwayland_surface *surface, bool activated);

wlr_xwayland_surface_close()

void wlr_xwayland_surface_close(​struct wlr_xwayland_surface *surface);

wlr_xwayland_surface_configure()

void wlr_xwayland_surface_configure(​struct wlr_xwayland_surface *surface, int16_t x, int16_t y, uint16_t width, uint16_t height);

struct wlr_xwayland_surface_configure_event

struct wlr_xwayland_surface_configure_event {
	struct wlr_xwayland_surface *surface;
	int16_t x, y;
	uint16_t width, height;
	uint16_t mask; // xcb_config_window_t
};

enum wlr_xwayland_surface_decorations

enum wlr_xwayland_surface_decorations {
	WLR_XWAYLAND_SURFACE_DECORATIONS_ALL,
	WLR_XWAYLAND_SURFACE_DECORATIONS_NO_BORDER,
	WLR_XWAYLAND_SURFACE_DECORATIONS_NO_TITLE,
};

wlr_xwayland_surface_ping()

void wlr_xwayland_surface_ping(​struct wlr_xwayland_surface *surface);

wlr_xwayland_surface_restack()

void wlr_xwayland_surface_restack(​struct wlr_xwayland_surface *surface, struct wlr_xwayland_surface *sibling, enum xcb_stack_mode_t mode);

Restack surface relative to sibling. If sibling is NULL, then the surface is moved to the top or the bottom of the stack (depending on the mode).

wlr_xwayland_surface_set_fullscreen()

void wlr_xwayland_surface_set_fullscreen(​struct wlr_xwayland_surface *surface, bool fullscreen);

wlr_xwayland_surface_set_maximized()

void wlr_xwayland_surface_set_maximized(​struct wlr_xwayland_surface *surface, bool maximized);

wlr_xwayland_surface_set_minimized()

void wlr_xwayland_surface_set_minimized(​struct wlr_xwayland_surface *surface, bool minimized);

wlr_xwayland_surface_set_withdrawn()

void wlr_xwayland_surface_set_withdrawn(​struct wlr_xwayland_surface *surface, bool withdrawn);

wlr_xwayland_surface_try_from_wlr_surface()

struct wlr_xwayland_surface *wlr_xwayland_surface_try_from_wlr_surface(​struct wlr_surface *surface);

Get a struct wlr_xwayland_surface from a struct wlr_surface.

If the surface hasn't been created by Xwayland or has no X11 window associated, NULL is returned.

struct wlr_xwm

struct wlr_xwm;