- cleanups
- patch from Jose for menus.
- patch from Mista for Open With and other misc.


SVN revision: 19581
This commit is contained in:
codewarrior 2006-01-06 23:45:13 +00:00 committed by codewarrior
parent 6bf7badbe5
commit d3c1a4a4a0
10 changed files with 1636 additions and 1223 deletions

View File

@ -18,6 +18,11 @@
#include <fnmatch.h>
#include <limits.h>
#include <ctype.h>
#include <time.h>
#include <dirent.h>
#include <pwd.h>
#include <grp.h>
#include <glob.h>
#include <Evas.h>
#include <Evas_Engine_Buffer.h>

View File

@ -9,13 +9,6 @@
# define D(x) ((void) 0)
#endif
typedef struct _E_Fm_Assoc_App E_Fm_Assoc_App;
struct _E_Fm_Assoc_App
{
char *mime;
char *app;
};
/* local subsystem functions */
static void _e_fm_file_free(E_Fm_File *file);
@ -23,30 +16,11 @@ static void _e_fm_file_free(E_Fm_File *file);
static E_Config_DD *assoc_app_edd = NULL;
static Evas_List *assoc_apps = NULL;
#if 0
{
E_Fm_Assoc_App *assoc;
assoc = E_NEW(E_Fm_Assoc_App, 1);
assoc->mime = (char*)E_NEW(char *, 5);
snprintf(assoc->mime, 5, "%s", ".jpg");
assoc->app = (char*)E_NEW(char *, 7);
snprintf(assoc->app, 7, "gqview");
sd->conf.main->apps = evas_list_append(sd->conf.main->apps, assoc);
assoc = E_NEW(E_Fm_Assoc_App, 1);
assoc->mime = (char*)E_NEW(char *, 5);
snprintf(assoc->mime, 5, "%s", ".png");
assoc->app = (char*)E_NEW(char *, 7);
snprintf(assoc->app, 7, "gqview");
sd->conf.main->apps = evas_list_append(sd->conf.main->apps, assoc);
}
#endif
/* externally accessible functions */
E_Fm_File *
e_fm_file_new(const char *filename)
{
char *ext;
E_Fm_File *file;
struct stat st;
@ -77,8 +51,10 @@ e_fm_file_new(const char *filename)
file->mtime = st.st_mtime;
file->ctime = st.st_ctime;
if (S_ISDIR(file->mode))
file->type |= E_FM_FILE_TYPE_DIRECTORY;
if (S_ISDIR(file->mode)){
file->type |= E_FM_FILE_TYPE_DIRECTORY;
file->mime = "directory";
}
else if (S_ISREG(file->mode))
file->type = E_FM_FILE_TYPE_FILE;
else if (S_ISLNK(file->mode))
@ -96,10 +72,20 @@ e_fm_file_new(const char *filename)
file->preview_funcs[3] = e_fm_file_is_eap;
file->preview_funcs[4] = NULL;
if(!file->mime)
{
ext = strrchr(file->name, '.');
if (ext)
{
file->mime = ext;
}
else
file->mime = "unknown";
}
D(("e_fm_file_new: %s\n", filename));
return file;
error:
error:
if (file->path) free(file->path);
if (file->name) free(file->name);
free(file);
@ -182,7 +168,7 @@ e_fm_file_can_preview(E_Fm_File *file)
for (i = 0; file->preview_funcs[i]; i++)
{
E_Fm_File_Preview_Function func;
func = file->preview_funcs[i];
if (func(file))
return 1;
@ -206,7 +192,7 @@ e_fm_file_is_image(E_Fm_File *file)
D(("e_fm_file_is_image: (%p)\n", file));
return (!strcasecmp(ext, ".jpg")) || (!strcasecmp(ext, ".png")) ||
(!strcasecmp(ext, ".jpeg"));
(!strcasecmp(ext, ".jpeg"));
}
int
@ -383,7 +369,7 @@ e_fm_file_assoc_exec(E_Fm_File *file)
Ecore_Exe *exe;
if (!assoc_apps) return 0;
for (l = assoc_apps; l; l = l->next)
{
char *ext;
@ -418,6 +404,28 @@ e_fm_file_assoc_exec(E_Fm_File *file)
return 1;
}
int
e_fm_file_exec_with(E_Fm_File *file, char* exec_with)
{
Ecore_Exe *exe;
char app[PATH_MAX * 2];
if (!exec_with || !file) return 0;
snprintf(app, PATH_MAX * 2, "%s \"%s\"", exec_with, file->path);
exe = ecore_exe_run(app, NULL);
if (!exe)
{
e_error_dialog_show(_("Run Error"),
_("3 Enlightenment was unable fork a child process:\n"
"\n"
"%s\n"
"\n"),
app);
return 0;
}
}
/* local subsystem functions */
static void
_e_fm_file_free(E_Fm_File *file)
@ -426,6 +434,7 @@ _e_fm_file_free(E_Fm_File *file)
free(file->preview_funcs);
if (file->path) free(file->path);
if (file->name) free(file->name);
///??? if (file->mime) free(file->mime);
free(file);
}

