summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin Mitchell <kevmitch@gmail.com>2015-08-29 00:42:04 -0700
committerKevin Mitchell <kevmitch@gmail.com>2015-08-30 05:28:24 -0700
commitc80b7eed53dfd9f6a0aadc9c11981cba2a59655d (patch)
tree44972f05104d989af223ff5d782b0d32faf865ee
parentf14f6fdb314ce42537d0948d8a24fbe77c06d17c (diff)
downloadmpv-c80b7eed53dfd9f6a0aadc9c11981cba2a59655d.tar.bz2
mpv-c80b7eed53dfd9f6a0aadc9c11981cba2a59655d.tar.xz
input: add append argument to file drop event
This puts in place the machinery to merely append dropped file to the playlist instead of replacing the existing playlist. In this commit, all front-ends set this to false preserving the existing behaviour.
-rw-r--r--input/event.c12
-rw-r--r--input/event.h10
-rw-r--r--osdep/macosx_events.m2
-rw-r--r--video/out/w32_common.c5
-rw-r--r--video/out/wayland_common.c2
-rw-r--r--video/out/x11_common.c2
6 files changed, 21 insertions, 12 deletions
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);
}
}