Browse Source

[MONOMAC] Code cleanup

Nikita Tsukanov 8 years ago
parent
commit
f13f017057

+ 1 - 0
src/OSX/Avalonia.MonoMac/.gitignore

@@ -0,0 +1 @@
+Avalonia.MonoMac.sln

+ 10 - 9
src/OSX/Avalonia.MonoMac/Cursor.cs

@@ -21,9 +21,10 @@ namespace Avalonia.MonoMac
         }
     }
 
-	class CursorFactoryStub : IStandardCursorFactory
-	{
+    class CursorFactoryStub : IStandardCursorFactory
+    {
         Dictionary<StandardCursorType, NSCursor> _cache;
+
         public CursorFactoryStub()
         {
             //TODO: Load diagonal cursors from webkit
@@ -33,8 +34,8 @@ namespace Avalonia.MonoMac
                 [StandardCursorType.Arrow] = NSCursor.ArrowCursor,
                 [StandardCursorType.AppStarting] = NSCursor.ArrowCursor, //TODO
                 [StandardCursorType.BottomLeftCorner] = NSCursor.CrosshairCursor, //TODO
-                [StandardCursorType.BottomRightCorner]= NSCursor.CrosshairCursor, //TODO
-				[StandardCursorType.BottomSize] = NSCursor.ResizeDownCursor,
+                [StandardCursorType.BottomRightCorner] = NSCursor.CrosshairCursor, //TODO
+                [StandardCursorType.BottomSize] = NSCursor.ResizeDownCursor,
                 [StandardCursorType.Cross] = NSCursor.CrosshairCursor,
                 [StandardCursorType.Hand] = NSCursor.PointingHandCursor,
                 [StandardCursorType.Help] = NSCursor.ContextualMenuCursor,
@@ -50,12 +51,12 @@ namespace Avalonia.MonoMac
                 [StandardCursorType.TopSide] = NSCursor.ResizeUpCursor,
                 [StandardCursorType.UpArrow] = NSCursor.ResizeUpCursor,
                 [StandardCursorType.Wait] = NSCursor.ArrowCursor, //TODO
-			};
+            };
         }
 
         public IPlatformHandle GetCursor(StandardCursorType cursorType)
-		{
+        {
             return new Cursor(_cache[cursorType]);
-		}
-	}
-}
+        }
+    }
+}

+ 34 - 56
src/OSX/Avalonia.MonoMac/EmulatedFramebuffer.cs

@@ -3,72 +3,50 @@ using Avalonia.Platform;
 using MonoMac.AppKit;
 using System.Runtime.InteropServices;
 using MonoMac.CoreGraphics;
-using MonoMac.ImageIO;
-using MonoMac.Foundation;
 
 namespace Avalonia.MonoMac
 {
     class EmulatedFramebuffer : ILockedFramebuffer
-	{
-		[DllImport("/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/CoreGraphics.framework/CoreGraphics")]
-		extern static IntPtr CGBitmapContextCreate (IntPtr data, UIntPtr width, UIntPtr height, UIntPtr bitsPerComponent,
-                                UIntPtr bytesPerRow, IntPtr colorSpace, uint bitmapInfo);
-
-		public EmulatedFramebuffer(NSView view)
-		{
+    {
+        public EmulatedFramebuffer(NSView view)
+        {
             //TODO: Check if this is correct
             var factor = view.Window.UserSpaceScaleFactor;
-			var frame = view.Frame;
-            Width = (int)(frame.Width * factor);
-            Height = (int)(frame.Height * factor);
-			RowBytes = Width * 4;
-			Dpi = new Size(96, 96) * factor;
+            var frame = view.Frame;
+            Width = (int) (frame.Width * factor);
+            Height = (int) (frame.Height * factor);
+            RowBytes = Width * 4;
+            Dpi = new Size(96, 96) * factor;
             Format = PixelFormat.Rgba8888;
-			Address = Marshal.AllocHGlobal(Height * RowBytes);
-		}
+            Address = Marshal.AllocHGlobal(Height * RowBytes);
+        }
 
-		public void Dispose()
-		{
-			if (Address == IntPtr.Zero)
-				return;
-			var nfo = (int)CGBitmapFlags.ByteOrder32Big | (int)CGImageAlphaInfo.PremultipliedLast;
+        public void Dispose()
+        {
+            if (Address == IntPtr.Zero)
+                return;
+            var nfo = (int) CGBitmapFlags.ByteOrder32Big | (int) CGImageAlphaInfo.PremultipliedLast;
 
             using (var colorSpace = CGColorSpace.CreateDeviceRGB())
-            using (var bContext = new CGBitmapContext (Address, Width, Height, 8, Width * 4,
-				colorSpace, (CGImageAlphaInfo)nfo))
-			using (var image = bContext.ToImage())
+            using (var bContext = new CGBitmapContext(Address, Width, Height, 8, Width * 4,
+                colorSpace, (CGImageAlphaInfo) nfo))
+            using (var image = bContext.ToImage())
             using (var nscontext = NSGraphicsContext.CurrentContext)
-            using(var context = nscontext.GraphicsPort)
-			{
-                /*
-                var url = NSUrl.FromFilename("/tmp/wat.png");
-                var dest = CGImageDestination.FromUrl(url, "public.png", 1);
-                dest.AddImage(image, new NSDictionary());
-                dest.Close();
-                dest.Dispose();
-
-                var buf = new byte[Height * RowBytes];
-                Marshal.Copy(Address, buf, 0, buf.Length);
-                System.IO.File.WriteAllBytes("/tmp/wat.bin", buf);
-*/
-                // flip the image for CGContext.DrawImage
-                //context.TranslateCTM(0, Height);
-                //context.ScaleCTM(1, -1);
-
+            using (var context = nscontext.GraphicsPort)
+            {
                 context.SetFillColor(255, 255, 255, 255);
                 context.FillRect(new CGRect(0, 0, Width, Height));
-
-				context.DrawImage(new CGRect(0, 0, Width, Height), image);
-			}
-			Marshal.FreeHGlobal(Address);
-			Address = IntPtr.Zero;
-		}
-
-		public IntPtr Address { get; private set; }
-		public int Width { get; }
-		public int Height { get; }
-		public int RowBytes { get; }
-		public Size Dpi { get; }
-		public PixelFormat Format { get; }
-	}
-}
+                context.DrawImage(new CGRect(0, 0, Width, Height), image);
+            }
+            Marshal.FreeHGlobal(Address);
+            Address = IntPtr.Zero;
+        }
+
+        public IntPtr Address { get; private set; }
+        public int Width { get; }
+        public int Height { get; }
+        public int RowBytes { get; }
+        public Size Dpi { get; }
+        public PixelFormat Format { get; }
+    }
+}

