<div dir="ltr"><div dir="ltr"><div dir="ltr">Hi Dorota!</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, Oct 16, 2019 at 11:16 AM Dorota Czaplejewicz <<a href="mailto:dorota.czaplejewicz@puri.sm" target="_blank">dorota.czaplejewicz@puri.sm</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">On Wed, 16 Oct 2019 10:43:00 +0200<br>
Carlos Garnacho <<a href="mailto:carlosg@gnome.org" target="_blank">carlosg@gnome.org</a>> wrote:<br>
<br>
> This protocol takes over 3 different, but interrelated aspects of<br>
> DE/client interaction:<br>
> - Startup notification: presenting feedback about applications<br>
>   being launched, either through the compositor or another client<br>
> - Focus stealing prevention: letting the compositor figure out<br>
>   whether immediately switching focus to a surface makes sense.<br>
> - Window raising/activation: allowing existing clients to request<br>
>   focus in a controlled manner.<br>
> <br>
> Signed-off-by: Carlos Garnacho <<a href="mailto:carlosg@gnome.org" target="_blank">carlosg@gnome.org</a>><br>
> ---<br>
>  Makefile.am                                   |   1 +<br>
>  unstable/presentation/README                  |   5 +<br>
>  .../presentation/presentation-unstable-v1.xml | 175 ++++++++++++++++++<br>
>  3 files changed, 181 insertions(+)<br>
>  create mode 100644 unstable/presentation/README<br>
>  create mode 100644 unstable/presentation/presentation-unstable-v1.xml<br>
> <br>
> diff --git a/Makefile.am b/Makefile.am<br>
> index d2c89a8..bd0e52d 100644<br>
> --- a/Makefile.am<br>
> +++ b/Makefile.am<br>
> @@ -24,6 +24,7 @@ unstable_protocols =                                                                \<br>
>       unstable/xdg-decoration/xdg-decoration-unstable-v1.xml  \<br>
>       unstable/linux-explicit-synchronization/linux-explicit-synchronization-unstable-v1.xml \<br>
>       unstable/primary-selection/primary-selection-unstable-v1.xml            \<br>
> +     unstable/presentation/presentation-unstable-v1.xml                      \<br>
>       $(NULL)<br>
>  <br>
>  stable_protocols =                                                           \<br>
> diff --git a/unstable/presentation/README b/unstable/presentation/README<br>
> new file mode 100644<br>
> index 0000000..5a77e97<br>
> --- /dev/null<br>
> +++ b/unstable/presentation/README<br>
> @@ -0,0 +1,5 @@<br>
> +Presentation protocol<br>
> +<br>
> +Maintainers:<br>
> +Carlos Garnacho <<a href="mailto:carlosg@gnome.org" target="_blank">carlosg@gnome.org</a>><br>
> +<br>
> diff --git a/unstable/presentation/presentation-unstable-v1.xml b/unstable/presentation/presentation-unstable-v1.xml<br>
> new file mode 100644<br>
> index 0000000..84bf961<br>
> --- /dev/null<br>
> +++ b/unstable/presentation/presentation-unstable-v1.xml<br>
> @@ -0,0 +1,175 @@<br>
> +<?xml version="1.0" encoding="UTF-8"?><br>
> +<protocol name="presentation_v1"><br>
> +  <copyright><br>
> +    Copyright 2018-2019 © Red Hat, Inc.<br>
> +<br>
> +    Permission is hereby granted, free of charge, to any person<br>
> +    obtaining a copy of this software and associated documentation files<br>
> +    (the "Software"), to deal in the Software without restriction,<br>
> +    including without limitation the rights to use, copy, modify, merge,<br>
> +    publish, distribute, sublicense, and/or sell copies of the Software,<br>
> +    and to permit persons to whom the Software is furnished to do so,<br>
> +    subject to the following conditions:<br>
> +<br>
> +    The above copyright notice and this permission notice (including the<br>
> +    next paragraph) shall be included in all copies or substantial<br>
> +    portions of the Software.<br>
> +<br>
> +    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,<br>
> +    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF<br>
> +    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND<br>
> +    NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS<br>
> +    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN<br>
> +    ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN<br>
> +    CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE<br>
> +    SOFTWARE.<br>
> +  </copyright><br>
> +<br>
> +  <description summary="Presentation request protocol"><br>
> +    This description provides a high-level overview of the interplay between<br>
> +    the interfaces defined this protocol. For details, see the protocol<br>
> +    specification.<br>
> +<br>
> +    The finality of the protocol is defining a compositor context for<br>
> +    surfaces requesting to be presented. Presentation requests are usually<br>
> +    initiated by an existing surface, and acknowledged by a surface being<br>
> +    mapped. By having both ends talk with the compositor through this protocol,<br>
> +    the compositor has the information to implement different commonplace<br>
> +    policies:<br>
<br>
Why does a presentation request have to come from a surface? I would expect that, similarly to creating a surface, presenting it would not require anything but a client (and maybe even no specific client) at least in the case of startup notification.<br></blockquote><div><br></div><div>Wrt the startup notification aspect of this protocol, the reasoning was that the spawning of UI-less processes (wayland clients or not) is rarely worth UI feedback. I think my reasoning makes sense, but perhaps there's some usecase I missed?</div><div><br></div><div>However, the other aspects (activation, focus stealing prevention) do require a surface, so if the consensus is that we shouldn't do that for startup notification, should probably be split somehow.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">
<br>
> +<br>
> +    - Startup notification: The compositor may track wp_presenter interfaces<br>
> +      being created from the launcher side, and replied upon on the launchee<br>
> +      side. Compositors may also perform the application launcher role<br>
> +      themselves.<br>
> +<br>
> +    - Focus stealing prevention: The compositor may know whether there is<br>
> +      recent user input that happened after the presentation request, and<br>
> +      ensure no disruptions happen.<br>
> +<br>
> +    - Window raising/activation: The presented surface may be another previously<br>
> +      existing one, which might require bringing it to focus.<br>
<br>
"may be another" - is there a word like "related to" missing?<br></blockquote><div><br></div><div>Bad wording... "The surface being presented may already exist and be mapped, which might require bringing it to focus." sounds better?</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">
<br>
> +<br>
> +    A client that wishes to present another surface (of its own or from another<br>
> +    client) will call wp_presentation_manager.create_presenter to create a<br>
> +    presentation request. Compositors may use this object to track the source of<br>
> +    the request in order to apply its policies when mapping the surface or<br>
> +    bringing an existing one to focus.<br>
> +<br>
> +    In the presented surface side, the request token will be notified upon<br>
> +    through the wp_presentation_manager.acknowledge request. The method to pass<br>
> +    the token across clients is considered an implementation detail, and is<br>
> +    explicitly not observed here.<br>
> +<br>
> +    Upon a successfully acknowledged presentation token, the client will receive<br>
> +    a wp_presenter.done event. In the rare cases that launching an application<br>
> +    would fail, the compositor may emit a wp_presenter.cancelled event<br>
> +    after a reasonable timeout.<br>
> +  </description><br>
> +<br>
> +  <interface name="zwp_presentation_manager" version="1"><br>
> +    <request name="create_presenter" since="1"><br>
> +      <description summary="create a new presenter"><br>
> +     Creates a new presenter.<br>
> +<br>
> +     The surface argument is the toplevel that initiated the presentation<br>
> +     request through user input. Compositors may want to place the presented<br>
> +     surface relative to the presenter.<br>
> +<br>
> +     Compositors that desire to implement focus stealing prevention<br>
> +     may use this request to find out the request time.<br>
> +      </description><br>
> +      <arg name="id" type="new_id" interface="zwp_presenter"/><br>
> +      <arg name="surface" type="object" interface="wl_surface"/><br>
> +      <arg name="serial" type="uint" summary="the serial from the input event"/><br>
> +    </request><br>
> +<br>
> +    <request name="acknowledge" since="1"><br>
> +      <description summary="acknowledges a presentation token"><br>
> +     Acknowledges that the calling client handled the presentation token.<br>
> +<br>
> +     Applications will typically receive this through the DESKTOP_STARTUP_ID<br>
> +     environment variable as set by its launcher, and should unset the<br>
> +     environment variable right after this request, in order to avoid<br>
> +     propagating it to child processes.<br>
> +<br>
> +     Compositors will ignore unknown presentation tokens.<br>
> +<br>
> +     Presentation tokens may be transferred across clients through means not<br>
> +     described in this protocol.<br>
> +      </description><br>
> +      <arg name="token" type="string"/><br>
> +      <arg name="surface" type="object" interface="wl_surface"/><br>
> +    </request><br>
> +<br>
> +    <request name="destroy" type="destructor"><br>
> +      <description summary="release the memory of the presentation manager object"><br>
> +     Destroy the wp_presentation_manager object. Objects created from this<br>
> +     object are unaffected and should be destroyed separately.<br>
> +      </description><br>
> +    </request><br>
> +  </interface><br>
> +<br>
> +  <interface name="zwp_presenter" version="1"><br>
> +    <description summary="context for presenting a surface"><br>
> +      The wp_presenter object allows clients to get the necessary context to<br>
> +      request that another surface or client should be presented to the user.<br>
> +    </description><br>
> +<br>
> +    <request name="set_app_id"><br>
> +      <description summary="sets the app ID of the launched application"><br>
> +     Sets the app ID of the application to be launched, the compositor<br>
> +     may use this information to look up other miscellaneous information<br>
> +     about it (eg. translatable name, icon, …).<br>
> +<br>
> +     Clients do not need to set an app ID for presentation requests<br>
> +     meant to map surfaces owned by the same client.<br>
> +<br>
> +     As a best practice, it is suggested to select app<br>
> +     ID's that match the basename of the application's .desktop file.<br>
> +     For example, "org.freedesktop.FooViewer" where the .desktop file is<br>
> +     "org.freedesktop.FooViewer.desktop".<br>
> +<br>
> +     See the desktop-entry specification [0] for more details on<br>
> +     application identifiers and how they relate to .desktop files.<br>
> +<br>
> +     [0] <a href="http://standards.freedesktop.org/desktop-entry-spec/" rel="noreferrer" target="_blank">http://standards.freedesktop.org/desktop-entry-spec/</a><br>
> +      </description><br>
> +    </request><br>
> +<br>
> +    <request name="destroy" type="destructor"><br>
> +      <description summary="destroy zwp_presenter"><br>
> +     Destroys this zwp_presenter object.<br>
> +      </description><br>
> +    </request><br>
> +<br>
> +    <event name="token" since="1"><br>
> +      <description summary="token for the presentation request"><br>
> +     Notifies of an unique presentation token (eg. UUIDs) to be used for the<br>
> +     application about to be launched.<br>
> +<br>
> +     In order to guarantee interoperation with the XDG Startup Notification<br>
> +     spec, this launch_id is recommended to be transmitted to the launched<br>
> +     application through the DESKTOP_STARTUP_ID environment variable. The<br>
> +     launch ID may be passed to a running client through other means not<br>
> +     observed in this protocol.<br>
> +      </description><br>
> +      <arg name="token" type="string"/><br>
> +    </event><br>
> +<br>
> +    <event name="cancelled" since="1"><br>
> +      <description summary="the presenter has expired"><br>
> +     Notifies that the compositor is no longer watching this launched<br>
> +     application. This may indicate failure (eg. launchee crashed) or<br>
> +     may simply be the result of the launchee not replying properly<br>
> +     (eg. does not implement this protocol).<br>
> +      </description><br>
> +    </event><br>
> +<br>
> +    <event name="done" since="1"><br>
> +      <description summary="the presentation was performed"><br>
> +     Notifies that the launched application successfully called<br>
> +     zwp_presentation_manager.acknowledge.<br>
> +      </description><br>
> +    </event><br>
> +  </interface><br>
> +</protocol><br>
<br>
It looks okay, with the caveat that startup notification and positioning/focusing seem like two separate beasts to me.<br></blockquote><div><br></div><div>That's a fair POV, the IPC aspect of it doesn't require that much different data flows and hence my thought of putting it together. Worth noting that both are already interrelated somehow in the last paragraph of <a href="https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html#dbus">https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html#dbus</a></div><div><br></div><div>If it is agreed that the semantics are different after all, maybe so.</div><div><br></div><div>Cheers,<br></div><div>  Carlos</div></div></div></div>