\r
wayland_tbm_server_surface_destroy_cb destroy_cb;\r
void *user_data;\r
+\r
+ struct wayland_tbm_client_queue *cqueue;\r
+\r
+ struct wl_list link;\r
};\r
\r
struct wayland_tbm_client_resource {\r
struct wl_resource *wl_surface;\r
pid_t pid;\r
\r
+ struct wl_list tbm_buffer_list;\r
+\r
struct wl_list link;\r
};\r
\r
\r
#ifdef DEBUG_TRACE\r
pid_t pid = 0; uid_t uid = 0; gid_t gid = 0;\r
- wl_client_get_credentials(tbm_buffer->client, &pid, &uid, &gid);\r
+ if (tbm_buffer && tbm_buffer->client)\r
+ wl_client_get_credentials(tbm_buffer->client, &pid, &uid, &gid);\r
WL_TBM_TRACE(" pid:%d tbm_surface:%p\n", pid, tbm_buffer->surface);\r
#endif\r
_wayland_tbm_server_tbm_buffer_destroy(tbm_buffer);\r
static void\r
_wayland_tbm_server_tbm_buffer_destroy(struct wayland_tbm_buffer *tbm_buffer)\r
{\r
- if (tbm_buffer->destroy_cb)\r
- tbm_buffer->destroy_cb(tbm_buffer->surface, tbm_buffer->user_data);\r
+ WL_TBM_RETURN_IF_FAIL(tbm_buffer != NULL);\r
\r
- tbm_surface_internal_delete_user_data(tbm_buffer->surface, KEY_TBM_BUFFER);\r
- tbm_surface_internal_unref(tbm_buffer->surface);\r
+ struct wayland_tbm_buffer *tbm_buffer2 = NULL, *tmp_tbm_buffer = NULL;\r
+ struct wayland_tbm_client_queue *cqueue = tbm_buffer->cqueue;\r
+ WL_TBM_RETURN_IF_FAIL(cqueue != NULL);\r
\r
- free(tbm_buffer);\r
+ if (!wl_list_empty(&cqueue->tbm_buffer_list)) {\r
+ wl_list_for_each_safe(tbm_buffer2, tmp_tbm_buffer, &cqueue->tbm_buffer_list, link) {\r
+ if (tbm_buffer2 == tbm_buffer) {\r
+ wl_list_remove(&tbm_buffer2->link);\r
+ if (tbm_buffer->destroy_cb)\r
+ tbm_buffer->destroy_cb(tbm_buffer2->surface, tbm_buffer2->user_data);\r
+ tbm_surface_internal_delete_user_data(tbm_buffer2->surface, KEY_TBM_BUFFER);\r
+ tbm_surface_internal_unref(tbm_buffer2->surface);\r
+ free(tbm_buffer2);\r
+ tbm_buffer2 = NULL;\r
+ break;\r
+ }\r
+ }\r
+ }\r
}\r
\r
static struct wayland_tbm_buffer *\r
}\r
\r
static void\r
-_destroy_tbm_queue(struct wl_resource *wl_tbm_queue)\r
+_wayland_tbm_server_surface_queue_destroy(struct wl_resource *wl_tbm_queue)\r
{\r
struct wayland_tbm_client_queue *cqueue = wl_resource_get_user_data(wl_tbm_queue);\r
+ struct wayland_tbm_buffer *tbm_buffer = NULL, *tmp_tbm_buffer = NULL;\r
\r
if (cqueue) {\r
#ifdef DEBUG_TRACE\r
WL_TBM_TRACE("destory queue. pid:%d\n", cqueue->pid);\r
#endif\r
+ if (!wl_list_empty(&cqueue->tbm_buffer_list)) {\r
+ wl_list_for_each_safe(tbm_buffer, tmp_tbm_buffer, &cqueue->tbm_buffer_list, link) {\r
+ wl_list_remove(&tbm_buffer->link);\r
+ if (tbm_buffer->destroy_cb)\r
+ tbm_buffer->destroy_cb(tbm_buffer->surface, tbm_buffer->user_data);\r
+ tbm_surface_internal_delete_user_data(tbm_buffer->surface, KEY_TBM_BUFFER);\r
+ tbm_surface_internal_unref(tbm_buffer->surface);\r
+ free(tbm_buffer);\r
+ tbm_buffer = NULL;\r
+ }\r
+ }\r
\r
wl_list_remove(&cqueue->link);\r
free(cqueue);\r
\r
wl_resource_set_implementation(cqueue->wl_tbm_queue,\r
(void (* *)(void)) &_wayland_tbm_queue_impementation,\r
- cqueue, _destroy_tbm_queue);\r
+ cqueue, _wayland_tbm_server_surface_queue_destroy);\r
\r
- wl_list_init(&cqueue->link);\r
+ /* init tbm_buffer list */\r
+ wl_list_init(&cqueue->tbm_buffer_list);\r
\r
/* add a cqueue to the list */\r
wl_list_insert(&tbm_srv->cqueue_list, &cqueue->link);\r
}\r
}\r
}\r
+\r
+ /* remove the queue resources */\r
+ // TODO:\r
}\r
\r
static void\r
struct wl_resource *wl_tbm = NULL;\r
struct wayland_tbm_buffer *tbm_buffer = NULL;\r
struct wl_client *client = NULL;\r
- void *data = NULL;\r
\r
WL_TBM_RETURN_VAL_IF_FAIL(cqueue != NULL, 0);\r
WL_TBM_RETURN_VAL_IF_FAIL(cqueue->wl_tbm_queue != NULL, 0);\r
WL_TBM_RETURN_VAL_IF_FAIL(surface != NULL, 0);\r
\r
+#if 0\r
+ void *data = NULL;\r
/* return if the surface is already exported to the client on the cqueue */\r
- tbm_surface_internal_get_user_data(surface, KEY_TBM_BUFFER, &data);\r
- if (data != NULL) {\r
- //WL_TBM_S_LOG("WARNING...surface(%p) is already export\n", surface);\r
- return 0;\r
+ if (tbm_surface_internal_get_user_data(surface, KEY_TBM_BUFFER, &data)) {\r
+ if (data != NULL) {\r
+ tbm_buffer = (struct wayland_tbm_buffer *)data;\r
+ tbm_surface_internal_add_user_data(surface, tbm_buffer->wl_buffer, NULL);\r
+ tbm_surface_internal_set_user_data(surface, tbm_buffer->wl_buffer, (void *)data);\r
+ data = NULL;\r
+ tbm_buffer = NULL;\r
+ //return 0;\r
+ }\r
}\r
+#endif\r
\r
wl_tbm = cqueue->wl_tbm;\r
client = wl_resource_get_client(cqueue->wl_tbm_queue);\r
tbm_surface_internal_unref(surface);\r
return 0;\r
}\r
-\r
tbm_buffer->destroy_cb = destroy_cb;\r
tbm_buffer->user_data = user_data;\r
+ tbm_buffer->cqueue = cqueue;\r
+\r
+ /* add the tbm_buffer to the buffer list */\r
+ wl_list_insert(&cqueue->tbm_buffer_list, &tbm_buffer->link);\r
\r
if(!_wayland_tbm_server_wl_tbm_queue_send_surface(cqueue,\r
tbm_buffer->wl_buffer, surface, flags)) {\r