E_FM Context Menus :)

Big Thanks to CodeWarrior for his help !!!

Add context handler for backgrounds. Can now right-click an .edj and Set as
Background.


SVN revision: 32068
This commit is contained in:
Christopher Michael 2007-10-14 16:06:51 +00:00
parent 98d70425c2
commit ce341fa4df
3 changed files with 132 additions and 14 deletions

View File

@ -9,6 +9,7 @@ static void _e_bg_event_bg_update_free(void *data, void *event);
/* local subsystem globals */
EAPI int E_EVENT_BG_UPDATE = 0;
static E_Fm2_Mime_Handler *bg_hdl = NULL;
/* externally accessible functions */
EAPI int
@ -16,6 +17,12 @@ e_bg_init(void)
{
Evas_List *l = NULL;
/* Register mime handler */
bg_hdl = e_fm2_mime_handler_new(_("Set As Background"), NULL,
e_bg_handler_set, NULL,
e_bg_handler_test, NULL);
e_fm2_mime_handler_glob_add(bg_hdl, "*.edj");
/* Register files in use */
if (e_config->desktop_default_background)
e_filereg_register(e_config->desktop_default_background);
@ -38,7 +45,10 @@ e_bg_shutdown(void)
{
Evas_List *l = NULL;
/* Register files in use */
/* Deregister mime handler */
if (bg_hdl) e_fm2_mime_handler_free(bg_hdl);
/* Deregister files in use */
if (e_config->desktop_default_background)
e_filereg_deregister(e_config->desktop_default_background);
@ -330,8 +340,32 @@ e_bg_update(void)
}
}
/* local subsystem functions */
EAPI void
e_bg_handler_set(Evas_Object *obj, const char *path, void *data)
{
E_Container *con;
E_Zone *zone;
E_Desk *desk;
if (!path) return;
con = e_container_current_get(e_manager_current_get());
zone = e_zone_current_get(con);
desk = e_desk_current_get(zone);
e_bg_del(con->num, zone->num, desk->x, desk->y);
e_bg_add(con->num, zone->num, desk->x, desk->y, (char *)path);
e_bg_update();
e_config_save_queue();
}
EAPI int
e_bg_handler_test(Evas_Object *obj, const char *path, void *data)
{
if (!path) return 0;
if (edje_file_group_exists(path, "e/desktop/background")) return 1;
return 0;
}
/* local subsystem functions */
static void
_e_bg_signal(void *data, Evas_Object *obj, const char *emission, const char *source)
{

View File

@ -11,6 +11,7 @@ typedef enum {
} E_Bg_Transition;
typedef struct _E_Event_Bg_Update E_Event_Bg_Update;
#else
#ifndef E_BG_H
#define E_BG_H
@ -35,5 +36,8 @@ EAPI void e_bg_add(int container, int zone, int desk_x, int desk_y, char *file);
EAPI void e_bg_del(int container, int zone, int desk_x, int desk_y);
EAPI void e_bg_default_set(char *file);
EAPI void e_bg_update(void);
EAPI void e_bg_handler_set(Evas_Object *obj, const char *path, void *data);
EAPI int e_bg_handler_test(Evas_Object *obj, const char *path, void *data);
#endif
#endif

View File

@ -18,17 +18,18 @@
typedef enum _E_Fm2_Action_Type
{
FILE_ADD,
FILE_DEL,
FILE_CHANGE
FILE_DEL,
FILE_CHANGE
} E_Fm2_Action_Type;
typedef struct _E_Fm2_Smart_Data E_Fm2_Smart_Data;
typedef struct _E_Fm2_Region E_Fm2_Region;
typedef struct _E_Fm2_Finfo E_Fm2_Finfo;
typedef struct _E_Fm2_Action E_Fm2_Action;
typedef struct _E_Fm2_Client E_Fm2_Client;
typedef struct _E_Fm2_Mount E_Fm2_Mount;
typedef struct _E_Fm2_Uri E_Fm2_Uri;
typedef struct _E_Fm2_Smart_Data E_Fm2_Smart_Data;
typedef struct _E_Fm2_Region E_Fm2_Region;
typedef struct _E_Fm2_Finfo E_Fm2_Finfo;
typedef struct _E_Fm2_Action E_Fm2_Action;
typedef struct _E_Fm2_Client E_Fm2_Client;
typedef struct _E_Fm2_Mount E_Fm2_Mount;
typedef struct _E_Fm2_Uri E_Fm2_Uri;
typedef struct _E_Fm2_Context_Menu_Data E_Fm2_Context_Menu_Data;
struct _E_Fm2_Smart_Data
{
@ -207,6 +208,12 @@ struct _E_Fm2_Uri
const char *path;
};
struct _E_Fm2_Context_Menu_Data
{
E_Fm2_Icon *icon;
E_Fm2_Mime_Handler *handler;
};
static E_Fm2_Mount *_e_fm2_mount(E_Volume *v, void (*mount_ok) (void *data), void (*mount_fail) (void *data), void (*unmount_ok) (void *data), void (*unmount_fail) (void *data), void *data);
static void _e_fm2_unmount(E_Fm2_Mount *m);
static E_Volume *e_volume_find(const char *udi);
@ -301,6 +308,7 @@ static void _e_fm2_menu(Evas_Object *obj, unsigned int timestamp);
static void _e_fm2_menu_post_cb(void *data, E_Menu *m);
static void _e_fm2_icon_menu(E_Fm2_Icon *ic, Evas_Object *obj, unsigned int timestamp);
static void _e_fm2_icon_menu_post_cb(void *data, E_Menu *m);
static void _e_fm2_icon_menu_item_cb(void *data, E_Menu *m, E_Menu_Item *mi);
static void _e_fm2_refresh(void *data, E_Menu *m, E_Menu_Item *mi);
static void _e_fm2_toggle_hidden_files(void *data, E_Menu *m, E_Menu_Item *mi);
static void _e_fm2_toggle_ordering(void *data, E_Menu *m, E_Menu_Item *mi);
@ -351,6 +359,7 @@ static void _e_fm2_client_file_copy(int id, const char *path, const char *dest,
static void _e_fm2_client_mount(const char *udi, const char *mountpoint);
static void _e_fm2_client_unmount(const char *udi);
static void _e_fm2_sel_rect_update(void *data);
static inline void _e_fm2_context_menu_append(Evas_List *l, E_Menu *mn, E_Fm2_Icon *ic);
static char *_e_fm2_meta_path = NULL;
static Evas_Smart *_e_fm2_smart = NULL;
@ -362,7 +371,7 @@ static int _e_fm2_id = 0;
static Evas_List *_e_stores = NULL;
static Evas_List *_e_vols = NULL;
static Evas_List *_e_fm2_mounts = NULL;
static Evas_List *_e_fm2_menu_contexts = NULL;
/* contains:
* _e_volume_edd
@ -6649,7 +6658,8 @@ _e_fm2_icon_menu(E_Fm2_Icon *ic, Evas_Object *obj, unsigned int timestamp)
E_Manager *man;
E_Container *con;
E_Zone *zone;
Evas_List *sel;
Evas_List *sel, *l = NULL;
Evas_List *handlers = NULL;
int x, y, can_w, can_w2, protect;
char buf[4096];
@ -6861,7 +6871,21 @@ _e_fm2_icon_menu(E_Fm2_Icon *ic, Evas_Object *obj, unsigned int timestamp)
"e/fileman/default/button/properties"),
"e/fileman/default/button/properties");
e_menu_item_callback_set(mi, _e_fm2_file_properties, ic);
if (ic->info.mime)
{
/* see if we have any mime handlers registered for this file */
l = e_fm2_mime_handler_mime_handlers_get(ic->info.mime);
_e_fm2_context_menu_append(l, mn, ic);
if (l) evas_list_free(l);
}
/* see if we have any glob handlers registered for this file */
snprintf(buf, sizeof(buf), "*.%s", strrchr(ic->info.file, '.'));
l = e_fm2_mime_handler_glob_handlers_get(buf);
_e_fm2_context_menu_append(l, mn, ic);
if (l) evas_list_free(l);
if (sd->icon_menu.end.func)
sd->icon_menu.end.func(sd->icon_menu.end.data, sd->obj, mn, &(ic->info));
}
@ -6892,6 +6916,38 @@ _e_fm2_icon_menu(E_Fm2_Icon *ic, Evas_Object *obj, unsigned int timestamp)
E_MENU_POP_DIRECTION_DOWN, timestamp);
}
static inline void
_e_fm2_context_menu_append(Evas_List *l, E_Menu *mn, E_Fm2_Icon *ic)
{
Evas_List *ll = NULL;
E_Menu_Item *mi;
if (l)
{
mi = e_menu_item_new(mn);
e_menu_item_separator_set(mi, 1);
for (ll = l; ll; ll = ll->next)
{
E_Fm2_Mime_Handler *handler = NULL;
E_Fm2_Context_Menu_Data *md = NULL;
handler = ll->data;
if (!handler) continue;
md = E_NEW(E_Fm2_Context_Menu_Data, 1);
if (!md) continue;
_e_fm2_menu_contexts = evas_list_append(_e_fm2_menu_contexts, md);
md->icon = ic;
md->handler = handler;
mi = e_menu_item_new(mn);
e_menu_item_label_set(mi, handler->label);
/* TODO: Add Icon */
e_menu_item_callback_set(mi, _e_fm2_icon_menu_item_cb, md);
}
}
}
static void
_e_fm2_icon_menu_post_cb(void *data, E_Menu *m)
{
@ -6899,6 +6955,30 @@ _e_fm2_icon_menu_post_cb(void *data, E_Menu *m)
ic = data;
ic->menu = NULL;
while (_e_fm2_menu_contexts)
{
E_Fm2_Context_Menu_Data *md;
md = _e_fm2_menu_contexts->data;
_e_fm2_menu_contexts = evas_list_remove_list(_e_fm2_menu_contexts,
_e_fm2_menu_contexts);
E_FREE(md);
}
}
static void
_e_fm2_icon_menu_item_cb(void *data, E_Menu *m, E_Menu_Item *mi)
{
E_Fm2_Context_Menu_Data *md = NULL;
Evas_Object *obj = NULL;
char buf[4096];
md = data;
if (!md) return;
obj = md->icon->info.fm;
if (!obj) return;
snprintf(buf, sizeof(buf), "%s/%s", e_fm2_real_path_get(obj), md->icon->info.file);
e_fm2_mime_handler_call(md->handler, obj, buf);
}
static void