efm now supports text/x-moz-url dnd operations when using efl 1.8

This commit is contained in:
Mike Blumenkrantz 2013-05-29 13:43:55 +01:00
parent db20c24837
commit bc86c5a8b5
5 changed files with 91 additions and 42 deletions

View File

@ -1,3 +1,7 @@
2013-05-29 Mike Blumenkrantz
* added dnd support for text/x-moz-url
2013-05-24 Christopher Michael 2013-05-24 Christopher Michael
* added support for hotplugging monitors in randr code * added support for hotplugging monitors in randr code

1
NEWS
View File

@ -141,6 +141,7 @@ Improvements:
* improve efm mouse movement detection for icons * improve efm mouse movement detection for icons
* add check for vmware window in another spot to disable key remapping * add check for vmware window in another spot to disable key remapping
* border menu now has top-level item to set borderless state * border menu now has top-level item to set borderless state
* added dnd support for text/x-moz-url
Fixes: Fixes:
* IBar menu didn't allow to configure different icon sources, show contents menu even on empty IBar. * IBar menu didn't allow to configure different icon sources, show contents menu even on empty IBar.

View File

@ -61,7 +61,7 @@ static Eina_Stringshare **_e_dnd_types[] =
{ {
&_type_text_uri_list, &_type_text_uri_list,
&_type_xds, &_type_xds,
//&_type_text_x_moz_url, &_type_text_x_moz_url,
//&_type_enlightenment_x_file, //&_type_enlightenment_x_file,
NULL NULL
}; };
@ -1430,42 +1430,16 @@ _e_dnd_cb_event_dnd_selection(void *data __UNUSED__, int type __UNUSED__, void *
} }
else if (_type_text_x_moz_url == _xdnd->type) else if (_type_text_x_moz_url == _xdnd->type)
{ {
/* FIXME: Create a ecore x parser for this type */ #if (ECORE_VERSION_MAJOR > 1) || (ECORE_VERSION_MINOR >= 8)
Ecore_X_Selection_Data *sdata; Ecore_X_Selection_Data_X_Moz_Url *sel;
Eina_List *l = NULL; E_Dnd_X_Moz_Url moz;
char file[PATH_MAX];
char *text;
int size;
sdata = ev->data; sel = ev->data;
text = (char *)sdata->data; moz.links = sel->links;
size = MIN(sdata->length, PATH_MAX - 1); moz.link_names = sel->link_names;
/* A moz url _shall_ contain a space */ _xdnd->data = &moz;
/* FIXME: The data is two-byte unicode. Somewhere it
* is written that the url and the text is separated by
* a space, but it seems like they are separated by
* newline
*/
for (i = 0; i < size; i++)
{
file[i] = text[i];
// printf("'%d-%c' ", text[i], text[i]);
/*
if (text[i] == ' ')
{
file[i] = '\0';
break;
}
*/
}
// printf("\n");
file[i] = '\0';
// printf("file: %d \"%s\"\n", i, file);
l = eina_list_append(l, file);
_xdnd->data = l;
_e_drag_xdnd_end(ev->win, _xdnd->x, _xdnd->y); _e_drag_xdnd_end(ev->win, _xdnd->x, _xdnd->y);
eina_list_free(l); #endif
} }
else else
_e_drag_xdnd_end(ev->win, _xdnd->x, _xdnd->y); _e_drag_xdnd_end(ev->win, _xdnd->x, _xdnd->y);

View File

@ -13,6 +13,7 @@ typedef struct _E_Event_Dnd_Enter E_Event_Dnd_Enter;
typedef struct _E_Event_Dnd_Move E_Event_Dnd_Move; typedef struct _E_Event_Dnd_Move E_Event_Dnd_Move;
typedef struct _E_Event_Dnd_Leave E_Event_Dnd_Leave; typedef struct _E_Event_Dnd_Leave E_Event_Dnd_Leave;
typedef struct _E_Event_Dnd_Drop E_Event_Dnd_Drop; typedef struct _E_Event_Dnd_Drop E_Event_Dnd_Drop;
typedef struct E_Dnd_X_Moz_Url E_Dnd_X_Moz_Url;
#else #else
#ifndef E_DND_H #ifndef E_DND_H
@ -99,6 +100,12 @@ struct _E_Event_Dnd_Drop
int x, y; int x, y;
}; };
struct E_Dnd_X_Moz_Url
{
Eina_Inarray *links;
Eina_Inarray *link_names;
};
EINTERN int e_dnd_init(void); EINTERN int e_dnd_init(void);
EINTERN int e_dnd_shutdown(void); EINTERN int e_dnd_shutdown(void);

