|
|
|
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 applications, 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 throught 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 wayland repository includes a compositor and a few clients, but
|
|
|
|
both the compositor and clients are essentially test cases.
|
|
|
|
|
|
|
|
|
|
|
|
Building Instructions
|
|
|
|
|
|
|
|
The instructions below assume some familiarity with git and building
|
|
|
|
and running experimental software. And be prepared that this project
|
|
|
|
isn't at all useful right now, it's still very much a prototype. When
|
|
|
|
the instructions suggest to clone a git repo, you can of course just
|
|
|
|
add a remote and fetch instead, if you have a clone of that repo
|
|
|
|
around already. I usually install all software I'm working on into
|
|
|
|
$HOME/install, so that's what I'll use in the instructions below, but
|
|
|
|
you can use your favorite directory of course or install over your
|
|
|
|
system copy (pass --prefix=/usr --sysconfdir=/etc, generally).
|
|
|
|
|
|
|
|
|
|
|
|
Modesetting
|
|
|
|
|
|
|
|
At this point, kernel modesetting is upstream for Intel, AMD and
|
|
|
|
nVidia chipsets. Most distributions ship with kernel modesetting
|
|
|
|
enabled by default and will work with Wayland out of the box. The
|
|
|
|
modesetting driver must also support the page flip ioctl, which only
|
|
|
|
the intel driver does at this point.
|
|
|
|
|
|
|
|
|
|
|
|
Building mesa
|
|
|
|
|
|
|
|
Wayland uses the mesa EGL stack, and all extensions required to run
|
|
|
|
EGL on KMS are now upstream on the master branch. The 7.9 release of
|
|
|
|
mesa will have all these extensions, but for now you'll need to build
|
|
|
|
mesa master:
|
|
|
|
|
|
|
|
$ git clone git://anongit.freedesktop.org/mesa/mesa
|
|
|
|
$ cd mesa
|
|
|
|
$ ./configure --prefix=$HOME/install --enable-egl --enable-gles2
|
|
|
|
$ make && make install
|
|
|
|
|
|
|
|
If you're using an intel chipset, it's best to also pass
|
|
|
|
--disable-gallium to ./configure, since otherwise libEGL will try to
|
|
|
|
load the gallium sw rasterizer before loading the Intel DRI driver.
|
|
|
|
|
|
|
|
|
|
|
|
libxkbcommon
|
|
|
|
|
|
|
|
Wayland needs libxkbcommon for translating evdev keycodes to keysyms.
|
|
|
|
There's a couple of repos around, and we're trying to consolidate the
|
|
|
|
development, but for wayland you'll need the repo from my git
|
|
|
|
repository. For this you'll need development packages for xproto,
|
|
|
|
kbproto and libX11.
|
|
|
|
|
|
|
|
$ git clone git://people.freedesktop.org/~krh/libxkbcommon.git
|
|
|
|
$ cd libxkbcommon/
|
|
|
|
$ ./autogen.sh --prefix=$HOME/install
|
|
|
|
$ make && make install
|
|
|
|
|
|
|
|
|
|
|
|
cairo-gl
|
|
|
|
|
|
|
|
The Wayland clients render using cairo-gl, which is an experimental
|
|
|
|
cairo backend. It has been available since cairo 1.10. Unless your
|
|
|
|
distribution ships cairo with the gl backend enabled, you'll need to
|
|
|
|
compile your own version of cairo:
|
|
|
|
|
|
|
|
$ git clone git://anongit.freedesktop.org/cairo
|
|
|
|
$ cd cairo
|
|
|
|
$ ./autogen.sh --prefix=$HOME/install --enable-gl
|
|
|
|
$ make && make install
|
|
|
|
|
|
|
|
|
|
|
|
Wayland
|
|
|
|
|
|
|
|
With mesa and libxkbcommon in place, we can checkout and build
|
|
|
|
Wayland. Aside from mesa, Wayland needs development packages for
|
|
|
|
gdk-pixbuf-2.0, libudev, libdrm, xcb-dri2, xcb-fixes (for X
|
|
|
|
compositor) cairo-gl, glib-2.0, gdk-2.0 (for poppler) and
|
|
|
|
poppler-glib:
|
|
|
|
|
|
|
|
$ git clone git://people.freedesktop.org/~krh/wayland
|
|
|
|
$ ./autogen.sh --prefix=$HOME/install
|
|
|
|
$ make && make install
|
|
|
|
|
|
|
|
Installing into a non-/usr prefix is fine, but the 70-wayland.rules
|
|
|
|
udev rule file has to be installed in /etc/udev/rules.d. Once
|
|
|
|
installed, either reboot or run
|
|
|
|
|
|
|
|
$ sudo udevadm trigger --subsystem-match=drm --subsystem-match=input
|
|
|
|
|
|
|
|
to make udev label the devices wayland will use.
|
|
|
|
|
|
|
|
If DISPLAY is set, the wayland compositor will run under X in a window
|
|
|
|
and take input from X. Otherwise it will run on the KMS framebuffer
|
|
|
|
and take input from evdev devices. Pick a background image that you
|
|
|
|
like and copy it to the Wayland source directory as background.jpg or
|
|
|
|
use the -b command line option:
|
|
|
|
|
|
|
|
$ ./wayland-system-compositor -b my-image.jpg
|
|
|
|
|
|
|
|
To run clients, switch to a different VT and run the client from
|
|
|
|
there. Or run it under X and start up the clients from a terminal
|
|
|
|
window. There are a few demo clients available, but they are all
|
|
|
|
pretty simple and mostly for testing specific features in the wayland
|
|
|
|
protocol: 'terminal' is a simple terminal emulator, not very compliant
|
|
|
|
at all, but works well enough for bash
|
|
|
|
|
|
|
|
'flower' moves a flower around the screen, testing the frame protocol
|
|
|
|
'gears' glxgears, but for wayland, currently broken
|
|
|
|
'image' loads the image files passed on the command line and shows them
|
|
|
|
|
|
|
|
'view' does the same for pdf files, but needs file URIs
|
|
|
|
(file:///path/to/pdf)
|