6f6f16c2b1
If multiple sync events are send in the same dispatch, a further call to wait_for_sync_event will get stuck. Fix this by keeping track of the latest sync event serial in the display and always compare against that. This also means sync event sequences must start at 0 and increase by 1. The wayland-x11 interop test is the only one where that wasn't already the case. Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3358>
101 lines
3.1 KiB
C
101 lines
3.1 KiB
C
#pragma once
|
|
|
|
#include <glib-object.h>
|
|
#include <stdio.h>
|
|
#include <wayland-client.h>
|
|
|
|
#include "fractional-scale-v1-client-protocol.h"
|
|
#include "single-pixel-buffer-v1-client-protocol.h"
|
|
#include "test-driver-client-protocol.h"
|
|
#include "viewporter-client-protocol.h"
|
|
#include "xdg-shell-client-protocol.h"
|
|
|
|
typedef enum _WaylandDisplayCapabilities
|
|
{
|
|
WAYLAND_DISPLAY_CAPABILITY_NONE = 0,
|
|
WAYLAND_DISPLAY_CAPABILITY_TEST_DRIVER = 1 << 0,
|
|
WAYLAND_DISPLAY_CAPABILITY_XDG_SHELL_V4 = 1 << 1,
|
|
} WaylandDisplayCapabilities;
|
|
|
|
typedef struct _WaylandDisplay
|
|
{
|
|
GObject parent;
|
|
|
|
WaylandDisplayCapabilities capabilities;
|
|
|
|
struct wl_display *display;
|
|
struct wl_registry *registry;
|
|
struct wl_compositor *compositor;
|
|
struct wl_subcompositor *subcompositor;
|
|
struct wl_shm *shm;
|
|
struct wp_fractional_scale_manager_v1 *fractional_scale_mgr;
|
|
struct wp_single_pixel_buffer_manager_v1 *single_pixel_mgr;
|
|
struct wp_viewporter *viewporter;
|
|
struct xdg_wm_base *xdg_wm_base;
|
|
struct test_driver *test_driver;
|
|
|
|
uint32_t sync_event_serial_next;
|
|
|
|
GHashTable *properties;
|
|
} WaylandDisplay;
|
|
|
|
typedef struct _WaylandSurface
|
|
{
|
|
WaylandDisplay *display;
|
|
|
|
struct wl_surface *wl_surface;
|
|
struct xdg_surface *xdg_surface;
|
|
struct xdg_toplevel *xdg_toplevel;
|
|
|
|
int default_width;
|
|
int default_height;
|
|
int width;
|
|
int height;
|
|
|
|
uint32_t color;
|
|
} WaylandSurface;
|
|
|
|
G_DECLARE_FINAL_TYPE (WaylandDisplay, wayland_display,
|
|
WAYLAND, DISPLAY,
|
|
GObject)
|
|
|
|
int create_anonymous_file (off_t size);
|
|
|
|
WaylandDisplay * wayland_display_new (WaylandDisplayCapabilities capabilities);
|
|
|
|
WaylandDisplay * wayland_display_new_full (WaylandDisplayCapabilities capabilities,
|
|
struct wl_display *wayland_display);
|
|
|
|
WaylandSurface * wayland_surface_new (WaylandDisplay *display,
|
|
const char *title,
|
|
int default_width,
|
|
int default_height,
|
|
uint32_t color);
|
|
|
|
void wayland_surface_free (WaylandSurface *surface);
|
|
|
|
gboolean create_shm_buffer (WaylandDisplay *display,
|
|
int width,
|
|
int height,
|
|
struct wl_buffer **out_buffer,
|
|
void **out_data,
|
|
int *out_size);
|
|
|
|
void draw_surface (WaylandDisplay *display,
|
|
struct wl_surface *surface,
|
|
int width,
|
|
int height,
|
|
uint32_t color);
|
|
|
|
const char * lookup_property_value (WaylandDisplay *display,
|
|
const char *name);
|
|
|
|
void wait_for_effects_completed (WaylandDisplay *display,
|
|
struct wl_surface *surface);
|
|
|
|
void wait_for_view_verified (WaylandDisplay *display,
|
|
int sequence);
|
|
|
|
void wait_for_sync_event (WaylandDisplay *display,
|
|
uint32_t serial);
|