static void _tdm_voutput_cb_destroy(struct wl_client *client, struct wl_resource *resource)
{
- tdm_server_voutput_info *voutput_info;
- tdm_private_server *private_server;
- tdm_output *output;
- tdm_error ret = TDM_ERROR_NONE;
-
- voutput_info = wl_resource_get_user_data(resource);
-
- private_server = voutput_info->private_server;
- output = voutput_info->output;
-
- if (output)
- ret = tdm_display_destroy_output(private_server->private_loop->dpy, output);
-
- if (ret != TDM_ERROR_NONE)
- TDM_ERR("_tdm_voutput_cb_destroy fail");
-
wl_resource_destroy(resource);
}
_tdm_voutput_cb_commit_done(struct wl_client *client, struct wl_resource *resource)
{
tdm_server_voutput_info *voutput_info;
+ tbm_surface_h buffer;
voutput_info = wl_resource_get_user_data(resource);
if (voutput_info->status != TDM_OUTPUT_CONN_STATUS_CONNECTED)
// handle error
return;
}
- tdm_output_commit_done(voutput_info->output, voutput_info->attach_buffer->buffer);
+
+ buffer = voutput_info->attach_buffer->buffer;
+ tbm_surface_internal_unref(buffer);
+
voutput_info->committing = 0;
voutput_info->attach_buffer = NULL;
+
+ tdm_output_commit_done(voutput_info->output, buffer);
}
static const struct wl_tdm_voutput_interface tdm_voutput_implementation = {
_tdm_voutput_buffer_destory(struct wl_resource *wl_buffer)
{
tdm_server_voutput_info *voutput_info = NULL;
- tdm_server_voutput_buffer *vb = NULL;
+ tdm_server_voutput_buffer *vb = NULL, *vbb = NULL;
voutput_info = (tdm_server_voutput_info *)wl_resource_get_user_data(wl_buffer);
TDM_RETURN_IF_FAIL(voutput_info != NULL);
- LIST_FOR_EACH_ENTRY(vb, &voutput_info->buffer_list, link) {
+ LIST_FOR_EACH_ENTRY_SAFE(vb, vbb, &voutput_info->buffer_list, link) {
if (vb->wl_buffer == wl_buffer) {
tbm_surface_internal_unref(vb->buffer);
wl_resource_set_user_data(wl_buffer, NULL);
+ LIST_DEL(&vb->link);
free(vb);
}
}
tdm_server_voutput_buffer *voutput_buffer = NULL, *vb = NULL;
LIST_FOR_EACH_ENTRY(vb, &voutput_info->buffer_list, link) {
- if (vb && vb->buffer == buffer)
+ if (vb && vb->buffer == buffer) {
+ tbm_surface_internal_ref(vb->buffer);
return vb;
+ }
}
tbm_surface_internal_ref(buffer);
}
voutput_buffer->buffer = buffer;
- LIST_ADDTAIL(&voutput_info->link, &voutput_info->buffer_list);
+ LIST_ADDTAIL(&voutput_buffer->link, &voutput_info->buffer_list);
return voutput_buffer;
}
tdm_voutput_cb_resource_destroy(struct wl_resource *resource)
{
tdm_server_voutput_info *voutput_info = wl_resource_get_user_data(resource);
- tdm_server_voutput_buffer *vb, *vbb;
+ tdm_server_voutput_buffer *vb;
+ tdm_private_server *private_server;
+ tdm_output *output;
+ tdm_error ret = TDM_ERROR_NONE;
+
TDM_RETURN_IF_FAIL(voutput_info != NULL);
- LIST_FOR_EACH_ENTRY_SAFE(vb, vbb, &voutput_info->buffer_list, link) {
- if (!vb) continue;
+ private_server = voutput_info->private_server;
+ output = voutput_info->output;
- LIST_DEL(&vb->link);
+ if (output)
+ ret = tdm_display_destroy_output(private_server->private_loop->dpy, output);
+ if (ret != TDM_ERROR_NONE)
+ TDM_ERR("_tdm_voutput_cb_destroy fail");
+
+ LIST_FOR_EACH_ENTRY(vb, &voutput_info->buffer_list, link) {
+ if (!vb) continue;
if (vb->wl_buffer)
wl_resource_destroy(vb->wl_buffer);