/* Generated by wayland-scanner 1.25.90 */

#ifndef XX_FRACTIONAL_SCALE_V2_CLIENT_PROTOCOL_H
#define XX_FRACTIONAL_SCALE_V2_CLIENT_PROTOCOL_H

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

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @page page_xx_fractional_scale_v2 The xx_fractional_scale_v2 protocol
 * Protocol for fractional scaling
 *
 * @section page_desc_xx_fractional_scale_v2 Description
 *
 * This protocol allows compositors and clients to communicate the
 * coordinate space their surfaces act in.
 *
 * @section page_ifaces_xx_fractional_scale_v2 Interfaces
 * - @subpage page_iface_xx_fractional_scale_manager_v2 - creates surface scale
 * interfaces
 * - @subpage page_iface_xx_fractional_scale_v2 - interface for fractional
 * scaling
 * @section page_copyright_xx_fractional_scale_v2 Copyright
 * <pre>
 *
 * Copyright © 2022 Xaver Hugl
 *
 * 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.
 * </pre>
 */
struct wl_surface;
struct xx_fractional_scale_manager_v2;
struct xx_fractional_scale_v2;

#ifndef XX_FRACTIONAL_SCALE_MANAGER_V2_INTERFACE
#  define XX_FRACTIONAL_SCALE_MANAGER_V2_INTERFACE
/**
 * @page page_iface_xx_fractional_scale_manager_v2
 * xx_fractional_scale_manager_v2
 * @section page_iface_xx_fractional_scale_manager_v2_desc Description
 *
 * A global interface to create xx_fractional_scale_v2 interfaces.
 * @section page_iface_xx_fractional_scale_manager_v2_api API
 * See @ref iface_xx_fractional_scale_manager_v2.
 */
/**
 * @defgroup iface_xx_fractional_scale_manager_v2 The
 * xx_fractional_scale_manager_v2 interface
 *
 * A global interface to create xx_fractional_scale_v2 interfaces.
 */
extern const struct wl_interface xx_fractional_scale_manager_v2_interface;
#endif
#ifndef XX_FRACTIONAL_SCALE_V2_INTERFACE
#  define XX_FRACTIONAL_SCALE_V2_INTERFACE
/**
 * @page page_iface_xx_fractional_scale_v2 xx_fractional_scale_v2
 * @section page_iface_xx_fractional_scale_v2_desc Description
 *
 * An additional interface for a wl_surface object that allows compositor and
 * client to communicate in a different coordinate space, in order to enable
 * them to accurately describe coordinates and sizes in pixels.
 * The two coordinate spaces in consideration are logical and pixels, where
 * logical coordinates describe the size content should have and pixels
 * describe the size of buffers.
 *
 * A scale of one equals a lack of scaling, where the communicated values
 * define both logical coordinates and pixels.
 * A scale greater than one describes that for every logical coordinate,
 * more than one pixel is used, and a scale less than one describes that
 * multiple logical coordinates make up one pixel.
 * In mathematical terms, logical coordinates can be obtained by dividing
 * the provided values by the currently active scale.
 *
 * The initial compositor and client coordinate scale factors are 1.
 * @section page_iface_xx_fractional_scale_v2_api API
 * See @ref iface_xx_fractional_scale_v2.
 */
/**
 * @defgroup iface_xx_fractional_scale_v2 The xx_fractional_scale_v2 interface
 *
 * An additional interface for a wl_surface object that allows compositor and
 * client to communicate in a different coordinate space, in order to enable
 * them to accurately describe coordinates and sizes in pixels.
 * The two coordinate spaces in consideration are logical and pixels, where
 * logical coordinates describe the size content should have and pixels
 * describe the size of buffers.
 *
 * A scale of one equals a lack of scaling, where the communicated values
 * define both logical coordinates and pixels.
 * A scale greater than one describes that for every logical coordinate,
 * more than one pixel is used, and a scale less than one describes that
 * multiple logical coordinates make up one pixel.
 * In mathematical terms, logical coordinates can be obtained by dividing
 * the provided values by the currently active scale.
 *
 * The initial compositor and client coordinate scale factors are 1.
 */
extern const struct wl_interface xx_fractional_scale_v2_interface;
#endif

