event: add event hook
authorjaehoon01.jeong <jaehoon01.jeong@samsung.com>
Fri, 29 May 2015 05:45:33 +0000 (14:45 +0900)
committerTaekyun Kim <tkq.kim@samsung.com>
Fri, 19 Jun 2015 09:06:41 +0000 (18:06 +0900)
    1. Every modules, to want to handle input events, are use
       pepper_compositor_add_event_hook() to placing event handler, even
       compositor itself
    2. pepper_compositor_add_hook() insert a new hook at the head of hook_list
    3. pepper_seat_handle_event() traversing hook_list from head to tail, and
       call hook_handlers
    4. last installed hook called first.

Change-Id: I6b26754dee0c6129afd67010175df395df67fdd4

src/compositor.c
src/input.c
src/pepper-internal.h
src/pepper.h

index 74ae8ef..275a11c 100644 (file)
@@ -77,6 +77,17 @@ pepper_compositor_create(const char *socket_name)
     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");
index c1a66da..fc99ef0 100644 (file)
@@ -1,5 +1,8 @@
 #include "pepper-internal.h"
 
+#undef PEPPER_TRACE
+#define PEPPER_TRACE(...)
+
 static void
 unbind_resource(struct wl_resource *resource)
 {
@@ -352,13 +355,87 @@ pepper_compositor_add_seat(pepper_compositor_t *compositor,
 
     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;
+}
index e88cbd6..8ab8c6d 100644 (file)
@@ -9,6 +9,7 @@
 
 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;
@@ -23,6 +24,8 @@ struct pepper_compositor
     struct wl_list      seat_list;
     struct wl_list      layers;
     struct wl_list      output_list;
+
+    struct wl_list      event_hook_chain;
 };
 
 struct pepper_output
@@ -176,6 +179,8 @@ struct pepper_seat
     enum wl_seat_capability     caps;
     const char                 *name;
 
+    uint32_t                    modifier;
+
     /* Backend-specific variables. */
     pepper_seat_interface_t    *interface;
     void                       *data;
@@ -199,6 +204,9 @@ struct pepper_touch
     struct wl_list              resources;
 };
 
+void
+pepper_seat_update_modifier(pepper_seat_t *seat, pepper_input_event_t *event);
+
 /* Data device */
 struct pepper_data_source
 {
@@ -255,4 +263,23 @@ struct pepper_layer
     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 */
index 7ad3f52..1333068 100644 (file)
@@ -35,6 +35,7 @@ typedef struct pepper_keyboard          pepper_keyboard_t;
 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;
@@ -265,6 +266,18 @@ struct pepper_input_event
 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
 {