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 fff2980a1800db1fe497e44584b861c7f8b3bfca
Author: Carsten Haitzler (Rasterman) <ras...@rasterman.com>
AuthorDate: Wed Oct 30 20:22:12 2024 +0000

    dnd - make dnd modes with modifiers work
    
    press and hold until end of dnd:
      shift -> move
      ctrl -> copy
      shift+ctrl -> link
      alt -> ask mode work
    
    menu pops up and will then offer move, copy, link
    
    right now the only thing that iis implemented id move...  it might be
    time to implement copy, link.
---
 TODO.md               |   3 +
 src/efm/efm.c         |   5 ++
 src/efm/efm_dnd.c     | 209 +++++++++++++++++++++++++++++++++-----------------
 src/efm/efm_structs.h |   3 +-
 4 files changed, 150 insertions(+), 70 deletions(-)

diff --git a/TODO.md b/TODO.md
index 94eab2d..834ec22 100644
--- a/TODO.md
+++ b/TODO.md
@@ -80,6 +80,9 @@
 * Tooltip previews
   * Multi-page show multiple pages
   * Video files show multiple timepoints
+* Thumbnailing - add html thumbs bby running e.g.
+  * chromium --headless --screenshot=sss.png --window-size=1024x1024     --force-device-scale-factor=0.5 --timeout=10000 file:///path/to/file.html
+
 
 ## Long term
 
diff --git a/src/efm/efm.c b/src/efm/efm.c
index 9ad350e..733ee1a 100644
--- a/src/efm/efm.c
+++ b/src/efm/efm.c
@@ -989,6 +989,11 @@ _smart_del(Evas_Object *obj)
     ecore_timer_del(st->timer);
     free(st);
   }
+  if (sd->dnd_drop_data)
+    {
+      free(sd->dnd_drop_data);
+      sd->dnd_drop_data = NULL;
+    }
   _icon_custom_data_free(sd);
 
   // XXX: anything special with scroller?
diff --git a/src/efm/efm_dnd.c b/src/efm/efm_dnd.c
index 8c4d178..a98d397 100644
--- a/src/efm/efm_dnd.c
+++ b/src/efm/efm_dnd.c
@@ -1,9 +1,12 @@
+#include "Elementary.h"
 #include "Evas.h"
 #include "cmd.h"
 #include "efm.h"
+#include "efm_structs.h"
 #include "efm_util.h"
 #include "efm_dnd.h"
 #include "efm_private.h"
+#include "eina_strbuf.h"
 
 // utils for draga and drop handling
 static Eina_Bool
@@ -131,67 +134,41 @@ _cb_drop_pos(void *data, Evas_Object *o EINA_UNUSED, Evas_Coord x, Evas_Coord y,
   else sd->drop_over = NULL;
 }
 
-static Eina_Bool
-_cb_drop(void *data, Evas_Object *o EINA_UNUSED, Elm_Selection_Data *ev)
+static void
+_dnd_drop_handle(Smart_Data *sd, char *urilist, Elm_Xdnd_Action act)
 {
-  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
+  char       **plist, **p, *esc;
+  Eina_List   *dropicons, *l;
+  Icon        *icon;
+  int          delta_x = 0, delta_y = 0;
+  Eina_Strbuf *buf = cmd_strbuf_new("dnd-drop");
 
-  // 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_LINK:
-    fprintf(stderr, "XXX: LINK\n");
-    cmd_strbuf_append(buf, "action", "link");
-    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_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;
+    case ELM_XDND_ACTION_ASK:
+      break;
+    case ELM_XDND_ACTION_LIST:
+      break;
+    case ELM_XDND_ACTION_DESCRIPTION:
+      break;
     */
-  default:
-    break;
+    default:
+      eina_strbuf_free(buf);
+      sd->drop_over = NULL;
+      return;
     }
 
   if (sd->drop_over)
@@ -201,11 +178,7 @@ _cb_drop(void *data, Evas_Object *o EINA_UNUSED, Elm_Selection_Data *ev)
     }
   else printf("XXX: DND DROP ...\n");
 
-  tmp = malloc(ev->len + 1);
-  if (!tmp) goto err;
-  memcpy(tmp, ev->data, ev->len);
-  tmp[ev->len] = 0;
-  plist        = eina_str_split(tmp, "\n", -1);
+  plist = eina_str_split(urilist, "\n", -1);
   for (p = plist; *p != NULL; p++)
     {
       if (**p)
@@ -233,7 +206,7 @@ _cb_drop(void *data, Evas_Object *o EINA_UNUSED, Elm_Selection_Data *ev)
           EINA_LIST_FREE(dropicons, icon);
         }
     }