+ 14 - 16
src/OSX/Avalonia.MonoMac/Helpers.cs

@@ -1,9 +1,7 @@
 using System;
-using System.Runtime.InteropServices;
-using MonoMac.AppKit;
-using MonoMac.ObjCRuntime;
-using MonoMac.CoreGraphics;
-using MonoMac;
+ using MonoMac.AppKit;
+ using MonoMac.CoreGraphics;
+
 namespace Avalonia.MonoMac
 {
     static class Helpers
@@ -15,19 +13,19 @@ namespace Avalonia.MonoMac
         public static Rect ToAvaloniaRect(this CGRect rect) => new Rect(rect.Left, rect.Top, rect.Width, rect.Height);
         public static CGRect ToMonoMacRect(this Rect rect) => new CGRect(rect.X, rect.Y, rect.Width, rect.Height);
 
-		public static Point ConvertPointY(this Point pt)
-		{
-			var sw = NSScreen.Screens[0].Frame;
-			var t = Math.Max(sw.Top, sw.Bottom);
-			return pt.WithY(t - pt.Y);
-		}
+        public static Point ConvertPointY(this Point pt)
+        {
+            var sw = NSScreen.Screens[0].Frame;
+            var t = Math.Max(sw.Top, sw.Bottom);
+            return pt.WithY(t - pt.Y);
+        }
 
-		public static CGPoint ConvertPointY(this CGPoint pt)
-		{
-			var sw = NSScreen.Screens[0].Frame;
-			var t = Math.Max(sw.Top, sw.Bottom);
+        public static CGPoint ConvertPointY(this CGPoint pt)
+        {
+            var sw = NSScreen.Screens[0].Frame;
+            var t = Math.Max(sw.Top, sw.Bottom);
             return new CGPoint(pt.X, t - pt.Y);
-		}
+        }
 
     }
 }

+ 121 - 120
src/OSX/Avalonia.MonoMac/KeyTransform.cs

@@ -1,14 +1,14 @@
-using System;
-using System.Collections.Generic;
+using System.Collections.Generic;
 using Avalonia.Input;
