From bcafc467c50467026b3ea2c185903dc8775a8fef Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Wed, 29 Feb 2012 10:40:53 +1000 Subject: [PATCH 1/8] protocol: fix make distcheck Distribute all source files that we need for buildling. Plus, remove the html file on make clean. Signed-off-by: Peter Hutterer --- protocol/Makefile.am | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/protocol/Makefile.am b/protocol/Makefile.am index 9c6cc49e..49395576 100644 --- a/protocol/Makefile.am +++ b/protocol/Makefile.am @@ -1,7 +1,8 @@ if HAVE_XSLTPROC -doc_DATA = wayland.html wayland-protocol.css +dist_doc_DATA = wayland.html wayland-protocol.css wayland.xml -wayland.html: wayland.xml protocol.xsl - $(AM_V_GEN)$(XSLTPROC) protocol.xsl wayland.xml > $@ +wayland.html: $(srcdir)/wayland.xml $(srcdir)/protocol.xsl + $(AM_V_GEN)$(XSLTPROC) $(srcdir)/protocol.xsl $(srcdir)/wayland.xml > $@ +CLEANFILES = wayland.html endif From fcddfbb769a98b77ecd1e0452c6d8f275301cc0b Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Fri, 24 Feb 2012 09:37:02 +1000 Subject: [PATCH 2/8] doc: add publican-created doctree $> publican create --name=Wayland unmodified otherwise To build the tree to target formats, use $> publican build --langs=en-US --formats=html,pdf Signed-off-by: Peter Hutterer --- doc/Wayland/en-US/Author_Group.xml | 16 +++++++++++++ doc/Wayland/en-US/Book_Info.xml | 27 ++++++++++++++++++++++ doc/Wayland/en-US/Chapter.xml | 32 ++++++++++++++++++++++++++ doc/Wayland/en-US/Preface.xml | 12 ++++++++++ doc/Wayland/en-US/Revision_History.xml | 26 +++++++++++++++++++++ doc/Wayland/en-US/Wayland.ent | 4 ++++ doc/Wayland/en-US/Wayland.xml | 12 ++++++++++ doc/Wayland/en-US/images/icon.svg | 19 +++++++++++++++ doc/Wayland/publican.cfg | 6 +++++ 9 files changed, 154 insertions(+) create mode 100644 doc/Wayland/en-US/Author_Group.xml create mode 100644 doc/Wayland/en-US/Book_Info.xml create mode 100644 doc/Wayland/en-US/Chapter.xml create mode 100644 doc/Wayland/en-US/Preface.xml create mode 100644 doc/Wayland/en-US/Revision_History.xml create mode 100644 doc/Wayland/en-US/Wayland.ent create mode 100644 doc/Wayland/en-US/Wayland.xml create mode 100644 doc/Wayland/en-US/images/icon.svg create mode 100644 doc/Wayland/publican.cfg diff --git a/doc/Wayland/en-US/Author_Group.xml b/doc/Wayland/en-US/Author_Group.xml new file mode 100644 index 00000000..b664025d --- /dev/null +++ b/doc/Wayland/en-US/Author_Group.xml @@ -0,0 +1,16 @@ + + +%BOOK_ENTITIES; +]> + + + Dude + McPants + + Somewhere + Someone + + Dude.McPants@example.com + + diff --git a/doc/Wayland/en-US/Book_Info.xml b/doc/Wayland/en-US/Book_Info.xml new file mode 100644 index 00000000..4a6d694f --- /dev/null +++ b/doc/Wayland/en-US/Book_Info.xml @@ -0,0 +1,27 @@ + + +%BOOK_ENTITIES; +]> + + Wayland + short description + Documentation + 0.1 + 0 + 0 + + + A short overview and summary of the book's subject and purpose, traditionally no more than one paragraph long. Note: the abstract will appear in the front matter of your book and will also be placed in the description field of the book's RPM spec file. + + + + + + + + + + + + diff --git a/doc/Wayland/en-US/Chapter.xml b/doc/Wayland/en-US/Chapter.xml new file mode 100644 index 00000000..f89f28b2 --- /dev/null +++ b/doc/Wayland/en-US/Chapter.xml @@ -0,0 +1,32 @@ + + +%BOOK_ENTITIES; +]> + + Test Chapter + + This is a test paragraph + +
+ Test Section 1 + + This is a test paragraph in a section + +
+ +
+ Test Section 2 + + This is a test paragraph in Section 2 + + + + listitem text + + + + +
+ +
diff --git a/doc/Wayland/en-US/Preface.xml b/doc/Wayland/en-US/Preface.xml new file mode 100644 index 00000000..610170af --- /dev/null +++ b/doc/Wayland/en-US/Preface.xml @@ -0,0 +1,12 @@ + + +%BOOK_ENTITIES; +]> + + Preface + + + + + diff --git a/doc/Wayland/en-US/Revision_History.xml b/doc/Wayland/en-US/Revision_History.xml new file mode 100644 index 00000000..ef0907a5 --- /dev/null +++ b/doc/Wayland/en-US/Revision_History.xml @@ -0,0 +1,26 @@ + + +%BOOK_ENTITIES; +]> + + Revision History + + + + 0-0 + Thu Feb 23 2012 + + Dude + McPants + Dude.McPants@example.com + + + + Initial creation of book by publican + + + + + + diff --git a/doc/Wayland/en-US/Wayland.ent b/doc/Wayland/en-US/Wayland.ent new file mode 100644 index 00000000..c6b36c27 --- /dev/null +++ b/doc/Wayland/en-US/Wayland.ent @@ -0,0 +1,4 @@ + + + + diff --git a/doc/Wayland/en-US/Wayland.xml b/doc/Wayland/en-US/Wayland.xml new file mode 100644 index 00000000..b7cccbf9 --- /dev/null +++ b/doc/Wayland/en-US/Wayland.xml @@ -0,0 +1,12 @@ + + +%BOOK_ENTITIES; +]> + + + + + + + diff --git a/doc/Wayland/en-US/images/icon.svg b/doc/Wayland/en-US/images/icon.svg new file mode 100644 index 00000000..b2f16d0f --- /dev/null +++ b/doc/Wayland/en-US/images/icon.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/doc/Wayland/publican.cfg b/doc/Wayland/publican.cfg new file mode 100644 index 00000000..80ff1347 --- /dev/null +++ b/doc/Wayland/publican.cfg @@ -0,0 +1,6 @@ +# Config::Simple 4.59 +# Fri Feb 24 09:36:50 2012 + +xml_lang: "en-US" +type: Book +brand: common From 6071b7da94e1fcc24e4f4608aed8d08383916467 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Fri, 24 Feb 2012 09:47:44 +1000 Subject: [PATCH 3/8] doc: Fix up title page with logo and author information Abstract taken from http://wayland.freedesktop.org Signed-off-by: Peter Hutterer --- doc/Wayland/en-US/Author_Group.xml | 10 +++++----- doc/Wayland/en-US/Book_Info.xml | 13 ++++++++++--- doc/Wayland/en-US/Wayland.ent | 2 +- doc/Wayland/en-US/images/wayland.png | Bin 0 -> 5649 bytes 4 files changed, 16 insertions(+), 9 deletions(-) create mode 100644 doc/Wayland/en-US/images/wayland.png diff --git a/doc/Wayland/en-US/Author_Group.xml b/doc/Wayland/en-US/Author_Group.xml index b664025d..7a707604 100644 --- a/doc/Wayland/en-US/Author_Group.xml +++ b/doc/Wayland/en-US/Author_Group.xml @@ -5,12 +5,12 @@ ]> - Dude - McPants + Kristian + Høgsberg - Somewhere - Someone + Intel Corporation - Dude.McPants@example.com + krh@bitplanet.net + diff --git a/doc/Wayland/en-US/Book_Info.xml b/doc/Wayland/en-US/Book_Info.xml index 4a6d694f..4b134eb0 100644 --- a/doc/Wayland/en-US/Book_Info.xml +++ b/doc/Wayland/en-US/Book_Info.xml @@ -5,20 +5,27 @@ ]> Wayland - short description + The Wayland display server Documentation 0.1 0 0 - A short overview and summary of the book's subject and purpose, traditionally no more than one paragraph long. Note: the abstract will appear in the front matter of your book and will also be placed in the description field of the book's RPM spec file. + Wayland is a protocol for a compositor to talk to + its clients as well as a C library implementation of + that 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. - + diff --git a/doc/Wayland/en-US/Wayland.ent b/doc/Wayland/en-US/Wayland.ent index c6b36c27..da18a952 100644 --- a/doc/Wayland/en-US/Wayland.ent +++ b/doc/Wayland/en-US/Wayland.ent @@ -1,4 +1,4 @@ - + diff --git a/doc/Wayland/en-US/images/wayland.png b/doc/Wayland/en-US/images/wayland.png new file mode 100644 index 0000000000000000000000000000000000000000..c9937928ce9584a660ee10f7092eed2033f6eab8 GIT binary patch literal 5649 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 A`~Uy| literal 0 HcmV?d00001 From 125289a0d7a8675cf9207c26d808f69f24465c49 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Fri, 24 Feb 2012 11:01:39 +1000 Subject: [PATCH 4/8] doc: Add architecture from the website Signed-off-by: Peter Hutterer --- doc/Wayland/en-US/Architecture.xml | 318 ++++++++++++++++++ doc/Wayland/en-US/Wayland.xml | 1 + .../en-US/images/wayland-architecture.png | Bin 0 -> 29162 bytes doc/Wayland/en-US/images/x-architecture.png | Bin 0 -> 37306 bytes 4 files changed, 319 insertions(+) create mode 100644 doc/Wayland/en-US/Architecture.xml create mode 100644 doc/Wayland/en-US/images/wayland-architecture.png create mode 100644 doc/Wayland/en-US/images/x-architecture.png diff --git a/doc/Wayland/en-US/Architecture.xml b/doc/Wayland/en-US/Architecture.xml new file mode 100644 index 00000000..d10260a8 --- /dev/null +++ b/doc/Wayland/en-US/Architecture.xml @@ -0,0 +1,318 @@ + + +%BOOK_ENTITIES; +]> + + Wayland Architecture +
+ X vs. Wayland Architecture + + A good way to understand the wayland architecture + and how it is different from X is to follow an event + from the input device to the point where the change + it affects appears on screen. + + + This is where we are now with X: + + + + + + + + + + + The kernel gets an event from an input + device and sends it to X through the evdev + input driver. The kernel does all the hard + work here by driving the device and + translating the different device specific + event protocols to the linux evdev input + event standard. + + + + + The X server determines which window the + event affects and sends it to the clients + that have selected for the event in question + on that window. The X server doesn't + actually know how to do this right, since + the window location on screen is controlled + by the compositor and may be transformed in + a number of ways that the X server doesn't + understand (scaled down, rotated, wobbling, + etc). + + + + + The client looks at the event and decides + what to do. Often the UI will have to change + in response to the event - perhaps a check + box was clicked or the pointer entered a + button that must be highlighted. Thus the + client sends a rendering request back to the + X server. + + + + + When the X server receives the rendering + request, it sends it to the driver to let it + program the hardware to do the rendering. + The X server also calculates the bounding + region of the rendering, and sends that to + the compositor as a damage event. + + + + + The damage event tells the compositor that + something changed in the window and that it + has to recomposite the part of the screen + where that window is visible. The compositor + is responsible for rendering the entire + screen contents based on its scenegraph and + the contents of the X windows. Yet, it has + to go through the X server to render this. + + + + + The X server receives the rendering requests + from the compositor and either copies the + compositor back buffer to the front buffer + or does a pageflip. In the general case, the + X server has to do this step so it can + account for overlapping windows, which may + require clipping and determine whether or + not it can page flip. However, for a + compositor, which is always fullscreen, this + is another unnecessary context switch. + + + + + + As suggested above, there are a few problems with this + approach. The X server doesn't have the information to + decide which window should receive the event, nor can it + transform the screen coordinates to window local + coordinates. And even though X has handed responsibility for + the final painting of the screen to the compositing manager, + X still controls the front buffer and modesetting. Most of + the complexity that the X server used to handle is now + available in the kernel or self contained libraries (KMS, + evdev, mesa, fontconfig, freetype, cairo, Qt etc). In + general, the X server is now just a middle man that + introduces an extra step between applications and the + compositor and an extra step between the compositor and the + hardware. + + + In wayland the compositor is the display server. We transfer + the control of KMS and evdev to the compositor. The wayland + protocol lets the compositor send the input events directly + to the clients and lets the client send the damage event + directly to the compositor: + + + + + + + + + + + The kernel gets an event and sends + it to the compositor. This + is similar to the X case, which is + great, since we get to reuse all the + input drivers in the kernel. + + + + + The compositor looks through its + scenegraph to determine which window + should receive the event. The + scenegraph corresponds to what's on + screen and the compositor + understands the transformations that + it may have applied to the elements + in the scenegraph. Thus, the + compositor can pick the right window + and transform the screen coordinates + to window local coordinates, by + applying the inverse + transformations. The types of + transformation that can be applied + to a window is only restricted to + what the compositor can do, as long + as it can compute the inverse + transformation for the input events. + + + + + As in the X case, when the client + receives the event, it updates the + UI in response. But in the wayland + case, the rendering happens in the + client, and the client just sends a + request to the compositor to + indicate the region that was + updated. + + + + + The compositor collects damage + requests from its clients and then + recomposites the screen. The + compositor can then directly issue + an ioctl to schedule a pageflip with + KMS. + + + + + + +
+
+ Wayland Rendering + + One of the details I left out in the above overview + is how clients actually render under wayland. By + removing the X server from the picture we also + removed the mechanism by which X clients typically + render. But there's another mechanism that we're + already using with DRI2 under X: direct rendering. + With direct rendering, the client and the server + share a video memory buffer. The client links to a + rendering library such as OpenGL that knows how to + program the hardware and renders directly into the + buffer. The compositor in turn can take the buffer + and use it as a texture when it composites the + desktop. After the initial setup, the client only + needs to tell the compositor which buffer to use and + when and where it has rendered new content into it. + + + + This leaves an application with two ways to update its window contents: + + + + + + Render the new content into a new buffer and tell the compositor + to use that instead of the old buffer. The application can + allocate a new buffer every time it needs to update the window + contents or it can keep two (or more) buffers around and cycle + between them. The buffer management is entirely under + application control. + + + + + Render the new content into the buffer that it previously + told the compositor to to use. While it's possible to just + render directly into the buffer shared with the compositor, + this might race with the compositor. What can happen is that + repainting the window contents could be interrupted by the + compositor repainting the desktop. If the application gets + interrupted just after clearing the window but before + rendering the contents, the compositor will texture from a + blank buffer. The result is that the application window will + flicker between a blank window or half-rendered content. The + traditional way to avoid this is to render the new content + into a back buffer and then copy from there into the + compositor surface. The back buffer can be allocated on the + fly and just big enough to hold the new content, or the + application can keep a buffer around. Again, this is under + application control. + + + + + + In either case, the application must tell the compositor + which area of the surface holds new contents. When the + application renders directly the to shared buffer, the + compositor needs to be noticed that there is new content. + But also when exchanging buffers, the compositor doesn't + assume anything changed, and needs a request from the + application before it will repaint the desktop. The idea + that even if an application passes a new buffer to the + compositor, only a small part of the buffer may be + different, like a blinking cursor or a spinner. + Hardware Enabling for Wayland + + + Typically, hardware enabling includes modesetting/display + and EGL/GLES2. On top of that Wayland needs a way to share + buffers efficiently between processes. There are two sides + to that, the client side and the server side. + + + On the client side we've defined a Wayland EGL platform. In + the EGL model, that consists of the native types + (EGLNativeDisplayType, EGLNativeWindowType and + EGLNativePixmapType) and a way to create those types. In + other words, it's the glue code that binds the EGL stack and + its buffer sharing mechanism to the generic Wayland API. The + EGL stack is expected to provide an implementation of the + Wayland EGL platform. The full API is in the wayland-egl.h + header. The open source implementation in the mesa EGL stack + is in wayland-egl.c and platform_wayland.c. + + + Under the hood, the EGL stack is expected to define a + vendor-specific protocol extension that lets the client side + EGL stack communicate buffer details with the compositor in + order to share buffers. The point of the wayland-egl.h API + is to abstract that away and just let the client create an + EGLSurface for a Wayland surface and start rendering. The + open source stack uses the drm Wayland extension, which lets + the client discover the drm device to use and authenticate + and then share drm (GEM) buffers with the compositor. + + + The server side of Wayland is the compositor and core UX for + the vertical, typically integrating task switcher, app + launcher, lock screen in one monolithic application. The + server runs on top of a modesetting API (kernel modesetting, + OpenWF Display or similar) and composites the final UI using + a mix of EGL/GLES2 compositor and hardware overlays if + available. Enabling modesetting, EGL/GLES2 and overlays is + something that should be part of standard hardware bringup. + The extra requirement for Wayland enabling is the + EGL_WL_bind_wayland_display extension that lets the + compositor create an EGLImage from a generic Wayland shared + buffer. It's similar to the EGL_KHR_image_pixmap extension + to create an EGLImage from an X pixmap. + + + The extension has a setup step where you have to bind the + EGL display to a Wayland display. Then as the compositor + receives generic Wayland buffers from the clients (typically + when the client calls eglSwapBuffers), it will be able to + pass the struct wl_buffer pointer to eglCreateImageKHR as + the EGLClientBuffer argument and with EGL_WAYLAND_BUFFER_WL + as the target. This will create an EGLImage, which can then + be used by the compositor as a texture or passed to the + modesetting code to use as an overlay plane. Again, this is + implemented by the vendor specific protocol extension, which + on the server side will receive the driver specific details + about the shared buffer and turn that into an EGL image when + the user calls eglCreateImageKHR. + +
+
diff --git a/doc/Wayland/en-US/Wayland.xml b/doc/Wayland/en-US/Wayland.xml index b7cccbf9..20119f58 100644 --- a/doc/Wayland/en-US/Wayland.xml +++ b/doc/Wayland/en-US/Wayland.xml @@ -7,6 +7,7 @@ + diff --git a/doc/Wayland/en-US/images/wayland-architecture.png b/doc/Wayland/en-US/images/wayland-architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..4f92e0fb93825a68095b75d499bac00e968419e5 GIT binary patch literal 29162 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 literal 0 HcmV?d00001 diff --git a/doc/Wayland/en-US/images/x-architecture.png b/doc/Wayland/en-US/images/x-architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..098205b57a973311c22c914073fe53414f4c0a35 GIT binary patch literal 37306 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 Date: Wed, 29 Feb 2012 08:42:26 +1000 Subject: [PATCH 5/8] doc: Comment out some of the default chapters I'll leave them in for now as a template for how things looked originally, this can be removed later. Signed-off-by: Peter Hutterer --- doc/Wayland/en-US/Wayland.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/doc/Wayland/en-US/Wayland.xml b/doc/Wayland/en-US/Wayland.xml index 20119f58..acec6820 100644 --- a/doc/Wayland/en-US/Wayland.xml +++ b/doc/Wayland/en-US/Wayland.xml @@ -5,9 +5,14 @@ ]> + + + From c3d56a05c6f01c3409ba8ad53765cb9dd84715b6 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Fri, 24 Feb 2012 09:42:05 +1000 Subject: [PATCH 6/8] Hook up autotools for publican automake doesn't seem to provide a sensible method to install a directory of stuff in $(docdir). Do it manually then. Signed-off-by: Peter Hutterer --- Makefile.am | 2 +- configure.ac | 5 +++++ doc/Makefile.am | 1 + doc/Wayland/.gitignore | 1 + doc/Wayland/Makefile.am | 35 +++++++++++++++++++++++++++++++++++ doc/Wayland/publican.cfg | 2 ++ 6 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 doc/Makefile.am create mode 100644 doc/Wayland/.gitignore create mode 100644 doc/Wayland/Makefile.am diff --git a/Makefile.am b/Makefile.am index 016bb760..332f9b46 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,4 +1,4 @@ -SUBDIRS = src protocol +SUBDIRS = src protocol doc ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS} diff --git a/configure.ac b/configure.ac index fc623e82..b709e3c1 100644 --- a/configure.ac +++ b/configure.ac @@ -51,8 +51,13 @@ fi AC_PATH_PROG(XSLTPROC, xsltproc) AM_CONDITIONAL([HAVE_XSLTPROC], [test $XSLTPROC != ""]) +AC_PATH_PROG(PUBLICAN, publican) +AM_CONDITIONAL([HAVE_PUBLICAN], [test $PUBLICAN != ""]) + AC_CONFIG_FILES([Makefile wayland-scanner.m4 + doc/Makefile + doc/Wayland/Makefile src/Makefile src/wayland-server.pc src/wayland-client.pc diff --git a/doc/Makefile.am b/doc/Makefile.am new file mode 100644 index 00000000..f8046e78 --- /dev/null +++ b/doc/Makefile.am @@ -0,0 +1 @@ +SUBDIRS = Wayland diff --git a/doc/Wayland/.gitignore b/doc/Wayland/.gitignore new file mode 100644 index 00000000..33b78ca5 --- /dev/null +++ b/doc/Wayland/.gitignore @@ -0,0 +1 @@ +Wayland diff --git a/doc/Wayland/Makefile.am b/doc/Wayland/Makefile.am new file mode 100644 index 00000000..854da79b --- /dev/null +++ b/doc/Wayland/Makefile.am @@ -0,0 +1,35 @@ +if HAVE_PUBLICAN +EXTRA_DIST = Wayland +noinst_DATA = Wayland + +publican_sources = \ + $(srcdir)/en-US/Wayland.ent \ + $(srcdir)/en-US/Architecture.xml \ + $(srcdir)/en-US/Author_Group.xml \ + $(srcdir)/en-US/Book_Info.xml \ + $(srcdir)/en-US/Chapter.xml \ + $(srcdir)/en-US/Preface.xml \ + $(srcdir)/en-US/Wayland.xml \ + $(srcdir)/en-US/Revision_History.xml \ + $(srcdir)/en-US/images/icon.svg \ + $(srcdir)/en-US/images/wayland-architecture.png \ + $(srcdir)/en-US/images/wayland.png \ + $(srcdir)/en-US/images/x-architecture.png + + +Wayland: publican.cfg $(publican_sources) + publican build --lang en-US --format html,pdf + +clean-local: + -rm -rf Wayland + +install-data-local: + $(MKDIR_P) $(DESTDIR)$(docdir) + cp -R $(builddir)/Wayland $(DESTDIR)$(docdir) + +uninstall-local: + -rm -rf $(DESTDIR)$(docdir)/Wayland/* + -rmdir $(DESTDIR)$(docdir)/Wayland + +EXTRA_DIST = $(publican_sources) publican.cfg +endif diff --git a/doc/Wayland/publican.cfg b/doc/Wayland/publican.cfg index 80ff1347..810c7358 100644 --- a/doc/Wayland/publican.cfg +++ b/doc/Wayland/publican.cfg @@ -4,3 +4,5 @@ xml_lang: "en-US" type: Book brand: common +tmp_dir: Wayland + From a678fd53e16b7cb7eb2dbef218e89c649bdaabc7 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Fri, 24 Feb 2012 17:31:51 +1000 Subject: [PATCH 7/8] Generate the docbook description for the protocol from wayland.xml Convert the wayland.xml protocol description to a docbook-compatible format and hook it up to the publican sources. Signed-off-by: Peter Hutterer --- doc/Wayland/.gitignore | 1 + doc/Wayland/Makefile.am | 9 ++- doc/Wayland/en-US/Wayland.xml | 1 + doc/Wayland/protocol-to-docbook.xsl | 113 ++++++++++++++++++++++++++++ 4 files changed, 122 insertions(+), 2 deletions(-) create mode 100644 doc/Wayland/protocol-to-docbook.xsl diff --git a/doc/Wayland/.gitignore b/doc/Wayland/.gitignore index 33b78ca5..cf787546 100644 --- a/doc/Wayland/.gitignore +++ b/doc/Wayland/.gitignore @@ -1 +1,2 @@ Wayland +en-US/Protocol.xml diff --git a/doc/Wayland/Makefile.am b/doc/Wayland/Makefile.am index 854da79b..099efb24 100644 --- a/doc/Wayland/Makefile.am +++ b/doc/Wayland/Makefile.am @@ -17,9 +17,13 @@ publican_sources = \ $(srcdir)/en-US/images/x-architecture.png -Wayland: publican.cfg $(publican_sources) +Wayland: docbook-xsl publican.cfg $(publican_sources) publican build --lang en-US --format html,pdf +# This must be run befor the publican run +docbook-xsl: $(top_srcdir)/protocol/wayland.xml protocol-to-docbook.xsl + $(AM_V_GEN)$(XSLTPROC) protocol-to-docbook.xsl $(top_srcdir)/protocol/wayland.xml > $(srcdir)/en-US/Protocol.xml + clean-local: -rm -rf Wayland @@ -31,5 +35,6 @@ uninstall-local: -rm -rf $(DESTDIR)$(docdir)/Wayland/* -rmdir $(DESTDIR)$(docdir)/Wayland -EXTRA_DIST = $(publican_sources) publican.cfg +EXTRA_DIST = $(publican_sources) publican.cfg protocol-to-docbook.xsl + endif diff --git a/doc/Wayland/en-US/Wayland.xml b/doc/Wayland/en-US/Wayland.xml index acec6820..829d362d 100644 --- a/doc/Wayland/en-US/Wayland.xml +++ b/doc/Wayland/en-US/Wayland.xml @@ -10,6 +10,7 @@ --> + diff --git a/doc/Wayland/protocol-to-docbook.xsl b/doc/Wayland/protocol-to-docbook.xsl new file mode 100644 index 00000000..e50d80d9 --- /dev/null +++ b/doc/Wayland/protocol-to-docbook.xsl @@ -0,0 +1,113 @@ + + + + + + + + +%BOOK_ENTITIES; +]> +]]> + + + Wayland Protocol Specification + + + + + + + + + + + + + + + + + +

+ protocol-- + + + <xsl:value-of select="@name" /> + <!-- only show summary if it exists --> + <xsl:if test="description/@summary"> + - <xsl:value-of select="description/@summary" /> + </xsl:if> + + + + + +
+ Requests provided by <xsl:value-of select="@name" /> + +
+
+ +
+ Events provided by <xsl:value-of select="@name" /> events + +
+
+ +
+ Enums provided by <xsl:value-of select="@name" /> enums + +
+
+
+ + + + + + + + + Type: + + + Value: + + + + + + + + + + +
+ protocol-interface--- + + <xsl:value-of select="../@name"/>::<xsl:value-of select="@name" /> + <xsl:if test="description/@summary"> + - <xsl:value-of select="description/@summary" /> + </xsl:if> + + + + + <xsl:value-of select="../@name"/>::<xsl:value-of select="@name" /> arguments + + + + + + <xsl:value-of select="../@name"/>::<xsl:value-of select="@name" /> values + + + +
+
+ + + From 1070579d4b90c056eb627268ae55bac3fde6a9df Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Wed, 29 Feb 2012 11:49:16 +1000 Subject: [PATCH 8/8] Hack up distcheck for publican Publican requires a read-write source tree, see http://bugzilla.redhat.com/show_bug.cgi?id=798484 And it currently cannot build out-of-tree, so we need to copy the sources into the _build tree and generate Protocol.xml into that tree too (we'd have to do this anyway since automake creates a read-only source tree, so we can't just link). Signed-off-by: Peter Hutterer --- doc/Wayland/Makefile.am | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/doc/Wayland/Makefile.am b/doc/Wayland/Makefile.am index 099efb24..0ac9fff9 100644 --- a/doc/Wayland/Makefile.am +++ b/doc/Wayland/Makefile.am @@ -1,5 +1,4 @@ if HAVE_PUBLICAN -EXTRA_DIST = Wayland noinst_DATA = Wayland publican_sources = \ @@ -16,16 +15,31 @@ publican_sources = \ $(srcdir)/en-US/images/wayland.png \ $(srcdir)/en-US/images/x-architecture.png +# publican does not support out-of-tree builds and during make distcheck the +# source tree is read-only so we can't chdir and/or dump the protocol there +# copy the tree into _build, leaving a marker file to clean up after +# distclean +# See https://bugzilla.redhat.com/show_bug.cgi?id=798484 for the chmod +copy-sources: + if ! test -e "en-US/"; then \ + mkdir en-US/; \ + touch en-US/need-distclean; \ + cp -r $(srcdir)/en-US/* en-US; \ + chmod u+w en-US/images; \ + fi Wayland: docbook-xsl publican.cfg $(publican_sources) - publican build --lang en-US --format html,pdf + publican build --config=$(srcdir)/publican.cfg --lang en-US --format html,pdf # This must be run befor the publican run -docbook-xsl: $(top_srcdir)/protocol/wayland.xml protocol-to-docbook.xsl - $(AM_V_GEN)$(XSLTPROC) protocol-to-docbook.xsl $(top_srcdir)/protocol/wayland.xml > $(srcdir)/en-US/Protocol.xml +docbook-xsl: copy-sources $(top_srcdir)/protocol/wayland.xml $(srcdir)/protocol-to-docbook.xsl + $(AM_V_GEN)$(XSLTPROC) $(srcdir)/protocol-to-docbook.xsl $(top_srcdir)/protocol/wayland.xml > $(builddir)/en-US/Protocol.xml clean-local: -rm -rf Wayland + if test -e "en-US/need-distclean"; then \ + rm -rf en-US; \ + fi install-data-local: $(MKDIR_P) $(DESTDIR)$(docdir)