View File

@ -488,6 +488,7 @@ static const char *_e_fm2_mime_inode_directory = NULL;
static const char *_e_fm2_mime_app_desktop = NULL; static const char *_e_fm2_mime_app_desktop = NULL;
static const char *_e_fm2_mime_app_edje = NULL; static const char *_e_fm2_mime_app_edje = NULL;
static const char *_e_fm2_mime_text_uri_list = NULL; static const char *_e_fm2_mime_text_uri_list = NULL;
static const char *_e_fm2_mime_xmozurl = NULL;
static const char *_e_fm2_xds = NULL; static const char *_e_fm2_xds = NULL;
static Eina_List *_e_fm_handlers = NULL; static Eina_List *_e_fm_handlers = NULL;
@ -496,6 +497,7 @@ static const char **_e_fm2_dnd_types[] =
{ {
&_e_fm2_mime_text_uri_list, &_e_fm2_mime_text_uri_list,
&_e_fm2_xds, &_e_fm2_xds,
&_e_fm2_mime_xmozurl,
NULL NULL
}; };
@ -843,6 +845,7 @@ e_fm2_init(void)
_e_fm2_mime_app_edje = eina_stringshare_add("application/x-extension-edj"); _e_fm2_mime_app_edje = eina_stringshare_add("application/x-extension-edj");
_e_fm2_mime_text_uri_list = eina_stringshare_add("text/uri-list"); _e_fm2_mime_text_uri_list = eina_stringshare_add("text/uri-list");
_e_fm2_xds = eina_stringshare_add("XdndDirectSave0"); _e_fm2_xds = eina_stringshare_add("XdndDirectSave0");
_e_fm2_mime_xmozurl = eina_stringshare_add("text/x-moz-url");
_e_fm2_favorites_thread = ecore_thread_run(_e_fm2_favorites_thread_cb, _e_fm2_favorites_thread = ecore_thread_run(_e_fm2_favorites_thread_cb,
_e_fm2_thread_cleanup_cb, _e_fm2_thread_cleanup_cb,
@ -871,6 +874,7 @@ e_fm2_shutdown(void)
eina_stringshare_replace(&_e_fm2_mime_app_edje, NULL); eina_stringshare_replace(&_e_fm2_mime_app_edje, NULL);
eina_stringshare_replace(&_e_fm2_mime_text_uri_list, NULL); eina_stringshare_replace(&_e_fm2_mime_text_uri_list, NULL);
eina_stringshare_replace(&_e_fm2_xds, NULL); eina_stringshare_replace(&_e_fm2_xds, NULL);
eina_stringshare_replace(&_e_fm2_mime_xmozurl, NULL);
E_FREE_LIST(_e_fm_handlers, ecore_event_handler_del); E_FREE_LIST(_e_fm_handlers, ecore_event_handler_del);
@ -1617,7 +1621,7 @@ e_fm2_window_object_get(Evas_Object *obj)
EAPI void EAPI void
e_fm2_window_object_set(Evas_Object *obj, E_Object *eobj) e_fm2_window_object_set(Evas_Object *obj, E_Object *eobj)
{ {
const char *drop[] = {"text/uri-list", "XdndDirectSave0"}; const char *drop[] = {"text/uri-list", "text/x-moz-url", "XdndDirectSave0"};
EFM_SMART_CHECK(); EFM_SMART_CHECK();
sd->eobj = eobj; sd->eobj = eobj;
@ -1628,7 +1632,7 @@ e_fm2_window_object_set(Evas_Object *obj, E_Object *eobj)
_e_fm2_cb_dnd_move, _e_fm2_cb_dnd_move,
_e_fm2_cb_dnd_leave, _e_fm2_cb_dnd_leave,
_e_fm2_cb_dnd_selection_notify, _e_fm2_cb_dnd_selection_notify,
drop, 2, drop, 3,
sd->x, sd->y, sd->w, sd->h); sd->x, sd->y, sd->w, sd->h);
e_drop_handler_responsive_set(sd->drop_handler); e_drop_handler_responsive_set(sd->drop_handler);
e_drop_handler_xds_set(sd->drop_handler, _e_fm2_cb_dnd_drop); e_drop_handler_xds_set(sd->drop_handler, _e_fm2_cb_dnd_drop);
@ -6701,14 +6705,14 @@ _e_fm2_cb_dnd_selection_notify_post_mount_timer(E_Fm2_Icon *ic)
static void static void
_e_fm2_cb_dnd_selection_notify(void *data, const char *type, void *event) _e_fm2_cb_dnd_selection_notify(void *data, const char *type, void *event)
{ {
E_Fm2_Smart_Data *sd; E_Fm2_Smart_Data *sd = data;
E_Event_Dnd_Drop *ev; E_Event_Dnd_Drop *ev = event;
E_Fm2_Icon *ic; E_Fm2_Icon *ic;
Eina_List *fsel, *l, *ll, *il, *isel = NULL; Eina_List *fsel, *l, *ll, *il, *isel = NULL;
char buf[PATH_MAX]; char buf[PATH_MAX];
const char *fp; const char *fp;
Evas_Coord ox, oy;
Evas_Object *obj; Evas_Object *obj;
Evas_Coord ox, oy, x, y;
int adjust_icons = 0; int adjust_icons = 0;
char dirpath[PATH_MAX]; char dirpath[PATH_MAX];
char *args = NULL; char *args = NULL;
@ -6717,10 +6721,67 @@ _e_fm2_cb_dnd_selection_notify(void *data, const char *type, void *event)
Eina_Bool lnk = EINA_FALSE, memerr = EINA_FALSE, mnt = EINA_FALSE; Eina_Bool lnk = EINA_FALSE, memerr = EINA_FALSE, mnt = EINA_FALSE;
E_Fm2_Device_Mount_Op *mop = NULL; E_Fm2_Device_Mount_Op *mop = NULL;
sd = data;
ev = event;
if (!_e_fm2_dnd_type_implemented(type)) return; if (!_e_fm2_dnd_type_implemented(type)) return;
#if (ECORE_VERSION_MAJOR > 1) || (ECORE_VERSION_MINOR >= 8)
if (type == _e_fm2_mime_xmozurl)
{
const char **name, *s;
Efreet_Desktop *desktop;
E_Dnd_X_Moz_Url *moz = ev->data;
unsigned int x = 0;
EINA_INARRAY_FOREACH(moz->link_names, name)
{
int p;
s = *name;
for (p = 0; p < 7; p++)
{
Eina_Bool done = EINA_FALSE;
if (!s[p]) break;
if ((s[p] == ':') && (s[p + 1] == '/'))
{
s = ecore_file_file_get(s);
done = EINA_TRUE;
}
if (done) break;
}
if (!s[0]) s = ecore_file_file_get(*name);
if (!s)
{
s = *(char**)eina_inarray_nth(moz->links, x);
s = ecore_file_file_get(s);
}
/* FIXME: should this filename be sanitized somehow? */
if (sd->drop_icon && sd->drop_after == -1)
{
//into drop_icon
if (S_ISDIR(sd->drop_icon->info.statinfo.st_mode))
{
if (sd->drop_icon->info.link)
snprintf(dirpath, sizeof(dirpath), "%s/Link to %s.desktop", sd->drop_icon->info.link, s);
else
snprintf(dirpath, sizeof(dirpath), "%s/%s/Link to %s.desktop", sd->realpath, sd->drop_icon->info.file, s);
}
else
snprintf(buf, sizeof(buf), "%s/Link to %s.desktop", sd->realpath, s);
}
else
snprintf(buf, sizeof(buf), "%s/Link to %s.desktop", sd->realpath, s);
desktop = efreet_desktop_empty_new(buf);
desktop->type = EFREET_DESKTOP_TYPE_LINK;
snprintf(buf, sizeof(buf), "Link to %s", *name);
desktop->name = strdup(buf);
desktop->icon = strdup("text-html");
desktop->url = strdup(*(char**)eina_inarray_nth(moz->links, x));
efreet_desktop_save(desktop);
efreet_desktop_free(desktop);
x++;
}
return;
}
#endif
fsel = e_fm2_uri_path_list_get(ev->data); fsel = e_fm2_uri_path_list_get(ev->data);
fp = eina_list_data_get(fsel); fp = eina_list_data_get(fsel);
if (fp && sd->realpath && ((sd->drop_all) || (!sd->drop_icon))) if (fp && sd->realpath && ((sd->drop_all) || (!sd->drop_icon)))
@ -6780,6 +6841,8 @@ _e_fm2_cb_dnd_selection_notify(void *data, const char *type, void *event)
*/ */
if (sd->drop_all) /* drop arbitrarily into the dir */ if (sd->drop_all) /* drop arbitrarily into the dir */
{ {
Evas_Coord x, y;
/* move file into this fm dir */ /* move file into this fm dir */
for (ll = fsel, il = isel; ll; ll = eina_list_next(ll), il = eina_list_next(il)) for (ll = fsel, il = isel; ll; ll = eina_list_next(ll), il = eina_list_next(il))
{ {