From 495a14ea174b2331652213d7cc4e9f068f02bd27 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Mon, 10 Aug 2015 18:50:31 -0400 Subject: [PATCH] make wl clipboard source create/unref external --- src/bin/e_comp_wl_data.c | 119 +++++++++++++++++++-------------------- src/bin/e_comp_wl_data.h | 2 + 2 files changed, 61 insertions(+), 60 deletions(-) diff --git a/src/bin/e_comp_wl_data.c b/src/bin/e_comp_wl_data.c index a97bd06bc..18212827a 100644 --- a/src/bin/e_comp_wl_data.c +++ b/src/bin/e_comp_wl_data.c @@ -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); +} diff --git a/src/bin/e_comp_wl_data.h b/src/bin/e_comp_wl_data.h index 322502ea5..53bd70bdd 100644 --- a/src/bin/e_comp_wl_data.h +++ b/src/bin/e_comp_wl_data.h @@ -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