-using MonoMac.AppKit;
 
 namespace Avalonia.MonoMac
 {
     public static class KeyTransform
     {
-		// See /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/HIToolbox.framework/Versions/A/Headers/Events.h
-		private const int kVK_ANSI_A = 0x00;
+        // See /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/HIToolbox.framework/Versions/A/Headers/Events.h
+        // ReSharper disable InconsistentNaming
+        // ReSharper disable UnusedMember.Local
+        private const int kVK_ANSI_A = 0x00;
         private const int kVK_ANSI_S = 0x01;
         private const int kVK_ANSI_D = 0x02;
         private const int kVK_ANSI_F = 0x03;
@@ -127,130 +127,131 @@ namespace Avalonia.MonoMac
         private const int kVK_JIS_KeypadComma = 0x5F;
         private const int kVK_JIS_Eisu = 0x66;
         private const int kVK_JIS_Kana = 0x68;
-
+        // ReSharper restore UnusedMember.Local
+        // ReSharper restore InconsistentNaming
         //TODO: Map missing keys
         static readonly Dictionary<int, Key> Keys = new Dictionary<int, Key>
         {
-			[kVK_ANSI_A] = Key.A,
-			[kVK_ANSI_S] = Key.S,
-			[kVK_ANSI_D] = Key.D,
-			[kVK_ANSI_F] = Key.F,
-			[kVK_ANSI_H] = Key.H,
-			[kVK_ANSI_G] = Key.G,
-			[kVK_ANSI_Z] = Key.Z,
-			[kVK_ANSI_X] = Key.X,
-			[kVK_ANSI_C] = Key.C,
-			[kVK_ANSI_V] = Key.V,
-			[kVK_ANSI_B] = Key.B,
-			[kVK_ANSI_Q] = Key.Q,
-			[kVK_ANSI_W] = Key.W,
-			[kVK_ANSI_E] = Key.E,
-			[kVK_ANSI_R] = Key.R,
-			[kVK_ANSI_Y] = Key.Y,
-			[kVK_ANSI_T] = Key.T,
+            [kVK_ANSI_A] = Key.A,
+            [kVK_ANSI_S] = Key.S,
+            [kVK_ANSI_D] = Key.D,
+            [kVK_ANSI_F] = Key.F,
+            [kVK_ANSI_H] = Key.H,
+            [kVK_ANSI_G] = Key.G,
+            [kVK_ANSI_Z] = Key.Z,
+            [kVK_ANSI_X] = Key.X,
+            [kVK_ANSI_C] = Key.C,
+            [kVK_ANSI_V] = Key.V,
+            [kVK_ANSI_B] = Key.B,
+            [kVK_ANSI_Q] = Key.Q,
+            [kVK_ANSI_W] = Key.W,
+            [kVK_ANSI_E] = Key.E,
+            [kVK_ANSI_R] = Key.R,
+            [kVK_ANSI_Y] = Key.Y,
+            [kVK_ANSI_T] = Key.T,
             [kVK_ANSI_1] = Key.D1,
-			[kVK_ANSI_2] = Key.D2,
-			[kVK_ANSI_3] = Key.D3,
-			[kVK_ANSI_4] = Key.D4,
-			[kVK_ANSI_6] = Key.D6,
-			[kVK_ANSI_5] = Key.D5,
-			//[kVK_ANSI_Equal] = Key.?,
-			[kVK_ANSI_9] = Key.D9,
-			[kVK_ANSI_7] = Key.D7,
-			[kVK_ANSI_Minus] = Key.OemMinus,
-			[kVK_ANSI_8] = Key.D8,
-			[kVK_ANSI_0] = Key.D0,
+            [kVK_ANSI_2] = Key.D2,
+            [kVK_ANSI_3] = Key.D3,
+            [kVK_ANSI_4] = Key.D4,
+            [kVK_ANSI_6] = Key.D6,
+            [kVK_ANSI_5] = Key.D5,
+            //[kVK_ANSI_Equal] = Key.?,
+            [kVK_ANSI_9] = Key.D9,
+            [kVK_ANSI_7] = Key.D7,
+            [kVK_ANSI_Minus] = Key.OemMinus,
+            [kVK_ANSI_8] = Key.D8,
+            [kVK_ANSI_0] = Key.D0,
             [kVK_ANSI_RightBracket] = Key.OemCloseBrackets,
-			[kVK_ANSI_O] = Key.O,
-			[kVK_ANSI_U] = Key.U,
+            [kVK_ANSI_O] = Key.O,
+            [kVK_ANSI_U] = Key.U,
             [kVK_ANSI_LeftBracket] = Key.OemOpenBrackets,
-			[kVK_ANSI_I] = Key.I,
-			[kVK_ANSI_P] = Key.P,
-			[kVK_ANSI_L] = Key.L,
-			[kVK_ANSI_J] = Key.J,
-			[kVK_ANSI_Quote] = Key.OemQuotes,
-			[kVK_ANSI_K] = Key.K,
-			[kVK_ANSI_Semicolon] = Key.OemSemicolon,
-			[kVK_ANSI_Backslash] = Key.OemBackslash,
-			[kVK_ANSI_Comma] = Key.OemComma,
-			//[kVK_ANSI_Slash] = Key.?,
-			[kVK_ANSI_N] = Key.N,
-			[kVK_ANSI_M] = Key.M,
-			[kVK_ANSI_Period] = Key.OemPeriod,
-			//[kVK_ANSI_Grave] = Key.?,
-			[kVK_ANSI_KeypadDecimal] =  Key.Decimal,
-			[kVK_ANSI_KeypadMultiply] =  Key.Multiply,
-			[kVK_ANSI_KeypadPlus] =  Key.OemPlus,
-			[kVK_ANSI_KeypadClear] =  Key.Clear,
-			[kVK_ANSI_KeypadDivide] =  Key.Divide,
-			[kVK_ANSI_KeypadEnter] =  Key.Enter,
-			[kVK_ANSI_KeypadMinus] =  Key.OemMinus,
-			//[kVK_ANSI_KeypadEquals] =  Key.?,
-			[kVK_ANSI_Keypad0] =  Key.NumPad0,
-			[kVK_ANSI_Keypad1] =  Key.NumPad1,
-			[kVK_ANSI_Keypad2] =  Key.NumPad2,
-			[kVK_ANSI_Keypad3] =  Key.NumPad3,
-			[kVK_ANSI_Keypad4] =  Key.NumPad4,
-			[kVK_ANSI_Keypad5] =  Key.NumPad5,
-			[kVK_ANSI_Keypad6] =  Key.NumPad6,
-			[kVK_ANSI_Keypad7] =  Key.NumPad7,
-			[kVK_ANSI_Keypad8] =  Key.NumPad8,
-			[kVK_ANSI_Keypad9] =  Key.NumPad9,
-			[kVK_Return] = Key.Return,
-			[kVK_Tab] = Key.Tab,
-			[kVK_Space] = Key.Space,
-			[kVK_Delete] = Key.Delete,
-			[kVK_Escape] = Key.Escape,
+            [kVK_ANSI_I] = Key.I,
+            [kVK_ANSI_P] = Key.P,
+            [kVK_ANSI_L] = Key.L,
+            [kVK_ANSI_J] = Key.J,
+            [kVK_ANSI_Quote] = Key.OemQuotes,
+            [kVK_ANSI_K] = Key.K,
+            [kVK_ANSI_Semicolon] = Key.OemSemicolon,
+            [kVK_ANSI_Backslash] = Key.OemBackslash,
+            [kVK_ANSI_Comma] = Key.OemComma,
+            //[kVK_ANSI_Slash] = Key.?,
+            [kVK_ANSI_N] = Key.N,
+            [kVK_ANSI_M] = Key.M,
+            [kVK_ANSI_Period] = Key.OemPeriod,
+            //[kVK_ANSI_Grave] = Key.?,
+            [kVK_ANSI_KeypadDecimal] =  Key.Decimal,
+            [kVK_ANSI_KeypadMultiply] =  Key.Multiply,
+            [kVK_ANSI_KeypadPlus] =  Key.OemPlus,
+            [kVK_ANSI_KeypadClear] =  Key.Clear,
+            [kVK_ANSI_KeypadDivide] =  Key.Divide,
+            [kVK_ANSI_KeypadEnter] =  Key.Enter,
+            [kVK_ANSI_KeypadMinus] =  Key.OemMinus,
+            //[kVK_ANSI_KeypadEquals] =  Key.?,
+            [kVK_ANSI_Keypad0] =  Key.NumPad0,
+            [kVK_ANSI_Keypad1] =  Key.NumPad1,
+            [kVK_ANSI_Keypad2] =  Key.NumPad2,
+            [kVK_ANSI_Keypad3] =  Key.NumPad3,
+            [kVK_ANSI_Keypad4] =  Key.NumPad4,
+            [kVK_ANSI_Keypad5] =  Key.NumPad5,
+            [kVK_ANSI_Keypad6] =  Key.NumPad6,
+            [kVK_ANSI_Keypad7] =  Key.NumPad7,
+            [kVK_ANSI_Keypad8] =  Key.NumPad8,
+            [kVK_ANSI_Keypad9] =  Key.NumPad9,
+            [kVK_Return] = Key.Return,
+            [kVK_Tab] = Key.Tab,
+            [kVK_Space] = Key.Space,
+            [kVK_Delete] = Key.Delete,
+            [kVK_Escape] = Key.Escape,
             [kVK_Command] = Key.LWin,
-			[kVK_Shift] = Key.LeftShift,
-			[kVK_CapsLock] = Key.CapsLock,
+            [kVK_Shift] = Key.LeftShift,
+            [kVK_CapsLock] = Key.CapsLock,
             [kVK_Option] = Key.LeftAlt,
-			[kVK_Control] = Key.LeftCtrl,
-			[kVK_RightCommand] = Key.RWin,
-			[kVK_RightShift] = Key.RightShift,
-			[kVK_RightOption] = Key.RightAlt,
-			[kVK_RightControl] = Key.RightCtrl,
-			//[kVK_Function] = Key.?,
-			[kVK_F17] = Key.F17,
-			[kVK_VolumeUp] = Key.VolumeUp,
-			[kVK_VolumeDown] = Key.VolumeDown,
-			[kVK_Mute] = Key.VolumeMute,
-			[kVK_F18] = Key.F18,
-			[kVK_F19] = Key.F19,
-			[kVK_F20] = Key.F20,
-			[kVK_F5] = Key.F5,
-			[kVK_F6] = Key.F6,
-			[kVK_F7] = Key.F7,
-			[kVK_F3] = Key.F3,
-			[kVK_F8] = Key.F8,
-			[kVK_F9] = Key.F9,
-			[kVK_F11] = Key.F11,
-			[kVK_F13] = Key.F13,
-			[kVK_F16] = Key.F16,
-			[kVK_F14] = Key.F14,
-			[kVK_F10] = Key.F10,
-			[kVK_F12] = Key.F12,
-			[kVK_F15] = Key.F15,
-			[kVK_Help] = Key.Help,
-			[kVK_Home] = Key.Home,
-			[kVK_PageUp] = Key.PageUp,
-			[kVK_ForwardDelete] = Key.Delete,
-			[kVK_F4] = Key.F4,
-			[kVK_End] = Key.End,
-			[kVK_F2] = Key.F2,
-			[kVK_PageDown] = Key.PageDown,
-			[kVK_F1] = Key.F1,
-			[kVK_LeftArrow] = Key.Left,
-			[kVK_RightArrow] = Key.Right,
-			[kVK_DownArrow] = Key.Down,
-			[kVK_UpArrow] = Key.Up,
+            [kVK_Control] = Key.LeftCtrl,
+            [kVK_RightCommand] = Key.RWin,
+            [kVK_RightShift] = Key.RightShift,
+            [kVK_RightOption] = Key.RightAlt,
+            [kVK_RightControl] = Key.RightCtrl,
+            //[kVK_Function] = Key.?,
+            [kVK_F17] = Key.F17,
+            [kVK_VolumeUp] = Key.VolumeUp,
+            [kVK_VolumeDown] = Key.VolumeDown,
+            [kVK_Mute] = Key.VolumeMute,
+            [kVK_F18] = Key.F18,
+            [kVK_F19] = Key.F19,
+            [kVK_F20] = Key.F20,
+            [kVK_F5] = Key.F5,
+            [kVK_F6] = Key.F6,
+            [kVK_F7] = Key.F7,
+            [kVK_F3] = Key.F3,
+            [kVK_F8] = Key.F8,
+            [kVK_F9] = Key.F9,
+            [kVK_F11] = Key.F11,
+            [kVK_F13] = Key.F13,
+            [kVK_F16] = Key.F16,
+            [kVK_F14] = Key.F14,
+            [kVK_F10] = Key.F10,
+            [kVK_F12] = Key.F12,
+            [kVK_F15] = Key.F15,
+            [kVK_Help] = Key.Help,
+            [kVK_Home] = Key.Home,
+            [kVK_PageUp] = Key.PageUp,
+            [kVK_ForwardDelete] = Key.Delete,
+            [kVK_F4] = Key.F4,
+            [kVK_End] = Key.End,
+            [kVK_F2] = Key.F2,
+            [kVK_PageDown] = Key.PageDown,
+            [kVK_F1] = Key.F1,
+            [kVK_LeftArrow] = Key.Left,
+            [kVK_RightArrow] = Key.Right,
+            [kVK_DownArrow] = Key.Down,
+            [kVK_UpArrow] = Key.Up,
             /*
-			[kVK_ISO_Section] = Key.?,
-			[kVK_JIS_Yen] = Key.?,
-			[kVK_JIS_Underscore] = Key.?,
-			[kVK_JIS_KeypadComma] = Key.?,
-			[kVK_JIS_Eisu] = Key.?,
-			[kVK_JIS_Kana] = Key.?
+            [kVK_ISO_Section] = Key.?,
+            [kVK_JIS_Yen] = Key.?,
+            [kVK_JIS_Underscore] = Key.?,
+            [kVK_JIS_KeypadComma] = Key.?,
+            [kVK_JIS_Eisu] = Key.?,
+            [kVK_JIS_Kana] = Key.?
             */
         };
 

+ 6 - 9
src/OSX/Avalonia.MonoMac/MonoMacPlatform.cs

@@ -3,17 +3,15 @@ using Avalonia.Controls;
 using Avalonia.Input;
 using Avalonia.Platform;
 using Avalonia.Rendering;
-using MonoMac.Foundation;
 using MonoMac.AppKit;
-using System.Drawing;
 
 namespace Avalonia.MonoMac
 {
     public class MonoMacPlatform : IWindowingPlatform, IPlatformSettings
     {
         internal static MonoMacPlatform Instance { get; private set; }
-        MouseDevice _mouseDevice = new MouseDevice();
-        KeyboardDevice _keyboardDevice = new KeyboardDevice();
+        readonly MouseDevice _mouseDevice = new MouseDevice();
+        readonly KeyboardDevice _keyboardDevice = new KeyboardDevice();
         NSApplication _app;
         void DoInitialize()
         {
@@ -46,8 +44,8 @@ namespace Avalonia.MonoMac
         }
 
 
-		public Size DoubleClickSize => new Size(4, 4);
-		public TimeSpan DoubleClickTime => TimeSpan.FromSeconds(NSEvent.DoubleClickInterval);
+        public Size DoubleClickSize => new Size(4, 4);
+        public TimeSpan DoubleClickTime => TimeSpan.FromSeconds(NSEvent.DoubleClickInterval);
 
         public IWindowImpl CreateWindow() => new WindowImpl();
 
@@ -70,8 +68,7 @@ namespace Avalonia
     {
         public static AppBuilderBase<T> UseMonoMac<T>(this AppBuilderBase<T> builder) where T : AppBuilderBase<T>, new()
         {
-            return builder.UseWindowingSubsystem(Avalonia.MonoMac.MonoMacPlatform.Initialize);
+            return builder.UseWindowingSubsystem(MonoMac.MonoMacPlatform.Initialize);
         }
     }
-}
- 
+}

+ 17 - 17
src/OSX/Avalonia.MonoMac/PlatformThreadingInterface.cs

@@ -9,26 +9,26 @@ namespace Avalonia.MonoMac
 {
     class PlatformThreadingInterface : IPlatformThreadingInterface
     {
-		private bool _signaled;
-		public static PlatformThreadingInterface Instance { get; } = new PlatformThreadingInterface();
-		public bool CurrentThreadIsLoopThread => NSThread.Current.IsMainThread;
+        private bool _signaled;
+        public static PlatformThreadingInterface Instance { get; } = new PlatformThreadingInterface();
+        public bool CurrentThreadIsLoopThread => NSThread.Current.IsMainThread;
 
-		public event Action Signaled;
+        public event Action Signaled;
 
         public IDisposable StartTimer(TimeSpan interval, Action tick)
-			=> NSTimer.CreateRepeatingScheduledTimer(interval, () => tick());
+            => NSTimer.CreateRepeatingScheduledTimer(interval, () => tick());
 
-		public void Signal()
-		{
-			lock (this)
-			{
-				if (_signaled)
-					return;
-				_signaled = true;
-			}
+        public void Signal()
+        {
+            lock (this)
+            {
+                if (_signaled)
+                    return;
+                _signaled = true;
+            }
             NSApplication.SharedApplication.BeginInvokeOnMainThread(() =>
             {
-                lock(this)
+                lock (this)
                 {
                     if (!_signaled)
                         return;
@@ -36,7 +36,7 @@ namespace Avalonia.MonoMac
                 }
                 Signaled?.Invoke();
             });
-		}
+        }
 
 
 
@@ -49,7 +49,7 @@ namespace Avalonia.MonoMac
             cancellationToken.Register(() =>
             {
                 app.PostEvent(NSEvent.OtherEvent(NSEventType.ApplicationDefined, default(CGPoint),
-                                                 default(NSEventModifierMask), 0, 0, null, 0, 0, 0), true);
+                    default(NSEventModifierMask), 0, 0, null, 0, 0, 0), true);
             });
             while (!cancellationToken.IsCancellationRequested)
             {
@@ -62,4 +62,4 @@ namespace Avalonia.MonoMac
             }
         }
     }
