From 1024a222bec6e653d0c5e6fffa105e97b1bad633 Mon Sep 17 00:00:00 2001 From: HuntedByTheIRS Date: Sun, 28 Jun 2026 18:03:05 -0400 Subject: [PATCH] Add features to Makefile make release - compiles with clang, uses more aggressive compilation flags for errors/warnings. CC=tcc/gcc/clang make - lets you select your wanted compiler. --- Makefile | 21 +- peachwm | Bin 0 -> 421728 bytes protocols/cursor-shape-v1-protocol.h | 201 ++ protocols/ext-workspace-v1-protocol.c | 120 + protocols/ext-workspace-v1-protocol.h | 752 ++++++ protocols/peachwm-ipc-unstable-v2-protocol.c | 94 + protocols/peachwm-ipc-unstable-v2-protocol.h | 447 +++ ...pointer-constraints-unstable-v1-protocol.h | 63 + .../wlr-layer-shell-unstable-v1-protocol.h | 177 ++ ...ut-power-management-unstable-v1-protocol.h | 285 ++ protocols/xdg-shell-protocol.h | 2392 +++++++++++++++++ smsg/peachwm-ipc-unstable-v2-protocol.c | 94 + smsg/peachwm-ipc-unstable-v2-protocol.h | 484 ++++ smsg/smsg | Bin 0 -> 28608 bytes src/peachwm.c | 1 + src/util.c | 2 +- src/util.h | 2 +- 17 files changed, 5126 insertions(+), 9 deletions(-) create mode 100755 peachwm create mode 100644 protocols/cursor-shape-v1-protocol.h create mode 100644 protocols/ext-workspace-v1-protocol.c create mode 100644 protocols/ext-workspace-v1-protocol.h create mode 100644 protocols/peachwm-ipc-unstable-v2-protocol.c create mode 100644 protocols/peachwm-ipc-unstable-v2-protocol.h create mode 100644 protocols/pointer-constraints-unstable-v1-protocol.h create mode 100644 protocols/wlr-layer-shell-unstable-v1-protocol.h create mode 100644 protocols/wlr-output-power-management-unstable-v1-protocol.h create mode 100644 protocols/xdg-shell-protocol.h create mode 100644 smsg/peachwm-ipc-unstable-v2-protocol.c create mode 100644 smsg/peachwm-ipc-unstable-v2-protocol.h create mode 100755 smsg/smsg diff --git a/Makefile b/Makefile index 0dfb608..14ecc57 100644 --- a/Makefile +++ b/Makefile @@ -5,15 +5,17 @@ VERSION = `git describe --tags --dirty 2>/dev/null || echo 0.2` PREFIX = /usr/local PKG_CONFIG = pkg-config -# Auto-detect compiler: TCC > Clang > GCC -ifeq ($(shell which tcc 2>/dev/null),) - ifeq ($(shell which clang 2>/dev/null),) - CC = gcc +# Auto-detect compiler: TCC > Clang > GCC (only if CC not set) +ifeq ($(origin CC),default) + ifeq ($(shell which tcc 2>/dev/null),) + ifeq ($(shell which clang 2>/dev/null),) + CC = gcc + else + CC = clang + endif else - CC = clang + CC = tcc endif -else - CC = tcc endif # Uncomment to build without XWayland support @@ -47,6 +49,11 @@ all: peachwm smsg/smsg package: $(MAKE) MARCH= +release: CC = clang +release: CFLAGS += -Werror -Wpedantic -Wmissing-prototypes -Wstrict-prototypes \ + -Wold-style-definition -Wmissing-declarations -Wimplicit-fallthrough +release: peachwm smsg/smsg + # Compositor peachwm: src/peachwm.o src/util.o parser/parser.o \ diff --git a/peachwm b/peachwm new file mode 100755 index 0000000000000000000000000000000000000000..5dfd4711ddd44dfbf38967d5dedea410cc81349a GIT binary patch literal 421728 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%0D-=OW|Y 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
+ *
+ * Copyright © 2019 Christopher Billington
+ * Copyright © 2020 Ilia Bozhinov
+ * Copyright © 2022 Victoria Brekenfeld
+ *
+ * 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.
+ * 
+ */ +struct ext_workspace_group_handle_v1; +struct ext_workspace_handle_v1; +struct ext_workspace_manager_v1; +struct wl_output; + +#ifndef EXT_WORKSPACE_MANAGER_V1_INTERFACE +#define EXT_WORKSPACE_MANAGER_V1_INTERFACE +/** + * @page page_iface_ext_workspace_manager_v1 ext_workspace_manager_v1 + * @section page_iface_ext_workspace_manager_v1_desc Description + * + * Workspaces, also called virtual desktops, are groups of surfaces. A + * compositor with a concept of workspaces may only show some such groups of + * surfaces (those of 'active' workspaces) at a time. 'Activating' a + * workspace is a request for the compositor to display that workspace's + * surfaces as normal, whereas the compositor may hide or otherwise + * de-emphasise surfaces that are associated only with 'inactive' workspaces. + * Workspaces are grouped by which sets of outputs they correspond to, and + * may contain surfaces only from those outputs. In this way, it is possible + * for each output to have its own set of workspaces, or for all outputs (or + * any other arbitrary grouping) to share workspaces. Compositors may + * optionally conceptually arrange each group of workspaces in an + * N-dimensional grid. + * + * The purpose of this protocol is to enable the creation of taskbars and + * docks by providing them with a list of workspaces and their properties, + * and allowing them to activate and deactivate workspaces. + * + * After a client binds the ext_workspace_manager_v1, each workspace will be + * sent via the workspace event. + * @section page_iface_ext_workspace_manager_v1_api API + * See @ref iface_ext_workspace_manager_v1. + */ +/** + * @defgroup iface_ext_workspace_manager_v1 The ext_workspace_manager_v1 interface + * + * Workspaces, also called virtual desktops, are groups of surfaces. A + * compositor with a concept of workspaces may only show some such groups of + * surfaces (those of 'active' workspaces) at a time. 'Activating' a + * workspace is a request for the compositor to display that workspace's + * surfaces as normal, whereas the compositor may hide or otherwise + * de-emphasise surfaces that are associated only with 'inactive' workspaces. + * Workspaces are grouped by which sets of outputs they correspond to, and + * may contain surfaces only from those outputs. In this way, it is possible + * for each output to have its own set of workspaces, or for all outputs (or + * any other arbitrary grouping) to share workspaces. Compositors may + * optionally conceptually arrange each group of workspaces in an + * N-dimensional grid. + * + * The purpose of this protocol is to enable the creation of taskbars and + * docks by providing them with a list of workspaces and their properties, + * and allowing them to activate and deactivate workspaces. + * + * After a client binds the ext_workspace_manager_v1, each workspace will be + * sent via the workspace event. + */ +extern const struct wl_interface ext_workspace_manager_v1_interface; +#endif +#ifndef EXT_WORKSPACE_GROUP_HANDLE_V1_INTERFACE +#define EXT_WORKSPACE_GROUP_HANDLE_V1_INTERFACE +/** + * @page page_iface_ext_workspace_group_handle_v1 ext_workspace_group_handle_v1 + * @section page_iface_ext_workspace_group_handle_v1_desc Description + * + * A ext_workspace_group_handle_v1 object represents a workspace group + * that is assigned a set of outputs and contains a number of workspaces. + * + * The set of outputs assigned to the workspace group is conveyed to the client via + * output_enter and output_leave events, and its workspaces are conveyed with + * workspace events. + * + * For example, a compositor which has a set of workspaces for each output may + * advertise a workspace group (and its workspaces) per output, whereas a compositor + * where a workspace spans all outputs may advertise a single workspace group for all + * outputs. + * @section page_iface_ext_workspace_group_handle_v1_api API + * See @ref iface_ext_workspace_group_handle_v1. + */ +/** + * @defgroup iface_ext_workspace_group_handle_v1 The ext_workspace_group_handle_v1 interface + * + * A ext_workspace_group_handle_v1 object represents a workspace group + * that is assigned a set of outputs and contains a number of workspaces. + * + * The set of outputs assigned to the workspace group is conveyed to the client via + * output_enter and output_leave events, and its workspaces are conveyed with + * workspace events. + * + * For example, a compositor which has a set of workspaces for each output may + * advertise a workspace group (and its workspaces) per output, whereas a compositor + * where a workspace spans all outputs may advertise a single workspace group for all + * outputs. + */ +extern const struct wl_interface ext_workspace_group_handle_v1_interface; +#endif +#ifndef EXT_WORKSPACE_HANDLE_V1_INTERFACE +#define EXT_WORKSPACE_HANDLE_V1_INTERFACE +/** + * @page page_iface_ext_workspace_handle_v1 ext_workspace_handle_v1 + * @section page_iface_ext_workspace_handle_v1_desc Description + * + * A ext_workspace_handle_v1 object represents a workspace that handles a + * group of surfaces. + * + * Each workspace has: + * - a name, conveyed to the client with the name event + * - potentially an id conveyed with the id event + * - a list of states, conveyed to the client with the state event + * - and optionally a set of coordinates, conveyed to the client with the + * coordinates event + * + * The client may request that the compositor activate or deactivate the workspace. + * + * Each workspace can belong to only a single workspace group. + * Depending on the compositor policy, there might be workspaces with + * the same name in different workspace groups, but these workspaces are still + * separate (e.g. one of them might be active while the other is not). + * @section page_iface_ext_workspace_handle_v1_api API + * See @ref iface_ext_workspace_handle_v1. + */ +/** + * @defgroup iface_ext_workspace_handle_v1 The ext_workspace_handle_v1 interface + * + * A ext_workspace_handle_v1 object represents a workspace that handles a + * group of surfaces. + * + * Each workspace has: + * - a name, conveyed to the client with the name event + * - potentially an id conveyed with the id event + * - a list of states, conveyed to the client with the state event + * - and optionally a set of coordinates, conveyed to the client with the + * coordinates event + * + * The client may request that the compositor activate or deactivate the workspace. + * + * Each workspace can belong to only a single workspace group. + * Depending on the compositor policy, there might be workspaces with + * the same name in different workspace groups, but these workspaces are still + * separate (e.g. one of them might be active while the other is not). + */ +extern const struct wl_interface ext_workspace_handle_v1_interface; +#endif + +/** + * @ingroup iface_ext_workspace_manager_v1 + * @struct ext_workspace_manager_v1_interface + */ +struct ext_workspace_manager_v1_interface { + /** + * all requests about the workspaces have been sent + * + * The client must send this request after it has finished + * sending other requests. The compositor must process a series of + * requests preceding a commit request atomically. + * + * This allows changes to the workspace properties to be seen as + * atomic, even if they happen via multiple events, and even if + * they involve multiple ext_workspace_handle_v1 objects, for + * example, deactivating one workspace and activating another. + */ + void (*commit)(struct wl_client *client, + struct wl_resource *resource); + /** + * stop sending events + * + * Indicates the client no longer wishes to receive events for + * new workspace groups. However the compositor may emit further + * workspace events, until the finished event is emitted. The + * compositor is expected to send the finished event eventually + * once the stop request has been processed. + * + * The client must not send any requests after this one, doing so + * will raise a wl_display invalid_object error. + */ + void (*stop)(struct wl_client *client, + struct wl_resource *resource); +}; + +#define EXT_WORKSPACE_MANAGER_V1_WORKSPACE_GROUP 0 +#define EXT_WORKSPACE_MANAGER_V1_WORKSPACE 1 +#define EXT_WORKSPACE_MANAGER_V1_DONE 2 +#define EXT_WORKSPACE_MANAGER_V1_FINISHED 3 + +/** + * @ingroup iface_ext_workspace_manager_v1 + */ +#define EXT_WORKSPACE_MANAGER_V1_WORKSPACE_GROUP_SINCE_VERSION 1 +/** + * @ingroup iface_ext_workspace_manager_v1 + */ +#define EXT_WORKSPACE_MANAGER_V1_WORKSPACE_SINCE_VERSION 1 +/** + * @ingroup iface_ext_workspace_manager_v1 + */ +#define EXT_WORKSPACE_MANAGER_V1_DONE_SINCE_VERSION 1 +/** + * @ingroup iface_ext_workspace_manager_v1 + */ +#define EXT_WORKSPACE_MANAGER_V1_FINISHED_SINCE_VERSION 1 + +/** + * @ingroup iface_ext_workspace_manager_v1 + */ +#define EXT_WORKSPACE_MANAGER_V1_COMMIT_SINCE_VERSION 1 +/** + * @ingroup iface_ext_workspace_manager_v1 + */ +#define EXT_WORKSPACE_MANAGER_V1_STOP_SINCE_VERSION 1 + +/** + * @ingroup iface_ext_workspace_manager_v1 + * Sends an workspace_group event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +ext_workspace_manager_v1_send_workspace_group(struct wl_resource *resource_, struct wl_resource *workspace_group) +{ + wl_resource_post_event(resource_, EXT_WORKSPACE_MANAGER_V1_WORKSPACE_GROUP, workspace_group); +} + +/** + * @ingroup iface_ext_workspace_manager_v1 + * Sends an workspace event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +ext_workspace_manager_v1_send_workspace(struct wl_resource *resource_, struct wl_resource *workspace) +{ + wl_resource_post_event(resource_, EXT_WORKSPACE_MANAGER_V1_WORKSPACE, workspace); +} + +/** + * @ingroup iface_ext_workspace_manager_v1 + * Sends an done event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +ext_workspace_manager_v1_send_done(struct wl_resource *resource_) +{ + wl_resource_post_event(resource_, EXT_WORKSPACE_MANAGER_V1_DONE); +} + +/** + * @ingroup iface_ext_workspace_manager_v1 + * Sends an finished event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +ext_workspace_manager_v1_send_finished(struct wl_resource *resource_) +{ + wl_resource_post_event(resource_, EXT_WORKSPACE_MANAGER_V1_FINISHED); +} + +#ifndef EXT_WORKSPACE_GROUP_HANDLE_V1_GROUP_CAPABILITIES_ENUM +#define EXT_WORKSPACE_GROUP_HANDLE_V1_GROUP_CAPABILITIES_ENUM +enum ext_workspace_group_handle_v1_group_capabilities { + /** + * create_workspace request is available + */ + EXT_WORKSPACE_GROUP_HANDLE_V1_GROUP_CAPABILITIES_CREATE_WORKSPACE = 1, +}; +#endif /* EXT_WORKSPACE_GROUP_HANDLE_V1_GROUP_CAPABILITIES_ENUM */ + +#ifndef EXT_WORKSPACE_GROUP_HANDLE_V1_GROUP_CAPABILITIES_ENUM_IS_VALID +#define EXT_WORKSPACE_GROUP_HANDLE_V1_GROUP_CAPABILITIES_ENUM_IS_VALID +/** + * @ingroup iface_ext_workspace_group_handle_v1 + * Validate a ext_workspace_group_handle_v1 group_capabilities value. + * + * @return true on success, false on error. + * @ref ext_workspace_group_handle_v1_group_capabilities + */ +static inline bool +ext_workspace_group_handle_v1_group_capabilities_is_valid(uint32_t value, uint32_t version) { + uint32_t valid = 0; + if (version >= 1) + valid |= EXT_WORKSPACE_GROUP_HANDLE_V1_GROUP_CAPABILITIES_CREATE_WORKSPACE; + return (value & ~valid) == 0; +} +#endif /* EXT_WORKSPACE_GROUP_HANDLE_V1_GROUP_CAPABILITIES_ENUM_IS_VALID */ + +/** + * @ingroup iface_ext_workspace_group_handle_v1 + * @struct ext_workspace_group_handle_v1_interface + */ +struct ext_workspace_group_handle_v1_interface { + /** + * create a new workspace + * + * Request that the compositor create a new workspace with the + * given name and assign it to this group. + * + * There is no guarantee that the compositor will create a new + * workspace, or that the created workspace will have the provided + * name. + */ + void (*create_workspace)(struct wl_client *client, + struct wl_resource *resource, + const char *workspace); + /** + * destroy the ext_workspace_group_handle_v1 object + * + * Destroys the ext_workspace_group_handle_v1 object. + * + * This request should be send either when the client does not want + * to use the workspace group object any more or after the removed + * event to finalize the destruction of the object. + */ + void (*destroy)(struct wl_client *client, + struct wl_resource *resource); +}; + +#define EXT_WORKSPACE_GROUP_HANDLE_V1_CAPABILITIES 0 +#define EXT_WORKSPACE_GROUP_HANDLE_V1_OUTPUT_ENTER 1 +#define EXT_WORKSPACE_GROUP_HANDLE_V1_OUTPUT_LEAVE 2 +#define EXT_WORKSPACE_GROUP_HANDLE_V1_WORKSPACE_ENTER 3 +#define EXT_WORKSPACE_GROUP_HANDLE_V1_WORKSPACE_LEAVE 4 +#define EXT_WORKSPACE_GROUP_HANDLE_V1_REMOVED 5 + +/** + * @ingroup iface_ext_workspace_group_handle_v1 + */ +#define EXT_WORKSPACE_GROUP_HANDLE_V1_CAPABILITIES_SINCE_VERSION 1 +/** + * @ingroup iface_ext_workspace_group_handle_v1 + */ +#define EXT_WORKSPACE_GROUP_HANDLE_V1_OUTPUT_ENTER_SINCE_VERSION 1 +/** + * @ingroup iface_ext_workspace_group_handle_v1 + */ +#define EXT_WORKSPACE_GROUP_HANDLE_V1_OUTPUT_LEAVE_SINCE_VERSION 1 +/** + * @ingroup iface_ext_workspace_group_handle_v1 + */ +#define EXT_WORKSPACE_GROUP_HANDLE_V1_WORKSPACE_ENTER_SINCE_VERSION 1 +/** + * @ingroup iface_ext_workspace_group_handle_v1 + */ +#define EXT_WORKSPACE_GROUP_HANDLE_V1_WORKSPACE_LEAVE_SINCE_VERSION 1 +/** + * @ingroup iface_ext_workspace_group_handle_v1 + */ +#define EXT_WORKSPACE_GROUP_HANDLE_V1_REMOVED_SINCE_VERSION 1 + +/** + * @ingroup iface_ext_workspace_group_handle_v1 + */ +#define EXT_WORKSPACE_GROUP_HANDLE_V1_CREATE_WORKSPACE_SINCE_VERSION 1 +/** + * @ingroup iface_ext_workspace_group_handle_v1 + */ +#define EXT_WORKSPACE_GROUP_HANDLE_V1_DESTROY_SINCE_VERSION 1 + +/** + * @ingroup iface_ext_workspace_group_handle_v1 + * Sends an capabilities event to the client owning the resource. + * @param resource_ The client's resource + * @param capabilities capabilities + */ +static inline void +ext_workspace_group_handle_v1_send_capabilities(struct wl_resource *resource_, uint32_t capabilities) +{ + wl_resource_post_event(resource_, EXT_WORKSPACE_GROUP_HANDLE_V1_CAPABILITIES, capabilities); +} + +/** + * @ingroup iface_ext_workspace_group_handle_v1 + * Sends an output_enter event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +ext_workspace_group_handle_v1_send_output_enter(struct wl_resource *resource_, struct wl_resource *output) +{ + wl_resource_post_event(resource_, EXT_WORKSPACE_GROUP_HANDLE_V1_OUTPUT_ENTER, output); +} + +/** + * @ingroup iface_ext_workspace_group_handle_v1 + * Sends an output_leave event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +ext_workspace_group_handle_v1_send_output_leave(struct wl_resource *resource_, struct wl_resource *output) +{ + wl_resource_post_event(resource_, EXT_WORKSPACE_GROUP_HANDLE_V1_OUTPUT_LEAVE, output); +} + +/** + * @ingroup iface_ext_workspace_group_handle_v1 + * Sends an workspace_enter event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +ext_workspace_group_handle_v1_send_workspace_enter(struct wl_resource *resource_, struct wl_resource *workspace) +{ + wl_resource_post_event(resource_, EXT_WORKSPACE_GROUP_HANDLE_V1_WORKSPACE_ENTER, workspace); +} + +/** + * @ingroup iface_ext_workspace_group_handle_v1 + * Sends an workspace_leave event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +ext_workspace_group_handle_v1_send_workspace_leave(struct wl_resource *resource_, struct wl_resource *workspace) +{ + wl_resource_post_event(resource_, EXT_WORKSPACE_GROUP_HANDLE_V1_WORKSPACE_LEAVE, workspace); +} + +/** + * @ingroup iface_ext_workspace_group_handle_v1 + * Sends an removed event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +ext_workspace_group_handle_v1_send_removed(struct wl_resource *resource_) +{ + wl_resource_post_event(resource_, EXT_WORKSPACE_GROUP_HANDLE_V1_REMOVED); +} + +#ifndef EXT_WORKSPACE_HANDLE_V1_STATE_ENUM +#define EXT_WORKSPACE_HANDLE_V1_STATE_ENUM +/** + * @ingroup iface_ext_workspace_handle_v1 + * types of states on the workspace + * + * The different states that a workspace can have. + */ +enum ext_workspace_handle_v1_state { + /** + * the workspace is active + */ + EXT_WORKSPACE_HANDLE_V1_STATE_ACTIVE = 1, + /** + * the workspace requests attention + */ + EXT_WORKSPACE_HANDLE_V1_STATE_URGENT = 2, + /** + * the workspace is not visible + * + * The workspace is not visible in its workspace group, and + * clients attempting to visualize the compositor workspace state + * should not display such workspaces. + */ + EXT_WORKSPACE_HANDLE_V1_STATE_HIDDEN = 4, +}; +#endif /* EXT_WORKSPACE_HANDLE_V1_STATE_ENUM */ + +#ifndef EXT_WORKSPACE_HANDLE_V1_STATE_ENUM_IS_VALID +#define EXT_WORKSPACE_HANDLE_V1_STATE_ENUM_IS_VALID +/** + * @ingroup iface_ext_workspace_handle_v1 + * Validate a ext_workspace_handle_v1 state value. + * + * @return true on success, false on error. + * @ref ext_workspace_handle_v1_state + */ +static inline bool +ext_workspace_handle_v1_state_is_valid(uint32_t value, uint32_t version) { + uint32_t valid = 0; + if (version >= 1) + valid |= EXT_WORKSPACE_HANDLE_V1_STATE_ACTIVE; + if (version >= 1) + valid |= EXT_WORKSPACE_HANDLE_V1_STATE_URGENT; + if (version >= 1) + valid |= EXT_WORKSPACE_HANDLE_V1_STATE_HIDDEN; + return (value & ~valid) == 0; +} +#endif /* EXT_WORKSPACE_HANDLE_V1_STATE_ENUM_IS_VALID */ + +#ifndef EXT_WORKSPACE_HANDLE_V1_WORKSPACE_CAPABILITIES_ENUM +#define EXT_WORKSPACE_HANDLE_V1_WORKSPACE_CAPABILITIES_ENUM +enum ext_workspace_handle_v1_workspace_capabilities { + /** + * activate request is available + */ + EXT_WORKSPACE_HANDLE_V1_WORKSPACE_CAPABILITIES_ACTIVATE = 1, + /** + * deactivate request is available + */ + EXT_WORKSPACE_HANDLE_V1_WORKSPACE_CAPABILITIES_DEACTIVATE = 2, + /** + * remove request is available + */ + EXT_WORKSPACE_HANDLE_V1_WORKSPACE_CAPABILITIES_REMOVE = 4, + /** + * assign request is available + */ + EXT_WORKSPACE_HANDLE_V1_WORKSPACE_CAPABILITIES_ASSIGN = 8, +}; +#endif /* EXT_WORKSPACE_HANDLE_V1_WORKSPACE_CAPABILITIES_ENUM */ + +#ifndef EXT_WORKSPACE_HANDLE_V1_WORKSPACE_CAPABILITIES_ENUM_IS_VALID +#define EXT_WORKSPACE_HANDLE_V1_WORKSPACE_CAPABILITIES_ENUM_IS_VALID +/** + * @ingroup iface_ext_workspace_handle_v1 + * Validate a ext_workspace_handle_v1 workspace_capabilities value. + * + * @return true on success, false on error. + * @ref ext_workspace_handle_v1_workspace_capabilities + */ +static inline bool +ext_workspace_handle_v1_workspace_capabilities_is_valid(uint32_t value, uint32_t version) { + uint32_t valid = 0; + if (version >= 1) + valid |= EXT_WORKSPACE_HANDLE_V1_WORKSPACE_CAPABILITIES_ACTIVATE; + if (version >= 1) + valid |= EXT_WORKSPACE_HANDLE_V1_WORKSPACE_CAPABILITIES_DEACTIVATE; + if (version >= 1) + valid |= EXT_WORKSPACE_HANDLE_V1_WORKSPACE_CAPABILITIES_REMOVE; + if (version >= 1) + valid |= EXT_WORKSPACE_HANDLE_V1_WORKSPACE_CAPABILITIES_ASSIGN; + return (value & ~valid) == 0; +} +#endif /* EXT_WORKSPACE_HANDLE_V1_WORKSPACE_CAPABILITIES_ENUM_IS_VALID */ + +/** + * @ingroup iface_ext_workspace_handle_v1 + * @struct ext_workspace_handle_v1_interface + */ +struct ext_workspace_handle_v1_interface { + /** + * destroy the ext_workspace_handle_v1 object + * + * Destroys the ext_workspace_handle_v1 object. + * + * This request should be made either when the client does not want + * to use the workspace object any more or after the remove event + * to finalize the destruction of the object. + */ + void (*destroy)(struct wl_client *client, + struct wl_resource *resource); + /** + * activate the workspace + * + * Request that this workspace be activated. + * + * There is no guarantee the workspace will be actually activated, + * and behaviour may be compositor-dependent. For example, + * activating a workspace may or may not deactivate all other + * workspaces in the same group. + */ + void (*activate)(struct wl_client *client, + struct wl_resource *resource); + /** + * deactivate the workspace + * + * Request that this workspace be deactivated. + * + * There is no guarantee the workspace will be actually + * deactivated. + */ + void (*deactivate)(struct wl_client *client, + struct wl_resource *resource); + /** + * assign workspace to group + * + * Requests that this workspace is assigned to the given + * workspace group. + * + * There is no guarantee the workspace will be assigned. + */ + void (*assign)(struct wl_client *client, + struct wl_resource *resource, + struct wl_resource *workspace_group); + /** + * remove the workspace + * + * Request that this workspace be removed. + * + * There is no guarantee the workspace will be actually removed. + */ + void (*remove)(struct wl_client *client, + struct wl_resource *resource); +}; + +#define EXT_WORKSPACE_HANDLE_V1_ID 0 +#define EXT_WORKSPACE_HANDLE_V1_NAME 1 +#define EXT_WORKSPACE_HANDLE_V1_COORDINATES 2 +#define EXT_WORKSPACE_HANDLE_V1_STATE 3 +#define EXT_WORKSPACE_HANDLE_V1_CAPABILITIES 4 +#define EXT_WORKSPACE_HANDLE_V1_REMOVED 5 + +/** + * @ingroup iface_ext_workspace_handle_v1 + */ +#define EXT_WORKSPACE_HANDLE_V1_ID_SINCE_VERSION 1 +/** + * @ingroup iface_ext_workspace_handle_v1 + */ +#define EXT_WORKSPACE_HANDLE_V1_NAME_SINCE_VERSION 1 +/** + * @ingroup iface_ext_workspace_handle_v1 + */ +#define EXT_WORKSPACE_HANDLE_V1_COORDINATES_SINCE_VERSION 1 +/** + * @ingroup iface_ext_workspace_handle_v1 + */ +#define EXT_WORKSPACE_HANDLE_V1_STATE_SINCE_VERSION 1 +/** + * @ingroup iface_ext_workspace_handle_v1 + */ +#define EXT_WORKSPACE_HANDLE_V1_CAPABILITIES_SINCE_VERSION 1 +/** + * @ingroup iface_ext_workspace_handle_v1 + */ +#define EXT_WORKSPACE_HANDLE_V1_REMOVED_SINCE_VERSION 1 + +/** + * @ingroup iface_ext_workspace_handle_v1 + */ +#define EXT_WORKSPACE_HANDLE_V1_DESTROY_SINCE_VERSION 1 +/** + * @ingroup iface_ext_workspace_handle_v1 + */ +#define EXT_WORKSPACE_HANDLE_V1_ACTIVATE_SINCE_VERSION 1 +/** + * @ingroup iface_ext_workspace_handle_v1 + */ +#define EXT_WORKSPACE_HANDLE_V1_DEACTIVATE_SINCE_VERSION 1 +/** + * @ingroup iface_ext_workspace_handle_v1 + */ +#define EXT_WORKSPACE_HANDLE_V1_ASSIGN_SINCE_VERSION 1 +/** + * @ingroup iface_ext_workspace_handle_v1 + */ +#define EXT_WORKSPACE_HANDLE_V1_REMOVE_SINCE_VERSION 1 + +/** + * @ingroup iface_ext_workspace_handle_v1 + * Sends an id event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +ext_workspace_handle_v1_send_id(struct wl_resource *resource_, const char *id) +{ + wl_resource_post_event(resource_, EXT_WORKSPACE_HANDLE_V1_ID, id); +} + +/** + * @ingroup iface_ext_workspace_handle_v1 + * Sends an name event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +ext_workspace_handle_v1_send_name(struct wl_resource *resource_, const char *name) +{ + wl_resource_post_event(resource_, EXT_WORKSPACE_HANDLE_V1_NAME, name); +} + +/** + * @ingroup iface_ext_workspace_handle_v1 + * Sends an coordinates event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +ext_workspace_handle_v1_send_coordinates(struct wl_resource *resource_, struct wl_array *coordinates) +{ + wl_resource_post_event(resource_, EXT_WORKSPACE_HANDLE_V1_COORDINATES, coordinates); +} + +/** + * @ingroup iface_ext_workspace_handle_v1 + * Sends an state event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +ext_workspace_handle_v1_send_state(struct wl_resource *resource_, uint32_t state) +{ + wl_resource_post_event(resource_, EXT_WORKSPACE_HANDLE_V1_STATE, state); +} + +/** + * @ingroup iface_ext_workspace_handle_v1 + * Sends an capabilities event to the client owning the resource. + * @param resource_ The client's resource + * @param capabilities capabilities + */ +static inline void +ext_workspace_handle_v1_send_capabilities(struct wl_resource *resource_, uint32_t capabilities) +{ + wl_resource_post_event(resource_, EXT_WORKSPACE_HANDLE_V1_CAPABILITIES, capabilities); +} + +/** + * @ingroup iface_ext_workspace_handle_v1 + * Sends an removed event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +ext_workspace_handle_v1_send_removed(struct wl_resource *resource_) +{ + wl_resource_post_event(resource_, EXT_WORKSPACE_HANDLE_V1_REMOVED); +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/protocols/peachwm-ipc-unstable-v2-protocol.c b/protocols/peachwm-ipc-unstable-v2-protocol.c new file mode 100644 index 0000000..dfc4982 --- /dev/null +++ b/protocols/peachwm-ipc-unstable-v2-protocol.c @@ -0,0 +1,94 @@ +/* Generated by wayland-scanner 1.25.0 */ + +/* + * Copyright (C) 2022 Russell Newcomb + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include +#include +#include +#include "wayland-util.h" + +#ifndef __has_attribute +# define __has_attribute(x) 0 /* Compatibility with non-clang compilers. */ +#endif + +#if (__has_attribute(visibility) || defined(__GNUC__) && __GNUC__ >= 4) +#define WL_PRIVATE __attribute__ ((visibility("hidden"))) +#else +#define WL_PRIVATE +#endif + +extern const struct wl_interface wl_output_interface; +extern const struct wl_interface zpeachwm_ipc_output_v2_interface; + +static const struct wl_interface *peachwm_ipc_unstable_v2_types[] = { + NULL, + NULL, + NULL, + NULL, + &zpeachwm_ipc_output_v2_interface, + &wl_output_interface, +}; + +static const struct wl_message zpeachwm_ipc_manager_v2_requests[] = { + { "release", "", peachwm_ipc_unstable_v2_types + 0 }, + { "get_output", "no", peachwm_ipc_unstable_v2_types + 4 }, +}; + +static const struct wl_message zpeachwm_ipc_manager_v2_events[] = { + { "tags", "u", peachwm_ipc_unstable_v2_types + 0 }, + { "layout", "s", peachwm_ipc_unstable_v2_types + 0 }, +}; + +WL_PRIVATE const struct wl_interface zpeachwm_ipc_manager_v2_interface = { + "zpeachwm_ipc_manager_v2", 2, + 2, zpeachwm_ipc_manager_v2_requests, + 2, zpeachwm_ipc_manager_v2_events, +}; + +static const struct wl_message zpeachwm_ipc_output_v2_requests[] = { + { "release", "", peachwm_ipc_unstable_v2_types + 0 }, + { "set_tags", "uu", peachwm_ipc_unstable_v2_types + 0 }, + { "set_client_tags", "uu", peachwm_ipc_unstable_v2_types + 0 }, + { "set_layout", "u", peachwm_ipc_unstable_v2_types + 0 }, +}; + +static const struct wl_message zpeachwm_ipc_output_v2_events[] = { + { "toggle_visibility", "", peachwm_ipc_unstable_v2_types + 0 }, + { "active", "u", peachwm_ipc_unstable_v2_types + 0 }, + { "tag", "uuuu", peachwm_ipc_unstable_v2_types + 0 }, + { "layout", "u", peachwm_ipc_unstable_v2_types + 0 }, + { "title", "s", peachwm_ipc_unstable_v2_types + 0 }, + { "appid", "s", peachwm_ipc_unstable_v2_types + 0 }, + { "layout_symbol", "s", peachwm_ipc_unstable_v2_types + 0 }, + { "frame", "", peachwm_ipc_unstable_v2_types + 0 }, + { "fullscreen", "2u", peachwm_ipc_unstable_v2_types + 0 }, + { "floating", "2u", peachwm_ipc_unstable_v2_types + 0 }, +}; + +WL_PRIVATE const struct wl_interface zpeachwm_ipc_output_v2_interface = { + "zpeachwm_ipc_output_v2", 2, + 4, zpeachwm_ipc_output_v2_requests, + 10, zpeachwm_ipc_output_v2_events, +}; + diff --git a/protocols/peachwm-ipc-unstable-v2-protocol.h b/protocols/peachwm-ipc-unstable-v2-protocol.h new file mode 100644 index 0000000..8cb8d2b --- /dev/null +++ b/protocols/peachwm-ipc-unstable-v2-protocol.h @@ -0,0 +1,447 @@ +/* Generated by wayland-scanner 1.25.0 */ + +#ifndef PEACHWM_IPC_UNSTABLE_V2_SERVER_PROTOCOL_H +#define PEACHWM_IPC_UNSTABLE_V2_SERVER_PROTOCOL_H + +#include +#include +#include "wayland-server.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct wl_client; +struct wl_resource; + +/** + * @page page_peachwm_ipc_unstable_v2 The peachwm_ipc_unstable_v2 protocol + * @section page_ifaces_peachwm_ipc_unstable_v2 Interfaces + * - @subpage page_iface_zpeachwm_ipc_manager_v2 - manage peachwm state + * - @subpage page_iface_zpeachwm_ipc_output_v2 - interact with peachwm output state + * @section page_copyright_peachwm_ipc_unstable_v2 Copyright + *
+ *
+ * Copyright (C) 2022 Russell Newcomb
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * 
+ */ +struct wl_output; +struct zpeachwm_ipc_manager_v2; +struct zpeachwm_ipc_output_v2; + +#ifndef ZPEACHWM_IPC_MANAGER_V2_INTERFACE +#define ZPEACHWM_IPC_MANAGER_V2_INTERFACE +/** + * @page page_iface_zpeachwm_ipc_manager_v2 zpeachwm_ipc_manager_v2 + * @section page_iface_zpeachwm_ipc_manager_v2_desc Description + * + * This interface is exposed as a global in the Wayland registry and allows + * clients to query and set peachwm state. + * + * 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 is reset. + * @section page_iface_zpeachwm_ipc_manager_v2_api API + * See @ref iface_zpeachwm_ipc_manager_v2. + */ +/** + * @defgroup iface_zpeachwm_ipc_manager_v2 The zpeachwm_ipc_manager_v2 interface + * + * This interface is exposed as a global in the Wayland registry and allows + * clients to query and set peachwm state. + * + * 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 is reset. + */ +extern const struct wl_interface zpeachwm_ipc_manager_v2_interface; +#endif +#ifndef ZPEACHWM_IPC_OUTPUT_V2_INTERFACE +#define ZPEACHWM_IPC_OUTPUT_V2_INTERFACE +/** + * @page page_iface_zpeachwm_ipc_output_v2 zpeachwm_ipc_output_v2 + * @section page_iface_zpeachwm_ipc_output_v2_desc Description + * + * Observe and control a peachwm output. + * @section page_iface_zpeachwm_ipc_output_v2_api API + * See @ref iface_zpeachwm_ipc_output_v2. + */ +/** + * @defgroup iface_zpeachwm_ipc_output_v2 The zpeachwm_ipc_output_v2 interface + * + * Observe and control a peachwm output. + */ +extern const struct wl_interface zpeachwm_ipc_output_v2_interface; +#endif + +/** + * @ingroup iface_zpeachwm_ipc_manager_v2 + * @struct zpeachwm_ipc_manager_v2_interface + */ +struct zpeachwm_ipc_manager_v2_interface { + /** + * release peachwm_ipc_manager + * + * Indicates that the client will not use the manager object + * anymore. Objects created through this interface remain valid. + */ + void (*release)(struct wl_client *client, + struct wl_resource *resource); + /** + * get a peachwm_ipc_output for a wl_output + * + * Get a peachwm_ipc_output for the given wl_output. + */ + void (*get_output)(struct wl_client *client, + struct wl_resource *resource, + uint32_t id, + struct wl_resource *output); +}; + +#define ZPEACHWM_IPC_MANAGER_V2_TAGS 0 +#define ZPEACHWM_IPC_MANAGER_V2_LAYOUT 1 + +/** + * @ingroup iface_zpeachwm_ipc_manager_v2 + */ +#define ZPEACHWM_IPC_MANAGER_V2_TAGS_SINCE_VERSION 1 +/** + * @ingroup iface_zpeachwm_ipc_manager_v2 + */ +#define ZPEACHWM_IPC_MANAGER_V2_LAYOUT_SINCE_VERSION 1 + +/** + * @ingroup iface_zpeachwm_ipc_manager_v2 + */ +#define ZPEACHWM_IPC_MANAGER_V2_RELEASE_SINCE_VERSION 1 +/** + * @ingroup iface_zpeachwm_ipc_manager_v2 + */ +#define ZPEACHWM_IPC_MANAGER_V2_GET_OUTPUT_SINCE_VERSION 1 + +/** + * @ingroup iface_zpeachwm_ipc_manager_v2 + * Sends an tags event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +zpeachwm_ipc_manager_v2_send_tags(struct wl_resource *resource_, uint32_t amount) +{ + wl_resource_post_event(resource_, ZPEACHWM_IPC_MANAGER_V2_TAGS, amount); +} + +/** + * @ingroup iface_zpeachwm_ipc_manager_v2 + * Sends an layout event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +zpeachwm_ipc_manager_v2_send_layout(struct wl_resource *resource_, const char *name) +{ + wl_resource_post_event(resource_, ZPEACHWM_IPC_MANAGER_V2_LAYOUT, name); +} + +#ifndef ZPEACHWM_IPC_OUTPUT_V2_TAG_STATE_ENUM +#define ZPEACHWM_IPC_OUTPUT_V2_TAG_STATE_ENUM +enum zpeachwm_ipc_output_v2_tag_state { + /** + * no state + */ + ZPEACHWM_IPC_OUTPUT_V2_TAG_STATE_NONE = 0, + /** + * tag is active + */ + ZPEACHWM_IPC_OUTPUT_V2_TAG_STATE_ACTIVE = 1, + /** + * tag has urgent client + */ + ZPEACHWM_IPC_OUTPUT_V2_TAG_STATE_URGENT = 2, +}; +#endif /* ZPEACHWM_IPC_OUTPUT_V2_TAG_STATE_ENUM */ + +#ifndef ZPEACHWM_IPC_OUTPUT_V2_TAG_STATE_ENUM_IS_VALID +#define ZPEACHWM_IPC_OUTPUT_V2_TAG_STATE_ENUM_IS_VALID +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + * Validate a zpeachwm_ipc_output_v2 tag_state value. + * + * @return true on success, false on error. + * @ref zpeachwm_ipc_output_v2_tag_state + */ +static inline bool +zpeachwm_ipc_output_v2_tag_state_is_valid(uint32_t value, uint32_t version) { + switch (value) { + case ZPEACHWM_IPC_OUTPUT_V2_TAG_STATE_NONE: + return version >= 1; + case ZPEACHWM_IPC_OUTPUT_V2_TAG_STATE_ACTIVE: + return version >= 1; + case ZPEACHWM_IPC_OUTPUT_V2_TAG_STATE_URGENT: + return version >= 1; + default: + return false; + } +} +#endif /* ZPEACHWM_IPC_OUTPUT_V2_TAG_STATE_ENUM_IS_VALID */ + +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + * @struct zpeachwm_ipc_output_v2_interface + */ +struct zpeachwm_ipc_output_v2_interface { + /** + * release peachwm_ipc_output + * + * Indicates that the client will not use the peachwm_ipc_output + * object anymore. Objects created through this interface remain + * valid. + */ + void (*release)(struct wl_client *client, + struct wl_resource *resource); + /** + * set the active tags of this output + * + * set the active tags of this output. + * @param tagmask bitmask of the tags that should be set + * @param toggle_tagset whether to toggle the tagset + */ + void (*set_tags)(struct wl_client *client, + struct wl_resource *resource, + uint32_t tagmask, + uint32_t toggle_tagset); + /** + * set the tags of the focused client + * + * Set the tags of the focused client. + */ + void (*set_client_tags)(struct wl_client *client, + struct wl_resource *resource, + uint32_t and_tags, + uint32_t xor_tags); + /** + * set the layout of this output + * + * Set the layout of this output. + */ + void (*set_layout)(struct wl_client *client, + struct wl_resource *resource, + uint32_t index); +}; + +#define ZPEACHWM_IPC_OUTPUT_V2_TOGGLE_VISIBILITY 0 +#define ZPEACHWM_IPC_OUTPUT_V2_ACTIVE 1 +#define ZPEACHWM_IPC_OUTPUT_V2_TAG 2 +#define ZPEACHWM_IPC_OUTPUT_V2_LAYOUT 3 +#define ZPEACHWM_IPC_OUTPUT_V2_TITLE 4 +#define ZPEACHWM_IPC_OUTPUT_V2_APPID 5 +#define ZPEACHWM_IPC_OUTPUT_V2_LAYOUT_SYMBOL 6 +#define ZPEACHWM_IPC_OUTPUT_V2_FRAME 7 +#define ZPEACHWM_IPC_OUTPUT_V2_FULLSCREEN 8 +#define ZPEACHWM_IPC_OUTPUT_V2_FLOATING 9 + +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +#define ZPEACHWM_IPC_OUTPUT_V2_TOGGLE_VISIBILITY_SINCE_VERSION 1 +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +#define ZPEACHWM_IPC_OUTPUT_V2_ACTIVE_SINCE_VERSION 1 +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +#define ZPEACHWM_IPC_OUTPUT_V2_TAG_SINCE_VERSION 1 +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +#define ZPEACHWM_IPC_OUTPUT_V2_LAYOUT_SINCE_VERSION 1 +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +#define ZPEACHWM_IPC_OUTPUT_V2_TITLE_SINCE_VERSION 1 +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +#define ZPEACHWM_IPC_OUTPUT_V2_APPID_SINCE_VERSION 1 +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +#define ZPEACHWM_IPC_OUTPUT_V2_LAYOUT_SYMBOL_SINCE_VERSION 1 +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +#define ZPEACHWM_IPC_OUTPUT_V2_FRAME_SINCE_VERSION 1 +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +#define ZPEACHWM_IPC_OUTPUT_V2_FULLSCREEN_SINCE_VERSION 2 +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +#define ZPEACHWM_IPC_OUTPUT_V2_FLOATING_SINCE_VERSION 2 + +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +#define ZPEACHWM_IPC_OUTPUT_V2_RELEASE_SINCE_VERSION 1 +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +#define ZPEACHWM_IPC_OUTPUT_V2_SET_TAGS_SINCE_VERSION 1 +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +#define ZPEACHWM_IPC_OUTPUT_V2_SET_CLIENT_TAGS_SINCE_VERSION 1 +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +#define ZPEACHWM_IPC_OUTPUT_V2_SET_LAYOUT_SINCE_VERSION 1 + +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + * Sends an toggle_visibility event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +zpeachwm_ipc_output_v2_send_toggle_visibility(struct wl_resource *resource_) +{ + wl_resource_post_event(resource_, ZPEACHWM_IPC_OUTPUT_V2_TOGGLE_VISIBILITY); +} + +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + * Sends an active event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +zpeachwm_ipc_output_v2_send_active(struct wl_resource *resource_, uint32_t active) +{ + wl_resource_post_event(resource_, ZPEACHWM_IPC_OUTPUT_V2_ACTIVE, active); +} + +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + * Sends an tag event to the client owning the resource. + * @param resource_ The client's resource + * @param tag index of the tag + * @param state state of the tag + * @param clients number of clients in tag + * @param focused 1 if focused client is in this tag + */ +static inline void +zpeachwm_ipc_output_v2_send_tag(struct wl_resource *resource_, uint32_t tag, uint32_t state, uint32_t clients, uint32_t focused) +{ + wl_resource_post_event(resource_, ZPEACHWM_IPC_OUTPUT_V2_TAG, tag, state, clients, focused); +} + +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + * Sends an layout event to the client owning the resource. + * @param resource_ The client's resource + * @param layout index of the layout + */ +static inline void +zpeachwm_ipc_output_v2_send_layout(struct wl_resource *resource_, uint32_t layout) +{ + wl_resource_post_event(resource_, ZPEACHWM_IPC_OUTPUT_V2_LAYOUT, layout); +} + +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + * Sends an title event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +zpeachwm_ipc_output_v2_send_title(struct wl_resource *resource_, const char *title) +{ + wl_resource_post_event(resource_, ZPEACHWM_IPC_OUTPUT_V2_TITLE, title); +} + +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + * Sends an appid event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +zpeachwm_ipc_output_v2_send_appid(struct wl_resource *resource_, const char *appid) +{ + wl_resource_post_event(resource_, ZPEACHWM_IPC_OUTPUT_V2_APPID, appid); +} + +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + * Sends an layout_symbol event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +zpeachwm_ipc_output_v2_send_layout_symbol(struct wl_resource *resource_, const char *layout) +{ + wl_resource_post_event(resource_, ZPEACHWM_IPC_OUTPUT_V2_LAYOUT_SYMBOL, layout); +} + +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + * Sends an frame event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +zpeachwm_ipc_output_v2_send_frame(struct wl_resource *resource_) +{ + wl_resource_post_event(resource_, ZPEACHWM_IPC_OUTPUT_V2_FRAME); +} + +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + * Sends an fullscreen event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +zpeachwm_ipc_output_v2_send_fullscreen(struct wl_resource *resource_, uint32_t is_fullscreen) +{ + wl_resource_post_event(resource_, ZPEACHWM_IPC_OUTPUT_V2_FULLSCREEN, is_fullscreen); +} + +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + * Sends an floating event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +zpeachwm_ipc_output_v2_send_floating(struct wl_resource *resource_, uint32_t is_floating) +{ + wl_resource_post_event(resource_, ZPEACHWM_IPC_OUTPUT_V2_FLOATING, is_floating); +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/protocols/pointer-constraints-unstable-v1-protocol.h b/protocols/pointer-constraints-unstable-v1-protocol.h new file mode 100644 index 0000000..3b37dc4 --- /dev/null +++ b/protocols/pointer-constraints-unstable-v1-protocol.h @@ -0,0 +1,63 @@ +/* Generated by wayland-scanner 1.25.0 */ + +#ifndef POINTER_CONSTRAINTS_UNSTABLE_V1_ENUM_PROTOCOL_H +#define POINTER_CONSTRAINTS_UNSTABLE_V1_ENUM_PROTOCOL_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef ZWP_POINTER_CONSTRAINTS_V1_ERROR_ENUM +#define ZWP_POINTER_CONSTRAINTS_V1_ERROR_ENUM +/** + * @ingroup iface_zwp_pointer_constraints_v1 + * wp_pointer_constraints error values + * + * These errors can be emitted in response to wp_pointer_constraints + * requests. + */ +enum zwp_pointer_constraints_v1_error { + /** + * pointer constraint already requested on that surface + */ + ZWP_POINTER_CONSTRAINTS_V1_ERROR_ALREADY_CONSTRAINED = 1, +}; +#endif /* ZWP_POINTER_CONSTRAINTS_V1_ERROR_ENUM */ + +#ifndef ZWP_POINTER_CONSTRAINTS_V1_LIFETIME_ENUM +#define ZWP_POINTER_CONSTRAINTS_V1_LIFETIME_ENUM +/** + * @ingroup iface_zwp_pointer_constraints_v1 + * constraint lifetime + * + * These values represent different lifetime semantics. They are passed + * as arguments to the factory requests to specify how the constraint + * lifetimes should be managed. + */ +enum zwp_pointer_constraints_v1_lifetime { + /** + * the pointer constraint is defunct once deactivated + * + * A oneshot pointer constraint will never reactivate once it has + * been deactivated. See the corresponding deactivation event + * (wp_locked_pointer.unlocked and wp_confined_pointer.unconfined) + * for details. + */ + ZWP_POINTER_CONSTRAINTS_V1_LIFETIME_ONESHOT = 1, + /** + * the pointer constraint may reactivate + * + * A persistent pointer constraint may again reactivate once it + * has been deactivated. See the corresponding deactivation event + * (wp_locked_pointer.unlocked and wp_confined_pointer.unconfined) + * for details. + */ + ZWP_POINTER_CONSTRAINTS_V1_LIFETIME_PERSISTENT = 2, +}; +#endif /* ZWP_POINTER_CONSTRAINTS_V1_LIFETIME_ENUM */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/protocols/wlr-layer-shell-unstable-v1-protocol.h b/protocols/wlr-layer-shell-unstable-v1-protocol.h new file mode 100644 index 0000000..716b79b --- /dev/null +++ b/protocols/wlr-layer-shell-unstable-v1-protocol.h @@ -0,0 +1,177 @@ +/* Generated by wayland-scanner 1.25.0 */ + +#ifndef WLR_LAYER_SHELL_UNSTABLE_V1_ENUM_PROTOCOL_H +#define WLR_LAYER_SHELL_UNSTABLE_V1_ENUM_PROTOCOL_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef ZWLR_LAYER_SHELL_V1_ERROR_ENUM +#define ZWLR_LAYER_SHELL_V1_ERROR_ENUM +enum zwlr_layer_shell_v1_error { + /** + * wl_surface has another role + */ + ZWLR_LAYER_SHELL_V1_ERROR_ROLE = 0, + /** + * layer value is invalid + */ + ZWLR_LAYER_SHELL_V1_ERROR_INVALID_LAYER = 1, + /** + * wl_surface has a buffer attached or committed + */ + ZWLR_LAYER_SHELL_V1_ERROR_ALREADY_CONSTRUCTED = 2, +}; +#endif /* ZWLR_LAYER_SHELL_V1_ERROR_ENUM */ + +#ifndef ZWLR_LAYER_SHELL_V1_LAYER_ENUM +#define ZWLR_LAYER_SHELL_V1_LAYER_ENUM +/** + * @ingroup iface_zwlr_layer_shell_v1 + * available layers for surfaces + * + * These values indicate which layers a surface can be rendered in. They + * are ordered by z depth, bottom-most first. Traditional shell surfaces + * will typically be rendered between the bottom and top layers. + * Fullscreen shell surfaces are typically rendered at the top layer. + * Multiple surfaces can share a single layer, and ordering within a + * single layer is undefined. + */ +enum zwlr_layer_shell_v1_layer { + ZWLR_LAYER_SHELL_V1_LAYER_BACKGROUND = 0, + ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM = 1, + ZWLR_LAYER_SHELL_V1_LAYER_TOP = 2, + ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY = 3, +}; +#endif /* ZWLR_LAYER_SHELL_V1_LAYER_ENUM */ + +#ifndef ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_ENUM +#define ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_ENUM +/** + * @ingroup iface_zwlr_layer_surface_v1 + * types of keyboard interaction possible for a layer shell surface + * + * Types of keyboard interaction possible for layer shell surfaces. The + * rationale for this is twofold: (1) some applications are not interested + * in keyboard events and not allowing them to be focused can improve the + * desktop experience; (2) some applications will want to take exclusive + * keyboard focus. + */ +enum zwlr_layer_surface_v1_keyboard_interactivity { + /** + * no keyboard focus is possible + * + * This value indicates that this surface is not interested in + * keyboard events and the compositor should never assign it the + * keyboard focus. + * + * This is the default value, set for newly created layer shell + * surfaces. + * + * This is useful for e.g. desktop widgets that display information + * or only have interaction with non-keyboard input devices. + */ + ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_NONE = 0, + /** + * request exclusive keyboard focus + * + * Request exclusive keyboard focus if this surface is above the + * shell surface layer. + * + * For the top and overlay layers, the seat will always give + * exclusive keyboard focus to the top-most layer which has + * keyboard interactivity set to exclusive. If this layer contains + * multiple surfaces with keyboard interactivity set to exclusive, + * the compositor determines the one receiving keyboard events in + * an implementation- defined manner. In this case, no guarantee is + * made when this surface will receive keyboard focus (if ever). + * + * For the bottom and background layers, the compositor is allowed + * to use normal focus semantics. + * + * This setting is mainly intended for applications that need to + * ensure they receive all keyboard events, such as a lock screen + * or a password prompt. + */ + ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_EXCLUSIVE = 1, + /** + * request regular keyboard focus semantics + * + * This requests the compositor to allow this surface to be + * focused and unfocused by the user in an implementation-defined + * manner. The user should be able to unfocus this surface even + * regardless of the layer it is on. + * + * Typically, the compositor will want to use its normal mechanism + * to manage keyboard focus between layer shell surfaces with this + * setting and regular toplevels on the desktop layer (e.g. click + * to focus). Nevertheless, it is possible for a compositor to + * require a special interaction to focus or unfocus layer shell + * surfaces (e.g. requiring a click even if focus follows the mouse + * normally, or providing a keybinding to switch focus between + * layers). + * + * This setting is mainly intended for desktop shell components + * (e.g. panels) that allow keyboard interaction. Using this option + * can allow implementing a desktop shell that can be fully usable + * without the mouse. + * @since 4 + */ + ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_ON_DEMAND = 2, +}; +/** + * @ingroup iface_zwlr_layer_surface_v1 + */ +#define ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_ON_DEMAND_SINCE_VERSION 4 +#endif /* ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_ENUM */ + +#ifndef ZWLR_LAYER_SURFACE_V1_ERROR_ENUM +#define ZWLR_LAYER_SURFACE_V1_ERROR_ENUM +enum zwlr_layer_surface_v1_error { + /** + * provided surface state is invalid + */ + ZWLR_LAYER_SURFACE_V1_ERROR_INVALID_SURFACE_STATE = 0, + /** + * size is invalid + */ + ZWLR_LAYER_SURFACE_V1_ERROR_INVALID_SIZE = 1, + /** + * anchor bitfield is invalid + */ + ZWLR_LAYER_SURFACE_V1_ERROR_INVALID_ANCHOR = 2, + /** + * keyboard interactivity is invalid + */ + ZWLR_LAYER_SURFACE_V1_ERROR_INVALID_KEYBOARD_INTERACTIVITY = 3, +}; +#endif /* ZWLR_LAYER_SURFACE_V1_ERROR_ENUM */ + +#ifndef ZWLR_LAYER_SURFACE_V1_ANCHOR_ENUM +#define ZWLR_LAYER_SURFACE_V1_ANCHOR_ENUM +enum zwlr_layer_surface_v1_anchor { + /** + * the top edge of the anchor rectangle + */ + ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP = 1, + /** + * the bottom edge of the anchor rectangle + */ + ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM = 2, + /** + * the left edge of the anchor rectangle + */ + ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT = 4, + /** + * the right edge of the anchor rectangle + */ + ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT = 8, +}; +#endif /* ZWLR_LAYER_SURFACE_V1_ANCHOR_ENUM */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/protocols/wlr-output-power-management-unstable-v1-protocol.h b/protocols/wlr-output-power-management-unstable-v1-protocol.h new file mode 100644 index 0000000..93d6a58 --- /dev/null +++ b/protocols/wlr-output-power-management-unstable-v1-protocol.h @@ -0,0 +1,285 @@ +/* Generated by wayland-scanner 1.25.0 */ + +#ifndef WLR_OUTPUT_POWER_MANAGEMENT_UNSTABLE_V1_SERVER_PROTOCOL_H +#define WLR_OUTPUT_POWER_MANAGEMENT_UNSTABLE_V1_SERVER_PROTOCOL_H + +#include +#include +#include "wayland-server.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct wl_client; +struct wl_resource; + +/** + * @page page_wlr_output_power_management_unstable_v1 The wlr_output_power_management_unstable_v1 protocol + * Control power management modes of outputs + * + * @section page_desc_wlr_output_power_management_unstable_v1 Description + * + * This protocol allows clients to control power management modes + * of outputs that are currently part of the compositor space. The + * intent is to allow special clients like desktop shells to power + * down outputs when the system is idle. + * + * To modify outputs not currently part of the compositor space see + * wlr-output-management. + * + * 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_wlr_output_power_management_unstable_v1 Interfaces + * - @subpage page_iface_zwlr_output_power_manager_v1 - manager to create per-output power management + * - @subpage page_iface_zwlr_output_power_v1 - adjust power management mode for an output + * @section page_copyright_wlr_output_power_management_unstable_v1 Copyright + *
+ *
+ * Copyright © 2019 Purism SPC
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * 
+ */ +struct wl_output; +struct zwlr_output_power_manager_v1; +struct zwlr_output_power_v1; + +#ifndef ZWLR_OUTPUT_POWER_MANAGER_V1_INTERFACE +#define ZWLR_OUTPUT_POWER_MANAGER_V1_INTERFACE +/** + * @page page_iface_zwlr_output_power_manager_v1 zwlr_output_power_manager_v1 + * @section page_iface_zwlr_output_power_manager_v1_desc Description + * + * This interface is a manager that allows creating per-output power + * management mode controls. + * @section page_iface_zwlr_output_power_manager_v1_api API + * See @ref iface_zwlr_output_power_manager_v1. + */ +/** + * @defgroup iface_zwlr_output_power_manager_v1 The zwlr_output_power_manager_v1 interface + * + * This interface is a manager that allows creating per-output power + * management mode controls. + */ +extern const struct wl_interface zwlr_output_power_manager_v1_interface; +#endif +#ifndef ZWLR_OUTPUT_POWER_V1_INTERFACE +#define ZWLR_OUTPUT_POWER_V1_INTERFACE +/** + * @page page_iface_zwlr_output_power_v1 zwlr_output_power_v1 + * @section page_iface_zwlr_output_power_v1_desc Description + * + * This object offers requests to set the power management mode of + * an output. + * @section page_iface_zwlr_output_power_v1_api API + * See @ref iface_zwlr_output_power_v1. + */ +/** + * @defgroup iface_zwlr_output_power_v1 The zwlr_output_power_v1 interface + * + * This object offers requests to set the power management mode of + * an output. + */ +extern const struct wl_interface zwlr_output_power_v1_interface; +#endif + +/** + * @ingroup iface_zwlr_output_power_manager_v1 + * @struct zwlr_output_power_manager_v1_interface + */ +struct zwlr_output_power_manager_v1_interface { + /** + * get a power management for an output + * + * Create a output power management mode control that can be used + * to adjust the power management mode for a given output. + */ + void (*get_output_power)(struct wl_client *client, + struct wl_resource *resource, + uint32_t id, + struct wl_resource *output); + /** + * destroy the manager + * + * All objects created by the manager will still remain valid, + * until their appropriate destroy request has been called. + */ + void (*destroy)(struct wl_client *client, + struct wl_resource *resource); +}; + + +/** + * @ingroup iface_zwlr_output_power_manager_v1 + */ +#define ZWLR_OUTPUT_POWER_MANAGER_V1_GET_OUTPUT_POWER_SINCE_VERSION 1 +/** + * @ingroup iface_zwlr_output_power_manager_v1 + */ +#define ZWLR_OUTPUT_POWER_MANAGER_V1_DESTROY_SINCE_VERSION 1 + +#ifndef ZWLR_OUTPUT_POWER_V1_MODE_ENUM +#define ZWLR_OUTPUT_POWER_V1_MODE_ENUM +enum zwlr_output_power_v1_mode { + /** + * Output is turned off. + */ + ZWLR_OUTPUT_POWER_V1_MODE_OFF = 0, + /** + * Output is turned on, no power saving + */ + ZWLR_OUTPUT_POWER_V1_MODE_ON = 1, +}; +#endif /* ZWLR_OUTPUT_POWER_V1_MODE_ENUM */ + +#ifndef ZWLR_OUTPUT_POWER_V1_MODE_ENUM_IS_VALID +#define ZWLR_OUTPUT_POWER_V1_MODE_ENUM_IS_VALID +/** + * @ingroup iface_zwlr_output_power_v1 + * Validate a zwlr_output_power_v1 mode value. + * + * @return true on success, false on error. + * @ref zwlr_output_power_v1_mode + */ +static inline bool +zwlr_output_power_v1_mode_is_valid(uint32_t value, uint32_t version) { + switch (value) { + case ZWLR_OUTPUT_POWER_V1_MODE_OFF: + return version >= 1; + case ZWLR_OUTPUT_POWER_V1_MODE_ON: + return version >= 1; + default: + return false; + } +} +#endif /* ZWLR_OUTPUT_POWER_V1_MODE_ENUM_IS_VALID */ + +#ifndef ZWLR_OUTPUT_POWER_V1_ERROR_ENUM +#define ZWLR_OUTPUT_POWER_V1_ERROR_ENUM +enum zwlr_output_power_v1_error { + /** + * inexistent power save mode + */ + ZWLR_OUTPUT_POWER_V1_ERROR_INVALID_MODE = 1, +}; +#endif /* ZWLR_OUTPUT_POWER_V1_ERROR_ENUM */ + +#ifndef ZWLR_OUTPUT_POWER_V1_ERROR_ENUM_IS_VALID +#define ZWLR_OUTPUT_POWER_V1_ERROR_ENUM_IS_VALID +/** + * @ingroup iface_zwlr_output_power_v1 + * Validate a zwlr_output_power_v1 error value. + * + * @return true on success, false on error. + * @ref zwlr_output_power_v1_error + */ +static inline bool +zwlr_output_power_v1_error_is_valid(uint32_t value, uint32_t version) { + switch (value) { + case ZWLR_OUTPUT_POWER_V1_ERROR_INVALID_MODE: + return version >= 1; + default: + return false; + } +} +#endif /* ZWLR_OUTPUT_POWER_V1_ERROR_ENUM_IS_VALID */ + +/** + * @ingroup iface_zwlr_output_power_v1 + * @struct zwlr_output_power_v1_interface + */ +struct zwlr_output_power_v1_interface { + /** + * Set an outputs power save mode + * + * Set an output's power save mode to the given mode. The mode + * change is effective immediately. If the output does not support + * the given mode a failed event is sent. + * @param mode the power save mode to set + */ + void (*set_mode)(struct wl_client *client, + struct wl_resource *resource, + uint32_t mode); + /** + * destroy this power management + * + * Destroys the output power management mode control object. + */ + void (*destroy)(struct wl_client *client, + struct wl_resource *resource); +}; + +#define ZWLR_OUTPUT_POWER_V1_MODE 0 +#define ZWLR_OUTPUT_POWER_V1_FAILED 1 + +/** + * @ingroup iface_zwlr_output_power_v1 + */ +#define ZWLR_OUTPUT_POWER_V1_MODE_SINCE_VERSION 1 +/** + * @ingroup iface_zwlr_output_power_v1 + */ +#define ZWLR_OUTPUT_POWER_V1_FAILED_SINCE_VERSION 1 + +/** + * @ingroup iface_zwlr_output_power_v1 + */ +#define ZWLR_OUTPUT_POWER_V1_SET_MODE_SINCE_VERSION 1 +/** + * @ingroup iface_zwlr_output_power_v1 + */ +#define ZWLR_OUTPUT_POWER_V1_DESTROY_SINCE_VERSION 1 + +/** + * @ingroup iface_zwlr_output_power_v1 + * Sends an mode event to the client owning the resource. + * @param resource_ The client's resource + * @param mode the output's new power management mode + */ +static inline void +zwlr_output_power_v1_send_mode(struct wl_resource *resource_, uint32_t mode) +{ + wl_resource_post_event(resource_, ZWLR_OUTPUT_POWER_V1_MODE, mode); +} + +/** + * @ingroup iface_zwlr_output_power_v1 + * Sends an failed event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +zwlr_output_power_v1_send_failed(struct wl_resource *resource_) +{ + wl_resource_post_event(resource_, ZWLR_OUTPUT_POWER_V1_FAILED); +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/protocols/xdg-shell-protocol.h b/protocols/xdg-shell-protocol.h new file mode 100644 index 0000000..1ce3039 --- /dev/null +++ b/protocols/xdg-shell-protocol.h @@ -0,0 +1,2392 @@ +/* Generated by wayland-scanner 1.25.0 */ + +#ifndef XDG_SHELL_SERVER_PROTOCOL_H +#define XDG_SHELL_SERVER_PROTOCOL_H + +#include +#include +#include "wayland-server.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct wl_client; +struct wl_resource; + +/** + * @page page_xdg_shell The xdg_shell protocol + * @section page_ifaces_xdg_shell Interfaces + * - @subpage page_iface_xdg_wm_base - create desktop-style surfaces + * - @subpage page_iface_xdg_positioner - child surface positioner + * - @subpage page_iface_xdg_surface - desktop user interface surface base interface + * - @subpage page_iface_xdg_toplevel - toplevel surface + * - @subpage page_iface_xdg_popup - short-lived, popup surfaces for menus + * @section page_copyright_xdg_shell Copyright + *
+ *
+ * Copyright © 2008-2013 Kristian Høgsberg
+ * Copyright © 2013      Rafael Antognolli
+ * Copyright © 2013      Jasper St. Pierre
+ * Copyright © 2010-2013 Intel Corporation
+ * Copyright © 2015-2017 Samsung Electronics Co., Ltd
+ * Copyright © 2015-2017 Red Hat Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * 
+ */ +struct wl_output; +struct wl_seat; +struct wl_surface; +struct xdg_popup; +struct xdg_positioner; +struct xdg_surface; +struct xdg_toplevel; +struct xdg_wm_base; + +#ifndef XDG_WM_BASE_INTERFACE +#define XDG_WM_BASE_INTERFACE +/** + * @page page_iface_xdg_wm_base xdg_wm_base + * @section page_iface_xdg_wm_base_desc Description + * + * The xdg_wm_base interface is exposed as a global object enabling clients + * to turn their wl_surfaces into windows in a desktop environment. It + * defines the basic functionality needed for clients and the compositor to + * create windows that can be dragged, resized, maximized, etc, as well as + * creating transient windows such as popup menus. + * @section page_iface_xdg_wm_base_api API + * See @ref iface_xdg_wm_base. + */ +/** + * @defgroup iface_xdg_wm_base The xdg_wm_base interface + * + * The xdg_wm_base interface is exposed as a global object enabling clients + * to turn their wl_surfaces into windows in a desktop environment. It + * defines the basic functionality needed for clients and the compositor to + * create windows that can be dragged, resized, maximized, etc, as well as + * creating transient windows such as popup menus. + */ +extern const struct wl_interface xdg_wm_base_interface; +#endif +#ifndef XDG_POSITIONER_INTERFACE +#define XDG_POSITIONER_INTERFACE +/** + * @page page_iface_xdg_positioner xdg_positioner + * @section page_iface_xdg_positioner_desc Description + * + * The xdg_positioner provides a collection of rules for the placement of a + * child surface relative to a parent surface. Rules can be defined to ensure + * the child surface remains within the visible area's borders, and to + * specify how the child surface changes its position, such as sliding along + * an axis, or flipping around a rectangle. These positioner-created rules are + * constrained by the requirement that a child surface must intersect with or + * be at least partially adjacent to its parent surface. + * + * See the various requests for details about possible rules. + * + * At the time of the request, the compositor makes a copy of the rules + * specified by the xdg_positioner. Thus, after the request is complete the + * xdg_positioner object can be destroyed or reused; further changes to the + * object will have no effect on previous usages. + * + * For an xdg_positioner object to be considered complete, it must have a + * non-zero size set by set_size, and a non-zero anchor rectangle set by + * set_anchor_rect. Passing an incomplete xdg_positioner object when + * positioning a surface raises an invalid_positioner error. + * @section page_iface_xdg_positioner_api API + * See @ref iface_xdg_positioner. + */ +/** + * @defgroup iface_xdg_positioner The xdg_positioner interface + * + * The xdg_positioner provides a collection of rules for the placement of a + * child surface relative to a parent surface. Rules can be defined to ensure + * the child surface remains within the visible area's borders, and to + * specify how the child surface changes its position, such as sliding along + * an axis, or flipping around a rectangle. These positioner-created rules are + * constrained by the requirement that a child surface must intersect with or + * be at least partially adjacent to its parent surface. + * + * See the various requests for details about possible rules. + * + * At the time of the request, the compositor makes a copy of the rules + * specified by the xdg_positioner. Thus, after the request is complete the + * xdg_positioner object can be destroyed or reused; further changes to the + * object will have no effect on previous usages. + * + * For an xdg_positioner object to be considered complete, it must have a + * non-zero size set by set_size, and a non-zero anchor rectangle set by + * set_anchor_rect. Passing an incomplete xdg_positioner object when + * positioning a surface raises an invalid_positioner error. + */ +extern const struct wl_interface xdg_positioner_interface; +#endif +#ifndef XDG_SURFACE_INTERFACE +#define XDG_SURFACE_INTERFACE +/** + * @page page_iface_xdg_surface xdg_surface + * @section page_iface_xdg_surface_desc Description + * + * An interface that may be implemented by a wl_surface, for + * implementations that provide a desktop-style user interface. + * + * It provides a base set of functionality required to construct user + * interface elements requiring management by the compositor, such as + * toplevel windows, menus, etc. The types of functionality are split into + * xdg_surface roles. + * + * Creating an xdg_surface does not set the role for a wl_surface. In order + * to map an xdg_surface, the client must create a role-specific object + * using, e.g., get_toplevel, get_popup. The wl_surface for any given + * xdg_surface can have at most one role, and may not be assigned any role + * not based on xdg_surface. + * + * A role must be assigned before any other requests are made to the + * xdg_surface object. + * + * The client must call wl_surface.commit on the corresponding wl_surface + * for the xdg_surface state to take effect. + * + * Creating an xdg_surface from a wl_surface which has a buffer attached or + * committed is a client error, and any attempts by a client to attach or + * manipulate a buffer prior to the first xdg_surface.configure call must + * also be treated as errors. + * + * After creating a role-specific object and setting it up (e.g. by sending + * the title, app ID, size constraints, parent, etc), the client must + * perform an initial commit without any buffer attached. The compositor + * will reply with initial wl_surface state such as + * wl_surface.preferred_buffer_scale followed by an xdg_surface.configure + * event. The client must acknowledge it and is then allowed to attach a + * buffer to map the surface. + * + * Mapping an xdg_surface-based role surface is defined as making it + * possible for the surface to be shown by the compositor. Note that + * a mapped surface is not guaranteed to be visible once it is mapped. + * + * For an xdg_surface to be mapped by the compositor, the following + * conditions must be met: + * (1) the client has assigned an xdg_surface-based role to the surface + * (2) the client has set and committed the xdg_surface state and the + * role-dependent state to the surface + * (3) the client has committed a buffer to the surface + * + * A newly-unmapped surface is considered to have met condition (1) out + * of the 3 required conditions for mapping a surface if its role surface + * has not been destroyed, i.e. the client must perform the initial commit + * again before attaching a buffer. + * @section page_iface_xdg_surface_api API + * See @ref iface_xdg_surface. + */ +/** + * @defgroup iface_xdg_surface The xdg_surface interface + * + * An interface that may be implemented by a wl_surface, for + * implementations that provide a desktop-style user interface. + * + * It provides a base set of functionality required to construct user + * interface elements requiring management by the compositor, such as + * toplevel windows, menus, etc. The types of functionality are split into + * xdg_surface roles. + * + * Creating an xdg_surface does not set the role for a wl_surface. In order + * to map an xdg_surface, the client must create a role-specific object + * using, e.g., get_toplevel, get_popup. The wl_surface for any given + * xdg_surface can have at most one role, and may not be assigned any role + * not based on xdg_surface. + * + * A role must be assigned before any other requests are made to the + * xdg_surface object. + * + * The client must call wl_surface.commit on the corresponding wl_surface + * for the xdg_surface state to take effect. + * + * Creating an xdg_surface from a wl_surface which has a buffer attached or + * committed is a client error, and any attempts by a client to attach or + * manipulate a buffer prior to the first xdg_surface.configure call must + * also be treated as errors. + * + * After creating a role-specific object and setting it up (e.g. by sending + * the title, app ID, size constraints, parent, etc), the client must + * perform an initial commit without any buffer attached. The compositor + * will reply with initial wl_surface state such as + * wl_surface.preferred_buffer_scale followed by an xdg_surface.configure + * event. The client must acknowledge it and is then allowed to attach a + * buffer to map the surface. + * + * Mapping an xdg_surface-based role surface is defined as making it + * possible for the surface to be shown by the compositor. Note that + * a mapped surface is not guaranteed to be visible once it is mapped. + * + * For an xdg_surface to be mapped by the compositor, the following + * conditions must be met: + * (1) the client has assigned an xdg_surface-based role to the surface + * (2) the client has set and committed the xdg_surface state and the + * role-dependent state to the surface + * (3) the client has committed a buffer to the surface + * + * A newly-unmapped surface is considered to have met condition (1) out + * of the 3 required conditions for mapping a surface if its role surface + * has not been destroyed, i.e. the client must perform the initial commit + * again before attaching a buffer. + */ +extern const struct wl_interface xdg_surface_interface; +#endif +#ifndef XDG_TOPLEVEL_INTERFACE +#define XDG_TOPLEVEL_INTERFACE +/** + * @page page_iface_xdg_toplevel xdg_toplevel + * @section page_iface_xdg_toplevel_desc Description + * + * This interface defines an xdg_surface role which allows a surface to, + * among other things, set window-like properties such as maximize, + * fullscreen, and minimize, set application-specific metadata like title and + * id, and well as trigger user interactive operations such as interactive + * resize and move. + * + * An xdg_toplevel by default is responsible for providing the full intended + * visual representation of the toplevel, which depending on the window + * state, may mean things like a title bar, window controls and drop shadow. + * + * Unmapping an xdg_toplevel means that the surface cannot be shown + * by the compositor until it is explicitly mapped again. + * All active operations (e.g., move, resize) are canceled and all + * attributes (e.g. title, state, stacking, ...) are discarded for + * an xdg_toplevel surface when it is unmapped. The xdg_toplevel returns to + * the state it had right after xdg_surface.get_toplevel. The client + * can re-map the toplevel by performing a commit without any buffer + * attached, waiting for a configure event and handling it as usual (see + * xdg_surface description). + * + * Attaching a null buffer to a toplevel unmaps the surface. + * @section page_iface_xdg_toplevel_api API + * See @ref iface_xdg_toplevel. + */ +/** + * @defgroup iface_xdg_toplevel The xdg_toplevel interface + * + * This interface defines an xdg_surface role which allows a surface to, + * among other things, set window-like properties such as maximize, + * fullscreen, and minimize, set application-specific metadata like title and + * id, and well as trigger user interactive operations such as interactive + * resize and move. + * + * An xdg_toplevel by default is responsible for providing the full intended + * visual representation of the toplevel, which depending on the window + * state, may mean things like a title bar, window controls and drop shadow. + * + * Unmapping an xdg_toplevel means that the surface cannot be shown + * by the compositor until it is explicitly mapped again. + * All active operations (e.g., move, resize) are canceled and all + * attributes (e.g. title, state, stacking, ...) are discarded for + * an xdg_toplevel surface when it is unmapped. The xdg_toplevel returns to + * the state it had right after xdg_surface.get_toplevel. The client + * can re-map the toplevel by performing a commit without any buffer + * attached, waiting for a configure event and handling it as usual (see + * xdg_surface description). + * + * Attaching a null buffer to a toplevel unmaps the surface. + */ +extern const struct wl_interface xdg_toplevel_interface; +#endif +#ifndef XDG_POPUP_INTERFACE +#define XDG_POPUP_INTERFACE +/** + * @page page_iface_xdg_popup xdg_popup + * @section page_iface_xdg_popup_desc Description + * + * A popup surface is a short-lived, temporary surface. It can be used to + * implement for example menus, popovers, tooltips and other similar user + * interface concepts. + * + * A popup can be made to take an explicit grab. See xdg_popup.grab for + * details. + * + * When the popup is dismissed, a popup_done event will be sent out, and at + * the same time the surface will be unmapped. See the xdg_popup.popup_done + * event for details. + * + * Explicitly destroying the xdg_popup object will also dismiss the popup and + * unmap the surface. Clients that want to dismiss the popup when another + * surface of their own is clicked should dismiss the popup using the destroy + * request. + * + * A newly created xdg_popup will be stacked on top of all previously created + * xdg_popup surfaces associated with the same xdg_toplevel. + * + * The parent of an xdg_popup must be mapped (see the xdg_surface + * description) before the xdg_popup itself. + * + * The client must call wl_surface.commit on the corresponding wl_surface + * for the xdg_popup state to take effect. + * @section page_iface_xdg_popup_api API + * See @ref iface_xdg_popup. + */ +/** + * @defgroup iface_xdg_popup The xdg_popup interface + * + * A popup surface is a short-lived, temporary surface. It can be used to + * implement for example menus, popovers, tooltips and other similar user + * interface concepts. + * + * A popup can be made to take an explicit grab. See xdg_popup.grab for + * details. + * + * When the popup is dismissed, a popup_done event will be sent out, and at + * the same time the surface will be unmapped. See the xdg_popup.popup_done + * event for details. + * + * Explicitly destroying the xdg_popup object will also dismiss the popup and + * unmap the surface. Clients that want to dismiss the popup when another + * surface of their own is clicked should dismiss the popup using the destroy + * request. + * + * A newly created xdg_popup will be stacked on top of all previously created + * xdg_popup surfaces associated with the same xdg_toplevel. + * + * The parent of an xdg_popup must be mapped (see the xdg_surface + * description) before the xdg_popup itself. + * + * The client must call wl_surface.commit on the corresponding wl_surface + * for the xdg_popup state to take effect. + */ +extern const struct wl_interface xdg_popup_interface; +#endif + +#ifndef XDG_WM_BASE_ERROR_ENUM +#define XDG_WM_BASE_ERROR_ENUM +enum xdg_wm_base_error { + /** + * given wl_surface has another role + */ + XDG_WM_BASE_ERROR_ROLE = 0, + /** + * xdg_wm_base was destroyed before children + */ + XDG_WM_BASE_ERROR_DEFUNCT_SURFACES = 1, + /** + * the client tried to map or destroy a non-topmost popup + */ + XDG_WM_BASE_ERROR_NOT_THE_TOPMOST_POPUP = 2, + /** + * the client specified an invalid popup parent surface + */ + XDG_WM_BASE_ERROR_INVALID_POPUP_PARENT = 3, + /** + * the client provided an invalid surface state + */ + XDG_WM_BASE_ERROR_INVALID_SURFACE_STATE = 4, + /** + * the client provided an invalid positioner + */ + XDG_WM_BASE_ERROR_INVALID_POSITIONER = 5, + /** + * the client didn’t respond to a ping event in time + */ + XDG_WM_BASE_ERROR_UNRESPONSIVE = 6, +}; +#endif /* XDG_WM_BASE_ERROR_ENUM */ + +#ifndef XDG_WM_BASE_ERROR_ENUM_IS_VALID +#define XDG_WM_BASE_ERROR_ENUM_IS_VALID +/** + * @ingroup iface_xdg_wm_base + * Validate a xdg_wm_base error value. + * + * @return true on success, false on error. + * @ref xdg_wm_base_error + */ +static inline bool +xdg_wm_base_error_is_valid(uint32_t value, uint32_t version) { + switch (value) { + case XDG_WM_BASE_ERROR_ROLE: + return version >= 1; + case XDG_WM_BASE_ERROR_DEFUNCT_SURFACES: + return version >= 1; + case XDG_WM_BASE_ERROR_NOT_THE_TOPMOST_POPUP: + return version >= 1; + case XDG_WM_BASE_ERROR_INVALID_POPUP_PARENT: + return version >= 1; + case XDG_WM_BASE_ERROR_INVALID_SURFACE_STATE: + return version >= 1; + case XDG_WM_BASE_ERROR_INVALID_POSITIONER: + return version >= 1; + case XDG_WM_BASE_ERROR_UNRESPONSIVE: + return version >= 1; + default: + return false; + } +} +#endif /* XDG_WM_BASE_ERROR_ENUM_IS_VALID */ + +/** + * @ingroup iface_xdg_wm_base + * @struct xdg_wm_base_interface + */ +struct xdg_wm_base_interface { + /** + * destroy xdg_wm_base + * + * Destroy this xdg_wm_base object. + * + * Destroying a bound xdg_wm_base object while there are surfaces + * still alive created by this xdg_wm_base object instance is + * illegal and will result in a defunct_surfaces error. + */ + void (*destroy)(struct wl_client *client, + struct wl_resource *resource); + /** + * create a positioner object + * + * Create a positioner object. A positioner object is used to + * position surfaces relative to some parent surface. See the + * interface description and xdg_surface.get_popup for details. + */ + void (*create_positioner)(struct wl_client *client, + struct wl_resource *resource, + uint32_t id); + /** + * create a shell surface from a surface + * + * This creates an xdg_surface for the given surface. An + * xdg_surface is used as basis to define a role to a given + * surface, such as xdg_toplevel or xdg_popup. It also manages + * functionality shared between xdg_surface based surface roles. + * + * While xdg_surface itself is not a role, the corresponding + * surface may only be assigned a role extending xdg_surface, such + * as xdg_toplevel or xdg_popup. It is illegal to create an + * xdg_surface for a wl_surface which already has anassigned role + * and this will result in a role error. + * + * See the documentation of xdg_surface for more details about what + * an xdg_surface is and how it is used. + */ + void (*get_xdg_surface)(struct wl_client *client, + struct wl_resource *resource, + uint32_t id, + struct wl_resource *surface); + /** + * respond to a ping event + * + * A client must respond to a ping event with a pong request or + * the client may be deemed unresponsive. See xdg_wm_base.ping and + * xdg_wm_base.error.unresponsive. + * @param serial serial of the ping event + */ + void (*pong)(struct wl_client *client, + struct wl_resource *resource, + uint32_t serial); +}; + +#define XDG_WM_BASE_PING 0 + +/** + * @ingroup iface_xdg_wm_base + */ +#define XDG_WM_BASE_PING_SINCE_VERSION 1 + +/** + * @ingroup iface_xdg_wm_base + */ +#define XDG_WM_BASE_DESTROY_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_wm_base + */ +#define XDG_WM_BASE_CREATE_POSITIONER_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_wm_base + */ +#define XDG_WM_BASE_GET_XDG_SURFACE_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_wm_base + */ +#define XDG_WM_BASE_PONG_SINCE_VERSION 1 + +/** + * @ingroup iface_xdg_wm_base + * Sends an ping event to the client owning the resource. + * @param resource_ The client's resource + * @param serial pass this to the pong request + */ +static inline void +xdg_wm_base_send_ping(struct wl_resource *resource_, uint32_t serial) +{ + wl_resource_post_event(resource_, XDG_WM_BASE_PING, serial); +} + +#ifndef XDG_POSITIONER_ERROR_ENUM +#define XDG_POSITIONER_ERROR_ENUM +enum xdg_positioner_error { + /** + * invalid input provided + */ + XDG_POSITIONER_ERROR_INVALID_INPUT = 0, +}; +#endif /* XDG_POSITIONER_ERROR_ENUM */ + +#ifndef XDG_POSITIONER_ERROR_ENUM_IS_VALID +#define XDG_POSITIONER_ERROR_ENUM_IS_VALID +/** + * @ingroup iface_xdg_positioner + * Validate a xdg_positioner error value. + * + * @return true on success, false on error. + * @ref xdg_positioner_error + */ +static inline bool +xdg_positioner_error_is_valid(uint32_t value, uint32_t version) { + switch (value) { + case XDG_POSITIONER_ERROR_INVALID_INPUT: + return version >= 1; + default: + return false; + } +} +#endif /* XDG_POSITIONER_ERROR_ENUM_IS_VALID */ + +#ifndef XDG_POSITIONER_ANCHOR_ENUM +#define XDG_POSITIONER_ANCHOR_ENUM +enum xdg_positioner_anchor { + XDG_POSITIONER_ANCHOR_NONE = 0, + XDG_POSITIONER_ANCHOR_TOP = 1, + XDG_POSITIONER_ANCHOR_BOTTOM = 2, + XDG_POSITIONER_ANCHOR_LEFT = 3, + XDG_POSITIONER_ANCHOR_RIGHT = 4, + XDG_POSITIONER_ANCHOR_TOP_LEFT = 5, + XDG_POSITIONER_ANCHOR_BOTTOM_LEFT = 6, + XDG_POSITIONER_ANCHOR_TOP_RIGHT = 7, + XDG_POSITIONER_ANCHOR_BOTTOM_RIGHT = 8, +}; +#endif /* XDG_POSITIONER_ANCHOR_ENUM */ + +#ifndef XDG_POSITIONER_ANCHOR_ENUM_IS_VALID +#define XDG_POSITIONER_ANCHOR_ENUM_IS_VALID +/** + * @ingroup iface_xdg_positioner + * Validate a xdg_positioner anchor value. + * + * @return true on success, false on error. + * @ref xdg_positioner_anchor + */ +static inline bool +xdg_positioner_anchor_is_valid(uint32_t value, uint32_t version) { + switch (value) { + case XDG_POSITIONER_ANCHOR_NONE: + return version >= 1; + case XDG_POSITIONER_ANCHOR_TOP: + return version >= 1; + case XDG_POSITIONER_ANCHOR_BOTTOM: + return version >= 1; + case XDG_POSITIONER_ANCHOR_LEFT: + return version >= 1; + case XDG_POSITIONER_ANCHOR_RIGHT: + return version >= 1; + case XDG_POSITIONER_ANCHOR_TOP_LEFT: + return version >= 1; + case XDG_POSITIONER_ANCHOR_BOTTOM_LEFT: + return version >= 1; + case XDG_POSITIONER_ANCHOR_TOP_RIGHT: + return version >= 1; + case XDG_POSITIONER_ANCHOR_BOTTOM_RIGHT: + return version >= 1; + default: + return false; + } +} +#endif /* XDG_POSITIONER_ANCHOR_ENUM_IS_VALID */ + +#ifndef XDG_POSITIONER_GRAVITY_ENUM +#define XDG_POSITIONER_GRAVITY_ENUM +enum xdg_positioner_gravity { + XDG_POSITIONER_GRAVITY_NONE = 0, + XDG_POSITIONER_GRAVITY_TOP = 1, + XDG_POSITIONER_GRAVITY_BOTTOM = 2, + XDG_POSITIONER_GRAVITY_LEFT = 3, + XDG_POSITIONER_GRAVITY_RIGHT = 4, + XDG_POSITIONER_GRAVITY_TOP_LEFT = 5, + XDG_POSITIONER_GRAVITY_BOTTOM_LEFT = 6, + XDG_POSITIONER_GRAVITY_TOP_RIGHT = 7, + XDG_POSITIONER_GRAVITY_BOTTOM_RIGHT = 8, +}; +#endif /* XDG_POSITIONER_GRAVITY_ENUM */ + +#ifndef XDG_POSITIONER_GRAVITY_ENUM_IS_VALID +#define XDG_POSITIONER_GRAVITY_ENUM_IS_VALID +/** + * @ingroup iface_xdg_positioner + * Validate a xdg_positioner gravity value. + * + * @return true on success, false on error. + * @ref xdg_positioner_gravity + */ +static inline bool +xdg_positioner_gravity_is_valid(uint32_t value, uint32_t version) { + switch (value) { + case XDG_POSITIONER_GRAVITY_NONE: + return version >= 1; + case XDG_POSITIONER_GRAVITY_TOP: + return version >= 1; + case XDG_POSITIONER_GRAVITY_BOTTOM: + return version >= 1; + case XDG_POSITIONER_GRAVITY_LEFT: + return version >= 1; + case XDG_POSITIONER_GRAVITY_RIGHT: + return version >= 1; + case XDG_POSITIONER_GRAVITY_TOP_LEFT: + return version >= 1; + case XDG_POSITIONER_GRAVITY_BOTTOM_LEFT: + return version >= 1; + case XDG_POSITIONER_GRAVITY_TOP_RIGHT: + return version >= 1; + case XDG_POSITIONER_GRAVITY_BOTTOM_RIGHT: + return version >= 1; + default: + return false; + } +} +#endif /* XDG_POSITIONER_GRAVITY_ENUM_IS_VALID */ + +#ifndef XDG_POSITIONER_CONSTRAINT_ADJUSTMENT_ENUM +#define XDG_POSITIONER_CONSTRAINT_ADJUSTMENT_ENUM +/** + * @ingroup iface_xdg_positioner + * constraint adjustments + * + * The constraint adjustment value define ways the compositor will adjust + * the position of the surface, if the unadjusted position would result + * in the surface being partly constrained. + * + * Whether a surface is considered 'constrained' is left to the compositor + * to determine. For example, the surface may be partly outside the + * compositor's defined 'work area', thus necessitating the child surface's + * position be adjusted until it is entirely inside the work area. + * + * The adjustments can be combined, according to a defined precedence: 1) + * Flip, 2) Slide, 3) Resize. + */ +enum xdg_positioner_constraint_adjustment { + /** + * don't move the child surface when constrained + * + * Don't alter the surface position even if it is constrained on + * some axis, for example partially outside the edge of an output. + */ + XDG_POSITIONER_CONSTRAINT_ADJUSTMENT_NONE = 0, + /** + * move along the x axis until unconstrained + * + * Slide the surface along the x axis until it is no longer + * constrained. + * + * First try to slide towards the direction of the gravity on the x + * axis until either the edge in the opposite direction of the + * gravity is unconstrained or the edge in the direction of the + * gravity is constrained. + * + * Then try to slide towards the opposite direction of the gravity + * on the x axis until either the edge in the direction of the + * gravity is unconstrained or the edge in the opposite direction + * of the gravity is constrained. + */ + XDG_POSITIONER_CONSTRAINT_ADJUSTMENT_SLIDE_X = 1, + /** + * move along the y axis until unconstrained + * + * Slide the surface along the y axis until it is no longer + * constrained. + * + * First try to slide towards the direction of the gravity on the y + * axis until either the edge in the opposite direction of the + * gravity is unconstrained or the edge in the direction of the + * gravity is constrained. + * + * Then try to slide towards the opposite direction of the gravity + * on the y axis until either the edge in the direction of the + * gravity is unconstrained or the edge in the opposite direction + * of the gravity is constrained. + */ + XDG_POSITIONER_CONSTRAINT_ADJUSTMENT_SLIDE_Y = 2, + /** + * invert the anchor and gravity on the x axis + * + * Invert the anchor and gravity on the x axis if the surface is + * constrained on the x axis. For example, if the left edge of the + * surface is constrained, the gravity is 'left' and the anchor is + * 'left', change the gravity to 'right' and the anchor to 'right'. + * + * If the adjusted position also ends up being constrained, the + * resulting position of the flip_x adjustment will be the one + * before the adjustment. + */ + XDG_POSITIONER_CONSTRAINT_ADJUSTMENT_FLIP_X = 4, + /** + * invert the anchor and gravity on the y axis + * + * Invert the anchor and gravity on the y axis if the surface is + * constrained on the y axis. For example, if the bottom edge of + * the surface is constrained, the gravity is 'bottom' and the + * anchor is 'bottom', change the gravity to 'top' and the anchor + * to 'top'. + * + * The adjusted position is calculated given the original anchor + * rectangle and offset, but with the new flipped anchor and + * gravity values. + * + * If the adjusted position also ends up being constrained, the + * resulting position of the flip_y adjustment will be the one + * before the adjustment. + */ + XDG_POSITIONER_CONSTRAINT_ADJUSTMENT_FLIP_Y = 8, + /** + * horizontally resize the surface + * + * Resize the surface horizontally so that it is completely + * unconstrained. + */ + XDG_POSITIONER_CONSTRAINT_ADJUSTMENT_RESIZE_X = 16, + /** + * vertically resize the surface + * + * Resize the surface vertically so that it is completely + * unconstrained. + */ + XDG_POSITIONER_CONSTRAINT_ADJUSTMENT_RESIZE_Y = 32, +}; +#endif /* XDG_POSITIONER_CONSTRAINT_ADJUSTMENT_ENUM */ + +#ifndef XDG_POSITIONER_CONSTRAINT_ADJUSTMENT_ENUM_IS_VALID +#define XDG_POSITIONER_CONSTRAINT_ADJUSTMENT_ENUM_IS_VALID +/** + * @ingroup iface_xdg_positioner + * Validate a xdg_positioner constraint_adjustment value. + * + * @return true on success, false on error. + * @ref xdg_positioner_constraint_adjustment + */ +static inline bool +xdg_positioner_constraint_adjustment_is_valid(uint32_t value, uint32_t version) { + uint32_t valid = 0; + if (version >= 1) + valid |= XDG_POSITIONER_CONSTRAINT_ADJUSTMENT_NONE; + if (version >= 1) + valid |= XDG_POSITIONER_CONSTRAINT_ADJUSTMENT_SLIDE_X; + if (version >= 1) + valid |= XDG_POSITIONER_CONSTRAINT_ADJUSTMENT_SLIDE_Y; + if (version >= 1) + valid |= XDG_POSITIONER_CONSTRAINT_ADJUSTMENT_FLIP_X; + if (version >= 1) + valid |= XDG_POSITIONER_CONSTRAINT_ADJUSTMENT_FLIP_Y; + if (version >= 1) + valid |= XDG_POSITIONER_CONSTRAINT_ADJUSTMENT_RESIZE_X; + if (version >= 1) + valid |= XDG_POSITIONER_CONSTRAINT_ADJUSTMENT_RESIZE_Y; + return (value & ~valid) == 0; +} +#endif /* XDG_POSITIONER_CONSTRAINT_ADJUSTMENT_ENUM_IS_VALID */ + +/** + * @ingroup iface_xdg_positioner + * @struct xdg_positioner_interface + */ +struct xdg_positioner_interface { + /** + * destroy the xdg_positioner object + * + * Notify the compositor that the xdg_positioner will no longer + * be used. + */ + void (*destroy)(struct wl_client *client, + struct wl_resource *resource); + /** + * set the size of the to-be positioned rectangle + * + * Set the size of the surface that is to be positioned with the + * positioner object. The size is in surface-local coordinates and + * corresponds to the window geometry. See + * xdg_surface.set_window_geometry. + * + * If a zero or negative size is set the invalid_input error is + * raised. + * @param width width of positioned rectangle + * @param height height of positioned rectangle + */ + void (*set_size)(struct wl_client *client, + struct wl_resource *resource, + int32_t width, + int32_t height); + /** + * set the anchor rectangle within the parent surface + * + * Specify the anchor rectangle within the parent surface that + * the child surface will be placed relative to. The rectangle is + * relative to the window geometry as defined by + * xdg_surface.set_window_geometry of the parent surface. + * + * When the xdg_positioner object is used to position a child + * surface, the anchor rectangle may not extend outside the window + * geometry of the positioned child's parent surface. + * + * If a negative size is set the invalid_input error is raised. + * @param x x position of anchor rectangle + * @param y y position of anchor rectangle + * @param width width of anchor rectangle + * @param height height of anchor rectangle + */ + void (*set_anchor_rect)(struct wl_client *client, + struct wl_resource *resource, + int32_t x, + int32_t y, + int32_t width, + int32_t height); + /** + * set anchor rectangle anchor + * + * Defines the anchor point for the anchor rectangle. The + * specified anchor is used to derive an anchor point that the + * child surface will be positioned relative to. If a corner anchor + * is set (e.g. 'top_left' or 'bottom_right'), the anchor point + * will be at the specified corner; otherwise, the derived anchor + * point will be centered on the specified edge, or in the center + * of the anchor rectangle if no edge is specified. + * @param anchor anchor point + */ + void (*set_anchor)(struct wl_client *client, + struct wl_resource *resource, + uint32_t anchor); + /** + * set child surface gravity + * + * Defines in what direction a surface should be positioned, + * relative to the anchor point of the parent surface. If a corner + * gravity is specified (e.g. 'bottom_right' or 'top_left'), then + * the child surface will be placed towards the specified gravity; + * otherwise, the child surface will be centered over the anchor + * point on any axis that had no gravity specified. If the gravity + * is not in the ‘gravity’ enum, an invalid_input error is + * raised. + * @param gravity gravity direction + */ + void (*set_gravity)(struct wl_client *client, + struct wl_resource *resource, + uint32_t gravity); + /** + * set the adjustment to be done when constrained + * + * Specify how the window should be positioned if the originally + * intended position caused the surface to be constrained, meaning + * at least partially outside positioning boundaries set by the + * compositor. The adjustment is set by constructing a bitmask + * describing the adjustment to be made when the surface is + * constrained on that axis. + * + * If no bit for one axis is set, the compositor will assume that + * the child surface should not change its position on that axis + * when constrained. + * + * If more than one bit for one axis is set, the order of how + * adjustments are applied is specified in the corresponding + * adjustment descriptions. + * + * The default adjustment is none. + * @param constraint_adjustment bit mask of constraint adjustments + */ + void (*set_constraint_adjustment)(struct wl_client *client, + struct wl_resource *resource, + uint32_t constraint_adjustment); + /** + * set surface position offset + * + * Specify the surface position offset relative to the position + * of the anchor on the anchor rectangle and the anchor on the + * surface. For example if the anchor of the anchor rectangle is at + * (x, y), the surface has the gravity bottom|right, and the offset + * is (ox, oy), the calculated surface position will be (x + ox, y + * + oy). The offset position of the surface is the one used for + * constraint testing. See set_constraint_adjustment. + * + * An example use case is placing a popup menu on top of a user + * interface element, while aligning the user interface element of + * the parent surface with some user interface element placed + * somewhere in the popup surface. + * @param x surface position x offset + * @param y surface position y offset + */ + void (*set_offset)(struct wl_client *client, + struct wl_resource *resource, + int32_t x, + int32_t y); + /** + * continuously reconstrain the surface + * + * When set reactive, the surface is reconstrained if the + * conditions used for constraining changed, e.g. the parent window + * moved. + * + * If the conditions changed and the popup was reconstrained, an + * xdg_popup.configure event is sent with updated geometry, + * followed by an xdg_surface.configure event. + * @since 3 + */ + void (*set_reactive)(struct wl_client *client, + struct wl_resource *resource); + /** + * set parent size + * + * Set the parent window geometry the compositor should use when + * positioning the popup. The compositor may use this information + * to determine the future state the popup should be constrained + * using. If this doesn't match the dimension of the parent the + * popup is eventually positioned against, the behavior is + * undefined. + * + * The arguments are given in the surface-local coordinate space. + * @param parent_width future window geometry width of parent + * @param parent_height future window geometry height of parent + * @since 3 + */ + void (*set_parent_size)(struct wl_client *client, + struct wl_resource *resource, + int32_t parent_width, + int32_t parent_height); + /** + * set parent configure this is a response to + * + * Set the serial of an xdg_surface.configure event this + * positioner will be used in response to. The compositor may use + * this information together with set_parent_size to determine what + * future state the popup should be constrained using. + * @param serial serial of parent configure event + * @since 3 + */ + void (*set_parent_configure)(struct wl_client *client, + struct wl_resource *resource, + uint32_t serial); +}; + + +/** + * @ingroup iface_xdg_positioner + */ +#define XDG_POSITIONER_DESTROY_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_positioner + */ +#define XDG_POSITIONER_SET_SIZE_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_positioner + */ +#define XDG_POSITIONER_SET_ANCHOR_RECT_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_positioner + */ +#define XDG_POSITIONER_SET_ANCHOR_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_positioner + */ +#define XDG_POSITIONER_SET_GRAVITY_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_positioner + */ +#define XDG_POSITIONER_SET_CONSTRAINT_ADJUSTMENT_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_positioner + */ +#define XDG_POSITIONER_SET_OFFSET_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_positioner + */ +#define XDG_POSITIONER_SET_REACTIVE_SINCE_VERSION 3 +/** + * @ingroup iface_xdg_positioner + */ +#define XDG_POSITIONER_SET_PARENT_SIZE_SINCE_VERSION 3 +/** + * @ingroup iface_xdg_positioner + */ +#define XDG_POSITIONER_SET_PARENT_CONFIGURE_SINCE_VERSION 3 + +#ifndef XDG_SURFACE_ERROR_ENUM +#define XDG_SURFACE_ERROR_ENUM +enum xdg_surface_error { + /** + * Surface was not fully constructed + */ + XDG_SURFACE_ERROR_NOT_CONSTRUCTED = 1, + /** + * Surface was already constructed + */ + XDG_SURFACE_ERROR_ALREADY_CONSTRUCTED = 2, + /** + * Attaching a buffer to an unconfigured surface + */ + XDG_SURFACE_ERROR_UNCONFIGURED_BUFFER = 3, + /** + * Invalid serial number when acking a configure event + */ + XDG_SURFACE_ERROR_INVALID_SERIAL = 4, + /** + * Width or height was zero or negative + */ + XDG_SURFACE_ERROR_INVALID_SIZE = 5, + /** + * Surface was destroyed before its role object + */ + XDG_SURFACE_ERROR_DEFUNCT_ROLE_OBJECT = 6, +}; +#endif /* XDG_SURFACE_ERROR_ENUM */ + +#ifndef XDG_SURFACE_ERROR_ENUM_IS_VALID +#define XDG_SURFACE_ERROR_ENUM_IS_VALID +/** + * @ingroup iface_xdg_surface + * Validate a xdg_surface error value. + * + * @return true on success, false on error. + * @ref xdg_surface_error + */ +static inline bool +xdg_surface_error_is_valid(uint32_t value, uint32_t version) { + switch (value) { + case XDG_SURFACE_ERROR_NOT_CONSTRUCTED: + return version >= 1; + case XDG_SURFACE_ERROR_ALREADY_CONSTRUCTED: + return version >= 1; + case XDG_SURFACE_ERROR_UNCONFIGURED_BUFFER: + return version >= 1; + case XDG_SURFACE_ERROR_INVALID_SERIAL: + return version >= 1; + case XDG_SURFACE_ERROR_INVALID_SIZE: + return version >= 1; + case XDG_SURFACE_ERROR_DEFUNCT_ROLE_OBJECT: + return version >= 1; + default: + return false; + } +} +#endif /* XDG_SURFACE_ERROR_ENUM_IS_VALID */ + +/** + * @ingroup iface_xdg_surface + * @struct xdg_surface_interface + */ +struct xdg_surface_interface { + /** + * destroy the xdg_surface + * + * Destroy the xdg_surface object. An xdg_surface must only be + * destroyed after its role object has been destroyed, otherwise a + * defunct_role_object error is raised. + */ + void (*destroy)(struct wl_client *client, + struct wl_resource *resource); + /** + * assign the xdg_toplevel surface role + * + * This creates an xdg_toplevel object for the given xdg_surface + * and gives the associated wl_surface the xdg_toplevel role. + * + * See the documentation of xdg_toplevel for more details about + * what an xdg_toplevel is and how it is used. + */ + void (*get_toplevel)(struct wl_client *client, + struct wl_resource *resource, + uint32_t id); + /** + * assign the xdg_popup surface role + * + * This creates an xdg_popup object for the given xdg_surface and + * gives the associated wl_surface the xdg_popup role. + * + * If null is passed as a parent, a parent surface must be + * specified using some other protocol, before committing the + * initial state. + * + * See the documentation of xdg_popup for more details about what + * an xdg_popup is and how it is used. + * @param parent parent surface for this popup + * @param positioner positioner for this popup + */ + void (*get_popup)(struct wl_client *client, + struct wl_resource *resource, + uint32_t id, + struct wl_resource *parent, + struct wl_resource *positioner); + /** + * set the new window geometry + * + * The window geometry of a surface is its "visible bounds" from + * the user's perspective. Client-side decorations often have + * invisible portions like drop-shadows which should be ignored for + * the purposes of aligning, placing and constraining windows. Note + * that in some situations, compositors may clip rendering to the + * window geometry, so the client should avoid putting functional + * elements outside of it. + * + * The window geometry is double-buffered state, see + * wl_surface.commit. + * + * When maintaining a position, the compositor should treat the (x, + * y) coordinate of the window geometry as the top left corner of + * the window. A client changing the (x, y) window geometry + * coordinate should in general not alter the position of the + * window. + * + * Once the window geometry of the surface is set, it is not + * possible to unset it, and it will remain the same until + * set_window_geometry is called again, even if a new subsurface or + * buffer is attached. + * + * If never set, the value is the full bounds of the surface, + * including any subsurfaces. This updates dynamically on every + * commit. This unset is meant for extremely simple clients. + * + * The arguments are given in the surface-local coordinate space of + * the wl_surface associated with this xdg_surface, and may extend + * outside of the wl_surface itself to mark parts of the subsurface + * tree as part of the window geometry. + * + * When applied, the effective window geometry will be the set + * window geometry clamped to the bounding rectangle of the + * combined geometry of the surface of the xdg_surface and the + * associated subsurfaces. + * + * The effective geometry will not be recalculated unless a new + * call to set_window_geometry is done and the new pending surface + * state is subsequently applied. + * + * The width and height of the effective window geometry must be + * greater than zero. Setting an invalid size will raise an + * invalid_size error. + * @param x x coordinate of the top-left corner of the window inside this surface + * @param y y coordinate of the top-left corner of the window inside this surface + * @param width width of the window + * @param height height of the window + */ + void (*set_window_geometry)(struct wl_client *client, + struct wl_resource *resource, + int32_t x, + int32_t y, + int32_t width, + int32_t height); + /** + * ack a configure event + * + * When a configure event is received, if a client commits the + * surface in response to the configure event, then the client must + * make an ack_configure request sometime before the commit + * request, passing along the serial of the configure event. + * + * For instance, for toplevel surfaces the compositor might use + * this information to move a surface to the top left only when the + * client has drawn itself for the maximized or fullscreen state. + * + * If the client receives multiple configure events before it can + * respond to one, it only has to ack the last configure event. + * Acking a configure event that was never sent raises an + * invalid_serial error. + * + * A client is not required to commit immediately after sending an + * ack_configure request - it may even ack_configure several times + * before its next surface commit. + * + * A client may send multiple ack_configure requests before + * committing, but only the last request sent before a commit + * indicates which configure event the client really is responding + * to. + * + * Sending an ack_configure request consumes the serial number sent + * with the request, as well as serial numbers sent by all + * configure events sent on this xdg_surface prior to the configure + * event referenced by the committed serial. + * + * It is an error to issue multiple ack_configure requests + * referencing a serial from the same configure event, or to issue + * an ack_configure request referencing a serial from a configure + * event issued before the event identified by the last + * ack_configure request for the same xdg_surface. Doing so will + * raise an invalid_serial error. + * @param serial the serial from the configure event + */ + void (*ack_configure)(struct wl_client *client, + struct wl_resource *resource, + uint32_t serial); +}; + +#define XDG_SURFACE_CONFIGURE 0 + +/** + * @ingroup iface_xdg_surface + */ +#define XDG_SURFACE_CONFIGURE_SINCE_VERSION 1 + +/** + * @ingroup iface_xdg_surface + */ +#define XDG_SURFACE_DESTROY_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_surface + */ +#define XDG_SURFACE_GET_TOPLEVEL_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_surface + */ +#define XDG_SURFACE_GET_POPUP_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_surface + */ +#define XDG_SURFACE_SET_WINDOW_GEOMETRY_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_surface + */ +#define XDG_SURFACE_ACK_CONFIGURE_SINCE_VERSION 1 + +/** + * @ingroup iface_xdg_surface + * Sends an configure event to the client owning the resource. + * @param resource_ The client's resource + * @param serial serial of the configure event + */ +static inline void +xdg_surface_send_configure(struct wl_resource *resource_, uint32_t serial) +{ + wl_resource_post_event(resource_, XDG_SURFACE_CONFIGURE, serial); +} + +#ifndef XDG_TOPLEVEL_ERROR_ENUM +#define XDG_TOPLEVEL_ERROR_ENUM +enum xdg_toplevel_error { + /** + * provided value is not a valid variant of the resize_edge enum + */ + XDG_TOPLEVEL_ERROR_INVALID_RESIZE_EDGE = 0, + /** + * invalid parent toplevel + */ + XDG_TOPLEVEL_ERROR_INVALID_PARENT = 1, + /** + * client provided an invalid min or max size + */ + XDG_TOPLEVEL_ERROR_INVALID_SIZE = 2, +}; +#endif /* XDG_TOPLEVEL_ERROR_ENUM */ + +#ifndef XDG_TOPLEVEL_ERROR_ENUM_IS_VALID +#define XDG_TOPLEVEL_ERROR_ENUM_IS_VALID +/** + * @ingroup iface_xdg_toplevel + * Validate a xdg_toplevel error value. + * + * @return true on success, false on error. + * @ref xdg_toplevel_error + */ +static inline bool +xdg_toplevel_error_is_valid(uint32_t value, uint32_t version) { + switch (value) { + case XDG_TOPLEVEL_ERROR_INVALID_RESIZE_EDGE: + return version >= 1; + case XDG_TOPLEVEL_ERROR_INVALID_PARENT: + return version >= 1; + case XDG_TOPLEVEL_ERROR_INVALID_SIZE: + return version >= 1; + default: + return false; + } +} +#endif /* XDG_TOPLEVEL_ERROR_ENUM_IS_VALID */ + +#ifndef XDG_TOPLEVEL_RESIZE_EDGE_ENUM +#define XDG_TOPLEVEL_RESIZE_EDGE_ENUM +/** + * @ingroup iface_xdg_toplevel + * edge values for resizing + * + * These values are used to indicate which edge of a surface + * is being dragged in a resize operation. + */ +enum xdg_toplevel_resize_edge { + XDG_TOPLEVEL_RESIZE_EDGE_NONE = 0, + XDG_TOPLEVEL_RESIZE_EDGE_TOP = 1, + XDG_TOPLEVEL_RESIZE_EDGE_BOTTOM = 2, + XDG_TOPLEVEL_RESIZE_EDGE_LEFT = 4, + XDG_TOPLEVEL_RESIZE_EDGE_TOP_LEFT = 5, + XDG_TOPLEVEL_RESIZE_EDGE_BOTTOM_LEFT = 6, + XDG_TOPLEVEL_RESIZE_EDGE_RIGHT = 8, + XDG_TOPLEVEL_RESIZE_EDGE_TOP_RIGHT = 9, + XDG_TOPLEVEL_RESIZE_EDGE_BOTTOM_RIGHT = 10, +}; +#endif /* XDG_TOPLEVEL_RESIZE_EDGE_ENUM */ + +#ifndef XDG_TOPLEVEL_RESIZE_EDGE_ENUM_IS_VALID +#define XDG_TOPLEVEL_RESIZE_EDGE_ENUM_IS_VALID +/** + * @ingroup iface_xdg_toplevel + * Validate a xdg_toplevel resize_edge value. + * + * @return true on success, false on error. + * @ref xdg_toplevel_resize_edge + */ +static inline bool +xdg_toplevel_resize_edge_is_valid(uint32_t value, uint32_t version) { + switch (value) { + case XDG_TOPLEVEL_RESIZE_EDGE_NONE: + return version >= 1; + case XDG_TOPLEVEL_RESIZE_EDGE_TOP: + return version >= 1; + case XDG_TOPLEVEL_RESIZE_EDGE_BOTTOM: + return version >= 1; + case XDG_TOPLEVEL_RESIZE_EDGE_LEFT: + return version >= 1; + case XDG_TOPLEVEL_RESIZE_EDGE_TOP_LEFT: + return version >= 1; + case XDG_TOPLEVEL_RESIZE_EDGE_BOTTOM_LEFT: + return version >= 1; + case XDG_TOPLEVEL_RESIZE_EDGE_RIGHT: + return version >= 1; + case XDG_TOPLEVEL_RESIZE_EDGE_TOP_RIGHT: + return version >= 1; + case XDG_TOPLEVEL_RESIZE_EDGE_BOTTOM_RIGHT: + return version >= 1; + default: + return false; + } +} +#endif /* XDG_TOPLEVEL_RESIZE_EDGE_ENUM_IS_VALID */ + +#ifndef XDG_TOPLEVEL_STATE_ENUM +#define XDG_TOPLEVEL_STATE_ENUM +/** + * @ingroup iface_xdg_toplevel + * types of state on the surface + * + * The different state values used on the surface. This is designed for + * state values like maximized, fullscreen. It is paired with the + * configure event to ensure that both the client and the compositor + * setting the state can be synchronized. + * + * States set in this way are double-buffered, see wl_surface.commit. + */ +enum xdg_toplevel_state { + /** + * the surface is maximized + * the surface is maximized + * + * The surface is maximized. The window geometry specified in the + * configure event must be obeyed by the client, or the + * xdg_wm_base.invalid_surface_state error is raised. + * + * The client should draw without shadow or other decoration + * outside of the window geometry. + */ + XDG_TOPLEVEL_STATE_MAXIMIZED = 1, + /** + * the surface is fullscreen + * the surface is fullscreen + * + * The surface is fullscreen. The window geometry specified in + * the configure event is a maximum; the client cannot resize + * beyond it. For a surface to cover the whole fullscreened area, + * the geometry dimensions must be obeyed by the client. For more + * details, see xdg_toplevel.set_fullscreen. + */ + XDG_TOPLEVEL_STATE_FULLSCREEN = 2, + /** + * the surface is being resized + * the surface is being resized + * + * The surface is being resized. The window geometry specified in + * the configure event is a maximum; the client cannot resize + * beyond it. Clients that have aspect ratio or cell sizing + * configuration can use a smaller size, however. + */ + XDG_TOPLEVEL_STATE_RESIZING = 3, + /** + * the surface is now activated + * the surface is now activated + * + * Client window decorations should be painted as if the window + * is active. Do not assume this means that the window actually has + * keyboard or pointer focus. + */ + XDG_TOPLEVEL_STATE_ACTIVATED = 4, + /** + * the surface’s left edge is tiled + * + * The window is currently in a tiled layout and the left edge is + * considered to be adjacent to another part of the tiling grid. + * + * The client should draw without shadow or other decoration + * outside of the window geometry on the left edge. + * @since 2 + */ + XDG_TOPLEVEL_STATE_TILED_LEFT = 5, + /** + * the surface’s right edge is tiled + * + * The window is currently in a tiled layout and the right edge + * is considered to be adjacent to another part of the tiling grid. + * + * The client should draw without shadow or other decoration + * outside of the window geometry on the right edge. + * @since 2 + */ + XDG_TOPLEVEL_STATE_TILED_RIGHT = 6, + /** + * the surface’s top edge is tiled + * + * The window is currently in a tiled layout and the top edge is + * considered to be adjacent to another part of the tiling grid. + * + * The client should draw without shadow or other decoration + * outside of the window geometry on the top edge. + * @since 2 + */ + XDG_TOPLEVEL_STATE_TILED_TOP = 7, + /** + * the surface’s bottom edge is tiled + * + * The window is currently in a tiled layout and the bottom edge + * is considered to be adjacent to another part of the tiling grid. + * + * The client should draw without shadow or other decoration + * outside of the window geometry on the bottom edge. + * @since 2 + */ + XDG_TOPLEVEL_STATE_TILED_BOTTOM = 8, + /** + * surface repaint is suspended + * + * The surface is currently not ordinarily being repainted; for + * example because its content is occluded by another window, or + * its outputs are switched off due to screen locking. + * @since 6 + */ + XDG_TOPLEVEL_STATE_SUSPENDED = 9, + /** + * the surface’s left edge is constrained + * + * The left edge of the window is currently constrained, meaning + * it shouldn't attempt to resize from that edge. It can for + * example mean it's tiled next to a monitor edge on the + * constrained side of the window. + * @since 7 + */ + XDG_TOPLEVEL_STATE_CONSTRAINED_LEFT = 10, + /** + * the surface’s right edge is constrained + * + * The right edge of the window is currently constrained, meaning + * it shouldn't attempt to resize from that edge. It can for + * example mean it's tiled next to a monitor edge on the + * constrained side of the window. + * @since 7 + */ + XDG_TOPLEVEL_STATE_CONSTRAINED_RIGHT = 11, + /** + * the surface’s top edge is constrained + * + * The top edge of the window is currently constrained, meaning + * it shouldn't attempt to resize from that edge. It can for + * example mean it's tiled next to a monitor edge on the + * constrained side of the window. + * @since 7 + */ + XDG_TOPLEVEL_STATE_CONSTRAINED_TOP = 12, + /** + * the surface’s bottom edge is constrained + * + * The bottom edge of the window is currently constrained, + * meaning it shouldn't attempt to resize from that edge. It can + * for example mean it's tiled next to a monitor edge on the + * constrained side of the window. + * @since 7 + */ + XDG_TOPLEVEL_STATE_CONSTRAINED_BOTTOM = 13, +}; +/** + * @ingroup iface_xdg_toplevel + */ +#define XDG_TOPLEVEL_STATE_TILED_LEFT_SINCE_VERSION 2 +/** + * @ingroup iface_xdg_toplevel + */ +#define XDG_TOPLEVEL_STATE_TILED_RIGHT_SINCE_VERSION 2 +/** + * @ingroup iface_xdg_toplevel + */ +#define XDG_TOPLEVEL_STATE_TILED_TOP_SINCE_VERSION 2 +/** + * @ingroup iface_xdg_toplevel + */ +#define XDG_TOPLEVEL_STATE_TILED_BOTTOM_SINCE_VERSION 2 +/** + * @ingroup iface_xdg_toplevel + */ +#define XDG_TOPLEVEL_STATE_SUSPENDED_SINCE_VERSION 6 +/** + * @ingroup iface_xdg_toplevel + */ +#define XDG_TOPLEVEL_STATE_CONSTRAINED_LEFT_SINCE_VERSION 7 +/** + * @ingroup iface_xdg_toplevel + */ +#define XDG_TOPLEVEL_STATE_CONSTRAINED_RIGHT_SINCE_VERSION 7 +/** + * @ingroup iface_xdg_toplevel + */ +#define XDG_TOPLEVEL_STATE_CONSTRAINED_TOP_SINCE_VERSION 7 +/** + * @ingroup iface_xdg_toplevel + */ +#define XDG_TOPLEVEL_STATE_CONSTRAINED_BOTTOM_SINCE_VERSION 7 +#endif /* XDG_TOPLEVEL_STATE_ENUM */ + +#ifndef XDG_TOPLEVEL_STATE_ENUM_IS_VALID +#define XDG_TOPLEVEL_STATE_ENUM_IS_VALID +/** + * @ingroup iface_xdg_toplevel + * Validate a xdg_toplevel state value. + * + * @return true on success, false on error. + * @ref xdg_toplevel_state + */ +static inline bool +xdg_toplevel_state_is_valid(uint32_t value, uint32_t version) { + switch (value) { + case XDG_TOPLEVEL_STATE_MAXIMIZED: + return version >= 1; + case XDG_TOPLEVEL_STATE_FULLSCREEN: + return version >= 1; + case XDG_TOPLEVEL_STATE_RESIZING: + return version >= 1; + case XDG_TOPLEVEL_STATE_ACTIVATED: + return version >= 1; + case XDG_TOPLEVEL_STATE_TILED_LEFT: + return version >= 2; + case XDG_TOPLEVEL_STATE_TILED_RIGHT: + return version >= 2; + case XDG_TOPLEVEL_STATE_TILED_TOP: + return version >= 2; + case XDG_TOPLEVEL_STATE_TILED_BOTTOM: + return version >= 2; + case XDG_TOPLEVEL_STATE_SUSPENDED: + return version >= 6; + case XDG_TOPLEVEL_STATE_CONSTRAINED_LEFT: + return version >= 7; + case XDG_TOPLEVEL_STATE_CONSTRAINED_RIGHT: + return version >= 7; + case XDG_TOPLEVEL_STATE_CONSTRAINED_TOP: + return version >= 7; + case XDG_TOPLEVEL_STATE_CONSTRAINED_BOTTOM: + return version >= 7; + default: + return false; + } +} +#endif /* XDG_TOPLEVEL_STATE_ENUM_IS_VALID */ + +#ifndef XDG_TOPLEVEL_WM_CAPABILITIES_ENUM +#define XDG_TOPLEVEL_WM_CAPABILITIES_ENUM +enum xdg_toplevel_wm_capabilities { + /** + * show_window_menu is available + */ + XDG_TOPLEVEL_WM_CAPABILITIES_WINDOW_MENU = 1, + /** + * set_maximized and unset_maximized are available + */ + XDG_TOPLEVEL_WM_CAPABILITIES_MAXIMIZE = 2, + /** + * set_fullscreen and unset_fullscreen are available + */ + XDG_TOPLEVEL_WM_CAPABILITIES_FULLSCREEN = 3, + /** + * set_minimized is available + */ + XDG_TOPLEVEL_WM_CAPABILITIES_MINIMIZE = 4, +}; +#endif /* XDG_TOPLEVEL_WM_CAPABILITIES_ENUM */ + +#ifndef XDG_TOPLEVEL_WM_CAPABILITIES_ENUM_IS_VALID +#define XDG_TOPLEVEL_WM_CAPABILITIES_ENUM_IS_VALID +/** + * @ingroup iface_xdg_toplevel + * Validate a xdg_toplevel wm_capabilities value. + * + * @return true on success, false on error. + * @ref xdg_toplevel_wm_capabilities + */ +static inline bool +xdg_toplevel_wm_capabilities_is_valid(uint32_t value, uint32_t version) { + switch (value) { + case XDG_TOPLEVEL_WM_CAPABILITIES_WINDOW_MENU: + return version >= 1; + case XDG_TOPLEVEL_WM_CAPABILITIES_MAXIMIZE: + return version >= 1; + case XDG_TOPLEVEL_WM_CAPABILITIES_FULLSCREEN: + return version >= 1; + case XDG_TOPLEVEL_WM_CAPABILITIES_MINIMIZE: + return version >= 1; + default: + return false; + } +} +#endif /* XDG_TOPLEVEL_WM_CAPABILITIES_ENUM_IS_VALID */ + +/** + * @ingroup iface_xdg_toplevel + * @struct xdg_toplevel_interface + */ +struct xdg_toplevel_interface { + /** + * destroy the xdg_toplevel + * + * This request destroys the role surface and unmaps the surface; + * see "Unmapping" behavior in interface section for details. + */ + void (*destroy)(struct wl_client *client, + struct wl_resource *resource); + /** + * set the parent of this surface + * + * Set the "parent" of this surface. This surface should be + * stacked above the parent surface and all other ancestor + * surfaces. + * + * Parent surfaces should be set on dialogs, toolboxes, or other + * "auxiliary" surfaces, so that the parent is raised when the + * dialog is raised. + * + * Setting a null parent for a child surface unsets its parent. + * Setting a null parent for a surface which currently has no + * parent is a no-op. + * + * Only mapped surfaces can have child surfaces. Setting a parent + * which is not mapped is equivalent to setting a null parent. If a + * surface becomes unmapped, its children's parent is set to the + * parent of the now-unmapped surface. If the now-unmapped surface + * has no parent, its children's parent is unset. If the + * now-unmapped surface becomes mapped again, its parent-child + * relationship is not restored. + * + * The parent toplevel must not be one of the child toplevel's + * descendants, and the parent must be different from the child + * toplevel, otherwise the invalid_parent protocol error is raised. + * @param parent parent surface for this surface + */ + void (*set_parent)(struct wl_client *client, + struct wl_resource *resource, + struct wl_resource *parent); + /** + * set surface title + * + * Set a short title for the surface. + * + * This string may be used to identify the surface in a task bar, + * window list, or other user interface elements provided by the + * compositor. + * + * The string must be encoded in UTF-8. + * @param title title of the surface + */ + void (*set_title)(struct wl_client *client, + struct wl_resource *resource, + const char *title); + /** + * set application ID + * + * Set an application identifier for the surface. + * + * The app ID identifies the general class of applications to which + * the surface belongs. The compositor can use this to group + * multiple surfaces together, or to determine how to launch a new + * application. + * + * For D-Bus activatable applications, the app ID is used as the + * D-Bus service name. + * + * The compositor shell will try to group application surfaces + * together by their app ID. As a best practice, it is suggested to + * select app ID's that match the basename of the application's + * .desktop file. For example, "org.freedesktop.FooViewer" where + * the .desktop file is "org.freedesktop.FooViewer.desktop". + * + * Like other properties, a set_app_id request can be sent after + * the xdg_toplevel has been mapped to update the property. + * + * See the desktop-entry specification [0] for more details on + * application identifiers and how they relate to well-known D-Bus + * names and .desktop files. + * + * [0] https://standards.freedesktop.org/desktop-entry-spec/ + * @param app_id application identifier surface belongs to + */ + void (*set_app_id)(struct wl_client *client, + struct wl_resource *resource, + const char *app_id); + /** + * show the window menu + * + * Clients implementing client-side decorations might want to + * show a context menu when right-clicking on the decorations, + * giving the user a menu that they can use to maximize or minimize + * the window. + * + * This request asks the compositor to pop up such a window menu at + * the given position, relative to the local surface coordinates of + * the parent surface. There are no guarantees as to what menu + * items the window menu contains, or even if a window menu will be + * drawn at all. + * + * This request must be used in response to some sort of user + * action like a button press, key press, or touch down event. + * @param seat the wl_seat of the user event + * @param serial the serial of the user event + * @param x the x position to pop up the window menu at + * @param y the y position to pop up the window menu at + */ + void (*show_window_menu)(struct wl_client *client, + struct wl_resource *resource, + struct wl_resource *seat, + uint32_t serial, + int32_t x, + int32_t y); + /** + * start an interactive move + * + * Start an interactive, user-driven move of the surface. + * + * This request must be used in response to some sort of user + * action like a button press, key press, or touch down event. The + * passed serial is used to determine the type of interactive move + * (touch, pointer, etc). + * + * The server may ignore move requests depending on the state of + * the surface (e.g. fullscreen or maximized), or if the passed + * serial is no longer valid. + * + * If triggered, the surface will lose the focus of the device + * (wl_pointer, wl_touch, etc) used for the move. It is up to the + * compositor to visually indicate that the move is taking place, + * such as updating a pointer cursor, during the move. There is no + * guarantee that the device focus will return when the move is + * completed. + * @param seat the wl_seat of the user event + * @param serial the serial of the user event + */ + void (*move)(struct wl_client *client, + struct wl_resource *resource, + struct wl_resource *seat, + uint32_t serial); + /** + * start an interactive resize + * + * Start a user-driven, interactive resize of the surface. + * + * This request must be used in response to some sort of user + * action like a button press, key press, or touch down event. The + * passed serial is used to determine the type of interactive + * resize (touch, pointer, etc). + * + * The server may ignore resize requests depending on the state of + * the surface (e.g. fullscreen or maximized). + * + * If triggered, the client will receive configure events with the + * "resize" state enum value and the expected sizes. See the + * "resize" enum value for more details about what is required. The + * client must also acknowledge configure events using + * "ack_configure". After the resize is completed, the client will + * receive another "configure" event without the resize state. + * + * If triggered, the surface also will lose the focus of the device + * (wl_pointer, wl_touch, etc) used for the resize. It is up to the + * compositor to visually indicate that the resize is taking place, + * such as updating a pointer cursor, during the resize. There is + * no guarantee that the device focus will return when the resize + * is completed. + * + * The edges parameter specifies how the surface should be resized, + * and is one of the values of the resize_edge enum. Values not + * matching a variant of the enum will cause the + * invalid_resize_edge protocol error. The compositor may use this + * information to update the surface position for example when + * dragging the top left corner. The compositor may also use this + * information to adapt its behavior, e.g. choose an appropriate + * cursor image. + * @param seat the wl_seat of the user event + * @param serial the serial of the user event + * @param edges which edge or corner is being dragged + */ + void (*resize)(struct wl_client *client, + struct wl_resource *resource, + struct wl_resource *seat, + uint32_t serial, + uint32_t edges); + /** + * set the maximum size + * + * Set a maximum size for the window. + * + * The client can specify a maximum size so that the compositor + * does not try to configure the window beyond this size. + * + * The width and height arguments are in window geometry + * coordinates. See xdg_surface.set_window_geometry. + * + * Values set in this way are double-buffered, see + * wl_surface.commit. + * + * The compositor can use this information to allow or disallow + * different states like maximize or fullscreen and draw accurate + * animations. + * + * Similarly, a tiling window manager may use this information to + * place and resize client windows in a more effective way. + * + * The client should not rely on the compositor to obey the maximum + * size. The compositor may decide to ignore the values set by the + * client and request a larger size. + * + * If never set, or a value of zero in the request, means that the + * client has no expected maximum size in the given dimension. As a + * result, a client wishing to reset the maximum size to an + * unspecified state can use zero for width and height in the + * request. + * + * Requesting a maximum size to be smaller than the minimum size of + * a surface is illegal and will result in an invalid_size error. + * + * The width and height must be greater than or equal to zero. + * Using strictly negative values for width or height will result + * in an invalid_size error. + * @param width maximum width of the window + * @param height maximum height of the window + */ + void (*set_max_size)(struct wl_client *client, + struct wl_resource *resource, + int32_t width, + int32_t height); + /** + * set the minimum size + * + * Set a minimum size for the window. + * + * The client can specify a minimum size so that the compositor + * does not try to configure the window below this size. + * + * The width and height arguments are in window geometry + * coordinates. See xdg_surface.set_window_geometry. + * + * Values set in this way are double-buffered, see + * wl_surface.commit. + * + * The compositor can use this information to allow or disallow + * different states like maximize or fullscreen and draw accurate + * animations. + * + * Similarly, a tiling window manager may use this information to + * place and resize client windows in a more effective way. + * + * The client should not rely on the compositor to obey the minimum + * size. The compositor may decide to ignore the values set by the + * client and request a smaller size. + * + * If never set, or a value of zero in the request, means that the + * client has no expected minimum size in the given dimension. As a + * result, a client wishing to reset the minimum size to an + * unspecified state can use zero for width and height in the + * request. + * + * Requesting a minimum size to be larger than the maximum size of + * a surface is illegal and will result in an invalid_size error. + * + * The width and height must be greater than or equal to zero. + * Using strictly negative values for width and height will result + * in an invalid_size error. + * @param width minimum width of the window + * @param height minimum height of the window + */ + void (*set_min_size)(struct wl_client *client, + struct wl_resource *resource, + int32_t width, + int32_t height); + /** + * maximize the window + * + * Maximize the surface. + * + * After requesting that the surface should be maximized, the + * compositor will respond by emitting a configure event. Whether + * this configure actually sets the window maximized is subject to + * compositor policies. The client must then update its content, + * drawing in the configured state. The client must also + * acknowledge the configure when committing the new content (see + * ack_configure). + * + * It is up to the compositor to decide how and where to maximize + * the surface, for example which output and what region of the + * screen should be used. + * + * If the surface was already maximized, the compositor will still + * emit a configure event with the "maximized" state. + * + * If the surface is in a fullscreen state, this request has no + * direct effect. It may alter the state the surface is returned to + * when unmaximized unless overridden by the compositor. + */ + void (*set_maximized)(struct wl_client *client, + struct wl_resource *resource); + /** + * unmaximize the window + * + * Unmaximize the surface. + * + * After requesting that the surface should be unmaximized, the + * compositor will respond by emitting a configure event. Whether + * this actually un-maximizes the window is subject to compositor + * policies. If available and applicable, the compositor will + * include the window geometry dimensions the window had prior to + * being maximized in the configure event. The client must then + * update its content, drawing it in the configured state. The + * client must also acknowledge the configure when committing the + * new content (see ack_configure). + * + * It is up to the compositor to position the surface after it was + * unmaximized; usually the position the surface had before + * maximizing, if applicable. + * + * If the surface was already not maximized, the compositor will + * still emit a configure event without the "maximized" state. + * + * If the surface is in a fullscreen state, this request has no + * direct effect. It may alter the state the surface is returned to + * when unmaximized unless overridden by the compositor. + */ + void (*unset_maximized)(struct wl_client *client, + struct wl_resource *resource); + /** + * set the window as fullscreen on an output + * + * Make the surface fullscreen. + * + * After requesting that the surface should be fullscreened, the + * compositor will respond by emitting a configure event. Whether + * the client is actually put into a fullscreen state is subject to + * compositor policies. The client must also acknowledge the + * configure when committing the new content (see ack_configure). + * + * The output passed by the request indicates the client's + * preference as to which display it should be set fullscreen on. + * If this value is NULL, it's up to the compositor to choose which + * display will be used to map this surface. + * + * If the surface doesn't cover the whole output, the compositor + * will position the surface in the center of the output and + * compensate with border fill covering the rest of the output. The + * content of the border fill is undefined, but should be assumed + * to be in some way that attempts to blend into the surrounding + * area (e.g. solid black). + * + * If the fullscreened surface is not opaque, the compositor must + * make sure that other screen content not part of the same surface + * tree (made up of subsurfaces, popups or similarly coupled + * surfaces) are not visible below the fullscreened surface. + * @param output preferred output to place surface on + */ + void (*set_fullscreen)(struct wl_client *client, + struct wl_resource *resource, + struct wl_resource *output); + /** + * unset the window as fullscreen + * + * Make the surface no longer fullscreen. + * + * After requesting that the surface should be unfullscreened, the + * compositor will respond by emitting a configure event. Whether + * this actually removes the fullscreen state of the client is + * subject to compositor policies. + * + * Making a surface unfullscreen sets states for the surface based + * on the following: * the state(s) it may have had before becoming + * fullscreen * any state(s) decided by the compositor * any + * state(s) requested by the client while the surface was + * fullscreen + * + * The compositor may include the previous window geometry + * dimensions in the configure event, if applicable. + * + * The client must also acknowledge the configure when committing + * the new content (see ack_configure). + */ + void (*unset_fullscreen)(struct wl_client *client, + struct wl_resource *resource); + /** + * set the window as minimized + * + * Request that the compositor minimize your surface. There is no + * way to know if the surface is currently minimized, nor is there + * any way to unset minimization on this surface. + * + * If you are looking to throttle redrawing when minimized, please + * instead use the wl_surface.frame event for this, as this will + * also work with live previews on windows in Alt-Tab, Expose or + * similar compositor features. + */ + void (*set_minimized)(struct wl_client *client, + struct wl_resource *resource); +}; + +#define XDG_TOPLEVEL_CONFIGURE 0 +#define XDG_TOPLEVEL_CLOSE 1 +#define XDG_TOPLEVEL_CONFIGURE_BOUNDS 2 +#define XDG_TOPLEVEL_WM_CAPABILITIES 3 + +/** + * @ingroup iface_xdg_toplevel + */ +#define XDG_TOPLEVEL_CONFIGURE_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_toplevel + */ +#define XDG_TOPLEVEL_CLOSE_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_toplevel + */ +#define XDG_TOPLEVEL_CONFIGURE_BOUNDS_SINCE_VERSION 4 +/** + * @ingroup iface_xdg_toplevel + */ +#define XDG_TOPLEVEL_WM_CAPABILITIES_SINCE_VERSION 5 + +/** + * @ingroup iface_xdg_toplevel + */ +#define XDG_TOPLEVEL_DESTROY_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_toplevel + */ +#define XDG_TOPLEVEL_SET_PARENT_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_toplevel + */ +#define XDG_TOPLEVEL_SET_TITLE_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_toplevel + */ +#define XDG_TOPLEVEL_SET_APP_ID_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_toplevel + */ +#define XDG_TOPLEVEL_SHOW_WINDOW_MENU_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_toplevel + */ +#define XDG_TOPLEVEL_MOVE_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_toplevel + */ +#define XDG_TOPLEVEL_RESIZE_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_toplevel + */ +#define XDG_TOPLEVEL_SET_MAX_SIZE_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_toplevel + */ +#define XDG_TOPLEVEL_SET_MIN_SIZE_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_toplevel + */ +#define XDG_TOPLEVEL_SET_MAXIMIZED_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_toplevel + */ +#define XDG_TOPLEVEL_UNSET_MAXIMIZED_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_toplevel + */ +#define XDG_TOPLEVEL_SET_FULLSCREEN_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_toplevel + */ +#define XDG_TOPLEVEL_UNSET_FULLSCREEN_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_toplevel + */ +#define XDG_TOPLEVEL_SET_MINIMIZED_SINCE_VERSION 1 + +/** + * @ingroup iface_xdg_toplevel + * Sends an configure event to the client owning the resource. + * @param resource_ The client's resource + * @param width suggested width of window + * @param height suggested height of window + * @param states suggested states of the window + */ +static inline void +xdg_toplevel_send_configure(struct wl_resource *resource_, int32_t width, int32_t height, struct wl_array *states) +{ + wl_resource_post_event(resource_, XDG_TOPLEVEL_CONFIGURE, width, height, states); +} + +/** + * @ingroup iface_xdg_toplevel + * Sends an close event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +xdg_toplevel_send_close(struct wl_resource *resource_) +{ + wl_resource_post_event(resource_, XDG_TOPLEVEL_CLOSE); +} + +/** + * @ingroup iface_xdg_toplevel + * Sends an configure_bounds event to the client owning the resource. + * @param resource_ The client's resource + * @param width suggested maximum width of surface + * @param height suggested maximum height of surface + */ +static inline void +xdg_toplevel_send_configure_bounds(struct wl_resource *resource_, int32_t width, int32_t height) +{ + wl_resource_post_event(resource_, XDG_TOPLEVEL_CONFIGURE_BOUNDS, width, height); +} + +/** + * @ingroup iface_xdg_toplevel + * Sends an wm_capabilities event to the client owning the resource. + * @param resource_ The client's resource + * @param capabilities array of 32-bit capabilities + */ +static inline void +xdg_toplevel_send_wm_capabilities(struct wl_resource *resource_, struct wl_array *capabilities) +{ + wl_resource_post_event(resource_, XDG_TOPLEVEL_WM_CAPABILITIES, capabilities); +} + +#ifndef XDG_POPUP_ERROR_ENUM +#define XDG_POPUP_ERROR_ENUM +enum xdg_popup_error { + /** + * tried to grab after being mapped + */ + XDG_POPUP_ERROR_INVALID_GRAB = 0, +}; +#endif /* XDG_POPUP_ERROR_ENUM */ + +#ifndef XDG_POPUP_ERROR_ENUM_IS_VALID +#define XDG_POPUP_ERROR_ENUM_IS_VALID +/** + * @ingroup iface_xdg_popup + * Validate a xdg_popup error value. + * + * @return true on success, false on error. + * @ref xdg_popup_error + */ +static inline bool +xdg_popup_error_is_valid(uint32_t value, uint32_t version) { + switch (value) { + case XDG_POPUP_ERROR_INVALID_GRAB: + return version >= 1; + default: + return false; + } +} +#endif /* XDG_POPUP_ERROR_ENUM_IS_VALID */ + +/** + * @ingroup iface_xdg_popup + * @struct xdg_popup_interface + */ +struct xdg_popup_interface { + /** + * remove xdg_popup interface + * + * This destroys the popup. Explicitly destroying the xdg_popup + * object will also dismiss the popup, and unmap the surface. + * + * If this xdg_popup is not the "topmost" popup, the + * xdg_wm_base.not_the_topmost_popup protocol error will be sent. + */ + void (*destroy)(struct wl_client *client, + struct wl_resource *resource); + /** + * make the popup take an explicit grab + * + * This request makes the created popup take an explicit grab. An + * explicit grab will be dismissed when the user dismisses the + * popup, or when the client destroys the xdg_popup. This can be + * done by the user clicking outside the surface, using the + * keyboard, or even locking the screen through closing the lid or + * a timeout. + * + * If the compositor denies the grab, the popup will be immediately + * dismissed. + * + * This request must be used in response to some sort of user + * action like a button press, key press, or touch down event. The + * serial number of the event should be passed as 'serial'. + * + * The parent of a grabbing popup must either be an xdg_toplevel + * surface or another xdg_popup with an explicit grab. If the + * parent is another xdg_popup it means that the popups are nested, + * with this popup now being the topmost popup. + * + * Nested popups must be destroyed in the reverse order they were + * created in, e.g. the only popup you are allowed to destroy at + * all times is the topmost one. + * + * When compositors choose to dismiss a popup, they may dismiss + * every nested grabbing popup as well. When a compositor dismisses + * popups, it will follow the same dismissing order as required + * from the client. + * + * If the topmost grabbing popup is destroyed, the grab will be + * returned to the parent of the popup, if that parent previously + * had an explicit grab. + * + * If the parent is a grabbing popup which has already been + * dismissed, this popup will be immediately dismissed. If the + * parent is a popup that did not take an explicit grab, an error + * will be raised. + * + * During a popup grab, the client owning the grab will receive + * pointer and touch events for all their surfaces as normal + * (similar to an "owner-events" grab in X11 parlance), while the + * top most grabbing popup will always have keyboard focus. + * @param seat the wl_seat of the user event + * @param serial the serial of the user event + */ + void (*grab)(struct wl_client *client, + struct wl_resource *resource, + struct wl_resource *seat, + uint32_t serial); + /** + * recalculate the popup's location + * + * Reposition an already-mapped popup. The popup will be placed + * given the details in the passed xdg_positioner object, and a + * xdg_popup.repositioned followed by xdg_popup.configure and + * xdg_surface.configure will be emitted in response. Any + * parameters set by the previous positioner will be discarded. + * + * The passed token will be sent in the corresponding + * xdg_popup.repositioned event. The new popup position will not + * take effect until the corresponding configure event is + * acknowledged by the client. See xdg_popup.repositioned for + * details. The token itself is opaque, and has no other special + * meaning. + * + * If multiple reposition requests are sent, the compositor may + * skip all but the last one. + * + * If the popup is repositioned in response to a configure event + * for its parent, the client should send an + * xdg_positioner.set_parent_configure and possibly an + * xdg_positioner.set_parent_size request to allow the compositor + * to properly constrain the popup. + * + * If the popup is repositioned together with a parent that is + * being resized, but not in response to a configure event, the + * client should send an xdg_positioner.set_parent_size request. + * @param token reposition request token + * @since 3 + */ + void (*reposition)(struct wl_client *client, + struct wl_resource *resource, + struct wl_resource *positioner, + uint32_t token); +}; + +#define XDG_POPUP_CONFIGURE 0 +#define XDG_POPUP_POPUP_DONE 1 +#define XDG_POPUP_REPOSITIONED 2 + +/** + * @ingroup iface_xdg_popup + */ +#define XDG_POPUP_CONFIGURE_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_popup + */ +#define XDG_POPUP_POPUP_DONE_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_popup + */ +#define XDG_POPUP_REPOSITIONED_SINCE_VERSION 3 + +/** + * @ingroup iface_xdg_popup + */ +#define XDG_POPUP_DESTROY_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_popup + */ +#define XDG_POPUP_GRAB_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_popup + */ +#define XDG_POPUP_REPOSITION_SINCE_VERSION 3 + +/** + * @ingroup iface_xdg_popup + * Sends an configure event to the client owning the resource. + * @param resource_ The client's resource + * @param x x position relative to parent surface window geometry + * @param y y position relative to parent surface window geometry + * @param width window geometry width + * @param height window geometry height + */ +static inline void +xdg_popup_send_configure(struct wl_resource *resource_, int32_t x, int32_t y, int32_t width, int32_t height) +{ + wl_resource_post_event(resource_, XDG_POPUP_CONFIGURE, x, y, width, height); +} + +/** + * @ingroup iface_xdg_popup + * Sends an popup_done event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +xdg_popup_send_popup_done(struct wl_resource *resource_) +{ + wl_resource_post_event(resource_, XDG_POPUP_POPUP_DONE); +} + +/** + * @ingroup iface_xdg_popup + * Sends an repositioned event to the client owning the resource. + * @param resource_ The client's resource + * @param token reposition request token + */ +static inline void +xdg_popup_send_repositioned(struct wl_resource *resource_, uint32_t token) +{ + wl_resource_post_event(resource_, XDG_POPUP_REPOSITIONED, token); +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/smsg/peachwm-ipc-unstable-v2-protocol.c b/smsg/peachwm-ipc-unstable-v2-protocol.c new file mode 100644 index 0000000..dfc4982 --- /dev/null +++ b/smsg/peachwm-ipc-unstable-v2-protocol.c @@ -0,0 +1,94 @@ +/* Generated by wayland-scanner 1.25.0 */ + +/* + * Copyright (C) 2022 Russell Newcomb + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include +#include +#include +#include "wayland-util.h" + +#ifndef __has_attribute +# define __has_attribute(x) 0 /* Compatibility with non-clang compilers. */ +#endif + +#if (__has_attribute(visibility) || defined(__GNUC__) && __GNUC__ >= 4) +#define WL_PRIVATE __attribute__ ((visibility("hidden"))) +#else +#define WL_PRIVATE +#endif + +extern const struct wl_interface wl_output_interface; +extern const struct wl_interface zpeachwm_ipc_output_v2_interface; + +static const struct wl_interface *peachwm_ipc_unstable_v2_types[] = { + NULL, + NULL, + NULL, + NULL, + &zpeachwm_ipc_output_v2_interface, + &wl_output_interface, +}; + +static const struct wl_message zpeachwm_ipc_manager_v2_requests[] = { + { "release", "", peachwm_ipc_unstable_v2_types + 0 }, + { "get_output", "no", peachwm_ipc_unstable_v2_types + 4 }, +}; + +static const struct wl_message zpeachwm_ipc_manager_v2_events[] = { + { "tags", "u", peachwm_ipc_unstable_v2_types + 0 }, + { "layout", "s", peachwm_ipc_unstable_v2_types + 0 }, +}; + +WL_PRIVATE const struct wl_interface zpeachwm_ipc_manager_v2_interface = { + "zpeachwm_ipc_manager_v2", 2, + 2, zpeachwm_ipc_manager_v2_requests, + 2, zpeachwm_ipc_manager_v2_events, +}; + +static const struct wl_message zpeachwm_ipc_output_v2_requests[] = { + { "release", "", peachwm_ipc_unstable_v2_types + 0 }, + { "set_tags", "uu", peachwm_ipc_unstable_v2_types + 0 }, + { "set_client_tags", "uu", peachwm_ipc_unstable_v2_types + 0 }, + { "set_layout", "u", peachwm_ipc_unstable_v2_types + 0 }, +}; + +static const struct wl_message zpeachwm_ipc_output_v2_events[] = { + { "toggle_visibility", "", peachwm_ipc_unstable_v2_types + 0 }, + { "active", "u", peachwm_ipc_unstable_v2_types + 0 }, + { "tag", "uuuu", peachwm_ipc_unstable_v2_types + 0 }, + { "layout", "u", peachwm_ipc_unstable_v2_types + 0 }, + { "title", "s", peachwm_ipc_unstable_v2_types + 0 }, + { "appid", "s", peachwm_ipc_unstable_v2_types + 0 }, + { "layout_symbol", "s", peachwm_ipc_unstable_v2_types + 0 }, + { "frame", "", peachwm_ipc_unstable_v2_types + 0 }, + { "fullscreen", "2u", peachwm_ipc_unstable_v2_types + 0 }, + { "floating", "2u", peachwm_ipc_unstable_v2_types + 0 }, +}; + +WL_PRIVATE const struct wl_interface zpeachwm_ipc_output_v2_interface = { + "zpeachwm_ipc_output_v2", 2, + 4, zpeachwm_ipc_output_v2_requests, + 10, zpeachwm_ipc_output_v2_events, +}; + diff --git a/smsg/peachwm-ipc-unstable-v2-protocol.h b/smsg/peachwm-ipc-unstable-v2-protocol.h new file mode 100644 index 0000000..ca47b95 --- /dev/null +++ b/smsg/peachwm-ipc-unstable-v2-protocol.h @@ -0,0 +1,484 @@ +/* Generated by wayland-scanner 1.25.0 */ + +#ifndef PEACHWM_IPC_UNSTABLE_V2_CLIENT_PROTOCOL_H +#define PEACHWM_IPC_UNSTABLE_V2_CLIENT_PROTOCOL_H + +#include +#include +#include "wayland-client.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @page page_peachwm_ipc_unstable_v2 The peachwm_ipc_unstable_v2 protocol + * @section page_ifaces_peachwm_ipc_unstable_v2 Interfaces + * - @subpage page_iface_zpeachwm_ipc_manager_v2 - manage peachwm state + * - @subpage page_iface_zpeachwm_ipc_output_v2 - interact with peachwm output state + * @section page_copyright_peachwm_ipc_unstable_v2 Copyright + *
+ *
+ * Copyright (C) 2022 Russell Newcomb
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * 
+ */ +struct wl_output; +struct zpeachwm_ipc_manager_v2; +struct zpeachwm_ipc_output_v2; + +#ifndef ZPEACHWM_IPC_MANAGER_V2_INTERFACE +#define ZPEACHWM_IPC_MANAGER_V2_INTERFACE +/** + * @page page_iface_zpeachwm_ipc_manager_v2 zpeachwm_ipc_manager_v2 + * @section page_iface_zpeachwm_ipc_manager_v2_desc Description + * + * This interface is exposed as a global in the Wayland registry and allows + * clients to query and set peachwm state. + * + * 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 is reset. + * @section page_iface_zpeachwm_ipc_manager_v2_api API + * See @ref iface_zpeachwm_ipc_manager_v2. + */ +/** + * @defgroup iface_zpeachwm_ipc_manager_v2 The zpeachwm_ipc_manager_v2 interface + * + * This interface is exposed as a global in the Wayland registry and allows + * clients to query and set peachwm state. + * + * 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 is reset. + */ +extern const struct wl_interface zpeachwm_ipc_manager_v2_interface; +#endif +#ifndef ZPEACHWM_IPC_OUTPUT_V2_INTERFACE +#define ZPEACHWM_IPC_OUTPUT_V2_INTERFACE +/** + * @page page_iface_zpeachwm_ipc_output_v2 zpeachwm_ipc_output_v2 + * @section page_iface_zpeachwm_ipc_output_v2_desc Description + * + * Observe and control a peachwm output. + * @section page_iface_zpeachwm_ipc_output_v2_api API + * See @ref iface_zpeachwm_ipc_output_v2. + */ +/** + * @defgroup iface_zpeachwm_ipc_output_v2 The zpeachwm_ipc_output_v2 interface + * + * Observe and control a peachwm output. + */ +extern const struct wl_interface zpeachwm_ipc_output_v2_interface; +#endif + +/** + * @ingroup iface_zpeachwm_ipc_manager_v2 + * @struct zpeachwm_ipc_manager_v2_listener + */ +struct zpeachwm_ipc_manager_v2_listener { + /** + * announces number of tags + * + * This event is sent after binding and announces the number of + * tags. + */ + void (*tags)(void *data, + struct zpeachwm_ipc_manager_v2 *zpeachwm_ipc_manager_v2, + uint32_t amount); + /** + * announces a layout + * + * This event is sent after binding and announces a layout. + * Layouts are announced in order. + */ + void (*layout)(void *data, + struct zpeachwm_ipc_manager_v2 *zpeachwm_ipc_manager_v2, + const char *name); +}; + +/** + * @ingroup iface_zpeachwm_ipc_manager_v2 + */ +static inline int +zpeachwm_ipc_manager_v2_add_listener(struct zpeachwm_ipc_manager_v2 *zpeachwm_ipc_manager_v2, + const struct zpeachwm_ipc_manager_v2_listener *listener, void *data) +{ + return wl_proxy_add_listener((struct wl_proxy *) zpeachwm_ipc_manager_v2, + (void (**)(void)) listener, data); +} + +#define ZPEACHWM_IPC_MANAGER_V2_RELEASE 0 +#define ZPEACHWM_IPC_MANAGER_V2_GET_OUTPUT 1 + +/** + * @ingroup iface_zpeachwm_ipc_manager_v2 + */ +#define ZPEACHWM_IPC_MANAGER_V2_TAGS_SINCE_VERSION 1 +/** + * @ingroup iface_zpeachwm_ipc_manager_v2 + */ +#define ZPEACHWM_IPC_MANAGER_V2_LAYOUT_SINCE_VERSION 1 + +/** + * @ingroup iface_zpeachwm_ipc_manager_v2 + */ +#define ZPEACHWM_IPC_MANAGER_V2_RELEASE_SINCE_VERSION 1 +/** + * @ingroup iface_zpeachwm_ipc_manager_v2 + */ +#define ZPEACHWM_IPC_MANAGER_V2_GET_OUTPUT_SINCE_VERSION 1 + +/** @ingroup iface_zpeachwm_ipc_manager_v2 */ +static inline void +zpeachwm_ipc_manager_v2_set_user_data(struct zpeachwm_ipc_manager_v2 *zpeachwm_ipc_manager_v2, void *user_data) +{ + wl_proxy_set_user_data((struct wl_proxy *) zpeachwm_ipc_manager_v2, user_data); +} + +/** @ingroup iface_zpeachwm_ipc_manager_v2 */ +static inline void * +zpeachwm_ipc_manager_v2_get_user_data(struct zpeachwm_ipc_manager_v2 *zpeachwm_ipc_manager_v2) +{ + return wl_proxy_get_user_data((struct wl_proxy *) zpeachwm_ipc_manager_v2); +} + +static inline uint32_t +zpeachwm_ipc_manager_v2_get_version(struct zpeachwm_ipc_manager_v2 *zpeachwm_ipc_manager_v2) +{ + return wl_proxy_get_version((struct wl_proxy *) zpeachwm_ipc_manager_v2); +} + +/** @ingroup iface_zpeachwm_ipc_manager_v2 */ +static inline void +zpeachwm_ipc_manager_v2_destroy(struct zpeachwm_ipc_manager_v2 *zpeachwm_ipc_manager_v2) +{ + wl_proxy_destroy((struct wl_proxy *) zpeachwm_ipc_manager_v2); +} + +/** + * @ingroup iface_zpeachwm_ipc_manager_v2 + * + * Indicates that the client will not use the manager object anymore. + * Objects created through this interface remain valid. + */ +static inline void +zpeachwm_ipc_manager_v2_release(struct zpeachwm_ipc_manager_v2 *zpeachwm_ipc_manager_v2) +{ + wl_proxy_marshal_flags((struct wl_proxy *) zpeachwm_ipc_manager_v2, + ZPEACHWM_IPC_MANAGER_V2_RELEASE, NULL, wl_proxy_get_version((struct wl_proxy *) zpeachwm_ipc_manager_v2), WL_MARSHAL_FLAG_DESTROY); +} + +/** + * @ingroup iface_zpeachwm_ipc_manager_v2 + * + * Get a peachwm_ipc_output for the given wl_output. + */ +static inline struct zpeachwm_ipc_output_v2 * +zpeachwm_ipc_manager_v2_get_output(struct zpeachwm_ipc_manager_v2 *zpeachwm_ipc_manager_v2, struct wl_output *output) +{ + struct wl_proxy *id; + + id = wl_proxy_marshal_flags((struct wl_proxy *) zpeachwm_ipc_manager_v2, + ZPEACHWM_IPC_MANAGER_V2_GET_OUTPUT, &zpeachwm_ipc_output_v2_interface, wl_proxy_get_version((struct wl_proxy *) zpeachwm_ipc_manager_v2), 0, NULL, output); + + return (struct zpeachwm_ipc_output_v2 *) id; +} + +#ifndef ZPEACHWM_IPC_OUTPUT_V2_TAG_STATE_ENUM +#define ZPEACHWM_IPC_OUTPUT_V2_TAG_STATE_ENUM +enum zpeachwm_ipc_output_v2_tag_state { + /** + * no state + */ + ZPEACHWM_IPC_OUTPUT_V2_TAG_STATE_NONE = 0, + /** + * tag is active + */ + ZPEACHWM_IPC_OUTPUT_V2_TAG_STATE_ACTIVE = 1, + /** + * tag has urgent client + */ + ZPEACHWM_IPC_OUTPUT_V2_TAG_STATE_URGENT = 2, +}; +#endif /* ZPEACHWM_IPC_OUTPUT_V2_TAG_STATE_ENUM */ + +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + * @struct zpeachwm_ipc_output_v2_listener + */ +struct zpeachwm_ipc_output_v2_listener { + /** + * peachwm visibility has been toggled + * + * Indicates that peachwm visibility has been toggled. + */ + void (*toggle_visibility)(void *data, + struct zpeachwm_ipc_output_v2 *zpeachwm_ipc_output_v2); + /** + * output is active + * + * Indicates the output is active (selected monitor). + */ + void (*active)(void *data, + struct zpeachwm_ipc_output_v2 *zpeachwm_ipc_output_v2, + uint32_t active); + /** + * tag state changed + * + * Indicates a tag state change. + * @param tag index of the tag + * @param state state of the tag + * @param clients number of clients in tag + * @param focused 1 if focused client is in this tag + */ + void (*tag)(void *data, + struct zpeachwm_ipc_output_v2 *zpeachwm_ipc_output_v2, + uint32_t tag, + uint32_t state, + uint32_t clients, + uint32_t focused); + /** + * layout changed + * + * Indicates the layout changed. + * @param layout index of the layout + */ + void (*layout)(void *data, + struct zpeachwm_ipc_output_v2 *zpeachwm_ipc_output_v2, + uint32_t layout); + /** + * title changed + * + * Indicates the focused client title changed. + */ + void (*title)(void *data, + struct zpeachwm_ipc_output_v2 *zpeachwm_ipc_output_v2, + const char *title); + /** + * appid changed + * + * Indicates the focused client appid changed. + */ + void (*appid)(void *data, + struct zpeachwm_ipc_output_v2 *zpeachwm_ipc_output_v2, + const char *appid); + /** + * layout symbol changed + * + * Indicates the layout symbol changed. + */ + void (*layout_symbol)(void *data, + struct zpeachwm_ipc_output_v2 *zpeachwm_ipc_output_v2, + const char *layout); + /** + * frame event + * + * Sent after all state events have been sent for a given state + * change. + */ + void (*frame)(void *data, + struct zpeachwm_ipc_output_v2 *zpeachwm_ipc_output_v2); + /** + * fullscreen state changed + * + * Indicates the fullscreen state changed. + * @since 2 + */ + void (*fullscreen)(void *data, + struct zpeachwm_ipc_output_v2 *zpeachwm_ipc_output_v2, + uint32_t is_fullscreen); + /** + * floating state changed + * + * Indicates the floating state changed. + * @since 2 + */ + void (*floating)(void *data, + struct zpeachwm_ipc_output_v2 *zpeachwm_ipc_output_v2, + uint32_t is_floating); +}; + +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +static inline int +zpeachwm_ipc_output_v2_add_listener(struct zpeachwm_ipc_output_v2 *zpeachwm_ipc_output_v2, + const struct zpeachwm_ipc_output_v2_listener *listener, void *data) +{ + return wl_proxy_add_listener((struct wl_proxy *) zpeachwm_ipc_output_v2, + (void (**)(void)) listener, data); +} + +#define ZPEACHWM_IPC_OUTPUT_V2_RELEASE 0 +#define ZPEACHWM_IPC_OUTPUT_V2_SET_TAGS 1 +#define ZPEACHWM_IPC_OUTPUT_V2_SET_CLIENT_TAGS 2 +#define ZPEACHWM_IPC_OUTPUT_V2_SET_LAYOUT 3 + +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +#define ZPEACHWM_IPC_OUTPUT_V2_TOGGLE_VISIBILITY_SINCE_VERSION 1 +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +#define ZPEACHWM_IPC_OUTPUT_V2_ACTIVE_SINCE_VERSION 1 +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +#define ZPEACHWM_IPC_OUTPUT_V2_TAG_SINCE_VERSION 1 +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +#define ZPEACHWM_IPC_OUTPUT_V2_LAYOUT_SINCE_VERSION 1 +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +#define ZPEACHWM_IPC_OUTPUT_V2_TITLE_SINCE_VERSION 1 +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +#define ZPEACHWM_IPC_OUTPUT_V2_APPID_SINCE_VERSION 1 +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +#define ZPEACHWM_IPC_OUTPUT_V2_LAYOUT_SYMBOL_SINCE_VERSION 1 +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +#define ZPEACHWM_IPC_OUTPUT_V2_FRAME_SINCE_VERSION 1 +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +#define ZPEACHWM_IPC_OUTPUT_V2_FULLSCREEN_SINCE_VERSION 2 +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +#define ZPEACHWM_IPC_OUTPUT_V2_FLOATING_SINCE_VERSION 2 + +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +#define ZPEACHWM_IPC_OUTPUT_V2_RELEASE_SINCE_VERSION 1 +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +#define ZPEACHWM_IPC_OUTPUT_V2_SET_TAGS_SINCE_VERSION 1 +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +#define ZPEACHWM_IPC_OUTPUT_V2_SET_CLIENT_TAGS_SINCE_VERSION 1 +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +#define ZPEACHWM_IPC_OUTPUT_V2_SET_LAYOUT_SINCE_VERSION 1 + +/** @ingroup iface_zpeachwm_ipc_output_v2 */ +static inline void +zpeachwm_ipc_output_v2_set_user_data(struct zpeachwm_ipc_output_v2 *zpeachwm_ipc_output_v2, void *user_data) +{ + wl_proxy_set_user_data((struct wl_proxy *) zpeachwm_ipc_output_v2, user_data); +} + +/** @ingroup iface_zpeachwm_ipc_output_v2 */ +static inline void * +zpeachwm_ipc_output_v2_get_user_data(struct zpeachwm_ipc_output_v2 *zpeachwm_ipc_output_v2) +{ + return wl_proxy_get_user_data((struct wl_proxy *) zpeachwm_ipc_output_v2); +} + +static inline uint32_t +zpeachwm_ipc_output_v2_get_version(struct zpeachwm_ipc_output_v2 *zpeachwm_ipc_output_v2) +{ + return wl_proxy_get_version((struct wl_proxy *) zpeachwm_ipc_output_v2); +} + +/** @ingroup iface_zpeachwm_ipc_output_v2 */ +static inline void +zpeachwm_ipc_output_v2_destroy(struct zpeachwm_ipc_output_v2 *zpeachwm_ipc_output_v2) +{ + wl_proxy_destroy((struct wl_proxy *) zpeachwm_ipc_output_v2); +} + +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + * + * Indicates that the client will not use the peachwm_ipc_output object + * anymore. Objects created through this interface remain valid. + */ +static inline void +zpeachwm_ipc_output_v2_release(struct zpeachwm_ipc_output_v2 *zpeachwm_ipc_output_v2) +{ + wl_proxy_marshal_flags((struct wl_proxy *) zpeachwm_ipc_output_v2, + ZPEACHWM_IPC_OUTPUT_V2_RELEASE, NULL, wl_proxy_get_version((struct wl_proxy *) zpeachwm_ipc_output_v2), WL_MARSHAL_FLAG_DESTROY); +} + +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + * + * set the active tags of this output. + */ +static inline void +zpeachwm_ipc_output_v2_set_tags(struct zpeachwm_ipc_output_v2 *zpeachwm_ipc_output_v2, uint32_t tagmask, uint32_t toggle_tagset) +{ + wl_proxy_marshal_flags((struct wl_proxy *) zpeachwm_ipc_output_v2, + ZPEACHWM_IPC_OUTPUT_V2_SET_TAGS, NULL, wl_proxy_get_version((struct wl_proxy *) zpeachwm_ipc_output_v2), 0, tagmask, toggle_tagset); +} + +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + * + * Set the tags of the focused client. + */ +static inline void +zpeachwm_ipc_output_v2_set_client_tags(struct zpeachwm_ipc_output_v2 *zpeachwm_ipc_output_v2, uint32_t and_tags, uint32_t xor_tags) +{ + wl_proxy_marshal_flags((struct wl_proxy *) zpeachwm_ipc_output_v2, + ZPEACHWM_IPC_OUTPUT_V2_SET_CLIENT_TAGS, NULL, wl_proxy_get_version((struct wl_proxy *) zpeachwm_ipc_output_v2), 0, and_tags, xor_tags); +} + +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + * + * Set the layout of this output. + */ +static inline void +zpeachwm_ipc_output_v2_set_layout(struct zpeachwm_ipc_output_v2 *zpeachwm_ipc_output_v2, uint32_t index) +{ + wl_proxy_marshal_flags((struct wl_proxy *) zpeachwm_ipc_output_v2, + ZPEACHWM_IPC_OUTPUT_V2_SET_LAYOUT, NULL, wl_proxy_get_version((struct wl_proxy *) zpeachwm_ipc_output_v2), 0, index); +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/smsg/smsg b/smsg/smsg new file mode 100755 index 0000000000000000000000000000000000000000..d531d04095a08f294804e581ea0719f06ae829e9 GIT binary patch literal 28608 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 F{{xpG@FD;J literal 0 HcmV?d00001 diff --git a/src/peachwm.c b/src/peachwm.c index 25e2141..65aabc8 100644 --- a/src/peachwm.c +++ b/src/peachwm.c @@ -4003,6 +4003,7 @@ int main(int argc, char *argv[]) { break; case 'v': die("peachwm " VERSION); + break; default: goto usage; } diff --git a/src/util.c b/src/util.c index b925987..9922a27 100644 --- a/src/util.c +++ b/src/util.c @@ -7,7 +7,7 @@ #include "util.h" -void +_Noreturn void die(const char *fmt, ...) { va_list ap; diff --git a/src/util.h b/src/util.h index 226980d..3badc0e 100644 --- a/src/util.h +++ b/src/util.h @@ -1,5 +1,5 @@ /* See LICENSE.dwm file for copyright and license details. */ -void die(const char *fmt, ...); +_Noreturn void die(const char *fmt, ...); void *ecalloc(size_t nmemb, size_t size); int fd_set_nonblock(int fd);

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 literal 0 HcmV?d00001 diff --git a/protocols/cursor-shape-v1-protocol.h b/protocols/cursor-shape-v1-protocol.h new file mode 100644 index 0000000..2d54b91 --- /dev/null +++ b/protocols/cursor-shape-v1-protocol.h @@ -0,0 +1,201 @@ +/* Generated by wayland-scanner 1.25.0 */ + +#ifndef CURSOR_SHAPE_V1_ENUM_PROTOCOL_H +#define CURSOR_SHAPE_V1_ENUM_PROTOCOL_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_ENUM +#define WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_ENUM +/** + * @ingroup iface_wp_cursor_shape_device_v1 + * cursor shapes + * + * This enum describes cursor shapes. + * + * The names are taken from the CSS W3C specification: + * https://w3c.github.io/csswg-drafts/css-ui/#cursor + * with a few additions. + * + * Note that there are some groups of cursor shapes that are related: + * The first group is drag-and-drop cursors which are used to indicate + * the selected action during dnd operations. The second group is resize + * cursors which are used to indicate resizing and moving possibilities + * on window borders. It is recommended that the shapes in these groups + * should use visually compatible images and metaphors. + */ +enum wp_cursor_shape_device_v1_shape { + /** + * default cursor + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_DEFAULT = 1, + /** + * a context menu is available for the object under the cursor + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_CONTEXT_MENU = 2, + /** + * help is available for the object under the cursor + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_HELP = 3, + /** + * pointer that indicates a link or another interactive element + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_POINTER = 4, + /** + * progress indicator + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_PROGRESS = 5, + /** + * program is busy, user should wait + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_WAIT = 6, + /** + * a cell or set of cells may be selected + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_CELL = 7, + /** + * simple crosshair + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_CROSSHAIR = 8, + /** + * text may be selected + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_TEXT = 9, + /** + * vertical text may be selected + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_VERTICAL_TEXT = 10, + /** + * drag-and-drop: alias of/shortcut to something is to be created + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_ALIAS = 11, + /** + * drag-and-drop: something is to be copied + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_COPY = 12, + /** + * drag-and-drop: something is to be moved + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_MOVE = 13, + /** + * drag-and-drop: the dragged item cannot be dropped at the current cursor location + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_NO_DROP = 14, + /** + * drag-and-drop: the requested action will not be carried out + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_NOT_ALLOWED = 15, + /** + * drag-and-drop: something can be grabbed + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_GRAB = 16, + /** + * drag-and-drop: something is being grabbed + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_GRABBING = 17, + /** + * resizing: the east border is to be moved + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_E_RESIZE = 18, + /** + * resizing: the north border is to be moved + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_N_RESIZE = 19, + /** + * resizing: the north-east corner is to be moved + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_NE_RESIZE = 20, + /** + * resizing: the north-west corner is to be moved + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_NW_RESIZE = 21, + /** + * resizing: the south border is to be moved + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_S_RESIZE = 22, + /** + * resizing: the south-east corner is to be moved + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_SE_RESIZE = 23, + /** + * resizing: the south-west corner is to be moved + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_SW_RESIZE = 24, + /** + * resizing: the west border is to be moved + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_W_RESIZE = 25, + /** + * resizing: the east and west borders are to be moved + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_EW_RESIZE = 26, + /** + * resizing: the north and south borders are to be moved + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_NS_RESIZE = 27, + /** + * resizing: the north-east and south-west corners are to be moved + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_NESW_RESIZE = 28, + /** + * resizing: the north-west and south-east corners are to be moved + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_NWSE_RESIZE = 29, + /** + * resizing: that the item/column can be resized horizontally + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_COL_RESIZE = 30, + /** + * resizing: that the item/row can be resized vertically + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_ROW_RESIZE = 31, + /** + * something can be scrolled in any direction + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_ALL_SCROLL = 32, + /** + * something can be zoomed in + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_ZOOM_IN = 33, + /** + * something can be zoomed out + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_ZOOM_OUT = 34, + /** + * drag-and-drop: the user will select which action will be carried out (non-css value) + * @since 2 + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_DND_ASK = 35, + /** + * resizing: something can be moved or resized in any direction (non-css value) + * @since 2 + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_ALL_RESIZE = 36, +}; +/** + * @ingroup iface_wp_cursor_shape_device_v1 + */ +#define WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_DND_ASK_SINCE_VERSION 2 +/** + * @ingroup iface_wp_cursor_shape_device_v1 + */ +#define WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_ALL_RESIZE_SINCE_VERSION 2 +#endif /* WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_ENUM */ + +#ifndef WP_CURSOR_SHAPE_DEVICE_V1_ERROR_ENUM +#define WP_CURSOR_SHAPE_DEVICE_V1_ERROR_ENUM +enum wp_cursor_shape_device_v1_error { + /** + * the specified shape value is invalid + */ + WP_CURSOR_SHAPE_DEVICE_V1_ERROR_INVALID_SHAPE = 1, +}; +#endif /* WP_CURSOR_SHAPE_DEVICE_V1_ERROR_ENUM */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/protocols/ext-workspace-v1-protocol.c b/protocols/ext-workspace-v1-protocol.c new file mode 100644 index 0000000..605fefb --- /dev/null +++ b/protocols/ext-workspace-v1-protocol.c @@ -0,0 +1,120 @@ +/* Generated by wayland-scanner 1.25.0 */ + +/* + * Copyright © 2019 Christopher Billington + * Copyright © 2020 Ilia Bozhinov + * Copyright © 2022 Victoria Brekenfeld + * + * 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. + */ + +#include +#include +#include +#include "wayland-util.h" + +#ifndef __has_attribute +# define __has_attribute(x) 0 /* Compatibility with non-clang compilers. */ +#endif + +#if (__has_attribute(visibility) || defined(__GNUC__) && __GNUC__ >= 4) +#define WL_PRIVATE __attribute__ ((visibility("hidden"))) +#else +#define WL_PRIVATE +#endif + +extern const struct wl_interface ext_workspace_group_handle_v1_interface; +extern const struct wl_interface ext_workspace_handle_v1_interface; +extern const struct wl_interface wl_output_interface; + +static const struct wl_interface *ext_workspace_v1_types[] = { + NULL, + &ext_workspace_group_handle_v1_interface, + &ext_workspace_handle_v1_interface, + &wl_output_interface, + &wl_output_interface, + &ext_workspace_handle_v1_interface, + &ext_workspace_handle_v1_interface, + &ext_workspace_group_handle_v1_interface, +}; + +static const struct wl_message ext_workspace_manager_v1_requests[] = { + { "commit", "", ext_workspace_v1_types + 0 }, + { "stop", "", ext_workspace_v1_types + 0 }, +}; + +static const struct wl_message ext_workspace_manager_v1_events[] = { + { "workspace_group", "n", ext_workspace_v1_types + 1 }, + { "workspace", "n", ext_workspace_v1_types + 2 }, + { "done", "", ext_workspace_v1_types + 0 }, + { "finished", "", ext_workspace_v1_types + 0 }, +}; + +WL_PRIVATE const struct wl_interface ext_workspace_manager_v1_interface = { + "ext_workspace_manager_v1", 1, + 2, ext_workspace_manager_v1_requests, + 4, ext_workspace_manager_v1_events, +}; + +static const struct wl_message ext_workspace_group_handle_v1_requests[] = { + { "create_workspace", "s", ext_workspace_v1_types + 0 }, + { "destroy", "", ext_workspace_v1_types + 0 }, +}; + +static const struct wl_message ext_workspace_group_handle_v1_events[] = { + { "capabilities", "u", ext_workspace_v1_types + 0 }, + { "output_enter", "o", ext_workspace_v1_types + 3 }, + { "output_leave", "o", ext_workspace_v1_types + 4 }, + { "workspace_enter", "o", ext_workspace_v1_types + 5 }, + { "workspace_leave", "o", ext_workspace_v1_types + 6 }, + { "removed", "", ext_workspace_v1_types + 0 }, +}; + +WL_PRIVATE const struct wl_interface ext_workspace_group_handle_v1_interface = { + "ext_workspace_group_handle_v1", 1, + 2, ext_workspace_group_handle_v1_requests, + 6, ext_workspace_group_handle_v1_events, +}; + +static const struct wl_message ext_workspace_handle_v1_requests[] = { + { "destroy", "", ext_workspace_v1_types + 0 }, + { "activate", "", ext_workspace_v1_types + 0 }, + { "deactivate", "", ext_workspace_v1_types + 0 }, + { "assign", "o", ext_workspace_v1_types + 7 }, + { "remove", "", ext_workspace_v1_types + 0 }, +}; + +static const struct wl_message ext_workspace_handle_v1_events[] = { + { "id", "s", ext_workspace_v1_types + 0 }, + { "name", "s", ext_workspace_v1_types + 0 }, + { "coordinates", "a", ext_workspace_v1_types + 0 }, + { "state", "u", ext_workspace_v1_types + 0 }, + { "capabilities", "u", ext_workspace_v1_types + 0 }, + { "removed", "", ext_workspace_v1_types + 0 }, +}; + +WL_PRIVATE const struct wl_interface ext_workspace_handle_v1_interface = { + "ext_workspace_handle_v1", 1, + 5, ext_workspace_handle_v1_requests, + 6, ext_workspace_handle_v1_events, +}; + diff --git a/protocols/ext-workspace-v1-protocol.h b/protocols/ext-workspace-v1-protocol.h new file mode 100644 index 0000000..34ae038 --- /dev/null +++ b/protocols/ext-workspace-v1-protocol.h @@ -0,0 +1,752 @@ +/* Generated by wayland-scanner 1.25.0 */ + +#ifndef EXT_WORKSPACE_V1_SERVER_PROTOCOL_H +#define EXT_WORKSPACE_V1_SERVER_PROTOCOL_H + +#include +#include +#include "wayland-server.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct wl_client; +struct wl_resource; + +/** + * @page page_ext_workspace_v1 The ext_workspace_v1 protocol + * @section page_ifaces_ext_workspace_v1 Interfaces + * - @subpage page_iface_ext_workspace_manager_v1 - list and control workspaces + * - @subpage page_iface_ext_workspace_group_handle_v1 - a workspace group assigned to a set of outputs + * - @subpage page_iface_ext_workspace_handle_v1 - a workspace handing a group of surfaces + * @section page_copyright_ext_workspace_v1 Copyright + *