blob: bef94400d4cc3f54d67b2a3e150cd216ac4291e2 [file] [log] [blame] [edit]
// Copyright 2023 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "sommelier.h" // NOLINT(build/include_directory)
#include "sommelier-tracing.h" // NOLINT(build/include_directory)
#include <assert.h>
#include <stdlib.h>
#include "fractional-scale-v1-client-protocol.h" // NOLINT(build/include_directory)
#include "fractional-scale-v1-server-protocol.h" // NOLINT(build/include_directory)
struct sl_host_fractional_scale_manager {
struct sl_fractional_scale_manager* fractional_scale_manager;
struct wl_resource* resource;
struct wp_fractional_scale_manager_v1* proxy;
};
struct sl_host_fractional_scale {
struct sl_host_fractional_scale_manager* host_fractional_scale_manager;
struct wl_resource* resource;
struct wp_fractional_scale_v1* proxy;
};
static void sl_fractional_scale_destroy(struct wl_client* client,
struct wl_resource* resource) {
wl_resource_destroy(resource);
}
static void sl_fractional_scale_handle_preferred_scale(
void* data,
struct wp_fractional_scale_v1* fractional_scale,
uint32_t wire_scale) {
struct sl_host_fractional_scale* host_fractional_scale =
static_cast<sl_host_fractional_scale*>(
wp_fractional_scale_v1_get_user_data(fractional_scale));
struct sl_fractional_scale_manager* fractional_scale_manager =
host_fractional_scale->host_fractional_scale_manager
->fractional_scale_manager;
wp_fractional_scale_v1_send_preferred_scale(
host_fractional_scale->resource,
round(wire_scale / fractional_scale_manager->ctx->scale));
}
static const struct wp_fractional_scale_v1_listener fractional_scale_listener =
{
.preferred_scale = sl_fractional_scale_handle_preferred_scale,
};
static const struct wp_fractional_scale_v1_interface
sl_fractional_scale_implementation = {sl_fractional_scale_destroy};
static void sl_destroy_host_fractional_scale(struct wl_resource* resource) {
struct sl_host_fractional_scale* host =
static_cast<sl_host_fractional_scale*>(
wl_resource_get_user_data(resource));
wl_resource_set_user_data(resource, nullptr);
delete host;
}
static void sl_fractional_scale_manager_destroy(struct wl_client* client,
struct wl_resource* resource) {
wl_resource_destroy(resource);
}
static void sl_fractional_scale_manager_get_fractional_scale(
struct wl_client* client,
struct wl_resource* resource,
uint32_t id,
struct wl_resource* surface_resource) {
struct sl_host_fractional_scale_manager* host =
static_cast<sl_host_fractional_scale_manager*>(
wl_resource_get_user_data(resource));
struct sl_host_surface* host_surface = static_cast<sl_host_surface*>(
wl_resource_get_user_data(surface_resource));
struct sl_host_fractional_scale* host_fractional_scale =
new sl_host_fractional_scale();
host_fractional_scale->host_fractional_scale_manager = host;
host_fractional_scale->resource =
wl_resource_create(client, &wp_fractional_scale_v1_interface, 1, id);
host_fractional_scale->proxy =
wp_fractional_scale_manager_v1_get_fractional_scale(
host->fractional_scale_manager->internal, host_surface->proxy);
wp_fractional_scale_v1_add_listener(host_fractional_scale->proxy,
&fractional_scale_listener,
host_fractional_scale);
wl_resource_set_implementation(
host_fractional_scale->resource, &sl_fractional_scale_implementation,
host_fractional_scale, sl_destroy_host_fractional_scale);
}
static const struct wp_fractional_scale_manager_v1_interface
sl_wp_fractional_scale_manager_implementation = {
sl_fractional_scale_manager_destroy,
sl_fractional_scale_manager_get_fractional_scale,
};
static void sl_destroy_host_fractional_scale_manager(
struct wl_resource* resource) {
struct sl_host_fractional_scale_manager* host =
static_cast<sl_host_fractional_scale_manager*>(
wl_resource_get_user_data(resource));
wp_fractional_scale_manager_v1_destroy(host->proxy);
wl_resource_set_user_data(resource, nullptr);
delete host;
}
static void sl_bind_host_fractional_scale_manager(struct wl_client* client,
void* data,
uint32_t version,
uint32_t id) {
struct sl_context* ctx = (struct sl_context*)data;
struct sl_host_fractional_scale_manager* host =
new sl_host_fractional_scale_manager();
host->fractional_scale_manager = ctx->fractional_scale_manager;
host->resource = wl_resource_create(
client, &wp_fractional_scale_manager_v1_interface, 1, id);
wl_resource_set_implementation(
host->resource, &sl_wp_fractional_scale_manager_implementation, host,
sl_destroy_host_fractional_scale_manager);
host->proxy = static_cast<wp_fractional_scale_manager_v1*>(wl_registry_bind(
wl_display_get_registry(ctx->display), ctx->fractional_scale_manager->id,
&wp_fractional_scale_manager_v1_interface, 1));
wp_fractional_scale_manager_v1_set_user_data(host->proxy, host);
}
struct sl_global* sl_fractional_scale_manager_global_create(
struct sl_context* ctx) {
return sl_global_create(ctx, &wp_fractional_scale_manager_v1_interface, 1,
ctx, sl_bind_host_fractional_scale_manager);
}