/* Generated by wayland-scanner 1.26.0 */

#ifndef TEXT_INPUT_UNSTABLE_V3_SERVER_PROTOCOL_H
#define TEXT_INPUT_UNSTABLE_V3_SERVER_PROTOCOL_H

#include <stdint.h>
#include <stddef.h>
#include "wayland-server.h"

#ifdef  __cplusplus
extern "C" {
#endif

struct wl_client;
struct wl_resource;

/**
 * @page page_text_input_unstable_v3 The text_input_unstable_v3 protocol
 * Protocol for composing text
 *
 * @section page_desc_text_input_unstable_v3 Description
 *
 * This protocol allows compositors to act as input methods and to send text
 * to applications. A text input object is used to manage state of what are
 * typically text entry fields in the application.
 *
 * This document adheres to the RFC 2119 when using words like "must",
 * "should", "may", etc.
 *
 * Warning! The protocol described in this file is experimental and
 * backward incompatible changes may be made. Backward compatible changes
 * may be added together with the corresponding interface version bump.
 * Backward incompatible changes are done by bumping the version number in
 * the protocol and interface names and resetting the interface version.
 * Once the protocol is to be declared stable, the 'z' prefix and the
 * version number in the protocol and interface names are removed and the
 * interface version number is reset.
 *
 * @section page_ifaces_text_input_unstable_v3 Interfaces
 * - @subpage page_iface_zwp_text_input_v3 - text input
 * - @subpage page_iface_zwp_text_input_manager_v3 - text input manager
 * @section page_copyright_text_input_unstable_v3 Copyright
 * <pre>
 *
 * Copyright © 2012, 2013 Intel Corporation
 * Copyright © 2015, 2016 Jan Arne Petersen
 * Copyright © 2017, 2018 Red Hat, Inc.
 * Copyright © 2018       Purism SPC
 *
 * Permission to use, copy, modify, distribute, and sell this
 * software and its documentation for any purpose is hereby granted
 * without fee, provided that the above copyright notice appear in
 * all copies and that both that copyright notice and this permission
 * notice appear in supporting documentation, and that the name of
 * the copyright holders not be used in advertising or publicity
 * pertaining to distribution of the software without specific,
 * written prior permission.  The copyright holders make no
 * representations about the suitability of this software for any
 * purpose.  It is provided "as is" without express or implied
 * warranty.
 *
 * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
 * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
 * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
 * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
 * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
 * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
 * THIS SOFTWARE.
 * </pre>
 */
struct wl_seat;
struct wl_surface;
struct zwp_text_input_manager_v3;
struct zwp_text_input_v3;

#ifndef ZWP_TEXT_INPUT_V3_INTERFACE
#define ZWP_TEXT_INPUT_V3_INTERFACE
/**
 * @page page_iface_zwp_text_input_v3 zwp_text_input_v3
 * @section page_iface_zwp_text_input_v3_desc Description
 *
 * The zwp_text_input_v3 interface represents text input and input methods
 * associated with a seat. It provides enter/leave events to follow the
 * text input focus for a seat.
 *
 * Requests are used to enable/disable the text-input object and set
 * state information like surrounding and selected text or the content type.
 * The information about the entered text is sent to the text-input object
 * via the preedit_string and commit_string events.
 *
 * Text is valid UTF-8 encoded, indices and lengths are in bytes. Indices
 * must not point to middle bytes inside a code point: they must either
 * point to the first byte of a code point or to the end of the buffer.
 * Lengths must be measured between two valid indices.
 *
 * Focus moving throughout surfaces will result in the emission of
 * zwp_text_input_v3.enter and zwp_text_input_v3.leave events. The focused
 * surface must commit zwp_text_input_v3.enable and
 * zwp_text_input_v3.disable requests as the keyboard focus moves across
 * editable and non-editable elements of the UI. Those two requests are not
 * expected to be paired with each other, the compositor must be able to
 * handle consecutive series of the same request.
 *
 * State is sent by the state requests (set_surrounding_text,
 * set_content_type and set_cursor_rectangle) and a commit request. After an
 * enter event or disable request all state information is invalidated and
 * needs to be resent by the client.
 * @section page_iface_zwp_text_input_v3_api API
 * See @ref iface_zwp_text_input_v3.
 */
/**
 * @defgroup iface_zwp_text_input_v3 The zwp_text_input_v3 interface
 *
 * The zwp_text_input_v3 interface represents text input and input methods
 * associated with a seat. It provides enter/leave events to follow the
 * text input focus for a seat.
 *
 * Requests are used to enable/disable the text-input object and set
 * state information like surrounding and selected text or the content type.
 * The information about the entered text is sent to the text-input object
 * via the preedit_string and commit_string events.
 *
 * Text is valid UTF-8 encoded, indices and lengths are in bytes. Indices
 * must not point to middle bytes inside a code point: they must either
 * point to the first byte of a code point or to the end of the buffer.
 * Lengths must be measured between two valid indices.
 *
 * Focus moving throughout surfaces will result in the emission of
 * zwp_text_input_v3.enter and zwp_text_input_v3.leave events. The focused
 * surface must commit zwp_text_input_v3.enable and
 * zwp_text_input_v3.disable requests as the keyboard focus moves across
 * editable and non-editable elements of the UI. Those two requests are not
 * expected to be paired with each other, the compositor must be able to
 * handle consecutive series of the same request.
 *
 * State is sent by the state requests (set_surrounding_text,
 * set_content_type and set_cursor_rectangle) and a commit request. After an
 * enter event or disable request all state information is invalidated and
 * needs to be resent by the client.
 */
extern const struct wl_interface zwp_text_input_v3_interface;
#endif
#ifndef ZWP_TEXT_INPUT_MANAGER_V3_INTERFACE
#define ZWP_TEXT_INPUT_MANAGER_V3_INTERFACE
/**
 * @page page_iface_zwp_text_input_manager_v3 zwp_text_input_manager_v3
 * @section page_iface_zwp_text_input_manager_v3_desc Description
 *
 * A factory for text-input objects. This object is a global singleton.
 * @section page_iface_zwp_text_input_manager_v3_api API
 * See @ref iface_zwp_text_input_manager_v3.
 */
/**
 * @defgroup iface_zwp_text_input_manager_v3 The zwp_text_input_manager_v3 interface
 *
 * A factory for text-input objects. This object is a global singleton.
 */
extern const struct wl_interface zwp_text_input_manager_v3_interface;
#endif

#ifndef ZWP_TEXT_INPUT_V3_CHANGE_CAUSE_ENUM
#define ZWP_TEXT_INPUT_V3_CHANGE_CAUSE_ENUM
/**
 * @ingroup iface_zwp_text_input_v3
 * text change reason
 *
 * Reason for the change of surrounding text or cursor posision.
 */
enum zwp_text_input_v3_change_cause {
	/**
	 * input method caused the change
	 */
	ZWP_TEXT_INPUT_V3_CHANGE_CAUSE_INPUT_METHOD = 0,
	/**
	 * something else than the input method caused the change
	 */
	ZWP_TEXT_INPUT_V3_CHANGE_CAUSE_OTHER = 1,
};
#endif /* ZWP_TEXT_INPUT_V3_CHANGE_CAUSE_ENUM */

#ifndef ZWP_TEXT_INPUT_V3_CHANGE_CAUSE_ENUM_IS_VALID
#define ZWP_TEXT_INPUT_V3_CHANGE_CAUSE_ENUM_IS_VALID
/**
 * @ingroup iface_zwp_text_input_v3
 * Validate a zwp_text_input_v3 change_cause value.
 *
 * @return true on success, false on error.
 * @ref zwp_text_input_v3_change_cause
 */
static inline bool
zwp_text_input_v3_change_cause_is_valid(uint32_t value, uint32_t version) {
	switch (value) {
	case ZWP_TEXT_INPUT_V3_CHANGE_CAUSE_INPUT_METHOD:
		return version >= 1;
	case ZWP_TEXT_INPUT_V3_CHANGE_CAUSE_OTHER:
		return version >= 1;
	default:
		return false;
	}
}
#endif /* ZWP_TEXT_INPUT_V3_CHANGE_CAUSE_ENUM_IS_VALID */

#ifndef ZWP_TEXT_INPUT_V3_CONTENT_HINT_ENUM
#define ZWP_TEXT_INPUT_V3_CONTENT_HINT_ENUM
/**
 * @ingroup iface_zwp_text_input_v3
 * content hint
 *
 * Content hint is a bitmask to allow to modify the behavior of the text
 * input.
 */
enum zwp_text_input_v3_content_hint {
	/**
	 * no special behavior
	 */
	ZWP_TEXT_INPUT_V3_CONTENT_HINT_NONE = 0x0,
	/**
	 * suggest word completions
	 */
	ZWP_TEXT_INPUT_V3_CONTENT_HINT_COMPLETION = 0x1,
	/**
	 * suggest word corrections
	 */
	ZWP_TEXT_INPUT_V3_CONTENT_HINT_SPELLCHECK = 0x2,
	/**
	 * switch to uppercase letters at the start of a sentence
	 */
	ZWP_TEXT_INPUT_V3_CONTENT_HINT_AUTO_CAPITALIZATION = 0x4,
	/**
	 * prefer lowercase letters
	 */
	ZWP_TEXT_INPUT_V3_CONTENT_HINT_LOWERCASE = 0x8,
	/**
	 * prefer uppercase letters
	 */
	ZWP_TEXT_INPUT_V3_CONTENT_HINT_UPPERCASE = 0x10,
	/**
	 * prefer casing for titles and headings (can be language dependent)
	 */
	ZWP_TEXT_INPUT_V3_CONTENT_HINT_TITLECASE = 0x20,
	/**
	 * characters should be hidden
	 */
	ZWP_TEXT_INPUT_V3_CONTENT_HINT_HIDDEN_TEXT = 0x40,
	/**
	 * typed text should not be stored
	 */
	ZWP_TEXT_INPUT_V3_CONTENT_HINT_SENSITIVE_DATA = 0x80,
	/**
	 * just Latin characters should be entered
	 */
	ZWP_TEXT_INPUT_V3_CONTENT_HINT_LATIN = 0x100,
	/**
	 * the text input is multiline
	 */
	ZWP_TEXT_INPUT_V3_CONTENT_HINT_MULTILINE = 0x200,
	/**
	 * an on-screen way to fill in the input is already provided by the client
	 * @since 2
	 */
	ZWP_TEXT_INPUT_V3_CONTENT_HINT_ON_SCREEN_INPUT_PROVIDED = 0x400,
	/**
	 * prefer not offering emoji support
	 * @since 2
	 */
	ZWP_TEXT_INPUT_V3_CONTENT_HINT_NO_EMOJI = 0x800,
	/**
	 * the text input will display preedit text in place
	 * @since 2
	 */
	ZWP_TEXT_INPUT_V3_CONTENT_HINT_PREEDIT_SHOWN = 0x1000,
};
/**
 * @ingroup iface_zwp_text_input_v3
 */
#define ZWP_TEXT_INPUT_V3_CONTENT_HINT_ON_SCREEN_INPUT_PROVIDED_SINCE_VERSION 2
/**
 * @ingroup iface_zwp_text_input_v3
 */
#define ZWP_TEXT_INPUT_V3_CONTENT_HINT_NO_EMOJI_SINCE_VERSION 2
/**
 * @ingroup iface_zwp_text_input_v3
 */
#define ZWP_TEXT_INPUT_V3_CONTENT_HINT_PREEDIT_SHOWN_SINCE_VERSION 2
#endif /* ZWP_TEXT_INPUT_V3_CONTENT_HINT_ENUM */

#ifndef ZWP_TEXT_INPUT_V3_CONTENT_HINT_ENUM_IS_VALID
#define ZWP_TEXT_INPUT_V3_CONTENT_HINT_ENUM_IS_VALID
/**
 * @ingroup iface_zwp_text_input_v3
 * Validate a zwp_text_input_v3 content_hint value.
 *
 * @return true on success, false on error.
 * @ref zwp_text_input_v3_content_hint
 */
static inline bool
zwp_text_input_v3_content_hint_is_valid(uint32_t value, uint32_t version) {
	uint32_t valid = 0;
	if (version >= 1)
		valid |= ZWP_TEXT_INPUT_V3_CONTENT_HINT_NONE;
	if (version >= 1)
		valid |= ZWP_TEXT_INPUT_V3_CONTENT_HINT_COMPLETION;
	if (version >= 1)
		valid |= ZWP_TEXT_INPUT_V3_CONTENT_HINT_SPELLCHECK;
	if (version >= 1)
		valid |= ZWP_TEXT_INPUT_V3_CONTENT_HINT_AUTO_CAPITALIZATION;
	if (version >= 1)
		valid |= ZWP_TEXT_INPUT_V3_CONTENT_HINT_LOWERCASE;
	if (version >= 1)
		valid |= ZWP_TEXT_INPUT_V3_CONTENT_HINT_UPPERCASE;
	if (version >= 1)
		valid |= ZWP_TEXT_INPUT_V3_CONTENT_HINT_TITLECASE;
	if (version >= 1)
		valid |= ZWP_TEXT_INPUT_V3_CONTENT_HINT_HIDDEN_TEXT;
	if (version >= 1)
		valid |= ZWP_TEXT_INPUT_V3_CONTENT_HINT_SENSITIVE_DATA;
	if (version >= 1)
		valid |= ZWP_TEXT_INPUT_V3_CONTENT_HINT_LATIN;
	if (version >= 1)
		valid |= ZWP_TEXT_INPUT_V3_CONTENT_HINT_MULTILINE;
	if (version >= 2)
		valid |= ZWP_TEXT_INPUT_V3_CONTENT_HINT_ON_SCREEN_INPUT_PROVIDED;
	if (version >= 2)
		valid |= ZWP_TEXT_INPUT_V3_CONTENT_HINT_NO_EMOJI;
	if (version >= 2)
		valid |= ZWP_TEXT_INPUT_V3_CONTENT_HINT_PREEDIT_SHOWN;
	return (value & ~valid) == 0;
}
#endif /* ZWP_TEXT_INPUT_V3_CONTENT_HINT_ENUM_IS_VALID */

#ifndef ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_ENUM
#define ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_ENUM
/**
 * @ingroup iface_zwp_text_input_v3
 * content purpose
 *
 * The content purpose allows to specify the primary purpose of a text
 * input.
 *
 * This allows an input method to show special purpose input panels with
 * extra characters or to disallow some characters.
 */
enum zwp_text_input_v3_content_purpose {
	/**
	 * default input, allowing all characters
	 */
	ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_NORMAL = 0,
	/**
	 * allow only alphabetic characters
	 */
	ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_ALPHA = 1,
	/**
	 * allow only digits
	 */
	ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_DIGITS = 2,
	/**
	 * input a number (including decimal separator and sign)
	 */
	ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_NUMBER = 3,
	/**
	 * input a phone number
	 */
	ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_PHONE = 4,
	/**
	 * input an URL
	 */
	ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_URL = 5,
	/**
	 * input an email address
	 */
	ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_EMAIL = 6,
	/**
	 * input a name of a person
	 */
	ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_NAME = 7,
	/**
	 * input a password (combine with sensitive_data hint)
	 */
	ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_PASSWORD = 8,
	/**
	 * input is a numeric password (combine with sensitive_data hint)
	 */
	ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_PIN = 9,
	/**
	 * input a date
	 */
	ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_DATE = 10,
	/**
	 * input a time
	 */
	ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_TIME = 11,
	/**
	 * input a date and time
	 */
	ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_DATETIME = 12,
	/**
	 * input for a terminal
	 */
	ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_TERMINAL = 13,
};
#endif /* ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_ENUM */

#ifndef ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_ENUM_IS_VALID
#define ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_ENUM_IS_VALID
/**
 * @ingroup iface_zwp_text_input_v3
 * Validate a zwp_text_input_v3 content_purpose value.
 *
 * @return true on success, false on error.
 * @ref zwp_text_input_v3_content_purpose
 */
static inline bool
zwp_text_input_v3_content_purpose_is_valid(uint32_t value, uint32_t version) {
	switch (value) {
	case ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_NORMAL:
		return version >= 1;
	case ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_ALPHA:
		return version >= 1;
	case ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_DIGITS:
		return version >= 1;
	case ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_NUMBER:
		return version >= 1;
	case ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_PHONE:
		return version >= 1;
	case ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_URL:
		return version >= 1;
	case ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_EMAIL:
		return version >= 1;
	case ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_NAME:
		return version >= 1;
	case ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_PASSWORD:
		return version >= 1;
	case ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_PIN:
		return version >= 1;
	case ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_DATE:
		return version >= 1;
	case ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_TIME:
		return version >= 1;
	case ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_DATETIME:
		return version >= 1;
	case ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_TERMINAL:
		return version >= 1;
	default:
		return false;
	}
}
#endif /* ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_ENUM_IS_VALID */

#ifndef ZWP_TEXT_INPUT_V3_ERROR_ENUM
#define ZWP_TEXT_INPUT_V3_ERROR_ENUM
enum zwp_text_input_v3_error {
	/**
	 * an invalid or duplicate action was specified
	 */
	ZWP_TEXT_INPUT_V3_ERROR_INVALID_ACTION = 0,
};
#endif /* ZWP_TEXT_INPUT_V3_ERROR_ENUM */

#ifndef ZWP_TEXT_INPUT_V3_ERROR_ENUM_IS_VALID
#define ZWP_TEXT_INPUT_V3_ERROR_ENUM_IS_VALID
/**
 * @ingroup iface_zwp_text_input_v3
 * Validate a zwp_text_input_v3 error value.
 *
 * @return true on success, false on error.
 * @ref zwp_text_input_v3_error
 */
static inline bool
zwp_text_input_v3_error_is_valid(uint32_t value, uint32_t version) {
	switch (value) {
	case ZWP_TEXT_INPUT_V3_ERROR_INVALID_ACTION:
		return version >= 1;
	default:
		return false;
	}
}
#endif /* ZWP_TEXT_INPUT_V3_ERROR_ENUM_IS_VALID */

#ifndef ZWP_TEXT_INPUT_V3_ACTION_ENUM
#define ZWP_TEXT_INPUT_V3_ACTION_ENUM
/**
 * @ingroup iface_zwp_text_input_v3
 * action
 *
 * A possible action to perform on a text input.
 *
 * The submit action is intended for input entries that expect some sort of
 * activation after user interaction, e.g. the URL entry in a browser.
 */
enum zwp_text_input_v3_action {
	/**
	 * no action
	 */
	ZWP_TEXT_INPUT_V3_ACTION_NONE = 0,
	/**
	 * the action is submitted
	 */
	ZWP_TEXT_INPUT_V3_ACTION_SUBMIT = 1,
};
#endif /* ZWP_TEXT_INPUT_V3_ACTION_ENUM */

#ifndef ZWP_TEXT_INPUT_V3_ACTION_ENUM_IS_VALID
#define ZWP_TEXT_INPUT_V3_ACTION_ENUM_IS_VALID
/**
 * @ingroup iface_zwp_text_input_v3
 * Validate a zwp_text_input_v3 action value.
 *
 * @return true on success, false on error.
 * @ref zwp_text_input_v3_action
 */
static inline bool
zwp_text_input_v3_action_is_valid(uint32_t value, uint32_t version) {
	switch (value) {
	case ZWP_TEXT_INPUT_V3_ACTION_NONE:
		return version >= 1;
	case ZWP_TEXT_INPUT_V3_ACTION_SUBMIT:
		return version >= 1;
	default:
		return false;
	}
}
#endif /* ZWP_TEXT_INPUT_V3_ACTION_ENUM_IS_VALID */

#ifndef ZWP_TEXT_INPUT_V3_PREEDIT_HINT_ENUM
#define ZWP_TEXT_INPUT_V3_PREEDIT_HINT_ENUM
/**
 * @ingroup iface_zwp_text_input_v3
 * preedit style hint
 *
 * Style hints for the preedit string.
 */
enum zwp_text_input_v3_preedit_hint {
	/**
	 * simple pre-edit text style, typically underlined
	 */
	ZWP_TEXT_INPUT_V3_PREEDIT_HINT_WHOLE = 1,
	/**
	 * hint for a selected piece of text, e.g. per-character navigation and composition
	 */
	ZWP_TEXT_INPUT_V3_PREEDIT_HINT_SELECTION = 2,
	/**
	 * predicted text, not typed by the user
	 */
	ZWP_TEXT_INPUT_V3_PREEDIT_HINT_PREDICTION = 3,
	/**
	 * prefixed text not being currently edited, e.g. prior to a 'selection' section
	 */
	ZWP_TEXT_INPUT_V3_PREEDIT_HINT_PREFIX = 4,
	/**
	 * suffixed text not being currently edited, e.g. after a 'selection' section
	 */
	ZWP_TEXT_INPUT_V3_PREEDIT_HINT_SUFFIX = 5,
	/**
	 * spelling error
	 */
	ZWP_TEXT_INPUT_V3_PREEDIT_HINT_SPELLING_ERROR = 6,
	/**
	 * wrong composition, e.g. user input that can not be transliterated
	 */
	ZWP_TEXT_INPUT_V3_PREEDIT_HINT_COMPOSE_ERROR = 7,
};
#endif /* ZWP_TEXT_INPUT_V3_PREEDIT_HINT_ENUM */

#ifndef ZWP_TEXT_INPUT_V3_PREEDIT_HINT_ENUM_IS_VALID
#define ZWP_TEXT_INPUT_V3_PREEDIT_HINT_ENUM_IS_VALID
/**
 * @ingroup iface_zwp_text_input_v3
 * Validate a zwp_text_input_v3 preedit_hint value.
 *
 * @return true on success, false on error.
 * @ref zwp_text_input_v3_preedit_hint
 */
static inline bool
zwp_text_input_v3_preedit_hint_is_valid(uint32_t value, uint32_t version) {
	switch (value) {
	case ZWP_TEXT_INPUT_V3_PREEDIT_HINT_WHOLE:
		return version >= 1;
	case ZWP_TEXT_INPUT_V3_PREEDIT_HINT_SELECTION:
		return version >= 1;
	case ZWP_TEXT_INPUT_V3_PREEDIT_HINT_PREDICTION:
		return version >= 1;
	case ZWP_TEXT_INPUT_V3_PREEDIT_HINT_PREFIX:
		return version >= 1;
	case ZWP_TEXT_INPUT_V3_PREEDIT_HINT_SUFFIX:
		return version >= 1;
	case ZWP_TEXT_INPUT_V3_PREEDIT_HINT_SPELLING_ERROR:
		return version >= 1;
	case ZWP_TEXT_INPUT_V3_PREEDIT_HINT_COMPOSE_ERROR:
		return version >= 1;
	default:
		return false;
	}
}
#endif /* ZWP_TEXT_INPUT_V3_PREEDIT_HINT_ENUM_IS_VALID */

/**
 * @ingroup iface_zwp_text_input_v3
 * @struct zwp_text_input_v3_interface
 */
struct zwp_text_input_v3_interface {
	/**
	 * Destroy the wp_text_input
	 *
	 * Destroy the wp_text_input object. Also disables all surfaces
	 * enabled through this wp_text_input object.
	 */
	void (*destroy)(struct wl_client *client,
			struct wl_resource *resource);
	/**
	 * Request text input to be enabled
	 *
	 * Requests text input on the surface previously obtained from
	 * the enter event.
	 *
	 * This request must be issued every time the focused text input
	 * changes to a new one, including within the current surface. Use
	 * zwp_text_input_v3.disable when there is no longer any input
	 * focus on the current surface.
	 *
	 * Clients must not enable more than one text input on the single
	 * seat and should disable the current text input before enabling
	 * the new one. Requests to enable a text input when another text
	 * input is enabled on the same seat must be ignored by compositor.
	 *
	 * This request resets all state associated with previous enable,
	 * disable, set_surrounding_text, set_text_change_cause,
	 * set_content_type, and set_cursor_rectangle requests, as well as
	 * the state associated with preedit_string, commit_string, and
	 * delete_surrounding_text events.
	 *
	 * The set_surrounding_text, set_content_type and
	 * set_cursor_rectangle requests must follow if the text input
	 * supports the necessary functionality.
	 *
	 * State set with this request is double-buffered. It will get
	 * applied on the next zwp_text_input_v3.commit request, and stay
	 * valid until the next committed enable or disable request.
	 *
	 * The changes must be applied by the compositor after issuing a
	 * zwp_text_input_v3.commit request.
	 */
	void (*enable)(struct wl_client *client,
		       struct wl_resource *resource);
	/**
	 * Disable text input on a surface
	 *
	 * Explicitly disable text input on the current surface
	 * (typically when there is no focus on any text entry inside the
	 * surface).
	 *
	 * State set with this request is double-buffered. It will get
	 * applied on the next zwp_text_input_v3.commit request.
	 */
	void (*disable)(struct wl_client *client,
			struct wl_resource *resource);
	/**
	 * sets the surrounding text
	 *
	 * Sets the surrounding plain text around the input, excluding
	 * the preedit text.
	 *
	 * The client should notify the compositor of any changes in any of
	 * the values carried with this request, including changes caused
	 * by handling incoming text-input events as well as changes caused
	 * by other mechanisms like keyboard typing.
	 *
	 * If the client is unaware of the text around the cursor, it
	 * should not issue this request, to signify lack of support to the
	 * compositor.
	 *
	 * Text is UTF-8 encoded, and should include the cursor position,
	 * the complete selection and additional characters before and
	 * after them. There is a maximum length of wayland messages, so
	 * text can not be longer than 4000 bytes.
	 *
	 * Cursor is the byte offset of the cursor within text buffer.
	 *
	 * Anchor is the byte offset of the selection anchor within text
	 * buffer. If there is no selected text, anchor is the same as
	 * cursor.
	 *
	 * If any preedit text is present, it is replaced with a cursor for
	 * the purpose of this event.
	 *
	 * Values set with this request are double-buffered. They will get
	 * applied on the next zwp_text_input_v3.commit request, and stay
	 * valid until the next committed enable or disable request.
	 *
	 * The initial state for affected fields is empty, meaning that the
	 * text input does not support sending surrounding text. If the
	 * empty values get applied, subsequent attempts to change them may
	 * have no effect.
	 */
	void (*set_surrounding_text)(struct wl_client *client,
				     struct wl_resource *resource,
				     const char *text,
				     int32_t cursor,
				     int32_t anchor);
	/**
	 * indicates the cause of surrounding text change
	 *
	 * Tells the compositor why the text surrounding the cursor
	 * changed.
	 *
	 * Whenever the client detects an external change in text, cursor,
	 * or anchor posision, it must issue this request to the
	 * compositor. This request is intended to give the input method a
	 * chance to update the preedit text in an appropriate way, e.g. by
	 * removing it when the user starts typing with a keyboard.
	 *
	 * cause describes the source of the change.
	 *
	 * The value set with this request is double-buffered. It must be
	 * applied and reset to initial at the next
	 * zwp_text_input_v3.commit request.
	 *
	 * The initial value of cause is input_method.
	 */
	void (*set_text_change_cause)(struct wl_client *client,
				      struct wl_resource *resource,
				      uint32_t cause);
	/**
	 * set content purpose and hint
	 *
	 * Sets the content purpose and content hint. While the purpose
	 * is the basic purpose of an input field, the hint flags allow to
	 * modify some of the behavior.
	 *
	 * Values set with this request are double-buffered. They will get
	 * applied on the next zwp_text_input_v3.commit request. Subsequent
	 * attempts to update them may have no effect. The values remain
	 * valid until the next committed enable or disable request.
	 *
	 * The initial value for hint is none, and the initial value for
	 * purpose is normal.
	 */
	void (*set_content_type)(struct wl_client *client,
				 struct wl_resource *resource,
				 uint32_t hint,
				 uint32_t purpose);
	/**
	 * set cursor position
	 *
	 * Marks an area around the cursor as a x, y, width, height
	 * rectangle in surface local coordinates.
	 *
	 * Allows the compositor to put a window with word suggestions near
	 * the cursor, without obstructing the text being input.
	 *
	 * If the client is unaware of the position of edited text, it
	 * should not issue this request, to signify lack of support to the
	 * compositor.
	 *
	 * Values set with this request are double-buffered. They will get
	 * applied on the next zwp_text_input_v3.commit request, and stay
	 * valid until the next committed enable or disable request.
	 *
	 * The initial values describing a cursor rectangle are empty. That
	 * means the text input does not support describing the cursor
	 * area. If the empty values get applied, subsequent attempts to
	 * change them may have no effect.
	 *
	 * As of version 2, the zwp_text_input_v3.commit request does not
	 * apply values sent with this request. Instead, it stores them in
	 * a separate "committed" area. The committed values, if still
	 * valid, get applied on the next wl_surface.commit request on the
	 * surface with text-input focus. Both committed and applied values
	 * get invalidated on:
	 *
	 * - the next committed enable or disable request, or - a change of
	 * the focused surface of the text-input (leave or enter events).
	 *
	 * This double stage application allows the compositor to position
	 * the input method popup in the same frame as the contents of the
	 * text on the surface are updated.
	 */
	void (*set_cursor_rectangle)(struct wl_client *client,
				     struct wl_resource *resource,
				     int32_t x,
				     int32_t y,
				     int32_t width,
				     int32_t height);
	/**
	 * commit state
	 *
	 * Atomically applies state changes recently sent to the
	 * compositor.
	 *
	 * The commit request establishes and updates the state of the
	 * client, and must be issued after any changes to apply them.
	 *
	 * Text input state (enabled status, content purpose, content hint,
	 * surrounding text and change cause, cursor rectangle) is
	 * conceptually double-buffered within the context of a text input,
	 * i.e. between a committed enable request and the following
	 * committed enable or disable request.
	 *
	 * Protocol requests modify the pending state, as opposed to the
	 * current state in use by the input method. A commit request
	 * atomically applies all pending state, replacing the current
	 * state. After commit, the new pending state is as documented for
	 * each related request.
	 *
	 * Requests are applied in the order of arrival.
	 *
	 * Neither current nor pending state are modified unless noted
	 * otherwise.
	 *
	 * The compositor must count the number of commit requests coming
	 * from each zwp_text_input_v3 object and use the count as the
	 * serial in done events.
	 */
	void (*commit)(struct wl_client *client,
		       struct wl_resource *resource);
	/**
	 * set the available actions
	 *
	 * Set the actions available for this text input.
	 *
	 * Values set with this request are double-buffered. They will get
	 * applied on the next zwp_text_input_v3.commit request.
	 *
	 * If the available_actions array contains the none action, or
	 * contains the same action multiple times, the compositor must
	 * raise the invalid_action protocol error.
	 *
	 * Initially, no actions are available.
	 * @param available_actions available actions
	 * @since 2
	 */
	void (*set_available_actions)(struct wl_client *client,
				      struct wl_resource *resource,
				      struct wl_array *available_actions);
	/**
	 * show input panel
	 *
	 * Requests an input panel to be shown (e.g. a on-screen
	 * keyboard).
	 *
	 * This request only hints the desired interaction pattern from the
	 * client side, and its effect may be ignored by compositors given
	 * other environmental factors. Repeated calls will be ignored.
	 * @since 2
	 */
	void (*show_input_panel)(struct wl_client *client,
				 struct wl_resource *resource);
	/**
	 * hide input panel
	 *
	 * Requests an input panel to be hidden.
	 *
	 * This request only hints the desired interaction pattern from the
	 * client side, and its effect may be ignored by compositors given
	 * other environmental factors. Repeated calls will be ignored.
	 * @since 2
	 */
	void (*hide_input_panel)(struct wl_client *client,
				 struct wl_resource *resource);
};

#define ZWP_TEXT_INPUT_V3_ENTER 0
#define ZWP_TEXT_INPUT_V3_LEAVE 1
#define ZWP_TEXT_INPUT_V3_PREEDIT_STRING 2
#define ZWP_TEXT_INPUT_V3_COMMIT_STRING 3
#define ZWP_TEXT_INPUT_V3_DELETE_SURROUNDING_TEXT 4
#define ZWP_TEXT_INPUT_V3_DONE 5
#define ZWP_TEXT_INPUT_V3_ACTION 6
#define ZWP_TEXT_INPUT_V3_LANGUAGE 7
#define ZWP_TEXT_INPUT_V3_PREEDIT_HINT 8

/**
 * @ingroup iface_zwp_text_input_v3
 */
#define ZWP_TEXT_INPUT_V3_ENTER_SINCE_VERSION 1
/**
 * @ingroup iface_zwp_text_input_v3
 */
#define ZWP_TEXT_INPUT_V3_LEAVE_SINCE_VERSION 1
/**
 * @ingroup iface_zwp_text_input_v3
 */
#define ZWP_TEXT_INPUT_V3_PREEDIT_STRING_SINCE_VERSION 1
/**
 * @ingroup iface_zwp_text_input_v3
 */
#define ZWP_TEXT_INPUT_V3_COMMIT_STRING_SINCE_VERSION 1
/**
 * @ingroup iface_zwp_text_input_v3
 */
#define ZWP_TEXT_INPUT_V3_DELETE_SURROUNDING_TEXT_SINCE_VERSION 1
/**
 * @ingroup iface_zwp_text_input_v3
 */
#define ZWP_TEXT_INPUT_V3_DONE_SINCE_VERSION 1
/**
 * @ingroup iface_zwp_text_input_v3
 */
#define ZWP_TEXT_INPUT_V3_ACTION_SINCE_VERSION 2
/**
 * @ingroup iface_zwp_text_input_v3
 */
#define ZWP_TEXT_INPUT_V3_LANGUAGE_SINCE_VERSION 2
/**
 * @ingroup iface_zwp_text_input_v3
 */
#define ZWP_TEXT_INPUT_V3_PREEDIT_HINT_SINCE_VERSION 2

/**
 * @ingroup iface_zwp_text_input_v3
 */
#define ZWP_TEXT_INPUT_V3_DESTROY_SINCE_VERSION 1
/**
 * @ingroup iface_zwp_text_input_v3
 */
#define ZWP_TEXT_INPUT_V3_ENABLE_SINCE_VERSION 1
/**
 * @ingroup iface_zwp_text_input_v3
 */
#define ZWP_TEXT_INPUT_V3_DISABLE_SINCE_VERSION 1
/**
 * @ingroup iface_zwp_text_input_v3
 */
#define ZWP_TEXT_INPUT_V3_SET_SURROUNDING_TEXT_SINCE_VERSION 1
/**
 * @ingroup iface_zwp_text_input_v3
 */
#define ZWP_TEXT_INPUT_V3_SET_TEXT_CHANGE_CAUSE_SINCE_VERSION 1
/**
 * @ingroup iface_zwp_text_input_v3
 */
#define ZWP_TEXT_INPUT_V3_SET_CONTENT_TYPE_SINCE_VERSION 1
/**
 * @ingroup iface_zwp_text_input_v3
 */
#define ZWP_TEXT_INPUT_V3_SET_CURSOR_RECTANGLE_SINCE_VERSION 1
/**
 * @ingroup iface_zwp_text_input_v3
 */
#define ZWP_TEXT_INPUT_V3_COMMIT_SINCE_VERSION 1
/**
 * @ingroup iface_zwp_text_input_v3
 */
#define ZWP_TEXT_INPUT_V3_SET_AVAILABLE_ACTIONS_SINCE_VERSION 2
/**
 * @ingroup iface_zwp_text_input_v3
 */
#define ZWP_TEXT_INPUT_V3_SHOW_INPUT_PANEL_SINCE_VERSION 2
/**
 * @ingroup iface_zwp_text_input_v3
 */
#define ZWP_TEXT_INPUT_V3_HIDE_INPUT_PANEL_SINCE_VERSION 2

/**
 * @ingroup iface_zwp_text_input_v3
 * Sends an enter event to the client owning the resource.
 * @param resource_ The client's resource
 */
static inline void
zwp_text_input_v3_send_enter(struct wl_resource *resource_, struct wl_resource *surface)
{
	wl_resource_post_event(resource_, ZWP_TEXT_INPUT_V3_ENTER, surface);
}

/**
 * @ingroup iface_zwp_text_input_v3
 * Sends an leave event to the client owning the resource.
 * @param resource_ The client's resource
 */
static inline void
zwp_text_input_v3_send_leave(struct wl_resource *resource_, struct wl_resource *surface)
{
	wl_resource_post_event(resource_, ZWP_TEXT_INPUT_V3_LEAVE, surface);
}

/**
 * @ingroup iface_zwp_text_input_v3
 * Sends an preedit_string event to the client owning the resource.
 * @param resource_ The client's resource
 */
static inline void
zwp_text_input_v3_send_preedit_string(struct wl_resource *resource_, const char *text, int32_t cursor_begin, int32_t cursor_end)
{
	wl_resource_post_event(resource_, ZWP_TEXT_INPUT_V3_PREEDIT_STRING, text, cursor_begin, cursor_end);
}

/**
 * @ingroup iface_zwp_text_input_v3
 * Sends an commit_string event to the client owning the resource.
 * @param resource_ The client's resource
 */
static inline void
zwp_text_input_v3_send_commit_string(struct wl_resource *resource_, const char *text)
{
	wl_resource_post_event(resource_, ZWP_TEXT_INPUT_V3_COMMIT_STRING, text);
}

/**
 * @ingroup iface_zwp_text_input_v3
 * Sends an delete_surrounding_text event to the client owning the resource.
 * @param resource_ The client's resource
 * @param before_length length of text before current cursor position
 * @param after_length length of text after current cursor position
 */
static inline void
zwp_text_input_v3_send_delete_surrounding_text(struct wl_resource *resource_, uint32_t before_length, uint32_t after_length)
{
	wl_resource_post_event(resource_, ZWP_TEXT_INPUT_V3_DELETE_SURROUNDING_TEXT, before_length, after_length);
}

/**
 * @ingroup iface_zwp_text_input_v3
 * Sends an done event to the client owning the resource.
 * @param resource_ The client's resource
 */
static inline void
zwp_text_input_v3_send_done(struct wl_resource *resource_, uint32_t serial)
{
	wl_resource_post_event(resource_, ZWP_TEXT_INPUT_V3_DONE, serial);
}

/**
 * @ingroup iface_zwp_text_input_v3
 * Sends an action event to the client owning the resource.
 * @param resource_ The client's resource
 * @param action action performed
 * @param serial serial number of the action event
 */
static inline void
zwp_text_input_v3_send_action(struct wl_resource *resource_, uint32_t action, uint32_t serial)
{
	wl_resource_post_event(resource_, ZWP_TEXT_INPUT_V3_ACTION, action, serial);
}

/**
 * @ingroup iface_zwp_text_input_v3
 * Sends an language event to the client owning the resource.
 * @param resource_ The client's resource
 * @param language new language set by IME
 */
static inline void
zwp_text_input_v3_send_language(struct wl_resource *resource_, const char *language)
{
	wl_resource_post_event(resource_, ZWP_TEXT_INPUT_V3_LANGUAGE, language);
}

/**
 * @ingroup iface_zwp_text_input_v3
 * Sends an preedit_hint event to the client owning the resource.
 * @param resource_ The client's resource
 * @param start starting point of the affected substring
 * @param end end point of the affected substring
 * @param hint hint to apply
 */
static inline void
zwp_text_input_v3_send_preedit_hint(struct wl_resource *resource_, uint32_t start, uint32_t end, uint32_t hint)
{
	wl_resource_post_event(resource_, ZWP_TEXT_INPUT_V3_PREEDIT_HINT, start, end, hint);
}

/**
 * @ingroup iface_zwp_text_input_manager_v3
 * @struct zwp_text_input_manager_v3_interface
 */
struct zwp_text_input_manager_v3_interface {
	/**
	 * Destroy the wp_text_input_manager
	 *
	 * Destroy the wp_text_input_manager object.
	 */
	void (*destroy)(struct wl_client *client,
			struct wl_resource *resource);
	/**
	 * create a new text input object
	 *
	 * Creates a new text-input object for a given seat.
	 */
	void (*get_text_input)(struct wl_client *client,
			       struct wl_resource *resource,
			       uint32_t id,
			       struct wl_resource *seat);
};


/**
 * @ingroup iface_zwp_text_input_manager_v3
 */
#define ZWP_TEXT_INPUT_MANAGER_V3_DESTROY_SINCE_VERSION 1
/**
 * @ingroup iface_zwp_text_input_manager_v3
 */
#define ZWP_TEXT_INPUT_MANAGER_V3_GET_TEXT_INPUT_SINCE_VERSION 1

#ifdef  __cplusplus
}
#endif

#endif
