Skip to content

Commit

Permalink
feat: added Skia client (for in memory use)
Browse files Browse the repository at this point in the history
  • Loading branch information
paviad committed Jul 29, 2024
1 parent 0eeca47 commit 0bf17eb
Show file tree
Hide file tree
Showing 8 changed files with 1,572 additions and 0 deletions.
7 changes: 7 additions & 0 deletions MarcusW.VncClient.sln
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MarcusW.VncClient.Wpf", "sr
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WpfVncClient", "samples\WpfVncClient\WpfVncClient.csproj", "{23277D61-F815-4339-AE74-03BE39E36D2B}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MarcusW.VncClient.Skia", "src\MarcusW.VncClient.Skia\MarcusW.VncClient.Skia.csproj", "{A02D99B0-3C63-49C4-A4B7-147FDCD08102}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand Down Expand Up @@ -64,6 +66,10 @@ Global
{23277D61-F815-4339-AE74-03BE39E36D2B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{23277D61-F815-4339-AE74-03BE39E36D2B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{23277D61-F815-4339-AE74-03BE39E36D2B}.Release|Any CPU.Build.0 = Release|Any CPU
{A02D99B0-3C63-49C4-A4B7-147FDCD08102}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A02D99B0-3C63-49C4-A4B7-147FDCD08102}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A02D99B0-3C63-49C4-A4B7-147FDCD08102}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A02D99B0-3C63-49C4-A4B7-147FDCD08102}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand All @@ -76,6 +82,7 @@ Global
{73A59C77-A920-476C-B4E2-07437E2C971D} = {678728BC-1F28-4C65-894B-545C62739E73}
{A454F5D1-713D-49B1-B9A3-7B490A635826} = {2CB2F0BD-AABA-4047-AAEE-E3AA512EFE47}
{23277D61-F815-4339-AE74-03BE39E36D2B} = {F24C1D8F-7ADE-4900-BB9B-817D0AD10C50}
{A02D99B0-3C63-49C4-A4B7-147FDCD08102} = {2CB2F0BD-AABA-4047-AAEE-E3AA512EFE47}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {9F1B3E40-9675-426B-AC5A-B5636F738D28}
Expand Down
156 changes: 156 additions & 0 deletions src/MarcusW.VncClient.Skia/KeyMapping.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
using MarcusW.VncClient.Skia.Models;

namespace MarcusW.VncClient.Skia;

