summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Zaoui <daniel.zaoui@yahoo.com>2015-06-13 20:33:14 +0300
committerDaniel Zaoui <daniel.zaoui@samsung.com>2015-06-14 11:21:33 +0300
commitf78873735436015822fef390257ca6397ab3f781 (patch)
treeb4eda81984dda58ccff51f1c3fafce0e7557b9cb
parent83ae5df190d328c6d6263c614f8b5ef336b23cd9 (diff)
DnD/X11: refactor the notifiers
Each data notifier was preparing data and then invoking the user callbacks for DnD or selection protocols. Most of the notifiers code was handling the user callbacks invocation and was the same for all of them. This patch simplifies the notifiers by moving the user callbacks invocation into a common place for all the types, i.e into the notify dispatcher. The notifiers prototype has been changed to suit the code modifications.
-rw-r--r--src/lib/elm_cnp.c305
1 files changed, 93 insertions, 212 deletions
diff --git a/src/lib/elm_cnp.c b/src/lib/elm_cnp.c
index f47b96bb2..1a9c7fe2c 100644
--- a/src/lib/elm_cnp.c
+++ b/src/lib/elm_cnp.c
@@ -205,7 +205,7 @@ typedef struct _X11_Cnp_Selection X11_Cnp_Selection;
205 205
206typedef Eina_Bool (*X11_Converter_Fn_Cb) (char *target, void *data, int size, void **data_ret, int *size_ret, Ecore_X_Atom *ttype, int *typesize); 206typedef Eina_Bool (*X11_Converter_Fn_Cb) (char *target, void *data, int size, void **data_ret, int *size_ret, Ecore_X_Atom *ttype, int *typesize);
207typedef int (*X11_Response_Handler_Cb) (X11_Cnp_Selection *sel, Ecore_X_Event_Selection_Notify *); 207typedef int (*X11_Response_Handler_Cb) (X11_Cnp_Selection *sel, Ecore_X_Event_Selection_Notify *);
208typedef int (*X11_Notify_Handler_Cb) (X11_Cnp_Selection *sel, Ecore_X_Event_Selection_Notify *); 208typedef Eina_Bool (*X11_Notify_Handler_Cb) (Ecore_X_Event_Selection_Notify *, Elm_Selection_Data *, Tmp_Info **);
209 209
210static void _x11_sel_obj_del (void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED); 210static void _x11_sel_obj_del (void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED);
211static void _x11_sel_obj_del2 (void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED); 211static void _x11_sel_obj_del2 (void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED);
@@ -217,12 +217,12 @@ static Eina_Bool _x11_general_converter (char *target, void *data, i
217static Eina_Bool _x11_image_converter (char *target, void *data, int size, void **data_ret, int *size_ret, Ecore_X_Atom *ttype, int *typesize); 217static Eina_Bool _x11_image_converter (char *target, void *data, int size, void **data_ret, int *size_ret, Ecore_X_Atom *ttype, int *typesize);
218static Eina_Bool _x11_vcard_send (char *target, void *data, int size, void **data_ret, int *size_ret, Ecore_X_Atom *ttype, int *typesize); 218static Eina_Bool _x11_vcard_send (char *target, void *data, int size, void **data_ret, int *size_ret, Ecore_X_Atom *ttype, int *typesize);
219static Eina_Bool _x11_is_uri_type_data (X11_Cnp_Selection *sel EINA_UNUSED, Ecore_X_Event_Selection_Notify *notify); 219static Eina_Bool _x11_is_uri_type_data (X11_Cnp_Selection *sel EINA_UNUSED, Ecore_X_Event_Selection_Notify *notify);
220static int _x11_notify_handler_targets (X11_Cnp_Selection *sel, Ecore_X_Event_Selection_Notify *notify); 220static Eina_Bool _x11_notify_handler_targets (X11_Cnp_Selection *sel, Ecore_X_Event_Selection_Notify *notify);
221static int _x11_notify_handler_text (X11_Cnp_Selection *sel, Ecore_X_Event_Selection_Notify *notify); 221static Eina_Bool _x11_notify_handler_text (Ecore_X_Event_Selection_Notify *notify, Elm_Selection_Data *ddata, Tmp_Info **tmp_info);
222static int _x11_notify_handler_image (X11_Cnp_Selection *sel, Ecore_X_Event_Selection_Notify *notify); 222static Eina_Bool _x11_notify_handler_image (Ecore_X_Event_Selection_Notify *notify, Elm_Selection_Data *ddata, Tmp_Info **tmp_info);
223static int _x11_notify_handler_uri (X11_Cnp_Selection *sel, Ecore_X_Event_Selection_Notify *notify); 223static Eina_Bool _x11_notify_handler_uri (Ecore_X_Event_Selection_Notify *notify, Elm_Selection_Data *ddata, Tmp_Info **tmp_info);
224//static int _x11_notify_handler_html (X11_Cnp_Selection *sel, Ecore_X_Event_Selection_Notify *notify); 224//static int _x11_notify_handler_html (X11_Cnp_Selection *sel, Ecore_X_Event_Selection_Notify *notify);
225static int _x11_vcard_receive (X11_Cnp_Selection *sed, Ecore_X_Event_Selection_Notify *notify); 225static Eina_Bool _x11_vcard_receive (Ecore_X_Event_Selection_Notify *notify, Elm_Selection_Data *ddata, Tmp_Info **tmp_info);
226static Eina_Bool _x11_dnd_enter (void *data EINA_UNUSED, int etype EINA_UNUSED, void *ev); 226static Eina_Bool _x11_dnd_enter (void *data EINA_UNUSED, int etype EINA_UNUSED, void *ev);
227static Eina_Bool _x11_dnd_drop (void *data EINA_UNUSED, int etype EINA_UNUSED, void *ev); 227static Eina_Bool _x11_dnd_drop (void *data EINA_UNUSED, int etype EINA_UNUSED, void *ev);
228static Eina_Bool _x11_dnd_position (void *data EINA_UNUSED, int etype EINA_UNUSED, void *ev); 228static Eina_Bool _x11_dnd_position (void *data EINA_UNUSED, int etype EINA_UNUSED, void *ev);
@@ -438,7 +438,6 @@ static Cnp_Atom _atoms[CNP_N_ATOMS] = {
438 .formats = ELM_SEL_FORMAT_TARGETS, 438 .formats = ELM_SEL_FORMAT_TARGETS,
439#ifdef HAVE_ELEMENTARY_X 439#ifdef HAVE_ELEMENTARY_X
440 .x_converter = _x11_targets_converter, 440 .x_converter = _x11_targets_converter,
441 .x_notify = _x11_notify_handler_targets,
442#endif 441#endif
443 }, 442 },
444 ARRAYINIT(CNP_ATOM_ATOM) { 443 ARRAYINIT(CNP_ATOM_ATOM) {
@@ -446,7 +445,6 @@ static Cnp_Atom _atoms[CNP_N_ATOMS] = {
446 .formats = ELM_SEL_FORMAT_TARGETS, 445 .formats = ELM_SEL_FORMAT_TARGETS,
447#ifdef HAVE_ELEMENTARY_X 446#ifdef HAVE_ELEMENTARY_X
448 .x_converter = _x11_targets_converter, 447 .x_converter = _x11_targets_converter,
449 .x_notify = _x11_notify_handler_targets,
450#endif 448#endif
451 }, 449 },
452 ARRAYINIT(CNP_ATOM_XELM) { 450 ARRAYINIT(CNP_ATOM_XELM) {
@@ -757,14 +755,58 @@ _x11_selection_notify(void *udata EINA_UNUSED, int type EINA_UNUSED, void *event
757 } 755 }
758 cnp_debug("Target is %s\n", ev->target); 756 cnp_debug("Target is %s\n", ev->target);
759 757
758 if (!strcmp(ev->target, "TARGETS") ||
759 !strcmp(ev->target, "ATOMS"))
760 {
761 _x11_notify_handler_targets(sel, ev);
762 return ECORE_CALLBACK_PASS_ON;
763 }
760 for (i = 0; i < CNP_N_ATOMS; i++) 764 for (i = 0; i < CNP_N_ATOMS; i++)
761 { 765 {
762 if (!strcmp(ev->target, _atoms[i].name)) 766 if (!strcmp(ev->target, _atoms[i].name))
763 { 767 {
764 if (_atoms[i].x_notify) 768 if (_atoms[i].x_notify)
765 { 769 {
770 Elm_Selection_Data ddata;
771 Tmp_Info *tmp_info = NULL;
772 Eina_Bool success;
773 ddata.data = NULL;
766 cnp_debug("Found something: %s\n", _atoms[i].name); 774 cnp_debug("Found something: %s\n", _atoms[i].name);
767 _atoms[i].x_notify(sel, ev); 775 success = _atoms[i].x_notify(ev, &ddata, &tmp_info);
776 if (_atoms[i].formats == ELM_SEL_FORMAT_IMAGE && savedtypes.imgfile) break;
777 if (ev->selection == ECORE_X_SELECTION_XDND)
778 {
779 if (success)
780 {
781 Dropable *dropable;
782 Eina_List *l;
783 cnp_debug("drag & drop\n");
784 EINA_LIST_FOREACH(drops, l, dropable)
785 {
786 if (dropable->obj == sel->requestwidget) break;
787 dropable = NULL;
788 }
789 if (dropable)
790 {
791 Dropable_Cbs *cbs;
792 Eina_Inlist *itr;
793 ddata.x = savedtypes.x;
794 ddata.y = savedtypes.y;
795 EINA_INLIST_FOREACH_SAFE(dropable->cbs_list, itr, cbs)
796 if ((cbs->types & dropable->last.format) && cbs->dropcb)
797 cbs->dropcb(cbs->dropdata, dropable->obj, &ddata);
798 }
799 }
800 /* We have to finish DnD, no matter what */
801 ecore_x_dnd_send_finished();
802 }
803 else if (sel->datacb && success)
804 {
805 ddata.x = ddata.y = 0;
806 sel->datacb(sel->udata, sel->requestwidget, &ddata);
807 }
808 free(ddata.data);
809 if (tmp_info) _tmpinfo_free(tmp_info);
768 } 810 }
769 else cnp_debug("Ignored: No handler!\n"); 811 else cnp_debug("Ignored: No handler!\n");
770 break; 812 break;
@@ -871,7 +913,7 @@ _x11_is_uri_type_data(X11_Cnp_Selection *sel EINA_UNUSED, Ecore_X_Event_Selectio
871 * Callback to handle a targets response on a selection request: 913 * Callback to handle a targets response on a selection request:
872 * So pick the format we'd like; and then request it. 914 * So pick the format we'd like; and then request it.
873 */ 915 */
874static int 916static Eina_Bool
875_x11_notify_handler_targets(X11_Cnp_Selection *sel, Ecore_X_Event_Selection_Notify *notify) 917_x11_notify_handler_targets(X11_Cnp_Selection *sel, Ecore_X_Event_Selection_Notify *notify)
876{ 918{
877 Ecore_X_Selection_Data_Targets *targets; 919 Ecore_X_Selection_Data_Targets *targets;
@@ -907,65 +949,23 @@ done:
907 return ECORE_CALLBACK_PASS_ON; 949 return ECORE_CALLBACK_PASS_ON;
908} 950}
909 951
910static int 952static Eina_Bool
911_x11_notify_handler_text(X11_Cnp_Selection *sel, Ecore_X_Event_Selection_Notify *notify) 953_x11_notify_handler_text(Ecore_X_Event_Selection_Notify *notify,
954 Elm_Selection_Data *ddata, Tmp_Info **tmp_info EINA_UNUSED)
912{ 955{
913 Ecore_X_Selection_Data *data; 956 Ecore_X_Selection_Data *data = notify->data;
914 Eina_List *l; 957 ddata->format = ELM_SEL_FORMAT_TEXT;
915 Dropable *dropable; 958 ddata->data = eina_memdup(data->data, data->length, EINA_TRUE);
916 959 ddata->len = data->length;
917 data = notify->data; 960 return EINA_TRUE;
918 if (sel == (_x11_selections + ELM_SEL_TYPE_XDND))
919 {
920 Elm_Selection_Data ddata;
921
922 cnp_debug("drag & drop\n");
923 /* FIXME: this needs to be generic: Used for all receives */
924 EINA_LIST_FOREACH(drops, l, dropable)
925 {
926 if (dropable->obj == sel->requestwidget) break;
927 dropable = NULL;
928 }
929 if (dropable)
930 {
931 Dropable_Cbs *cbs;
932 Eina_Inlist *itr;
933 ddata.x = savedtypes.x;
934 ddata.y = savedtypes.y;
935 ddata.format = ELM_SEL_FORMAT_TEXT;
936 ddata.data = data->data;
937 ddata.len = data->length;
938 ddata.action = sel->action;
939 EINA_INLIST_FOREACH_SAFE(dropable->cbs_list, itr, cbs)
940 if ((cbs->types & dropable->last.format) && cbs->dropcb)
941 cbs->dropcb(cbs->dropdata, dropable->obj, &ddata);
942 goto end;
943 }
944 }
945 if (sel->datacb)
946 {
947 Elm_Selection_Data ddata;
948
949 ddata.x = ddata.y = 0;
950 ddata.format = ELM_SEL_FORMAT_TEXT;
951 ddata.data = data->data;
952 ddata.len = data->length;
953 ddata.action = sel->action;
954 sel->datacb(sel->udata, sel->requestwidget, &ddata);
955 }
956 else cnp_debug("Paste request\n");
957
958end:
959 if (sel == (_x11_selections + ELM_SEL_TYPE_XDND))
960 ecore_x_dnd_send_finished();
961 return 0;
962} 961}
963 962
964/** 963/**
965 * So someone is pasting an image into my entry or widget... 964 * So someone is pasting an image into my entry or widget...
966 */ 965 */
967static int 966static Eina_Bool
968_x11_notify_handler_uri(X11_Cnp_Selection *sel, Ecore_X_Event_Selection_Notify *notify) 967_x11_notify_handler_uri(Ecore_X_Event_Selection_Notify *notify,
968 Elm_Selection_Data *ddata, Tmp_Info **tmp_info EINA_UNUSED)
969{ 969{
970 Ecore_X_Selection_Data *data; 970 Ecore_X_Selection_Data *data;
971 Ecore_X_Selection_Data_Files *files; 971 Ecore_X_Selection_Data_Files *files;
@@ -985,13 +985,13 @@ _x11_notify_handler_uri(X11_Cnp_Selection *sel, Ecore_X_Event_Selection_Notify *
985 { 985 {
986 // Don't handle many items <- this makes mr bigglesworth sad :( 986 // Don't handle many items <- this makes mr bigglesworth sad :(
987 cnp_debug("more then one file: Bailing\n"); 987 cnp_debug("more then one file: Bailing\n");
988 return 0; 988 return EINA_FALSE;
989 } 989 }
990 stripstr = p = strdup(files->files[0]); 990 stripstr = p = strdup(files->files[0]);
991 */ 991 */
992 992
993 uri = calloc(1, sizeof(*uri) * files->num_files); 993 uri = calloc(1, sizeof(*uri) * files->num_files);
994 if (!uri) return 0; 994 if (!uri) return EINA_FALSE;
995 995
996 for (i = 0; i < files->num_files ; i++) 996 for (i = 0; i < files->num_files ; i++)
997 { 997 {
@@ -1065,7 +1065,7 @@ _x11_notify_handler_uri(X11_Cnp_Selection *sel, Ecore_X_Event_Selection_Notify *
1065 if (len > 0) 1065 if (len > 0)
1066 { 1066 {
1067 stripstr = malloc(len + 1); 1067 stripstr = malloc(len + 1);
1068 if (!stripstr) return 0; 1068 if (!stripstr) return EINA_FALSE;
1069 memcpy(stripstr, p, len); 1069 memcpy(stripstr, p, len);
1070 stripstr[len] = 0; 1070 stripstr[len] = 0;
1071 } 1071 }
@@ -1074,7 +1074,7 @@ _x11_notify_handler_uri(X11_Cnp_Selection *sel, Ecore_X_Event_Selection_Notify *
1074 if (!stripstr) 1074 if (!stripstr)
1075 { 1075 {
1076 cnp_debug("Couldn't find a file\n"); 1076 cnp_debug("Couldn't find a file\n");
1077 return 0; 1077 return EINA_FALSE;
1078 } 1078 }
1079 free(savedtypes.imgfile); 1079 free(savedtypes.imgfile);
1080 if (savedtypes.textreq) 1080 if (savedtypes.textreq)
@@ -1084,167 +1084,48 @@ _x11_notify_handler_uri(X11_Cnp_Selection *sel, Ecore_X_Event_Selection_Notify *
1084 } 1084 }
1085 else 1085 else
1086 { 1086 {
1087 if (sel == (_x11_selections + ELM_SEL_TYPE_XDND)) 1087 ddata->format = ELM_SEL_FORMAT_IMAGE;
1088 { 1088 ddata->data = stripstr;
1089 Dropable *dropable; 1089 ddata->len = strlen(stripstr);
1090 Eina_List *l;
1091
1092 EINA_LIST_FOREACH(drops, l, dropable)
1093 {
1094 if (dropable->obj == sel->requestwidget) break;
1095 dropable = NULL;
1096 }
1097 if (dropable)
1098 {
1099 Dropable_Cbs *cbs;
1100 Eina_Inlist *itr;
1101 Elm_Selection_Data ddata;
1102
1103 dropable = eina_list_data_get(l);
1104 ddata.x = savedtypes.x;
1105 ddata.y = savedtypes.y;
1106 ddata.format = ELM_SEL_FORMAT_IMAGE;
1107 ddata.data = stripstr;
1108 ddata.len = strlen(stripstr);
1109 ddata.action = sel->action;
1110 EINA_INLIST_FOREACH_SAFE(dropable->cbs_list, itr, cbs)
1111 if ((cbs->types & dropable->last.format) && cbs->dropcb)
1112 cbs->dropcb(cbs->dropdata, dropable->obj, &ddata);
1113 }
1114 }
1115 else if (sel->datacb)
1116 {
1117 Elm_Selection_Data ddata;
1118 ddata.x = ddata.y = 0;
1119 ddata.format = ELM_SEL_FORMAT_IMAGE;
1120 ddata.data = stripstr;
1121 ddata.len = strlen(stripstr);
1122 sel->datacb(sel->udata, sel->requestwidget, &ddata);
1123 }
1124 else cnp_debug("Paste request\n");
1125
1126 savedtypes.imgfile = NULL; 1090 savedtypes.imgfile = NULL;
1127 free(stripstr);
1128 } 1091 }
1129 return 0; 1092 return EINA_TRUE;
1130} 1093}
1131 1094
1132/** 1095/**
1133 * Just received an vcard, either through cut and paste, or dnd. 1096 * Just received an vcard, either through cut and paste, or dnd.
1134 */ 1097 */
1135static int 1098static Eina_Bool
1136_x11_vcard_receive(X11_Cnp_Selection *sel, Ecore_X_Event_Selection_Notify *notify) 1099_x11_vcard_receive(Ecore_X_Event_Selection_Notify *notify,
1100 Elm_Selection_Data *ddata, Tmp_Info **tmp_info EINA_UNUSED)
1137{ 1101{
1138 Dropable *dropable;
1139 Eina_List *l;
1140 Ecore_X_Selection_Data *data;
1141
1142 data = notify->data;
1143 cnp_debug("vcard receive\n"); 1102 cnp_debug("vcard receive\n");
1144 if (sel == (_x11_selections + ELM_SEL_TYPE_XDND)) 1103 Ecore_X_Selection_Data *data = notify->data;
1145 { 1104 ddata->format = ELM_SEL_FORMAT_VCARD;
1146 Dropable_Cbs *cbs; 1105 ddata->data = eina_memdup(data->data, data->length, EINA_TRUE);
1147 Eina_Inlist *itr; 1106 ddata->len = data->length;
1148 Elm_Selection_Data ddata; 1107 return EINA_TRUE;
1149
1150 cnp_debug("drag & drop\n");
1151 /* FIXME: this needs to be generic: Used for all receives */
1152 EINA_LIST_FOREACH(drops, l, dropable)
1153 {
1154 if (dropable->obj == sel->requestwidget) break;
1155 }
1156 if (!dropable)
1157 {
1158 cnp_debug("Unable to find drop object");
1159 ecore_x_dnd_send_finished();
1160 return 0;
1161 }
1162 dropable = eina_list_data_get(l);
1163 ddata.x = savedtypes.x;
1164 ddata.y = savedtypes.y;
1165 ddata.format = ELM_SEL_FORMAT_VCARD;
1166 ddata.data = data->data;
1167 ddata.len = data->length;
1168 ddata.action = sel->action;
1169 EINA_INLIST_FOREACH_SAFE(dropable->cbs_list, itr, cbs)
1170 if ((cbs->types & dropable->last.format) && cbs->dropcb)
1171 cbs->dropcb(cbs->dropdata, dropable->obj, &ddata);
1172 ecore_x_dnd_send_finished();
1173 }
1174 else if (sel->datacb)
1175 {
1176 Elm_Selection_Data ddata;
1177 ddata.x = ddata.y = 0;
1178 ddata.format = ELM_SEL_FORMAT_VCARD;
1179 ddata.data = data->data;
1180 ddata.len = data->length;
1181 ddata.action = sel->action;
1182 sel->datacb(sel->udata, sel->requestwidget, &ddata);
1183 }
1184 else cnp_debug("Paste request\n");
1185 return 0;
1186} 1108}
1187 1109
1188static int 1110static Eina_Bool
1189_x11_notify_handler_image(X11_Cnp_Selection *sel, Ecore_X_Event_Selection_Notify *notify) 1111_x11_notify_handler_image(Ecore_X_Event_Selection_Notify *notify,
1112 Elm_Selection_Data *ddata, Tmp_Info **tmp_info)
1190{ 1113{
1191 Ecore_X_Selection_Data *data; 1114 Ecore_X_Selection_Data *data = notify->data;
1192
1193 cnp_debug("got a image file!\n"); 1115 cnp_debug("got a image file!\n");
1194 data = notify->data;
1195
1196 cnp_debug("Size if %d\n", data->length); 1116 cnp_debug("Size if %d\n", data->length);
1197 if (sel == (_x11_selections + ELM_SEL_TYPE_XDND))
1198 {
1199 Tmp_Info *tmp;
1200 Eina_List *l;
1201 Dropable *dropable;
1202
1203 tmp = _tempfile_new(data->length);
1204 if (!tmp)
1205 {
1206 ecore_x_dnd_send_finished();
1207 return 0;
1208 }
1209 memcpy(tmp->map, data->data, data->length);
1210 munmap(tmp->map, data->length);
1211 EINA_LIST_FOREACH(drops, l, dropable)
1212 {
1213 if (dropable->obj == sel->requestwidget) break;
1214 dropable = NULL;
1215 }
1216 if (dropable)
1217 {
1218 Dropable_Cbs *cbs;
1219 Eina_Inlist *itr;
1220 Elm_Selection_Data ddata;
1221 1117
1222 ddata.x = savedtypes.x; 1118 ddata->format = ELM_SEL_FORMAT_IMAGE;
1223 ddata.y = savedtypes.y; 1119 data = notify->data;
1224 ddata.format = ELM_SEL_FORMAT_IMAGE;
1225 ddata.data = tmp->filename;
1226 ddata.len = strlen(tmp->filename);
1227 ddata.action = sel->action;
1228 EINA_INLIST_FOREACH_SAFE(dropable->cbs_list, itr, cbs)
1229 if ((cbs->types & dropable->last.format) && cbs->dropcb)
1230 cbs->dropcb(cbs->dropdata, dropable->obj, &ddata);
1231 }
1232 _tmpinfo_free(tmp);
1233 ecore_x_dnd_send_finished();
1234 }
1235 else if (sel->datacb)
1236 {
1237 Elm_Selection_Data ddata;
1238 1120
1239 ddata.x = ddata.y = 0; 1121 Tmp_Info *tmp = _tempfile_new(data->length);
1240 ddata.format = ELM_SEL_FORMAT_IMAGE; 1122 if (!tmp) return EINA_FALSE;
1241 ddata.data = data->data; 1123 memcpy(tmp->map, data->data, data->length);
1242 ddata.len = data->length; 1124 munmap(tmp->map, data->length);
1243 ddata.action = sel->action; 1125 ddata->data = strdup(tmp->filename);
1244 sel->datacb(sel->udata, sel->requestwidget, &ddata); 1126 ddata->len = strlen(tmp->filename);
1245 } 1127 *tmp_info = tmp;
1246 else cnp_debug("Paste request\n"); 1128 return EINA_TRUE;
1247 return 0;
1248} 1129}
1249 1130
1250/** 1131/**