pepper: Add output name property
authorTaekyun Kim <tkq.kim@samsung.com>
Mon, 10 Aug 2015 07:25:11 +0000 (16:25 +0900)
committerTaekyun Kim <tkq.kim@samsung.com>
Mon, 10 Aug 2015 07:32:42 +0000 (16:32 +0900)
Change-Id: Idec732b0ee1e62b53e11f0d687475b65c09b071f

13 files changed:
src/lib/drm/drm-internal.h
src/lib/drm/drm-output.c
src/lib/fbdev/fbdev-output.c
src/lib/pepper/compositor.c
src/lib/pepper/output.c
src/lib/pepper/pepper-internal.h
src/lib/pepper/pepper-output-backend.h
src/lib/pepper/pepper-utils.h
src/lib/pepper/pepper.h
src/lib/wayland/wayland-internal.h
src/lib/wayland/wayland-output.c
src/lib/x11/x11-internal.h
src/lib/x11/x11-output.c

index 56f2901..b61fd31 100644 (file)
@@ -50,6 +50,7 @@ struct drm_output
 {
     pepper_drm_t               *drm;
     pepper_output_t            *base;
+    char                        name[32];
 
     struct wl_list              link;
 
index b7fb5dc..9fd5c9a 100644 (file)
@@ -6,6 +6,7 @@
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <unistd.h>
+#include <stdio.h>
 
 #include <gbm.h>
 #include <libudev.h>
@@ -672,12 +673,31 @@ fini_renderer(drm_output_t *output)
         fini_gl_renderer(output);
 }
 
+static const char *connector_type_names[] = {
+    "None",
+    "VGA",
+    "DVI",
+    "DVI",
+    "DVI",
+    "Composite",
+    "TV",
+    "LVDS",
+    "CTV",
+    "DIN",
+    "DP",
+    "HDMI",
+    "HDMI",
+    "TV",
+    "eDP",
+};
+
 static drm_output_t *
 drm_output_create(pepper_drm_t *drm, struct udev_device *device,
                   drmModeRes *res, drmModeConnector *conn)
 {
     int             i;
     drm_output_t   *output;
+    const char     *type_name;
 
     output = (drm_output_t *)calloc(1, sizeof(drm_output_t));
     if (!output)
@@ -733,6 +753,12 @@ drm_output_create(pepper_drm_t *drm, struct udev_device *device,
         goto error;
     }
 
+    if (conn->connector_type < PEPPER_ARRAY_LENGTH(connector_type_names))
+        type_name = connector_type_names[conn->connector_type];
+    else
+        type_name = "UNKNOWN";
+
+    snprintf(&output->name[0], 32, "%s%d", type_name, conn->connector_type_id);
     return output;
 
 error:
@@ -799,7 +825,7 @@ add_outputs(pepper_drm_t *drm, struct udev_device *device)
          *                              const pepper_output_backend_t *backend, void *data)
          */
         output->base = pepper_compositor_add_output(output->drm->compositor,
-                                                    &drm_output_backend, output);
+                                                    &drm_output_backend, output->name, output);
         if (!output->base)
         {
             PEPPER_ERROR("Failed to add output to compositor in %s\n", __FUNCTION__);
@@ -914,7 +940,7 @@ update_outputs(pepper_drm_t *drm, struct udev_device *device)
             }
 
             output->base = pepper_compositor_add_output(output->drm->compositor,
-                                                        &drm_output_backend, output);
+                                                        &drm_output_backend, output->name, output);
             if (!output->base)
             {
                 PEPPER_ERROR("Failed to add output to compositor in %s\n", __FUNCTION__);
index 389d651..16f6b4f 100644 (file)
@@ -384,7 +384,7 @@ pepper_fbdev_output_create(pepper_fbdev_t *fbdev, const char *renderer)
     }
 
     output->base = pepper_compositor_add_output(output->fbdev->compositor,
-                                                &fbdev_output_backend, output);
+                                                &fbdev_output_backend, "fbcev", output);
     if (!output->base)
     {
         PEPPER_ERROR("Failed to add output to compositor in %s\n", __FUNCTION__);
index 662dbea..6e0f204 100644 (file)
@@ -123,3 +123,9 @@ pepper_compositor_get_display(pepper_compositor_t *compositor)
 {
     return compositor->display;
 }
+
+PEPPER_API const pepper_list_t *
+pepper_compositor_get_output_list(pepper_compositor_t *compositor)
+{
+    return &compositor->output_list;
+}
index 0039d69..cd066ce 100644 (file)
@@ -239,10 +239,28 @@ pepper_output_add_damage_region(pepper_output_t *output, pixman_region32_t *regi
 
 PEPPER_API pepper_output_t *
 pepper_compositor_add_output(pepper_compositor_t *compositor,
-                             const pepper_output_backend_t *backend, void *data)
+                             const pepper_output_backend_t *backend, const char *name, void *data)
 {
-    pepper_output_t        *output;
-    uint32_t                id;
+    pepper_output_t    *output;
+    uint32_t            id;
+    pepper_list_t      *l;
+
+    if (!name)
+    {
+        PEPPER_ERROR("Output name must be given.\n");
+        return NULL;
+    }
+
+    PEPPER_LIST_FOR_EACH(&compositor->output_list, l)
+    {
+        output = l->item;
+
+        if (strcmp(output->name, name) == 0)
+        {
+            PEPPER_ERROR("Output with name = %s already exist.\n", name);
+            return NULL;
+        }
+    }
 
     id = ffs(~compositor->output_id_allocator);
 
@@ -273,6 +291,7 @@ pepper_compositor_add_output(pepper_compositor_t *compositor,
 
     output->id = id;
     compositor->output_id_allocator |= (1 << output->id);
+    output->name = strdup(name);
 
     /* Create backend-side object. */
     output->backend = (pepper_output_backend_t *)backend;
@@ -337,6 +356,7 @@ pepper_output_destroy(pepper_output_t *output)
     pepper_object_emit_event(&output->compositor->base,
                              PEPPER_EVENT_COMPOSITOR_OUTPUT_REMOVE, output);
 
+    free(output->name);
     pepper_free(output);
 }
 
@@ -396,3 +416,26 @@ pepper_output_set_mode(pepper_output_t *output, const pepper_output_mode_t *mode
 
     return PEPPER_FALSE;
 }
+
+PEPPER_API const char *
+pepper_output_get_name(pepper_output_t *output)
+{
+    return output->name;
+}
+
+PEPPER_API pepper_output_t *
+pepper_compositor_find_output(pepper_compositor_t *compositor, const char *name)
+{
+    pepper_output_t *output;
+    pepper_list_t   *l;
+
+    PEPPER_LIST_FOR_EACH(&compositor->output_list, l)
+    {
+        output = l->item;
+
+        if (strcmp(output->name, name) == 0)
+            return output;
+    }
+
+    return NULL;
+}
index 33cf20f..57ab5ab 100644 (file)
@@ -55,6 +55,7 @@ struct pepper_output
     pepper_object_t             base;
     pepper_compositor_t        *compositor;
     uint32_t                    id;
+    char                       *name;
 
     struct wl_global           *global;
     struct wl_list              resources;
index 082e455..e8e41a6 100644 (file)
@@ -35,7 +35,7 @@ struct pepper_output_backend
 
 PEPPER_API pepper_output_t *
 pepper_compositor_add_output(pepper_compositor_t *compositor,
-                             const pepper_output_backend_t *backend, void *data);
+                             const pepper_output_backend_t *backend, const char *name, void *data);
 
 struct pepper_render_item
 {
index 5adfdde..75bfa07 100644 (file)
@@ -25,6 +25,8 @@ extern "C" {
     const __typeof__( ((type *)0)->member ) *__mptr = (ptr);    \
     (type *)( (char *)__mptr - offsetof(type,member) );})
 
+#define PEPPER_ARRAY_LENGTH(arr)    (sizeof(arr) / sizeof(arr)[0])
+
 typedef void (*pepper_free_func_t)(void *);
 
 typedef unsigned int    pepper_bool_t;
index b30d27d..fe353af 100644 (file)
@@ -241,6 +241,9 @@ pepper_compositor_destroy(pepper_compositor_t *compositor);
 PEPPER_API struct wl_display *
 pepper_compositor_get_display(pepper_compositor_t *compositor);
 
+PEPPER_API const pepper_list_t *
+pepper_compositor_get_output_list(pepper_compositor_t *compositor);
+
 PEPPER_API pepper_compositor_t *
 pepper_output_get_compositor(pepper_output_t *output);
 
@@ -265,6 +268,12 @@ pepper_output_get_mode(pepper_output_t *output, int index);
 PEPPER_API pepper_bool_t
 pepper_output_set_mode(pepper_output_t *output, const pepper_output_mode_t *mode);
 
+PEPPER_API const char *
+pepper_output_get_name(pepper_output_t *output);
+
+PEPPER_API pepper_output_t *
+pepper_compositor_find_output(pepper_compositor_t *compositor, const char *name);
+
 /* Input. */
 PEPPER_API pepper_seat_t *
 pepper_compositor_add_seat(pepper_compositor_t *compositor,
index 93c2c64..072d8d5 100644 (file)
@@ -67,6 +67,7 @@ struct wayland_output
 {
     pepper_wayland_t           *conn;
     pepper_output_t            *base;
+    char                        name[32];
 
     struct wl_signal            destroy_signal;
     struct wl_signal            mode_change_signal;
index 1105463..3b2b6c8 100644 (file)
@@ -1,4 +1,5 @@
 #include "wayland-internal.h"
+#include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
 #include <pepper-pixman-renderer.h>
@@ -368,9 +369,11 @@ pepper_wayland_output_create(pepper_wayland_t *conn, int32_t w, int32_t h, const
     output->shell_surface = wl_shell_get_shell_surface(conn->shell, output->surface);
     wl_shell_surface_add_listener(output->shell_surface, &shell_surface_listener, output);
     wl_shell_surface_set_toplevel(output->shell_surface);
+    snprintf(&output->name[0], 32, "wayland-%p", output);
 
     /* Add compositor base class output object for this output. */
-    output->base = pepper_compositor_add_output(conn->pepper, &wayland_output_backend, output);
+    output->base = pepper_compositor_add_output(conn->pepper, &wayland_output_backend,
+                                                output->name, output);
     if (!output->base)
     {
         wayland_output_destroy(output);
index edeae89..22d8fbe 100644 (file)
@@ -46,6 +46,7 @@ struct x11_output
 {
     pepper_output_t            *base;
     pepper_x11_connection_t    *connection;
+    char                        name[32];
 
     int32_t                  x, y;
     uint32_t                 w, h;
index 439de94..534db72 100644 (file)
@@ -675,8 +675,9 @@ pepper_x11_output_create(pepper_x11_connection_t *connection,
     renderer_init(output, renderer);
 
     /* Register output object */
+    snprintf(&output->name[0], 32, "x11-%p", output);
     base = pepper_compositor_add_output(connection->compositor,
-                                        &x11_output_backend, output);
+                                        &x11_output_backend, output->name, output);
     if (!base)
     {
         PEPPER_ERROR("pepper_compositor_add_output failed\n");