pepper_buffer_unreference(po->buffer);
po->buffer = NULL;
- pepper_event_listener_remove(po->buffer_destroy_listener);
+ PE_FREE_FUNC(po->buffer_destroy_listener, pepper_event_listener_remove);
}
}
evas_object_del(po->clip);
evas_object_del(po->img);
- if (po->es)
- po->es->obj = NULL;
-
free(po);
}
DBG("[OBJECT] Buffer destroy: obj %p", po->smart_obj);
- _pepper_efl_object_del(po);
+ if (po->shm_buffer)
+ {
+ evas_object_image_data_set(po->img, NULL);
+ po->shm_buffer = NULL;
+ }
+ else
+ {
+ evas_object_image_native_surface_set(po->img, NULL);
+ }
+
+ po->buffer = NULL;
}
static void
{
pepper_efl_object_t *po = data;
- po->es = NULL;
+ if (po->shm_buffer)
+ {
+ evas_object_image_data_set(po->img, NULL);
+ po->shm_buffer = NULL;
+ }
+ else
+ {
+ evas_object_image_native_surface_set(po->img, NULL);
+ }
+
+ if (po->buffer)
+ {
+ pepper_buffer_unreference(po->buffer);
+ PE_FREE_FUNC(po->buffer_destroy_listener, pepper_event_listener_remove);
+ po->buffer = NULL;
+ }
+
po->surface = NULL;
PE_FREE_FUNC(po->surface_destroy_listener, pepper_event_listener_remove);
+
+ evas_object_smart_callback_call(po->parent, PEPPER_EFL_OBJ_DEL, (void *)po->smart_obj);
}
static void
}
Evas_Object *
-pepper_efl_object_add(pepper_efl_surface_t *es, Evas_Object *parent, pepper_surface_t *surface)
+pepper_efl_object_get(pepper_efl_output_t *output, pepper_surface_t *surface)
{
Evas *evas;
Evas_Object *o;
pepper_efl_object_t *po;
- _pepper_efl_smart_init();
-
- evas = evas_object_evas_get(parent);
- o = evas_object_smart_add(evas, _pepper_efl_smart);
-
- po = evas_object_smart_data_get(o);
+ po = pepper_object_get_user_data((pepper_object_t *)surface, output);
if (!po)
- return NULL;
-
- po->es = es;
- po->input.ptr = es->output->comp->input->pointer;
- po->input.kbd = es->output->comp->input->keyboard;
- po->input.touch = es->output->comp->input->touch;
- po->evas = evas;
- po->parent = parent;
- po->surface = surface;
- po->surface_destroy_listener =
- pepper_object_add_event_listener((pepper_object_t *)surface,
- PEPPER_EVENT_OBJECT_DESTROY, 0,
- _pepper_efl_object_cb_surface_destroy, po);
+ {
+ _pepper_efl_smart_init();
+
+ evas = evas_object_evas_get(output->win);
+ o = evas_object_smart_add(evas, _pepper_efl_smart);
+
+ po = evas_object_smart_data_get(o);
+ if (!po)
+ return NULL;
+
+ po->input.ptr = output->comp->input->pointer;
+ po->input.kbd = output->comp->input->keyboard;
+ po->input.touch = output->comp->input->touch;
+ po->evas = evas;
+ po->parent = output->win;
+ po->surface = surface;
+ po->surface_destroy_listener =
+ pepper_object_add_event_listener((pepper_object_t *)surface,
+ PEPPER_EVENT_OBJECT_DESTROY, 0,
+ _pepper_efl_object_cb_surface_destroy, po);
#define EVENT_ADD(type, func) \
- evas_object_event_callback_priority_add(o, \
- EVAS_CALLBACK_##type, \
- EVAS_CALLBACK_PRIORITY_AFTER, \
- _pepper_efl_object_evas_cb_##func, \
- po);
- EVENT_ADD(MOUSE_IN, mouse_in);
- EVENT_ADD(MOUSE_OUT, mouse_out);
- EVENT_ADD(MOUSE_MOVE, mouse_move);
- EVENT_ADD(MOUSE_DOWN, mouse_down);
- EVENT_ADD(MOUSE_UP, mouse_up);
- EVENT_ADD(MULTI_DOWN, multi_down);
- EVENT_ADD(MULTI_UP, multi_up);
- EVENT_ADD(MULTI_MOVE, multi_move);
-
- EVENT_ADD(FOCUS_IN, focus_in);
- EVENT_ADD(FOCUS_OUT, focus_out);
+ evas_object_event_callback_priority_add(o, \
+ EVAS_CALLBACK_##type, \
+ EVAS_CALLBACK_PRIORITY_AFTER, \
+ _pepper_efl_object_evas_cb_##func, \
+ po);
+ EVENT_ADD(MOUSE_IN, mouse_in);
+ EVENT_ADD(MOUSE_OUT, mouse_out);
+ EVENT_ADD(MOUSE_MOVE, mouse_move);
+ EVENT_ADD(MOUSE_DOWN, mouse_down);
+ EVENT_ADD(MOUSE_UP, mouse_up);
+ EVENT_ADD(MULTI_DOWN, multi_down);
+ EVENT_ADD(MULTI_UP, multi_up);
+ EVENT_ADD(MULTI_MOVE, multi_move);
+
+ EVENT_ADD(FOCUS_IN, focus_in);
+ EVENT_ADD(FOCUS_OUT, focus_out);
#undef EVENT_ADD
- return o;
+ pepper_object_set_user_data((pepper_object_t *)surface, output, po, NULL);
+ }
+
+ return po->smart_obj;
}
Eina_Bool
evas_object_image_data_set(po->img, wl_shm_buffer_get_data(po->shm_buffer));
evas_object_image_data_update_add(po->img, 0, 0, po->w, po->h);
}
- else
+ else if (po->buffer)
{
Evas_Native_Surface ns;
_pepper_efl_output_repaint(void *o EINA_UNUSED, const pepper_list_t *plane_list EINA_UNUSED)
{
pepper_efl_output_t *output = o;
- pepper_efl_surface_t *es;
- Eina_List *l;
+ Evas_Object *co;
+ Eina_List *l, *ll;
DBG("callback output");
- EINA_LIST_FOREACH(output->update_list, l, es) {
- pepper_efl_object_render(es->obj);
- output->update_list = eina_list_remove_list(output->update_list, l);
- }
+ EINA_LIST_FOREACH_SAFE(output->update_list, l, ll, co)
+ {
+ pepper_efl_object_render(co);
+ output->update_list = eina_list_remove(output->update_list, co);
+ }
}
static void
_pepper_efl_output_attach_surface(void *o, pepper_surface_t *surface, int *w, int *h)
{
- pepper_efl_output_t *output = o;
- pepper_efl_surface_t *es;
+ pepper_efl_output_t *output;
+ Evas_Object *co;
int rw = 0, rh = 0;
+ Eina_Bool res;
- es = pepper_efl_surface_get(output, surface);
- if (!es)
+ output = o;
+ co = pepper_efl_object_get(output, surface);
+ if (!co)
{
- ERR("failed to get pepper_efl_surface_t");
+ ERR("failed to get Evas_Object of client");
goto end;
}
- if (!pepper_efl_surface_update(es, &rw, &rh))
+ res = pepper_efl_object_buffer_attach(co, &rw, &rh);
+ if (!res)
goto end;
- output->update_list = eina_list_append(output->update_list, es);
+ output->update_list = eina_list_append(output->update_list, co);
end:
if (w) *w = rw;
+++ /dev/null
-#include "private.h"
-
-static void
-_pepper_efl_surface_cb_destroy(pepper_event_listener_t *listener EINA_UNUSED, pepper_object_t *object EINA_UNUSED, uint32_t id EINA_UNUSED, void *info EINA_UNUSED, void *data)
-{
- pepper_efl_surface_t *es = data;
-
- evas_object_smart_callback_call(es->output->win, PEPPER_EFL_OBJ_DEL, (void *)es->obj);
-
- pepper_event_listener_remove(es->surface_destroy_listener);
- pepper_object_set_user_data((pepper_object_t *)es->surface,
- (const void *)es->output, NULL, NULL);
-
- es->output->update_list = eina_list_remove(es->output->update_list, es);
-
- free(es);
-}
-
-Eina_Bool
-pepper_efl_surface_update(pepper_efl_surface_t *es, int *w, int *h)
-{
- if (!es->obj)
- return EINA_FALSE;
-
- if (!pepper_efl_object_buffer_attach(es->obj, w, h))
- return EINA_FALSE;
-
- return EINA_TRUE;
-}
-
-pepper_efl_surface_t *
-pepper_efl_surface_get(pepper_efl_output_t *output, pepper_surface_t *surface)
-{
- pepper_efl_surface_t *es;
-
- es = pepper_object_get_user_data((pepper_object_t *)surface, output);
- if (!es)
- {
- es = calloc(1, sizeof(pepper_efl_surface_t));
- if (!es)
- return NULL;
-
- es->output = output;
- es->obj = pepper_efl_object_add(es, output->win, surface);
- es->surface = surface;
- es->surface_destroy_listener =
- pepper_object_add_event_listener((pepper_object_t *)surface,
- PEPPER_EVENT_OBJECT_DESTROY, 0,
- _pepper_efl_surface_cb_destroy, es);
-
- pepper_object_set_user_data((pepper_object_t *)surface, output, es, NULL);
- }
-
- return es;
-}