This file is indexed.

/usr/share/doc/wayland/Wayland/en-US/html/apc.html is in libwayland-doc 1.9.0-1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
<html><head><meta http-equiv="Content-Type" content="text/html; charset=ANSI_X3.4-1968"><title>Appendix&#160;C.&#160;Server API</title><link rel="stylesheet" type="text/css" href="css/default.css"><meta name="generator" content="DocBook XSL Stylesheets V1.78.1"><link rel="home" href="index.html" title="Wayland"><link rel="up" href="index.html" title="Wayland"><link rel="prev" href="apb.html" title="Appendix&#160;B.&#160;Client API"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Appendix&#160;C.&#160;Server API</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="apb.html">Prev</a>&#160;</td><th width="60%" align="center">&#160;</th><td width="20%" align="right">&#160;</td></tr></table><hr></div><div class="appendix"><div class="titlepage"><div><div><h1 class="title"><a name="sect-Library-Server"></a>Appendix&#160;C.&#160;Server API</h1></div></div></div><div class="toc"><p><b>Table of Contents</b></p><dl class="toc"><dt><span class="section"><a href="apc.html#idp61374768">Introduction</a></span></dt><dt><span class="section"><a href="apc.html#Server-unionwl__argument">wl_argument
                - 
A union representing all of the basic data types that can be passed along the wayland wire format.     </a></span></dt><dt><span class="section"><a href="apc.html#Server-structwl__array">wl_array</a></span></dt><dt><span class="section"><a href="apc.html#Server-structwl__buffer">wl_buffer</a></span></dt><dt><span class="section"><a href="apc.html#Server-structwl__client">wl_client</a></span></dt><dt><span class="section"><a href="apc.html#Server-structwl__display">wl_display</a></span></dt><dt><span class="section"><a href="apc.html#Server-structwl__global">wl_global</a></span></dt><dt><span class="section"><a href="apc.html#Server-structwl__interface">wl_interface</a></span></dt><dt><span class="section"><a href="apc.html#Server-structwl__list">wl_list
                - 
doubly-linked list     </a></span></dt><dt><span class="section"><a href="apc.html#Server-structwl__listener">wl_listener
                - 
A single listener for Wayland signals.     </a></span></dt><dt><span class="section"><a href="apc.html#Server-structwl__message">wl_message</a></span></dt><dt><span class="section"><a href="apc.html#Server-structwl__object">wl_object
                - 
Use of this header file is discouraged.     </a></span></dt><dt><span class="section"><a href="apc.html#Server-structwl__resource">wl_resource</a></span></dt><dt><span class="section"><a href="apc.html#Server-structwl__shm__buffer">wl_shm_buffer</a></span></dt><dt><span class="section"><a href="apc.html#Server-structwl__shm__pool">wl_shm_pool</a></span></dt><dt><span class="section"><a href="apc.html#Server-structwl__shm__sigbus__data">wl_shm_sigbus_data</a></span></dt><dt><span class="section"><a href="apc.html#Server-structwl__signal">wl_signal
                - 