/// <summary>
/// Provides methods for mapping keys.
/// </summary>
public static class KeyMapping
{
/// <summary>
/// Maps a printable char to a <see cref="KeySymbol" />.
/// </summary>
/// <param name="c">The char.</param>
/// <returns>The X key symbol.</returns>
public static KeySymbol GetSymbolFromChar(char c)
{
if (c is >= ' ' and <= '~')
{
return KeySymbol.space + (c - ' ');
}

return (KeySymbol)(0x1000000 | c);
}

/// <summary>
/// Maps an Avalonia <see cref="Key" /> to a <see cref="KeySymbol" />.
/// </summary>
/// <param name="key">The key.</param>
/// <param name="includePrintable">True, if printable chars should be included in the mapping, false otherwise.</param>
/// <returns>The X key symbol.</returns>
public static KeySymbol GetSymbolFromKey(Key key, bool includePrintable = true)
{
KeySymbol keySymbol = key switch {
Key.Cancel => KeySymbol.Cancel,
Key.Back => KeySymbol.BackSpace,
Key.Tab => KeySymbol.Tab,
Key.LineFeed => KeySymbol.Linefeed,
Key.Clear => KeySymbol.Clear,
Key.Return => KeySymbol.Return,
Key.Pause => KeySymbol.Pause,
Key.CapsLock => KeySymbol.Caps_Lock,
Key.Escape => KeySymbol.Escape,
Key.Prior => KeySymbol.Prior,
Key.PageDown => KeySymbol.Page_Down,
Key.End => KeySymbol.End,
Key.Home => KeySymbol.Home,
Key.Left => KeySymbol.Left,
Key.Up => KeySymbol.Up,
Key.Right => KeySymbol.Right,
Key.Down => KeySymbol.Down,
Key.Select => KeySymbol.Select,
Key.Print => KeySymbol.Print,
Key.Execute => KeySymbol.Execute,
Key.Insert => KeySymbol.Insert,
Key.Delete => KeySymbol.Delete,
Key.Help => KeySymbol.Help,
Key.LWin => KeySymbol.Super_L,
Key.RWin => KeySymbol.Super_R,
Key.Apps => KeySymbol.Menu,
Key.F1 => KeySymbol.F1,
Key.F2 => KeySymbol.F2,
Key.F3 => KeySymbol.F3,
Key.F4 => KeySymbol.F4,
Key.F5 => KeySymbol.F5,
Key.F6 => KeySymbol.F6,
Key.F7 => KeySymbol.F7,
Key.F8 => KeySymbol.F8,
Key.F9 => KeySymbol.F9,
Key.F10 => KeySymbol.F10,
Key.F11 => KeySymbol.F11,
Key.F12 => KeySymbol.F12,
Key.F13 => KeySymbol.F13,
Key.F14 => KeySymbol.F14,
Key.F15 => KeySymbol.F15,
Key.F16 => KeySymbol.F16,
Key.F17 => KeySymbol.F17,
Key.F18 => KeySymbol.F18,
Key.F19 => KeySymbol.F19,
Key.F20 => KeySymbol.F20,
Key.F21 => KeySymbol.F21,
Key.F22 => KeySymbol.F22,
Key.F23 => KeySymbol.F23,
Key.F24 => KeySymbol.F24,
Key.NumLock => KeySymbol.Num_Lock,
Key.Scroll => KeySymbol.Scroll_Lock,
Key.LeftShift => KeySymbol.Shift_L,
Key.RightShift => KeySymbol.Shift_R,
Key.LeftCtrl => KeySymbol.Control_L,
Key.RightCtrl => KeySymbol.Control_R,
Key.LeftAlt => KeySymbol.Alt_L,
Key.RightAlt => KeySymbol.Alt_R,
var _ => KeySymbol.Null,
};

if (keySymbol == KeySymbol.Null && includePrintable)
{
keySymbol = key switch {
Key.Space => KeySymbol.space,
Key.A => KeySymbol.a,
Key.B => KeySymbol.b,
Key.C => KeySymbol.c,
Key.D => KeySymbol.d,
Key.E => KeySymbol.e,
Key.F => KeySymbol.f,
Key.G => KeySymbol.g,
Key.H => KeySymbol.h,
Key.I => KeySymbol.i,
Key.J => KeySymbol.j,
Key.K => KeySymbol.k,
Key.L => KeySymbol.l,
Key.M => KeySymbol.m,
Key.N => KeySymbol.n,
Key.O => KeySymbol.o,
Key.P => KeySymbol.p,
Key.Q => KeySymbol.q,
Key.R => KeySymbol.r,
Key.S => KeySymbol.s,
Key.T => KeySymbol.t,
Key.U => KeySymbol.u,
Key.V => KeySymbol.v,
Key.W => KeySymbol.w,
Key.X => KeySymbol.x,
Key.Y => KeySymbol.y,
Key.Z => KeySymbol.z,
Key.NumPad0 => KeySymbol.KP_0,
Key.NumPad1 => KeySymbol.KP_1,
Key.NumPad2 => KeySymbol.KP_2,
Key.NumPad3 => KeySymbol.KP_3,
Key.NumPad4 => KeySymbol.KP_4,
Key.NumPad5 => KeySymbol.KP_5,
Key.NumPad6 => KeySymbol.KP_6,
Key.NumPad7 => KeySymbol.KP_7,
Key.NumPad8 => KeySymbol.KP_8,
Key.NumPad9 => KeySymbol.KP_9,
Key.Multiply => KeySymbol.KP_Multiply,
Key.Add => KeySymbol.KP_Add,
Key.Subtract => KeySymbol.KP_Subtract,
Key.Decimal => KeySymbol.KP_Decimal,
Key.Divide => KeySymbol.KP_Divide,
Key.D1 => KeySymbol.XK_1,
Key.D2 => KeySymbol.XK_2,
Key.D3 => KeySymbol.XK_3,
Key.D4 => KeySymbol.XK_4,
Key.D5 => KeySymbol.XK_5,
Key.D6 => KeySymbol.XK_6,
Key.D7 => KeySymbol.XK_7,
Key.D8 => KeySymbol.XK_8,
Key.D9 => KeySymbol.XK_9,
Key.D0 => KeySymbol.XK_0,
var _ => KeySymbol.Null,
};
}

return keySymbol;
}
}
14 changes: 14 additions & 0 deletions src/MarcusW.VncClient.Skia/KeyModifiers.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
using JetBrains.Annotations;

namespace MarcusW.VncClient.Skia;

[Flags]
[PublicAPI]
public enum KeyModifiers
{
None = 0,
Alt = 1,
Control = 2,
Shift = 4,
Meta = 8,
}
32 changes: 32 additions & 0 deletions src/MarcusW.VncClient.Skia/MarcusW.VncClient.Skia.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="JetBrains.Annotations" Version="2024.2.0" />
<PackageReference Include="SkiaSharp" Version="2.88.8" />
<PackageReference Include="SkiaSharp.NativeAssets.Win32" Version="2.88.8" />
<PackageReference Include="System.Reactive" Version="6.0.1" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\MarcusW.VncClient\MarcusW.VncClient.csproj" />
</ItemGroup>

<ItemGroup>
<Compile Update="VncView.KeyInput.cs">
<DependentUpon>VncView.cs</DependentUpon>
</Compile>
<Compile Update="VncView.MouseInput.cs">
<DependentUpon>VncView.cs</DependentUpon>
</Compile>
<Compile Update="VncView.Sizing.cs">
<DependentUpon>VncView.cs</DependentUpon>
</Compile>
</ItemGroup>

</Project>
11 changes: 11 additions & 0 deletions src/MarcusW.VncClient.Skia/Models/Clipboard.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
namespace MarcusW.VncClient.Skia.Models;

public static class Clipboard
{
public static string? Text { get; set; }

public static void SetText(string text)
{
Text = text;
}
}
Loading

0 comments on commit 0bf17eb

Please sign in to comment.