[PATCH weston 8/14] ivi-shell: added libweston-desktop-api implementation
Quentin Glidic
sardemff7+wayland at sardemff7.net
Tue Oct 17 11:20:12 UTC 2017
Hi,
I will limit my review to the libweston-desktop usage, as it’s the only
part I know.
On 10/17/17 11:59 AM, Michael Teyfel wrote:
> Signed-off-by: Michael Teyfel <mteyfel at de.adit-jv.com>
> ---
> ivi-shell/ivi-shell.c | 172 ++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 172 insertions(+)
>
> diff --git a/ivi-shell/ivi-shell.c b/ivi-shell/ivi-shell.c
> index 84db2c9..049aa43 100644
> --- a/ivi-shell/ivi-shell.c
> +++ b/ivi-shell/ivi-shell.c
> @@ -490,6 +490,178 @@ shell_add_bindings(struct weston_compositor *compositor,
> }
>
> /*
> + * libweston-desktop
> + */
> +
> +static void
> +desktop_surface_ping_timeout(struct weston_desktop_client *client,
> + void *user_data)
> +{
> + weston_log("ivi-shell: desktop_surface_ping_timeout is not supported\n");
You can just let these functions to NULL, if you want, as only
surface_added and surface_removed are mandatory.
> +}
> +
> +static void
> +desktop_surface_pong(struct weston_desktop_client *client,
> + void *user_data)
> +{
> + weston_log("ivi-shell: desktop_surface_pong is not supported\n");
> +}
> +
> +static void
> +desktop_surface_added(struct weston_desktop_surface *surface,
> + void *user_data)
> +{
> + struct ivi_shell *shell = (struct ivi_shell *) user_data;
> + struct ivi_layout_surface *layout_surface;
> + struct ivi_shell_surface *ivisurf;
> + struct weston_surface *weston_surf =
> + weston_desktop_surface_get_surface(surface);
> +
> + layout_surface = ivi_layout_desktop_surface_create(weston_surf,
> + IVI_INVALID_ID);
> + if (!layout_surface) {
> + return;
> + }
> +
> + layout_surface->weston_desktop_surface = surface;
> +
> + ivisurf = zalloc(sizeof *ivisurf);
> + if (!ivisurf) {
> + return;
> + }
> +
> + wl_list_init(&ivisurf->link);
> + wl_list_insert(&shell->ivi_surface_list, &ivisurf->link);
> +
> + ivisurf->shell = shell;
> + ivisurf->id_surface = IVI_INVALID_ID;
> +
> + ivisurf->width = 0;
> + ivisurf->height = 0;
> + ivisurf->layout_surface = layout_surface;
> + ivisurf->surface = weston_surf;
Here, you have a big issue. libweston-desktop handles popups internally,
but to do that, it needs to know when you create a view for a toplevel
surface. This is done via weston_desktop_surface_create_view(), which
you never call (I traced the full call stack to ivi_view_create()).
One solution is to change ivi_view_create() to check for
weston_surface_is_desktop_surface(), and calling
weston_desktop_surface_create_view() instead of weston_view_create() in
this case.
> +}
> +
> +static void
> +desktop_surface_removed(struct weston_desktop_surface *surface,
> + void *user_data)
> +{
> + struct ivi_shell *shell = (struct ivi_shell *) user_data;
> + struct ivi_shell_surface *ivisurf = NULL;
> +
> + wl_list_for_each(ivisurf, &shell->ivi_surface_list, link) {
> + if(ivisurf->layout_surface->weston_desktop_surface == surface)
This loop (and the same in committed) are not needed. Just use
weston_desktop_surface_set_user_data(surface, ivisurf); in surface_added
and use get_user_data() in other callbacks. you can check for NULL since
you have 1 code path that may let it NULL, but otherwise, surface_added
is guaranteed to be call before any other callback.
Thanks,
> + {
> + assert(ivisurf != NULL);
> +
> + if (ivisurf->layout_surface)
> + layout_surface_cleanup(ivisurf);
> +
> + break;
> + }
> + }
> +}
> +
> +static void
> +desktop_surface_committed(struct weston_desktop_surface *surface,
> + int32_t sx, int32_t sy, void *user_data)
> +{
> + struct ivi_shell_surface *ivisurf = NULL;
> + struct ivi_shell *shell = user_data;
> + struct weston_surface *weston_surf =
> + weston_desktop_surface_get_surface(surface);
> + int found = 0;
> +
> + wl_list_for_each(ivisurf, &shell->ivi_surface_list, link) {
> + if (ivisurf->surface == weston_surf) {
> + found = 1;
> + break;
> + }
> + }
> +
> + if(!found)
> + return;
> +
> + if (weston_surf->width == 0 || weston_surf->height == 0)
> + return;
> +
> + if (ivisurf->width != weston_surf->width ||
> + ivisurf->height != weston_surf->height) {
> + ivisurf->width = weston_surf->width;
> + ivisurf->height = weston_surf->height;
> +
> + ivi_layout_desktop_surface_configure(ivisurf->layout_surface,
> + weston_surf->width,
> + weston_surf->height);
> + }
> +}
> +
> +static void
> +desktop_surface_move(struct weston_desktop_surface *surface,
> + struct weston_seat *seat, uint32_t serial, void *user_data)
> +{
> + weston_log("ivi-shell: desktop_surface_move is not supported\n");
> +}
> +
> +static void
> +desktop_surface_resize(struct weston_desktop_surface *surface,
> + struct weston_seat *seat, uint32_t serial,
> + enum weston_desktop_surface_edge edges, void *user_data)
> +{
> + weston_log("ivi-shell: desktop_surface_resize is not supported\n");
> +}
> +
> +static void
> +desktop_surface_fullscreen_requested(struct weston_desktop_surface *surface,
> + bool fullscreen,
> + struct weston_output *output,
> + void *user_data)
> +{
> + weston_log("ivi-shell: desktop_surface_fullscreen_requested is not supported\n");
> +}
> +
> +static void
> +desktop_surface_maximized_requested(struct weston_desktop_surface *surface,
> + bool maximized, void *user_data)
> +{
> + weston_log("ivi-shell: desktop_surface_maximized_requested is not supported\n");
> +}
> +
> +static void
> +desktop_surface_minimized_requested(struct weston_desktop_surface *surface,
> + void *user_data)
> +{
> + weston_log("ivi-shell: desktop_surface_minimized_requested is not supported\n");
> +}
> +
> +static void
> +desktop_surface_set_xwayland_position(struct weston_desktop_surface *surface,
> + int32_t x, int32_t y, void *user_data)
> +{
> + weston_log("ivi-shell: desktop_surface_set_xwayland_position is not supported\n");
> +}
> +
> +static const struct weston_desktop_api shell_desktop_api = {
> + .struct_size = sizeof(struct weston_desktop_api),
> + .ping_timeout = desktop_surface_ping_timeout,
> + .pong = desktop_surface_pong,
> + .surface_added = desktop_surface_added,
> + .surface_removed = desktop_surface_removed,
> + .committed = desktop_surface_committed,
> +
> + .move = desktop_surface_move,
> + .resize = desktop_surface_resize,
> + .fullscreen_requested = desktop_surface_fullscreen_requested,
> + .maximized_requested = desktop_surface_maximized_requested,
> + .minimized_requested = desktop_surface_minimized_requested,
> + .set_xwayland_position = desktop_surface_set_xwayland_position,
> +};
> +
> +/*
> + * end of libweston-desktop
> + */
> +
> +/*
> * Initialization of ivi-shell.
> */
> WL_EXPORT int
>
--
Quentin “Sardem FF7” Glidic
More information about the wayland-devel
mailing list