This is an automated email from the git hooks/post-receive script.

git pushed a commit to branch master
in repository efm2.

View the commit online.

commit ed20bec57a8a506c13c7f1ac6c497adbbd7defb6
Author: Carsten Haitzler (Rasterman) <ras...@rasterman.com>
AuthorDate: Thu Mar 20 17:39:20 2025 +0000

    right click away from icons now shows a sensible menu
---
 src/efm/efm_popup_menu.c | 297 +++++++++++++++++++----------------------------
 1 file changed, 119 insertions(+), 178 deletions(-)

diff --git a/src/efm/efm_popup_menu.c b/src/efm/efm_popup_menu.c
index e4d64f3..692e1e2 100644
--- a/src/efm/efm_popup_menu.c
+++ b/src/efm/efm_popup_menu.c
@@ -4,61 +4,7 @@
 #include "efm_util.h"
 #include "mimeapps.h"
 
-static void
-_cb_menu_done(void *data, void *data2, Evas_Object *efm, const Efm_Menu *menu)
-{
-  printf("menu done\n");
-}
-
-static void
-_cb_ic_item1(void *data, void *data2, Evas_Object *efm,
-             const Efm_Menu_Item *menu_item)
-{
-  printf("ic1\n");
-}
-
-static void
-_cb_ic_item2(void *data, void *data2, Evas_Object *efm,
-             const Efm_Menu_Item *menu_item)
-{
-  printf("ic2\n");
-}
-
-static void
-_cb_ic_item3(void *data, void *data2, Evas_Object *efm,
-             const Efm_Menu_Item *menu_item)
-{
-  printf("ic3\n");
-}
-
-static void
-_cb_ic_item4(void *data, void *data2, Evas_Object *efm,
-             const Efm_Menu_Item *menu_item)
-{
-  printf("ic4\n");
-}
-
-static void
-_cb_ic_item5(void *data, void *data2, Evas_Object *efm,
-             const Efm_Menu_Item *menu_item)
-{
-  printf("ic5\n");
-}
-
-static void
-_cb_ic_item6(void *data, void *data2, Evas_Object *efm,
-             const Efm_Menu_Item *menu_item)
-{
-  printf("ic6\n");
-}
-
-static void
-_cb_ic_item7(void *data, void *data2, Evas_Object *efm,
-             const Efm_Menu_Item *menu_item)
-{
-  printf("ic7\n");
-}
-
+/* have this to put a full icon for a file in the menu - unused right now
 static const char *
 _icon_strbuf_icon_def(Icon *icon, Eina_Strbuf *icbuf)
 {
@@ -114,9 +60,10 @@ _icon_strbuf_icon_def(Icon *icon, Eina_Strbuf *icbuf)
   if ((icstr) && (!icstr[0])) icstr = NULL;
   return icstr;
 }
+*/
 
 typedef struct
