now spin up sub-opens for drop over and pass in dnd cmd

now if u drop over a dir in a dir a sub-open process will spin up to
handle that sub dir and be passed relevant dnd cmd's

right now the open doesnt DO anything ... but there are just some
XXX's there left to fill in the doing.

also the sub-opens don't know when to close/end - there is a XXX for
that.
This commit is contained in:
Carsten Haitzler 2024-03-08 12:50:32 +00:00
parent 5661ec1913
commit 6c06a10ba5
3 changed files with 87 additions and 25 deletions

View File

@ -37,7 +37,6 @@ typedef struct
Ecore_Exe *exe;
Ecore_Timer *busy_delay_timer;
} Thumb;
static Ecore_Event_Handler *thumb_exe_del_handler = NULL;
static Eina_List *thumb_queue = NULL;
static Eina_List *thumb_busy_queue = NULL;
@ -79,6 +78,27 @@ static Eina_List *sub_queue = NULL;
static Sub *_sub_open(const char *path, const char *backend);
static Sub *
_sub_find(const char *path)
{
Eina_List *l;
Sub *sub;
EINA_LIST_FOREACH(sub_queue, l, sub)
{
if (!strcmp(path, sub->path)) return sub;
}
return NULL;
}
static void
_sub_timer_free(Sub_Timer *st)
{
ecore_timer_del(st->timer);
eina_stringshare_del(st->name);
free(st);
}
static Eina_Bool
_cb_sub_timer(void *data)
{
@ -89,18 +109,22 @@ _cb_sub_timer(void *data)
cmd_strbuf_exe_consume(buf, st->sub->exe);
if (st->repeat) return EINA_TRUE;
st->sub->timers = eina_list_remove(st->sub->timers, st);
eina_stringshare_del(st->name);
free(st);
_sub_timer_free(st);
return EINA_FALSE;
}
static void
_sub_del(Sub *sub)
{
Sub_Timer *st;
Eina_Strbuf *buf;
sub_queue = eina_list_remove(sub_queue, sub);
eina_stringshare_replace(&(sub->path), NULL);
ecore_event_handler_del(sub->handler_exe_del);
ecore_event_handler_del(sub->handler_exe_data);
EINA_LIST_FREE(sub->cmd_pending, buf) eina_strbuf_free(buf);
EINA_LIST_FREE(sub->timers, st) _sub_timer_free(st);
ecore_exe_free(sub->exe);
free(sub);
}
@ -191,14 +215,12 @@ _sub_command(Sub *sub, const char *str)
if (!strcmp(st->name, name))
{
sub->timers = eina_list_remove_list(sub->timers, l);
eina_stringshare_del(st->name);
ecore_timer_del(st->timer);
free(st);
_sub_timer_free(st);
}
}
}
}
// XXX: handle: dir-request
// XXX: handle: dir-request ...
cmd_free(c);
}
@ -229,6 +251,7 @@ _cb_sub_exe_data(void *data, int ev_type EINA_UNUSED, void *event)
static Sub *
_sub_open(const char *path, const char *backend)
{
// XXX: this sub should exit on its own if its idle for some time
Eina_Strbuf *buf;
const char *s;
Sub *sub = calloc(1, sizeof(Sub));
@ -251,10 +274,15 @@ _sub_open(const char *path, const char *backend)
{
eina_strbuf_reset(buf);
eina_strbuf_append(buf, elm_app_lib_dir_get());
eina_strbuf_append(buf, "/efm/backends/");
eina_strbuf_append(buf, backend);
eina_strbuf_append(buf, "/open");
// XXX: this could be better!
s = getenv("EFM_BACKEND_DIR");
if (s)
{
eina_strbuf_append(buf, s);
eina_strbuf_append(buf, "/../");
eina_strbuf_append(buf, backend);
eina_strbuf_append(buf, "/open");
}
}
sub->handler_exe_del = ecore_event_handler_add(ECORE_EXE_EVENT_DEL,
_cb_sub_exe_del, sub);
@ -265,6 +293,7 @@ _sub_open(const char *path, const char *backend)
ECORE_EXE_PIPE_READ_LINE_BUFFERED |
ECORE_EXE_PIPE_WRITE,
sub);
fprintf(stderr, "SUB %s\n", eina_strbuf_string_get(buf));
eina_strbuf_free(buf);
buf = cmd_strbuf_new("dir-set");
cmd_strbuf_append(buf, "path", path);
@ -1068,10 +1097,20 @@ static void
_dir_del(const char *path)
{
Eina_Strbuf *strbuf;
const char *mondir;
char *realpath;
strbuf = cmd_strbuf_new("dir-del");
cmd_strbuf_append(strbuf, "path", path);
cmd_strbuf_print_consume(strbuf);
if (!mon) return;
mondir = ecore_file_monitor_path_get(mon);
if (!mondir) return;
realpath = ecore_file_realpath(mondir);
if ((!strcmp(mondir, path)) ||
((realpath) && (!strcmp(realpath, path))))
{
strbuf = cmd_strbuf_new("dir-del");
cmd_strbuf_print_consume(strbuf);
}
free(realpath);
}
static void
@ -1191,12 +1230,27 @@ _handle_drop_paste(const char *over, const char *action, const char *path)
mondir = ecore_file_monitor_path_get(mon);
if (!mondir) return;
if (over)
fprintf(stderr, "DROP over=[%s] action=[%s] > [%s]\n", over, action, path);
else
fprintf(stderr, "DROP action=[%s] > [%s]\n", action, path);
// XXX: decide what to do with file and tell frontend
// XXX: action = copy, move, ask, list, link, description
// XXX: if over, then spin up backedn for that over dir and hand work to that
{ // if you are dropping over a dir then spint up a sub open and pass
// the dnd to it
Eina_Strbuf *strbuf;
Sub *sub;
sub = _sub_find(over);
if (!sub) sub = _sub_open(over, "default");
strbuf = cmd_strbuf_new("dnd-drop");
cmd_strbuf_append(strbuf, "action", action);
cmd_strbuf_append(strbuf, "path", path);
_sub_cmd_send(sub, strbuf);
fprintf(stderr, "DROP in [%s] over=[%s] action=[%s] > [%s]\n",
mondir, over, action, path);
}
else
{
fprintf(stderr, "DROP in [%s] action=[%s] > [%s]\n", mondir, action,
path);
// XXX: do the real operation here
// XXX: action = copy, move, ask, list, link, description
}
}
void

