From cd7ebab4dc8ebbcfff13852dc96bbe75a7a97b53 Mon Sep 17 00:00:00 2001 From: Derek Christ Date: Fri, 9 Sep 2022 22:22:36 +0200 Subject: [PATCH] Add xdg-decoration --- build.sh | 2 +- common/state.h | 5 + compositor | Bin 77624 -> 80232 bytes compositor.c | 8 + protocols/xdg-decoration-client-protocol.h | 378 +++++++++++++++++++++ protocols/xdg-decoration-protocol.c | 75 ++++ 6 files changed, 467 insertions(+), 1 deletion(-) create mode 100644 protocols/xdg-decoration-client-protocol.h create mode 100644 protocols/xdg-decoration-protocol.c diff --git a/build.sh b/build.sh index bf37923..2e9e070 100755 --- a/build.sh +++ b/build.sh @@ -1 +1 @@ -gcc compositor.c pointer.c keyboard.c common/shm.c protocols/xdg-shell-protocol.c -o compositor -lwayland-client -lrt -lxkbcommon -g +gcc compositor.c pointer.c keyboard.c common/shm.c protocols/xdg-shell-protocol.c protocols/xdg-decoration-protocol.c -o compositor -lwayland-client -lrt -lxkbcommon -g diff --git a/common/state.h b/common/state.h index 66ac252..79c26fc 100644 --- a/common/state.h +++ b/common/state.h @@ -33,6 +33,9 @@ struct pointer_event uint32_t axis_source; }; +struct zxdg_decoration_manager_v1; +struct zxdg_toplevel_decoration_v1; + struct client_state { /* Globals */ @@ -42,6 +45,8 @@ struct client_state struct wl_compositor *wl_compositor; struct xdg_wm_base *xdg_wm_base; struct wl_seat *wl_seat; + struct zxdg_decoration_manager_v1 *xdg_decoration_manager; + struct zxdg_toplevel_decoration_v1 *xdg_toplevel_decoration; /* Objects */ struct wl_surface *wl_surface; diff --git a/compositor b/compositor index a01205798f1798a4e6d0961270e709435cf717a7..3c1a14f8f1266938a430e05bfeb052454a7f533c 100755 GIT binary patch literal 80232 zcmeFa33yf2xj($ebM{HjIXM}CBus}nAVU}p0uqp5RM3b(lL{sQ5=mvqg+${3L<5!> za|^fC(w4Spwbiy)>7YflZ5+X&Ew$E5)wZcc8!EM2?LfU&zTa;R`#u2#7C!|1PvQ0%jGk3mUNIr8#>jsGiABHK1W7LicXD$gjvpIwphZ! zwBHDc*J*k=QD2QJ7f7GTl6ak_m!ofvY?Aa~TB6F;s8pAuyIAglEwWrNHIzSfs{KhF z`Cp>^8B9y1IKQ2O1w*8Jb8uR@hOu|~=XrsI`;I@R@EiE{MI zzxq+lZY)vt1^ut#;+T}EQypiM)-|k}F>TViH51k~Y-nzo&{8sE!i;GXH*cIMI|lV) zC^4okzI>TswHjT->GGyw3OE8BKbC?uoxFMYr`uWngBzy5f7NMo;DMjqeQe?UFRuFh zZIAwyJhX#l$iokD{MR3rAB}(V&_7pZ54*L^us%cF82nGf|F6C=>H%;66GvKh-1cnf z$|-|CI_}IlvY}-E{%h`>HuJrXLESfw{;FgD_)BHpr?q-0)%)`(+9jtqNnu#b9w*@ygZ_aXmaAN-&1ga5z#z*j*| z_F4RPst^8;`oMpo54--{hn|^z_@|@~`9JFeKN$5U&!T@(AN<$!fiLSr&-?q}-`z-1f#jMkeau}JaUhkA+c3g9;? ze&d$j{7)%-YXHAq%L(8eg*ViFNY{H($texs4@3WKqtHm+ChOJrm(M6Ur2#z)H9k=9 zeywLfzEOS2(#6$l>NeF~+pxK*Zqw4m7p>d4p>ApIs&#cnb@jFDH*Toj+*G@%sk&OS zo|W;2b=8fVHn!YYUAtyY^*RdLP`Akdc1^?P#&xwfROCZZZQHf%se)#6%T zySgr&Z_~!+4QrY*HzcAtG#wJ(VOdPn|haCy>Wfx#?1{)8v{}| zuU(JoHm>Ww|m($Z_|nyRm_+qAi1b1meY;J074ya0%dRZ=|t*P7Gv}xmw!o229^h$58>*{V?wXt^7nlx<7b*rj@USHc- zy`k=g>iSI^*Q2F2HEg)nAPJ4uR7ZwtYKkVU-hAWwGz!WH2pk{?rVX|0>(V%M+2*GD z5`jh|Hr2H>vAQ(2=EgOwX?^YH>(a3sHr3S&Sn1d-5Hx>dW8DU0^}3DlD^zQ0K&91G z7x3z}*HzcoHmn1pcJt;sM4f=vH*bKMMt#$!<_)V+8OWGMtX6@!zP4e5vAGE`yve9< zgaexD!LYiewz|GyL+!eTo9YZ!+q?lYj_Zu|b?Z0RHL?E9bzpC9T5Z(du&Dt;;k?!B z8&MR3Hf*ehg0)R--Sw;+_1#c=KZGI6?}pE`|w+``< Rb39n6A40&;QXKPmF6G30Rt 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 I%X;M1& delta 27229 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 diff --git a/compositor.c b/compositor.c index e10d304..dc5ce07 100644 --- a/compositor.c +++ b/compositor.c @@ -3,6 +3,7 @@ #include "keyboard.h" #include "pointer.h" #include "protocols/xdg-shell-client-protocol.h" +#include "protocols/xdg-decoration-client-protocol.h" #include #include @@ -28,6 +29,8 @@ static void registry_handle_global(void *data, struct wl_registry *wl_registry, state->xdg_wm_base = wl_registry_bind(wl_registry, name, &xdg_wm_base_interface, 3); } else if (strcmp(interface, wl_seat_interface.name) == 0) { state->wl_seat = wl_registry_bind(wl_registry, name, &wl_seat_interface, 7); + } else if (strcmp(interface, zxdg_decoration_manager_v1_interface.name) == 0) { + state->xdg_decoration_manager = wl_registry_bind(wl_registry, name, &zxdg_decoration_manager_v1_interface, 1); } } @@ -244,9 +247,14 @@ int main(int argc, char *argv[]) xdg_toplevel_set_title(state.xdg_toplevel, "Example client"); wl_surface_commit(state.wl_surface); + xdg_wm_base_add_listener(state.xdg_wm_base, &xdg_wm_base_listener, &state); + struct wl_callback *cb = wl_surface_frame(state.wl_surface); wl_callback_add_listener(cb, &wl_surface_frame_listener, &state); + state.xdg_toplevel_decoration = zxdg_decoration_manager_v1_get_toplevel_decoration(state.xdg_decoration_manager, state.xdg_toplevel); + zxdg_toplevel_decoration_v1_set_mode(state.xdg_toplevel_decoration, ZXDG_TOPLEVEL_DECORATION_V1_MODE_SERVER_SIDE); + while (wl_display_dispatch(state.wl_display)) { /* This space deliberately left blank */ } diff --git a/protocols/xdg-decoration-client-protocol.h b/protocols/xdg-decoration-client-protocol.h new file mode 100644 index 0000000..286c236 --- /dev/null +++ b/protocols/xdg-decoration-client-protocol.h @@ -0,0 +1,378 @@ +/* Generated by wayland-scanner 1.21.0 */ + +#ifndef XDG_DECORATION_UNSTABLE_V1_CLIENT_PROTOCOL_H +#define XDG_DECORATION_UNSTABLE_V1_CLIENT_PROTOCOL_H + +#include +#include +#include "wayland-client.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @page page_xdg_decoration_unstable_v1 The xdg_decoration_unstable_v1 protocol + * @section page_ifaces_xdg_decoration_unstable_v1 Interfaces + * - @subpage page_iface_zxdg_decoration_manager_v1 - window decoration manager + * - @subpage page_iface_zxdg_toplevel_decoration_v1 - decoration object for a toplevel surface + * @section page_copyright_xdg_decoration_unstable_v1 Copyright + *
+ *
+ * Copyright © 2018 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 xdg_toplevel; +struct zxdg_decoration_manager_v1; +struct zxdg_toplevel_decoration_v1; + +#ifndef ZXDG_DECORATION_MANAGER_V1_INTERFACE +#define ZXDG_DECORATION_MANAGER_V1_INTERFACE +/** + * @page page_iface_zxdg_decoration_manager_v1 zxdg_decoration_manager_v1 + * @section page_iface_zxdg_decoration_manager_v1_desc Description + * + * This interface allows a compositor to announce support for server-side + * decorations. + * + * A window decoration is a set of window controls as deemed appropriate by + * the party managing them, such as user interface components used to move, + * resize and change a window's state. + * + * A client can use this protocol to request being decorated by a supporting + * compositor. + * + * If compositor and client do not negotiate the use of a server-side + * decoration using this protocol, clients continue to self-decorate as they + * see fit. + * + * 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_iface_zxdg_decoration_manager_v1_api API + * See @ref iface_zxdg_decoration_manager_v1. + */ +/** + * @defgroup iface_zxdg_decoration_manager_v1 The zxdg_decoration_manager_v1 interface + * + * This interface allows a compositor to announce support for server-side + * decorations. + * + * A window decoration is a set of window controls as deemed appropriate by + * the party managing them, such as user interface components used to move, + * resize and change a window's state. + * + * A client can use this protocol to request being decorated by a supporting + * compositor. + * + * If compositor and client do not negotiate the use of a server-side + * decoration using this protocol, clients continue to self-decorate as they + * see fit. + * + * 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. + */ +extern const struct wl_interface zxdg_decoration_manager_v1_interface; +#endif +#ifndef ZXDG_TOPLEVEL_DECORATION_V1_INTERFACE +#define ZXDG_TOPLEVEL_DECORATION_V1_INTERFACE +/** + * @page page_iface_zxdg_toplevel_decoration_v1 zxdg_toplevel_decoration_v1 + * @section page_iface_zxdg_toplevel_decoration_v1_desc Description + * + * The decoration object allows the compositor to toggle server-side window + * decorations for a toplevel surface. The client can request to switch to + * another mode. + * + * The xdg_toplevel_decoration object must be destroyed before its + * xdg_toplevel. + * @section page_iface_zxdg_toplevel_decoration_v1_api API + * See @ref iface_zxdg_toplevel_decoration_v1. + */ +/** + * @defgroup iface_zxdg_toplevel_decoration_v1 The zxdg_toplevel_decoration_v1 interface + * + * The decoration object allows the compositor to toggle server-side window + * decorations for a toplevel surface. The client can request to switch to + * another mode. + * + * The xdg_toplevel_decoration object must be destroyed before its + * xdg_toplevel. + */ +extern const struct wl_interface zxdg_toplevel_decoration_v1_interface; +#endif + +#define ZXDG_DECORATION_MANAGER_V1_DESTROY 0 +#define ZXDG_DECORATION_MANAGER_V1_GET_TOPLEVEL_DECORATION 1 + + +/** + * @ingroup iface_zxdg_decoration_manager_v1 + */ +#define ZXDG_DECORATION_MANAGER_V1_DESTROY_SINCE_VERSION 1 +/** + * @ingroup iface_zxdg_decoration_manager_v1 + */ +#define ZXDG_DECORATION_MANAGER_V1_GET_TOPLEVEL_DECORATION_SINCE_VERSION 1 + +/** @ingroup iface_zxdg_decoration_manager_v1 */ +static inline void +zxdg_decoration_manager_v1_set_user_data(struct zxdg_decoration_manager_v1 *zxdg_decoration_manager_v1, void *user_data) +{ + wl_proxy_set_user_data((struct wl_proxy *) zxdg_decoration_manager_v1, user_data); +} + +/** @ingroup iface_zxdg_decoration_manager_v1 */ +static inline void * +zxdg_decoration_manager_v1_get_user_data(struct zxdg_decoration_manager_v1 *zxdg_decoration_manager_v1) +{ + return wl_proxy_get_user_data((struct wl_proxy *) zxdg_decoration_manager_v1); +} + +static inline uint32_t +zxdg_decoration_manager_v1_get_version(struct zxdg_decoration_manager_v1 *zxdg_decoration_manager_v1) +{ + return wl_proxy_get_version((struct wl_proxy *) zxdg_decoration_manager_v1); +} + +/** + * @ingroup iface_zxdg_decoration_manager_v1 + * + * Destroy the decoration manager. This doesn't destroy objects created + * with the manager. + */ +static inline void +zxdg_decoration_manager_v1_destroy(struct zxdg_decoration_manager_v1 *zxdg_decoration_manager_v1) +{ + wl_proxy_marshal_flags((struct wl_proxy *) zxdg_decoration_manager_v1, + ZXDG_DECORATION_MANAGER_V1_DESTROY, NULL, wl_proxy_get_version((struct wl_proxy *) zxdg_decoration_manager_v1), WL_MARSHAL_FLAG_DESTROY); +} + +/** + * @ingroup iface_zxdg_decoration_manager_v1 + * + * Create a new decoration object associated with the given toplevel. + * + * Creating an xdg_toplevel_decoration from an xdg_toplevel 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_toplevel_decoration.configure event must also be treated as + * errors. + */ +static inline struct zxdg_toplevel_decoration_v1 * +zxdg_decoration_manager_v1_get_toplevel_decoration(struct zxdg_decoration_manager_v1 *zxdg_decoration_manager_v1, struct xdg_toplevel *toplevel) +{ + struct wl_proxy *id; + + id = wl_proxy_marshal_flags((struct wl_proxy *) zxdg_decoration_manager_v1, + ZXDG_DECORATION_MANAGER_V1_GET_TOPLEVEL_DECORATION, &zxdg_toplevel_decoration_v1_interface, wl_proxy_get_version((struct wl_proxy *) zxdg_decoration_manager_v1), 0, NULL, toplevel); + + return (struct zxdg_toplevel_decoration_v1 *) id; +} + +#ifndef ZXDG_TOPLEVEL_DECORATION_V1_ERROR_ENUM +#define ZXDG_TOPLEVEL_DECORATION_V1_ERROR_ENUM +enum zxdg_toplevel_decoration_v1_error { + /** + * xdg_toplevel has a buffer attached before configure + */ + ZXDG_TOPLEVEL_DECORATION_V1_ERROR_UNCONFIGURED_BUFFER = 0, + /** + * xdg_toplevel already has a decoration object + */ + ZXDG_TOPLEVEL_DECORATION_V1_ERROR_ALREADY_CONSTRUCTED = 1, + /** + * xdg_toplevel destroyed before the decoration object + */ + ZXDG_TOPLEVEL_DECORATION_V1_ERROR_ORPHANED = 2, +}; +#endif /* ZXDG_TOPLEVEL_DECORATION_V1_ERROR_ENUM */ + +#ifndef ZXDG_TOPLEVEL_DECORATION_V1_MODE_ENUM +#define ZXDG_TOPLEVEL_DECORATION_V1_MODE_ENUM +/** + * @ingroup iface_zxdg_toplevel_decoration_v1 + * window decoration modes + * + * These values describe window decoration modes. + */ +enum zxdg_toplevel_decoration_v1_mode { + /** + * no server-side window decoration + */ + ZXDG_TOPLEVEL_DECORATION_V1_MODE_CLIENT_SIDE = 1, + /** + * server-side window decoration + */ + ZXDG_TOPLEVEL_DECORATION_V1_MODE_SERVER_SIDE = 2, +}; +#endif /* ZXDG_TOPLEVEL_DECORATION_V1_MODE_ENUM */ + +/** + * @ingroup iface_zxdg_toplevel_decoration_v1 + * @struct zxdg_toplevel_decoration_v1_listener + */ +struct zxdg_toplevel_decoration_v1_listener { + /** + * suggest a surface change + * + * The configure event asks the client to change its decoration + * mode. The configured state should not be applied immediately. + * Clients must send an ack_configure in response to this event. + * See xdg_surface.configure and xdg_surface.ack_configure for + * details. + * + * A configure event can be sent at any time. The specified mode + * must be obeyed by the client. + * @param mode the decoration mode + */ + void (*configure)(void *data, + struct zxdg_toplevel_decoration_v1 *zxdg_toplevel_decoration_v1, + uint32_t mode); +}; + +/** + * @ingroup iface_zxdg_toplevel_decoration_v1 + */ +static inline int +zxdg_toplevel_decoration_v1_add_listener(struct zxdg_toplevel_decoration_v1 *zxdg_toplevel_decoration_v1, + const struct zxdg_toplevel_decoration_v1_listener *listener, void *data) +{ + return wl_proxy_add_listener((struct wl_proxy *) zxdg_toplevel_decoration_v1, + (void (**)(void)) listener, data); +} + +#define ZXDG_TOPLEVEL_DECORATION_V1_DESTROY 0 +#define ZXDG_TOPLEVEL_DECORATION_V1_SET_MODE 1 +#define ZXDG_TOPLEVEL_DECORATION_V1_UNSET_MODE 2 + +/** + * @ingroup iface_zxdg_toplevel_decoration_v1 + */ +#define ZXDG_TOPLEVEL_DECORATION_V1_CONFIGURE_SINCE_VERSION 1 + +/** + * @ingroup iface_zxdg_toplevel_decoration_v1 + */ +#define ZXDG_TOPLEVEL_DECORATION_V1_DESTROY_SINCE_VERSION 1 +/** + * @ingroup iface_zxdg_toplevel_decoration_v1 + */ +#define ZXDG_TOPLEVEL_DECORATION_V1_SET_MODE_SINCE_VERSION 1 +/** + * @ingroup iface_zxdg_toplevel_decoration_v1 + */ +#define ZXDG_TOPLEVEL_DECORATION_V1_UNSET_MODE_SINCE_VERSION 1 + +/** @ingroup iface_zxdg_toplevel_decoration_v1 */ +static inline void +zxdg_toplevel_decoration_v1_set_user_data(struct zxdg_toplevel_decoration_v1 *zxdg_toplevel_decoration_v1, void *user_data) +{ + wl_proxy_set_user_data((struct wl_proxy *) zxdg_toplevel_decoration_v1, user_data); +} + +/** @ingroup iface_zxdg_toplevel_decoration_v1 */ +static inline void * +zxdg_toplevel_decoration_v1_get_user_data(struct zxdg_toplevel_decoration_v1 *zxdg_toplevel_decoration_v1) +{ + return wl_proxy_get_user_data((struct wl_proxy *) zxdg_toplevel_decoration_v1); +} + +static inline uint32_t +zxdg_toplevel_decoration_v1_get_version(struct zxdg_toplevel_decoration_v1 *zxdg_toplevel_decoration_v1) +{ + return wl_proxy_get_version((struct wl_proxy *) zxdg_toplevel_decoration_v1); +} + +/** + * @ingroup iface_zxdg_toplevel_decoration_v1 + * + * Switch back to a mode without any server-side decorations at the next + * commit. + */ +static inline void +zxdg_toplevel_decoration_v1_destroy(struct zxdg_toplevel_decoration_v1 *zxdg_toplevel_decoration_v1) +{ + wl_proxy_marshal_flags((struct wl_proxy *) zxdg_toplevel_decoration_v1, + ZXDG_TOPLEVEL_DECORATION_V1_DESTROY, NULL, wl_proxy_get_version((struct wl_proxy *) zxdg_toplevel_decoration_v1), WL_MARSHAL_FLAG_DESTROY); +} + +/** + * @ingroup iface_zxdg_toplevel_decoration_v1 + * + * Set the toplevel surface decoration mode. This informs the compositor + * that the client prefers the provided decoration mode. + * + * After requesting a decoration mode, the compositor will respond by + * emitting an xdg_surface.configure event. The client should then update + * its content, drawing it without decorations if the received mode is + * server-side decorations. The client must also acknowledge the configure + * when committing the new content (see xdg_surface.ack_configure). + * + * The compositor can decide not to use the client's mode and enforce a + * different mode instead. + * + * Clients whose decoration mode depend on the xdg_toplevel state may send + * a set_mode request in response to an xdg_surface.configure event and wait + * for the next xdg_surface.configure event to prevent unwanted state. + * Such clients are responsible for preventing configure loops and must + * make sure not to send multiple successive set_mode requests with the + * same decoration mode. + */ +static inline void +zxdg_toplevel_decoration_v1_set_mode(struct zxdg_toplevel_decoration_v1 *zxdg_toplevel_decoration_v1, uint32_t mode) +{ + wl_proxy_marshal_flags((struct wl_proxy *) zxdg_toplevel_decoration_v1, + ZXDG_TOPLEVEL_DECORATION_V1_SET_MODE, NULL, wl_proxy_get_version((struct wl_proxy *) zxdg_toplevel_decoration_v1), 0, mode); +} + +/** + * @ingroup iface_zxdg_toplevel_decoration_v1 + * + * Unset the toplevel surface decoration mode. This informs the compositor + * that the client doesn't prefer a particular decoration mode. + * + * This request has the same semantics as set_mode. + */ +static inline void +zxdg_toplevel_decoration_v1_unset_mode(struct zxdg_toplevel_decoration_v1 *zxdg_toplevel_decoration_v1) +{ + wl_proxy_marshal_flags((struct wl_proxy *) zxdg_toplevel_decoration_v1, + ZXDG_TOPLEVEL_DECORATION_V1_UNSET_MODE, NULL, wl_proxy_get_version((struct wl_proxy *) zxdg_toplevel_decoration_v1), 0); +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/protocols/xdg-decoration-protocol.c b/protocols/xdg-decoration-protocol.c new file mode 100644 index 0000000..59c1b46 --- /dev/null +++ b/protocols/xdg-decoration-protocol.c @@ -0,0 +1,75 @@ +/* Generated by wayland-scanner 1.21.0 */ + +/* + * Copyright © 2018 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. + */ + +#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 xdg_toplevel_interface; +extern const struct wl_interface zxdg_toplevel_decoration_v1_interface; + +static const struct wl_interface *xdg_decoration_unstable_v1_types[] = { + NULL, + &zxdg_toplevel_decoration_v1_interface, + &xdg_toplevel_interface, +}; + +static const struct wl_message zxdg_decoration_manager_v1_requests[] = { + { "destroy", "", xdg_decoration_unstable_v1_types + 0 }, + { "get_toplevel_decoration", "no", xdg_decoration_unstable_v1_types + 1 }, +}; + +WL_PRIVATE const struct wl_interface zxdg_decoration_manager_v1_interface = { + "zxdg_decoration_manager_v1", 1, + 2, zxdg_decoration_manager_v1_requests, + 0, NULL, +}; + +static const struct wl_message zxdg_toplevel_decoration_v1_requests[] = { + { "destroy", "", xdg_decoration_unstable_v1_types + 0 }, + { "set_mode", "u", xdg_decoration_unstable_v1_types + 0 }, + { "unset_mode", "", xdg_decoration_unstable_v1_types + 0 }, +}; + +static const struct wl_message zxdg_toplevel_decoration_v1_events[] = { + { "configure", "u", xdg_decoration_unstable_v1_types + 0 }, +}; + +WL_PRIVATE const struct wl_interface zxdg_toplevel_decoration_v1_interface = { + "zxdg_toplevel_decoration_v1", 1, + 3, zxdg_toplevel_decoration_v1_requests, + 1, zxdg_toplevel_decoration_v1_events, +}; +