From 0b0875970c5dba043761b3267ed8da577472d8b0 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Fri, 11 Dec 2015 05:43:58 +0300 Subject: [PATCH] Added TopLevel::BeginMoveDrag() --- .../Perspex.Android/Platform/SkiaPlatform/WindowImpl.cs | 5 +++++ src/Gtk/Perspex.Gtk/WindowImpl.cs | 8 ++++++++ src/Perspex.Controls/Platform/ITopLevelImpl.cs | 5 +++++ src/Perspex.Controls/Platform/PlatformManager.cs | 1 + src/Perspex.Controls/TopLevel.cs | 5 +++++ src/Windows/Perspex.Win32/WindowImpl.cs | 6 ++++++ src/iOS/Perspex.iOS/PerspexView.cs | 5 +++++ 7 files changed, 35 insertions(+) diff --git a/src/Android/Perspex.Android/Platform/SkiaPlatform/WindowImpl.cs b/src/Android/Perspex.Android/Platform/SkiaPlatform/WindowImpl.cs index 09aa7a165c..1697295198 100644 --- a/src/Android/Perspex.Android/Platform/SkiaPlatform/WindowImpl.cs +++ b/src/Android/Perspex.Android/Platform/SkiaPlatform/WindowImpl.cs @@ -126,6 +126,11 @@ namespace Perspex.Android.Platform.SkiaPlatform this.Visibility = ViewStates.Visible; } + public void BeginMoveDrag() + { + //Not supported + } + public IDisposable ShowDialog() { throw new NotImplementedException(); diff --git a/src/Gtk/Perspex.Gtk/WindowImpl.cs b/src/Gtk/Perspex.Gtk/WindowImpl.cs index afeaaf9ff0..735150f9b2 100644 --- a/src/Gtk/Perspex.Gtk/WindowImpl.cs +++ b/src/Gtk/Perspex.Gtk/WindowImpl.cs @@ -162,6 +162,14 @@ namespace Perspex.Gtk GdkWindow.Cursor = cursor != null ? new Gdk.Cursor(cursor.Handle) : DefaultCursor; } + public void BeginMoveDrag() + { + int x, y; + ModifierType mod; + Screen.RootWindow.GetPointer(out x, out y, out mod); + BeginMoveDrag(0, x, y, 0); + } + public IDisposable ShowDialog() { Modal = true; diff --git a/src/Perspex.Controls/Platform/ITopLevelImpl.cs b/src/Perspex.Controls/Platform/ITopLevelImpl.cs index f826ec5990..ade7aab3bd 100644 --- a/src/Perspex.Controls/Platform/ITopLevelImpl.cs +++ b/src/Perspex.Controls/Platform/ITopLevelImpl.cs @@ -88,5 +88,10 @@ namespace Perspex.Platform /// Shows the toplevel. /// void Show(); + + /// + /// Starts moving a window with left button being held. Should be called from left mouse button press event handler + /// + void BeginMoveDrag(); } } diff --git a/src/Perspex.Controls/Platform/PlatformManager.cs b/src/Perspex.Controls/Platform/PlatformManager.cs index 735b810d91..1e7b5cc755 100644 --- a/src/Perspex.Controls/Platform/PlatformManager.cs +++ b/src/Perspex.Controls/Platform/PlatformManager.cs @@ -174,6 +174,7 @@ namespace Perspex.Controls.Platform public void SetTitle(string title) => _window.SetTitle(title); public void Show() => _tl.Show(); + public void BeginMoveDrag() => _tl.BeginMoveDrag(); public IDisposable ShowDialog() => _window.ShowDialog(); diff --git a/src/Perspex.Controls/TopLevel.cs b/src/Perspex.Controls/TopLevel.cs index ca84f67de1..dffedefbe2 100644 --- a/src/Perspex.Controls/TopLevel.cs +++ b/src/Perspex.Controls/TopLevel.cs @@ -364,5 +364,10 @@ namespace Perspex.Controls { _renderQueueManager?.InvalidateRender(this); } + + /// + /// Starts moving a window with left button being held. Should be called from left mouse button press event handler + /// + public void BeginMoveDrag() => PlatformImpl.BeginMoveDrag(); } } diff --git a/src/Windows/Perspex.Win32/WindowImpl.cs b/src/Windows/Perspex.Win32/WindowImpl.cs index 03fcd7cc6d..063be91873 100644 --- a/src/Windows/Perspex.Win32/WindowImpl.cs +++ b/src/Windows/Perspex.Win32/WindowImpl.cs @@ -223,6 +223,12 @@ namespace Perspex.Win32 UnmanagedMethods.ShowWindow(_hwnd, UnmanagedMethods.ShowWindowCommand.Normal); } + public void BeginMoveDrag() + { + UnmanagedMethods.DefWindowProc(_hwnd, (int) UnmanagedMethods.WindowsMessage.WM_NCLBUTTONDOWN, + new IntPtr(2), IntPtr.Zero); + } + public virtual IDisposable ShowDialog() { var disabled = s_instances.Where(x => x != this && x.IsEnabled).ToList(); diff --git a/src/iOS/Perspex.iOS/PerspexView.cs b/src/iOS/Perspex.iOS/PerspexView.cs index 52fe69d8d1..1ccf78330f 100644 --- a/src/iOS/Perspex.iOS/PerspexView.cs +++ b/src/iOS/Perspex.iOS/PerspexView.cs @@ -107,6 +107,11 @@ namespace Perspex.iOS _keyboardHelper.ActivateAutoShowKeybord(); } + public void BeginMoveDrag() + { + //Not supported + } + public Size MaxClientSize => Bounds.Size.ToPerspex(); public void SetTitle(string title) {