--- /dev/null
+#include "e_tizen_surface_shm_intern.h"
+
+#include <tizen-surface-server-protocol.h>
+
+struct _E_Tizen_Surface_Shm {
+ struct wl_global *global;
+
+ struct
+ {
+ struct wl_signal new_flusher;
+ } events;
+
+ Eina_List *surface_shm_flushers;
+};
+
+struct _E_Tizen_Surface_Shm_Flusher {
+ E_Tizen_Surface_Shm *surface_shm;
+ E_Client *ec;
+ struct wl_resource *resource;
+};
+
+static void
+_e_tizen_surface_shm_flusher_cb_destroy(struct wl_client *client EINA_UNUSED, struct wl_resource *resource)
+{
+ wl_resource_destroy(resource);
+}
+
+static const struct tizen_surface_shm_flusher_interface _tzsurf_shm_flusher_iface =
+{
+ _e_tizen_surface_shm_flusher_cb_destroy,
+};
+
+static void
+_e_tizen_surface_shm_flusher_cb_res_destroy(struct wl_resource *resource)
+{
+ E_Tizen_Surface_Shm_Flusher *surface_shm_flusher;
+ E_Tizen_Surface_Shm *surface_shm;
+
+ surface_shm_flusher = wl_resource_get_user_data(resource);
+
+ surface_shm = surface_shm_flusher->surface_shm;
+
+ surface_shm->surface_shm_flushers = eina_list_remove(surface_shm->surface_shm_flushers, surface_shm_flusher);
+
+ E_FREE(surface_shm_flusher);
+}
+
+static void
+_e_tizen_surface_shm_cb_flusher_get(struct wl_client *client, struct wl_resource *resource, uint32_t id, struct wl_resource *surface)
+{
+ E_Tizen_Surface_Shm_Flusher *surface_shm_flusher;
+ E_Tizen_Surface_Shm *surface_shm;
+ E_Client *ec;
+ struct wl_resource *res;
+
+ surface_shm_flusher = E_NEW(E_Tizen_Surface_Shm_Flusher,1);
+ EINA_SAFETY_ON_NULL_RETURN(surface_shm_flusher);
+
+ surface_shm = wl_resource_get_user_data(resource);
+
+ surface_shm_flusher->surface_shm = surface_shm;
+
+ ec = e_client_from_surface_resource(surface);
+ surface_shm_flusher->ec = ec;
+
+ res = wl_resource_create(client, &tizen_surface_shm_flusher_interface,
+ wl_resource_get_version(resource), id);
+ if (!res)
+ {
+ wl_resource_post_no_memory(resource);
+ return;
+ }
+
+ surface_shm_flusher->resource = res;
+
+ wl_resource_set_implementation(res, &_tzsurf_shm_flusher_iface, surface_shm_flusher,
+ _e_tizen_surface_shm_flusher_cb_res_destroy);
+
+
+ surface_shm->surface_shm_flushers = eina_list_append(surface_shm->surface_shm_flushers, surface_shm_flusher);
+
+ //emit the new_flusher signal of surface_shm
+ wl_signal_emit(&surface_shm->events.new_flusher, surface_shm_flusher);
+}
+
+static void
+_e_tizen_surface_shm_cb_destroy(struct wl_client *client, struct wl_resource *resource)
+{
+ wl_resource_destroy(resource);
+}
+
+static const struct tizen_surface_shm_interface _tzsurf_shm_iface =
+{
+ _e_tizen_surface_shm_cb_flusher_get,
+ _e_tizen_surface_shm_cb_destroy,
+};
+
+static void
+_e_tizen_surface_shm_cb_resource_destroy(struct wl_resource *surface_shm_resource)
+{
+}
+
+static void
+_e_tizen_surface_shm_cb_bind(struct wl_client *client, void *data, uint32_t ver, uint32_t id)
+{
+ E_Tizen_Surface_Shm *surface_shm;
+ struct wl_resource *res;
+
+ surface_shm = (E_Tizen_Surface_Shm *)data;
+
+ res = wl_resource_create(client, &tizen_surface_shm_interface, ver, id);
+ if (!res)
+ {
+ wl_client_post_no_memory(client);
+ return;
+ }
+
+ wl_resource_set_implementation(res, &_tzsurf_shm_iface, surface_shm,
+ _e_tizen_surface_shm_cb_resource_destroy);
+}
+
+EINTERN E_Tizen_Surface_Shm *
+e_tizen_surface_shm_init(void)
+{
+ E_Tizen_Surface_Shm *surface_shm;
+
+ surface_shm = E_NEW(E_Tizen_Surface_Shm, 1);
+ EINA_SAFETY_ON_NULL_RETURN_VAL(surface_shm, NULL);
+
+ surface_shm->global = wl_global_create(e_comp_wl->wl.disp, &tizen_surface_shm_interface,
+ 2, surface_shm, _e_tizen_surface_shm_cb_bind);
+ if (!surface_shm->global)
+ {
+ E_FREE(surface_shm);
+ return NULL;
+ }
+
+ wl_signal_init(&surface_shm->events.new_flusher);
+
+ return surface_shm;
+}
+
+EINTERN void
+e_tizen_surface_shm_shutdown(E_Tizen_Surface_Shm *surface_shm)
+{
+ EINA_SAFETY_ON_NULL_RETURN(surface_shm);
+
+ wl_global_destroy(surface_shm->global);
+
+ E_FREE(surface_shm);
+}
+
+EINTERN E_Tizen_Surface_Shm_Flusher *
+e_tizen_surface_shm_flusher_get(E_Tizen_Surface_Shm *surface_shm, E_Client *ec)
+{
+ EINA_SAFETY_ON_NULL_RETURN_VAL(surface_shm, NULL);
+ EINA_SAFETY_ON_NULL_RETURN_VAL(ec, NULL);
+
+ E_Tizen_Surface_Shm_Flusher *surface_shm_flusher;
+ Eina_List *l;
+
+ EINA_LIST_FOREACH(surface_shm->surface_shm_flushers, l, surface_shm_flusher)
+ {
+ if (surface_shm_flusher->ec == ec)
+ return surface_shm_flusher;
+ }
+
+ return NULL;
+}
+
+EINTERN Eina_Bool
+e_tizen_surface_shm_flusher_free_flush_supported(E_Tizen_Surface_Shm_Flusher *surface_shm_flusher)
+{
+ EINA_SAFETY_ON_NULL_RETURN_VAL(surface_shm_flusher, EINA_FALSE);
+
+ if (wl_resource_get_version(surface_shm_flusher->resource) < TIZEN_SURFACE_SHM_FLUSHER_FREE_FLUSH_SINCE_VERSION)
+ return EINA_FALSE;
+
+ return EINA_TRUE;
+}
+
+EINTERN void
+e_tizen_surface_shm_flusher_free_flush_send(E_Tizen_Surface_Shm_Flusher *surface_shm_flusher)
+{
+ EINA_SAFETY_ON_NULL_RETURN(surface_shm_flusher);
+
+ if (wl_resource_get_version(surface_shm_flusher->resource) < TIZEN_SURFACE_SHM_FLUSHER_FREE_FLUSH_SINCE_VERSION)
+ return;
+
+ tizen_surface_shm_flusher_send_free_flush(surface_shm_flusher->resource);
+}
+
+EINTERN void
+e_tizen_surface_shm_flusher_flush_send(E_Tizen_Surface_Shm_Flusher *surface_shm_flusher)
+{
+ EINA_SAFETY_ON_NULL_RETURN(surface_shm_flusher);
+
+ tizen_surface_shm_flusher_send_flush(surface_shm_flusher->resource);
+}
+