diff --git a/input/event.c b/input/event.c index add77f0b0c..d47f17ddaf 100644 --- a/input/event.c +++ b/input/event.c @@ -20,7 +20,8 @@ #include "common/msg.h" #include "sub/find_subfiles.h" -void mp_event_drop_files(struct input_ctx *ictx, int num_files, char **files) +void mp_event_drop_files(struct input_ctx *ictx, int num_files, char **files, + enum mp_dnd_action action) { bool all_sub = true; for (int i = 0; i < num_files; i++) @@ -42,8 +43,9 @@ void mp_event_drop_files(struct input_ctx *ictx, int num_files, char **files) "osd-auto", "loadfile", files[i], - /* Start playing the dropped files right away */ - (i == 0) ? "replace" : "append", + /* Either start playing the dropped files right away + or add them to the end of the current playlist */ + (i == 0 && action == DND_REPLACE) ? "replace" : "append-play", NULL }; mp_input_run_cmd(ictx, cmd); @@ -52,7 +54,7 @@ void mp_event_drop_files(struct input_ctx *ictx, int num_files, char **files) } int mp_event_drop_mime_data(struct input_ctx *ictx, const char *mime_type, - bstr data) + bstr data, enum mp_dnd_action action) { // X11 and Wayland file list format. if (strcmp(mime_type, "text/uri-list") == 0) { @@ -67,7 +69,7 @@ int mp_event_drop_mime_data(struct input_ctx *ictx, const char *mime_type, char *s = bstrto0(tmp, line); MP_TARRAY_APPEND(tmp, files, num_files, s); } - mp_event_drop_files(ictx, num_files, files); + mp_event_drop_files(ictx, num_files, files, action); talloc_free(tmp); return num_files > 0; } else { diff --git a/input/event.h b/input/event.h index a1cb542f8f..e2ce36b329 100644 --- a/input/event.h +++ b/input/event.h @@ -19,10 +19,16 @@ struct input_ctx; +enum mp_dnd_action { + DND_REPLACE, + DND_APPEND, +}; + // Enqueue files for playback after drag and drop -void mp_event_drop_files(struct input_ctx *ictx, int num_files, char **files); +void mp_event_drop_files(struct input_ctx *ictx, int num_files, char **files, + enum mp_dnd_action append); // Drop data in a specific format (identified by the mimetype). // Returns <0 on error, ==0 if data was ok but empty, >0 on success. int mp_event_drop_mime_data(struct input_ctx *ictx, const char *mime_type, - bstr data); + bstr data, enum mp_dnd_action append); diff --git a/osdep/macosx_events.m b/osdep/macosx_events.m index 435e84c787..ae909d8e43 100644 --- a/osdep/macosx_events.m +++ b/osdep/macosx_events.m @@ -472,7 +472,7 @@ void cocoa_set_input_context(struct input_ctx *input_context) }]; [_input_lock lock]; if (_inputContext) - mp_event_drop_files(_inputContext, num_files, files_utf8); + mp_event_drop_files(_inputContext, num_files, files_utf8, DND_REPLACE); [_input_lock unlock]; talloc_free(files_utf8); } diff --git a/video/out/w32_common.c b/video/out/w32_common.c index 5197ad054c..6074c4cbeb 100644 --- a/video/out/w32_common.c +++ b/video/out/w32_common.c @@ -253,7 +253,8 @@ static HRESULT STDMETHODCALLTYPE DropTarget_Drop(IDropTarget* This, } GlobalUnlock(medium.hGlobal); - mp_event_drop_files(t->w32->input_ctx, nrecvd_files, files); + mp_event_drop_files(t->w32->input_ctx, nrecvd_files, files, + DND_REPLACE); talloc_free(files); } @@ -265,7 +266,7 @@ static HRESULT STDMETHODCALLTYPE DropTarget_Drop(IDropTarget* This, char* url = (char*)GlobalLock(medium.hGlobal); if (url != NULL) { if (mp_event_drop_mime_data(t->w32->input_ctx, "text/uri-list", - bstr0(url)) > 0) { + bstr0(url), DND_REPLACE) > 0) { MP_VERBOSE(t->w32, "received dropped URL: %s\n", url); } else { MP_ERR(t->w32, "error getting dropped URL\n"); diff --git a/video/out/wayland_common.c b/video/out/wayland_common.c index 198b167d79..289ed0442e 100644 --- a/video/out/wayland_common.c +++ b/video/out/wayland_common.c @@ -1176,7 +1176,7 @@ static int vo_wayland_check_events (struct vo *vo) buffer[str_len] = 0; struct bstr file_list = bstr0(buffer); mp_event_drop_mime_data(vo->input_ctx, "text/uri-list", - file_list); + file_list, DND_REPLACE); break; } } diff --git a/video/out/x11_common.c b/video/out/x11_common.c index 9ed57bdc4f..a5c9dd84f5 100644 --- a/video/out/x11_common.c +++ b/video/out/x11_common.c @@ -838,7 +838,7 @@ static void vo_x11_dnd_handle_selection(struct vo *vo, XSelectionEvent *se) if (prop) { // No idea if this is guaranteed to be \0-padded, so use bstr. success = mp_event_drop_mime_data(vo->input_ctx, "text/uri-list", - (bstr){prop, nitems}) > 0; + (bstr){prop, nitems}, DND_REPLACE) > 0; XFree(prop); } }