-}
+}

+ 5 - 6
src/OSX/Avalonia.MonoMac/PopupImpl.cs

@@ -1,5 +1,4 @@
-using System;
-using Avalonia.Platform;
+using Avalonia.Platform;
 using MonoMac.AppKit;
 
 namespace Avalonia.MonoMac
@@ -11,9 +10,9 @@ namespace Avalonia.MonoMac
             UpdateStyle();
         }
 
-		protected override NSWindowStyle GetStyle()
-		{
+        protected override NSWindowStyle GetStyle()
+        {
             return NSWindowStyle.Borderless;
-		}
+        }
     }
-}
+}

+ 3 - 7
src/OSX/Avalonia.MonoMac/Stubs.cs

@@ -1,8 +1,5 @@
-using System;
-using System.IO;
-using Avalonia.Input;
+using System.IO;
 using Avalonia.Platform;
-using MonoMac.AppKit;
 
 namespace Avalonia.MonoMac
 {
@@ -35,8 +32,8 @@ namespace Avalonia.MonoMac
 
         public IWindowIconImpl LoadIcon(Stream stream)
         {
-			return new IconStub(
-				AvaloniaLocator.Current.GetService<IPlatformRenderInterface>().LoadBitmap(stream));
+            return new IconStub(
+                AvaloniaLocator.Current.GetService<IPlatformRenderInterface>().LoadBitmap(stream));
         }
 
         public IWindowIconImpl LoadIcon(IBitmapImpl bitmap)
@@ -47,5 +44,4 @@ namespace Avalonia.MonoMac
             return LoadIcon(ms);
         }
     }
