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 0a1c76ea27397926c6aea1a8432ffa549b8769cb
Author: Carsten Haitzler (Rasterman) <ras...@rasterman.com>
AuthorDate: Sun Oct 27 14:12:26 2024 +0000

    More work on efm popup menus
---
 TODO.md                  |   2 +
 src/efm/efm.c            |  21 +++-
 src/efm/efm_menu.c       | 121 +++++++++++++++++++
 src/efm/efm_popup_menu.c | 190 ++++++++++++++++++++++++++++++
 src/efm/efm_private.h    |   7 +-
 src/efm/efm_structs.h    |   2 +
 src/efm/efm_util.c       | 298 +----------------------------------------------
 src/efm/meson.build      |   2 +
 8 files changed, 345 insertions(+), 298 deletions(-)

diff --git a/TODO.md b/TODO.md
index cd82a39..94eab2d 100644
--- a/TODO.md
+++ b/TODO.md
@@ -59,6 +59,8 @@
 
 * Find filename in tree
 * Edit desktop file support (dialog)
+* Add thumb edit/gen/modify tools so wrapper scripts can gen thumbs too
+* Work out how to allow elm xdnd handling to work in e on shelf/desktop
 * Network fs monitoring/listing (smb/nfs/etc.)
   * smbnetfs
   * fuse-nfs
diff --git a/src/efm/efm.c b/src/efm/efm.c
index 3474a68..60c71b0 100644
--- a/src/efm/efm.c
+++ b/src/efm/efm.c
@@ -370,11 +370,17 @@ _cb_back_mouse_down(void *data, Evas *e EINA_UNUSED,
   elm_object_focus_set(sd->o_scroller, EINA_TRUE);
   if (ev->button == 1)
     {
-      sd->back_down = EINA_TRUE;
+      sd->back_down   = EINA_TRUE;
       sd->back_down_x = ev->canvas.x;
       sd->back_down_y = ev->canvas.y;
       _efm_sel_store_start(sd, ev->canvas.x, ev->canvas.y);
     }
+  else if (ev->button == 3)
+    {
+      sd->back3_down   = EINA_TRUE;
+      sd->back3_down_x = ev->canvas.x;
+      sd->back3_down_y = ev->canvas.y;
+    }
   if (sd->rename_icon) _icon_rename_end(sd->rename_icon);
   _icon_focus_hide(sd);
 }
@@ -410,8 +416,19 @@ _cb_back_mouse_up(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
     }
   else if (ev->button == 3)
     { // right mouse click
-      // XXX: handle ctxt menu for window
       printf("XXX: right mouse back\n");
+      sd->back3_down = EINA_FALSE;
+      dx             = ev->canvas.x - sd->back3_down_x;
+      dy             = ev->canvas.y - sd->back3_down_y;
+      if (((dx * dx) + (dy * dy)) > (5 * 5)) dragged = EINA_TRUE;
+      if (!dragged)
+        {
+          if ((!evas_key_modifier_is_set(ev->modifiers, "Shift"))
+              && (!evas_key_modifier_is_set(ev->modifiers, "Control")))
+            {
+              // XXX: right mouse ctxt menu
+            }
+        }
     }
 }
 
