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.