View File

@ -37,6 +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) */
dev_t device; /* ID of device containing file */
ino_t inode; /* inode number */
@ -66,6 +67,7 @@ EAPI int e_fm_file_can_exec (E_Fm_File *file);
EAPI int e_fm_file_exec (E_Fm_File *file);
EAPI int e_fm_file_assoc_set (E_Fm_File *file, const char *assoc);
EAPI int e_fm_file_assoc_exec (E_Fm_File *file);
EAPI int e_fm_file_exec_with (E_Fm_File *file, char* exec_with);
#endif
#endif

View File

@ -14,7 +14,7 @@ struct _E_Smart_Data
char *thumb_path;
char *saved_title;
Evas_Object *event_object;
Evas_Object *icon_object;
Evas_Object *image_object;
@ -22,11 +22,11 @@ struct _E_Smart_Data
Evas_Object *thumb_object;
E_Fm_File *file;
unsigned char visible : 1;
int type;
E_Fm_Icon_Metadata *meta;
};
@ -43,7 +43,7 @@ static void _e_fm_icon_smart_clip_unset (Evas_Object *obj);
/* Create icons */
static void _e_fm_icon_icon_mime_get(E_Smart_Data *sd);
static void _e_fm_icon_thumb_generate_cb(Evas_Object *obj, void *data);
static void _e_fm_icon_type_set(E_Smart_Data *sd);
static void _e_fm_icon_type_set(E_Smart_Data *sd);
static void _e_fm_icon_meta_fill(E_Fm_Icon_Metadata *m, E_Smart_Data *sd);
/* local subsystem globals */
@ -109,10 +109,10 @@ e_fm_icon_type_set(Evas_Object *obj, int type)
sd = evas_object_smart_data_get(obj);
if (!sd) return;
if(sd->type == type)
return;
sd->type = type;
_e_fm_icon_type_set(sd);
}
@ -121,10 +121,10 @@ E_Fm_File *
e_fm_icon_file_get(Evas_Object *obj)
{
E_Smart_Data *sd;
sd = evas_object_smart_data_get(obj);
if (!sd) return;
return sd->file;
}
@ -132,7 +132,7 @@ void
e_fm_icon_file_set(Evas_Object *obj, E_Fm_File *file)
{
E_Smart_Data *sd;
Evas_Coord icon_w, icon_h;
Evas_Coord icon_w, icon_h;
sd = evas_object_smart_data_get(obj);
if (!sd) return;
@ -140,20 +140,20 @@ e_fm_icon_file_set(Evas_Object *obj, E_Fm_File *file)
e_object_ref(E_OBJECT(file));
sd->file = file;
file->icon_object = obj;
if (e_fm_file_can_preview(sd->file))
{
sd->thumb_path = e_thumb_file_get(sd->file->path);
if (e_thumb_exists(sd->file->path))
{
sd->thumb_object = e_thumb_evas_object_get(sd->file->path,
{
sd->thumb_object = e_thumb_evas_object_get(sd->file->path,
sd->evas,
sd->iw,
sd->ih,
1);
// evas_object_geometry_get(sd->thumb_object, NULL, NULL, &icon_w, &icon_h);
// sd->iw = icon_w;
// sd->ih = icon_h;
// evas_object_geometry_get(sd->thumb_object, NULL, NULL, &icon_w, &icon_h);
// sd->iw = icon_w;
// sd->ih = icon_h;
sd->image_object = edje_object_add(sd->evas);
e_theme_edje_object_set(sd->image_object, "base/theme/fileman",
"fileman/icon_thumb");
@ -193,25 +193,25 @@ e_fm_icon_file_set(Evas_Object *obj, E_Fm_File *file)
void
e_fm_icon_appear_cb(Evas_Object *obj, void *data)
{
{
E_Smart_Data *sd;
evas_object_show(obj);
return;
sd = evas_object_smart_data_get(obj);
if (!sd) return;
if (!sd) return;
if(sd->visible) return;
sd->visible = 1;
sd->icon_object = edje_object_add(sd->evas);
evas_object_smart_member_add(sd->icon_object, obj);
sd->event_object = evas_object_rectangle_add(sd->evas);
evas_object_color_set(sd->event_object, 0, 0, 0, 0);
evas_object_smart_member_add(sd->event_object, obj);
evas_object_smart_data_set(obj, sd);
e_fm_icon_file_set(obj, sd->file);
evas_object_show(obj);
}
@ -223,35 +223,35 @@ e_fm_icon_disappear_cb(Evas_Object *obj, void *data)
evas_object_hide(obj);
return;
sd = evas_object_smart_data_get(obj);
if (!sd) return;
if(!sd->visible) return;
sd->visible = 0;
if (sd->event_object) evas_object_del(sd->event_object);
if (sd->icon_object) evas_object_del(sd->icon_object);
if (sd->image_object) evas_object_del(sd->image_object);
if (sd->thumb_object) evas_object_del(sd->thumb_object);
E_FREE(sd->saved_title);
E_FREE(sd->saved_title);
}
char *
e_fm_icon_title_get(Evas_Object *obj)
{
E_Smart_Data *sd;
sd = evas_object_smart_data_get(obj);
if (!sd) return;
return edje_object_part_text_get(sd->icon_object, "icon_title");
}
void
e_fm_icon_title_set(Evas_Object *obj, const char *title)
{
E_Smart_Data *sd;
E_Smart_Data *sd;
sd = evas_object_smart_data_get(obj);
if (!sd) return;
E_FREE(sd->saved_title);
@ -260,23 +260,22 @@ e_fm_icon_title_set(Evas_Object *obj, const char *title)
//if (sd->icon_object) edje_object_part_text_set(sd->icon_object, "icon_title", title);
if(sd->icon_object)
{
#if 0
#if 0
Evas_Textblock_Style *e_editable_text_style;
Evas_Coord fw, fh, il, ir, it, ib;
e_editable_text_style = evas_textblock_style_new();
evas_textblock_style_set(e_editable_text_style, "DEFAULT='font=Vera font_size=10 style=shadow shadow_color=#ffffff80 align=center color=#000000 wrap=char'");
evas_object_textblock_style_set(sd->title_object, e_editable_text_style);
evas_object_textblock_text_markup_set(sd->title_object, title);
evas_object_resize(sd->title_object, sd->w, 1);
evas_object_textblock_size_formatted_get(sd->title_object, &fw, &fh);
evas_object_textblock_style_insets_get(sd->title_object, &il, &ir, &it, &ib);
sd->h = sd->ih + fh + it + ib;
evas_object_resize(sd->title_object, sd->w, fh + it + ib);
edje_extern_object_min_size_set(sd->title_object, sd->w, fh + it + ib);
evas_object_resize(sd->icon_object, sd->w, sd->h);
@ -322,16 +321,16 @@ e_fm_icon_meta_generate(Evas_Object *obj)
{
E_Smart_Data *sd;
E_Fm_Icon_Metadata *m;
sd = evas_object_smart_data_get(obj);
if (!sd) return;
if (!sd) return;
m = calloc(1, sizeof(E_Fm_Icon_Metadata));
if (!m) return NULL;
_e_fm_icon_meta_fill(m, sd);
sd->meta = m;
return m;
}
@ -344,7 +343,6 @@ e_fm_icon_meta_free(E_Fm_Icon_Metadata *m)
free(m);
}
int
e_fm_icon_assoc_set(Evas_Object *obj, const char *assoc)
{
@ -373,17 +371,17 @@ _e_fm_icon_smart_add(Evas_Object *obj)
sd->ih = 48;
sd->file = NULL;
sd->meta = NULL;
sd->icon_object = edje_object_add(sd->evas);
evas_object_smart_member_add(sd->icon_object, obj);
sd->event_object = evas_object_rectangle_add(sd->evas);
evas_object_color_set(sd->event_object, 0, 0, 0, 0);
evas_object_smart_member_add(sd->event_object, obj);
evas_object_smart_data_set(obj, sd);
sd->visible = 1;
}
static void
@ -421,7 +419,7 @@ _e_fm_icon_smart_move(Evas_Object *obj, Evas_Coord x, Evas_Coord y)
//printf("update meta for %s: x=%d y=%d\n", sd->file->name, x, y);
sd->meta->x = x;
sd->meta->y = y;
}
}
}
static void
@ -431,13 +429,13 @@ _e_fm_icon_smart_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h)
sd = evas_object_smart_data_get(obj);
if (!sd) return;
if ((sd->w == w) && (sd->h == h)) return;
if ((sd->w == w) && (sd->h == h)) return;
sd->w = w;
sd->h = h;
if(sd->event_object)
if(sd->event_object)
evas_object_resize(sd->event_object, sd->w, sd->h);
if(sd->icon_object)
evas_object_resize(sd->icon_object, sd->w, sd->h);
if(sd->icon_object)
evas_object_resize(sd->icon_object, sd->w, sd->h);
if(sd->meta)
{
printf("update meta: w=%d h=%d\n", w, h);
@ -453,10 +451,10 @@ _e_fm_icon_smart_show(Evas_Object *obj)
sd = evas_object_smart_data_get(obj);
if (!sd) return;
if(sd->event_object)
if(sd->event_object)
evas_object_show(sd->icon_object);
if(sd->icon_object)
evas_object_show(sd->event_object);
if(sd->icon_object)
evas_object_show(sd->event_object);
}
static void
@ -466,10 +464,10 @@ _e_fm_icon_smart_hide(Evas_Object *obj)
sd = evas_object_smart_data_get(obj);
if (!sd) return;
if(sd->event_object)
evas_object_hide(sd->icon_object);
if(sd->icon_object)
evas_object_hide(sd->event_object);
if(sd->event_object)
evas_object_hide(sd->icon_object);
if(sd->icon_object)
evas_object_hide(sd->event_object);
}
static void
@ -480,7 +478,7 @@ _e_fm_icon_smart_clip_set(Evas_Object *obj, Evas_Object *clip)
sd = evas_object_smart_data_get(obj);
if (!sd) return;
evas_object_clip_set(sd->event_object, clip);
evas_object_clip_set(sd->icon_object, clip);
evas_object_clip_set(sd->icon_object, clip);
}
static void
@ -518,7 +516,7 @@ _e_fm_icon_icon_mime_get(E_Smart_Data *sd)
snprintf(part, PATH_MAX, "icons/fileman/%s", (ext + 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");
free(ext);
free(ext);
}
else
e_theme_edje_object_set(sd->image_object, "base/theme/fileman", "icons/fileman/file");
@ -535,20 +533,20 @@ _e_fm_icon_thumb_generate_cb(Evas_Object *obj, void *data)
{
E_Smart_Data *sd;
char *ext;
sd = data;
ext = strrchr(sd->file->name, '.');
if ((ext) && (strcasecmp(ext, ".eap")))
ext = NULL;
if ((ext) || (ecore_file_exists(sd->thumb_path)))
{
Evas_Coord icon_w, icon_h;
if (sd->image_object) evas_object_del(sd->image_object);
sd->thumb_object = e_thumb_evas_object_get(sd->file->path,
sd->thumb_object = e_thumb_evas_object_get(sd->file->path,
sd->evas,
sd->iw,
sd->ih,
@ -578,22 +576,22 @@ _e_fm_icon_type_set(E_Smart_Data *sd)
{
switch (sd->type)
{
case E_FM_ICON_NORMAL:
case E_FM_ICON_NORMAL:
e_theme_edje_object_set(sd->icon_object, "base/theme/fileman",
"fileman/icon_normal");
"fileman/icon_normal");
break;
case E_FM_ICON_LIST:
e_theme_edje_object_set(sd->icon_object, "base/theme/fileman",
"fileman/icon_list");
break;
default:
e_theme_edje_object_set(sd->icon_object, "base/theme/fileman",
"fileman/icon_normal");
break;
}
}
if (sd->image_object)
{
edje_extern_object_min_size_set(sd->image_object, sd->iw, sd->ih);
@ -602,47 +600,45 @@ _e_fm_icon_type_set(E_Smart_Data *sd)
sd->image_object);
evas_object_show(sd->image_object);
}
if (sd->saved_title)
if (sd->saved_title)
{
#if 0
#if 0
Evas_Textblock_Style *e_editable_text_style;
Evas_Coord fw, fh, il, ir, it, ib;
e_editable_text_style = evas_textblock_style_new();
evas_textblock_style_set(e_editable_text_style, "DEFAULT='font=Vera font_size=10 style=shadow shadow_color=#ffffff80 align=center color=#000000 wrap=char'");
evas_object_textblock_style_set(sd->title_object, e_editable_text_style);
evas_object_textblock_text_markup_set(sd->title_object, sd->saved_title);
evas_object_resize(sd->title_object, sd->w, 1);
evas_object_textblock_size_formatted_get(sd->title_object, &fw, &fh);
evas_object_textblock_style_insets_get(sd->title_object, &il, &ir, &it, &ib);
sd->h = sd->ih + fh + it + ib;
evas_object_resize(sd->title_object, sd->w, fh + it + ib);
edje_extern_object_min_size_set(sd->title_object, sd->w, fh + it + ib);
evas_object_resize(sd->icon_object, sd->w, sd->h);
evas_object_resize(sd->obj, sd->w, sd->h);
edje_object_part_swallow(sd->icon_object, "icon_title", sd->title_object);
#endif
#endif
edje_object_part_text_set(sd->icon_object, "icon_title", sd->saved_title);
}
else
{
#if 0
#if 0
Evas_Textblock_Style *e_editable_text_style;
Evas_Coord fw, fh, il, ir, it, ib;
e_editable_text_style = evas_textblock_style_new();
evas_textblock_style_set(e_editable_text_style, "DEFAULT='font=Vera font_size=10 style=shadow shadow_color=#ffffff80 align=center color=#000000 wrap=char'");
evas_object_textblock_style_set(sd->title_object, e_editable_text_style);
evas_object_textblock_text_markup_set(sd->title_object, sd->file->name);
evas_object_resize(sd->title_object, sd->w, 1);
evas_object_textblock_size_formatted_get(sd->title_object, &fw, &fh);
evas_object_textblock_style_insets_get(sd->title_object, &il, &ir, &it, &ib);
@ -656,7 +652,7 @@ _e_fm_icon_type_set(E_Smart_Data *sd)
edje_object_part_swallow(sd->icon_object, "icon_title", sd->title_object);
#endif
edje_object_part_text_set(sd->icon_object, "icon_title", sd->file->name);
}
}
}
static void

File diff suppressed because it is too large Load Diff

View File

@ -3,13 +3,180 @@
*/
#ifdef E_TYPEDEFS
typedef struct _E_Fm_Smart_Data E_Fm_Smart_Data;
typedef struct _E_Fm_Icon E_Fm_Icon;
typedef struct _E_Fm_Icon_CFData E_Fm_Icon_CFData;
typedef struct _E_Fm_Config E_Fm_Config;
typedef struct _E_Fm_Dir_Metadata E_Fm_Dir_Metadata;
typedef struct _E_Fm_Fake_Mouse_Up_Info E_Fm_Fake_Mouse_Up_Info;
typedef enum _E_Fm_Arrange E_Fm_Arrange;
typedef enum _E_Fm_State E_Fm_State;
typedef struct _E_Event_Fm_Reconfigure E_Event_Fm_Reconfigure;
typedef struct _E_Event_Fm_Directory_Change E_Event_Fm_Directory_Change;
typedef struct _E_Fm_Assoc_App E_Fm_Assoc_App;
#else
#ifndef E_FM_SMART_H
#define E_FM_SMART_H
struct _E_Fm_Config
{
int width;
int height;
Evas_List *apps;
};
struct _E_Fm_Dir_Metadata
{
char *name; /* dir name */
char *bg; /* dir's custom bg */
int view; /* dir's saved view type */
Evas_List *files; /* files in dir */
/* these are generated post-load */
Evas_Hash *files_hash; /* quick lookup hash */
};
struct _E_Fm_Icon
{
E_Fm_File *file;
Evas_Object *icon_obj;
E_Fm_Smart_Data *sd;
struct {
unsigned char selected : 1;
}
state;
E_Menu *menu;
};
struct _E_Fm_Icon_CFData
{
/*- BASIC -*/
int protect;
int readwrite;
/*- ADVANCED -*/
struct {
int r;
int w;
int x;
}
user, group, world;
/*- common -*/
E_Fm_Icon *icon;
};
enum _E_Fm_Arrange
{
E_FILEMAN_CANVAS_ARRANGE_NAME = 0,
E_FILEMAN_CANVAS_ARRANGE_MODTIME = 1,
E_FILEMAN_CANVAS_ARRANGE_SIZE = 2,
};
enum _E_Fm_State
{
E_FILEMAN_STATE_IDLE = 0,
E_FILEMAN_STATE_TYPEBUFFER = 1,
E_FILEMAN_STATE_RENAME = 2,
};
struct _E_Fm_Fake_Mouse_Up_Info
{
Evas *canvas;
int button;
};
struct _E_Fm_Smart_Data
{
E_Menu *menu;
E_Win *win;
Evas *evas;
Evas_Object *edje_obj;
Evas_Object *event_obj;
Evas_Object *clip_obj;
Evas_Object *layout;
Evas_Object *object;
Evas_Object *entry_obj;
E_Fm_Dir_Metadata *meta;
Evas_Hash *mime_menu_hash;
char *dir;
DIR *dir2;
double timer_int;
Ecore_Timer *timer;
Evas_List *event_handlers;
Evas_List *files;
Evas_List *files_raw;
Ecore_File_Monitor *monitor;
E_Fm_Arrange arrange;
E_Fm_State state;
// E_Fm_Icon *active_file;
int frozen;
double position;
int is_selector;
void (*selector_func) (Evas_Object *object, char *file, void *data);
void *selector_data;
void (*selector_hilite_func) (Evas_Object *object, char *file, void *data);
Evas_Coord x, y, w, h;
struct {
unsigned char start : 1;
int x, y;
Ecore_Evas *ecore_evas;
Evas *evas;
Ecore_X_Window win;
E_Fm_Icon *icon_obj;
Evas_Object *image_object;
}
drag;
struct {
Evas_Coord x_space, y_space, w, h;
}
icon_info;
struct {
Evas_Coord x, y, w, h;
}
child;
struct {
Evas_List *files;
struct {
E_Fm_Icon *file;
Evas_List *ptr;
}
current;
struct {
unsigned char enabled : 1;
Evas_Coord x, y;
Evas_Object *obj;
Evas_List *files;
}
band;
}
selection;
struct {
E_Config_DD *main_edd;
E_Fm_Config *main;
}
conf;
};
struct _E_Event_Fm_Reconfigure
{
Evas_Object *object;
@ -22,6 +189,12 @@ struct _E_Event_Fm_Directory_Change
Evas_Coord w, h;
};
struct _E_Fm_Assoc_App
{
char *mime;
char *app;
};
EAPI int e_fm_init(void);
EAPI int e_fm_shutdown(void);
EAPI Evas_Object *e_fm_add(Evas *evas);

View File

@ -34,6 +34,8 @@ e_int_border_menu_show(E_Border *bd, Evas_Coord x, Evas_Coord y, int key, Ecore_
if (bd->border_menu) return;
m = e_menu_new();
e_menu_category_set(m,"border/stacking");
e_menu_category_data_set("border/stacking",bd);
bd->border_stacking_menu = m;
/* Only allow to change layer for windows in "normal" layers */
if ((!bd->lock_user_stacking) &&
@ -72,6 +74,8 @@ e_int_border_menu_show(E_Border *bd, Evas_Coord x, Evas_Coord y, int key, Ecore_
}
m = e_menu_new();
e_menu_category_set(m,"border/maximize");
e_menu_category_data_set("border/maximize",bd);
bd->border_maximize_menu = m;
/* Only allow to change layer for windows in "normal" layers */
if ((!bd->lock_user_maximize) &&
@ -121,6 +125,8 @@ e_int_border_menu_show(E_Border *bd, Evas_Coord x, Evas_Coord y, int key, Ecore_
}
m = e_menu_new();
e_menu_category_set(m,"border");
e_menu_category_data_set("border",bd);
e_object_data_set(E_OBJECT(m), bd);
bd->border_menu = m;
e_menu_post_deactivate_callback_set(m, _e_border_cb_border_menu_end, NULL);

View File

@ -72,6 +72,7 @@ e_int_menus_main_new(void)
e_object_data_set(E_OBJECT(m), dat);
e_object_del_attach_func_set(E_OBJECT(m), _e_int_menus_main_del_hook);
e_menu_category_set(m,"main");
subm = e_int_menus_favorite_apps_new();
dat->apps = subm;
mi = e_menu_item_new(m);

View File

@ -23,6 +23,23 @@
* * support obscures to indicate offscreen/not visible menu parts
*/
/* local subsystem data types */
typedef struct _E_Menu_Category E_Menu_Category;
typedef struct _E_Menu_Category_Callback E_Menu_Category_Callback;
struct _E_Menu_Category
{
void *data;
Evas_List *callbacks;
};
struct _E_Menu_Category_Callback
{
void *data;
void (*create) (E_Menu *m, void *category_data, void *data);
void (*free) (void *data);
};
/* local subsystem functions */
static void _e_menu_free (E_Menu *m);
static void _e_menu_item_free (E_Menu_Item *mi);
@ -69,10 +86,13 @@ static int _e_menu_cb_scroll_timer (void *data);
static int _e_menu_cb_window_shape (void *data, int ev_type, void *ev);
static void _e_menu_cb_item_submenu_post_default (void *data, E_Menu *m, E_Menu_Item *mi);
static Evas_Bool _e_menu_categories_free_cb(Evas_Hash *hash, const char *key, void *data, void *fdata);
/* local subsystem globals */
static Ecore_X_Window _e_menu_win = 0;
static Evas_List *_e_active_menus = NULL;
/*static Evas_Hash *_e_menu_category_items = NULL;*/
static Evas_Hash *_e_menu_categories = NULL;
static Ecore_X_Time _e_menu_activate_time = 0;
static int _e_menu_activate_floating = 0;
static Ecore_Timer *_e_menu_scroll_timer = NULL;
@ -128,6 +148,13 @@ e_menu_shutdown(void)
e_object_unref(E_OBJECT(m));
}
_e_active_menus = NULL;
if (_e_menu_categories)
{
evas_hash_foreach(_e_menu_categories, _e_menu_categories_free_cb, NULL);
evas_hash_free(_e_menu_categories);
_e_menu_categories = NULL;
}
return 1;
}
@ -140,9 +167,11 @@ e_menu_new(void)
if (!m) return NULL;
m->cur.w = 1;
m->cur.h = 1;
m->category = NULL;
return m;
}
void
e_menu_activate_key(E_Menu *m, E_Zone *zone, int x, int y, int w, int h, int dir)
{
@ -340,6 +369,57 @@ e_menu_icon_file_set(E_Menu *m, char *icon)
/* FIXME: support menu icons */
}
void
e_menu_category_set(E_Menu *m, char *category)
{
E_OBJECT_CHECK(m);
E_OBJECT_TYPE_CHECK(m, E_MENU_TYPE);
if (m->category)
{
evas_stringshare_del(m->category);
m->category = NULL;
}
if (category) m->category = evas_stringshare_add(category);
else m->category = NULL;
m->changed = 1;
}
void
e_menu_category_data_set(char *category, void *data)
{
E_Menu_Category *cat;
cat = evas_hash_find(_e_menu_categories, category);
if (cat)
cat->data = data;
/* if it isnt found create the new hash */
else
{
cat = calloc(1, sizeof(E_Menu_Category));
cat->data = data;
_e_menu_categories = evas_hash_add(_e_menu_categories,category,cat);
}
}
void
e_menu_category_callback_set(char *category, void (*create) (E_Menu *m, void *category_data, void *data), void (*free) (void *data), void *data)
{
E_Menu_Category *cat;
E_Menu_Category_Callback *cb;
cat = evas_hash_find(_e_menu_categories, category);
/* if it isnt found create the new hash */
if (!cat)
{
cat = calloc(1, sizeof(E_Menu_Category));
_e_menu_categories = evas_hash_add(_e_menu_categories,category,cat);
}
cb = calloc(1, sizeof(E_Menu_Category_Callback));
cb->data = data;
cb->create = create;
cb->free = free;
cat->callbacks = evas_list_append(cat->callbacks,cb);
}
void
e_menu_pre_activate_callback_set(E_Menu *m, void (*func) (void *data, E_Menu *m), void *data)
{
@ -402,6 +482,7 @@ e_menu_item_num_get(E_Menu_Item *mi)
int i;
E_OBJECT_CHECK_RETURN(mi, -1);
E_OBJECT_CHECK_RETURN(m->menu, -1);
E_OBJECT_TYPE_CHECK_RETURN(mi, E_MENU_TYPE, -1);
for (i = 0, l = mi->menu->items; l; l = l->next, i++)
{
@ -847,7 +928,20 @@ static void
_e_menu_free(E_Menu *m)
{
Evas_List *l, *tmp;
E_Menu_Category *cat;
/* the foreign menu items */
cat = evas_hash_find(_e_menu_categories, m->category);
if(cat)
{
for(l = cat->callbacks; l; l = l->next)
{
E_Menu_Category_Callback *cb;
cb = l->data;
if(cb->free) cb->free(cb->data);
}
}
_e_menu_unrealize(m);
E_FREE(m->shape_rects);
m->shape_rects_num = 0;
@ -884,6 +978,21 @@ _e_menu_item_free(E_Menu_Item *mi)
free(mi);
}
static void
_e_menu_category_item_free(E_Menu_Item *mi)
{
if (mi->submenu)
{
mi->submenu->parent_item = NULL;
e_object_unref(E_OBJECT(mi->submenu));
}
if (mi->menu->realized) _e_menu_item_unrealize(mi);
if (mi->icon) evas_stringshare_del(mi->icon);
if (mi->icon_key) evas_stringshare_del(mi->icon_key);
if (mi->label) evas_stringshare_del(mi->label);
free(mi);
}
static void
_e_menu_cb_intercept_item_move(void *data, Evas_Object *o, Evas_Coord x, Evas_Coord y)
{
@ -1155,6 +1264,9 @@ _e_menu_realize(E_Menu *m)
{
Evas_Object *o;
Evas_List *l;
E_Menu_Category *cat;
int ok;
if (m->realized) return;
@ -1212,6 +1324,7 @@ _e_menu_realize(E_Menu *m)
e_box_homogenous_set(o, 0);
edje_object_part_swallow(m->bg_object, "items", m->container_object);
for (l = m->items; l; l = l->next)
{
E_Menu_Item *mi;
@ -1219,7 +1332,7 @@ _e_menu_realize(E_Menu *m)
mi = l->data;
_e_menu_item_realize(mi);
}
o = m->container_object;
_e_menu_items_layout_update(m);
e_box_thaw(o);
@ -1452,6 +1565,7 @@ _e_menu_item_unrealize(E_Menu_Item *mi)
static void
_e_menu_unrealize(E_Menu *m)
{
E_Menu_Category *cat;
Evas_List *l;
if (!m->realized) return;
@ -1460,6 +1574,7 @@ _e_menu_unrealize(E_Menu *m)
e_object_del(E_OBJECT(m->shape));
m->shape = NULL;
e_box_freeze(m->container_object);
for (l = m->items; l; l = l->next)
{
E_Menu_Item *mi;
@ -1487,6 +1602,9 @@ _e_menu_unrealize(E_Menu *m)
static void
_e_menu_activate_internal(E_Menu *m, E_Zone *zone)
{
Evas_List *l;
E_Menu_Category *cat;
if (m->pre_activate_cb.func)
m->pre_activate_cb.func(m->pre_activate_cb.data, m);
m->fast_mouse = 0;
@ -1519,6 +1637,18 @@ _e_menu_activate_internal(E_Menu *m, E_Zone *zone)
m->active = 1;
e_object_ref(E_OBJECT(m));
}
/* the foreign menu items */
cat = evas_hash_find(_e_menu_categories, m->category);
if(cat)
{
for(l = cat->callbacks; l; l = l->next)
{
E_Menu_Category_Callback *cb;
cb = l->data;
if(cb->create) cb->create(m,cat->data,cb->data);
}
}
m->cur.visible = 1;
m->zone = zone;
}
@ -2473,3 +2603,20 @@ _e_menu_cb_item_submenu_post_default(void *data, E_Menu *m, E_Menu_Item *mi)
e_menu_item_submenu_set(mi, NULL);
e_object_del(E_OBJECT(subm));
}
static Evas_Bool _e_menu_categories_free_cb(Evas_Hash *hash, const char *key, void *data, void *fdata)
{
Evas_List *l;
E_Menu_Category *cat;
cat = (E_Menu_Category *)data;
l = (Evas_List *)cat->callbacks;
while (l)
{
free(l->data); /* free the callback struct */
l = evas_list_remove_list(l,l);
}
free(cat);
}

View File

@ -26,6 +26,8 @@ struct _E_Menu
{
E_Object e_obj_inherit;
char * category;
struct {
char visible : 1;
int x, y, w, h;
@ -140,6 +142,13 @@ EAPI int e_menu_freeze(E_Menu *m);
EAPI int e_menu_thaw(E_Menu *m);
EAPI void e_menu_title_set(E_Menu *m, char *title);
EAPI void e_menu_icon_file_set(E_Menu *m, char *icon);
/* menu categories functions */
EAPI void e_menu_category_set(E_Menu *m, char *category);
EAPI void e_menu_category_data_set(char *category, void *data);
EAPI void e_menu_category_callback_set(char *category, void (*create) (E_Menu *m, void *category_data, void *data), void (free) (void *data), void *data);
EAPI void e_menu_pre_activate_callback_set(E_Menu *m, void (*func) (void *data, E_Menu *m), void *data);
EAPI void e_menu_post_deactivate_callback_set(E_Menu *m, void (*func) (void *data, E_Menu *m), void *data);