diff --git a/src/efm/efm_menu.c b/src/efm/efm_menu.c
new file mode 100644
index 0000000..2a1ad9a
--- /dev/null
+++ b/src/efm/efm_menu.c
@@ -0,0 +1,121 @@
+#include "efm.h"
+#include "efm_private.h"
+#include "eina_types.h"
+
+Efm_Menu *
+_efm_menu_add(const char *title, const char *icon)
+{
+  Efm_Menu *m = calloc(1, sizeof(Efm_Menu));
+
+  eina_stringshare_replace(&(m->title), title);
+  eina_stringshare_replace(&(m->title_icon), icon);
+  return m;
+}
+
+void
+_efm_menu_del(Efm_Menu *m)
+{
+  Efm_Menu_Item *mi;
+  int            i;
+
+  if (!m) return;
+  eina_stringshare_replace(&(m->title), NULL);
+  eina_stringshare_replace(&(m->title_icon), NULL);
+  for (i = 0; i < m->item_num; i++)
+    {
+      mi = &(m->item[i]);
+      eina_stringshare_replace(&(mi->label), NULL);
+      eina_stringshare_replace(&(mi->icon), NULL);
+      _efm_menu_del(mi->sub);
+    }
+  free(m->item);
+  free(m);
+}
+
+static int
+_m_index(void)
+{
+  static int mindex = 1;
+  int        i      = mindex;
+
+  mindex++;
+  if (mindex > 0x0fffffff) mindex = 1; // wrap at 28 bit - we're good here
+  // as long as all indexes in a single menu tree instance (menu + all subs)
+  // are unique per item you can select with a callback. so that's about
+  // 268 million items we need to be unique for... good enough
+  return i;
+}
+
+static Efm_Menu_Item *
+_mi_add(Efm_Menu *m, Efm_Menu_Item_Type type, const char *label,
+        const char *icon, Efm_Menu_Item_Callback cb, void *data, void *data2)
+{
+  Efm_Menu_Item *mi;
+
+  m->item_num++;
+  mi = realloc(m->item, (m->item_num * sizeof(Efm_Menu_Item)));
+  if (!mi)
+    {
+      m->item_num--;
+      return NULL;
+    }
+  m->item = mi;
+  mi      = &(m->item[m->item_num - 1]);
+  memset(mi, 0, sizeof(Efm_Menu_Item));
+  mi->type  = type;
+  mi->index = _m_index();
+  eina_stringshare_replace(&(mi->label), label);
+  eina_stringshare_replace(&(mi->icon), icon);
+  mi->private1 = cb;
+  mi->private2 = data;
+  mi->private2 = data2;
+  return mi;
+}
+
+Efm_Menu_Item *
+_efm_menu_it_normal(Efm_Menu *m, const char *label, const char *icon,
+                    Efm_Menu_Item_Callback cb, void *data, void *data2)
+{
+  return _mi_add(m, EFM_MENU_ITEM_NORMAL, label, icon, cb, data, data2);
+}
+
+Efm_Menu_Item *
+_efm_menu_it_separator(Efm_Menu *m)
+{
+  return _mi_add(m, EFM_MENU_ITEM_SEPARATOR, NULL, NULL, NULL, NULL, NULL);
+}
+
+Efm_Menu_Item *
+_efm_menu_it_sub(Efm_Menu *m, const char *label, const char *icon,
+                 Efm_Menu *sub)
+{
+  Efm_Menu_Item *mi
+    = _mi_add(m, EFM_MENU_ITEM_SUBMENU, label, icon, NULL, NULL, NULL);
+
+  if (mi) mi->sub = sub;
+  return mi;
+}
+
+Efm_Menu_Item *
+_efm_menu_it_radio(Efm_Menu *m, const char *label, const char *icon,
+                   Eina_Bool on, Efm_Menu_Item_Callback cb, void *data,
+                   void *data2)
+{
+  Efm_Menu_Item *mi
+    = _mi_add(m, EFM_MENU_ITEM_RADIO, label, icon, cb, data, data2);
+
+  if (mi) mi->selected = on;
+  return mi;
+}
+
+Efm_Menu_Item *
+_efm_menu_it_check(Efm_Menu *m, const char *label, const char *icon,
+                   Eina_Bool on, Efm_Menu_Item_Callback cb, void *data,
+                   void *data2)
+{
+  Efm_Menu_Item *mi
+    = _mi_add(m, EFM_MENU_ITEM_CHECK, label, icon, cb, data, data2);
+
+  if (mi) mi->selected = on;
+  return mi;
+}
\ No newline at end of file
diff --git a/src/efm/efm_popup_menu.c b/src/efm/efm_popup_menu.c
new file mode 100644
index 0000000..1f7731b
--- /dev/null
+++ b/src/efm/efm_popup_menu.c
@@ -0,0 +1,190 @@
+#include "efm.h"
+#include "efm_private.h"
+#include "efm_structs.h"
+#include "eina_types.h"
+
+static void
+_cb_ic_item1(void *data, void *data2, Evas_Object *efm,
+             const Efm_Menu_Item *menu_item)
+{
+  printf("ic1");
+}
+
+static void
+_cb_ic_item2(void *data, void *data2, Evas_Object *efm,
+             const Efm_Menu_Item *menu_item)
+{
+  printf("ic2");
+}
+
+static void
+_cb_ic_item3(void *data, void *data2, Evas_Object *efm,
+             const Efm_Menu_Item *menu_item)
+{
+  printf("ic3");
+}
+
+static void
+_cb_ic_item4(void *data, void *data2, Evas_Object *efm,
+             const Efm_Menu_Item *menu_item)
+{
+  printf("ic4");
+}
+
+static void
+_cb_ic_item5(void *data, void *data2, Evas_Object *efm,
+             const Efm_Menu_Item *menu_item)
+{
+  printf("ic5");
+}
+
+static void
+_cb_ic_item6(void *data, void *data2, Evas_Object *efm,
+             const Efm_Menu_Item *menu_item)
+{
+  printf("ic6");
+}
+
+static void
+_cb_ic_item7(void *data, void *data2, Evas_Object *efm,
+             const Efm_Menu_Item *menu_item)
+{
+  printf("ic7");
+}
+
+static const char *
+_icon_strbuf_icon_def(Icon *icon, Eina_Strbuf *icbuf)
+{
+  const char *icstr;
+
+  eina_strbuf_reset(icbuf);
+  if (icon->info.thumb)
+    {
+      eina_strbuf_append(icbuf, "thumb:");
+      eina_strbuf_append(icbuf, icon->info.thumb);
+    }
+  else
+    {
+      const char *ic;
+
+      ic = icon->info.pre_lookup_icon;
+      if (!ic) ic = icon->info.icon;
+      if ((!ic) && (icon->info.mime))
+        {
+          const char *icfile;
+          char        buf[1024];
+
+          snprintf(buf, sizeof(buf), "e/icons/fileman/mime/%s",
+                   icon->info.mime);
+          icfile = elm_theme_group_path_find(NULL, buf);
+          if (!icfile)
+            {
+              snprintf(buf, sizeof(buf), "e/icons/fileman/mime/inode/file");
+              icfile = elm_theme_group_path_find(NULL, buf);
+            }
+          if (icfile)
+            {
+              eina_strbuf_append(icbuf, "edje:");
+              eina_strbuf_append(icbuf, icfile);
+              eina_strbuf_append(icbuf, "|");
+              eina_strbuf_append(icbuf, buf);
+            }
+        }
+      if ((ic) && (ic[0] == '/'))
+        {
+          // XXX: need common code for this to share
+          if (_file_video_is(ic)) eina_strbuf_append(icbuf, "video:");
+          else eina_strbuf_append(icbuf, "file:");
+          eina_strbuf_append(icbuf, ic);
+        }
+      else if (ic)
+        {
+          eina_strbuf_append(icbuf, "std:");
+          eina_strbuf_append(icbuf, ic);
+        }
+    }
+  icstr = eina_strbuf_string_get(icbuf);
+  if ((icstr) && (!icstr[0])) icstr = NULL;
+  return icstr;
+}
+
+Efm_Menu *
+_efm_popup_menu_add(Smart_Data *sd, Icon *ic)
+{
+  Efm_Menu    *m1, *m2;
+  Eina_Strbuf *icbuf;
+  const char  *icstr;
+
+  // 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");
+  _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");
+  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, ic->down_x, ic->down_y);
+  eina_strbuf_free(icbuf);
+
+  return m2;
+}
\ No newline at end of file
diff --git a/src/efm/efm_private.h b/src/efm/efm_private.h
index bb98e9f..45ae9d2 100644
--- a/src/efm/efm_private.h
+++ b/src/efm/efm_private.h
@@ -24,6 +24,8 @@ void   _reset(Smart_Data *sd);
 void   _redo_detail_sizes(Smart_Data *sd);
 char  *_sanitize_dir(const char *path);
 