-
 }

+ 45 - 54
src/OSX/Avalonia.MonoMac/TopLevelImpl.cs

@@ -15,7 +15,8 @@ namespace Avalonia.MonoMac
     abstract class TopLevelImpl : ITopLevelImpl, IFramebufferPlatformSurface
     {
         public TopLevelView View { get; }
-        public TopLevelImpl()
+
+        protected TopLevelImpl()
         {
             View = new TopLevelView(this);
         }
@@ -29,12 +30,13 @@ namespace Avalonia.MonoMac
             private readonly IKeyboardDevice _keyboard;
             private NSTrackingArea _area;
             private NSCursor _cursor;
+
             public TopLevelView(TopLevelImpl tl)
             {
                 _tl = tl;
                 _mouse = AvaloniaLocator.Current.GetService<IMouseDevice>();
                 _keyboard = AvaloniaLocator.Current.GetService<IKeyboardDevice>();
-			}
+            }
 
             public override bool ConformsToProtocol(IntPtr protocol)
             {
@@ -60,7 +62,8 @@ namespace Avalonia.MonoMac
                     AddCursorRect(Frame, _cursor);
             }
 
-            static NSCursor ArrowCursor = NSCursor.ArrowCursor;
+            static readonly NSCursor ArrowCursor = NSCursor.ArrowCursor;
+
             public void SetCursor(NSCursor cursor)
             {
                 _cursor = cursor ?? ArrowCursor;
@@ -74,12 +77,12 @@ namespace Avalonia.MonoMac
                 if (_area != null)
                 {
                     RemoveTrackingArea(_area);
-                    _area.Dispose(); ;
+                    _area.Dispose();
                 }
                 _area = new NSTrackingArea(new CGRect(default(CGPoint), newSize),
-                                           NSTrackingAreaOptions.ActiveAlways |
-                                           NSTrackingAreaOptions.MouseMoved |
-                                           NSTrackingAreaOptions.EnabledDuringMouseDrag, this, null);
+                    NSTrackingAreaOptions.ActiveAlways |
+                    NSTrackingAreaOptions.MouseMoved |
+                    NSTrackingAreaOptions.EnabledDuringMouseDrag, this, null);
                 AddTrackingArea(_area);
                 UpdateCursor();
                 _tl?.Resized?.Invoke(_tl.ClientSize);