-  _uri_list_cmd_strbuf_append(buf, "path", tmp);
+  _uri_list_cmd_strbuf_append(buf, "path", urilist);
   cmd_strbuf_exe_consume(buf, sd->exe_open);
   for (p = plist; *p != NULL; ++p)
     {
@@ -242,11 +215,11 @@ _cb_drop(void *data, Evas_Object *o EINA_UNUSED, Elm_Selection_Data *ev)
           esc = _escape_parse(*p);
           if (!esc) continue;
           printf("XXX: DROP FILE: [%s]\n", esc);
-          if ((sd->config.view_mode == EFM_VIEW_MODE_ICONS_CUSTOM) ||
-              (sd->config.view_mode == EFM_VIEW_MODE_ICONS_CUSTOM_VERTICAL))
+          if ((sd->config.view_mode == EFM_VIEW_MODE_ICONS_CUSTOM)
+              || (sd->config.view_mode == EFM_VIEW_MODE_ICONS_CUSTOM_VERTICAL))
             {
               Eina_Bool found = EINA_FALSE;
-              char str[128];
+              char      str[128];
 
               dropicons = _icons_path_find(esc);
               EINA_LIST_FREE(dropicons, icon)
@@ -281,13 +254,14 @@ _cb_drop(void *data, Evas_Object *o EINA_UNUSED, Elm_Selection_Data *ev)
 
                   if (buf2)
                     {
-                      printf("XXX: ->     DROPEXTICON: [%s]  %i   %i\n",
-                             esc, sd->dnd_x, sd->dnd_y);
+                      printf("XXX: ->     DROPEXTICON: [%s]  %i   %i\n", esc,
+                             sd->dnd_x, sd->dnd_y);
                       buf = cmd_strbuf_new("meta-set");
 
                       eina_strbuf_append(buf2, sd->config.path);
                       eina_strbuf_append(buf2, ecore_file_file_get(esc));
-                      cmd_strbuf_append(buf, "path", eina_strbuf_string_get(buf2));
+                      cmd_strbuf_append(buf, "path",
+                                        eina_strbuf_string_get(buf2));
                       snprintf(str, sizeof(str), "%i,%i",
                                (int)(sd->dnd_x / _scale_get(sd)),
                                (int)(sd->dnd_y / _scale_get(sd)));
@@ -301,12 +275,109 @@ _cb_drop(void *data, Evas_Object *o EINA_UNUSED, Elm_Selection_Data *ev)
         }
     }
   sd->relayout = EINA_TRUE;
+  sd->drop_over = NULL;
   evas_object_smart_calculate(sd->o_smart);
   free(*plist);
   free(plist);
-  free(tmp);
+}
+
+static void
+_cb_menu_dnd_ask_done(void *data, void *data2 EINA_UNUSED,
+                      Evas_Object *o EINA_UNUSED,
+                      const Efm_Menu *m EINA_UNUSED)
+{
+  Smart_Data *sd = data;
+
+  if (sd->dnd_drop_data)
+    {
+      free(sd->dnd_drop_data);
+      sd->dnd_drop_data = NULL;
+    }
+}
+
+static void
+_cb_menu_dnd_drop_copy(void *data, void *data2 EINA_UNUSED,
+                       Evas_Object *o EINA_UNUSED,
+                       const Efm_Menu_Item *mi EINA_UNUSED)
+{
+  Smart_Data *sd = data;
+
+  _dnd_drop_handle(sd, sd->dnd_drop_data, ELM_XDND_ACTION_COPY);
+}
+
+static void
+_cb_menu_dnd_drop_move(void *data, void *data2 EINA_UNUSED,
+                       Evas_Object *o EINA_UNUSED,
+                       const Efm_Menu_Item *mi EINA_UNUSED)
+{
+  Smart_Data *sd = data;
+
+  _dnd_drop_handle(sd, sd->dnd_drop_data, ELM_XDND_ACTION_MOVE);
+}
+
+static void
+_cb_menu_dnd_drop_link(void *data, void *data2 EINA_UNUSED,
+                       Evas_Object *o EINA_UNUSED,
+                       const Efm_Menu_Item *mi EINA_UNUSED)
+{
+  Smart_Data *sd = data;
+
+  _dnd_drop_handle(sd, sd->dnd_drop_data, ELM_XDND_ACTION_LINK);
+}
+
+static Eina_Bool
+_cb_drop(void *data, Evas_Object *o EINA_UNUSED, Elm_Selection_Data *ev)
+{
+  Smart_Data          *sd = data;
+  char                *tmp;
+  const Evas_Modifier *m   = evas_key_modifier_get(evas_object_evas_get(o));
+  Elm_Xdnd_Action      act = ELM_XDND_ACTION_MOVE; // default 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
+
+  tmp = malloc(ev->len + 1);
+  if (!tmp)
+    {
+      sd->drop_over = NULL;
+      goto err;
+    }
+  memcpy(tmp, ev->data, ev->len);
+  tmp[ev->len] = 0;
+  if (act == ELM_XDND_ACTION_ASK)
+    {
+      // XXX: store tmp as urilist and pop up ask menu
+      Efm_Menu *m
+        = _efm_menu_add("What to do?", NULL, _cb_menu_dnd_ask_done, sd, NULL);
+      _efm_menu_it_normal(m, "Copy", NULL, _cb_menu_dnd_drop_copy, sd, NULL);
+      _efm_menu_it_normal(m, "Move", NULL, _cb_menu_dnd_drop_move, sd, NULL);
+      _efm_menu_it_normal(m, "Link", NULL, _cb_menu_dnd_drop_link, sd, NULL);
+      _efm_menu_show(sd->o_smart, m, sd->dnd_x, sd->dnd_y);
+      sd->dnd_drop_data = tmp;
+    }
+  else
+    { // handle dnd here as we know the action
+      _dnd_drop_handle(sd, tmp, act);
+      free(tmp);
+    }
 err:
-  sd->drop_over = NULL;
   return EINA_TRUE;
 }
 
diff --git a/src/efm/efm_structs.h b/src/efm/efm_structs.h
index 8041cb7..2e444ca 100644
--- a/src/efm/efm_structs.h
+++ b/src/efm/efm_structs.h
@@ -96,9 +96,10 @@ struct _Smart_Data
   Eina_List      *timers;
   Elm_Xdnd_Action dnd_action;
   Evas_Coord      dnd_x, dnd_y;
+  char           *dnd_drop_data;
   void           *custom_data; // handled in efm_custom.c
 
-  unsigned long long file_max; // larges file size in dir
+  unsigned long long file_max; // largest file size in dir
 
   struct
   {

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

Reply via email to