weston-info: add xdg-output support

This commit is contained in:
emersion 2018-09-17 23:51:13 +02:00
parent 20b241691b
commit b49af1ed19
3 changed files with 186 additions and 5 deletions

View File

@ -856,7 +856,9 @@ nodist_weston_info_SOURCES = \
protocol/linux-dmabuf-unstable-v1-protocol.c \
protocol/linux-dmabuf-unstable-v1-client-protocol.h \
protocol/tablet-unstable-v2-protocol.c \
protocol/tablet-unstable-v2-client-protocol.h
protocol/tablet-unstable-v2-client-protocol.h \
protocol/xdg-output-unstable-v1-protocol.c \
protocol/xdg-output-unstable-v1-client-protocol.h
weston_info_LDADD = $(WESTON_INFO_LIBS) libshared.la
weston_info_CFLAGS = $(AM_CFLAGS) $(CLIENT_CFLAGS)
@ -932,7 +934,9 @@ BUILT_SOURCES += \
protocol/tablet-unstable-v2-protocol.c \
protocol/tablet-unstable-v2-client-protocol.h \
protocol/input-timestamps-unstable-v1-protocol.c \
protocol/input-timestamps-unstable-v1-client-protocol.h
protocol/input-timestamps-unstable-v1-client-protocol.h \
protocol/xdg-output-unstable-v1-protocol.c \
protocol/xdg-output-unstable-v1-client-protocol.h
westondatadir = $(datadir)/weston
dist_westondata_DATA = \

View File

