[PATCH weston] xdg-shell: Make stable

Pekka Paalanen ppaalanen at gmail.com
Wed Aug 6 06:39:37 PDT 2014


On Thu, 17 Jul 2014 17:57:45 -0400
"Jasper St. Pierre" <jstpierre at mecheye.net> wrote:

> We've gone through enough churn of xdg-shell that we're now feeling
> confident enough to commit to this much. Let's do it.
> 
> The major version number is bumped to 2 because unfortunately we need to
> remove the use_unstable_version API.
> ---
>  clients/simple-damage.c |  9 +------
>  clients/simple-egl.c    |  9 +------
>  clients/simple-shm.c    |  9 +------
>  clients/window.c        |  9 +------
>  desktop-shell/shell.c   | 67 +++++++------------------------------------------
>  protocol/xdg-shell.xml  | 24 +-----------------
>  6 files changed, 14 insertions(+), 113 deletions(-)

Hi Jasper,

I am not reviewing this patch now. Instead, I took xdg-shell.xml from
Weston master as today, and I'm giving comments on it, as you have
declared it practically ready for stabilization.

In irc, I remember you mentioned a few more things you'd like to solve,
like size hints, but I won't specifically comment about those, unless
it comes up through what's below.

I am not too familiar in how desktops work, what is the state of the
art on X11, or even all of the concepts, so please allow me some room
for inaccuracy.

I am reading this protocol specification only, and I am not looking at
the implementation bits at all. I believe the protocol spec should be
enough for specifying everything, even though we don't have a good track
record with that.

Almost all questions and comments I give should probably lead to some
changes or additions in the documentation answering those questions.

> <?xml version="1.0" encoding="UTF-8"?>
> <protocol name="xdg_shell">
> 
>   <copyright>
>     Copyright © 2008-2013 Kristian Høgsberg
>     Copyright © 2013      Rafael Antognolli
>     Copyright © 2013      Jasper St. Pierre
>     Copyright © 2010-2013 Intel Corporation
> 
>     Permission to use, copy, modify, distribute, and sell this
>     software and its documentation for any purpose is hereby granted
>     without fee, provided that the above copyright notice appear in
>     all copies and that both that copyright notice and this permission
>     notice appear in supporting documentation, and that the name of
>     the copyright holders not be used in advertising or publicity
>     pertaining to distribution of the software without specific,
>     written prior permission.  The copyright holders make no
>     representations about the suitability of this software for any
>     purpose.  It is provided "as is" without express or implied
>     warranty.
> 
>     THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
>     SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
>     FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
>     SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
>     WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
>     AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
>     ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
>     THIS SOFTWARE.
>   </copyright>
> 
>   <interface name="xdg_shell" version="1">
>     <description summary="create desktop-style surfaces">
>       This interface is implemented by servers that provide
>       desktop-style user interfaces.
> 
>       It allows clients to associate a xdg_surface with
>       a basic surface.

If you want, we could also say that with xdg_shell, you can turn a
wl_surface into a real window. I believe this is the point where you
can define the term "window", I presume it would be useful later.

Perhaps also "window geometry" and "window coordinates" would be good
to at least mention here.

>     </description>

First new thing we need is an error enumeration, that allows you to
communicate the errors that might be raised from wrong use of this
interface.

This interface is missing the destructor protocol. Please, add it. I
can help you define the semantics, if there is something unclear still.

This is a single global, yes? What happens if a client binds to this
global multiple times, therefore creating multiple xdg_shell objects?
The ping/pong spec needs to define what happens there.

Does the compositor have to track, which xdg_* object has been created
from which xdg_shell object? For ping/pong purposes?

>     <enum name="version">
>       <description summary="latest protocol version">
> 	The 'current' member of this enum gives the version of the
> 	protocol.  Implementations can compare this to the version
> 	they implement using static_assert to ensure the protocol and
> 	implementation versions match.
>       </description>
>       <entry name="current" value="3" summary="Always the latest version"/>
>     </enum>
> 
> 
>     <request name="use_unstable_version">
>       <description summary="enable use of this unstable version">
> 	Negotiate the unstable version of the interface.  This
> 	mechanism is in place to ensure client and server agree on the
> 	unstable versions of the protocol that they speak or exit
> 	cleanly if they don't agree.  This request will go away once
> 	the xdg-shell protocol is stable.
>       </description>
>       <arg name="version" type="int"/>
>     </request>

