forked from enlightenment/enlightenment
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:
parent
98d70425c2
commit
ce341fa4df
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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
|
||||
|
|
104
src/bin/e_fm.c
104
src/bin/e_fm.c
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue