|  |  |  | 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)
 |