/*
 * This an unstable interface of wlroots. No guarantees are made regarding the
 * future consistency of this API.
 */
#ifndef WLR_USE_UNSTABLE
#error "Add -DWLR_USE_UNSTABLE to enable unstable wlroots features"
#endif

#ifndef WLR_TYPES_WLR_SWITCH_H
#define WLR_TYPES_WLR_SWITCH_H

#include <stdint.h>
#include <wayland-server-core.h>
#include <wlr/types/wlr_input_device.h>

struct wlr_switch_impl;

/**
 * A switch input device. Typically a switch input device can indicate whether
 * a laptop lid is opened or closed, or whether tablet mode is enabled.
 *
 * See https://wayland.freedesktop.org/libinput/doc/latest/switches.html
 */
struct wlr_switch {
	struct wlr_input_device base;

	const struct wlr_switch_impl *impl;

	struct {
		struct wl_signal toggle; // struct wlr_switch_toggle_event
	} events;

	void *data;
};

enum wlr_switch_type {
	WLR_SWITCH_TYPE_LID,
	WLR_SWITCH_TYPE_TABLET_MODE,
};

enum wlr_switch_state {
	WLR_SWITCH_STATE_OFF = 0,
	WLR_SWITCH_STATE_ON,
};

struct wlr_switch_toggle_event {
	uint32_t time_msec;
	enum wlr_switch_type switch_type;
	enum wlr_switch_state switch_state;
};

/**
 * Get a struct wlr_switch from a struct wlr_input_device.
 *
 * Asserts that the input device is a switch.
 */
struct wlr_switch *wlr_switch_from_input_device(
	struct wlr_input_device *input_device);

#endif
