wayland: Changes to 'debian-experimental'
.gitignore | 2
Makefile.am | 6
TODO | 21
configure.ac | 28
cursor/Makefile.am | 1
cursor/convert_font.c | 531 +++++++
cursor/cursor-data.h | 548 +++++++
cursor/cursor.pcf |binary
cursor/wayland-cursor.c | 73 +
cursor/xcursor.c | 5
debian/changelog | 11
debian/control | 2
debian/libwayland-dev.install | 3
doc/Makefile.am | 2
doc/Wayland/Makefile.am | 35
doc/Wayland/doxygen-to-publican.xsl | 46
doc/Wayland/en_US/Architecture.xml | 2
doc/Wayland/en_US/Library.xml | 9
doc/Wayland/en_US/Protocol.xml | 458 +-----
doc/Wayland/en_US/Wayland.xml | 2
doc/Wayland/protocol-interfaces-to-docbook.xsl | 56
doc/Wayland/protocol-to-docbook.xsl | 33
doc/Wayland/publican.cfg | 2
doc/doxygen/.gitignore | 1
doc/doxygen/Makefile.am | 13
doc/doxygen/wayland.doxygen.in | 1782 +++++++++++++++++++++++++
doc/man/Makefile.am | 49
doc/man/wl_display_connect.xml | 88 +
protocol/wayland.xml | 366 ++++-
src/connection.c | 328 ++--
src/data-device.c | 13
src/event-loop.c | 15
src/scanner.c | 157 +-
src/wayland-client.c | 853 ++++++++---
src/wayland-client.h | 144 +-
src/wayland-egl.h | 9
src/wayland-private.h | 25
src/wayland-server.c | 272 ++-
src/wayland-server.h | 48
src/wayland-shm.c | 47
src/wayland-util.c | 14
src/wayland-util.h | 32
tests/client-test.c | 1
tests/connection-test.c | 82 -
tests/os-wrappers-test.c | 31
tests/sanity-test.c | 8
tests/socket-test.c | 22
tests/test-runner.c | 10
48 files changed, 5126 insertions(+), 1160 deletions(-)
New commits:
commit fe42325c6aca36063678cf44719c2c35ee785ce5
Author: Maarten Lankhorst <maarten.lankhorst@canonical.com>
Date: Mon Nov 19 19:15:16 2012 +0100
New upstream release
* New upstream release
* debian/libwayland-dev.install:
- Install development man pages
* debian/control:
- Build-depend on doxygen
- Build-depend on xsltproc
diff --git a/debian/changelog b/debian/changelog
index 9ccb9e1..dd50073 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,14 @@
+wayland (1.0.0-1) UNRELEASED; urgency=low
+
+ * New upstream release
+ * debian/libwayland-dev.install:
+ - Install development man pages
+ * debian/control:
+ - Build-depend on doxygen
+ - Build-depend on xsltproc
+
+ -- Robert Ancell <robert.ancell@canonical.com> Fri, 16 Nov 2012 10:07:08 +1300
+
wayland (0.95.0-1) UNRELEASED; urgency=low
* New upstream release.
diff --git a/debian/control b/debian/control
index ba493a2..e70898d 100644
--- a/debian/control
+++ b/debian/control
@@ -8,6 +8,8 @@ Build-Depends:
quilt,
dh-autoreconf,
pkg-config,
+ doxygen,
+ xsltproc,
libexpat1-dev,
libffi-dev,
Standards-Version: 3.9.3
diff --git a/debian/libwayland-dev.install b/debian/libwayland-dev.install
index 9b01b5b..7fab4ad 100644
--- a/debian/libwayland-dev.install
+++ b/debian/libwayland-dev.install
@@ -4,6 +4,9 @@ usr/bin/wayland-scanner
# Headers:
usr/include
+# Man pages
+usr/share/man/man3
+
# Use no wildcards to ensure we spot any update:
usr/lib/*/libwayland-client.a
usr/lib/*/libwayland-client.so
commit 1f521a4f7760df73e1d1d8a6791d1c7bf536584e
Author: Kristian Høgsberg <krh@bitplanet.net>
Date: Mon Oct 22 14:55:06 2012 -0400
configure.ac: Bump version to 1.0.0
diff --git a/configure.ac b/configure.ac
index 1a10cf8..f681fc9 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,7 +1,7 @@
AC_PREREQ([2.64])
-m4_define([wayland_major_version], [0])
-m4_define([wayland_minor_version], [99])
+m4_define([wayland_major_version], [1])
+m4_define([wayland_minor_version], [0])
m4_define([wayland_micro_version], [0])
m4_define([wayland_version],
[wayland_major_version.wayland_minor_version.wayland_micro_version])
commit 3b7d7b0c8014e31ec8ae1d2b31fb8c6de54cbc21
Author: Kristian Høgsberg <krh@bitplanet.net>
Date: Sun Oct 21 22:24:33 2012 -0400
scanner: Preserve paragraph breaks in input XML
If we have a blank line in the incoming XML documentation, keep that in
the emitted doxygen comments.
diff --git a/src/scanner.c b/src/scanner.c
index 4a4e605..5793c20 100644
--- a/src/scanner.c
+++ b/src/scanner.c
@@ -177,7 +177,7 @@ desc_dump(char *desc, const char *fmt, ...)
{
va_list ap;
char buf[128], hang;
- int col, i, j, k, startcol;
+ int col, i, j, k, startcol, newlines;
va_start(ap, fmt);
vsnprintf(buf, sizeof buf, fmt, ap);
@@ -206,8 +206,12 @@ desc_dump(char *desc, const char *fmt, ...)
for (i = 0; desc[i]; ) {
k = i;
- while (desc[i] && isspace(desc[i]))
+ newlines = 0;
+ while (desc[i] && isspace(desc[i])) {
+ if (desc[i] == '\n')
+ newlines++;
i++;
+ }
if (!desc[i])
break;
@@ -215,7 +219,9 @@ desc_dump(char *desc, const char *fmt, ...)
while (desc[i] && !isspace(desc[i]))
i++;
- if (col + i - j > 72) {
+ if (newlines > 1)
+ printf("\n%s*", indent(startcol));
+ if (newlines > 1 || col + i - j > 72) {
printf("\n%s*%c", indent(startcol), hang);
col = startcol;
}
commit cc95db359c8b935699173ec921ba9316c762aea5
Author: Kristian Høgsberg <krh@bitplanet.net>
Date: Sun Oct 21 22:10:56 2012 -0400
doc: Fix typo in generated section header
We were generating headers such as 'Events provided by wl_display events',
drop the last 'events'.
diff --git a/doc/Wayland/protocol-to-docbook.xsl b/doc/Wayland/protocol-to-docbook.xsl
index b76dbd8..ca00efb 100644
--- a/doc/Wayland/protocol-to-docbook.xsl
+++ b/doc/Wayland/protocol-to-docbook.xsl
@@ -71,13 +71,13 @@
</xsl:if>
<xsl:if test="event">
<section>
- <title>Events provided by <xsl:value-of select="@name" /> events</title>
+ <title>Events provided by <xsl:value-of select="@name" /></title>
<xsl:apply-templates select="event" />
</section>
</xsl:if>
<xsl:if test="enum">
<section>
- <title>Enums provided by <xsl:value-of select="@name" /> enums</title>
+ <title>Enums provided by <xsl:value-of select="@name" /></title>
<xsl:apply-templates select="enum" />
</section>
</xsl:if>
commit 65eef9d817d3db2ae7c61cd02075d46cf7bd9f90
Author: Kristian Høgsberg <krh@bitplanet.net>
Date: Sun Oct 21 22:08:08 2012 -0400
wayland: Add protocol documentation for various interfaces
diff --git a/protocol/wayland.xml b/protocol/wayland.xml
index 019816d..6171670 100644
--- a/protocol/wayland.xml
+++ b/protocol/wayland.xml
@@ -44,13 +44,23 @@
</request>
<request name="get_registry">
+ <description summary="get global registry object">
+ This request creates a registry object that allows the client
+ to list and bind the global objects available from the
+ compositor.
+ </description>
<arg name="callback" type="new_id" interface="wl_registry"/>
</request>
<event name="error">
<description summary="fatal error event">
The error event is sent out when a fatal (non-recoverable)
- error has occurred.
+ error has occurred. The @object_id argument is the object
+ where the error occurred, most often in response to a request
+ to that object. The @code identifies the error and is defined
+ by the object interface. As such, each interface defines its
+ own set of error codes. The @message is an brief description
+ of the error, for (debugging) convenience.
</description>
<arg name="object_id" type="object"/>
<arg name="code" type="uint"/>
@@ -72,13 +82,39 @@
<event name="delete_id">
<description summary="acknowledge object id deletion">
- Server has deleted the id and client can now reuse it.
+ This event is used internally by the object ID management
+ logic. When a client deletes an object, the server will send
+ this event to acknowledge that it has seen the delete request.
+ When the client receive this event, it will know that it can
+ safely reuse the object ID
</description>
<arg name="id" type="uint" />
</event>
</interface>
<interface name="wl_registry" version="1">
+ <description summary="global registry object">
+ The global registry object. The server has a number of global
+ objects that are available to all clients. These objects
+ typically represent an actual object in the server (for example,
+ an input device) or they are singleton objects that provides
+ extension functionality.
+
+ When a client creates a registry object, the registry object
+ will emit a global event for each global currently in the
+ regitry. Globals come and go as a result of device hotplugs,
+ reconfiguration or other events, and the registry will send out
+ @global and @global_remove events to keep the client up to date
+ with the changes. To mark the end of the initial burst of
+ events, the client can use the wl_display.sync request
+ immediately after calling wl_display.get_registry.
+
+ A client can 'bind' to a global object by using the bind
+ request. This creates a client side handle that lets the object
+ emit events to the client and lets the client invoke requests on
+ the object.
+ </description>
+
<request name="bind">
<description summary="bind an object to the display">
Binds a new, client-created object to the server using @name as
@@ -90,14 +126,7 @@
<event name="global">
<description summary="announce global object">
- Notify the client of global objects. These are objects that
- are created by the server. Globals are published on the
- initial client connection sequence, upon device hotplugs,
- device disconnects, reconfiguration or other events. A client
- can 'bind' to a global object by using the bind request. This
- creates a client side handle that lets the object emit events
- to the client and lets the client invoke requests on the
- object.
+ Notify the client of global objects.
</description>
<arg name="name" type="uint"/>
<arg name="interface" type="string"/>
@@ -106,7 +135,13 @@
<event name="global_remove">
<description summary="announce removal of global object">
- Notify the client of removed global objects.
+ Notify the client of removed global objects. This event
+ notifies the client that the global identifies by @name is no
+ longer available. If the client bound to the global using the
+ 'bind' request, the client should now destroy that object.
+ The object remains valid and requests to the object will be
+ ignored until the client destroys it, to avoid races between
+ the global going away and a client sending a request to it.
</description>
<arg name="name" type="uint"/>
</event>
@@ -262,6 +297,15 @@
<interface name="wl_data_offer" version="1">
+ <description summary="offer to transfer data">
+ A wl_data_offer represents a piece of data offered for transfer
+ by another client (the source client). It is used by the
+ copy-and-paste and drag-and-drop mechanisms. The offer
+ describes the different mime types that the data can be
+ converted to and provides the mechanism for transferring the
+ data directly from the source client.
+ </description>
+
<request name="accept">
<description summary="accept one of the offered mime-types">
Indicate that the client can accept the given mime-type, or
@@ -273,6 +317,16 @@
</request>
<request name="receive">
+ <description summary="request that the data is transferred">
+ To transfer the offered data, the client issues this request
+ and indicates the mime-type it wants to receive. The transfer
+ happens through the passed fd (typically a pipe(7) file
+ descriptor). The source client writes the data in the
+ mime-type representation requested and then closes the fd.
+ The receiving client reads from the read end of the pipe until
+ EOF and the closes its end, at which point the transfer is
+ complete.
+ </description>
<arg name="mime_type" type="string"/>
<arg name="fd" type="fd"/>
</request>
@@ -290,6 +344,13 @@
</interface>
<interface name="wl_data_source" version="1">
+ <description summary="offer to transfer data">
+ The wl_data_source object is the source side of a wl_data_offer.
+ It is created by the source client in a data transfer and
+ provides a way to describe the offered data and a way to respond
+ to requests to transfer the data.
+ </description>
+
<request name="offer">
<description summary="add an offered mime type">
This request adds a mime-type to the set of mime-types
@@ -326,7 +387,8 @@
<event name="cancelled">
<description summary="selection was cancelled">
- Another selection became active.
+ This data source has been replaced by another data source.
+ The client should clean up and destroy this data source.
</description>
</event>
@@ -387,6 +449,13 @@
</event>
<event name="enter">
+ <description summary="initiate drag and drop session">
+ This event is sent when an active drag-and-drop pointer enters
+ a surface owned by the client. The position of the pointer at
+ enter time is provided by the @x an @y arguments, in surface
+ local coordinates.
+ </description>
+
<arg name="serial" type="uint"/>
<arg name="surface" type="object" interface="wl_surface"/>
<arg name="x" type="fixed"/>
@@ -394,9 +463,21 @@
<arg name="id" type="object" interface="wl_data_offer" allow-null="true"/>
</event>
- <event name="leave"/>
+ <event name="leave">
+ <description summary="end drag and drop session">
+ This event is sent when the drag-and-drop pointer leaves the
+ surface and the session ends. The client must destroy the
+ wl_data_offer introduced at enter time at this point.
+ </description>
+ </event>
<event name="motion">
+ <description summary="drag and drop session motion">
+ This event is sent when the drag-and-drop pointer moves within
+ the currently focused surface. The new position of the pointer
+ is provided by the @x an @y arguments, in surface local
+ coordinates.
+ </description>
<arg name="time" type="uint"/>
<arg name="x" type="fixed"/>
<arg name="y" type="fixed"/>
commit a04beb1298d44ec4a6b8e14efeb36353d37445f5
Author: Kristian Høgsberg <krh@bitplanet.net>
Date: Sun Oct 21 20:53:37 2012 -0400
Update TODO
We've knocked a few items of the list.
diff --git a/TODO b/TODO
index 00a32ca..8cb8d34 100644
--- a/TODO
+++ b/TODO
@@ -1,24 +1,9 @@
Core wayland protocol
- - Atomicity. Currently a lot of the atomicity in Wayland relies on
- how we batch up all requests in a protocol buffer and only flushes
- in the "blockhandler" in the client. Consensus was that we need
- something more reliable and explicit. The suggestion is that we
- make surface.attach a synchronization point such that everything
- before that is batched and applied atomically when the
- surface.attach request comes in. For cases where we need atomicity
- beyond a surface.attach, we can add an atomic grouping mechanism,
- that can group together multiple surface.attach requests into a
- bigger atomic change. To be researched a bit.
-
- Maybe try to make remote wayland actually happen, to see if there
is something in the protocol/architecture that makes it harder than
it should be.
- - Add timestamp to touch_cancel, add touch id to touch_cancel (?)
-
- - The output protocol needs to send all the ugly timing details for the modes.
-
ICCCM
- mime-type guidelines for data_source (ie, both dnd and selection):
@@ -53,8 +38,6 @@ EWMH
EGL/gbm
- - Don't wl_display_iterate in eglSwapBuffer, send an eventfd fd?
-
- Land Robert Braggs EGL extensions: frame age, swap with damage
- Make it possible to share buffers from compositor to clients.
@@ -71,6 +54,7 @@ EGL/gbm
allocate a scanout buffer now" event to the fullscreen-to-be
client.
+
Misc
- glyph cache
@@ -101,6 +85,7 @@ Misc
switching away from. for minimized windows that we don't want live
thumb nails for. etc.
+
Clients and ports
- port gtk+
@@ -120,8 +105,6 @@ Clients and ports
- SDL port, bnf has work in progress here:
http://cgit.freedesktop.org/~bnf/sdl-wayland/
- - libva + eglimage + kms integration
-
Ideas
commit c450b6e23bd9f57d8908bd11b96579ac107bed91
Author: Kristian Høgsberg <krh@bitplanet.net>
Date: Sun Oct 21 10:04:17 2012 -0400
tests: Include wayland-private.h for container_of
diff --git a/tests/client-test.c b/tests/client-test.c
index 5521510..5cf374d 100644
--- a/tests/client-test.c
+++ b/tests/client-test.c
@@ -32,6 +32,7 @@
#include <sys/stat.h>
#include "wayland-server.h"
+#include "wayland-private.h"
#include "test-runner.h"
struct client_destroy_listener {
commit 1bade73b6b58cf2c3187b0fca72f4aec8301c4a3
Author: Kristian Høgsberg <krh@bitplanet.net>
Date: Sat Oct 20 11:38:57 2012 -0400
scanner: Fix valgrind errors
diff --git a/src/scanner.c b/src/scanner.c
index d0aafec..4a4e605 100644
--- a/src/scanner.c
+++ b/src/scanner.c
@@ -393,6 +393,8 @@ start_element(void *data, const char *element_name, const char **atts)
case OBJECT:
if (interface_name)
arg->interface_name = strdup(interface_name);
+ else
+ arg->interface_name = NULL;
break;
default:
if (interface_name != NULL)
@@ -449,10 +451,7 @@ start_element(void *data, const char *element_name, const char **atts)
fail(ctx, "description without summary");
description = malloc(sizeof *description);
- if (summary)
- description->summary = strdup(summary);
- else
- description->summary = NULL;
+ description->summary = strdup(summary);
if (ctx->message)
ctx->message->description = description;
@@ -476,10 +475,9 @@ end_element(void *data, const XML_Char *name)
strndup(ctx->character_data,
ctx->character_data_length);
} else if (strcmp(name, "description") == 0) {
- char *text = strndup(ctx->character_data,
- ctx->character_data_length);
- if (text)
- ctx->description->text = text;
+ ctx->description->text =
+ strndup(ctx->character_data,
+ ctx->character_data_length);
ctx->description = NULL;
} else if (strcmp(name, "request") == 0 ||
strcmp(name, "event") == 0) {
@@ -1147,6 +1145,7 @@ int main(int argc, char *argv[])
protocol.type_index = 0;
protocol.null_run_length = 0;
protocol.copyright = NULL;
+ memset(&ctx, 0, sizeof ctx);
ctx.protocol = &protocol;
ctx.filename = "<stdin>";
commit 620d9edb2549e4cdbf07b61dae92a22d6fc7e971
Author: Kristian Høgsberg <krh@bitplanet.net>
Date: Fri Oct 19 23:26:38 2012 -0400
Rename __wl_container_of macro to just wl_container_of
The _* namespace and identifiers with double underscore are reserved
by the C standard. That makes __wl_container_of is double plus bad,
so lets just call it wl_container_of.
diff --git a/src/wayland-util.h b/src/wayland-util.h
index 4b1eca0..257a5d1 100644
--- a/src/wayland-util.h
+++ b/src/wayland-util.h
@@ -110,40 +110,40 @@ int wl_list_empty(struct wl_list *list);
void wl_list_insert_list(struct wl_list *list, struct wl_list *other);
#ifdef __GNUC__
-#define __wl_container_of(ptr, sample, member) \
+#define wl_container_of(ptr, sample, member) \
(__typeof__(sample))((char *)(ptr) - \
((char *)&(sample)->member - (char *)(sample)))
#else
-#define __wl_container_of(ptr, sample, member) \
+#define wl_container_of(ptr, sample, member) \
(void *)((char *)(ptr) - \
((char *)&(sample)->member - (char *)(sample)))
#endif
#define wl_list_for_each(pos, head, member) \
- for (pos = 0, pos = __wl_container_of((head)->next, pos, member); \
+ for (pos = 0, pos = wl_container_of((head)->next, pos, member); \
&pos->member != (head); \
- pos = __wl_container_of(pos->member.next, pos, member))
+ pos = wl_container_of(pos->member.next, pos, member))
#define wl_list_for_each_safe(pos, tmp, head, member) \
for (pos = 0, tmp = 0, \
- pos = __wl_container_of((head)->next, pos, member), \
- tmp = __wl_container_of((pos)->member.next, tmp, member); \
+ pos = wl_container_of((head)->next, pos, member), \
+ tmp = wl_container_of((pos)->member.next, tmp, member); \
&pos->member != (head); \
pos = tmp, \
- tmp = __wl_container_of(pos->member.next, tmp, member))
+ tmp = wl_container_of(pos->member.next, tmp, member))
#define wl_list_for_each_reverse(pos, head, member) \
- for (pos = 0, pos = __wl_container_of((head)->prev, pos, member); \
+ for (pos = 0, pos = wl_container_of((head)->prev, pos, member); \
&pos->member != (head); \
- pos = __wl_container_of(pos->member.prev, pos, member))
+ pos = wl_container_of(pos->member.prev, pos, member))
#define wl_list_for_each_reverse_safe(pos, tmp, head, member) \
for (pos = 0, tmp = 0, \
- pos = __wl_container_of((head)->prev, pos, member), \
- tmp = __wl_container_of((pos)->member.prev, tmp, member); \
+ pos = wl_container_of((head)->prev, pos, member), \
+ tmp = wl_container_of((pos)->member.prev, tmp, member); \
&pos->member != (head); \
pos = tmp, \
- tmp = __wl_container_of(pos->member.prev, tmp, member))
+ tmp = wl_container_of(pos->member.prev, tmp, member))
struct wl_array {
size_t size;
commit 7ec35d8e13c28b39d412127ac2459854c66cdfd5
Author: Kristian Høgsberg <krh@bitplanet.net>
Date: Fri Oct 19 23:06:53 2012 -0400
Move un-namespaced container_of into private header
diff --git a/src/data-device.c b/src/data-device.c
index 363a90d..4255c13 100644
--- a/src/data-device.c
+++ b/src/data-device.c
@@ -25,6 +25,7 @@
#include <unistd.h>
#include <stdio.h>
+#include "wayland-private.h"
#include "wayland-server.h"
static void
diff --git a/src/wayland-private.h b/src/wayland-private.h
index 0d617a7..1b98ce2 100644
--- a/src/wayland-private.h
+++ b/src/wayland-private.h
@@ -30,6 +30,10 @@
#define ARRAY_LENGTH(a) (sizeof (a) / sizeof (a)[0])
+#define container_of(ptr, type, member) ({ \
+ const __typeof__( ((type *)0)->member ) *__mptr = (ptr); \
+ (type *)( (char *)__mptr - offsetof(type,member) );})
+
#define WL_ZOMBIE_OBJECT ((void *) 2)
#define WL_MAP_SERVER_SIDE 0
diff --git a/src/wayland-shm.c b/src/wayland-shm.c
index 90c4cf7..47c126b 100644
--- a/src/wayland-shm.c
+++ b/src/wayland-shm.c
@@ -33,6 +33,7 @@
#include <sys/mman.h>
#include <unistd.h>
+#include "wayland-private.h"
#include "wayland-server.h"
struct wl_shm_pool {
diff --git a/src/wayland-util.h b/src/wayland-util.h
index 7c8f563..4b1eca0 100644
--- a/src/wayland-util.h
+++ b/src/wayland-util.h
@@ -39,10 +39,6 @@ extern "C" {
#define WL_EXPORT
#endif
-#define container_of(ptr, type, member) ({ \
- const __typeof__( ((type *)0)->member ) *__mptr = (ptr); \
- (type *)( (char *)__mptr - offsetof(type,member) );})
-
struct wl_message {
const char *name;
const char *signature;
commit bdd272f024744b4ed5ba6daedef7eb023bcac7cb
Author: Kristian Høgsberg <krh@bitplanet.net>
Date: Fri Oct 19 17:08:38 2012 -0400
Move ARRAY_LENGTH out of public headers
Exporting unprefixed symbols is a pretty bad idea so don't do that.
Instea of redefining it WL_ARRAY_LENGTH, we just move the define to
our private header. The scanner generates code that uses ARRAY_LENGTH,
but we can just make it count the number elements and emit an integer
constant instead.
diff --git a/cursor/wayland-cursor.c b/cursor/wayland-cursor.c
index 0d1fec7..25e51c2 100644
--- a/cursor/wayland-cursor.c
+++ b/cursor/wayland-cursor.c
@@ -31,6 +31,8 @@
#include "os-compatibility.h"
+#define ARRAY_LENGTH(a) (sizeof (a) / sizeof (a)[0])
+
struct shm_pool {
struct wl_shm_pool *pool;
int fd;
diff --git a/src/event-loop.c b/src/event-loop.c
index e383300..8db9c7c 100644
--- a/src/event-loop.c
+++ b/src/event-loop.c
@@ -35,6 +35,7 @@
#include <unistd.h>
#include <assert.h>
#include "wayland-server.h"
+#include "wayland-private.h"
#include "wayland-os.h"
struct wl_event_loop {
diff --git a/src/scanner.c b/src/scanner.c
index 47c22cb..d0aafec 100644
--- a/src/scanner.c
+++ b/src/scanner.c
@@ -127,6 +127,18 @@ struct parse_context {
unsigned int character_data_length;
};
+static int
+list_length(struct wl_list *list)
+{
+ struct wl_list *l;
+ int i;
+
+ for (i = 0, l = list->next; l != list; i++, l = l->next)
+ ;
+
+ return i;
+}
+
static char *
uppercase_dup(const char *src)
{
@@ -1106,14 +1118,14 @@ emit_code(struct protocol *protocol)
i->name, i->name, i->version);
if (!wl_list_empty(&i->request_list))
- printf("\tARRAY_LENGTH(%s_requests), %s_requests,\n",
- i->name, i->name);
+ printf("\t%d, %s_requests,\n",
+ list_length(&i->request_list), i->name);
else
printf("\t0, NULL,\n");
if (!wl_list_empty(&i->event_list))
- printf("\tARRAY_LENGTH(%s_events), %s_events,\n",
- i->name, i->name);
+ printf("\t%d, %s_events,\n",
+ list_length(&i->event_list), i->name);
else
printf("\t0, NULL,\n");
diff --git a/src/wayland-private.h b/src/wayland-private.h
index 8adee9f..0d617a7 100644
--- a/src/wayland-private.h
+++ b/src/wayland-private.h
@@ -28,6 +28,8 @@
#include <ffi.h>
#include "wayland-util.h"
+#define ARRAY_LENGTH(a) (sizeof (a) / sizeof (a)[0])
+
#define WL_ZOMBIE_OBJECT ((void *) 2)
#define WL_MAP_SERVER_SIDE 0
diff --git a/src/wayland-util.h b/src/wayland-util.h
index f54077e..7c8f563 100644
--- a/src/wayland-util.h
+++ b/src/wayland-util.h
@@ -39,8 +39,6 @@ extern "C" {
#define WL_EXPORT
#endif
-#define ARRAY_LENGTH(a) (sizeof (a) / sizeof (a)[0])
-
#define container_of(ptr, type, member) ({ \
const __typeof__( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
commit 56061674cd80e701174c1f1b1bf575aa308ecbd8
Author: Tiago Vignatti <tiago.vignatti@intel.com>
Date: Fri Oct 19 18:29:54 2012 +0300
configure: Depend on a more strict version of publican
Fix https://bugs.freedesktop.org/show_bug.cgi?id=56101
Signed-off-by: Tiago Vignatti <tiago.vignatti@intel.com>
diff --git a/configure.ac b/configure.ac
index 1c102c6..1a10cf8 100644
--- a/configure.ac
+++ b/configure.ac
@@ -86,6 +86,14 @@ if test "x$enable_documentation" = "xyes"; then
AC_PATH_PROG(PUBLICAN, publican)
+ if test "x$PUBLICAN" != "x"; then
+ PUBLICAN_VERSION=`$PUBLICAN -v | cut -d'=' -f2`
+
+ if test [ 1 -eq `echo "${PUBLICAN_VERSION} < 2.8" | bc` ]; then
+ AC_MSG_ERROR([Publican version is not supported. Install publican >= 2.8 or disable the documentation using --disable-documentation])
+ fi
+ fi
+
AC_CONFIG_FILES([
doc/doxygen/wayland.doxygen
])
commit 68c4136a070178d7b4712a42140af960bb3ba1a7
Author: Ander Conselvan de Oliveira <ander.conselvan.de.oliveira@intel.com>
Date: Fri Oct 19 15:30:26 2012 +0300
doc: Update doxygen documentation when source files are changed
diff --git a/doc/doxygen/Makefile.am b/doc/doxygen/Makefile.am
index 76f4cf6..957aa3d 100644
--- a/doc/doxygen/Makefile.am
+++ b/doc/doxygen/Makefile.am
@@ -2,7 +2,11 @@
noinst_DATA = xml/index.xml
dist_noinst_DATA = wayland.doxygen.in
-xml/index.xml:
+scanned_src_files = \
+ $(top_srcdir)/src/wayland-client.c \
+ $(top_srcdir)/src/wayland-client.h
+
+xml/index.xml: $(scanned_src_files)
doxygen wayland.doxygen
clean-local:
commit 818bb399b040f9db5d6563cfbd9ec8da9131f30d
Author: Ander Conselvan de Oliveira <ander.conselvan.de.oliveira@intel.com>
Date: Fri Oct 19 15:30:25 2012 +0300
doc: Clarify documentation about dispatching event queues
Clarify on what cases each of the dispatching functions may block, what
is the main thread and add some real world examples.
diff --git a/src/wayland-client.c b/src/wayland-client.c
index ccf8174..7e50b40 100644
--- a/src/wayland-client.c
+++ b/src/wayland-client.c
@@ -824,6 +824,11 @@ err_unlock:
* Dispatch all incoming events for objects assigned to the given
* event queue. On failure -1 is returned and errno set appropriately.
*
+ * This function blocks if there are no events to dispatch. If calling from
+ * the main thread, it will block reading data from the display fd. For other
+ * threads this will block until the main thread queues events on the queue
+ * passed as argument.
+ *
* \memberof wl_display
*/
WL_EXPORT int
@@ -833,14 +838,25 @@ wl_display_dispatch_queue(struct wl_display *display,
return dispatch_queue(display, queue, 1);
}
-/** Dispatch a display's main event queue
+/** Process incoming events
*
* \param display The display context object
* \return The number of dispatched events on success or -1 on failure
*
* Dispatch the display's main event queue.
*
- * \sa wl_display_dispatch_queue()
+ * If the main event queue is empty, this function blocks until there are
+ * events to be read from the display fd. Events are read and queued on
+ * the appropriate event queues. Finally, events on the main event queue
+ * are dispatched.
+ *
+ * \note It is not possible to check if there are events on the main queue
+ * or not. For dispatching main queue events without blocking, see \ref
+ * wl_display_dispatch_pending().
+ *
+ * \note Calling this makes the current thread the main one.
+ *
+ * \sa wl_display_dispatch_pending(), wl_display_dispatch_queue()
*
* \memberof wl_display
*/
@@ -852,6 +868,44 @@ wl_display_dispatch(struct wl_display *display)
return dispatch_queue(display, &display->queue, 1);
}
+/** Dispatch main queue events without reading from the display fd
+ *
+ * \param display The display context object
+ * \return The number of dispatched events or -1 on failure
+ *
+ * This function dispatches events on the main event queue. It does not
+ * attempt to read the display fd and simply returns zero if the main
+ * queue is empty, i.e., it doesn't block.
+ *
+ * This is necessary when a client's main loop wakes up on some fd other
+ * than the display fd (network socket, timer fd, etc) and calls \ref
+ * wl_display_dispatch_queue() from that callback. This may queue up
+ * events in the main queue while reading all data from the display fd.
+ * When the main thread returns to the main loop to block, the display fd
+ * no longer has data, causing a call to \em poll(2) (or similar
+ * functions) to block indefinitely, even though there are events ready
+ * to dispatch.
+ *
+ * To proper integrate the wayland display fd into a main loop, the
+ * client should always call \ref wl_display_dispatch_pending() and then
+ * \ref wl_display_flush() prior to going back to sleep. At that point,
+ * the fd typically doesn't have data so attempting I/O could block, but
+ * events queued up on the main queue should be dispatched.
+ *
+ * A real-world example is a main loop that wakes up on a timerfd (or a
+ * sound card fd becoming writable, for example in a video player), which
+ * then triggers GL rendering and eventually eglSwapBuffers().
+ * eglSwapBuffers() may call wl_display_dispatch_queue() if it didn't
+ * receive the frame event for the previous frame, and as such queue
+ * events in the main queue.
+ *
+ * \note Calling this makes the current thread the main one.
+ *
+ * \sa wl_display_dispatch(), wl_display_dispatch_queue(),
+ * wl_display_flush()
+ *
+ * \memberof wl_display
+ */
WL_EXPORT int
wl_display_dispatch_pending(struct wl_display *display)
{
diff --git a/src/wayland-client.h b/src/wayland-client.h
index fb9c952..71fe450 100644
--- a/src/wayland-client.h
+++ b/src/wayland-client.h
@@ -66,18 +66,46 @@ struct wl_proxy;
* representation to the display's write buffer. The data is sent to the
* compositor when the client calls \ref wl_display_flush().
*
- * Event handling is done in a thread-safe manner using event queues. The
- * display has a \em main event queue where initially all the events are
- * queued. The listeners for the events queued in it are called when the
- * client calls \ref wl_display_dispatch().
- *
- * The client can create additional event queues with \ref
- * wl_display_create_queue() and assign different \ref wl_proxy objects to it.
- * The events for a proxy are always queued only on its assign queue, that can
- * be dispatched by a different thread with \ref wl_display_dispatch_queue().
- *
- * All the \ref wl_display's functions are thread-safe.
- *
+ * Incoming data is handled in two steps: queueing and dispatching. In the
+ * queue step, the data coming from the display fd is interpreted and
+ * added to a queue. On the dispatch step, the handler for the incoming
+ * event set by the client on the corresponding \ref wl_proxy is called.
+ *
+ * A \ref wl_display has at least one event queue, called the <em>main
+ * queue</em>. Clients can create additional event queues with \ref
+ * wl_display_create_queue() and assign \ref wl_proxy's to it. Events
+ * occurring in a particular proxy are always queued in its assigned queue.
+ * A client can ensure that a certain assumption, such as holding a lock
+ * or running from a given thread, is true when a proxy event handler is
+ * called by assigning that proxy to an event queue and making sure that
+ * this queue is only dispatched when the assumption holds.
+ *
+ * The main queue is dispatched by calling \ref wl_display_dispatch().
+ * This will dispatch any events queued on the main queue and attempt
+ * to read from the display fd if its empty. Events read are then queued
+ * on the appropriate queues according to the proxy assignment. Calling
+ * that function makes the calling thread the <em>main thread</em>.
+ *
+ * A user created queue is dispatched with \ref wl_display_dispatch_queue().
+ * If there are no events to dispatch this function will block. If this
+ * is called by the main thread, this will attempt to read data from the
+ * display fd and queue any events on the appropriate queues. If calling
+ * from any other thread, the function will block until the main thread
+ * queues an event on the queue being dispatched.
+ *
+ * A real world example of event queue usage is Mesa's implementation of
+ * eglSwapBuffers() for the Wayland platform. This function might need
+ * to block until a frame callback is received, but dispatching the main
+ * queue could cause an event handler on the client to start drawing
+ * again. This problem is solved using another event queue, so that only
+ * the events handled by the EGL code are dispatched during the block.
+ *
+ * This creates a problem where the main thread dispatches a non-main
+ * queue, reading all the data from the display fd. If the application
Reply to: