Documentation for <wlr/backend/session.h>

Back to index

Table of contents

struct wlr_device

struct wlr_device {
	int fd;
	int device_id;
	dev_t dev;
	struct wl_list link; // wlr_session.devices
	
	struct {
		struct wl_signal change; // struct wlr_device_change_event
		struct wl_signal remove;
	} events;
};

An opened physical device.

struct wlr_device_change_event

struct wlr_device_change_event {
	enum wlr_device_change_type type;
	union {
		struct wlr_device_hotplug_event hotplug;
	} ;
};

enum wlr_device_change_type

enum wlr_device_change_type {
	WLR_DEVICE_HOTPLUG,
	WLR_DEVICE_LEASE,
};

struct wlr_device_hotplug_event

struct wlr_device_hotplug_event {
	uint32_t connector_id;
	uint32_t prop_id;
};

struct wlr_session

struct wlr_session {
	/*
	 * Signal for when the session becomes active/inactive.
	 * It's called when we swap virtual terminal.
	 */
	 bool active;
	
	/*
	 * 0 if virtual terminals are not supported
	 * i.e. seat != "seat0"
	 */
	unsigned vtnr;
	char seat[];
	
	struct udev *udev;
	struct udev_monitor *mon;
	struct wl_event_source *udev_event;
	
	struct libseat *seat_handle;
	struct wl_event_source *libseat_event;
	
	struct wl_list devices; // wlr_device.link
	
	struct wl_event_loop *event_loop;
	
	struct {
		struct wl_signal active;
		struct wl_signal add_drm_card; // struct wlr_session_add_event
		struct wl_signal destroy;
	} events;
	
	struct {
		struct wl_listener event_loop_destroy;
	} WLR_PRIVATE;
};

A session manages access to physical devices (such as GPUs and input devices).

A session is only required when running on bare metal (e.g. with the KMS or libinput backends).

The session listens for device hotplug events, and relays that information via the add_drm_card event and the change/remove events on struct wlr_device. The session provides functions to gain access to physical device (which is a privileged operation), see wlr_session_open_file(). The session also keeps track of the virtual terminal state (allowing users to switch between compositors or TTYs), see wlr_session_change_vt() and the active event.

struct wlr_session_add_event

struct wlr_session_add_event {
	const char *path;
};

wlr_session_change_vt()

bool wlr_session_change_vt(​struct wlr_session *session, unsigned vt);

wlr_session_close_file()

void wlr_session_close_file(​struct wlr_session *session, struct wlr_device *device);

wlr_session_create()

struct wlr_session *wlr_session_create(​struct wl_event_loop *loop);

wlr_session_destroy()

void wlr_session_destroy(​struct wlr_session *session);

wlr_session_find_gpus()

ssize_t wlr_session_find_gpus(​struct wlr_session *session, size_t ret_len, struct wlr_device **ret);

Enumerate and open KMS devices.

ret is filled with up to ret_len devices. The number of devices ret has been filled with is returned on success. If more devices than ret_len are probed, the extraneous ones are ignored. If there is no KMS device, the function will block until such device is detected up to a timeout. The first device returned is the default device (marked as "boot_vga" by the kernel).

On error, or if no device was found, -1 is returned.

wlr_session_open_file()

struct wlr_device *wlr_session_open_file(​struct wlr_session *session, const char *path);