/* Generated by wayland-scanner 1.13.0 */

/*
 * Copyright 2017 The Chromium Authors.
 *
 * 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 <stdlib.h>
#include <stdint.h>
#include "wayland-util.h"

extern const struct wl_interface wl_output_interface;
extern const struct wl_interface wl_surface_interface;
extern const struct wl_interface zaura_output_interface;
extern const struct wl_interface zaura_surface_interface;

static const struct wl_interface *types[] = {
	NULL,
	NULL,
	&zaura_surface_interface,
	&wl_surface_interface,
	&zaura_output_interface,
	&wl_output_interface,
	&zaura_surface_interface,
	NULL,
	NULL,
};

static const struct wl_message zaura_shell_requests[] = {
	{ "get_aura_surface", "no", types + 2 },
	{ "get_aura_output", "2no", types + 4 },
};

WL_EXPORT const struct wl_interface zaura_shell_interface = {
	"zaura_shell", 5,
	2, zaura_shell_requests,
	0, NULL,
};

static const struct wl_message zaura_surface_requests[] = {
	{ "set_frame", "u", types + 0 },
	{ "set_parent", "2?oii", types + 6 },
	{ "set_frame_colors", "3uu", types + 0 },
	{ "set_startup_id", "4?s", types + 0 },
	{ "set_application_id", "5?s", types + 0 },
};

WL_EXPORT const struct wl_interface zaura_surface_interface = {
	"zaura_surface", 5,
	5, zaura_surface_requests,
	0, NULL,
};

static const struct wl_message zaura_output_events[] = {
	{ "scale", "2uu", types + 0 },
	{ "connection", "5u", types + 0 },
	{ "device_scale_factor", "5u", types + 0 },
};

WL_EXPORT const struct wl_interface zaura_output_interface = {
	"zaura_output", 5,
	0, NULL,
	3, zaura_output_events,
};

