Sfoglia il codice sorgente

Merge remote-tracking branch 'origin/master' into x11

Nikita Tsukanov 7 anni fa
parent
commit
4bf880724a
100 ha cambiato i file con 850 aggiunte e 1250 eliminazioni
  1. 10 4
      .gitignore
  2. 0 0
      .ncrunch/Avalonia.DesktopRuntime.v3.ncrunchproject
  3. 0 6
      .ncrunch/Avalonia.DotNetFrameworkRuntime.v3.ncrunchproject
  4. 0 5
      .ncrunch/Avalonia.Gtk.v3.ncrunchproject
  5. 0 5
      .ncrunch/Avalonia.HtmlRenderer.v3.ncrunchproject
  6. 0 3
      .ncrunch/Avalonia.Win32.NetStandard.v3.ncrunchproject
  7. 0 3
      .ncrunch/Avalonia.Win32.Shared.v3.ncrunchproject
  8. 0 6
      .ncrunch/BindingTest.v3.ncrunchproject
  9. 0 5
      .ncrunch/RemoteTest.v3.ncrunchproject
  10. 0 8
      .ncrunch/RenderTest.v3.ncrunchproject
  11. 0 6
      .ncrunch/VirtualizationTest.v3.ncrunchproject
  12. 2 0
      .travis.yml
  13. 85 112
      Avalonia.sln
  14. 5 0
      Directory.Build.props
  15. 128 0
      azure-pipelines.yml
  16. 6 0
      build-native.sh
  17. 114 156
      build.cake
  18. 20 0
      build/CoreLibraries.props
  19. 3 0
      build/LegacyProject.targets
  20. 0 5
      build/MonoMac.props
  21. 6 0
      build/ReferenceCoreLibraries.props
  22. 0 4
      build/Rx.props
  23. 1 6
      build/SampleApp.props
  24. 2 2
      build/SharedVersion.props
  25. 1 1
      build/System.Drawing.Common.props
  26. 1 1
      dirs.proj
  27. 3 2
      global.json
  28. 0 0
      native/Avalonia.Native/inc/avalonia-native-guids.h
  29. 9 3
      native/Avalonia.Native/inc/avalonia-native.h
  30. 0 0
      native/Avalonia.Native/inc/com.h
  31. 5 4
      native/Avalonia.Native/inc/comimpl.h
  32. 0 0
      native/Avalonia.Native/inc/key.h
  33. 0 0
      native/Avalonia.Native/src/OSX/.gitignore
  34. 9 3
      native/Avalonia.Native/src/OSX/Avalonia.Native.OSX.xcodeproj/project.pbxproj
  35. 0 0
      native/Avalonia.Native/src/OSX/Avalonia.Native.OSX.xcodeproj/project.xcworkspace/contents.xcworkspacedata
  36. 2 2
      native/Avalonia.Native/src/OSX/Avalonia.Native.OSX.xcodeproj/xcshareddata/xcschemes/Avalonia.Native.OSX.xcscheme
  37. 14 0
      native/Avalonia.Native/src/OSX/AvnString.h
  38. 55 0
      native/Avalonia.Native/src/OSX/AvnString.mm
  39. 0 0
      native/Avalonia.Native/src/OSX/KeyTransform.h
  40. 0 0
      native/Avalonia.Native/src/OSX/KeyTransform.mm
  41. 2 2
      native/Avalonia.Native/src/OSX/Screens.mm
  42. 3 3
      native/Avalonia.Native/src/OSX/SystemDialogs.mm
  43. 13 8
      native/Avalonia.Native/src/OSX/clipboard.mm
  44. 0 0
      native/Avalonia.Native/src/OSX/common.h
  45. 0 0
      native/Avalonia.Native/src/OSX/cursor.h
  46. 1 1
      native/Avalonia.Native/src/OSX/cursor.mm
  47. 10 10
      native/Avalonia.Native/src/OSX/gl.mm
  48. 11 11
      native/Avalonia.Native/src/OSX/main.mm
  49. 7 7
      native/Avalonia.Native/src/OSX/platformthreading.mm
  50. 0 0
      native/Avalonia.Native/src/OSX/window.h
  51. 43 39
      native/Avalonia.Native/src/OSX/window.mm
  52. 0 505
      packages.cake
  53. 41 0
      packages/Avalonia/Avalonia.csproj
  54. 6 0
      packages/Avalonia/Avalonia.props
  55. 24 3
      parameters.cake
  56. 2 2
      readme.md
  57. 0 22
      samples/BindingDemo/App.config
  58. 1 19
      samples/BindingDemo/BindingDemo.csproj
  59. 1 0
      samples/ControlCatalog.Android/ControlCatalog.Android.csproj
  60. 0 22
      samples/ControlCatalog.Desktop/App.config
  61. 0 7
      samples/ControlCatalog.Desktop/ControlCatalog.Desktop.csproj
  62. 5 1
      samples/ControlCatalog.NetCore/ControlCatalog.NetCore.csproj
  63. 1 0
      samples/ControlCatalog.iOS/ControlCatalog.iOS.csproj
  64. 0 22
      samples/ControlCatalog/App.config
  65. 6 13
      samples/ControlCatalog/App.xaml
  66. 1 12
      samples/ControlCatalog/ControlCatalog.csproj
  67. 1 1
      samples/ControlCatalog/Pages/ButtonPage.xaml
  68. 1 1
      samples/ControlCatalog/Pages/LayoutTransformControlPage.xaml
  69. 4 1
      samples/Directory.Build.props
  70. 4 14
      samples/Previewer/Previewer.csproj
  71. 2 13
      samples/RemoteDemo/RemoteDemo.csproj
  72. 12 6
      samples/RenderDemo/MainWindow.xaml
  73. 14 14
      samples/RenderDemo/Pages/AnimationsPage.xaml
  74. 6 6
      samples/RenderDemo/Pages/ClippingPage.xaml
  75. 2 2
      samples/RenderDemo/Pages/DrawingPage.xaml
  76. 1 19
      samples/RenderDemo/RenderDemo.csproj
  77. 0 22
      samples/VirtualizationDemo/App.config
  78. 1 19
      samples/VirtualizationDemo/VirtualizationDemo.csproj
  79. 2 4
      samples/interop/Direct3DInteropSample/Direct3DInteropSample.csproj
  80. 5 4
      samples/interop/WindowsInteropTest/WindowsInteropTest.csproj
  81. 1 8
      src/Android/Avalonia.Android/Avalonia.Android.csproj
  82. 4 4
      src/Android/Avalonia.Android/Platform/SkiaPlatform/AndroidFramebuffer.cs
  83. 1 0
      src/Android/Avalonia.AndroidTestApplication/Avalonia.AndroidTestApplication.csproj
  84. 31 17
      src/Avalonia.Animation/AnimationInstance`1.cs
  85. 4 0
      src/Avalonia.Animation/AnimatorKeyFrame.cs
  86. 2 1
      src/Avalonia.Animation/Avalonia.Animation.csproj
  87. 1 0
      src/Avalonia.Base/Avalonia.Base.csproj
  88. 6 1
      src/Avalonia.Base/Collections/AvaloniaListExtensions.cs
  89. 0 3
      src/Avalonia.Base/Platform/IRuntimePlatform.cs
  90. 23 1
      src/Avalonia.Base/Utilities/MathUtilities.cs
  91. 1 1
      src/Avalonia.Controls/AppBuilderBase.cs
  92. 2 1
      src/Avalonia.Controls/Avalonia.Controls.csproj
  93. 8 3
      src/Avalonia.Controls/Button.cs
  94. 1 1
      src/Avalonia.Controls/DropDown.cs
  95. 2 3
      src/Avalonia.Controls/Image.cs
  96. 21 3
      src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs
  97. 1 1
      src/Avalonia.Controls/Primitives/AdornerLayer.cs
  98. 14 0
      src/Avalonia.Controls/Primitives/ScrollBar.cs
  99. 9 11
      src/Avalonia.Controls/Primitives/SelectingItemsControl.cs
  100. 4 4
      src/Avalonia.Controls/Remote/RemoteWidget.cs

+ 10 - 4
.gitignore

@@ -94,10 +94,6 @@ publish/
 *.Publish.xml
 *.pubxml
 
-# NuGet Packages Directory
-## TODO: If you have NuGet Package Restore enabled, uncomment the next line
-packages/
-
 # Windows Azure Build Output
 csx
 *.build.csdef
@@ -189,3 +185,13 @@ project.lock.json
 BenchmarkDotNet.Artifacts/
 
 dirs.sln
+
+
+##################
+# XCode
+##################
+Index/
+Logs/
+ModuleCache.noindex/
+Build/Intermediates.noindex/
+info.plist

+ 0 - 0
.ncrunch/Avalonia.DotNetCoreRuntime.v3.ncrunchproject → .ncrunch/Avalonia.DesktopRuntime.v3.ncrunchproject


+ 0 - 6
.ncrunch/Avalonia.DotNetFrameworkRuntime.v3.ncrunchproject

@@ -1,6 +0,0 @@
-<ProjectConfiguration>
-  <Settings>
-    <IgnoreThisComponentCompletely>False</IgnoreThisComponentCompletely>
-    <PreviouslyBuiltSuccessfully>True</PreviouslyBuiltSuccessfully>
-  </Settings>
-</ProjectConfiguration>

+ 0 - 5
.ncrunch/Avalonia.Gtk.v3.ncrunchproject

@@ -1,5 +0,0 @@
-<ProjectConfiguration>
-  <Settings>
-    <PreviouslyBuiltSuccessfully>True</PreviouslyBuiltSuccessfully>
-  </Settings>
-</ProjectConfiguration>

+ 0 - 5
.ncrunch/Avalonia.HtmlRenderer.v3.ncrunchproject

@@ -1,5 +0,0 @@
-<ProjectConfiguration>
-  <Settings>
-    <PreviouslyBuiltSuccessfully>True</PreviouslyBuiltSuccessfully>
-  </Settings>
-</ProjectConfiguration>

+ 0 - 3
.ncrunch/Avalonia.Win32.NetStandard.v3.ncrunchproject

@@ -1,3 +0,0 @@
-<ProjectConfiguration>
-  <Settings />
-</ProjectConfiguration>

+ 0 - 3
.ncrunch/Avalonia.Win32.Shared.v3.ncrunchproject

@@ -1,3 +0,0 @@
-<ProjectConfiguration>
-  <Settings />
-</ProjectConfiguration>

+ 0 - 6
.ncrunch/BindingTest.v3.ncrunchproject

@@ -1,6 +0,0 @@
-<ProjectConfiguration>
-  <Settings>
-    <IgnoreThisComponentCompletely>True</IgnoreThisComponentCompletely>
-    <PreviouslyBuiltSuccessfully>True</PreviouslyBuiltSuccessfully>
-  </Settings>
-</ProjectConfiguration>

+ 0 - 5
.ncrunch/RemoteTest.v3.ncrunchproject

@@ -1,5 +0,0 @@
-<ProjectConfiguration>
-  <Settings>
-    <IgnoreThisComponentCompletely>True</IgnoreThisComponentCompletely>
-  </Settings>
-</ProjectConfiguration>

+ 0 - 8
.ncrunch/RenderTest.v3.ncrunchproject

@@ -1,8 +0,0 @@
-<ProjectConfiguration>
-  <Settings>
-    <HiddenComponentWarnings>
-      <Value>MissingOrIgnoredProjectReference</Value>
-    </HiddenComponentWarnings>
-    <PreviouslyBuiltSuccessfully>True</PreviouslyBuiltSuccessfully>
-  </Settings>
-</ProjectConfiguration>

+ 0 - 6
.ncrunch/VirtualizationTest.v3.ncrunchproject

@@ -1,6 +0,0 @@
-<ProjectConfiguration>
-  <Settings>
-    <IgnoreThisComponentCompletely>True</IgnoreThisComponentCompletely>
-    <PreviouslyBuiltSuccessfully>True</PreviouslyBuiltSuccessfully>
-  </Settings>
-</ProjectConfiguration>

+ 2 - 0
.travis.yml

@@ -11,6 +11,8 @@ mono:
   - 5.2.0
 dotnet: 2.1.200
 script:
+  - sudo apt-get update
+  - sudo apt-get install castxml
   - ./build.sh --target "Travis" --configuration "Release"
 notifications:
   email: false

+ 85 - 112
Avalonia.sln

@@ -80,13 +80,13 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Skia", "Skia", "{3743B0F2-C
 EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Android", "Android", "{7CF9789C-F1D3-4D0E-90E5-F1DF67A2753F}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.Android", "src\Android\Avalonia.Android\Avalonia.Android.csproj", "{7B92AF71-6287-4693-9DCB-BD5B6E927E23}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Android", "src\Android\Avalonia.Android\Avalonia.Android.csproj", "{7B92AF71-6287-4693-9DCB-BD5B6E927E23}"
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.AndroidTestApplication", "src\Android\Avalonia.AndroidTestApplication\Avalonia.AndroidTestApplication.csproj", "{FF69B927-C545-49AE-8E16-3D14D621AA12}"
 EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "iOS", "iOS", "{0CB0B92E-6CFF-4240-80A5-CCAFE75D91E1}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.iOS", "src\iOS\Avalonia.iOS\Avalonia.iOS.csproj", "{4488AD85-1495-4809-9AA4-DDFE0A48527E}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.iOS", "src\iOS\Avalonia.iOS\Avalonia.iOS.csproj", "{4488AD85-1495-4809-9AA4-DDFE0A48527E}"
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.iOSTestApplication", "src\iOS\Avalonia.iOSTestApplication\Avalonia.iOSTestApplication.csproj", "{8C923867-8A8F-4F6B-8B80-47D9E8436166}"
 EndProject
@@ -116,14 +116,10 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Interop", "Interop", "{A0CC
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WindowsInteropTest", "samples\interop\WindowsInteropTest\WindowsInteropTest.csproj", "{C7A69145-60B6-4882-97D6-A3921DD43978}"
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.DotNetFrameworkRuntime", "src\Avalonia.DotNetFrameworkRuntime\Avalonia.DotNetFrameworkRuntime.csproj", "{4A1ABB09-9047-4BD5-A4AD-A055E52C5EE0}"
-EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RenderDemo", "samples\RenderDemo\RenderDemo.csproj", "{F1FDC5B0-4654-416F-AE69-E3E9BBD87801}"
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ControlCatalog.Android", "samples\ControlCatalog.Android\ControlCatalog.Android.csproj", "{29132311-1848-4FD6-AE0C-4FF841151BD3}"
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.DotNetCoreRuntime", "src\Avalonia.DotNetCoreRuntime\Avalonia.DotNetCoreRuntime.csproj", "{7863EA94-F0FB-4386-BF8C-E5BFA761560A}"
-EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Skia", "src\Skia\Avalonia.Skia\Avalonia.Skia.csproj", "{7D2D3083-71DD-4CC9-8907-39A0D86FB322}"
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Gtk3", "src\Gtk\Avalonia.Gtk3\Avalonia.Gtk3.csproj", "{BB1F7BB5-6AD4-4776-94D9-C09D0A972658}"
@@ -164,7 +160,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.LinuxFramebuffer",
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Direct3DInteropSample", "samples\interop\Direct3DInteropSample\Direct3DInteropSample.csproj", "{638580B0-7910-40EF-B674-DCB34DA308CD}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.Win32.Interop", "src\Windows\Avalonia.Win32.Interop\Avalonia.Win32.Interop.csproj", "{CBC4FF2F-92D4-420B-BE21-9FE0B930B04E}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Win32.Interop", "src\Windows\Avalonia.Win32.Interop\Avalonia.Win32.Interop.csproj", "{CBC4FF2F-92D4-420B-BE21-9FE0B930B04E}"
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Skia.RenderTests", "tests\Avalonia.Skia.RenderTests\Avalonia.Skia.RenderTests.csproj", "{E1582370-37B3-403C-917F-8209551B1634}"
 EndProject
@@ -178,28 +174,29 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Designer.HostApp",
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Previewer", "samples\Previewer\Previewer.csproj", "{F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}"
 EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "OSX", "OSX", "{A59C4C0A-64DF-4621-B450-2BA00D6F61E2}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Skia.UnitTests", "tests\Avalonia.Skia.UnitTests\Avalonia.Skia.UnitTests.csproj", "{E1240B49-7B4B-4371-A00E-068778C5CF0B}"
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.MonoMac", "src\OSX\Avalonia.MonoMac\Avalonia.MonoMac.csproj", "{CBFD5788-567D-401B-9DFA-74E4224025A0}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.OpenGL", "src\Avalonia.OpenGL\Avalonia.OpenGL.csproj", "{7CCAEFC4-135D-401D-BDDD-896B9B7D3569}"
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Designer.HostApp.NetFX", "src\tools\Avalonia.Designer.HostApp.NetFX\Avalonia.Designer.HostApp.NetFX.csproj", "{4ADA61C8-D191-428D-9066-EF4F0D86520F}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Native", "src\Avalonia.Native\Avalonia.Native.csproj", "{12A91A62-C064-42CA-9A8C-A1272F354388}"
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Skia.UnitTests", "tests\Avalonia.Skia.UnitTests\Avalonia.Skia.UnitTests.csproj", "{E1240B49-7B4B-4371-A00E-068778C5CF0B}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.DesktopRuntime", "src\Avalonia.DesktopRuntime\Avalonia.DesktopRuntime.csproj", "{878FEFE0-CD14-41CB-90B0-DBCB163E8F15}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Packages", "Packages", "{E870DCD7-F46A-498D-83FC-D0FD13E0A11C}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.OpenGL", "src\Avalonia.OpenGL\Avalonia.OpenGL.csproj", "{7CCAEFC4-135D-401D-BDDD-896B9B7D3569}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia", "packages\Avalonia\Avalonia.csproj", "{D49233F8-F29C-47DD-9975-C4C9E4502720}"
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.X11", "src\Avalonia.X11\Avalonia.X11.csproj", "{212D02D5-C873-469A-8E78-4A6350EC4A1A}"
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PlatformSanityChecks", "samples\PlatformSanityChecks\PlatformSanityChecks.csproj", "{8B5768BB-71F9-4E23-89B5-DDBA6458B856}"
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.Native", "src\Avalonia.Native\Avalonia.Native.csproj", "{12A91A62-C064-42CA-9A8C-A1272F354388}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Desktop", "src\Avalonia.Desktop\Avalonia.Desktop.csproj", "{3C471044-3640-45E3-B1B2-16D2FF8399EE}"
 EndProject
 Global
 	GlobalSection(SharedMSBuildProjectFiles) = preSolution
 		src\Shared\RenderHelpers\RenderHelpers.projitems*{3c4c0cb4-0c0f-4450-a37b-148c84ff905f}*SharedItemsImports = 13
 		src\Shared\RenderHelpers\RenderHelpers.projitems*{3e908f67-5543-4879-a1dc-08eace79b3cd}*SharedItemsImports = 4
 		src\Shared\PlatformSupport\PlatformSupport.projitems*{4488ad85-1495-4809-9aa4-ddfe0a48527e}*SharedItemsImports = 4
-		src\Shared\PlatformSupport\PlatformSupport.projitems*{4a1abb09-9047-4bd5-a4ad-a055e52c5ee0}*SharedItemsImports = 4
-		src\Shared\PlatformSupport\PlatformSupport.projitems*{7863ea94-f0fb-4386-bf8c-e5bfa761560a}*SharedItemsImports = 4
 		src\Shared\PlatformSupport\PlatformSupport.projitems*{7b92af71-6287-4693-9dcb-bd5b6e927e23}*SharedItemsImports = 4
 		src\Shared\RenderHelpers\RenderHelpers.projitems*{7d2d3083-71dd-4cc9-8907-39a0d86fb322}*SharedItemsImports = 4
 		tests\Avalonia.RenderTests\Avalonia.RenderTests.projitems*{dabfd304-d6a4-4752-8123-c2ccf7ac7831}*SharedItemsImports = 4
@@ -1226,30 +1223,6 @@ Global
 		{C7A69145-60B6-4882-97D6-A3921DD43978}.Release|iPhone.Build.0 = Release|Any CPU
 		{C7A69145-60B6-4882-97D6-A3921DD43978}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
 		{C7A69145-60B6-4882-97D6-A3921DD43978}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
-		{4A1ABB09-9047-4BD5-A4AD-A055E52C5EE0}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
-		{4A1ABB09-9047-4BD5-A4AD-A055E52C5EE0}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU
-		{4A1ABB09-9047-4BD5-A4AD-A055E52C5EE0}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
-		{4A1ABB09-9047-4BD5-A4AD-A055E52C5EE0}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU
-		{4A1ABB09-9047-4BD5-A4AD-A055E52C5EE0}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU
-		{4A1ABB09-9047-4BD5-A4AD-A055E52C5EE0}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU
-		{4A1ABB09-9047-4BD5-A4AD-A055E52C5EE0}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
-		{4A1ABB09-9047-4BD5-A4AD-A055E52C5EE0}.AppStore|Any CPU.Build.0 = Release|Any CPU
-		{4A1ABB09-9047-4BD5-A4AD-A055E52C5EE0}.AppStore|iPhone.ActiveCfg = Release|Any CPU
-		{4A1ABB09-9047-4BD5-A4AD-A055E52C5EE0}.AppStore|iPhone.Build.0 = Release|Any CPU
-		{4A1ABB09-9047-4BD5-A4AD-A055E52C5EE0}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU
-		{4A1ABB09-9047-4BD5-A4AD-A055E52C5EE0}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU
-		{4A1ABB09-9047-4BD5-A4AD-A055E52C5EE0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{4A1ABB09-9047-4BD5-A4AD-A055E52C5EE0}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{4A1ABB09-9047-4BD5-A4AD-A055E52C5EE0}.Debug|iPhone.ActiveCfg = Debug|Any CPU
-		{4A1ABB09-9047-4BD5-A4AD-A055E52C5EE0}.Debug|iPhone.Build.0 = Debug|Any CPU
-		{4A1ABB09-9047-4BD5-A4AD-A055E52C5EE0}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
-		{4A1ABB09-9047-4BD5-A4AD-A055E52C5EE0}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
-		{4A1ABB09-9047-4BD5-A4AD-A055E52C5EE0}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{4A1ABB09-9047-4BD5-A4AD-A055E52C5EE0}.Release|Any CPU.Build.0 = Release|Any CPU
-		{4A1ABB09-9047-4BD5-A4AD-A055E52C5EE0}.Release|iPhone.ActiveCfg = Release|Any CPU
-		{4A1ABB09-9047-4BD5-A4AD-A055E52C5EE0}.Release|iPhone.Build.0 = Release|Any CPU
-		{4A1ABB09-9047-4BD5-A4AD-A055E52C5EE0}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
-		{4A1ABB09-9047-4BD5-A4AD-A055E52C5EE0}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
 		{F1FDC5B0-4654-416F-AE69-E3E9BBD87801}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
 		{F1FDC5B0-4654-416F-AE69-E3E9BBD87801}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU
 		{F1FDC5B0-4654-416F-AE69-E3E9BBD87801}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
@@ -1310,30 +1283,6 @@ Global
 		{29132311-1848-4FD6-AE0C-4FF841151BD3}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
 		{29132311-1848-4FD6-AE0C-4FF841151BD3}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
 		{29132311-1848-4FD6-AE0C-4FF841151BD3}.Release|iPhoneSimulator.Deploy.0 = Release|Any CPU
-		{7863EA94-F0FB-4386-BF8C-E5BFA761560A}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
-		{7863EA94-F0FB-4386-BF8C-E5BFA761560A}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU
-		{7863EA94-F0FB-4386-BF8C-E5BFA761560A}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
-		{7863EA94-F0FB-4386-BF8C-E5BFA761560A}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU
-		{7863EA94-F0FB-4386-BF8C-E5BFA761560A}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU
-		{7863EA94-F0FB-4386-BF8C-E5BFA761560A}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU
-		{7863EA94-F0FB-4386-BF8C-E5BFA761560A}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
-		{7863EA94-F0FB-4386-BF8C-E5BFA761560A}.AppStore|Any CPU.Build.0 = Release|Any CPU
-		{7863EA94-F0FB-4386-BF8C-E5BFA761560A}.AppStore|iPhone.ActiveCfg = Release|Any CPU
-		{7863EA94-F0FB-4386-BF8C-E5BFA761560A}.AppStore|iPhone.Build.0 = Release|Any CPU
-		{7863EA94-F0FB-4386-BF8C-E5BFA761560A}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU
-		{7863EA94-F0FB-4386-BF8C-E5BFA761560A}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU
-		{7863EA94-F0FB-4386-BF8C-E5BFA761560A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{7863EA94-F0FB-4386-BF8C-E5BFA761560A}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{7863EA94-F0FB-4386-BF8C-E5BFA761560A}.Debug|iPhone.ActiveCfg = Debug|Any CPU
-		{7863EA94-F0FB-4386-BF8C-E5BFA761560A}.Debug|iPhone.Build.0 = Debug|Any CPU
-		{7863EA94-F0FB-4386-BF8C-E5BFA761560A}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
-		{7863EA94-F0FB-4386-BF8C-E5BFA761560A}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
-		{7863EA94-F0FB-4386-BF8C-E5BFA761560A}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{7863EA94-F0FB-4386-BF8C-E5BFA761560A}.Release|Any CPU.Build.0 = Release|Any CPU
-		{7863EA94-F0FB-4386-BF8C-E5BFA761560A}.Release|iPhone.ActiveCfg = Release|Any CPU
-		{7863EA94-F0FB-4386-BF8C-E5BFA761560A}.Release|iPhone.Build.0 = Release|Any CPU
-		{7863EA94-F0FB-4386-BF8C-E5BFA761560A}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
-		{7863EA94-F0FB-4386-BF8C-E5BFA761560A}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
 		{7D2D3083-71DD-4CC9-8907-39A0D86FB322}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
 		{7D2D3083-71DD-4CC9-8907-39A0D86FB322}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU
 		{7D2D3083-71DD-4CC9-8907-39A0D86FB322}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
@@ -1598,54 +1547,6 @@ Global
 		{F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Release|iPhone.Build.0 = Release|Any CPU
 		{F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
 		{F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
-		{CBFD5788-567D-401B-9DFA-74E4224025A0}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU
-		{CBFD5788-567D-401B-9DFA-74E4224025A0}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU
-		{CBFD5788-567D-401B-9DFA-74E4224025A0}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU
-		{CBFD5788-567D-401B-9DFA-74E4224025A0}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU
-		{CBFD5788-567D-401B-9DFA-74E4224025A0}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU
-		{CBFD5788-567D-401B-9DFA-74E4224025A0}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU
-		{CBFD5788-567D-401B-9DFA-74E4224025A0}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU
-		{CBFD5788-567D-401B-9DFA-74E4224025A0}.AppStore|Any CPU.Build.0 = Debug|Any CPU
-		{CBFD5788-567D-401B-9DFA-74E4224025A0}.AppStore|iPhone.ActiveCfg = Debug|Any CPU
-		{CBFD5788-567D-401B-9DFA-74E4224025A0}.AppStore|iPhone.Build.0 = Debug|Any CPU
-		{CBFD5788-567D-401B-9DFA-74E4224025A0}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU
-		{CBFD5788-567D-401B-9DFA-74E4224025A0}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU
-		{CBFD5788-567D-401B-9DFA-74E4224025A0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{CBFD5788-567D-401B-9DFA-74E4224025A0}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{CBFD5788-567D-401B-9DFA-74E4224025A0}.Debug|iPhone.ActiveCfg = Debug|Any CPU
-		{CBFD5788-567D-401B-9DFA-74E4224025A0}.Debug|iPhone.Build.0 = Debug|Any CPU
-		{CBFD5788-567D-401B-9DFA-74E4224025A0}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
-		{CBFD5788-567D-401B-9DFA-74E4224025A0}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
-		{CBFD5788-567D-401B-9DFA-74E4224025A0}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{CBFD5788-567D-401B-9DFA-74E4224025A0}.Release|Any CPU.Build.0 = Release|Any CPU
-		{CBFD5788-567D-401B-9DFA-74E4224025A0}.Release|iPhone.ActiveCfg = Release|Any CPU
-		{CBFD5788-567D-401B-9DFA-74E4224025A0}.Release|iPhone.Build.0 = Release|Any CPU
-		{CBFD5788-567D-401B-9DFA-74E4224025A0}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
-		{CBFD5788-567D-401B-9DFA-74E4224025A0}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
-		{4ADA61C8-D191-428D-9066-EF4F0D86520F}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
-		{4ADA61C8-D191-428D-9066-EF4F0D86520F}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU
-		{4ADA61C8-D191-428D-9066-EF4F0D86520F}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
-		{4ADA61C8-D191-428D-9066-EF4F0D86520F}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU
-		{4ADA61C8-D191-428D-9066-EF4F0D86520F}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU
-		{4ADA61C8-D191-428D-9066-EF4F0D86520F}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU
-		{4ADA61C8-D191-428D-9066-EF4F0D86520F}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
-		{4ADA61C8-D191-428D-9066-EF4F0D86520F}.AppStore|Any CPU.Build.0 = Release|Any CPU
-		{4ADA61C8-D191-428D-9066-EF4F0D86520F}.AppStore|iPhone.ActiveCfg = Release|Any CPU
-		{4ADA61C8-D191-428D-9066-EF4F0D86520F}.AppStore|iPhone.Build.0 = Release|Any CPU
-		{4ADA61C8-D191-428D-9066-EF4F0D86520F}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU
-		{4ADA61C8-D191-428D-9066-EF4F0D86520F}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU
-		{4ADA61C8-D191-428D-9066-EF4F0D86520F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{4ADA61C8-D191-428D-9066-EF4F0D86520F}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{4ADA61C8-D191-428D-9066-EF4F0D86520F}.Debug|iPhone.ActiveCfg = Debug|Any CPU
-		{4ADA61C8-D191-428D-9066-EF4F0D86520F}.Debug|iPhone.Build.0 = Debug|Any CPU
-		{4ADA61C8-D191-428D-9066-EF4F0D86520F}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
-		{4ADA61C8-D191-428D-9066-EF4F0D86520F}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
-		{4ADA61C8-D191-428D-9066-EF4F0D86520F}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{4ADA61C8-D191-428D-9066-EF4F0D86520F}.Release|Any CPU.Build.0 = Release|Any CPU
-		{4ADA61C8-D191-428D-9066-EF4F0D86520F}.Release|iPhone.ActiveCfg = Release|Any CPU
-		{4ADA61C8-D191-428D-9066-EF4F0D86520F}.Release|iPhone.Build.0 = Release|Any CPU
-		{4ADA61C8-D191-428D-9066-EF4F0D86520F}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
-		{4ADA61C8-D191-428D-9066-EF4F0D86520F}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
 		{E1240B49-7B4B-4371-A00E-068778C5CF0B}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU
 		{E1240B49-7B4B-4371-A00E-068778C5CF0B}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU
 		{E1240B49-7B4B-4371-A00E-068778C5CF0B}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU
@@ -1766,6 +1667,78 @@ Global
 		{12A91A62-C064-42CA-9A8C-A1272F354388}.Release|iPhone.Build.0 = Release|Any CPU
 		{12A91A62-C064-42CA-9A8C-A1272F354388}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
 		{12A91A62-C064-42CA-9A8C-A1272F354388}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+		{878FEFE0-CD14-41CB-90B0-DBCB163E8F15}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU
+		{878FEFE0-CD14-41CB-90B0-DBCB163E8F15}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU
+		{878FEFE0-CD14-41CB-90B0-DBCB163E8F15}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU
+		{878FEFE0-CD14-41CB-90B0-DBCB163E8F15}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU
+		{878FEFE0-CD14-41CB-90B0-DBCB163E8F15}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+		{878FEFE0-CD14-41CB-90B0-DBCB163E8F15}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU
+		{878FEFE0-CD14-41CB-90B0-DBCB163E8F15}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU
+		{878FEFE0-CD14-41CB-90B0-DBCB163E8F15}.AppStore|Any CPU.Build.0 = Debug|Any CPU
+		{878FEFE0-CD14-41CB-90B0-DBCB163E8F15}.AppStore|iPhone.ActiveCfg = Debug|Any CPU
+		{878FEFE0-CD14-41CB-90B0-DBCB163E8F15}.AppStore|iPhone.Build.0 = Debug|Any CPU
+		{878FEFE0-CD14-41CB-90B0-DBCB163E8F15}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+		{878FEFE0-CD14-41CB-90B0-DBCB163E8F15}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU
+		{878FEFE0-CD14-41CB-90B0-DBCB163E8F15}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{878FEFE0-CD14-41CB-90B0-DBCB163E8F15}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{878FEFE0-CD14-41CB-90B0-DBCB163E8F15}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+		{878FEFE0-CD14-41CB-90B0-DBCB163E8F15}.Debug|iPhone.Build.0 = Debug|Any CPU
+		{878FEFE0-CD14-41CB-90B0-DBCB163E8F15}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+		{878FEFE0-CD14-41CB-90B0-DBCB163E8F15}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+		{878FEFE0-CD14-41CB-90B0-DBCB163E8F15}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{878FEFE0-CD14-41CB-90B0-DBCB163E8F15}.Release|Any CPU.Build.0 = Release|Any CPU
+		{878FEFE0-CD14-41CB-90B0-DBCB163E8F15}.Release|iPhone.ActiveCfg = Release|Any CPU
+		{878FEFE0-CD14-41CB-90B0-DBCB163E8F15}.Release|iPhone.Build.0 = Release|Any CPU
+		{878FEFE0-CD14-41CB-90B0-DBCB163E8F15}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+		{878FEFE0-CD14-41CB-90B0-DBCB163E8F15}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+		{D49233F8-F29C-47DD-9975-C4C9E4502720}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU
+		{D49233F8-F29C-47DD-9975-C4C9E4502720}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU
+		{D49233F8-F29C-47DD-9975-C4C9E4502720}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU
+		{D49233F8-F29C-47DD-9975-C4C9E4502720}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU
+		{D49233F8-F29C-47DD-9975-C4C9E4502720}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+		{D49233F8-F29C-47DD-9975-C4C9E4502720}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU
+		{D49233F8-F29C-47DD-9975-C4C9E4502720}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU
+		{D49233F8-F29C-47DD-9975-C4C9E4502720}.AppStore|Any CPU.Build.0 = Debug|Any CPU
+		{D49233F8-F29C-47DD-9975-C4C9E4502720}.AppStore|iPhone.ActiveCfg = Debug|Any CPU
+		{D49233F8-F29C-47DD-9975-C4C9E4502720}.AppStore|iPhone.Build.0 = Debug|Any CPU
+		{D49233F8-F29C-47DD-9975-C4C9E4502720}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+		{D49233F8-F29C-47DD-9975-C4C9E4502720}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU
+		{D49233F8-F29C-47DD-9975-C4C9E4502720}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{D49233F8-F29C-47DD-9975-C4C9E4502720}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{D49233F8-F29C-47DD-9975-C4C9E4502720}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+		{D49233F8-F29C-47DD-9975-C4C9E4502720}.Debug|iPhone.Build.0 = Debug|Any CPU
+		{D49233F8-F29C-47DD-9975-C4C9E4502720}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+		{D49233F8-F29C-47DD-9975-C4C9E4502720}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+		{D49233F8-F29C-47DD-9975-C4C9E4502720}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{D49233F8-F29C-47DD-9975-C4C9E4502720}.Release|Any CPU.Build.0 = Release|Any CPU
+		{D49233F8-F29C-47DD-9975-C4C9E4502720}.Release|iPhone.ActiveCfg = Release|Any CPU
+		{D49233F8-F29C-47DD-9975-C4C9E4502720}.Release|iPhone.Build.0 = Release|Any CPU
+		{D49233F8-F29C-47DD-9975-C4C9E4502720}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+		{D49233F8-F29C-47DD-9975-C4C9E4502720}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+		{3C471044-3640-45E3-B1B2-16D2FF8399EE}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU
+		{3C471044-3640-45E3-B1B2-16D2FF8399EE}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU
+		{3C471044-3640-45E3-B1B2-16D2FF8399EE}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU
+		{3C471044-3640-45E3-B1B2-16D2FF8399EE}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU
+		{3C471044-3640-45E3-B1B2-16D2FF8399EE}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+		{3C471044-3640-45E3-B1B2-16D2FF8399EE}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU
+		{3C471044-3640-45E3-B1B2-16D2FF8399EE}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU
+		{3C471044-3640-45E3-B1B2-16D2FF8399EE}.AppStore|Any CPU.Build.0 = Debug|Any CPU
+		{3C471044-3640-45E3-B1B2-16D2FF8399EE}.AppStore|iPhone.ActiveCfg = Debug|Any CPU
+		{3C471044-3640-45E3-B1B2-16D2FF8399EE}.AppStore|iPhone.Build.0 = Debug|Any CPU
+		{3C471044-3640-45E3-B1B2-16D2FF8399EE}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+		{3C471044-3640-45E3-B1B2-16D2FF8399EE}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU
+		{3C471044-3640-45E3-B1B2-16D2FF8399EE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{3C471044-3640-45E3-B1B2-16D2FF8399EE}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{3C471044-3640-45E3-B1B2-16D2FF8399EE}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+		{3C471044-3640-45E3-B1B2-16D2FF8399EE}.Debug|iPhone.Build.0 = Debug|Any CPU
+		{3C471044-3640-45E3-B1B2-16D2FF8399EE}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+		{3C471044-3640-45E3-B1B2-16D2FF8399EE}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+		{3C471044-3640-45E3-B1B2-16D2FF8399EE}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{3C471044-3640-45E3-B1B2-16D2FF8399EE}.Release|Any CPU.Build.0 = Release|Any CPU
+		{3C471044-3640-45E3-B1B2-16D2FF8399EE}.Release|iPhone.ActiveCfg = Release|Any CPU
+		{3C471044-3640-45E3-B1B2-16D2FF8399EE}.Release|iPhone.Build.0 = Release|Any CPU
+		{3C471044-3640-45E3-B1B2-16D2FF8399EE}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+		{3C471044-3640-45E3-B1B2-16D2FF8399EE}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
@@ -1816,11 +1789,11 @@ Global
 		{E2999E4A-9086-401F-898C-AEB0AD38E676} = {9B9E3891-2366-4253-A952-D08BCEB71098}
 		{050CC912-FF49-4A8B-B534-9544017446DD} = {4ED8B739-6F4E-4CD4-B993-545E6B5CE637}
 		{F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE} = {9B9E3891-2366-4253-A952-D08BCEB71098}
-		{CBFD5788-567D-401B-9DFA-74E4224025A0} = {A59C4C0A-64DF-4621-B450-2BA00D6F61E2}
-		{4ADA61C8-D191-428D-9066-EF4F0D86520F} = {4ED8B739-6F4E-4CD4-B993-545E6B5CE637}
 		{E1240B49-7B4B-4371-A00E-068778C5CF0B} = {C5A00AC3-B34C-4564-9BDD-2DA473EF4D8B}
 		{212D02D5-C873-469A-8E78-4A6350EC4A1A} = {86C53C40-57AA-45B8-AD42-FAE0EFDF0F2B}
 		{8B5768BB-71F9-4E23-89B5-DDBA6458B856} = {9B9E3891-2366-4253-A952-D08BCEB71098}
+		{D49233F8-F29C-47DD-9975-C4C9E4502720} = {E870DCD7-F46A-498D-83FC-D0FD13E0A11C}
+		{3C471044-3640-45E3-B1B2-16D2FF8399EE} = {E870DCD7-F46A-498D-83FC-D0FD13E0A11C}
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
 		SolutionGuid = {87366D66-1391-4D90-8999-95A620AD786A}

+ 5 - 0
Directory.Build.props

@@ -0,0 +1,5 @@
+<Project>
+  <PropertyGroup>
+      <PackageOutputPath Condition="'$(PackageOutputPath)' == ''">$(MSBuildThisFileDirectory)artifacts/nuget</PackageOutputPath>
+  </PropertyGroup>
+</Project>

+ 128 - 0
azure-pipelines.yml

@@ -0,0 +1,128 @@
+jobs:
+- job: Linux
+  pool:
+    vmImage: 'ubuntu-16.04'
+  steps:
+  - task: CmdLine@2
+    displayName: 'Install CastXML'
+    inputs:
+      script: |
+        sudo apt-get update
+        sudo apt-get install castxml
+
+  - task: CmdLine@2
+    displayName: 'Install Cake'
+    inputs:
+      script: |
+        dotnet tool install -g Cake.Tool --version 0.30.0
+  
+  - task: CmdLine@2
+    displayName: 'Run Cake'
+    inputs:
+      script: |
+        export PATH="$PATH:$HOME/.dotnet/tools"
+        dotnet --info
+        printenv
+        dotnet cake build.cake -target="Azure-Linux" -configuration="Release"
+
+  - task: PublishTestResults@2
+    inputs:
+      testResultsFormat: 'VSTest'
+      testResultsFiles: '$(Build.SourcesDirectory)/artifacts/test-results/*.trx'
+    condition: not(canceled())
+     
+- job: macOS
+  pool:
+    vmImage: 'xcode9-macos10.13'
+  steps:
+  - task: DotNetCoreInstaller@0
+    inputs:
+      version: '2.1.403'
+
+  - task: Xcode@5
+    inputs:
+      actions: 'build'
+      scheme: ''
+      sdk: 'macosx10.13'
+      configuration: 'Release'
+      xcWorkspacePath: '**/*.xcodeproj/project.xcworkspace'
+      xcodeVersion: 'default' # Options: 8, 9, default, specifyPath
+      args: '-derivedDataPath ./'
+
+  - task: CmdLine@2
+    displayName: 'Install CastXML'
+    inputs:
+      script: brew install castxml
+
+  - task: CmdLine@2
+    displayName: 'Install Cake'
+    inputs:
+      script: |
+        dotnet tool install -g Cake.Tool --version 0.30.0
+
+  - task: CmdLine@2
+    displayName: 'Run Cake'
+    inputs:
+      script: |
+        export COREHOST_TRACE=0
+        export DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1
+        export DOTNET_CLI_TELEMETRY_OPTOUT=1
+        which dotnet
+        dotnet --info
+        export PATH="$PATH:$HOME/.dotnet/tools"
+        dotnet --info
+        printenv
+        dotnet cake build.cake -target="Azure-OSX" -configuration="Release"
+
+  - task: PublishTestResults@2
+    inputs:
+      testResultsFormat: 'VSTest'
+      testResultsFiles: '$(Build.SourcesDirectory)/artifacts/test-results/*.trx'
+    condition: not(canceled())
+  
+  - task: PublishBuildArtifacts@1
+    inputs:
+      pathToPublish: '$(Build.SourcesDirectory)/Build/Products/Release/'
+      artifactName: 'Avalonia.Native.OSX'
+    condition: and(succeeded(), eq(variables['system.pullrequest.isfork'], false))
+    
+  - task: PublishBuildArtifacts@1
+    inputs:
+      pathtoPublish: '$(Build.SourcesDirectory)/artifacts/nuget'
+      artifactName: 'NuGetOSX'
+    condition: and(succeeded(), eq(variables['system.pullrequest.isfork'], false))
+
+- job: Windows
+  pool:
+    vmImage: 'vs2017-win2016'
+  steps:
+  - task: CmdLine@2
+    displayName: 'Install Cake'
+    inputs:
+      script: |
+        dotnet tool install -g Cake.Tool --version 0.30.0
+
+  - task: CmdLine@2
+    displayName: 'Run Cake'
+    inputs:
+      script: |
+        set PATH=%PATH%;%USERPROFILE%\.dotnet\tools
+        dotnet cake build.cake -target="Azure-Windows" -configuration="Release"
+      
+  - task: PublishTestResults@2
+    inputs:
+      testResultsFormat: 'VSTest'
+      testResultsFiles: '$(Build.SourcesDirectory)/artifacts/test-results/*.trx'
+    condition: not(canceled())
+
+  - task: PublishBuildArtifacts@1
+    inputs:
+      pathtoPublish: '$(Build.SourcesDirectory)/artifacts/nuget'
+      artifactName: 'NuGet'
+    condition: and(succeeded(), eq(variables['system.pullrequest.isfork'], false))
+
+  - task: PublishBuildArtifacts@1
+    inputs:
+      pathToPublish: '$(Build.SourcesDirectory)/artifacts/zip'
+      artifactName: 'Samples'
+    condition: and(succeeded(), eq(variables['system.pullrequest.isfork'], false))

+ 6 - 0
build-native.sh

@@ -0,0 +1,6 @@
+# /bin/sh
+
+mkdir native-build
+cd native-build
+cmake -DCMAKE_BUILD_TYPE=$1 ../native
+cmake --build . --target install

+ 114 - 156
build.cake

@@ -1,15 +1,9 @@
-///////////////////////////////////////////////////////////////////////////////
-// ADDINS
-///////////////////////////////////////////////////////////////////////////////
-
-#addin "nuget:?package=NuGet.Core&version=2.14.0"
-#tool "nuget:?package=NuGet.CommandLine&version=4.3.0"
-#tool "nuget:?package=JetBrains.ReSharper.CommandLineTools&version=2017.1.20170613.162720"
-
 ///////////////////////////////////////////////////////////////////////////////
 // TOOLS
 ///////////////////////////////////////////////////////////////////////////////
 
+#tool "nuget:?package=NuGet.CommandLine&version=4.7.1"
+#tool "nuget:?package=JetBrains.ReSharper.CommandLineTools&version=2018.2.3"
 #tool "nuget:?package=xunit.runner.console&version=2.3.1"
 #tool "nuget:?package=JetBrains.dotMemoryUnit&version=3.0.20171219.105559"
 
@@ -21,39 +15,20 @@ using System;
 using System.Collections;
 using System.Collections.Generic;
 using System.Linq;
-using NuGet;
 
 ///////////////////////////////////////////////////////////////////////////////
 // SCRIPTS
 ///////////////////////////////////////////////////////////////////////////////
 
 #load "./parameters.cake"
-#load "./packages.cake"
-
-//////////////////////////////////////////////////////////////////////
-// PARAMETERS
-//////////////////////////////////////////////////////////////////////
-
-class AvaloniaBuildData
-{
-    public AvaloniaBuildData(Parameters parameters, Packages packages)
-    {
-        Parameters = parameters;
-        Packages = packages;
-    }
-
-    public Parameters Parameters { get; }
-    public Packages Packages { get; }
-}
 
 ///////////////////////////////////////////////////////////////////////////////
 // SETUP
 ///////////////////////////////////////////////////////////////////////////////
 
-Setup<AvaloniaBuildData>(context =>
+Setup<Parameters>(context =>
 {
     var parameters = new Parameters(context);
-    var buildContext = new AvaloniaBuildData(parameters, new Packages(context, parameters));
 
     Information("Building version {0} of Avalonia ({1}) using version {2} of Cake.", 
         parameters.Version,
@@ -71,22 +46,24 @@ Setup<AvaloniaBuildData>(context =>
     Information("IsRunningOnUnix: " + parameters.IsRunningOnUnix);
     Information("IsRunningOnWindows: " + parameters.IsRunningOnWindows);
     Information("IsRunningOnAppVeyor: " + parameters.IsRunningOnAppVeyor);
+    Information("IsRunnongOnAzure:" + parameters.IsRunningOnAzure);
     Information("IsPullRequest: " + parameters.IsPullRequest);
     Information("IsMainRepo: " + parameters.IsMainRepo);
     Information("IsMasterBranch: " + parameters.IsMasterBranch);
+    Information("IsReleaseBranch: " + parameters.IsReleaseBranch);
     Information("IsTagged: " + parameters.IsTagged);
     Information("IsReleasable: " + parameters.IsReleasable);
     Information("IsMyGetRelease: " + parameters.IsMyGetRelease);
     Information("IsNuGetRelease: " + parameters.IsNuGetRelease);
 
-    return buildContext;
+    return parameters;
 });
 
 ///////////////////////////////////////////////////////////////////////////////
 // TEARDOWN
 ///////////////////////////////////////////////////////////////////////////////
 
-Teardown<AvaloniaBuildData>((context, buildContext) =>
+Teardown<Parameters>((context, buildContext) =>
 {
     Information("Finished running tasks.");
 });
@@ -96,13 +73,13 @@ Teardown<AvaloniaBuildData>((context, buildContext) =>
 ///////////////////////////////////////////////////////////////////////////////
 
 Task("Clean-Impl")
-    .Does<AvaloniaBuildData>(data =>
+    .Does<Parameters>(data =>
 {
-    CleanDirectories(data.Parameters.BuildDirs);
-    CleanDirectory(data.Parameters.ArtifactsDir);
-    CleanDirectory(data.Parameters.NugetRoot);
-    CleanDirectory(data.Parameters.ZipRoot);
-    CleanDirectory(data.Parameters.BinRoot);
+    CleanDirectories(data.BuildDirs);
+    CleanDirectory(data.ArtifactsDir);
+    CleanDirectory(data.NugetRoot);
+    CleanDirectory(data.ZipRoot);
+    CleanDirectory(data.TestResultsRoot);
 });
 
 void DotNetCoreBuild(Parameters parameters)
@@ -110,27 +87,35 @@ void DotNetCoreBuild(Parameters parameters)
     var settings = new DotNetCoreBuildSettings 
     {
         Configuration = parameters.Configuration,
+        MSBuildSettings = new DotNetCoreMSBuildSettings
+        {
+            Properties =
+            {
+                { "PackageVersion", new [] { parameters.Version } }
+            }
+        }
     };
 
     DotNetCoreBuild(parameters.MSBuildSolution, settings);
 }
 
 Task("Build-Impl")
-    .Does<AvaloniaBuildData>(data =>
+    .Does<Parameters>(data =>
 {
-    if(data.Parameters.IsRunningOnWindows)
+    if(data.IsRunningOnWindows)
     {
-        MSBuild(data.Parameters.MSBuildSolution, settings => {
-            settings.SetConfiguration(data.Parameters.Configuration);
+        MSBuild(data.MSBuildSolution, settings => {
+            settings.SetConfiguration(data.Configuration);
             settings.SetVerbosity(Verbosity.Minimal);
             settings.WithProperty("iOSRoslynPathHackRequired", "true");
+            settings.WithProperty("PackageVersion", data.Version);
             settings.UseToolVersion(MSBuildToolVersion.VS2017);
             settings.WithRestore();
         });
     }
     else
     {
-        DotNetCoreBuild(data.Parameters);
+        DotNetCoreBuild(data);
     }
 });
 
@@ -146,56 +131,63 @@ void RunCoreTest(string project, Parameters parameters, bool coreOnly = false)
             continue;
         Information("Running for " + fw);
         
-        DotNetCoreTest(project,
-            new DotNetCoreTestSettings {
-                Configuration = parameters.Configuration,
-                Framework = fw,
-                NoBuild = true,
-                NoRestore = true
-            });
+        var settings = new DotNetCoreTestSettings {
+            Configuration = parameters.Configuration,
+            Framework = fw,
+            NoBuild = true,
+            NoRestore = true
+        };
+
+        if (parameters.PublishTestResults)
+        {
+            settings.Logger = "trx";
+            settings.ResultsDirectory = parameters.TestResultsRoot;
+        }
+
+        DotNetCoreTest(project, settings);
     }
 }
 
 Task("Run-Unit-Tests-Impl")
-    .WithCriteria<AvaloniaBuildData>((context, data) => !data.Parameters.SkipTests)
-    .Does<AvaloniaBuildData>(data =>
+    .WithCriteria<Parameters>((context, data) => !data.SkipTests)
+    .Does<Parameters>(data =>
 {
-    RunCoreTest("./tests/Avalonia.Base.UnitTests", data.Parameters, false);
-    RunCoreTest("./tests/Avalonia.Controls.UnitTests", data.Parameters, false);
-    RunCoreTest("./tests/Avalonia.Input.UnitTests", data.Parameters, false);
-    RunCoreTest("./tests/Avalonia.Interactivity.UnitTests", data.Parameters, false);
-    RunCoreTest("./tests/Avalonia.Layout.UnitTests", data.Parameters, false);
-    RunCoreTest("./tests/Avalonia.Markup.UnitTests", data.Parameters, false);
-    RunCoreTest("./tests/Avalonia.Markup.Xaml.UnitTests", data.Parameters, false);
-    RunCoreTest("./tests/Avalonia.Styling.UnitTests", data.Parameters, false);
-    RunCoreTest("./tests/Avalonia.Visuals.UnitTests", data.Parameters, false);
-    RunCoreTest("./tests/Avalonia.Skia.UnitTests", data.Parameters, false);
-    RunCoreTest("./tests/Avalonia.ReactiveUI.UnitTests", data.Parameters, false);
-    if (data.Parameters.IsRunningOnWindows)
+    RunCoreTest("./tests/Avalonia.Base.UnitTests", data, false);
+    RunCoreTest("./tests/Avalonia.Controls.UnitTests", data, false);
+    RunCoreTest("./tests/Avalonia.Input.UnitTests", data, false);
+    RunCoreTest("./tests/Avalonia.Interactivity.UnitTests", data, false);
+    RunCoreTest("./tests/Avalonia.Layout.UnitTests", data, false);
+    RunCoreTest("./tests/Avalonia.Markup.UnitTests", data, false);
+    RunCoreTest("./tests/Avalonia.Markup.Xaml.UnitTests", data, false);
+    RunCoreTest("./tests/Avalonia.Styling.UnitTests", data, false);
+    RunCoreTest("./tests/Avalonia.Visuals.UnitTests", data, false);
+    RunCoreTest("./tests/Avalonia.Skia.UnitTests", data, false);
+    RunCoreTest("./tests/Avalonia.ReactiveUI.UnitTests", data, false);
+    if (data.IsRunningOnWindows)
     {
-        RunCoreTest("./tests/Avalonia.Direct2D1.UnitTests", data.Parameters, false);
+        RunCoreTest("./tests/Avalonia.Direct2D1.UnitTests", data, false);
     }
 });
 
 Task("Run-Designer-Tests-Impl")
-    .WithCriteria<AvaloniaBuildData>((context, data) => !data.Parameters.SkipTests)
-    .Does<AvaloniaBuildData>(data =>
+    .WithCriteria<Parameters>((context, data) => !data.SkipTests)
+    .Does<Parameters>(data =>
 {
-    RunCoreTest("./tests/Avalonia.DesignerSupport.Tests", data.Parameters, false);
+    RunCoreTest("./tests/Avalonia.DesignerSupport.Tests", data, false);
 });
 
 Task("Run-Render-Tests-Impl")
-    .WithCriteria<AvaloniaBuildData>((context, data) => !data.Parameters.SkipTests)
-    .WithCriteria<AvaloniaBuildData>((context, data) => data.Parameters.IsRunningOnWindows)
-    .Does<AvaloniaBuildData>(data =>
+    .WithCriteria<Parameters>((context, data) => !data.SkipTests)
+    .WithCriteria<Parameters>((context, data) => data.IsRunningOnWindows)
+    .Does<Parameters>(data =>
 {
-    RunCoreTest("./tests/Avalonia.Skia.RenderTests/Avalonia.Skia.RenderTests.csproj", data.Parameters, true);
-    RunCoreTest("./tests/Avalonia.Direct2D1.RenderTests/Avalonia.Direct2D1.RenderTests.csproj", data.Parameters, true);
+    RunCoreTest("./tests/Avalonia.Skia.RenderTests/Avalonia.Skia.RenderTests.csproj", data, true);
+    RunCoreTest("./tests/Avalonia.Direct2D1.RenderTests/Avalonia.Direct2D1.RenderTests.csproj", data, true);
 });
 
 Task("Run-Leak-Tests-Impl")
-    .WithCriteria<AvaloniaBuildData>((context, data) => !data.Parameters.SkipTests)
-    .WithCriteria<AvaloniaBuildData>((context, data) => data.Parameters.IsRunningOnWindows)
+    .WithCriteria<Parameters>((context, data) => !data.SkipTests)
+    .WithCriteria<Parameters>((context, data) => data.IsRunningOnWindows)
     .Does(() =>
 {
     var dotMemoryUnit = Context.Tools.Resolve("dotMemoryUnit.exe");
@@ -215,100 +207,58 @@ Task("Run-Leak-Tests-Impl")
     }
 });
 
-Task("Copy-Files-Impl")
-    .Does<AvaloniaBuildData>(data =>
-{
-    CopyFiles(data.Packages.BinFiles, data.Parameters.BinRoot);
-});
-
 Task("Zip-Files-Impl")
-    .Does<AvaloniaBuildData>(data =>
+    .Does<Parameters>(data =>
 {
-    Zip(data.Parameters.BinRoot, data.Parameters.ZipCoreArtifacts);
-
-    Zip(data.Parameters.NugetRoot, data.Parameters.ZipNuGetArtifacts);
+    Zip(data.BinRoot, data.ZipCoreArtifacts);
 
-    Zip(data.Parameters.ZipSourceControlCatalogDesktopDirs, 
-        data.Parameters.ZipTargetControlCatalogDesktopDirs, 
-        GetFiles(data.Parameters.ZipSourceControlCatalogDesktopDirs.FullPath + "/*.dll") + 
-        GetFiles(data.Parameters.ZipSourceControlCatalogDesktopDirs.FullPath + "/*.config") + 
-        GetFiles(data.Parameters.ZipSourceControlCatalogDesktopDirs.FullPath + "/*.so") + 
-        GetFiles(data.Parameters.ZipSourceControlCatalogDesktopDirs.FullPath + "/*.dylib") + 
-        GetFiles(data.Parameters.ZipSourceControlCatalogDesktopDirs.FullPath + "/*.exe"));
-});
+    Zip(data.NugetRoot, data.ZipNuGetArtifacts);
 
-Task("Create-NuGet-Packages-Impl")
-    .Does<AvaloniaBuildData>(data =>
-{
-    foreach(var nuspec in data.Packages.NuspecNuGetSettings)
-    {
-        NuGetPack(nuspec);
-    }
+    Zip(data.ZipSourceControlCatalogDesktopDirs, 
+        data.ZipTargetControlCatalogDesktopDirs, 
+        GetFiles(data.ZipSourceControlCatalogDesktopDirs.FullPath + "/*.dll") + 
+        GetFiles(data.ZipSourceControlCatalogDesktopDirs.FullPath + "/*.config") + 
+        GetFiles(data.ZipSourceControlCatalogDesktopDirs.FullPath + "/*.so") + 
+        GetFiles(data.ZipSourceControlCatalogDesktopDirs.FullPath + "/*.dylib") + 
+        GetFiles(data.ZipSourceControlCatalogDesktopDirs.FullPath + "/*.exe"));
 });
 
-Task("Publish-MyGet-Impl")
-    .WithCriteria<AvaloniaBuildData>((context, data) => !data.Parameters.IsLocalBuild)
-    .WithCriteria<AvaloniaBuildData>((context, data) => !data.Parameters.IsPullRequest)
-    .WithCriteria<AvaloniaBuildData>((context, data) => data.Parameters.IsMainRepo)
-    .WithCriteria<AvaloniaBuildData>((context, data) => data.Parameters.IsMasterBranch)
-    .WithCriteria<AvaloniaBuildData>((context, data) => data.Parameters.IsMyGetRelease)
-    .Does<AvaloniaBuildData>(data =>
+void DotNetCorePack(Parameters parameters)
 {
-    var apiKey = EnvironmentVariable("MYGET_API_KEY");
-    if(string.IsNullOrEmpty(apiKey)) 
+    var settings = new DotNetCorePackSettings 
     {
-        throw new InvalidOperationException("Could not resolve MyGet API key.");
-    }
-
-    var apiUrl = EnvironmentVariable("MYGET_API_URL");
-    if(string.IsNullOrEmpty(apiUrl)) 
-    {
-        throw new InvalidOperationException("Could not resolve MyGet API url.");
-    }
+        Configuration = parameters.Configuration,
+        MSBuildSettings = new DotNetCoreMSBuildSettings
+        {
+            Properties =
+            {
+                { "PackageVersion", new [] { parameters.Version } }
+            }
+        }
+    };
 
-    foreach(var nupkg in data.Packages.NugetPackages)
-    {
-        NuGetPush(nupkg, new NuGetPushSettings {
-            Source = apiUrl,
-            ApiKey = apiKey
-        });
-    }
-})
-.OnError(exception =>
-{
-    Information("Publish-MyGet Task failed, but continuing with next Task...");
-});
+    DotNetCorePack(parameters.MSBuildSolution, settings);
+}
 
-Task("Publish-NuGet-Impl")
-    .WithCriteria<AvaloniaBuildData>((context, data) => !data.Parameters.IsLocalBuild)
-    .WithCriteria<AvaloniaBuildData>((context, data) => !data.Parameters.IsPullRequest)
-    .WithCriteria<AvaloniaBuildData>((context, data) => data.Parameters.IsMainRepo)
-    .WithCriteria<AvaloniaBuildData>((context, data) => data.Parameters.IsNuGetRelease)
-    .Does<AvaloniaBuildData>(data =>
+Task("Create-NuGet-Packages-Impl")
+    .Does<Parameters>(data =>
 {
-    var apiKey = EnvironmentVariable("NUGET_API_KEY");
-    if(string.IsNullOrEmpty(apiKey)) 
+    if(data.IsRunningOnWindows)
     {
-        throw new InvalidOperationException("Could not resolve NuGet API key.");
-    }
-
-    var apiUrl = EnvironmentVariable("NUGET_API_URL");
-    if(string.IsNullOrEmpty(apiUrl)) 
-    {
-        throw new InvalidOperationException("Could not resolve NuGet API url.");
+        MSBuild(data.MSBuildSolution, settings => {
+            settings.SetConfiguration(data.Configuration);
+            settings.SetVerbosity(Verbosity.Minimal);
+            settings.WithProperty("iOSRoslynPathHackRequired", "true");
+            settings.WithProperty("PackageVersion", data.Version);
+            settings.UseToolVersion(MSBuildToolVersion.VS2017);
+            settings.WithRestore();
+            settings.WithTarget("Pack");
+        });
     }
-
-    foreach(var nupkg in data.Packages.NugetPackages)
+    else
     {
-        NuGetPush(nupkg, new NuGetPushSettings {
-            ApiKey = apiKey,
-            Source = apiUrl
-        });
+        DotNetCorePack(data);
     }
-})
-.OnError(exception =>
-{
-    Information("Publish-NuGet Task failed, but continuing with next Task...");
 });
 
 ///////////////////////////////////////////////////////////////////////////////
@@ -332,14 +282,22 @@ Task("Package")
 
 Task("AppVeyor")
   .IsDependentOn("Package")
-  .IsDependentOn("Copy-Files-Impl")
-  .IsDependentOn("Zip-Files-Impl")
-  .IsDependentOn("Publish-MyGet-Impl")
-  .IsDependentOn("Publish-NuGet-Impl");
+  .IsDependentOn("Zip-Files-Impl");
 
 Task("Travis")
   .IsDependentOn("Run-Tests");
 
+Task("Azure-Linux")
+  .IsDependentOn("Run-Tests");
+
+Task("Azure-OSX")
+  .IsDependentOn("Package")
+  .IsDependentOn("Zip-Files-Impl");
+
+Task("Azure-Windows")
+  .IsDependentOn("Package")
+  .IsDependentOn("Zip-Files-Impl");
+
 ///////////////////////////////////////////////////////////////////////////////
 // EXECUTE
 ///////////////////////////////////////////////////////////////////////////////

+ 20 - 0
build/CoreLibraries.props

@@ -0,0 +1,20 @@
+<Project>
+  <ItemGroup>
+      <ProjectReference Include="$(MSBuildThisFileDirectory)/../src/Avalonia.Base/Avalonia.Base.csproj" />
+      <ProjectReference Include="$(MSBuildThisFileDirectory)/../src/Avalonia.Animation/Avalonia.Animation.csproj" />
+      <ProjectReference Include="$(MSBuildThisFileDirectory)/../src/Avalonia.Controls/Avalonia.Controls.csproj" />
+      <ProjectReference Include="$(MSBuildThisFileDirectory)/../src/Avalonia.DesignerSupport/Avalonia.DesignerSupport.csproj" />
+      <ProjectReference Include="$(MSBuildThisFileDirectory)/../src/Avalonia.Diagnostics/Avalonia.Diagnostics.csproj" />
+      <ProjectReference Include="$(MSBuildThisFileDirectory)/../src/Avalonia.Input/Avalonia.Input.csproj" />
+      <ProjectReference Include="$(MSBuildThisFileDirectory)/../src/Avalonia.Interactivity/Avalonia.Interactivity.csproj" />
+      <ProjectReference Include="$(MSBuildThisFileDirectory)/../src/Avalonia.Layout/Avalonia.Layout.csproj" />
+      <ProjectReference Include="$(MSBuildThisFileDirectory)/../src/Avalonia.Logging.Serilog/Avalonia.Logging.Serilog.csproj" />
+      <ProjectReference Include="$(MSBuildThisFileDirectory)/../src/Avalonia.Visuals/Avalonia.Visuals.csproj" />
+      <ProjectReference Include="$(MSBuildThisFileDirectory)/../src/Avalonia.Styling/Avalonia.Styling.csproj" />
+      <ProjectReference Include="$(MSBuildThisFileDirectory)/../src/Avalonia.Themes.Default/Avalonia.Themes.Default.csproj" />
+      <ProjectReference Include="$(MSBuildThisFileDirectory)/../src/Avalonia.OpenGL/Avalonia.OpenGL.csproj" />
+      <ProjectReference Include="$(MSBuildThisFileDirectory)/../src/Markup/Avalonia.Markup/Avalonia.Markup.csproj" />
+      <ProjectReference Include="$(MSBuildThisFileDirectory)/../src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj" />
+      <ProjectReference Include="$(MSBuildThisFileDirectory)/../src/Avalonia.DesktopRuntime/Avalonia.DesktopRuntime.csproj" Condition="'$(TargetFramework)' != 'netstandard2.0'" />
+  </ItemGroup>
+</Project>

+ 3 - 0
build/LegacyProject.targets

@@ -0,0 +1,3 @@
+<Project>
+  <Target Name="Pack" />
+</Project>

+ 0 - 5
build/MonoMac.props

@@ -1,5 +0,0 @@
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup>
-    <PackageReference Include="MonoMac.NetStandard" Version="0.0.4" />
-  </ItemGroup>
-</Project>

+ 6 - 0
build/ReferenceCoreLibraries.props

@@ -0,0 +1,6 @@
+<Project>
+  <Import Condition="'$(TargetFramework)' == 'netcoreapp2.0'" Project="CoreLibraries.props" />
+  <ItemGroup>
+      <ProjectReference Include="$(MSBuildThisFileDirectory)../packages/Avalonia/Avalonia.csproj" />
+  </ItemGroup>
+</Project>

+ 0 - 4
build/Rx.props

@@ -1,9 +1,5 @@
 <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <ItemGroup>
     <PackageReference Include="System.Reactive" Version="4.0.0" />
-    <PackageReference Include="System.Reactive.Core" Version="4.0.0" />
-    <PackageReference Include="System.Reactive.Interfaces" Version="4.0.0" />
-    <PackageReference Include="System.Reactive.Linq" Version="4.0.0" />
-    <PackageReference Include="System.Reactive.PlatformServices" Version="4.0.0" />
   </ItemGroup>
 </Project>

+ 1 - 6
build/SampleApp.props

@@ -2,12 +2,7 @@
   <PropertyGroup Condition="'$(TargetFramework)'=='net461'" >
     <OutputType>WinExe</OutputType>
   </PropertyGroup>
-
-  <!-- Should be a Condition="'$(TargetFramework)'=='net461'" here but that doesn't work due
-       to https://github.com/dotnet/sdk/issues/1227 -->
   <ItemGroup>
-    <ProjectReference Include="..\..\src\Windows\Avalonia.Win32\Avalonia.Win32.csproj" />
-    <ProjectReference Include="..\..\src\Windows\Avalonia.Direct2D1\Avalonia.Direct2D1.csproj" />
+    <ProjectReference Include="$(MSBuildThisFileDirectory)..\src\Avalonia.Desktop\Avalonia.Desktop.csproj" />
   </ItemGroup>
-  <Import Condition="'$(TargetFramework)'=='net461'" Project="SharpDX.props" />
 </Project>

+ 2 - 2
build/SharedVersion.props

@@ -2,8 +2,8 @@
   xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <PropertyGroup>
     <Product>Avalonia</Product>
-    <Version>0.6.2</Version>
-    <Copyright>Copyright 2016 &#169; The AvaloniaUI Project</Copyright>
+    <Version>0.7.1</Version>
+    <Copyright>Copyright 2018 &#169; The AvaloniaUI Project</Copyright>
     <PackageLicenseUrl>https://github.com/AvaloniaUI/Avalonia/blob/master/licence.md</PackageLicenseUrl>
     <PackageProjectUrl>https://github.com/AvaloniaUI/Avalonia/</PackageProjectUrl>
     <RepositoryUrl>https://github.com/AvaloniaUI/Avalonia/</RepositoryUrl>

+ 1 - 1
build/System.Drawing.Common.props

@@ -1,5 +1,5 @@
 <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <ItemGroup>
-    <PackageReference Include="System.Drawing.Common" Version="4.5.0-preview1-25914-04" />
+    <PackageReference Include="System.Drawing.Common" Version="4.5.0" />
   </ItemGroup>
 </Project>

+ 1 - 1
dirs.proj

@@ -3,9 +3,9 @@
     <ProjectReference Include="src/**/*.*proj" />
     <ProjectReference Include="samples/**/*.*proj" />
     <ProjectReference Include="tests/**/*.*proj" />
+    <ProjectReference Include="packages/**/*.*proj" />
     <ProjectReference Remove="**/*.shproj" />
     <ProjectReference Remove="src/Markup/Avalonia.Markup.Xaml/PortableXaml/**/*.*proj" />
-    <ProjectReference Remove="**/*.pbxproj" />
   </ItemGroup>
   <ItemGroup Condition="!Exists('$(MSBuildExtensionsPath)\Xamarin\Android')">
     <ProjectReference Remove="src/Android/**/*.*proj" />

+ 3 - 2
global.json

@@ -1,6 +1,7 @@
 {
     "msbuild-sdks": {
-        "Microsoft.Build.Traversal": "1.0.41",
-        "MSBuild.Sdk.Extras": "1.6.46"
+        "Microsoft.Build.Traversal": "1.0.43",
+        "MSBuild.Sdk.Extras": "1.6.46",
+        "AggregatePackage.NuGet.Sdk" : "0.1.12"
     }
 }

+ 0 - 0
src/Avalonia.Native/headers/avalonia-native-guids.h → native/Avalonia.Native/inc/avalonia-native-guids.h


+ 9 - 3
src/Avalonia.Native/headers/avalonia-native.h → native/Avalonia.Native/inc/avalonia-native.h

@@ -173,6 +173,12 @@ public:
     virtual HRESULT ObtainGlFeature(IAvnGlFeature** ppv) = 0;
 };
 
+AVNCOM(IAvnString, 17) : IUnknown
+{
+    virtual HRESULT Pointer(void**retOut) = 0;
+    virtual HRESULT Length(int*ret) = 0;
+};
+
 AVNCOM(IAvnWindowBase, 02) : IUnknown
 {
     virtual HRESULT Show() = 0;
@@ -210,7 +216,7 @@ AVNCOM(IAvnWindow, 04) : virtual IAvnWindowBase
     virtual HRESULT ShowDialog (IUnknown**ppv) = 0;
     virtual HRESULT SetCanResize(bool value) = 0;
     virtual HRESULT SetHasDecorations(bool value) = 0;
-    virtual HRESULT SetTitle (const char* title) = 0;
+    virtual HRESULT SetTitle (void* utf8Title) = 0;
     virtual HRESULT SetTitleBarColor (AvnColor color) = 0;
     virtual HRESULT SetWindowState(AvnWindowState state) = 0;
     virtual HRESULT GetWindowState(AvnWindowState*ret) = 0;
@@ -315,8 +321,8 @@ AVNCOM(IAvnScreens, 0e) : IUnknown
 
 AVNCOM(IAvnClipboard, 0f) : IUnknown
 {
-    virtual HRESULT GetText (void** retOut) = 0;
-    virtual HRESULT SetText (char* text) = 0;
+    virtual HRESULT GetText (IAvnString**ppv) = 0;
+    virtual HRESULT SetText (void* utf8Text) = 0;
     virtual HRESULT Clear() = 0;
 };
 

+ 0 - 0
src/Avalonia.Native/headers/com.h → native/Avalonia.Native/inc/com.h


+ 5 - 4
src/Avalonia.Native/headers/comimpl.h → native/Avalonia.Native/inc/comimpl.h

@@ -63,19 +63,20 @@ public:
 
 
 #define FORWARD_IUNKNOWN() \
-virtual ULONG Release(){ \
+virtual ULONG Release() override \
+{ \
 return ComObject::Release(); \
 } \
-virtual ULONG AddRef() \
+virtual ULONG AddRef() override \
 { \
     return ComObject::AddRef(); \
 } \
-virtual HRESULT QueryInterface(REFIID riid, void **ppvObject) \
+virtual HRESULT QueryInterface(REFIID riid, void **ppvObject) override \
 { \
     return ComObject::QueryInterface(riid, ppvObject); \
 }
 
-#define BEGIN_INTERFACE_MAP() public: virtual HRESULT STDMETHODCALLTYPE QueryInterfaceImpl(REFIID riid, void **ppvObject){
+#define BEGIN_INTERFACE_MAP() public: virtual HRESULT STDMETHODCALLTYPE QueryInterfaceImpl(REFIID riid, void **ppvObject) override {
 #define INTERFACE_MAP_ENTRY(TInterface, IID) if(0 == memcmp(riid, &IID, sizeof(GUID))) { TInterface* casted = this; *ppvObject = casted; return S_OK; }
 #define END_INTERFACE_MAP() return E_NOINTERFACE; }
 #define INHERIT_INTERFACE_MAP(TBase) if(TBase::QueryInterfaceImpl(riid, ppvObject) == S_OK) return S_OK;

+ 0 - 0
src/Avalonia.Native/headers/key.h → native/Avalonia.Native/inc/key.h


+ 0 - 0
src/Avalonia.Native.OSX/.gitignore → native/Avalonia.Native/src/OSX/.gitignore


+ 9 - 3
src/Avalonia.Native.OSX/Avalonia.Native.OSX.xcodeproj/project.pbxproj → native/Avalonia.Native/src/OSX/Avalonia.Native.OSX.xcodeproj/project.pbxproj

@@ -9,6 +9,7 @@
 /* Begin PBXBuildFile section */
 		37A517B32159597E00FBA241 /* Screens.mm in Sources */ = {isa = PBXBuildFile; fileRef = 37A517B22159597E00FBA241 /* Screens.mm */; };
 		37C09D8821580FE4006A6758 /* SystemDialogs.mm in Sources */ = {isa = PBXBuildFile; fileRef = 37C09D8721580FE4006A6758 /* SystemDialogs.mm */; };
+		37DDA9B0219330F8002E132B /* AvnString.mm in Sources */ = {isa = PBXBuildFile; fileRef = 37DDA9AF219330F8002E132B /* AvnString.mm */; };
 		37E2330F21583241000CB7E2 /* KeyTransform.mm in Sources */ = {isa = PBXBuildFile; fileRef = 37E2330E21583241000CB7E2 /* KeyTransform.mm */; };
 		5B21A982216530F500CEE36E /* cursor.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5B21A981216530F500CEE36E /* cursor.mm */; };
 		5B8BD94F215BFEA6005ED2A7 /* clipboard.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5B8BD94E215BFEA6005ED2A7 /* clipboard.mm */; };
@@ -22,10 +23,12 @@
 
 /* Begin PBXFileReference section */
 		379860FE214DA0C000CD0246 /* KeyTransform.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KeyTransform.h; sourceTree = "<group>"; };
-		37A4E71A2178846A00EACBCD /* headers */ = {isa = PBXFileReference; lastKnownFileType = folder; name = headers; path = ../Avalonia.Native/headers; sourceTree = "<group>"; };
+		37A4E71A2178846A00EACBCD /* headers */ = {isa = PBXFileReference; lastKnownFileType = folder; name = headers; path = ../../inc; sourceTree = "<group>"; };
 		37A517B22159597E00FBA241 /* Screens.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = Screens.mm; sourceTree = "<group>"; };
 		37C09D8721580FE4006A6758 /* SystemDialogs.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = SystemDialogs.mm; sourceTree = "<group>"; };
 		37C09D8A21581EF2006A6758 /* window.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = window.h; sourceTree = "<group>"; };
+		37DDA9AF219330F8002E132B /* AvnString.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = AvnString.mm; sourceTree = "<group>"; };
+		37DDA9B121933371002E132B /* AvnString.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AvnString.h; sourceTree = "<group>"; };
 		37E2330E21583241000CB7E2 /* KeyTransform.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = KeyTransform.mm; sourceTree = "<group>"; };
 		5B21A981216530F500CEE36E /* cursor.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = cursor.mm; sourceTree = "<group>"; };
 		5B8BD94E215BFEA6005ED2A7 /* clipboard.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = clipboard.mm; sourceTree = "<group>"; };
@@ -65,6 +68,8 @@
 		AB7A61E62147C814003C5833 = {
 			isa = PBXGroup;
 			children = (
+				37DDA9B121933371002E132B /* AvnString.h */,
+				37DDA9AF219330F8002E132B /* AvnString.mm */,
 				37A4E71A2178846A00EACBCD /* headers */,
 				AB573DC3217605E400D389A2 /* gl.mm */,
 				5BF943652167AD1D009CAE35 /* cursor.h */,
@@ -161,6 +166,7 @@
 			files = (
 				5B8BD94F215BFEA6005ED2A7 /* clipboard.mm in Sources */,
 				5B21A982216530F500CEE36E /* cursor.mm in Sources */,
+				37DDA9B0219330F8002E132B /* AvnString.mm in Sources */,
 				AB8F7D6B21482D7F0057DBA5 /* platformthreading.mm in Sources */,
 				37E2330F21583241000CB7E2 /* KeyTransform.mm in Sources */,
 				37A517B32159597E00FBA241 /* Screens.mm in Sources */,
@@ -285,7 +291,7 @@
 				DYLIB_COMPATIBILITY_VERSION = 1;
 				DYLIB_CURRENT_VERSION = 1;
 				EXECUTABLE_PREFIX = lib;
-				HEADER_SEARCH_PATHS = ../Avalonia.Native/headers;
+				HEADER_SEARCH_PATHS = ../../inc;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 			};
 			name = Debug;
@@ -296,7 +302,7 @@
 				DYLIB_COMPATIBILITY_VERSION = 1;
 				DYLIB_CURRENT_VERSION = 1;
 				EXECUTABLE_PREFIX = lib;
-				HEADER_SEARCH_PATHS = ../Avalonia.Native/headers;
+				HEADER_SEARCH_PATHS = ../../inc;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 			};
 			name = Release;

+ 0 - 0
src/Avalonia.Native.OSX/Avalonia.Native.OSX.xcodeproj/project.xcworkspace/contents.xcworkspacedata → native/Avalonia.Native/src/OSX/Avalonia.Native.OSX.xcodeproj/project.xcworkspace/contents.xcworkspacedata


+ 2 - 2
src/Avalonia.Native.OSX/Avalonia.Native.OSX.xcodeproj/xcshareddata/xcschemes/Avalonia.Native.OSX.xcscheme → native/Avalonia.Native/src/OSX/Avalonia.Native.OSX.xcodeproj/xcshareddata/xcschemes/Avalonia.Native.OSX.xcscheme

@@ -38,7 +38,7 @@
       selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
       launchStyle = "0"
       useCustomWorkingDirectory = "YES"
-      customWorkingDirectory = "$PROJECT_DIR/../../samples/ControlCatalog"
+      customWorkingDirectory = "$PROJECT_DIR/../../../../samples/ControlCatalog.NetCore"
       ignoresPersistentStateOnLaunch = "NO"
       debugDocumentVersioning = "YES"
       debugServiceExtension = "internal"
@@ -58,7 +58,7 @@
       </MacroExpansion>
       <CommandLineArguments>
          <CommandLineArgument
-            argument = "bin/Debug/netcoreapp2.0/ControlCatalog.dll"
+            argument = "bin/Debug/netcoreapp2.0/ControlCatalog.NetCore.dll"
             isEnabled = "YES">
          </CommandLineArgument>
       </CommandLineArguments>

+ 14 - 0
native/Avalonia.Native/src/OSX/AvnString.h

@@ -0,0 +1,14 @@
+//
+//  AvnString.h
+//  Avalonia.Native.OSX
+//
+//  Created by Dan Walmsley on 07/11/2018.
+//  Copyright © 2018 Avalonia. All rights reserved.
+//
+
+#ifndef AvnString_h
+#define AvnString_h
+
+extern IAvnString* CreateAvnString(NSString* string);
+
+#endif /* AvnString_h */

+ 55 - 0
native/Avalonia.Native/src/OSX/AvnString.mm

@@ -0,0 +1,55 @@
+//
+//  AvnString.m
+//  Avalonia.Native.OSX
+//
+//  Created by Dan Walmsley on 07/11/2018.
+//  Copyright © 2018 Avalonia. All rights reserved.
+//
+
+#include "common.h"
+
+class AvnStringImpl : public virtual ComSingleObject<IAvnString, &IID_IAvnString>
+{
+private:
+    NSString* _string;
+    
+public:
+    FORWARD_IUNKNOWN()
+    
+    AvnStringImpl(NSString* string)
+    {
+        _string = string;
+    }
+    
+    virtual HRESULT Pointer(void**retOut) override
+    {
+        @autoreleasepool
+        {
+            if(retOut == nullptr)
+            {
+                return E_POINTER;
+            }
+            
+            *retOut = (void*)_string.UTF8String;
+            
+            return S_OK;
+        }
+    }
+    
+    virtual HRESULT Length(int*retOut) override
+    {
+        if(retOut == nullptr)
+        {
+            return E_POINTER;
+        }
+        
+        *retOut = (int)_string.length;
+        
+        return S_OK;
+    }
+};
+
+IAvnString* CreateAvnString(NSString* string)
+{
+    return new AvnStringImpl(string);
+}

+ 0 - 0
src/Avalonia.Native.OSX/KeyTransform.h → native/Avalonia.Native/src/OSX/KeyTransform.h


+ 0 - 0
src/Avalonia.Native.OSX/KeyTransform.mm → native/Avalonia.Native/src/OSX/KeyTransform.mm


+ 2 - 2
src/Avalonia.Native.OSX/Screens.mm → native/Avalonia.Native/src/OSX/Screens.mm

@@ -7,7 +7,7 @@ class Screens : public ComSingleObject<IAvnScreens, &IID_IAvnScreens>
 {
     public:
     FORWARD_IUNKNOWN()
-    virtual HRESULT GetScreenCount (int* ret)
+    virtual HRESULT GetScreenCount (int* ret) override
     {
         @autoreleasepool
         {
@@ -17,7 +17,7 @@ class Screens : public ComSingleObject<IAvnScreens, &IID_IAvnScreens>
         }
     }
     
-    virtual HRESULT GetScreen (int index, AvnScreen* ret)
+    virtual HRESULT GetScreen (int index, AvnScreen* ret) override
     {
         @autoreleasepool
         {

+ 3 - 3
src/Avalonia.Native.OSX/SystemDialogs.mm → native/Avalonia.Native/src/OSX/SystemDialogs.mm

@@ -11,7 +11,7 @@ public:
     virtual void SelectFolderDialog (IAvnWindow* parentWindowHandle,
                                      IAvnSystemDialogEvents* events,
                                      const char* title,
-                                     const char* initialDirectory)
+                                     const char* initialDirectory) override
     {
         @autoreleasepool
         {
@@ -88,7 +88,7 @@ public:
                                  const char* title,
                                  const char* initialDirectory,
                                  const char* initialFile,
-                                 const char* filters)
+                                 const char* filters) override
     {
         @autoreleasepool
         {
@@ -179,7 +179,7 @@ public:
                                  const char* title,
                                  const char* initialDirectory,
                                  const char* initialFile,
-                                 const char* filters)
+                                 const char* filters) override
     {
         @autoreleasepool
         {

+ 13 - 8
src/Avalonia.Native.OSX/clipboard.mm → native/Avalonia.Native/src/OSX/clipboard.mm

@@ -2,35 +2,40 @@
 // Licensed under the MIT license. See licence.md file in the project root for full license information.
 
 #include "common.h"
+#include "AvnString.h"
 
 class Clipboard : public ComSingleObject<IAvnClipboard, &IID_IAvnClipboard>
 {
 public:
     FORWARD_IUNKNOWN()
-    virtual HRESULT GetText (void** retOut)
+    virtual HRESULT GetText (IAvnString**ppv) override
     {
         @autoreleasepool
         {
-            NSString *str = [[NSPasteboard generalPasteboard] stringForType:NSPasteboardTypeString];
-            *retOut = (void *)str.UTF8String;
+            if(ppv == nullptr)
+            {
+                return E_POINTER;
+            }
+            
+            *ppv = CreateAvnString([[NSPasteboard generalPasteboard] stringForType:NSPasteboardTypeString]);
+            
+            return S_OK;
         }
-        
-        return S_OK;
     }
     
-    virtual HRESULT SetText (char* text)
+    virtual HRESULT SetText (void* utf8String) override
     {
         @autoreleasepool
         {
             NSPasteboard *pasteBoard = [NSPasteboard generalPasteboard];
             [pasteBoard clearContents];
-            [pasteBoard setString:@(text) forType:NSPasteboardTypeString];
+            [pasteBoard setString:[NSString stringWithUTF8String:(const char*)utf8String] forType:NSPasteboardTypeString];
         }
         
         return S_OK;
     }
 
-    virtual HRESULT Clear()
+    virtual HRESULT Clear() override
     {
         @autoreleasepool
         {

+ 0 - 0
src/Avalonia.Native.OSX/common.h → native/Avalonia.Native/src/OSX/common.h


+ 0 - 0
src/Avalonia.Native.OSX/cursor.h → native/Avalonia.Native/src/OSX/cursor.h


+ 1 - 1
src/Avalonia.Native.OSX/cursor.mm → native/Avalonia.Native/src/OSX/cursor.mm

@@ -51,7 +51,7 @@ class CursorFactory : public ComSingleObject<IAvnCursorFactory, &IID_IAvnCursorF
 
 public:
     FORWARD_IUNKNOWN()
-    virtual HRESULT GetCursor (AvnStandardCursorType cursorType, IAvnCursor** retOut)
+    virtual HRESULT GetCursor (AvnStandardCursorType cursorType, IAvnCursor** retOut) override
     {
         *retOut = s_cursorMap[cursorType];
         

+ 10 - 10
src/Avalonia.Native.OSX/gl.mm → native/Avalonia.Native/src/OSX/gl.mm

@@ -48,7 +48,7 @@ public:
     }
     
     
-    virtual HRESULT MakeCurrent()
+    virtual HRESULT MakeCurrent()  override
     {
         [GlContext makeCurrentContext];/*
         glBindFramebufferEXT(GL_FRAMEBUFFER, Framebuffer);
@@ -75,24 +75,24 @@ public:
         _libgl = dlopen("/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib", RTLD_LAZY);
     }
     
-    virtual HRESULT GetSampleCount(int* ret)
+    virtual HRESULT GetSampleCount(int* ret)  override
     {
         *ret = _sampleCount;
         return S_OK;
     }
-    virtual HRESULT GetStencilSize(int* ret)
+    virtual HRESULT GetStencilSize(int* ret) override
     {
         *ret = _stencilSize;
         return S_OK;
     }
     
-    virtual HRESULT ClearContext()
+    virtual HRESULT ClearContext()  override
     {
         [NSOpenGLContext clearCurrentContext];
         return S_OK;
     }
     
-    virtual void* GetProcAddress(char* proc)
+    virtual void* GetProcAddress(char* proc)  override
     {
         return dlsym(_libgl, proc);
     }
@@ -121,14 +121,14 @@ public:
         //return [[NSOpenGLContext alloc] initWithFormat:_format shareContext:nil];
     }
     
-    virtual HRESULT ObtainDisplay(IAvnGlDisplay**retOut)
+    virtual HRESULT ObtainDisplay(IAvnGlDisplay**retOut)  override
     {
         *retOut = _display;
         _display->AddRef();
         return S_OK;
     }
     
-    virtual HRESULT ObtainImmediateContext(IAvnGlContext**retOut)
+    virtual HRESULT ObtainImmediateContext(IAvnGlContext**retOut)  override
     {
         *retOut = _immediate;
         _immediate->AddRef();
@@ -193,14 +193,14 @@ public:
         _view = view;
     }
     
-    virtual HRESULT GetPixelSize(AvnPixelSize* ret)
+    virtual HRESULT GetPixelSize(AvnPixelSize* ret)  override
     {
         auto fsize = [_view convertSizeToBacking: [_view frame].size];
         ret->Width = (int)fsize.width;
         ret->Height = (int)fsize.height;
         return S_OK;
     }
-    virtual HRESULT GetScaling(double* ret)
+    virtual HRESULT GetScaling(double* ret)  override
     {
         *ret = [_window backingScaleFactor];
         return S_OK;
@@ -230,7 +230,7 @@ public:
         _context = GetFeature()->CreateContext();
     }
     
-    virtual HRESULT BeginDrawing(IAvnGlSurfaceRenderingSession** ret)
+    virtual HRESULT BeginDrawing(IAvnGlSurfaceRenderingSession** ret)  override
     {
         auto f = GetFeature();
         if(f == NULL)

+ 11 - 11
src/Avalonia.Native.OSX/main.mm → native/Avalonia.Native/src/OSX/main.mm

@@ -16,7 +16,7 @@ class MacOptions : public ComSingleObject<IAvnMacOptions, &IID_IAvnMacOptions>
 {
 public:
     FORWARD_IUNKNOWN()
-    virtual HRESULT SetShowInDock(int show)
+    virtual HRESULT SetShowInDock(int show)  override
     {
         ShowInDock = show;
         SetActivationPolicy();
@@ -64,7 +64,7 @@ class AvaloniaNative : public ComSingleObject<IAvaloniaNativeFactory, &IID_IAval
     
 public:
     FORWARD_IUNKNOWN()
-    virtual HRESULT Initialize()
+    virtual HRESULT Initialize() override
     {
         @autoreleasepool{
             [[ThreadingInitializer new] do];
@@ -72,12 +72,12 @@ public:
         }
     };
     
-    virtual IAvnMacOptions* GetMacOptions()
+    virtual IAvnMacOptions* GetMacOptions()  override
     {
         return (IAvnMacOptions*)new MacOptions();
     }
     
-    virtual HRESULT CreateWindow(IAvnWindowEvents* cb, IAvnWindow** ppv)
+    virtual HRESULT CreateWindow(IAvnWindowEvents* cb, IAvnWindow** ppv)  override
     {
         if(cb == nullptr || ppv == nullptr)
             return E_POINTER;
@@ -85,7 +85,7 @@ public:
         return S_OK;
     };
     
-    virtual HRESULT CreatePopup(IAvnWindowEvents* cb, IAvnPopup** ppv)
+    virtual HRESULT CreatePopup(IAvnWindowEvents* cb, IAvnPopup** ppv) override
     {
         if(cb == nullptr || ppv == nullptr)
             return E_POINTER;
@@ -94,37 +94,37 @@ public:
         return S_OK;
     }
     
-    virtual HRESULT CreatePlatformThreadingInterface(IAvnPlatformThreadingInterface** ppv)
+    virtual HRESULT CreatePlatformThreadingInterface(IAvnPlatformThreadingInterface** ppv)  override
     {
         *ppv = CreatePlatformThreading();
         return S_OK;
     }
     
-    virtual HRESULT CreateSystemDialogs(IAvnSystemDialogs** ppv)
+    virtual HRESULT CreateSystemDialogs(IAvnSystemDialogs** ppv) override
     {
         *ppv = ::CreateSystemDialogs();
         return  S_OK;
     }
     
-    virtual HRESULT CreateScreens (IAvnScreens** ppv)
+    virtual HRESULT CreateScreens (IAvnScreens** ppv) override
     {
         *ppv = ::CreateScreens ();
         return S_OK;
     }
 
-    virtual HRESULT CreateClipboard(IAvnClipboard** ppv)
+    virtual HRESULT CreateClipboard(IAvnClipboard** ppv) override
     {
         *ppv = ::CreateClipboard ();
         return S_OK;
     }
 
-    virtual HRESULT CreateCursorFactory(IAvnCursorFactory** ppv)
+    virtual HRESULT CreateCursorFactory(IAvnCursorFactory** ppv) override
     {
         *ppv = ::CreateCursorFactory();
         return S_OK;
     }
     
-    virtual HRESULT ObtainGlFeature(IAvnGlFeature** ppv)
+    virtual HRESULT ObtainGlFeature(IAvnGlFeature** ppv) override
     {
         auto rv = ::GetGlFeature();
         if(rv == NULL)

+ 7 - 7
src/Avalonia.Native.OSX/platformthreading.mm → native/Avalonia.Native/src/OSX/platformthreading.mm

@@ -63,7 +63,7 @@ private:
     public:
         FORWARD_IUNKNOWN()
         bool Cancelled = 0;
-        virtual void Cancel()
+        virtual void Cancel() override
         {
             Cancelled = 1;
         }
@@ -86,20 +86,20 @@ public:
         _signaler = NULL;
     }
     
-    virtual bool GetCurrentThreadIsLoopThread()
+    virtual bool GetCurrentThreadIsLoopThread() override
     {
         return [[NSThread currentThread] isMainThread];
     }
-    virtual void SetSignaledCallback(IAvnSignaledCallback* cb)
+    virtual void SetSignaledCallback(IAvnSignaledCallback* cb) override
     {
         SignaledCallback = cb;
     }
-    virtual IAvnLoopCancellation* CreateLoopCancellation()
+    virtual IAvnLoopCancellation* CreateLoopCancellation() override
     {
         return new LoopCancellation();
     }
     
-    virtual void RunLoop(IAvnLoopCancellation* cancel)
+    virtual void RunLoop(IAvnLoopCancellation* cancel) override
     {
         @autoreleasepool {
             auto can = dynamic_cast<LoopCancellation*>(cancel);
@@ -125,12 +125,12 @@ public:
         }
     }
     
-    virtual void Signal(int priority)
+    virtual void Signal(int priority) override
     {
         [_signaler signal:priority];
     }
     
-    virtual IUnknown* StartTimer(int priority, int ms, IAvnActionCallback* callback)
+    virtual IUnknown* StartTimer(int priority, int ms, IAvnActionCallback* callback) override
     {
         @autoreleasepool {
             

+ 0 - 0
src/Avalonia.Native.OSX/window.h → native/Avalonia.Native/src/OSX/window.h


+ 43 - 39
src/Avalonia.Native.OSX/window.mm → native/Avalonia.Native/src/OSX/window.mm

@@ -81,12 +81,12 @@ public:
         [Window setContentView: View];
     }
     
-    virtual AvnWindow* GetNSWindow()
+    virtual AvnWindow* GetNSWindow() override
     {
         return Window;
     }
     
-    virtual HRESULT Show()
+    virtual HRESULT Show() override
     {
         @autoreleasepool
         {
@@ -102,7 +102,7 @@ public:
         }
     }
     
-    virtual HRESULT Hide ()
+    virtual HRESULT Hide () override
     {
         @autoreleasepool
         {
@@ -115,7 +115,7 @@ public:
         }
     }
     
-    virtual HRESULT Activate ()
+    virtual HRESULT Activate () override
     {
         @autoreleasepool
         {
@@ -128,7 +128,7 @@ public:
         return S_OK;
     }
     
-    virtual HRESULT SetTopMost (bool value)
+    virtual HRESULT SetTopMost (bool value) override
     {
         @autoreleasepool
         {
@@ -138,7 +138,7 @@ public:
         }
     }
     
-    virtual HRESULT Close()
+    virtual HRESULT Close() override
     {
         @autoreleasepool
         {
@@ -147,7 +147,7 @@ public:
         }
     }
     
-    virtual HRESULT GetClientSize(AvnSize* ret)
+    virtual HRESULT GetClientSize(AvnSize* ret) override
     {
         @autoreleasepool
         {
@@ -160,7 +160,7 @@ public:
         }
     }
     
-    virtual HRESULT GetMaxClientSize(AvnSize* ret)
+    virtual HRESULT GetMaxClientSize(AvnSize* ret) override
     {
         @autoreleasepool
         {
@@ -176,7 +176,7 @@ public:
         }
     }
     
-    virtual HRESULT GetScaling (double* ret)
+    virtual HRESULT GetScaling (double* ret) override
     {
         @autoreleasepool
         {
@@ -194,7 +194,7 @@ public:
         }
     }
     
-    virtual HRESULT SetMinMaxSize (AvnSize minSize, AvnSize maxSize)
+    virtual HRESULT SetMinMaxSize (AvnSize minSize, AvnSize maxSize) override
     {
         @autoreleasepool
         {
@@ -205,7 +205,7 @@ public:
         }
     }
     
-    virtual HRESULT Resize(double x, double y)
+    virtual HRESULT Resize(double x, double y) override
     {
         @autoreleasepool
         {
@@ -215,7 +215,7 @@ public:
         }
     }
     
-    virtual HRESULT Invalidate (AvnRect rect)
+    virtual HRESULT Invalidate (AvnRect rect) override
     {
         @autoreleasepool
         {
@@ -225,7 +225,7 @@ public:
         }
     }
     
-    virtual bool TryLock()
+    virtual bool TryLock() override
     {
         @autoreleasepool
         {
@@ -233,7 +233,7 @@ public:
         }
     }
     
-    virtual void Unlock()
+    virtual void Unlock() override
     {
         @autoreleasepool
         {
@@ -241,7 +241,7 @@ public:
         }
     }
     
-    virtual HRESULT BeginMoveDrag ()
+    virtual HRESULT BeginMoveDrag () override
     {
         @autoreleasepool
         {
@@ -258,12 +258,12 @@ public:
         }
     }
     
-    virtual HRESULT BeginResizeDrag (AvnWindowEdge edge)
+    virtual HRESULT BeginResizeDrag (AvnWindowEdge edge) override
     {
         return S_OK;
     }
     
-    virtual HRESULT GetPosition (AvnPoint* ret)
+    virtual HRESULT GetPosition (AvnPoint* ret) override
     {
         @autoreleasepool
         {
@@ -283,7 +283,7 @@ public:
         }
     }
     
-    virtual HRESULT SetPosition (AvnPoint point)
+    virtual HRESULT SetPosition (AvnPoint point) override
     {
         @autoreleasepool
         {
@@ -294,7 +294,7 @@ public:
         }
     }
     
-    virtual HRESULT PointToClient (AvnPoint point, AvnPoint* ret)
+    virtual HRESULT PointToClient (AvnPoint point, AvnPoint* ret) override
     {
         @autoreleasepool
         {
@@ -312,7 +312,7 @@ public:
         }
     }
     
-    virtual HRESULT PointToScreen (AvnPoint point, AvnPoint* ret)
+    virtual HRESULT PointToScreen (AvnPoint point, AvnPoint* ret) override
     {
         @autoreleasepool
         {
@@ -329,13 +329,13 @@ public:
         }
     }
     
-    virtual HRESULT ThreadSafeSetSwRenderedFrame(AvnFramebuffer* fb, IUnknown* dispose)
+    virtual HRESULT ThreadSafeSetSwRenderedFrame(AvnFramebuffer* fb, IUnknown* dispose) override
     {
         [View setSwRenderedFrame: fb dispose: dispose];
         return S_OK;
     }
     
-    virtual HRESULT GetSoftwareFramebuffer(AvnFramebuffer*ret)
+    virtual HRESULT GetSoftwareFramebuffer(AvnFramebuffer*ret) override
     {
         if(![[NSThread currentThread] isMainThread])
             return E_FAIL;
@@ -345,7 +345,7 @@ public:
         return S_OK;
     }
     
-    virtual HRESULT SetCursor(IAvnCursor* cursor)
+    virtual HRESULT SetCursor(IAvnCursor* cursor) override
     {
         @autoreleasepool
         {
@@ -367,7 +367,7 @@ public:
         }
     }
     
-    virtual HRESULT CreateGlRenderTarget(IAvnGlSurfaceRenderTarget** ppv)
+    virtual HRESULT CreateGlRenderTarget(IAvnGlSurfaceRenderTarget** ppv) override
     {
         if(View == NULL)
             return E_FAIL;
@@ -440,7 +440,7 @@ private:
         [Window setCanBecomeKeyAndMain];
     }
     
-    virtual HRESULT Show ()
+    virtual HRESULT Show () override
     {
         @autoreleasepool
         {
@@ -450,7 +450,7 @@ private:
         }
     }
     
-    virtual HRESULT ShowDialog (IUnknown**ppv)
+    virtual HRESULT ShowDialog (IUnknown**ppv) override
     {
         @autoreleasepool
         {
@@ -475,7 +475,7 @@ private:
         }
     }
     
-    void WindowStateChanged ()
+    void WindowStateChanged () override
     {
         AvnWindowState state;
         GetWindowState(&state);
@@ -509,7 +509,7 @@ private:
         }
     }
     
-    virtual HRESULT SetCanResize(bool value)
+    virtual HRESULT SetCanResize(bool value) override
     {
         @autoreleasepool
         {
@@ -519,7 +519,7 @@ private:
         }
     }
     
-    virtual HRESULT SetHasDecorations(bool value)
+    virtual HRESULT SetHasDecorations(bool value) override
     {
         @autoreleasepool
         {
@@ -530,11 +530,11 @@ private:
         }
     }
     
-    virtual HRESULT SetTitle (const char* title)
+    virtual HRESULT SetTitle (void* utf8title) override
     {
         @autoreleasepool
         {
-            _lastTitle = [NSString stringWithUTF8String:title];
+            _lastTitle = [NSString stringWithUTF8String:(const char*)utf8title];
             [Window setTitle:_lastTitle];
             [Window setTitleVisibility:NSWindowTitleVisible];
             
@@ -542,7 +542,7 @@ private:
         }
     }
     
-    virtual HRESULT SetTitleBarColor(AvnColor color)
+    virtual HRESULT SetTitleBarColor(AvnColor color) override
     {
         @autoreleasepool
         {
@@ -571,7 +571,7 @@ private:
         return S_OK;
     }
     
-    virtual HRESULT GetWindowState (AvnWindowState*ret)
+    virtual HRESULT GetWindowState (AvnWindowState*ret) override
     {
         @autoreleasepool
         {
@@ -598,7 +598,7 @@ private:
         }
     }
     
-    virtual HRESULT SetWindowState (AvnWindowState state)
+    virtual HRESULT SetWindowState (AvnWindowState state) override
     {
         @autoreleasepool
         {
@@ -642,7 +642,7 @@ private:
     }
     
 protected:
-    virtual void OnResized ()
+    virtual void OnResized () override
     {
         auto windowState = [Window isMiniaturized] ? Minimized
         : (IsZoomed() ? Maximized : Normal);
@@ -655,7 +655,7 @@ protected:
         }
     }
     
-    virtual NSWindowStyleMask GetStyle()
+    virtual NSWindowStyleMask GetStyle() override
     {
         unsigned long s = NSWindowStyleMaskBorderless;
         if(_hasDecorations)
@@ -963,7 +963,11 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent
 
 - (BOOL)performKeyEquivalent:(NSEvent *)event
 {
-    return _lastKeyHandled;
+    bool result = _lastKeyHandled;
+    
+    _lastKeyHandled = false;
+    
+    return result;
 }
 
 - (void)keyDown:(NSEvent *)event
@@ -1192,12 +1196,12 @@ private:
     }
     
 protected:
-    virtual NSWindowStyleMask GetStyle()
+    virtual NSWindowStyleMask GetStyle() override
     {
         return NSWindowStyleMaskBorderless;
     }
     
-    virtual HRESULT Resize(double x, double y)
+    virtual HRESULT Resize(double x, double y) override
     {
         @autoreleasepool
         {

+ 0 - 505
packages.cake

@@ -1,505 +0,0 @@
-using System;
-using System.Collections;
-using System.Collections.Generic;
-using System.Xml.Linq;
-
-public class Packages
-{
-    public List<NuGetPackSettings> NuspecNuGetSettings { get; private set; }
-    public FilePath[] NugetPackages { get; private set; }
-    public FilePath[] BinFiles { get; private set; }
-    public string NugetPackagesDir {get; private set;}
-    public string SkiaSharpVersion {get; private set; }
-    public string SkiaSharpLinuxVersion {get; private set; }
-    public Dictionary<string, IList<Tuple<string,string>>> PackageVersions{get; private set;}
-
-    class DependencyBuilder : List<NuSpecDependency>
-    {
-        Packages _parent;
-
-        public DependencyBuilder(Packages parent)
-        {
-            _parent = parent;
-        }
-        
-        string GetVersion(string name)
-        {
-            return _parent.PackageVersions[name].First().Item1;
-        }
-
-        public DependencyBuilder Dep(string name, params string[] fws)
-        {
-            if(fws.Length == 0)
-                Add(new NuSpecDependency() { Id = name, Version = GetVersion(name) });
-            foreach(var fw in fws)
-                Add(new NuSpecDependency() { Id = name, TargetFramework = fw, Version = GetVersion(name) });
-            return this;
-        }
-        public DependencyBuilder Deps(string[] fws, params string[] deps)
-        {
-            foreach(var fw in fws)
-                foreach(var name in deps)
-                    Add(new NuSpecDependency() { Id = name, TargetFramework = fw, Version = GetVersion(name) });
-            return this;
-        }
-    }
-        
-    public Packages(ICakeContext context, Parameters parameters)
-    {
-        // NUGET NUSPECS
-        context.Information("Getting git modules:");
-
-        var ignoredSubModulesPaths = System.IO.File.ReadAllLines(".git/config").Where(m=>m.StartsWith("[submodule ")).Select(m => 
-        {
-            var path = m.Split(' ')[1].Trim("\"[] \t".ToArray());
-            context.Information(path);
-            return ((DirectoryPath)context.Directory(path)).FullPath;
-        }).ToList();
-
-        var normalizePath = new Func<string, string>(
-            path => path.Replace(System.IO.Path.DirectorySeparatorChar, System.IO.Path.AltDirectorySeparatorChar).ToUpperInvariant());
-
-        // Key: Package Id
-        // Value is Tuple where Item1: Package Version, Item2: The *.csproj/*.props file path.
-        var packageVersions = new Dictionary<string, IList<Tuple<string,string>>>();
-        PackageVersions = packageVersions;
-        System.IO.Directory.EnumerateFiles(((DirectoryPath)context.Directory("./build")).FullPath,
-            "*.props", SearchOption.AllDirectories).ToList().ForEach(fileName =>
-        {
-            if (!ignoredSubModulesPaths.Any(i => normalizePath(fileName).Contains(normalizePath(i))))
-            {
-                var xdoc = XDocument.Load(fileName);
-                foreach (var reference in xdoc.Descendants().Where(x => x.Name.LocalName == "PackageReference"))
-                {
-                    var name = reference.Attribute("Include").Value;
-                    var versionAttribute = reference.Attribute("Version");
-                    var version = versionAttribute != null 
-                        ? versionAttribute.Value 
-                        : reference.Elements().First(x=>x.Name.LocalName == "Version").Value;
-                    IList<Tuple<string, string>> versions;
-                    packageVersions.TryGetValue(name, out versions);
-                    if (versions == null)
-                    {
-                        versions = new List<Tuple<string, string>>();
-                        packageVersions[name] = versions;
-                    }
-                    versions.Add(Tuple.Create(version, fileName));
-                }
-            }
-        });
-
-        context.Information("Checking installed NuGet package dependencies versions:");
-
-        packageVersions.ToList().ForEach(package =>
-        {
-            var packageVersion = package.Value.First().Item1;
-            bool isValidVersion = package.Value.All(x => x.Item1 == packageVersion);
-            if (!isValidVersion)
-            {
-                context.Information("Error: package {0} has multiple versions installed:", package.Key);
-                foreach (var v in package.Value)
-                {
-                    context.Information("{0}, file: {1}", v.Item1, v.Item2);
-                }
-                throw new Exception("Detected multiple NuGet package version installed for different projects.");
-            }
-        });
-
-        context.Information("Setting NuGet package dependencies versions:");
-
-        var SerilogVersion = packageVersions["Serilog"].FirstOrDefault().Item1;
-        var SerilogSinksDebugVersion = packageVersions["Serilog.Sinks.Debug"].FirstOrDefault().Item1;
-        var SerilogSinksTraceVersion = packageVersions["Serilog.Sinks.Trace"].FirstOrDefault().Item1;
-        var SystemReactiveVersion = packageVersions["System.Reactive"].FirstOrDefault().Item1;
-        var ReactiveUIVersion = packageVersions["reactiveui"].FirstOrDefault().Item1;
-        var SystemValueTupleVersion = packageVersions["System.ValueTuple"].FirstOrDefault().Item1;
-        SkiaSharpVersion = packageVersions["SkiaSharp"].FirstOrDefault().Item1;
-		SkiaSharpLinuxVersion = packageVersions["Avalonia.Skia.Linux.Natives"].FirstOrDefault().Item1;
-        var SharpDXVersion = packageVersions["SharpDX"].FirstOrDefault().Item1;
-        var SharpDXDirect2D1Version = packageVersions["SharpDX.Direct2D1"].FirstOrDefault().Item1;
-        var SharpDXDirect3D11Version = packageVersions["SharpDX.Direct3D11"].FirstOrDefault().Item1;
-        var SharpDXDirect3D9Version = packageVersions["SharpDX.Direct3D9"].FirstOrDefault().Item1;
-        var SharpDXDXGIVersion = packageVersions["SharpDX.DXGI"].FirstOrDefault().Item1;
-        var SystemMemoryVersion = packageVersions["System.Memory"].FirstOrDefault().Item1;
-
-        context.Information("Package: Serilog, version: {0}", SerilogVersion);
-        context.Information("Package: System.Reactive, version: {0}", SystemReactiveVersion);
-        context.Information("Package: reactiveui, version: {0}", ReactiveUIVersion);
-        context.Information("Package: System.ValueTuple, version: {0}", SystemValueTupleVersion);
-        context.Information("Package: SkiaSharp, version: {0}", SkiaSharpVersion);
-        context.Information("Package: Avalonia.Skia.Linux.Natives, version: {0}", SkiaSharpLinuxVersion);
-        context.Information("Package: SharpDX, version: {0}", SharpDXVersion);
-        context.Information("Package: SharpDX.Direct2D1, version: {0}", SharpDXDirect2D1Version);
-        context.Information("Package: SharpDX.Direct3D11, version: {0}", SharpDXDirect3D11Version);
-        context.Information("Package: SharpDX.Direct3D9, version: {0}", SharpDXDirect3D9Version);
-        context.Information("Package: SharpDX.DXGI, version: {0}", SharpDXDXGIVersion);
-        context.Information("Package: System.Memory, version: {0}", SystemMemoryVersion);
-
-        var nugetPackagesDir = System.Environment.GetEnvironmentVariable("NUGET_HOME")
-            ?? System.IO.Path.Combine(System.Environment.GetEnvironmentVariable("USERPROFILE") ?? System.Environment.GetEnvironmentVariable("HOME"), ".nuget");
-        
-        NugetPackagesDir = System.IO.Path.Combine(nugetPackagesDir, "packages");
-        
-        var SetNuGetNuspecCommonProperties = new Action<NuGetPackSettings> ((nuspec) => {
-            nuspec.Version = parameters.Version;
-            nuspec.Authors = new [] { "Avalonia Team" };
-            nuspec.Owners = new [] { "stevenk" };
-            nuspec.LicenseUrl = new Uri("http://opensource.org/licenses/MIT");
-            nuspec.ProjectUrl = new Uri("https://github.com/AvaloniaUI/Avalonia/");
-            nuspec.RequireLicenseAcceptance = false;
-            nuspec.Symbols = false;
-            nuspec.NoPackageAnalysis = true;
-            nuspec.Description = "The Avalonia UI framework";
-            nuspec.Copyright = "Copyright 2015";
-            nuspec.Tags = new [] { "Avalonia" };
-        });
-
-        var coreLibraries = new string[][]
-        {
-            new [] { "./src/", "Avalonia.Animation"},
-            new [] { "./src/", "Avalonia.Base"},
-            new [] { "./src/", "Avalonia.Controls"},
-            new [] { "./src/", "Avalonia.DesignerSupport"},
-            new [] { "./src/", "Avalonia.Diagnostics"},
-            new [] { "./src/", "Avalonia.Input"},
-            new [] { "./src/", "Avalonia.Interactivity"},
-            new [] { "./src/", "Avalonia.Layout"},
-            new [] { "./src/", "Avalonia.Logging.Serilog"},
-            new [] { "./src/", "Avalonia.Visuals"},
-            new [] { "./src/", "Avalonia.Styling"},
-            new [] { "./src/", "Avalonia.OpenGL"},
-            new [] { "./src/", "Avalonia.Themes.Default"},
-            new [] { "./src/Markup/", "Avalonia.Markup"},
-            new [] { "./src/Markup/", "Avalonia.Markup.Xaml"},
-        };
-
-        var extensionsToPack = new [] {".dll", ".xml", ".pdb"};
-
-        var coreLibrariesFiles = coreLibraries
-            .SelectMany(lib => extensionsToPack.Select(ext => new {lib, ext}))
-            .Select((lib) => {
-                return (FilePath)context.File(lib.lib[0] + lib.lib[1] + "/bin/" + parameters.DirSuffix + "/netstandard2.0/" + lib.lib[1] + lib.ext);
-        }).ToList();
-
-        var coreLibrariesNuSpecContent = coreLibrariesFiles.Select((file) => {
-            return new NuSpecContent { 
-                Source = file.FullPath, Target = "lib/netstandard2.0" 
-            };
-        });
-
-        var netFrameworkCoreLibrariesNuSpecContent = coreLibrariesFiles.Select((file) => {
-            return new NuSpecContent { 
-                Source = file.FullPath, Target = "lib/net461" 
-            };
-        });
-
-        var netcoreappCoreLibrariesNuSpecContent = coreLibrariesFiles.Select((file) => {
-            return new NuSpecContent { 
-                Source = file.FullPath, Target = "lib/netcoreapp2.0" 
-            };
-        });
-
-        var netFrameworkRuntimePlatform = extensionsToPack.Select(libSuffix => {
-            return new NuSpecContent {
-                Source = ((FilePath)context.File("./src/Avalonia.DotNetFrameworkRuntime/bin/" + parameters.DirSuffix + "/net461/Avalonia.DotNetFrameworkRuntime" + libSuffix)).FullPath, 
-                Target = "lib/net461" 
-            };
-        });
-
-        var netCoreRuntimePlatform = extensionsToPack.Select(libSuffix => {
-            return new NuSpecContent {
-                Source = ((FilePath)context.File("./src/Avalonia.DotNetCoreRuntime/bin/" + parameters.DirSuffix + "/netcoreapp2.0/Avalonia.DotNetCoreRuntime" + libSuffix)).FullPath, 
-                Target = "lib/netcoreapp2.0" 
-            };
-        });
-
-        var toolHostApp = new NuSpecContent{
-            Source = ((FilePath)context.File("./src/tools/Avalonia.Designer.HostApp/bin/" + parameters.DirSuffix + "/netcoreapp2.0/Avalonia.Designer.HostApp.dll")).FullPath, 
-            Target = "tools/netcoreapp2.0/previewer"
-        };
-
-        var toolHostAppNetFx = new NuSpecContent{
-            Source = ((FilePath)context.File("./src/tools/Avalonia.Designer.HostApp.NetFx/bin/" + parameters.DirSuffix + "/net461/Avalonia.Designer.HostApp.exe")).FullPath, 
-            Target = "tools/net461/previewer"
-        };
-
-        var toolsContent = new[] { toolHostApp, toolHostAppNetFx };
-        var coreFiles = coreLibrariesNuSpecContent
-            .Concat(netFrameworkCoreLibrariesNuSpecContent).Concat(netFrameworkRuntimePlatform)
-            .Concat(netcoreappCoreLibrariesNuSpecContent).Concat(netCoreRuntimePlatform)
-            .Concat(toolsContent)
-            .ToList();
-
-        var nuspecNuGetSettingsCore = new []
-        {
-            ///////////////////////////////////////////////////////////////////////////////
-            // Avalonia
-            ///////////////////////////////////////////////////////////////////////////////
-            new NuGetPackSettings()
-            {
-                Id = "Avalonia",
-                Dependencies = new DependencyBuilder(this)
-                {
-                    new NuSpecDependency() { Id = "Avalonia.Remote.Protocol", Version = parameters.Version, TargetFramework="netstandard2.0" },
-                    new NuSpecDependency() { Id = "Avalonia.Remote.Protocol", Version = parameters.Version, TargetFramework="netcoreapp2.0" },
-                    new NuSpecDependency() { Id = "Avalonia.Remote.Protocol", Version = parameters.Version, TargetFramework="net461" },
-                    new NuSpecDependency() { Id = "System.ValueTuple", Version = SystemValueTupleVersion, TargetFramework="net461" },
-                    new NuSpecDependency() { Id = "System.ComponentModel.TypeConverter", Version = "4.3.0", TargetFramework="net461" },
-                    new NuSpecDependency() { Id = "NETStandard.Library", Version = "2.0.0", TargetFramework="net461"}
-                }
-                .Deps(new string[]{"netstandard2.0", "netcoreapp2.0", "net461"},
-                    "Serilog", "Serilog.Sinks.Debug", "Serilog.Sinks.Trace",
-                    "System.Memory", "System.Reactive", "System.ComponentModel.Annotations")
-                .ToArray(),
-                Files = coreFiles,
-                BasePath = context.Directory("./"),
-                OutputDirectory = parameters.NugetRoot
-            },
-            ///////////////////////////////////////////////////////////////////////////////
-            // Avalonia.ReactiveUI
-            ///////////////////////////////////////////////////////////////////////////////
-            new NuGetPackSettings()
-            {
-                Id = "Avalonia.ReactiveUI",
-                Dependencies = new DependencyBuilder(this)
-                {
-                    new NuSpecDependency() { Id = "Avalonia", Version = parameters.Version },
-                }.Deps(new string[] {null}, "reactiveui"),
-                Files = new []
-                {
-                    new NuSpecContent { Source = "Avalonia.ReactiveUI.dll", Target = "lib/netstandard2.0" }
-                },
-                BasePath = context.Directory("./src/Avalonia.ReactiveUI/bin/" + parameters.DirSuffix + "/netstandard2.0"),
-                OutputDirectory = parameters.NugetRoot
-            },
-            ///////////////////////////////////////////////////////////////////////////////
-            // Avalonia.Remote.Protocol
-            ///////////////////////////////////////////////////////////////////////////////
-            new NuGetPackSettings()
-            {
-                Id = "Avalonia.Remote.Protocol",
-                Files = new []
-                {
-                    new NuSpecContent { Source = "Avalonia.Remote.Protocol.dll", Target = "lib/netstandard2.0" }
-                },
-                BasePath = context.Directory("./src/Avalonia.Remote.Protocol/bin/" + parameters.DirSuffix + "/netstandard2.0"),
-                OutputDirectory = parameters.NugetRoot
-            },
-        };
-
-        var nuspecNuGetSettingsMobile = new []
-        {
-            ///////////////////////////////////////////////////////////////////////////////
-            // Avalonia.Android
-            ///////////////////////////////////////////////////////////////////////////////
-            new NuGetPackSettings()
-            {
-                Id = "Avalonia.Android",
-                Dependencies = new []
-                {
-                    new NuSpecDependency() { Id = "Avalonia", Version = parameters.Version },
-                    new NuSpecDependency() { Id = "Avalonia.Skia", Version = parameters.Version }
-                },
-                Files = new []
-                {
-                    new NuSpecContent { Source = "Avalonia.Android.dll", Target = "lib/MonoAndroid10" }
-                },
-                BasePath = context.Directory("./src/Android/Avalonia.Android/bin/" + parameters.DirSuffix + "/monoandroid44/MonoAndroid44/"),
-                OutputDirectory = parameters.NugetRoot
-            },
-            ///////////////////////////////////////////////////////////////////////////////
-            // Avalonia.iOS
-            ///////////////////////////////////////////////////////////////////////////////
-            new NuGetPackSettings()
-            {
-                Id = "Avalonia.iOS",
-                Dependencies = new []
-                {
-                    new NuSpecDependency() { Id = "Avalonia", Version = parameters.Version },
-                    new NuSpecDependency() { Id = "Avalonia.Skia", Version = parameters.Version }
-                },
-                Files = new []
-                {
-                    new NuSpecContent { Source = "Avalonia.iOS.dll", Target = "lib/Xamarin.iOS10" }
-                },
-                BasePath = context.Directory("./src/iOS/Avalonia.iOS/bin/" + parameters.DirSuffix + "/xamarin.ios10/"),
-                OutputDirectory = parameters.NugetRoot
-            }
-        };
-
-        var nuspecNuGetSettingsDesktop = new []
-        {
-            ///////////////////////////////////////////////////////////////////////////////
-            // Avalonia.Win32
-            ///////////////////////////////////////////////////////////////////////////////
-            new NuGetPackSettings()
-            {
-                Id = "Avalonia.Win32",
-                Dependencies = new DependencyBuilder(this)
-                {
-                    new NuSpecDependency() { Id = "Avalonia", Version = parameters.Version }
-                }.Deps(new string[]{null}, "System.Drawing.Common"),
-                Files = new []
-                {
-                    new NuSpecContent { Source = "Avalonia.Win32/bin/" + parameters.DirSuffix + "/netstandard2.0/Avalonia.Win32.dll", Target = "lib/netstandard2.0" }
-                },
-                BasePath = context.Directory("./src/Windows"),
-                OutputDirectory = parameters.NugetRoot
-            },
-            ///////////////////////////////////////////////////////////////////////////////
-            // Avalonia.Direct2D1
-            ///////////////////////////////////////////////////////////////////////////////
-            new NuGetPackSettings()
-            {
-                Id = "Avalonia.Direct2D1",
-                Dependencies = new []
-                {
-                    new NuSpecDependency() { Id = "Avalonia", Version = parameters.Version },
-                    new NuSpecDependency() { Id = "SharpDX", Version = SharpDXVersion },
-                    new NuSpecDependency() { Id = "SharpDX.Direct2D1", Version = SharpDXDirect2D1Version },
-                    new NuSpecDependency() { Id = "SharpDX.Direct3D11", Version = SharpDXDirect3D11Version },
-                    new NuSpecDependency() { Id = "SharpDX.DXGI", Version = SharpDXDXGIVersion }
-                },
-                Files = new []
-                {
-                    new NuSpecContent { Source = "Avalonia.Direct2D1.dll", Target = "lib/netstandard2.0" }
-                },
-                BasePath = context.Directory("./src/Windows/Avalonia.Direct2D1/bin/" + parameters.DirSuffix + "/netstandard2.0"),
-                OutputDirectory = parameters.NugetRoot
-            },
-            ///////////////////////////////////////////////////////////////////////////////
-            // Avalonia.Gtk3
-            ///////////////////////////////////////////////////////////////////////////////
-            new NuGetPackSettings()
-            {
-                Id = "Avalonia.Gtk3",
-                Dependencies = new []
-                {
-                    new NuSpecDependency() { Id = "Avalonia", Version = parameters.Version }
-                },
-                Files = new []
-                {
-                    new NuSpecContent { Source = "Avalonia.Gtk3.dll", Target = "lib/netstandard2.0" }
-                },
-                BasePath = context.Directory("./src/Gtk/Avalonia.Gtk3/bin/" + parameters.DirSuffix + "/netstandard2.0"),
-                OutputDirectory = parameters.NugetRoot
-            },
-            ///////////////////////////////////////////////////////////////////////////////
-            // Avalonia.Skia
-            ///////////////////////////////////////////////////////////////////////////////
-            new NuGetPackSettings()
-            {
-                Id = "Avalonia.Skia",
-                Dependencies = new []
-                {
-                    new NuSpecDependency() { Id = "Avalonia", Version = parameters.Version },
-                    new NuSpecDependency() { Id = "SkiaSharp", Version = SkiaSharpVersion },
-                    new NuSpecDependency() { Id = "Avalonia", Version = parameters.Version, TargetFramework="netcoreapp2.0" },
-                    new NuSpecDependency() { Id = "SkiaSharp", Version = SkiaSharpVersion, TargetFramework="netcoreapp2.0" },
-                    new NuSpecDependency() { Id = "Avalonia.Skia.Linux.Natives", Version = SkiaSharpLinuxVersion, TargetFramework="netcoreapp2.0" },
-                    new NuSpecDependency() { Id = "Avalonia", Version = parameters.Version, TargetFramework="net461" },
-                    new NuSpecDependency() { Id = "SkiaSharp", Version = SkiaSharpVersion, TargetFramework="net461" },
-                    new NuSpecDependency() { Id = "Avalonia.Skia.Linux.Natives", Version = SkiaSharpLinuxVersion, TargetFramework="net461" }
-                },
-                Files = new []
-                {
-                    new NuSpecContent { Source = "Avalonia.Skia.dll", Target = "lib/netstandard2.0" }
-                },
-                BasePath = context.Directory("./src/Skia/Avalonia.Skia/bin/" + parameters.DirSuffix + "/netstandard2.0"),
-                OutputDirectory = parameters.NugetRoot
-            },
-            new NuGetPackSettings()
-            {
-                Id = "Avalonia.MonoMac",
-                Dependencies = new DependencyBuilder(this)
-                {
-                    new NuSpecDependency() { Id = "Avalonia", Version = parameters.Version }
-                }.Dep("MonoMac.NetStandard").ToArray(),
-                Files = new []
-                {
-                    new NuSpecContent { Source = "netstandard2.0/Avalonia.MonoMac.dll", Target = "lib/netstandard2.0" },
-                },
-                BasePath = context.Directory("./src/OSX/Avalonia.MonoMac/bin/" + parameters.DirSuffix),
-                OutputDirectory = parameters.NugetRoot
-            },
-            ///////////////////////////////////////////////////////////////////////////////
-            // Avalonia.Desktop
-            ///////////////////////////////////////////////////////////////////////////////
-            new NuGetPackSettings()
-            {
-                Id = "Avalonia.Desktop",
-                Dependencies = new []
-                {
-                    new NuSpecDependency() { Id = "Avalonia.Direct2D1", Version = parameters.Version },
-                    new NuSpecDependency() { Id = "Avalonia.Win32", Version = parameters.Version },
-                    new NuSpecDependency() { Id = "Avalonia.Skia", Version = parameters.Version },
-                    new NuSpecDependency() { Id = "Avalonia.Gtk3", Version = parameters.Version },
-                    new NuSpecDependency() { Id = "Avalonia.MonoMac", Version = parameters.Version }
-                },
-                Files = new NuSpecContent[]
-                {
-                    new NuSpecContent { Source = "licence.md", Target = "" }
-                },
-                BasePath = context.Directory("./"),
-                OutputDirectory = parameters.NugetRoot
-            },
-            ///////////////////////////////////////////////////////////////////////////////
-            // Avalonia.LinuxFramebuffer
-            ///////////////////////////////////////////////////////////////////////////////
-            new NuGetPackSettings()
-            {
-                Id = "Avalonia.LinuxFramebuffer",
-                Dependencies = new []
-                {
-                    new NuSpecDependency() { Id = "Avalonia", Version = parameters.Version },
-                    new NuSpecDependency() { Id = "Avalonia.Skia", Version = parameters.Version }
-                },
-                Files = new []
-                {
-                    new NuSpecContent { Source = "Avalonia.LinuxFramebuffer/bin/" + parameters.DirSuffix + "/netstandard2.0/Avalonia.LinuxFramebuffer.dll", Target = "lib/netstandard2.0" }
-                },
-                BasePath = context.Directory("./src/Linux/"),
-                OutputDirectory = parameters.NugetRoot
-            }
-        };
-
-        var nuspecNuGetSettingInterop = new NuGetPackSettings()
-        {
-            Id = "Avalonia.Win32.Interoperability",
-            Dependencies = new []
-            {
-                new NuSpecDependency() { Id = "Avalonia.Win32", Version = parameters.Version },
-                new NuSpecDependency() { Id = "Avalonia.Direct2D1", Version = parameters.Version },
-                new NuSpecDependency() { Id = "SharpDX.Direct3D9", Version = SharpDXDirect3D9Version },
-            },
-            Files = new []
-            {
-                new NuSpecContent { Source = "Avalonia.Win32.Interop/bin/" + parameters.DirSuffix + "/net461/Avalonia.Win32.Interop.dll", Target = "lib/net461" }
-            },
-            BasePath = context.Directory("./src/Windows"),
-            OutputDirectory = parameters.NugetRoot
-        };
-
-        NuspecNuGetSettings = new List<NuGetPackSettings>();
-
-        NuspecNuGetSettings.AddRange(nuspecNuGetSettingsCore);
-        NuspecNuGetSettings.AddRange(nuspecNuGetSettingsDesktop);
-
-        if (parameters.IsRunningOnWindows) {
-            NuspecNuGetSettings.Add(nuspecNuGetSettingInterop);
-            NuspecNuGetSettings.AddRange(nuspecNuGetSettingsMobile);
-        }
-
-        NuspecNuGetSettings.ForEach((nuspec) => SetNuGetNuspecCommonProperties(nuspec));
-
-        NugetPackages = NuspecNuGetSettings.Select(nuspec => {
-            return nuspec.OutputDirectory.CombineWithFilePath(string.Concat(nuspec.Id, ".", nuspec.Version, ".nupkg"));
-        }).ToArray();
-
-        BinFiles = NuspecNuGetSettings.SelectMany(nuspec => {
-            return nuspec.Files.Select(file => {
-                return ((DirectoryPath)nuspec.BasePath).CombineWithFilePath(file.Source);
-            });
-        }).GroupBy(f => f.FullPath).Select(g => g.First()).ToArray();
-    }
-}

+ 41 - 0
packages/Avalonia/Avalonia.csproj

@@ -0,0 +1,41 @@
+<Project Sdk="AggregatePackage.NuGet.Sdk">
+  <PropertyGroup>
+      <TargetFrameworks>netstandard2.0;net461;netcoreapp2.0</TargetFrameworks>
+  </PropertyGroup>
+
+  <ItemGroup>
+      <ProjectReference Include="../../src/Avalonia.Remote.Protocol/Avalonia.Remote.Protocol.csproj" EmbedReference="false" />
+  </ItemGroup>
+
+  <PropertyGroup>
+      <DesignerHostAppPath>../../src/tools</DesignerHostAppPath>
+  </PropertyGroup>
+
+  <Target Name="AddDesignerHostAppsToPackage" BeforeTargets="GenerateNuspec">
+    <MSBuild Projects="$(DesignerHostAppPath)/Avalonia.Designer.HostApp/Avalonia.Designer.HostApp.csproj"
+             Properties="Configuration=$(Configuration);
+                         Platform=$(Platform)" />
+
+    <ItemGroup>
+      <_PackageFiles Include="$(DesignerHostAppPath)/Avalonia.Designer.HostApp/bin/$(Configuration)/netcoreapp2.0/Avalonia.Designer.HostApp.dll">
+        <PackagePath>tools/netcoreapp2.0/designer</PackagePath>
+        <Visible>false</Visible>
+        <BuildAction>None</BuildAction>
+      </_PackageFiles>
+      <_PackageFiles Include="$(DesignerHostAppPath)/Avalonia.Designer.HostApp/bin/$(Configuration)/net461/Avalonia.Designer.HostApp.exe">
+        <PackagePath>tools/net461/designer</PackagePath>
+        <Visible>false</Visible>
+        <BuildAction>None</BuildAction>
+      </_PackageFiles>
+      <_PackageFiles Include="Avalonia.props">
+        <PackagePath>build/Avalonia.props</PackagePath>
+        <Visible>false</Visible>
+        <BuildAction>None</BuildAction>
+      </_PackageFiles>
+    </ItemGroup>
+  </Target>
+
+  <Import Project="..\..\build\SharedVersion.props" />
+  <Import Project="..\..\build\NetFX.props" />
+  <Import Project="..\..\build\CoreLibraries.props" />
+</Project>

+ 6 - 0
packages/Avalonia/Avalonia.props

@@ -0,0 +1,6 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <AvaloniaPreviewerNetCoreToolPath>$(MSBuildThisFileDirectory)\..\tools\netcoreapp2.0\designer\Avalonia.Designer.HostApp.dll</AvaloniaPreviewerNetCoreToolPath>
+    <AvaloniaPreviewerNetFullToolPath>$(MSBuildThisFileDirectory)\..\tools\net461\designer\Avalonia.Designer.HostApp.exe</AvaloniaPreviewerNetFullToolPath>
+  </PropertyGroup>
+</Project>

+ 24 - 3
parameters.cake

@@ -9,23 +9,28 @@ public class Parameters
     public string MasterBranch { get; private set; }
     public string ReleasePlatform { get; private set; }
     public string ReleaseConfiguration { get; private set; }
+    public string ReleaseBranchPrefix { get; private set; }
     public string MSBuildSolution { get; private set; }
     public bool IsLocalBuild { get; private set; }
     public bool IsRunningOnUnix { get; private set; }
     public bool IsRunningOnWindows { get; private set; }
     public bool IsRunningOnAppVeyor { get; private set; }
+    public bool IsRunningOnAzure { get; private set; }
     public bool IsPullRequest { get; private set; }
     public bool IsMainRepo { get; private set; }
     public bool IsMasterBranch { get; private set; }
+    public bool IsReleaseBranch { get; private set; }
     public bool IsTagged { get; private set; }
     public bool IsReleasable { get; private set; }
     public bool IsMyGetRelease { get; private set; }
     public bool IsNuGetRelease { get; private set; }
+    public bool PublishTestResults { get; private set; }
     public string Version { get; private set; } 
     public DirectoryPath ArtifactsDir { get; private set; }
     public DirectoryPath NugetRoot { get; private set; }
     public DirectoryPath ZipRoot { get; private set; }
     public DirectoryPath BinRoot { get; private set; }
+    public DirectoryPath TestResultsRoot { get; private set; }
     public string DirSuffix { get; private set; }
     public DirectoryPathCollection BuildDirs { get; private set; }
     public string FileZipSuffix { get; private set; }
@@ -43,8 +48,9 @@ public class Parameters
         SkipTests = context.HasArgument("skip-tests");
 
         // CONFIGURATION
-        MainRepo = "AvaloniaUI/Avalonia";
+        MainRepo = "https://github.com/AvaloniaUI/Avalonia";
         MasterBranch = "master";
+        ReleaseBranchPrefix = "refs/heads/release/";
         ReleaseConfiguration = "Release";
         MSBuildSolution = "./dirs.proj";
 
@@ -53,13 +59,17 @@ public class Parameters
         IsRunningOnUnix = context.IsRunningOnUnix();
         IsRunningOnWindows = context.IsRunningOnWindows();
         IsRunningOnAppVeyor = buildSystem.AppVeyor.IsRunningOnAppVeyor;
+        IsRunningOnAzure = buildSystem.IsRunningOnVSTS || buildSystem.IsRunningOnTFS || context.EnvironmentVariable("LOGNAME") == "vsts";
+        
         IsPullRequest = buildSystem.AppVeyor.Environment.PullRequest.IsPullRequest;
-        IsMainRepo = StringComparer.OrdinalIgnoreCase.Equals(MainRepo, buildSystem.AppVeyor.Environment.Repository.Name);
-        IsMasterBranch = StringComparer.OrdinalIgnoreCase.Equals(MasterBranch, buildSystem.AppVeyor.Environment.Repository.Branch);
+        IsMainRepo = StringComparer.OrdinalIgnoreCase.Equals(MainRepo, context.EnvironmentVariable("BUILD_REPOSITORY_URI"));
+        IsMasterBranch = StringComparer.OrdinalIgnoreCase.Equals(MasterBranch, context.EnvironmentVariable("BUILD_SOURCEBRANCHNAME"));
+        IsReleaseBranch = (context.EnvironmentVariable("BUILD_SOURCEBRANCH")??"").StartsWith(ReleaseBranchPrefix, StringComparison.OrdinalIgnoreCase);
         IsTagged = buildSystem.AppVeyor.Environment.Repository.Tag.IsTag 
                 && !string.IsNullOrWhiteSpace(buildSystem.AppVeyor.Environment.Repository.Tag.Name);
         IsReleasable = StringComparer.OrdinalIgnoreCase.Equals(ReleaseConfiguration, Configuration);
         IsMyGetRelease = !IsTagged && IsReleasable;
+        IsNuGetRelease = IsMainRepo && IsReleasable && IsReleaseBranch;
 
         // VERSION
         Version = context.Argument("force-nuget-version", GetVersion());
@@ -85,12 +95,23 @@ public class Parameters
                 Version += "-build" + context.EnvironmentVariable("APPVEYOR_BUILD_NUMBER") + "-beta";
             }
         }
+        else if (IsRunningOnAzure)
+        {
+            if(!IsNuGetRelease)
+            {
+                // Use AssemblyVersion with Build as version
+                Version += "-build" + context.EnvironmentVariable("BUILD_BUILDID") + "-beta";
+            }
+
+            PublishTestResults = true; 
+        }
 
         // DIRECTORIES
         ArtifactsDir = (DirectoryPath)context.Directory("./artifacts");
         NugetRoot = ArtifactsDir.Combine("nuget");
         ZipRoot = ArtifactsDir.Combine("zip");
         BinRoot = ArtifactsDir.Combine("bin");
+        TestResultsRoot = ArtifactsDir.Combine("test-results");
         BuildDirs = context.GetDirectories("**/bin") + context.GetDirectories("**/obj");
         DirSuffix = Configuration;
         FileZipSuffix = Version + ".zip";

+ 2 - 2
readme.md

@@ -2,9 +2,9 @@
 
 # Avalonia
 
-| Gitter Chat | Windows Build Status | Linux/Mac Build Status | Open Collective |
+| Gitter Chat | Build Status (Win, Linux, OSX) | Appveyor Build Status | Open Collective |
 |---|---|---|---|
-|  [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/AvaloniaUI/Avalonia?utm_campaign=pr-badge&utm_content=badge&utm_medium=badge&utm_source=badge) | [![Build status](https://ci.appveyor.com/api/projects/status/hubk3k0w9idyibfg/branch/master?svg=true)](https://ci.appveyor.com/project/AvaloniaUI/Avalonia/branch/master) | [![Build Status](https://travis-ci.org/AvaloniaUI/Avalonia.svg?branch=master)](https://travis-ci.org/AvaloniaUI/Avalonia) | [![Backers on Open Collective](https://opencollective.com/Avalonia/backers/badge.svg)](#backers) [![Sponsors on Open Collective](https://opencollective.com/Avalonia/sponsors/badge.svg)](#sponsors) |
+|  [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/AvaloniaUI/Avalonia?utm_campaign=pr-badge&utm_content=badge&utm_medium=badge&utm_source=badge) | [![Build Status](https://dev.azure.com/AvaloniaUI/AvaloniaUI/_apis/build/status/AvaloniaUI.Avalonia)](https://dev.azure.com/AvaloniaUI/AvaloniaUI/_build/latest?definitionId=4) | [![Build status](https://ci.appveyor.com/api/projects/status/hubk3k0w9idyibfg/branch/master?svg=true)](https://ci.appveyor.com/project/AvaloniaUI/Avalonia/branch/master) | [![Backers on Open Collective](https://opencollective.com/Avalonia/backers/badge.svg)](#backers) [![Sponsors on Open Collective](https://opencollective.com/Avalonia/sponsors/badge.svg)](#sponsors) |
 
 ## About
 

+ 0 - 22
samples/BindingDemo/App.config

@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<configuration>
-    <startup> 
-        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7"/>
-    </startup>
-  <runtime>
-    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
-      <dependentAssembly>
-        <assemblyIdentity name="SharpDX" publicKeyToken="b4dcf0f35e5521f1" culture="neutral"/>
-        <bindingRedirect oldVersion="0.0.0.0-3.1.1.0" newVersion="3.1.1.0"/>
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="SharpDX.DXGI" publicKeyToken="b4dcf0f35e5521f1" culture="neutral"/>
-        <bindingRedirect oldVersion="0.0.0.0-3.1.1.0" newVersion="3.1.1.0"/>
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="Mono.Cairo" publicKeyToken="0738eb9f132ed756" culture="neutral"/>
-        <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0"/>
-      </dependentAssembly>
-    </assemblyBinding>
-  </runtime>
-</configuration>

+ 1 - 19
samples/BindingDemo/BindingDemo.csproj

@@ -4,27 +4,8 @@
     <TargetFrameworks>netcoreapp2.0;net461</TargetFrameworks>
   </PropertyGroup>
   <ItemGroup>
-    <ProjectReference Include="..\..\src\Avalonia.DesignerSupport\Avalonia.DesignerSupport.csproj" />
-    
-    <ProjectReference Condition="'$(TargetFramework)'=='netcoreapp2.0'" Include="..\..\src\Avalonia.DotNetCoreRuntime\Avalonia.DotNetCoreRuntime.csproj" />
-                      
-    <ProjectReference Condition="'$(TargetFramework)'=='net461'" Include="..\..\src\Avalonia.DotNetFrameworkRuntime\Avalonia.DotNetFrameworkRuntime.csproj" />
-
     <ProjectReference Include="..\..\src\Linux\Avalonia.LinuxFramebuffer\Avalonia.LinuxFramebuffer.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Base\Avalonia.Base.csproj" />
-    <ProjectReference Include="..\..\src\Markup\Avalonia.Markup.Xaml\Avalonia.Markup.Xaml.csproj" />
-    <ProjectReference Include="..\..\src\Markup\Avalonia.Markup\Avalonia.Markup.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Animation\Avalonia.Animation.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Controls\Avalonia.Controls.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Diagnostics\Avalonia.Diagnostics.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Input\Avalonia.Input.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Interactivity\Avalonia.Interactivity.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Layout\Avalonia.Layout.csproj" />
     <ProjectReference Include="..\..\src\Avalonia.ReactiveUI\Avalonia.ReactiveUI.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Visuals\Avalonia.Visuals.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Styling\Avalonia.Styling.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Themes.Default\Avalonia.Themes.Default.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Logging.Serilog\Avalonia.Logging.Serilog.csproj" />
   </ItemGroup>
   <Import Project="..\..\build\SampleApp.props" />
   <Import Project="..\..\build\EmbedXaml.props" />
@@ -32,4 +13,5 @@
   <Import Project="..\..\build\Rx.props" />
   <Import Project="..\..\build\ReactiveUI.props" />
   <Import Condition="'$(TargetFramework)'=='net461'" Project="..\..\build\NetFX.props" />
+  <Import Project="..\..\build\ReferenceCoreLibraries.props" />
 </Project>

+ 1 - 0
samples/ControlCatalog.Android/ControlCatalog.Android.csproj

@@ -155,4 +155,5 @@
   <Import Project="..\..\build\Rx.props" />
   <Import Project="$(MSBuildExtensionsPath)\Xamarin\Android\Xamarin.Android.CSharp.targets" />
   <Import Project="..\..\build\AndroidWorkarounds.props" />
+  <Import Project="..\..\build\LegacyProject.targets" />
 </Project>

+ 0 - 22
samples/ControlCatalog.Desktop/App.config

@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<configuration>
-    <startup> 
-        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7"/>
-    </startup>
-  <runtime>
-    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
-      <dependentAssembly>
-        <assemblyIdentity name="Mono.Cairo" publicKeyToken="0738eb9f132ed756" culture="neutral"/>
-        <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0"/>
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="SharpDX" publicKeyToken="b4dcf0f35e5521f1" culture="neutral"/>
-        <bindingRedirect oldVersion="0.0.0.0-3.1.1.0" newVersion="3.1.1.0"/>
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="SharpDX.DXGI" publicKeyToken="b4dcf0f35e5521f1" culture="neutral"/>
-        <bindingRedirect oldVersion="0.0.0.0-3.1.1.0" newVersion="3.1.1.0"/>
-      </dependentAssembly>
-    </assemblyBinding>
-  </runtime>
-</configuration>

+ 0 - 7
samples/ControlCatalog.Desktop/ControlCatalog.Desktop.csproj

@@ -6,16 +6,9 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <ProjectReference Include="..\..\src\Avalonia.DesignerSupport\Avalonia.DesignerSupport.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.DotNetFrameworkRuntime\Avalonia.DotNetFrameworkRuntime.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Logging.Serilog\Avalonia.Logging.Serilog.csproj" />
     <ProjectReference Include="..\ControlCatalog\ControlCatalog.csproj" />
   </ItemGroup>
 
-  <ItemGroup>
-    <Folder Include="Properties\" />
-  </ItemGroup>
-
   <Import Project="..\..\build\SampleApp.props" />
   <Import Project="..\..\build\Serilog.props" />
   <Import Project="..\..\build\NetFX.props" />

+ 5 - 1
samples/ControlCatalog.NetCore/ControlCatalog.NetCore.csproj

@@ -11,6 +11,10 @@
     <ProjectReference Include="..\..\src\Avalonia.X11\Avalonia.X11.csproj" />
     <ProjectReference Include="..\..\src\Linux\Avalonia.LinuxFramebuffer\Avalonia.LinuxFramebuffer.csproj" />
     <ProjectReference Include="..\ControlCatalog\ControlCatalog.csproj" />
+    <ProjectReference Include="..\..\src\Avalonia.Desktop\Avalonia.Desktop.csproj" />
   </ItemGroup>
 
-</Project>
+
+  <Import Project="..\..\build\SampleApp.props" />
+  <Import Project="..\..\build\ReferenceCoreLibraries.props" />
+</Project>

+ 1 - 0
samples/ControlCatalog.iOS/ControlCatalog.iOS.csproj

@@ -176,4 +176,5 @@
   </ItemGroup>
   <Import Project="$(MSBuildExtensionsPath)\Xamarin\iOS\Xamarin.iOS.CSharp.targets" />
   <Import Project="..\..\build\iOSWorkarounds.props" />
+  <Import Project="..\..\build\LegacyProject.targets" />
 </Project>

+ 0 - 22
samples/ControlCatalog/App.config

@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<configuration>
-    <startup> 
-        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
-    </startup>
-  <runtime>
-    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
-      <dependentAssembly>
-        <assemblyIdentity name="Mono.Cairo" publicKeyToken="0738eb9f132ed756" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="SharpDX" publicKeyToken="b4dcf0f35e5521f1" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-3.0.2.0" newVersion="3.0.2.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="SharpDX.DXGI" publicKeyToken="b4dcf0f35e5521f1" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-3.0.2.0" newVersion="3.0.2.0" />
-      </dependentAssembly>
-    </assemblyBinding>
-  </runtime>
-</configuration>

+ 6 - 13
samples/ControlCatalog/App.xaml

@@ -2,23 +2,16 @@
   <Application.Styles>
     <StyleInclude Source="resm:Avalonia.Themes.Default.DefaultTheme.xaml?assembly=Avalonia.Themes.Default"/>
     <StyleInclude Source="resm:Avalonia.Themes.Default.Accents.BaseLight.xaml?assembly=Avalonia.Themes.Default"/>
-
     <Style Selector="TextBlock.h1">
-      <Setter Property="Foreground" Value="#212121"/>
-      <Setter Property="FontSize" Value="20"/>
+      <Setter Property="FontSize" Value="{DynamicResource FontSizeLarge}"/>
       <Setter Property="FontWeight" Value="Medium"/>
     </Style>
-
     <Style Selector="TextBlock.h2">
-      <Setter Property="Foreground" Value="#727272"/>
-      <Setter Property="FontSize" Value="13"/>
+      <Setter Property="FontSize" Value="{DynamicResource FontSizeNormal}"/>
     </Style>
-
-      <Style Selector="TextBlock.h3">
-          <Setter Property="Foreground" Value="#a2a2a2"/>
-          <Setter Property="FontSize" Value="13"/>
-      </Style>
-
-      <StyleInclude Source="resm:ControlCatalog.SideBar.xaml"/>
+    <Style Selector="TextBlock.h3">
+      <Setter Property="FontSize" Value="{DynamicResource FontSizeSmall}"/>
+    </Style>
+    <StyleInclude Source="resm:ControlCatalog.SideBar.xaml"/>
   </Application.Styles>
 </Application>

+ 1 - 12
samples/ControlCatalog/ControlCatalog.csproj

@@ -19,19 +19,8 @@
   </ItemGroup>
 
   <ItemGroup>
-    <ProjectReference Include="..\..\src\Markup\Avalonia.Markup.Xaml\Avalonia.Markup.Xaml.csproj" />
-    <ProjectReference Include="..\..\src\Markup\Avalonia.Markup\Avalonia.Markup.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Animation\Avalonia.Animation.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Base\Avalonia.Base.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Controls\Avalonia.Controls.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Diagnostics\Avalonia.Diagnostics.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Input\Avalonia.Input.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Interactivity\Avalonia.Interactivity.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Layout\Avalonia.Layout.csproj" />
+    <ProjectReference Include="..\..\packages\Avalonia\Avalonia.csproj" />
     <ProjectReference Include="..\..\src\Avalonia.ReactiveUI\Avalonia.ReactiveUI.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Visuals\Avalonia.Visuals.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Styling\Avalonia.Styling.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Themes.Default\Avalonia.Themes.Default.csproj" />
   </ItemGroup>
   
   <Import Project="..\..\build\Serilog.props" />

+ 1 - 1
samples/ControlCatalog/Pages/ButtonPage.xaml

@@ -18,7 +18,7 @@
             <Style>
               <Style.Resources>
                 <SolidColorBrush x:Key="ThemeBorderMidBrush">Red</SolidColorBrush>
-                <SolidColorBrush x:Key="ThemeControlDarkBrush">DarkRed</SolidColorBrush>
+                <SolidColorBrush x:Key="ThemeControlHighBrush">DarkRed</SolidColorBrush>
               </Style.Resources>
             </Style>
           </Button.Styles>          

+ 1 - 1
samples/ControlCatalog/Pages/LayoutTransformControlPage.xaml

@@ -19,7 +19,7 @@
         <LayoutTransformControl.LayoutTransform>
           <RotateTransform Angle="{Binding #rotation.Value}"/>
         </LayoutTransformControl.LayoutTransform>
-        <TextBlock>Layout Transform</TextBlock>
+          <Button Background="White">Layout Transform</Button>
       </LayoutTransformControl>
     </Grid>
   </DockPanel>

+ 4 - 1
samples/Directory.Build.props

@@ -1,3 +1,6 @@
 <Project>
+  <PropertyGroup>
+      <IsPackable>false</IsPackable>
+  </PropertyGroup>
   <Import Project="..\build\SharedVersion.props" />
-</Project>
+</Project>

+ 4 - 14
samples/Previewer/Previewer.csproj

@@ -8,19 +8,9 @@
       <DependentUpon>%(Filename)</DependentUpon>
     </Compile>
     <EmbeddedResource Include="**\*.xaml" />
-    <ProjectReference Include="..\..\src\Avalonia.DotNetCoreRuntime\Avalonia.DotNetCoreRuntime.csproj" />
-    <ProjectReference Include="..\..\src\Markup\Avalonia.Markup.Xaml\Avalonia.Markup.Xaml.csproj" />
-    <ProjectReference Include="..\..\src\Markup\Avalonia.Markup\Avalonia.Markup.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Animation\Avalonia.Animation.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Base\Avalonia.Base.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Controls\Avalonia.Controls.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Diagnostics\Avalonia.Diagnostics.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Input\Avalonia.Input.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Interactivity\Avalonia.Interactivity.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Layout\Avalonia.Layout.csproj" />
     <ProjectReference Include="..\..\src\Avalonia.ReactiveUI\Avalonia.ReactiveUI.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Visuals\Avalonia.Visuals.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Styling\Avalonia.Styling.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Themes.Default\Avalonia.Themes.Default.csproj" />
   </ItemGroup>
-</Project>
+  
+  <Import Project="..\..\build\SampleApp.props" />
+  <Import Project="..\..\build\ReferenceCoreLibraries.props" />
+</Project>

+ 2 - 13
samples/RemoteDemo/RemoteDemo.csproj

@@ -6,20 +6,9 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <ProjectReference Include="..\..\src\Avalonia.Animation\Avalonia.Animation.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Base\Avalonia.Base.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Controls\Avalonia.Controls.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.DesignerSupport\Avalonia.DesignerSupport.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.DotNetCoreRuntime\Avalonia.DotNetCoreRuntime.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Input\Avalonia.Input.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Interactivity\Avalonia.Interactivity.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Layout\Avalonia.Layout.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Styling\Avalonia.Styling.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Themes.Default\Avalonia.Themes.Default.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Visuals\Avalonia.Visuals.csproj" />
-    <ProjectReference Include="..\..\src\Markup\Avalonia.Markup.Xaml\Avalonia.Markup.Xaml.csproj" />
-    <ProjectReference Include="..\..\src\Markup\Avalonia.Markup\Avalonia.Markup.csproj" />
     <ProjectReference Include="..\ControlCatalog\ControlCatalog.csproj" />
   </ItemGroup>
+  <Import Project="..\..\build\SampleApp.props" />
+  <Import Project="..\..\build\ReferenceCoreLibraries.props" />
 
 </Project>

+ 12 - 6
samples/RenderDemo/MainWindow.xaml

@@ -8,12 +8,13 @@
       <MenuItem Header="Rendering">
         <MenuItem Header="Draw Dirty Rects" Command="{Binding ToggleDrawDirtyRects}">
           <MenuItem.Icon>
-            <CheckBox BorderThickness="0" 
+            <CheckBox BorderThickness="0"
                       IsHitTestVisible="False"
                       IsChecked="{Binding DrawDirtyRects}"/>
           </MenuItem.Icon>
         </MenuItem>
-        <MenuItem Header="Draw FPS" Command="{Binding ToggleDrawFps}">
+        <MenuItem Header="Draw FPS"
+                  Command="{Binding ToggleDrawFps}">
           <MenuItem.Icon>
             <CheckBox BorderThickness="0"
                       IsHitTestVisible="False"
@@ -22,14 +23,19 @@
         </MenuItem>
       </MenuItem>
     </Menu>
-    
     <TabControl Classes="sidebar">
       <TabControl.PageTransition>
         <CrossFade Duration="0.25"/>
       </TabControl.PageTransition>
-      <TabItem Header="Animations"><pages:AnimationsPage/></TabItem>
-      <TabItem Header="Clipping"><pages:ClippingPage/></TabItem>
-      <TabItem Header="Drawing"><pages:DrawingPage/></TabItem>
+      <TabItem Header="Animations">
+        <pages:AnimationsPage/>
+      </TabItem>
+      <TabItem Header="Clipping">
+        <pages:ClippingPage/>
+      </TabItem>
+      <TabItem Header="Drawing">
+        <pages:DrawingPage/>
+      </TabItem>
     </TabControl>
   </DockPanel>
 </Window>

+ 14 - 14
samples/RenderDemo/Pages/AnimationsPage.xaml

@@ -1,12 +1,12 @@
-<UserControl 
-  xmlns="https://github.com/avaloniaui" 
-  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
+<UserControl
+xmlns="https://github.com/avaloniaui"
+xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
   <UserControl.Styles>
     <Styles>
       <Styles.Resources>
         <Template x:Key="Acorn">
-          <Path Fill="White" Stretch="Uniform" 
-          Data="F1 M 16.6309,18.6563C 17.1309,
+          <Path Fill="White" Stretch="Uniform"
+                Data="F1 M 16.6309,18.6563C 17.1309,
                 8.15625 29.8809,14.1563 29.8809,
                 14.1563C 30.8809,11.1563 34.1308,
                 11.4063 34.1308,11.4063C 33.5,12 
@@ -42,17 +42,17 @@
       </Style>
       <Style Selector="Border.Rect1:pointerover">
         <Style.Animations>
-          <Animation Duration="0:0:2.5" 
-                     RepeatCount="4" 
+          <Animation Duration="0:0:2.5"
+                     RepeatCount="4"
                      FillMode="None"
-                     PlaybackDirection="AlternateReverse" 
+                     PlaybackDirection="AlternateReverse"
                      Easing="SineEaseInOut">
             <KeyFrame Cue="20%">
               <Setter Property="RotateTransform.Angle" Value="45"/>
-             </KeyFrame>
+            </KeyFrame>
             <KeyFrame Cue="50%">
               <Setter Property="ScaleTransform.ScaleX" Value="1.5"/>
-             </KeyFrame>
+            </KeyFrame>
             <KeyFrame Cue="80%">
               <Setter Property="RotateTransform.Angle" Value="120"/>
             </KeyFrame>
@@ -70,7 +70,6 @@
         </Style.Animations>
       </Style>
       <Style Selector="Border.Rect3">
-        <Setter Property="Child" Value="{StaticResource Heart}"/>
         <Style.Animations>
           <Animation Duration="0:0:0.5"
                      Easing="QuadraticEaseInOut"
@@ -79,12 +78,13 @@
               <Setter Property="ScaleTransform.ScaleX" Value="0.8"/>
               <Setter Property="ScaleTransform.ScaleY" Value="0.8"/>
             </KeyFrame>
-           </Animation>
+          </Animation>
         </Style.Animations>
+        <Setter Property="Child" Value="{StaticResource Heart}"/>
       </Style>
       <Style Selector="Border.Rect4:pointerover">
         <Style.Animations>
-          <Animation Duration="0:0:3" Easing="BounceEaseInOut"> 
+          <Animation Duration="0:0:3" Easing="BounceEaseInOut">
             <KeyFrame Cue="48%">
               <Setter Property="TranslateTransform.Y" Value="-100"/>
             </KeyFrame>
@@ -108,7 +108,7 @@
   <Grid>
     <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center" ClipToBounds="False">
       <StackPanel.Clock>
-          <Clock />
+        <Clock />
       </StackPanel.Clock>
       <StackPanel Orientation="Horizontal" VerticalAlignment="Center">
         <TextBlock VerticalAlignment="Center">Hover to activate Transform Keyframe Animations.</TextBlock>

+ 6 - 6
samples/RenderDemo/Pages/ClippingPage.xaml

@@ -1,5 +1,5 @@
-<UserControl 
-  xmlns="https://github.com/avaloniaui">
+<UserControl
+xmlns="https://github.com/avaloniaui">
   <Grid ColumnDefinitions="Auto" RowDefinitions="Auto,Auto">
     <Grid.Styles>
       <Styles>
@@ -17,7 +17,7 @@
         </Style>
       </Styles>
     </Grid.Styles>
-    <Border Name="clipped" 
+    <Border Name="clipped"
             Background="Yellow"
             Width="100"
             Height="100"
@@ -44,9 +44,9 @@
       <Border Name="clipChild" Background="{DynamicResource ThemeAccentBrush}" Margin="4">
         <!-- Setting opacity puts the TextBox on a new layer -->
         <TextBox Text="Avalonia" Opacity="0.9" VerticalAlignment="Center"/>
-          <Border.RenderTransform>
-            <RotateTransform/>
-          </Border.RenderTransform>
+        <Border.RenderTransform>
+          <RotateTransform/>
+        </Border.RenderTransform>
       </Border>
     </Border>
     <CheckBox Name="useMask" IsChecked="True" Grid.Row="1">Apply Geometry Clip</CheckBox>

+ 2 - 2
samples/RenderDemo/Pages/DrawingPage.xaml

@@ -98,7 +98,7 @@
         </Border>
 
         <!-- For comparison -->
-        
+
         <Ellipse Grid.Row="2"
                  Grid.Column="0"
                  Width="100"
@@ -127,6 +127,6 @@
                  Stretch="UniformToFill"
                  Fill="Blue"
                  Margin="5" />
-        
+
     </Grid>
 </UserControl>

+ 1 - 19
samples/RenderDemo/RenderDemo.csproj

@@ -4,27 +4,8 @@
     <TargetFrameworks>netcoreapp2.0;net461</TargetFrameworks>
   </PropertyGroup>
   <ItemGroup>
-    <ProjectReference Include="..\..\src\Avalonia.DesignerSupport\Avalonia.DesignerSupport.csproj" />
-    
-    <ProjectReference Condition="'$(TargetFramework)'=='netcoreapp2.0'" Include="..\..\src\Avalonia.DotNetCoreRuntime\Avalonia.DotNetCoreRuntime.csproj" />
-                      
-    <ProjectReference Condition="'$(TargetFramework)'=='net461'" Include="..\..\src\Avalonia.DotNetFrameworkRuntime\Avalonia.DotNetFrameworkRuntime.csproj" />
-
     <ProjectReference Include="..\..\src\Linux\Avalonia.LinuxFramebuffer\Avalonia.LinuxFramebuffer.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Base\Avalonia.Base.csproj" />
-    <ProjectReference Include="..\..\src\Markup\Avalonia.Markup.Xaml\Avalonia.Markup.Xaml.csproj" />
-    <ProjectReference Include="..\..\src\Markup\Avalonia.Markup\Avalonia.Markup.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Animation\Avalonia.Animation.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Controls\Avalonia.Controls.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Diagnostics\Avalonia.Diagnostics.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Input\Avalonia.Input.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Interactivity\Avalonia.Interactivity.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Layout\Avalonia.Layout.csproj" />
     <ProjectReference Include="..\..\src\Avalonia.ReactiveUI\Avalonia.ReactiveUI.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Visuals\Avalonia.Visuals.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Styling\Avalonia.Styling.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Themes.Default\Avalonia.Themes.Default.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Logging.Serilog\Avalonia.Logging.Serilog.csproj" />
   </ItemGroup>
   <Import Project="..\..\build\SampleApp.props" />
   <Import Project="..\..\build\EmbedXaml.props" />
@@ -32,4 +13,5 @@
   <Import Project="..\..\build\Rx.props" />
   <Import Project="..\..\build\ReactiveUI.props" />
   <Import Condition="'$(TargetFramework)'=='net461'" Project="..\..\build\NetFX.props" />
+  <Import Project="..\..\build\ReferenceCoreLibraries.props" />
 </Project>

+ 0 - 22
samples/VirtualizationDemo/App.config

@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<configuration>
-    <startup> 
-        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7"/>
-    </startup>
-  <runtime>
-    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
-      <dependentAssembly>
-        <assemblyIdentity name="Mono.Cairo" publicKeyToken="0738eb9f132ed756" culture="neutral"/>
-        <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0"/>
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="SharpDX" publicKeyToken="b4dcf0f35e5521f1" culture="neutral"/>
-        <bindingRedirect oldVersion="0.0.0.0-3.1.1.0" newVersion="3.1.1.0"/>
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="SharpDX.DXGI" publicKeyToken="b4dcf0f35e5521f1" culture="neutral"/>
-        <bindingRedirect oldVersion="0.0.0.0-3.1.1.0" newVersion="3.1.1.0"/>
-      </dependentAssembly>
-    </assemblyBinding>
-  </runtime>
-</configuration>

+ 1 - 19
samples/VirtualizationDemo/VirtualizationDemo.csproj

@@ -4,27 +4,8 @@
     <TargetFrameworks>netcoreapp2.0;net461</TargetFrameworks>
   </PropertyGroup>
   <ItemGroup>
-    <ProjectReference Include="..\..\src\Avalonia.DesignerSupport\Avalonia.DesignerSupport.csproj" />
-    
-    <ProjectReference Condition="'$(TargetFramework)'=='netcoreapp2.0'" Include="..\..\src\Avalonia.DotNetCoreRuntime\Avalonia.DotNetCoreRuntime.csproj" />
-                      
-    <ProjectReference Condition="'$(TargetFramework)'=='net461'" Include="..\..\src\Avalonia.DotNetFrameworkRuntime\Avalonia.DotNetFrameworkRuntime.csproj" />
-
     <ProjectReference Include="..\..\src\Linux\Avalonia.LinuxFramebuffer\Avalonia.LinuxFramebuffer.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Base\Avalonia.Base.csproj" />
-    <ProjectReference Include="..\..\src\Markup\Avalonia.Markup.Xaml\Avalonia.Markup.Xaml.csproj" />
-    <ProjectReference Include="..\..\src\Markup\Avalonia.Markup\Avalonia.Markup.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Animation\Avalonia.Animation.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Controls\Avalonia.Controls.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Diagnostics\Avalonia.Diagnostics.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Input\Avalonia.Input.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Interactivity\Avalonia.Interactivity.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Layout\Avalonia.Layout.csproj" />
     <ProjectReference Include="..\..\src\Avalonia.ReactiveUI\Avalonia.ReactiveUI.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Visuals\Avalonia.Visuals.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Styling\Avalonia.Styling.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Themes.Default\Avalonia.Themes.Default.csproj" />
-    <ProjectReference Include="..\..\src\Avalonia.Logging.Serilog\Avalonia.Logging.Serilog.csproj" />
   </ItemGroup>
   <Import Project="..\..\build\SampleApp.props" />
   <Import Project="..\..\build\EmbedXaml.props" />
@@ -32,4 +13,5 @@
   <Import Project="..\..\build\Rx.props" />
   <Import Project="..\..\build\ReactiveUI.props" />
   <Import Condition="'$(TargetFramework)'=='net461'" Project="..\..\build\NetFX.props" />
+  <Import Project="..\..\build\ReferenceCoreLibraries.props" />
 </Project>

+ 2 - 4
samples/interop/Direct3DInteropSample/Direct3DInteropSample.csproj

@@ -22,13 +22,11 @@
       </EmbeddedResource>
     </ItemGroup>
     <ItemGroup>
-        <ProjectReference Include="..\..\..\src\Avalonia.DesignerSupport\Avalonia.DesignerSupport.csproj" />
-        <ProjectReference Include="..\..\..\src\Avalonia.DotNetFrameworkRuntime\Avalonia.DotNetFrameworkRuntime.csproj" />
         <ProjectReference Include="..\..\..\src\Avalonia.ReactiveUI\Avalonia.ReactiveUI.csproj" />
-        <ProjectReference Include="..\..\..\src\Avalonia.Themes.Default\Avalonia.Themes.Default.csproj" />
         <ProjectReference Include="..\..\..\src\Windows\Avalonia.Direct2D1\Avalonia.Direct2D1.csproj" />
         <ProjectReference Include="..\..\..\src\Windows\Avalonia.Win32\Avalonia.Win32.csproj" />
     </ItemGroup>
     <Import Project="..\..\..\build\Serilog.props" />
     <Import Project="..\..\..\build\Rx.props" />
-</Project>
+    <Import Project="..\..\..\build\ReferenceCoreLibraries.props" />
+</Project>

+ 5 - 4
samples/interop/WindowsInteropTest/WindowsInteropTest.csproj

@@ -112,14 +112,14 @@
       <Project>{799a7bb5-3c2c-48b6-85a7-406a12c420da}</Project>
       <Name>Avalonia.DesignerSupport</Name>
     </ProjectReference>
+    <ProjectReference Include="..\..\..\src\Avalonia.DesktopRuntime\Avalonia.DesktopRuntime.csproj">
+      <Project>{878fefe0-cd14-41cb-90b0-dbcb163e8f15}</Project>
+      <Name>Avalonia.DesktopRuntime</Name>
+    </ProjectReference>
     <ProjectReference Include="..\..\..\src\Avalonia.Diagnostics\Avalonia.Diagnostics.csproj">
       <Project>{7062ae20-5dcc-4442-9645-8195bdece63e}</Project>
       <Name>Avalonia.Diagnostics</Name>
     </ProjectReference>
-    <ProjectReference Include="..\..\..\src\Avalonia.DotNetFrameworkRuntime\Avalonia.DotNetFrameworkRuntime.csproj">
-      <Project>{4a1abb09-9047-4bd5-a4ad-a055e52c5ee0}</Project>
-      <Name>Avalonia.DotNetFrameworkRuntime</Name>
-    </ProjectReference>
     <ProjectReference Include="..\..\..\src\Avalonia.Input\Avalonia.Input.csproj">
       <Project>{62024b2d-53eb-4638-b26b-85eeaa54866e}</Project>
       <Name>Avalonia.Input</Name>
@@ -186,4 +186,5 @@
   <Import Project="..\..\..\build\Rx.props" />
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <Import Project="..\..\..\build\SkiaSharp.props" />
+  <Import Project="..\..\..\build\LegacyProject.targets" />
 </Project>

+ 1 - 8
src/Android/Avalonia.Android/Avalonia.Android.csproj

@@ -4,14 +4,7 @@
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
   </PropertyGroup>
   <ItemGroup>
-    <ProjectReference Include="..\..\Avalonia.Animation\Avalonia.Animation.csproj" />
-    <ProjectReference Include="..\..\Avalonia.Base\Avalonia.Base.csproj" />
-    <ProjectReference Include="..\..\Avalonia.Controls\Avalonia.Controls.csproj" />
-    <ProjectReference Include="..\..\Avalonia.Input\Avalonia.Input.csproj" />
-    <ProjectReference Include="..\..\Avalonia.Interactivity\Avalonia.Interactivity.csproj" />
-    <ProjectReference Include="..\..\Avalonia.Layout\Avalonia.Layout.csproj" />
-    <ProjectReference Include="..\..\Avalonia.Styling\Avalonia.Styling.csproj" />
-    <ProjectReference Include="..\..\Avalonia.Visuals\Avalonia.Visuals.csproj" />
+    <ProjectReference Include="..\..\..\packages\Avalonia\Avalonia.csproj" />
     <ProjectReference Include="..\..\Skia\Avalonia.Skia\Avalonia.Skia.csproj" />
   </ItemGroup>
   <Import Project="..\..\Shared\PlatformSupport\PlatformSupport.projitems" Label="Shared" />

+ 4 - 4
src/Android/Avalonia.Android/Platform/SkiaPlatform/AndroidFramebuffer.cs

@@ -20,9 +20,10 @@ namespace Avalonia.Android.Platform.SkiaPlatform
             ANativeWindow_Buffer buffer;
             var rc = new ARect()
             {
-                right = Width = ANativeWindow_getWidth(_window),
-                bottom = Height = ANativeWindow_getHeight(_window)
+                right = ANativeWindow_getWidth(_window),
+                bottom = ANativeWindow_getHeight(_window)
             };
+            Size = new PixelSize(rc.right, rc.bottom);
             ANativeWindow_lock(_window, out buffer, ref rc);
 
             Format = buffer.format == AndroidPixelFormat.WINDOW_FORMAT_RGB_565
@@ -41,8 +42,7 @@ namespace Avalonia.Android.Platform.SkiaPlatform
         }
 
         public IntPtr Address { get; set; }
-        public int Width { get; }
-        public int Height { get; }
+        public PixelSize Size { get; }
         public int RowBytes { get; }
         public Vector Dpi { get; } = new Vector(96, 96);
         public PixelFormat Format { get; }

+ 1 - 0
src/Android/Avalonia.AndroidTestApplication/Avalonia.AndroidTestApplication.csproj

@@ -153,4 +153,5 @@
   <Import Project="..\..\..\build\Rx.props" />
   <Import Project="..\..\..\build\System.Memory.props" />
   <Import Project="..\..\..\build\AndroidWorkarounds.props" />
+  <Import Project="..\..\..\build\LegacyProject.targets" />
 </Project>

+ 31 - 17
src/Avalonia.Animation/AnimationInstance`1.cs

