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.

Reply via email to