@ -42,6 +42,7 @@
#include "presentation-time-client-protocol.h"
#include "linux-dmabuf-unstable-v1-client-protocol.h"
#include "tablet-unstable-v2-client-protocol.h"
#include "xdg-output-unstable-v1-client-protocol.h"
typedef void (*print_info_t)(void *info);
typedef void (*destroy_info_t)(void *info);
@ -67,6 +68,7 @@ struct output_mode {
struct output_info {
struct global_info global;
struct wl_list global_link;
struct wl_output *output;
@ -138,7 +140,7 @@ struct tablet_tool_info {
uint64_t hardware_serial;
uint64_t hardware_id_wacom;
enum zwp_tablet_tool_v2_type type;
bool has_tilt;
bool has_pressure;
bool has_distance;
@ -195,6 +197,28 @@ struct tablet_v2_info {
struct wl_list seats;
};
struct xdg_output_v1_info {
struct wl_list link;
struct zxdg_output_v1 *xdg_output;
struct output_info *output;
struct {
int32_t x, y;
int32_t width, height;
} logical;
char *name, *description;
};
struct xdg_output_manager_v1_info {
struct global_info global;
struct zxdg_output_manager_v1 *manager;
struct weston_info *info;
struct wl_list outputs;
};
struct presentation_info {
struct global_info global;
struct wp_presentation *presentation;
@ -212,6 +236,10 @@ struct weston_info {
/* required for tablet-unstable-v2 */
struct wl_list seats;
struct tablet_v2_info *tablet_info;
/* required for xdg-output-unstable-v1 */
struct wl_list outputs;
struct xdg_output_manager_v1_info *xdg_output_manager_v1_info;
};
static void
@ -844,7 +872,7 @@ handle_tablet_v2_tablet_tool_capability(void *data,
{
struct tablet_tool_info *info = data;
enum zwp_tablet_tool_v2_capability cap = capability;
switch(cap) {
case ZWP_TABLET_TOOL_V2_CAPABILITY_TILT:
info->has_tilt = true;
@ -1295,6 +1323,146 @@ add_tablet_v2_info(struct weston_info *info, uint32_t id, uint32_t version)
info->tablet_info = tablet;
}
static void
destroy_xdg_output_v1_info(struct xdg_output_v1_info *info)
{
wl_list_remove(&info->link);
zxdg_output_v1_destroy(info->xdg_output);
free(info->name);
free(info->description);
free(info);
}
static void
print_xdg_output_v1_info(const struct xdg_output_v1_info *info)
{
printf("\txdg_output_v1\n");
printf("\t\toutput: %d\n", info->output->global.id);
if (info->name)
printf("\t\tname: '%s'\n", info->name);
if (info->description)
printf("\t\tdescription: '%s'\n", info->description);
printf("\t\tlogical_x: %d, logical_y: %d\n",
info->logical.x, info->logical.y);
printf("\t\tlogical_width: %d, logical_height: %d\n",
info->logical.width, info->logical.height);
}
static void
print_xdg_output_manager_v1_info(void *data)
{
struct xdg_output_manager_v1_info *info = data;
struct xdg_output_v1_info *output;
print_global_info(data);
wl_list_for_each(output, &info->outputs, link)
print_xdg_output_v1_info(output);
}
static void
destroy_xdg_output_manager_v1_info(void *data)
{
struct xdg_output_manager_v1_info *info = data;
struct xdg_output_v1_info *output, *tmp;
zxdg_output_manager_v1_destroy(info->manager);
wl_list_for_each_safe(output, tmp, &info->outputs, link)
destroy_xdg_output_v1_info(output);
}
static void
handle_xdg_output_v1_logical_position(void *data, struct zxdg_output_v1 *output,
int32_t x, int32_t y)
{
struct xdg_output_v1_info *xdg_output = data;
xdg_output->logical.x = x;
xdg_output->logical.y = y;
}
static void
handle_xdg_output_v1_logical_size(void *data, struct zxdg_output_v1 *output,
int32_t width, int32_t height)
{
struct xdg_output_v1_info *xdg_output = data;
xdg_output->logical.width = width;
xdg_output->logical.height = height;
}
static void
handle_xdg_output_v1_done(void *data, struct zxdg_output_v1 *output)
{
/* Don't bother waiting for this; there's no good reason a
* compositor will wait more than one roundtrip before sending
* these initial events. */
}
static void
handle_xdg_output_v1_name(void *data, struct zxdg_output_v1 *output,
const char *name)
{
struct xdg_output_v1_info *xdg_output = data;
xdg_output->name = strdup(name);
}
static void
handle_xdg_output_v1_description(void *data, struct zxdg_output_v1 *output,
const char *description)
{
struct xdg_output_v1_info *xdg_output = data;
xdg_output->description = strdup(description);
}
static const struct zxdg_output_v1_listener xdg_output_v1_listener = {
.logical_position = handle_xdg_output_v1_logical_position,
.logical_size = handle_xdg_output_v1_logical_size,
.done = handle_xdg_output_v1_done,
.name = handle_xdg_output_v1_name,
.description = handle_xdg_output_v1_description,
};
static void
add_xdg_output_v1_info(struct xdg_output_manager_v1_info *manager_info,
struct output_info *output)
{
struct xdg_output_v1_info *xdg_output = xzalloc(sizeof *xdg_output);
wl_list_insert(&manager_info->outputs, &xdg_output->link);
xdg_output->xdg_output = zxdg_output_manager_v1_get_xdg_output(
manager_info->manager, output->output);
zxdg_output_v1_add_listener(xdg_output->xdg_output,
&xdg_output_v1_listener, xdg_output);
xdg_output->output = output;
manager_info->info->roundtrip_needed = true;
}
static void
add_xdg_output_manager_v1_info(struct weston_info *info, uint32_t id,
uint32_t version)
{
struct output_info *output;
struct xdg_output_manager_v1_info *manager = xzalloc(sizeof *manager);
wl_list_init(&manager->outputs);
manager->info = info;
init_global_info(info, &manager->global, id,
zxdg_output_manager_v1_interface.name, version);
manager->global.print = print_xdg_output_manager_v1_info;
manager->global.destroy = destroy_xdg_output_manager_v1_info;
manager->manager = wl_registry_bind(info->registry, id,
&zxdg_output_manager_v1_interface, version > 2 ? 2 : version);
wl_list_for_each(output, &info->outputs, global_link)
add_xdg_output_v1_info(manager, output);
info->xdg_output_manager_v1_info = manager;
}
static void
add_seat_info(struct weston_info *info, uint32_t id, uint32_t version)
{
@ -1522,6 +1690,11 @@ add_output_info(struct weston_info *info, uint32_t id, uint32_t version)
output);
info->roundtrip_needed = true;
wl_list_insert(&info->outputs, &output->global_link);
if (info->xdg_output_manager_v1_info)
add_xdg_output_v1_info(info->xdg_output_manager_v1_info,
output);
}
static void
@ -1629,6 +1802,8 @@ global_handler(void *data, struct wl_registry *registry, uint32_t id,
add_presentation_info(info, id, version);
else if (!strcmp(interface, zwp_tablet_manager_v2_interface.name))
add_tablet_v2_info(info, id, version);
else if (!strcmp(interface, zxdg_output_manager_v1_interface.name))
add_xdg_output_manager_v1_info(info, id, version);
else
add_global_info(info, id, interface, version);
}
@ -1683,8 +1858,10 @@ main(int argc, char **argv)
}
info.tablet_info = NULL;
info.xdg_output_manager_v1_info = NULL;
wl_list_init(&info.infos);
wl_list_init(&info.seats);
wl_list_init(&info.outputs);
info.registry = wl_display_get_registry(info.display);
wl_registry_add_listener(info.registry, &registry_listener, &info);

View File

@ -227,7 +227,7 @@ fi
PKG_CHECK_MODULES(LIBINPUT_BACKEND, [libinput >= 0.8.0])
PKG_CHECK_MODULES(COMPOSITOR, [$COMPOSITOR_MODULES])
PKG_CHECK_MODULES(WAYLAND_PROTOCOLS, [wayland-protocols >= 1.13],
PKG_CHECK_MODULES(WAYLAND_PROTOCOLS, [wayland-protocols >= 1.14],
[ac_wayland_protocols_pkgdatadir=`$PKG_CONFIG --variable=pkgdatadir wayland-protocols`])
AC_SUBST(WAYLAND_PROTOCOLS_DATADIR, $ac_wayland_protocols_pkgdatadir)