Git Product home page Git Product logo

mac-playground's Introduction

mac-playground

This is a mix of code that was developed during our effort to port eM Client to macOS. It is a hodgepodge of various projects and experiments. The notable ones are listed below. The code is released as-is.

To test the experiments:

  • Make sure .NET 6 SDK for macOS is installed
  • Run dotnet workload restore from the Terminal
  • Open solution folder in Visual Studio Code or Visual Studio
  • Run the test application

System.Drawing

The System.Drawing directory contains a fork of the https://github.com/mono/sysdrawing-coregraphics project. We have enhanced the API surface to be compatible enough with System.Drawing to run System.Windows.Forms on top of it. In addition we have implemented some missing APIs and fixed compatibility issues with pixel rounding.

System.Windows.Forms

The System.Windows.Forms directory contains a fork of the Mono System.Windows.Forms implementation. It contains a Cocoa backend to allow applications run on 64-bit macOS systems. Layout code was heavily overhauled and debugged on both a test application and a full UI of eM Client. Further experiments were made with replacing some controls with their native counterparts (akin to https://github.com/Clancey/MonoMac.Windows.Form), which can be done on per-control basis.

License

The code is released under the MIT X11 license unless noted otherwise in a specific source file. Any changes in this repository to the original code are published under the MIT X11 license.

MIT X11 License

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

mac-playground's People

Contributors

aconcagua21 avatar dependabot[bot] avatar filipnavara avatar gaspik avatar pavel-faltynek avatar shutdown256 avatar tbambuch avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

mac-playground's Issues

API implementation or DrawReversibleFrame and FillReversibleRectangle

I need to use the API of DrawReversibleFrame and FillReversibleRectangle, but they are not implemented neither in XplatUICocoa.cs nor in XplatUICarbon.cs.

		internal override void DrawReversibleLine(Point start, Point end, Color backColor) {
//			throw new NotImplementedException();
		}

		internal override void FillReversibleRectangle (Rectangle rectangle, Color backColor) {
//			throw new NotImplementedException();
		}

		internal override void DrawReversibleFrame (Rectangle rectangle, Color backColor, FrameStyle style) {
//			throw new NotImplementedException();
		}

Can you give me some thought on how to implement them in Cocoa?

Thanks

SelectedIndex not working as expected for DropDown combo box

I noticed that ComboBox.SelectedIndex does not have the expected value -1 when text was entered which is not part of the list (https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.combobox.selectedindex?view=netframework-4.7.2).

This can happen with DropDownStyle = ComboBoxStyle.DropDown. A user can type any text and hit return. This does not lead to a SelectedIndexChanged event. But on Windows SelectedIndex will subsequently return -1.

With the current implementation the behavior is different. ComboTextFieldChanged does not call OnImpSelectedItemChanged since indexofCompleted == -1. In turn the combo's SelectedIndex will have its old value and not -1.

I believe the right fix is something like

if (indexofCompleted != -1)
     owner.OnImpSelectedItemChanged(sender, e);
else
     owner.SelectedIndexChanged();

in ComboBoxImp.ComboTextFieldChanged where SelectedIndexChanged is a new method that updates selected_index but does not raise any events. However, my understanding of the combobox implementation isn't deep enough to submit a pull request without asking.

Reference to MailClient.BuildTasks.targets: cannot find that file

[Disclaimer: I am new to building WinForms applications using Visual Studio and completely new to mac-playground]

Setup and background:
running 10.15.3 (Catalina) which being 64bit cannot run WinForms apps out of the box
running VS for Mac 8.4.8
Xamarin.Mac Version: 6.10.0.21 (Visual Studio Community)
cloned mac-playground into fresh directory
build fails as the file above does not exist

Purpose:
I want to try using mac-playground as a way forward to recompiling my old WinForms application; but
tried a search and StackOverflow sites but finding nothing

The type initializer threw an exception

I heard that this application allows users to use x64bit winforms on MacOS. I tried to follow the instructions in the readme and I got this while opening up the .sln file:

Error while trying to load the project 'filepath/mac-playground-master/FormsTestApp/FormsTest.app.csproj': The type initializer for 'MonoDevelop.MonoMac.XamMac2ProjectFlavor' threw an exception.

Text boxes don't have context menus and don't allow copy/paste through keyboard shortcuts

Unlike most native controls text boxes do not show a context menu on right click. There is one exception: When right-clicking on a TextBoxBase_NSTextView while it does not have focus the macOS context menu is shown. It does not work when right-clicking after the control was activated.
image

Also Apple+C/V/X shortcuts don't work.

I'd be happy to trying adding the functionality. However, I'm wondering if overriding the mouse button and key down events and adding the required calls here is would be the right approach.

@filipnavara Can you share any hints?

Failed to restore nuget packages?

...
Project MacApi is not compatible with xamarinmac20 (Xamarin.Mac,Version=v2.0). Project MacApi supports: net48 (.NETFramework,Version=v4.8)
Project System.Drawing is not compatible with xamarinmac20 (Xamarin.Mac,Version=v2.0). Project System.Drawing supports: net48 (.NETFramework,Version=v4.8)
Project System.Windows.Forms is not compatible with xamarinmac20 (Xamarin.Mac,Version=v2.0). Project System.Windows.Forms supports: net48 (.NETFramework,Version=v4.8)
Restore failed.

Both stable and beta version of Visual Studio and Xamarin.Mac do not work.
Here's the Visual Studio version infos.

=== Visual Studio Community 2019 for Mac (Preview) ===

Version 8.9 Preview (8.9 build 964)
Installation UUID: a268c229-3167-4aec-986b-6bc259d92ece
	GTK+ 2.24.23 (Raleigh theme)
	Xamarin.Mac 6.18.0.23 (d16-6 / 088c73638)

	Package version: 612000113

=== Mono Framework MDK ===

Runtime:
	Mono 6.12.0.113 (2020-02/4fdfb5b1fd5) (64-bit)
	Package version: 612000113

=== Xamarin Designer ===

Version: 16.9.0.105
Hash: f693266a2
Branch: remotes/origin/main
Build date: 2020-12-02 05:56:40 UTC

=== Roslyn (Language Service) ===

3.9.0-2.20573.18+bc20ce579f9b17c9153f3f54a0690d23c482d899

=== NuGet ===

Version: 5.8.0.6860

=== .NET Core SDK ===

SDK: /usr/local/share/dotnet/sdk/5.0.101/Sdks
SDK Versions:
	5.0.101
	3.1.404
MSBuild SDKs: /Applications/Visual Studio.app/Contents/Resources/lib/monodevelop/bin/MSBuild/Current/bin/Sdks

=== .NET Core Runtime ===

Runtime: /usr/local/share/dotnet/dotnet
Runtime Versions:
	5.0.1
	3.1.10

=== .NET Core 3.1 SDK ===

SDK: 3.1.404

=== Xamarin.Profiler ===

Version: 1.6.15.68
Location: /Applications/Xamarin Profiler.app/Contents/MacOS/Xamarin Profiler

=== Updater ===

Version: 11

=== Xamarin.Android ===

Not Installed

=== Microsoft OpenJDK for Mobile ===

Java SDK: Not Found

Android Designer EPL code available here:
https://github.com/xamarin/AndroidDesigner.EPL

=== Android SDK Manager ===

Version: 16.9.0.19
Hash: 9771026
Branch: remotes/origin/HEAD
Build date: 2020-11-21 02:03:08 UTC

=== Android Device Manager ===

Version: 16.9.0.13
Hash: bbbb387
Branch: remotes/origin/main
Build date: 2020-11-21 02:03:28 UTC

=== Apple Developer Tools ===

Xcode 12.3 (17715)
Build 12C33

=== Xamarin.Mac ===

Version: 7.3.0.27 (Visual Studio Community)
Hash: f4c9327fa
Branch: main
Build date: 2020-11-19 10:57:31-0500

=== Xamarin.iOS ===

Xamarin.iOS not installed.
Can't find mtouch or the Version file at /Library/Frameworks/Xamarin.iOS.framework/Versions/Current.

=== Build Information ===

Release ID: 809000964
Git revision: 0ab5ced8f8f39c1837b5879f51401c6fd1ae41ef
Build date: 2020-12-15 08:05:14-05
Build branch: release-8.9
Xamarin extensions: 0ab5ced8f8f39c1837b5879f51401c6fd1ae41ef

=== Operating System ===

Mac OS X 10.16.0
Darwin 20.2.0 Darwin Kernel Version 20.2.0
    Wed Dec  2 20:40:21 PST 2020
    root:xnu-7195.60.75~1/RELEASE_ARM64_T8101 x86_64

Color dialog not fully working

I noticed that the color dialog is not working properly as shown in this screenshot.

image

  • The column with shades on the right should update to the selected color, if I remember correctly
  • Entering numeric values has no effect (e.g. red=green=0, blue=255 should show blue)

I don't really need the control and maybe instead of fixing the Mono dialog an implementation based on NSColorWell is a better approach. Just wanted to make sure to record the issue for now.

ApplicationShouldTerminate without main form

First of all, great SWF Cocoa port!

I tried to run it for an application that does not have a main window which is always present. One thing I noticed is that the ApplicationShouldTerminate event is not received when no form is open.

I tracked this down to the call NSApp.NextEvent(dequeue:=false) which apparently does not process ApplicationShouldTerminate. NSApp.NextEvent(dequeue:=true) does.

Therefore I'm suggesting the attached patch. Would you mind reviewing if the suggested change makes sense?

XplatUICocoa.cs.patch.zip

macOS 13 CoreGraphics Deprecation

Not sure it's the right place to bring this up. There's this upcoming deprecation in macOS 13 in CoreGraphics which I couldn't quickly deduct if it's going to impact the project.

To improve security, CGImageCreate enforces parameter correctness on macOS 13 Ventura, iOS 16, iPadOS 16, watchOS 9, and tvOS 16. Passing an incorrect CGImageByteOrderInfo is no longer supported, and will result in images failing to load. (94855401)

CGImageCreate is being used in mac-playground, but it's not clear if the deprecation would affect anything. Any input guys? @filipnavara

Dark Mode in macOS Mojave

screen shot 2018-11-06 at 9 04 38 pm

Just wanted to note that dark mode looks really bad. I don't really think there's too much you can do about this given the purpose is to replicate WinForms, other than forcing default colors that match the light defaults. The NSRequiresAquaSystemAppearance plist key can be used to opt-out of dark mode for the app as a whole, but it sounds like that approach is only supposed to be a temporary work-around.

I know you mentioned somewhere at some point that you don't intend to support this other than your own needs, but I thought it was worth having this problem documented. I may eventually look into the problem myself but it's not a priority in the near future.

Mouse capture implementation question

Something else that I noticed...

UngrabWindow in XplatUICocoa.cs includes these lines

if (LastEnteredHwnd != IntPtr.Zero && LastEnteredHwnd != grabbed)
{
	var lparam = IntPtr.Zero; // TODO: should contain mouse coords? See WindowsEventResponder.TranslateMouseEvent()
	var wparam = (IntPtr)(NSEvent.CurrentModifierFlags.ToWParam() | Mac.Extensions.ButtonMaskToWParam(NSEvent.CurrentPressedMouseButtons));
	SendMessage(grabbed, Msg.WM_MOUSELEAVE, wparam, lparam);
	SendMessage(LastEnteredHwnd, Msg.WM_MOUSE_ENTER, wparam, lparam);
}

This leads to a nested call of WndProc with WM_MOUSELEAVE when the mouse button is released (WM_LBUTTONUP) while captured.

My code was not prepared to deal with this. I'm not daring to suggest this is a bug in XplatUICocoa.cs that needs to be fixed. Only wondering if it should be PostMessage instead of SendMessage so that the button up message handling is completed before WM_MOUSELEAVE. I figured out this is what System.Windows.Forms.CarbonInternal.MouseHandler does in TranslateMessage.

Cannot handle ApplicationShouldTerminate in application without window

Some observations related to #2

When the application currently does not display any form ApplicationShouldTerminate in MonoApplicationDelegate.cs obviously cannot notify any window. It will return NSApplicationTerminateReply.Cancel to allow termination but the application has no chance to clean up before terminating.

I came up with this added code as a workaround

Message m = Message.Create(IntPtr.Zero, (int)Msg.WM_QUIT, IntPtr.Zero, IntPtr.Zero);
if (Application.FilterMessage(ref m))
	return NSApplicationTerminateReply.Cancel;

This way an application without a main form may install a message filter and handle ApplicationShouldTerminate.

The next observation is that with a dynamically top-level window ApplicationShouldTerminate is not received. I figured out that the behavior is caused by the SetModal call for the top-level window. Though I'm not sure why. The following change resolves the issue. But since I haven't really understood modal sessions I'm wondering if it might break anything else.

internal override void SetModal (IntPtr handle, bool Modal)
{
	NSView vuWrap = handle.ToNSView();
	NSWindow winWrap = vuWrap.Window;
	IntPtr session;
	if (Modal)
	{
		if (winWrap.ParentWindow == null)
		{
			winWrap.Center();
			ModalSessions.Push(IntPtr.Zero);
		}
		else
		{
			session = NSApplication.SharedApplication.BeginModalSession(winWrap);
			ModalSessions.Push(session);
		}
	}
	else if ((session = ModalSessions.Pop()) != IntPtr.Zero)
		NSApplication.SharedApplication.EndModalSession(session);
}

Are the suggested changes good enough for a pull request or do they not make sense?

NuGet restore: MSB4184: The expression "[System.IO.Path]::GetDirectoryName('')" cannot be evaluated

I performed the following steps so far, in order to attempt to build mac-playground:

  • I installed a fresh macOS Big Sur on VMWare
  • I installed the latest Visual Studio for mac,
  • I could not open the solution until I installed the latest .NET 6 preview SDK
  • Build failed saying there is no Xcode so I created an Apple ID, downloaded and installed Xcode, too
  • The Xcode path then was wrong, finally I managed to find out how to fix it in Preferences

Now I can build the System.Private.CoreLib project but nothing else. The build fails with NuGet packages need to be restored... but it is unable to restore the packages:

/usr/local/share/dotnet/sdk-manifests/6.0.100/microsoft.net.sdk.macos/WorkloadManifest.targets(7,3) : error MSB4184: The expression "[System.IO.Path]::GetDirectoryName('')" cannot be evaluated. Invalid path
Unable to create package spec for project. '/Users/username/repo/mac-playground/FormsTest/FormsTest.csproj'

And I'm stuck here. How could I overcome this issue? Are there any further gotchas I need to know about?

Btw, I wish the short step-by-step guide in the README was a bit more detailed (feel free to use my points above). The second bullet point there says I need to choose "Xamarin - Debug" but I only have the regular "Debug"/"Release" options so I'm not even sure whether I reached the second step in the build process...

NuGet packages need to be restored before building

Hello!
So I've been trying to compile this project but I've hit a brick wall.
I get errors when the project is loaded regarding some NuGet packages:

Getting restore information for project /Users/user/Compile/mac-playground/FormsTest/FormsTest.csproj
/usr/local/share/dotnet/sdk/6.0.100-preview.2.21155.3/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.TargetFrameworkInference.targets(109,5) : error NETSDK1139: The target platform identifier macos was not recognized.
/usr/local/share/dotnet/sdk/6.0.100-preview.2.21155.3/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.TargetFrameworkInference.targets(109,5) : error NETSDK1139: The target platform identifier macos was not recognized.
/usr/local/share/dotnet/sdk/6.0.100-preview.2.21155.3/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.TargetFrameworkInference.targets(109,5) : error NETSDK1139: The target platform identifier macos was not recognized.
/usr/local/share/dotnet/sdk/6.0.100-preview.2.21155.3/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.TargetFrameworkInference.targets(109,5) : error NETSDK1139: The target platform identifier macos was not recognized.
/usr/local/share/dotnet/sdk/6.0.100-preview.2.21155.3/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.TargetFrameworkInference.targets(109,5) : error NETSDK1139: The target platform identifier macos was not recognized.
Unable to create package spec for project. '/Users/user/Compile/mac-playground/FormsTest/FormsTest.csproj'

While browsing through Dependencies and manually updating NuGet packages, these are the errors I get:
System.Drawing.Common:

  GET https://pkgs.dev.azure.com/dnceng/9ee6d478-d288-47f7-aacc-f6e6d082ae6d/_packaging/7d9f5c21-0d79-403f-bfe3-9a4506529760/nuget/v3/registrations2-semver2/system.drawing.common/index.json
  GET https://pkgs.dev.azure.com/dnceng/9ee6d478-d288-47f7-aacc-f6e6d082ae6d/_packaging/1a5f89f6-d8da-4080-b15f-242650c914a8/nuget/v3/registrations2-semver2/system.drawing.common/index.json
  GET https://pkgs.dev.azure.com/dnceng/9ee6d478-d288-47f7-aacc-f6e6d082ae6d/_packaging/825db618-e3eb-4426-ba54-b1d6e6c944d8/nuget/v3/registrations2-semver2/system.drawing.common/index.json
  GET https://pkgs.dev.azure.com/azure-public/3ccf6661-f8ce-4e8a-bb2e-eff943ddd3c7/_packaging/be90bfa8-5c00-452b-ba9f-226ce4366992/nuget/v3/registrations2-semver2/system.drawing.common/index.json
  GET https://api.nuget.org/v3/registration5-gz-semver2/system.drawing.common/index.json
  OK https://pkgs.dev.azure.com/dnceng/9ee6d478-d288-47f7-aacc-f6e6d082ae6d/_packaging/1a5f89f6-d8da-4080-b15f-242650c914a8/nuget/v3/registrations2-semver2/system.drawing.common/index.json 290ms
  OK https://api.nuget.org/v3/registration5-gz-semver2/system.drawing.common/index.json 588ms
  OK https://pkgs.dev.azure.com/dnceng/9ee6d478-d288-47f7-aacc-f6e6d082ae6d/_packaging/825db618-e3eb-4426-ba54-b1d6e6c944d8/nuget/v3/registrations2-semver2/system.drawing.common/index.json 782ms
  NotFound https://pkgs.dev.azure.com/azure-public/3ccf6661-f8ce-4e8a-bb2e-eff943ddd3c7/_packaging/be90bfa8-5c00-452b-ba9f-226ce4366992/nuget/v3/registrations2-semver2/system.drawing.common/index.json 983ms
  OK https://pkgs.dev.azure.com/dnceng/9ee6d478-d288-47f7-aacc-f6e6d082ae6d/_packaging/7d9f5c21-0d79-403f-bfe3-9a4506529760/nuget/v3/registrations2-semver2/system.drawing.common/index.json 1603ms
Getting restore information for project /Users/user/Compile/mac-playground/System.Windows.Forms/System.Windows.Forms.csproj
/usr/local/share/dotnet/sdk/6.0.100-preview.2.21155.3/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.TargetFrameworkInference.targets(109,5) : error NETSDK1139: The target platform identifier macos was not recognized.
/usr/local/share/dotnet/sdk/6.0.100-preview.2.21155.3/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.TargetFrameworkInference.targets(109,5) : error NETSDK1139: The target platform identifier macos was not recognized.
/usr/local/share/dotnet/sdk/6.0.100-preview.2.21155.3/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.TargetFrameworkInference.targets(109,5) : error NETSDK1139: The target platform identifier macos was not recognized.
Unable to create package spec for project. '/Users/user/Compile/mac-playground/System.Windows.Forms/System.Windows.Forms.csproj'

Microsoft.DotNet.ApiCompat

  GET https://pkgs.dev.azure.com/azure-public/3ccf6661-f8ce-4e8a-bb2e-eff943ddd3c7/_packaging/be90bfa8-5c00-452b-ba9f-226ce4366992/nuget/v3/registrations2-semver2/microsoft.dotnet.apicompat/index.json
  GET https://pkgs.dev.azure.com/dnceng/9ee6d478-d288-47f7-aacc-f6e6d082ae6d/_packaging/7d9f5c21-0d79-403f-bfe3-9a4506529760/nuget/v3/registrations2-semver2/microsoft.dotnet.apicompat/index.json
  GET https://api.nuget.org/v3/registration5-gz-semver2/microsoft.dotnet.apicompat/index.json
  GET https://pkgs.dev.azure.com/dnceng/9ee6d478-d288-47f7-aacc-f6e6d082ae6d/_packaging/825db618-e3eb-4426-ba54-b1d6e6c944d8/nuget/v3/registrations2-semver2/microsoft.dotnet.apicompat/index.json
  GET https://pkgs.dev.azure.com/dnceng/9ee6d478-d288-47f7-aacc-f6e6d082ae6d/_packaging/1a5f89f6-d8da-4080-b15f-242650c914a8/nuget/v3/registrations2-semver2/microsoft.dotnet.apicompat/index.json
  NotFound https://api.nuget.org/v3/registration5-gz-semver2/microsoft.dotnet.apicompat/index.json 587ms
  NotFound https://pkgs.dev.azure.com/dnceng/9ee6d478-d288-47f7-aacc-f6e6d082ae6d/_packaging/825db618-e3eb-4426-ba54-b1d6e6c944d8/nuget/v3/registrations2-semver2/microsoft.dotnet.apicompat/index.json 718ms
  NotFound https://pkgs.dev.azure.com/dnceng/9ee6d478-d288-47f7-aacc-f6e6d082ae6d/_packaging/7d9f5c21-0d79-403f-bfe3-9a4506529760/nuget/v3/registrations2-semver2/microsoft.dotnet.apicompat/index.json 851ms
  NotFound https://pkgs.dev.azure.com/azure-public/3ccf6661-f8ce-4e8a-bb2e-eff943ddd3c7/_packaging/be90bfa8-5c00-452b-ba9f-226ce4366992/nuget/v3/registrations2-semver2/microsoft.dotnet.apicompat/index.json 943ms
  OK https://pkgs.dev.azure.com/dnceng/9ee6d478-d288-47f7-aacc-f6e6d082ae6d/_packaging/1a5f89f6-d8da-4080-b15f-242650c914a8/nuget/v3/registrations2-semver2/microsoft.dotnet.apicompat/index.json 1242ms
Getting restore information for project /Users/user/Compile/mac-playground/System.Windows.Forms.Primitives/System.Windows.Forms.Primitives.csproj
/usr/local/share/dotnet/sdk/6.0.100-preview.2.21155.3/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.TargetFrameworkInference.targets(109,5) : error NETSDK1139: The target platform identifier macos was not recognized.
Unable to create package spec for project. '/Users/user/Compile/mac-playground/System.Windows.Forms.Primitives/System.Windows.Forms.Primitives.csproj'

I'm new to this process on macos and can't figure it out how to proceed.
I'm using Visual Studio for Mac Community v8.9.2(build 0) on MacOS Big Sur 11.1 (for now).
Thank you!

Color.FromArgb does not work properly

Color aColor = Color.FromArgb(233, 233, 233);
Console.WriteLine("R = {0}, G = {1}, B = {2}", aColor.R.ToString(), aColor.G.ToString(), aColor.B.ToString());

The snippet of code above will output:

R = 227, G = 227, B = 227

The value of 233 is changed to 227.

FormsTest Unhandled Exception

Just clone from repository and try to run FormsTest:

User assembly '/Users/krunduev/Projects/VisualStudio/mac-playground/FormsTestApp/bin/Debug/FormsTestApp.exe' is missing. Debugger will now debug all code, not just user code.
Loaded assembly: /Users/krunduev/Projects/VisualStudio/mac-playground/FormsTest/bin/Debug/xamarinmac20/osx-x64/FormsTest.exe
Loaded assembly: /Users/krunduev/Projects/VisualStudio/mac-playground/FormsTest/bin/Debug/xamarinmac20/osx-x64/System.Windows.Forms.dll

Unhandled Exception:
System.IO.FileNotFoundException: Could not load file or assembly 'System, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e' or one of its dependencies.
File name: 'System, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e'
[ERROR] FATAL UNHANDLED EXCEPTION: System.IO.FileNotFoundException: Could not load file or assembly 'System, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e' or one of its dependencies.
File name: 'System, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e'

What is the corresponding version in Mono of System.Windows.Forms?

I found in some cases there are issues if I build System.Windows.Forms with MACOS_THEME and it is good if building without MACOS_THEME, DataGridViewComboBoxColumn, for example.

I would like to know what is the corresponding version in Mono of System.Windows.Forms? So I can check some source of without MACOS_THEME against Mono source.

System.Drawing.Icon is partly incompatible with Mono's implementation

The program is
https://ppmforums.com/download.php?id=29787
It works fine with some layout glitches when used with Mono's implementation, but it won't run with sysdrawing-coregraphics, it will throw such an exception.

Unhandled Exception:
System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values.
Parameter name: stream
  at System.Drawing.Icon.InitFromStreamWithSize (System.IO.Stream stream, System.Int32 width, System.Int32 height) [0x00039] in /Users/alpine/mac-playground/sysdrawing-coregraphics/System.Drawing/Icon.cs:250 
  at System.Drawing.Icon..ctor (System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) [0x000a9] in /Users/alpine/mac-playground/sysdrawing-coregraphics/System.Drawing/Icon.cs:128 
  at (wrapper managed-to-native) System.Reflection.MonoCMethod.InternalInvoke(System.Reflection.MonoCMethod,object,object[],System.Exception&)
  at System.Reflection.MonoCMethod.InternalInvoke (System.Object obj, System.Object[] parameters, System.Boolean wrapExceptions) [0x00005] in /Library/Frameworks/Xamarin.Mac.framework/Versions/5.2.1.13/src/Xamarin.Mac/mcs/class/corlib/System.Reflection/MonoMethod.cs:667 
   --- End of inner exception stack trace ---
  at System.Reflection.MonoCMethod.InternalInvoke (System.Object obj, System.Object[] parameters, System.Boolean wrapExceptions) [0x00012] in /Library/Frameworks/Xamarin.Mac.framework/Versions/5.2.1.13/src/Xamarin.Mac/mcs/class/corlib/System.Reflection/MonoMethod.cs:673 
  at System.Reflection.MonoCMethod.DoInvoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x0007a] in /Library/Frameworks/Xamarin.Mac.framework/Versions/5.2.1.13/src/Xamarin.Mac/mcs/class/corlib/System.Reflection/MonoMethod.cs:657 
  at System.Reflection.MonoCMethod.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x0002f] in /Library/Frameworks/Xamarin.Mac.framework/Versions/5.2.1.13/src/Xamarin.Mac/mcs/class/corlib/System.Reflection/MonoMethod.cs:638 
  at System.Reflection.MethodBase.Invoke (System.Object obj, System.Object[] parameters) [0x00000] in /Library/Frameworks/Xamarin.Mac.framework/Versions/5.2.1.13/src/Xamarin.Mac/mcs/class/referencesource/mscorlib/system/reflection/methodbase.cs:229 
  at System.Reflection.RuntimeConstructorInfo.SerializationInvoke (System.Object target, System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) [0x00000] in /Library/Frameworks/Xamarin.Mac.framework/Versions/5.2.1.13/src/Xamarin.Mac/mcs/class/corlib/System.Reflection/MonoMethod.cs:584 
  at System.Runtime.Serialization.ObjectManager.CompleteISerializableObject (System.Object obj, System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) [0x00059] in /Library/Frameworks/Xamarin.Mac.framework/Versions/5.2.1.13/src/Xamarin.Mac/mcs/class/referencesource/mscorlib/system/runtime/serialization/objectmanager.cs:874 
  at System.Runtime.Serialization.ObjectManager.FixupSpecialObject (System.Runtime.Serialization.ObjectHolder holder) [0x0007b] in /Library/Frameworks/Xamarin.Mac.framework/Versions/5.2.1.13/src/Xamarin.Mac/mcs/class/referencesource/mscorlib/system/runtime/serialization/objectmanager.cs:259 
  at System.Runtime.Serialization.ObjectManager.DoFixups () [0x0005a] in /Library/Frameworks/Xamarin.Mac.framework/Versions/5.2.1.13/src/Xamarin.Mac/mcs/class/referencesource/mscorlib/system/runtime/serialization/objectmanager.cs:925 
  at System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize (System.Runtime.Remoting.Messaging.HeaderHandler handler, System.Runtime.Serialization.Formatters.Binary.__BinaryParser serParser, System.Boolean fCheck, System.Boolean isCrossAppDomain, System.Runtime.Remoting.Messaging.IMethodCallMessage methodCallMessage) [0x00077] in /Library/Frameworks/Xamarin.Mac.framework/Versions/5.2.1.13/src/Xamarin.Mac/mcs/class/referencesource/mscorlib/system/runtime/serialization/formatters/binary/binaryobjectreader.cs:181 
  at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize (System.IO.Stream serializationStream, System.Runtime.Remoting.Messaging.HeaderHandler handler, System.Boolean fCheck, System.Boolean isCrossAppDomain, System.Runtime.Remoting.Messaging.IMethodCallMessage methodCallMessage) [0x00099] in /Library/Frameworks/Xamarin.Mac.framework/Versions/5.2.1.13/src/Xamarin.Mac/mcs/class/referencesource/mscorlib/system/runtime/serialization/formatters/binary/binaryformatter.cs:197 
  at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize (System.IO.Stream serializationStream, System.Runtime.Remoting.Messaging.HeaderHandler handler, System.Boolean fCheck, System.Runtime.Remoting.Messaging.IMethodCallMessage methodCallMessage) [0x00000] in /Library/Frameworks/Xamarin.Mac.framework/Versions/5.2.1.13/src/Xamarin.Mac/mcs/class/referencesource/mscorlib/system/runtime/serialization/formatters/binary/binaryformatter.cs:173 
  at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize (System.IO.Stream serializationStream, System.Runtime.Remoting.Messaging.HeaderHandler handler, System.Boolean fCheck) [0x00000] in /Library/Frameworks/Xamarin.Mac.framework/Versions/5.2.1.13/src/Xamarin.Mac/mcs/class/referencesource/mscorlib/system/runtime/serialization/formatters/binary/binaryformatter.cs:118 
  at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize (System.IO.Stream serializationStream, System.Runtime.Remoting.Messaging.HeaderHandler handler) [0x00000] in /Library/Frameworks/Xamarin.Mac.framework/Versions/5.2.1.13/src/Xamarin.Mac/mcs/class/referencesource/mscorlib/system/runtime/serialization/formatters/binary/binaryformatter.cs:149 
  at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize (System.IO.Stream serializationStream) [0x00000] in /Library/Frameworks/Xamarin.Mac.framework/Versions/5.2.1.13/src/Xamarin.Mac/mcs/class/referencesource/mscorlib/system/runtime/serialization/formatters/binary/binaryformatter.cs:111 
  at System.Resources.ResourceReader.DeserializeObject (System.Int32 typeIndex) [0x00008] in /Library/Frameworks/Xamarin.Mac.framework/Versions/5.2.1.13/src/Xamarin.Mac/mcs/class/referencesource/mscorlib/system/resources/resourcereader.cs:838 
  at System.Resources.ResourceReader._LoadObjectV2 (System.Int32 pos, System.Resources.ResourceTypeCode& typeCode) [0x0035c] in /Library/Frameworks/Xamarin.Mac.framework/Versions/5.2.1.13/src/Xamarin.Mac/mcs/class/referencesource/mscorlib/system/resources/resourcereader.cs:808 
  at System.Resources.ResourceReader.LoadObjectV2 (System.Int32 pos, System.Resources.ResourceTypeCode& typeCode) [0x00000] in /Library/Frameworks/Xamarin.Mac.framework/Versions/5.2.1.13/src/Xamarin.Mac/mcs/class/referencesource/mscorlib/system/resources/resourcereader.cs:679 
  at System.Resources.ResourceReader.LoadObject (System.Int32 pos, System.Resources.ResourceTypeCode& typeCode) [0x00022] in /Library/Frameworks/Xamarin.Mac.framework/Versions/5.2.1.13/src/Xamarin.Mac/mcs/class/referencesource/mscorlib/system/resources/resourcereader.cs:588 
  at System.Resources.RuntimeResourceSet.GetObject (System.String key, System.Boolean ignoreCase, System.Boolean isString) [0x000be] in /Library/Frameworks/Xamarin.Mac.framework/Versions/5.2.1.13/src/Xamarin.Mac/mcs/class/referencesource/mscorlib/system/resources/runtimeresourceset.cs:331 
  at System.Resources.RuntimeResourceSet.GetObject (System.String key, System.Boolean ignoreCase) [0x00000] in /Library/Frameworks/Xamarin.Mac.framework/Versions/5.2.1.13/src/Xamarin.Mac/mcs/class/referencesource/mscorlib/system/resources/runtimeresourceset.cs:286 
  at System.Resources.ResourceManager.GetObject (System.String name, System.Globalization.CultureInfo culture, System.Boolean wrapUnmanagedMemStream) [0x00028] in /Library/Frameworks/Xamarin.Mac.framework/Versions/5.2.1.13/src/Xamarin.Mac/mcs/class/referencesource/mscorlib/system/resources/resourcemanager.cs:1404 
  at System.Resources.ResourceManager.GetObject (System.String name) [0x00000] in /Library/Frameworks/Xamarin.Mac.framework/Versions/5.2.1.13/src/Xamarin.Mac/mcs/class/referencesource/mscorlib/system/resources/resourcemanager.cs:1360 
  at FontEditor.MainForm.InitializeComponent () [0x0350e] in <ca161138f7504b689b385d55224d8623>:0 
  at FontEditor.MainForm..ctor (System.String FileName) [0x00006] in <ca161138f7504b689b385d55224d8623>:0 
  at (wrapper remoting-invoke-with-check) FontEditor.MainForm..ctor(string)
  at FontEditor.MainForm.Main (System.String[] args) [0x00018] in <ca161138f7504b689b385d55224d8623>:0 