@@ -72,10 +72,13 @@ namespace Avalonia.Animation
             _onCompleteAction = OnComplete;
             _interpolator = Interpolator;
             _baseClock = baseClock;
-        }
+          }
 
         protected override void Unsubscribed()
         {
+            //Animation may have been stopped before it has finished
+            ApplyFinalFill();
+
             _timerSubscription?.Dispose();
             _clock.PlayState = PlayState.Stop;
         }
@@ -98,11 +101,15 @@ namespace Avalonia.Animation
             }
         }
 
-        private void DoComplete()
+        private void ApplyFinalFill()
         {
             if (_fillMode == FillMode.Forward || _fillMode == FillMode.Both)
                 _targetControl.SetValue(_parent.Property, _lastInterpValue, BindingPriority.LocalValue);
+        }
 
+        private void DoComplete()
+        {
+            ApplyFinalFill();
             _onCompleteAction?.Invoke();
             PublishCompleted();
         }
@@ -133,6 +140,7 @@ namespace Avalonia.Animation
             DoPlayStates();
             var delayEndpoint = _delay;
             var iterationEndpoint = delayEndpoint + _duration;
+            var iterationTime = time;
 
             //determine if time is currently in the first iteration.
             if (time >= TimeSpan.Zero & time <= iterationEndpoint)
