mirror of
https://github.com/mpv-player/mpv
synced 2025-03-07 06:37:46 +00:00
input: add insert-next support for drag-and-drop
This commit adds a DND_INSERT_NEXT action option for drag-and-drop, allows for selecting it through the --drag-and-drop=insert-next option, and adds the necessary plumbing to make that happen when something is dragged onto the player.
This commit is contained in:
parent
432256e5d2
commit
a8a314b829
@ -3197,13 +3197,14 @@ Window
|
||||
``--snap-window``
|
||||
(Windows only) Snap the player window to screen edges.
|
||||
|
||||
``--drag-and-drop=<no|auto|replace|append>``
|
||||
Controls the default behavior of drag and drop on platforms that support this.
|
||||
``auto`` will obey what the underlying os/platform gives mpv. Typically, holding
|
||||
shift during the drag and drop will append the item to the playlist. Otherwise,
|
||||
it will completely replace it. ``replace`` and ``append`` always force replacing
|
||||
and appending to the playlist respectively. ``no`` disables all drag and drop
|
||||
behavior.
|
||||
``--drag-and-drop=<no|auto|replace|append|insert-next>``
|
||||
Controls the default behavior of drag and drop on platforms that support
|
||||
this. ``auto`` will obey what the underlying os/platform gives mpv.
|
||||
Typically, holding shift during the drag and drop will append the item to
|
||||
the playlist. Otherwise, it will completely replace it. ``replace``,
|
||||
``append``, and ``insert-next`` always force replacing, appending to, and
|
||||
inserting next into the playlist respectively. ``no`` disables all drag and
|
||||
drop behavior.
|
||||
|
||||
``--ontop``
|
||||
Makes the player window stay on top of other windows.
|
||||
|
@ -37,6 +37,21 @@ void mp_event_drop_files(struct input_ctx *ictx, int num_files, char **files,
|
||||
};
|
||||
mp_input_run_cmd(ictx, cmd);
|
||||
}
|
||||
} else if (action == DND_INSERT_NEXT) {
|
||||
/* To insert the entries in the correct order, we iterate over them
|
||||
backwards */
|
||||
for (int i = num_files - 1; i >= 0; i--) {
|
||||
const char *cmd[] = {
|
||||
"osd-auto",
|
||||
"loadfile",
|
||||
files[i],
|
||||
/* Since we're inserting in reverse, wait til the final item
|
||||
is added to start playing */
|
||||
(i > 0) ? "insert-next" : "insert-next-play",
|
||||
NULL
|
||||
};
|
||||
mp_input_run_cmd(ictx, cmd);
|
||||
}
|
||||
} else {
|
||||
for (int i = 0; i < num_files; i++) {
|
||||
const char *cmd[] = {
|
||||
|
@ -24,16 +24,17 @@ struct input_ctx;
|
||||
enum mp_dnd_action {
|
||||
DND_REPLACE,
|
||||
DND_APPEND,
|
||||
DND_INSERT_NEXT,
|
||||
};
|
||||
|
||||
// Enqueue files for playback after drag and drop
|
||||
void mp_event_drop_files(struct input_ctx *ictx, int num_files, char **files,
|
||||
enum mp_dnd_action append);
|
||||
enum mp_dnd_action action);
|
||||
|
||||
// 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, enum mp_dnd_action append);
|
||||
bstr data, enum mp_dnd_action action);
|
||||
|
||||
// Many drag & drop APIs support multiple mime types, and this function returns
|
||||
// whether a type is preferred (higher integer score), or supported (scores
|
||||
|
@ -112,7 +112,9 @@ static const m_option_t mp_vo_opt_list[] = {
|
||||
{"vo", OPT_SETTINGSLIST(video_driver_list, &vo_obj_list)},
|
||||
{"taskbar-progress", OPT_BOOL(taskbar_progress)},
|
||||
{"drag-and-drop", OPT_CHOICE(drag_and_drop, {"no", -2}, {"auto", -1},
|
||||
{"replace", DND_REPLACE}, {"append", DND_APPEND})},
|
||||
{"replace", DND_REPLACE},
|
||||
{"append", DND_APPEND},
|
||||
{"insert-next", DND_INSERT_NEXT})},
|
||||
{"snap-window", OPT_BOOL(snap_window)},
|
||||
{"ontop", OPT_BOOL(ontop)},
|
||||
{"ontop-level", OPT_CHOICE(ontop_level, {"window", -1}, {"system", -2},
|
||||
|
@ -695,8 +695,14 @@ static void data_offer_action(void *data, struct wl_data_offer *wl_data_offer, u
|
||||
wl->dnd_action = dnd_action & WL_DATA_DEVICE_MANAGER_DND_ACTION_COPY ?
|
||||
DND_REPLACE : DND_APPEND;
|
||||
}
|
||||
MP_VERBOSE(wl, "DND action is %s\n",
|
||||
wl->dnd_action == DND_REPLACE ? "DND_REPLACE" : "DND_APPEND");
|
||||
|
||||
static const char * const dnd_action_names[] = {
|
||||
[DND_REPLACE] = "DND_REPLACE",
|
||||
[DND_APPEND] = "DND_APPEND",
|
||||
[DND_INSERT_NEXT] = "DND_INSERT_NEXT",
|
||||
};
|
||||
|
||||
MP_VERBOSE(wl, "DND action is %s\n", dnd_action_names[wl->dnd_action]);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user