View File

@ -567,6 +567,12 @@ _cb_thread_notify(void *data, Ecore_Thread *th EINA_UNUSED, void *msg)
}
CMD_DONE;
}
else if (!strcmp(c->command, "dir-del"))
{
// XXX: handle if the dir was deleted
printf("XXX: dir del...\n");
CMD_DONE;
}
// below commands all send a path for a specific file
path = file = cmd_key_find(c, "path");

View File

@ -20,9 +20,11 @@
// viewmode-set // force a specific view mode from backend
// detail-header-set // set detail header text, size
// dir-request // backend requests to show a new dir
// backend-set // swich to a new named backend
// timer-add // backend can ask for a timer to be added
// timer-del // backend can ask for a timer to be deleted
// timer // event from front to backend that a timer ticked
// file-detail // update the file detail in custom detail mode
// file-detail-change // user interacted with detail - changed it
// file-detail-clicked // user interacted with detail - clicked it
// file-detail-select // user interacted with detail - selected sub item
@ -36,11 +38,11 @@
// dnd-hover
//
// file-run // double-click file (or enter on kbd)
// file-clicked
// file-selected
// file-unselected
// file-delete
// file-rename
// file-clicked // a single click
// file-selected // file became selected
// file-unselected // file became unselected
// file-delete // user requested to delete file
// file-rename // user provided a new name for file
//
////////////////////