@@ -142,7 +150,7 @@ namespace Avalonia.Animation
             else if (time > iterationEndpoint)
             {
                 //Subtract first iteration to properly get the subsequent iteration time
-                time -= iterationEndpoint;
+                iterationTime -= iterationEndpoint;
 
                 if (!_iterationDelay & delayEndpoint > TimeSpan.Zero)
                 {
@@ -151,39 +159,45 @@ namespace Avalonia.Animation
                 }
 
                 //Calculate the current iteration number
-                _currentIteration = (int)Math.Floor((double)((double)time.Ticks / iterationEndpoint.Ticks)) + 2;
+                _currentIteration = Math.Min(_repeatCount,(int)Math.Floor((double)((double)iterationTime.Ticks / iterationEndpoint.Ticks)) + 2);
             }
             else
             {
                 return;
             }
 
-            time = TimeSpan.FromTicks((long)(time.Ticks % iterationEndpoint.Ticks));
-
-            if (!_isLooping)
-            {
-                if ((_currentIteration > _repeatCount) || (time > iterationEndpoint))
-                    DoComplete();
-            }
-
-            // Determine if the current iteration should have its normalized time inverted.
+             // Determine if the current iteration should have its normalized time inverted.
             bool isCurIterReverse = _animationDirection == PlaybackDirection.Normal ? false :
                                     _animationDirection == PlaybackDirection.Alternate ? (_currentIteration % 2 == 0) ? false : true :
                                     _animationDirection == PlaybackDirection.AlternateReverse ? (_currentIteration % 2 == 0) ? true : false :
                                     _animationDirection == PlaybackDirection.Reverse ? true : false;
