On 21.11.2016 18:42, Armin Krezović wrote:
> v2:
> 
>  - Keep wl_shell code around until xdg_shell is declared stable.
> 
> Signed-off-by: Armin Krezović <[email protected]>

I hereby agree that the following changes can be merged as part of this patch:

https://phabricator.freedesktop.org/P6

> ---
>  Makefile.am                    |   8 ++-
>  libweston/compositor-wayland.c | 146 
> +++++++++++++++++++++++++++++++++++++----
>  2 files changed, 139 insertions(+), 15 deletions(-)
> 
> diff --git a/Makefile.am b/Makefile.am
> index b08ce71..b90c4c8 100644
> --- a/Makefile.am
> +++ b/Makefile.am
> @@ -391,9 +391,11 @@ wayland_backend_la_CFLAGS =                      \
>       $(CAIRO_CFLAGS)                         \
>       $(WAYLAND_COMPOSITOR_CFLAGS)            \
>       $(AM_CFLAGS)
> -wayland_backend_la_SOURCES =                         \
> -     libweston/compositor-wayland.c          \
> -     libweston/compositor-wayland.h          \
> +wayland_backend_la_SOURCES =                                         \
> +     libweston/compositor-wayland.c                          \
> +     libweston/compositor-wayland.h                          \
> +     protocol/xdg-shell-unstable-v6-protocol.c               \
> +     protocol/xdg-shell-unstable-v6-client-protocol.h        \
>       shared/helpers.h
>  nodist_wayland_backend_la_SOURCES =                  \
>       protocol/fullscreen-shell-unstable-v1-protocol.c                \
> diff --git a/libweston/compositor-wayland.c b/libweston/compositor-wayland.c
> index 775da25..6ac11eb 100644
> --- a/libweston/compositor-wayland.c
> +++ b/libweston/compositor-wayland.c
> @@ -51,6 +51,7 @@
>  #include "shared/os-compatibility.h"
>  #include "shared/cairo-util.h"
>  #include "fullscreen-shell-unstable-v1-client-protocol.h"
> +#include "xdg-shell-unstable-v6-client-protocol.h"
>  #include "presentation-time-server-protocol.h"
>  #include "linux-dmabuf.h"
>  #include "windowed-output-api.h"
> @@ -66,6 +67,7 @@ struct wayland_backend {
>               struct wl_registry *registry;
>               struct wl_compositor *compositor;
>               struct wl_shell *shell;
> +             struct zxdg_shell_v6 *xdg_shell;
>               struct zwp_fullscreen_shell_v1 *fshell;
>               struct wl_shm *shm;
>  
> @@ -98,7 +100,10 @@ struct wayland_output {
>               uint32_t global_id;
>  
>               struct wl_shell_surface *shell_surface;
> +             struct zxdg_surface_v6 *xdg_surface;
> +             struct zxdg_toplevel_v6 *xdg_toplevel;
>               int configure_width, configure_height;
> +             bool wait_for_configure;
>       } parent;
>  
>       int keyboard_count;
> @@ -623,6 +628,12 @@ wayland_output_repaint_pixman(struct weston_output 
> *output_base,
>  static void
>  wayland_backend_destroy_output_surface(struct wayland_output *output)
>  {
> +     if (output->parent.xdg_toplevel)
> +             zxdg_toplevel_v6_destroy(output->parent.xdg_toplevel);
> +
> +     if (output->parent.xdg_surface)
> +             zxdg_surface_v6_destroy(output->parent.xdg_surface);
> +
>       if (output->parent.shell_surface)
>               wl_shell_surface_destroy(output->parent.shell_surface);
>  
> @@ -822,6 +833,9 @@ wayland_output_set_windowed(struct wayland_output *output)
>               title = strdup(WINDOW_TITLE);
>       }
>  
> +     if (output->parent.xdg_toplevel)
> +             zxdg_toplevel_v6_set_title(output->parent.xdg_toplevel, title);
> +
>       if (!b->theme) {
>               b->theme = theme_create();
>               if (!b->theme) {
> @@ -840,7 +854,8 @@ wayland_output_set_windowed(struct wayland_output *output)
>  
>       wayland_output_resize_surface(output);
>  
> -     wl_shell_surface_set_toplevel(output->parent.shell_surface);
> +     if (output->parent.shell_surface)
> +             wl_shell_surface_set_toplevel(output->parent.shell_surface);
>  
>       return 0;
>  }
> @@ -860,7 +875,9 @@ wayland_output_set_fullscreen(struct wayland_output 
> *output,
>  
>       wayland_output_resize_surface(output);
>  
> -     if (output->parent.shell_surface) {
> +     if (output->parent.xdg_toplevel) {
> +             zxdg_toplevel_v6_set_fullscreen(output->parent.xdg_toplevel, 
> target);
> +     } else if (output->parent.shell_surface) {
>               wl_shell_surface_set_fullscreen(output->parent.shell_surface,
>                                               method, framerate, target);
>       } else if (b->parent.fshell) {
> @@ -961,7 +978,7 @@ wayland_output_switch_mode(struct weston_output 
> *output_base,
>  
>       b = to_wayland_backend(output_base->compositor);
>  
> -     if (output->parent.shell_surface || !b->parent.fshell)
> +     if (output->parent.xdg_surface || output->parent.shell_surface || 
> !b->parent.fshell)
>               return -1;
>  
>       mode = wayland_output_choose_mode(output, mode);
> @@ -1033,6 +1050,41 @@ err_output:
>       return -1;
>  }
>  
> +static void
> +handle_xdg_surface_configure(void *data, struct zxdg_surface_v6 *surface,
> +                      uint32_t serial)
> +{
> +     zxdg_surface_v6_ack_configure(surface, serial);
> +}
> +
> +static const struct zxdg_surface_v6_listener xdg_surface_listener = {
> +     handle_xdg_surface_configure
> +};
> +
> +static void
> +handle_xdg_toplevel_configure(void *data, struct zxdg_toplevel_v6 *toplevel,
> +                       int32_t width, int32_t height,
> +                       struct wl_array *states)
> +{
> +     struct wayland_output *output = data;
> +
> +     output->parent.configure_width = width;
> +     output->parent.configure_height = height;
> +
> +     output->parent.wait_for_configure = false;
> +     /* FIXME: implement resizing */
> +}
> +
> +static void
> +handle_xdg_toplevel_close(void *data, struct zxdg_toplevel_v6 *xdg_toplevel)
> +{
> +}
> +
> +static const struct zxdg_toplevel_v6_listener xdg_toplevel_listener = {
> +     handle_xdg_toplevel_configure,
> +     handle_xdg_toplevel_close,
> +};
> +
>  static int
>  wayland_backend_create_output_surface(struct wayland_output *output)
>  {
> @@ -1047,7 +1099,40 @@ wayland_backend_create_output_surface(struct 
> wayland_output *output)
>  
>       output->parent.draw_initial_frame = true;
>  
> -     if (b->parent.shell) {
> +     if (b->parent.xdg_shell) {
> +             output->parent.xdg_surface =
> +                     zxdg_shell_v6_get_xdg_surface(b->parent.xdg_shell,
> +                                                   output->parent.surface);
> +             if (!output->parent.xdg_surface) {
> +                     wl_surface_destroy(output->parent.surface);
> +                     return -1;
> +             }
> +
> +             zxdg_surface_v6_add_listener(output->parent.xdg_surface,
> +                                          &xdg_surface_listener, output);
> +
> +             output->parent.xdg_toplevel =
> +                     
> zxdg_surface_v6_get_toplevel(output->parent.xdg_surface);
> +
> +             if (!output->parent.xdg_toplevel) {
> +                     zxdg_surface_v6_destroy(output->parent.xdg_surface);
> +                     wl_surface_destroy(output->parent.surface);
> +                     return -1;
> +             }
> +
> +             zxdg_toplevel_v6_add_listener(output->parent.xdg_toplevel,
> +                                           &xdg_toplevel_listener, output);
> +
> +             wl_surface_commit(output->parent.surface);
> +
> +             output->parent.wait_for_configure = true;
> +
> +             while (output->parent.wait_for_configure)
> +                     wl_display_dispatch(b->parent.wl_display);
> +
> +             weston_log("wayland-backend: Using xdg_shell_v6\n");
> +     }
> +     else if (b->parent.shell) {
>               output->parent.shell_surface =
>                       wl_shell_get_shell_surface(b->parent.shell,
>                                                  output->parent.surface);
> @@ -1058,6 +1143,8 @@ wayland_backend_create_output_surface(struct 
> wayland_output *output)
>  
>               wl_shell_surface_add_listener(output->parent.shell_surface,
>                                             &shell_surface_listener, output);
> +
> +             weston_log("wayland-backend: Using wl_shell\n");
>       }
>  
>       return 0;
> @@ -1107,7 +1194,11 @@ wayland_output_enable(struct weston_output *base)
>                                             
> WL_SHELL_SURFACE_FULLSCREEN_METHOD_DRIVER,
>                                             output->mode.refresh, 
> output->parent.output);
>  
> -             if (output->parent.shell_surface) {
> +             if (output->parent.xdg_toplevel) {
> +                     
> zxdg_toplevel_v6_set_fullscreen(output->parent.xdg_toplevel,
> +                                                     output->parent.output);
> +             }
> +             else if (output->parent.shell_surface) {
>                       
> wl_shell_surface_set_fullscreen(output->parent.shell_surface,
>                                                       
> WL_SHELL_SURFACE_FULLSCREEN_METHOD_DRIVER,
>                                                       output->mode.refresh, 
> output->parent.output);
> @@ -1285,9 +1376,14 @@ wayland_output_create_fullscreen(struct 
> wayland_backend *b)
>               goto err_surface;
>  
>       /* What should size be set if conditional is false? */
> -     if (b->parent.shell) {
> -             wl_shell_surface_set_fullscreen(output->parent.shell_surface,
> -                                             0, 0, NULL);
> +     if (b->parent.xdg_shell || b->parent.shell) {
> +             if (output->parent.xdg_toplevel)
> +                     
> zxdg_toplevel_v6_set_fullscreen(output->parent.xdg_toplevel,
> +                                                     output->parent.output);
> +             else if (output->parent.shell_surface)
> +                     
> wl_shell_surface_set_fullscreen(output->parent.shell_surface,
> +                                                     0, 0, NULL);
> +
>               wl_display_roundtrip(b->parent.wl_display);
>  
>               width = output->parent.configure_width;
> @@ -1504,9 +1600,12 @@ input_handle_button(void *data, struct wl_pointer 
> *pointer,
>                                               button, state);
>  
>               if (frame_status(input->output->frame) & FRAME_STATUS_MOVE) {
> -
> -                     
> wl_shell_surface_move(input->output->parent.shell_surface,
> +                     if (input->output->parent.xdg_toplevel)
> +                             
> zxdg_toplevel_v6_move(input->output->parent.xdg_toplevel,
>                                             input->parent.seat, serial);
> +                     else if (input->output->parent.shell_surface)
> +                             
> wl_shell_surface_move(input->output->parent.shell_surface,
> +                                                   input->parent.seat, 
> serial);
>                       frame_status_clear(input->output->frame,
>                                          FRAME_STATUS_MOVE);
>                       return;
> @@ -1835,8 +1934,12 @@ input_handle_touch_down(void *data, struct wl_touch 
> *wl_touch,
>  
>               if (first_touch && (frame_status(output->frame) & 
> FRAME_STATUS_MOVE)) {
>                       input->touch_points--;
> -                     wl_shell_surface_move(output->parent.shell_surface,
> -                                           input->parent.seat, serial);
> +                     if (output->parent.xdg_toplevel)
> +                             
> zxdg_toplevel_v6_move(output->parent.xdg_toplevel,
> +                                                   input->parent.seat, 
> serial);
> +                     else if (output->parent.shell_surface)
> +                             
> wl_shell_surface_move(output->parent.shell_surface,
> +                                                   input->parent.seat, 
> serial);
>                       frame_status_clear(output->frame,
>                                          FRAME_STATUS_MOVE);
>                       return;
> @@ -2164,6 +2267,16 @@ wayland_parent_output_destroy(struct 
> wayland_parent_output *output)
>  }
>  
>  static void
> +xdg_shell_ping(void *data, struct zxdg_shell_v6 *shell, uint32_t serial)
> +{
> +     zxdg_shell_v6_pong(shell, serial);
> +}
> +
> +static const struct zxdg_shell_v6_listener xdg_shell_listener = {
> +     xdg_shell_ping,
> +};
> +
> +static void
>  registry_handle_global(void *data, struct wl_registry *registry, uint32_t 
> name,
>                      const char *interface, uint32_t version)
>  {
> @@ -2173,6 +2286,12 @@ registry_handle_global(void *data, struct wl_registry 
> *registry, uint32_t name,
>               b->parent.compositor =
>                       wl_registry_bind(registry, name,
>                                        &wl_compositor_interface, 1);
> +     } else if (strcmp(interface, "zxdg_shell_v6") == 0) {
> +             b->parent.xdg_shell =
> +                     wl_registry_bind(registry, name,
> +                                      &zxdg_shell_v6_interface, 1);
> +             zxdg_shell_v6_add_listener(b->parent.xdg_shell,
> +                                        &xdg_shell_listener, b);
>       } else if (strcmp(interface, "wl_shell") == 0) {
>               b->parent.shell =
>                       wl_registry_bind(registry, name,
> @@ -2249,6 +2368,9 @@ wayland_destroy(struct weston_compositor *ec)
>       if (b->parent.shm)
>               wl_shm_destroy(b->parent.shm);
>  
> +     if (b->parent.shell)
> +             zxdg_shell_v6_destroy(b->parent.xdg_shell);
> +
>       if (b->parent.fshell)
>               zwp_fullscreen_shell_v1_release(b->parent.fshell);
>  
> 


Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
wayland-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to