{
pepper_drm_t *drm;
pepper_output_t *base;
+ char name[32];
struct wl_list link;
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
+#include <stdio.h>
#include <gbm.h>
#include <libudev.h>
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)
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:
* 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__);
}
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__);
}
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__);
{
return compositor->display;
}
+
+PEPPER_API const pepper_list_t *
+pepper_compositor_get_output_list(pepper_compositor_t *compositor)
+{
+ return &compositor->output_list;
+}
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);
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;
pepper_object_emit_event(&output->compositor->base,
PEPPER_EVENT_COMPOSITOR_OUTPUT_REMOVE, output);
+ free(output->name);
pepper_free(output);
}
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;
+}
pepper_object_t base;
pepper_compositor_t *compositor;
uint32_t id;
+ char *name;
struct wl_global *global;
struct wl_list resources;
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
{
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;
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);
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,
{
pepper_wayland_t *conn;
pepper_output_t *base;
+ char name[32];
struct wl_signal destroy_signal;
struct wl_signal mode_change_signal;
#include "wayland-internal.h"
+#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <pepper-pixman-renderer.h>
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);
{
pepper_output_t *base;
pepper_x11_connection_t *connection;
+ char name[32];
int32_t x, y;
uint32_t w, h;
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");