-
-            if (delayEndpoint > TimeSpan.Zero & time < delayEndpoint)
+   
+            if (!_isLooping)
+            {
+                var totalTime = _iterationDelay ? _repeatCount * ( _duration.Ticks + _delay.Ticks) : _repeatCount * _duration.Ticks + _delay.Ticks;
+                if (time.Ticks >= totalTime)
+                {
+                    var easedTime = _easeFunc.Ease(isCurIterReverse ? 0.0 : 1.0);
+                    _lastInterpValue = _interpolator(easedTime, _neutralValue);
+                   
+                    DoComplete();
+                    return;
+                }
+            }
+            iterationTime = TimeSpan.FromTicks((long)(iterationTime.Ticks % iterationEndpoint.Ticks));
+        
+            if (delayEndpoint > TimeSpan.Zero & iterationTime < delayEndpoint)
             {
                 DoDelay();
             }
             else
             {
                 // Offset the delay time            
-                time -= delayEndpoint;
+                iterationTime -= delayEndpoint;
                 iterationEndpoint -= delayEndpoint;
 
                 // Normalize time
-                var interpVal = (double)time.Ticks / iterationEndpoint.Ticks;
+                var interpVal = (double)iterationTime.Ticks / iterationEndpoint.Ticks;
 
                 if (isCurIterReverse)
                     interpVal = 1 - interpVal;

+ 4 - 0
src/Avalonia.Animation/AnimatorKeyFrame.cs

@@ -61,6 +61,10 @@ namespace Avalonia.Animation
             {
                 throw new ArgumentNullException($"KeyFrame value can't be null.");
             }
+            if(Value is T typedValue)
+            {
+                return typedValue;
+            }
             if (!typeConv.CanConvertTo(Value.GetType()))
             {
                 throw new InvalidCastException($"KeyFrame value doesnt match property type.");

+ 2 - 1
src/Avalonia.Animation/Avalonia.Animation.csproj

@@ -1,9 +1,10 @@
 <Project Sdk="Microsoft.NET.Sdk">
   <PropertyGroup>
     <TargetFramework>netstandard2.0</TargetFramework>
+    <IsPackable>false</IsPackable>
   </PropertyGroup>
   <ItemGroup>
     <ProjectReference Include="..\Avalonia.Base\Avalonia.Base.csproj" />
   </ItemGroup>
   <Import Project="..\..\build\Rx.props" />
-</Project>
+</Project>

+ 1 - 0
src/Avalonia.Base/Avalonia.Base.csproj

@@ -4,6 +4,7 @@
     <AssemblyName>Avalonia.Base</AssemblyName>
     <RootNamespace>Avalonia</RootNamespace>
     <AllowUnsafeBlocks>True</AllowUnsafeBlocks>
+    <IsPackable>false</IsPackable>
   </PropertyGroup>
   <Import Project="..\..\build\Base.props" />
   <Import Project="..\..\build\Binding.props" />

+ 6 - 1
src/Avalonia.Base/Collections/AvaloniaListExtensions.cs

@@ -104,7 +104,12 @@ namespace Avalonia.Collections
                     case NotifyCollectionChangedAction.Move:
                     case NotifyCollectionChangedAction.Replace:
                         Remove(e.OldStartingIndex, e.OldItems);
-                        Add(e.NewStartingIndex, e.NewItems);
+                        int newIndex = e.NewStartingIndex;
+                        if(newIndex > e.OldStartingIndex)
+                        {
+                            newIndex -= e.OldItems.Count;
+                        }
+                        Add(newIndex, e.NewItems);
                         break;
 
                     case NotifyCollectionChangedAction.Remove:

+ 0 - 3
src/Avalonia.Base/Platform/IRuntimePlatform.cs

@@ -5,10 +5,7 @@ namespace Avalonia.Platform
 {
     public interface IRuntimePlatform
     {
-        Assembly[] GetLoadedAssemblies();
-        void PostThreadPoolItem(Action cb);
         IDisposable StartSystemTimer(TimeSpan interval, Action tick);
-        string GetStackTrace();
         RuntimePlatformInfo GetRuntimeInfo();
         IUnmanagedBlob AllocBlob(int size);
     }

+ 23 - 1
src/Avalonia.Base/Utilities/MathUtilities.cs

@@ -1,7 +1,6 @@
 // Copyright (c) The Avalonia Project. All rights reserved.
 // Licensed under the MIT license. See licence.md file in the project root for full license information.
 
-
 namespace Avalonia.Utilities
 {
     /// <summary>
@@ -31,5 +30,28 @@ namespace Avalonia.Utilities
                 return val;
             }
         }
+
+        /// <summary>
+        /// Clamps a value between a minimum and maximum value.
+        /// </summary>
+        /// <param name="val">The value.</param>
+        /// <param name="min">The minimum value.</param>
+        /// <param name="max">The maximum value.</param>
+        /// <returns>The clamped value.</returns>
+        public static int Clamp(int val, int min, int max)
+        {
+            if (val < min)
+            {
+                return min;
+            }
+            else if (val > max)
+            {
+                return max;
+            }
+            else
+            {
+                return val;
+            }
+        }
     }
 }

