context menu issue fix #396
This commit is contained in:
@@ -53,6 +53,7 @@ namespace mpvnet
|
|||||||
case "show-input-editor": ShowDialog(typeof(InputWindow)); break;
|
case "show-input-editor": ShowDialog(typeof(InputWindow)); break;
|
||||||
case "show-keys": ShowStrings(Core.GetPropertyString("input-key-list").Split(',')); break;
|
case "show-keys": ShowStrings(Core.GetPropertyString("input-key-list").Split(',')); break;
|
||||||
case "show-media-info": ShowMediaInfo(args); break;
|
case "show-media-info": ShowMediaInfo(args); break;
|
||||||
|
case "show-menu": ShowMenu(); break;
|
||||||
case "show-playlist": ShowPlaylist(); break;
|
case "show-playlist": ShowPlaylist(); break;
|
||||||
case "show-profiles": Msg.ShowInfo(mpvHelp.GetProfiles()); break;
|
case "show-profiles": Msg.ShowInfo(mpvHelp.GetProfiles()); break;
|
||||||
case "show-progress": ShowProgress(); break;
|
case "show-progress": ShowProgress(); break;
|
||||||
@@ -661,5 +662,7 @@ namespace mpvnet
|
|||||||
MainForm.Instance.ShowCommandPalette();
|
MainForm.Instance.ShowCommandPalette();
|
||||||
CommandPalette.Instance.SelectFirst();
|
CommandPalette.Instance.SelectFirst();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
public static void ShowMenu() => Core.RaiseShowMenu();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -53,6 +53,7 @@ namespace mpvnet
|
|||||||
|
|
||||||
public event Action Initialized;
|
public event Action Initialized;
|
||||||
public event Action InitializedAsync;
|
public event Action InitializedAsync;
|
||||||
|
public event Action ShowMenu;
|
||||||
public event Action<float> ScaleWindow;
|
public event Action<float> ScaleWindow;
|
||||||
public event Action<float> WindowScale;
|
public event Action<float> WindowScale;
|
||||||
public event Action<int> PlaylistPosChanged;
|
public event Action<int> PlaylistPosChanged;
|
||||||
@@ -81,7 +82,7 @@ namespace mpvnet
|
|||||||
public string ConfPath { get => ConfigFolder + "mpv.conf"; }
|
public string ConfPath { get => ConfigFolder + "mpv.conf"; }
|
||||||
public string GPUAPI { get; set; } = "auto";
|
public string GPUAPI { get; set; } = "auto";
|
||||||
public string VO { get; set; } = "gpu";
|
public string VO { get; set; } = "gpu";
|
||||||
public string InputConfPath { get => ConfigFolder + "input.conf"; }
|
public string InputConfPath => ConfigFolder + "input.conf";
|
||||||
|
|
||||||
public string VID { get; set; } = "";
|
public string VID { get; set; } = "";
|
||||||
public string AID { get; set; } = "";
|
public string AID { get; set; } = "";
|
||||||
@@ -109,6 +110,8 @@ namespace mpvnet
|
|||||||
|
|
||||||
public void Init()
|
public void Init()
|
||||||
{
|
{
|
||||||
|
ApplyShowMenuFix();
|
||||||
|
|
||||||
Handle = mpv_create();
|
Handle = mpv_create();
|
||||||
|
|
||||||
if (Handle == IntPtr.Zero)
|
if (Handle == IntPtr.Zero)
|
||||||
@@ -168,23 +171,40 @@ namespace mpvnet
|
|||||||
InvokeAsync(InitializedAsync);
|
InvokeAsync(InitializedAsync);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ApplyCompatibilityFixes()
|
void ApplyShowMenuFix()
|
||||||
{
|
{
|
||||||
if (!App.Settings.InputDefaultBindingsFixApplied)
|
if (App.Settings.ShowMenuFixApplied)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (File.Exists(InputConfPath))
|
||||||
{
|
{
|
||||||
if (File.Exists(ConfPath))
|
string content = File.ReadAllText(InputConfPath);
|
||||||
{
|
|
||||||
string content = File.ReadAllText(ConfPath);
|
|
||||||
|
|
||||||
if (content.Contains("input-default-bindings = no"))
|
if (!content.Contains("script-message mpv.net show-menu"))
|
||||||
File.WriteAllText(ConfPath, content.Replace("input-default-bindings = no", ""));
|
File.WriteAllText(InputConfPath, BR + content.Trim() + BR +
|
||||||
|
"MBTN_Right script-message mpv.net show-menu" + BR);
|
||||||
if (content.Contains("input-default-bindings=no"))
|
|
||||||
File.WriteAllText(ConfPath, content.Replace("input-default-bindings=no", ""));
|
|
||||||
}
|
|
||||||
|
|
||||||
App.Settings.InputDefaultBindingsFixApplied = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
App.Settings.ShowMenuFixApplied = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ApplyInputDefaultBindingsFix()
|
||||||
|
{
|
||||||
|
if (App.Settings.InputDefaultBindingsFixApplied)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (File.Exists(ConfPath))
|
||||||
|
{
|
||||||
|
string content = File.ReadAllText(ConfPath);
|
||||||
|
|
||||||
|
if (content.Contains("input-default-bindings = no"))
|
||||||
|
File.WriteAllText(ConfPath, content.Replace("input-default-bindings = no", ""));
|
||||||
|
|
||||||
|
if (content.Contains("input-default-bindings=no"))
|
||||||
|
File.WriteAllText(ConfPath, content.Replace("input-default-bindings=no", ""));
|
||||||
|
}
|
||||||
|
|
||||||
|
App.Settings.InputDefaultBindingsFixApplied = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ProcessProperty(string name, string value)
|
public void ProcessProperty(string name, string value)
|
||||||
@@ -264,7 +284,7 @@ namespace mpvnet
|
|||||||
get {
|
get {
|
||||||
if (_Conf == null)
|
if (_Conf == null)
|
||||||
{
|
{
|
||||||
ApplyCompatibilityFixes();
|
ApplyInputDefaultBindingsFix();
|
||||||
|
|
||||||
_Conf = new Dictionary<string, string>();
|
_Conf = new Dictionary<string, string>();
|
||||||
|
|
||||||
@@ -1352,6 +1372,8 @@ KP1 script-binding delete_current_file/confirm
|
|||||||
public void RaiseScaleWindow(float value) => ScaleWindow(value);
|
public void RaiseScaleWindow(float value) => ScaleWindow(value);
|
||||||
|
|
||||||
public void RaiseWindowScale(float value) => WindowScale(value);
|
public void RaiseWindowScale(float value) => WindowScale(value);
|
||||||
|
|
||||||
|
public void RaiseShowMenu() => ShowMenu();
|
||||||
|
|
||||||
void ReadMetaData()
|
void ReadMetaData()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -48,6 +48,7 @@ namespace mpvnet
|
|||||||
Core.Init();
|
Core.Init();
|
||||||
|
|
||||||
Core.Shutdown += Core_Shutdown;
|
Core.Shutdown += Core_Shutdown;
|
||||||
|
Core.ShowMenu += Core_ShowMenu;
|
||||||
Core.VideoSizeChanged += Core_VideoSizeChanged;
|
Core.VideoSizeChanged += Core_VideoSizeChanged;
|
||||||
Core.ScaleWindow += Core_ScaleWindow;
|
Core.ScaleWindow += Core_ScaleWindow;
|
||||||
Core.WindowScale += Core_WindowScale;
|
Core.WindowScale += Core_WindowScale;
|
||||||
@@ -135,6 +136,18 @@ namespace mpvnet
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void Core_ShowMenu()
|
||||||
|
{
|
||||||
|
BeginInvoke(new Action(() => {
|
||||||
|
if (IsMouseInOSC())
|
||||||
|
return;
|
||||||
|
|
||||||
|
CursorHelp.Show();
|
||||||
|
UpdateMenu();
|
||||||
|
ContextMenu.IsOpen = true;
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
void Core_ScaleWindow(float scale) {
|
void Core_ScaleWindow(float scale) {
|
||||||
BeginInvoke(new Action(() => {
|
BeginInvoke(new Action(() => {
|
||||||
int w, h;
|
int w, h;
|
||||||
@@ -791,30 +804,17 @@ namespace mpvnet
|
|||||||
case 0x105: // WM_SYSKEYUP
|
case 0x105: // WM_SYSKEYUP
|
||||||
case 0x201: // WM_LBUTTONDOWN
|
case 0x201: // WM_LBUTTONDOWN
|
||||||
case 0x202: // WM_LBUTTONUP
|
case 0x202: // WM_LBUTTONUP
|
||||||
|
case 0x204: // WM_RBUTTONDOWN
|
||||||
|
case 0x205: // WM_RBUTTONUP
|
||||||
case 0x207: // WM_MBUTTONDOWN
|
case 0x207: // WM_MBUTTONDOWN
|
||||||
case 0x208: // WM_MBUTTONUP
|
case 0x208: // WM_MBUTTONUP
|
||||||
case 0x20a: // WM_MOUSEWHEEL
|
case 0x20a: // WM_MOUSEWHEEL
|
||||||
case 0x20e: // WM_MOUSEHWHEEL
|
|
||||||
case 0x20b: // WM_XBUTTONDOWN
|
case 0x20b: // WM_XBUTTONDOWN
|
||||||
case 0x20c: // WM_XBUTTONUP
|
case 0x20c: // WM_XBUTTONUP
|
||||||
|
case 0x20e: // WM_MOUSEHWHEEL
|
||||||
if (Core.WindowHandle != IntPtr.Zero)
|
if (Core.WindowHandle != IntPtr.Zero)
|
||||||
m.Result = SendMessage(Core.WindowHandle, m.Msg, m.WParam, m.LParam);
|
m.Result = SendMessage(Core.WindowHandle, m.Msg, m.WParam, m.LParam);
|
||||||
break;
|
break;
|
||||||
case 0x0204: // WM_RBUTTONDOWN
|
|
||||||
if (IsMouseInOSC() && Core.WindowHandle != IntPtr.Zero)
|
|
||||||
m.Result = SendMessage(Core.WindowHandle, m.Msg, m.WParam, m.LParam);
|
|
||||||
break;
|
|
||||||
case 0x0205: // WM_RBUTTONUP
|
|
||||||
if (!IsMouseInOSC())
|
|
||||||
{
|
|
||||||
CursorHelp.Show();
|
|
||||||
UpdateMenu();
|
|
||||||
ContextMenu.IsOpen = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
if (Core.WindowHandle != IntPtr.Zero)
|
|
||||||
m.Result = SendMessage(Core.WindowHandle, m.Msg, m.WParam, m.LParam);
|
|
||||||
break;
|
|
||||||
case 0x319: // WM_APPCOMMAND
|
case 0x319: // WM_APPCOMMAND
|
||||||
{
|
{
|
||||||
string value = Input.WM_APPCOMMAND_to_mpv_key((int)(m.LParam.ToInt64() >> 16 & ~0xf000));
|
string value = Input.WM_APPCOMMAND_to_mpv_key((int)(m.LParam.ToInt64() >> 16 & ~0xf000));
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ namespace mpvnet
|
|||||||
public class AppSettings
|
public class AppSettings
|
||||||
{
|
{
|
||||||
public bool InputDefaultBindingsFixApplied;
|
public bool InputDefaultBindingsFixApplied;
|
||||||
public int LastUpdateCheck;
|
public bool ShowMenuFixApplied;
|
||||||
public int Volume = 70;
|
public int Volume = 70;
|
||||||
public List<string> RecentFiles = new List<string>();
|
public List<string> RecentFiles = new List<string>();
|
||||||
public Point WindowLocation;
|
public Point WindowLocation;
|
||||||
|
|||||||
@@ -166,10 +166,11 @@ F1 script-message mpv.net show-command-palette #menu: Command Palette
|
|||||||
_ ignore #menu: -
|
_ ignore #menu: -
|
||||||
Esc quit #menu: Exit
|
Esc quit #menu: Exit
|
||||||
|
|
||||||
|
MBTN_Right script-message mpv.net show-menu
|
||||||
6 script-message mpv.net show-progress
|
6 script-message mpv.net show-progress
|
||||||
KP6 script-message mpv.net show-progress
|
KP6 script-message mpv.net show-progress
|
||||||
7 script-message mpv.net cycle-audio
|
7 script-message mpv.net cycle-audio
|
||||||
SHARP script-message mpv.net cycle-audio
|
Sharp script-message mpv.net cycle-audio
|
||||||
8 cycle sub
|
8 cycle sub
|
||||||
j cycle sub
|
j cycle sub
|
||||||
q quit
|
q quit
|
||||||
@@ -195,15 +196,15 @@ MBTN_Left ignore
|
|||||||
f cycle fullscreen
|
f cycle fullscreen
|
||||||
MBTN_Left_DBL cycle fullscreen
|
MBTN_Left_DBL cycle fullscreen
|
||||||
KP_Enter cycle fullscreen
|
KP_Enter cycle fullscreen
|
||||||
Shift+RIGHT no-osd seek 1 exact
|
Shift+Right no-osd seek 1 exact
|
||||||
Shift+LEFT no-osd seek -1 exact
|
Shift+Left no-osd seek -1 exact
|
||||||
Shift+UP no-osd seek 5 exact
|
Shift+Up no-osd seek 5 exact
|
||||||
Shift+DOWN no-osd seek -5 exact
|
Shift+Down no-osd seek -5 exact
|
||||||
Shift+BS revert-seek # undo the previous (or marked) seek
|
Shift+BS revert-seek # undo the previous (or marked) seek
|
||||||
Shift+Ctrl+BS revert-seek mark # mark the position for revert-seek
|
Shift+Ctrl+BS revert-seek mark # mark the position for revert-seek
|
||||||
Shift+g add sub-scale +0.1 # increase the subtitle font size
|
Shift+g add sub-scale +0.1 # increase the subtitle font size
|
||||||
Shift+f add sub-scale -0.1 # decrease the subtitle font size
|
Shift+f add sub-scale -0.1 # decrease the subtitle font size
|
||||||
Ctrl+Shift+LEFT no-osd sub-seek -1 # seek to the previous subtitle
|
Ctrl+Shift+Left no-osd sub-seek -1 # seek to the previous subtitle
|
||||||
Ctrl+Shift+RIGHT no-osd sub-seek 1 # seek to the next subtitle
|
Ctrl+Shift+Right no-osd sub-seek 1 # seek to the next subtitle
|
||||||
Ctrl+Wheel_Up no-osd seek 7
|
Ctrl+Wheel_Up no-osd seek 7
|
||||||
Ctrl+Wheel_Down no-osd seek -7
|
Ctrl+Wheel_Down no-osd seek -7
|
||||||
|
|||||||
@@ -1,35 +0,0 @@
|
|||||||
|
|
||||||
// When seeking displays position and duration like so: 70:00 / 80:00
|
|
||||||
// Which is different from most players which use: 01:10:00 / 01:20:00
|
|
||||||
// In input.conf set the input command prefix no-osd infront of the seek command.
|
|
||||||
|
|
||||||
function add_zero(val)
|
|
||||||
{
|
|
||||||
val = Math.round(val);
|
|
||||||
return val > 9 ? "" + val : "0" + val;
|
|
||||||
}
|
|
||||||
|
|
||||||
function format(val)
|
|
||||||
{
|
|
||||||
var sec = Math.round(val);
|
|
||||||
|
|
||||||
if (sec < 0)
|
|
||||||
sec = 0;
|
|
||||||
|
|
||||||
pos_min_floor = Math.floor(sec / 60);
|
|
||||||
sec_rest = sec - pos_min_floor * 60;
|
|
||||||
return add_zero(pos_min_floor) + ":" + add_zero(sec_rest);
|
|
||||||
}
|
|
||||||
|
|
||||||
function on_seek(_)
|
|
||||||
{
|
|
||||||
pos = mp.get_property_number("time-pos");
|
|
||||||
dur = mp.get_property_number("duration");
|
|
||||||
|
|
||||||
if (pos > dur)
|
|
||||||
pos = dur;
|
|
||||||
|
|
||||||
mp.commandv("show-text", format(pos) + " / " + format(dur));
|
|
||||||
}
|
|
||||||
|
|
||||||
mp.register_event("seek", on_seek);
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
|
|
||||||
// This script shows the playlist.
|
|
||||||
|
|
||||||
function showPlaylist()
|
|
||||||
{
|
|
||||||
// set font size
|
|
||||||
mp.set_property_number("osd-font-size", 40);
|
|
||||||
|
|
||||||
// show playlist for 5 seconds
|
|
||||||
mp.command("show-text ${playlist} 5000");
|
|
||||||
|
|
||||||
// restore original font size in 6 seconds
|
|
||||||
setTimeout(resetFontSize, 6000);
|
|
||||||
}
|
|
||||||
|
|
||||||
// restore original font size
|
|
||||||
function resetFontSize()
|
|
||||||
{
|
|
||||||
mp.set_property_number("osd-font-size", size);
|
|
||||||
}
|
|
||||||
|
|
||||||
// save original font size
|
|
||||||
var size = mp.get_property_number("osd-font-size");
|
|
||||||
|
|
||||||
// input.conf: key script-binding show-playlist
|
|
||||||
mp.add_key_binding(null, "show-playlist", showPlaylist);
|
|
||||||
14
src/Scripts/Lua/.vscode/launch.json
vendored
14
src/Scripts/Lua/.vscode/launch.json
vendored
@@ -1,14 +0,0 @@
|
|||||||
{
|
|
||||||
"version": "0.2.0",
|
|
||||||
"configurations": [
|
|
||||||
{
|
|
||||||
"type": "lua",
|
|
||||||
"request": "launch",
|
|
||||||
"name": "launch",
|
|
||||||
"runtimeExecutable": "D:/Software/Development/MSYS2/mingw64/bin/mpv.exe",
|
|
||||||
"runtimeArgs": ["--script=${workspaceFolder}\\delete-current-file.lua", "D:\\Samples\\castele.m2v"],
|
|
||||||
"stopOnEntry": false,
|
|
||||||
"luaVersion": "5.1"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,70 +0,0 @@
|
|||||||
|
|
||||||
-- Only supported on Windows.
|
|
||||||
|
|
||||||
-- This script deletes the file that is currently playing
|
|
||||||
-- via keyboard shortcut, the file is moved to the recycle bin.
|
|
||||||
|
|
||||||
-- Usage:
|
|
||||||
-- Configure input.conf as described below.
|
|
||||||
-- Press 0 to initiate the delete operation.
|
|
||||||
-- Press 1 to confirm and delete.
|
|
||||||
|
|
||||||
-- input.conf:
|
|
||||||
|
|
||||||
-- KP0 script-binding delete_current_file/delete
|
|
||||||
-- 0 script-binding delete_current_file/delete
|
|
||||||
|
|
||||||
-- KP1 script-binding delete_current_file/confirm
|
|
||||||
-- 1 script-binding delete_current_file/confirm
|
|
||||||
|
|
||||||
function delete()
|
|
||||||
file_to_delete = mp.get_property("path")
|
|
||||||
delete_time = os.time()
|
|
||||||
mp.commandv("show-text", "Press 1 to delete file", "10000")
|
|
||||||
end
|
|
||||||
|
|
||||||
function confirm()
|
|
||||||
local path = mp.get_property("path")
|
|
||||||
|
|
||||||
if file_to_delete == path and (os.time() - delete_time) < 10 then
|
|
||||||
mp.commandv("show-text", "")
|
|
||||||
|
|
||||||
local count = mp.get_property_number("playlist-count")
|
|
||||||
local pos = mp.get_property_number("playlist-pos")
|
|
||||||
local new_pos = 0
|
|
||||||
|
|
||||||
if pos == count - 1 then
|
|
||||||
new_pos = pos - 1
|
|
||||||
else
|
|
||||||
new_pos = pos + 1
|
|
||||||
end
|
|
||||||
|
|
||||||
if new_pos > -1 then
|
|
||||||
mp.command("set pause no")
|
|
||||||
mp.set_property_number("playlist-pos", new_pos)
|
|
||||||
end
|
|
||||||
|
|
||||||
mp.command("playlist-remove " .. pos)
|
|
||||||
|
|
||||||
local ps_code = [[& {
|
|
||||||
Start-Sleep -Seconds 2
|
|
||||||
Add-Type -AssemblyName Microsoft.VisualBasic
|
|
||||||
[Microsoft.VisualBasic.FileIO.FileSystem]::DeleteFile('file_to_delete', 'OnlyErrorDialogs', 'SendToRecycleBin')
|
|
||||||
}]]
|
|
||||||
|
|
||||||
local escaped_file_to_delete = string.gsub(file_to_delete, "'", "''")
|
|
||||||
escaped_file_to_delete = string.gsub(escaped_file_to_delete, "’", "’’")
|
|
||||||
escaped_file_to_delete = string.gsub(escaped_file_to_delete, "%%", "%%%%")
|
|
||||||
ps_code = string.gsub(ps_code, "file_to_delete", escaped_file_to_delete)
|
|
||||||
|
|
||||||
mp.command_native({
|
|
||||||
name = "subprocess",
|
|
||||||
playback_only = false,
|
|
||||||
detach = true,
|
|
||||||
args = { 'powershell', '-NoProfile', '-ExecutionPolicy', 'Bypass', '-Command', ps_code },
|
|
||||||
})
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
mp.add_key_binding(nil, "delete", delete)
|
|
||||||
mp.add_key_binding(nil, "confirm", confirm)
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
|
|
||||||
-- https://github.com/mpv-player/mpv/blob/master/TOOLS/lua/pause-when-minimize.lua
|
|
||||||
|
|
||||||
-- This script pauses playback when minimizing the window, and resumes playback
|
|
||||||
-- if it's brought back again. If the player was already paused when minimizing,
|
|
||||||
-- then try not to mess with the pause state.
|
|
||||||
|
|
||||||
local did_minimize = false
|
|
||||||
|
|
||||||
mp.observe_property("window-minimized", "bool", function(name, value)
|
|
||||||
local pause = mp.get_property_native("pause")
|
|
||||||
if value == true then
|
|
||||||
if pause == false then
|
|
||||||
mp.set_property_native("pause", true)
|
|
||||||
did_minimize = true
|
|
||||||
end
|
|
||||||
elseif value == false then
|
|
||||||
if did_minimize and (pause == true) then
|
|
||||||
mp.set_property_native("pause", false)
|
|
||||||
end
|
|
||||||
did_minimize = false
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
Reference in New Issue
Block a user