pepper: Add initial subcompositor implementation
authorJaehoon Jeong <jh01.j@samsung.com>
Fri, 6 Nov 2015 05:49:13 +0000 (14:49 +0900)
committerJaehoon Jeong <jh01.j@samsung.com>
Fri, 6 Nov 2015 05:52:24 +0000 (14:52 +0900)
Change-Id: I0810e69082dc7fe4d6b425143c43095dd995ba0e

src/lib/pepper/Makefile.am
src/lib/pepper/pepper-internal.h
src/lib/pepper/pepper.h
src/lib/pepper/subcompositor.c [new file with mode: 0644]

index fd27025fdb0a5725194cf9601a12679837f7a2c7..d94cbbc353e3b12fbecdd2064724224c1c646b15 100644 (file)
@@ -26,4 +26,5 @@ libpepper_la_SOURCES = pepper.h                 \
                        utils-file.c             \
                        utils-map.c              \
                        utils-log.c              \
-                       utils-vt.c
+                       utils-vt.c               \
+                       subcompositor.c
index 216e08b106e2794b46af05915eee4b2128a8d992..3abe89037f7df34545f5d39abe3267220c0f700d 100644 (file)
@@ -219,6 +219,21 @@ pepper_region_destroy(pepper_region_t *region);
 void
 pepper_transform_pixman_region(pixman_region32_t *region, const pepper_mat4_t *matrix);
 
+/* Subcompositor */
+struct pepper_subcompositor
+{
+    pepper_object_t          base;
+    pepper_compositor_t     *compositor;
+    struct wl_global        *global;
+    struct wl_list           resource_list;
+};
+
+pepper_subcompositor_t *
+pepper_subcompositor_create(pepper_compositor_t *compositor);
+
+void
+pepper_subcompositor_destroy(pepper_subcompositor_t *subcompositor);
+
 /* Input */
 struct pepper_pointer
 {
index 337dd2f7944b4cc0280859c0ed3ebf659b5a4872..381b4b9a912adb53247fba0439b6cd266747f5b0 100644 (file)
@@ -85,6 +85,13 @@ typedef struct pepper_buffer            pepper_buffer_t;
  */
 typedef struct pepper_view              pepper_view_t;
 
+/**
+ * @typedef pepper_subcompositor
+ *
+ * A #pepper_subcompositor_t represents a wl_subcompositor.
+ */
+typedef struct pepper_subcompositor     pepper_subcompositor_t;
+
 /**
  * @typedef pepper_seat_t
  *
@@ -245,6 +252,7 @@ typedef enum pepper_object_type
     PEPPER_OBJECT_TOUCH,        /**< #pepper_touch_t */
     PEPPER_OBJECT_INPUT_DEVICE, /**< #pepper_input_device_t */
     PEPPER_OBJECT_PLANE,        /**< #pepper_plane_t (internally used) */
+    PEPPER_OBJECT_SUBCOMPOSITOR,/**< #pepper_compositor_t */
 } pepper_object_type_t;
 
 enum pepper_built_in_events
diff --git a/src/lib/pepper/subcompositor.c b/src/lib/pepper/subcompositor.c
new file mode 100644 (file)
index 0000000..6aeef95
--- /dev/null
@@ -0,0 +1,88 @@
+#include "pepper-internal.h"
+
+static void
+subcompositor_destroy(struct wl_client *client, struct wl_resource *resource)
+{
+    wl_resource_destroy(resource);
+}
+
+static void
+subcompositor_get_subsurface(struct wl_client   *client,
+                             struct wl_resource *resource,
+                             uint32_t            id,
+                             struct wl_resource *surface_resource,
+                             struct wl_resource *parent_resource)
+{
+    /* TODO */
+}
+
+static const struct wl_subcompositor_interface subcompositor_interface =
+{
+    subcompositor_destroy,
+    subcompositor_get_subsurface,
+};
+
+static void
+unbind_resource(struct wl_resource *resource)
+{
+    wl_list_remove(wl_resource_get_link(resource));
+}
+
+static void
+subcompositor_bind(struct wl_client *client,
+                   void             *data,
+                   uint32_t          version,
+                   uint32_t          id)
+{
+    pepper_subcompositor_t  *subcompositor = (pepper_subcompositor_t *)data;
+    struct wl_resource      *resource;
+
+    resource = wl_resource_create(client, &wl_subcompositor_interface, version, id);
+
+    if (!resource)
+    {
+        PEPPER_ERROR("wl_resource_create failed\n");
+        wl_client_post_no_memory(client);
+        return;
+    }
+
+    wl_list_insert(&subcompositor->resource_list, wl_resource_get_link(resource));
+    wl_resource_set_implementation(resource, &subcompositor_interface, subcompositor, unbind_resource);
+}
+
+pepper_subcompositor_t *
+pepper_subcompositor_create(pepper_compositor_t *compositor)
+{
+    pepper_subcompositor_t *subcompositor;
+
+    subcompositor = (pepper_subcompositor_t *)pepper_object_alloc(PEPPER_OBJECT_SUBCOMPOSITOR,
+                                                                  sizeof(pepper_subcompositor_t));
+    PEPPER_CHECK(subcompositor, goto error, "pepper_object_alloc() failed.\n");
+
+    subcompositor->compositor = compositor;
+    subcompositor->global = wl_global_create(compositor->display, &wl_subcompositor_interface, 1,
+                                             subcompositor, subcompositor_bind);
+    PEPPER_CHECK(subcompositor->global, goto error, "wl_global_create() failed.\n");
+
+    wl_list_init(&subcompositor->resource_list);
+
+    return subcompositor;
+
+error:
+    if (subcompositor)
+        pepper_subcompositor_destroy(subcompositor);
+
+    return NULL;
+}
+
+void
+pepper_subcompositor_destroy(pepper_subcompositor_t *subcompositor)
+{
+    if (subcompositor->global)
+        wl_global_destroy(subcompositor->global);
+
+    /* TODO */
+
+    pepper_object_fini(&subcompositor->base);
+    free(subcompositor);
+}