520 lines
14 KiB
C++
520 lines
14 KiB
C++
// Copyright 2018 The ChromiumOS Authors
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#ifndef VM_TOOLS_SOMMELIER_SOMMELIER_H_
|
|
#define VM_TOOLS_SOMMELIER_SOMMELIER_H_
|
|
|
|
#include <limits.h>
|
|
#include <linux/types.h>
|
|
#include <sys/types.h>
|
|
#include <wayland-server.h>
|
|
#include <wayland-util.h>
|
|
#include <xcb/xcb.h>
|
|
#include <xkbcommon/xkbcommon.h>
|
|
|
|
#include "compositor/sommelier-mmap.h" // NOLINT(build/include_directory)
|
|
#include "sommelier-ctx.h" // NOLINT(build/include_directory)
|
|
#include "sommelier-global.h" // NOLINT(build/include_directory)
|
|
#include "sommelier-util.h" // NOLINT(build/include_directory)
|
|
#include "sommelier-window.h" // NOLINT(build/include_directory)
|
|
#include "weak-resource-ptr.h" // NOLINT(build/include_directory)
|
|
|
|
#define SOMMELIER_VERSION "0.20"
|
|
|
|
#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
|
|
|
|
#define CONTROL_MASK (1 << 0)
|
|
#define ALT_MASK (1 << 1)
|
|
#define SHIFT_MASK (1 << 2)
|
|
|
|
|
|
struct sl_global;
|
|
struct sl_compositor;
|
|
struct sl_shm;
|
|
struct sl_shell;
|
|
struct sl_data_device_manager;
|
|
struct sl_data_offer;
|
|
struct sl_data_source;
|
|
struct sl_xdg_shell;
|
|
struct sl_subcompositor;
|
|
struct sl_aura_shell;
|
|
struct sl_viewporter;
|
|
struct sl_linux_dmabuf;
|
|
struct sl_keyboard_extension;
|
|
struct sl_text_input_extension;
|
|
struct sl_text_input_manager;
|
|
struct sl_relative_pointer_manager;
|
|
struct sl_pointer_constraints;
|
|
struct sl_window;
|
|
struct sl_host_surface;
|
|
struct sl_host_output;
|
|
struct zaura_shell;
|
|
struct zcr_keyboard_extension_v1;
|
|
struct zxdg_output_manager_v1;
|
|
|
|
#ifdef GAMEPAD_SUPPORT
|
|
struct sl_gamepad;
|
|
struct sl_gaming_input_manager;
|
|
struct zcr_gaming_input_v2;
|
|
#endif
|
|
|
|
class WaylandChannel;
|
|
|
|
extern const struct wl_registry_listener sl_registry_listener;
|
|
|
|
// Exported for testing.
|
|
void sl_registry_handler(void* data,
|
|
struct wl_registry* registry,
|
|
uint32_t id,
|
|
const char* interface,
|
|
uint32_t version);
|
|
|
|
// We require a host compositor supporting at least this wl_compositor version.
|
|
constexpr uint32_t kMinHostWlCompositorVersion =
|
|
WL_SURFACE_SET_BUFFER_SCALE_SINCE_VERSION;
|
|
|
|
struct sl_compositor {
|
|
struct sl_context* ctx;
|
|
uint32_t id;
|
|
struct sl_global* host_global;
|
|
struct wl_compositor* internal;
|
|
};
|
|
|
|
struct sl_shm {
|
|
struct sl_context* ctx;
|
|
uint32_t id;
|
|
struct sl_global* host_global;
|
|
struct wl_shm* internal;
|
|
};
|
|
|
|
struct sl_seat {
|
|
struct sl_context* ctx;
|
|
uint32_t id;
|
|
uint32_t version;
|
|
struct sl_global* host_global;
|
|
uint32_t last_serial;
|
|
struct wl_list link;
|
|
};
|
|
|
|
struct sl_host_pointer {
|
|
struct sl_seat* seat;
|
|
struct wl_resource* resource;
|
|
struct wl_pointer* proxy;
|
|
struct wl_resource* focus_resource;
|
|
struct sl_host_surface* focus_surface;
|
|
struct wl_listener focus_resource_listener;
|
|
uint32_t focus_serial;
|
|
uint32_t time;
|
|
wl_fixed_t axis_delta[2];
|
|
int32_t axis_discrete[2];
|
|
};
|
|
|
|
struct sl_relative_pointer_manager {
|
|
struct sl_context* ctx;
|
|
uint32_t id;
|
|
struct sl_global* host_global;
|
|
};
|
|
|
|
struct sl_viewport {
|
|
struct wl_list link;
|
|
wl_fixed_t src_x;
|
|
wl_fixed_t src_y;
|
|
wl_fixed_t src_width;
|
|
wl_fixed_t src_height;
|
|
int32_t dst_width;
|
|
int32_t dst_height;
|
|
};
|
|
|
|
struct sl_host_callback {
|
|
struct wl_resource* resource;
|
|
struct wl_callback* proxy;
|
|
};
|
|
|
|
struct sl_host_surface {
|
|
struct sl_context* ctx;
|
|
struct wl_resource* resource;
|
|
struct wl_surface* proxy;
|
|
struct wp_viewport* viewport;
|
|
struct wl_buffer* proxy_buffer;
|
|
uint32_t contents_width;
|
|
uint32_t contents_height;
|
|
uint32_t contents_shm_format;
|
|
int32_t contents_scale;
|
|
int32_t contents_x_offset;
|
|
int32_t contents_y_offset;
|
|
double xdg_scale_x;
|
|
double xdg_scale_y;
|
|
bool scale_round_on_x;
|
|
bool scale_round_on_y;
|
|
struct wl_list contents_viewport;
|
|
struct sl_mmap* contents_shm_mmap;
|
|
bool contents_shaped;
|
|
pixman_region32_t contents_shape;
|
|
int has_role;
|
|
int has_output;
|
|
int has_own_scale;
|
|
int32_t cached_logical_width;
|
|
int32_t cached_logical_height;
|
|
uint32_t last_event_serial;
|
|
struct sl_output_buffer* current_buffer;
|
|
struct zwp_linux_surface_synchronization_v1* surface_sync;
|
|
struct wl_list released_buffers;
|
|
struct wl_list busy_buffers;
|
|
WeakResourcePtr<sl_host_output> output;
|
|
};
|
|
MAP_STRUCTS(wl_surface, sl_host_surface);
|
|
|
|
struct sl_host_region {
|
|
struct sl_context* ctx;
|
|
struct wl_resource* resource;
|
|
struct wl_region* proxy;
|
|
};
|
|
MAP_STRUCTS(wl_region, sl_host_region);
|
|
|
|
struct sl_host_buffer {
|
|
struct sl_context* ctx;
|
|
struct wl_resource* resource;
|
|
struct wl_buffer* proxy;
|
|
uint32_t width;
|
|
uint32_t height;
|
|
struct sl_mmap* shm_mmap;
|
|
uint32_t shm_format;
|
|
struct sl_sync_point* sync_point;
|
|
bool is_drm;
|
|
};
|
|
|
|
struct sl_data_source_send_request {
|
|
int fd;
|
|
xcb_intern_atom_cookie_t cookie;
|
|
struct sl_data_source* data_source;
|
|
struct wl_list link;
|
|
};
|
|
|
|
struct sl_subcompositor {
|
|
struct sl_context* ctx;
|
|
uint32_t id;
|
|
struct sl_global* host_global;
|
|
};
|
|
|
|
struct sl_shell {
|
|
struct sl_context* ctx;
|
|
uint32_t id;
|
|
struct sl_global* host_global;
|
|
};
|
|
|
|
struct sl_output {
|
|
struct sl_context* ctx;
|
|
uint32_t id;
|
|
uint32_t version;
|
|
struct sl_global* host_global;
|
|
struct sl_host_output* host_output;
|
|
struct wl_list link;
|
|
};
|
|
|
|
struct sl_xdg_output_manager {
|
|
struct sl_context* ctx;
|
|
uint32_t id;
|
|
uint32_t version;
|
|
struct zxdg_output_manager_v1* internal;
|
|
};
|
|
|
|
struct sl_host_output {
|
|
struct sl_context* ctx;
|
|
struct wl_resource* resource;
|
|
struct wl_output* proxy;
|
|
struct zxdg_output_v1* zxdg_output;
|
|
struct zaura_output* aura_output;
|
|
int internal;
|
|
int x;
|
|
int y;
|
|
int physical_width;
|
|
int physical_height;
|
|
int scaled_physical_width;
|
|
int scaled_physical_height;
|
|
int subpixel;
|
|
char* make;
|
|
char* model;
|
|
int transform;
|
|
uint32_t flags;
|
|
int width;
|
|
int height;
|
|
int refresh;
|
|
int scale_factor;
|
|
int current_scale;
|
|
int preferred_scale;
|
|
int device_scale_factor;
|
|
int expecting_scale;
|
|
bool expecting_logical_size;
|
|
|
|
// The scaling factors for direct mode
|
|
// virt_scale: Used to translate from physical space to virtual space
|
|
// xdg_scale: Used to translate from virtual space to logical space
|
|
//
|
|
// The logical space is defined by the host. It will be retrieved through
|
|
// the xdg_output_manager interface.
|
|
//
|
|
// All spaces, and by consequence all scale factors, will be unique to each
|
|
// particular output.
|
|
//
|
|
// For more details, see sommelier-transform.h
|
|
|
|
double virt_scale_x;
|
|
double virt_scale_y;
|
|
double xdg_scale_x;
|
|
double xdg_scale_y;
|
|
int virt_x;
|
|
int virt_y;
|
|
int32_t logical_width;
|
|
int32_t logical_height;
|
|
int32_t logical_x;
|
|
int32_t logical_y;
|
|
struct wl_list link;
|
|
};
|
|
MAP_STRUCTS(wl_output, sl_host_output);
|
|
|
|
struct sl_host_seat {
|
|
struct sl_seat* seat;
|
|
struct wl_resource* resource;
|
|
struct wl_seat* proxy;
|
|
};
|
|
MAP_STRUCTS(wl_seat, sl_host_seat);
|
|
|
|
struct sl_accelerator {
|
|
struct wl_list link;
|
|
uint32_t modifiers;
|
|
xkb_keysym_t symbol;
|
|
};
|
|
|
|
struct sl_keyboard_extension {
|
|
struct sl_context* ctx;
|
|
uint32_t id;
|
|
struct zcr_keyboard_extension_v1* internal;
|
|
};
|
|
|
|
struct sl_data_device_manager {
|
|
struct sl_context* ctx;
|
|
uint32_t id;
|
|
uint32_t version;
|
|
struct sl_global* host_global;
|
|
struct wl_data_device_manager* internal;
|
|
};
|
|
|
|
struct sl_data_offer {
|
|
struct sl_context* ctx;
|
|
struct wl_data_offer* internal;
|
|
struct wl_array atoms; // Contains xcb_atom_t
|
|
struct wl_array cookies; // Contains xcb_intern_atom_cookie_t
|
|
};
|
|
|
|
struct sl_text_input_manager {
|
|
struct sl_context* ctx;
|
|
uint32_t id;
|
|
struct sl_global* host_global;
|
|
struct sl_global* host_x11_global;
|
|
};
|
|
|
|
struct sl_text_input_extension {
|
|
struct sl_context* ctx;
|
|
uint32_t id;
|
|
struct sl_global* host_global;
|
|
};
|
|
|
|
#ifdef GAMEPAD_SUPPORT
|
|
struct sl_gaming_input_manager {
|
|
struct sl_context* ctx;
|
|
uint32_t id;
|
|
struct zcr_gaming_input_v2* internal;
|
|
};
|
|
#endif
|
|
|
|
struct sl_pointer_constraints {
|
|
struct sl_context* ctx;
|
|
uint32_t id;
|
|
struct sl_global* host_global;
|
|
};
|
|
|
|
struct sl_viewporter {
|
|
struct sl_context* ctx;
|
|
uint32_t id;
|
|
struct sl_global* host_viewporter_global;
|
|
struct wp_viewporter* internal;
|
|
};
|
|
|
|
struct sl_xdg_shell {
|
|
struct sl_context* ctx;
|
|
uint32_t id;
|
|
struct sl_global* host_global;
|
|
struct xdg_wm_base* internal;
|
|
};
|
|
|
|
struct sl_aura_shell {
|
|
struct sl_context* ctx;
|
|
uint32_t id;
|
|
uint32_t version;
|
|
struct sl_global* host_gtk_shell_global;
|
|
struct zaura_shell* internal;
|
|
};
|
|
|
|
struct sl_linux_dmabuf {
|
|
struct sl_context* ctx;
|
|
uint32_t id;
|
|
uint32_t version;
|
|
struct sl_global* host_drm_global;
|
|
struct zwp_linux_dmabuf_v1* internal;
|
|
};
|
|
|
|
struct sl_linux_explicit_synchronization {
|
|
struct sl_context* ctx;
|
|
uint32_t id;
|
|
struct zwp_linux_explicit_synchronization_v1* internal;
|
|
};
|
|
|
|
struct sl_global {
|
|
struct sl_context* ctx;
|
|
const struct wl_interface* interface;
|
|
uint32_t name;
|
|
uint32_t version;
|
|
void* data;
|
|
wl_global_bind_func_t bind;
|
|
struct wl_list link;
|
|
};
|
|
|
|
struct sl_host_registry {
|
|
struct sl_context* ctx;
|
|
struct wl_resource* resource;
|
|
struct wl_list link;
|
|
};
|
|
|
|
|
|
typedef void (*sl_sync_func_t)(struct sl_context* ctx,
|
|
struct sl_sync_point* sync_point);
|
|
|
|
struct sl_sync_point {
|
|
int fd;
|
|
sl_sync_func_t sync;
|
|
};
|
|
|
|
#ifdef GAMEPAD_SUPPORT
|
|
struct sl_host_gamepad {
|
|
struct sl_context* ctx;
|
|
int state;
|
|
struct libevdev* ev_dev;
|
|
struct libevdev_uinput* uinput_dev;
|
|
bool axes_quirk;
|
|
struct wl_list link;
|
|
};
|
|
#endif
|
|
|
|
struct sl_host_buffer* sl_create_host_buffer(struct sl_context* ctx,
|
|
struct wl_client* client,
|
|
uint32_t id,
|
|
struct wl_buffer* proxy,
|
|
int32_t width,
|
|
int32_t height,
|
|
bool is_drm);
|
|
|
|
struct sl_global* sl_compositor_global_create(struct sl_context* ctx);
|
|
void sl_compositor_init_context(struct sl_context* ctx,
|
|
struct wl_registry* registry,
|
|
uint32_t id,
|
|
uint32_t version);
|
|
|
|
size_t sl_shm_bpp_for_shm_format(uint32_t format);
|
|
|
|
size_t sl_shm_num_planes_for_shm_format(uint32_t format);
|
|
|
|
struct sl_global* sl_shm_global_create(struct sl_context* ctx);
|
|
|
|
struct sl_global* sl_subcompositor_global_create(struct sl_context* ctx);
|
|
|
|
struct sl_global* sl_shell_global_create(struct sl_context* ctx);
|
|
|
|
double sl_output_aura_scale_factor_to_double(int scale_factor);
|
|
|
|
void sl_output_send_host_output_state(struct sl_host_output* host);
|
|
|
|
struct sl_global* sl_output_global_create(struct sl_output* output);
|
|
|
|
struct sl_global* sl_seat_global_create(struct sl_seat* seat);
|
|
|
|
struct sl_global* sl_relative_pointer_manager_global_create(
|
|
struct sl_context* ctx);
|
|
|
|
struct sl_global* sl_data_device_manager_global_create(struct sl_context* ctx);
|
|
|
|
struct sl_global* sl_viewporter_global_create(struct sl_context* ctx);
|
|
|
|
struct sl_global* sl_xdg_shell_global_create(struct sl_context* ctx);
|
|
|
|
struct sl_global* sl_gtk_shell_global_create(struct sl_context* ctx);
|
|
|
|
struct sl_global* sl_drm_global_create(struct sl_context* ctx);
|
|
|
|
struct sl_global* sl_text_input_extension_global_create(struct sl_context* ctx);
|
|
|
|
struct sl_global* sl_text_input_manager_global_create(struct sl_context* ctx);
|
|
|
|
struct sl_global* sl_text_input_x11_global_create(struct sl_context* ctx);
|
|
|
|
struct sl_global* sl_pointer_constraints_global_create(struct sl_context* ctx);
|
|
|
|
void sl_set_display_implementation(struct sl_context* ctx,
|
|
struct wl_client* client);
|
|
|
|
struct sl_sync_point* sl_sync_point_create(int fd);
|
|
void sl_sync_point_destroy(struct sl_sync_point* sync_point);
|
|
|
|
void sl_host_seat_added(struct sl_host_seat* host);
|
|
void sl_host_seat_removed(struct sl_host_seat* host);
|
|
|
|
void sl_restack_windows(struct sl_context* ctx, uint32_t focus_resource_id);
|
|
|
|
void sl_roundtrip(struct sl_context* ctx);
|
|
|
|
|
|
struct sl_window* sl_lookup_window(struct sl_context* ctx, xcb_window_t id);
|
|
int sl_is_our_window(struct sl_context* ctx, xcb_window_t id);
|
|
|
|
// Exported for testing
|
|
void sl_handle_destroy_notify(struct sl_context* ctx,
|
|
xcb_destroy_notify_event_t* event);
|
|
void sl_handle_reparent_notify(struct sl_context* ctx,
|
|
xcb_reparent_notify_event_t* event);
|
|
void sl_handle_map_request(struct sl_context* ctx,
|
|
xcb_map_request_event_t* event);
|
|
void sl_handle_unmap_notify(struct sl_context* ctx,
|
|
xcb_unmap_notify_event_t* event);
|
|
void sl_handle_configure_request(struct sl_context* ctx,
|
|
xcb_configure_request_event_t* event);
|
|
void sl_handle_property_notify(struct sl_context* ctx,
|
|
xcb_property_notify_event_t* event);
|
|
void sl_create_window(struct sl_context* ctx,
|
|
xcb_window_t id,
|
|
int x,
|
|
int y,
|
|
int width,
|
|
int height,
|
|
int border_width);
|
|
void sl_handle_client_message(struct sl_context* ctx,
|
|
xcb_client_message_event_t* event);
|
|
void sl_handle_focus_in(struct sl_context* ctx, xcb_focus_in_event_t* event);
|
|
|
|
uint32_t sl_drm_format_for_shm_format(int format);
|
|
int sl_shm_format_for_drm_format(uint32_t drm_format);
|
|
|
|
#ifdef GAMEPAD_SUPPORT
|
|
void sl_gaming_seat_add_listener(struct sl_context* ctx);
|
|
#endif
|
|
|
|
bool sl_client_supports_interface(const sl_context* ctx,
|
|
const wl_client* client,
|
|
const wl_interface* interface);
|
|
|
|
#define sl_array_for_each(pos, array) \
|
|
for (pos = static_cast<decltype(pos)>((array)->data); \
|
|
(const char*)pos < ((const char*)(array)->data + (array)->size); \
|
|
(pos)++)
|
|
|
|
#endif // VM_TOOLS_SOMMELIER_SOMMELIER_H_
|