@@ -116,7 +119,7 @@ namespace Avalonia.MonoMac
                 return rv;
             }
 
-            uint GetTimeStamp(NSEvent ev) => (uint)(ev.Timestamp * 1000);
+            uint GetTimeStamp(NSEvent ev) => (uint) (ev.Timestamp * 1000);
 
             void MouseEvent(NSEvent ev, RawMouseEventType type)
             {
@@ -127,10 +130,12 @@ namespace Avalonia.MonoMac
                 if (type == RawMouseEventType.Wheel)
                 {
                     var delta = GetDelta(ev);
+                    // ReSharper disable CompareOfFloatsByEqualityOperator
                     if (delta.X == 0 && delta.Y == 0)
                         return;
+                    // ReSharper restore CompareOfFloatsByEqualityOperator
                     _tl.Input?.Invoke(new RawMouseWheelEventArgs(_mouse, ts, _tl.InputRoot, loc,
-                                                                 delta, mod));
+                        delta, mod));
                 }
                 else
                     _tl.Input?.Invoke(new RawMouseEventArgs(_mouse, ts, _tl.InputRoot, type, loc, mod));
@@ -224,7 +229,7 @@ namespace Avalonia.MonoMac
                 if (!code.HasValue)
                     return;
                 _tl.Input?.Invoke(new RawKeyEventArgs(_keyboard, GetTimeStamp(ev),
-                     type, code.Value, GetModifiers(ev.ModifierFlags)));
+                    type, code.Value, GetModifiers(ev.ModifierFlags)));
             }
 
             public override void KeyDown(NSEvent theEvent)
