This is an automated email from the git hooks/post-receive script.
git pushed a commit to branch master
in repository enlightenment.
View the commit online.
commit 422c0b6765aa5ffb6c8cd25f8fac461332a1eb58
Author: Carsten Haitzler <[email protected]>
AuthorDate: Fri May 20 13:24:35 2022 +0100
efm - support system provided desktop files for actions
right clikc -> actions -> ... here
you might want desktop files that have
X-Enlightenment-Action-Mime=inode/directory
in them - then they will be included in that menu and whatever is
executed is passed the dir when run as an argument. example:
[Desktop Entry]
Type=Application
Name=Dir xmessage
Exec=xmessage
Icon=video_player
NoDisplay=true
X-Enlightenment-Action-Mime=inode/directory
---
src/modules/fileman/e_fwin.c | 126 +++++++++++++++++++++++++++++++++++++++++--
1 file changed, 122 insertions(+), 4 deletions(-)
diff --git a/src/modules/fileman/e_fwin.c b/src/modules/fileman/e_fwin.c
index 4d3aac70e..19c71aa35 100644
--- a/src/modules/fileman/e_fwin.c
+++ b/src/modules/fileman/e_fwin.c
@@ -259,12 +259,119 @@ _e_fwin_client_hook_focus_unset(void *d EINA_UNUSED, E_Client *ec)
evas_object_focus_set(fwin->cur_page->fm_obj, 1);
}
+typedef struct _E_Fwin_Mime_Handler
+{
+ const char *mime;
+ Efreet_Desktop *desktop;
+ E_Fm2_Mime_Handler *handler;
+} E_Fwin_Mime_Handler;
+
+static Ecore_Event_Handler *_e_fwin_efreet_desktop_update_handler = NULL;
+static Eina_List *_e_fwin_mime_all_handlers_list = NULL;
+
+static int
+_e_fwin_cb_dir_mime_handler_test(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *path)
+{
+ if (ecore_file_is_dir(path)) return 1;
+ if (e_fm2_real_path_get(obj))
+ {
+ evas_object_data_set(obj, "fileman_terminal_realpath", (void*)1);
+ return 1;
+ }
+ return 0;
+}
+
+static void
+_e_fwin_cb_dir_mime_handler(void *data, Evas_Object *obj EINA_UNUSED, const char *path)
+{
+ E_Fwin_Mime_Handler *h = data;
+ Eina_Stringshare *rp;
+ Eina_List *files = NULL;
+
+ rp = e_fm2_real_path_get(obj);
+ if (rp && (rp != path) && (evas_object_data_del(obj, "fileman_terminal_realpath"))) //icon menu; use rp
+ path = rp;
+ files = eina_list_append(files, path);
+ e_exec(e_zone_current_get(), h->desktop, NULL, files, "fileman");
+ eina_list_free(files);
+}
+
+static void
+_e_fwin_mime_all_handlers_fill(void)
+{
+ E_Fwin_Mime_Handler *h;
+ Eina_List *desktops;
+ Efreet_Desktop *desktop;
+
+ desktops = efreet_util_desktop_name_glob_list("*");
+ EINA_LIST_FREE(desktops, desktop)
+ {
+ const char *mime = eina_hash_find
+ (desktop->x, "X-Enlightenment-Action-Mime");
+ if (!mime) continue;
+ h = calloc(1, sizeof(E_Fwin_Mime_Handler));
+ if (!h) continue;
+ h->mime = eina_stringshare_add(mime);
+ h->desktop = desktop;
+ efreet_desktop_ref(desktop);
+ h->handler = e_fm2_mime_handler_new
+ (desktop->name, desktop->icon,
+ _e_fwin_cb_dir_mime_handler, h,
+ _e_fwin_cb_dir_mime_handler_test, h);
+ e_fm2_mime_handler_mime_add(h->handler, h->mime);
+ _e_fwin_mime_all_handlers_list =
+ eina_list_append(_e_fwin_mime_all_handlers_list, h);
+ }
+}
+
+static void
+_e_fwin_mime_all_handlers_clear(void)
+{
+ E_Fwin_Mime_Handler *h;
+
+ EINA_LIST_FREE(_e_fwin_mime_all_handlers_list, h)
+ {
+ efreet_desktop_free(h->desktop);
+ e_fm2_mime_handler_mime_del(h->handler, h->mime);
+ e_fm2_mime_handler_free(h->handler);
+ eina_stringshare_del(h->mime);
+ free(h);
+ }
+}
+
+static Eina_Bool
+_e_fwin_cb_efreet_cache_update(void *data EINA_UNUSED, int type EINA_UNUSED, void *ev EINA_UNUSED)
+{
+ _e_fwin_mime_all_handlers_clear();
+ _e_fwin_mime_all_handlers_fill();
+ return ECORE_CALLBACK_RENEW;
+}
+
+static void
+_e_fwin_mime_all_handlers_init(void)
+{
+ _e_fwin_efreet_desktop_update_handler =
+ ecore_event_handler_add(EFREET_EVENT_DESKTOP_CACHE_UPDATE,
+ _e_fwin_cb_efreet_cache_update, NULL);
+ _e_fwin_mime_all_handlers_fill();
+}
+
+static void
+_e_fwin_mime_all_handlers_shutdown(void)
+{
+ _e_fwin_mime_all_handlers_clear();
+ ecore_event_handler_del(_e_fwin_efreet_desktop_update_handler);
+}
+
/* externally accessible functions */
int
e_fwin_init(void)
{
focus_out_hook = e_client_hook_add(E_CLIENT_HOOK_FOCUS_UNSET, _e_fwin_client_hook_focus_unset, NULL);
fwin_class = eina_stringshare_add("e_fwin");
+
+ _e_fwin_mime_all_handlers_init();
+
tdesktop = e_util_terminal_desktop_get();
if (!tdesktop) return 1;
dir_handler = e_fm2_mime_handler_new(_("Open Terminal here"),
@@ -272,6 +379,7 @@ e_fwin_init(void)
_e_fwin_cb_dir_handler, NULL,
_e_fwin_cb_dir_handler_test, NULL);
e_fm2_mime_handler_mime_add(dir_handler, "inode/directory");
+
return 1;
}
@@ -283,16 +391,26 @@ e_fwin_shutdown(void)
EINA_LIST_FREE(fwins, fwin)
e_object_del(E_OBJECT(fwin));
- eina_stringshare_replace(&fwin_class, NULL);
if (dir_handler)
{
e_fm2_mime_handler_mime_del(dir_handler, "inode/directory");
e_fm2_mime_handler_free(dir_handler);
+ dir_handler = NULL;
+ }
+ if (tdesktop)
+ {
+ efreet_desktop_free(tdesktop);
+ tdesktop = NULL;
}
- efreet_desktop_free(tdesktop);
- tdesktop = NULL;
- dir_handler = NULL;
+ _e_fwin_mime_all_handlers_shutdown();
+
+ eina_stringshare_replace(&fwin_class, NULL);
+ if (focus_out_hook)
+ {
+ e_client_hook_del(focus_out_hook);
+ focus_out_hook = NULL;
+ }
return 1;
}
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.