--- /dev/null
+#include "e.h"
+#include <tizen-extension-server-protocol.h>
+
+typedef struct _E_Comp_Wl_Renderer_Manager E_Comp_Wl_Renderer_Manager;
+typedef struct _E_Comp_Wl_Renderer E_Comp_Wl_Renderer;
+typedef struct _E_Comp_Wl_Renderer_Surface E_Comp_Wl_Renderer_Surface;
+
+struct _E_Comp_Wl_Renderer_Manager
+{
+ struct wl_global *global;
+ Eina_List *renderers;
+};
+
+struct _E_Comp_Wl_Renderer
+{
+ struct wl_resource *resource;
+ Eina_List *renderer_surfaces;
+};
+
+struct _E_Comp_Wl_Renderer_Surface
+{
+ struct wl_resource *resource;
+ E_Client *ec;
+};
+
+static E_Comp_Wl_Renderer_Manager *_renderer_mgr;
+
+static E_Comp_Wl_Renderer_Surface *
+_renderer_surface_find(E_Client *ec)
+{
+ E_Comp_Wl_Renderer_Manager *renderer_mgr;
+ E_Comp_Wl_Renderer *renderer;
+ E_Comp_Wl_Renderer_Surface *renderer_surface;
+ Eina_List *l, *l2;
+
+ renderer_mgr = _renderer_mgr;
+ if (!renderer_mgr) return NULL;
+
+ EINA_LIST_FOREACH(renderer_mgr->renderers, l, renderer)
+ {
+ EINA_LIST_FOREACH(renderer->renderer_surfaces, l2, renderer_surface)
+ {
+ if (renderer_surface->ec == ec)
+ return renderer_surface;
+ }
+ }
+
+ return NULL;
+}
+
+static void
+_renderer_cb_get_renderer_surface(struct wl_client *client, struct wl_resource *resource,
+ uint32_t id, struct wl_resource *surface_resource)
+{
+ E_Comp_Wl_Renderer *renderer;
+ E_Comp_Wl_Renderer_Surface *renderer_surface;
+ E_Client *ec;
+
+ ec = wl_resource_get_user_data(surface_resource);
+ if (!ec) return;
+ if (e_object_is_del(E_OBJECT(ec))) return;
+
+ renderer = wl_resource_get_user_data(resource);
+ if (!renderer) return;
+
+ renderer_surface = E_NEW(E_Comp_Wl_Renderer_Surface, 1);
+ if (!renderer_surface)
+ {
+ wl_client_post_no_memory(client);
+ return;
+ }
+
+ renderer_surface->resource = wl_resource_create(client, &tizen_renderer_surface_interface, 1, id);
+ if (!renderer_surface->resource)
+ {
+ wl_client_post_no_memory(client);
+ E_FREE(renderer_surface);
+ return;
+ }
+
+ renderer_surface->ec = ec;
+ renderer->renderer_surfaces = eina_list_append(renderer->renderer_surfaces, renderer_surface);
+}
+
+static void
+_renderer_cb_destroy(struct wl_client *client, struct wl_resource *resource)
+{
+ wl_resource_destroy(resource);
+}
+
+
+static const struct tizen_renderer_interface renderer_implementation = {
+ _renderer_cb_get_renderer_surface,
+ _renderer_cb_destroy,
+};
+
+static void
+_renderer_cb_resource_destroy(struct wl_resource *renderer_resource)
+{
+ E_Comp_Wl_Renderer_Manager *renderer_mgr;
+ E_Comp_Wl_Renderer *renderer;
+
+ renderer = wl_resource_get_user_data(renderer_resource);
+ if (!renderer) return;
+
+ renderer_mgr = _renderer_mgr;
+ if (renderer_mgr)
+ renderer_mgr->renderers = eina_list_remove(renderer_mgr->renderers, renderer);
+
+ E_FREE(renderer);
+}
+
+static void
+_renderer_cb_bind(struct wl_client *client, void *data, uint32_t version, uint32_t id)
+{
+ struct wl_resource *resource;
+ E_Comp_Wl_Renderer_Manager *renderer_mgr;
+ E_Comp_Wl_Renderer *renderer;
+
+ renderer_mgr = _renderer_mgr;
+
+ renderer = E_NEW(E_Comp_Wl_Renderer, 1);
+ if (!renderer)
+ {
+ wl_client_post_no_memory(client);
+ return;
+ }
+
+ resource = wl_resource_create(client, &tizen_renderer_interface, version, id);
+ if (!resource)
+ {
+ wl_client_post_no_memory(client);
+ E_FREE(renderer);
+ return;
+ }
+
+ wl_resource_set_implementation(resource, &renderer_implementation,
+ renderer, _renderer_cb_resource_destroy);
+
+ renderer->resource = resource;
+ renderer_mgr->renderers = eina_list_append(renderer_mgr->renderers, renderer);
+}
+
+EINTERN Eina_Bool
+e_comp_wl_renderer_init(void)
+{
+ E_Comp_Wl_Renderer_Manager *renderer_mgr;
+
+ EINA_SAFETY_ON_NULL_RETURN_VAL(e_comp_wl, EINA_FALSE);
+ EINA_SAFETY_ON_NULL_RETURN_VAL(e_comp_wl->wl.disp, EINA_FALSE);
+
+ if (_renderer_mgr) return EINA_TRUE;
+
+ renderer_mgr = E_NEW(E_Comp_Wl_Renderer_Manager, 1);
+ EINA_SAFETY_ON_NULL_GOTO(renderer_mgr, fail);
+
+ renderer_mgr->global = wl_global_create(e_comp_wl->wl.disp,
+ &tizen_renderer_interface,
+ 1,
+ NULL,
+ _renderer_cb_bind);
+ EINA_SAFETY_ON_NULL_GOTO(renderer_mgr->global, fail);
+
+ _renderer_mgr = renderer_mgr;
+
+ return EINA_TRUE;
+
+fail:
+ if (renderer_mgr)
+ {
+ if (renderer_mgr->global)
+ wl_global_destroy(renderer_mgr->global);
+
+ E_FREE(renderer_mgr);
+ }
+
+ return EINA_FALSE;
+}
+
+EINTERN void
+e_comp_wl_renderer_shutdown(void)
+{
+ E_Comp_Wl_Renderer_Manager *renderer_mgr;
+
+ renderer_mgr = _renderer_mgr;
+ if (!renderer_mgr) return;
+
+ wl_global_destroy(renderer_mgr->global);
+ eina_list_free(renderer_mgr->renderers);
+ E_FREE(renderer_mgr);
+
+ _renderer_mgr = NULL;
+}
+
+EINTERN Eina_Bool
+e_comp_wl_renderer_client_redraw_request_send(E_Client *ec)
+{
+ E_Comp_Wl_Renderer_Surface *renderer_surface;
+
+ renderer_surface = _renderer_surface_find(ec);
+ if (!renderer_surface) return EINA_FALSE;
+
+ tizen_renderer_surface_send_redraw_request(renderer_surface->resource);
+
+ return EINA_TRUE;
+}