[PATCH 1/2] xdg_shell: Add a new shell protocol.
Pekka Paalanen
ppaalanen at gmail.com
Tue Oct 15 13:28:10 CEST 2013
On Tue, 15 Oct 2013 07:30:54 -0300
Rafael Antognolli <antognolli at gmail.com> wrote:
> Hi,
>
> On Tue, Oct 8, 2013 at 4:07 AM, Pekka Paalanen <ppaalanen at gmail.com> wrote:
> > Hi,
> >
> > sorry for a late reply, I'm still around 600 emails behind of
> > wayland-devel at ...
> >
> >
> > On Fri, 19 Jul 2013 16:42:13 -0300
> > antognolli at gmail.com wrote:
> >
> >> From: Rafael Antognolli <rafael.antognolli at intel.com>
> >>
> >> xdg_shell is a protocol aimed to substitute wl_shell in the long term,
> >> but will not be part of the wayland core protocol. It starts as a
> >> non-stable API, aimed to be used as a development place at first, and
> >> once features are defined as required by several desktop shells, we can
> >> finally make it stable.
> >> ---
> >> configure.ac | 1 +
> >> protocol/Makefile.am | 3 +
> >> protocol/xdg-surface.xml | 326 ++++++++++++++++++++++++++++++++++++++++++
> >> src/Makefile.am | 2 +-
> >> src/wayland-xdg-surface.pc.in | 10 ++
> >> 5 files changed, 341 insertions(+), 1 deletion(-)
> >> create mode 100644 protocol/xdg-surface.xml
> >> create mode 100644 src/wayland-xdg-surface.pc.in
> >>
> >> diff --git a/configure.ac b/configure.ac
> >> index 536df9e..61579c8 100644
> >> --- a/configure.ac
> >> +++ b/configure.ac
> >> @@ -141,6 +141,7 @@ AC_CONFIG_FILES([Makefile
> >> src/wayland-server.pc
> >> src/wayland-client.pc
> >> src/wayland-scanner.pc
> >> + src/wayland-xdg-surface.pc
> >> src/wayland-version.h
> >> protocol/Makefile
> >> tests/Makefile])
> >> diff --git a/protocol/Makefile.am b/protocol/Makefile.am
> >> index 08690b3..69b5363 100644
> >> --- a/protocol/Makefile.am
> >> +++ b/protocol/Makefile.am
> >> @@ -1 +1,4 @@
> >> EXTRA_DIST = wayland.xml
> >> +
> >> +protocoldir = $(datadir)/wayland/protocol
> >> +protocol_DATA = xdg-surface.xml
> >> diff --git a/protocol/xdg-surface.xml b/protocol/xdg-surface.xml
> >> new file mode 100644
> >> index 0000000..de64018
> >> --- /dev/null
> >> +++ b/protocol/xdg-surface.xml
> >> @@ -0,0 +1,326 @@
> >> +<?xml version="1.0" encoding="UTF-8"?>
> >> +<protocol name="xdg_surface">
> >> +
> >> + <copyright>
> >> + Copyright © 2008-2013 Kristian Høgsberg
> >> + Copyright © 2013 Rafael Antognolli
> >> + 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.
> >> + </description>
> >> +
> >> + <request name="create_xdg_surface">
> >> + <description summary="create a shell surface from a surface">
> >> + Create a shell surface for an existing surface.
> >
> > I know Rob suggested naming this as "create", but I think there is more
> > to think about.
> >
> > wl_compositor.create_surface is definitely a "create" method, because
> > it creates a new independent object in both protocol and semantically
> > (a new surface).
> >
> > Others like wl_shell.get_shell_surface, xdg_shell.create_xdg_surface,
> > wl_subcompositor.get_subsurface do create a new protocol object, but
> > not a new object semantically. These methods create an extension
> > interface to an existing "real" object, and this extension object
> > cannot function without the real object. That was my rationale for
> > using "get" in the method name: I am just retrieving a handle to the
> > extended interface.
>
> OK, it makes sense. Is there consensus about this? If so, I'll just
> bring it back to get_xdg_surface.
I have only my opinion, and Rob disagreed, don't know about
others or concensus.
> >> + Only one shell 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"/>
> >> + </request>
> >> + </interface>
> >> +
> >> + <interface name="xdg_surface" version="1">
> >> +
> >> + <description summary="desktop-style metadata interface">
> >> + An interface that may be implemented by a wl_surface, for
> >> + implementations that provide a desktop-style user interface.
> >> +
> >> + It provides requests to treat surfaces like toplevel, fullscreen
> >> + or popup windows, move, resize or maximize them, associate
> >> + metadata like title and class, etc.
> >> +
> >> + 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.
> >
> > Would it make sense to change this to follow the "inert protocol
> > object" idiom?
> >
> > Instead of making the wrong destruction order prone to fatal protocol
> > errors, destroying the real object would only make the interface object
> > inert until destroyed. Would this be for the better allowing easier
> > code in toolkits, or for the worse due to tolerating sloppier(?) code?
>
> Not sure if it will help much from the toolkit point of view, I think
> we can live with any solution (speaking for EFL).
>
> But I can change it to the "inert protocol object" to keep consistency
> with the other extensions.
>
> >> + </description>
> >
> > I could not see a destructor request for this interface. I believe all
> > interfaces should have a destructor request defined, unless there is a
> > good reason to not define one (wl_callback is the rare example of
> > that). Otherwise it is possible that some later change makes us realize
> > we really do need it to avoid temporary leaking or other problems in the
> > compositor, like happened with some of the input related objects.
>
> Hmm... I don't know, I think I just copied what we had for wl_shell.
> Should it have a destructor too?
In hindsight, it probably should. I guess roles were originally thought
to be "set once and forever" with the rationale that wl_surfaces are
cheap to create, so it wasn't really needed at the time. Nowadays when
we are getting an increasing number of extensions to wl_surface and
more state, it is becoming heavier. One could also argue whether
re-purposing a surface is needed at all, or a good practice.
Actually, we probably did not even have the concept of a role when
wl_shell_surface was designed.
Personally I feel that the rule "define a destructor request unless
there is a good reason not to" is a safe guideline. Again, just my
opinion.
At least every protocol object should have a way to get destroyed,
other than the client disconnecting. I bet everyone can agree on that,
but I would also add "without introducing tricky error conditions".
> > This extended interface (protocol object) gives the wl_surface a role
> > (doesn't it?). What should happen when the extended interface is
> > destroyed? Should the role be reset?
> >
> > Would be nice to see consistency in behaviour between different
> > extension interfaces.
>
> OK, will look at this.
As a rule of thumb, anything that sets weston_surface::configure is a
role. That should let you find them all, including pointer cursors and
dnd icons (IIRC these roles are reversable).
Thanks,
pq
More information about the wayland-devel
mailing list