make wl clipboard source create/unref external

This commit is contained in:
Mike Blumenkrantz 2015-08-10 18:50:31 -04:00
parent 0a690c7d17
commit 495a14ea17
2 changed files with 61 additions and 60 deletions

View File

@ -469,28 +469,6 @@ _e_comp_wl_data_cb_bind_manager(struct wl_client *client, void *data EINA_UNUSED
e_comp->wl_comp_data, NULL);
}
static void
_e_comp_wl_clipboard_source_unref(E_Comp_Wl_Clipboard_Source *source)
{
char* t;
source->ref --;
if (source->ref > 0) return;
if (source->fd_handler)
{
ecore_main_fd_handler_del(source->fd_handler);
close(source->fd);
}
EINA_LIST_FREE(source->data_source.mime_types, t)
eina_stringshare_del(t);
wl_signal_emit(&source->data_source.destroy_signal, &source->data_source);
wl_array_release(&source->contents);
free(source);
}
static Eina_Bool
_e_comp_wl_clipboard_offer_load(void *data, Ecore_Fd_Handler *handler)
{
@ -514,7 +492,7 @@ _e_comp_wl_clipboard_offer_load(void *data, Ecore_Fd_Handler *handler)
{
close(fd);
ecore_main_fd_handler_del(handler);
_e_comp_wl_clipboard_source_unref(offer->source);
e_comp_wl_clipboard_source_unref(offer->source);
free(offer);
}
@ -567,7 +545,7 @@ _e_comp_wl_clipboard_source_save(void *data EINA_UNUSED, Ecore_Fd_Handler *handl
}
else if (len < 0)
{
_e_comp_wl_clipboard_source_unref(source);
e_comp_wl_clipboard_source_unref(source);
e_comp->wl_comp_data->clipboard.source = NULL;
}
else
@ -604,40 +582,6 @@ _e_comp_wl_clipboard_source_cancelled_send(E_Comp_Wl_Data_Source *source EINA_UN
{
}
static E_Comp_Wl_Clipboard_Source*
_e_comp_wl_clipboard_source_create(const char *mime_type, uint32_t serial, int fd)
{
E_Comp_Wl_Clipboard_Source *source;
source = E_NEW(E_Comp_Wl_Clipboard_Source, 1);
if (!source) return NULL;
source->data_source.resource = NULL;
source->data_source.target = _e_comp_wl_clipboard_source_target_send;
source->data_source.send = _e_comp_wl_clipboard_source_send_send;
source->data_source.cancelled = _e_comp_wl_clipboard_source_cancelled_send;
wl_array_init(&source->contents);
wl_signal_init(&source->data_source.destroy_signal);
source->ref = 1;
source->serial = serial;
source->data_source.mime_types =
eina_list_append(source->data_source.mime_types,
eina_stringshare_add(mime_type));
source->fd_handler =
ecore_main_fd_handler_add(fd, ECORE_FD_READ,
_e_comp_wl_clipboard_source_save,
e_comp->wl_comp_data, NULL, NULL);
if (!source->fd_handler) return NULL;
source->fd = fd;
return source;
}
static void
_e_comp_wl_clipboard_selection_set(struct wl_listener *listener EINA_UNUSED, void *data EINA_UNUSED)
{
@ -661,7 +605,7 @@ _e_comp_wl_clipboard_selection_set(struct wl_listener *listener EINA_UNUSED, voi
return;
if (clip_source)
_e_comp_wl_clipboard_source_unref(clip_source);
e_comp_wl_clipboard_source_unref(clip_source);
e_comp->wl_comp_data->clipboard.source = NULL;
mime_type = eina_list_nth(sel_source->mime_types, 0);
@ -672,7 +616,7 @@ _e_comp_wl_clipboard_selection_set(struct wl_listener *listener EINA_UNUSED, voi
sel_source->send(sel_source, mime_type, p[1]);
e_comp->wl_comp_data->clipboard.source =
_e_comp_wl_clipboard_source_create(mime_type,
e_comp_wl_clipboard_source_create(mime_type,
e_comp->wl_comp_data->selection.serial, p[0]);
if (!e_comp->wl_comp_data->clipboard.source)
@ -904,3 +848,58 @@ e_comp_wl_data_manager_source_create(struct wl_client *client, struct wl_resourc
_e_comp_wl_data_source_cb_resource_destroy);
return source;
}
E_API E_Comp_Wl_Clipboard_Source *
e_comp_wl_clipboard_source_create(const char *mime_type, uint32_t serial, int fd)
{
E_Comp_Wl_Clipboard_Source *source;
source = E_NEW(E_Comp_Wl_Clipboard_Source, 1);
if (!source) return NULL;
source->data_source.resource = NULL;
source->data_source.target = _e_comp_wl_clipboard_source_target_send;
source->data_source.send = _e_comp_wl_clipboard_source_send_send;
source->data_source.cancelled = _e_comp_wl_clipboard_source_cancelled_send;
wl_array_init(&source->contents);
wl_signal_init(&source->data_source.destroy_signal);
source->ref = 1;
source->serial = serial;
if (mime_type)
source->data_source.mime_types =
eina_list_append(source->data_source.mime_types,
eina_stringshare_add(mime_type));
source->fd_handler =
ecore_main_fd_handler_add(fd, ECORE_FD_READ,
_e_comp_wl_clipboard_source_save,
e_comp->wl_comp_data, NULL, NULL);
if (!source->fd_handler) return NULL;
source->fd = fd;
return source;
}
E_API void
e_comp_wl_clipboard_source_unref(E_Comp_Wl_Clipboard_Source *source)
{
EINA_SAFETY_ON_NULL_RETURN(source);
source->ref--;
if (source->ref > 0) return;
if (source->fd_handler)
{
ecore_main_fd_handler_del(source->fd_handler);
close(source->fd);
}
E_FREE_LIST(source->data_source.mime_types, eina_stringshare_del);
wl_signal_emit(&source->data_source.destroy_signal, &source->data_source);
wl_array_release(&source->contents);
free(source);
}

View File

@ -58,5 +58,7 @@ EINTERN Eina_Bool e_comp_wl_data_manager_init(void);
EINTERN void e_comp_wl_data_manager_shutdown(void);
E_API struct wl_resource *e_comp_wl_data_find_for_client(struct wl_client *client);
E_API E_Comp_Wl_Data_Source *e_comp_wl_data_manager_source_create(struct wl_client *client, struct wl_resource *resource, uint32_t id);
E_API void e_comp_wl_clipboard_source_unref(E_Comp_Wl_Clipboard_Source *source);
E_API E_Comp_Wl_Clipboard_Source *e_comp_wl_clipboard_source_create(const char *mime_type, uint32_t serial, int fd);
# endif
#endif