[ERROR] FATAL UNHANDLED EXCEPTION: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values.
Parameter name: stream
  at System.Drawing.Icon.InitFromStreamWithSize (System.IO.Stream stream, System.Int32 width, System.Int32 height) [0x00039] in /Users/alpine/mac-playground/sysdrawing-coregraphics/System.Drawing/Icon.cs:250 
  at System.Drawing.Icon..ctor (System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) [0x000a9] in /Users/alpine/mac-playground/sysdrawing-coregraphics/System.Drawing/Icon.cs:128 
  at (wrapper managed-to-native) System.Reflection.MonoCMethod.InternalInvoke(System.Reflection.MonoCMethod,object,object[],System.Exception&)
  at System.Reflection.MonoCMethod.InternalInvoke (System.Object obj, System.Object[] parameters, System.Boolean wrapExceptions) [0x00005] in /Library/Frameworks/Xamarin.Mac.framework/Versions/5.2.1.13/src/Xamarin.Mac/mcs/class/corlib/System.Reflection/MonoMethod.cs:667 
   --- End of inner exception stack trace ---
  at System.Reflection.MonoCMethod.InternalInvoke (System.Object obj, System.Object[] parameters, System.Boolean wrapExceptions) [0x00012] in /Library/Frameworks/Xamarin.Mac.framework/Versions/5.2.1.13/src/Xamarin.Mac/mcs/class/corlib/System.Reflection/MonoMethod.cs:673 
  at System.Reflection.MonoCMethod.DoInvoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x0007a] in /Library/Frameworks/Xamarin.Mac.framework/Versions/5.2.1.13/src/Xamarin.Mac/mcs/class/corlib/System.Reflection/MonoMethod.cs:657 
  at System.Reflection.MonoCMethod.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x0002f] in /Library/Frameworks/Xamarin.Mac.framework/Versions/5.2.1.13/src/Xamarin.Mac/mcs/class/corlib/System.Reflection/MonoMethod.cs:638 
  at System.Reflection.MethodBase.Invoke (System.Object obj, System.Object[] parameters) [0x00000] in /Library/Frameworks/Xamarin.Mac.framework/Versions/5.2.1.13/src/Xamarin.Mac/mcs/class/referencesource/mscorlib/system/reflection/methodbase.cs:229 
  at System.Reflection.RuntimeConstructorInfo.SerializationInvoke (System.Object target, System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) [0x00000] in /Library/Frameworks/Xamarin.Mac.framework/Versions/5.2.1.13/src/Xamarin.Mac/mcs/class/corlib/System.Reflection/MonoMethod.cs:584 
  at System.Runtime.Serialization.ObjectManager.CompleteISerializableObject (System.Object obj, System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) [0x00059] in /Library/Frameworks/Xamarin.Mac.framework/Versions/5.2.1.13/src/Xamarin.Mac/mcs/class/referencesource/mscorlib/system/runtime/serialization/objectmanager.cs:874 
  at System.Runtime.Serialization.ObjectManager.FixupSpecialObject (System.Runtime.Serialization.ObjectHolder holder) [0x0007b] in /Library/Frameworks/Xamarin.Mac.framework/Versions/5.2.1.13/src/Xamarin.Mac/mcs/class/referencesource/mscorlib/system/runtime/serialization/objectmanager.cs:259 
  at System.Runtime.Serialization.ObjectManager.DoFixups () [0x0005a] in /Library/Frameworks/Xamarin.Mac.framework/Versions/5.2.1.13/src/Xamarin.Mac/mcs/class/referencesource/mscorlib/system/runtime/serialization/objectmanager.cs:925 
  at System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize (System.Runtime.Remoting.Messaging.HeaderHandler handler, System.Runtime.Serialization.Formatters.Binary.__BinaryParser serParser, System.Boolean fCheck, System.Boolean isCrossAppDomain, System.Runtime.Remoting.Messaging.IMethodCallMessage methodCallMessage) [0x00077] in /Library/Frameworks/Xamarin.Mac.framework/Versions/5.2.1.13/src/Xamarin.Mac/mcs/class/referencesource/mscorlib/system/runtime/serialization/formatters/binary/binaryobjectreader.cs:181 
  at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize (System.IO.Stream serializationStream, System.Runtime.Remoting.Messaging.HeaderHandler handler, System.Boolean fCheck, System.Boolean isCrossAppDomain, System.Runtime.Remoting.Messaging.IMethodCallMessage methodCallMessage) [0x00099] in /Library/Frameworks/Xamarin.Mac.framework/Versions/5.2.1.13/src/Xamarin.Mac/mcs/class/referencesource/mscorlib/system/runtime/serialization/formatters/binary/binaryformatter.cs:197 
  at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize (System.IO.Stream serializationStream, System.Runtime.Remoting.Messaging.HeaderHandler handler, System.Boolean fCheck, System.Runtime.Remoting.Messaging.IMethodCallMessage methodCallMessage) [0x00000] in /Library/Frameworks/Xamarin.Mac.framework/Versions/5.2.1.13/src/Xamarin.Mac/mcs/class/referencesource/mscorlib/system/runtime/serialization/formatters/binary/binaryformatter.cs:173 
  at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize (System.IO.Stream serializationStream, System.Runtime.Remoting.Messaging.HeaderHandler handler, System.Boolean fCheck) [0x00000] in /Library/Frameworks/Xamarin.Mac.framework/Versions/5.2.1.13/src/Xamarin.Mac/mcs/class/referencesource/mscorlib/system/runtime/serialization/formatters/binary/binaryformatter.cs:118 
  at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize (System.IO.Stream serializationStream, System.Runtime.Remoting.Messaging.HeaderHandler handler) [0x00000] in /Library/Frameworks/Xamarin.Mac.framework/Versions/5.2.1.13/src/Xamarin.Mac/mcs/class/referencesource/mscorlib/system/runtime/serialization/formatters/binary/binaryformatter.cs:149 
  at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize (System.IO.Stream serializationStream) [0x00000] in /Library/Frameworks/Xamarin.Mac.framework/Versions/5.2.1.13/src/Xamarin.Mac/mcs/class/referencesource/mscorlib/system/runtime/serialization/formatters/binary/binaryformatter.cs:111 
  at System.Resources.ResourceReader.DeserializeObject (System.Int32 typeIndex) [0x00008] in /Library/Frameworks/Xamarin.Mac.framework/Versions/5.2.1.13/src/Xamarin.Mac/mcs/class/referencesource/mscorlib/system/resources/resourcereader.cs:838 
  at System.Resources.ResourceReader._LoadObjectV2 (System.Int32 pos, System.Resources.ResourceTypeCode& typeCode) [0x0035c] in /Library/Frameworks/Xamarin.Mac.framework/Versions/5.2.1.13/src/Xamarin.Mac/mcs/class/referencesource/mscorlib/system/resources/resourcereader.cs:808 
  at System.Resources.ResourceReader.LoadObjectV2 (System.Int32 pos, System.Resources.ResourceTypeCode& typeCode) [0x00000] in /Library/Frameworks/Xamarin.Mac.framework/Versions/5.2.1.13/src/Xamarin.Mac/mcs/class/referencesource/mscorlib/system/resources/resourcereader.cs:679 
  at System.Resources.ResourceReader.LoadObject (System.Int32 pos, System.Resources.ResourceTypeCode& typeCode) [0x00022] in /Library/Frameworks/Xamarin.Mac.framework/Versions/5.2.1.13/src/Xamarin.Mac/mcs/class/referencesource/mscorlib/system/resources/resourcereader.cs:588 
  at System.Resources.RuntimeResourceSet.GetObject (System.String key, System.Boolean ignoreCase, System.Boolean isString) [0x000be] in /Library/Frameworks/Xamarin.Mac.framework/Versions/5.2.1.13/src/Xamarin.Mac/mcs/class/referencesource/mscorlib/system/resources/runtimeresourceset.cs:331 
  at System.Resources.RuntimeResourceSet.GetObject (System.String key, System.Boolean ignoreCase) [0x00000] in /Library/Frameworks/Xamarin.Mac.framework/Versions/5.2.1.13/src/Xamarin.Mac/mcs/class/referencesource/mscorlib/system/resources/runtimeresourceset.cs:286 
  at System.Resources.ResourceManager.GetObject (System.String name, System.Globalization.CultureInfo culture, System.Boolean wrapUnmanagedMemStream) [0x00028] in /Library/Frameworks/Xamarin.Mac.framework/Versions/5.2.1.13/src/Xamarin.Mac/mcs/class/referencesource/mscorlib/system/resources/resourcemanager.cs:1404 
  at System.Resources.ResourceManager.GetObject (System.String name) [0x00000] in /Library/Frameworks/Xamarin.Mac.framework/Versions/5.2.1.13/src/Xamarin.Mac/mcs/class/referencesource/mscorlib/system/resources/resourcemanager.cs:1360 
  at FontEditor.MainForm.InitializeComponent () [0x0350e] in <ca161138f7504b689b385d55224d8623>:0 
  at FontEditor.MainForm..ctor (System.String FileName) [0x00006] in <ca161138f7504b689b385d55224d8623>:0 
  at (wrapper remoting-invoke-with-check) FontEditor.MainForm..ctor(string)
  at FontEditor.MainForm.Main (System.String[] args) [0x00018] in <ca161138f7504b689b385d55224d8623>:0 

dotNet 7.0 update

Tried to use Winforms on Mac with .Net 7 and there're some assembly errors I wasn't able to resolve.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.