This request and the version enum will be removed once the interface
stabilizes, like your patch does for the XML file. Ok.

Btw. when we do that, is there any reason to keep xdg-shell.xml still
in Weston or could we move it to Wayland directly for the world to use?
Because, the world is really using it already, right. Or various random
versions of it, at least. I mean, we could just let Wayland install the
XML file, not build and distribute the generated code. Remove all the
dozen random copies from projects all over.

>     <request name="get_xdg_surface">
>       <description summary="create a shell surface from a surface">
> 	Create a shell surface for an existing surface.

This turns the roleless wl_surface into a (is top-level the right term?)
window. Shouldn't we use the wl_surface role terminology here?

Hm, we really should document the concept of a role somewhere. It would
make sense to define it even on the protocol level, wouldn't it? Then
we can just say "this gives the wl_surface the role ...", and it would
imply that the surface must not already have a role, nor can it get
another role while this one exists.

Should we explain what a "top-level" is? You can of course just refer
to the xdg_surface documentation.

> 
> 	Only one shell or popup surface can be associated with a given
> 	surface.
>       </description>
>       <arg name="id" type="new_id" interface="xdg_surface"/>
>       <arg name="surface" type="object" interface="wl_surface"/>

Need to define an error case for 'surface' already having a role.

>     </request>
> 
>     <request name="get_xdg_popup">
>       <description summary="create a shell surface from a surface">
> 	Create a popup surface for an existing surface.
> 
> 	Only one shell or popup surface can be associated with a given
> 	surface.

This needs more explanation on what a "popup" is, and what behaviour is
associated with it. You could just refer to xdg_popup documentation,
but the very least you need to explain all the arguments in more detail.

>       </description>
>       <arg name="id" type="new_id" interface="xdg_popup"/>
>       <arg name="surface" type="object" interface="wl_surface"/>

>       <arg name="parent" type="object" interface="wl_surface"/>

What requirements do we have for the parent? Must it have the
xdg_surface role? Can it be a xdg_popup? What if it is a cursor surface?
Need to define all valid cases, and specify everything else leading to
an error.

>       <arg name="seat" type="object" interface="wl_seat" summary="the wl_seat whose pointer is used"/>

What about if the seat does not have a pointer? Maybe it has touch? Or
maybe it has on keyboard, and the user used e.g. the Menu-key to open a
menu?

What is the pointer/seat used for? Are there any limitations on which
seat can be used?

>       <arg name="serial" type="uint" summary="serial of the implicit grab on the pointer"/>

Where does a client get the serial it needs to pass here?
How does the compositor process the serial?

>       <arg name="x" type="int"/>
>       <arg name="y" type="int"/>

What are these coordinates? What is their valid range?

>       <arg name="flags" type="uint"/>

What are these flags? Are there no flags defined yet? Would passing an
unknown flag cause a protocol error?

>     </request>
> 
>     <event name="ping">
>       <description summary="check if the client is alive">
>         The ping event asks the client if it's still alive. Pass the
>         serial specified in the event back to the compositor by sending
>         a "pong" request back with the specified serial.
> 
>         Compositors can use this to determine if the client is still
>         alive. It's unspecified what will happen if the client doesn't
>         respond to the ping request, or in what timeframe. Clients should
>         try to respond in a reasonable amount of time.

Reasonable, or as soon as they can?

Should we say something about what a compositor is expected to do?
Surely not to disconnect the client within 10ms? Maybe just say, that a
compositor may present the windows created through this xdg_shell object
as unresponsive and perhaps prohibit all input until the client does
respond with a pong?

>       </description>
>       <arg name="serial" type="uint" summary="pass this to the callback"/>
>     </event>
> 
>     <request name="pong">
>       <description summary="respond to a ping event">
> 	A client must respond to a ping event with a pong request or
> 	the client may be deemed unresponsive.

This talks about unresponsive, the ping talks about alive.

>       </description>
>       <arg name="serial" type="uint" summary="serial of the ping event"/>
>     </request>
>   </interface>

In irc, we talked about what should happen if a client destroys the
xdg_shell object while it still has windows up. What happens then
should be documented with the ping/pong, as it is consequential.

> 
>   <interface name="xdg_surface" version="1">
> 
>     <description summary="desktop-style metadata interface">

..for a (top-level) window

>       An interface that may be implemented by a wl_surface, for
>       implementations that provide a desktop-style user interface.

Umm... sorry?

