Gah. didn't mean to merge all this all at once. For peoples information big changes related to freezy things: - Add some extra cursors to edje: - 2 for Input methods: This is required to do CJK input - 2 for general users: Needed for DND (well 1 is, add 2 anyway) - Add a new call to edje to allow the cursor to positioned from x,y coords (needed for Drag and drop) - Remove some wacky consts - Add a return value to a one path - some doco on a function i just got tripped on
Minor stuff: - ELM DND stuff (provisional) - .gitignores all over Let me know if you need some any anything else in particular. regards, nash On Mon, 06 Sep 2010 23:56 -0700, "Enlightenment SVN" <no-re...@enlightenment.org> wrote: > Log: > Merge branch 'elmdnd' > > Conflicts: > trunk/TMP/st/elementary/.gitignore > Author: nash > Date: 2010-09-06 23:56:16 -0700 (Mon, 06 Sep 2010) > New Revision: 51935 > > Added: > trunk/TMP/st/elementary/src/bin/test_drag.c trunk/edje/.gitignore > trunk/enlil/doc/.gitignore > Removed: > trunk/enlil/doc/Makefile.in > Modified: > trunk/TMP/st/elementary/.gitignore > trunk/TMP/st/elementary/src/bin/Makefile.am > trunk/TMP/st/elementary/src/bin/test.c > trunk/TMP/st/elementary/src/bin/test_entry.c > trunk/TMP/st/elementary/src/bin/test_gengrid.c > trunk/TMP/st/elementary/src/edje_externals/elm_notify.c > trunk/TMP/st/elementary/src/lib/elm_cnp_helper.c > trunk/TMP/st/elementary/src/lib/elm_entry.c > trunk/TMP/st/elementary/src/lib/elm_priv.h > trunk/ecore/src/lib/ecore_x/xlib/ecore_x_drawable.c > trunk/ecore/src/lib/ecore_x/xlib/ecore_x_selection.c > trunk/ecore/src/lib/ecore_x/xlib/ecore_x_window.c > trunk/edje/src/lib/Edje.h trunk/edje/src/lib/edje_cache.c > trunk/edje/src/lib/edje_entry.c trunk/edje/src/lib/edje_private.h > trunk/edje/src/lib/edje_util.c > > Modified: trunk/TMP/st/elementary/.gitignore > =================================================================== > --- trunk/TMP/st/elementary/.gitignore 2010-09-06 23:36:40 UTC (rev > 51934) > +++ trunk/TMP/st/elementary/.gitignore 2010-09-07 06:56:16 UTC (rev > 51935) > @@ -1,5 +1,5 @@ > +*.lo > *.o > -*.lo > *.la > .libs > .deps > @@ -30,3 +30,14 @@ > /ltmain.sh > /missing > /stamp-h1 > +core > +cscope.out > +doc/elementary.dox > +elementary.spec > +m4/libtool.m4 > +m4/ltoptions.m4 > +m4/ltsugar.m4 > +m4/ltversion.m4 > +m4/lt~obsolete.m4 > +src/lib/Elementary.h > +tags > > Modified: trunk/TMP/st/elementary/src/bin/Makefile.am > =================================================================== > --- trunk/TMP/st/elementary/src/bin/Makefile.am 2010-09-06 23:36:40 UTC > (rev 51934) > +++ trunk/TMP/st/elementary/src/bin/Makefile.am 2010-09-07 06:56:16 UTC > (rev 51935) > @@ -80,7 +80,8 @@ > test_floating.c \ > test_launcher.c \ > test_anim.c \ > -test_calendar.c > +test_calendar.c \ > +test_drag.c > > elementary_test_LDADD = $(top_builddir)/src/lib/libelementary.la > @ELEMENTARY_EWEATHER_LIBS@ > elementary_test_LDFLAGS = > > Modified: trunk/TMP/st/elementary/src/bin/test.c > =================================================================== > --- trunk/TMP/st/elementary/src/bin/test.c 2010-09-06 23:36:40 UTC > (rev 51934) > +++ trunk/TMP/st/elementary/src/bin/test.c 2010-09-07 06:56:16 UTC > (rev 51935) > @@ -81,6 +81,9 @@ > void test_launcher3(void *data, Evas_Object *obj, void *event_info); > void test_anim(void *data, Evas_Object *obj, void *event_info); > > +void test_drag_source(void *data, Evas_Object *obj, void *event_info); > +void test_drag_dest(void *data, Evas_Object *obj, void *event_info); > +void test_drag_genlist(void *data, Evas_Object *obj, void *event_info); > > struct elm_test > { > @@ -202,6 +205,10 @@ > > tests = NULL; > #define ADD_TEST(name_, cb_) elm_test_add(&tests, name_, cb_) > + ADD_TEST("Drag Source", test_drag_source); > + ADD_TEST("Drag Destination", test_drag_dest); > + ADD_TEST("Drag GenList", test_drag_genlist); > + > ADD_TEST("Bg Plain", test_bg_plain); > ADD_TEST("Bg Image", test_bg_image); > ADD_TEST("Icon Transparent", test_icon); > > Modified: trunk/TMP/st/elementary/src/bin/test_entry.c > =================================================================== > --- trunk/TMP/st/elementary/src/bin/test_entry.c 2010-09-06 > 23:36:40 UTC (rev 51934) > +++ trunk/TMP/st/elementary/src/bin/test_entry.c 2010-09-07 > 06:56:16 UTC (rev 51935) > @@ -579,7 +579,7 @@ > void > test_entry3(void *data, Evas_Object *obj, void *event_info) > { > - Evas_Object *win, *bg, *bx, *bx2, *bt, *en, *en_p, *sp; > + Evas_Object *win, *bg, *bx, *bx2, *bt, *en; > > win = elm_win_add(NULL, "entry3", ELM_WIN_BASIC); > elm_win_title_set(win, "Entry 3"); > @@ -1206,7 +1206,7 @@ > void > test_entry5(void *data, Evas_Object *obj, void *event_info) > { > - Evas_Object *win, *bg, *bx, *bx2, *bt, *en, *en_p, *sp; > + Evas_Object *win, *bg, *bx, *bx2, *bt, *en; > > win = elm_win_add(NULL, "entry5", ELM_WIN_BASIC); > elm_win_title_set(win, "Entry 5"); > > Modified: trunk/TMP/st/elementary/src/bin/test_gengrid.c > =================================================================== > --- trunk/TMP/st/elementary/src/bin/test_gengrid.c 2010-09-06 > 23:36:40 UTC (rev 51934) > +++ trunk/TMP/st/elementary/src/bin/test_gengrid.c 2010-09-07 > 06:56:16 UTC (rev 51935) > @@ -123,7 +123,7 @@ > { > Evas_Object *win, *bg, *grid; > static Testitem ti[144]; > - int i, j, n; > + int i, n; > char buf[PATH_MAX]; > const char *img[9] = > { > > Modified: trunk/TMP/st/elementary/src/edje_externals/elm_notify.c > =================================================================== > --- trunk/TMP/st/elementary/src/edje_externals/elm_notify.c > 2010-09-06 23:36:40 UTC (rev 51934) > +++ trunk/TMP/st/elementary/src/edje_externals/elm_notify.c > 2010-09-07 06:56:16 UTC (rev 51935) > @@ -105,7 +105,7 @@ > && param->type == EDJE_EXTERNAL_PARAM_TYPE_CHOICE) > { > Elm_Notify_Orient set = _orient_get(param->s); > - if (set == ELM_NOTIFY_ORIENT_LAST) return; > + if (set == ELM_NOTIFY_ORIENT_LAST) return EINA_FALSE; > elm_notify_orient_set(obj, set); > return EINA_TRUE; > } > > Modified: trunk/TMP/st/elementary/src/lib/elm_cnp_helper.c > =================================================================== > --- trunk/TMP/st/elementary/src/lib/elm_cnp_helper.c 2010-09-06 > 23:36:40 UTC (rev 51934) > +++ trunk/TMP/st/elementary/src/lib/elm_cnp_helper.c 2010-09-07 > 06:56:16 UTC (rev 51935) > @@ -1,4 +1,5 @@ > #include <stdbool.h> > +#include <sys/mman.h> > > #include <stdio.h> // debug > > @@ -26,6 +27,7 @@ > enum { > CNP_ATOM_TARGETS = 0, > CNP_ATOM_text_uri, > + CNP_ATOM_text_urilist, > CNP_ATOM_image_png, > CNP_ATOM_XELM, > CNP_ATOM_text_html_utf8, > @@ -118,6 +120,8 @@ > static int notify_handler_uri(struct _elm_cnp_selection *sel, > Ecore_X_Event_Selection_Notify *notify); > > +static struct pasteimage *pasteimage_alloc(const char *file); > +static bool pasteimage_append(struct pasteimage *pi, Evas_Object > *entry); > > static struct { > const char *name; > @@ -153,9 +157,17 @@ > notify_handler_uri, > 0 > }, > + [CNP_ATOM_text_urilist] = { > + "text/uri-list", > + ELM_SEL_IMAGE | ELM_SEL_MARKUP, > + uri_converter, > + NULL, > + notify_handler_uri, > + 0 > + }, > [CNP_ATOM_image_png] = { > "image/png", > - ELM_SEL_IMAGE | ELM_SEL_IMAGE, > + ELM_SEL_IMAGE, > png_converter, > NULL, > notify_handler_png, > @@ -240,9 +252,24 @@ > .set = ecore_x_selection_clipboard_set, > .clear = ecore_x_selection_clipboard_clear, > .request = ecore_x_selection_clipboard_request, > - } > + }, > + ARRAYINIT(ELM_SEL_XDND) { > + .debug = "XDnD", > + .ecore_sel = ECORE_X_SELECTION_XDND, > + .request = ecore_x_selection_xdnd_request, > + }, > }; > > +/* Data for DND in progress */ > +/* FIXME: BEtter name */ > +struct { > + int ntypes; > + const char **types; > + unsigned int textreq: 1; > + struct pasteimage *pi; > + int x,y; > +} savedtypes = { 0, NULL, 0, NULL, 0, 0 }; > + > static int _elm_cnp_init_count = 0; > /* Gah... who left this out of XAtoms.h */ > static Ecore_X_Atom clipboard_atom; > @@ -250,6 +277,8 @@ > Eina_List *pastedimages; > #endif > > +/* Stringshared, so I can just compare pointers later */ > +static const char *text_uri; > > Eina_Bool > elm_selection_set(enum _elm_sel_type selection, Evas_Object *widget, > @@ -319,7 +348,7 @@ > > sel->requestformat = format; > sel->requestwidget = widget; > - sel->request(elm_win_xwindow_get(top), > ECORE_X_SELECTION_TARGET_UTF8_STRING); > + sel->request(elm_win_xwindow_get(top), > ECORE_X_SELECTION_TARGET_TARGETS); > > return EINA_TRUE; > #else > @@ -345,7 +374,9 @@ > > ecore_event_handler_add(ECORE_X_EVENT_SELECTION_CLEAR, > selection_clear,NULL); > > ecore_event_handler_add(ECORE_X_EVENT_SELECTION_NOTIFY,selection_notify,NULL); > - return EINA_TRUE; > + > + text_uri = eina_stringshare_add("text/uri-list"); > + return EINA_TRUE; > } > > static Eina_Bool > @@ -433,6 +464,9 @@ > case ECORE_X_SELECTION_SECONDARY: > sel = selections + ELM_SEL_SECONDARY; > break; > + case ECORE_X_SELECTION_XDND: > + sel = selections + ELM_SEL_XDND; > + break; > default: > return ECORE_CALLBACK_PASS_ON; > } > @@ -486,11 +520,12 @@ > } > > static int > -png_converter(char *target __UNUSED__, void *data __UNUSED__, int size > __UNUSED__, > +png_converter(char *target __UNUSED__, void *data, int size, > void **data_ret __UNUSED__, int *size_ret __UNUSED__, > Ecore_X_Atom *ttype __UNUSED__, int *typesize __UNUSED__) > { > - return 1; > + cnp_debug("Png converter called\n"); > + return 1; > } > > /* > @@ -582,7 +617,9 @@ > char *str; > > data = notify->data; > + cnp_debug("Notify handler text %d %d > %p\n",data->format,data->length,data->data); > str = mark_up((char*)data->data, NULL); > + cnp_debug("String is %s (from %s)\n",str,data->data); > elm_entry_entry_insert(sel->requestwidget, str); > free(str); > > @@ -598,30 +635,60 @@ > Ecore_X_Event_Selection_Notify *notify) > { > Ecore_X_Selection_Data *data; > + Ecore_X_Selection_Data_Files *files; > struct pasteimage *pi; > - char entrytag[100]; > char *p; > > data = notify->data; > - p = (char *)data->data; > + printf("data->format is %d %p %p\n",data->format,notify,data); > + if (data->content == ECORE_X_SELECTION_CONTENT_FILES) > + { > + cnp_debug("got a files list\n"); > + files = notify->data; > + if (files->num_files > 1) > + { > + /* Don't handle many items */ > + cnp_debug("more then one file: Bailing\n"); > + return 0; > + } > + p = files->files[0]; > + } > + else > + p = (char *)data->data; > + if (!p) > + { > + cnp_debug("Couldn't find a file\n"); > + return 0; > + } > cnp_debug("Got %s\n",p); > - if (strncmp(p,"file://",7) != 0){ > - cnp_debug("Doesn't start with ;file; %s\n",p); > + if (strncmp(p,"file://",7) != 0) > + { > + cnp_debug("Doesn't start with ;file; %s\n",p); > return 0; > - } > + } > > p += strlen("file://"); > > - pi = calloc(1,sizeof(struct pasteimage)); > - snprintf(entrytag, sizeof(entrytag), "pasteimage-%p",pi); > - pi->tag = strdup(entrytag); > - pi->file = strndup(p,data->length - strlen("file://")); > + if (!strstr(p,"png")) > + { > + /* FIXME: Better test: Load it in evasw & see is probably best > */ > + cnp_debug("No png, ignoring\n"); > + if (savedtypes.textreq) savedtypes.textreq = 0; > + return 0; > + } > > - elm_entry_item_provider_append(sel->requestwidget, image_provider, > pi); > - pastedimages = eina_list_append(pastedimages, pi); > + pi = pasteimage_alloc(p); > > - snprintf(entrytag, sizeof(entrytag), "<item absize=240x180 > href=%s>",pi->tag); > - elm_entry_entry_insert(sel->requestwidget, entrytag); > + if (savedtypes.textreq) > + { > + savedtypes.textreq = 0; > + savedtypes.pi = pi; > + } > + else > + { > + pasteimage_append(pi, sel->requestwidget); > + savedtypes.pi = NULL; > + } > > return 0; > } > @@ -630,7 +697,64 @@ > notify_handler_png(struct _elm_cnp_selection *sel __UNUSED__, > Ecore_X_Event_Selection_Notify *notify __UNUSED__) > { > + Ecore_X_Selection_Data *data; > + char *fname,*tmppath; > + struct pasteimage *pi; > + int fd,len; > + void *map; > + > cnp_debug("got a png!\n"); > + data = notify->data; > + > + cnp_debug("Size if %d\n",data->length); > + > + /* generate tmp name */ > + tmppath = getenv("TMP"); > + if (!tmppath) tmppath = P_tmpdir; > + if (!tmppath) tmppath = "/tmp"; > + len = snprintf(NULL,0,"%s/%sXXXXXX",tmppath, "elmcnpimage-"); > + if (len < 0) return 1; > + len ++; > + fname = malloc(len); > + if (!fname) return 1; > + len = snprintf(fname,len,"%s/%sXXXXXX",tmppath, "elmcnpimage-"); > + > + fd = mkstemp(fname); > + if (fd < 0) > + { > + free(fname); > + return 1; > + } > + > + if (ftruncate(fd, data->length)) > + { > + perror("ftruncate"); > + unlink(fname); > + free(fname); > + close(fd); > + } > + > + map = mmap(NULL,data->length, PROT_READ|PROT_WRITE, MAP_SHARED, fd, > 0); > + if (map == MAP_FAILED) > + { > + perror("mmap"); > + unlink(fname); > + free(fname); > + close(fd); > + } > + memcpy(map, data->data, data->length); > + munmap(map,data->length); > + close(fd); > + > + /* FIXME: add clean up function */ > + // on_exit: file name + pid > + // need pid, as forked children inheret list :-( > + > + /* FIXME: Add to paste image data to clean up */ > + > + pi = pasteimage_alloc(fname); > + pasteimage_append(pi, sel->requestwidget); > + > return 0; > } > > @@ -642,11 +766,9 @@ > { > struct _elm_cnp_selection *sel; > > + cnp_debug("text converter\n"); > sel = selections + *(int *)data; > - if (!sel->active) > - { > - return 1; > - } > + if (!sel->active) return 1; > > if (sel->format == ELM_SEL_MARKUP){ > *data_ret = remove_tags(sel->selbuf, size_ret); > @@ -662,8 +784,8 @@ > } > > static int > -edje_converter(char *target __UNUSED__, void *data, int size __UNUSED__, > - void **data_ret, int *size_ret, Ecore_X_Atom *ttype > __UNUSED__, > +edje_converter(char *target __UNUSED__, void *data, int size __UNUSED__, > + void **data_ret, int *size_ret, Ecore_X_Atom *ttype > __UNUSED__, > int *typesize __UNUSED__) > { > struct _elm_cnp_selection *sel; > @@ -677,8 +799,8 @@ > > > static int > -html_converter(char *target __UNUSED__, void *data, int size __UNUSED__, > - void **data_ret, int *size_ret, Ecore_X_Atom *ttype > __UNUSED__, > +html_converter(char *target __UNUSED__, void *data, int size __UNUSED__, > + void **data_ret, int *size_ret, Ecore_X_Atom *ttype > __UNUSED__, > int *typesize __UNUSED__) > { > struct _elm_cnp_selection *sel; > @@ -691,8 +813,8 @@ > } > > static int > -uri_converter(char *target __UNUSED__, void *data, int size __UNUSED__, > - void **data_ret, int *size_ret, Ecore_X_Atom *ttype > __UNUSED__, > +uri_converter(char *target __UNUSED__, void *data, int size __UNUSED__, > + void **data_ret, int *size_ret, Ecore_X_Atom *ttype > __UNUSED__, > int *typesize __UNUSED__) > { > struct _elm_cnp_selection *sel; > @@ -734,6 +856,56 @@ > return NULL; > } > > + > +static struct pasteimage * > +pasteimage_alloc(const char *file) > +{ > + struct pasteimage *pi; > + int len; > + char *buf; > + > + pi = calloc(1,sizeof(struct pasteimage)); > + if (!pi) return NULL; > + > + len = snprintf(NULL, 0, "pasteimage-%p",pi); > + len ++; > + buf = malloc(len); > + if (!buf) > + { > + free(pi); > + return NULL; > + } > + snprintf(buf, len, "pasteimage-%p",pi); > + pi->tag = buf; > + > + if (file) > + { > + if (strstr(file,"file://")) file += strlen("file://"); > + pi->file = strdup(file); > + } > + > + return pi; > +} > + > +static bool > +pasteimage_append(struct pasteimage *pi, Evas_Object *entry) > +{ > + char entrytag[100]; > + > + if (!pi) return false; > + if (!entry) return false; > + > + /* FIXME: Need to do this per widget */ > + if (!pastedimages) > + elm_entry_item_provider_append(entry, image_provider, NULL); > + > + pastedimages = eina_list_append(pastedimages, pi); > + snprintf(entrytag, sizeof(entrytag),"<item absize=240x180 > href=%s>",pi->tag); > + elm_entry_entry_insert(entry, entrytag); > + > + return true; > +} > + > static void > entry_deleted(void *images __UNUSED__, Evas *e __UNUSED__, Evas_Object > *entry, void *unused __UNUSED__) > { > @@ -836,4 +1008,302 @@ > } > > > +/** > + * Drag & Drop functions > + */ > +struct dropable { > + Evas_Object *obj; > + /* FIXME: Cache window */ > + int types; /* FIXME */ > + elm_drop_cb dropcb; > + void *cbdata; > +}; > +/* FIXME: Way too many globals */ > +Eina_List *drops = NULL; > +Evas_Object *en; > +Ecore_Event_Handler *handler_pos, *handler_drop, *handler_enter; > + > +struct dropable *cur; > + > +static Eina_Bool > +_dnd_enter(void *data, int etype, void *ev) > +{ > + Ecore_X_Event_Xdnd_Enter *enter = ev; > + int i; > + > + /* Skip it */ > + if (enter->num_types == 0 || enter->types == NULL) return true; > + > + cnp_debug("Types\n"); > + savedtypes.ntypes = enter->num_types; > + if (savedtypes.types) free(savedtypes.types); > + savedtypes.types = malloc(sizeof(char *) * enter->num_types); > + for (i = 0 ; i < enter->num_types ; i ++) > + { > + savedtypes.types[i] = eina_stringshare_add(enter->types[i]); > + cnp_debug("Type is %s %p %p\n",enter->types[i], > + savedtypes.types[i],text_uri); > + if (savedtypes.types[i] == text_uri) > + { > + /* Request it, so we know what it is */ > + cnp_debug("Sending uri request\n"); > + savedtypes.textreq = 1; > + savedtypes.pi = NULL; /* FIXME: Free? */ > + ecore_x_selection_xdnd_request(enter->win, text_uri); > + } > + } > + > + /* FIXME: Find an object and make it current */ > + > + return true; > +} > + > +static Eina_Bool > +_dnd_drop(void *data, int etype, void *ev) > +{ > + struct _Ecore_X_Event_Xdnd_Drop *drop; > + struct dropable *dropable; > + Eina_List *l; > + Evas_Object *elmwin; > + Ecore_X_Window xwin; > + Elm_Drop_Data ddata; > + int x,y,w,h; > + > + int i,j; > + > + drop = ev; > + > + // check we still have something to drop > + if (!drops) return true; > + > + /* Find any widget in our window; then work out geometry rel to our > window */ > + for (l = drops ; l ; l = l->next) > + { > + dropable = l->data; > + xwin = > (Ecore_X_Window)ecore_evas_window_get(ecore_evas_ecore_evas_get( > + evas_object_evas_get( > + dropable->obj))); > + if (xwin == drop->win) > + break; > + > + > + } > + /* didn't find a window */ > + if (l == NULL) > + return true; > + > + > + /* Calculate real (widget relative) position */ > + // - window position > + // - widget position > + elmwin = elm_object_top_widget_get(dropable->obj); > + elm_win_screen_position_get(elmwin, &x, &y); > + savedtypes.x = drop->position.x - x; > + savedtypes.y = drop->position.y - y; > + > + printf("Drop position is %d,%d\n",savedtypes.x,savedtypes.y); > + > + for ( ; l ; l = l->next) > + { > + dropable = l->data; > + evas_object_geometry_get(dropable->obj, &x, &y, &w, &h); > + if (savedtypes.x >= x && savedtypes.y >= y && > + savedtypes.x < x + w && savedtypes.y < y + h) > + break; /* found! */ > + } > + > + if (!l) /* didn't find one */ > + return true; > + > + evas_object_geometry_get(dropable->obj, &x, &y, NULL, NULL); > + savedtypes.x -= x; > + savedtypes.y -= y; > + > + /* Find our type from the previous list */ > + for (i = 0 ; i < CNP_N_ATOMS ; i ++) > + { > + for (j = 0 ; j < savedtypes.ntypes ; j ++) > + { > + if (strcmp(savedtypes.types[j], atoms[i].name) == 0) > + { > + goto found; > + } > + } > + } > + > + cnp_debug("Didn't find a target\n"); > + return true; > + > +found: > + printf("Found a target we'd like: %s\n",atoms[i].name); > + cnp_debug("0x%x\n",xwin); > + > + if (i == CNP_ATOM_text_urilist) > + { > + printf("We found a URI...\n"); > + if (savedtypes.pi) > + { > + char entrytag[100]; > + /* FIXME: Paste immediately */ > + cnp_debug("paste immediately\n"); > + // pasteimage_append(savedtypes.pi, dropable->obj); > + > + ddata.x = savedtypes.x; > + ddata.y = savedtypes.y; > + ddata.format = ELM_SEL_IMAGE; > + /* FIXME: Need to do this per widget */ > + if (!pastedimages) > + elm_entry_item_provider_append(dropable->obj, image_provider, > NULL); > + pastedimages = eina_list_append(pastedimages, savedtypes.pi); > + snprintf(entrytag, sizeof(entrytag),"<item absize=240x180 > href=%s>",savedtypes.pi->tag); > + ddata.data = entrytag; > + cnp_debug("Insert %s\n",(char *)ddata.data); > + dropable->dropcb(dropable->cbdata, dropable->obj, &ddata); > + ecore_x_dnd_send_finished(); > + return true; > + } > + else if (savedtypes.textreq) > + { > + /* Already asked: Pretend we asked now, and paste > imediately when > + * it comes in */ > + savedtypes.textreq = 0; > + ecore_x_dnd_send_finished(); > + return true; > + } > + } > + > + selections[ELM_SEL_XDND].requestwidget = dropable->obj; > + selections[ELM_SEL_XDND].requestformat = ELM_SEL_MARKUP; > + selections[ELM_SEL_XDND].active = true; > + > + ecore_x_selection_xdnd_request(xwin, atoms[i].name); > + > + return true; > +} > +static Eina_Bool > +_dnd_position(void *data, int etype, void *ev){ > + struct _Ecore_X_Event_Xdnd_Position *pos; > + Ecore_X_Rectangle rect; > + > + pos = ev; > + > + printf("position: %3d,%3d, Action: %s\n", > + pos->position.x,pos->position.y, > + ecore_x_atom_name_get(pos->action)); > + > + /* Need to send a status back */ > + rect.x = pos->position.x - 5; > + rect.y = pos->position.y - 5; > + rect.width = 10; > + rect.height = 10; > + ecore_x_dnd_send_status(true, false, rect, pos->action); > + > + return true; > +} > + > + > +/** > + * Add a widget as drop target. > + */ > +Eina_Bool > +elm_drop_target_add(Evas_Object *obj, enum _elm_sel_type format, > + elm_drop_cb dropcb, void *cbdata) > +{ > + struct dropable *drop; > + Ecore_X_Window xwin; > + int first; > + > +printf("Adding %p as a drop target\n",obj); > + if (!obj) return false; > + if (!_elm_cnp_init_count) _elm_cnp_init(); > + > + > + /* Is this the first? */ > + first = (drops == NULL) ? 1 : 0; > + printf("Is first: %d\n",first); > + > + drop = calloc(1,sizeof(struct dropable)); > + if (!drop) return false; > + drop->dropcb = dropcb; > + drop->cbdata = cbdata; > + > + /* FIXME: Check it's not already there */ > + > + /* FIXME: Check for eina's deranged error method */ > + drops = eina_list_append(drops, drop); > + > + if (!drops/* || or other error */) > + { > + free(drop); > + return false; > + } > + > + drop->obj = obj; > + /* Something for now */ > + drop->types = 1; > + > + evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, > + /* I love C and varargs */ > + > (Evas_Object_Event_Cb)elm_drop_target_del, > + obj); > + /* FIXME: Handle resizes */ > + > + /* If not the first: We're done */ > + if (!first) return true; > + > +printf("Enabling DND\n"); > + xwin = > (Ecore_X_Window)ecore_evas_window_get(ecore_evas_ecore_evas_get( > + > evas_object_evas_get(obj))); > + ecore_x_dnd_aware_set(xwin, true); > + > + printf("Adding drop target calls\n"); > + handler_enter = ecore_event_handler_add(ECORE_X_EVENT_XDND_ENTER, > + _dnd_enter, NULL); > + handler_pos = ecore_event_handler_add(ECORE_X_EVENT_XDND_POSITION, > _dnd_position, NULL); > + handler_drop = ecore_event_handler_add(ECORE_X_EVENT_XDND_DROP, > _dnd_drop, NULL); > + > + return true; > +} > + > +Eina_Bool > +elm_drop_target_del(Evas_Object *obj){ > + struct dropable *drop,*del; > + Eina_List *item,*tmp; > + Ecore_X_Window xwin; > + > + del = NULL; > + EINA_LIST_FOREACH_SAFE(drops, item, tmp, drop) > + { > + if (drop->obj == obj) > + { > + drops = eina_list_remove_list(drops, tmp); > + del = drop; > + break; > + } > + } > + if (!del) return false; > + > + evas_object_event_callback_del(obj, EVAS_CALLBACK_FREE, > + > (Evas_Object_Event_Cb)elm_drop_target_del); > + free(drop); > + > + /* If still drops there: All fine.. continue */ > + if (drops != NULL) return true; > + > + printf("Disabling DND\n"); > + xwin = > (Ecore_X_Window)ecore_evas_window_get(ecore_evas_ecore_evas_get( > + > evas_object_evas_get(obj))); > + ecore_x_dnd_aware_set(xwin, false); > + > + printf("Adding drop target calls\n"); > + ecore_event_handler_del(handler_pos); > + ecore_event_handler_del(handler_drop); > + > + return true; > +} > + > + > + > +/* vim:set ts=8 sw=3 sts=3 expandtab cino=>5n-2f0^-2{2(0W1st0 :*/ > + > #endif > > Modified: trunk/TMP/st/elementary/src/lib/elm_entry.c > =================================================================== > --- trunk/TMP/st/elementary/src/lib/elm_entry.c 2010-09-06 23:36:40 UTC > (rev 51934) > +++ trunk/TMP/st/elementary/src/lib/elm_entry.c 2010-09-07 06:56:16 UTC > (rev 51935) > @@ -121,6 +121,7 @@ > Eina_Bool deferred_cur : 1; > Eina_Bool disabled : 1; > Eina_Bool context_menu : 1; > + Eina_Bool drag_selection_asked : 1; > }; > > struct _Elm_Entry_Context_Menu_Item > @@ -141,6 +142,8 @@ > }; > > static const char *widtype = NULL; > + > +static Eina_Bool _drag_drop_cb(void *data, Evas_Object *obj, > Elm_Drop_Data *); > static void _del_hook(Evas_Object *obj); > static void _theme_hook(Evas_Object *obj); > static void _disable_hook(Evas_Object *obj); > @@ -1185,7 +1188,8 @@ > Widget_Data *wd = elm_widget_data_get(data); > Ecore_X_Event_Selection_Notify *ev = event; > if (!wd) return ECORE_CALLBACK_PASS_ON; > - if (!wd->selection_asked) return ECORE_CALLBACK_PASS_ON; > + if (!wd->selection_asked && !wd->drag_selection_asked) > + return ECORE_CALLBACK_PASS_ON; > > if ((ev->selection == ECORE_X_SELECTION_CLIPBOARD) || > (ev->selection == ECORE_X_SELECTION_PRIMARY)) > @@ -1208,6 +1212,30 @@ > } > wd->selection_asked = EINA_FALSE; > } > + else if (ev->selection == ECORE_X_SELECTION_XDND) > + { > + Ecore_X_Selection_Data_Text *text_data; > + > + text_data = ev->data; > + if (text_data->data.content == ECORE_X_SELECTION_CONTENT_TEXT) > + { > + if (text_data->text) > + { > + char *txt = _text_to_mkup(text_data->text); > + > + if (txt) > + { > + /* Massive FIXME: this should be at the drag point > */ > + elm_entry_entry_insert(data, txt); > + free(txt); > + } > + } > + } > + wd->drag_selection_asked = EINA_FALSE; > + > + ecore_x_dnd_send_finished(); > + > + } > return ECORE_CALLBACK_PASS_ON; > } > > @@ -1227,6 +1255,30 @@ > return 1;*/ > return ECORE_CALLBACK_PASS_ON; > } > + > + > +static Eina_Bool > +_drag_drop_cb(void *data, Evas_Object *obj, Elm_Drop_Data *drop) > +{ > + Widget_Data *wd; > + Eina_Bool rv; > + > + wd = elm_widget_data_get(obj); > + > + if (!wd) return EINA_FALSE; > +printf("Inserting at (%d,%d) %s\n",drop->x,drop->y,(char*)drop->data); > + > + edje_object_part_text_cursor_copy(wd->ent, "elm.text", > + > EDJE_CURSOR_MAIN,/*->*/EDJE_CURSOR_USER); > + rv = edje_object_part_text_cursor_coord_set(wd->ent,"elm.text", > + > EDJE_CURSOR_MAIN,drop->x,drop->y); > + if (!rv) printf("Warning: Failed to position cursor: paste > anyway\n"); > + elm_entry_entry_insert(obj, drop->data); > + edje_object_part_text_cursor_copy(wd->ent, "elm.text", > + > EDJE_CURSOR_USER,/*->*/EDJE_CURSOR_MAIN); > + > + return EINA_TRUE; > +} > #endif > > static Evas_Object * > @@ -1347,6 +1399,8 @@ > ecore_event_handler_add(ECORE_X_EVENT_SELECTION_CLEAR, > _event_selection_clear, obj); > } > + > + elm_drop_target_add(obj, ELM_SEL_IMAGE | > ELM_SEL_MARKUP,_drag_drop_cb, NULL); > #endif > > entries = eina_list_prepend(entries, obj); > @@ -1628,6 +1682,12 @@ > elm_entry_entry_set(obj, t); > eina_stringshare_del(t); > _sizing_eval(obj); > + > + if (editable) > + elm_drop_target_add(obj, ELM_SEL_IMAGE | ELM_SEL_MARKUP, > + _drag_drop_cb, NULL); > + else > + elm_drop_target_del(obj); > } > > /** > @@ -2167,3 +2227,7 @@ > if (!ss) ss = strdup(""); > return ss; > } > + > + > + > +/* vim:set ts=8 sw=3 sts=3 expandtab cino=>5n-2f0^-2{2(0W1st0 :*/ > > Modified: trunk/TMP/st/elementary/src/lib/elm_priv.h > =================================================================== > --- trunk/TMP/st/elementary/src/lib/elm_priv.h 2010-09-06 23:36:40 UTC > (rev 51934) > +++ trunk/TMP/st/elementary/src/lib/elm_priv.h 2010-09-07 06:56:16 UTC > (rev 51935) > @@ -109,6 +109,7 @@ > ELM_SEL_PRIMARY, > ELM_SEL_SECONDARY, > ELM_SEL_CLIPBOARD, > + ELM_SEL_XDND, > > ELM_SEL_MAX, > }; > @@ -218,9 +219,24 @@ > void _elm_config_sub_init(void); > void _elm_config_shutdown(void); > > +/* FIXME: nash formatiing */ > +typedef struct Elm_Drop_Data { > + int x,y; > + > + enum _elm_sel_format format; > + void *data; > + int len; > +} Elm_Drop_Data; > + > +typedef Eina_Bool (*elm_drop_cb)(void *, Evas_Object *, Elm_Drop_Data > *data); > + > Eina_Bool elm_selection_set(enum _elm_sel_type selection, > Evas_Object *widget, enum _elm_sel_format format, const char *buf); > Eina_Bool elm_selection_clear(enum _elm_sel_type selection, > Evas_Object *widget); > Eina_Bool elm_selection_get(enum _elm_sel_type selection, enum > _elm_sel_format format, Evas_Object *widget); > +/* FIXME: Need a typedef for the callback */ > +Eina_Bool elm_drop_target_add(Evas_Object *widget, > + enum _elm_sel_type, elm_drop_cb, void *); > +Eina_Bool elm_drop_target_del(Evas_Object *widget); > > Eina_Bool _elm_dangerous_call_check(const char *call); > > > Modified: trunk/ecore/src/lib/ecore_x/xlib/ecore_x_drawable.c > =================================================================== > --- trunk/ecore/src/lib/ecore_x/xlib/ecore_x_drawable.c 2010-09-06 > 23:36:40 UTC (rev 51934) > +++ trunk/ecore/src/lib/ecore_x/xlib/ecore_x_drawable.c 2010-09-07 > 06:56:16 UTC (rev 51935) > @@ -12,7 +12,7 @@ > > /** > * Retrieves the geometry of the given drawable. > - * @param d The given drawable. > +* @param d The given drawable. > * @param x Pointer to an integer into which the X position is to be > stored. > * @param y Pointer to an integer into which the Y position is to be > stored. > * @param w Pointer to an integer into which the width is to be stored. > > Modified: trunk/ecore/src/lib/ecore_x/xlib/ecore_x_selection.c > =================================================================== > --- trunk/ecore/src/lib/ecore_x/xlib/ecore_x_selection.c > 2010-09-06 23:36:40 UTC (rev 51934) > +++ trunk/ecore/src/lib/ecore_x/xlib/ecore_x_selection.c > 2010-09-07 06:56:16 UTC (rev 51935) > @@ -719,7 +719,7 @@ > if (!strcmp(prs->target, target)) > { > sel = prs->parse(target, data, size, format); > - return sel; > + if (sel) return sel; > } > } > > @@ -851,6 +851,7 @@ > sel->text = (char *)data; > ECORE_X_SELECTION_DATA(sel)->length = size; > ECORE_X_SELECTION_DATA(sel)->content = > ECORE_X_SELECTION_CONTENT_TEXT; > + ECORE_X_SELECTION_DATA(sel)->data = data; > ECORE_X_SELECTION_DATA(sel)->free = > _ecore_x_selection_data_text_free; > return sel; > } /* _ecore_x_selection_parser_text */ > > Modified: trunk/ecore/src/lib/ecore_x/xlib/ecore_x_window.c > =================================================================== > --- trunk/ecore/src/lib/ecore_x/xlib/ecore_x_window.c 2010-09-06 > 23:36:40 UTC (rev 51934) > +++ trunk/ecore/src/lib/ecore_x/xlib/ecore_x_window.c 2010-09-07 > 06:56:16 UTC (rev 51935) > @@ -657,6 +657,13 @@ > > /** > * Retrieves the geometry of the given window. > + * > + * Note that the x & y coordingates are relative to your parent. In > + * particular for reparenting window managers - relative to you window > border. > + * If you want screen coordinates either walk the window tree to the > root, > + * else for ecore_evas applications see ecore_evas_geometry_get(). > Elementary > + * applications can use elm_win_screen_position_get(). > + * > * @param win The given window. > * @param x Pointer to an integer in which the X position is to be > stored. > * @param y Pointer to an integer in which the Y position is to be > stored. > > Modified: trunk/edje/src/lib/Edje.h > =================================================================== > --- trunk/edje/src/lib/Edje.h 2010-09-06 23:36:40 UTC (rev 51934) > +++ trunk/edje/src/lib/Edje.h 2010-09-07 06:56:16 UTC (rev 51935) > @@ -164,7 +164,11 @@ > { > EDJE_CURSOR_MAIN, > EDJE_CURSOR_SELECTION_BEGIN, > - EDJE_CURSOR_SELECTION_END > + EDJE_CURSOR_SELECTION_END, > + EDJE_CURSOR_PREEDIT_START, > + EDJE_CURSOR_PREEDIT_END, > + EDJE_CURSOR_USER, > + EDJE_CURSOR_USER_EXTRA, > // more later > }; > typedef enum _Edje_Cursor Edje_Cursor; > @@ -515,15 +519,16 @@ > EAPI void edje_object_part_text_select_begin > (const Evas_Object *obj, const char *part); > EAPI void edje_object_part_text_select_extend > (const Evas_Object *obj, const char *part); > > - EAPI Eina_Bool edje_object_part_text_cursor_next > (const Evas_Object *obj, const char *part, Edje_Cursor cur); > - EAPI Eina_Bool edje_object_part_text_cursor_prev > (const Evas_Object *obj, const char *part, Edje_Cursor cur); > - EAPI Eina_Bool edje_object_part_text_cursor_up > (const Evas_Object *obj, const char *part, Edje_Cursor cur); > - EAPI Eina_Bool edje_object_part_text_cursor_down > (const Evas_Object *obj, const char *part, Edje_Cursor cur); > - EAPI void edje_object_part_text_cursor_begin_set > (const Evas_Object *obj, const char *part, Edje_Cursor cur); > - EAPI void edje_object_part_text_cursor_end_set > (const Evas_Object *obj, const char *part, Edje_Cursor cur); > - EAPI void edje_object_part_text_cursor_copy > (const Evas_Object *obj, const char *part, Edje_Cursor src, Edje_Cursor > dst); > - EAPI void edje_object_part_text_cursor_line_begin_set > (const Evas_Object *obj, const char *part, Edje_Cursor cur); > - EAPI void edje_object_part_text_cursor_line_end_set > (const Evas_Object *obj, const char *part, Edje_Cursor cur); > + EAPI Eina_Bool edje_object_part_text_cursor_next > (Evas_Object *obj, const char *part, Edje_Cursor cur); > + EAPI Eina_Bool edje_object_part_text_cursor_prev > (Evas_Object *obj, const char *part, Edje_Cursor cur); > + EAPI Eina_Bool edje_object_part_text_cursor_up > (Evas_Object *obj, const char *part, Edje_Cursor cur); > + EAPI Eina_Bool edje_object_part_text_cursor_down > (Evas_Object *obj, const char *part, Edje_Cursor cur); > + EAPI void edje_object_part_text_cursor_begin_set > (Evas_Object *obj, const char *part, Edje_Cursor cur); > + EAPI void edje_object_part_text_cursor_end_set > (Evas_Object *obj, const char *part, Edje_Cursor cur); > + EAPI void edje_object_part_text_cursor_copy > (Evas_Object *obj, const char *part, Edje_Cursor src, Edje_Cursor dst); > + EAPI void edje_object_part_text_cursor_line_begin_set > (Evas_Object *obj, const char *part, Edje_Cursor cur); > + EAPI void edje_object_part_text_cursor_line_end_set > (Evas_Object *obj, const char *part, Edje_Cursor cur); > + EAPI Eina_Bool edje_object_part_text_cursor_coord_set > (Evas_Object *obj, const char *part, Edje_Cursor cur, Evas_Coord x, > Evas_Coord y); > EAPI Eina_Bool edje_object_part_text_cursor_is_format_get > (const Evas_Object *obj, const char *part, Edje_Cursor cur); > EAPI Eina_Bool > edje_object_part_text_cursor_is_visible_format_get(const Evas_Object > *obj, const char *part, Edje_Cursor cur); > EAPI const char *edje_object_part_text_cursor_content_get > (const Evas_Object *obj, const char *part, Edje_Cursor cur); > > Modified: trunk/edje/src/lib/edje_cache.c > =================================================================== > --- trunk/edje/src/lib/edje_cache.c 2010-09-06 23:36:40 UTC (rev > 51934) > +++ trunk/edje/src/lib/edje_cache.c 2010-09-07 06:56:16 UTC (rev > 51935) > @@ -544,8 +544,6 @@ > /** > * @brief Clean the file cache. > * > - * @return The file cache size. > - * > * This function cleans the file cache entries, but keeps this cache's > * size to the last value set. > * > @@ -615,8 +613,6 @@ > /** > * @brief Clean the collection cache. > * > - * @return The collection cache size. > - * > * This function cleans the collection cache, but keeps this cache's > * size to the last value set. > * > > Modified: trunk/edje/src/lib/edje_entry.c > =================================================================== > --- trunk/edje/src/lib/edje_entry.c 2010-09-06 23:36:40 UTC (rev > 51934) > +++ trunk/edje/src/lib/edje_entry.c 2010-09-07 06:56:16 UTC (rev > 51935) > @@ -44,6 +44,8 @@ > Evas_Object *cursor_fg; > Evas_Textblock_Cursor *cursor; > Evas_Textblock_Cursor *sel_start, *sel_end; > + Evas_Textblock_Cursor *cursor_user, *cursor_user_extra; > + Evas_Textblock_Cursor *preedit_start, *preedit_end; > Eina_List *sel; > Eina_List *anchors; > Eina_List *anchorlist; > @@ -2152,17 +2154,31 @@ > { > Entry *en = rp->entry_data; > if (!en) return NULL; > + > switch (cur) > { > case EDJE_CURSOR_MAIN: > return en->cursor; > - break; > case EDJE_CURSOR_SELECTION_BEGIN: > return en->sel_start; > - break; > case EDJE_CURSOR_SELECTION_END: > return en->sel_end; > - break; > + case EDJE_CURSOR_PREEDIT_START: > + if (!en->preedit_start) > + en->preedit_start = > evas_object_textblock_cursor_new(rp->object); > + return en->preedit_start; > + case EDJE_CURSOR_PREEDIT_END: > + if (!en->preedit_end) > + en->preedit_end = > evas_object_textblock_cursor_new(rp->object); > + return en->preedit_end; > + case EDJE_CURSOR_USER: > + if (!en->cursor_user) > + en->cursor_user = > evas_object_textblock_cursor_new(rp->object); > + return en->cursor_user; > + case EDJE_CURSOR_USER_EXTRA: > + if (!en->cursor_user_extra) > + en->cursor_user_extra = > evas_object_textblock_cursor_new(rp->object); > + return en->cursor_user_extra; > default: > break; > } > @@ -2418,7 +2434,17 @@ > _edje_entry_real_part_configure(rp); > } > > + > Eina_Bool > +_edje_entry_cursor_coord_set(Edje_Real_Part *rp, Edje_Cursor cur, > + Evas_Coord x, Evas_Coord y) > +{ > + Evas_Textblock_Cursor *c = _cursor_get(rp, cur); > + if (!c) return EINA_FALSE; > + return evas_textblock_cursor_char_coord_set(c, x, y); > +} > + > +Eina_Bool > _edje_entry_cursor_is_format_get(Edje_Real_Part *rp, Edje_Cursor cur) > { > Evas_Textblock_Cursor *c = _cursor_get(rp, cur); > @@ -2603,3 +2629,5 @@ > return ECORE_CALLBACK_DONE; > } > #endif > + > +/* vim:set ts=8 sw=3 sts=3 expandtab cino=>5n-2f0^-2{2(0W1st0 :*/ > > Modified: trunk/edje/src/lib/edje_private.h > =================================================================== > --- trunk/edje/src/lib/edje_private.h 2010-09-06 23:36:40 UTC (rev > 51934) > +++ trunk/edje/src/lib/edje_private.h 2010-09-07 06:56:16 UTC (rev > 51935) > @@ -1731,6 +1731,7 @@ > void _edje_entry_cursor_end(Edje_Real_Part *rp, Edje_Cursor cur); > void _edje_entry_cursor_line_begin(Edje_Real_Part *rp, Edje_Cursor cur); > void _edje_entry_cursor_line_end(Edje_Real_Part *rp, Edje_Cursor cur); > +Eina_Bool _edje_entry_cursor_coord_set(Edje_Real_Part *rp, Edje_Cursor > cur, int x, int y); > Eina_Bool _edje_entry_cursor_is_format_get(Edje_Real_Part *rp, > Edje_Cursor cur); > Eina_Bool _edje_entry_cursor_is_visible_format_get(Edje_Real_Part *rp, > Edje_Cursor cur); > const char *_edje_entry_cursor_content_get(Edje_Real_Part *rp, > Edje_Cursor cur); > > Modified: trunk/edje/src/lib/edje_util.c > =================================================================== > --- trunk/edje/src/lib/edje_util.c 2010-09-06 23:36:40 UTC (rev > 51934) > +++ trunk/edje/src/lib/edje_util.c 2010-09-07 06:56:16 UTC (rev > 51935) > @@ -1854,7 +1854,7 @@ > * @param part The part name > */ > EAPI Eina_Bool > -edje_object_part_text_cursor_next(const Evas_Object *obj, const char > *part, Edje_Cursor cur) > +edje_object_part_text_cursor_next(Evas_Object *obj, const char *part, > Edje_Cursor cur) > { > Edje *ed; > Edje_Real_Part *rp; > @@ -1877,7 +1877,7 @@ > * @param part The part name > */ > EAPI Eina_Bool > -edje_object_part_text_cursor_prev(const Evas_Object *obj, const char > *part, Edje_Cursor cur) > +edje_object_part_text_cursor_prev(Evas_Object *obj, const char *part, > Edje_Cursor cur) > { > Edje *ed; > Edje_Real_Part *rp; > @@ -1900,7 +1900,7 @@ > * @param part The part name > */ > EAPI Eina_Bool > -edje_object_part_text_cursor_up(const Evas_Object *obj, const char > *part, Edje_Cursor cur) > +edje_object_part_text_cursor_up(Evas_Object *obj, const char *part, > Edje_Cursor cur) > { > Edje *ed; > Edje_Real_Part *rp; > @@ -1923,7 +1923,7 @@ > * @param part The part name > */ > EAPI Eina_Bool > -edje_object_part_text_cursor_down(const Evas_Object *obj, const char > *part, Edje_Cursor cur) > +edje_object_part_text_cursor_down(Evas_Object *obj, const char *part, > Edje_Cursor cur) > { > Edje *ed; > Edje_Real_Part *rp; > @@ -1946,7 +1946,7 @@ > * @param part The part name > */ > EAPI void > -edje_object_part_text_cursor_begin_set(const Evas_Object *obj, const > char *part, Edje_Cursor cur) > +edje_object_part_text_cursor_begin_set(Evas_Object *obj, const char > *part, Edje_Cursor cur) > { > Edje *ed; > Edje_Real_Part *rp; > @@ -1968,7 +1968,7 @@ > * @param part The part name > */ > EAPI void > -edje_object_part_text_cursor_end_set(const Evas_Object *obj, const char > *part, Edje_Cursor cur) > +edje_object_part_text_cursor_end_set(Evas_Object *obj, const char *part, > Edje_Cursor cur) > { > Edje *ed; > Edje_Real_Part *rp; > @@ -1990,7 +1990,7 @@ > * @param part The part name > */ > EAPI void > -edje_object_part_text_cursor_copy(const Evas_Object *obj, const char > *part, Edje_Cursor src, Edje_Cursor dst) > +edje_object_part_text_cursor_copy(Evas_Object *obj, const char *part, > Edje_Cursor src, Edje_Cursor dst) > { > Edje *ed; > Edje_Real_Part *rp; > @@ -2012,7 +2012,7 @@ > * @param part The part name > */ > EAPI void > -edje_object_part_text_cursor_line_begin_set(const Evas_Object *obj, > const char *part, Edje_Cursor cur) > +edje_object_part_text_cursor_line_begin_set(Evas_Object *obj, const char > *part, Edje_Cursor cur) > { > Edje *ed; > Edje_Real_Part *rp; > @@ -2034,7 +2034,7 @@ > * @param part The part name > */ > EAPI void > -edje_object_part_text_cursor_line_end_set(const Evas_Object *obj, const > char *part, Edje_Cursor cur) > +edje_object_part_text_cursor_line_end_set(Evas_Object *obj, const char > *part, Edje_Cursor cur) > { > Edje *ed; > Edje_Real_Part *rp; > @@ -2050,6 +2050,36 @@ > } > > /** > + * Position the given cursor to a X,Y position. > + * > + * This is frequently used with the user cursor. > + * > + * @param obj An Edje object. > + * @param part The part containing the object. > + * @param cur The cursor to adjust. > + * @param x X Coordinate. > + * @param y Y Coordinate. > + * @return True on success, false on error. > + */ > +EAPI Eina_Bool > +edje_object_part_text_cursor_coord_set(Evas_Object *obj, const char > *part, > + Edje_Cursor cur, Evas_Coord x, Evas_Coord y) > +{ > + Edje *ed; > + Edje_Real_Part *rp; > + > + ed = _edje_fetch(obj); > + if ((!ed) || (!part)) return EINA_FALSE; > + rp = _edje_real_part_recursive_get(ed, (char *)part); > + if (!rp) return EINA_FALSE; > + if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE) > + { > + return _edje_entry_cursor_coord_set(rp, cur, x, y); > + } > + return EINA_FALSE; > +} > + > +/** > * @brief XX > * > * @param obj A valid Evas_Object handle > @@ -2109,7 +2139,7 @@ > > ed = _edje_fetch(obj); > if ((!ed) || (!part)) return NULL; > - rp = _edje_real_part_recursive_get(ed, (char *)part); > + rp = _edje_real_part_recursive_get(ed, part); > if (!rp) return NULL; > if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE) > { > @@ -4928,3 +4958,6 @@ > if (!es) return NULL; > return es->str; > } > + > + > +/* vim:set ts=8 sw=3 sts=3 expandtab cino=>5n-2f0^-2{2(0W1st0 :*/ > > > ------------------------------------------------------------------------------ > This SF.net Dev2Dev email is sponsored by: > > Show off your parallel programming skills. > Enter the Intel(R) Threading Challenge 2010. > http://p.sf.net/sfu/intel-thread-sfd > _______________________________________________ > enlightenment-svn mailing list > enlightenment-...@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/enlightenment-svn > ------------------------------------------------------------------------------ This SF.net Dev2Dev email is sponsored by: Show off your parallel programming skills. Enter the Intel(R) Threading Challenge 2010. http://p.sf.net/sfu/intel-thread-sfd _______________________________________________ enlightenment-devel mailing list enlightenment-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-devel