+ 1 - 1
src/Avalonia.Controls/AppBuilderBase.cs

@@ -222,7 +222,7 @@ namespace Avalonia.Controls
 
         private void SetupAvaloniaModules()
         {
-            var moduleInitializers = from assembly in AvaloniaLocator.Current.GetService<IRuntimePlatform>().GetLoadedAssemblies()
+            var moduleInitializers = from assembly in AppDomain.CurrentDomain.GetAssemblies()
                                      from attribute in assembly.GetCustomAttributes<ExportAvaloniaModuleAttribute>()
                                      where attribute.ForWindowingSubsystem == ""
                                       || attribute.ForWindowingSubsystem == WindowingSubsystemName

+ 2 - 1
src/Avalonia.Controls/Avalonia.Controls.csproj

@@ -1,6 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
   <PropertyGroup>
     <TargetFramework>netstandard2.0</TargetFramework>
+    <IsPackable>false</IsPackable>
   </PropertyGroup>
   <ItemGroup>
     <ProjectReference Include="..\Avalonia.Animation\Avalonia.Animation.csproj" />
@@ -14,4 +15,4 @@
   </ItemGroup>
   <Import Project="..\..\build\Rx.props" />
   <Import Project="..\..\build\JetBrains.Annotations.props" />
-</Project>
+</Project>

+ 8 - 3
src/Avalonia.Controls/Button.cs

@@ -2,10 +2,12 @@
 // Licensed under the MIT license. See licence.md file in the project root for full license information.
 
 using System;
+using System.Linq;
 using System.Windows.Input;
 using Avalonia.Data;
 using Avalonia.Input;
 using Avalonia.Interactivity;
+using Avalonia.VisualTree;
 
 namespace Avalonia.Controls
 {
@@ -251,7 +253,10 @@ namespace Avalonia.Controls
                 IsPressed = false;
                 e.Handled = true;
 
-                if (ClickMode == ClickMode.Release && new Rect(Bounds.Size).Contains(e.GetPosition(this)))
+                var hittest = this.GetVisualsAt(e.GetPosition(this));
+
+                if (ClickMode == ClickMode.Release &&
+                    hittest.Any(c => c == this || (c as IStyledElement)?.TemplatedParent == this))
                 {
                     OnClick();
                 }
@@ -261,9 +266,9 @@ namespace Avalonia.Controls
         protected override void UpdateDataValidation(AvaloniaProperty property, BindingNotification status)
         {
             base.UpdateDataValidation(property, status);
-            if(property == CommandProperty)
+            if (property == CommandProperty)
             {
-                if(status?.ErrorType == BindingErrorType.Error)
+                if (status?.ErrorType == BindingErrorType.Error)
                 {
                     IsEnabled = false;
                 }

+ 1 - 1
src/Avalonia.Controls/DropDown.cs

@@ -145,7 +145,7 @@ namespace Avalonia.Controls
         {
             if (!e.Handled)
             {
-                if (((IVisual)e.Source).GetVisualRoot() is PopupRoot)
+                if (_popup?.PopupRoot != null && ((IVisual)e.Source).GetVisualRoot() == _popup?.PopupRoot)
                 {
                     if (UpdateSelectionFromEventSource(e.Source))
                     {

+ 2 - 3
src/Avalonia.Controls/Image.cs

@@ -58,7 +58,7 @@ namespace Avalonia.Controls
             if (source != null)
             {
                 Rect viewPort = new Rect(Bounds.Size);
-                Size sourceSize = new Size(source.PixelWidth, source.PixelHeight);
+                Size sourceSize = new Size(source.PixelSize.Width, source.PixelSize.Height);
                 Vector scale = Stretch.CalculateScaling(Bounds.Size, sourceSize);
                 Size scaledSize = sourceSize * scale;
                 Rect destRect = viewPort
@@ -84,8 +84,7 @@ namespace Avalonia.Controls
 
             if (source != null)
             {
-                Size sourceSize = new Size(source.PixelWidth, source.PixelHeight);
-
+                Size sourceSize = new Size(source.PixelSize.Width, source.PixelSize.Height);
                 if (double.IsInfinity(availableSize.Width) || double.IsInfinity(availableSize.Height))
                 {
                     return sourceSize;

+ 21 - 3
src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs

@@ -76,9 +76,23 @@ namespace Avalonia.Controls.Presenters
                         var firstIndex = ItemCount - panel.Children.Count;
                         RecycleContainersForMove(firstIndex - FirstIndex);
 
-                        panel.PixelOffset = VirtualizingPanel.ScrollDirection == Orientation.Vertical ?
-                            panel.Children[0].Bounds.Height :
-                            panel.Children[0].Bounds.Width;
+                        double pixelOffset;
+                        var child = panel.Children[0];
+
+                        if (child.IsArrangeValid)
+                        {
+                            pixelOffset = VirtualizingPanel.ScrollDirection == Orientation.Vertical ?
+                                                    child.Bounds.Height :
+                                                    child.Bounds.Width;
+                        }
+                        else
+                        {
+                            pixelOffset = VirtualizingPanel.ScrollDirection == Orientation.Vertical ?
+                                                    child.DesiredSize.Height :
+                                                    child.DesiredSize.Width;
+                        }
+
+                        panel.PixelOffset = pixelOffset;
                     }
                 }
             }
@@ -402,6 +416,10 @@ namespace Avalonia.Controls.Presenters
             var panel = VirtualizingPanel;
             var generator = Owner.ItemContainerGenerator;
             var selector = Owner.MemberSelector;
+
+            //validate delta it should never overflow last index or generate index < 0 
+            delta = MathUtilities.Clamp(delta, -FirstIndex, ItemCount - FirstIndex - panel.Children.Count);
+
             var sign = delta < 0 ? -1 : 1;
             var count = Math.Min(Math.Abs(delta), panel.Children.Count);
             var move = count < panel.Children.Count;

+ 1 - 1
src/Avalonia.Controls/Primitives/AdornerLayer.cs

@@ -89,7 +89,7 @@ namespace Avalonia.Controls.Primitives
                 control.Clip = clip;
             }
 
-            clip.Rect = bounds.Clip.TransformToAABB(-bounds.Transform);
+            clip.Rect = bounds.Bounds;
         }
 
         private void ChildrenCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)

+ 14 - 0
src/Avalonia.Controls/Primitives/ScrollBar.cs

@@ -128,6 +128,20 @@ namespace Avalonia.Controls.Primitives
             }
         }
 
+        protected override void OnKeyDown(KeyEventArgs e)
+        {
+            if (e.Key == Key.PageUp)
+            {
+                LargeDecrement();
+                e.Handled = true;
+            }
+            else if (e.Key == Key.PageDown)
+            {
+                LargeIncrement();
+                e.Handled = true;
+            }
+        }
+
         protected override void OnTemplateApplied(TemplateAppliedEventArgs e)
         {
             base.OnTemplateApplied(e);

+ 9 - 11
src/Avalonia.Controls/Primitives/SelectingItemsControl.cs

@@ -62,7 +62,7 @@ namespace Avalonia.Controls.Primitives
             AvaloniaProperty.RegisterDirect<SelectingItemsControl, object>(
                 nameof(SelectedItem),
                 o => o.SelectedItem,
-                (o, v) => o.SelectedItem = v, 
+                (o, v) => o.SelectedItem = v,
                 defaultBindingMode: BindingMode.TwoWay);
 
         /// <summary>
@@ -88,7 +88,7 @@ namespace Avalonia.Controls.Primitives
         /// </summary>
         public static readonly RoutedEvent<RoutedEventArgs> IsSelectedChangedEvent =
             RoutedEvent.Register<SelectingItemsControl, RoutedEventArgs>(
-                "IsSelectedChanged", 
+                "IsSelectedChanged",
                 RoutingStrategies.Bubble);
 
         /// <summary>
@@ -96,7 +96,7 @@ namespace Avalonia.Controls.Primitives
         /// </summary>
         public static readonly RoutedEvent<SelectionChangedEventArgs> SelectionChangedEvent =
             RoutedEvent.Register<SelectingItemsControl, SelectionChangedEventArgs>(
-                "SelectionChanged", 
+                "SelectionChanged",
                 RoutingStrategies.Bubble);
 
         private static readonly IList Empty = new object[0];
@@ -521,7 +521,7 @@ namespace Avalonia.Controls.Primitives
                     else if (multi && range)
                     {
                         SynchronizeItems(
-                            SelectedItems, 
+                            SelectedItems,
                             GetRange(Items, SelectedIndex, index));
                     }
                     else
@@ -583,7 +583,7 @@ namespace Avalonia.Controls.Primitives
         }
 
         /// <summary>
-        /// Updates the selection based on an event that may have originated in a container that 
+        /// Updates the selection based on an event that may have originated in a container that
         /// belongs to the control.
         /// </summary>
         /// <param name="eventSource">The control that raised the event.</param>
@@ -595,7 +595,7 @@ namespace Avalonia.Controls.Primitives
         /// false.
         /// </returns>
         protected bool UpdateSelectionFromEventSource(
-            IInteractive eventSource, 
+            IInteractive eventSource,
             bool select = true,
             bool rangeModifier = false,
             bool toggleModifier = false)
@@ -807,12 +807,10 @@ namespace Avalonia.Controls.Primitives
                             SelectedIndex = -1;
                         }
                     }
-                    else
+
+                    foreach (var item in e.OldItems)
                     {
-                        foreach (var item in e.OldItems)
-                        {
-                            MarkItemSelected(item, false);
-                        }
+                        MarkItemSelected(item, false);
                     }
 
                     removed = e.OldItems;

+ 4 - 4
src/Avalonia.Controls/Remote/RemoteWidget.cs

@@ -73,9 +73,9 @@ namespace Avalonia.Controls.Remote
             if (_lastFrame != null)
             {
                 var fmt = (PixelFormat) _lastFrame.Format;
-                if (_bitmap == null || _bitmap.PixelWidth != _lastFrame.Width ||
-                    _bitmap.PixelHeight != _lastFrame.Height)
-                    _bitmap = new WriteableBitmap(_lastFrame.Width, _lastFrame.Height, fmt);
+                if (_bitmap == null || _bitmap.PixelSize.Width != _lastFrame.Width ||
+                    _bitmap.PixelSize.Height != _lastFrame.Height)
+                    _bitmap = new WriteableBitmap(new PixelSize(_lastFrame.Width, _lastFrame.Height), new Vector(96, 96), fmt);
                 using (var l = _bitmap.Lock())
                 {
                     var lineLen = (fmt == PixelFormat.Rgb565 ? 2 : 4) * _lastFrame.Width;
@@ -83,7 +83,7 @@ namespace Avalonia.Controls.Remote
                         Marshal.Copy(_lastFrame.Data, y * _lastFrame.Stride,
                             new IntPtr(l.Address.ToInt64() + l.RowBytes * y), lineLen);
                 }
-                context.DrawImage(_bitmap, 1, new Rect(0, 0, _bitmap.PixelWidth, _bitmap.PixelHeight),
+                context.DrawImage(_bitmap, 1, new Rect(0, 0, _bitmap.PixelSize.Width, _bitmap.PixelSize.Height),
                     new Rect(Bounds.Size));
             }
             base.Render(context);

Some files were not shown because too many files changed in this diff