diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index eeed7899..eb6fb0b4 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -43,7 +43,7 @@ include:
# API changes. If you need new features from ci-templates you must bump
# this to the current SHA you require from the ci-templates repo, however
# be aware that you may need to account for API changes when doing so.
- ref: 48c2c583a865bd59be21e8938df247faf460099c
+ ref: f210ea84576f756816da37908771edcee14ef7e6
file:
- '/templates/debian.yml'
- '/templates/freebsd.yml'
@@ -306,11 +306,11 @@ armv7-release-debian-build:
.os-freebsd:
variables:
BUILD_OS: freebsd
- FDO_DISTRIBUTION_VERSION: "14.3"
+ FDO_DISTRIBUTION_VERSION: "13.2"
FDO_DISTRIBUTION_PACKAGES: 'libxslt meson ninja pkgconf expat libffi libepoll-shim libxml2'
# bump this tag every time you change something which requires rebuilding the
# base image
- FDO_DISTRIBUTION_TAG: "2025-07-20.0"
+ FDO_DISTRIBUTION_TAG: "2023-08-02.0"
# Don't build documentation since installing the required tools massively
# increases the VM image (and therefore container) size.
MESON_ARGS: "--fatal-meson-warnings -Dwerror=true -Ddocumentation=false"
diff --git a/cursor/wayland-cursor.c b/cursor/wayland-cursor.c
index 2e21db73..89ecc9a1 100644
--- a/cursor/wayland-cursor.c
+++ b/cursor/wayland-cursor.c
@@ -398,7 +398,7 @@ wl_cursor_theme_load(const char *name, int size, struct wl_shm *shm)
return NULL;
if (size < 0 || (size > 0 && INT_MAX / size / 4 < size))
- goto err;
+ return NULL;
if (!name)
name = "default";
@@ -409,7 +409,7 @@ wl_cursor_theme_load(const char *name, int size, struct wl_shm *shm)
theme->pool = shm_pool_create(shm, size * size * 4);
if (!theme->pool)
- goto err;
+ goto out_error_pool;
xcursor_load_theme(name, size, load_callback, theme);
@@ -421,7 +421,7 @@ wl_cursor_theme_load(const char *name, int size, struct wl_shm *shm)
return theme;
-err:
+out_error_pool:
free(theme);
return NULL;
}
diff --git a/doc/publican/sources/Color.xml b/doc/publican/sources/Color.xml
deleted file mode 100644
index ceee779e..00000000
--- a/doc/publican/sources/Color.xml
+++ /dev/null
@@ -1,139 +0,0 @@
-
-
-%BOOK_ENTITIES;
-]>
-
-
- Color management
-
-
- Overview
-
-
- Color management in Wayland considers only displays. All pictures in
- Wayland are always display-referred, meaning that the pixel values are
- intended as-is for some specific display where they would produce the
- light emissions (stimuli) the picture's
- author desired. Wayland does not support displaying "raw" camera or
- scanner images as they are not display-referred, nor are they even
- pictures without complex and subjective processing.
-
-
- Stimuli — the picture itself — are only half of the picture reproduction.
- The other half is the environment where a display is viewed. A striking
- example is comparing a brightly lit office to a dark movie theater, the
- stimuli required to produce a good reading of the picture is greatly
- different. Therefore display-referred does not include only the display
- but the viewing environment as well.
-
-
- Window systems have been very well capable of operating without any
- explicit consideration to color management. This is because there used to
- be the implicit assumption of the standard display, the sRGB display,
- which all computer monitors implemented, more or less. The viewing
- environment was and still is accounted by adjusting the display and/or the
- room to produce a workable experience. Pictures are authored on a computer
- system by drawing, painting and adjusting the picture until it looks right
- on the author's monitor. This implicitly builds the standard display and
- environment assumption into the picture data. Deviations from the sRGB
- specification were minor enough that they often did not matter if not in a
- professional context like the printing industry. Displaying video material
- required some more attention to the details, because video and television
- standards differ enough from the sRGB display. What really made explicit
- color management a hard requirement for entertainment is the coming of
- wide color gamut (WCG) and high dynamic range (HDR) materials and
- displays.
-
-
- The color management design in Wayland follows the general Wayland design
- principles: compositors tell clients what would be the optimal thing to
- do, clients tell the compositors what kind of pictures they are actually
- producing, and then compositors display those pictures the best they can.
-
-
-
-
- Protocol Interfaces
-
-
- Color management interfaces in Wayland and divided into two protocols:
- color-management
- and
- color-representation.
- They are designed to work together, but they can also be used
- independently when the other one is not needed.
-
-
-
- Color-management
-
-
- Color management protocol has two main purposes. First, it puts the
- responsibility of color management on the compositor. This means that
- clients do not necessarily need to care about color management at all,
- and can display just fine by using the traditional standard display
- assumption even when the actual display is wildly different. Clients
- can also choose to target some other assumed display and let the
- compositor handle it, or they can explicitly render for the actual
- display at hand. Second, when the window system has multiple different
- monitors, and a wl_surface happens to span more than one monitor, the
- compositor can display the surface content correctly on all spanned
- monitors simultaneously, as much as physically possible.
-
-
- Color-management protocol concentrates on colorimetry: when you have a
- pixel with RGB values, what stimulus do those values represent. The
- stimulus definition follows the CIE 1931 two-degree observer model. Some
- core concepts here are color primaries, white point, transfer function,
- and dynamic range. The viewing environment is represented in an
- extremely simplified way as the reference white luminance. The
- connection between pixel RGB values and stimulus plus viewing
- environment is recorded in an image description
- object. Clients can create image description objects and tag
- wl_surfaces with them, to indicate what kind of surface
- content there will be. Clients can also ask what image description the
- compositor would prefer to have on the wl_surface, and that
- preference can change over time, e.g. when the wl_surface
- is moved from one
- wl_output to another. Following the compositor's preference
- may provide advantages in image quality and power consumption.
-
-
- Image description objects can come in two flavors: parametric and
- ICC-based. The above was written with parametric image descriptions in
- mind, and they have first-class support for HDR. ICC-based image
- descriptions are wrapping an ICC profile and have no other data. ICC
- profiles are the standard tool for standard dynamic range (SDR) display
- color management. This means the capabilities between the two flavors
- differ, and one cannot always be replaced by the other. Compositor
- support for each flavor is optional.
-
-
-
-
- Color-representation
-
-
- Color-representation protocol deals with (potentially sub-sampled)
- YCbCr-RGB conversion, quantization range, and the inclusion of alpha in
- the RGB color channels, a.k.a. pre-multiplication. There are several
- different specifications on how an YCbCr-like (including ICtCp) signal,
- with chroma sub-sampling or not, is created from a full-resolution RGB
- image. Again, a client can tag a wl_surface with
- color-representation metadata to tell the compositor what kind of pixel
- data will be displayed through the wl_surface.
-
-
- The main purpose of color-representation is to correctly off-load the
- YCbCr-RGB conversion to the compositor, which can then opportunistically
- off-load it further to very power-efficient fixed-function circuitry in
- a display controller. This can significantly reduce power consumption
- when watching videos compared to using a GPU for the same, and on some
- embedded hardware platforms it is a hard requirement for processing high
- resolution video.
-
-
-
-
diff --git a/doc/publican/sources/Protocol.xml b/doc/publican/sources/Protocol.xml
index e4087e9f..692f17eb 100644
--- a/doc/publican/sources/Protocol.xml
+++ b/doc/publican/sources/Protocol.xml
@@ -97,9 +97,7 @@
in the environment). Beginning in Wayland 1.15, implementations can
optionally support server socket endpoints located at arbitrary
locations in the filesystem by setting WAYLAND_DISPLAY
- to the absolute path at which the server endpoint listens. The socket may
- also be provided through file descriptor inheritance, in which case
- WAYLAND_SOCKET is set.
+ to the absolute path at which the server endpoint listens.
Every message is structured as 32-bit words; values are represented in the
diff --git a/doc/publican/sources/Wayland.xml b/doc/publican/sources/Wayland.xml
index 7593097e..0457c15c 100644
--- a/doc/publican/sources/Wayland.xml
+++ b/doc/publican/sources/Wayland.xml
@@ -12,7 +12,6 @@
-
diff --git a/doc/publican/sources/meson.build b/doc/publican/sources/meson.build
index a53b3890..52f3a681 100644
--- a/doc/publican/sources/meson.build
+++ b/doc/publican/sources/meson.build
@@ -54,7 +54,6 @@ publican_sources = [
'Protocol.xml',
'Xwayland.xml',
'Compositors.xml',
- 'Color.xml',
'Client.xml',
'Server.xml'
]
diff --git a/meson.build b/meson.build
index ce386a4c..ef34ba4a 100644
--- a/meson.build
+++ b/meson.build
@@ -1,6 +1,6 @@
project(
'wayland', 'c',
- version: '1.24.90',
+ version: '1.24.0',
license: 'MIT',
meson_version: '>= 0.57.0',
default_options: [
@@ -46,7 +46,6 @@ have_funcs = [
'memfd_create',
'mremap',
'strndup',
- 'gettid',
]
foreach f: have_funcs
config_h.set('HAVE_' + f.underscorify().to_upper(), cc.has_function(f))
diff --git a/src/connection.c b/src/connection.c
index 2d1e8d1d..3ef8688d 100644
--- a/src/connection.c
+++ b/src/connection.c
@@ -26,8 +26,6 @@
#define _GNU_SOURCE
-#include "../config.h"
-
#include
#include
#include
@@ -1493,56 +1491,11 @@ wl_closure_queue(struct wl_closure *closure, struct wl_connection *connection)
return result;
}
-bool
-wl_check_env_token(const char *env, const char *token)
-{
- const char *ptr = env;
- size_t token_len;
-
- if (env == NULL)
- return false;
-
- token_len = strlen(token);
-
- // Scan the string for comma-separated tokens and look for a match.
- while (true) {
- const char *end;
- size_t len;
-
- // Skip over any leading separators.
- while (*ptr == ',')
- ptr++;
-
- if (*ptr == '\x00')
- return false;
-
- end = strchr(ptr + 1, ',');
-
- // If there isn't another separarator, then the rest of the string
- // is one token.
- if (end == NULL)
- return (strcmp(ptr, token) == 0);
-
- len = end - ptr;
- if (len == token_len && memcmp(ptr, token, len) == 0) {
- return true;
- }
-
- // Skip to the next token.
- ptr += len;
- }
-
- return false;
-}
-
void
wl_closure_print(struct wl_closure *closure, struct wl_object *target,
int send, int discarded, uint32_t (*n_parse)(union wl_argument *arg),
- const char *queue_name, int color)
+ const char *queue_name)
{
-#if defined(HAVE_GETTID)
- static int include_tid = -1;
-#endif // defined(HAVE_GETTID)
int i;
struct argument_details arg;
const char *signature = closure->message->signature;
@@ -1559,40 +1512,17 @@ wl_closure_print(struct wl_closure *closure, struct wl_object *target,
clock_gettime(CLOCK_REALTIME, &tp);
time = (tp.tv_sec * 1000000L) + (tp.tv_nsec / 1000);
- fprintf(f, "%s[%7u.%03u] ",
- color ? WL_DEBUG_COLOR_GREEN : "",
- time / 1000, time % 1000);
-#if defined(HAVE_GETTID)
- if (include_tid < 0) {
- include_tid = wl_check_env_token(getenv("WAYLAND_DEBUG"), "thread_id");
- }
+ fprintf(f, "[%7u.%03u] ", time / 1000, time % 1000);
- if (include_tid) {
- fprintf(f, "%sTID#%d ",
- color ? WL_DEBUG_COLOR_CYAN : "",
- (int) gettid());
- }
-#endif
+ if (queue_name)
+ fprintf(f, "{%s} ", queue_name);
- if (queue_name) {
- fprintf(f, "%s{%s} ",
- color ? WL_DEBUG_COLOR_YELLOW : "",
- queue_name);
- }
-
- fprintf(f, "%s%s%s%s%s%s%s#%u%s.%s%s(",
- color ? WL_DEBUG_COLOR_RED : "",
+ fprintf(f, "%s%s%s#%u.%s(",
discarded ? "discarded " : "",
- color ? WL_DEBUG_COLOR_RESET : "",
send ? " -> " : "",
- color ? WL_DEBUG_COLOR_BLUE : "",
- target->interface->name,
- color ? WL_DEBUG_COLOR_MAGENTA : "",
- target->id,
- color ? WL_DEBUG_COLOR_CYAN : "",
- closure->message->name,
- color ? WL_DEBUG_COLOR_RESET : "");
+ target->interface->name, target->id,
+ closure->message->name);
for (i = 0; i < closure->count; i++) {
signature = get_next_argument(signature, &arg);
@@ -1657,7 +1587,7 @@ wl_closure_print(struct wl_closure *closure, struct wl_object *target,
}
}
- fprintf(f, ")%s\n", color ? WL_DEBUG_COLOR_RESET : "");
+ fprintf(f, ")\n");
if (fclose(f) == 0) {
fprintf(stderr, "%s", buffer);
diff --git a/src/wayland-client-core.h b/src/wayland-client-core.h
index e0523e49..970e6254 100644
--- a/src/wayland-client-core.h
+++ b/src/wayland-client-core.h
@@ -268,16 +268,9 @@ int
wl_display_dispatch_queue_pending(struct wl_display *display,
struct wl_event_queue *queue);
-int
-wl_display_dispatch_queue_pending_single(struct wl_display *display,
- struct wl_event_queue *queue);
-
int
wl_display_dispatch_pending(struct wl_display *display);
-int
-wl_display_dispatch_pending_single(struct wl_display *display);
-
int
wl_display_get_error(struct wl_display *display);
diff --git a/src/wayland-client.c b/src/wayland-client.c
index ed686b5c..2464e7b7 100644
--- a/src/wayland-client.c
+++ b/src/wayland-client.c
@@ -115,7 +115,6 @@ struct wl_display {
/** \endcond */
static int debug_client = 0;
-static int debug_color = 0;
/**
* This helper function wakes up all threads that are
@@ -937,7 +936,7 @@ wl_proxy_marshal_array_flags(struct wl_proxy *proxy, uint32_t opcode,
queue_name = wl_event_queue_get_name(queue);
wl_closure_print(closure, &proxy->object, true, false, NULL,
- queue_name, debug_color);
+ queue_name);
}
if (wl_closure_send(closure, proxy->display->connection)) {
@@ -1230,23 +1229,10 @@ wl_display_connect_to_fd(int fd)
{
struct wl_display *display;
const char *debug;
- const char *no_color;
- const char *force_color;
- no_color = getenv("NO_COLOR");
- force_color = getenv("FORCE_COLOR");
debug = getenv("WAYLAND_DEBUG");
- if (debug && (wl_check_env_token(debug, "client") || wl_check_env_token(debug, "1"))) {
+ if (debug && (strstr(debug, "client") || strstr(debug, "1")))
debug_client = 1;
- if (isatty(fileno(stderr)))
- debug_color = 1;
- }
-
- if (force_color && force_color[0] != '\0')
- debug_color = 1;
-
- if (no_color && no_color[0] != '\0')
- debug_color = 0;
display = zalloc(sizeof *display);
if (display == NULL) {
@@ -1614,16 +1600,12 @@ queue_event(struct wl_display *display, int len)
if (debug_client) {
clock_gettime(CLOCK_REALTIME, &tp);
time = (tp.tv_sec * 1000000L) + (tp.tv_nsec / 1000);
- fprintf(stderr, "%s[%7u.%03u] %sdiscarded %s[%s]%s#%u%s.[event %d]%s"
+
+ fprintf(stderr, "[%7u.%03u] discarded [%s]#%u.[event %d]"
"(%d fd, %d byte)\n",
- debug_color ? WL_DEBUG_COLOR_GREEN : "",
time / 1000, time % 1000,
- debug_color ? WL_DEBUG_COLOR_RED : "",
- debug_color ? WL_DEBUG_COLOR_BLUE : "",
zombie ? "zombie" : "unknown",
- debug_color ? WL_DEBUG_COLOR_MAGENTA : "", id,
- debug_color ? WL_DEBUG_COLOR_BLUE : "", opcode,
- debug_color ? WL_DEBUG_COLOR_RESET : "",
+ id, opcode,
num_zombie_fds, size);
}
if (num_zombie_fds > 0)
@@ -1708,7 +1690,7 @@ dispatch_event(struct wl_display *display, struct wl_event_queue *queue)
!(proxy->dispatcher || proxy->object.implementation);
wl_closure_print(closure, &proxy->object, false, discarded,
- id_from_object, queue->name, debug_color);
+ id_from_object, queue->name);
}
if (proxy_destroyed) {
@@ -1882,34 +1864,6 @@ err:
return -1;
}
-
-static int
-dispatch_queue_single(struct wl_display *display, struct wl_event_queue *queue)
-{
- if (display->last_error)
- goto err;
-
- while (!wl_list_empty(&display->display_queue.event_list)) {
- dispatch_event(display, &display->display_queue);
- if (display->last_error)
- goto err;
- }
-
- if (!wl_list_empty(&queue->event_list)) {
- dispatch_event(display, queue);
- if (display->last_error)
- goto err;
- return 1;
- } else {
- return 0;
- }
-
-err:
- errno = display->last_error;
-
- return -1;
-}
-
/** Prepare to read events from the display's file descriptor to a queue
*
* \param display The display context object
@@ -2240,34 +2194,6 @@ wl_display_dispatch_queue_pending(struct wl_display *display,
return ret;
}
-/** Dispatch at most one pending event in an event queue
- *
- * \param display The display context object
- * \param queue The event queue to dispatch
- * \return The number of dispatched events (0 or 1) on success or -1 on failure
- *
- * Dispatch at most one pending event for objects assigned to the given
- * event queue. On failure -1 is returned and errno set appropriately.
- * If there are no events queued, this function returns immediately.
- *
- * \memberof wl_display
- * \since 1.25.0
- */
-WL_EXPORT int
-wl_display_dispatch_queue_pending_single(struct wl_display *display,
- struct wl_event_queue *queue)
-{
- int ret;
-
- pthread_mutex_lock(&display->mutex);
-
- ret = dispatch_queue_single(display, queue);
-
- pthread_mutex_unlock(&display->mutex);
-
- return ret;
-}
-
/** Process incoming events
*
* \param display The display context object
@@ -2328,25 +2254,6 @@ wl_display_dispatch_pending(struct wl_display *display)
&display->default_queue);
}
-/** Dispatch at most one pending event in the default event queue.
- *
- * \param display The display context object
- * \return The number of dispatched events (0 or 1) on success or -1 on failure
- *
- * Dispatch at most one pending event for objects assigned to the default
- * event queue. On failure -1 is returned and errno set appropriately.
- * If there are no events queued, this function returns immediately.
- *
- * \memberof wl_display
- * \since 1.25.0
- */
-WL_EXPORT int
-wl_display_dispatch_pending_single(struct wl_display *display)
-{
- return wl_display_dispatch_queue_pending_single(display,
- &display->default_queue);
-}
-
/** Retrieve the last error that occurred on a display
*
* \param display The display context object
diff --git a/src/wayland-private.h b/src/wayland-private.h
index d0e4cfc6..b84010d0 100644
--- a/src/wayland-private.h
+++ b/src/wayland-private.h
@@ -53,14 +53,6 @@
# error default buffer cannot hold maximum-sized message
#endif
-#define WL_DEBUG_COLOR_RESET "\e[0m"
-#define WL_DEBUG_COLOR_RED "\e[31m"
-#define WL_DEBUG_COLOR_GREEN "\e[32m"
-#define WL_DEBUG_COLOR_YELLOW "\e[33m"
-#define WL_DEBUG_COLOR_BLUE "\e[34m"
-#define WL_DEBUG_COLOR_MAGENTA "\e[35m"
-#define WL_DEBUG_COLOR_CYAN "\e[36m"
-
/**
* Argument types used in signatures.
*/
@@ -237,14 +229,11 @@ wl_closure_send(struct wl_closure *closure, struct wl_connection *connection);
int
wl_closure_queue(struct wl_closure *closure, struct wl_connection *connection);
-bool
-wl_check_env_token(const char *env, const char *token);
-
void
wl_closure_print(struct wl_closure *closure,
struct wl_object *target, int send, int discarded,
uint32_t (*n_parse)(union wl_argument *arg),
- const char *queue_name, int color);
+ const char *queue_name);
void
wl_closure_destroy(struct wl_closure *closure);
diff --git a/src/wayland-server.c b/src/wayland-server.c
index c81d98f1..72a12018 100644
--- a/src/wayland-server.c
+++ b/src/wayland-server.c
@@ -149,7 +149,6 @@ struct wl_protocol_logger {
};
static int debug_server = 0;
-static int debug_color = 0;
static void
log_closure(struct wl_resource *resource,
@@ -161,7 +160,7 @@ log_closure(struct wl_resource *resource,
struct wl_protocol_logger_message message;
if (debug_server)
- wl_closure_print(closure, object, send, false, NULL, NULL, debug_color);
+ wl_closure_print(closure, object, send, false, NULL, NULL);
if (!wl_list_empty(&display->protocol_loggers)) {
message.resource = resource;
@@ -1192,23 +1191,10 @@ wl_display_create(void)
{
struct wl_display *display;
const char *debug;
- const char *no_color;
- const char *force_color;
- no_color = getenv("NO_COLOR");
- force_color = getenv("FORCE_COLOR");
debug = getenv("WAYLAND_DEBUG");
- if (debug && (wl_check_env_token(debug, "server") || wl_check_env_token(debug, "1"))) {
+ if (debug && (strstr(debug, "server") || strstr(debug, "1")))
debug_server = 1;
- if (isatty(fileno(stderr)))
- debug_color = 1;
- }
-
- if (force_color && force_color[0] != '\0')
- debug_color = 1;
-
- if (no_color && no_color[0] != '\0')
- debug_color = 0;
display = zalloc(sizeof *display);
if (display == NULL)
@@ -1831,24 +1817,6 @@ _wl_display_add_socket(struct wl_display *display, struct wl_socket *s)
return 0;
}
-
-/** Automatically pick a Wayland display socket for the clients to connect to.
- *
- * \param display Wayland display to which the socket should be added.
- * \return The socket name if success. NULL if failed.
- *
- * This adds a Unix socket to Wayland display which can be used by clients to
- * connect to Wayland display. The name of the socket is chosen automatically
- * as the first available name in the sequence "wayland-0", "wayland-1",
- * "wayland-2", ..., "wayland-32".
- *
- * The string returned by this function is owned by the library and should
- * not be freed.
- *
- * \sa wl_display_add_socket
- *
- * \memberof wl_display
- */
WL_EXPORT const char *
wl_display_add_socket_auto(struct wl_display *display)
{
diff --git a/tests/display-test.c b/tests/display-test.c
index fe78b521..89606c73 100644
--- a/tests/display-test.c
+++ b/tests/display-test.c
@@ -1695,75 +1695,6 @@ TEST(global_remove)
display_destroy(d);
}
-static void
-dispatch_single_read_events(struct wl_display *d)
-{
- if (wl_display_prepare_read(d) < 0) {
- return;
- }
-
- int ret = 0;
- do {
- ret = wl_display_flush(d);
- } while (ret < 0 && (errno == EINTR || errno == EAGAIN));
- assert(ret >= 0);
-
- struct pollfd pfd[1];
- pfd[0].fd = wl_display_get_fd(d);
- pfd[0].events = POLLIN;
-
- do {
- ret = poll(pfd, 1, -1);
- } while (ret < 0 && errno == EINTR);
- assert(ret > 0);
-
- wl_display_read_events(d);
-}
-
-static void
-dispatch_single_client(void)
-{
- struct client *c = client_connect();
-
- assert(wl_display_dispatch_pending_single(c->wl_display) == 0);
-
- struct wl_registry *registry = wl_display_get_registry(c->wl_display);
-
- dispatch_single_read_events(c->wl_display);
-
- // [1815110.061] {Default Queue} wl_registry#3.global(1, "test", 1)
- assert(wl_display_dispatch_pending_single(c->wl_display) == 1);
-
- dispatch_single_read_events(c->wl_display);
-
- // [1815110.067] {Default Queue} wl_registry#3.global(2, "wl_seat", 1)
- assert(wl_display_dispatch_pending_single(c->wl_display) == 1);
-
- // No more events
- assert(wl_display_dispatch_pending_single(c->wl_display) == 0);
-
- wl_registry_destroy(registry);
-
- client_disconnect(c);
-}
-
-TEST(dispatch_single)
-{
- struct display *d = display_create();
-
- struct wl_global *global = wl_global_create(d->wl_display,
- &wl_seat_interface,
- 1, d, bind_seat);
-
- client_create_noarg(d, dispatch_single_client);
-
- display_run(d);
-
- wl_global_destroy(global);
-
- display_destroy(d);
-}
-
static void
terminate_display(void *arg)
{