| // Copyright 2018 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_H_ |
| #define VM_TOOLS_SOMMELIER_SOMMELIER_H_ |
| |
| #include <sys/types.h> |
| #include <wayland-server.h> |
| #include <wayland-util.h> |
| #include <xcb/xcb.h> |
| #include <xkbcommon/xkbcommon.h> |
| |
| #define SOMMELIER_VERSION "0.20" |
| |
| #define MIN(a, b) (((a) < (b)) ? (a) : (b)) |
| #define MAX(a, b) (((a) > (b)) ? (a) : (b)) |
| |
| #define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0])) |
| |
| #define UNUSED(x) ((void)(x)) |
| |
| #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_manager; |
| struct sl_relative_pointer_manager; |
| struct sl_pointer_constraints; |
| struct sl_window; |
| struct zaura_shell; |
| struct zcr_keyboard_extension_v1; |
| |
| #ifdef GAMEPAD_SUPPORT |
| struct sl_gamepad; |
| struct sl_gaming_input_manager; |
| struct zcr_gaming_input_v2; |
| #endif |
| |
| 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_CLIPBOARD, |
| ATOM_CLIPBOARD_MANAGER, |
| ATOM_TARGETS, |
| ATOM_TIMESTAMP, |
| ATOM_TEXT, |
| ATOM_INCR, |
| ATOM_WL_SELECTION, |
| ATOM_GTK_THEME_VARIANT, |
| ATOM_LAST = ATOM_GTK_THEME_VARIANT, |
| }; |
| |
| enum { |
| SHM_DRIVER_NOOP, |
| SHM_DRIVER_DMABUF, |
| SHM_DRIVER_VIRTWL, |
| SHM_DRIVER_VIRTWL_DMABUF, |
| }; |
| |
| enum { |
| DATA_DRIVER_NOOP, |
| DATA_DRIVER_VIRTWL, |
| }; |
| |
| 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_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; |
| struct wl_event_source* display_event_source; |
| struct wl_event_source* display_ready_event_source; |
| struct wl_event_source* sigchld_event_source; |
| struct wl_event_source* sigusr1_event_source; |
| struct wl_array dpi; |
| int shm_driver; |
| int data_driver; |
| int wm_fd; |
| int virtwl_fd; |
| int virtwl_ctx_fd; |
| int virtwl_socket_fd; |
| struct wl_event_source* virtwl_ctx_event_source; |
| struct wl_event_source* virtwl_socket_event_source; |
| const char* vm_id; |
| 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; |
| 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; |
| const char* application_id; |
| int exit_with_child; |
| const char* sd_notify; |
| int clipboard_manager; |
| uint32_t frame_color; |
| uint32_t dark_frame_color; |
| 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; |
| struct wl_event_source* selection_send_event_source; |
| xcb_get_property_reply_t* selection_property_reply; |
| int selection_property_offset; |
| 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]; |
| const char* trace_filename; |
| bool trace_system; |
| }; |
| |
| struct sl_compositor { |
| struct sl_context* ctx; |
| uint32_t id; |
| uint32_t version; |
| 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 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 zwp_relative_pointer_manager_v1* internal; |
| }; |
| |
| 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; |
| uint32_t contents_width; |
| uint32_t contents_height; |
| int32_t contents_scale; |
| struct wl_list contents_viewport; |
| struct sl_mmap* contents_shm_mmap; |
| int has_role; |
| int has_output; |
| uint32_t last_event_serial; |
| struct sl_output_buffer* current_buffer; |
| struct wl_list released_buffers; |
| struct wl_list busy_buffers; |
| }; |
| |
| struct sl_host_region { |
| struct sl_context* ctx; |
| struct wl_resource* resource; |
| struct wl_region* proxy; |
| }; |
| |
| struct sl_host_buffer { |
| 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; |
| }; |
| |
| 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 wl_list link; |
| }; |
| |
| struct sl_host_output { |
| struct sl_context* ctx; |
| struct wl_resource* resource; |
| struct wl_output* proxy; |
| struct zaura_output* aura_output; |
| int internal; |
| int x; |
| int y; |
| int physical_width; |
| int 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; |
| struct wl_list link; |
| }; |
| |
| struct sl_host_seat { |
| struct sl_seat* seat; |
| struct wl_resource* resource; |
| struct wl_seat* proxy; |
| }; |
| |
| 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 zwp_text_input_manager_v1* internal; |
| }; |
| |
| #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 zwp_pointer_constraints_v1* internal; |
| }; |
| |
| 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 zxdg_shell_v6* 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_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_begin_end_access_func_t)(int fd); |
| |
| struct sl_mmap { |
| int refcount; |
| int fd; |
| void* addr; |
| size_t size; |
| size_t bpp; |
| size_t num_planes; |
| size_t offset[2]; |
| size_t stride[2]; |
| size_t y_ss[2]; |
| sl_begin_end_access_func_t begin_write; |
| sl_begin_end_access_func_t end_write; |
| struct wl_resource* buffer_resource; |
| }; |
| |
| 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; |
| }; |
| |
| struct sl_config { |
| uint32_t serial; |
| uint32_t mask; |
| uint32_t values[5]; |
| uint32_t states_length; |
| uint32_t states[3]; |
| }; |
| |
| struct sl_window { |
| struct sl_context* ctx; |
| xcb_window_t id; |
| xcb_window_t frame_id; |
| uint32_t host_surface_id; |
| int unpaired; |
| int x; |
| int y; |
| int width; |
| int height; |
| int border_width; |
| int depth; |
| int managed; |
| int realized; |
| int activated; |
| int maximized; |
| int allow_resize; |
| xcb_window_t transient_for; |
| xcb_window_t client_leader; |
| int decorated; |
| char* name; |
| char* clazz; |
| char* startup_id; |
| int dark_frame; |
| uint32_t size_flags; |
| int focus_model_take_focus; |
| int min_width; |
| int min_height; |
| int max_width; |
| int max_height; |
| struct sl_config next_config; |
| struct sl_config pending_config; |
| struct zxdg_surface_v6* xdg_surface; |
| struct zxdg_toplevel_v6* xdg_toplevel; |
| struct zxdg_popup_v6* xdg_popup; |
| struct zaura_surface* aura_surface; |
| struct wl_list link; |
| }; |
| |
| #ifdef GAMEPAD_SUPPORT |
| struct sl_host_gamepad { |
| struct sl_context* ctx; |
| int state; |
| struct libevdev* ev_dev; |
| struct libevdev_uinput* uinput_dev; |
| bool stadia; |
| struct wl_list link; |
| }; |
| #endif |
| |
| struct sl_host_buffer* sl_create_host_buffer(struct wl_client* client, |
| uint32_t id, |
| struct wl_buffer* proxy, |
| int32_t width, |
| int32_t height); |
| |
| struct sl_global* sl_global_create(struct sl_context* ctx, |
| const struct wl_interface* interface, |
| int version, |
| void* data, |
| wl_global_bind_func_t bind); |
| |
| struct sl_global* sl_compositor_global_create(struct sl_context* ctx); |
| |
| 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_manager_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 sl_mmap* sl_mmap_create(int fd, |
| size_t size, |
| size_t bpp, |
| size_t num_planes, |
| size_t offset0, |
| size_t stride0, |
| size_t offset1, |
| size_t stride1, |
| size_t y_ss0, |
| size_t y_ss1); |
| struct sl_mmap* sl_mmap_ref(struct sl_mmap* map); |
| void sl_mmap_unref(struct sl_mmap* map); |
| |
| 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); |
| |
| int sl_process_pending_configure_acks(struct sl_window* window, |
| struct sl_host_surface* host_surface); |
| |
| void sl_window_update(struct sl_window* window); |
| |
| #ifdef GAMEPAD_SUPPORT |
| void sl_gaming_seat_add_listener(struct sl_context* ctx); |
| #endif |
| |
| #define sl_array_for_each(pos, array) \ |
| for (pos = static_cast<typeof(pos)>((array)->data); \ |
| (const char*)pos < ((const char*)(array)->data + (array)->size); \ |
| (pos)++) |
| |
| #endif // VM_TOOLS_SOMMELIER_SOMMELIER_H_ |