blob: ebe23922a34deea38d445c5da08752adb49cec26 [file] [log] [blame]
// Copyright 2021 The Chromium OS Authors. All rights reserved.
// 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_CTX_H_
#define VM_TOOLS_SOMMELIER_SOMMELIER_CTX_H_
#include <memory>
#include <string>
#include <wayland-server.h>
#include <wayland-util.h>
#include <xcb/xcb.h>
#include "sommelier-timing.h" // NOLINT(build/include_directory)
#include "sommelier-util.h" // NOLINT(build/include_directory)
#include "virtualization/wayland_channel.h"
// A list of atoms to intern (create/fetch) when connecting to the X server.
//
// To add an atom, declare it here and define it in |sl_context_atom_name|.
enum {
ATOM_WM_S0,
ATOM_WM_PROTOCOLS,
ATOM_WM_STATE,
ATOM_WM_CHANGE_STATE,
ATOM_WM_DELETE_WINDOW,
ATOM_WM_TAKE_FOCUS,
ATOM_WM_CLIENT_LEADER,
ATOM_WL_SURFACE_ID,
ATOM_UTF8_STRING,
ATOM_MOTIF_WM_HINTS,
ATOM_NET_ACTIVE_WINDOW,
ATOM_NET_FRAME_EXTENTS,
ATOM_NET_STARTUP_ID,
ATOM_NET_SUPPORTED,
ATOM_NET_SUPPORTING_WM_CHECK,
ATOM_NET_WM_NAME,
ATOM_NET_WM_MOVERESIZE,
ATOM_NET_WM_STATE,
ATOM_NET_WM_STATE_FULLSCREEN,
ATOM_NET_WM_STATE_MAXIMIZED_VERT,
ATOM_NET_WM_STATE_MAXIMIZED_HORZ,
ATOM_NET_WM_STATE_FOCUSED,
ATOM_CLIPBOARD,
ATOM_CLIPBOARD_MANAGER,
ATOM_TARGETS,
ATOM_TIMESTAMP,
ATOM_TEXT,
ATOM_INCR,
ATOM_WL_SELECTION,
ATOM_GTK_THEME_VARIANT,
ATOM_XWAYLAND_RANDR_EMU_MONITOR_RECTS,
ATOM_LAST = ATOM_XWAYLAND_RANDR_EMU_MONITOR_RECTS,
};
struct sl_context {
char** runprog;
struct wl_display* display;
struct wl_display* host_display;
struct wl_client* client;
struct sl_compositor* compositor;
struct sl_subcompositor* subcompositor;
struct sl_shm* shm;
struct sl_shell* shell;
struct sl_data_device_manager* data_device_manager;
struct sl_xdg_shell* xdg_shell;
struct sl_aura_shell* aura_shell;
struct sl_viewporter* viewporter;
struct sl_linux_dmabuf* linux_dmabuf;
struct sl_linux_explicit_synchronization* linux_explicit_synchronization;
struct sl_keyboard_extension* keyboard_extension;
struct sl_text_input_manager* text_input_manager;
#ifdef GAMEPAD_SUPPORT
struct sl_gaming_input_manager* gaming_input_manager;
#endif
struct sl_relative_pointer_manager* relative_pointer_manager;
struct sl_pointer_constraints* pointer_constraints;
struct wl_list outputs;
struct wl_list seats;
std::unique_ptr<struct wl_event_source> display_event_source;
std::unique_ptr<struct wl_event_source> display_ready_event_source;
std::unique_ptr<struct wl_event_source> sigchld_event_source;
std::unique_ptr<struct wl_event_source> sigusr1_event_source;
std::unique_ptr<struct wl_event_source> clipboard_event_source;
struct wl_array dpi;
int wm_fd;
int wayland_channel_fd;
int virtwl_socket_fd;
int virtwl_display_fd;
std::unique_ptr<struct wl_event_source> wayland_channel_event_source;
std::unique_ptr<struct wl_event_source> virtwl_socket_event_source;
const char* drm_device;
struct gbm_device* gbm;
int xwayland;
pid_t xwayland_pid;
pid_t child_pid;
pid_t peer_pid;
struct xkb_context* xkb_context;
struct wl_list accelerators;
struct wl_list registries;
struct wl_list globals;
struct wl_list host_outputs;
int next_global_id;
xcb_connection_t* connection;
std::unique_ptr<struct wl_event_source> connection_event_source;
const xcb_query_extension_reply_t* xfixes_extension;
xcb_screen_t* screen;
xcb_window_t window;
struct wl_list windows, unpaired_windows;
struct sl_window* host_focus_window;
int needs_set_input_focus;
#ifdef GAMEPAD_SUPPORT
struct wl_list gamepads;
#endif
double desired_scale;
double scale;
// If non-null, all X11 client apps will be given this application ID.
const char* application_id;
// VM name embedded in application IDs, if application_id is null.
const char* vm_id;
// A custom X11 property to append to application IDs, if application_id
// is null. Used in preference to other X11 properties such as WM_CLASS.
const char* application_id_property_name;
xcb_atom_t application_id_property_atom = XCB_ATOM_NONE;
int exit_with_child;
const char* sd_notify;
int clipboard_manager;
uint32_t frame_color;
uint32_t dark_frame_color;
bool support_damage_buffer;
int fullscreen_mode;
struct sl_host_seat* default_seat;
xcb_window_t selection_window;
xcb_window_t selection_owner;
int selection_incremental_transfer;
xcb_selection_request_event_t selection_request;
xcb_timestamp_t selection_timestamp;
struct wl_data_device* selection_data_device;
struct sl_data_offer* selection_data_offer;
struct sl_data_source* selection_data_source;
int selection_data_source_send_fd;
struct wl_list selection_data_source_send_pending;
std::unique_ptr<struct wl_event_source> selection_send_event_source;
xcb_get_property_reply_t* selection_property_reply;
int selection_property_offset;
std::unique_ptr<struct wl_event_source> selection_event_source;
xcb_atom_t selection_data_type;
struct wl_array selection_data;
int selection_data_offer_receive_fd;
int selection_data_ack_pending;
union {
const char* name;
xcb_intern_atom_cookie_t cookie;
xcb_atom_t value;
} atoms[ATOM_LAST + 1];
xcb_visualid_t visual_ids[256];
xcb_colormap_t colormaps[256];
Timing* timing;
const char* trace_filename;
bool trace_system;
bool use_explicit_fence;
bool use_virtgpu_channel;
// Never freed after allocation due the fact sommelier doesn't have a
// shutdown function yet.
WaylandChannel* channel;
};
// Returns the string mapped to the given ATOM_ enum value.
//
// Note this is NOT the atom value sent via the X protocol, despite both being
// ints. Use |sl_context::atoms| to map between X protocol atoms and ATOM_ enum
// values: If `atoms[i].value = j`, i is the ATOM_ enum value and j is the
// X protocol atom.
//
// If the given value is out of range of the ATOM_ enum, returns NULL.
const char* sl_context_atom_name(int atom_enum);
void sl_context_init_default(struct sl_context* ctx);
bool sl_context_init_wayland_channel(struct sl_context* ctx,
struct wl_event_loop* event_loop,
bool display);
#endif // VM_TOOLS_SOMMELIER_SOMMELIER_CTX_H_