mirror of
https://github.com/mpv-player/mpv
synced 2024-12-25 08:12:17 +00:00
7e75e2a5dc
Drag&drop mechanisms typically support multiple types for the drop data. Move most of the logic which types are accepted and preferred to event.c, where the data is also interpreted. (Maybe sorting the types by assigning scores is over-engineered, since they're already sorted by preference, but it's actually not much more code.) Not very interesting/meaningful yet, but preparation for the next commit.
87 lines
2.8 KiB
C
87 lines
2.8 KiB
C
/*
|
|
* 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, "#"))
|
|
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;
|
|
return -1;
|
|
}
|