forked from enlightenment/enlightenment
efm:
- new code for mime handling, an inheritance model, working good check the e_fileman_mime.c for the idea. - rewrite of several parts of efm to handle the new model. - it isnt fully functional, but this commit is a first step. - actions are working for the menu generation only, they dont execute right now. - lots of comments, docs on the source. * **WARNING** this is code in progress expect it to brake things * SVN revision: 20445
This commit is contained in:
parent
6dc01cf950
commit
c98217f129
|
@ -85,6 +85,7 @@ e_fileman.h \
|
|||
e_fileman_smart.h \
|
||||
e_fileman_file.h \
|
||||
e_fileman_icon.h \
|
||||
e_fileman_mime.h \
|
||||
e_widget.h \
|
||||
e_widget_check.h \
|
||||
e_widget_radio.h \
|
||||
|
@ -208,6 +209,7 @@ e_fileman.c \
|
|||
e_fileman_smart.c \
|
||||
e_fileman_file.c \
|
||||
e_fileman_icon.c \
|
||||
e_fileman_mime.c \
|
||||
e_widget.c \
|
||||
e_widget_check.c \
|
||||
e_widget_radio.c \
|
||||
|
|
|
@ -1,6 +1,52 @@
|
|||
/*
|
||||
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
|
||||
*/
|
||||
/* e_fileman.c
|
||||
* ===========
|
||||
*
|
||||
* fileman is the FILE MANager for e.
|
||||
* its composed of several entities:
|
||||
* (check each .c for more reference)
|
||||
*
|
||||
* +-------------+-+
|
||||
* | x x x x |s|
|
||||
* | | |
|
||||
* | x x x x | |
|
||||
* | o| |
|
||||
* | x x x x | |
|
||||
* +-------------+-+
|
||||
* l-s-----------i-i
|
||||
*
|
||||
*
|
||||
* graphically:
|
||||
* o = icon_canvas
|
||||
* x = icon
|
||||
* s = scrollframe
|
||||
*
|
||||
* internally:
|
||||
* a fileman has a fileman_smart.
|
||||
*
|
||||
* fileman_smart
|
||||
* =============
|
||||
* has a list of fileman_icon of that directory (files).
|
||||
* is created above an icon_canvas
|
||||
* has a list of fileman_file of that directory?
|
||||
* has a list of icons
|
||||
*
|
||||
* fileman_icon
|
||||
* ============
|
||||
* a fileman_icon has a fileman_file associated to it.
|
||||
*
|
||||
* fileman_file
|
||||
* ============
|
||||
* a fileman_file has a fileman_mime_entry
|
||||
*
|
||||
* fileman_mime
|
||||
* ============
|
||||
* a fileman_mime_entry has a list of fileman_mime_actions
|
||||
*
|
||||
*/
|
||||
|
||||
#include "e.h"
|
||||
|
||||
/****
|
||||
|
|
|
@ -51,9 +51,10 @@ e_fm_file_new(const char *filename)
|
|||
file->mtime = st.st_mtime;
|
||||
file->ctime = st.st_ctime;
|
||||
|
||||
/* FIXME clean this for the new mime handler */
|
||||
if (S_ISDIR(file->mode)){
|
||||
file->type |= E_FM_FILE_TYPE_DIRECTORY;
|
||||
file->mime = "directory";
|
||||
//file->mime = "directory";
|
||||
}
|
||||
else if (S_ISREG(file->mode))
|
||||
file->type = E_FM_FILE_TYPE_FILE;
|
||||
|
@ -72,7 +73,7 @@ e_fm_file_new(const char *filename)
|
|||
file->preview_funcs[3] = e_fm_file_is_eap;
|
||||
file->preview_funcs[4] = NULL;
|
||||
|
||||
if(!file->mime)
|
||||
/*if(!file->mime)
|
||||
{
|
||||
ext = strrchr(file->name, '.');
|
||||
if (ext)
|
||||
|
@ -85,7 +86,8 @@ e_fm_file_new(const char *filename)
|
|||
}
|
||||
else
|
||||
file->mime = "unknown";
|
||||
}
|
||||
}*/
|
||||
e_fm_mime_set(file);
|
||||
D(("e_fm_file_new: %s\n", filename));
|
||||
return file;
|
||||
|
||||
|
|
|
@ -28,7 +28,7 @@ struct _E_Fm_File
|
|||
|
||||
int type;
|
||||
|
||||
Evas *evas;
|
||||
Evas *evas; /* what is it used for? the icon theme? use the mime instead */
|
||||
Evas_Object *icon_object;
|
||||
/* Do we need those?
|
||||
* Evas_Object *image_object;
|
||||
|
@ -37,7 +37,7 @@ struct _E_Fm_File
|
|||
|
||||
char *path; /* full name with path */
|
||||
char *name; /* file name without parent directories */
|
||||
char *mime; /* mimetype (just the extension, beginning with dot) */
|
||||
E_Fm_Mime_Entry *mime;
|
||||
|
||||
dev_t device; /* ID of device containing file */
|
||||
ino_t inode; /* inode number */
|
||||
|
@ -51,7 +51,7 @@ struct _E_Fm_File
|
|||
time_t mtime; /* time of last modification */
|
||||
time_t ctime; /* time of last status change */
|
||||
|
||||
E_Fm_File_Preview_Function *preview_funcs;
|
||||
E_Fm_File_Preview_Function *preview_funcs; /* FIXME the preview should be part of mime.c */
|
||||
};
|
||||
|
||||
EAPI E_Fm_File *e_fm_file_new (const char *filename);
|
||||
|
|
|
@ -498,20 +498,13 @@ _e_fm_icon_icon_mime_get(E_Smart_Data *sd)
|
|||
{
|
||||
char part[PATH_MAX];
|
||||
|
||||
sd->image_object = edje_object_add(sd->evas);
|
||||
|
||||
// since a mime is set with every creation of an E_Fm_File its existence isn´t checked here
|
||||
if(sd->file->type == E_FM_FILE_TYPE_DIRECTORY)
|
||||
e_theme_edje_object_set(sd->image_object, "base/theme/fileman", "icons/fileman/folder");
|
||||
|
||||
else if(e_fm_file_has_mime(sd->file,"unknown"))
|
||||
e_theme_edje_object_set(sd->image_object, "base/theme/fileman", "icons/fileman/file");
|
||||
else
|
||||
{
|
||||
snprintf(part, PATH_MAX, "icons/fileman/%s", (sd->file->mime + 1));
|
||||
if (!e_theme_edje_object_set(sd->image_object, "base/theme/fileman", part))
|
||||
e_theme_edje_object_set(sd->image_object, "base/theme/fileman", "icons/fileman/file");
|
||||
}
|
||||
sd->image_object = edje_object_add(sd->evas);
|
||||
/* since a mime is set with every creation of an E_Fm_File its existence isnt checked here */
|
||||
|
||||
snprintf(part, PATH_MAX, "icons/fileman/%s", (sd->file->mime->name));
|
||||
if (!e_theme_edje_object_set(sd->image_object, "base/theme/fileman", part))
|
||||
e_theme_edje_object_set(sd->image_object, "base/theme/fileman", "icons/fileman/file");
|
||||
|
||||
evas_object_show(sd->image_object);
|
||||
edje_extern_object_min_size_set(sd->image_object, sd->iw, sd->ih);
|
||||
edje_extern_object_max_size_set(sd->image_object, sd->iw, sd->ih);
|
||||
|
|
|
@ -0,0 +1,358 @@
|
|||
/*
|
||||
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
|
||||
*/
|
||||
|
||||
/* e_fileman_mime.c
|
||||
* ================
|
||||
* will provide basic function for mime types, mime handlers
|
||||
* and operations with them, also a small app to actually
|
||||
* edit the mime database
|
||||
*
|
||||
*
|
||||
* abstract types
|
||||
* ==============================
|
||||
* the abstract types will be in a hierarchy way, all the leafs will heritate the parents
|
||||
* info (actions: run,open,edit,whatever)
|
||||
*
|
||||
* properties:
|
||||
* mime: each leaf might have a mime type associated to it ? it wouldnt be neccesary for now,
|
||||
* efm will handle only file names, in the future might visulize other file types?
|
||||
*
|
||||
*
|
||||
* file
|
||||
* +---- data
|
||||
* +---- image
|
||||
* +---- jpg
|
||||
* :mime image/jpeg
|
||||
* +---- png
|
||||
* +---- audio
|
||||
* +---- mp3
|
||||
* +---- ogg
|
||||
* +---- wav
|
||||
* +---- directory
|
||||
* +---- special
|
||||
* +---- executable
|
||||
* +---- a.out
|
||||
* +---- java class
|
||||
* +---- scripts
|
||||
*
|
||||
*
|
||||
*
|
||||
* file recognition for above types
|
||||
* ================================
|
||||
* 1. by regex
|
||||
* 2. by suffix
|
||||
* 3. by type (directory,hidden,etc)
|
||||
* 4. properties (fifo,socket,executables,etc)
|
||||
*
|
||||
* icons visuals
|
||||
* =============
|
||||
* 1. by properties (read,write,execute)
|
||||
* 2. user defined (video directory, audo directory)
|
||||
* 3. by file contents (if a dir is full of mp3, might be an audio dir)
|
||||
*
|
||||
*
|
||||
*
|
||||
* actions
|
||||
* =======
|
||||
* each mime entry will have a list of possible actions to be taken for it
|
||||
* to define the command to execute there are several tokens like:
|
||||
*
|
||||
* %f => file input
|
||||
* %d => current directory
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
#include "e.h"
|
||||
|
||||
static char * _e_fm_mime_suffix_get(char *filename);
|
||||
static void _e_fm_mime_action_append(E_Fm_Mime_Entry *entry, char *action_name);
|
||||
|
||||
static int init_count = 0;
|
||||
static Evas_List *entries = NULL;
|
||||
static Evas_List *actions = NULL;
|
||||
|
||||
/* returns the saved mime tree or a default one */
|
||||
int
|
||||
e_fm_mime_init(void)
|
||||
{
|
||||
E_Fm_Mime_Entry *root;
|
||||
E_Fm_Mime_Entry *entry;
|
||||
E_Fm_Mime_Entry *l1,*l2,*l3;
|
||||
E_Fm_Mime_Action *action;
|
||||
|
||||
if(init_count)
|
||||
return 1;
|
||||
|
||||
|
||||
/* actions */
|
||||
/***********/
|
||||
action = E_NEW(E_Fm_Mime_Action,1);
|
||||
action->name = strdup("gimp_edit");
|
||||
action->label = strdup("Edit with Gimp");
|
||||
action->cmd = strdup("gimp %f");
|
||||
action->multiple = 1;
|
||||
actions = evas_list_append(actions,action);
|
||||
|
||||
action = E_NEW(E_Fm_Mime_Action,1);
|
||||
action->name = strdup("xmms_enqueue");
|
||||
action->label = strdup("Add to XMMS Queue");
|
||||
action->cmd = strdup("xmms -e %f");
|
||||
action->multiple = 1;
|
||||
actions = evas_list_append(actions,action);
|
||||
|
||||
action = E_NEW(E_Fm_Mime_Action,1);
|
||||
action->name = strdup("xmms_play");
|
||||
action->label = strdup("Play with XMMS");
|
||||
action->cmd = strdup("xmms %f");
|
||||
action->multiple = 0;
|
||||
actions = evas_list_append(actions,action);
|
||||
|
||||
/* entries */
|
||||
/***********/
|
||||
root = E_NEW(E_Fm_Mime_Entry,1);
|
||||
root->name = strdup("file");
|
||||
root->label = strdup("Unkown File");
|
||||
root->level = 0;
|
||||
entries = evas_list_append(entries,root);
|
||||
/* data */
|
||||
entry = E_NEW(E_Fm_Mime_Entry,1);
|
||||
entry->name = strdup("data");
|
||||
entry->label = strdup("Data File");
|
||||
entry->parent = root;
|
||||
entry->level = 1;
|
||||
entries = evas_list_append(entries,entry);
|
||||
l1 = entry;
|
||||
{
|
||||
/* image */
|
||||
entry = E_NEW(E_Fm_Mime_Entry,1);
|
||||
entry->name = strdup("image");
|
||||
entry->label = strdup("Image File");
|
||||
entry->parent = l1;
|
||||
entry->level = 2;
|
||||
_e_fm_mime_action_append(entry, "gimp_edit");
|
||||
l2 = entry;
|
||||
{
|
||||
/* jpg */
|
||||
entry = E_NEW(E_Fm_Mime_Entry, 1);
|
||||
entry->name = strdup("jpg");
|
||||
entry->label = strdup("JPEG Image");
|
||||
entry->parent = l2;
|
||||
entry->level = 3;
|
||||
entry->suffix = strdup("jpg");
|
||||
entries = evas_list_append(entries,entry);
|
||||
|
||||
/* png */
|
||||
entry = E_NEW(E_Fm_Mime_Entry, 1);
|
||||
entry->name = strdup("png");
|
||||
entry->label = strdup("PNG Image");
|
||||
entry->parent = l2;
|
||||
entry->level = 3;
|
||||
entry->suffix = strdup("png");
|
||||
entries = evas_list_append(entries,entry);
|
||||
|
||||
}
|
||||
/* audio */
|
||||
entry = E_NEW(E_Fm_Mime_Entry,1);
|
||||
entry->name = strdup("audio");
|
||||
entry->label = strdup("Audio File");
|
||||
entry->parent = l1;
|
||||
entry->level = 2;
|
||||
_e_fm_mime_action_append(entry, "xmms_play");
|
||||
_e_fm_mime_action_append(entry, "xmms_enqueue");
|
||||
l2 = entry;
|
||||
{
|
||||
/* mp3 */
|
||||
entry = E_NEW(E_Fm_Mime_Entry, 1);
|
||||
entry->name = strdup("mp3");
|
||||
entry->label = strdup("MP3 Audio");
|
||||
entry->parent = l2;
|
||||
entry->level = 3;
|
||||
entry->suffix = strdup("mp3");
|
||||
entries = evas_list_append(entries,entry);
|
||||
|
||||
/* ogg */
|
||||
entry = E_NEW(E_Fm_Mime_Entry, 1);
|
||||
entry->name = strdup("ogg");
|
||||
entry->label = strdup("OGG Audio");
|
||||
entry->parent = l2;
|
||||
entry->level = 3;
|
||||
entry->suffix = strdup("ogg");
|
||||
entries = evas_list_append(entries,entry);
|
||||
|
||||
/* wav */
|
||||
entry = E_NEW(E_Fm_Mime_Entry, 1);
|
||||
entry->name = strdup("wav");
|
||||
entry->label = strdup("WAV Audio");
|
||||
entry->parent = l2;
|
||||
entry->level = 3;
|
||||
entry->suffix = strdup("wav");
|
||||
entries = evas_list_append(entries,entry);
|
||||
}
|
||||
}
|
||||
/* directory */
|
||||
entry = E_NEW(E_Fm_Mime_Entry,1);
|
||||
entry->name = strdup("folder");
|
||||
entry->label = strdup("Folder");
|
||||
entry->type = E_FM_FILE_TYPE_DIRECTORY;
|
||||
entry->parent = root;
|
||||
entry->level = 1;
|
||||
entries = evas_list_append(entries,entry);
|
||||
l1 = entry;
|
||||
|
||||
|
||||
|
||||
init_count++;
|
||||
return 1;
|
||||
}
|
||||
|
||||
void
|
||||
e_fm_mime_shutdwon(void)
|
||||
{
|
||||
init_count--;
|
||||
}
|
||||
|
||||
/* returns the shortest root for both entries @e1 and @e2
|
||||
* FIXME can be implemented faster?
|
||||
*/
|
||||
E_Fm_Mime_Entry *
|
||||
e_fm_mime_common(E_Fm_Mime_Entry *e1, E_Fm_Mime_Entry *e2)
|
||||
{
|
||||
|
||||
E_Fm_Mime_Entry *tmp;
|
||||
int i;
|
||||
int count;
|
||||
|
||||
/* take the lowest on the tree */
|
||||
/* set the e1 upper, e2 lower */
|
||||
if(e1->level > e2->level)
|
||||
{
|
||||
count = e1->level - e2->level;
|
||||
tmp = e1;
|
||||
e1 = e2;
|
||||
e2 = tmp;
|
||||
}
|
||||
else
|
||||
count = e2->level - e1-> level;
|
||||
|
||||
/* first equal levels */
|
||||
for(i = 0; i < count; i++)
|
||||
{
|
||||
e2 = e2->parent;
|
||||
}
|
||||
/* get up on the tree until we find the same parent */
|
||||
for(i = e1->level; i >= 0; i--)
|
||||
{
|
||||
if(!strcmp(e1->name,e2->name))
|
||||
return e1;
|
||||
e1 = e1->parent;
|
||||
e2 = e2->parent;
|
||||
}
|
||||
/* this should never happen */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* returns the shortest root of a list of mime entries @mis
|
||||
* FIXME can be implemented faster? delete the list while iterating
|
||||
*/
|
||||
E_Fm_Mime_Entry *
|
||||
e_fm_mime_list(Evas_List *mis)
|
||||
{
|
||||
E_Fm_Mime_Entry *entry;
|
||||
Evas_List *l;
|
||||
|
||||
entry = (E_Fm_Mime_Entry *)mis->data;
|
||||
for(l = mis->next; l; l = l->next)
|
||||
{
|
||||
E_Fm_Mime_Entry *eme;
|
||||
|
||||
eme = (E_Fm_Mime_Entry *)l->data;
|
||||
entry = e_fm_mime_common(entry,eme);
|
||||
}
|
||||
return entry;
|
||||
}
|
||||
|
||||
|
||||
/* returns the mime entry for a file */
|
||||
void
|
||||
e_fm_mime_set(E_Fm_File *file)
|
||||
{
|
||||
Evas_List *l;
|
||||
for(l = entries; l; l = l->next)
|
||||
{
|
||||
E_Fm_Mime_Entry *entry;
|
||||
|
||||
entry = (E_Fm_Mime_Entry *)l->data;
|
||||
/* FIXME add all the possible comparision, suffix,regexp,flags,etc */
|
||||
|
||||
if(entry->suffix)
|
||||
{
|
||||
char *suffix;
|
||||
|
||||
suffix = _e_fm_mime_suffix_get(file->name);
|
||||
if(!suffix)
|
||||
continue;
|
||||
if(!strcmp(suffix,entry->suffix))
|
||||
{
|
||||
printf("found by suffix %s\n", suffix);
|
||||
file->mime = entry;
|
||||
}
|
||||
free(suffix);
|
||||
}
|
||||
if(entry->type)
|
||||
{
|
||||
if(entry->type == file->type)
|
||||
file->mime = entry;
|
||||
}
|
||||
}
|
||||
/* if it doesnt match anything set to the root */
|
||||
if(!file->mime)
|
||||
file->mime = (E_Fm_Mime_Entry*)entries->data;
|
||||
}
|
||||
|
||||
/* will call the command of an @action for the list of @files */
|
||||
void
|
||||
e_fm_mime_action_call(Evas_List *files, E_Fm_Mime_Action *action)
|
||||
{
|
||||
printf("executing\n");
|
||||
}
|
||||
|
||||
|
||||
/* subsystem functions */
|
||||
/***********************/
|
||||
|
||||
static void
|
||||
_e_fm_mime_action_append(E_Fm_Mime_Entry *entry, char *action_name)
|
||||
{
|
||||
Evas_List *l;
|
||||
|
||||
for(l = actions; l; l = l->next)
|
||||
{
|
||||
E_Fm_Mime_Action *action;
|
||||
|
||||
action = (E_Fm_Mime_Action *)l->data;
|
||||
if(!strcmp(action->name, action_name))
|
||||
{
|
||||
entry->actions = evas_list_append(entry->actions, action);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static char *
|
||||
_e_fm_mime_suffix_get(char *filename)
|
||||
{
|
||||
char *suf;
|
||||
|
||||
suf = strrchr(filename, '.');
|
||||
if (suf)
|
||||
{
|
||||
suf++;
|
||||
suf = strdup(suf);
|
||||
return suf;
|
||||
}
|
||||
return NULL;
|
||||
}
|
|
@ -0,0 +1,44 @@
|
|||
/*
|
||||
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
|
||||
*/
|
||||
|
||||
#ifdef E_TYPEDEFS
|
||||
|
||||
typedef struct _E_Fm_Mime_Entry E_Fm_Mime_Entry;
|
||||
typedef struct _E_Fm_Mime_Action E_Fm_Mime_Action;
|
||||
|
||||
#else
|
||||
#ifndef E_FILEMAN_MIME_H
|
||||
#define E_FILEMAN_MIME_H
|
||||
|
||||
|
||||
struct _E_Fm_Mime_Entry
|
||||
{
|
||||
char *name;
|
||||
char *label;
|
||||
int level; /* the level on the three for easy search/comparsion */
|
||||
E_Fm_Mime_Entry *parent;
|
||||
Evas_List *actions;
|
||||
/* the autodetect features */
|
||||
char *suffix;
|
||||
int type;
|
||||
};
|
||||
|
||||
struct _E_Fm_Mime_Action
|
||||
{
|
||||
char *name;
|
||||
char *label;
|
||||
char *cmd;
|
||||
int multiple; /* support for multiple files at once */
|
||||
};
|
||||
|
||||
EAPI int e_fm_mime_init(void);
|
||||
EAPI void e_fm_mime_shutdwon(void);
|
||||
EAPI void e_fm_mime_set(E_Fm_File *file);
|
||||
EAPI void e_fm_mime_action_call(Evas_List *files, E_Fm_Mime_Action *action);
|
||||
EAPI E_Fm_Mime_Entry *e_fm_mime_common(E_Fm_Mime_Entry *e1, E_Fm_Mime_Entry *e2);
|
||||
EAPI E_Fm_Mime_Entry *e_fm_mime_list(Evas_List *mis);
|
||||
|
||||
|
||||
#endif
|
||||
#endif
|
|
@ -167,7 +167,14 @@ static void _e_fm_dir_meta_free(E_Fm_Dir_Metadata *m);
|
|||
static int _e_fm_dir_meta_save(E_Fm_Smart_Data *sd);
|
||||
static void _e_fm_dir_meta_fill(E_Fm_Dir_Metadata *m, E_Fm_Smart_Data *sd);
|
||||
|
||||
static int _e_fm_init_assoc(E_Fm_Smart_Data *sd);
|
||||
static void _e_fm_menu_action_display(E_Fm_Smart_Data *sd, Evas_Coord dx, Evas_Coord dy, unsigned int timestamp);
|
||||
static void _e_fm_menu_context_display(E_Fm_Smart_Data *sd, Evas_Coord dx, Evas_Coord dy, unsigned int timestamp);
|
||||
static void _e_fm_menu_actions(void *data, E_Menu *m, E_Menu_Item *mi);
|
||||
|
||||
|
||||
static int _e_fm_init_assoc(E_Fm_Smart_Data *sd);
|
||||
|
||||
|
||||
static Ecore_Event_Handler *e_fm_drag_mouse_up_handler = NULL;
|
||||
static Ecore_Event_Handler *e_fm_drag_mouse_move_handler = NULL;
|
||||
static double e_fm_grab_time = 0;
|
||||
|
@ -220,6 +227,7 @@ e_fm_init(void)
|
|||
NEWI("vw", view, EET_T_INT);
|
||||
NEWL("fl", files, _e_fm_icon_meta_edd);
|
||||
|
||||
e_fm_mime_init();
|
||||
E_EVENT_FM_RECONFIGURE = ecore_event_type_new();
|
||||
E_EVENT_FM_DIRECTORY_CHANGE = ecore_event_type_new();
|
||||
return 1;
|
||||
|
@ -461,10 +469,15 @@ e_fm_icon_create(void *data)
|
|||
|
||||
if(icon->state.selected)
|
||||
e_fm_icon_signal_emit(icon->icon_obj, "clicked", "");
|
||||
icon->state.visible = 1;
|
||||
|
||||
return icon->icon_obj;
|
||||
}
|
||||
|
||||
|
||||
/* called when the icon on the icon_canvas is destroyed
|
||||
* (disappears from the viewport)
|
||||
*/
|
||||
EAPI void
|
||||
e_fm_icon_destroy(Evas_Object *obj, void *data)
|
||||
{
|
||||
|
@ -473,6 +486,7 @@ e_fm_icon_destroy(Evas_Object *obj, void *data)
|
|||
icon = data;
|
||||
e_thumb_generate_end(icon->file->path);
|
||||
evas_object_del(icon->icon_obj);
|
||||
icon->state.visible = 0;
|
||||
}
|
||||
|
||||
/* local subsystem functions */
|
||||
|
@ -682,10 +696,10 @@ _e_fm_smart_del(Evas_Object *object)
|
|||
}
|
||||
|
||||
evas_event_freeze(evas_object_evas_get(object));
|
||||
while (sd->files)
|
||||
while (sd->icons)
|
||||
{
|
||||
_e_fm_file_free(sd->files->data);
|
||||
sd->files = evas_list_remove_list(sd->files, sd->files);
|
||||
_e_fm_file_free(sd->icons->data);
|
||||
sd->icons = evas_list_remove_list(sd->icons, sd->icons);
|
||||
}
|
||||
|
||||
evas_object_del(sd->selection.band.obj);
|
||||
|
@ -884,7 +898,7 @@ _e_fm_file_delete(E_Fm_Icon *icon)
|
|||
return;
|
||||
}
|
||||
|
||||
icon->sd->files = evas_list_remove(icon->sd->files, icon);
|
||||
icon->sd->icons = evas_list_remove(icon->sd->icons, icon);
|
||||
e_icon_canvas_freeze(icon->sd->layout);
|
||||
e_icon_canvas_unpack(icon->icon_obj);
|
||||
e_icon_canvas_thaw(icon->sd->layout);
|
||||
|
@ -1393,13 +1407,13 @@ _e_fm_menu_arrange_cb(void *data, E_Menu *m, E_Menu_Item *mi)
|
|||
switch (e_menu_item_num_get(mi))
|
||||
{
|
||||
case E_FILEMAN_CANVAS_ARRANGE_NAME:
|
||||
sd->files = evas_list_sort(sd->files, evas_list_count(sd->files), _e_fm_files_sort_name_cb);
|
||||
sd->icons = evas_list_sort(sd->icons, evas_list_count(sd->icons), _e_fm_files_sort_name_cb);
|
||||
sd->arrange = E_FILEMAN_CANVAS_ARRANGE_NAME;
|
||||
_e_fm_redraw(sd);
|
||||
break;
|
||||
|
||||
case E_FILEMAN_CANVAS_ARRANGE_MODTIME:
|
||||
sd->files = evas_list_sort(sd->files, evas_list_count(sd->files), _e_fm_files_sort_modtime_cb);
|
||||
sd->icons = evas_list_sort(sd->icons, evas_list_count(sd->icons), _e_fm_files_sort_modtime_cb);
|
||||
sd->arrange = E_FILEMAN_CANVAS_ARRANGE_MODTIME;
|
||||
_e_fm_redraw(sd);
|
||||
break;
|
||||
|
@ -1489,10 +1503,10 @@ _e_fm_dir_set(E_Fm_Smart_Data *sd, const char *dir)
|
|||
_e_fm_selections_clear(sd);
|
||||
|
||||
/* Remove old files */
|
||||
while (sd->files)
|
||||
while (sd->icons)
|
||||
{
|
||||
_e_fm_file_free(sd->files->data);
|
||||
sd->files = evas_list_remove_list(sd->files, sd->files);
|
||||
_e_fm_file_free(sd->icons->data);
|
||||
sd->icons = evas_list_remove_list(sd->icons, sd->icons);
|
||||
}
|
||||
e_icon_canvas_reset(sd->layout);
|
||||
|
||||
|
@ -1516,7 +1530,7 @@ _e_fm_dir_set(E_Fm_Smart_Data *sd, const char *dir)
|
|||
icon->icon_obj = e_fm_icon_add(sd->evas);
|
||||
icon->sd = sd;
|
||||
e_fm_icon_file_set(icon->icon_obj, icon->file);
|
||||
sd->files = evas_list_prepend(sd->files, icon);
|
||||
sd->icons = evas_list_prepend(sd->icons, icon);
|
||||
|
||||
e_icon_canvas_pack(sd->layout, icon->icon_obj, e_fm_icon_create, e_fm_icon_destroy, icon);
|
||||
evas_object_event_callback_add(icon->icon_obj, EVAS_CALLBACK_MOUSE_DOWN, _e_fm_icon_mouse_down_cb, icon);
|
||||
|
@ -1566,7 +1580,7 @@ _e_fm_dir_files_get(void *data)
|
|||
icon->icon_obj = e_fm_icon_add(sd->evas);
|
||||
icon->sd = sd;
|
||||
e_fm_icon_file_set(icon->icon_obj, icon->file);
|
||||
sd->files = evas_list_append(sd->files, icon);
|
||||
sd->icons = evas_list_append(sd->icons, icon);
|
||||
evas_object_event_callback_add(icon->icon_obj, EVAS_CALLBACK_MOUSE_DOWN, _e_fm_icon_mouse_down_cb, icon);
|
||||
evas_object_event_callback_add(icon->icon_obj, EVAS_CALLBACK_MOUSE_UP, _e_fm_icon_mouse_up_cb, icon);
|
||||
evas_object_event_callback_add(icon->icon_obj, EVAS_CALLBACK_MOUSE_IN, _e_fm_icon_mouse_in_cb, icon);
|
||||
|
@ -1707,18 +1721,18 @@ _e_fm_dir_monitor_cb(void *data, Ecore_File_Monitor *ecore_file_monitor,
|
|||
evas_object_event_callback_add(icon->icon_obj, EVAS_CALLBACK_MOUSE_IN, _e_fm_icon_mouse_in_cb, icon);
|
||||
evas_object_event_callback_add(icon->icon_obj, EVAS_CALLBACK_MOUSE_OUT, _e_fm_icon_mouse_out_cb, icon);
|
||||
e_icon_canvas_thaw(sd->layout);
|
||||
sd->files = evas_list_append(sd->files, icon);
|
||||
sd->icons = evas_list_append(sd->icons, icon);
|
||||
_e_fm_redraw(sd);
|
||||
break;
|
||||
|
||||
case ECORE_FILE_EVENT_DELETED_FILE:
|
||||
case ECORE_FILE_EVENT_DELETED_DIRECTORY:
|
||||
for (l = sd->files; l; l = l->next)
|
||||
for (l = sd->icons; l; l = l->next)
|
||||
{
|
||||
icon = l->data;
|
||||
if (!strcmp(icon->file->path, path))
|
||||
{
|
||||
sd->files = evas_list_remove_list(sd->files, l);
|
||||
sd->icons = evas_list_remove_list(sd->icons, l);
|
||||
e_icon_canvas_freeze(sd->layout);
|
||||
e_icon_canvas_unpack(icon->icon_obj);
|
||||
e_icon_canvas_thaw(sd->layout);
|
||||
|
@ -1754,7 +1768,7 @@ _e_fm_selections_clear(E_Fm_Smart_Data *sd)
|
|||
Evas_List *l;
|
||||
|
||||
D(("_e_fm_selections_clear:\n"));
|
||||
for (l = sd->selection.files; l; l = l->next)
|
||||
for (l = sd->selection.icons; l; l = l->next)
|
||||
{
|
||||
E_Fm_Icon *icon;
|
||||
|
||||
|
@ -1762,10 +1776,11 @@ _e_fm_selections_clear(E_Fm_Smart_Data *sd)
|
|||
e_fm_icon_signal_emit(icon->icon_obj, "unclicked", "");
|
||||
icon->state.selected = 0;
|
||||
}
|
||||
sd->selection.files = evas_list_free(sd->selection.files);
|
||||
sd->selection.icons = evas_list_free(sd->selection.icons);
|
||||
sd->selection.band.files = evas_list_free(sd->selection.band.files);
|
||||
sd->selection.current.file = NULL;
|
||||
sd->selection.current.ptr = NULL;
|
||||
sd->selection.mime = NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -1775,8 +1790,26 @@ _e_fm_selections_add(E_Fm_Icon *icon, Evas_List *icon_ptr)
|
|||
icon->sd->selection.current.ptr = icon_ptr;
|
||||
if (icon->state.selected) return;
|
||||
e_fm_icon_signal_emit(icon->icon_obj, "clicked", "");
|
||||
icon->sd->selection.files = evas_list_append(icon->sd->selection.files, icon);
|
||||
icon->sd->selection.icons = evas_list_append(icon->sd->selection.icons, icon);
|
||||
icon->state.selected = 1;
|
||||
icon->sd->selection.mime = NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
_e_fm_selections_del(E_Fm_Icon *icon)
|
||||
{
|
||||
if (!icon->state.selected) return;
|
||||
e_fm_icon_signal_emit(icon->icon_obj, "unclicked", "");
|
||||
icon->sd->selection.icons = evas_list_remove(icon->sd->selection.icons, icon);
|
||||
if (icon->sd->selection.current.file == icon)
|
||||
{
|
||||
icon->sd->selection.current.file = NULL;
|
||||
if (icon->sd->selection.icons)
|
||||
icon->sd->selection.current.file = icon->sd->selection.icons->data;
|
||||
}
|
||||
icon->state.selected = 0;
|
||||
icon->sd->selection.mime = NULL;
|
||||
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -1793,7 +1826,7 @@ _e_fm_selections_rect_add(E_Fm_Smart_Data *sd, Evas_Coord x, Evas_Coord y, Evas_
|
|||
{
|
||||
Evas_List *l;
|
||||
|
||||
for (l = sd->files; l; l = l->next)
|
||||
for (l = sd->icons; l; l = l->next)
|
||||
{
|
||||
E_Fm_Icon *icon;
|
||||
Evas_Coord xx, yy, ww, hh;
|
||||
|
@ -1826,20 +1859,6 @@ _e_fm_selections_rect_add(E_Fm_Smart_Data *sd, Evas_Coord x, Evas_Coord y, Evas_
|
|||
}
|
||||
}
|
||||
|
||||
static void
|
||||
_e_fm_selections_del(E_Fm_Icon *icon)
|
||||
{
|
||||
if (!icon->state.selected) return;
|
||||
e_fm_icon_signal_emit(icon->icon_obj, "unclicked", "");
|
||||
icon->sd->selection.files = evas_list_remove(icon->sd->selection.files, icon);
|
||||
if (icon->sd->selection.current.file == icon)
|
||||
{
|
||||
icon->sd->selection.current.file = NULL;
|
||||
if (icon->sd->selection.files)
|
||||
icon->sd->selection.current.file = icon->sd->selection.files->data;
|
||||
}
|
||||
icon->state.selected = 0;
|
||||
}
|
||||
|
||||
/* fake mouse up */
|
||||
static void
|
||||
|
@ -1900,7 +1919,7 @@ _e_fm_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
|
|||
{
|
||||
edje_object_signal_emit(sd->edje_obj, "typebuf_hide", "");
|
||||
edje_object_part_text_set(sd->edje_obj, "text", "");
|
||||
for (l = sd->files; l; l = l->next)
|
||||
for (l = sd->icons; l; l = l->next)
|
||||
{
|
||||
icon = l->data;
|
||||
e_fm_icon_signal_emit(icon->icon_obj, "default", "");
|
||||
|
@ -2215,144 +2234,33 @@ _e_fm_icon_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info
|
|||
}
|
||||
else if (ev->button == 3)
|
||||
{
|
||||
E_Menu *mn,*mo;
|
||||
E_Menu_Item *mi;
|
||||
int x, y, w, h;
|
||||
Evas_List *l;
|
||||
E_Fm_Assoc_App *assoc;
|
||||
|
||||
_e_fm_selections_clear(icon->sd);
|
||||
_e_fm_selections_add(icon, evas_list_find_list(icon->sd->files, icon));
|
||||
|
||||
mn = e_menu_new();
|
||||
e_menu_category_set(mn,"fileman/action");
|
||||
e_menu_category_data_set("fileman/action",icon);
|
||||
|
||||
mi = NULL;
|
||||
if((mo = evas_hash_find(icon->sd->mime_menu_hash,icon->file->mime)) == NULL)
|
||||
if(icon->sd->win)
|
||||
{
|
||||
/*- Arrange -*/
|
||||
mo = e_menu_new();
|
||||
|
||||
for (l = icon->sd->conf.main->apps; l; l = l->next)
|
||||
{
|
||||
assoc = l->data;
|
||||
if (e_fm_file_has_mime(icon->file, assoc->mime))
|
||||
{
|
||||
|
||||
mi = e_menu_item_new(mo);
|
||||
e_menu_item_label_set(mi, _(assoc->app));
|
||||
e_menu_item_radio_set(mi, 1);
|
||||
e_menu_item_radio_group_set(mi, 2);
|
||||
|
||||
/*
|
||||
if (!((assoc->app->icon_class) &&
|
||||
(e_util_menu_item_edje_icon_list_set(mi, assoc->app->icon_class))))
|
||||
e_menu_item_icon_edje_set(mi, assoc->app->path, "item");
|
||||
*/
|
||||
|
||||
e_menu_item_callback_set(mi, _e_fm_file_menu_open, icon);
|
||||
}
|
||||
assoc = NULL;
|
||||
}
|
||||
if(mi)
|
||||
{
|
||||
icon->sd->mime_menu_hash = evas_hash_add(icon->sd->mime_menu_hash,strdup(icon->file->mime), mo);
|
||||
mi = e_menu_item_new(mn);
|
||||
e_menu_item_submenu_set(mi, mo);
|
||||
e_menu_item_label_set(mi, _("Open with"));
|
||||
e_menu_item_icon_edje_set(mi,
|
||||
(char *)e_theme_edje_file_get("base/theme/fileman",
|
||||
"fileman/button/open"),
|
||||
"fileman/button/open");
|
||||
}
|
||||
int x,y;
|
||||
|
||||
evas_object_geometry_get(icon->icon_obj, &x, &y, NULL, NULL);
|
||||
|
||||
icon->sd->drag.start = 1;
|
||||
icon->sd->drag.doing = 0;
|
||||
icon->sd->drag.x = ev->canvas.x;
|
||||
icon->sd->drag.y = ev->canvas.y;
|
||||
icon->sd->drag.icon_obj = icon;
|
||||
}
|
||||
else
|
||||
|
||||
if (!icon->state.selected)
|
||||
{
|
||||
mi = e_menu_item_new(mn);
|
||||
e_menu_item_label_set(mi, _("Open with"));
|
||||
e_menu_item_icon_edje_set(mi,
|
||||
(char *)e_theme_edje_file_get("base/theme/fileman",
|
||||
"fileman/button/open"),
|
||||
"fileman/button/open");
|
||||
e_menu_item_submenu_set(mi, mo);
|
||||
if (!evas_key_modifier_is_set(evas_key_modifier_get(icon->sd->evas), "Control"))
|
||||
_e_fm_selections_clear(icon->sd);
|
||||
|
||||
}
|
||||
|
||||
mi = e_menu_item_new(mn);
|
||||
e_menu_item_label_set(mi, _("Open"));
|
||||
e_menu_item_callback_set(mi, _e_fm_file_menu_open, icon);
|
||||
e_menu_item_icon_edje_set(mi,
|
||||
(char *)e_theme_edje_file_get("base/theme/fileman",
|
||||
"fileman/button/open"),
|
||||
"fileman/button/open");
|
||||
|
||||
mi = e_menu_item_new(mn);
|
||||
e_menu_item_separator_set(mi, 1);
|
||||
|
||||
mi = e_menu_item_new(mn);
|
||||
e_menu_item_label_set(mi, _("Copy"));
|
||||
e_menu_item_callback_set(mi, _e_fm_file_menu_copy, icon);
|
||||
e_menu_item_icon_edje_set(mi,
|
||||
(char *)e_theme_edje_file_get("base/theme/fileman",
|
||||
"fileman/button/copy"),
|
||||
"fileman/button/copy");
|
||||
|
||||
mi = e_menu_item_new(mn);
|
||||
e_menu_item_label_set(mi, _("Cut"));
|
||||
e_menu_item_callback_set(mi, _e_fm_file_menu_cut, icon);
|
||||
e_menu_item_icon_edje_set(mi,
|
||||
(char *)e_theme_edje_file_get("base/theme/fileman",
|
||||
"fileman/button/cut"),
|
||||
"fileman/button/cut");
|
||||
|
||||
mi = e_menu_item_new(mn);
|
||||
e_menu_item_separator_set(mi, 1);
|
||||
|
||||
mi = e_menu_item_new(mn);
|
||||
e_menu_item_label_set(mi, _("Rename"));
|
||||
e_menu_item_callback_set(mi, _e_fm_file_menu_rename, icon);
|
||||
e_menu_item_icon_edje_set(mi,
|
||||
(char *)e_theme_edje_file_get("base/theme/fileman",
|
||||
"fileman/button/rename"),
|
||||
"fileman/button/rename");
|
||||
|
||||
mi = e_menu_item_new(mn);
|
||||
e_menu_item_label_set(mi, _("Delete"));
|
||||
e_menu_item_callback_set(mi, _e_fm_file_menu_delete, icon);
|
||||
e_menu_item_icon_edje_set(mi,
|
||||
(char *)e_theme_edje_file_get("base/theme/fileman",
|
||||
"fileman/button/delete"),
|
||||
"fileman/button/delete");
|
||||
|
||||
mi = e_menu_item_new(mn);
|
||||
e_menu_item_separator_set(mi, 1);
|
||||
|
||||
mi = e_menu_item_new(mn);
|
||||
e_menu_item_label_set(mi, _("Properties"));
|
||||
e_menu_item_callback_set(mi, _e_fm_file_menu_properties, icon);
|
||||
e_menu_item_icon_edje_set(mi,
|
||||
(char *)e_theme_edje_file_get("base/theme/fileman",
|
||||
"fileman/button/properties"),
|
||||
"fileman/button/properties");
|
||||
|
||||
icon->menu = mn;
|
||||
|
||||
if (!icon->sd->win) return;
|
||||
|
||||
ecore_evas_geometry_get(icon->sd->win->ecore_evas, &x, &y, &w, &h);
|
||||
|
||||
e_menu_activate_mouse(icon->menu, icon->sd->win->border->zone,
|
||||
ev->output.x + x, ev->output.y + y, 1, 1,
|
||||
E_MENU_POP_DIRECTION_DOWN, ev->timestamp);
|
||||
_e_fm_fake_mouse_up_all_later(icon->sd->win->evas);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
_e_fm_icon_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
|
||||
{
|
||||
E_Fm_Icon *icon;
|
||||
Evas_Event_Mouse_Move *ev;
|
||||
Evas_Event_Mouse_Up *ev;
|
||||
Evas_List *l;
|
||||
|
||||
ev = event_info;
|
||||
|
@ -2363,7 +2271,7 @@ _e_fm_icon_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
|
|||
E_Fm_Icon *i;
|
||||
edje_object_signal_emit(icon->sd->edje_obj, "typebuf_hide", "");
|
||||
edje_object_part_text_set(icon->sd->edje_obj, "text", "");
|
||||
for (l = icon->sd->files; l; l = l->next)
|
||||
for (l = icon->sd->icons; l; l = l->next)
|
||||
{
|
||||
i = l->data;
|
||||
e_fm_icon_signal_emit(i->icon_obj, "default", "");
|
||||
|
@ -2374,37 +2282,51 @@ _e_fm_icon_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
|
|||
if(icon->sd->win)
|
||||
icon->sd->drag.start = 0;
|
||||
|
||||
/* if we arent doing a drag its a simple mouse out */
|
||||
if(!icon->sd->drag.doing)
|
||||
switch(ev->button)
|
||||
{
|
||||
if (!icon->state.selected)
|
||||
{
|
||||
if (evas_key_modifier_is_set(evas_key_modifier_get(icon->sd->evas), "Control"))
|
||||
{
|
||||
_e_fm_selections_add(icon, evas_list_find_list(icon->sd->files, icon));
|
||||
}
|
||||
else
|
||||
{
|
||||
_e_fm_selections_clear(icon->sd);
|
||||
_e_fm_selections_add(icon, evas_list_find_list(icon->sd->files, icon));
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/* selection */
|
||||
case 1:
|
||||
/* the xdnd_drop will handle this case */
|
||||
if(icon->sd->drag.doing)
|
||||
break;
|
||||
|
||||
/* if we arent doing a drag its a simple mouse out */
|
||||
if (!icon->state.selected)
|
||||
{
|
||||
if (evas_key_modifier_is_set(evas_key_modifier_get(icon->sd->evas), "Control"))
|
||||
_e_fm_selections_add(icon, evas_list_find_list(icon->sd->icons, icon));
|
||||
else
|
||||
{
|
||||
if (evas_key_modifier_is_set(evas_key_modifier_get(icon->sd->evas), "Control"))
|
||||
{
|
||||
_e_fm_selections_del(icon);
|
||||
}
|
||||
else
|
||||
{
|
||||
_e_fm_selections_clear(icon->sd);
|
||||
_e_fm_selections_add(icon, evas_list_find_list(icon->sd->files, icon));
|
||||
}
|
||||
_e_fm_selections_clear(icon->sd);
|
||||
_e_fm_selections_add(icon, evas_list_find_list(icon->sd->icons, icon));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (evas_key_modifier_is_set(evas_key_modifier_get(icon->sd->evas), "Control"))
|
||||
_e_fm_selections_del(icon);
|
||||
else
|
||||
{
|
||||
_e_fm_selections_clear(icon->sd);
|
||||
_e_fm_selections_add(icon, evas_list_find_list(icon->sd->icons, icon));
|
||||
}
|
||||
}
|
||||
break;
|
||||
/* action / context */
|
||||
case 3:
|
||||
/* the xdnd_drop will handle this case */
|
||||
if(icon->sd->drag.doing)
|
||||
break;
|
||||
|
||||
_e_fm_menu_action_display(icon->sd, ev->output.x, ev->output.y, ev->timestamp);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
static void
|
||||
_e_fm_icon_mouse_in_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
|
||||
{
|
||||
|
@ -2463,30 +2385,44 @@ _e_fm_icon_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info
|
|||
Evas_List *l;
|
||||
Evas_Object *o = NULL;
|
||||
Evas_Coord x, y, w, h;
|
||||
int i;
|
||||
int rx,ry,rw,rh;
|
||||
int cx, cy;
|
||||
char *data;
|
||||
char **drop_types;
|
||||
char *tmp;
|
||||
char **drop_types = NULL;
|
||||
|
||||
|
||||
icon->sd->drag.doing = 1;
|
||||
|
||||
_e_fm_selections_add(icon, evas_list_find_list(icon->sd->files, icon));
|
||||
_e_fm_selections_add(icon, evas_list_find_list(icon->sd->icons, icon));
|
||||
|
||||
data = calloc(PATH_MAX, sizeof(char));
|
||||
snprintf(data, PATH_MAX * sizeof(char), "file://");
|
||||
drop_types = calloc(1,sizeof(char*));
|
||||
drop_types[0] = strdup("text/uri-list");
|
||||
|
||||
|
||||
|
||||
/* send the dragged signal to all the selected icons */
|
||||
for(l = sd->selection.files; l; l = l->next)
|
||||
for(l = sd->selection.icons, i = 0; l; l = l->next, i++)
|
||||
{
|
||||
E_Fm_Icon *ic;
|
||||
ic = (E_Fm_Icon*)l->data;
|
||||
if(ic->icon_obj)
|
||||
e_fm_icon_signal_emit(ic->icon_obj, "dragged", "");
|
||||
|
||||
tmp = calloc(PATH_MAX, sizeof(char));
|
||||
if(!i)
|
||||
strncpy(tmp,ic->file->path,PATH_MAX * sizeof(char));
|
||||
/* the separator on uri-lis is \n, maybe also \r\n? */
|
||||
else
|
||||
snprintf(tmp, PATH_MAX * sizeof(char), "\n%s", ic->file->path);
|
||||
|
||||
strncat(data, tmp, PATH_MAX * sizeof(char));
|
||||
free(tmp);
|
||||
}
|
||||
|
||||
drop_types = calloc(1, sizeof(char*));
|
||||
drop_types[0] = strdup("text/uri-list");
|
||||
|
||||
data = calloc(PATH_MAX, sizeof(char));
|
||||
snprintf(data, PATH_MAX * sizeof(char), "file://%s", icon->file->path);
|
||||
|
||||
ecore_evas_geometry_get(sd->win->ecore_evas, &cx, &cy, NULL, NULL);
|
||||
evas_object_geometry_get(icon->icon_obj, &x, &y, &w, &h);
|
||||
|
||||
|
@ -2524,7 +2460,7 @@ _e_fm_icon_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info
|
|||
ecore_x_dnd_aware_set(sd->drag.win, 1);
|
||||
ecore_x_dnd_types_set(sd->drag.win, drop_types, 1);
|
||||
ecore_x_dnd_begin(sd->drag.win, data, PATH_MAX * sizeof(char));
|
||||
|
||||
|
||||
sd->drag.start = 0;
|
||||
|
||||
|
||||
|
@ -2684,7 +2620,7 @@ _e_fm_icon_select_glob(E_Fm_Smart_Data *sd, char *glb)
|
|||
|
||||
if(glob(glbpath, 0, NULL, &globbuf))
|
||||
{
|
||||
for (l = sd->files; l; l = l->next)
|
||||
for (l = sd->icons; l; l = l->next)
|
||||
{
|
||||
icon = l->data;
|
||||
e_fm_icon_signal_emit(icon->icon_obj, "disable", "");
|
||||
|
@ -2692,7 +2628,7 @@ _e_fm_icon_select_glob(E_Fm_Smart_Data *sd, char *glb)
|
|||
return;
|
||||
}
|
||||
|
||||
for (l = sd->files; l; l = l->next)
|
||||
for (l = sd->icons; l; l = l->next)
|
||||
{
|
||||
icon = l->data;
|
||||
for (i = 0; i < globbuf.gl_pathc; i++)
|
||||
|
@ -2751,7 +2687,7 @@ static void
|
|||
l = sd->selection.current.ptr;
|
||||
}
|
||||
else
|
||||
l = sd->files;
|
||||
l = sd->icons;
|
||||
|
||||
for (; l; l = l->next)
|
||||
{
|
||||
|
@ -2763,7 +2699,7 @@ static void
|
|||
goto position;
|
||||
}
|
||||
}
|
||||
for (l = sd->files; l != sd->selection.current.ptr; l = l->next)
|
||||
for (l = sd->icons; l != sd->selection.current.ptr; l = l->next)
|
||||
{
|
||||
icon = l->data;
|
||||
if (icon->file->name[0] == c[0])
|
||||
|
@ -2805,7 +2741,7 @@ _e_fm_icon_select_up(E_Fm_Smart_Data *sd)
|
|||
E_Fm_Icon *icon;
|
||||
|
||||
if(!sd->selection.current.ptr)
|
||||
_e_fm_selections_add(sd->files->data, sd->files);
|
||||
_e_fm_selections_add(sd->icons->data, sd->icons);
|
||||
else
|
||||
{
|
||||
if(sd->selection.current.ptr->prev) /* are we already at the beginning? */
|
||||
|
@ -2829,7 +2765,7 @@ _e_fm_icon_select_up(E_Fm_Smart_Data *sd)
|
|||
_e_fm_selections_clear(sd);
|
||||
if(!l)
|
||||
{
|
||||
l = sd->files; // go to the beginning
|
||||
l = sd->icons; // go to the beginning
|
||||
_e_fm_selections_add(l->data, l);
|
||||
}
|
||||
else
|
||||
|
@ -2892,7 +2828,7 @@ _e_fm_icon_select_down(E_Fm_Smart_Data *sd)
|
|||
Evas_List *l;
|
||||
|
||||
if (!sd->selection.current.ptr)
|
||||
_e_fm_selections_add(sd->files->data, sd->files);
|
||||
_e_fm_selections_add(sd->icons->data, sd->icons);
|
||||
else
|
||||
{
|
||||
if (sd->selection.current.ptr->next) /* are we already at the end? */
|
||||
|
@ -2916,7 +2852,7 @@ _e_fm_icon_select_down(E_Fm_Smart_Data *sd)
|
|||
_e_fm_selections_clear(sd);
|
||||
if(!l)
|
||||
{
|
||||
l = evas_list_last(sd->files);
|
||||
l = evas_list_last(sd->icons);
|
||||
_e_fm_selections_add(l->data, l);
|
||||
}
|
||||
else
|
||||
|
@ -2978,7 +2914,7 @@ static void
|
|||
_e_fm_icon_select_left(E_Fm_Smart_Data *sd)
|
||||
{
|
||||
if(!sd->selection.current.ptr)
|
||||
_e_fm_selections_add(sd->files->data, sd->files);
|
||||
_e_fm_selections_add(sd->icons->data, sd->icons);
|
||||
else
|
||||
{
|
||||
if(sd->selection.current.ptr->prev)
|
||||
|
@ -3038,7 +2974,7 @@ static void
|
|||
_e_fm_icon_select_right(E_Fm_Smart_Data *sd)
|
||||
{
|
||||
if(!sd->selection.current.ptr)
|
||||
_e_fm_selections_add(sd->files->data, sd->files);
|
||||
_e_fm_selections_add(sd->icons->data, sd->icons);
|
||||
else
|
||||
{
|
||||
if (sd->selection.current.ptr->next)
|
||||
|
@ -3204,7 +3140,7 @@ _e_fm_key_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
|
|||
|
||||
edje_object_signal_emit(sd->edje_obj, "typebuf_hide", "");
|
||||
edje_object_part_text_set(sd->edje_obj, "text", "");
|
||||
for (l = sd->files; l; l = l->next)
|
||||
for (l = sd->icons; l; l = l->next)
|
||||
{
|
||||
icon = l->data;
|
||||
e_fm_icon_signal_emit(icon->icon_obj, "default", "");
|
||||
|
@ -3466,7 +3402,7 @@ _e_fm_xdnd_drop_cb(void *data, int type, void *event)
|
|||
x = ev->position.x - dx - sd->drag.x;
|
||||
y = ev->position.y - dy - sd->drag.y;
|
||||
|
||||
for(l = sd->selection.files; l; l = l->next)
|
||||
for(l = sd->selection.icons; l; l = l->next)
|
||||
{
|
||||
E_Fm_Icon *ic;
|
||||
ic = (E_Fm_Icon*)l->data;
|
||||
|
@ -3483,7 +3419,7 @@ _e_fm_xdnd_drop_cb(void *data, int type, void *event)
|
|||
/*if(sd->meta)
|
||||
{
|
||||
Evas_List *l;
|
||||
for(l = sd->meta->files; l; l = l->next)
|
||||
for(l = sd->meta->icons; l; l = l->next)
|
||||
{
|
||||
E_Fm_Icon_Metadata *m;
|
||||
|
||||
|
@ -3691,7 +3627,7 @@ _e_fm_dir_meta_generate(E_Fm_Smart_Data *sd)
|
|||
m->files = NULL;
|
||||
if (!m) return 0;
|
||||
_e_fm_dir_meta_fill(m, sd);
|
||||
for (l = sd->files; l; l = l->next)
|
||||
for (l = sd->icons; l; l = l->next)
|
||||
{
|
||||
E_Fm_Icon_Metadata *im;
|
||||
E_Fm_Icon *icon;
|
||||
|
@ -3764,3 +3700,215 @@ _e_fm_dir_meta_fill(E_Fm_Dir_Metadata *m, E_Fm_Smart_Data *sd)
|
|||
m->bg = NULL;
|
||||
m->view = 1;
|
||||
}
|
||||
|
||||
/* displays the action menu for a list of selected files
|
||||
* on the coordinate @dx, @dy relative to the sd window
|
||||
*/
|
||||
|
||||
static void
|
||||
_e_fm_menu_action_display(E_Fm_Smart_Data *sd, Evas_Coord dx, Evas_Coord dy, unsigned int timestamp)
|
||||
{
|
||||
|
||||
E_Menu *mn,*mo;
|
||||
E_Menu_Item *mi;
|
||||
int x, y, w, h;
|
||||
E_Fm_Assoc_App *assoc;
|
||||
|
||||
E_Fm_Icon *icon_clicked; // ?
|
||||
|
||||
Evas_List *l,*actions,*mimes = NULL;
|
||||
E_Fm_Mime_Entry *mime;
|
||||
int multiple = 0;
|
||||
|
||||
|
||||
/* if we dont have any selection, how do we get here ? */
|
||||
if(!sd->selection.icons)
|
||||
return;
|
||||
/* to know if the action can be performed on multiple files */
|
||||
if(sd->selection.icons->next)
|
||||
multiple = 1;
|
||||
|
||||
// icon_clicked = sd->selection.current.file;
|
||||
|
||||
mn = e_menu_new();
|
||||
e_menu_category_set(mn,"fileman/action");
|
||||
e_menu_category_data_set("fileman/action",sd->selection.icons);
|
||||
|
||||
mi = NULL;
|
||||
|
||||
#if 0
|
||||
if((mo = evas_hash_find(sd->mime_menu_hash,icon->file->mime)) == NULL)
|
||||
{
|
||||
/*- Arrange -*/
|
||||
mo = e_menu_new();
|
||||
for (l = icon->sd->conf.main->apps; l; l = l->next)
|
||||
{
|
||||
assoc = l->data;
|
||||
if (e_fm_file_has_mime(icon->file, assoc->mime))
|
||||
{
|
||||
mi = e_menu_item_new(mo);
|
||||
e_menu_item_label_set(mi, _(assoc->app));
|
||||
e_menu_item_radio_set(mi, 1);
|
||||
e_menu_item_radio_group_set(mi, 2);
|
||||
|
||||
/*
|
||||
if (!((assoc->app->icon_class) &&
|
||||
(e_util_menu_item_edje_icon_list_set(mi, assoc->app->icon_class))))
|
||||
e_menu_item_icon_edje_set(mi, assoc->app->path, "item");
|
||||
*/
|
||||
e_menu_item_callback_set(mi, _e_fm_file_menu_open, icon);
|
||||
}
|
||||
assoc = NULL;
|
||||
}
|
||||
if(mi)
|
||||
{
|
||||
icon->sd->mime_menu_hash = evas_hash_add(icon->sd->mime_menu_hash,strdup(icon->file->mime), mo);
|
||||
mi = e_menu_item_new(mn);
|
||||
e_menu_item_submenu_set(mi, mo);
|
||||
e_menu_item_label_set(mi, _("Open with"));
|
||||
e_menu_item_icon_edje_set(mi,
|
||||
(char *)e_theme_edje_file_get("base/theme/fileman",
|
||||
"fileman/button/open"),
|
||||
"fileman/button/open");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
mi = e_menu_item_new(mn);
|
||||
e_menu_item_label_set(mi, _("Open with"));
|
||||
e_menu_item_icon_edje_set(mi,
|
||||
(char *)e_theme_edje_file_get("base/theme/fileman",
|
||||
"fileman/button/open"),
|
||||
"fileman/button/open");
|
||||
e_menu_item_submenu_set(mi, mo);
|
||||
}
|
||||
mi = e_menu_item_new(mn);
|
||||
e_menu_item_label_set(mi, _("Open"));
|
||||
e_menu_item_callback_set(mi, _e_fm_file_menu_open, icon);
|
||||
e_menu_item_icon_edje_set(mi,
|
||||
(char *)e_theme_edje_file_get("base/theme/fileman",
|
||||
"fileman/button/open"),
|
||||
"fileman/button/open");
|
||||
#endif
|
||||
|
||||
/* get the overall mime entry for the selected files */
|
||||
for(l = sd->selection.icons; l; l = l->next)
|
||||
{
|
||||
E_Fm_Icon *icon;
|
||||
E_Fm_Mime_Entry *entry;
|
||||
|
||||
icon = (E_Fm_Icon *)l->data;
|
||||
mimes = evas_list_append(mimes, icon->file->mime);
|
||||
}
|
||||
mime = sd->selection.mime = e_fm_mime_list(mimes);
|
||||
printf("mime for selection %s\n", mime->name);
|
||||
do
|
||||
{
|
||||
printf("mime %s\n", mime->name);
|
||||
actions = mime->actions;
|
||||
for(l = actions; l; l = l->next)
|
||||
{
|
||||
E_Fm_Mime_Action *action;
|
||||
|
||||
action = (E_Fm_Mime_Action*)l->data;
|
||||
if(!action->multiple && multiple)
|
||||
continue;
|
||||
mi = e_menu_item_new(mn);
|
||||
e_menu_item_label_set(mi, _(action->label));
|
||||
e_menu_item_callback_set(mi, _e_fm_menu_actions, sd);
|
||||
e_menu_item_icon_edje_set(mi, (char *)e_theme_edje_file_get("base/theme/fileman",
|
||||
"fileman/button/properties"),"fileman/button/properties");
|
||||
|
||||
}
|
||||
mime = mime->parent;
|
||||
}while(mime);
|
||||
|
||||
mi = e_menu_item_new(mn);
|
||||
e_menu_item_separator_set(mi, 1);
|
||||
mi = e_menu_item_new(mn);
|
||||
|
||||
e_menu_item_label_set(mi, _("Copy"));
|
||||
//e_menu_item_callback_set(mi, _e_fm_file_menu_copy, icon);
|
||||
e_menu_item_icon_edje_set(mi,
|
||||
(char *)e_theme_edje_file_get("base/theme/fileman",
|
||||
"fileman/button/copy"),
|
||||
"fileman/button/copy");
|
||||
mi = e_menu_item_new(mn);
|
||||
e_menu_item_label_set(mi, _("Cut"));
|
||||
//e_menu_item_callback_set(mi, _e_fm_file_menu_cut, icon);
|
||||
e_menu_item_icon_edje_set(mi,
|
||||
(char *)e_theme_edje_file_get("base/theme/fileman",
|
||||
"fileman/button/cut"),
|
||||
"fileman/button/cut");
|
||||
mi = e_menu_item_new(mn);
|
||||
e_menu_item_separator_set(mi, 1);
|
||||
|
||||
if(!multiple)
|
||||
{
|
||||
mi = e_menu_item_new(mn);
|
||||
e_menu_item_label_set(mi, _("Rename"));
|
||||
//e_menu_item_callback_set(mi, _e_fm_file_menu_rename, icon);
|
||||
e_menu_item_icon_edje_set(mi,
|
||||
(char *)e_theme_edje_file_get("base/theme/fileman",
|
||||
"fileman/button/rename"),
|
||||
"fileman/button/rename");
|
||||
}
|
||||
|
||||
mi = e_menu_item_new(mn);
|
||||
e_menu_item_label_set(mi, _("Delete"));
|
||||
//e_menu_item_callback_set(mi, _e_fm_file_menu_delete, icon);
|
||||
e_menu_item_icon_edje_set(mi,
|
||||
(char *)e_theme_edje_file_get("base/theme/fileman",
|
||||
"fileman/button/delete"),
|
||||
"fileman/button/delete");
|
||||
|
||||
|
||||
mi = e_menu_item_new(mn);
|
||||
e_menu_item_separator_set(mi, 1);
|
||||
|
||||
mi = e_menu_item_new(mn);
|
||||
e_menu_item_label_set(mi, _("Properties"));
|
||||
//e_menu_item_callback_set(mi, _e_fm_file_menu_properties, icon);
|
||||
e_menu_item_icon_edje_set(mi,
|
||||
(char *)e_theme_edje_file_get("base/theme/fileman",
|
||||
"fileman/button/properties"),
|
||||
"fileman/button/properties");
|
||||
//icon->menu = mn;
|
||||
|
||||
if (!sd->win) return;
|
||||
|
||||
ecore_evas_geometry_get(sd->win->ecore_evas, &x, &y, &w, &h);
|
||||
e_menu_activate_mouse(mn, sd->win->border->zone,x + dx, y + dy, 1, 1,
|
||||
E_MENU_POP_DIRECTION_DOWN, timestamp);
|
||||
|
||||
}
|
||||
|
||||
/* displays the context menu for a list of @files on the coordinate
|
||||
* @dx, @dy relative to the sd window
|
||||
*/
|
||||
static void
|
||||
_e_fm_menu_context_display(E_Fm_Smart_Data *sd, Evas_Coord dx, Evas_Coord dy, unsigned int timestamp)
|
||||
{
|
||||
|
||||
;
|
||||
}
|
||||
|
||||
static void
|
||||
_e_fm_menu_actions(void *data, E_Menu *m, E_Menu_Item *mi)
|
||||
{
|
||||
E_Fm_Smart_Data *sd;
|
||||
E_Fm_Mime_Action *action;
|
||||
Evas_List *l;
|
||||
|
||||
sd = data;
|
||||
/* search for the action clicked */
|
||||
for(l = sd->selection.mime; l; l = l->next)
|
||||
{
|
||||
action = (E_Fm_Mime_Action*)l->data;
|
||||
if(!strcmp(action->label,mi->label))
|
||||
break;
|
||||
}
|
||||
/* execute the action on the files */
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -46,6 +46,7 @@ struct _E_Fm_Icon
|
|||
|
||||
struct {
|
||||
unsigned char selected : 1;
|
||||
unsigned char visible : 1;
|
||||
}
|
||||
state;
|
||||
|
||||
|
@ -122,8 +123,8 @@ struct _E_Fm_Smart_Data
|
|||
|
||||
Evas_List *event_handlers;
|
||||
|
||||
Evas_List *files;
|
||||
Evas_List *files_raw;
|
||||
Evas_List *icons; /* list of E_Fm_Icons on the current directory */
|
||||
Evas_List *files_raw; /* raw char filenames of files on the current directory */
|
||||
Ecore_File_Monitor *monitor;
|
||||
E_Fm_Arrange arrange;
|
||||
|
||||
|
@ -170,10 +171,11 @@ struct _E_Fm_Smart_Data
|
|||
child;
|
||||
|
||||
struct {
|
||||
Evas_List *files;
|
||||
Evas_List *icons; /* list of E_Fm_Icons selected */
|
||||
E_Fm_Mime_Entry *mime; /* the computed mime for all the selected icons */
|
||||
|
||||
struct {
|
||||
E_Fm_Icon *file;
|
||||
E_Fm_Icon *file; /* FIXME should be called icon! */
|
||||
Evas_List *ptr;
|
||||
}
|
||||
current;
|
||||
|
|
|
@ -66,6 +66,7 @@
|
|||
#include "e_fileman_smart.h"
|
||||
#include "e_fileman_file.h"
|
||||
#include "e_fileman_icon.h"
|
||||
#include "e_fileman_mime.h"
|
||||
#include "e_widget.h"
|
||||
#include "e_widget_check.h"
|
||||
#include "e_widget_radio.h"
|
||||
|
|
Loading…
Reference in New Issue