#ifndef XX_FRACTIONAL_SCALE_MANAGER_V2_ERROR_ENUM
#  define XX_FRACTIONAL_SCALE_MANAGER_V2_ERROR_ENUM
enum xx_fractional_scale_manager_v2_error {
  /**
   * xx_fractional_scale_v2 for the surface already exists
   */
  XX_FRACTIONAL_SCALE_MANAGER_V2_ERROR_FRACTIONAL_SCALE_EXISTS = 0,
};
#endif /* XX_FRACTIONAL_SCALE_MANAGER_V2_ERROR_ENUM */

#define XX_FRACTIONAL_SCALE_MANAGER_V2_DESTROY 0
#define XX_FRACTIONAL_SCALE_MANAGER_V2_GET_FRACTIONAL_SCALE 1

/**
 * @ingroup iface_xx_fractional_scale_manager_v2
 */
#define XX_FRACTIONAL_SCALE_MANAGER_V2_DESTROY_SINCE_VERSION 1
/**
 * @ingroup iface_xx_fractional_scale_manager_v2
 */
#define XX_FRACTIONAL_SCALE_MANAGER_V2_GET_FRACTIONAL_SCALE_SINCE_VERSION 1

/** @ingroup iface_xx_fractional_scale_manager_v2 */
static inline void xx_fractional_scale_manager_v2_set_user_data(
    struct xx_fractional_scale_manager_v2* xx_fractional_scale_manager_v2,
    void* user_data) {
  wl_proxy_set_user_data((struct wl_proxy*)xx_fractional_scale_manager_v2,
                         user_data);
}

/** @ingroup iface_xx_fractional_scale_manager_v2 */
static inline void* xx_fractional_scale_manager_v2_get_user_data(
    struct xx_fractional_scale_manager_v2* xx_fractional_scale_manager_v2) {
  return wl_proxy_get_user_data(
      (struct wl_proxy*)xx_fractional_scale_manager_v2);
}

static inline uint32_t xx_fractional_scale_manager_v2_get_version(
    struct xx_fractional_scale_manager_v2* xx_fractional_scale_manager_v2) {
  return wl_proxy_get_version((struct wl_proxy*)xx_fractional_scale_manager_v2);
}

/**
 * @ingroup iface_xx_fractional_scale_manager_v2
 *
 * Informs the server that the client will not be using this protocol
 * object anymore. This does not affect any other objects.
 */
static inline void xx_fractional_scale_manager_v2_destroy(
    struct xx_fractional_scale_manager_v2* xx_fractional_scale_manager_v2) {
  wl_proxy_marshal_flags(
      (struct wl_proxy*)xx_fractional_scale_manager_v2,
      XX_FRACTIONAL_SCALE_MANAGER_V2_DESTROY, NULL,
      wl_proxy_get_version((struct wl_proxy*)xx_fractional_scale_manager_v2),
      WL_MARSHAL_FLAG_DESTROY);
}

/**
 * @ingroup iface_xx_fractional_scale_manager_v2
 *
 * Create an interface object for a wl_surface to communicate scale.
 * If the given wl_surface already has a xx_fractional_scale_v2 object
 * associated, the fractional_scale_exists protocol error is raised.
 */
static inline struct xx_fractional_scale_v2*
xx_fractional_scale_manager_v2_get_fractional_scale(
    struct xx_fractional_scale_manager_v2* xx_fractional_scale_manager_v2,
    struct wl_surface* surface) {
  struct wl_proxy* id;

  id = wl_proxy_marshal_flags(
      (struct wl_proxy*)xx_fractional_scale_manager_v2,
      XX_FRACTIONAL_SCALE_MANAGER_V2_GET_FRACTIONAL_SCALE,
      &xx_fractional_scale_v2_interface,
      wl_proxy_get_version((struct wl_proxy*)xx_fractional_scale_manager_v2), 0,
      NULL, surface);

  return (struct xx_fractional_scale_v2*)id;
}

#ifndef XX_FRACTIONAL_SCALE_V2_ERROR_ENUM
#  define XX_FRACTIONAL_SCALE_V2_ERROR_ENUM
enum xx_fractional_scale_v2_error {
  /**
   * scale value is not valid
   */
  XX_FRACTIONAL_SCALE_V2_ERROR_INVALID_SCALE = 0,
};
#endif /* XX_FRACTIONAL_SCALE_V2_ERROR_ENUM */

/**
 * @ingroup iface_xx_fractional_scale_v2
 * @struct xx_fractional_scale_v2_listener
 */
