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.