>       It provides requests to treat surfaces like windows, allowing to set
>       properties like maximized, fullscreen, minimized, and to move and resize
>       them, and associate metadata like title and app id.
> 
>       On the server side the object is automatically destroyed when
>       the related wl_surface is destroyed.  On client side,
>       xdg_surface.destroy() must be called before destroying
>       the wl_surface object.

This seems to conflict the description of 'destroy' request below.
Instead of this, we could explain what happens if the wl_surface is
destroyed before its xdg_surface.

What about surface/window mapping? To get a window mapped, is it enough
to just create a xdg_surface and commit connect to the wl_surface? Does
the order of these operations matter?

If the order matters, should xdg_shell.get_xdg_surface raise a protocol
error if the wl_surface alrady has content (i.e. a non-NULL wl_buffer
committed)?

What about the initial size of the window? Does this interface
automatically deliver any events the moment the protocol object has
been created?

>     </description>

Quite likely we would need an error enum, for protocol errors raised by
xdg_surface's requests.

>     <request name="destroy" type="destructor">
>       <description summary="remove xdg_surface interface">
> 	The xdg_surface interface is removed from the wl_surface object
> 	that was turned into a xdg_surface with
> 	xdg_shell.get_xdg_surface request. The xdg_surface properties,
> 	like maximized and fullscreen, are lost. The wl_surface loses
> 	its role as a xdg_surface. The wl_surface is unmapped.
>       </description>

Very good.

What about, say, xdg_popup surfaces associated to this one?

I think 'set_parent' already describes what happens with xdg_surfaces
who had 'set_parent' called with this surface as argument.

>     </request>
> 
>     <request name="set_parent">
>       <description summary="surface is a child of another surface">
> 	Child surfaces are stacked above their parents, and will be
> 	unmapped if the parent is unmapped too. They should not appear
> 	on task bars and alt+tab.

Any other behavioral changes compared to an xdg_surface without this
request called?

>       </description>
>       <arg name="parent" type="object" interface="wl_surface" allow-null="true"/>

What kind of wl_surfaces are allowed here, what raises a protocol error?

>     </request>
> 
>     <request name="set_title">
>       <description summary="set surface title">
> 	Set a short title for the surface.
> 
> 	This string may be used to identify the surface in a task bar,
> 	window list, or other user interface elements provided by the
> 	compositor.
> 
> 	The string must be encoded in UTF-8.
>       </description>
>       <arg name="title" type="string"/>

Ok.

>     </request>
> 
>     <request name="set_app_id">
>       <description summary="set surface class">

Id or class? Pick one. I would kind of prefer not id, because it is
quite overloaded term, but if it is the term what DEs nowdays use, then
so be it.

> 	Set an id for the surface.
> 
> 	The app id identifies the general class of applications to which
> 	the surface belongs.
> 
> 	It should be the ID that appears in the new desktop entry
> 	specification, the interface name.

Could we have a reference to the specification here?

From some very old memory, I thought this would be the .desktop file
path, but apparently this is the... the... dbus interface name like
thing, right? Like "org.gnome.shotwell" or whatever.

And the DE will use this app_id to find the .desktop file to get an
icon for this window, etc.?

>       </description>
>       <arg name="app_id" type="string"/>

Are there any cases where a string could raise a protocol error?

>     </request>
> 
>     <request name="show_window_menu">
>       <description summary="show the window menu">
>         Clients implementing client-side decorations might want to show
>         a context menu when right-clicking on the decorations, giving the
>         user a menu that they can use to maximize or minimize the window.
> 
>         This request asks the compositor to pop up such a window menu at
>         the given position, relative to the parent surface. There are
>         no guarantees as to what the window menu contains.
> 
>         Your surface must have focus on the seat passed in to pop up the
>         window menu.

Is any focus, e.g. pointer, really enough? I.e. just moving the cursor
over a window would allow it to pop this up, without needing a
button-down? I see for instance wl_pointer.enter carries a serial, will
that do?

How will be client know, when the window menu is gone?

I would assume this request will always cause input objects to send
'leave' events, and then maybe or not 'enter' events once the window
menu is dismissed or this request was rejected (due to e.g. a too old
serial). That would be good to document, maybe even as a standard
mechanism called "the compositor grabs the wl_seat for this operation",
which would imply all that.

>       </description>
> 
>       <arg name="seat" type="object" interface="wl_seat" summary="the seat to pop the window up on"/>
>       <arg name="serial" type="uint" summary="serial of the event to pop up the window for"/>

