diff --git a/docs/changelog.md b/docs/changelog.md index 5682b60..9a3fe5d 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -1,8 +1,7 @@ # v7.0.0.5 Beta (2023-??-??) -- Experimental support of the mpv option `title-bar`. - While development there were 2 memory access violations while shutdown. +- Support of the mpv option `title-bar`. - Command line parser fix using list options with `-add` suffix. - Fix video being rendered with black line at the bottom. diff --git a/docs/manual.md b/docs/manual.md index 57a434d..3e64439 100644 --- a/docs/manual.md +++ b/docs/manual.md @@ -625,6 +625,7 @@ https://mpv.io/manual/master/#window - [ontop](https://mpv.io/manual/master/#options-ontop) - [screen](https://mpv.io/manual/master/#options-screen) - [snap-window](https://mpv.io/manual/master/#options-snap-window) +- [title-bar](https://mpv.io/manual/master/#options-title-bar) - [title](https://mpv.io/manual/master/#options-title) - [window-maximized](https://mpv.io/manual/master/#options-window-maximized) - [window-minimized](https://mpv.io/manual/master/#options-window-minimized) diff --git a/src/MpvNet.Windows/Help/WinApiHelp.cs b/src/MpvNet.Windows/Help/WinApiHelp.cs index 2e6dd1c..345f4b2 100644 --- a/src/MpvNet.Windows/Help/WinApiHelp.cs +++ b/src/MpvNet.Windows/Help/WinApiHelp.cs @@ -27,33 +27,33 @@ public static class WinApiHelp } } - public static void AdjustWindowRect(IntPtr hwnd, ref Rect rc, int dpi) + public static void AdjustWindowRect(IntPtr hwnd, ref RECT rc, int dpi) { - uint windowStyle = (uint)GetWindowLong(hwnd, -16); // GWL_STYLE - uint windowStyleEx = (uint)GetWindowLong(hwnd, -20); // GWL_EXSTYLE + uint style = (uint)GetWindowLongPtr(hwnd, -16); // GWL_STYLE + uint styleEx = (uint)GetWindowLongPtr(hwnd, -20); // GWL_EXSTYLE if (Environment.OSVersion.Version >= WindowsTen1607) - AdjustWindowRectExForDpi(ref rc, windowStyle, false, windowStyleEx, (uint)dpi); + AdjustWindowRectExForDpi(ref rc, style, false, styleEx, (uint)dpi); else - Native.WinApi.AdjustWindowRect(ref rc, windowStyle, false); + Native.WinApi.AdjustWindowRect(ref rc, style, false); } - public static void AddWindowBorders(IntPtr hwnd, ref Rect rc, int dpi, bool changeTop) + public static void AddWindowBorders(IntPtr hwnd, ref RECT rc, int dpi, bool changeTop) { - Rect win = rc; + RECT win = rc; AdjustWindowRect(hwnd, ref rc, dpi); if (changeTop) { int top = rc.Top; top -= rc.Top - win.Top; - rc = new Rect(rc.Left, top, rc.Right, rc.Bottom); + rc = new RECT(rc.Left, top, rc.Right, rc.Bottom); } } - public static void SubtractWindowBorders(IntPtr hwnd, ref Rect rc, int dpi, bool changeTop) + public static void SubtractWindowBorders(IntPtr hwnd, ref RECT rc, int dpi, bool changeTop) { - Rect r = new Rect(); + RECT r = new RECT(); AddWindowBorders(hwnd, ref r, dpi, changeTop); rc.Left -= r.Left; rc.Top -= r.Top; @@ -63,15 +63,15 @@ public static class WinApiHelp public static int GetTitleBarHeight(IntPtr hwnd, int dpi) { - Rect r = new Rect(); - AdjustWindowRect(hwnd, ref r, dpi); - return -r.Top; + RECT rect = new RECT(); + AdjustWindowRect(hwnd, ref rect, dpi); + return -rect.Top; } public static Rectangle GetWorkingArea(IntPtr handle, Rectangle workingArea) { - if (handle != IntPtr.Zero && GetDwmWindowRect(handle, out Rect dwmRect) && - GetWindowRect(handle, out Rect rect)) + if (handle != IntPtr.Zero && GetDwmWindowRect(handle, out RECT dwmRect) && + GetWindowRect(handle, out RECT rect)) { int left = workingArea.Left; int top = workingArea.Top; @@ -89,28 +89,12 @@ public static class WinApiHelp return workingArea; } - public static bool GetDwmWindowRect(IntPtr handle, out Rect rect) + public static bool GetDwmWindowRect(IntPtr handle, out RECT rect) { const uint DWMWA_EXTENDED_FRAME_BOUNDS = 9; return 0 == DwmGetWindowAttribute(handle, DWMWA_EXTENDED_FRAME_BOUNDS, - out rect, (uint)Marshal.SizeOf()); - } - - public static IntPtr GetWindowLong(IntPtr hWnd, int nIndex) - { - if (IntPtr.Size == 8) - return GetWindowLongPtr(hWnd, nIndex); - else - return GetWindowLong32(hWnd, nIndex); - } - - public static IntPtr SetWindowLong(IntPtr hWnd, int nIndex, uint dwNewLong) - { - if (IntPtr.Size == 8) - return SetWindowLongPtr(hWnd, nIndex, dwNewLong); - else - return SetWindowLong32(hWnd, nIndex, dwNewLong); + out rect, (uint)Marshal.SizeOf()); } public static string GetAppPathForExtension(params string[] extensions) diff --git a/src/MpvNet.Windows/Native/WinApi.cs b/src/MpvNet.Windows/Native/WinApi.cs index 8e5273a..7400c38 100644 --- a/src/MpvNet.Windows/Native/WinApi.cs +++ b/src/MpvNet.Windows/Native/WinApi.cs @@ -21,7 +21,7 @@ public static class WinApi public static extern uint ActivateKeyboardLayout(IntPtr hkl, uint flags); [DllImport("user32.dll")] - public static extern bool GetWindowRect(IntPtr hwnd, out Rect lpRect); + public static extern bool GetWindowRect(IntPtr hwnd, out RECT lpRect); [DllImport("user32.dll", CharSet = CharSet.Unicode)] public static extern IntPtr FindWindowEx( @@ -49,28 +49,19 @@ public static class WinApi public static extern int GetDpiForWindow(IntPtr hwnd); [DllImport("user32.dll")] - public static extern bool AdjustWindowRect(ref Rect lpRect, uint dwStyle, bool bMenu); + public static extern bool AdjustWindowRect(ref RECT lpRect, uint dwStyle, bool bMenu); [DllImport("user32.dll")] public static extern bool AdjustWindowRectExForDpi( - ref Rect lpRect, uint dwStyle, bool bMenu, uint dwExStyle, uint dpi); + ref RECT lpRect, uint dwStyle, bool bMenu, uint dwExStyle, uint dpi); [DllImport("user32.dll")] public static extern bool SetWindowPos( IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, uint uFlags); - [DllImport("user32.dll", EntryPoint = "GetWindowLong")] - public static extern IntPtr GetWindowLong32(IntPtr hWnd, int nIndex); - [DllImport("user32.dll")] public static extern IntPtr GetWindowLongPtr(IntPtr hWnd, int nIndex); - [DllImport("user32.dll", EntryPoint = "SetWindowLong")] - public static extern IntPtr SetWindowLong32(IntPtr hWnd, int nIndex, uint dwNewLong); - - [DllImport("user32.dll")] - public static extern IntPtr SetWindowLongPtr(IntPtr hWnd, int nIndex, uint dwNewLong); - [DllImport("gdi32.dll")] public static extern int GetDeviceCaps(IntPtr hdc, int nIndex); @@ -80,17 +71,17 @@ public static class WinApi [DllImport("dwmapi.dll")] public static extern int DwmGetWindowAttribute( - IntPtr hwnd, uint dwAttribute, out Rect pvAttribute, uint cbAttribute); + IntPtr hwnd, uint dwAttribute, out RECT pvAttribute, uint cbAttribute); [StructLayout(LayoutKind.Sequential)] - public struct Rect + public struct RECT { public int Left; public int Top; public int Right; public int Bottom; - public Rect(Rectangle r) + public RECT(Rectangle r) { Left = r.Left; Top = r.Top; @@ -98,7 +89,7 @@ public static class WinApi Bottom = r.Bottom; } - public Rect(int left, int top, int right, int bottom) + public RECT(int left, int top, int right, int bottom) { Left = left; Top = top; @@ -111,9 +102,9 @@ public static class WinApi public int Width => Right - Left; public int Height => Bottom - Top; - public static Rect FromRectangle(Rectangle rect) + public static RECT FromRectangle(Rectangle rect) { - return new Rect(rect.X, rect.Y, rect.X + rect.Width, rect.Y + rect.Height); + return new RECT(rect.X, rect.Y, rect.X + rect.Width, rect.Y + rect.Height); } public override string ToString() @@ -125,14 +116,14 @@ public static class WinApi [StructLayout(LayoutKind.Sequential)] public struct NCCALCSIZE_PARAMS { - public NCCALCSIZE_PARAMS(Rect[] r, WINDOWPOS wp) + public NCCALCSIZE_PARAMS(RECT[] r, WINDOWPOS wp) { rgrc = r; lppos = wp; } [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] - public Rect[] rgrc; + public RECT[] rgrc; public WINDOWPOS lppos; } diff --git a/src/MpvNet.Windows/Properties/launchSettings.json b/src/MpvNet.Windows/Properties/launchSettings.json index b3dcc78..4456362 100644 --- a/src/MpvNet.Windows/Properties/launchSettings.json +++ b/src/MpvNet.Windows/Properties/launchSettings.json @@ -1,8 +1,7 @@ { "profiles": { "MpvNet.Windows": { - "commandName": "Project", - "commandLineArgs": "\"E:\\Video\\Samples\\LG New York HDR UHD 4K Demo.mkv\"" + "commandName": "Project" } } } \ No newline at end of file diff --git a/src/MpvNet.Windows/Resources/editor_conf.txt b/src/MpvNet.Windows/Resources/editor_conf.txt index ca6f016..48e851d 100644 --- a/src/MpvNet.Windows/Resources/editor_conf.txt +++ b/src/MpvNet.Windows/Resources/editor_conf.txt @@ -534,7 +534,7 @@ name = title-bar file = mpv default = yes directory = Window -help = Shows the window title bar. +help = Set this to no in order to hide the window title bar. option = yes option = no diff --git a/src/MpvNet.Windows/WinForms/MainForm.cs b/src/MpvNet.Windows/WinForms/MainForm.cs index 23b5f1f..2543a97 100644 --- a/src/MpvNet.Windows/WinForms/MainForm.cs +++ b/src/MpvNet.Windows/WinForms/MainForm.cs @@ -21,8 +21,6 @@ using CommunityToolkit.Mvvm.Messaging; using static MpvNet.Windows.Native.WinApi; using static MpvNet.Windows.Help.WinApiHelp; -using System.Numerics; -using System.Windows.Media.Media3D; namespace MpvNet.Windows.WinForms; @@ -43,10 +41,10 @@ public partial class MainForm : Form int _lastCursorChanged; int _lastCycleFullscreen; int _taskbarButtonCreatedMessage; - int _nactivateHeight; bool _contextMenuIsReady; bool _wasMaximized; + bool _maxSizeSet; public MainForm() { @@ -663,7 +661,7 @@ public partial class MainForm : Form } Point middlePos = new Point(Left + Width / 2, Top + Height / 2); - var rect = new Rect(new Rectangle(screen.Bounds.X, screen.Bounds.Y, width, height)); + var rect = new RECT(new Rectangle(screen.Bounds.X, screen.Bounds.Y, width, height)); AddWindowBorders(Handle, ref rect, GetDpi(Handle), !Player.TitleBar); @@ -965,8 +963,6 @@ public partial class MainForm : Form protected override void WndProc(ref Message m) { - //Debug.WriteLine(m); - switch (m.Msg) { case 0x0007: // WM_SETFOCUS @@ -1026,9 +1022,6 @@ public partial class MainForm : Form case 0x51: // WM_INPUTLANGCHANGE ActivateKeyboardLayout(m.LParam, 0x00000100u /*KLF_SETFORPROCESS*/); break; - //case 0x0086: // WM_NCACTIVATE - // _nactivateHeight = Height; - // break; case 0x319: // WM_APPCOMMAND { string? value = MpvHelp.WM_APPCOMMAND_to_mpv_key((int)(m.LParam.ToInt64() >> 16 & ~0xf000)); @@ -1065,50 +1058,44 @@ public partial class MainForm : Form if (!WasShown) break; - Rect rect = Marshal.PtrToStructure(m.LParam); + RECT rect = Marshal.PtrToStructure(m.LParam); SetWindowPos(Handle, IntPtr.Zero, rect.Left, rect.Top, rect.Width, rect.Height, 0); } break; + case 0x0112: // WM_SYSCOMMAND + { + // with title-bar=no when the window is restored from minimizing the height is too high + if (!Player.TitleBar) + { + int SC_MINIMIZE = 0xF020; + + if (m.WParam == (nint)SC_MINIMIZE) + { + MaximumSize = Size; + _maxSizeSet = true; + } + } + } + break; case 0x0083: // WM_NCCALCSIZE - if (m.WParam != IntPtr.Zero && m.LParam != IntPtr.Zero && Player.Border && - !Player.TitleBar && !IsFullscreen && WindowState != FormWindowState.Minimized) + if ((int)m.WParam == 1 && !Player.TitleBar && !IsFullscreen) { var nccalcsize_params = Marshal.PtrToStructure(m.LParam); - Rect[] rects = nccalcsize_params.rgrc; + RECT[] rects = nccalcsize_params.rgrc; rects[0].Top = rects[0].Top - GetTitleBarHeight(Handle, GetDpi(Handle)); Marshal.StructureToPtr(nccalcsize_params, m.LParam, false); } - - _skipWM_NCCALCSIZE = false; break; + case 0x231: // WM_ENTERSIZEMOVE case 0x005: // WM_SIZE - { - int hiWord = (short)(m.LParam.ToInt32() >> 16); // HiWord - Debug.WriteLine(hiWord); - } - if (m.WParam == (nint)1) // SIZE_RESTORED=0, SIZE_MINIMIZED=1 - { - _skipWM_NCCALCSIZE = true; - //if (Player.VideoSize != Size.Empty) - //{ - // //int w = ClientSize.Width; - // //int h = (int)Math.Floor(w * Player.VideoSize.Height / (double)Player.VideoSize.Width); - // //var rect = new Rect(new Rectangle(0, 0, w, h)); - // //AddWindowBorders(Handle, ref rect, GetDpi(Handle), !Player.TitleBar); - // //Height = rect.Height; - // ////ClientSize = new Size(w, h); - //} - } - if (Player.SnapWindow) SnapManager.OnSizeAndEnterSizeMove(this); break; case 0x214: // WM_SIZING - Debug.WriteLine("WM_SIZING"); if (Player.KeepaspectWindow) { - Rect rc = Marshal.PtrToStructure(m.LParam); - Rect r = rc; + RECT rc = Marshal.PtrToStructure(m.LParam); + RECT r = rc; SubtractWindowBorders(Handle, ref r, GetDpi(Handle), !Player.TitleBar); int c_w = r.Right - r.Left, c_h = r.Bottom - r.Top; @@ -1128,7 +1115,7 @@ public partial class MainForm : Form if (corner >= 0) corners[corner] -= d_corners[corner]; - Marshal.StructureToPtr(new Rect(corners[0], corners[1], corners[2], corners[3]), m.LParam, false); + Marshal.StructureToPtr(new RECT(corners[0], corners[1], corners[2], corners[3]), m.LParam, false); m.Result = new IntPtr(1); } return; @@ -1198,38 +1185,10 @@ public partial class MainForm : Form Activate(); } return; - case 0x231: // WM_ENTERSIZEMOVE - if (Player.SnapWindow) - SnapManager.OnSizeAndEnterSizeMove(this); - break; case 0x216: // WM_MOVING if (Player.SnapWindow) SnapManager.OnMoving(ref m); break; - case 0x0006: // WM_ACTIVATE - { - int loWord = (short)(m.WParam.ToInt32() & 0xFFFF); - bool deactivate = loWord == 0; - - if (deactivate) - { - //Debug.WriteLine("deactivate: " + Height); - _nactivateHeight = Height; - } - else - { - - - //Debug.WriteLine("activate: " + Height); - - if (_nactivateHeight != 0) - { - Height = _nactivateHeight; - _nactivateHeight = 0; - } - } - } - break; } if (m.Msg == _taskbarButtonCreatedMessage && Player.TaskbarProgress) @@ -1243,7 +1202,24 @@ public partial class MainForm : Form base.WndProc(ref m); } - bool _skipWM_NCCALCSIZE; + protected override void OnActivated(EventArgs e) + { + base.OnActivated(e); + + if (_maxSizeSet) + { + TaskHelp.Run(() => { + Thread.Sleep(200); + BeginInvoke(() => { + if (!IsDisposed && !Disposing) + { + MaximumSize = new Size(int.MaxValue, int.MaxValue); + _maxSizeSet = false; + } + }); + }); + } + } void CursorTimer_Tick(object sender, EventArgs e) { @@ -1337,6 +1313,8 @@ public partial class MainForm : Form BeginInvoke(() => { SetSize(ClientSize.Width, ClientSize.Height, Screen.FromControl(this), false); + Height += 1; + Height -= 1; }); } diff --git a/src/MpvNet.Windows/WinForms/SnapManager.cs b/src/MpvNet.Windows/WinForms/SnapManager.cs index 48c8244..773dde6 100644 --- a/src/MpvNet.Windows/WinForms/SnapManager.cs +++ b/src/MpvNet.Windows/WinForms/SnapManager.cs @@ -51,7 +51,7 @@ public class SnapManager if (Handle == IntPtr.Zero) return; - WinApi.Rect boundsLtrb = Marshal.PtrToStructure(m.LParam); + WinApi.RECT boundsLtrb = Marshal.PtrToStructure(m.LParam); Rectangle bounds = boundsLtrb.ToRectangle(); // This is where the window _would_ be located if snapping // had not occurred. This prevents the cursor from sliding @@ -62,7 +62,7 @@ public class SnapManager bounds.Width, bounds.Height); FindSnap(ref effectiveBounds); - WinApi.Rect newLtrb = WinApi.Rect.FromRectangle(effectiveBounds); + WinApi.RECT newLtrb = WinApi.RECT.FromRectangle(effectiveBounds); Marshal.StructureToPtr(newLtrb, m.LParam, false); m.Result = new IntPtr(1); }