diff --git a/include/client.h b/include/client.h index 6e1e265..bad713a 100644 --- a/include/client.h +++ b/include/client.h @@ -20,23 +20,36 @@ struct wlr_scene_shadow; enum { XDGShell, LayerShell, X11 }; typedef struct Client { - /* Must keep this field first */ - unsigned int type; /* XDGShell or X11* */ + /* Must keep this field first — union-cast discriminant */ + unsigned int type; /* XDGShell or X11 */ + /* HOT — accessed every frame / arrange / focus / resize */ Monitor *mon; - struct wlr_scene_tree *scene; - struct wlr_scene_rect *border_bg; /* single border rect with clipped content hole */ - struct wlr_scene_tree *scene_surface; - struct wl_list link; - struct wl_list flink; + uint32_t tags; + int isfloating; + int isurgent; + int isfullscreen; + int isscratchpad; struct wlr_box geom; /* layout-relative, includes border */ struct wlr_box prev; /* layout-relative, includes border */ struct wlr_box bounds; /* only width and height are used */ + unsigned int bw; + int corner_radius; + struct wlr_scene_shadow *shadow; + + /* WARM — accessed less frequently */ + struct wl_list link; + struct wl_list flink; union { struct wlr_xdg_surface *xdg; struct wlr_xwayland_surface *xwayland; } surface; + struct wlr_scene_tree *scene; + struct wlr_scene_rect *border_bg; /* single border rect with clipped content hole */ + struct wlr_scene_tree *scene_surface; struct wlr_xdg_toplevel_decoration_v1 *decoration; + + /* COLD — wl_listeners (set up once, rarely touched after) */ struct wl_listener commit; struct wl_listener map; struct wl_listener maximize; @@ -53,26 +66,25 @@ typedef struct Client { struct wl_listener configure; struct wl_listener set_hints; #endif - unsigned int bw; - int corner_radius; - struct wlr_scene_shadow *shadow; - uint32_t tags; - int isfloating, isurgent, isfullscreen, isscratchpad; uint32_t resize; /* configure serial of a pending resize */ } Client; typedef struct { - /* Must keep this field first */ + /* Must keep this field first — union-cast discriminant */ unsigned int type; /* LayerShell */ + /* HOT */ Monitor *mon; struct wlr_scene_tree *scene; struct wlr_scene_tree *popups; struct wlr_scene_layer_surface_v1 *scene_layer; - struct wl_list link; int mapped; struct wlr_layer_surface_v1 *layer_surface; + /* WARM */ + struct wl_list link; + + /* COLD — wl_listeners */ struct wl_listener destroy; struct wl_listener unmap; struct wl_listener surface_commit; diff --git a/include/monitor.h b/include/monitor.h index c00e327..262160c 100644 --- a/include/monitor.h +++ b/include/monitor.h @@ -21,6 +21,20 @@ typedef struct { void (*arrange)(Monitor *); } Layout; +/* Cold state — accessed only on layout changes, not every frame. + * Allocated lazily on first dwindle/master layout use. */ +typedef struct MonitorCold { + const Layout *lt[TAGCOUNT][2]; + unsigned int sellt[TAGCOUNT]; + float mfact; + int nmaster; + char ltsymbol[TAGCOUNT][16]; + DwindleNode *dwindle_root[TAGCOUNT]; + struct Client *dwindle_focus[TAGCOUNT]; + struct Client *master_master[TAGCOUNT]; + int master_side[TAGCOUNT]; +} MonitorCold; + struct Monitor { struct wl_list link; struct wlr_output *wlr_output; @@ -34,21 +48,12 @@ struct Monitor { struct wlr_box m; /* monitor area, layout-relative */ struct wlr_box w; /* window area, layout-relative */ struct wl_list layers[4]; /* LayerSurface.link */ - const Layout *lt[TAGCOUNT][2]; /* per-tag layout slots */ + struct MonitorCold *cold; /* lazy-allocated layout state */ int gaps; unsigned int seltags; struct wlr_ext_workspace_group_handle_v1 *ext_group; - unsigned int sellt[TAGCOUNT]; /* per-tag layout toggle index */ uint32_t tagset[2]; - float mfact; - int nmaster; - char ltsymbol[TAGCOUNT][16]; /* per-tag layout symbol */ int asleep; - DwindleNode *dwindle_root[TAGCOUNT]; /* one tree per tag */ - struct Client *dwindle_focus[TAGCOUNT]; /* insertion anchor, one per tag */ - /* master/stack layout state */ - struct Client *master_master[TAGCOUNT]; /* the master client (NULL if none) */ - int master_side[TAGCOUNT]; /* 0 = master on left, 1 = master on right */ int scratchpad_visible; /* whether scratchpad is shown */ struct Client *scratchpad_prev_focus; /* client focused before scratchpad opened */ struct Client *scratchpad_current; /* currently visible scratchpad client */ diff --git a/parser/parser.c b/parser/parser.c index f9a5eef..9224bb7 100644 --- a/parser/parser.c +++ b/parser/parser.c @@ -743,8 +743,20 @@ config_load(const char *path, Config *cfg) parse_monitors (L, cfg); parse_workspace_layouts(L, cfg); parse_keybinds (L, cfg); + if (cfg->nkeybinds >= CFG_MAX_KEYBINDS) + fprintf(stderr, "peachwm config: number of keybinds reached the limit (%d). " + "Increase CFG_MAX_KEYBINDS or remove some binds.\n", + CFG_MAX_KEYBINDS); parse_buttons (L, cfg); + if (cfg->nbuttons >= CFG_MAX_KEYBINDS) + fprintf(stderr, "peachwm config: number of button binds reached the limit (%d). " + "Increase CFG_MAX_KEYBINDS or remove some binds.\n", + CFG_MAX_KEYBINDS); parse_scrolls (L, cfg); + if (cfg->nscrolls >= CFG_MAX_KEYBINDS) + fprintf(stderr, "peachwm config: number of scroll binds reached the limit (%d). " + "Increase CFG_MAX_KEYBINDS or remove some binds.\n", + CFG_MAX_KEYBINDS); parse_autostart (L, cfg); parse_effects (L, &cfg->effects); diff --git a/parser/parser.h b/parser/parser.h index 4536e0a..41abf92 100644 --- a/parser/parser.h +++ b/parser/parser.h @@ -6,9 +6,9 @@ /* Maximum lengths. Good for the soul, they say */ #define CFG_MAX_RULES 64 #define CFG_MAX_MONITORS 16 -#define CFG_MAX_KEYBINDS 256 -#define CFG_MAX_ARGS 16 -#define CFG_MAX_STRLEN 256 +#define CFG_MAX_KEYBINDS 128 +#define CFG_MAX_ARGS 8 +#define CFG_MAX_STRLEN 64 #define CFG_MAX_AUTOSTART 32 #define CFG_MAX_AUTOSTART_CMD 512 diff --git a/peachmsg/peachmsg b/peachmsg/peachmsg new file mode 100755 index 0000000..bb6c763 Binary files /dev/null and b/peachmsg/peachmsg differ diff --git a/peachmsg/peachwm-ipc-unstable-v2-protocol.c b/peachmsg/peachwm-ipc-unstable-v2-protocol.c new file mode 100644 index 0000000..dfc4982 --- /dev/null +++ b/peachmsg/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/peachmsg/peachwm-ipc-unstable-v2-protocol.h b/peachmsg/peachwm-ipc-unstable-v2-protocol.h new file mode 100644 index 0000000..ca47b95 --- /dev/null +++ b/peachmsg/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/peachwm b/peachwm new file mode 100755 index 0000000..5bf010d Binary files /dev/null and b/peachwm differ diff --git a/protocols/cursor-shape-v1-protocol.h b/protocols/cursor-shape-v1-protocol.h new file mode 100644 index 0000000..08714b3 --- /dev/null +++ b/protocols/cursor-shape-v1-protocol.h @@ -0,0 +1,507 @@ +/* Generated by wayland-scanner 1.25.0 */ + +#ifndef CURSOR_SHAPE_V1_SERVER_PROTOCOL_H +#define CURSOR_SHAPE_V1_SERVER_PROTOCOL_H + +#include +#include +#include "wayland-server.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct wl_client; +struct wl_resource; + +/** + * @page page_cursor_shape_v1 The cursor_shape_v1 protocol + * @section page_ifaces_cursor_shape_v1 Interfaces + * - @subpage page_iface_wp_cursor_shape_manager_v1 - cursor shape manager + * - @subpage page_iface_wp_cursor_shape_device_v1 - cursor shape for a device + * @section page_copyright_cursor_shape_v1 Copyright + *
+ *
+ * Copyright 2018 The Chromium Authors
+ * Copyright 2023 Simon Ser
+ *
+ * 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_pointer; +struct wp_cursor_shape_device_v1; +struct wp_cursor_shape_manager_v1; +struct zwp_tablet_tool_v2; + +#ifndef WP_CURSOR_SHAPE_MANAGER_V1_INTERFACE +#define WP_CURSOR_SHAPE_MANAGER_V1_INTERFACE +/** + * @page page_iface_wp_cursor_shape_manager_v1 wp_cursor_shape_manager_v1 + * @section page_iface_wp_cursor_shape_manager_v1_desc Description + * + * This global offers an alternative, optional way to set cursor images. This + * new way uses enumerated cursors instead of a wl_surface like + * wl_pointer.set_cursor does. + * + * Warning! The protocol described in this file is currently in the testing + * phase. Backward compatible changes may be added together with the + * corresponding interface version bump. Backward incompatible changes can + * only be done by creating a new major version of the extension. + * @section page_iface_wp_cursor_shape_manager_v1_api API + * See @ref iface_wp_cursor_shape_manager_v1. + */ +/** + * @defgroup iface_wp_cursor_shape_manager_v1 The wp_cursor_shape_manager_v1 interface + * + * This global offers an alternative, optional way to set cursor images. This + * new way uses enumerated cursors instead of a wl_surface like + * wl_pointer.set_cursor does. + * + * Warning! The protocol described in this file is currently in the testing + * phase. Backward compatible changes may be added together with the + * corresponding interface version bump. Backward incompatible changes can + * only be done by creating a new major version of the extension. + */ +extern const struct wl_interface wp_cursor_shape_manager_v1_interface; +#endif +#ifndef WP_CURSOR_SHAPE_DEVICE_V1_INTERFACE +#define WP_CURSOR_SHAPE_DEVICE_V1_INTERFACE +/** + * @page page_iface_wp_cursor_shape_device_v1 wp_cursor_shape_device_v1 + * @section page_iface_wp_cursor_shape_device_v1_desc Description + * + * This interface allows clients to set the cursor shape. + * @section page_iface_wp_cursor_shape_device_v1_api API + * See @ref iface_wp_cursor_shape_device_v1. + */ +/** + * @defgroup iface_wp_cursor_shape_device_v1 The wp_cursor_shape_device_v1 interface + * + * This interface allows clients to set the cursor shape. + */ +extern const struct wl_interface wp_cursor_shape_device_v1_interface; +#endif + +/** + * @ingroup iface_wp_cursor_shape_manager_v1 + * @struct wp_cursor_shape_manager_v1_interface + */ +struct wp_cursor_shape_manager_v1_interface { + /** + * destroy the manager + * + * Destroy the cursor shape manager. + */ + void (*destroy)(struct wl_client *client, + struct wl_resource *resource); + /** + * manage the cursor shape of a pointer device + * + * Obtain a wp_cursor_shape_device_v1 for a wl_pointer object. + * + * When the pointer capability is removed from the wl_seat, the + * wp_cursor_shape_device_v1 object becomes inert. + */ + void (*get_pointer)(struct wl_client *client, + struct wl_resource *resource, + uint32_t cursor_shape_device, + struct wl_resource *pointer); + /** + * manage the cursor shape of a tablet tool device + * + * Obtain a wp_cursor_shape_device_v1 for a zwp_tablet_tool_v2 + * object. + * + * When the zwp_tablet_tool_v2 is removed, the + * wp_cursor_shape_device_v1 object becomes inert. + */ + void (*get_tablet_tool_v2)(struct wl_client *client, + struct wl_resource *resource, + uint32_t cursor_shape_device, + struct wl_resource *tablet_tool); +}; + + +/** + * @ingroup iface_wp_cursor_shape_manager_v1 + */ +#define WP_CURSOR_SHAPE_MANAGER_V1_DESTROY_SINCE_VERSION 1 +/** + * @ingroup iface_wp_cursor_shape_manager_v1 + */ +#define WP_CURSOR_SHAPE_MANAGER_V1_GET_POINTER_SINCE_VERSION 1 +/** + * @ingroup iface_wp_cursor_shape_manager_v1 + */ +#define WP_CURSOR_SHAPE_MANAGER_V1_GET_TABLET_TOOL_V2_SINCE_VERSION 1 + +#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_SHAPE_ENUM_IS_VALID +#define WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_ENUM_IS_VALID +/** + * @ingroup iface_wp_cursor_shape_device_v1 + * Validate a wp_cursor_shape_device_v1 shape value. + * + * @return true on success, false on error. + * @ref wp_cursor_shape_device_v1_shape + */ +static inline bool +wp_cursor_shape_device_v1_shape_is_valid(uint32_t value, uint32_t version) { + switch (value) { + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_DEFAULT: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_CONTEXT_MENU: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_HELP: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_POINTER: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_PROGRESS: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_WAIT: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_CELL: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_CROSSHAIR: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_TEXT: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_VERTICAL_TEXT: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_ALIAS: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_COPY: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_MOVE: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_NO_DROP: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_NOT_ALLOWED: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_GRAB: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_GRABBING: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_E_RESIZE: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_N_RESIZE: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_NE_RESIZE: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_NW_RESIZE: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_S_RESIZE: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_SE_RESIZE: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_SW_RESIZE: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_W_RESIZE: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_EW_RESIZE: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_NS_RESIZE: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_NESW_RESIZE: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_NWSE_RESIZE: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_COL_RESIZE: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_ROW_RESIZE: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_ALL_SCROLL: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_ZOOM_IN: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_ZOOM_OUT: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_DND_ASK: + return version >= 2; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_ALL_RESIZE: + return version >= 2; + default: + return false; + } +} +#endif /* WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_ENUM_IS_VALID */ + +#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 */ + +#ifndef WP_CURSOR_SHAPE_DEVICE_V1_ERROR_ENUM_IS_VALID +#define WP_CURSOR_SHAPE_DEVICE_V1_ERROR_ENUM_IS_VALID +/** + * @ingroup iface_wp_cursor_shape_device_v1 + * Validate a wp_cursor_shape_device_v1 error value. + * + * @return true on success, false on error. + * @ref wp_cursor_shape_device_v1_error + */ +static inline bool +wp_cursor_shape_device_v1_error_is_valid(uint32_t value, uint32_t version) { + switch (value) { + case WP_CURSOR_SHAPE_DEVICE_V1_ERROR_INVALID_SHAPE: + return version >= 1; + default: + return false; + } +} +#endif /* WP_CURSOR_SHAPE_DEVICE_V1_ERROR_ENUM_IS_VALID */ + +/** + * @ingroup iface_wp_cursor_shape_device_v1 + * @struct wp_cursor_shape_device_v1_interface + */ +struct wp_cursor_shape_device_v1_interface { + /** + * destroy the cursor shape device + * + * Destroy the cursor shape device. + * + * The device cursor shape remains unchanged. + */ + void (*destroy)(struct wl_client *client, + struct wl_resource *resource); + /** + * set device cursor to the shape + * + * Sets the device cursor to the specified shape. The compositor + * will change the cursor image based on the specified shape. + * + * The cursor actually changes only if the input device focus is + * one of the requesting client's surfaces. If any, the previous + * cursor image (surface or shape) is replaced. + * + * The "shape" argument must be a valid enum entry, otherwise the + * invalid_shape protocol error is raised. + * + * This is similar to the wl_pointer.set_cursor and + * zwp_tablet_tool_v2.set_cursor requests, but this request accepts + * a shape instead of contents in the form of a surface. Clients + * can mix set_cursor and set_shape requests. + * + * The serial parameter must match the latest wl_pointer.enter or + * zwp_tablet_tool_v2.proximity_in serial number sent to the + * client. Otherwise the request will be ignored. + * @param serial serial number of the enter event + */ + void (*set_shape)(struct wl_client *client, + struct wl_resource *resource, + uint32_t serial, + uint32_t shape); +}; + + +/** + * @ingroup iface_wp_cursor_shape_device_v1 + */ +#define WP_CURSOR_SHAPE_DEVICE_V1_DESTROY_SINCE_VERSION 1 +/** + * @ingroup iface_wp_cursor_shape_device_v1 + */ +#define WP_CURSOR_SHAPE_DEVICE_V1_SET_SHAPE_SINCE_VERSION 1 + +#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 + *
+ *
+ * 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..0d48fcd --- /dev/null +++ b/protocols/pointer-constraints-unstable-v1-protocol.h @@ -0,0 +1,615 @@ +/* Generated by wayland-scanner 1.25.0 */ + +#ifndef POINTER_CONSTRAINTS_UNSTABLE_V1_SERVER_PROTOCOL_H +#define POINTER_CONSTRAINTS_UNSTABLE_V1_SERVER_PROTOCOL_H + +#include +#include +#include "wayland-server.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct wl_client; +struct wl_resource; + +/** + * @page page_pointer_constraints_unstable_v1 The pointer_constraints_unstable_v1 protocol + * protocol for constraining pointer motions + * + * @section page_desc_pointer_constraints_unstable_v1 Description + * + * This protocol specifies a set of interfaces used for adding constraints to + * the motion of a pointer. Possible constraints include confining pointer + * motions to a given region, or locking it to its current position. + * + * In order to constrain the pointer, a client must first bind the global + * interface "wp_pointer_constraints" which, if a compositor supports pointer + * constraints, is exposed by the registry. Using the bound global object, the + * client uses the request that corresponds to the type of constraint it wants + * to make. See wp_pointer_constraints for more details. + * + * 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_pointer_constraints_unstable_v1 Interfaces + * - @subpage page_iface_zwp_pointer_constraints_v1 - constrain the movement of a pointer + * - @subpage page_iface_zwp_locked_pointer_v1 - receive relative pointer motion events + * - @subpage page_iface_zwp_confined_pointer_v1 - confined pointer object + * @section page_copyright_pointer_constraints_unstable_v1 Copyright + *
+ *
+ * Copyright © 2014      Jonas Ådahl
+ * Copyright © 2015      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_pointer; +struct wl_region; +struct wl_surface; +struct zwp_confined_pointer_v1; +struct zwp_locked_pointer_v1; +struct zwp_pointer_constraints_v1; + +#ifndef ZWP_POINTER_CONSTRAINTS_V1_INTERFACE +#define ZWP_POINTER_CONSTRAINTS_V1_INTERFACE +/** + * @page page_iface_zwp_pointer_constraints_v1 zwp_pointer_constraints_v1 + * @section page_iface_zwp_pointer_constraints_v1_desc Description + * + * The global interface exposing pointer constraining functionality. It + * exposes two requests: lock_pointer for locking the pointer to its + * position, and confine_pointer for locking the pointer to a region. + * + * The lock_pointer and confine_pointer requests create the objects + * wp_locked_pointer and wp_confined_pointer respectively, and the client can + * use these objects to interact with the lock. + * + * For any surface, only one lock or confinement may be active across all + * wl_pointer objects of the same seat. If a lock or confinement is requested + * when another lock or confinement is active or requested on the same surface + * and with any of the wl_pointer objects of the same seat, an + * 'already_constrained' error will be raised. + * @section page_iface_zwp_pointer_constraints_v1_api API + * See @ref iface_zwp_pointer_constraints_v1. + */ +/** + * @defgroup iface_zwp_pointer_constraints_v1 The zwp_pointer_constraints_v1 interface + * + * The global interface exposing pointer constraining functionality. It + * exposes two requests: lock_pointer for locking the pointer to its + * position, and confine_pointer for locking the pointer to a region. + * + * The lock_pointer and confine_pointer requests create the objects + * wp_locked_pointer and wp_confined_pointer respectively, and the client can + * use these objects to interact with the lock. + * + * For any surface, only one lock or confinement may be active across all + * wl_pointer objects of the same seat. If a lock or confinement is requested + * when another lock or confinement is active or requested on the same surface + * and with any of the wl_pointer objects of the same seat, an + * 'already_constrained' error will be raised. + */ +extern const struct wl_interface zwp_pointer_constraints_v1_interface; +#endif +#ifndef ZWP_LOCKED_POINTER_V1_INTERFACE +#define ZWP_LOCKED_POINTER_V1_INTERFACE +/** + * @page page_iface_zwp_locked_pointer_v1 zwp_locked_pointer_v1 + * @section page_iface_zwp_locked_pointer_v1_desc Description + * + * The wp_locked_pointer interface represents a locked pointer state. + * + * While the lock of this object is active, the wl_pointer objects of the + * associated seat will not emit any wl_pointer.motion events. + * + * This object will send the event 'locked' when the lock is activated. + * Whenever the lock is activated, it is guaranteed that the locked surface + * will already have received pointer focus and that the pointer will be + * within the region passed to the request creating this object. + * + * To unlock the pointer, send the destroy request. This will also destroy + * the wp_locked_pointer object. + * + * If the compositor decides to unlock the pointer the unlocked event is + * sent. See wp_locked_pointer.unlock for details. + * + * When unlocking, the compositor may warp the cursor position to the set + * cursor position hint. If it does, it will not result in any relative + * motion events emitted via wp_relative_pointer. + * + * If the surface the lock was requested on is destroyed and the lock is not + * yet activated, the wp_locked_pointer object is now defunct and must be + * destroyed. + * @section page_iface_zwp_locked_pointer_v1_api API + * See @ref iface_zwp_locked_pointer_v1. + */ +/** + * @defgroup iface_zwp_locked_pointer_v1 The zwp_locked_pointer_v1 interface + * + * The wp_locked_pointer interface represents a locked pointer state. + * + * While the lock of this object is active, the wl_pointer objects of the + * associated seat will not emit any wl_pointer.motion events. + * + * This object will send the event 'locked' when the lock is activated. + * Whenever the lock is activated, it is guaranteed that the locked surface + * will already have received pointer focus and that the pointer will be + * within the region passed to the request creating this object. + * + * To unlock the pointer, send the destroy request. This will also destroy + * the wp_locked_pointer object. + * + * If the compositor decides to unlock the pointer the unlocked event is + * sent. See wp_locked_pointer.unlock for details. + * + * When unlocking, the compositor may warp the cursor position to the set + * cursor position hint. If it does, it will not result in any relative + * motion events emitted via wp_relative_pointer. + * + * If the surface the lock was requested on is destroyed and the lock is not + * yet activated, the wp_locked_pointer object is now defunct and must be + * destroyed. + */ +extern const struct wl_interface zwp_locked_pointer_v1_interface; +#endif +#ifndef ZWP_CONFINED_POINTER_V1_INTERFACE +#define ZWP_CONFINED_POINTER_V1_INTERFACE +/** + * @page page_iface_zwp_confined_pointer_v1 zwp_confined_pointer_v1 + * @section page_iface_zwp_confined_pointer_v1_desc Description + * + * The wp_confined_pointer interface represents a confined pointer state. + * + * This object will send the event 'confined' when the confinement is + * activated. Whenever the confinement is activated, it is guaranteed that + * the surface the pointer is confined to will already have received pointer + * focus and that the pointer will be within the region passed to the request + * creating this object. It is up to the compositor to decide whether this + * requires some user interaction and if the pointer will warp to within the + * passed region if outside. + * + * To unconfine the pointer, send the destroy request. This will also destroy + * the wp_confined_pointer object. + * + * If the compositor decides to unconfine the pointer the unconfined event is + * sent. The wp_confined_pointer object is at this point defunct and should + * be destroyed. + * @section page_iface_zwp_confined_pointer_v1_api API + * See @ref iface_zwp_confined_pointer_v1. + */ +/** + * @defgroup iface_zwp_confined_pointer_v1 The zwp_confined_pointer_v1 interface + * + * The wp_confined_pointer interface represents a confined pointer state. + * + * This object will send the event 'confined' when the confinement is + * activated. Whenever the confinement is activated, it is guaranteed that + * the surface the pointer is confined to will already have received pointer + * focus and that the pointer will be within the region passed to the request + * creating this object. It is up to the compositor to decide whether this + * requires some user interaction and if the pointer will warp to within the + * passed region if outside. + * + * To unconfine the pointer, send the destroy request. This will also destroy + * the wp_confined_pointer object. + * + * If the compositor decides to unconfine the pointer the unconfined event is + * sent. The wp_confined_pointer object is at this point defunct and should + * be destroyed. + */ +extern const struct wl_interface zwp_confined_pointer_v1_interface; +#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_ERROR_ENUM_IS_VALID +#define ZWP_POINTER_CONSTRAINTS_V1_ERROR_ENUM_IS_VALID +/** + * @ingroup iface_zwp_pointer_constraints_v1 + * Validate a zwp_pointer_constraints_v1 error value. + * + * @return true on success, false on error. + * @ref zwp_pointer_constraints_v1_error + */ +static inline bool +zwp_pointer_constraints_v1_error_is_valid(uint32_t value, uint32_t version) { + switch (value) { + case ZWP_POINTER_CONSTRAINTS_V1_ERROR_ALREADY_CONSTRAINED: + return version >= 1; + default: + return false; + } +} +#endif /* ZWP_POINTER_CONSTRAINTS_V1_ERROR_ENUM_IS_VALID */ + +#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 */ + +#ifndef ZWP_POINTER_CONSTRAINTS_V1_LIFETIME_ENUM_IS_VALID +#define ZWP_POINTER_CONSTRAINTS_V1_LIFETIME_ENUM_IS_VALID +/** + * @ingroup iface_zwp_pointer_constraints_v1 + * Validate a zwp_pointer_constraints_v1 lifetime value. + * + * @return true on success, false on error. + * @ref zwp_pointer_constraints_v1_lifetime + */ +static inline bool +zwp_pointer_constraints_v1_lifetime_is_valid(uint32_t value, uint32_t version) { + switch (value) { + case ZWP_POINTER_CONSTRAINTS_V1_LIFETIME_ONESHOT: + return version >= 1; + case ZWP_POINTER_CONSTRAINTS_V1_LIFETIME_PERSISTENT: + return version >= 1; + default: + return false; + } +} +#endif /* ZWP_POINTER_CONSTRAINTS_V1_LIFETIME_ENUM_IS_VALID */ + +/** + * @ingroup iface_zwp_pointer_constraints_v1 + * @struct zwp_pointer_constraints_v1_interface + */ +struct zwp_pointer_constraints_v1_interface { + /** + * destroy the pointer constraints manager object + * + * Used by the client to notify the server that it will no longer + * use this pointer constraints object. + */ + void (*destroy)(struct wl_client *client, + struct wl_resource *resource); + /** + * lock pointer to a position + * + * The lock_pointer request lets the client request to disable + * movements of the virtual pointer (i.e. the cursor), effectively + * locking the pointer to a position. This request may not take + * effect immediately; in the future, when the compositor deems + * implementation-specific constraints are satisfied, the pointer + * lock will be activated and the compositor sends a locked event. + * + * The protocol provides no guarantee that the constraints are ever + * satisfied, and does not require the compositor to send an error + * if the constraints cannot ever be satisfied. It is thus possible + * to request a lock that will never activate. + * + * There may not be another pointer constraint of any kind + * requested or active on the surface for any of the wl_pointer + * objects of the seat of the passed pointer when requesting a + * lock. If there is, an error will be raised. See general pointer + * lock documentation for more details. + * + * The intersection of the region passed with this request and the + * input region of the surface is used to determine where the + * pointer must be in order for the lock to activate. It is up to + * the compositor whether to warp the pointer or require some kind + * of user interaction for the lock to activate. If the region is + * null the surface input region is used. + * + * A surface may receive pointer focus without the lock being + * activated. + * + * The request creates a new object wp_locked_pointer which is used + * to interact with the lock as well as receive updates about its + * state. See the the description of wp_locked_pointer for further + * information. + * + * Note that while a pointer is locked, the wl_pointer objects of + * the corresponding seat will not emit any wl_pointer.motion + * events, but relative motion events will still be emitted via + * wp_relative_pointer objects of the same seat. wl_pointer.axis + * and wl_pointer.button events are unaffected. + * @param surface surface to lock pointer to + * @param pointer the pointer that should be locked + * @param region region of surface + * @param lifetime lock lifetime + */ + void (*lock_pointer)(struct wl_client *client, + struct wl_resource *resource, + uint32_t id, + struct wl_resource *surface, + struct wl_resource *pointer, + struct wl_resource *region, + uint32_t lifetime); + /** + * confine pointer to a region + * + * The confine_pointer request lets the client request to confine + * the pointer cursor to a given region. This request may not take + * effect immediately; in the future, when the compositor deems + * implementation- specific constraints are satisfied, the pointer + * confinement will be activated and the compositor sends a + * confined event. + * + * The intersection of the region passed with this request and the + * input region of the surface is used to determine where the + * pointer must be in order for the confinement to activate. It is + * up to the compositor whether to warp the pointer or require some + * kind of user interaction for the confinement to activate. If the + * region is null the surface input region is used. + * + * The request will create a new object wp_confined_pointer which + * is used to interact with the confinement as well as receive + * updates about its state. See the the description of + * wp_confined_pointer for further information. + * @param surface surface to lock pointer to + * @param pointer the pointer that should be confined + * @param region region of surface + * @param lifetime confinement lifetime + */ + void (*confine_pointer)(struct wl_client *client, + struct wl_resource *resource, + uint32_t id, + struct wl_resource *surface, + struct wl_resource *pointer, + struct wl_resource *region, + uint32_t lifetime); +}; + + +/** + * @ingroup iface_zwp_pointer_constraints_v1 + */ +#define ZWP_POINTER_CONSTRAINTS_V1_DESTROY_SINCE_VERSION 1 +/** + * @ingroup iface_zwp_pointer_constraints_v1 + */ +#define ZWP_POINTER_CONSTRAINTS_V1_LOCK_POINTER_SINCE_VERSION 1 +/** + * @ingroup iface_zwp_pointer_constraints_v1 + */ +#define ZWP_POINTER_CONSTRAINTS_V1_CONFINE_POINTER_SINCE_VERSION 1 + +/** + * @ingroup iface_zwp_locked_pointer_v1 + * @struct zwp_locked_pointer_v1_interface + */ +struct zwp_locked_pointer_v1_interface { + /** + * destroy the locked pointer object + * + * Destroy the locked pointer object. If applicable, the + * compositor will unlock the pointer. + */ + void (*destroy)(struct wl_client *client, + struct wl_resource *resource); + /** + * set the pointer cursor position hint + * + * Set the cursor position hint relative to the top left corner + * of the surface. + * + * If the client is drawing its own cursor, it should update the + * position hint to the position of its own cursor. A compositor + * may use this information to warp the pointer upon unlock in + * order to avoid pointer jumps. + * + * The cursor position hint is double-buffered state, see + * wl_surface.commit. + * @param surface_x surface-local x coordinate + * @param surface_y surface-local y coordinate + */ + void (*set_cursor_position_hint)(struct wl_client *client, + struct wl_resource *resource, + wl_fixed_t surface_x, + wl_fixed_t surface_y); + /** + * set a new lock region + * + * Set a new region used to lock the pointer. + * + * The new lock region is double-buffered, see wl_surface.commit. + * + * For details about the lock region, see wp_locked_pointer. + * @param region region of surface + */ + void (*set_region)(struct wl_client *client, + struct wl_resource *resource, + struct wl_resource *region); +}; + +#define ZWP_LOCKED_POINTER_V1_LOCKED 0 +#define ZWP_LOCKED_POINTER_V1_UNLOCKED 1 + +/** + * @ingroup iface_zwp_locked_pointer_v1 + */ +#define ZWP_LOCKED_POINTER_V1_LOCKED_SINCE_VERSION 1 +/** + * @ingroup iface_zwp_locked_pointer_v1 + */ +#define ZWP_LOCKED_POINTER_V1_UNLOCKED_SINCE_VERSION 1 + +/** + * @ingroup iface_zwp_locked_pointer_v1 + */ +#define ZWP_LOCKED_POINTER_V1_DESTROY_SINCE_VERSION 1 +/** + * @ingroup iface_zwp_locked_pointer_v1 + */ +#define ZWP_LOCKED_POINTER_V1_SET_CURSOR_POSITION_HINT_SINCE_VERSION 1 +/** + * @ingroup iface_zwp_locked_pointer_v1 + */ +#define ZWP_LOCKED_POINTER_V1_SET_REGION_SINCE_VERSION 1 + +/** + * @ingroup iface_zwp_locked_pointer_v1 + * Sends an locked event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +zwp_locked_pointer_v1_send_locked(struct wl_resource *resource_) +{ + wl_resource_post_event(resource_, ZWP_LOCKED_POINTER_V1_LOCKED); +} + +/** + * @ingroup iface_zwp_locked_pointer_v1 + * Sends an unlocked event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +zwp_locked_pointer_v1_send_unlocked(struct wl_resource *resource_) +{ + wl_resource_post_event(resource_, ZWP_LOCKED_POINTER_V1_UNLOCKED); +} + +/** + * @ingroup iface_zwp_confined_pointer_v1 + * @struct zwp_confined_pointer_v1_interface + */ +struct zwp_confined_pointer_v1_interface { + /** + * destroy the confined pointer object + * + * Destroy the confined pointer object. If applicable, the + * compositor will unconfine the pointer. + */ + void (*destroy)(struct wl_client *client, + struct wl_resource *resource); + /** + * set a new confine region + * + * Set a new region used to confine the pointer. + * + * The new confine region is double-buffered, see + * wl_surface.commit. + * + * If the confinement is active when the new confinement region is + * applied and the pointer ends up outside of newly applied region, + * the pointer may warped to a position within the new confinement + * region. If warped, a wl_pointer.motion event will be emitted, + * but no wp_relative_pointer.relative_motion event. + * + * The compositor may also, instead of using the new region, + * unconfine the pointer. + * + * For details about the confine region, see wp_confined_pointer. + * @param region region of surface + */ + void (*set_region)(struct wl_client *client, + struct wl_resource *resource, + struct wl_resource *region); +}; + +#define ZWP_CONFINED_POINTER_V1_CONFINED 0 +#define ZWP_CONFINED_POINTER_V1_UNCONFINED 1 + +/** + * @ingroup iface_zwp_confined_pointer_v1 + */ +#define ZWP_CONFINED_POINTER_V1_CONFINED_SINCE_VERSION 1 +/** + * @ingroup iface_zwp_confined_pointer_v1 + */ +#define ZWP_CONFINED_POINTER_V1_UNCONFINED_SINCE_VERSION 1 + +/** + * @ingroup iface_zwp_confined_pointer_v1 + */ +#define ZWP_CONFINED_POINTER_V1_DESTROY_SINCE_VERSION 1 +/** + * @ingroup iface_zwp_confined_pointer_v1 + */ +#define ZWP_CONFINED_POINTER_V1_SET_REGION_SINCE_VERSION 1 + +/** + * @ingroup iface_zwp_confined_pointer_v1 + * Sends an confined event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +zwp_confined_pointer_v1_send_confined(struct wl_resource *resource_) +{ + wl_resource_post_event(resource_, ZWP_CONFINED_POINTER_V1_CONFINED); +} + +/** + * @ingroup iface_zwp_confined_pointer_v1 + * Sends an unconfined event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +zwp_confined_pointer_v1_send_unconfined(struct wl_resource *resource_) +{ + wl_resource_post_event(resource_, ZWP_CONFINED_POINTER_V1_UNCONFINED); +} + +#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..dd34d59 --- /dev/null +++ b/protocols/wlr-layer-shell-unstable-v1-protocol.h @@ -0,0 +1,730 @@ +/* Generated by wayland-scanner 1.25.0 */ + +#ifndef WLR_LAYER_SHELL_UNSTABLE_V1_SERVER_PROTOCOL_H +#define WLR_LAYER_SHELL_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_layer_shell_unstable_v1 The wlr_layer_shell_unstable_v1 protocol + * @section page_ifaces_wlr_layer_shell_unstable_v1 Interfaces + * - @subpage page_iface_zwlr_layer_shell_v1 - create surfaces that are layers of the desktop + * - @subpage page_iface_zwlr_layer_surface_v1 - layer metadata interface + * @section page_copyright_wlr_layer_shell_unstable_v1 Copyright + *
+ *
+ * Copyright © 2017 Drew DeVault
+ *
+ * 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 wl_output; +struct wl_surface; +struct xdg_popup; +struct zwlr_layer_shell_v1; +struct zwlr_layer_surface_v1; + +#ifndef ZWLR_LAYER_SHELL_V1_INTERFACE +#define ZWLR_LAYER_SHELL_V1_INTERFACE +/** + * @page page_iface_zwlr_layer_shell_v1 zwlr_layer_shell_v1 + * @section page_iface_zwlr_layer_shell_v1_desc Description + * + * Clients can use this interface to assign the surface_layer role to + * wl_surfaces. Such surfaces are assigned to a "layer" of the output and + * rendered with a defined z-depth respective to each other. They may also be + * anchored to the edges and corners of a screen and specify input handling + * semantics. This interface should be suitable for the implementation of + * many desktop shell components, and a broad number of other applications + * that interact with the desktop. + * @section page_iface_zwlr_layer_shell_v1_api API + * See @ref iface_zwlr_layer_shell_v1. + */ +/** + * @defgroup iface_zwlr_layer_shell_v1 The zwlr_layer_shell_v1 interface + * + * Clients can use this interface to assign the surface_layer role to + * wl_surfaces. Such surfaces are assigned to a "layer" of the output and + * rendered with a defined z-depth respective to each other. They may also be + * anchored to the edges and corners of a screen and specify input handling + * semantics. This interface should be suitable for the implementation of + * many desktop shell components, and a broad number of other applications + * that interact with the desktop. + */ +extern const struct wl_interface zwlr_layer_shell_v1_interface; +#endif +#ifndef ZWLR_LAYER_SURFACE_V1_INTERFACE +#define ZWLR_LAYER_SURFACE_V1_INTERFACE +/** + * @page page_iface_zwlr_layer_surface_v1 zwlr_layer_surface_v1 + * @section page_iface_zwlr_layer_surface_v1_desc Description + * + * An interface that may be implemented by a wl_surface, for surfaces that + * are designed to be rendered as a layer of a stacked desktop-like + * environment. + * + * Layer surface state (layer, size, anchor, exclusive zone, + * margin, interactivity) is double-buffered, and will be applied at the + * time wl_surface.commit of the corresponding wl_surface is called. + * + * Attaching a null buffer to a layer surface unmaps it. + * + * Unmapping a layer_surface means that the surface cannot be shown by the + * compositor until it is explicitly mapped again. The layer_surface + * returns to the state it had right after layer_shell.get_layer_surface. + * The client can re-map the surface by performing a commit without any + * buffer attached, waiting for a configure event and handling it as usual. + * @section page_iface_zwlr_layer_surface_v1_api API + * See @ref iface_zwlr_layer_surface_v1. + */ +/** + * @defgroup iface_zwlr_layer_surface_v1 The zwlr_layer_surface_v1 interface + * + * An interface that may be implemented by a wl_surface, for surfaces that + * are designed to be rendered as a layer of a stacked desktop-like + * environment. + * + * Layer surface state (layer, size, anchor, exclusive zone, + * margin, interactivity) is double-buffered, and will be applied at the + * time wl_surface.commit of the corresponding wl_surface is called. + * + * Attaching a null buffer to a layer surface unmaps it. + * + * Unmapping a layer_surface means that the surface cannot be shown by the + * compositor until it is explicitly mapped again. The layer_surface + * returns to the state it had right after layer_shell.get_layer_surface. + * The client can re-map the surface by performing a commit without any + * buffer attached, waiting for a configure event and handling it as usual. + */ +extern const struct wl_interface zwlr_layer_surface_v1_interface; +#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_ERROR_ENUM_IS_VALID +#define ZWLR_LAYER_SHELL_V1_ERROR_ENUM_IS_VALID +/** + * @ingroup iface_zwlr_layer_shell_v1 + * Validate a zwlr_layer_shell_v1 error value. + * + * @return true on success, false on error. + * @ref zwlr_layer_shell_v1_error + */ +static inline bool +zwlr_layer_shell_v1_error_is_valid(uint32_t value, uint32_t version) { + switch (value) { + case ZWLR_LAYER_SHELL_V1_ERROR_ROLE: + return version >= 1; + case ZWLR_LAYER_SHELL_V1_ERROR_INVALID_LAYER: + return version >= 1; + case ZWLR_LAYER_SHELL_V1_ERROR_ALREADY_CONSTRUCTED: + return version >= 1; + default: + return false; + } +} +#endif /* ZWLR_LAYER_SHELL_V1_ERROR_ENUM_IS_VALID */ + +#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_SHELL_V1_LAYER_ENUM_IS_VALID +#define ZWLR_LAYER_SHELL_V1_LAYER_ENUM_IS_VALID +/** + * @ingroup iface_zwlr_layer_shell_v1 + * Validate a zwlr_layer_shell_v1 layer value. + * + * @return true on success, false on error. + * @ref zwlr_layer_shell_v1_layer + */ +static inline bool +zwlr_layer_shell_v1_layer_is_valid(uint32_t value, uint32_t version) { + switch (value) { + case ZWLR_LAYER_SHELL_V1_LAYER_BACKGROUND: + return version >= 1; + case ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM: + return version >= 1; + case ZWLR_LAYER_SHELL_V1_LAYER_TOP: + return version >= 1; + case ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY: + return version >= 1; + default: + return false; + } +} +#endif /* ZWLR_LAYER_SHELL_V1_LAYER_ENUM_IS_VALID */ + +/** + * @ingroup iface_zwlr_layer_shell_v1 + * @struct zwlr_layer_shell_v1_interface + */ +struct zwlr_layer_shell_v1_interface { + /** + * create a layer_surface from a surface + * + * Create a layer surface for an existing surface. This assigns + * the role of layer_surface, or raises a protocol error if another + * role is already assigned. + * + * Creating a layer 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 + * layer_surface.configure call must also be treated as errors. + * + * After creating a layer_surface object and setting it up, the + * client must perform an initial commit without any buffer + * attached. The compositor will reply with a + * layer_surface.configure event. The client must acknowledge it + * and is then allowed to attach a buffer to map the surface. + * + * You may pass NULL for output to allow the compositor to decide + * which output to use. Generally this will be the one that the + * user most recently interacted with. + * + * Clients can specify a namespace that defines the purpose of the + * layer surface. + * @param layer layer to add this surface to + * @param namespace namespace for the layer surface + */ + void (*get_layer_surface)(struct wl_client *client, + struct wl_resource *resource, + uint32_t id, + struct wl_resource *surface, + struct wl_resource *output, + uint32_t layer, + const char *namespace); + /** + * destroy the layer_shell object + * + * This request indicates that the client will not use the + * layer_shell object any more. Objects that have been created + * through this instance are not affected. + * @since 3 + */ + void (*destroy)(struct wl_client *client, + struct wl_resource *resource); +}; + + +/** + * @ingroup iface_zwlr_layer_shell_v1 + */ +#define ZWLR_LAYER_SHELL_V1_GET_LAYER_SURFACE_SINCE_VERSION 1 +/** + * @ingroup iface_zwlr_layer_shell_v1 + */ +#define ZWLR_LAYER_SHELL_V1_DESTROY_SINCE_VERSION 3 + +#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_KEYBOARD_INTERACTIVITY_ENUM_IS_VALID +#define ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_ENUM_IS_VALID +/** + * @ingroup iface_zwlr_layer_surface_v1 + * Validate a zwlr_layer_surface_v1 keyboard_interactivity value. + * + * @return true on success, false on error. + * @ref zwlr_layer_surface_v1_keyboard_interactivity + */ +static inline bool +zwlr_layer_surface_v1_keyboard_interactivity_is_valid(uint32_t value, uint32_t version) { + switch (value) { + case ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_NONE: + return version >= 1; + case ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_EXCLUSIVE: + return version >= 1; + case ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_ON_DEMAND: + return version >= 4; + default: + return false; + } +} +#endif /* ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_ENUM_IS_VALID */ + +#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_ERROR_ENUM_IS_VALID +#define ZWLR_LAYER_SURFACE_V1_ERROR_ENUM_IS_VALID +/** + * @ingroup iface_zwlr_layer_surface_v1 + * Validate a zwlr_layer_surface_v1 error value. + * + * @return true on success, false on error. + * @ref zwlr_layer_surface_v1_error + */ +static inline bool +zwlr_layer_surface_v1_error_is_valid(uint32_t value, uint32_t version) { + switch (value) { + case ZWLR_LAYER_SURFACE_V1_ERROR_INVALID_SURFACE_STATE: + return version >= 1; + case ZWLR_LAYER_SURFACE_V1_ERROR_INVALID_SIZE: + return version >= 1; + case ZWLR_LAYER_SURFACE_V1_ERROR_INVALID_ANCHOR: + return version >= 1; + case ZWLR_LAYER_SURFACE_V1_ERROR_INVALID_KEYBOARD_INTERACTIVITY: + return version >= 1; + default: + return false; + } +} +#endif /* ZWLR_LAYER_SURFACE_V1_ERROR_ENUM_IS_VALID */ + +#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 */ + +#ifndef ZWLR_LAYER_SURFACE_V1_ANCHOR_ENUM_IS_VALID +#define ZWLR_LAYER_SURFACE_V1_ANCHOR_ENUM_IS_VALID +/** + * @ingroup iface_zwlr_layer_surface_v1 + * Validate a zwlr_layer_surface_v1 anchor value. + * + * @return true on success, false on error. + * @ref zwlr_layer_surface_v1_anchor + */ +static inline bool +zwlr_layer_surface_v1_anchor_is_valid(uint32_t value, uint32_t version) { + uint32_t valid = 0; + if (version >= 1) + valid |= ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP; + if (version >= 1) + valid |= ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM; + if (version >= 1) + valid |= ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT; + if (version >= 1) + valid |= ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT; + return (value & ~valid) == 0; +} +#endif /* ZWLR_LAYER_SURFACE_V1_ANCHOR_ENUM_IS_VALID */ + +/** + * @ingroup iface_zwlr_layer_surface_v1 + * @struct zwlr_layer_surface_v1_interface + */ +struct zwlr_layer_surface_v1_interface { + /** + * sets the size of the surface + * + * Sets the size of the surface in surface-local coordinates. The + * compositor will display the surface centered with respect to its + * anchors. + * + * If you pass 0 for either value, the compositor will assign it + * and inform you of the assignment in the configure event. You + * must set your anchor to opposite edges in the dimensions you + * omit; not doing so is a protocol error. Both values are 0 by + * default. + * + * Size is double-buffered, see wl_surface.commit. + */ + void (*set_size)(struct wl_client *client, + struct wl_resource *resource, + uint32_t width, + uint32_t height); + /** + * configures the anchor point of the surface + * + * Requests that the compositor anchor the surface to the + * specified edges and corners. If two orthogonal edges are + * specified (e.g. 'top' and 'left'), then the anchor point will be + * the intersection of the edges (e.g. the top left corner of the + * output); otherwise the anchor point will be centered on that + * edge, or in the center if none is specified. + * + * Anchor is double-buffered, see wl_surface.commit. + */ + void (*set_anchor)(struct wl_client *client, + struct wl_resource *resource, + uint32_t anchor); + /** + * configures the exclusive geometry of this surface + * + * Requests that the compositor avoids occluding an area with + * other surfaces. The compositor's use of this information is + * implementation-dependent - do not assume that this region will + * not actually be occluded. + * + * A positive value is only meaningful if the surface is anchored + * to one edge or an edge and both perpendicular edges. If the + * surface is not anchored, anchored to only two perpendicular + * edges (a corner), anchored to only two parallel edges or + * anchored to all edges, a positive value will be treated the same + * as zero. + * + * A positive zone is the distance from the edge in surface-local + * coordinates to consider exclusive. + * + * Surfaces that do not wish to have an exclusive zone may instead + * specify how they should interact with surfaces that do. If set + * to zero, the surface indicates that it would like to be moved to + * avoid occluding surfaces with a positive exclusive zone. If set + * to -1, the surface indicates that it would not like to be moved + * to accommodate for other surfaces, and the compositor should + * extend it all the way to the edges it is anchored to. + * + * For example, a panel might set its exclusive zone to 10, so that + * maximized shell surfaces are not shown on top of it. A + * notification might set its exclusive zone to 0, so that it is + * moved to avoid occluding the panel, but shell surfaces are shown + * underneath it. A wallpaper or lock screen might set their + * exclusive zone to -1, so that they stretch below or over the + * panel. + * + * The default value is 0. + * + * Exclusive zone is double-buffered, see wl_surface.commit. + */ + void (*set_exclusive_zone)(struct wl_client *client, + struct wl_resource *resource, + int32_t zone); + /** + * sets a margin from the anchor point + * + * Requests that the surface be placed some distance away from + * the anchor point on the output, in surface-local coordinates. + * Setting this value for edges you are not anchored to has no + * effect. + * + * The exclusive zone includes the margin. + * + * Margin is double-buffered, see wl_surface.commit. + */ + void (*set_margin)(struct wl_client *client, + struct wl_resource *resource, + int32_t top, + int32_t right, + int32_t bottom, + int32_t left); + /** + * requests keyboard events + * + * Set how keyboard events are delivered to this surface. By + * default, layer shell surfaces do not receive keyboard events; + * this request can be used to change this. + * + * This setting is inherited by child surfaces set by the get_popup + * request. + * + * Layer surfaces receive pointer, touch, and tablet events + * normally. If you do not want to receive them, set the input + * region on your surface to an empty region. + * + * Keyboard interactivity is double-buffered, see + * wl_surface.commit. + */ + void (*set_keyboard_interactivity)(struct wl_client *client, + struct wl_resource *resource, + uint32_t keyboard_interactivity); + /** + * assign this layer_surface as an xdg_popup parent + * + * This assigns an xdg_popup's parent to this layer_surface. This + * popup should have been created via xdg_surface::get_popup with + * the parent set to NULL, and this request must be invoked before + * committing the popup's initial state. + * + * See the documentation of xdg_popup for more details about what + * an xdg_popup is and how it is used. + */ + void (*get_popup)(struct wl_client *client, + struct wl_resource *resource, + struct wl_resource *popup); + /** + * 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. + * + * If the client receives multiple configure events before it can + * respond to one, it only has to ack the last configure event. + * + * 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. + * @param serial the serial from the configure event + */ + void (*ack_configure)(struct wl_client *client, + struct wl_resource *resource, + uint32_t serial); + /** + * destroy the layer_surface + * + * This request destroys the layer surface. + */ + void (*destroy)(struct wl_client *client, + struct wl_resource *resource); + /** + * change the layer of the surface + * + * Change the layer that the surface is rendered on. + * + * Layer is double-buffered, see wl_surface.commit. + * @param layer layer to move this surface to + * @since 2 + */ + void (*set_layer)(struct wl_client *client, + struct wl_resource *resource, + uint32_t layer); +}; + +#define ZWLR_LAYER_SURFACE_V1_CONFIGURE 0 +#define ZWLR_LAYER_SURFACE_V1_CLOSED 1 + +/** + * @ingroup iface_zwlr_layer_surface_v1 + */ +#define ZWLR_LAYER_SURFACE_V1_CONFIGURE_SINCE_VERSION 1 +/** + * @ingroup iface_zwlr_layer_surface_v1 + */ +#define ZWLR_LAYER_SURFACE_V1_CLOSED_SINCE_VERSION 1 + +/** + * @ingroup iface_zwlr_layer_surface_v1 + */ +#define ZWLR_LAYER_SURFACE_V1_SET_SIZE_SINCE_VERSION 1 +/** + * @ingroup iface_zwlr_layer_surface_v1 + */ +#define ZWLR_LAYER_SURFACE_V1_SET_ANCHOR_SINCE_VERSION 1 +/** + * @ingroup iface_zwlr_layer_surface_v1 + */ +#define ZWLR_LAYER_SURFACE_V1_SET_EXCLUSIVE_ZONE_SINCE_VERSION 1 +/** + * @ingroup iface_zwlr_layer_surface_v1 + */ +#define ZWLR_LAYER_SURFACE_V1_SET_MARGIN_SINCE_VERSION 1 +/** + * @ingroup iface_zwlr_layer_surface_v1 + */ +#define ZWLR_LAYER_SURFACE_V1_SET_KEYBOARD_INTERACTIVITY_SINCE_VERSION 1 +/** + * @ingroup iface_zwlr_layer_surface_v1 + */ +#define ZWLR_LAYER_SURFACE_V1_GET_POPUP_SINCE_VERSION 1 +/** + * @ingroup iface_zwlr_layer_surface_v1 + */ +#define ZWLR_LAYER_SURFACE_V1_ACK_CONFIGURE_SINCE_VERSION 1 +/** + * @ingroup iface_zwlr_layer_surface_v1 + */ +#define ZWLR_LAYER_SURFACE_V1_DESTROY_SINCE_VERSION 1 +/** + * @ingroup iface_zwlr_layer_surface_v1 + */ +#define ZWLR_LAYER_SURFACE_V1_SET_LAYER_SINCE_VERSION 2 + +/** + * @ingroup iface_zwlr_layer_surface_v1 + * Sends an configure event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +zwlr_layer_surface_v1_send_configure(struct wl_resource *resource_, uint32_t serial, uint32_t width, uint32_t height) +{ + wl_resource_post_event(resource_, ZWLR_LAYER_SURFACE_V1_CONFIGURE, serial, width, height); +} + +/** + * @ingroup iface_zwlr_layer_surface_v1 + * Sends an closed event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +zwlr_layer_surface_v1_send_closed(struct wl_resource *resource_) +{ + wl_resource_post_event(resource_, ZWLR_LAYER_SURFACE_V1_CLOSED); +} + +#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/src/ipc.c b/src/ipc.c index a322dca..abc2438 100644 --- a/src/ipc.c +++ b/src/ipc.c @@ -5,6 +5,7 @@ #include "client.h" #include "ipc.h" +#include "layout.h" #include "util.h" /* IPC globals */ @@ -75,7 +76,7 @@ ipc_send_output_state(IpcOutput *ipc_out) } /* layout symbol */ - zpeachwm_ipc_output_v2_send_layout_symbol(res, m->ltsymbol[current_tag_idx(m)]); + zpeachwm_ipc_output_v2_send_layout_symbol(res, m->cold->ltsymbol[current_tag_idx(m)]); /* title/appid/fullscreen/floating */ if (c) { @@ -171,10 +172,11 @@ ipc_output_handle_set_layout(struct wl_client *client, if (!m || idx >= (uint32_t)layout_count) return; int ti = current_tag_idx(m); - if (m->lt[ti][m->sellt[ti]] != &layouts[idx]) - m->sellt[ti] ^= 1; - m->lt[ti][m->sellt[ti]] = &layouts[idx]; - strncpy(m->ltsymbol[ti], layouts[idx].symbol, LENGTH(m->ltsymbol[ti])); + ensure_cold(m); + if (m->cold->lt[ti][m->cold->sellt[ti]] != &layouts[idx]) + m->cold->sellt[ti] ^= 1; + m->cold->lt[ti][m->cold->sellt[ti]] = &layouts[idx]; + strncpy(m->cold->ltsymbol[ti], layouts[idx].symbol, LENGTH(m->cold->ltsymbol[ti])); arrange(m); printstatus(); } diff --git a/src/ipc_socket.c b/src/ipc_socket.c index 66dabc0..5fe4336 100644 --- a/src/ipc_socket.c +++ b/src/ipc_socket.c @@ -384,7 +384,7 @@ ipc_build_workspace(struct json_writer *w, Monitor *m, uint32_t tag_bit, json_object_end(w); json_key_string(w, "output", m->wlr_output->name); - json_key_string(w, "layout", m->ltsymbol[tag_idx]); + json_key_string(w, "layout", m->cold->ltsymbol[tag_idx]); json_key_string(w, "representation", ""); json_key_string(w, "type", "workspace"); @@ -675,7 +675,7 @@ ipc_handle_get_tree(struct ipc_client *client) json_key_string(&w, "type", "workspace"); json_key_string(&w, "name", ipc_tag_name(i)); - json_key_string(&w, "layout", m->ltsymbol[i]); + json_key_string(&w, "layout", m->cold->ltsymbol[i]); json_key(&w, "rect"); json_object_start(&w); diff --git a/src/layout.c b/src/layout.c index a658cd6..a389ca2 100644 --- a/src/layout.c +++ b/src/layout.c @@ -40,6 +40,21 @@ const unsigned int layout_count = LENGTH(layouts); * helpers * ================================================================ */ +/* Allocate and default-initialize monitor cold state on first use. */ +void +ensure_cold(Monitor *m) +{ + if (m->cold) + return; + m->cold = ecalloc(1, sizeof(MonitorCold)); + for (int i = 0; i < TAGCOUNT; i++) { + m->cold->lt[i][0] = &layouts[0]; + m->cold->lt[i][1] = &layouts[0]; + } + m->cold->mfact = 0.55f; + m->cold->nmaster = 1; +} + /* * Returns the 0-based index of the lowest set tag bit for monitor m. * For single-tag views this is the exact tag. For multi-tag views it @@ -64,7 +79,8 @@ const Layout * curlayout(Monitor *m) { int ti = current_tag_idx(m); - return m->lt[ti][m->sellt[ti]]; + ensure_cold(m); + return m->cold->lt[ti][m->cold->sellt[ti]]; } /* ================================================================ @@ -230,10 +246,10 @@ void dwindle_remove_client(Client *c) { Monitor *m = c->mon; - if (!m) + if (!m || !m->cold) return; for (int i = 0; i < TAGCOUNT; i++) - dwindle_remove(&m->dwindle_root[i], c); + dwindle_remove(&m->cold->dwindle_root[i], c); } /* ================================================================ @@ -243,6 +259,7 @@ dwindle_remove_client(Client *c) void dwindle(Monitor *m) { + ensure_cold(m); Client *c; int n = 0, e; @@ -258,7 +275,7 @@ dwindle(Monitor *m) : 0; int ti = current_tag_idx(m); - DwindleNode **root = &m->dwindle_root[ti]; + DwindleNode **root = &m->cold->dwindle_root[ti]; /* prune leaves whose clients are no longer tiled here */ { @@ -295,11 +312,11 @@ dwindle(Monitor *m) /* * Insert any newly visible client, splitting the focused node. - * Use m->dwindle_focus[ti] so it actually splits what the user + * Use m->cold->dwindle_focus[ti] so it actually splits what the user * was looking at when they spawned the window, rather than whatever * focustop() happens to return. */ - Client *focused = m->dwindle_focus[ti]; + Client *focused = m->cold->dwindle_focus[ti]; wl_list_for_each(c, &clients, link) { if (!VISIBLEON(c, m) || c->isfloating || c->isfullscreen) @@ -329,13 +346,14 @@ dwindle(Monitor *m) static void master_arrange(Monitor *m, int ti) { + ensure_cold(m); Client *c, *master_c = nullptr; Client *stack[256]; int nstack = 0, n = 0; wl_list_for_each(c, &clients, link) { if (VISIBLEON(c, m) && !c->isfloating) { - if (c == m->master_master[ti]) + if (c == m->cold->master_master[ti]) master_c = c; if (!c->isfullscreen) n++; @@ -348,7 +366,7 @@ master_arrange(Monitor *m, int ti) if (!master_c) { wl_list_for_each(c, &clients, link) { if (VISIBLEON(c, m) && !c->isfloating && !c->isfullscreen) { - m->master_master[ti] = c; + m->cold->master_master[ti] = c; master_c = c; break; } @@ -374,9 +392,9 @@ master_arrange(Monitor *m, int ti) return; } - int master_w = MAX(1, (int)(aw * m->mfact)); + int master_w = MAX(1, (int)(aw * m->cold->mfact)); - if (m->master_side[ti] == 0) { + if (m->cold->master_side[ti] == 0) { int stack_x = m->w.x + e + master_w + e; int stack_w = MAX(1, aw - master_w - e); @@ -421,11 +439,11 @@ void master_remove_client(Client *c) { Monitor *m = c->mon; - if (!m) + if (!m || !m->cold) return; for (int i = 0; i < TAGCOUNT; i++) { - if (m->master_master[i] == c) - m->master_master[i] = nullptr; + if (m->cold->master_master[i] == c) + m->cold->master_master[i] = nullptr; } } @@ -479,8 +497,10 @@ swaptiled(Client *a, Client *b) return; wl_list_for_each(m, &mons, link) { + if (!m->cold) + continue; for (int i = 0; i < TAGCOUNT; i++) { - DwindleNode **root = &m->dwindle_root[i]; + DwindleNode **root = &m->cold->dwindle_root[i]; if (!*root) continue; DwindleNode *la = dwindle_find_leaf(*root, a); diff --git a/src/layout.h b/src/layout.h index eef3942..c4b60a2 100644 --- a/src/layout.h +++ b/src/layout.h @@ -26,6 +26,7 @@ void monocle(Monitor *m); /* helpers used across modules */ [[nodiscard]] int current_tag_idx(Monitor *m); [[nodiscard]] const Layout *curlayout(Monitor *m); +void ensure_cold(Monitor *m); /* dwindle tree helpers (exposed for swapdir) */ [[nodiscard]] DwindleNode *dwindle_find_leaf(DwindleNode *n, Client *c); diff --git a/src/peachwm.c b/src/peachwm.c index 2ec7e87..a4ea515 100644 --- a/src/peachwm.c +++ b/src/peachwm.c @@ -401,21 +401,22 @@ static void apply_workspace_layout(Monitor *m, int tag_idx) { if (!layout_name[0]) return; + /* ensure_cold will be called by whichever write path triggers first */ for (int li = 0; li < (int)layout_count; li++) { if (layouts[li].symbol && !strcmp(layout_name, layouts[li].symbol)) { - m->lt[tag_idx][m->sellt[tag_idx]] = &layouts[li]; + m->cold->lt[tag_idx][m->cold->sellt[tag_idx]] = &layouts[li]; break; } if (!strcmp(layout_name, "dwindle") && layouts[li].arrange == dwindle) { - m->lt[tag_idx][m->sellt[tag_idx]] = &layouts[li]; + m->cold->lt[tag_idx][m->cold->sellt[tag_idx]] = &layouts[li]; break; } if (!strcmp(layout_name, "master") && layouts[li].arrange == master) { - m->lt[tag_idx][m->sellt[tag_idx]] = &layouts[li]; + m->cold->lt[tag_idx][m->cold->sellt[tag_idx]] = &layouts[li]; break; } if (!strcmp(layout_name, "monocle") && layouts[li].arrange == monocle) { - m->lt[tag_idx][m->sellt[tag_idx]] = &layouts[li]; + m->cold->lt[tag_idx][m->cold->sellt[tag_idx]] = &layouts[li]; break; } } @@ -481,8 +482,8 @@ void arrange(Monitor *m) { (c = focustop(m)) && c->isfullscreen); int ti = current_tag_idx(m); - strncpy(m->ltsymbol[ti], curlayout(m)->symbol, LENGTH(m->ltsymbol[ti])); - m->ltsymbol[ti][LENGTH(m->ltsymbol[ti]) - 1] = '\0'; + strncpy(m->cold->ltsymbol[ti], curlayout(m)->symbol, LENGTH(m->cold->ltsymbol[ti])); + m->cold->ltsymbol[ti][LENGTH(m->cold->ltsymbol[ti]) - 1] = '\0'; /* We move all clients (except fullscreen and unmanaged) to LyrTile while * in floating layout to avoid "real" floating clients be always on top */ @@ -756,9 +757,10 @@ static void cleanupmon(struct wl_listener *listener, void *data) { closemon(m); ext_workspace_cleanupmon(m); ipc_socket_send_output_event(); - for (int i = 0; i < TAGCOUNT; i++) { - dwindle_free_tree(m->dwindle_root[i]); - m->dwindle_root[i] = nullptr; + if (m->cold) { + for (int i = 0; i < TAGCOUNT; i++) + dwindle_free_tree(m->cold->dwindle_root[i]); + free(m->cold); } wlr_scene_node_destroy(&m->fullscreen_bg->node); free(m); @@ -1077,8 +1079,10 @@ static void createmon(struct wl_listener *listener, void *data) { if (!r->name[0] || strstr(wlr_output->name, r->name)) { m->m.x = r->x; m->m.y = r->y; - m->mfact = r->mfact; - m->nmaster = r->nmaster; + /* Allocate cold state lazily via the shared helper */ + ensure_cold(m); + m->cold->mfact = r->mfact; + m->cold->nmaster = r->nmaster; /* Determine monitor's default layout */ const Layout *mon_layout = &layouts[0]; for (int li = 0; li < (int)layout_count; li++) { @@ -1102,15 +1106,15 @@ static void createmon(struct wl_listener *listener, void *data) { const Layout *alt_layout = &layouts[layout_count > 1 && mon_layout != &layouts[1]]; /* Propagate monitor layout to all tags */ for (int ti = 0; ti < TAGCOUNT; ti++) { - m->lt[ti][0] = mon_layout; - m->lt[ti][1] = alt_layout; - m->sellt[ti] = 0; + m->cold->lt[ti][0] = mon_layout; + m->cold->lt[ti][1] = alt_layout; + m->cold->sellt[ti] = 0; } /* Apply per-workspace default layout for all tags */ for (int ti = 0; ti < TAGCOUNT; ti++) apply_workspace_layout(m, ti); - strncpy(m->ltsymbol[0], curlayout(m)->symbol, LENGTH(m->ltsymbol[0])); - m->ltsymbol[0][LENGTH(m->ltsymbol[0]) - 1] = '\0'; + strncpy(m->cold->ltsymbol[0], curlayout(m)->symbol, LENGTH(m->cold->ltsymbol[0])); + m->cold->ltsymbol[0][LENGTH(m->cold->ltsymbol[0]) - 1] = '\0'; wlr_output_state_set_scale(&state, r->scale); wlr_output_state_set_transform(&state, r->transform); break; @@ -1474,8 +1478,8 @@ void focusclient(Client *c, int lift) { c->isurgent = 0; /* Track focused client for dwindle insertion anchor */ - if (c->mon && !c->isfloating && !c->isfullscreen) - c->mon->dwindle_focus[current_tag_idx(c->mon)] = c; + if (c->mon && !c->isfloating && !c->isfullscreen && c->mon->cold) + c->mon->cold->dwindle_focus[current_tag_idx(c->mon)] = c; /* Don't change border color if there is an exclusive focus or we are * handling a drag operation */ @@ -2507,7 +2511,7 @@ void printstatus(void) { printf("%s tags %" PRIu32 " %" PRIu32 " %" PRIu32 " %" PRIu32 "\n", m->wlr_output->name, occ, m->tagset[m->seltags], sel, urg); int _ti = current_tag_idx(m); - printf("%s layout %s\n", m->wlr_output->name, m->ltsymbol[_ti]); + printf("%s layout %s\n", m->wlr_output->name, m->cold->ltsymbol[_ti]); ext_workspace_printstatus(m); } fflush(stdout); @@ -2853,26 +2857,27 @@ static void setfullscreen(Client *c, int fullscreen) { static void setlayout(const Arg *arg) { if (!selmon) return; + ensure_cold(selmon); int ti = current_tag_idx(selmon); /* arg->ui is an index into layouts[]. If out of range, just toggle. */ if (arg && arg->ui < layout_count) { - if (selmon->lt[ti][selmon->sellt[ti]] != &layouts[arg->ui]) - selmon->sellt[ti] ^= 1; - selmon->lt[ti][selmon->sellt[ti]] = &layouts[arg->ui]; + if (selmon->cold->lt[ti][selmon->cold->sellt[ti]] != &layouts[arg->ui]) + selmon->cold->sellt[ti] ^= 1; + selmon->cold->lt[ti][selmon->cold->sellt[ti]] = &layouts[arg->ui]; } else { - selmon->sellt[ti] ^= 1; + selmon->cold->sellt[ti] ^= 1; } - strncpy(selmon->ltsymbol[ti], selmon->lt[ti][selmon->sellt[ti]]->symbol, - LENGTH(selmon->ltsymbol[ti])); - selmon->ltsymbol[ti][LENGTH(selmon->ltsymbol[ti]) - 1] = '\0'; + strncpy(selmon->cold->ltsymbol[ti], selmon->cold->lt[ti][selmon->cold->sellt[ti]]->symbol, + LENGTH(selmon->cold->ltsymbol[ti])); + selmon->cold->ltsymbol[ti][LENGTH(selmon->cold->ltsymbol[ti]) - 1] = '\0'; /* Convert windows when switching to master: set focused client as master */ if (curlayout(selmon)->arrange == master) { Client *sel = focustop(selmon); if (sel && VISIBLEON(sel, selmon) && !sel->isfloating && !sel->isfullscreen) - selmon->master_master[ti] = sel; + selmon->cold->master_master[ti] = sel; else - selmon->master_master[ti] = nullptr; + selmon->cold->master_master[ti] = nullptr; /* Convert to floating: float all tiled clients */ } else if (!curlayout(selmon)->arrange) { Client *c; @@ -3007,8 +3012,9 @@ reapply_monitor_config(void) for (int ri = 0; ri < cfg.nmonitors; ri++) { const CfgMonitorRule *r = &cfg.monitors[ri]; if (!r->name[0] || strstr(m->wlr_output->name, r->name)) { - m->mfact = r->mfact; - m->nmaster = r->nmaster; + ensure_cold(m); + m->cold->mfact = r->mfact; + m->cold->nmaster = r->nmaster; /* Map layout name */ const Layout *mon_layout = &layouts[0]; for (int li = 0; li < (int)layout_count; li++) { @@ -3031,9 +3037,9 @@ reapply_monitor_config(void) } const Layout *alt_layout = &layouts[layout_count > 1 && mon_layout != &layouts[1]]; for (int ti = 0; ti < TAGCOUNT; ti++) { - m->lt[ti][0] = mon_layout; - m->lt[ti][1] = alt_layout; - m->sellt[ti] = 0; + m->cold->lt[ti][0] = mon_layout; + m->cold->lt[ti][1] = alt_layout; + m->cold->sellt[ti] = 0; } /* Apply scale and transform */ struct wlr_output_state state; @@ -3568,7 +3574,7 @@ static void swapdir(const Arg *arg) { if (curlayout(selmon)->arrange == dwindle) { int ti = current_tag_idx(selmon); - DwindleNode **root = &selmon->dwindle_root[ti]; + DwindleNode **root = &selmon->cold->dwindle_root[ti]; if (*root) { DwindleNode *leaf_sel = dwindle_find_leaf(*root, sel); DwindleNode *leaf_other = dwindle_find_leaf(*root, other); @@ -3588,13 +3594,13 @@ static void swapdir(const Arg *arg) { } } else if (curlayout(selmon)->arrange == master) { int ti = current_tag_idx(selmon); - int side = selmon->master_side[ti]; + int side = selmon->cold->master_side[ti]; - if (sel == selmon->master_master[ti]) { + if (sel == selmon->cold->master_master[ti]) { /* master moving away from master side → flip */ if ((side == 0 && arg->i == WLR_DIRECTION_RIGHT) || (side == 1 && arg->i == WLR_DIRECTION_LEFT)) { - selmon->master_side[ti] = !side; + selmon->cold->master_side[ti] = !side; arrange(selmon); printstatus(); focusclient(sel, 1); @@ -3604,7 +3610,7 @@ static void swapdir(const Arg *arg) { /* stack moving toward master side → promote */ if ((side == 0 && arg->i == WLR_DIRECTION_LEFT) || (side == 1 && arg->i == WLR_DIRECTION_RIGHT)) { - selmon->master_master[ti] = sel; + selmon->cold->master_master[ti] = sel; arrange(selmon); printstatus(); focusclient(sel, 1);