struct wl_list shell_surface_list;
/* TODO: */
- struct wl_listener seat_create_listener;
- struct wl_listener output_create_listener;
- struct wl_listener output_change_listener;
+ pepper_event_listener_t seat_create_listener;
+ pepper_event_listener_t output_create_listener;
+ pepper_event_listener_t output_change_listener;
};
struct shell_client
pepper_bool_t ack_configure;
/* Listeners */
- struct wl_listener surface_destroy_listener;
- struct wl_listener surface_commit_listener;
+ pepper_event_listener_t surface_destroy_listener;
+ pepper_event_listener_t surface_commit_listener;
struct wl_list link; /* link */
};
static void
shsurf_stop_listen_commit_event(shell_surface_t *shsurf)
{
- wl_list_remove(&shsurf->surface_commit_listener.link);
- wl_list_init(&shsurf->surface_commit_listener.link);
+ pepper_event_listener_remove(&shsurf->surface_commit_listener);
}
-static void
-handle_surface_commit(struct wl_listener *listener, void *data)
+static pepper_bool_t
+handle_surface_commit(pepper_event_listener_t *listener,
+ pepper_object_t *surface, uint32_t id, void *info)
{
- shell_surface_t *shsurf =
- pepper_container_of(listener, shell_surface_t, surface_commit_listener);
+ shell_surface_t *shsurf = listener->data;
if (!shsurf->mapped && shsurf->ack_configure && shsurf->shell_surface_map)
shsurf->shell_surface_map(shsurf);
+
+ return PEPPER_TRUE;
}
static void
shsurf_start_listen_commit_event(shell_surface_t *shsurf)
{
- shsurf->surface_commit_listener.notify = handle_surface_commit;
- wl_list_init(&shsurf->surface_commit_listener.link);
- /* TODO: Need new API: pepper_surface_add_commit_listener() */
+ pepper_object_add_event_listener((pepper_object_t *)shsurf->surface,
+ &shsurf->surface_commit_listener,
+ PEPPER_EVENT_SURFACE_COMMIT, 0);
}
-static void
-handle_surface_destroy(struct wl_listener *listener, void *data)
+static pepper_bool_t
+handle_surface_destroy(pepper_event_listener_t *listener,
+ pepper_object_t *surface, uint32_t id, void *info)
{
shell_surface_t *child, *tmp;
- shell_surface_t *shsurf =
- pepper_container_of(listener, shell_surface_t, surface_destroy_listener);
-
- wl_list_remove(&shsurf->surface_destroy_listener.link);
+ shell_surface_t *shsurf = listener->data;
+ pepper_event_listener_remove(&shsurf->surface_destroy_listener);
shsurf_stop_listen_commit_event(shsurf);
if (shsurf->resource)
pepper_view_destroy(shsurf->fullscreen.background_view);
free(shsurf);
+ return PEPPER_TRUE;
}
static void
wl_resource_set_implementation(shsurf->resource, implementation, shsurf, handle_resource_destroy);
- shsurf->surface_destroy_listener.notify = handle_surface_destroy;
- pepper_object_add_destroy_listener((pepper_object_t *)surface, &shsurf->surface_destroy_listener);
+ shsurf->surface_destroy_listener.callback = handle_surface_destroy;
+ shsurf->surface_destroy_listener.data = shsurf;
+ pepper_object_add_event_listener((pepper_object_t *)surface,
+ &shsurf->surface_destroy_listener,
+ PEPPER_EVENT_OBJECT_DESTROY, 0);
shell_surface_set_type(shsurf, SHELL_SURFACE_TYPE_NONE);
+
+ shsurf->surface_commit_listener.callback = handle_surface_commit;
+ shsurf->surface_commit_listener.data = shsurf;
shsurf_start_listen_commit_event(shsurf);
/* Set shell_surface_t to pepper_surface_t */
return NULL;
object->type = type;
- wl_signal_init(&object->destroy_signal);
object->user_data_map = pepper_map_create(5, user_data_hash, user_data_key_length,
user_data_key_compare);
void
pepper_object_fini(pepper_object_t *object)
{
- wl_signal_emit(&object->destroy_signal, (void *)object);
+ pepper_object_emit_event(object, PEPPER_EVENT_OBJECT_DESTROY, NULL);
pepper_map_destroy(object->user_data_map);
}
return pepper_map_get(object->user_data_map, key);
}
-PEPPER_API void
-pepper_object_add_destroy_listener(pepper_object_t *object, struct wl_listener *listener)
-{
- wl_signal_add(&object->destroy_signal, listener);
-}
-
static void
insert_listener(pepper_object_t *object, pepper_event_listener_t *listener)
{
}
PEPPER_API void
-pepper_event_listener_insert(pepper_event_listener_t *listener,
- pepper_object_t *object, uint32_t id, int priority)
+pepper_object_add_event_listener(pepper_object_t *object,
+ pepper_event_listener_t *listener,
+ uint32_t id, int priority)
{
listener->object = object;
listener->id = id;
struct pepper_object
{
pepper_object_type_t type;
- struct wl_signal destroy_signal;
pepper_map_t *user_data_map;
pepper_list_t event_listener_list;
};
struct pepper_surface_state
{
- pepper_buffer_t *buffer;
- int32_t x;
- int32_t y;
- pepper_bool_t newly_attached;
+ pepper_buffer_t *buffer;
+ int32_t x;
+ int32_t y;
+ pepper_bool_t newly_attached;
- int32_t transform;
- int32_t scale;
+ int32_t transform;
+ int32_t scale;
- pixman_region32_t damage_region;
- pixman_region32_t opaque_region;
- pixman_region32_t input_region;
+ pixman_region32_t damage_region;
+ pixman_region32_t opaque_region;
+ pixman_region32_t input_region;
- struct wl_list frame_callbacks;
- struct wl_listener buffer_destroy_listener;
+ struct wl_list frame_callbacks;
+ pepper_event_listener_t buffer_destroy_listener;
};
struct pepper_surface
pepper_render_item_t base;
pepper_plane_t *plane;
- struct wl_listener plane_destroy_listener;
+ pepper_event_listener_t plane_destroy_listener;
pepper_bool_t need_damage;
pepper_list_t link;
/* Content. */
pepper_surface_t *surface;
pepper_list_t surface_link;
- struct wl_listener surface_destroy_listener;
+ pepper_event_listener_t surface_destroy_listener;
/* Output info. */
uint32_t output_overlap;
pepper_event_listener_init(pepper_event_listener_t *listener);
PEPPER_API void
-pepper_event_listener_insert(pepper_event_listener_t *listener,
- pepper_object_t *object, uint32_t id, int priority);
+pepper_object_add_event_listener(pepper_object_t *object,
+ pepper_event_listener_t *listener,
+ uint32_t id, int priority);
PEPPER_API void
pepper_event_listener_remove(pepper_event_listener_t *listener);
#include "pepper-internal.h"
-static void
-buffer_destroy_handler(struct wl_listener *listener, void *data)
+static pepper_bool_t
+buffer_destroy_handler(pepper_event_listener_t *listener,
+ pepper_object_t *object, uint32_t id, void *info)
{
- pepper_surface_state_t *state =
- pepper_container_of(listener, pepper_surface_state_t, buffer_destroy_listener);
-
+ pepper_surface_state_t *state = listener->data;
state->buffer = NULL;
+ return PEPPER_TRUE;
}
static void
pixman_region32_init(&state->input_region);
wl_list_init(&state->frame_callbacks);
- state->buffer_destroy_listener.notify = buffer_destroy_handler;
+ state->buffer_destroy_listener.callback = buffer_destroy_handler;
+ state->buffer_destroy_listener.data = state;
}
static void
return;
if (surface->pending.buffer)
- wl_list_remove(&surface->pending.buffer_destroy_listener.link);
+ pepper_event_listener_remove(&surface->pending.buffer_destroy_listener);
surface->pending.buffer = buffer;
surface->pending.x = x;
surface->pending.newly_attached = PEPPER_TRUE;
if (buffer)
- pepper_object_add_destroy_listener(&buffer->base, &surface->pending.buffer_destroy_listener);
+ {
+ pepper_object_add_event_listener(&buffer->base, &surface->pending.buffer_destroy_listener,
+ PEPPER_EVENT_OBJECT_DESTROY, 0);
+ }
}
static void
{
if (surface->pending.buffer)
{
- wl_list_remove(&surface->pending.buffer_destroy_listener.link);
+ pepper_event_listener_remove(&surface->pending.buffer_destroy_listener);
pepper_buffer_reference(surface->pending.buffer);
}
}
}
-static void
-view_handle_surface_destroy(struct wl_listener *listener, void *data)
+static pepper_bool_t
+view_handle_surface_destroy(pepper_event_listener_t *listener,
+ pepper_object_t *object, uint32_t id, void *info)
{
- pepper_view_t *view = pepper_container_of(listener, pepper_view_t, surface_destroy_listener);
+ pepper_view_t *view = listener->data;
PEPPER_ASSERT(view->surface != NULL);
pepper_view_destroy(view);
+ return PEPPER_TRUE;
}
static pepper_list_t *
return pos;
}
-static void
-view_handle_plane_destroy(struct wl_listener *listener, void *data);
+static pepper_bool_t
+view_handle_plane_destroy(pepper_event_listener_t *listener,
+ pepper_object_t *object, uint32_t id, void *info);
static void
plane_entry_set_plane(pepper_plane_entry_t *entry, pepper_plane_t *plane)
{
view_damage_below((pepper_view_t *)entry->base.view);
entry->plane = NULL;
- wl_list_remove(&entry->plane_destroy_listener.link);
+ pepper_event_listener_remove(&entry->plane_destroy_listener);
pixman_region32_fini(&entry->base.visible_region);
}
if (entry->plane)
{
- entry->plane_destroy_listener.notify = view_handle_plane_destroy;
- pepper_object_add_destroy_listener(&plane->base, &entry->plane_destroy_listener);
+ entry->plane_destroy_listener.callback = view_handle_plane_destroy;
+ entry->plane_destroy_listener.data = entry;
+ pepper_object_add_event_listener(&plane->base,
+ &entry->plane_destroy_listener,
+ PEPPER_EVENT_OBJECT_DESTROY, 0);
pixman_region32_init(&entry->base.visible_region);
entry->need_damage = PEPPER_TRUE;
}
}
-static void
-view_handle_plane_destroy(struct wl_listener *listener, void *data)
+static pepper_bool_t
+view_handle_plane_destroy(pepper_event_listener_t *listener,
+ pepper_object_t *object, uint32_t id, void *info)
{
- pepper_plane_entry_t *entry =
- pepper_container_of(listener, pepper_plane_entry_t, plane_destroy_listener);
-
+ pepper_plane_entry_t *entry = listener->data;
PEPPER_ASSERT(entry->plane != NULL);
plane_entry_set_plane(entry, NULL);
+ return PEPPER_TRUE;
}
void
view->surface = surface;
view->surface_link.item = view;
pepper_list_insert(&surface->view_list, &view->surface_link);
- view->surface_destroy_listener.notify = view_handle_surface_destroy;
- pepper_object_add_destroy_listener(&surface->base, &view->surface_destroy_listener);
+
+ view->surface_destroy_listener.callback = view_handle_surface_destroy;
+ view->surface_destroy_listener.data = view;
+ pepper_object_add_event_listener(&surface->base, &view->surface_destroy_listener,
+ PEPPER_EVENT_OBJECT_DESTROY, 0);
return view;
}
if (view->surface)
{
pepper_list_remove(&view->surface_link, NULL);
- wl_list_remove(&view->surface_destroy_listener.link);
+ pepper_event_listener_remove(&view->surface_destroy_listener);
}
pixman_region32_fini(&view->opaque_region);
int pitch;
} shm;
- struct wl_listener buffer_destroy_listener;
- struct wl_listener surface_destroy_listener;
+ pepper_event_listener_t buffer_destroy_listener;
+ pepper_event_listener_t surface_destroy_listener;
};
static pepper_bool_t
pepper_buffer_unreference(state->buffer);
state->buffer = NULL;
- wl_list_remove(&state->buffer_destroy_listener.link);
+ pepper_event_listener_remove(&state->buffer_destroy_listener);
}
}
-static void
-surface_state_handle_surface_destroy(struct wl_listener *listener, void *data)
+static pepper_bool_t
+surface_state_handle_surface_destroy(pepper_event_listener_t *listener,
+ pepper_object_t *object,
+ uint32_t id,
+ void *info)
{
- gl_surface_state_t *state =
- pepper_container_of(listener, gl_surface_state_t, surface_destroy_listener);
-
+ gl_surface_state_t *state = listener->data;
surface_state_release_buffer(state);
- wl_list_remove(&state->surface_destroy_listener.link);
+ pepper_event_listener_remove(&state->surface_destroy_listener);
pepper_object_set_user_data((pepper_object_t *)state->surface, state->renderer, NULL, NULL);
free(state);
+ return PEPPER_TRUE;
}
-static void
-surface_state_handle_buffer_destroy(struct wl_listener *listener, void *data)
+static pepper_bool_t
+surface_state_handle_buffer_destroy(pepper_event_listener_t *listener,
+ pepper_object_t *object,
+ uint32_t id,
+ void *info)
{
- gl_surface_state_t *state =
- pepper_container_of(listener, gl_surface_state_t, buffer_destroy_listener);
-
+ gl_surface_state_t *state = listener->data;
surface_state_release_buffer(state);
+ return PEPPER_TRUE;
}
static gl_surface_state_t *
return NULL;
state->surface = surface;
- state->buffer_destroy_listener.notify = surface_state_handle_buffer_destroy;
- state->surface_destroy_listener.notify = surface_state_handle_surface_destroy;
- pepper_object_add_destroy_listener((pepper_object_t *)surface,
- &state->surface_destroy_listener);
+ state->buffer_destroy_listener.callback = surface_state_handle_buffer_destroy;
+ state->buffer_destroy_listener.data = state;
+
+ state->surface_destroy_listener.callback = surface_state_handle_surface_destroy;
+ state->surface_destroy_listener.data = state;
+
+ pepper_object_add_event_listener((pepper_object_t *)surface,
+ &state->surface_destroy_listener,
+ PEPPER_EVENT_OBJECT_DESTROY, 0);
+
pepper_object_set_user_data((pepper_object_t *)surface, renderer, state, NULL);
}
if (state->buffer)
{
pepper_buffer_unreference(state->buffer);
- wl_list_remove(&state->buffer_destroy_listener.link);
+ pepper_event_listener_remove(&state->buffer_destroy_listener);
}
/* Set new buffer. */
state->buffer = buffer;
- pepper_object_add_destroy_listener((pepper_object_t *)buffer, &state->buffer_destroy_listener);
+ pepper_object_add_event_listener((pepper_object_t *)buffer, &state->buffer_destroy_listener,
+ PEPPER_EVENT_OBJECT_DESTROY, 0);
/* Output buffer size info. */
*w = state->buffer_width;
int buffer_width, buffer_height;
pixman_image_t *image;
- struct wl_listener buffer_destroy_listener;
- struct wl_listener surface_destroy_listener;
+ pepper_event_listener_t buffer_destroy_listener;
+ pepper_event_listener_t surface_destroy_listener;
};
static void
pepper_buffer_unreference(state->buffer);
state->buffer = NULL;
- wl_list_remove(&state->buffer_destroy_listener.link);
+ pepper_event_listener_remove(&state->buffer_destroy_listener);
}
}
-static void
-surface_state_handle_surface_destroy(struct wl_listener *listener, void *data)
+static pepper_bool_t
+surface_state_handle_surface_destroy(pepper_event_listener_t *listener,
+ pepper_object_t *object,
+ uint32_t id,
+ void *info)
{
- pixman_surface_state_t *state =
- pepper_container_of(listener, pixman_surface_state_t, surface_destroy_listener);
+ pixman_surface_state_t *state = listener->data;
surface_state_release_buffer(state);
- wl_list_remove(&state->surface_destroy_listener.link);
+ pepper_event_listener_remove(&state->surface_destroy_listener);
pepper_object_set_user_data((pepper_object_t *)state->surface, state->renderer, NULL, NULL);
free(state);
+
+ return PEPPER_TRUE;
}
-static void
-surface_state_handle_buffer_destroy(struct wl_listener *listener, void *data)
+static pepper_bool_t
+surface_state_handle_buffer_destroy(pepper_event_listener_t *listener,
+ pepper_object_t *object,
+ uint32_t id,
+ void *info)
{
- pixman_surface_state_t *state =
- pepper_container_of(listener, pixman_surface_state_t, buffer_destroy_listener);
-
+ pixman_surface_state_t *state = listener->data;
surface_state_release_buffer(state);
+ return PEPPER_TRUE;
}
static pixman_surface_state_t *
return NULL;
state->surface = surface;
- state->buffer_destroy_listener.notify = surface_state_handle_buffer_destroy;
- state->surface_destroy_listener.notify = surface_state_handle_surface_destroy;
- pepper_object_add_destroy_listener((pepper_object_t *)surface,
- &state->surface_destroy_listener);
+ state->buffer_destroy_listener.callback = surface_state_handle_buffer_destroy;
+ state->buffer_destroy_listener.data = state;
+
+ state->surface_destroy_listener.callback = surface_state_handle_surface_destroy;
+ state->surface_destroy_listener.data = state;
+
+ pepper_object_add_event_listener((pepper_object_t *)surface,
+ &state->surface_destroy_listener,
+ PEPPER_EVENT_OBJECT_DESTROY, 0);
+
pepper_object_set_user_data((pepper_object_t *)surface, renderer, state, NULL);
}
if (state->buffer)
{
pepper_buffer_unreference(state->buffer);
- wl_list_remove(&state->buffer_destroy_listener.link);
+ pepper_event_listener_remove(&state->buffer_destroy_listener);
}
/* Set new buffer. */
state->buffer = buffer;
- pepper_object_add_destroy_listener((pepper_object_t *)buffer, &state->buffer_destroy_listener);
+ pepper_object_add_event_listener((pepper_object_t *)buffer, &state->buffer_destroy_listener,
+ PEPPER_EVENT_OBJECT_DESTROY, 0);
/* Output buffer size info. */
*w = state->buffer_width;