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 38dbda6121de534bb2277c29569100d94b9f6ae4
Author: Carsten Haitzler (Rasterman) <ras...@rasterman.com>
AuthorDate: Tue Oct 29 15:12:22 2024 +0000
more menu work - add cb for main top menu for dismiss
---
src/efm/efm.c | 28 +++++++--------
src/efm/efm.h | 3 ++
src/efm/efm_dnd.c | 88 +++++++++++++++++++++++++++++++-----------------
src/efm/efm_menu.c | 11 +++---
src/efm/efm_popup_menu.c | 28 +++++++++------
src/efm/efm_private.h | 43 ++++++++++++++++-------
6 files changed, 127 insertions(+), 74 deletions(-)
diff --git a/src/efm/efm.c b/src/efm/efm.c
index 6046610..9ad350e 100644
--- a/src/efm/efm.c
+++ b/src/efm/efm.c
@@ -321,6 +321,7 @@ _cb_key_down(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
sd->key_control = EINA_TRUE;
}
+ // XXX: if we're dnding - modify dnd action based on shift, ctrl etc.
printf("XXX: KEY: [%c] [%s]\n", handled ? '#' : ' ', ev->key);
}
@@ -1958,23 +1959,20 @@ _item_find_call(Evas_Object *obj, const Efm_Menu *m, int index)
void
efm_menu_provider_select(Evas_Object *obj, int index)
{ // call this to tell efm what was selected, or index -1 for dismissed
+ Efm_Menu *m;
+ Efm_Menu_Callback cb;
ENTRY;
- if (!sd->menu_provider.menu) return;
- if (index == -1)
- {
- _efm_menu_del(sd->menu_provider.menu);
- sd->menu_provider.menu = NULL;
- sd->menu_provider.menu_data = sd->menu_provider.cb(
- sd->menu_provider.data, sd->menu_provider.menu_data, obj,
- NULL, 0, 0);
- }
- else
- {
- const Efm_Menu *m = sd->menu_provider.menu;
+ m = sd->menu_provider.menu;
+ if (!m) return;
+ if (index >= 0) _item_find_call(obj, m, index);
- _item_find_call(obj, m, index);
- };
+ sd->menu_provider.menu = NULL;
+ cb = m->private1;
+ if (cb) cb(m->private2, m->private3, obj, m);
+ _efm_menu_del(m);
+ sd->menu_provider.menu_data = sd->menu_provider.cb(
+ sd->menu_provider.data, sd->menu_provider.menu_data, obj, NULL, 0, 0);
}
void
@@ -2213,13 +2211,11 @@ efm_menu_provider_default(void *data, void *menu_data, Evas_Object *obj, const E
elm_menu_move(o, x, y);
evas_object_show(o);
elm_menu_open(o);
- printf("show %p\n", o);
return o;
}
}
else
{
- printf("del %p\n", menu_data);
if (menu_data) evas_object_del(menu_data);
}
return NULL;
diff --git a/src/efm/efm.h b/src/efm/efm.h
index 03a7e63..30043fb 100644
--- a/src/efm/efm.h
+++ b/src/efm/efm.h
@@ -65,6 +65,9 @@ struct _Efm_Menu
const char *title_icon;
int item_num;
Efm_Menu_Item *item;
+ void *private1; // private to efm - ignore
+ void *private2; // private to efm - ignore
+ void *private3; // private to efm - ignore
};
// call this to build a menu or to close it (menu is NULL for close) - return truw if menu is shown
diff --git a/src/efm/efm_dnd.c b/src/efm/efm_dnd.c
index f24cbfd..8c4d178 100644
--- a/src/efm/efm_dnd.c
+++ b/src/efm/efm_dnd.c
@@ -1,3 +1,4 @@
+#include "Evas.h"
#include "cmd.h"
#include "efm.h"
#include "efm_util.h"
@@ -133,39 +134,64 @@ _cb_drop_pos(void *data, Evas_Object *o EINA_UNUSED, Evas_Coord x, Evas_Coord y,
static Eina_Bool
_cb_drop(void *data, Evas_Object *o EINA_UNUSED, Elm_Selection_Data *ev)
{
- Smart_Data *sd = data;
- char **plist, **p, *esc, *tmp;
- Eina_List *dropicons, *l;
- Icon *icon;
- int delta_x = 0, delta_y = 0;
- Eina_Strbuf *buf = cmd_strbuf_new("dnd-drop");
+ Smart_Data *sd = data;
+ char **plist, **p, *esc, *tmp;
+ Eina_List *dropicons, *l;
+ Icon *icon;
+ int delta_x = 0, delta_y = 0;
+ Eina_Strbuf *buf = cmd_strbuf_new("dnd-drop");
+ const Evas_Modifier *m = evas_key_modifier_get(evas_object_evas_get(o));
+ Elm_Xdnd_Action act = ELM_XDND_ACTION_MOVE; // default action
- switch (ev->action)
+ // We need to check modifiers
+#define M(_m) evas_key_modifier_is_set(m, _m)
+
+ // on win ctl -> ctl, alt -> alt, win -> super
+ // on win shift == move, ctl == copy, alt = link, shift+ctl = link
+ if (M("Shift") && M("Alt")) act = ELM_XDND_ACTION_LINK;
+ else if (M("Control")) act = ELM_XDND_ACTION_COPY;
+ else if (M("Shift")) act = ELM_XDND_ACTION_MOVE;
+ else if (M("Alt")) act = ELM_XDND_ACTION_ASK; // added this myself
+ // else ... leave as default action
+
+ // on mac ctl -> ctl, option -> alt, command -> super
+ // on mac: super == move, alt == copy, alt+super = link
+ // if (M("Alt") && M("Super")) act = ELM_XDND_ACTION_LINK;
+ // else if (M("Alt")) act = ELM_XDND_ACTION_COPY;
+ // else if (M("Super")) act = ELM_XDND_ACTION_MOVE;
+ // else if (M("Control")) act = ELM_XDND_ACTION_ASK; // added this myself
+ // else ... leave as default action
+#undef M
+
+ switch (act) // we ignore ev->action and use local input mods as above
{
- case ELM_XDND_ACTION_COPY:
- fprintf(stderr, "XXX: COPY\n");
- cmd_strbuf_append(buf, "action", "copy");
- break;
- case ELM_XDND_ACTION_MOVE:
- fprintf(stderr, "XXX: MOVE\n");
- cmd_strbuf_append(buf, "action", "move");
- break;
- case ELM_XDND_ACTION_ASK:
- // XXX: ask - copy or move...
- fprintf(stderr, "XXX: ASK DROP! - dont ask backend\n");
- cmd_strbuf_append(buf, "action", "ask");
- break;
- case ELM_XDND_ACTION_LIST:
- cmd_strbuf_append(buf, "action", "list");
- break;
- case ELM_XDND_ACTION_LINK:
- cmd_strbuf_append(buf, "action", "link");
- break;
- case ELM_XDND_ACTION_DESCRIPTION:
- cmd_strbuf_append(buf, "action", "description");
- break;
- default:
- break;
+ case ELM_XDND_ACTION_COPY:
+ fprintf(stderr, "XXX: COPY\n");
+ cmd_strbuf_append(buf, "action", "copy");
+ break;
+ case ELM_XDND_ACTION_MOVE:
+ fprintf(stderr, "XXX: MOVE\n");
+ cmd_strbuf_append(buf, "action", "move");
+ break;
+ case ELM_XDND_ACTION_ASK:
+ // XXX: ask - copy or move...
+ fprintf(stderr, "XXX: ASK DROP! - dont ask backend\n");
+ cmd_strbuf_append(buf, "action", "ask");
+ break;
+ case ELM_XDND_ACTION_LINK:
+ fprintf(stderr, "XXX: LINK\n");
+ cmd_strbuf_append(buf, "action", "link");
+ break;
+ /* here for documentation but not used
+ case ELM_XDND_ACTION_LIST:
+ cmd_strbuf_append(buf, "action", "list");
+ break;
+ case ELM_XDND_ACTION_DESCRIPTION:
+ cmd_strbuf_append(buf, "action", "description");
+ break;
+ */
+ default:
+ break;
}
if (sd->drop_over)
diff --git a/src/efm/efm_menu.c b/src/efm/efm_menu.c
index 2a1ad9a..407c503 100644
--- a/src/efm/efm_menu.c
+++ b/src/efm/efm_menu.c
@@ -1,22 +1,25 @@
#include "efm.h"
#include "efm_private.h"
-#include "eina_types.h"
Efm_Menu *
-_efm_menu_add(const char *title, const char *icon)
+_efm_menu_add(const char *title, const char *icon, Efm_Menu_Callback cb,
+ void *data, void *data2)
{
Efm_Menu *m = calloc(1, sizeof(Efm_Menu));
eina_stringshare_replace(&(m->title), title);
eina_stringshare_replace(&(m->title_icon), icon);
+ m->private1 = cb;
+ m->private2 = data;
+ m->private3 = data2;
return m;
}
void
_efm_menu_del(Efm_Menu *m)
{
- Efm_Menu_Item *mi;
- int i;
+ Efm_Menu_Item *mi;
+ int i;
if (!m) return;
eina_stringshare_replace(&(m->title), NULL);
diff --git a/src/efm/efm_popup_menu.c b/src/efm/efm_popup_menu.c
index ea0326a..872d07e 100644
--- a/src/efm/efm_popup_menu.c
+++ b/src/efm/efm_popup_menu.c
@@ -3,53 +3,59 @@
#include "efm_structs.h"
#include "eina_types.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");
+ printf("ic1\n");
}
static void
_cb_ic_item2(void *data, void *data2, Evas_Object *efm,
const Efm_Menu_Item *menu_item)
{
- printf("ic2");
+ printf("ic2\n");
}
static void
_cb_ic_item3(void *data, void *data2, Evas_Object *efm,
const Efm_Menu_Item *menu_item)
{
- printf("ic3");
+ printf("ic3\n");
}
static void
_cb_ic_item4(void *data, void *data2, Evas_Object *efm,
const Efm_Menu_Item *menu_item)
{
- printf("ic4");
+ printf("ic4\n");
}
static void
_cb_ic_item5(void *data, void *data2, Evas_Object *efm,
const Efm_Menu_Item *menu_item)
{
- printf("ic5");
+ printf("ic5\n");
}
static void
_cb_ic_item6(void *data, void *data2, Evas_Object *efm,
const Efm_Menu_Item *menu_item)
{
- printf("ic6");
+ printf("ic6\n");
}
static void
_cb_ic_item7(void *data, void *data2, Evas_Object *efm,
const Efm_Menu_Item *menu_item)
{
- printf("ic7");
+ printf("ic7\n");
}
static const char *
@@ -151,7 +157,7 @@ _efm_popup_icon_menu_add(Smart_Data *sd, Icon *ic, Evas_Coord x, Evas_Coord y)
// of menu then from backend
icbuf = eina_strbuf_new();
- m1 = _efm_menu_add("Submenu", "std:mail-reply-all");
+ 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);
@@ -159,7 +165,8 @@ _efm_popup_icon_menu_add(Smart_Data *sd, Icon *ic, Evas_Coord x, Evas_Coord y)
_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");
+ 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);
@@ -193,7 +200,8 @@ _efm_popup_main_menu_add(Smart_Data *sd, Evas_Coord x, Evas_Coord y)
{
Efm_Menu *m;
- m = _efm_menu_add("Main Menu", "std:security-high");
+ 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,
NULL);
diff --git a/src/efm/efm_private.h b/src/efm/efm_private.h
index be39497..4e440b6 100644
--- a/src/efm/efm_private.h
+++ b/src/efm/efm_private.h
@@ -16,7 +16,12 @@
Smart_Data *sd = evas_object_smart_data_get(obj); \
if (!sd) return
-typedef void (*Efm_Menu_Item_Callback)(void *data, void *data2, Evas_Object *efm, const Efm_Menu_Item *menu_item);
+typedef void (*Efm_Menu_Callback)(void *data, void *data2,
+ Evas_Object *efm,
+ const Efm_Menu *menu);
+typedef void (*Efm_Menu_Item_Callback)(void *data, void *data2,
+ Evas_Object *efm,
+ const Efm_Menu_Item *menu_item);
void _listing_done(Smart_Data *sd);
void _cb_header_change(void *data);
@@ -36,19 +41,31 @@ Eina_Bool _file_video_is(const char *file);
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);
-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);
-Efm_Menu_Item *_efm_menu_it_separator(Efm_Menu *m);
-Efm_Menu_Item *_efm_menu_it_sub(Efm_Menu *m, const char *label, const char *icon, Efm_Menu *sub);
-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_menu_add(const char *title, const char *icon,
+ Efm_Menu_Callback cb, void *data, void *data2);
+ void _efm_menu_del(Efm_Menu *m);
+ 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);
+ Efm_Menu_Item *_efm_menu_it_separator(Efm_Menu *m);
+ Efm_Menu_Item *_efm_menu_it_sub(Efm_Menu *m, const char *label,
+ const char *icon, Efm_Menu *sub);
+ 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_icon_menu_add(Smart_Data *sd, Icon *ic, Evas_Coord x,
- Evas_Coord y);
-Efm_Menu *_efm_popup_main_menu_add(Smart_Data *sd, Evas_Coord x, Evas_Coord y);
+ Efm_Menu *_efm_popup_icon_menu_add(Smart_Data *sd, Icon *ic, Evas_Coord x,
+ Evas_Coord y);
+ Efm_Menu *_efm_popup_main_menu_add(Smart_Data *sd, Evas_Coord x,
+ Evas_Coord y);
-extern Eina_List *_efm_list;
-extern Eina_List *_pending_exe_dels;
+ extern Eina_List *_efm_list;
+ extern Eina_List *_pending_exe_dels;
#endif
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.