Commit 31511d0e authored by Jason Ekstrand's avatar Jason Ekstrand Committed by Kristian Høgsberg

Added a destroy signal to the wl_display object.

Added a destroy signal to the wl_display object.
parent 0d2c233e
......@@ -90,6 +90,8 @@ struct wl_display {
struct wl_list global_list;
struct wl_list socket_list;
struct wl_list client_list;
struct wl_signal destroy_signal;
};
struct wl_global {
......@@ -1096,6 +1098,8 @@ wl_display_create(void)
wl_list_init(&display->client_list);
wl_list_init(&display->registry_resource_list);
wl_signal_init(&display->destroy_signal);
display->id = 1;
display->serial = 0;
......@@ -1115,6 +1119,8 @@ wl_display_destroy(struct wl_display *display)
struct wl_socket *s, *next;
struct wl_global *global, *gnext;
wl_signal_emit(&display->destroy_signal, display);
wl_list_for_each_safe(s, next, &display->socket_list, link) {
wl_event_source_remove(s->source);
unlink(s->addr.sun_path);
......@@ -1381,6 +1387,20 @@ wl_display_add_socket(struct wl_display *display, const char *name)
return 0;
}
WL_EXPORT void
wl_display_add_destroy_listener(struct wl_display *display,
struct wl_listener *listener)
{
wl_signal_add(&display->destroy_signal, listener);
}
WL_EXPORT struct wl_listener *
wl_display_get_destroy_listener(struct wl_display *display,
wl_notify_func_t notify)
{
return wl_signal_get(&display->destroy_signal, notify);
}
WL_EXPORT struct wl_resource *
wl_client_add_object(struct wl_client *client,
const struct wl_interface *interface,
......
......@@ -106,6 +106,11 @@ void wl_display_remove_global(struct wl_display *display,
uint32_t wl_display_get_serial(struct wl_display *display);
uint32_t wl_display_next_serial(struct wl_display *display);
void wl_display_add_destroy_listener(struct wl_display *display,
struct wl_listener *listener);
struct wl_listener *wl_display_get_destroy_listener(struct wl_display *display,
wl_notify_func_t notify);
struct wl_client *wl_client_create(struct wl_display *display, int fd);
void wl_client_destroy(struct wl_client *client);
void wl_client_flush(struct wl_client *client);
......
TESTS = \
array-test \
client-test \
display-test \
connection-test \
event-loop-test \
fixed-test \
......@@ -22,6 +23,7 @@ test_runner_src = test-runner.c test-runner.h test-helpers.c
array_test_SOURCES = array-test.c $(test_runner_src)
client_test_SOURCES = client-test.c $(test_runner_src)
display_test_SOURCES = display-test.c $(test_runner_src)
connection_test_SOURCES = connection-test.c $(test_runner_src)
event_loop_test_SOURCES = event-loop-test.c $(test_runner_src)
fixed_test_SOURCES = fixed-test.c $(test_runner_src)
......
/*
* Copyright © 2012 Intel Corporation
* Copyright © 2013 Jason Ekstrand
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that copyright
* notice and this permission notice appear in supporting documentation, and
* that the name of the copyright holders not be used in advertising or
* publicity pertaining to distribution of the software without specific,
* written prior permission. The copyright holders make no representations
* about the suitability of this software for any purpose. It is provided "as
* is" without express or implied warranty.
*
* THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <assert.h>
#include <sys/socket.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "wayland-server.h"
#include "wayland-private.h"
#include "test-runner.h"
struct display_destroy_listener {
struct wl_listener listener;
int done;
};
static void
display_destroy_notify(struct wl_listener *l, void *data)
{
struct display_destroy_listener *listener;
listener = container_of(l, struct display_destroy_listener, listener);
listener->done = 1;
}
TEST(display_destroy_listener)
{
struct wl_display *display;
struct display_destroy_listener a, b;
display = wl_display_create();
assert(display);
a.listener.notify = &display_destroy_notify;
a.done = 0;
wl_display_add_destroy_listener(display, &a.listener);
assert(wl_display_get_destroy_listener(display, display_destroy_notify) ==
&a.listener);
b.listener.notify = display_destroy_notify;
b.done = 0;
wl_display_add_destroy_listener(display, &b.listener);
wl_list_remove(&a.listener.link);
wl_display_destroy(display);
assert(!a.done);
assert(b.done);
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment