On Thu, Apr 09, 2015 at 06:23:51PM +0200, Manuel Bachmann wrote:
> Whenever a shell surface is created, a corresponding
> managed_surface object will be created and tracked down
> down at the shell client level.
> 
> Every valid call to xdg_surface_set_title(),
> xdg_surface_present() or xdg_surface_present_from_event()
> will now fire the corresponding events ; managed_surface
> _activate() is also implemented but unused for now.

You might also include in the CL entry an explanation of what this is
for, and perhaps a pointer to the present() docs.
 
> Signed-off-by: Manuel Bachmann <[email protected]>
> ---
>  clients/desktop-shell.c | 33 +++++++++++++++++++++++++++++++++
>  desktop-shell/shell.c   | 39 +++++++++++++++++++++++++++++++++++++++
>  2 files changed, 72 insertions(+)
> 
> diff --git a/clients/desktop-shell.c b/clients/desktop-shell.c
> index c5baf52..3c63c28 100644
> --- a/clients/desktop-shell.c
> +++ b/clients/desktop-shell.c
> @@ -56,6 +56,7 @@ struct desktop {
>       struct unlock_dialog *unlock_dialog;
>       struct task unlock_task;
>       struct wl_list outputs;
> +     struct wl_list managed_surfaces;
>  
>       struct window *grab_window;
>       struct widget *grab_widget;
> @@ -68,6 +69,12 @@ struct desktop {
>       int painted;
>  };
>  
> +struct desktop_managed_surface {
> +     struct managed_surface *managed_surface;
> +     char *title;
> +     struct wl_list link;
> +};
> +
>  struct surface {
>       void (*configure)(void *data,
>                         struct desktop_shell *desktop_shell,
> @@ -952,12 +959,25 @@ managed_surface_title_changed(void *data,
>                             struct managed_surface *managed_surface,
>                             const char *title)
>  {
> +     struct desktop_managed_surface *mgsurf = data;
> +
> +     if (mgsurf->title)
> +             free(mgsurf->title);

The if check here (and elsewhere) is unnecessary; free(NULL) is a no-op.

> +     mgsurf->title = (title) ? xstrdup(title) : NULL;
>  }
>  
>  static void
>  managed_surface_removed(void *data,
>                       struct managed_surface *managed_surface)
>  {
> +     struct desktop_managed_surface *mgsurf = data;
> +
> +     if (mgsurf->title)
> +             free(mgsurf->title);
> +     wl_list_remove(&mgsurf->link);
> +     free(mgsurf);
> +
>       managed_surface_destroy(managed_surface);
>  }
>  
> @@ -1050,6 +1070,18 @@ desktop_shell_add_managed_surface(void *data,
>                                 struct managed_surface *managed_surface,
>                                 const char *title)
>  {
> +     struct desktop *desktop = data;
> +     struct desktop_managed_surface *mgsurf;
> +
> +     mgsurf = xzalloc(sizeof *mgsurf);
> +     mgsurf->managed_surface = managed_surface;
> +     mgsurf->title = (title) ? xstrdup(title) : NULL;
> +
> +     wl_list_insert(desktop->managed_surfaces.prev, &mgsurf->link);
> +
> +     managed_surface_add_listener(managed_surface,
> +                                  &managed_surface_listener,
> +                                  mgsurf);
>  }
>  
>  static const struct desktop_shell_listener listener = {
> @@ -1367,6 +1399,7 @@ int main(int argc, char *argv[])
>  
>       desktop.unlock_task.run = unlock_dialog_finish;
>       wl_list_init(&desktop.outputs);
> +     wl_list_init(&desktop.managed_surfaces);
>  
>       config_file = weston_config_get_name_from_env();
>       desktop.config = weston_config_parse(config_file);
> diff --git a/desktop-shell/shell.c b/desktop-shell/shell.c
> index e48d63d..7263044 100644
> --- a/desktop-shell/shell.c
> +++ b/desktop-shell/shell.c
> @@ -105,6 +105,7 @@ struct shell_client;
>  
>  struct shell_surface {
>       struct wl_resource *resource;
> +     struct wl_resource *managed_surface;
>       struct wl_signal destroy_signal;
>       struct shell_client *owner;
>  
> @@ -2249,6 +2250,8 @@ set_title(struct shell_surface *shsurf, const char 
> *title)
>       free(shsurf->title);
>       shsurf->title = strdup(title);
>       shsurf->surface->timeline.force_refresh = 1;
> +
> +     managed_surface_send_title_changed(shsurf->managed_surface, title);
>  }
>  
>  static void
> @@ -2681,6 +2684,16 @@ set_minimized(struct weston_surface *surface)
>  }
>  
>  static void
> +present(struct shell_surface *shsurf,
> +     bool from_event, uint32_t serial)
> +{
> +     if (shsurf->type == SHELL_SURFACE_TOPLEVEL)
> +             managed_surface_send_presented(shsurf->managed_surface);
> +
> +     /* TODO: handle the "from_event()"-with-serial case */
> +}
> +
> +static void
>  shell_surface_set_maximized(struct wl_client *client,
>                              struct wl_resource *resource,
>                              struct wl_resource *output_resource)
> @@ -3512,6 +3525,13 @@ static void
>  managed_surface_activate(struct wl_client *client,
>                        struct wl_resource *resource)
>  {
> +     struct shell_surface *shsurf = wl_resource_get_user_data(resource);
> +     struct desktop_shell *shell = shell_surface_get_shell(shsurf);
> +     struct weston_compositor *compositor = shell->compositor;
> +     struct weston_seat *seat;       
> +
> +     wl_list_for_each(seat, &compositor->seat_list, link)
> +             activate(shell, shsurf->surface, seat, true);
>  }
>  
>  static void
> @@ -3533,6 +3553,8 @@ destroy_shell_surface(struct shell_surface *shsurf)
>  
>       wl_signal_emit(&shsurf->destroy_signal, shsurf);
>  
> +     managed_surface_send_removed(shsurf->managed_surface);
> +
>       if (!wl_list_empty(&shsurf->popup.grab_link)) {
>               remove_popup_grab(shsurf);
>       }
> @@ -3635,6 +3657,7 @@ create_common_surface(struct shell_client *owner, void 
> *shell,
>                     const struct weston_shell_client *client)
>  {
>       struct shell_surface *shsurf;
> +     struct wl_client *shell_client;
>  
>       assert(surface->configure == NULL);
>  
> @@ -3673,6 +3696,16 @@ create_common_surface(struct shell_client *owner, void 
> *shell,
>  
>       shsurf->output = get_default_output(shsurf->shell->compositor);
>  
> +     shell_client = 
> wl_resource_get_client(shsurf->shell->child.desktop_shell);
> +     shsurf->managed_surface = wl_resource_create(shell_client,
> +                                             &managed_surface_interface, 1, 
> 0);
> +     wl_resource_set_implementation(shsurf->managed_surface,
> +                                    &managed_surface_implementation,
> +                                    shsurf, NULL);
> +     
> desktop_shell_send_add_managed_surface(shsurf->shell->child.desktop_shell,
> +                                            shsurf->managed_surface,
> +                                            shsurf->title);
> +
>       wl_signal_init(&shsurf->destroy_signal);
>       shsurf->surface_destroy_listener.notify = shell_handle_surface_destroy;
>       wl_signal_add(&surface->destroy_signal,
> @@ -3945,6 +3978,9 @@ static void
>  xdg_surface_present(struct wl_client *client,
>                   struct wl_resource *resource)
>  {
> +     struct shell_surface *shsurf = wl_resource_get_user_data(resource);
> +
> +     present(shsurf, false, 0);
>  }
>  
>  static void
> @@ -3952,6 +3988,9 @@ xdg_surface_present_from_event(struct wl_client *client,
>                              struct wl_resource *resource,
>                              uint32_t serial)
>  {
> +     struct shell_surface *shsurf = wl_resource_get_user_data(resource);
> +
> +     present(shsurf, true, serial);
>  }
>  
>  static const struct xdg_surface_interface xdg_surface_implementation = {
> -- 
> 1.8.3.1
> 
> _______________________________________________
> wayland-devel mailing list
> [email protected]
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
_______________________________________________
wayland-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to