core: Surface user set/get APIs.
authorTaekyun Kim <tkq.kim@samsung.com>
Tue, 19 May 2015 08:41:25 +0000 (17:41 +0900)
committerTaekyun Kim <tkq.kim@samsung.com>
Fri, 19 Jun 2015 09:06:41 +0000 (18:06 +0900)
Given a pointer key value, one can set a user data for the key. This can be
used for maintaining user-side objects for a pepper_surface_t. For, example,
sub-compositing application can set an evas image object.

Change-Id: I791e891340d69a47b3dc566a5766e0d67760721e

src/pepper-internal.h
src/pepper-util.h
src/pepper.h
src/surface.c

index 2f6a6c3..8504fef 100644 (file)
@@ -5,6 +5,7 @@
 #include "pepper.h"
 #include <wayland-util.h>
 #include <pixman.h>
+#include "pepper-util.h"
 
 typedef struct pepper_region        pepper_region_t;
 typedef struct pepper_surface_state pepper_surface_state_t;
@@ -113,6 +114,9 @@ struct pepper_surface
 
     /* Role. */
     char                   *role;
+
+    /* User data. */
+    pepper_map_t           *user_data_map;
 };
 
 struct pepper_region
index dee3488..3c2eee1 100644 (file)
@@ -6,7 +6,6 @@
 #include <string.h>
 
 typedef struct pepper_list  pepper_list_t;
-typedef void (*pepper_free_func_t)(void *);
 
 #define PEPPER_LIST_FOR_EACH(head, pos)                     \
     for (pos = (head)->next;                                \
index 45b439e..5c0f927 100644 (file)
@@ -17,6 +17,8 @@ extern "C" {
 #define PEPPER_FALSE    0
 #define PEPPER_TRUE     1
 
+typedef void (*pepper_free_func_t)(void *);
+
 typedef unsigned int                    pepper_bool_t;
 
 typedef struct pepper_compositor        pepper_compositor_t;
@@ -292,10 +294,11 @@ PEPPER_API pepper_bool_t
 pepper_surface_set_role(pepper_surface_t *surface, const char *role);
 
 PEPPER_API void
-pepper_surface_set_user_data(pepper_surface_t *surface, uint32_t key, void *data);
+pepper_surface_set_user_data(pepper_surface_t *surface, const void *key, void *data,
+                             pepper_free_func_t free_func);
 
 PEPPER_API void *
-pepper_surface_get_user_data(pepper_surface_t *surface, uint32_t key);
+pepper_surface_get_user_data(pepper_surface_t *surface, const void *key);
 
 PEPPER_API pepper_buffer_t *
 pepper_surface_get_buffer(pepper_surface_t *surface);
index c42f67d..4f129d8 100644 (file)
@@ -215,6 +215,30 @@ static const struct wl_surface_interface surface_implementation =
     surface_set_buffer_scale
 };
 
+static int
+user_data_hash(const void *key, int key_length)
+{
+#if INTPTR_MAX == INT32_MAX
+    return ((uint32_t)key) >> 2;
+#elif INTPTR_MAX == INT64_MAX
+    return ((uint64_t)key) >> 3;
+#else
+    #error "Not 32 or 64bit system"
+#endif
+}
+
+static int
+user_data_key_length(const void *key)
+{
+    return sizeof(key);
+}
+
+static int
+user_data_key_compare(const void *key0, int key0_length, const void *key1, int key1_length)
+{
+    return (int)(key0 - key1);
+}
+
 pepper_surface_t *
 pepper_surface_create(pepper_compositor_t *compositor,
                       struct wl_client *client,
@@ -232,6 +256,15 @@ pepper_surface_create(pepper_compositor_t *compositor,
         return NULL;
     }
 
+    surface->user_data_map = pepper_map_create(5, user_data_hash, user_data_key_length,
+                                               user_data_key_compare);
+    if (!surface->user_data_map)
+    {
+        PEPPER_ERROR("User data map creation failed. Maybe OOM??\n");
+        pepper_free(surface);
+        return NULL;
+    }
+
     surface->compositor = compositor;
     surface->resource = wl_resource_create(client, &wl_surface_interface,
                                            wl_resource_get_version(resource), id);
@@ -239,8 +272,8 @@ pepper_surface_create(pepper_compositor_t *compositor,
     if (!surface->resource)
     {
         PEPPER_ERROR("wl_resource_create failed\n");
-        pepper_free(surface);
         wl_resource_post_no_memory(resource);
+        pepper_free(surface->user_data_map);
         pepper_free(surface);
         return NULL;
     }
@@ -285,6 +318,11 @@ pepper_surface_destroy(pepper_surface_t *surface)
 
     if (surface->role)
         pepper_string_free(surface->role);
+
+    if (surface->user_data_map)
+        pepper_map_destroy(surface->user_data_map);
+
+    pepper_free(surface);
 }
 
 void
@@ -375,16 +413,16 @@ pepper_surface_set_role(pepper_surface_t *surface, const char *role)
 }
 
 PEPPER_API void
-pepper_surface_set_user_data(pepper_surface_t *surface, uint32_t key, void *data)
+pepper_surface_set_user_data(pepper_surface_t *surface, const void *key, void *data,
+                             pepper_free_func_t free_func)
 {
-    /* TODO: */
+    pepper_map_set(surface->user_data_map, key, data, free_func);
 }
 
 PEPPER_API void *
-pepper_surface_get_user_data(pepper_surface_t *surface, uint32_t key)
+pepper_surface_get_user_data(pepper_surface_t *surface, const void *key)
 {
-    /* TODO: */
-    return NULL;
+    return pepper_map_get(surface->user_data_map, key);
 }
 
 PEPPER_API pepper_buffer_t *