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.

Reply via email to