-{
+{ // context data for popup menu while menu is up
   Smart_Data     *sd;
   Efreet_Desktop *d_main;
   Eina_List      *desktops;
@@ -124,29 +71,21 @@ typedef struct
 } Popup_Context;
 
 static void
-_cb_menu_file_done(void *data, void *data2, Evas_Object *efm,
-                   const Efm_Menu *menu)
-{
+_cb_menu_file_done(void *data, void *data2 EINA_UNUSED, Evas_Object *efm EINA_UNUSED,
+                   const Efm_Menu *menu EINA_UNUSED)
+{ // clean up popuop context data when menu is done
   Popup_Context  *ctx = data;
   Efreet_Desktop *d;
 
-  printf("menu file done\n");
-  efreet_desktop_unref(ctx->d_main);
+  if (ctx->d_main) efreet_desktop_unref(ctx->d_main);
   if (ctx->mime) eina_stringshare_del(ctx->mime);
   EINA_LIST_FREE(ctx->desktops, d) efreet_desktop_unref(d);
   free(ctx);
 }
 
 static void
-_cb_menu_open_with_done(void *data, void *data2, Evas_Object *efm,
-                        const Efm_Menu *menu)
-{
-  printf("menu open with done\n");
-}
-
-static void
-_cb_menu_item_open(void *data, void *data2, Evas_Object *efm,
-                   const Efm_Menu_Item *menu_item)
+_cb_menu_item_open(void *data, void *data2, Evas_Object *efm EINA_UNUSED,
+                   const Efm_Menu_Item *menu_item EINA_UNUSED)
 {
   Popup_Context  *ctx = data;
   Efreet_Desktop *d   = data2;
@@ -155,7 +94,7 @@ _cb_menu_item_open(void *data, void *data2, Evas_Object *efm,
   printf("open\n");
   if (!d)
     {
-      // XXX: if d == NULL tghen ask for desktop in sel
+      // XXX: if d == NULL then _cb_menu_item_open_all()
       return;
     }
   // we know the desktop to use - ask backend to file-run
@@ -181,16 +120,19 @@ _cb_menu_item_open(void *data, void *data2, Evas_Object *efm,
 }
 
 static void
-_cb_menu_item_open_all(void *data, void *data2, Evas_Object *efm,
-                       const Efm_Menu_Item *menu_item)
+_cb_menu_item_open_all(void *data, void *data2 EINA_UNUSED,
+                       Evas_Object *efm EINA_UNUSED,
+                       const Efm_Menu_Item *menu_item EINA_UNUSED)
 {
-  printf("open all select dialog\n");
+  Popup_Context *ctx = data;
+  printf("open all select dialog %p\n", ctx);
 }
 
 static void
 _cb_menu_item_rename(void *data, void *data2, Evas_Object *efm,
                      const Efm_Menu_Item *menu_item)
 {
+  Popup_Context *ctx = data;
   printf("rename\n");
 }
 
@@ -198,6 +140,7 @@ static void
 _cb_menu_item_cut(void *data, void *data2, Evas_Object *efm,
                   const Efm_Menu_Item *menu_item)
 {
+  Popup_Context *ctx = data;
   printf("cut\n");
 }
 
@@ -205,6 +148,7 @@ static void
 _cb_menu_item_copy(void *data, void *data2, Evas_Object *efm,
                    const Efm_Menu_Item *menu_item)
 {
+  Popup_Context *ctx = data;
   printf("copy\n");
 }
 
@@ -212,6 +156,7 @@ static void
 _cb_menu_item_paste(void *data, void *data2, Evas_Object *efm,
                     const Efm_Menu_Item *menu_item)
 {
+  Popup_Context *ctx = data;
   printf("paste\n");
 }
 
@@ -219,6 +164,7 @@ static void
 _cb_menu_item_delete(void *data, void *data2, Evas_Object *efm,
                      const Efm_Menu_Item *menu_item)
 {
+  Popup_Context *ctx = data;
   printf("delete\n");
 }
 
@@ -226,6 +172,7 @@ static void
 _cb_menu_item_props(void *data, void *data2, Evas_Object *efm,
                     const Efm_Menu_Item *menu_item)
 {
+  Popup_Context *ctx = data;
   printf("props\n");
 }
 
@@ -233,6 +180,7 @@ static void
 _cb_menu_item_sel_all(void *data, void *data2, Evas_Object *efm,
                       const Efm_Menu_Item *menu_item)
 {
+  Popup_Context *ctx = data;
   printf("sel all\n");
 }
 
@@ -240,6 +188,7 @@ static void
 _cb_menu_item_sel_none(void *data, void *data2, Evas_Object *efm,
                       const Efm_Menu_Item *menu_item)
 {
+  Popup_Context *ctx = data;
   printf("sel none\n");
 }
 
@@ -247,6 +196,7 @@ static void
 _cb_menu_item_refresh(void *data, void *data2, Evas_Object *efm,
                       const Efm_Menu_Item *menu_item)
 {
+  Popup_Context *ctx = data;
   printf("refresh\n");
 }
 
@@ -254,6 +204,7 @@ static void
 _cb_menu_item_mkdir(void *data, void *data2, Evas_Object *efm,
                       const Efm_Menu_Item *menu_item)
 {
+  Popup_Context *ctx = data;
   printf("mkdir\n");
 }
 
@@ -261,6 +212,7 @@ static void
 _cb_menu_item_close(void *data, void *data2, Evas_Object *efm,
                       const Efm_Menu_Item *menu_item)
 {
+  Popup_Context *ctx = data;
   printf("close\n");
 }
 
@@ -269,8 +221,6 @@ _efm_popup_icon_menu_add(Smart_Data *sd, Icon *ic, Evas_Coord x, Evas_Coord y)
 { // menu click on icon(s)
   Popup_Context *ctx;
   Efm_Menu      *m1, *m2;
-  Eina_Strbuf   *icbuf;
-  const char    *icstr;
   Efreet_Desktop *d_main = NULL;
 
   printf("POPUP MENU ICON\n");
@@ -293,8 +243,7 @@ _efm_popup_icon_menu_add(Smart_Data *sd, Icon *ic, Evas_Coord x, Evas_Coord y)
     const char     *icon = NULL;
 
     // XXX: ask backend to fill in the menu or to augment it?
-    m2 = _efm_menu_add("Open With", NULL,
-                       _cb_menu_open_with_done, ctx, NULL);
+    m2 = _efm_menu_add("Open With", NULL, NULL, NULL, NULL);
     _efm_menu_it_sub(m1, "Open With", NULL, m2);
     ctx->d_main = d_main;
     if (d_main)
@@ -337,118 +286,110 @@ _efm_popup_icon_menu_add(Smart_Data *sd, Icon *ic, Evas_Coord x, Evas_Coord y)
     _efm_menu_it_normal(m2, "Select Other", NULL, _cb_menu_item_open_all, ctx,
                         NULL);
   }
-  // XXX: actions
+  // actions
   _efm_menu_it_separator(m1);
-  _efm_menu_it_normal(m1, "Rename", "std:edit-rename", _cb_menu_item_rename, ctx, NULL);
-  _efm_menu_it_normal(m1, "Cut", "std:edit-cut", _cb_menu_item_cut, ctx, NULL);
-  _efm_menu_it_normal(m1, "Copy", "std:edit-copy", _cb_menu_item_copy, ctx, NULL);
-  _efm_menu_it_normal(m1, "Paste", "std:edit-paste", _cb_menu_item_paste, ctx, NULL);
-  _efm_menu_it_normal(m1, "Delete", "std:delete", _cb_menu_item_delete, ctx, NULL);
+  {
+    m2 = _efm_menu_add("Actions", NULL, NULL, NULL, NULL);
+    _efm_menu_it_sub(m1, "Actions", NULL, m2);
+    _efm_menu_it_normal(m2, "Cut", "std:edit-cut", _cb_menu_item_cut, ctx, NULL);
+    _efm_menu_it_normal(m2, "Copy", "std:edit-copy", _cb_menu_item_copy, ctx,
+                        NULL);
+    _efm_menu_it_normal(m2, "Paste", "std:edit-paste", _cb_menu_item_paste, ctx,
+                        NULL);
+    _efm_menu_it_normal(m2, "Rename", "std:edit-rename", _cb_menu_item_rename,
+                        ctx, NULL);
+    _efm_menu_it_normal(m2, "Delete", "std:delete", _cb_menu_item_delete, ctx,
+                        NULL);
+    _efm_menu_it_separator(m2);
+    _efm_menu_it_normal(m2, "Properties", "std:document-properties",
+                        _cb_menu_item_props, ctx, NULL);
+    _efm_menu_it_normal(m2, "Create Directory", "std:folder-new",
+                        _cb_menu_item_mkdir, ctx, NULL);
+  }
   _efm_menu_it_separator(m1);
-  _efm_menu_it_normal(m1, "Properties", "std:document-properties", _cb_menu_item_props, ctx, NULL);
+  // view subdir
+  {
+    m2 = _efm_menu_add("View", NULL, NULL, NULL, NULL);
+    _efm_menu_it_sub(m1, "View", NULL, m2);
+   _efm_menu_it_normal(m2, "Select All", "std:edit-select-all",
+                        _cb_menu_item_sel_all, ctx, NULL);
+    _efm_menu_it_normal(m2, "Select None", NULL, _cb_menu_item_sel_none, ctx, NULL);
+    _efm_menu_it_normal(m2, "Refresh", "std:view-refresh", _cb_menu_item_refresh, ctx, NULL);
+    // XXX: sort
+   // XXX: show hidden
+  }
   _efm_menu_it_separator(m1);
-  // XXX: view subdir
-  _efm_menu_it_normal(m1, "Select All", "std:edit-select-all",
-                      _cb_menu_item_sel_all, ctx, NULL);
-  _efm_menu_it_normal(m1, "Select None", NULL, _cb_menu_item_sel_none, ctx, NULL);
-  _efm_menu_it_normal(m1, "Refresh", "std:view-refresh", _cb_menu_item_refresh, ctx, NULL);
-  _efm_menu_it_normal(m1, "Create Directory", "std:folder-new", _cb_menu_item_mkdir, ctx,
+  _efm_menu_it_normal(m1, "Close", "std:window-close", _cb_menu_item_close, ctx,
                       NULL);
-  // XXX: sort
-  // XXX: show hidden
-  _efm_menu_it_separator(m1);
-  _efm_menu_it_normal(m1, "Close", "std:window-close", _cb_menu_item_close, ctx, NULL);
   _efm_menu_show(ic->sd->o_smart, m1, x, y);
 
   return m1;
-  // XXX: right click icon menu.... should have
-  //
-  // regular menu:
-  // (if num selected > 0) Open
-  // (if dir) Open new win (or same win depending on cfg)
-  // (if num selected > 0) Open with -> list mime desktops + Other...
-  // Actions -> list of desktops that have actions for this mime
-  // ---
-  // (if can werite) Cut
-  // Copy
-  // (if can write) Paste
-  // Copy path
-  // ---
-  // Seklect all / none
-  // ---
-  // (if can write) Trash
-  // (if can write) Delete
-  // ---
-  // (if can write) Rename
-  // ---
-  // Properties
-  // ---
-  // View mode ->  list of efnm view modes if can change
-  // Sort -> list of sort modes/flags if can change
-  // (if can change) View Settings
-  // ---
-  // Refresh View
-  // ---
-  // (if can write) New Dir
-  // (if view win) Close view
-  // XXX: need to know to dismiss menu if icon freed
-  //
-  // allow backend to handkle right click instead and request show
-  // of menu then from backend
-
-  icbuf = eina_strbuf_new();
-  m1    = _efm_menu_add("Submenu", "std:mail-reply-all", NULL, NULL, NULL);
-  _efm_menu_it_normal(m1, "Item 1", "std:menu/folder", _cb_ic_item1, ic, NULL);
-  _efm_menu_it_normal(m1, "Item 2", "std:system-lock-screen", _cb_ic_item2, ic,
-                      NULL);
-  _efm_menu_it_separator(m1);
-  _efm_menu_it_normal(m1, "Item 3 - much longer label", "std:media-eject",
-                      _cb_ic_item3, ic, NULL);
-  _efm_menu_it_normal(m1, "Item 4", "std:battery", _cb_ic_item4, ic, NULL);
-  m2    = _efm_menu_add("Main Menu", "std:security-high", _cb_menu_done, NULL,
-                        NULL);
-  icstr = _icon_strbuf_icon_def(ic, icbuf);
-  _efm_menu_it_normal(m2, ic->info.label, icstr, _cb_ic_item5, ic, NULL);
-  _efm_menu_it_normal(m2, "Item 5", "std:system-run", _cb_ic_item5, ic, NULL);
-  _efm_menu_it_separator(m2);
-  _efm_menu_it_check(m2, "Check 1", "std:folder", EINA_FALSE, _cb_ic_item6,
-                     ic, NULL);
-  _efm_menu_it_check(m2, "Check 2", "std:user-home", EINA_TRUE, _cb_ic_item7,
-                     ic, NULL);
-  _efm_menu_it_separator(m2);
-  _efm_menu_it_radio(m2, "Radio 1", "std:user-desktop", EINA_FALSE,
-                     _cb_ic_item6, ic, NULL);
-  _efm_menu_it_radio(m2, "Radio 2", NULL, EINA_TRUE, _cb_ic_item6, ic, NULL);
-  _efm_menu_it_radio(m2, "Radio 3", "std:computer", EINA_FALSE, _cb_ic_item6,
-                     ic, NULL);
-  _efm_menu_it_separator(m2);
-  _efm_menu_it_radio(m2, "Radio 1", "std:drive-optical", EINA_FALSE,
-                     _cb_ic_item6, ic, NULL);
-  _efm_menu_it_radio(m2, "Radio 2", "std:drive-harddisk", EINA_FALSE,
-                     _cb_ic_item6, ic, NULL);
-  _efm_menu_it_radio(m2, "Radio 3", NULL, EINA_TRUE, _cb_ic_item6, ic, NULL);
-  _efm_menu_it_sub(m2, "Submenu here", "fdo:terminology", m1);
-
-  _efm_menu_show(ic->sd->o_smart, m2, x, y);
-  eina_strbuf_free(icbuf);
-
-  return m2;
 }
 
 Efm_Menu *
 _efm_popup_main_menu_add(Smart_Data *sd, Evas_Coord x, Evas_Coord y)
 { // menu click in blank area
-  Efm_Menu *m;
+  Popup_Context *ctx;
+  Efm_Menu      *m1, *m2;
+  Eina_List     *bl, *il;
+  Block         *block;
+  Icon          *ic = NULL;
 
-  m = _efm_menu_add("Main Menu", "std:security-high", _cb_menu_done, NULL,
-                    NULL);
-  _efm_menu_it_normal(m, "Item 1", "std:menu/folder", _cb_ic_item1, sd, NULL);
-  _efm_menu_it_normal(m, "Item 2", "std:system-lock-screen", _cb_ic_item2, sd,
+  printf("POPUP MENU\n");
+  // find firt selected icon
+  EINA_LIST_FOREACH(sd->blocks, bl, block)
+  {
+    if (block->selected_num > 0)
+      {
+        EINA_LIST_FOREACH(block->icons, il, ic)
+        {
+          if (ic->selected) goto found;
+          ic = NULL;
+        }
+      }
+  }
+found:
+  // if we have selected icons then do the same menu as if first icon menu
+  if (ic) return _efm_popup_icon_menu_add(sd, ic, x, y);
+
+  // nothing was selected so do a simpler menu
+  ctx = calloc(1, sizeof(Popup_Context));
+  if (!ctx) return NULL;
+  ctx->sd = sd;
+
+  m1 = _efm_menu_add("File", "std:file", _cb_menu_file_done, ctx, NULL);
+  // actions
+  _efm_menu_it_separator(m1);
+  {
+    m2 = _efm_menu_add("Actions", NULL, NULL, NULL, NULL);
+    _efm_menu_it_sub(m1, "Actions", NULL, m2);
+    _efm_menu_it_normal(m2, "Paste", "std:edit-paste", _cb_menu_item_paste, ctx,
+                        NULL);
+    _efm_menu_it_separator(m2);
+    // XXX: this is properties of the DIR nmot file
+    _efm_menu_it_normal(m2, "Properties", "std:document-properties",
+                        _cb_menu_item_props, ctx, NULL);
+    _efm_menu_it_normal(m2, "Create Directory", "std:folder-new",
+                        _cb_menu_item_mkdir, ctx, NULL);
+  }
+  _efm_menu_it_separator(m1);
+  // view subdir
+  {
+    m2 = _efm_menu_add("View", NULL, NULL, NULL, NULL);
+    _efm_menu_it_sub(m1, "View", NULL, m2);
+    _efm_menu_it_normal(m2, "Select All", "std:edit-select-all",
+                        _cb_menu_item_sel_all, ctx, NULL);
+    _efm_menu_it_normal(m2, "Refresh", "std:view-refresh",
+                        _cb_menu_item_refresh, ctx, NULL);
+    // XXX: sort
+    // XXX: show hidden
+  }
+  _efm_menu_it_separator(m1);
+  _efm_menu_it_normal(m1, "Close", "std:window-close", _cb_menu_item_close, ctx,
                       NULL);
-  _efm_menu_it_separator(m);
-  _efm_menu_it_normal(m, "Item 3 - much longer label", "std:media-eject",
-                      _cb_ic_item3, sd, NULL);
-  _efm_menu_it_normal(m, "Item 4", "std:battery", _cb_ic_item4, sd, NULL);
-  _efm_menu_show(sd->o_smart, m, x, y);
-  return m;
+  _efm_menu_show(sd->o_smart, m1, x, y);
+  return m1;
+  //  const char  *icstr = _icon_strbuf_icon_def(ic, icbuf);
+  //  _efm_menu_it_normal(m2, ic->info.label, icstr, _cb_ic_item5, ic, NULL);
+  //  eina_strbuf_free(icbuf);
 }
\ No newline at end of file

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.

Reply via email to