+Eina_Bool _file_video_is(const char *file);
+
 #define MENU_NORM(_lab, _icn, _idx, _cb, _cbdat) \
   EFM_MENU_ITEM_NORMAL, _lab, _icn, _idx, EINA_FALSE, NULL, (void *)_cb, (void *)_cbdat
 #define MENU_SUB(_lab, _icn, _sub) \
@@ -31,7 +33,8 @@ char  *_sanitize_dir(const char *path);
 #define MENU_SEPARATOR() \
     EFM_MENU_ITEM_SEPARATOR, NULL, NULL, 0, EINA_FALSE, NULL, NULL, NULL
 
-void _efm_menu_show(Evas_Object *obj, Efm_Menu *m, Evas_Coord x, Evas_Coord y);
+  void _efm_menu_show(Evas_Object *obj, Efm_Menu *m, Evas_Coord x,
+                      Evas_Coord y);
 
 Efm_Menu *_efm_menu_add(const char *title, const char *icon);
 void      _efm_menu_del(Efm_Menu *m);
@@ -41,6 +44,8 @@ Efm_Menu_Item *_efm_menu_it_sub(Efm_Menu *m, const char *label, const char *icon
 Efm_Menu_Item *_efm_menu_it_radio(Efm_Menu *m, const char *label, const char *icon, Eina_Bool on, Efm_Menu_Item_Callback cb, void *data, void *data2);
 Efm_Menu_Item *_efm_menu_it_check(Efm_Menu *m, const char *label, const char *icon, Eina_Bool on, Efm_Menu_Item_Callback cb, void *data, void *data2);
 
+Efm_Menu *_efm_popup_menu_add(Smart_Data *sd, Icon *ic);
+
 extern Eina_List *_efm_list;
 extern Eina_List *_pending_exe_dels;
 
diff --git a/src/efm/efm_structs.h b/src/efm/efm_structs.h
index 2b97514..8041cb7 100644
--- a/src/efm/efm_structs.h
+++ b/src/efm/efm_structs.h
@@ -80,6 +80,7 @@ struct _Smart_Data
   Evas_Coord      list_min_w, list_min_h;
   Evas_Coord      list_detailed_min_w, list_detailed_min_h;
   Evas_Coord      back_down_x, back_down_y;
+  Evas_Coord      back3_down_x, back3_down_y;
   Evas_Coord      back_x, back_y;
   Evas_Coord      sel_x1, sel_y1, sel_x2, sel_y2;
   Evas_Coord      dnd_scroll_x, dnd_scroll_y;
@@ -113,6 +114,7 @@ struct _Smart_Data
   Eina_Bool focus_show           : 1;
   Eina_Bool key_control          : 1;
   Eina_Bool back_down            : 1;
+  Eina_Bool back3_down           : 1;
   Eina_Bool sel_show             : 1;
   Eina_Bool drag                 : 1;
   Eina_Bool just_dragged         : 1;
diff --git a/src/efm/efm_util.c b/src/efm/efm_util.c
index 299fadf..3f84ee7 100644
--- a/src/efm/efm_util.c
+++ b/src/efm/efm_util.c
@@ -691,7 +691,7 @@ _cb_icon_longpress_timer(void *data)
   return EINA_FALSE;
 }
 
-static Eina_Bool
+Eina_Bool
 _file_video_is(const char *file)
 {
   // XXX: this probably should look up in config
@@ -1009,107 +1009,6 @@ _select_range(Icon *icon_from, Icon *icon_to)
   }
 }
 
-static void
-_cb_ic_item1(void *data, void *data2, Evas_Object *efm, const Efm_Menu_Item *menu_item)
-{
-  printf("ic1");
-}
-
-static void
-_cb_ic_item2(void *data, void *data2, Evas_Object *efm, const Efm_Menu_Item *menu_item)
-{
-  printf("ic2");
-}
-
-static void
-_cb_ic_item3(void *data, void *data2, Evas_Object *efm, const Efm_Menu_Item *menu_item)
-{
-  printf("ic3");
-}
-
-static void
-_cb_ic_item4(void *data, void *data2, Evas_Object *efm, const Efm_Menu_Item *menu_item)
-{
-  printf("ic4");
-}
-
-static void
-_cb_ic_item5(void *data, void *data2, Evas_Object *efm,
-             const Efm_Menu_Item *menu_item)
-{
-  printf("ic5");
-}
-
-static void
-_cb_ic_item6(void *data, void *data2, Evas_Object *efm,
-             const Efm_Menu_Item *menu_item)
-{
-  printf("ic6");
-}
-
-static void
-_cb_ic_item7(void *data, void *data2, Evas_Object *efm,
-             const Efm_Menu_Item *menu_item)
-{
-  printf("ic7");
-}
-
-static const char *
-_icon_strbuf_icon_def(Icon *icon, Eina_Strbuf *icbuf)
-{
-  const char *icstr;
-
-  eina_strbuf_reset(icbuf);
-  if (icon->info.thumb)
-    {
-      eina_strbuf_append(icbuf, "thumb:");
-      eina_strbuf_append(icbuf, icon->info.thumb);
-    }
-  else
-    {
-      const char *ic;
-
-      ic = icon->info.pre_lookup_icon;
-      if (!ic) ic = icon->info.icon;
-      if ((!ic) && (icon->info.mime))
-        {
-          const char *icfile;
-          char        buf[1024];
-
-          snprintf(buf, sizeof(buf), "e/icons/fileman/mime/%s",
-                   icon->info.mime);
-          icfile = elm_theme_group_path_find(NULL, buf);
-          if (!icfile)
-            {
-              snprintf(buf, sizeof(buf), "e/icons/fileman/mime/inode/file");
-              icfile = elm_theme_group_path_find(NULL, buf);
-            }
-          if (icfile)
-            {
-              eina_strbuf_append(icbuf, "edje:");
-              eina_strbuf_append(icbuf, icfile);
-              eina_strbuf_append(icbuf, "|");
-              eina_strbuf_append(icbuf, buf);
-            }
-        }
-      if ((ic) && (ic[0] == '/'))
-        {
-          // XXX: need common code for this to share
-          if (_file_video_is(ic)) eina_strbuf_append(icbuf, "video:");
-          else eina_strbuf_append(icbuf, "file:");
-          eina_strbuf_append(icbuf, ic);
-        }
-      else if (ic)
-        {
-          eina_strbuf_append(icbuf, "std:");
-          eina_strbuf_append(icbuf, ic);
-        }
-    }
-  icstr = eina_strbuf_string_get(icbuf);
-  if ((icstr) && (!icstr[0])) icstr = NULL;
-  return icstr;
-}
-
 static void
 _cb_icon_mouse_up(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
                   void *event_info)
