wl_list_init(&compositor->seat_list);
wl_list_init(&compositor->output_list);
+ wl_list_init(&compositor->event_hook_chain);
+
+ /* Install default input event handler */
+ if( NULL == pepper_compositor_add_event_hook(compositor,
+ pepper_compositor_event_handler,
+ compositor))
+ {
+ PEPPER_ERROR("Failed to install event handler\n");
+ goto error;
+ }
+
if (wl_display_init_shm(compositor->display) != 0)
{
PEPPER_ERROR("Failed to initialze shm.\n");
#include "pepper-internal.h"
+#undef PEPPER_TRACE
+#define PEPPER_TRACE(...)
+
static void
unbind_resource(struct wl_resource *resource)
{
seat->global = wl_global_create(compositor->display, &wl_seat_interface, 4, seat,
bind_seat);
-
return seat;
}
-PEPPER_API pepper_bool_t
-pepper_seat_handle_event(pepper_seat_t *seat, pepper_input_event_t *event)
+void
+pepper_seat_update_modifier(pepper_seat_t *seat, pepper_input_event_t *event)
{
/* TODO */
+ seat->modifier = event->value;
+}
+
+pepper_bool_t
+pepper_compositor_event_handler(pepper_seat_t *seat,
+ pepper_input_event_t *event,
+ void *data)
+{
+ /* TODO: */
+ /* pepper_compositor_t *compositor = data; */
+
+ switch(event->type)
+ {
+ case PEPPER_INPUT_EVENT_KEYBOARD_KEY:
+ pepper_seat_update_modifier(seat, event);
+ break;
+ default:
+ PEPPER_TRACE("Unknown pepper input event type [%x]\n", event->type);
+ break;
+ }
+
return PEPPER_TRUE;
}
+
+PEPPER_API pepper_event_hook_t *
+pepper_compositor_add_event_hook(pepper_compositor_t *compositor,
+ pepper_event_handler_t handler,
+ void *data)
+{
+ pepper_event_hook_t *hook;
+
+ if( !handler )
+ return NULL;
+
+ hook = pepper_calloc(1, sizeof(pepper_event_hook_t));
+ if (!hook)
+ {
+ PEPPER_ERROR("Failed to allocation\n");
+ return NULL;
+ }
+
+ hook->handler = handler;
+ hook->data = data;
+
+ wl_list_insert(&compositor->event_hook_chain, &hook->link);
+
+ return hook;
+}
+
+PEPPER_API void
+pepper_compositor_remove_event_hook(pepper_compositor_t *compositor,
+ pepper_event_hook_t *hook)
+{
+ wl_list_remove(&hook->link);
+ pepper_free(hook);
+}
+
+PEPPER_API pepper_bool_t
+pepper_seat_handle_event(pepper_seat_t *seat, pepper_input_event_t *event)
+{
+ pepper_compositor_t *compositor = seat->compositor;
+ pepper_event_hook_t *hook, *tmp;
+ pepper_bool_t ret = PEPPER_FALSE;
+
+ /* Iterate installed hook chain. */
+ /* XXX: this code is not thread-safe */
+ wl_list_for_each_safe(hook, tmp, &compositor->event_hook_chain, link)
+ {
+ ret = hook->handler(seat, event, hook->data);
+
+ /* Event consumed, do not delegate to next element */
+ if( PEPPER_TRUE == ret)
+ break;
+ }
+
+ return ret;
+}
typedef struct pepper_region pepper_region_t;
typedef struct pepper_surface_state pepper_surface_state_t;
+
typedef struct pepper_data_source pepper_data_source_t;
typedef struct pepper_data_device pepper_data_device_t;
typedef struct pepper_data_offer pepper_data_offer_t;
struct wl_list seat_list;
struct wl_list layers;
struct wl_list output_list;
+
+ struct wl_list event_hook_chain;
};
struct pepper_output
enum wl_seat_capability caps;
const char *name;
+ uint32_t modifier;
+
/* Backend-specific variables. */
pepper_seat_interface_t *interface;
void *data;
struct wl_list resources;
};
+void
+pepper_seat_update_modifier(pepper_seat_t *seat, pepper_input_event_t *event);
+
/* Data device */
struct pepper_data_source
{
struct wl_list views;
};
+
+/* Event hook */
+struct pepper_event_hook
+{
+ pepper_event_handler_t handler;
+ void *data;
+ struct wl_list link;
+
+ /* TODO:
+ * void *owner, *priority;
+ * or something elses
+ */
+};
+
+pepper_bool_t
+pepper_compositor_event_handler(pepper_seat_t *seat,
+ pepper_input_event_t *event,
+ void *data);
+
#endif /* PEPPER_INTERNAL_H */
typedef struct pepper_touch pepper_touch_t;
typedef struct pepper_input_event pepper_input_event_t;
+typedef struct pepper_event_hook pepper_event_hook_t;
typedef struct pepper_renderer pepper_renderer_t;
typedef struct pepper_surface pepper_surface_t;
PEPPER_API pepper_bool_t
pepper_seat_handle_event(pepper_seat_t *seat, pepper_input_event_t *event);
+/* Event hook */
+typedef pepper_bool_t (*pepper_event_handler_t)(pepper_seat_t *, pepper_input_event_t *, void *);
+
+PEPPER_API pepper_event_hook_t *
+pepper_compositor_add_event_hook(pepper_compositor_t *compositor,
+ pepper_event_handler_t handler,
+ void *data);
+
+PEPPER_API void
+pepper_compositor_remove_event_hook(pepper_compositor_t *compositor,
+ pepper_event_hook_t *hook);
+
/* Renderer. */
struct pepper_renderer
{