<div dir="ltr">I'd find it a little bit inconvenient for the title, class, and app-id to be treated as buffered state. They make a great poor-man's way of identifying surfaces for embedded systems that implement simple layer management policies without wholesale adopting IVI shell (whose lack of wl_shell makes it difficult to integrate off-the-rack Wayland libraries and apps). Since the surface title doesn't have anything to do with correct graphical presentation, it'd be nicer if that data is just available immediately to the rest of the shell rather than being something that only trickles in whenever the app happens to post a buffer next.</div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Jul 25, 2017 at 12:17 AM, Jonas Ådahl <span dir="ltr"><<a href="mailto:jadahl@gmail.com" target="_blank">jadahl@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">On Fri, Jul 21, 2017 at 05:21:38PM +0200, Quentin Glidic wrote:<br>
> On 7/20/17 4:33 PM, Matt Hoosier wrote:<br>
> > It's useful for the shell implementation to know when these change,<br>
> > for example to relay the information on to taskbars or similar.<br>
><br>
> The idea is good, we need something like that. (But maybe not, see below).<br>
><br>
><br>
> > To avoid ABI changes or the need to make the weston_desktop_surface<br>
> > definition public, new functions are introduced for attaching<br>
> > listeners to these signals.<br>
><br>
> We don’t care that much about ABI changes, but you’re right that I do care<br>
> about the struct staying private.<br>
><br>
><br>
> > Signed-off-by: Matt Hoosier <<a href="mailto:matt.hoosier@gmail.com">matt.hoosier@gmail.com</a>><br>
> > ---<br>
> >   libweston-desktop/libweston-<wbr>desktop.h |  6 ++++++<br>
> >   libweston-desktop/surface.c           | 21 +++++++++++++++++++++<br>
> >   2 files changed, 27 insertions(+)<br>
> ><br>
> > diff --git a/libweston-desktop/libweston-<wbr>desktop.h b/libweston-desktop/libweston-<wbr>desktop.h<br>
> > index 03b04c7..e38257e 100644<br>
> > --- a/libweston-desktop/libweston-<wbr>desktop.h<br>
> > +++ b/libweston-desktop/libweston-<wbr>desktop.h<br>
> > @@ -164,6 +164,12 @@ weston_desktop_surface_set_<wbr>size(struct weston_desktop_surface *surface,<br>
> >                             int32_t width, int32_t height);<br>
> >   void<br>
> >   weston_desktop_surface_close(<wbr>struct weston_desktop_surface *surface);<br>
> > +void<br>
> > +weston_desktop_surface_add_<wbr>title_listener(struct weston_desktop_surface *surface,<br>
> > +                                     struct wl_listener *listener);<br>
> > +void<br>
> > +weston_desktop_surface_add_<wbr>app_id_listener(struct weston_desktop_surface *surface,<br>
> > +                                      struct wl_listener *listener);<br>
> >   void *<br>
> >   weston_desktop_surface_get_<wbr>user_data(struct weston_desktop_surface *surface);<br>
> > diff --git a/libweston-desktop/surface.c b/libweston-desktop/surface.c<br>
> > index d3be936..97a455c 100644<br>
> > --- a/libweston-desktop/surface.c<br>
> > +++ b/libweston-desktop/surface.c<br>
> > @@ -64,6 +64,8 @@ struct weston_desktop_surface {<br>
> >             char *title;<br>
> >             char *app_id;<br>
> >             pid_t pid;<br>
> > +           struct wl_signal title_signal;<br>
> > +           struct wl_signal app_id_signal;<br>
> >     };<br>
> >     struct {<br>
> >             struct weston_desktop_surface *parent;<br>
> > @@ -287,6 +289,9 @@ weston_desktop_surface_create(<wbr>struct weston_desktop *desktop,<br>
> >     wl_list_init(&surface->view_<wbr>list);<br>
> >     wl_list_init(&surface->grab_<wbr>link);<br>
> > +   wl_signal_init(&surface-><wbr>title_signal);<br>
> > +   wl_signal_init(&surface->app_<wbr>id_signal);<br>
> > +<br>
> >     return surface;<br>
> >   }<br>
> > @@ -511,6 +516,20 @@ weston_desktop_surface_close(<wbr>struct weston_desktop_surface *surface)<br>
> >                                            surface->implementation_data);<br>
> >   }<br>
> > +WL_EXPORT void<br>
> > +weston_desktop_surface_add_<wbr>title_listener(struct weston_desktop_surface *surface,<br>
> > +                                     struct wl_listener *listener)<br>
> > +{<br>
> > +   wl_signal_add(&surface->title_<wbr>signal, listener);<br>
> > +}<br>
> > +<br>
> > +WL_EXPORT void<br>
> > +weston_desktop_surface_add_<wbr>app_id_listener(struct weston_desktop_surface *surface,<br>
> > +                                      struct wl_listener *listener)<br>
> > +{<br>
> > +   wl_signal_add(&surface->app_<wbr>id_signal, listener);<br>
> > +}<br>
> > +<br>
> >   struct weston_desktop_surface *<br>
> >   weston_desktop_surface_from_<wbr>client_link(struct wl_list *link)<br>
> >   {<br>
> > @@ -687,6 +706,7 @@ weston_desktop_surface_set_<wbr>title(struct weston_desktop_surface *surface,<br>
> >     free(surface->title);<br>
> >     surface->title = tmp;<br>
> > +   wl_signal_emit(&surface-><wbr>title_signal, surface->title);<br>
><br>
> I would rather pass the surface as the signal data. Just in case we have in<br>
> the future a value that doesn’t fit in a pointer. And calling a getter is<br>
> not that bad.<br>
><br>
> Also, I prefer to have one signal only, it would reduce the API size (and<br>
> avoid it growing too much in the future, since it could work in this case).<br>
> We can move the free() to keep both pointer around until after the signal<br>
> fired, and a simple pointer comparison will work (if you stored the "const<br>
> char *" directly, which you should as with the signal, we guarantee it will<br>
> exist until destroy or signal).<br>
><br>
><br>
> But it raised a question : Jonas, are set_title() and set_app_id() supposed<br>
> to be active without a commit()?<br>
<br>
</div></div>No. As per specification they are not tied to wl_surface.commit(). I<br>
suppose it is something we can change though, while we can, if it makes<br>
any sense. Opinions?<br>
<span class="HOEnZb"><font color="#888888"><br>
<br>
Jonas<br>
</font></span></blockquote></div><br></div>