@@ -246,43 +251,36 @@ namespace Avalonia.MonoMac
 
             public override bool AcceptsFirstResponder() => true;
 
-            public bool HasMarkedText 
+            public bool HasMarkedText
             {
-                [Export("hasMarkedText")]
-                get { return false; } 
+                [Export("hasMarkedText")] get => false;
             }
 
-			public NSRange MarkedRange
-			{
-				[Export("markedRange")]
-				get { return new NSRange(NSRange.NotFound, 0); }
-			}
+            public NSRange MarkedRange
+            {
+                [Export("markedRange")] get => new NSRange(NSRange.NotFound, 0);
+            }
 
             public NSRange SelectedRange
-			{
-				[Export("selectedRange")]
-                get { return new NSRange(NSRange.NotFound, 0); }
-			}
+            {
+                [Export("selectedRange")] get => new NSRange(NSRange.NotFound, 0);
+            }
 
             [Export("setMarkedText:selectedRange:replacementRange:")]
             public void SetMarkedText(NSString str, NSRange a1, NSRange a2)
             {
-                
+
             }
 
             [Export("unmarkText")]
             public void UnmarkText()
             {
-                
+
             }
 
             public NSArray ValidAttributesForMarkedText
             {
-                [Export("validAttributesForMarkedText")]
-                get
-                {
-                    return new NSArray();
-                }
+                [Export("validAttributesForMarkedText")] get => new NSArray();
             }
 
             [Export("attributedSubstringForProposedRange:actualRange:")]
@@ -310,14 +308,14 @@ namespace Avalonia.MonoMac
                 return new CGRect();
             }
 
-			#endregion
-		}
+            #endregion
+        }
 
         public IInputRoot InputRoot { get; private set; }
 
         public abstract Size ClientSize { get; }
 
-        public double Scaling 
+        public double Scaling
         {
             get
             {
@@ -327,42 +325,35 @@ namespace Avalonia.MonoMac
             }
         }
 
-        public IEnumerable<object> Surfaces => new[] { this };
+        public IEnumerable<object> Surfaces => new[] {this};
+
+        #region Events
 
-		#region Events
-		public Action<RawInputEventArgs> Input { get; set; }
-		public Action<Rect> Paint { get; set; }
-		public Action<Size> Resized { get; set; }
-		public Action<double> ScalingChanged { get; set; }
-		public Action Closed { get; set; }
-		#endregion
+        public Action<RawInputEventArgs> Input { get; set; }
+        public Action<Rect> Paint { get; set; }
+        public Action<Size> Resized { get; set; }
+        public Action<double> ScalingChanged { get; set; }
+        public Action Closed { get; set; }
 
-		public virtual void Dispose()
+        #endregion
+
+        public virtual void Dispose()
         {
             Closed?.Invoke();
             Closed = null;
             View.Dispose();
         }
 
-        public void Invalidate(Rect rect)
-        {
-            View.SetNeedsDisplayInRect(View.Frame);
-        }
+        public void Invalidate(Rect rect) => View.SetNeedsDisplayInRect(View.Frame);
 
         public abstract Point PointToClient(Point point);
 
         public abstract Point PointToScreen(Point point);
 
-        public void SetCursor(IPlatformHandle cursor)
-        {
-            View.SetCursor((cursor as Cursor)?.Native);
-        }
+        public void SetCursor(IPlatformHandle cursor) => View.SetCursor((cursor as Cursor)?.Native);
 
-        public void SetInputRoot(IInputRoot inputRoot)
-        {
-            InputRoot = inputRoot;
-        }
+        public void SetInputRoot(IInputRoot inputRoot) => InputRoot = inputRoot;
 
         public ILockedFramebuffer Lock() => new EmulatedFramebuffer(View);
     }
-}
+}

+ 23 - 47
src/OSX/Avalonia.MonoMac/WindowBaseImpl.cs

@@ -1,8 +1,5 @@
 using System;
-using System.Collections.Generic;
 using Avalonia.Controls;
-using Avalonia.Input;
-using Avalonia.Input.Raw;
 using Avalonia.Platform;
 using MonoMac.AppKit;
 using MonoMac.ObjCRuntime;
@@ -13,14 +10,17 @@ namespace Avalonia.MonoMac
     {
         public CustomWindow Window { get; private set; }
 
-		public WindowBaseImpl()
-		{
-            Window = new CustomWindow(this);
-            Window.StyleMask = NSWindowStyle.Titled;
-            Window.BackingType = NSBackingStore.Buffered;
-            Window.ContentView = View;
-            Window.Delegate = CreateWindowDelegate();
-		}
+        public WindowBaseImpl()
+        {
+            Window = new CustomWindow(this)
+            {
+                StyleMask = NSWindowStyle.Titled,
+                BackingType = NSBackingStore.Buffered,
+                ContentView = View,
+                // ReSharper disable once VirtualMemberCallInConstructor
+                Delegate = CreateWindowDelegate()
+            };
+        }
 
         public class CustomWindow : NSWindow
         {
@@ -71,49 +71,28 @@ namespace Avalonia.MonoMac
 
         public Point Position
         {
-            get
-            {
-                var pos = Window.Frame.ToAvaloniaRect().BottomLeft.ConvertPointY();
-                //Console.WriteLine($"GET pos {pos}");
-                return pos;
-            }
-            set
-            {
-                //Console.WriteLine($"SET pos {value}");
-                Window.CascadeTopLeftFromPoint(value.ToMonoMacPoint().ConvertPointY());
-            }
+            get => Window.Frame.ToAvaloniaRect().BottomLeft.ConvertPointY();
+            set => Window.CascadeTopLeftFromPoint(value.ToMonoMacPoint().ConvertPointY());
         }
 
 
-        protected virtual NSWindowStyle GetStyle()
-        {
-            return NSWindowStyle.Borderless;
-        }
+        protected virtual NSWindowStyle GetStyle() => NSWindowStyle.Borderless;
 
-        protected void UpdateStyle()
-        {
-            Window.StyleMask = GetStyle();
-        }
+        protected void UpdateStyle() => Window.StyleMask = GetStyle();
 
 
         IPlatformHandle IWindowBaseImpl.Handle => new PlatformHandle(Window.Handle, "NSWindow");
         public Size MaxClientSize => NSScreen.Screens[0].Frame.ToAvaloniaRect().Size;
-		public Action<Point> PositionChanged { get; set; }
-		public Action Deactivated { get; set; }
-		public Action Activated { get; set; }
+        public Action<Point> PositionChanged { get; set; }
+        public Action Deactivated { get; set; }
+        public Action Activated { get; set; }
 
-		public override Size ClientSize => Window.ContentRectFor(Window.Frame).Size.ToAvaloniaSize();
+        public override Size ClientSize => Window.ContentRectFor(Window.Frame).Size.ToAvaloniaSize();
 
 
-		public void Show()
-        {
-            Window.MakeKeyAndOrderFront(Window);
-        }
+        public void Show() => Window.MakeKeyAndOrderFront(Window);
 
-        public void Hide()
-        {
-            Window?.OrderOut(Window);
-        }
+        public void Hide() => Window?.OrderOut(Window);
 
 
         public void BeginMoveDrag()
@@ -130,10 +109,7 @@ namespace Avalonia.MonoMac
             //TODO: Intercept mouse events and implement resize drag manually
         }
 
-        public void Activate()
-        {
-            Window.MakeKeyWindow();
-        }
+        public void Activate() => Window.MakeKeyWindow();
 
         public void Resize(Size clientSize)
         {
@@ -162,7 +138,7 @@ namespace Avalonia.MonoMac
         {
             Window?.Close();
             Window?.Dispose();
-			base.Dispose();
+            base.Dispose();
         }
     }
 }

+ 10 - 11
src/OSX/Avalonia.MonoMac/WindowImpl.cs

@@ -8,6 +8,7 @@ namespace Avalonia.MonoMac
     class WindowImpl : WindowBaseImpl, IWindowImpl
     {
         bool _decorated = true;
+
         public WindowImpl()
         {
             UpdateStyle();
@@ -45,13 +46,14 @@ namespace Avalonia.MonoMac
 
         public void SetIcon(IWindowIconImpl icon)
         {
-			//No-OP, see http://stackoverflow.com/a/7038671/2231814
-		}
+            //No-OP, see http://stackoverflow.com/a/7038671/2231814
+        }
 
         protected override NSWindowStyle GetStyle()
         {
             if (_decorated)
-                return NSWindowStyle.Closable | NSWindowStyle.Resizable | NSWindowStyle.Miniaturizable | NSWindowStyle.Titled;
+                return NSWindowStyle.Closable | NSWindowStyle.Resizable | NSWindowStyle.Miniaturizable |
+                       NSWindowStyle.Titled;
             return NSWindowStyle.Borderless;
         }
 
@@ -61,23 +63,20 @@ namespace Avalonia.MonoMac
             UpdateStyle();
         }
 
-        public void SetTitle(string title)
-        {
-            Window.Title = title;
-        }
+        public void SetTitle(string title) => Window.Title = title;
 
         class ModalDisposable : IDisposable
         {
-            readonly WindowImpl impl;
+            readonly WindowImpl _impl;
 
             public ModalDisposable(WindowImpl impl)
             {
-                this.impl = impl;
+                _impl = impl;
             }
 
             public void Dispose()
             {
-                impl.Window.OrderOut(impl.Window);
+                _impl.Window.OrderOut(_impl.Window);
             }
         }
 
@@ -89,4 +88,4 @@ namespace Avalonia.MonoMac
             return new ModalDisposable(this);
         }
     }
-}
+}