Exposing structure through an API header file might be dangerous.
Change-Id: If2dde1657820b3a9feb2bbe065f1b86e3360da11
struct wl_list shell_surface_list;
/* TODO: */
- pepper_event_listener_t seat_create_listener;
- pepper_event_listener_t output_create_listener;
- pepper_event_listener_t 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 */
- pepper_event_listener_t surface_destroy_listener;
- pepper_event_listener_t 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)
{
- pepper_event_listener_remove(&shsurf->surface_commit_listener);
+ pepper_event_listener_remove(shsurf->surface_commit_listener);
}
-static pepper_bool_t
+static void
handle_surface_commit(pepper_event_listener_t *listener,
- pepper_object_t *surface, uint32_t id, void *info)
+ pepper_object_t *surface, uint32_t id, void *info, void *data)
{
- shell_surface_t *shsurf = listener->data;
+ shell_surface_t *shsurf = 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)
{
- pepper_object_add_event_listener((pepper_object_t *)shsurf->surface,
- &shsurf->surface_commit_listener,
- PEPPER_EVENT_SURFACE_COMMIT, 0);
+ shsurf->surface_commit_listener =
+ pepper_object_add_event_listener((pepper_object_t *)shsurf->surface,
+ PEPPER_EVENT_SURFACE_COMMIT, 0,
+ handle_surface_commit, shsurf);
}
-static pepper_bool_t
+static void
handle_surface_destroy(pepper_event_listener_t *listener,
- pepper_object_t *surface, uint32_t id, void *info)
+ pepper_object_t *surface, uint32_t id, void *info, void *data)
{
shell_surface_t *child, *tmp;
- shell_surface_t *shsurf = listener->data;
+ shell_surface_t *shsurf = data;
- pepper_event_listener_remove(&shsurf->surface_destroy_listener);
+ 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);
- pepper_event_listener_init(&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);
+ shsurf->surface_destroy_listener =
+ pepper_object_add_event_listener((pepper_object_t *)surface, PEPPER_EVENT_OBJECT_DESTROY, 0,
+ handle_surface_destroy, shsurf);
shell_surface_set_type(shsurf, SHELL_SURFACE_TYPE_NONE);
-
- pepper_event_listener_init(&shsurf->surface_commit_listener);
- 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 */
{
pepper_seat_t *seat;
pepper_input_device_t *device;
- pepper_event_listener_t listener;
+ pepper_event_listener_t *listener;
pepper_list_t link;
};
}
}
-static pepper_bool_t
+static void
seat_handle_device_event(pepper_event_listener_t *listener, pepper_object_t *object,
- uint32_t id, void *info)
+ uint32_t id, void *info, void *data)
{
- pepper_input_device_entry_t *entry = listener->data;
+ pepper_input_device_entry_t *entry = data;
switch (id)
{
/* TODO: */
break;
}
-
- return PEPPER_TRUE;
}
PEPPER_API void
entry->seat = seat;
entry->device = device;
- pepper_event_listener_init(&entry->listener);
- entry->listener.data = entry;
- entry->listener.callback = seat_handle_device_event;
-
- pepper_object_add_event_listener(&device->base, &entry->listener, PEPPER_EVENT_ALL, 0);
+ entry->listener = pepper_object_add_event_listener(&device->base, PEPPER_EVENT_ALL, 0,
+ seat_handle_device_event, entry);
pepper_list_insert(&seat->input_device_list, &entry->link);
seat_update_caps(seat);
if (entry->device == device)
{
pepper_list_remove(&entry->link, NULL);
- pepper_event_listener_remove(&entry->listener);
+ pepper_event_listener_remove(entry->listener);
pepper_free(entry);
seat_update_caps(seat);
return;
pepper_list_insert(object->event_listener_list.prev, &listener->link);
}
-PEPPER_API void
-pepper_event_listener_init(pepper_event_listener_t *listener)
+PEPPER_API pepper_event_listener_t *
+pepper_object_add_event_listener(pepper_object_t *object, uint32_t id, int priority,
+ pepper_event_callback_t callback, void *data)
{
- memset(listener, 0x00, sizeof(pepper_event_listener_t));
- listener->link.item = listener;
-}
+ pepper_event_listener_t *listener;
-PEPPER_API void
-pepper_object_add_event_listener(pepper_object_t *object,
- pepper_event_listener_t *listener,
- uint32_t id, int priority)
-{
+ if (!callback)
+ return NULL;
+
+ listener = pepper_calloc(1, sizeof(pepper_event_listener_t));
+ if (!listener)
+ return NULL;
+
+ listener->link.item = listener;
listener->object = object;
listener->id = id;
listener->priority = priority;
+ listener->callback = callback;
+ listener->data = data;
insert_listener(object, listener);
}
PEPPER_API void
pepper_event_listener_remove(pepper_event_listener_t *listener)
{
- if (!listener->object)
- return;
-
pepper_list_remove(&listener->link, NULL);
- listener->object = NULL;
+ pepper_free(listener);
}
PEPPER_API void
listener = l->item;
if (listener->id == PEPPER_EVENT_ALL || listener->id == id)
- listener->callback(listener, object, id, info);
+ listener->callback(listener, object, id, listener->data, info);
}
}
void
pepper_object_fini(pepper_object_t *object);
+struct pepper_event_listener
+{
+ pepper_object_t *object;
+ uint32_t id;
+ int priority;
+ pepper_event_callback_t callback;
+ void *data;
+
+ pepper_list_t link;
+};
+
/* compositor */
struct pepper_compositor
{
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;
- pepper_event_listener_t buffer_destroy_listener;
+ struct wl_list frame_callbacks;
+ pepper_event_listener_t *buffer_destroy_listener;
};
struct pepper_surface
struct pepper_plane_entry
{
- pepper_render_item_t base;
+ pepper_render_item_t base;
- pepper_plane_t *plane;
- pepper_event_listener_t plane_destroy_listener;
- pepper_bool_t need_damage;
+ pepper_plane_t *plane;
+ pepper_event_listener_t *plane_destroy_listener;
+ pepper_bool_t need_damage;
- pepper_list_t link;
+ pepper_list_t link;
};
enum
struct pepper_view
{
- pepper_object_t base;
- pepper_compositor_t *compositor;
- pepper_list_t compositor_link;
+ pepper_object_t base;
+ pepper_compositor_t *compositor;
+ pepper_list_t compositor_link;
- uint32_t dirty;
+ uint32_t dirty;
/* Hierarchy. */
- pepper_view_t *parent;
- pepper_list_t parent_link;
- pepper_list_t children_list;
+ pepper_view_t *parent;
+ pepper_list_t parent_link;
+ pepper_list_t children_list;
/* Geometry. */
- double x, y;
- int w, h;
- pepper_mat4_t transform;
- pepper_mat4_t global_transform;
+ double x, y;
+ int w, h;
+ pepper_mat4_t transform;
+ pepper_mat4_t global_transform;
- pixman_region32_t bounding_region;
- pixman_region32_t opaque_region;
+ pixman_region32_t bounding_region;
+ pixman_region32_t opaque_region;
/* Visibility. */
- pepper_bool_t visible;
- pepper_bool_t prev_visible;
- pepper_bool_t mapped;
+ pepper_bool_t visible;
+ pepper_bool_t prev_visible;
+ pepper_bool_t mapped;
/* Content. */
- pepper_surface_t *surface;
- pepper_list_t surface_link;
- pepper_event_listener_t surface_destroy_listener;
+ pepper_surface_t *surface;
+ pepper_list_t surface_link;
+ pepper_event_listener_t *surface_destroy_listener;
/* Output info. */
- uint32_t output_overlap;
- pepper_plane_entry_t plane_entries[PEPPER_MAX_OUTPUT_COUNT];
+ uint32_t output_overlap;
+ pepper_plane_entry_t plane_entries[PEPPER_MAX_OUTPUT_COUNT];
/* Temporary resource. */
- pepper_list_t link;
+ pepper_list_t link;
};
void
typedef struct pepper_output_geometry pepper_output_geometry_t;
typedef struct pepper_output_mode pepper_output_mode_t;
-typedef struct pepper_event_listener pepper_event_listener_t;
-
typedef struct pepper_input_device pepper_input_device_t;
typedef struct pepper_input_device_backend pepper_input_device_backend_t;
typedef struct pepper_touch_up_event pepper_touch_up_event_t;
typedef struct pepper_touch_motion_event pepper_touch_motion_event_t;
+typedef struct pepper_event_listener pepper_event_listener_t;
+typedef void (*pepper_event_callback_t)(pepper_event_listener_t *listener, pepper_object_t *object,
+ uint32_t id, void *info, void *data);
+
struct pepper_output_geometry
{
int32_t x;
PEPPER_OBJECT_PLANE,
} pepper_object_type_t;
-struct pepper_event_listener
-{
- void *data;
-
- pepper_bool_t (*callback)(pepper_event_listener_t *listener,
- pepper_object_t *object,
- uint32_t id,
- void *info);
-
- /* Don't touch these variables. Used by pepepr internally. */
- pepper_object_t *object;
- uint32_t id;
- int priority;
- pepper_list_t link;
-};
-
enum pepper_object_events
{
PEPPER_EVENT_OBJECT_DESTROY,
PEPPER_API void
pepper_object_add_destroy_listener(pepper_object_t *object, struct wl_listener *listener);
-PEPPER_API void
-pepper_event_listener_init(pepper_event_listener_t *listener);
-
-PEPPER_API void
-pepper_object_add_event_listener(pepper_object_t *object,
- pepper_event_listener_t *listener,
- uint32_t id, int priority);
+PEPPER_API pepper_event_listener_t *
+pepper_object_add_event_listener(pepper_object_t *object, uint32_t id, int priority,
+ pepper_event_callback_t callback, void *data);
PEPPER_API void
pepper_event_listener_remove(pepper_event_listener_t *listener);
#include "pepper-internal.h"
-static pepper_bool_t
-buffer_destroy_handler(pepper_event_listener_t *listener,
- pepper_object_t *object, uint32_t id, void *info)
+static void
+surface_state_handle_buffer_destroy(pepper_event_listener_t *listener,
+ pepper_object_t *object, uint32_t id, void *info, void *data)
{
- pepper_surface_state_t *state = listener->data;
+ pepper_surface_state_t *state = data;
state->buffer = NULL;
- return PEPPER_TRUE;
}
static void
pixman_region32_init(&state->input_region);
wl_list_init(&state->frame_callbacks);
- pepper_event_listener_init(&state->buffer_destroy_listener);
- state->buffer_destroy_listener.callback = buffer_destroy_handler;
- state->buffer_destroy_listener.data = state;
}
static void
return;
if (surface->pending.buffer)
- pepper_event_listener_remove(&surface->pending.buffer_destroy_listener);
+ pepper_event_listener_remove(surface->pending.buffer_destroy_listener);
surface->pending.buffer = buffer;
surface->pending.x = x;
if (buffer)
{
- pepper_object_add_event_listener(&buffer->base, &surface->pending.buffer_destroy_listener,
- PEPPER_EVENT_OBJECT_DESTROY, 0);
+ surface->pending.buffer_destroy_listener =
+ pepper_object_add_event_listener(&buffer->base, PEPPER_EVENT_OBJECT_DESTROY, 0,
+ surface_state_handle_buffer_destroy, &surface->pending);
}
}
{
if (surface->pending.buffer)
{
- pepper_event_listener_remove(&surface->pending.buffer_destroy_listener);
+ pepper_event_listener_remove(surface->pending.buffer_destroy_listener);
pepper_buffer_reference(surface->pending.buffer);
}
}
}
-static pepper_bool_t
+static void
view_handle_surface_destroy(pepper_event_listener_t *listener,
- pepper_object_t *object, uint32_t id, void *info)
+ pepper_object_t *object, uint32_t id, void *info, void *data)
{
- pepper_view_t *view = listener->data;
+ pepper_view_t *view = data;
PEPPER_ASSERT(view->surface != NULL);
pepper_view_destroy(view);
- return PEPPER_TRUE;
}
static pepper_list_t *
return pos;
}
-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_handle_plane_destroy(pepper_event_listener_t *listener,
+ pepper_object_t *object, uint32_t id, void *info, void *data);
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;
- pepper_event_listener_remove(&entry->plane_destroy_listener);
+ pepper_event_listener_remove(entry->plane_destroy_listener);
pixman_region32_fini(&entry->base.visible_region);
}
if (entry->plane)
{
- pepper_event_listener_init(&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);
+ entry->plane_destroy_listener =
+ pepper_object_add_event_listener(&plane->base, PEPPER_EVENT_OBJECT_DESTROY, 0,
+ plane_entry_handle_plane_destroy, entry);
+
pixman_region32_init(&entry->base.visible_region);
entry->need_damage = PEPPER_TRUE;
}
}
-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_handle_plane_destroy(pepper_event_listener_t *listener,
+ pepper_object_t *object, uint32_t id, void *info, void *data)
{
- pepper_plane_entry_t *entry = listener->data;
+ pepper_plane_entry_t *entry = data;
PEPPER_ASSERT(entry->plane != NULL);
plane_entry_set_plane(entry, NULL);
- return PEPPER_TRUE;
}
void
view->surface_link.item = view;
pepper_list_insert(&surface->view_list, &view->surface_link);
- pepper_event_listener_init(&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);
+ view->surface_destroy_listener =
+ pepper_object_add_event_listener(&surface->base, PEPPER_EVENT_OBJECT_DESTROY, 0,
+ view_handle_surface_destroy, view);
return view;
}
if (view->surface)
{
pepper_list_remove(&view->surface_link, NULL);
- pepper_event_listener_remove(&view->surface_destroy_listener);
+ pepper_event_listener_remove(view->surface_destroy_listener);
}
pixman_region32_fini(&view->opaque_region);
int pitch;
} shm;
- pepper_event_listener_t buffer_destroy_listener;
- pepper_event_listener_t 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;
- pepper_event_listener_remove(&state->buffer_destroy_listener);
+ pepper_event_listener_remove(state->buffer_destroy_listener);
}
}
-static pepper_bool_t
+static void
surface_state_handle_surface_destroy(pepper_event_listener_t *listener,
pepper_object_t *object,
uint32_t id,
- void *info)
+ void *info,
+ void *data)
{
- gl_surface_state_t *state = listener->data;
+ gl_surface_state_t *state = data;
surface_state_release_buffer(state);
- pepper_event_listener_remove(&state->surface_destroy_listener);
+ 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 pepper_bool_t
+static void
surface_state_handle_buffer_destroy(pepper_event_listener_t *listener,
pepper_object_t *object,
uint32_t id,
- void *info)
+ void *info,
+ void *data)
{
- gl_surface_state_t *state = listener->data;
+ gl_surface_state_t *state = data;
surface_state_release_buffer(state);
- return PEPPER_TRUE;
}
static gl_surface_state_t *
return NULL;
state->surface = surface;
-
- pepper_event_listener_init(&state->buffer_destroy_listener);
- state->buffer_destroy_listener.callback = surface_state_handle_buffer_destroy;
- state->buffer_destroy_listener.data = state;
-
- pepper_event_listener_init(&state->surface_destroy_listener);
- 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);
+ state->surface_destroy_listener =
+ pepper_object_add_event_listener((pepper_object_t *)surface,
+ PEPPER_EVENT_OBJECT_DESTROY, 0,
+ surface_state_handle_surface_destroy, state);
pepper_object_set_user_data((pepper_object_t *)surface, renderer, state, NULL);
}
if (state->buffer)
{
pepper_buffer_unreference(state->buffer);
- pepper_event_listener_remove(&state->buffer_destroy_listener);
+ pepper_event_listener_remove(state->buffer_destroy_listener);
}
/* Set new buffer. */
state->buffer = buffer;
- pepper_object_add_event_listener((pepper_object_t *)buffer, &state->buffer_destroy_listener,
- PEPPER_EVENT_OBJECT_DESTROY, 0);
+ state->buffer_destroy_listener =
+ pepper_object_add_event_listener((pepper_object_t *)buffer, PEPPER_EVENT_OBJECT_DESTROY, 0,
+ surface_state_handle_buffer_destroy, state);
/* Output buffer size info. */
*w = state->buffer_width;
int buffer_width, buffer_height;
pixman_image_t *image;
- pepper_event_listener_t buffer_destroy_listener;
- pepper_event_listener_t 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;
- pepper_event_listener_remove(&state->buffer_destroy_listener);
+ pepper_event_listener_remove(state->buffer_destroy_listener);
}
}
-static pepper_bool_t
+static void
surface_state_handle_surface_destroy(pepper_event_listener_t *listener,
pepper_object_t *object,
uint32_t id,
- void *info)
+ void *info,
+ void *data)
{
- pixman_surface_state_t *state = listener->data;
+ pixman_surface_state_t *state = data;
surface_state_release_buffer(state);
- pepper_event_listener_remove(&state->surface_destroy_listener);
+ 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 pepper_bool_t
+static void
surface_state_handle_buffer_destroy(pepper_event_listener_t *listener,
pepper_object_t *object,
uint32_t id,
- void *info)
+ void *info,
+ void *data)
{
- pixman_surface_state_t *state = listener->data;
+ pixman_surface_state_t *state = data;
surface_state_release_buffer(state);
- return PEPPER_TRUE;
}
static pixman_surface_state_t *
return NULL;
state->surface = surface;
-
- pepper_event_listener_init(&state->buffer_destroy_listener);
- state->buffer_destroy_listener.callback = surface_state_handle_buffer_destroy;
- state->buffer_destroy_listener.data = state;
-
- pepper_event_listener_init(&state->surface_destroy_listener);
- 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);
+ state->surface_destroy_listener =
+ pepper_object_add_event_listener((pepper_object_t *)surface,
+ PEPPER_EVENT_OBJECT_DESTROY, 0,
+ surface_state_handle_surface_destroy, state);
pepper_object_set_user_data((pepper_object_t *)surface, renderer, state, NULL);
}
if (state->buffer)
{
pepper_buffer_unreference(state->buffer);
- pepper_event_listener_remove(&state->buffer_destroy_listener);
+ pepper_event_listener_remove(state->buffer_destroy_listener);
}
/* Set new buffer. */
state->buffer = buffer;
- pepper_object_add_event_listener((pepper_object_t *)buffer, &state->buffer_destroy_listener,
- PEPPER_EVENT_OBJECT_DESTROY, 0);
+ state->buffer_destroy_listener =
+ pepper_object_add_event_listener((pepper_object_t *)buffer, PEPPER_EVENT_OBJECT_DESTROY, 0,
+ surface_state_handle_buffer_destroy, state);
/* Output buffer size info. */
*w = state->buffer_width;