diff options
Diffstat (limited to 'input/event.c')
-rw-r--r-- | input/event.c | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/input/event.c b/input/event.c new file mode 100644 index 0000000..266e029 --- /dev/null +++ b/input/event.c @@ -0,0 +1,93 @@ +/* + * This file is part of mpv. + * + * mpv is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * mpv is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with mpv. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "event.h" +#include "input.h" +#include "common/msg.h" +#include "player/external_files.h" + +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++) + all_sub &= mp_might_be_subtitle_file(files[i]); + + if (all_sub) { + for (int i = 0; i < num_files; i++) { + const char *cmd[] = { + "osd-auto", + "sub-add", + files[i], + NULL + }; + mp_input_run_cmd(ictx, cmd); + } + } else { + for (int i = 0; i < num_files; i++) { + const char *cmd[] = { + "osd-auto", + "loadfile", + files[i], + /* 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); + } + } +} + +int mp_event_drop_mime_data(struct input_ctx *ictx, const char *mime_type, + bstr data, enum mp_dnd_action action) +{ + // (text lists are the only format supported right now) + if (mp_event_get_mime_type_score(ictx, mime_type) >= 0) { + void *tmp = talloc_new(NULL); + int num_files = 0; + char **files = NULL; + while (data.len) { + bstr line = bstr_getline(data, &data); + line = bstr_strip_linebreaks(line); + if (bstr_startswith0(line, "#") || !line.start[0]) + continue; + char *s = bstrto0(tmp, line); + MP_TARRAY_APPEND(tmp, files, num_files, s); + } + mp_event_drop_files(ictx, num_files, files, action); + talloc_free(tmp); + return num_files > 0; + } else { + return -1; + } +} + +int mp_event_get_mime_type_score(struct input_ctx *ictx, const char *mime_type) +{ + // X11 and Wayland file list format. + if (strcmp(mime_type, "text/uri-list") == 0) + return 10; + // Just text; treat it the same for convenience. + if (strcmp(mime_type, "text/plain;charset=utf-8") == 0) + return 5; + if (strcmp(mime_type, "text/plain") == 0) + return 4; + if (strcmp(mime_type, "text") == 0) + return 0; + return -1; +} |