struct xx_fractional_scale_v2_listener {
  /**
   * set the compositor coordinate space scale factor
   *
   * This event sets a scale factor for the associated wl_surface
   * that describes the coordinate system the compositor will use for
   * events following xx_fractional_scale_v2.scale_factor.
   *
   * The scale factor is encoded in a 8.24 fixed point format.
   *
   * The compositor must not send a scale of zero.
   *
   * The client should re-render and commit a new buffer with the new
   * scale as soon as possible, in order to avoid artifacts caused by
   * the mismatch in compositor and client scales.
   * @param scale_8_24 surface scale factor
   */
  void (*scale_factor)(void* data,
                       struct xx_fractional_scale_v2* xx_fractional_scale_v2,
                       uint32_t scale_8_24);
};

/**
 * @ingroup iface_xx_fractional_scale_v2
 */
static inline int xx_fractional_scale_v2_add_listener(
    struct xx_fractional_scale_v2* xx_fractional_scale_v2,
    const struct xx_fractional_scale_v2_listener* listener, void* data) {
  return wl_proxy_add_listener((struct wl_proxy*)xx_fractional_scale_v2,
                               (void (**)(void))listener, data);
}

#define XX_FRACTIONAL_SCALE_V2_SET_SCALE_FACTOR 0
#define XX_FRACTIONAL_SCALE_V2_DESTROY 1

/**
 * @ingroup iface_xx_fractional_scale_v2
 */
#define XX_FRACTIONAL_SCALE_V2_SCALE_FACTOR_SINCE_VERSION 1

/**
 * @ingroup iface_xx_fractional_scale_v2
 */
#define XX_FRACTIONAL_SCALE_V2_SET_SCALE_FACTOR_SINCE_VERSION 1
/**
 * @ingroup iface_xx_fractional_scale_v2
 */
#define XX_FRACTIONAL_SCALE_V2_DESTROY_SINCE_VERSION 1

/** @ingroup iface_xx_fractional_scale_v2 */
static inline void xx_fractional_scale_v2_set_user_data(
    struct xx_fractional_scale_v2* xx_fractional_scale_v2, void* user_data) {
  wl_proxy_set_user_data((struct wl_proxy*)xx_fractional_scale_v2, user_data);
}

/** @ingroup iface_xx_fractional_scale_v2 */
static inline void* xx_fractional_scale_v2_get_user_data(
    struct xx_fractional_scale_v2* xx_fractional_scale_v2) {
  return wl_proxy_get_user_data((struct wl_proxy*)xx_fractional_scale_v2);
}

static inline uint32_t xx_fractional_scale_v2_get_version(
    struct xx_fractional_scale_v2* xx_fractional_scale_v2) {
  return wl_proxy_get_version((struct wl_proxy*)xx_fractional_scale_v2);
}

/**
 * @ingroup iface_xx_fractional_scale_v2
 *
 * This request sets a scale factor for the associated wl_surface that
 * describes the coordinate system the client uses for requests following
 * xx_fractional_scale_v2.set_scale_factor.
 *
 * The scale factor is encoded in a 8.24 fixed point format.
 *
 * If this scale factor does not match the scale factor provided by the
 * compositor with xx_fractional_scale_v2.scale_factor, the compositor may
 * apply transformations to the wl_surface that can result in blurriness
 * or other artifacts.
 *
 * If scale_8_24 is zero, the error invalid_scale will be raised.
 */
static inline void xx_fractional_scale_v2_set_scale_factor(
    struct xx_fractional_scale_v2* xx_fractional_scale_v2,
    uint32_t scale_8_24) {
  wl_proxy_marshal_flags(
      (struct wl_proxy*)xx_fractional_scale_v2,
      XX_FRACTIONAL_SCALE_V2_SET_SCALE_FACTOR, NULL,
      wl_proxy_get_version((struct wl_proxy*)xx_fractional_scale_v2), 0,
      scale_8_24);
}

/**
 * @ingroup iface_xx_fractional_scale_v2
 *
 * The wl_surface's xx_fractional_scale_v2 object is destroyed, and the
 * associated scale is reset to 1.
 */
static inline void xx_fractional_scale_v2_destroy(
    struct xx_fractional_scale_v2* xx_fractional_scale_v2) {
  wl_proxy_marshal_flags(
      (struct wl_proxy*)xx_fractional_scale_v2, XX_FRACTIONAL_SCALE_V2_DESTROY,
      NULL, wl_proxy_get_version((struct wl_proxy*)xx_fractional_scale_v2),
      WL_MARSHAL_FLAG_DESTROY);
}

#ifdef __cplusplus
}
#endif

#endif
