[PATCH RFC xserver] xwayland: Add xdg-output support
Jonas Ã…dahl
jadahl at gmail.com
Tue Aug 1 09:36:07 UTC 2017
On Tue, Aug 01, 2017 at 10:26:54AM +0200, Olivier Fourdan wrote:
> This was added in wayland-protocols 1.10.
>
> Signed-off-by: Olivier Fourdan <ofourdan at redhat.com>
> ---
> Note: This has not been tested with an actual compositor supporting xdg-output
>
> configure.ac | 2 +-
> hw/xwayland/Makefile.am | 9 +++++-
> hw/xwayland/xwayland-output.c | 71 +++++++++++++++++++++++++++++++++++++++----
> hw/xwayland/xwayland.c | 4 +++
> hw/xwayland/xwayland.h | 3 ++
> meson.build | 2 +-
> 6 files changed, 82 insertions(+), 9 deletions(-)
>
> diff --git a/configure.ac b/configure.ac
> index 8d3c3b55b..3a8c61f69 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -2353,7 +2353,7 @@ AM_CONDITIONAL(XEPHYR, [test "x$KDRIVE" = xyes && test "x$XEPHYR" = xyes])
>
> dnl Xwayland DDX
>
> -XWAYLANDMODULES="wayland-client >= 1.3.0 wayland-protocols >= 1.9 $LIBDRM epoxy"
> +XWAYLANDMODULES="wayland-client >= 1.3.0 wayland-protocols >= 1.10 $LIBDRM epoxy"
> if test "x$XF86VIDMODE" = xyes; then
> XWAYLANDMODULES="$XWAYLANDMODULES $VIDMODEPROTO"
> fi
> diff --git a/hw/xwayland/Makefile.am b/hw/xwayland/Makefile.am
> index c14b95b7c..a1eee3e8e 100644
> --- a/hw/xwayland/Makefile.am
> +++ b/hw/xwayland/Makefile.am
> @@ -59,7 +59,10 @@ Xwayland_built_sources += \
> tablet-unstable-v2-client-protocol.h \
> tablet-unstable-v2-protocol.c \
> xwayland-keyboard-grab-unstable-v1-protocol.c \
> - xwayland-keyboard-grab-unstable-v1-client-protocol.h
> + xwayland-keyboard-grab-unstable-v1-client-protocol.h \
> + xdg-output-unstable-v1-protocol.c \
> + xdg-output-unstable-v1-client-protocol.h
> +
>
> nodist_Xwayland_SOURCES = $(Xwayland_built_sources)
> CLEANFILES = $(Xwayland_built_sources)
> @@ -89,6 +92,10 @@ xwayland-keyboard-grab-unstable-v1-protocol.c : $(WAYLAND_PROTOCOLS_DATADIR)/uns
> $(AM_V_GEN)$(WAYLAND_SCANNER) code < $< > $@
> xwayland-keyboard-grab-unstable-v1-client-protocol.h : $(WAYLAND_PROTOCOLS_DATADIR)/unstable/xwayland-keyboard-grab/xwayland-keyboard-grab-unstable-v1.xml
> $(AM_V_GEN)$(WAYLAND_SCANNER) client-header < $< > $@
> +xdg-output-unstable-v1-protocol.c : $(WAYLAND_PROTOCOLS_DATADIR)/unstable/xdg-output/xdg-output-unstable-v1.xml
> + $(AM_V_GEN)$(WAYLAND_SCANNER) code < $< > $@
> +xdg-output-unstable-v1-client-protocol.h : $(WAYLAND_PROTOCOLS_DATADIR)/unstable/xdg-output/xdg-output-unstable-v1.xml
> + $(AM_V_GEN)$(WAYLAND_SCANNER) client-header < $< > $@
>
> %-protocol.c : %.xml
> $(AM_V_GEN)$(WAYLAND_SCANNER) code < $< > $@
> diff --git a/hw/xwayland/xwayland-output.c b/hw/xwayland/xwayland-output.c
> index 460caaf56..1f3eb4f59 100644
> --- a/hw/xwayland/xwayland-output.c
> +++ b/hw/xwayland/xwayland-output.c
> @@ -93,9 +93,12 @@ output_handle_geometry(void *data, struct wl_output *wl_output, int x, int y,
> physical_width, physical_height);
> RROutputSetSubpixelOrder(xwl_output->randr_output,
> wl_subpixel_to_xrandr(subpixel));
> - xwl_output->x = x;
> - xwl_output->y = y;
>
> + /* Apply the change from wl_output only if xdg-output is not supported */
> + if (!xwl_output->xdg_output) {
> + xwl_output->x = x;
> + xwl_output->y = y;
> + }
> xwl_output->rotation = wl_transform_to_xrandr(transform);
> }
>
> @@ -108,8 +111,11 @@ output_handle_mode(void *data, struct wl_output *wl_output, uint32_t flags,
> if (!(flags & WL_OUTPUT_MODE_CURRENT))
> return;
>
> - xwl_output->width = width;
> - xwl_output->height = height;
> + /* Apply the change from wl_output only if xdg-output is not supported */
> + if (!xwl_output->xdg_output) {
> + xwl_output->width = width;
> + xwl_output->height = height;
> + }
> xwl_output->refresh = refresh;
> }
>
> @@ -200,10 +206,10 @@ update_screen_size(struct xwl_output *xwl_output, int width, int height)
> }
>
> static void
> -output_handle_done(void *data, struct wl_output *wl_output)
> +apply_output_change(struct xwl_output *xwl_output)
> {
> - struct xwl_output *it, *xwl_output = data;
> struct xwl_screen *xwl_screen = xwl_output->xwl_screen;
> + struct xwl_output *it;
> int width = 0, height = 0, has_this_output = 0;
> RRModePtr randr_mode;
>
> @@ -238,6 +244,16 @@ output_handle_done(void *data, struct wl_output *wl_output)
> }
>
> static void
> +output_handle_done(void *data, struct wl_output *wl_output)
> +{
> + struct xwl_output *xwl_output = data;
> +
> + /* Apply the change from wl_output only if xdg-output is not supported */
> + if (!xwl_output->xdg_output)
> + apply_output_change(xwl_output);
> +}
> +
> +static void
> output_handle_scale(void *data, struct wl_output *wl_output, int32_t factor)
> {
> }
> @@ -249,6 +265,40 @@ static const struct wl_output_listener output_listener = {
> output_handle_scale
> };
>
> +static void
> +xdg_output_handle_logical_position(void *data, struct zxdg_output_v1 *xdg_output,
> + int32_t x, int32_t y)
> +{
> + struct xwl_output *xwl_output = data;
> +
> + xwl_output->x = x;
> + xwl_output->y = y;
> +}
> +
> +static void
> +xdg_output_handle_logical_size(void *data, struct zxdg_output_v1 *xdg_output,
> + int32_t width, int32_t height)
> +{
> + struct xwl_output *xwl_output = data;
> +
> + xwl_output->width = width;
> + xwl_output->height = height;
> +}
> +
> +static void
> +xdg_output_handle_done(void *data, struct zxdg_output_v1 *xdg_output)
> +{
> + struct xwl_output *xwl_output = data;
> +
> + apply_output_change(xwl_output);
> +}
> +
> +static const struct zxdg_output_v1_listener xdg_output_listener = {
> + xdg_output_handle_logical_position,
> + xdg_output_handle_logical_size,
> + xdg_output_handle_done,
> +};
> +
> struct xwl_output *
> xwl_output_create(struct xwl_screen *xwl_screen, uint32_t id)
> {
> @@ -293,6 +343,15 @@ xwl_output_create(struct xwl_screen *xwl_screen, uint32_t id)
> RROutputSetCrtcs(xwl_output->randr_output, &xwl_output->randr_crtc, 1);
> RROutputSetConnection(xwl_output->randr_output, RR_Connected);
>
> + if (xwl_screen->xdg_output_manager) {
> + xwl_output->xdg_output =
> + zxdg_output_manager_v1_get_xdg_output (xwl_screen->xdg_output_manager,
> + xwl_output->output);
> + zxdg_output_v1_add_listener(xwl_output->xdg_output,
> + &xdg_output_listener,
> + xwl_output);
> + }
> +
> return xwl_output;
>
> err:
> diff --git a/hw/xwayland/xwayland.c b/hw/xwayland/xwayland.c
> index cb929cad5..30c99d4d0 100644
> --- a/hw/xwayland/xwayland.c
> +++ b/hw/xwayland/xwayland.c
> @@ -675,6 +675,10 @@ registry_global(void *data, struct wl_registry *registry, uint32_t id,
> if (xwl_output_create(xwl_screen, id))
> xwl_screen->expecting_event++;
> }
> + else if (strcmp(interface, "zxdg_output_manager_v1") == 0) {
> + xwl_screen->xdg_output_manager =
> + wl_registry_bind(registry, id, &wl_shell_interface, 1);
To be more robust, we need to iterate through already created
xwl_output's and get_xdg_output(..);add_listener(...) on those, as we
should not rely on the order of which global objects are advertised.
I think that at least we don't need to wait with doing xwl_output_create
until after, as as far as I can see, we don't roundtrip when creating
the output.
Jonas
> + }
> #ifdef GLAMOR_HAS_GBM
> else if (xwl_screen->glamor &&
> strcmp(interface, "wl_drm") == 0 && version >= 2) {
> diff --git a/hw/xwayland/xwayland.h b/hw/xwayland/xwayland.h
> index 6d3edf33b..8f3992660 100644
> --- a/hw/xwayland/xwayland.h
> +++ b/hw/xwayland/xwayland.h
> @@ -46,6 +46,7 @@
> #include "pointer-constraints-unstable-v1-client-protocol.h"
> #include "tablet-unstable-v2-client-protocol.h"
> #include "xwayland-keyboard-grab-unstable-v1-client-protocol.h"
> +#include "xdg-output-unstable-v1-client-protocol.h"
>
> struct xwl_screen {
> int width;
> @@ -82,6 +83,7 @@ struct xwl_screen {
> struct zwp_relative_pointer_manager_v1 *relative_pointer_manager;
> struct zwp_pointer_constraints_v1 *pointer_constraints;
> struct zwp_xwayland_keyboard_grab_manager_v1 *wp_grab;
> + struct zxdg_output_manager_v1 *xdg_output_manager;
> uint32_t serial;
>
> #define XWL_FORMAT_ARGB8888 (1 << 0)
> @@ -258,6 +260,7 @@ struct xwl_tablet_pad {
> struct xwl_output {
> struct xorg_list link;
> struct wl_output *output;
> + struct zxdg_output_v1 *xdg_output;
> uint32_t server_output_id;
> struct xwl_screen *xwl_screen;
> RROutputPtr randr_output;
> diff --git a/meson.build b/meson.build
> index a36ae9da7..ae65ad2ae 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -98,7 +98,7 @@ if (host_machine.system() != 'darwin' and
>
> xwayland_dep = [
> dependency('wayland-client', version: '>= 1.3.0', required: xwayland_required),
> - dependency('wayland-protocols', version: '>= 1.9.0', required: xwayland_required),
> + dependency('wayland-protocols', version: '>= 1.10.0', required: xwayland_required),
> dependency('libdrm', version: '>= 2.3.1', required: xwayland_required),
> dependency('epoxy', required: xwayland_required),
> ]
> --
> 2.13.3
>
More information about the wayland-devel
mailing list