and more efm work....

SVN revision: 23984
This commit is contained in:
Carsten Haitzler 2006-07-17 10:31:50 +00:00
parent c0128d4cff
commit 20cbd3f3fe
3 changed files with 154 additions and 153 deletions

1
TODO
View File

@ -8,6 +8,7 @@ Some of the things (in very short form) that need to be done to E17...
BUGS / FIXES
-------------------------------------------------------------------------------
* BUG: match this window only doesnt fall back to other unused remembers
* BUG: make window sitcky. send window to another desktop - get ghost window.
should 1. make any such operation in the pager or menu useless and do
nothng if the window is sticky and 2. remove the send window to menu if it

View File

@ -14,16 +14,10 @@ struct _E_Fm2_Smart_Data
Evas_Coord x, y, w, h;
Evas_Object *obj;
Evas_Object *clip;
char *dev;
char *path;
char *realpath;
E_Fm2_View_Mode view_mode;
struct {
int w, h;
int list_w, list_h;
unsigned char fixed_w : 1;
unsigned char fixed_h : 1;
} icon;
const char *dev;
const char *path;
const char *realpath;
struct {
Evas_Coord w, h;
} max;
@ -34,6 +28,7 @@ struct _E_Fm2_Smart_Data
Evas_List *list;
int member_max;
} regions;
Evas_List *icons;
Evas_List *queue;
Ecore_Idler *scan_idler;
@ -41,15 +36,9 @@ struct _E_Fm2_Smart_Data
Ecore_Job *scroll_job;
Ecore_Job *resize_job;
DIR *dir;
unsigned char no_case_sort : 1;
unsigned char iconlist_changed : 1;
unsigned char show_extension : 1;
unsigned char dirs_first : 1;
unsigned char dirs_last : 1;
unsigned char single_select : 1;
unsigned char windows_multi_select_modifiers : 1;
unsigned char open_dirs_in_place : 1;
unsigned char selector_mode : 1;
E_Fm2_Config *config;
};
struct _E_Fm2_Region
@ -68,8 +57,8 @@ struct _E_Fm2_Icon
Evas_Object *obj, *obj_icon;
int saved_x, saved_y;
int saved_rel;
char *file;
char *mime;
const char *file;
const char *mime;
struct stat st;
unsigned char realized : 1;
unsigned char selected : 1;
@ -78,7 +67,7 @@ struct _E_Fm2_Icon
unsigned char odd : 1;
};
static char *_e_fm2_dev_path_map(char *dev, char *path);
static const char *_e_fm2_dev_path_map(const char *dev, const char *path);
static void _e_fm2_file_add(Evas_Object *obj, char *file);
static void _e_fm2_file_del(Evas_Object *obj, char *file);
static void _e_fm2_scan_start(Evas_Object *obj);
@ -90,6 +79,7 @@ static void _e_fm2_regions_populate(Evas_Object *obj);
static void _e_fm2_icons_place(Evas_Object *obj);
static void _e_fm2_icons_free(Evas_Object *obj);
static void _e_fm2_regions_eval(Evas_Object *obj);
static void _e_fm2_config_free(E_Fm2_Config *cfg);
static E_Fm2_Icon *_e_fm2_icon_new(E_Fm2_Smart_Data *sd, char *file);
static void _e_fm2_icon_free(E_Fm2_Icon *ic);
@ -189,40 +179,46 @@ e_fm2_path_set(Evas_Object *obj, char *dev, char *path)
if (!evas_object_type_get(obj)) return; // safety
if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
// sd->view_mode = E_FM2_VIEW_MODE_ICONS;
sd->view_mode = E_FM2_VIEW_MODE_LIST;
/* internal config for now - don't see a pont making this configurable */
sd->regions.member_max = 32;
sd->icon.w = 64;
sd->icon.h = 64;
sd->icon.list_w = 64;
sd->icon.list_h = 64;
sd->icon.fixed_w = 1;
sd->icon.fixed_h = 1;
sd->no_case_sort = 1;
sd->show_extension = 0;
sd->dirs_first = 1;
sd->dirs_last = 1;
sd->single_select = 0;
sd->windows_multi_select_modifiers = 0;
sd->open_dirs_in_place = 0;
sd->selector_mode = 0;
if (sd->config) _e_fm2_config_free(sd->config);
sd->config = E_NEW(E_Fm2_Config, 1);
if (!sd->config) return;
// sd->config->view.mode = E_FM2_VIEW_MODE_ICONS;
sd->config->view.mode = E_FM2_VIEW_MODE_LIST;
sd->config->icon.icon.w = 64;
sd->config->icon.icon.h = 64;
sd->config->icon.list.w = 24;
sd->config->icon.list.h = 24;
sd->config->icon.fixed.w = 1;
sd->config->icon.fixed.h = 1;
sd->config->list.sort.no_case = 1;
sd->config->icon.extension.show = 0;
sd->config->list.sort.dirs.first = 1;
sd->config->list.sort.dirs.last = 1;
sd->config->selection.single = 0;
sd->config->selection.windows_modifiers = 0;
sd->config->view.open_dirs_in_place = 0;
sd->config->view.selector = 0;
_e_fm2_scan_stop(obj);
_e_fm2_queue_free(obj);
_e_fm2_regions_free(obj);
_e_fm2_icons_free(obj);
E_FREE(sd->dev);
E_FREE(sd->path);
E_FREE(sd->realpath);
if (dev) sd->dev = strdup(dev);
sd->path = strdup(path);
if (sd->dev) evas_stringshare_del(sd->dev);
if (sd->path) evas_stringshare_del(sd->path);
if (sd->realpath) evas_stringshare_del(sd->realpath);
sd->dev = sd->path = sd->realpath = NULL;
if (dev) sd->dev = evas_stringshare_add(dev);
sd->path = evas_stringshare_add(path);
sd->realpath = _e_fm2_dev_path_map(sd->dev, sd->path);
printf("FM: %s\n", sd->realpath);
_e_fm2_scan_start(obj);
}
EAPI void
e_fm2_path_get(Evas_Object *obj, char **dev, char **path)
e_fm2_path_get(Evas_Object *obj, const char **dev, const char **path)
{
E_Fm2_Smart_Data *sd;
@ -237,8 +233,19 @@ e_fm2_path_get(Evas_Object *obj, char **dev, char **path)
}
/*
EAPI char *
e_fm2_parent_get(Evas_Object *obj)
EAPI int
e_fm2_parent_go(Evas_Object *obj)
{
E_Fm2_Smart_Data *sd;
sd = evas_object_smart_data_get(obj);
if (!sd) return; // safety
if (!evas_object_type_get(obj)) return; // safety
if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
}
EAPI int
e_fm2_has_parent_get(Evas_Object *obj)
{
E_Fm2_Smart_Data *sd;
@ -249,7 +256,7 @@ e_fm2_parent_get(Evas_Object *obj)
}
EAPI void
e_fm2_view_mode_set(Evas_Object *obj, E_Fm2_View_Mode view_mode)
e_fm2_config_set(Evas_Object *obj, E_Fm2_Config *cfg)
{
E_Fm2_Smart_Data *sd;
@ -259,85 +266,8 @@ e_fm2_view_mode_set(Evas_Object *obj, E_Fm2_View_Mode view_mode)
if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
}
EAPI void
e_fm2_icon_size_set(Evas_Object *obj, int w, int h, int fixed_w, int fixed_h)
{
E_Fm2_Smart_Data *sd;
sd = evas_object_smart_data_get(obj);
if (!sd) return; // safety
if (!evas_object_type_get(obj)) return; // safety
if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
}
EAPI void
e_fm2_list_size_set(Evas_Object *obj, int w, int h, int fixed_w, int fixed_h)
{
E_Fm2_Smart_Data *sd;
sd = evas_object_smart_data_get(obj);
if (!sd) return; // safety
if (!evas_object_type_get(obj)) return; // safety
if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
}
EAPI void
e_fm2_no_case_sort_set(Evas_Object *obj, int no_case_sort)
{
E_Fm2_Smart_Data *sd;
sd = evas_object_smart_data_get(obj);
if (!sd) return; // safety
if (!evas_object_type_get(obj)) return; // safety
if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
}
EAPI void
e_fm2_show_extension_set(Evas_Object *obj, int show_ext)
{
E_Fm2_Smart_Data *sd;
sd = evas_object_smart_data_get(obj);
if (!sd) return; // safety
if (!evas_object_type_get(obj)) return; // safety
if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
}
EAPI void
e_fm2_dirs_first_last_set(Evas_Object *obj, int dirs_first, int dirs_last)
{
E_Fm2_Smart_Data *sd;
sd = evas_object_smart_data_get(obj);
if (!sd) return; // safety
if (!evas_object_type_get(obj)) return; // safety
if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
}
EAPI void
e_fm2_multi_mode_set(Evas_Object *obj, int windows_multi_modifier)
{
E_Fm2_Smart_Data *sd;
sd = evas_object_smart_data_get(obj);
if (!sd) return; // safety
if (!evas_object_type_get(obj)) return; // safety
if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
}
EAPI void
e_fm2_open_dirs_in_place_set(Evas_Object *obj, int open_in_place)
{
E_Fm2_Smart_Data *sd;
sd = evas_object_smart_data_get(obj);
if (!sd) return; // safety
if (!evas_object_type_get(obj)) return; // safety
if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
}
EAPI void
e_fm2_selector_mode_set(Evas_Object *obj, int selector_mode)
EAPI E_Fm2_Config *
e_fm2_config_get(Evas_Object *obj)
{
E_Fm2_Smart_Data *sd;
@ -417,14 +347,14 @@ e_fm2_pan_child_size_get(Evas_Object *obj, Evas_Coord *w, Evas_Coord *h)
/* local subsystem functions */
static char *
_e_fm2_dev_path_map(char *dev, char *path)
static const char *
_e_fm2_dev_path_map(const char *dev, const char *path)
{
char buf[4096] = "", *s;
int len;
/* map a device name to a mount point/path on the os (and append path) */
if (!dev) return strdup(path);
if (!dev) return evas_stringshare_add(path);
/* FIXME: load mappings from config and use them first - maybe device
* discovery should be done through config and not the below (except
@ -464,7 +394,7 @@ _e_fm2_dev_path_map(char *dev, char *path)
buf[len - 1] = 0;
len--;
}
return strdup(buf);
return evas_stringshare_add(buf);
}
static void
@ -798,7 +728,6 @@ _e_fm2_icons_place_list(E_Fm2_Smart_Data *sd)
{
ic = l->data;
/* FIXME: place in vertical list */
ic->x = x;
ic->y = y;
if (sd->w > ic->min_w)
@ -827,7 +756,7 @@ _e_fm2_icons_place(Evas_Object *obj)
/* take the icon list and find a location for them */
sd->max.w = 0;
sd->max.h = 0;
switch (sd->view_mode)
switch (sd->config->view.mode)
{
case E_FM2_VIEW_MODE_ICONS:
_e_fm2_icons_place_icons(sd);
@ -894,6 +823,15 @@ _e_fm2_regions_eval(Evas_Object *obj)
evas_event_thaw(evas_object_evas_get(obj));
}
static void
_e_fm2_config_free(E_Fm2_Config *cfg)
{
if (cfg->theme.background) evas_stringshare_del(cfg->theme.background);
if (cfg->theme.frame) evas_stringshare_del(cfg->theme.frame);
if (cfg->theme.icons) evas_stringshare_del(cfg->theme.icons);
free(cfg);
}
/**************************/
static E_Fm2_Icon *
@ -913,9 +851,9 @@ _e_fm2_icon_new(E_Fm2_Smart_Data *sd, char *file)
return NULL;
}
ic->sd = sd;
ic->file = strdup(file);
ic->file = evas_stringshare_add(file);
/* FIXME: have many icon size policies. fixed, max, auto-calc etc. */
switch (sd->view_mode)
switch (sd->config->view.mode)
{
case E_FM2_VIEW_MODE_ICONS:
case E_FM2_VIEW_MODE_GRID_ICONS:
@ -938,7 +876,7 @@ _e_fm2_icon_new(E_Fm2_Smart_Data *sd, char *file)
* fileman/scrollframe
*
*/
if ((!sd->icon.fixed_w) || (!sd->icon.fixed_h))
if ((!sd->config->icon.fixed.w) || (!sd->config->icon.fixed.h))
{
obj = edje_object_add(evas_object_evas_get(sd->obj));
e_theme_edje_object_set(obj, "base/theme/fileman",
@ -947,15 +885,15 @@ _e_fm2_icon_new(E_Fm2_Smart_Data *sd, char *file)
edje_object_size_min_calc(obj, &mw, &mh);
evas_object_del(obj);
}
if (sd->icon.fixed_w) ic->w = sd->icon.w;
if (sd->icon.fixed_h) ic->h = sd->icon.h;
if (sd->config->icon.fixed.w) ic->w = sd->config->icon.icon.w;
if (sd->config->icon.fixed.h) ic->h = sd->config->icon.icon.h;
ic->min_w = mw;
ic->min_h = mh;
break;
case E_FM2_VIEW_MODE_LIST:
{
obj = edje_object_add(evas_object_evas_get(sd->obj));
if (sd->icon.fixed_w)
if (sd->config->icon.fixed.w)
e_theme_edje_object_set(obj, "base/theme/fileman",
"fileman/list/fixed");
else
@ -963,8 +901,8 @@ _e_fm2_icon_new(E_Fm2_Smart_Data *sd, char *file)
"fileman/list/variable");
_e_fm2_icon_label_set(ic, obj);
obj2 = evas_object_rectangle_add(evas_object_evas_get(sd->obj));
edje_extern_object_min_size_set(obj2, sd->icon.list_w, sd->icon.list_h);
edje_extern_object_max_size_set(obj2, sd->icon.list_w, sd->icon.list_h);
edje_extern_object_min_size_set(obj2, sd->config->icon.list.w, sd->config->icon.list.h);
edje_extern_object_max_size_set(obj2, sd->config->icon.list.w, sd->config->icon.list.h);
edje_object_part_swallow(obj, "icon_swallow", obj2);
edje_object_size_min_calc(obj, &mw, &mh);
evas_object_del(obj2);
@ -987,7 +925,7 @@ _e_fm2_icon_free(E_Fm2_Icon *ic)
{
/* free icon, object data etc. etc. */
_e_fm2_icon_unrealize(ic);
E_FREE(ic->file);
if (ic->file) evas_stringshare_del(ic->file);
free(ic);
}
@ -1003,9 +941,9 @@ _e_fm2_icon_realize(E_Fm2_Icon *ic)
evas_object_smart_member_add(ic->obj, ic->sd->obj);
/* FIXME: this is currently a hack just to get a display working - go back
* and do proper icon stuff later */
if (ic->sd->view_mode == E_FM2_VIEW_MODE_LIST)
if (ic->sd->config->view.mode == E_FM2_VIEW_MODE_LIST)
{
if (ic->sd->icon.fixed_w)
if (ic->sd->config->icon.fixed.w)
{
if (ic->odd)
e_theme_edje_object_set(ic->obj, "base/theme/widgets",
@ -1087,7 +1025,7 @@ _e_fm2_icon_label_set(E_Fm2_Icon *ic, Evas_Object *obj)
char buf[4096], *p;
int len;
if (ic->sd->show_extension)
if (ic->sd->config->icon.extension.show)
edje_object_part_text_set(obj, "label", ic->file);
else
{
@ -1310,7 +1248,7 @@ _e_fm2_cb_icon_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_inf
}
else if (ev->button == 1)
{
if (ic->sd->windows_multi_select_modifiers)
if (ic->sd->config->selection.windows_modifiers)
{
if (evas_key_modifier_is_set(ev->modifiers, "Shift"))
range_sel = 1;
@ -1324,7 +1262,7 @@ _e_fm2_cb_icon_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_inf
else if (evas_key_modifier_is_set(ev->modifiers, "Shift"))
multi_sel = 1;
}
if (ic->sd->single_select)
if (ic->sd->config->selection.single)
{
multi_sel = 0;
range_sel = 0;
@ -1448,7 +1386,7 @@ _e_fm2_cb_resize_job(void *data)
sd->resize_job = NULL;
evas_event_freeze(evas_object_evas_get(sd->obj));
edje_freeze();
switch (sd->view_mode)
switch (sd->config->view.mode)
{
case E_FM2_VIEW_MODE_ICONS:
_e_fm2_regions_free(sd->obj);
@ -1497,7 +1435,7 @@ _e_fm2_cb_icon_sort(void *data1, void *data2)
ic1 = data1;
ic2 = data2;
if (ic1->sd->dirs_last)
if (ic1->sd->config->list.sort.dirs.last)
{
if ((S_ISDIR(ic1->st.st_mode)) != (S_ISDIR(ic2->st.st_mode)))
{
@ -1505,7 +1443,7 @@ _e_fm2_cb_icon_sort(void *data1, void *data2)
else return 1;
}
}
else if (ic1->sd->dirs_first)
else if (ic1->sd->config->list.sort.dirs.first)
{
if ((S_ISDIR(ic1->st.st_mode)) != (S_ISDIR(ic2->st.st_mode)))
{
@ -1513,7 +1451,7 @@ _e_fm2_cb_icon_sort(void *data1, void *data2)
else return -1;
}
}
if (ic1->sd->no_case_sort)
if (ic1->sd->config->list.sort.no_case)
{
char buf1[4096], buf2[4096], *p;
@ -1655,9 +1593,11 @@ _e_fm2_smart_del(Evas_Object *obj)
_e_fm2_icons_free(obj);
if (sd->scroll_job) ecore_job_del(sd->scroll_job);
if (sd->resize_job) ecore_job_del(sd->resize_job);
E_FREE(sd->dev);
E_FREE(sd->path);
E_FREE(sd->realpath);
if (sd->dev) evas_stringshare_del(sd->dev);
if (sd->path) evas_stringshare_del(sd->path);
if (sd->realpath) evas_stringshare_del(sd->realpath);
sd->dev = sd->path = sd->realpath = NULL;
if (sd->config) _e_fm2_config_free(sd->config);
evas_object_del(sd->clip);
free(sd);

View File

@ -15,15 +15,75 @@ typedef enum _E_Fm2_View_Mode
E_FM2_VIEW_MODE_LIST /* vertical fileselector list */
} E_Fm2_View_Mode;
typedef struct _E_Fm2_Config E_Fm2_Config;
#else
#ifndef E_FM_H
#define E_FM_H
struct _E_Fm2_Config
{
/* general view mode */
struct {
E_Fm2_View_Mode mode;
unsigned char open_dirs_in_place;
unsigned char selector;
} view;
/* display of icons */
struct {
struct {
int w, h;
} icon;
struct {
int w, h;
} list;
struct {
unsigned char w;
unsigned char h;
} fixed;
struct {
unsigned char show;
} extension;
} icon;
/* how to sort files */
struct {
struct {
unsigned char no_case;
struct {
unsigned char first;
unsigned char last;
} dirs;
} sort;
} list;
/* control how you can select files */
struct {
unsigned char single;
unsigned char windows_modifiers;
} selection;
/* the background - if any, and how to handle it */
/* FIXME: not implemented yet */
struct {
char *background;
char *frame;
char *icons;
unsigned char fixed;
} theme;
/* used internally only - used to save to disk only and laod from disk */
/* FIXME: not implemented yet */
struct {
int x, y, w, h;
struct {
int w, h;
} res;
int screen;
} geometry;
};
EAPI int e_fm2_init(void);
EAPI int e_fm2_shutdown(void);
EAPI Evas_Object *e_fm2_add(Evas *evas);
EAPI void e_fm2_path_set(Evas_Object *obj, char *dev, char *path);
EAPI void e_fm2_path_get(Evas_Object *obj, char **dev, char **path);
EAPI void e_fm2_path_get(Evas_Object *obj, const char **dev, const char **path);
EAPI void e_fm2_pan_set(Evas_Object *obj, Evas_Coord x, Evas_Coord y);
EAPI void e_fm2_pan_get(Evas_Object *obj, Evas_Coord *x, Evas_Coord *y);