A source of a type of observable event.     </a></span></dt><dt><span class="section"><a href="apc.html#Server-structwl__socket">wl_socket</a></span></dt><dt><span class="section"><a href="apc.html#Server-Functions">Functions</a></span></dt></dl></div><div class="section"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="idp61374768"></a>Introduction</h2></div></div></div><p>
    The open-source reference implementation of Wayland protocol is
    split in two C libraries, <a class="link" href="apb.html" title="Appendix&#160;B.&#160;Client API">libwayland-client</a> and
    libwayland-server. Their main responsibility is to handle the
    Inter-process communication (<span class="emphasis"><em>IPC</em></span>) with each
    other, therefore guaranteeing the protocol objects marshaling and
    messages synchronization.
  </p><p>
    The server library is designed to work much like libwayland-client,
    although it is considerably complicated due to the server needing
    to support multiple versions of the protocol. It is best to learn
    libwayland-client first.
  </p><p>
    Each open socket to a client is represented by a <a class="link" href="apc.html#Server-structwl__client" title="wl_client">wl_client</a>.  The equvalent
    of the <a class="link" href="apb.html#Client-classwl__proxy" title="wl_proxy - Represents a protocol object on the client side.">wl_proxy</a> that
    libwayland-client uses to represent an object is <a class="link" href="apc.html#Server-structwl__resource" title="wl_resource">wl_resource</a> for
    client-created objects, and <a class="link" href="apc.html#Server-structwl__global" title="wl_global">wl_global</a> for objects
    created by the server.
  </p><p>
    Often a server is also a client for another Wayland server, and
    thus must link with both libwayland-client and libwayland-server.
    This produces some type name conflicts (such as the <a class="link" href="apb.html#Client-classwl__display" title="wl_display - Represents a connection to the compositor and acts as a proxy to the wl_display singleton object.">client wl_display</a> and
    <a class="link" href="apc.html#Server-structwl__display" title="wl_display">server wl_display</a>,
    but the duplicate-but-not-the-same types are opaque, and accessed
    only inside the correct library where it came from. Naturally that
    means that the program writer needs to always know if a pointer to
    a wl_display is for the server or client side and use the
    corresponding functions.
  </p></div><div class="section"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="Server-unionwl__argument"></a>wl_argument
                - 
A union representing all of the basic data types that can be passed along the wayland wire format.     </h2></div></div></div><p>This union represents all of the basic data types that can be passed in the wayland wire format. It is used by dispatchers and runtime-friendly versions of the event and request marshaling functions. </p></div><div class="section"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="Server-structwl__array"></a>wl_array</h2></div></div></div><p></p></div><div class="section"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="Server-structwl__buffer"></a>wl_buffer</h2></div></div></div><p></p></div><div class="section"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="Server-structwl__client"></a>wl_client</h2></div></div></div><p></p><div class="variablelist"><dl class="variablelist"><dt><a name="Server-structwl__client_1a6a045ad15d6ca216c4da41ba67c9ef4a"></a><span class="term">wl_client_flush
            - 
Flush pending events to the client.         </span></dt><dd><pre class="synopsis">void wl_client_flush(struct wl_client *client)</pre><div class="variablelist"><dl class="variablelist"><dt><span class="term">client</span></dt><dd>
The client object</dd></dl></div><p>
Events sent to clients are queued in a buffer and written to the socket later - typically when the compositor has handled all requests and goes back to block in the event loop. This function flushes all queued up events for a client immediately. </p></dd><dt><a name="Server-structwl__client_1a9b2abda633c67a4cd06ea5d9be0482f3"></a><span class="term">wl_client_get_display
            - 
Get the display object for the given client.         </span></dt><dd><pre class="synopsis">struct wl_display * wl_client_get_display(struct wl_client *client)</pre><div class="variablelist"><dl class="variablelist"><dt><span class="term">client</span></dt><dd>
The client object </dd></dl></div><p>
</p><div class="variablelist"><dl class="variablelist"><dt><span class="term">Returns:</span></dt><dd>The display object the client is associated with. </dd></dl></div><p>
</p></dd><dt><a name="Server-structwl__client_1a82a97cb3a66c1c56826a09a7b42453d9"></a><span class="term">wl_client_get_credentials
            - 
Return Unix credentials for the client.         </span></dt><dd><pre class="synopsis">void wl_client_get_credentials(struct wl_client *client, pid_t *pid, uid_t *uid, gid_t *gid)</pre><div class="variablelist"><dl class="variablelist"><dt><span class="term">client</span></dt><dd>
The display object </dd><dt><span class="term">pid</span></dt><dd>
Returns the process ID </dd><dt><span class="term">uid</span></dt><dd>
Returns the user ID </dd><dt><span class="term">gid</span></dt><dd>
Returns the group ID</dd></dl></div><p>
This function returns the process ID, the user ID and the group ID for the given client. The credentials come from getsockopt() with SO_PEERCRED, on the client socket fd. All the pointers can be NULL, if the caller is not interested in a particular ID.</p><p>Be aware that for clients that a compositor forks and execs and then connects using socketpair(), this function will return the credentials for the compositor. The credentials for the socketpair are set at creation time in the compositor. </p></dd><dt><a name="Server-structwl__client_1ab9d04dffa9409db43154230c64bc1f84"></a><span class="term">wl_client_get_object
            - 
Look up an object in the client name space.         </span></dt><dd><pre class="synopsis">struct wl_resource * wl_client_get_object(struct wl_client *client, uint32_t id)</pre><div class="variablelist"><dl class="variablelist"><dt><span class="term">client</span></dt><dd>
The client object </dd><dt><span class="term">id</span></dt><dd>
The object id </dd></dl></div><p>
</p><div class="variablelist"><dl class="variablelist"><dt><span class="term">Returns:</span></dt><dd>The object or NULL if there is not object for the given ID</dd></dl></div><p>
This looks up an object in the client object name space by its object ID. </p></dd></dl></div></div><div class="section"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="Server-structwl__display"></a>wl_display</h2></div></div></div><p></p><div class="variablelist"><dl class="variablelist"><dt><a name="Server-structwl__display_1aa2436b6a0b56cd65d8f6e33b76cd292c"></a><span class="term">wl_client_create
            - 
Create a client for the given file descriptor.         </span></dt><dd><pre class="synopsis">struct wl_client * wl_client_create(struct wl_display *display, int fd)</pre><div class="variablelist"><dl class="variablelist"><dt><span class="term">display</span></dt><dd>
The display object </dd><dt><span class="term">fd</span></dt><dd>
The file descriptor for the socket to the client </dd></dl></div><p>
</p><div class="variablelist"><dl class="variablelist"><dt><span class="term">Returns:</span></dt><dd>The new client object or NULL on failure.</dd></dl></div><p>
Given a file descriptor corresponding to one end of a socket, this function will create a <a class="link" href="apc.html#Server-structwl__client" title="wl_client">wl_client</a> struct and add the new client to the compositors client list. At that point, the client is initialized and ready to run, as if the client had connected to the servers listening socket. When the client eventually sends requests to the compositor, the <a class="link" href="apc.html#Server-structwl__client" title="wl_client">wl_client</a> argument to the request handler will be the <a class="link" href="apc.html#Server-structwl__client" title="wl_client">wl_client</a> returned from this function.</p><p>The other end of the socket can be passed to wl_display_connect_to_fd() on the client side or used with the WAYLAND_SOCKET environment variable on the client side.</p><p>On failure this function sets errno accordingly and returns NULL. </p></dd><dt><a name="Server-structwl__display_1ac3dd9a1294b2b6103228a55e08709e9f"></a><span class="term">wl_display_create
            - 
Create Wayland display object.         </span></dt><dd><pre class="synopsis">struct wl_display * wl_display_create(void)</pre><div class="variablelist"><dl class="variablelist"><dt><span class="term">Returns:</span></dt><dd>The Wayland display object. Null if failed to create</dd></dl></div><p>
This creates the <a class="link" href="apc.html#Server-structwl__display" title="wl_display">wl_display</a> object. </p></dd><dt><a name="Server-structwl__display_1acd9ad2e1ca3ffb0ba0f1b77ae616f8ee"></a><span class="term">wl_display_destroy
            - 
Destroy Wayland display object.         </span></dt><dd><pre class="synopsis">void wl_display_destroy(struct wl_display *display)</pre><div class="variablelist"><dl class="variablelist"><dt><span class="term">display</span></dt><dd>
The Wayland display object which should be destroyed. </dd></dl></div><p>
</p><div class="variablelist"><dl class="variablelist"><dt><span class="term">Returns:</span></dt><dd>None.</dd></dl></div><p>
This function emits the <a class="link" href="apc.html#Server-structwl__display" title="wl_display">wl_display</a> destroy signal, releases all the sockets added to this display, free's all the globals associated with this display, free's memory of additional shared memory formats and destroy the display object.</p><p>
  See also: wl_display_add_destroy_listener 
</p></dd><dt><a name="Server-structwl__display_1a43f04f76ea1457edcf37c95de68b29ef"></a><span class="term">wl_display_get_serial
            - 
Get the current serial number.         </span></dt><dd><pre class="synopsis">uint32_t wl_display_get_serial(struct wl_display *display)</pre><div class="variablelist"><dl class="variablelist"><dt><span class="term">display</span></dt><dd>
The display object</dd></dl></div><p>
This function returns the most recent serial number, but does not increment it. </p></dd><dt><a name="Server-structwl__display_1a145f7d3e4b41fc9014c11bf01bd7eb4f"></a><span class="term">wl_display_next_serial
            - 
Get the next serial number.         </span></dt><dd><pre class="synopsis">uint32_t wl_display_next_serial(struct wl_display *display)</pre><div class="variablelist"><dl class="variablelist"><dt><span class="term">display</span></dt><dd>
The display object</dd></dl></div><p>
This function increments the display serial number and returns the new value. </p></dd><dt><a name="Server-structwl__display_1a9fdf7264f0a3a28a75c141db252067b8"></a><span class="term">wl_display_add_socket
            - 
Add a socket to Wayland display for the clients to connect.         </span></dt><dd><pre class="synopsis">int wl_display_add_socket(struct wl_display *display, const char *name)</pre><div class="variablelist"><dl class="variablelist"><dt><span class="term">display</span></dt><dd>
Wayland display to which the socket should be added. </dd><dt><span class="term">name</span></dt><dd>
Name of the Unix socket. </dd></dl></div><p>
</p><div class="variablelist"><dl class="variablelist"><dt><span class="term">Returns:</span></dt><dd>0 if success. -1 if failed.</dd></dl></div><p>
This adds a Unix socket to Wayland display which can be used by clients to connect to Wayland display.</p><p>If NULL is passed as name, then it would look for WAYLAND_DISPLAY env variable for the socket name. If WAYLAND_DISPLAY is not set, then default wayland-0 is used.</p><p>The Unix socket will be created in the directory pointed to by environment variable XDG_RUNTIME_DIR. If XDG_RUNTIME_DIR is not set, then this function fails and returns -1.</p><p>The length of socket path, i.e., the path set in XDG_RUNTIME_DIR and the socket name, must not exceed the maxium length of a Unix socket path. The function also fails if the user do not have write permission in the XDG_RUNTIME_DIR path or if the socket name is already in use. </p></dd><dt><a name="Server-structwl__display_1ad806e5d1f937b32f62998c44a0a16421"></a><span class="term">wl_display_add_shm_format
            - 
Add support for a wl_shm pixel format.         </span></dt><dd><pre class="synopsis">uint32_t * wl_display_add_shm_format(struct wl_display *display, uint32_t format)</pre><div class="variablelist"><dl class="variablelist"><dt><span class="term">display</span></dt><dd>
The display object </dd><dt><span class="term">format</span></dt><dd>
The wl_shm pixel format to advertise </dd></dl></div><p>
</p><div class="variablelist"><dl class="variablelist"><dt><span class="term">Returns:</span></dt><dd>A pointer to the wl_shm format that was added to the list or NULL if adding it to the list failed.</dd></dl></div><p>
Add the specified wl_shm format to the list of formats the wl_shm object advertises when a client binds to it. Adding a format to the list means that clients will know that the compositor supports this format and may use it for creating wl_shm buffers. The compositor must be able to handle the pixel format when a client requests it.</p><p>The compositor by default supports WL_SHM_FORMAT_ARGB8888 and WL_SHM_FORMAT_XRGB8888. </p></dd><dt><a name="Server-structwl__display_1acfc1920ead337417e5d546fd01af1806"></a><span class="term">wl_display_get_additional_shm_formats
            - 
Get list of additional wl_shm pixel formats.         </span></dt><dd><pre class="synopsis">struct wl_array * wl_display_get_additional_shm_formats(struct wl_display *display)</pre><div class="variablelist"><dl class="variablelist"><dt><span class="term">display</span></dt><dd>
The display object</dd></dl></div><p>
This function returns the list of addition wl_shm pixel formats that the compositor supports. WL_SHM_FORMAT_ARGB8888 and WL_SHM_FORMAT_XRGB8888 are always supported and not included in the array, but all formats added through <a class="link" href="apc.html#Server-structwl__display_1ad806e5d1f937b32f62998c44a0a16421">wl_display_add_shm_format()</a> will be in the array.</p><p>
  See also: <a class="link" href="apc.html#Server-structwl__display_1ad806e5d1f937b32f62998c44a0a16421">wl_display_add_shm_format()</a> 
</p></dd></dl></div></div><div class="section"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="Server-structwl__global"></a>wl_global</h2></div></div></div><p></p></div><div class="section"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="Server-structwl__interface"></a>wl_interface</h2></div></div></div><p></p></div><div class="section"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="Server-structwl__list"></a>wl_list
                - 
doubly-linked list     </h2></div></div></div><p>The list head is of "struct wl_list" type, and must be initialized using wl_list_init(). All entries in the list must be of the same type. The item type must have a "struct wl_list" member. This member will be initialized by wl_list_insert(). There is no need to call wl_list_init() on the individual item. To query if the list is empty in O(1), use wl_list_empty().</p><p>Let's call the list reference "struct wl_list foo_list", the item type as "item_t", and the item member as "struct wl_list link".</p><p>The following code will initialize a list: </p><pre class="programlisting">struct wl_list foo_list;

struct item_t {
        int foo;
        struct wl_list link;
};
struct item_t item1, item2, item3;

wl_list_init(&amp;foo_list);
wl_list_insert(&amp;foo_list, &amp;item1.link); // Pushes item1 at the head
wl_list_insert(&amp;foo_list, &amp;item2.link); // Pushes item2 at the head
wl_list_insert(&amp;item2.link, &amp;item3.link);       // Pushes item3 after item2
</pre><p>The list now looks like [item2, item3, item1]</p><p>Iterate the list in ascending order: </p><pre class="programlisting">item_t *item;
wl_list_for_each(item, foo_list, link) {
        Do_something_with_item(item);
}
</pre><p> </p></div><div class="section"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="Server-structwl__listener"></a>wl_listener
                - 
A single listener for Wayland signals.     </h2></div></div></div><p><a class="link" href="apc.html#Server-structwl__listener" title="wl_listener - A single listener for Wayland signals.">wl_listener</a> provides the means to listen for <a class="link" href="apc.html#Server-structwl__signal" title="wl_signal - A source of a type of observable event.">wl_signal</a> notifications. Many Wayland objects use <a class="link" href="apc.html#Server-structwl__listener" title="wl_listener - A single listener for Wayland signals.">wl_listener</a> for notification of significant events like object destruction.</p><p>Clients should create <a class="link" href="apc.html#Server-structwl__listener" title="wl_listener - A single listener for Wayland signals.">wl_listener</a> objects manually and can register them as listeners to signals using <a class="link" href="apc.html#Server-structwl__signal_1aa8bcd3b8e250cfe35ed064d5af589096">wl_signal_add</a>, assuming the signal is directly accessible. For opaque structs like wl_event_loop, adding a listener should be done through provided accessor methods. A listener can only listen to one signal at a time.</p><p>
    </p><pre class="programlisting">struct wl_listener your_listener;

your_listener.notify = your_callback_method;

// Direct access
wl_signal_add(&amp;some_object-&gt;destroy_signal, &amp;your_listener);

// Accessor access
wl_event_loop *loop = ...;
wl_event_loop_add_destroy_listener(loop, &amp;your_listener);
</pre><p>
  </p><p>If the listener is part of a larger struct, <a class="link" href="apc.html#Server-wayland-util_8h_1a09e3b64ee2195e1b80191aa1884d45aa">wl_container_of</a> can be used to retrieve a pointer to it:</p><p>
    </p><pre class="programlisting">void your_listener(struct wl_listener *listener, void *data)
{
        struct your_data *data;

        your_data = wl_container_of(listener, data, your_member_name);
}
</pre><p>
  </p><p>If you need to remove a listener from a signal, use wl_list_remove().</p><p>
    </p><pre class="programlisting">wl_list_remove(&amp;your_listener.link);
</pre><p>
  </p><p>
  See also: <a class="link" href="apc.html#Server-structwl__signal" title="wl_signal - A source of a type of observable event.">wl_signal</a> 
</p></div><div class="section"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="Server-structwl__message"></a>wl_message</h2></div></div></div><p></p></div><div class="section"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="Server-structwl__object"></a>wl_object
                - 
Use of this header file is discouraged.     </h2></div></div></div><p>Prefer including <a class="link" href="">wayland-server-core.h</a> instead, which does not include the client protocol header and as such only defines the library API, excluding the deprecated API below. </p></div><div class="section"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="Server-structwl__resource"></a>wl_resource</h2></div></div></div><p></p></div><div class="section"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="Server-structwl__shm__buffer"></a>wl_shm_buffer</h2></div></div></div><p></p><div class="variablelist"><dl class="variablelist"><dt><a name="Server-structwl__shm__buffer_1a9104a38eae80c5ba92c8ab030c70192f"></a><span class="term">wl_shm_buffer_get_data
            - 
Get a pointer to the memory for the SHM buffer.         </span></dt><dd><pre class="synopsis">void * wl_shm_buffer_get_data(struct wl_shm_buffer *buffer)</pre><div class="variablelist"><dl class="variablelist"><dt><span class="term">buffer</span></dt><dd>
The buffer object</dd></dl></div><p>
Returns a pointer which can be used to read the data contained in the given SHM buffer.</p><p>As this buffer is memory-mapped, reading from it may generate SIGBUS signals. This can happen if the client claims that the buffer is larger than it is or if something truncates the underlying file. To prevent this signal from causing the compositor to crash you should call wl_shm_buffer_begin_access and wl_shm_buffer_end_access around code that reads from the memory. </p></dd><dt><a name="Server-structwl__shm__buffer_1a809cb5d6b33338c62bbca6daa4138667"></a><span class="term">wl_shm_buffer_begin_access
            - 
Mark that the given SHM buffer is about to be accessed.         </span></dt><dd><pre class="synopsis">void wl_shm_buffer_begin_access(struct wl_shm_buffer *buffer)</pre><div class="variablelist"><dl class="variablelist"><dt><span class="term">buffer</span></dt><dd>
The SHM buffer</dd></dl></div><p>
An SHM buffer is a memory-mapped file given by the client. According to POSIX, reading from a memory-mapped region that extends off the end of the file will cause a SIGBUS signal to be generated. Normally this would cause the compositor to terminate. In order to make the compositor robust against clients that change the size of the underlying file or lie about its size, you should protect access to the buffer by calling this function before reading from the memory and call wl_shm_buffer_end_access afterwards. This will install a signal handler for SIGBUS which will prevent the compositor from crashing.</p><p>After calling this function the signal handler will remain installed for the lifetime of the compositor process. Note that this function will not work properly if the compositor is also installing its own handler for SIGBUS.</p><p>If a SIGBUS signal is received for an address within the range of the SHM pool of the given buffer then the client will be sent an error event when wl_shm_buffer_end_access is called. If the signal is for an address outside that range then the signal handler will reraise the signal which would will likely cause the compositor to terminate.</p><p>It is safe to nest calls to these functions as long as the nested calls are all accessing the same buffer. The number of calls to wl_shm_buffer_end_access must match the number of calls to wl_shm_buffer_begin_access. These functions are thread-safe and it is allowed to simultaneously access different buffers or the same buffer from multiple threads. </p></dd><dt><a name="Server-structwl__shm__buffer_1a030db6056ef08836e9dee21a8087e2c1"></a><span class="term">wl_shm_buffer_end_access
            - 
Ends the access to a buffer started by wl_shm_buffer_begin_access.         </span></dt><dd><pre class="synopsis">void wl_shm_buffer_end_access(struct wl_shm_buffer *buffer)</pre><div class="variablelist"><dl class="variablelist"><dt><span class="term">buffer</span></dt><dd>
The SHM buffer</dd></dl></div><p>
This should be called after wl_shm_buffer_begin_access once the buffer is no longer being accessed. If a SIGBUS signal was generated in-between these two calls then the resource for the given buffer will be sent an error. </p></dd></dl></div></div><div class="section"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="Server-structwl__shm__pool"></a>wl_shm_pool</h2></div></div></div><p></p></div><div class="section"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="Server-structwl__shm__sigbus__data"></a>wl_shm_sigbus_data</h2></div></div></div><p></p></div><div class="section"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="Server-structwl__signal"></a>wl_signal
                - 
A source of a type of observable event.     </h2></div></div></div><p>Signals are recognized points where significant events can be observed. Compositors as well as the server can provide signals. Observers are <a class="link" href="apc.html#Server-structwl__listener" title="wl_listener - A single listener for Wayland signals.">wl_listener</a>'s that are added through <a class="link" href="apc.html#Server-structwl__signal_1aa8bcd3b8e250cfe35ed064d5af589096">wl_signal_add</a>. Signals are emitted using <a class="link" href="apc.html#Server-structwl__signal_1afe73f44f7f1b517c9c0ba90829c93309">wl_signal_emit</a>, which will invoke all listeners until that listener is removed by wl_list_remove() (or whenever the signal is destroyed).</p><p>
  See also: <a class="link" href="apc.html#Server-structwl__listener" title="wl_listener - A single listener for Wayland signals.">wl_listener</a> for more information on using <a class="link" href="apc.html#Server-structwl__signal" title="wl_signal - A source of a type of observable event.">wl_signal</a> 
</p><div class="variablelist"><dl class="variablelist"><dt><a name="Server-structwl__signal_1aeb25ddd9c813189203d15723e983b320"></a><span class="term">wl_signal_init
            - 
Initialize a new wl_signal for use.         </span></dt><dd><pre class="synopsis">static void wl_signal_init(struct wl_signal *signal)</pre><div class="variablelist"><dl class="variablelist"><dt><span class="term">signal</span></dt><dd>
The signal that will be initialized </dd></dl></div><p>
</p></dd><dt><a name="Server-structwl__signal_1aa8bcd3b8e250cfe35ed064d5af589096"></a><span class="term">wl_signal_add
            - 
Add the specified listener to this signal.         </span></dt><dd><pre class="synopsis">static void wl_signal_add(struct wl_signal *signal, struct wl_listener *listener)</pre><div class="variablelist"><dl class="variablelist"><dt><span class="term">signal</span></dt><dd>
The signal that will emit events to the listener </dd><dt><span class="term">listener</span></dt><dd>
The listener to add </dd></dl></div><p>
</p></dd><dt><a name="Server-structwl__signal_1ab0ade7ac929136ad457cc1e0f34f9e10"></a><span class="term">wl_signal_get
            - 
Gets the listener struct for the specified callback.         </span></dt><dd><pre class="synopsis">static struct wl_listener * wl_signal_get(struct wl_signal *signal, wl_notify_func_t notify)</pre><div class="variablelist"><dl class="variablelist"><dt><span class="term">signal</span></dt><dd>
The signal that contains the specified listener </dd><dt><span class="term">notify</span></dt><dd>
The listener that is the target of this search </dd></dl></div><p>
</p><div class="variablelist"><dl class="variablelist"><dt><span class="term">Returns:</span></dt><dd>the list item that corresponds to the specified listener, or NULL if none was found </dd></dl></div><p>
</p></dd><dt><a name="Server-structwl__signal_1afe73f44f7f1b517c9c0ba90829c93309"></a><span class="term">wl_signal_emit
            - 
Emits this signal, notifying all registered listeners.         </span></dt><dd><pre class="synopsis">static void wl_signal_emit(struct wl_signal *signal, void *data)</pre><div class="variablelist"><dl class="variablelist"><dt><span class="term">signal</span></dt><dd>
The signal object that will emit the signal </dd><dt><span class="term">data</span></dt><dd>
The data that will be emitted with the signal </dd></dl></div><p>
</p></dd></dl></div></div><div class="section"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="Server-structwl__socket"></a>wl_socket</h2></div></div></div><p></p></div><div class="section"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="Server-Functions"></a>Functions</h2></div></div></div><p></p><div class="variablelist"><dl class="variablelist"><dt><a name="Server-wayland-server-core_8h_1adf933ad178be05536668da731acc6871"></a><span class="term">wl_event_loop_create</span></dt><dd><pre class="synopsis">struct wl_event_loop* wl_event_loop_create(void)</pre></dd><dt><a name="Server-wayland-server-core_8h_1ad50f13e2c738e68f7576757aa862513a"></a><span class="term">wl_event_loop_destroy</span></dt><dd><pre class="synopsis">void wl_event_loop_destroy(struct wl_event_loop *loop)</pre></dd><dt><a name="Server-wayland-server-core_8h_1a677f7df496a70388151e56a88c46ad36"></a><span class="term">wl_event_loop_add_fd</span></dt><dd><pre class="synopsis">struct wl_event_source* wl_event_loop_add_fd(struct wl_event_loop *loop, int fd, uint32_t mask, wl_event_loop_fd_func_t func, void *data)</pre></dd><dt><a name="Server-wayland-server-core_8h_1afe73f9ff59d489e9f27eb9c0e3058a02"></a><span class="term">wl_event_source_fd_update</span></dt><dd><pre class="synopsis">int wl_event_source_fd_update(struct wl_event_source *source, uint32_t mask)</pre></dd><dt><a name="Server-wayland-server-core_8h_1a2881e5ca8c07dea463fbd526b6506f7f"></a><span class="term">wl_event_loop_add_timer</span></dt><dd><pre class="synopsis">struct wl_event_source* wl_event_loop_add_timer(struct wl_event_loop *loop, wl_event_loop_timer_func_t func, void *data)</pre></dd><dt><a name="Server-wayland-server-core_8h_1a0baa596851764fb5a91da83642777000"></a><span class="term">wl_event_loop_add_signal</span></dt><dd><pre class="synopsis">struct wl_event_source* wl_event_loop_add_signal(struct wl_event_loop *loop, int signal_number, wl_event_loop_signal_func_t func, void *data)</pre></dd><dt><a name="Server-wayland-server-core_8h_1a0164a47e9e8356af90c9d5c1de9f5487"></a><span class="term">wl_event_source_timer_update</span></dt><dd><pre class="synopsis">int wl_event_source_timer_update(struct wl_event_source *source, int ms_delay)</pre></dd><dt><a name="Server-wayland-server-core_8h_1afe37015d67b81ae82609f2b8aa78cc4f"></a><span class="term">wl_event_source_remove</span></dt><dd><pre class="synopsis">int wl_event_source_remove(struct wl_event_source *source)</pre></dd><dt><a name="Server-wayland-server-core_8h_1aa079264c57dd12168c691c000724efcf"></a><span class="term">wl_event_source_check</span></dt><dd><pre class="synopsis">void wl_event_source_check(struct wl_event_source *source)</pre></dd><dt><a name="Server-wayland-server-core_8h_1aaa3fdd5590365a4a2106c9814ca9b31b"></a><span class="term">wl_event_loop_dispatch</span></dt><dd><pre class="synopsis">int wl_event_loop_dispatch(struct wl_event_loop *loop, int timeout)</pre></dd><dt><a name="Server-wayland-server-core_8h_1aefc44b3062c22d2506ff42460f091396"></a><span class="term">wl_event_loop_dispatch_idle</span></dt><dd><pre class="synopsis">void wl_event_loop_dispatch_idle(struct wl_event_loop *loop)</pre></dd><dt><a name="Server-wayland-server-core_8h_1a2a1b5d6c1947954b0f74cfeb5f067b76"></a><span class="term">wl_event_loop_add_idle</span></dt><dd><pre class="synopsis">struct wl_event_source* wl_event_loop_add_idle(struct wl_event_loop *loop, wl_event_loop_idle_func_t func, void *data)</pre></dd><dt><a name="Server-wayland-server-core_8h_1a58c8aa06a2d240a49a95a91eddcba8e5"></a><span class="term">wl_event_loop_get_fd</span></dt><dd><pre class="synopsis">int wl_event_loop_get_fd(struct wl_event_loop *loop)</pre></dd><dt><a name="Server-wayland-server-core_8h_1a6b564d8d4183d71f1fdf06e751d84d51"></a><span class="term">wl_event_loop_add_destroy_listener</span></dt><dd><pre class="synopsis">void wl_event_loop_add_destroy_listener(struct wl_event_loop *loop, struct wl_listener *listener)</pre></dd><dt><a name="Server-wayland-server-core_8h_1a2b199278145924742fd2672755d6f8e0"></a><span class="term">wl_event_loop_get_destroy_listener</span></dt><dd><pre class="synopsis">struct wl_listener* wl_event_loop_get_destroy_listener(struct wl_event_loop *loop, wl_notify_func_t notify)</pre></dd><dt><a name="Server-wayland-server-core_8h_1a496bcdc506013f5fd47641777deb9618"></a><span class="term">wl_display_create</span></dt><dd><pre class="synopsis">struct wl_display* wl_display_create(void)</pre></dd><dt><a name="Server-wayland-server-core_8h_1acd9ad2e1ca3ffb0ba0f1b77ae616f8ee"></a><span class="term">wl_display_destroy</span></dt><dd><pre class="synopsis">void wl_display_destroy(struct wl_display *display)</pre></dd><dt><a name="Server-wayland-server-core_8h_1afe7a4b1d6fbf166a66f686c830e2946c"></a><span class="term">wl_display_get_event_loop</span></dt><dd><pre class="synopsis">struct wl_event_loop* wl_display_get_event_loop(struct wl_display *display)</pre></dd><dt><a name="Server-wayland-server-core_8h_1a9fdf7264f0a3a28a75c141db252067b8"></a><span class="term">wl_display_add_socket</span></dt><dd><pre class="synopsis">int wl_display_add_socket(struct wl_display *display, const char *name)</pre></dd><dt><a name="Server-wayland-server-core_8h_1af867e52066bc5fff5bb0c1d971735f8f"></a><span class="term">wl_display_add_socket_auto</span></dt><dd><pre class="synopsis">const char* wl_display_add_socket_auto(struct wl_display *display)</pre></dd><dt><a name="Server-wayland-server-core_8h_1a40e3041d2432d3941b3e8eb96c5284dc"></a><span class="term">wl_display_terminate</span></dt><dd><pre class="synopsis">void wl_display_terminate(struct wl_display *display)</pre></dd><dt><a name="Server-wayland-server-core_8h_1a999da1b9acb5808a3bbad60aaed8a7ff"></a><span class="term">wl_display_run</span></dt><dd><pre class="synopsis">void wl_display_run(struct wl_display *display)</pre></dd><dt><a name="Server-wayland-server-core_8h_1aeb502f6fdde16d9ee08f31aed040355f"></a><span class="term">wl_display_flush_clients</span></dt><dd><pre class="synopsis">void wl_display_flush_clients(struct wl_display *display)</pre></dd><dt><a name="Server-wayland-server-core_8h_1a43f04f76ea1457edcf37c95de68b29ef"></a><span class="term">wl_display_get_serial</span></dt><dd><pre class="synopsis">uint32_t wl_display_get_serial(struct wl_display *display)</pre></dd><dt><a name="Server-wayland-server-core_8h_1a145f7d3e4b41fc9014c11bf01bd7eb4f"></a><span class="term">wl_display_next_serial</span></dt><dd><pre class="synopsis">uint32_t wl_display_next_serial(struct wl_display *display)</pre></dd><dt><a name="Server-wayland-server-core_8h_1a9ea24547f07538f2a326c42c7793b937"></a><span class="term">wl_display_add_destroy_listener</span></dt><dd><pre class="synopsis">void wl_display_add_destroy_listener(struct wl_display *display, struct wl_listener *listener)</pre></dd><dt><a name="Server-wayland-server-core_8h_1ad2e481a3157b1d182bb665a145230ae9"></a><span class="term">wl_display_get_destroy_listener</span></dt><dd><pre class="synopsis">struct wl_listener* wl_display_get_destroy_listener(struct wl_display *display, wl_notify_func_t notify)</pre></dd><dt><a name="Server-wayland-server-core_8h_1a85f5bc1c041738f5663835c5565ce0b8"></a><span class="term">wl_global_create</span></dt><dd><pre class="synopsis">struct wl_global* wl_global_create(struct wl_display *display, const struct wl_interface *interface, int version, void *data, wl_global_bind_func_t bind)</pre></dd><dt><a name="Server-wayland-server-core_8h_1ab466d94d1f204fb5f07c57e5f558ab7a"></a><span class="term">wl_global_destroy</span></dt><dd><pre class="synopsis">void wl_global_destroy(struct wl_global *global)</pre></dd><dt><a name="Server-wayland-server-core_8h_1afb954d2c512f4d0140e25cd331c2cd9f"></a><span class="term">wl_client_create</span></dt><dd><pre class="synopsis">struct wl_client* wl_client_create(struct wl_display *display, int fd)</pre></dd><dt><a name="Server-wayland-server-core_8h_1a661c0b1a9deef909c5d43f5efe4cb524"></a><span class="term">wl_client_destroy</span></dt><dd><pre class="synopsis">void wl_client_destroy(struct wl_client *client)</pre></dd><dt><a name="Server-wayland-server-core_8h_1a6a045ad15d6ca216c4da41ba67c9ef4a"></a><span class="term">wl_client_flush</span></dt><dd><pre class="synopsis">void wl_client_flush(struct wl_client *client)</pre></dd><dt><a name="Server-wayland-server-core_8h_1a82a97cb3a66c1c56826a09a7b42453d9"></a><span class="term">wl_client_get_credentials</span></dt><dd><pre class="synopsis">void wl_client_get_credentials(struct wl_client *client, pid_t *pid, uid_t *uid, gid_t *gid)</pre></dd><dt><a name="Server-wayland-server-core_8h_1a9062fe6277721ec5b4b7d3cec9e34981"></a><span class="term">wl_client_add_destroy_listener</span></dt><dd><pre class="synopsis">void wl_client_add_destroy_listener(struct wl_client *client, struct wl_listener *listener)</pre></dd><dt><a name="Server-wayland-server-core_8h_1a6f20471027c1fe02e79af96426ef5bf4"></a><span class="term">wl_client_get_destroy_listener</span></dt><dd><pre class="synopsis">struct wl_listener* wl_client_get_destroy_listener(struct wl_client *client, wl_notify_func_t notify)</pre></dd><dt><a name="Server-wayland-server-core_8h_1aa589ab039ac7e67a9da5ccdada9fcb4c"></a><span class="term">wl_client_get_object</span></dt><dd><pre class="synopsis">struct wl_resource* wl_client_get_object(struct wl_client *client, uint32_t id)</pre></dd><dt><a name="Server-wayland-server-core_8h_1a12352da895372907cf30449435d8ee5f"></a><span class="term">wl_client_post_no_memory</span></dt><dd><pre class="synopsis">void wl_client_post_no_memory(struct wl_client *client)</pre></dd><dt><a name="Server-wayland-server-core_8h_1a67150e8e41fed1358dfd59d46fcda23b"></a><span class="term">wl_resource_post_event</span></dt><dd><pre class="synopsis">void wl_resource_post_event(struct wl_resource *resource, uint32_t opcode,...)</pre></dd><dt><a name="Server-wayland-server-core_8h_1a97deed922e68853cb3785947926d56a7"></a><span class="term">wl_resource_post_event_array</span></dt><dd><pre class="synopsis">void wl_resource_post_event_array(struct wl_resource *resource, uint32_t opcode, union wl_argument *args)</pre></dd><dt><a name="Server-wayland-server-core_8h_1a67891685eff3a9ebd5371d78ca83d516"></a><span class="term">wl_resource_queue_event</span></dt><dd><pre class="synopsis">void wl_resource_queue_event(struct wl_resource *resource, uint32_t opcode,...)</pre></dd><dt><a name="Server-wayland-server-core_8h_1a9b63bd8423712f6edebfd6dae9e48225"></a><span class="term">wl_resource_queue_event_array</span></dt><dd><pre class="synopsis">void wl_resource_queue_event_array(struct wl_resource *resource, uint32_t opcode, union wl_argument *args)</pre></dd><dt><a name="Server-wayland-server-core_8h_1a49e22a805b14b88186f7e14067a07672"></a><span class="term">wl_resource_post_error</span></dt><dd><pre class="synopsis">void wl_resource_post_error(struct wl_resource *resource, uint32_t code, const char *msg,...) __attribute__((format(printf</pre></dd><dt><a name="Server-wayland-server-core_8h_1a69c9d80833b950aa7592df7d0e1cdc4a"></a><span class="term">wl_resource_post_no_memory</span></dt><dd><pre class="synopsis">void void wl_resource_post_no_memory(struct wl_resource *resource)</pre></dd><dt><a name="Server-wayland-server-core_8h_1a1a69200af1f06ccbcd218b2328f3c885"></a><span class="term">wl_client_get_display</span></dt><dd><pre class="synopsis">struct wl_display* wl_client_get_display(struct wl_client *client)</pre></dd><dt><a name="Server-wayland-server-core_8h_1a26b54247cd0b84c9e228e2a2f9227f8c"></a><span class="term">wl_resource_create</span></dt><dd><pre class="synopsis">struct wl_resource* wl_resource_create(struct wl_client *client, const struct wl_interface *interface, int version, uint32_t id)</pre></dd><dt><a name="Server-wayland-server-core_8h_1a9ac84b9077dcf2020f2b847189d4ebc0"></a><span class="term">wl_resource_set_implementation</span></dt><dd><pre class="synopsis">void wl_resource_set_implementation(struct wl_resource *resource, const void *implementation, void *data, wl_resource_destroy_func_t destroy)</pre></dd><dt><a name="Server-wayland-server-core_8h_1a6d127d9e4489ae795850a9b32d8c5637"></a><span class="term">wl_resource_set_dispatcher</span></dt><dd><pre class="synopsis">void wl_resource_set_dispatcher(struct wl_resource *resource, wl_dispatcher_func_t dispatcher, const void *implementation, void *data, wl_resource_destroy_func_t destroy)</pre></dd><dt><a name="Server-wayland-server-core_8h_1a4fd83132742252516c9a3df7f4eaa4d7"></a><span class="term">wl_resource_destroy</span></dt><dd><pre class="synopsis">void wl_resource_destroy(struct wl_resource *resource)</pre></dd><dt><a name="Server-wayland-server-core_8h_1ae265d2902bc8e0994b26a3f43e63448c"></a><span class="term">wl_resource_get_id</span></dt><dd><pre class="synopsis">uint32_t wl_resource_get_id(struct wl_resource *resource)</pre></dd><dt><a name="Server-wayland-server-core_8h_1ab1de3c23a75ddb99ff8c29c0e759a39b"></a><span class="term">wl_resource_get_link</span></dt><dd><pre class="synopsis">struct wl_list* wl_resource_get_link(struct wl_resource *resource)</pre></dd><dt><a name="Server-wayland-server-core_8h_1a6ed2f937f570b36e7842c5a0bd3d754b"></a><span class="term">wl_resource_from_link</span></dt><dd><pre class="synopsis">struct wl_resource* wl_resource_from_link(struct wl_list *resource)</pre></dd><dt><a name="Server-wayland-server-core_8h_1a4ac3fbd1d228f441c6846f3ebccc9c6e"></a><span class="term">wl_resource_find_for_client</span></dt><dd><pre class="synopsis">struct wl_resource* wl_resource_find_for_client(struct wl_list *list, struct wl_client *client)</pre></dd><dt><a name="Server-wayland-server-core_8h_1a300147832089811f11d345fbc3f47fe6"></a><span class="term">wl_resource_get_client</span></dt><dd><pre class="synopsis">struct wl_client* wl_resource_get_client(struct wl_resource *resource)</pre></dd><dt><a name="Server-wayland-server-core_8h_1aa9b40199dbf513b6a25263872b8490c6"></a><span class="term">wl_resource_set_user_data</span></dt><dd><pre class="synopsis">void wl_resource_set_user_data(struct wl_resource *resource, void *data)</pre></dd><dt><a name="Server-wayland-server-core_8h_1a07f2328aa269ff1968afc4836018204f"></a><span class="term">wl_resource_get_user_data</span></dt><dd><pre class="synopsis">void* wl_resource_get_user_data(struct wl_resource *resource)</pre></dd><dt><a name="Server-wayland-server-core_8h_1a8f0f7d0b0f0fb9f44ccd3694b3dd58d5"></a><span class="term">wl_resource_get_version</span></dt><dd><pre class="synopsis">int wl_resource_get_version(struct wl_resource *resource)</pre></dd><dt><a name="Server-wayland-server-core_8h_1ab69024ab2f0f502aa70cf18bb2761882"></a><span class="term">wl_resource_set_destructor</span></dt><dd><pre class="synopsis">void wl_resource_set_destructor(struct wl_resource *resource, wl_resource_destroy_func_t destroy)</pre></dd><dt><a name="Server-wayland-server-core_8h_1a8849a58c3ba7a528c643591369125844"></a><span class="term">wl_resource_instance_of</span></dt><dd><pre class="synopsis">int wl_resource_instance_of(struct wl_resource *resource, const struct wl_interface *interface, const void *implementation)</pre></dd><dt><a name="Server-wayland-server-core_8h_1a6eac87009589e0bdc52830833ca46694"></a><span class="term">wl_resource_add_destroy_listener</span></dt><dd><pre class="synopsis">void wl_resource_add_destroy_listener(struct wl_resource *resource, struct wl_listener *listener)</pre></dd><dt><a name="Server-wayland-server-core_8h_1a46364ef94b5671f41f4cb9587070b23f"></a><span class="term">wl_resource_get_destroy_listener</span></dt><dd><pre class="synopsis">struct wl_listener* wl_resource_get_destroy_listener(struct wl_resource *resource, wl_notify_func_t notify)</pre></dd><dt><a name="Server-wayland-server-core_8h_1a809cb5d6b33338c62bbca6daa4138667"></a><span class="term">wl_shm_buffer_begin_access</span></dt><dd><pre class="synopsis">void wl_shm_buffer_begin_access(struct wl_shm_buffer *buffer)</pre></dd><dt><a name="Server-wayland-server-core_8h_1a030db6056ef08836e9dee21a8087e2c1"></a><span class="term">wl_shm_buffer_end_access</span></dt><dd><pre class="synopsis">void wl_shm_buffer_end_access(struct wl_shm_buffer *buffer)</pre></dd><dt><a name="Server-wayland-server-core_8h_1a55964fd7a5774ed9f94bfadce6f8a8ce"></a><span class="term">wl_shm_buffer_get</span></dt><dd><pre class="synopsis">struct wl_shm_buffer* wl_shm_buffer_get(struct wl_resource *resource)</pre></dd><dt><a name="Server-wayland-server-core_8h_1adeb4b01f2ecca2cbd9002d6d64f16ac4"></a><span class="term">wl_shm_buffer_get_data</span></dt><dd><pre class="synopsis">void* wl_shm_buffer_get_data(struct wl_shm_buffer *buffer)</pre></dd><dt><a name="Server-wayland-server-core_8h_1ad132f92b616451c67aeb6a25cc60f282"></a><span class="term">wl_shm_buffer_get_stride</span></dt><dd><pre class="synopsis">int32_t wl_shm_buffer_get_stride(struct wl_shm_buffer *buffer)</pre></dd><dt><a name="Server-wayland-server-core_8h_1af27bd34e94cc995f25a08a0beadd8bc9"></a><span class="term">wl_shm_buffer_get_format</span></dt><dd><pre class="synopsis">uint32_t wl_shm_buffer_get_format(struct wl_shm_buffer *buffer)</pre></dd><dt><a name="Server-wayland-server-core_8h_1ada7167ed92985de64ff9116b09a07708"></a><span class="term">wl_shm_buffer_get_width</span></dt><dd><pre class="synopsis">int32_t wl_shm_buffer_get_width(struct wl_shm_buffer *buffer)</pre></dd><dt><a name="Server-wayland-server-core_8h_1acd6812b7699de5a1b80eb4bf1c78aa0e"></a><span class="term">wl_shm_buffer_get_height</span></dt><dd><pre class="synopsis">int32_t wl_shm_buffer_get_height(struct wl_shm_buffer *buffer)</pre></dd><dt><a name="Server-wayland-server-core_8h_1aef08c24892f8fa98431e0610ee487ef7"></a><span class="term">wl_display_init_shm</span></dt><dd><pre class="synopsis">int wl_display_init_shm(struct wl_display *display)</pre></dd><dt><a name="Server-wayland-server-core_8h_1a17e2cee84d163f938f8906b6f9a5089e"></a><span class="term">wl_display_add_shm_format</span></dt><dd><pre class="synopsis">uint32_t* wl_display_add_shm_format(struct wl_display *display, uint32_t format)</pre></dd><dt><a name="Server-wayland-server-core_8h_1a720795511060fdfc39e0983381d7e202"></a><span class="term">wl_shm_buffer_create</span></dt><dd><pre class="synopsis">struct wl_shm_buffer* wl_shm_buffer_create(struct wl_client *client, uint32_t id, int32_t width, int32_t height, int32_t stride, uint32_t format)</pre></dd><dt><a name="Server-wayland-server-core_8h_1a0a0e1384dce2524161299fcd1669d59f"></a><span class="term">wl_log_set_handler_server</span></dt><dd><pre class="synopsis">void wl_log_set_handler_server(wl_log_func_t handler)</pre></dd><dt><a name="Server-wayland-server_8c_1a97deed922e68853cb3785947926d56a7"></a><span class="term">wl_resource_post_event_array</span></dt><dd><pre class="synopsis">void wl_resource_post_event_array(struct wl_resource *resource, uint32_t opcode, union wl_argument *args)</pre></dd><dt><a name="Server-wayland-server_8c_1a67150e8e41fed1358dfd59d46fcda23b"></a><span class="term">wl_resource_post_event</span></dt><dd><pre class="synopsis">void wl_resource_post_event(struct wl_resource *resource, uint32_t opcode,...)</pre></dd><dt><a name="Server-wayland-server_8c_1a9b63bd8423712f6edebfd6dae9e48225"></a><span class="term">wl_resource_queue_event_array</span></dt><dd><pre class="synopsis">void wl_resource_queue_event_array(struct wl_resource *resource, uint32_t opcode, union wl_argument *args)</pre></dd><dt><a name="Server-wayland-server_8c_1a67891685eff3a9ebd5371d78ca83d516"></a><span class="term">wl_resource_queue_event</span></dt><dd><pre class="synopsis">void wl_resource_queue_event(struct wl_resource *resource, uint32_t opcode,...)</pre></dd><dt><a name="Server-wayland-server_8c_1a75428b89fa7e6aa97027bb74b348c386"></a><span class="term">wl_resource_post_error</span></dt><dd><pre class="synopsis">void wl_resource_post_error(struct wl_resource *resource, uint32_t code, const char *msg,...)</pre></dd><dt><a name="Server-wayland-server_8c_1a12352da895372907cf30449435d8ee5f"></a><span class="term">wl_client_post_no_memory</span></dt><dd><pre class="synopsis">void wl_client_post_no_memory(struct wl_client *client)</pre></dd><dt><a name="Server-wayland-server_8c_1aefff369c8182adc3c29ea561e23b9fd8"></a><span class="term">wl_resource_post_no_memory</span></dt><dd><pre class="synopsis">void wl_resource_post_no_memory(struct wl_resource *resource)</pre></dd><dt><a name="Server-wayland-server_8c_1a4fd83132742252516c9a3df7f4eaa4d7"></a><span class="term">wl_resource_destroy</span></dt><dd><pre class="synopsis">void wl_resource_destroy(struct wl_resource *resource)</pre></dd><dt><a name="Server-wayland-server_8c_1ae265d2902bc8e0994b26a3f43e63448c"></a><span class="term">wl_resource_get_id</span></dt><dd><pre class="synopsis">uint32_t wl_resource_get_id(struct wl_resource *resource)</pre></dd><dt><a name="Server-wayland-server_8c_1ab1de3c23a75ddb99ff8c29c0e759a39b"></a><span class="term">wl_resource_get_link</span></dt><dd><pre class="synopsis">struct wl_list* wl_resource_get_link(struct wl_resource *resource)</pre></dd><dt><a name="Server-wayland-server_8c_1a9851271c75c89ed572987126278834d9"></a><span class="term">wl_resource_from_link</span></dt><dd><pre class="synopsis">struct wl_resource* wl_resource_from_link(struct wl_list *link)</pre></dd><dt><a name="Server-wayland-server_8c_1a4ac3fbd1d228f441c6846f3ebccc9c6e"></a><span class="term">wl_resource_find_for_client</span></dt><dd><pre class="synopsis">struct wl_resource* wl_resource_find_for_client(struct wl_list *list, struct wl_client *client)</pre></dd><dt><a name="Server-wayland-server_8c_1a300147832089811f11d345fbc3f47fe6"></a><span class="term">wl_resource_get_client</span></dt><dd><pre class="synopsis">struct wl_client* wl_resource_get_client(struct wl_resource *resource)</pre></dd><dt><a name="Server-wayland-server_8c_1aa9b40199dbf513b6a25263872b8490c6"></a><span class="term">wl_resource_set_user_data</span></dt><dd><pre class="synopsis">void wl_resource_set_user_data(struct wl_resource *resource, void *data)</pre></dd><dt><a name="Server-wayland-server_8c_1a07f2328aa269ff1968afc4836018204f"></a><span class="term">wl_resource_get_user_data</span></dt><dd><pre class="synopsis">void* wl_resource_get_user_data(struct wl_resource *resource)</pre></dd><dt><a name="Server-wayland-server_8c_1a8f0f7d0b0f0fb9f44ccd3694b3dd58d5"></a><span class="term">wl_resource_get_version</span></dt><dd><pre class="synopsis">int wl_resource_get_version(struct wl_resource *resource)</pre></dd><dt><a name="Server-wayland-server_8c_1ab69024ab2f0f502aa70cf18bb2761882"></a><span class="term">wl_resource_set_destructor</span></dt><dd><pre class="synopsis">void wl_resource_set_destructor(struct wl_resource *resource, wl_resource_destroy_func_t destroy)</pre></dd><dt><a name="Server-wayland-server_8c_1a8849a58c3ba7a528c643591369125844"></a><span class="term">wl_resource_instance_of</span></dt><dd><pre class="synopsis">int wl_resource_instance_of(struct wl_resource *resource, const struct wl_interface *interface, const void *implementation)</pre></dd><dt><a name="Server-wayland-server_8c_1a6eac87009589e0bdc52830833ca46694"></a><span class="term">wl_resource_add_destroy_listener</span></dt><dd><pre class="synopsis">void wl_resource_add_destroy_listener(struct wl_resource *resource, struct wl_listener *listener)</pre></dd><dt><a name="Server-wayland-server_8c_1a46364ef94b5671f41f4cb9587070b23f"></a><span class="term">wl_resource_get_destroy_listener</span></dt><dd><pre class="synopsis">struct wl_listener* wl_resource_get_destroy_listener(struct wl_resource *resource, wl_notify_func_t notify)</pre></dd><dt><a name="Server-wayland-server_8c_1a9062fe6277721ec5b4b7d3cec9e34981"></a><span class="term">wl_client_add_destroy_listener</span></dt><dd><pre class="synopsis">void wl_client_add_destroy_listener(struct wl_client *client, struct wl_listener *listener)</pre></dd><dt><a name="Server-wayland-server_8c_1a6f20471027c1fe02e79af96426ef5bf4"></a><span class="term">wl_client_get_destroy_listener</span></dt><dd><pre class="synopsis">struct wl_listener* wl_client_get_destroy_listener(struct wl_client *client, wl_notify_func_t notify)</pre></dd><dt><a name="Server-wayland-server_8c_1a661c0b1a9deef909c5d43f5efe4cb524"></a><span class="term">wl_client_destroy</span></dt><dd><pre class="synopsis">void wl_client_destroy(struct wl_client *client)</pre></dd><dt><a name="Server-wayland-server_8c_1a85f5bc1c041738f5663835c5565ce0b8"></a><span class="term">wl_global_create</span></dt><dd><pre class="synopsis">struct wl_global* wl_global_create(struct wl_display *display, const struct wl_interface *interface, int version, void *data, wl_global_bind_func_t bind)</pre></dd><dt><a name="Server-wayland-server_8c_1ab466d94d1f204fb5f07c57e5f558ab7a"></a><span class="term">wl_global_destroy</span></dt><dd><pre class="synopsis">void wl_global_destroy(struct wl_global *global)</pre></dd><dt><a name="Server-wayland-server_8c_1afe7a4b1d6fbf166a66f686c830e2946c"></a><span class="term">wl_display_get_event_loop</span></dt><dd><pre class="synopsis">struct wl_event_loop* wl_display_get_event_loop(struct wl_display *display)</pre></dd><dt><a name="Server-wayland-server_8c_1a40e3041d2432d3941b3e8eb96c5284dc"></a><span class="term">wl_display_terminate</span></dt><dd><pre class="synopsis">void wl_display_terminate(struct wl_display *display)</pre></dd><dt><a name="Server-wayland-server_8c_1a999da1b9acb5808a3bbad60aaed8a7ff"></a><span class="term">wl_display_run</span></dt><dd><pre class="synopsis">void wl_display_run(struct wl_display *display)</pre></dd><dt><a name="Server-wayland-server_8c_1aeb502f6fdde16d9ee08f31aed040355f"></a><span class="term">wl_display_flush_clients</span></dt><dd><pre class="synopsis">void wl_display_flush_clients(struct wl_display *display)</pre></dd><dt><a name="Server-wayland-server_8c_1af867e52066bc5fff5bb0c1d971735f8f"></a><span class="term">wl_display_add_socket_auto</span></dt><dd><pre class="synopsis">const char* wl_display_add_socket_auto(struct wl_display *display)</pre></dd><dt><a name="Server-wayland-server_8c_1a9ea24547f07538f2a326c42c7793b937"></a><span class="term">wl_display_add_destroy_listener</span></dt><dd><pre class="synopsis">void wl_display_add_destroy_listener(struct wl_display *display, struct wl_listener *listener)</pre></dd><dt><a name="Server-wayland-server_8c_1ad2e481a3157b1d182bb665a145230ae9"></a><span class="term">wl_display_get_destroy_listener</span></dt><dd><pre class="synopsis">struct wl_listener* wl_display_get_destroy_listener(struct wl_display *display, wl_notify_func_t notify)</pre></dd><dt><a name="Server-wayland-server_8c_1a9ac84b9077dcf2020f2b847189d4ebc0"></a><span class="term">wl_resource_set_implementation</span></dt><dd><pre class="synopsis">void wl_resource_set_implementation(struct wl_resource *resource, const void *implementation, void *data, wl_resource_destroy_func_t destroy)</pre></dd><dt><a name="Server-wayland-server_8c_1a6d127d9e4489ae795850a9b32d8c5637"></a><span class="term">wl_resource_set_dispatcher</span></dt><dd><pre class="synopsis">void wl_resource_set_dispatcher(struct wl_resource *resource, wl_dispatcher_func_t dispatcher, const void *implementation, void *data, wl_resource_destroy_func_t destroy)</pre></dd><dt><a name="Server-wayland-server_8c_1a26b54247cd0b84c9e228e2a2f9227f8c"></a><span class="term">wl_resource_create</span></dt><dd><pre class="synopsis">struct wl_resource* wl_resource_create(struct wl_client *client, const struct wl_interface *interface, int version, uint32_t id)</pre></dd><dt><a name="Server-wayland-server_8c_1a0a0e1384dce2524161299fcd1669d59f"></a><span class="term">wl_log_set_handler_server</span></dt><dd><pre class="synopsis">void wl_log_set_handler_server(wl_log_func_t handler)</pre></dd><dt><a name="Server-wayland-server_8h_1a86592c8dfc359094d1cfd8e6abb47cb7"></a><span class="term">wl_client_add_resource</span></dt><dd><pre class="synopsis">uint32_t wl_client_add_resource(struct wl_client *client, struct wl_resource *resource) WL_DEPRECATED</pre></dd><dt><a name="Server-wayland-server_8h_1a8a87f8712025b4d92e5fe718ea9d745d"></a><span class="term">wl_client_add_object</span></dt><dd><pre class="synopsis">struct wl_resource* wl_client_add_object(struct wl_client *client, const struct wl_interface *interface, const void *implementation, uint32_t id, void *data) WL_DEPRECATED</pre></dd><dt><a name="Server-wayland-server_8h_1ab9570639a66efe77ae813c7edaf29c21"></a><span class="term">wl_client_new_object</span></dt><dd><pre class="synopsis">struct wl_resource* wl_client_new_object(struct wl_client *client, const struct wl_interface *interface, const void *implementation, void *data) WL_DEPRECATED</pre></dd><dt><a name="Server-wayland-server_8h_1a81dc2de5891114d1ae89449a048f3b6c"></a><span class="term">wl_display_add_global</span></dt><dd><pre class="synopsis">struct wl_global* wl_display_add_global(struct wl_display *display, const struct wl_interface *interface, void *data, wl_global_bind_func_t bind) WL_DEPRECATED</pre></dd><dt><a name="Server-wayland-server_8h_1ab9bbf24496934f296decd98ebf7940b9"></a><span class="term">wl_display_remove_global</span></dt><dd><pre class="synopsis">void wl_display_remove_global(struct wl_display *display, struct wl_global *global) WL_DEPRECATED</pre></dd><dt><a name="Server-wayland-shm_8c_1aef08c24892f8fa98431e0610ee487ef7"></a><span class="term">wl_display_init_shm</span></dt><dd><pre class="synopsis">int wl_display_init_shm(struct wl_display *display)</pre></dd><dt><a name="Server-wayland-shm_8c_1a720795511060fdfc39e0983381d7e202"></a><span class="term">wl_shm_buffer_create</span></dt><dd><pre class="synopsis">struct wl_shm_buffer* wl_shm_buffer_create(struct wl_client *client, uint32_t id, int32_t width, int32_t height, int32_t stride, uint32_t format)</pre></dd><dt><a name="Server-wayland-shm_8c_1a55964fd7a5774ed9f94bfadce6f8a8ce"></a><span class="term">wl_shm_buffer_get</span></dt><dd><pre class="synopsis">struct wl_shm_buffer* wl_shm_buffer_get(struct wl_resource *resource)</pre></dd><dt><a name="Server-wayland-shm_8c_1ad132f92b616451c67aeb6a25cc60f282"></a><span class="term">wl_shm_buffer_get_stride</span></dt><dd><pre class="synopsis">int32_t wl_shm_buffer_get_stride(struct wl_shm_buffer *buffer)</pre></dd><dt><a name="Server-wayland-shm_8c_1af27bd34e94cc995f25a08a0beadd8bc9"></a><span class="term">wl_shm_buffer_get_format</span></dt><dd><pre class="synopsis">uint32_t wl_shm_buffer_get_format(struct wl_shm_buffer *buffer)</pre></dd><dt><a name="Server-wayland-shm_8c_1ada7167ed92985de64ff9116b09a07708"></a><span class="term">wl_shm_buffer_get_width</span></dt><dd><pre class="synopsis">int32_t wl_shm_buffer_get_width(struct wl_shm_buffer *buffer)</pre></dd><dt><a name="Server-wayland-shm_8c_1acd6812b7699de5a1b80eb4bf1c78aa0e"></a><span class="term">wl_shm_buffer_get_height</span></dt><dd><pre class="synopsis">int32_t wl_shm_buffer_get_height(struct wl_shm_buffer *buffer)</pre></dd><dt><a name="Server-wayland-util_8c_1a1d5c9d41e224538b2edf324c7f8b1ac8"></a><span class="term">wl_list_init</span></dt><dd><pre class="synopsis">void wl_list_init(struct wl_list *list)</pre></dd><dt><a name="Server-wayland-util_8c_1aa7eaac0d363c0473bfc3e8172b0dfd98"></a><span class="term">wl_list_insert</span></dt><dd><pre class="synopsis">void wl_list_insert(struct wl_list *list, struct wl_list *elm)</pre></dd><dt><a name="Server-wayland-util_8c_1aa16d739aaa041dde9d34ad4bcb4d4c83"></a><span class="term">wl_list_remove</span></dt><dd><pre class="synopsis">void wl_list_remove(struct wl_list *elm)</pre></dd><dt><a name="Server-wayland-util_8c_1a2710186b02864dc2b18a46993aa9c2e0"></a><span class="term">wl_list_length</span></dt><dd><pre class="synopsis">int wl_list_length(const struct wl_list *list)</pre></dd><dt><a name="Server-wayland-util_8c_1a5c6aa8f61fa63374f1c77e7e4462a38a"></a><span class="term">wl_list_empty</span></dt><dd><pre class="synopsis">int wl_list_empty(const struct wl_list *list)</pre></dd><dt><a name="Server-wayland-util_8c_1ac714f6eedd52286c8b6d9884cc7c8492"></a><span class="term">wl_list_insert_list</span></dt><dd><pre class="synopsis">void wl_list_insert_list(struct wl_list *list, struct wl_list *other)</pre></dd><dt><a name="Server-wayland-util_8c_1ada9b770427b901be34eaf3683cf04d5a"></a><span class="term">wl_array_init</span></dt><dd><pre class="synopsis">void wl_array_init(struct wl_array *array)</pre></dd><dt><a name="Server-wayland-util_8c_1a0e8845f61f1e1fccfce050830ed5b279"></a><span class="term">wl_array_release</span></dt><dd><pre class="synopsis">void wl_array_release(struct wl_array *array)</pre></dd><dt><a name="Server-wayland-util_8c_1a5dea41986675c31e22d8bea7bf0dc05c"></a><span class="term">wl_array_add</span></dt><dd><pre class="synopsis">void* wl_array_add(struct wl_array *array, size_t size)</pre></dd><dt><a name="Server-wayland-util_8c_1a4de64390294de78da813dcfb16f47617"></a><span class="term">wl_array_copy</span></dt><dd><pre class="synopsis">int wl_array_copy(struct wl_array *array, struct wl_array *source)</pre></dd><dt><a name="Server-wayland-util_8c_1a0ad2edfef21e99d1b394872234165685"></a><span class="term">wl_log</span></dt><dd><pre class="synopsis">void wl_log(const char *fmt,...)</pre></dd><dt><a name="Server-wayland-util_8h_1a09e3b64ee2195e1b80191aa1884d45aa"></a><span class="term">wl_container_of
            - 
Retrieves a pointer to the containing struct of a given member item.         </span></dt><dd><pre class="synopsis"></pre><p>This macro allows conversion from a pointer to a item to its containing struct. This is useful if you have a contained item like a <a class="link" href="apc.html#Server-structwl__list" title="wl_list - doubly-linked list">wl_list</a>, <a class="link" href="apc.html#Server-structwl__listener" title="wl_listener - A single listener for Wayland signals.">wl_listener</a>, or <a class="link" href="apc.html#Server-structwl__signal" title="wl_signal - A source of a type of observable event.">wl_signal</a>, provided via a callback or other means and would like to retrieve the struct that contains it.</p><p>To demonstrate, the following example retrieves a pointer to example_container given only its destroy_listener member:</p><p>
          </p><pre class="programlisting">struct example_container {
    struct wl_listener destroy_listener;
    // other members...
};

void example_container_destroy(struct wl_listener *listener, void *data)
{
    struct example_container *ctr;

    ctr = wl_container_of(listener, ctr, destroy_listener);
    // destroy ctr...
}
</pre><p>
        </p><div class="variablelist"><dl class="variablelist"><dt><span class="term">ptr</span></dt><dd>
A valid pointer to the contained item.</dd><dt><span class="term">sample</span></dt><dd>
A pointer to the type of content that the list item stores. Sample does not need be a valid pointer; a null or an uninitialised pointer will suffice.</dd><dt><span class="term">member</span></dt><dd>
The named location of ptr within the sample type.</dd></dl></div><p>
</p><div class="variablelist"><dl class="variablelist"><dt><span class="term">Returns:</span></dt><dd>The container for the specified pointer. </dd></dl></div><p>
</p></dd><dt><a name="Server-wayland-util_8h_1abdec454d1dffed08d355d225e21ac8bd"></a><span class="term">wl_dispatcher_func_t
            - 
A function pointer type for a dispatcher.         </span></dt><dd><pre class="synopsis">typedef int(* wl_dispatcher_func_t) (const void *, void *, uint32_t, const struct wl_message *, union wl_argument *))(const void *, void *, uint32_t, const struct wl_message *, union wl_argument *)</pre><p>A dispatcher is a function that handles the emitting of callbacks in client code. For programs directly using the C library, this is done by using libffi to call function pointers. When binding to languages other than C, dispatchers provide a way to abstract the function calling process to be friendlier to other function calling systems.</p><p>A dispatcher takes five arguments: The first is the dispatcher-specific implementation data associated with the target object. The second is the object on which the callback is being invoked (either wl_proxy or <a class="link" href="apc.html#Server-structwl__resource" title="wl_resource">wl_resource</a>). The third and fourth arguments are the opcode the wl_messsage structure corresponding to the callback being emitted. The final argument is an array of arguments received from the other process via the wire protocol. </p></dd><dt><a name="Server-wayland-util_8h_1a1d5c9d41e224538b2edf324c7f8b1ac8"></a><span class="term">wl_list_init</span></dt><dd><pre class="synopsis">void wl_list_init(struct wl_list *list)</pre></dd><dt><a name="Server-wayland-util_8h_1aa7eaac0d363c0473bfc3e8172b0dfd98"></a><span class="term">wl_list_insert</span></dt><dd><pre class="synopsis">void wl_list_insert(struct wl_list *list, struct wl_list *elm)</pre></dd><dt><a name="Server-wayland-util_8h_1aa16d739aaa041dde9d34ad4bcb4d4c83"></a><span class="term">wl_list_remove</span></dt><dd><pre class="synopsis">void wl_list_remove(struct wl_list *elm)</pre></dd><dt><a name="Server-wayland-util_8h_1a2710186b02864dc2b18a46993aa9c2e0"></a><span class="term">wl_list_length</span></dt><dd><pre class="synopsis">int wl_list_length(const struct wl_list *list)</pre></dd><dt><a name="Server-wayland-util_8h_1a5c6aa8f61fa63374f1c77e7e4462a38a"></a><span class="term">wl_list_empty</span></dt><dd><pre class="synopsis">int wl_list_empty(const struct wl_list *list)</pre></dd><dt><a name="Server-wayland-util_8h_1ac714f6eedd52286c8b6d9884cc7c8492"></a><span class="term">wl_list_insert_list</span></dt><dd><pre class="synopsis">void wl_list_insert_list(struct wl_list *list, struct wl_list *other)</pre></dd><dt><a name="Server-wayland-util_8h_1ada9b770427b901be34eaf3683cf04d5a"></a><span class="term">wl_array_init</span></dt><dd><pre class="synopsis">void wl_array_init(struct wl_array *array)</pre></dd><dt><a name="Server-wayland-util_8h_1a0e8845f61f1e1fccfce050830ed5b279"></a><span class="term">wl_array_release</span></dt><dd><pre class="synopsis">void wl_array_release(struct wl_array *array)</pre></dd><dt><a name="Server-wayland-util_8h_1a5dea41986675c31e22d8bea7bf0dc05c"></a><span class="term">wl_array_add</span></dt><dd><pre class="synopsis">void* wl_array_add(struct wl_array *array, size_t size)</pre></dd><dt><a name="Server-wayland-util_8h_1a4de64390294de78da813dcfb16f47617"></a><span class="term">wl_array_copy</span></dt><dd><pre class="synopsis">int wl_array_copy(struct wl_array *array, struct wl_array *source)</pre></dd></dl></div></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="apb.html">Prev</a>&#160;</td><td width="20%" align="center">&#160;</td><td width="40%" align="right">&#160;</td></tr><tr><td width="40%" align="left" valign="top">Appendix&#160;B.&#160;Client API&#160;</td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top">&#160;</td></tr></table></div></body></html>