I think these are better written than the descriptions for the same
arguments in xdg_shell.get_xdg_popup.

>       <arg name="x" type="int" summary="the x position to pop up the window menu at"/>
>       <arg name="y" type="int" summary="the y position to pop up the window menu at"/>

..relative to "this" wl_surface, in surface coordinates. Right?

Oh btw. we still don't have the popup placement negotiation protocol
(to avoid popup going off-screen), but the draft I read a long time ago
assumed, that the client knows in advance the size of the popup
surface. We don't know the size here. I'm not sure if solving that
would change something here.

>     </request>
> 
>     <request name="move">
>       <description summary="start an interactive move">
> 	Start a pointer-driven move of the surface.

or touch, or maybe even keyboard?
Could we implement keyboard-based window movement with this?

> 	This request must be used in response to a button press event.
> 	The server may ignore move requests depending on the state of
> 	the surface (e.g. fullscreen or maximized).

Again, how does the client know, when the move has ended?
What does the compositor do with the seat's input devices?

I'm looking for similar documentation as I suggested for
show_window_menu.

>       </description>
>       <arg name="seat" type="object" interface="wl_seat" summary="the wl_seat whose pointer is used"/>
>       <arg name="serial" type="uint" summary="serial of the implicit grab on the pointer"/>

I'd change wording to not be pointer-specific.

>     </request>
> 
>     <enum name="resize_edge">
>       <description summary="edge values for resizing">
> 	These values are used to indicate which edge of a surface
> 	is being dragged in a resize operation. The server may
> 	use this information to adapt its behavior, e.g. choose
> 	an appropriate cursor image.

And automatically reposition the surface accordingly? (Resize from
top/left.)

>       </description>
>       <entry name="none" value="0"/>
>       <entry name="top" value="1"/>
>       <entry name="bottom" value="2"/>
>       <entry name="left" value="4"/>
>       <entry name="top_left" value="5"/>
>       <entry name="bottom_left" value="6"/>
>       <entry name="right" value="8"/>
>       <entry name="top_right" value="9"/>
>       <entry name="bottom_right" value="10"/>

No use for centered resize, e.g. left_right?

>     </enum>
> 
>     <request name="resize">
>       <description summary="start an interactive resize">
> 	Start a pointer-driven resizing of the surface.

What about touch and keyboard, not just pointer? Or any other input
style. Resize with keyboard might be a nice proof of concept, but with
this method rather than what weston-resizor does, no?

> 	This request must be used in response to a button press event.
> 	The server may ignore resize requests depending on the state of
> 	the surface (e.g. fullscreen or maximized).

The same comments as for show_window_menu wrt. to the grab.

So with this, the compositor is handling the repositioning of the
surface automatically, is it not? No need for the client to fiddle with
wl.surface.attach arguments x,y?

Could also mention, that the client will be receiving configure events
while interactive resizing happens, and when the operation ends.

>       </description>
>       <arg name="seat" type="object" interface="wl_seat" summary="the wl_seat whose pointer is used"/>
>       <arg name="serial" type="uint" summary="serial of the implicit grab on the pointer"/>
>       <arg name="edges" type="uint" summary="which edge or corner is being dragged"/>

Is there a protocol error if a client passes illegal 'edges' value?

>     </request>
> 
>     <enum name="state">
>       <description summary="types of state on the surface">
>         The different state values used on the surface. This is designed for
>         state values like maximized, fullscreen. It is paired with the
>         configure event to ensure that both the client and the compositor
>         setting the state can be synchronized.
> 
>         States set in this way are double-buffered. They will get applied on
>         the next commit.
> 
>         Desktop environments may extend this enum by taking up a range of
>         values and documenting the range they chose in this description.
>         They are not required to document the values for the range that they
>         chose. Ideally, any good extensions from a desktop environment should
>         make its way into standardization into this enum.
> 
>         The current reserved ranges are:
> 
>         0x0000 - 0x0FFF: xdg-shell core values, documented below.
>         0x1000 - 0x1FFF: GNOME

Very good.

>       </description>
>       <entry name="maximized" value="1" summary="the surface is maximized">
>         The surface is maximized. The window geometry specified in the configure
>         event must be obeyed by the client.

I suppose "the configure event" really means "the latest configure
event the client has received"? A client may receive many configure
events before it gets to repainting, right?

>       </entry>
>       <entry name="fullscreen" value="2" summary="the surface is fullscreen">
>         The surface is fullscreen. The window geometry specified in the configure
>         event must be obeyed by the client.

Really? So, will we rely on wl_viewport for scaling low-res apps to
fullscreen? No provision for automatic black borders in aspect ratio or
size mismatch, even if the display hardware would be able to generate
those for free while scanning out the client buffer, bypassing
compositing?

Since we have a big space for these states, I suppose we could do those
mismatch cases in separate and explicit state variants of fullscreen,
could we not?

>       </entry>
>       <entry name="resizing" value="3">
>         The surface is being resized. The window geometry specified in the
>         configure event is a maximum; the client cannot resize beyond it.
>         Clients that have aspect ratio or cell sizing configuration can use
>         a smaller size, however.

Oh, there is an explicit state for this, ok.

>       </entry>
>       <entry name="activated" value="4">
>         Client window decorations should be painted as if the window is
>         active. Do not assume this means that the window actually has
>         keyboard or pointer focus.

Excellent.

>       </entry>
>     </enum>
> 
>     <event name="configure">
>       <description summary="suggest a surface change">
> 	The configure event asks the client to resize its surface.

and/or draw it in a different style.

> 	The width and height arguments specify a hint to the window
>         about how its surface should be resized in window geometry
>         coordinates. The states listed in the event specify how the
>         width/height arguments should be interpreted.

The window geometry coordinates are not clearly specified. Are they
defined by the set_window_geometry such that 0,0 here means x,y there?

>         A client should arrange a new surface, and then send a
>         ack_configure request with the serial sent in this configure
>         event before attaching a new surface.

"Before attaching a new surface" is vague. Does this mean "immediately
before issuing wl_surface.commit on the associated wl_surface"?
One might also argue about "immediately", I think your point is that
the very next commit after a ack_configure applies all the changes
suggested by that configure. Right?

> 	If the client receives multiple configure events before it
>         can respond to one, it is free to discard all but the last
>         event it received.
>       </description>
> 
>       <arg name="width" type="int"/>
>       <arg name="height" type="int"/>
>       <arg name="states" type="array"/>

What is the data type contained in the array? uint16_t? uint32_t?

What should a client do, if it receives states it does not understand?

What if the compositor sends a state that demands something, and the
client does not obey the demand, because a) the client is broken, or b)
the client is not broken, but does not know the state?

>       <arg name="serial" type="uint"/>

This serial is in a completely new "serial name space", isn't it?
Not to be confused with e.g. input serials.

>     </event>
> 
>     <request name="ack_configure">
>       <description summary="ack a configure event">
>         When a configure event is received, a client should then ack it
>         using the ack_configure request to ensure that the compositor
>         knows the client has seen the event.
> 
>         By this point, the state is confirmed, and the next attach should
>         contain the buffer drawn for the configure event you are acking.

Again, "attach" is vague, you probably mean wl_surface.commit.

Is it allowed to skip acks? If a client receives configure events with
serials 3,4,5, can it just ack 5 directly?

What if you ack 4, ack 5, without a commit in between?

What if you ack 5, ack 3 (going backwards, i.e. client bug), would
there be a protocol error? Or if you ack a serial the compositor has
not sent yet? Or ack the same serial twice?

>       </description>
>       <arg name="serial" type="uint" summary="a serial to configure for"/>

I'd say "the serial from the configure event".

>     </request>
> 
>     <request name="set_window_geometry">
>       <description summary="set the new window geometry">
>         The window geometry of a window is its "visible bounds" from the
>         user's perspective. Client-side decorations often have invisible
>         portions like drop-shadows which should be ignored for the
>         purposes of aligning, placing and constraining windows.
> 
>         The default value is the full bounds of the surface, including any
>         subsurfaces. Once the window geometry of the surface is set once,
>         it is not possible to unset it, and it will remain the same until
>         set_window_geometry is called again, even if a new subsurface or
>         buffer is attached.

Mentions sub-surfaces, very nice.

Does the default value change automatically according to wl_surface and
sub-surface changes, until the client issues the first set_window_geometry?

>         If responding to a configure event, the window geometry in here
>         must respect the sizing negotiations specified by the states in
>         the configure event.

Okay.

Is this double-buffered state, in the wl_surface sense? I.e. applied on
the next wl_surface.commit?

>       </description>
>       <arg name="x" type="int"/>
>       <arg name="y" type="int"/>
>       <arg name="width" type="int"/>
>       <arg name="height" type="int"/>

In what coordinate space are these in?
Is there a protocol error, if width or height <= 0?

>     </request>
> 
>     <request name="set_maximized" />
>     <request name="unset_maximized" />

These two requests are undocumented.

> 
>     <request name="set_fullscreen">
>       <description summary="set the window as fullscreen on a monitor">
> 	Make the surface fullscreen.
> 
>         You can specify an output that you would prefer to be fullscreen.
> 	If this value is NULL, it's up to the compositor to choose which
>         display will be used to map this surface.
>       </description>
>       <arg name="output" type="object" interface="wl_output" allow-null="true"/>

The issue I raised at the fullscreen state enum... otherwise ok.

>     </request>
>     <request name="unset_fullscreen" />
> 
>     <request name="set_minimized" />

And a couple more undocumented requests. Maybe answer the FAQ "where is
my unset_minimized?" I.e. how do you get out of minimized, since there
is no obvious request.

I would like to see an overview of how this state system works. Can a
client issue set_maximized at any time? What happens then? At what
point does the window get drawn in maximized state?

Can the compositor choose to set arbitrary states on its own will?

> 
>     <event name="close">
>       <description summary="surface wants to be closed">
>         The close event is sent by the compositor when the user
>         wants the surface to be closed. This should be equivalent to
>         the user clicking the close button in client-side decorations,
>         if your application has any...
> 
>         This is only a request that the user intends to close your
>         window. The client may choose to ignore this request, or show
>         a dialog to ask the user to save their data...
>       </description>
>     </event>

Excellent.

>   </interface>
> 
>   <interface name="xdg_popup" version="1">
>     <description summary="desktop-style metadata interface">

..for popups.

>       An interface that may be implemented by a wl_surface, for
>       implementations that provide a desktop-style popups/menus. A popup
>       surface is a transient surface with an added pointer grab.
> 
>       An existing implicit grab will be changed to owner-events mode,

What is owner-events mode? Implicit grab I vaguely know about.

>       and the popup grab will continue after the implicit grab ends
>       (i.e. releasing the mouse button does not cause the popup to be
>       unmapped).

"..to be unmapped by the compositor." The client can still choose to
dismiss it.

> 
>       The popup grab continues until the window is destroyed or a mouse
>       button is pressed in any other clients window. A click in any of
>       the clients surfaces is reported as normal, however, clicks in
>       other clients surfaces will be discarded and trigger the callback.

So the client will be getting input 'enter' and 'leave' events as
usual, but only this client?

Is it the client's responsibility to destroy the popup, if the users
clicks on some other surface than the popup?

What callback? And how about touch instead of pointer?

What if the user alt+tabs during a popup?

When a popup is open, are any xdg_surface operations on the client's
other surfaces invalid? Can a client create a second popup? What
happens then?

> 
>       The x and y arguments specify the locations of the upper left
>       corner of the surface relative to the upper left corner of the
>       parent surface, in surface local coordinates.

This should go with the get_xdg_popup, no?

> 
>       xdg_popup surfaces are always transient for another surface.

What does transient mean here?

>     </description>
> 
>     <request name="destroy" type="destructor">
>       <description summary="remove xdg_surface interface">
> 	The xdg_surface interface is removed from the wl_surface object
> 	that was turned into a xdg_surface with
> 	xdg_shell.get_xdg_surface request. The xdg_surface properties,
> 	like maximized and fullscreen, are lost. The wl_surface loses
> 	its role as a xdg_surface. The wl_surface is unmapped.
>       </description>

This is xdg_popup here. ;-)

>     </request>
> 
>     <event name="popup_done">
>       <description summary="popup interaction is done">
> 	The popup_done event is sent out when a popup grab is broken,
> 	that is, when the users clicks a surface that doesn't belong
> 	to the client owning the popup surface.

"The client should destroy the xdg_popup object." I presume?
Will re-use of the wl_surface be allowed?

>       </description>
>       <arg name="serial" type="uint" summary="serial of the implicit grab on the pointer"/>

What is this serial used for?

Oh, is it because the client might not get a input 'enter' event if the
input focus is already on some other surface of the client?

>     </event>
> 
>   </interface>
> </protocol>


Okay, phew. Nothing drastically broken that I can see, if not maybe that
missing destructor. :-)

Lots and lots of details to specify, though.


Thanks,
pq


More information about the wayland-devel mailing list