@@ -1169,86 +1068,8 @@ _cb_icon_mouse_up(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
       if (((dx * dx) + (dy * dy)) > (5 * 5)) dragged = EINA_TRUE;
       if (!dragged)
         {
-          Efm_Menu *m1, *m2;
-          Eina_Strbuf *icbuf;
-          const char *icstr;
-
-          // 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
-
           printf("XXX: right mouse\n");
-          icbuf = eina_strbuf_new();
-          m1 = _efm_menu_add("Submenu", "std:mail-reply-all");
-          _efm_menu_it_normal(m1, "Item 1", "std:menu/folder", _cb_ic_item1,
-                              icon, NULL);
-          _efm_menu_it_normal(m1, "Item 2", "std:system-lock-screen",
-                              _cb_ic_item2, icon, NULL);
-          _efm_menu_it_separator(m1);
-          _efm_menu_it_normal(m1, "Item 3 - much longer label", "std:media-eject",
-                              _cb_ic_item3, icon, NULL);
-          _efm_menu_it_normal(m1, "Item 4", "std:battery", _cb_ic_item4, icon,
-                              NULL);
-          m2 = _efm_menu_add("Main Menu", "std:security-high");
-          icstr = _icon_strbuf_icon_def(icon, icbuf);
-          _efm_menu_it_normal(m2, icon->info.label, icstr, _cb_ic_item5, icon,
-                              NULL);
-          _efm_menu_it_normal(m2, "Item 5", "std:system-run", _cb_ic_item5,
-                              icon, NULL);
-          _efm_menu_it_separator(m2);
-          _efm_menu_it_check(m2, "Check 1", "std:folder", EINA_FALSE,
-                             _cb_ic_item6, icon, NULL);
-          _efm_menu_it_check(m2, "Check 2", "std:user-home", EINA_TRUE,
-                             _cb_ic_item7, icon, NULL);
-          _efm_menu_it_separator(m2);
-          _efm_menu_it_radio(m2, "Radio 1", "std:user-desktop", EINA_FALSE,
-                             _cb_ic_item6, icon, NULL);
-          _efm_menu_it_radio(m2, "Radio 2", NULL, EINA_TRUE,
-                             _cb_ic_item6, icon, NULL);
-          _efm_menu_it_radio(m2, "Radio 3", "std:computer", EINA_FALSE,
-                             _cb_ic_item6, icon, NULL);
-          _efm_menu_it_separator(m2);
-          _efm_menu_it_radio(m2, "Radio 1", "std:drive-optical", EINA_FALSE,
-                             _cb_ic_item6, icon, NULL);
-          _efm_menu_it_radio(m2, "Radio 2", "std:drive-harddisk", EINA_FALSE,
-                             _cb_ic_item6, icon, NULL);
-          _efm_menu_it_radio(m2, "Radio 3", NULL, EINA_TRUE,
-                             _cb_ic_item6, icon, NULL);
-          _efm_menu_it_sub(m2, "Submenu here", "fdo:terminology", m1);
-
-          _efm_menu_show(icon->sd->o_smart, m2, icon->down_x, icon->down_y);
-          eina_strbuf_free(icbuf);
+          _efm_popup_menu_add(icon->sd, icon);
         }
       icon->sd->last_focused = icon;
       icon->drag             = EINA_FALSE;
@@ -2627,117 +2448,4 @@ _cb_reblock(void *data)
   // needed etc.
   sd->reblocked = EINA_TRUE;
   evas_object_smart_changed(sd->o_smart);
-}
-
-Efm_Menu *
-_efm_menu_add(const char *title, const char *icon)
-{
-  Efm_Menu *m = calloc(1, sizeof(Efm_Menu));
-
-  eina_stringshare_replace(&(m->title), title);
-  eina_stringshare_replace(&(m->title_icon), icon);
-  return m;
-}
-
-void
-_efm_menu_del(Efm_Menu *m)
-{
-  Efm_Menu_Item *mi;
-  int            i;
-
-  if (!m) return;
-  eina_stringshare_replace(&(m->title), NULL);
-  eina_stringshare_replace(&(m->title_icon), NULL);
-  for (i = 0; i < m->item_num; i++)
-    {
-      mi = &(m->item[i]);
-      eina_stringshare_replace(&(mi->label), NULL);
-      eina_stringshare_replace(&(mi->icon), NULL);
-      _efm_menu_del(mi->sub);
-    }
-  free(m->item);
-  free(m);  
-}
-
-static int
-_m_index(void)
-{
-  static int mindex = 1;
-  int        i      = mindex;
-
-  mindex++;
-  if (mindex > 0x0fffffff) mindex = 1; // wrap at 28 bit - we're good here
-  // as long as all indexes in a single menu tree instance (menu + all subs)
-  // are unique per item you can select with a callback. so that's about
-  // 268 million items we need to be unique for... good enough
-  return i;
-}
-
-static Efm_Menu_Item *
-_mi_add(Efm_Menu *m, Efm_Menu_Item_Type type, const char *label, const char *icon,
-        Efm_Menu_Item_Callback cb, void *data, void *data2)
-{
-  Efm_Menu_Item *mi;
-
-  m->item_num++;
-  mi = realloc(m->item, (m->item_num * sizeof(Efm_Menu_Item)));
-  if (!mi)
-    {
-      m->item_num--;
-      return NULL;
-    }
-  m->item = mi;
-  mi      = &(m->item[m->item_num - 1]);
-  memset(mi, 0, sizeof(Efm_Menu_Item));
-  mi->type = type;
-  mi->index = _m_index();
-  eina_stringshare_replace(&(mi->label), label);
-  eina_stringshare_replace(&(mi->icon), icon);
-  mi->private1 = cb;
-  mi->private2 = data;
-  mi->private2 = data2;
-  return mi;
-}
-
-Efm_Menu_Item *
-_efm_menu_it_normal(Efm_Menu *m, const char *label, const char *icon,
-                    Efm_Menu_Item_Callback cb, void *data, void *data2)
-{
-  return _mi_add(m, EFM_MENU_ITEM_NORMAL, label, icon, cb, data, data2);
-}
-
-Efm_Menu_Item *
-_efm_menu_it_separator(Efm_Menu *m)
-{
-  return _mi_add(m, EFM_MENU_ITEM_SEPARATOR, NULL, NULL, NULL, NULL, NULL);
-}
-
-Efm_Menu_Item *
-_efm_menu_it_sub(Efm_Menu *m, const char *label, const char *icon,
-                 Efm_Menu *sub)
-{
-  Efm_Menu_Item *mi = _mi_add(m, EFM_MENU_ITEM_SUBMENU, label, icon, NULL, NULL, NULL);
-
-  if (mi) mi->sub = sub;
-  return mi;
-}
-
-Efm_Menu_Item *
-_efm_menu_it_radio(Efm_Menu *m, const char *label, const char *icon,
-                   Eina_Bool on, Efm_Menu_Item_Callback cb, void *data, void *data2)
-{
-  Efm_Menu_Item *mi = _mi_add(m, EFM_MENU_ITEM_RADIO, label, icon, cb, data, data2);
-
-  if (mi) mi->selected = on;
-  return mi;
-}
-
-Efm_Menu_Item *
-_efm_menu_it_check(Efm_Menu *m, const char *label, const char *icon,
-                   Eina_Bool on, Efm_Menu_Item_Callback cb, void *data, void *data2)
-{
-  Efm_Menu_Item *mi = _mi_add(m, EFM_MENU_ITEM_CHECK, label, icon, cb, data, data2);
-
-  if (mi) mi->selected = on;
-  return mi;
-}
+}
\ No newline at end of file
diff --git a/src/efm/meson.build b/src/efm/meson.build
index 08692bd..a7c2039 100644
--- a/src/efm/meson.build
+++ b/src/efm/meson.build
@@ -15,6 +15,8 @@ executable('efm', [
     'efm_dnd.c',
     'efm_back_end.c',
     'efm_custom.c',
+    'efm_menu.c',
+    'efm_popup_menu.c',
     'main.c'
   ],
   include_directories: inc,

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

Reply via email to