Core Wayland window system code and protocol
Find a file
Pekka Paalanen de24f4dd76 protocol: make get_subsurface double-buffered
The existing specification was not explicitly clear on when
wl_subcompositor.get_subsurface request actually adds the sub-surface to
the parent in the compositor's scenegraph. The implicit assumption was
that this happens immediately, but it was not written anywhere.

If it happens immediately, the client doing things in a wrong order may
cause a glitch on screen. Particularly, if the wl_surface B that is
going to be a sub-surface for wl_surface A (the parent) already has a
buffer committed, and the parent surface is mapped, then get_subsurface
will (may?) cause wl_surface B to become mapped immediately. That leaves
no time to set up the sub-surface z-order or position before mapping,
hence there can be a visible glitch.

The way to avoid that, given that the parent surface is mapped, is to
not commit a buffer to wl_surface B until all the sub-surface setup is
done.

However, doing the sub-surface setup always requires a wl_surface.commit
on the parent surface unless the defaults happen to be correct.

To make setting up a subsurface slightly easier by removing one
possibility for a glitch, this patch amends the specification to require
a wl_surface.commit on the parent surface for get_subsurface to
complete. The sub-surface cannot become mapped before a parent commit.

This change may break existing clients that relied on the glitchy
sequence to not need a parent surface commit to map the sub-surface.
However, presumably all uses would at least issue a
wl_subsurface.set_position, which requires a parent surface commit to
apply. That would guarantee that there is a parent surface commit after
get_subsurface, and so reduces the chances of breaking anything.

In other cases, this change may simply remove a possibility for the
glitch.

This patch also adds a note about changing wl_surface.commit behaviour
on wl_subcompositor.get_subsurface. (That could be a separate patch.)

The behaviour of wl_subsurface.destroy remains as specified, even though
it is now slightly asymmetrical to get_subsurface. This is emphasized by
adding the word "immediately". The effects of destruction were already
explicitly documented, as is the way to achieve synchronized unmapping,
so changing destruction behaviour would likely be more disruptive, and
also open up more corner cases (what would happen between destroy and
unmapping?).

Bug: https://phabricator.freedesktop.org/T7358
Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
Reviewed-by: Daniel Stone <daniels@collabora.com>
Reviewed-by: Derek Foreman <derekf@osg.samsung.com>
Reviewed-by: Jonas Ådahl <jadahl@gmail.com>
Reviewed-by: Martin Gräßlin <mgraesslin@kde.org>
2017-12-05 10:43:17 +00:00
cursor cursor: add forward declaration for struct wl_buffer 2017-12-04 19:45:38 +00:00
doc Do not create man page links with doxygen 2017-12-04 19:53:26 +00:00
m4 Clean up .gitignore files 2010-11-11 20:11:27 -05:00
protocol protocol: make get_subsurface double-buffered 2017-12-05 10:43:17 +00:00
spec doc: move documentation from the tex file to docbook 2012-03-28 23:04:25 -04:00
src scanner: Add --strict flag 2017-12-04 22:38:56 +00:00
tests tests: Mark tests used so they don’t get removed at link time 2017-12-01 16:56:02 +00:00
.gitignore tests: add scanner tests 2016-11-23 10:18:44 +02:00
autogen.sh Update autotools configuration 2010-11-06 21:04:03 -04:00
configure.ac Reopen master for regular development 2017-08-08 12:03:27 -07:00
COPYING COPYING: Update to MIT Expat License rather than MIT X License 2015-06-12 15:31:21 -07:00
Makefile.am build: remove wayland-version.h.in from EXTRA_DIST 2017-09-18 12:21:55 +03:00
publish-doc publish-doc: Add script for publishing docs to the website 2015-05-27 15:34:20 -07:00
README README: Tiny cosmetic change 2014-10-08 12:20:17 +01:00
TODO Update TODO 2012-10-21 20:53:37 -04:00
wayland-scanner.m4 scanner: check for wayland-scanner.pc before using variables 2013-08-07 16:25:10 -07:00
wayland-scanner.mk Pass input/output files as arguments to wayland-scanner 2017-08-18 15:20:24 +03:00

What is Wayland?

Wayland is a project to define a protocol for a compositor to talk to
its clients as well as a library implementation of the protocol.  The
compositor can be a standalone display server running on Linux kernel
modesetting and evdev input devices, an X application, or a wayland
client itself.  The clients can be traditional applications, X servers
(rootless or fullscreen) or other display servers.

The wayland protocol is essentially only about input handling and
buffer management.  The compositor receives input events and forwards
them to the relevant client.  The clients creates buffers and renders
into them and notifies the compositor when it needs to redraw.  The
protocol also handles drag and drop, selections, window management and
other interactions that must go through the compositor.  However, the
protocol does not handle rendering, which is one of the features that
makes wayland so simple.  All clients are expected to handle rendering
themselves, typically through cairo or OpenGL.

The weston compositor is a reference implementation of a wayland
compositor and the weston repository also includes a few example
clients.

Building the wayland libraries is fairly simple, aside from libffi,
they don't have many dependencies:

    $ git clone git://anongit.freedesktop.org/wayland/wayland
    $ cd wayland
    $ ./autogen.sh --prefix=PREFIX
    $ make
    $ make install

where PREFIX is where you want to install the libraries.  See
http://wayland.freedesktop.org for more complete build instructions
for wayland, weston, xwayland and various toolkits.