Commit 7b48de32 authored by Alexandros Frantzis's avatar Alexandros Frantzis Committed by Alexandre Julliard

winewayland.drv: Use the output name reported by the compositor.

Use the xdg-output-unstable-v1 protocol to get a unique, cross-process consistent name for the outputs. Signed-off-by: 's avatarAlexandros Frantzis <alexandros.frantzis@collabora.com>
parent 85700167
......@@ -50,6 +50,18 @@ static void registry_handle_global(void *data, struct wl_registry *registry,
if (!wayland_output_create(id, version))
ERR("Failed to create wayland_output for global id=%u\n", id);
}
else if (strcmp(interface, "zxdg_output_manager_v1") == 0)
{
struct wayland_output *output;
process_wayland->zxdg_output_manager_v1 =
wl_registry_bind(registry, id, &zxdg_output_manager_v1_interface,
version < 3 ? version : 3);
/* Add zxdg_output_v1 to existing outputs. */
wl_list_for_each(output, &process_wayland->output_list, link)
wayland_output_use_xdg_extension(output);
}
}
static void registry_handle_global_remove(void *data, struct wl_registry *registry,
......
......@@ -97,6 +97,20 @@ static void wayland_output_add_mode(struct wayland_output *output,
if (current) output->current_mode = mode;
}
static void wayland_output_done(struct wayland_output *output)
{
struct wayland_output_mode *mode;
TRACE("name=%s\n", output->name);
RB_FOR_EACH_ENTRY(mode, &output->modes, struct wayland_output_mode, entry)
{
TRACE("mode %dx%d @ %d %s\n",
mode->width, mode->height, mode->refresh,
output->current_mode == mode ? "*" : "");
}
}
static void output_handle_geometry(void *data, struct wl_output *wl_output,
int32_t x, int32_t y,
int32_t physical_width, int32_t physical_height,
......@@ -122,15 +136,11 @@ static void output_handle_mode(void *data, struct wl_output *wl_output,
static void output_handle_done(void *data, struct wl_output *wl_output)
{
struct wayland_output *output = data;
struct wayland_output_mode *mode;
TRACE("name=%s\n", output->name);
RB_FOR_EACH_ENTRY(mode, &output->modes, struct wayland_output_mode, entry)
if (!output->zxdg_output_v1 ||
zxdg_output_v1_get_version(output->zxdg_output_v1) >= 3)
{
TRACE("mode %dx%d @ %d %s\n",
mode->width, mode->height, mode->refresh,
output->current_mode == mode ? "*" : "");
wayland_output_done(output);
}
}
......@@ -146,6 +156,54 @@ static const struct wl_output_listener output_listener = {
output_handle_scale
};
static void zxdg_output_v1_handle_logical_position(void *data,
struct zxdg_output_v1 *zxdg_output_v1,
int32_t x,
int32_t y)
{
}
static void zxdg_output_v1_handle_logical_size(void *data,
struct zxdg_output_v1 *zxdg_output_v1,
int32_t width,
int32_t height)
{
}
static void zxdg_output_v1_handle_done(void *data,
struct zxdg_output_v1 *zxdg_output_v1)
{
if (zxdg_output_v1_get_version(zxdg_output_v1) < 3)
{
struct wayland_output *output = data;
wayland_output_done(output);
}
}
static void zxdg_output_v1_handle_name(void *data,
struct zxdg_output_v1 *zxdg_output_v1,
const char *name)
{
struct wayland_output *output = data;
free(output->name);
output->name = strdup(name);
}
static void zxdg_output_v1_handle_description(void *data,
struct zxdg_output_v1 *zxdg_output_v1,
const char *description)
{
}
static const struct zxdg_output_v1_listener zxdg_output_v1_listener = {
zxdg_output_v1_handle_logical_position,
zxdg_output_v1_handle_logical_size,
zxdg_output_v1_handle_done,
zxdg_output_v1_handle_name,
zxdg_output_v1_handle_description,
};
/**********************************************************************
* wayland_output_create
*
......@@ -154,6 +212,7 @@ static const struct wl_output_listener output_listener = {
BOOL wayland_output_create(uint32_t id, uint32_t version)
{
struct wayland_output *output = calloc(1, sizeof(*output));
int name_len;
if (!output)
{
......@@ -170,8 +229,21 @@ BOOL wayland_output_create(uint32_t id, uint32_t version)
wl_list_init(&output->link);
rb_init(&output->modes, wayland_output_mode_cmp_rb);
snprintf(output->name, sizeof(output->name), "WaylandOutput%d",
next_output_id++);
/* Have a fallback while we don't have compositor given name. */
name_len = snprintf(NULL, 0, "WaylandOutput%d", next_output_id);
output->name = malloc(name_len + 1);
if (output->name)
{
snprintf(output->name, name_len + 1, "WaylandOutput%d", next_output_id++);
}
else
{
ERR("Couldn't allocate space for output name\n");
goto err;
}
if (process_wayland->zxdg_output_manager_v1)
wayland_output_use_xdg_extension(output);
wl_list_insert(process_wayland->output_list.prev, &output->link);
......@@ -196,6 +268,23 @@ void wayland_output_destroy(struct wayland_output *output)
{
rb_destroy(&output->modes, wayland_output_mode_free_rb, NULL);
wl_list_remove(&output->link);
if (output->zxdg_output_v1)
zxdg_output_v1_destroy(output->zxdg_output_v1);
wl_output_destroy(output->wl_output);
free(output->name);
free(output);
}
/**********************************************************************
* wayland_output_use_xdg_extension
*
* Use the zxdg_output_v1 extension to get output information.
*/
void wayland_output_use_xdg_extension(struct wayland_output *output)
{
output->zxdg_output_v1 =
zxdg_output_manager_v1_get_xdg_output(process_wayland->zxdg_output_manager_v1,
output->wl_output);
zxdg_output_v1_add_listener(output->zxdg_output_v1, &zxdg_output_v1_listener,
output);
}
......@@ -26,6 +26,7 @@
#endif
#include <wayland-client.h>
#include "xdg-output-unstable-v1-client-protocol.h"
#include "windef.h"
#include "winbase.h"
......@@ -49,6 +50,7 @@ struct wayland
{
struct wl_event_queue *wl_event_queue;
struct wl_registry *wl_registry;
struct zxdg_output_manager_v1 *zxdg_output_manager_v1;
struct wl_list output_list;
};
......@@ -64,9 +66,10 @@ struct wayland_output
{
struct wl_list link;
struct wl_output *wl_output;
struct zxdg_output_v1 *zxdg_output_v1;
struct rb_tree modes;
struct wayland_output_mode *current_mode;
char name[20];
char *name;
uint32_t global_id;
};
......@@ -83,6 +86,7 @@ void wayland_init_display_devices(void) DECLSPEC_HIDDEN;
BOOL wayland_output_create(uint32_t id, uint32_t version) DECLSPEC_HIDDEN;
void wayland_output_destroy(struct wayland_output *output) DECLSPEC_HIDDEN;
void wayland_output_use_xdg_extension(struct wayland_output *output) DECLSPEC_HIDDEN;
/**********************************************************************
* USER driver functions
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment