E_Menu *m,
E_Menu_Item *mi);
static void _e_mod_main_menu_cb(E_Menu *m, void *category_data, void *data);
-static void _e_mod_menu_populate(void *d __UNUSED__, E_Menu *m);
+static void _e_mod_menu_populate(void *d __UNUSED__, E_Menu *m, E_Menu_Item *mi);
static void _e_mod_menu_cleanup_cb(void *obj);
static void _e_mod_menu_add(void *data,
E_Menu *m);
{
if (ecore_file_exists(uri->path))
{
- E_Menu *sub;
if (need_separator)
{
mi = e_menu_item_new(m);
e_util_menu_item_theme_icon_set(mi, "folder");
e_menu_item_callback_set(mi, _e_mod_menu_gtk_cb,
(void *)eina_stringshare_add(uri->path));
- sub = e_menu_new();
- e_object_data_set(E_OBJECT(sub), eina_stringshare_add("/"));
- e_object_free_attach_func_set(E_OBJECT(sub), _e_mod_menu_cleanup_cb);
- e_menu_item_submenu_set(mi, sub);
- e_menu_freeze(sub);
- e_menu_pre_activate_callback_set(sub, _e_mod_menu_populate, NULL);
+ e_menu_item_submenu_pre_callback_set(mi, _e_mod_menu_populate, eina_stringshare_add("/"));
}
}
if (uri) efreet_uri_free(uri);
{
E_Menu *m = data;
E_Menu_Item *mi;
- E_Menu *sub;
const char *dev, *path;
mi = m->parent_item;
//fprintf(stderr, "PATH SET: %s\n", e_object_data_get(E_OBJECT(mi)));
e_object_free_attach_func_set(E_OBJECT(mi), _e_mod_menu_cleanup_cb);
e_menu_item_callback_set(mi, _e_mod_menu_populate_cb, dev);
- sub = e_menu_new();
- e_object_data_set(E_OBJECT(sub), eina_stringshare_ref(dev));
- e_object_free_attach_func_set(E_OBJECT(sub), _e_mod_menu_cleanup_cb);
- e_menu_item_submenu_set(mi, sub);
- e_menu_freeze(sub);
- e_menu_pre_activate_callback_set(sub, _e_mod_menu_populate, NULL);
+ e_menu_item_submenu_pre_callback_set(mi, _e_mod_menu_populate, eina_stringshare_ref(dev));
}
static void
}
static void
-_e_mod_menu_populate(void *d __UNUSED__, E_Menu *m)
+_e_mod_menu_populate(void *d, E_Menu *m __UNUSED__, E_Menu_Item *mi)
{
- E_Menu_Item *mi;
+ E_Menu *subm;
const char *dev, *path, *rp;
Eio_File *ls;
- if (m->items) return;
- mi = m->parent_item;
- dev = e_object_data_get(E_OBJECT(m));
+ subm = mi->submenu;
+ if (subm && subm->items) return;
+ if (!subm)
+ {
+ subm = e_menu_new();
+ e_object_data_set(E_OBJECT(subm), d);
+ e_object_free_attach_func_set(E_OBJECT(subm), _e_mod_menu_cleanup_cb);
+ e_menu_item_submenu_set(mi, subm);
+ e_menu_freeze(subm);
+ }
+ dev = d;
path = mi ? e_object_data_get(E_OBJECT(mi)) : NULL;
rp = e_fm2_real_path_map(dev, path ?: "/");
- ls = eio_file_stat_ls(rp, _e_mod_menu_populate_filter, _e_mod_menu_populate_item, _e_mod_menu_populate_done, _e_mod_menu_populate_err, m);
+ ls = eio_file_stat_ls(rp, _e_mod_menu_populate_filter, _e_mod_menu_populate_item, _e_mod_menu_populate_done, _e_mod_menu_populate_err, subm);
EINA_SAFETY_ON_NULL_RETURN(ls);
eina_stringshare_del(rp);
}
/* menu item add hook */
void
-_e_mod_menu_generate(void *data __UNUSED__,
- E_Menu *m)
+_e_mod_menu_generate(void *data __UNUSED__, E_Menu *m, E_Menu_Item *mi)
{
- E_Menu_Item *mi;
- E_Menu *sub;
E_Volume *vol;
const char *s;
const Eina_List *l;
Eina_Bool need_separator;
Eina_Bool volumes_visible = 0;
+ m = e_menu_new();
+ e_menu_item_submenu_set(mi, m);
+ e_menu_freeze(m);
+
/* Home */
mi = e_menu_item_new(m);
e_menu_item_label_set(mi, _("Home"));
e_util_menu_item_theme_icon_set(mi, "user-home");
s = eina_stringshare_add("~/");
e_menu_item_callback_set(mi, _e_mod_menu_virtual_cb, s);
- sub = e_menu_new();
- e_object_data_set(E_OBJECT(sub), s);
- e_object_free_attach_func_set(E_OBJECT(sub), _e_mod_menu_cleanup_cb);
- e_menu_item_submenu_set(mi, sub);
- e_menu_freeze(sub);
- e_menu_pre_activate_callback_set(sub, _e_mod_menu_populate, NULL);
+ e_menu_item_submenu_pre_callback_set(mi, _e_mod_menu_populate, s);
/* Desktop */
mi = e_menu_item_new(m);
e_util_menu_item_theme_icon_set(mi, "user-desktop");
s = eina_stringshare_add("desktop");
e_menu_item_callback_set(mi, _e_mod_menu_virtual_cb, s);
- sub = e_menu_new();
- e_object_data_set(E_OBJECT(sub), s);
- e_object_free_attach_func_set(E_OBJECT(sub), _e_mod_menu_cleanup_cb);
- e_menu_item_submenu_set(mi, sub);
- e_menu_freeze(sub);
- e_menu_pre_activate_callback_set(sub, _e_mod_menu_populate, NULL);
+ e_menu_item_submenu_pre_callback_set(mi, _e_mod_menu_populate, s);
/* Favorites */
mi = e_menu_item_new(m);
e_util_menu_item_theme_icon_set(mi, "user-bookmarks");
s = eina_stringshare_add("favorites");
e_menu_item_callback_set(mi, _e_mod_menu_virtual_cb, s);
- sub = e_menu_new();
- e_object_data_set(E_OBJECT(sub), s);
- e_object_free_attach_func_set(E_OBJECT(sub), _e_mod_menu_cleanup_cb);
- e_menu_item_submenu_set(mi, sub);
- e_menu_freeze(sub);
- e_menu_pre_activate_callback_set(sub, _e_mod_menu_populate, NULL);
+ e_menu_item_submenu_pre_callback_set(mi, _e_mod_menu_populate, s);
/* Trash */
//~ mi = e_menu_item_new(em);
e_util_menu_item_theme_icon_set(mi, "computer");
s = eina_stringshare_add("/");
e_menu_item_callback_set(mi, _e_mod_menu_virtual_cb, s);
- sub = e_menu_new();
- e_object_data_set(E_OBJECT(sub), s);
- e_object_free_attach_func_set(E_OBJECT(sub), _e_mod_menu_cleanup_cb);
- e_menu_item_submenu_set(mi, sub);
- e_menu_freeze(sub);
- e_menu_pre_activate_callback_set(sub, _e_mod_menu_populate, NULL);
+ e_menu_item_submenu_pre_callback_set(mi, _e_mod_menu_populate, s);
need_separator = 1;
/* Volumes */
//~ }
e_menu_pre_activate_callback_set(m, NULL, NULL);
+ e_menu_thaw(m);
}
void
{
#ifdef ENABLE_FILES
E_Menu_Item *mi;
- E_Menu *sub;
mi = e_menu_item_new(m);
e_menu_item_label_set(mi, _("Navigate..."));
e_util_menu_item_theme_icon_set(mi, "system-file-manager");
- sub = e_menu_new();
- e_menu_item_submenu_set(mi, sub);
- e_menu_pre_activate_callback_set(sub, _e_mod_menu_generate, NULL);
+ e_menu_item_submenu_pre_callback_set(mi, _e_mod_menu_generate, NULL);
#else
(void)m;
#endif