Browse Source

initial work towards updating menus with virtual DOM.

pull/3762/head
Dan Walmsley 6 years ago
parent
commit
2e682e292e
  1. 406
      src/Avalonia.Native/AvaloniaNativeMenuExporter.cs
  2. 2
      src/Avalonia.Native/Mappings.xml
  3. 147
      src/Avalonia.Native/OsxUnicodeKeys.cs

406
src/Avalonia.Native/AvaloniaNativeMenuExporter.cs

@ -1,96 +1,153 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.Specialized; using System.Collections.Specialized;
using System.Linq;
using System.Text;
using Avalonia.Collections;
using Avalonia.Controls; using Avalonia.Controls;
using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Controls.Platform; using Avalonia.Controls.Platform;
using Avalonia.Input; using Avalonia.Dialogs;
using Avalonia.Native.Interop; using Avalonia.Native.Interop;
using Avalonia.Platform.Interop; using Avalonia.Platform.Interop;
using Avalonia.Threading; using Avalonia.Threading;
using Avalonia.Dialogs;
using Avalonia.Controls.ApplicationLifetimes;
namespace Avalonia.Native namespace Avalonia.Native.Interop
{ {
enum OsxUnicodeSpecialKey public partial class IAvnAppMenuItem
{
private IAvnAppMenu _subMenu;
public NativeMenuItemBase Managed { get; set; }
public void Update(IAvaloniaNativeFactory factory, NativeMenuItem item)
{
using (var buffer = new Utf8Buffer(item.Header))
{
Title = buffer.DangerousGetHandle();
}
if (item.Gesture != null)
{
using (var buffer = new Utf8Buffer(OsxUnicodeKeys.ConvertOSXSpecialKeyCodes(item.Gesture.Key)))
{
SetGesture(buffer.DangerousGetHandle(), (AvnInputModifiers)item.Gesture.KeyModifiers);
}
}
SetAction(new PredicateCallback(() =>
{
if (item.Command != null || item.HasClickHandlers)
{
return item.Enabled;
}
return false;
}), new MenuActionCallback(() => { item.RaiseClick(); }));
if (item.Menu != null)
{
if (_subMenu == null)
{
_subMenu = factory.CreateMenu();
}
_subMenu.Update(factory, item.Menu);
}
if (item.Menu == null && _subMenu != null)
{
// todo remove submenu.
// needs implementing on native side also.
}
}
}
public partial class IAvnAppMenu
{ {
NSUpArrowFunctionKey = 0xF700, private NativeMenu _menu;
NSDownArrowFunctionKey = 0xF701, private List<IAvnAppMenuItem> _menuItems = new List<IAvnAppMenuItem>();
NSLeftArrowFunctionKey = 0xF702, private Dictionary<NativeMenuItemBase, IAvnAppMenuItem> _menuItemLookup = new Dictionary<NativeMenuItemBase, IAvnAppMenuItem>();
NSRightArrowFunctionKey = 0xF703,
NSF1FunctionKey = 0xF704, private void Remove(IAvnAppMenuItem item)
NSF2FunctionKey = 0xF705, {
NSF3FunctionKey = 0xF706, _menuItemLookup.Remove(item.Managed);
NSF4FunctionKey = 0xF707, _menuItems.Remove(item);
NSF5FunctionKey = 0xF708,
NSF6FunctionKey = 0xF709, RemoveItem(item);
NSF7FunctionKey = 0xF70A, }
NSF8FunctionKey = 0xF70B,
NSF9FunctionKey = 0xF70C, private void InsertAt(int index, IAvnAppMenuItem item)
NSF10FunctionKey = 0xF70D, {
NSF11FunctionKey = 0xF70E, if (item.Managed == null)
NSF12FunctionKey = 0xF70F, {
NSF13FunctionKey = 0xF710, throw new InvalidOperationException("Cannot insert item that with Managed link null");
NSF14FunctionKey = 0xF711, }
NSF15FunctionKey = 0xF712,
NSF16FunctionKey = 0xF713, _menuItemLookup.Add(item.Managed, item);
NSF17FunctionKey = 0xF714, _menuItems.Insert(index, item);
NSF18FunctionKey = 0xF715,
NSF19FunctionKey = 0xF716, AddItem(item); // todo change to insertatimpl
NSF20FunctionKey = 0xF717, }
NSF21FunctionKey = 0xF718,
NSF22FunctionKey = 0xF719, private IAvnAppMenuItem CreateNew(IAvaloniaNativeFactory factory, NativeMenuItemBase item)
NSF23FunctionKey = 0xF71A, {
NSF24FunctionKey = 0xF71B, var nativeItem = item is NativeMenuItemSeperator ? factory.CreateMenuItemSeperator() : factory.CreateMenuItem();
NSF25FunctionKey = 0xF71C, nativeItem.Managed = item;
NSF26FunctionKey = 0xF71D,
NSF27FunctionKey = 0xF71E, return nativeItem;
NSF28FunctionKey = 0xF71F, }
NSF29FunctionKey = 0xF720,
NSF30FunctionKey = 0xF721, public void Update(IAvaloniaNativeFactory factory, NativeMenu menu, string title = "")
NSF31FunctionKey = 0xF722, {
NSF32FunctionKey = 0xF723, if (_menu == null)
NSF33FunctionKey = 0xF724, {
NSF34FunctionKey = 0xF725, _menu = menu;
NSF35FunctionKey = 0xF726, }
NSInsertFunctionKey = 0xF727, else if (_menu != menu)
NSDeleteFunctionKey = 0xF728, {
NSHomeFunctionKey = 0xF729, throw new Exception("Cannot update a menu from another instance");
NSBeginFunctionKey = 0xF72A, }
NSEndFunctionKey = 0xF72B,
NSPageUpFunctionKey = 0xF72C, if (!string.IsNullOrWhiteSpace(title))
NSPageDownFunctionKey = 0xF72D, {
NSPrintScreenFunctionKey = 0xF72E, using (var buffer = new Utf8Buffer(title))
NSScrollLockFunctionKey = 0xF72F, {
NSPauseFunctionKey = 0xF730, Title = buffer.DangerousGetHandle();
NSSysReqFunctionKey = 0xF731, }
NSBreakFunctionKey = 0xF732, }
NSResetFunctionKey = 0xF733,
NSStopFunctionKey = 0xF734, for (int i = 0; i < menu.Items.Count; i++)
NSMenuFunctionKey = 0xF735, {
NSUserFunctionKey = 0xF736, IAvnAppMenuItem nativeItem = null;
NSSystemFunctionKey = 0xF737, if (i >= _menuItems.Count || menu.Items[i] != _menuItems[i].Managed)
NSPrintFunctionKey = 0xF738, {
NSClearLineFunctionKey = 0xF739, if (_menuItemLookup.TryGetValue(menu.Items[i], out nativeItem))
NSClearDisplayFunctionKey = 0xF73A, {
NSInsertLineFunctionKey = 0xF73B, Remove(nativeItem);
NSDeleteLineFunctionKey = 0xF73C, InsertAt(i, nativeItem);
NSInsertCharFunctionKey = 0xF73D, }
NSDeleteCharFunctionKey = 0xF73E, else
NSPrevFunctionKey = 0xF73F, {
NSNextFunctionKey = 0xF740, nativeItem = CreateNew(factory, menu.Items[i]);
NSSelectFunctionKey = 0xF741, InsertAt(i, nativeItem);
NSExecuteFunctionKey = 0xF742, }
NSUndoFunctionKey = 0xF743, }
NSRedoFunctionKey = 0xF744,
NSFindFunctionKey = 0xF745, if (menu.Items[i] is NativeMenuItem nmi)
NSHelpFunctionKey = 0xF746, {
NSModeSwitchFunctionKey = 0xF747 nativeItem.Update(factory, nmi);
}
}
for (int i = menu.Items.Count; i < _menuItems.Count; i++)
{
_menuItems.Remove(_menuItems[i]);
}
}
} }
}
namespace Avalonia.Native
{
public class MenuActionCallback : CallbackBase, IAvnActionCallback public class MenuActionCallback : CallbackBase, IAvnActionCallback
{ {
private Action _action; private Action _action;
@ -130,57 +187,6 @@ namespace Avalonia.Native
private IAvnWindow _nativeWindow; private IAvnWindow _nativeWindow;
private List<NativeMenuItem> _menuItems = new List<NativeMenuItem>(); private List<NativeMenuItem> _menuItems = new List<NativeMenuItem>();
private static Dictionary<Key, OsxUnicodeSpecialKey> osxKeys = new Dictionary<Key, OsxUnicodeSpecialKey>
{
{Key.Up, OsxUnicodeSpecialKey.NSUpArrowFunctionKey },
{Key.Down, OsxUnicodeSpecialKey.NSDownArrowFunctionKey },
{Key.Left, OsxUnicodeSpecialKey.NSLeftArrowFunctionKey },
{Key.Right, OsxUnicodeSpecialKey.NSRightArrowFunctionKey },
{ Key.F1, OsxUnicodeSpecialKey.NSF1FunctionKey },
{ Key.F2, OsxUnicodeSpecialKey.NSF2FunctionKey },
{ Key.F3, OsxUnicodeSpecialKey.NSF3FunctionKey },
{ Key.F4, OsxUnicodeSpecialKey.NSF4FunctionKey },
{ Key.F5, OsxUnicodeSpecialKey.NSF5FunctionKey },
{ Key.F6, OsxUnicodeSpecialKey.NSF6FunctionKey },
{ Key.F7, OsxUnicodeSpecialKey.NSF7FunctionKey },
{ Key.F8, OsxUnicodeSpecialKey.NSF8FunctionKey },
{ Key.F9, OsxUnicodeSpecialKey.NSF9FunctionKey },
{ Key.F10, OsxUnicodeSpecialKey.NSF10FunctionKey },
{ Key.F11, OsxUnicodeSpecialKey.NSF11FunctionKey },
{ Key.F12, OsxUnicodeSpecialKey.NSF12FunctionKey },
{ Key.F13, OsxUnicodeSpecialKey.NSF13FunctionKey },
{ Key.F14, OsxUnicodeSpecialKey.NSF14FunctionKey },
{ Key.F15, OsxUnicodeSpecialKey.NSF15FunctionKey },
{ Key.F16, OsxUnicodeSpecialKey.NSF16FunctionKey },
{ Key.F17, OsxUnicodeSpecialKey.NSF17FunctionKey },
{ Key.F18, OsxUnicodeSpecialKey.NSF18FunctionKey },
{ Key.F19, OsxUnicodeSpecialKey.NSF19FunctionKey },
{ Key.F20, OsxUnicodeSpecialKey.NSF20FunctionKey },
{ Key.F21, OsxUnicodeSpecialKey.NSF21FunctionKey },
{ Key.F22, OsxUnicodeSpecialKey.NSF22FunctionKey },
{ Key.F23, OsxUnicodeSpecialKey.NSF23FunctionKey },
{ Key.F24, OsxUnicodeSpecialKey.NSF24FunctionKey },
{ Key.Insert, OsxUnicodeSpecialKey.NSInsertFunctionKey },
{ Key.Delete, OsxUnicodeSpecialKey.NSDeleteFunctionKey },
{ Key.Home, OsxUnicodeSpecialKey.NSHomeFunctionKey },
//{ Key.Begin, OsxUnicodeSpecialKey.NSBeginFunctionKey },
{ Key.End, OsxUnicodeSpecialKey.NSEndFunctionKey },
{ Key.PageUp, OsxUnicodeSpecialKey.NSPageUpFunctionKey },
{ Key.PageDown, OsxUnicodeSpecialKey.NSPageDownFunctionKey },
{ Key.PrintScreen, OsxUnicodeSpecialKey.NSPrintScreenFunctionKey },
{ Key.Scroll, OsxUnicodeSpecialKey.NSScrollLockFunctionKey },
//{ Key.SysReq, OsxUnicodeSpecialKey.NSSysReqFunctionKey },
//{ Key.Break, OsxUnicodeSpecialKey.NSBreakFunctionKey },
//{ Key.Reset, OsxUnicodeSpecialKey.NSResetFunctionKey },
//{ Key.Stop, OsxUnicodeSpecialKey.NSStopFunctionKey },
//{ Key.Menu, OsxUnicodeSpecialKey.NSMenuFunctionKey },
//{ Key.UserFunction, OsxUnicodeSpecialKey.NSUserFunctionKey },
//{ Key.SystemFunction, OsxUnicodeSpecialKey.NSSystemFunctionKey },
{ Key.Print, OsxUnicodeSpecialKey.NSPrintFunctionKey },
//{ Key.ClearLine, OsxUnicodeSpecialKey.NSClearLineFunctionKey },
//{ Key.ClearDisplay, OsxUnicodeSpecialKey.NSClearDisplayFunctionKey },
};
public AvaloniaNativeMenuExporter(IAvnWindow nativeWindow, IAvaloniaNativeFactory factory) public AvaloniaNativeMenuExporter(IAvnWindow nativeWindow, IAvaloniaNativeFactory factory)
{ {
_factory = factory; _factory = factory;
@ -194,6 +200,7 @@ namespace Avalonia.Native
_factory = factory; _factory = factory;
_menu = NativeMenu.GetMenu(Application.Current); _menu = NativeMenu.GetMenu(Application.Current);
DoLayoutReset(); DoLayoutReset();
} }
@ -255,15 +262,15 @@ namespace Avalonia.Native
i.PropertyChanged -= OnItemPropertyChanged; i.PropertyChanged -= OnItemPropertyChanged;
if (i.Menu != null) if (i.Menu != null)
((INotifyCollectionChanged)i.Menu.Items).CollectionChanged -= OnMenuItemsChanged; ((INotifyCollectionChanged)i.Menu.Items).CollectionChanged -= OnMenuItemsChanged;
} }
_menuItems.Clear(); _menuItems.Clear();
if(_nativeWindow is null) if (_nativeWindow is null)
{ {
_menu = NativeMenu.GetMenu(Application.Current); _menu = NativeMenu.GetMenu(Application.Current);
if(_menu != null) if (_menu != null)
{ {
SetMenu(_menu); SetMenu(_menu);
} }
@ -292,7 +299,7 @@ namespace Avalonia.Native
{ {
var menu = _factory.CreateMenu(); var menu = _factory.CreateMenu();
SetChildren(menu, children); //SetChildren(menu, children);
return menu; return menu;
} }
@ -305,128 +312,9 @@ namespace Avalonia.Native
} }
} }
private static string ConvertOSXSpecialKeyCodes(Key key)
{
if (osxKeys.ContainsKey(key))
{
return ((char)osxKeys[key]).ToString();
}
else
{
return key.ToString().ToLower();
}
}
private void SetChildren(IAvnAppMenu menu, ICollection<NativeMenuItemBase> children)
{
foreach (var i in children)
{
if (i is NativeMenuItem item)
{
AddMenuItem(item);
var menuItem = _factory.CreateMenuItem();
using (var buffer = new Utf8Buffer(item.Header))
{
menuItem.Title = buffer.DangerousGetHandle();
}
if (item.Gesture != null)
{
using (var buffer = new Utf8Buffer(ConvertOSXSpecialKeyCodes(item.Gesture.Key)))
{
menuItem.SetGesture(buffer.DangerousGetHandle(), (AvnInputModifiers)item.Gesture.KeyModifiers);
}
}
menuItem.SetAction(new PredicateCallback(() =>
{
if (item.Command != null || item.HasClickHandlers)
{
return item.Enabled;
}
return false;
}), new MenuActionCallback(() => { item.RaiseClick(); }));
menu.AddItem(menuItem);
if (item.Menu?.Items?.Count >= 0)
{
var submenu = _factory.CreateMenu();
using (var buffer = new Utf8Buffer(item.Header))
{
submenu.Title = buffer.DangerousGetHandle();
}
menuItem.SetSubMenu(submenu);
AddItemsToMenu(submenu, item.Menu?.Items);
}
}
else if (i is NativeMenuItemSeperator seperator)
{
menu.AddItem(_factory.CreateMenuItemSeperator());
}
}
}
private void AddItemsToMenu(IAvnAppMenu menu, ICollection<NativeMenuItemBase> items, bool isMainMenu = false)
{
foreach (var i in items)
{
if (i is NativeMenuItem item)
{
var menuItem = _factory.CreateMenuItem();
AddMenuItem(item);
menuItem.SetAction(new PredicateCallback(() =>
{
if (item.Command != null || item.HasClickHandlers)
{
return item.Enabled;
}
return false;
}), new MenuActionCallback(() => { item.RaiseClick(); }));
if (item.Menu?.Items.Count >= 0 || isMainMenu)
{
var subMenu = CreateSubmenu(item.Menu?.Items);
menuItem.SetSubMenu(subMenu);
using (var buffer = new Utf8Buffer(item.Header))
{
subMenu.Title = buffer.DangerousGetHandle();
}
}
else
{
using (var buffer = new Utf8Buffer(item.Header))
{
menuItem.Title = buffer.DangerousGetHandle();
}
if (item.Gesture != null)
{
using (var buffer = new Utf8Buffer(item.Gesture.Key.ToString().ToLower()))
{
menuItem.SetGesture(buffer.DangerousGetHandle(), (AvnInputModifiers)item.Gesture.KeyModifiers);
}
}
}
menu.AddItem(menuItem);
}
else if(i is NativeMenuItemSeperator seperator)
{
menu.AddItem(_factory.CreateMenuItemSeperator());
}
}
}
private void SetMenu(NativeMenu menu) private void SetMenu(NativeMenu menu)
{ {
@ -439,15 +327,15 @@ namespace Avalonia.Native
var menuItem = menu.Parent; var menuItem = menu.Parent;
if(menu.Parent is null) if (menu.Parent is null)
{ {
menuItem = new NativeMenuItem(); menuItem = new NativeMenuItem();
} }
menuItem.Menu = menu; menuItem.Menu = menu;
appMenu.Clear(); //appMenu.Clear();
AddItemsToMenu(appMenu, new List<NativeMenuItemBase> { menuItem }); //AddItemsToMenu(appMenu, new List<NativeMenuItemBase> { menuItem });
_factory.SetAppMenu(appMenu); _factory.SetAppMenu(appMenu);
} }
@ -466,8 +354,8 @@ namespace Avalonia.Native
appMenu = _factory.CreateMenu(); appMenu = _factory.CreateMenu();
} }
appMenu.Clear(); //appMenu.Clear();
AddItemsToMenu(appMenu, menuItems); //AddItemsToMenu(appMenu, menuItems);
avnWindow.SetMainMenu(appMenu); avnWindow.SetMainMenu(appMenu);
} }

2
src/Avalonia.Native/Mappings.xml

@ -19,5 +19,7 @@
<map param=".*::.*::ppv" return="true"/> <map param=".*::.*::ppv" return="true"/>
<map param=".*::.*::ret" return="true"/> <map param=".*::.*::ret" return="true"/>
<map param=".*::.*::retOut" attribute="out" return="true"/> <map param=".*::.*::retOut" attribute="out" return="true"/>
<map method="IAvnAppMenu:.*" visibility="private" />
<map method="IAvnAppMenuItem:.*" visibility="private" />
</mapping> </mapping>
</config> </config>

147
src/Avalonia.Native/OsxUnicodeKeys.cs

@ -0,0 +1,147 @@
using System.Collections.Generic;
using Avalonia.Input;
namespace Avalonia.Native.Interop
{
internal static class OsxUnicodeKeys
{
enum OsxUnicodeSpecialKey
{
NSUpArrowFunctionKey = 0xF700,
NSDownArrowFunctionKey = 0xF701,
NSLeftArrowFunctionKey = 0xF702,
NSRightArrowFunctionKey = 0xF703,
NSF1FunctionKey = 0xF704,
NSF2FunctionKey = 0xF705,
NSF3FunctionKey = 0xF706,
NSF4FunctionKey = 0xF707,
NSF5FunctionKey = 0xF708,
NSF6FunctionKey = 0xF709,
NSF7FunctionKey = 0xF70A,
NSF8FunctionKey = 0xF70B,
NSF9FunctionKey = 0xF70C,
NSF10FunctionKey = 0xF70D,
NSF11FunctionKey = 0xF70E,
NSF12FunctionKey = 0xF70F,
NSF13FunctionKey = 0xF710,
NSF14FunctionKey = 0xF711,
NSF15FunctionKey = 0xF712,
NSF16FunctionKey = 0xF713,
NSF17FunctionKey = 0xF714,
NSF18FunctionKey = 0xF715,
NSF19FunctionKey = 0xF716,
NSF20FunctionKey = 0xF717,
NSF21FunctionKey = 0xF718,
NSF22FunctionKey = 0xF719,
NSF23FunctionKey = 0xF71A,
NSF24FunctionKey = 0xF71B,
NSF25FunctionKey = 0xF71C,
NSF26FunctionKey = 0xF71D,
NSF27FunctionKey = 0xF71E,
NSF28FunctionKey = 0xF71F,
NSF29FunctionKey = 0xF720,
NSF30FunctionKey = 0xF721,
NSF31FunctionKey = 0xF722,
NSF32FunctionKey = 0xF723,
NSF33FunctionKey = 0xF724,
NSF34FunctionKey = 0xF725,
NSF35FunctionKey = 0xF726,
NSInsertFunctionKey = 0xF727,
NSDeleteFunctionKey = 0xF728,
NSHomeFunctionKey = 0xF729,
NSBeginFunctionKey = 0xF72A,
NSEndFunctionKey = 0xF72B,
NSPageUpFunctionKey = 0xF72C,
NSPageDownFunctionKey = 0xF72D,
NSPrintScreenFunctionKey = 0xF72E,
NSScrollLockFunctionKey = 0xF72F,
NSPauseFunctionKey = 0xF730,
NSSysReqFunctionKey = 0xF731,
NSBreakFunctionKey = 0xF732,
NSResetFunctionKey = 0xF733,
NSStopFunctionKey = 0xF734,
NSMenuFunctionKey = 0xF735,
NSUserFunctionKey = 0xF736,
NSSystemFunctionKey = 0xF737,
NSPrintFunctionKey = 0xF738,
NSClearLineFunctionKey = 0xF739,
NSClearDisplayFunctionKey = 0xF73A,
NSInsertLineFunctionKey = 0xF73B,
NSDeleteLineFunctionKey = 0xF73C,
NSInsertCharFunctionKey = 0xF73D,
NSDeleteCharFunctionKey = 0xF73E,
NSPrevFunctionKey = 0xF73F,
NSNextFunctionKey = 0xF740,
NSSelectFunctionKey = 0xF741,
NSExecuteFunctionKey = 0xF742,
NSUndoFunctionKey = 0xF743,
NSRedoFunctionKey = 0xF744,
NSFindFunctionKey = 0xF745,
NSHelpFunctionKey = 0xF746,
NSModeSwitchFunctionKey = 0xF747
}
private static Dictionary<Key, OsxUnicodeSpecialKey> s_osxKeys = new Dictionary<Key, OsxUnicodeSpecialKey>
{
{Key.Up, OsxUnicodeSpecialKey.NSUpArrowFunctionKey },
{Key.Down, OsxUnicodeSpecialKey.NSDownArrowFunctionKey },
{Key.Left, OsxUnicodeSpecialKey.NSLeftArrowFunctionKey },
{Key.Right, OsxUnicodeSpecialKey.NSRightArrowFunctionKey },
{ Key.F1, OsxUnicodeSpecialKey.NSF1FunctionKey },
{ Key.F2, OsxUnicodeSpecialKey.NSF2FunctionKey },
{ Key.F3, OsxUnicodeSpecialKey.NSF3FunctionKey },
{ Key.F4, OsxUnicodeSpecialKey.NSF4FunctionKey },
{ Key.F5, OsxUnicodeSpecialKey.NSF5FunctionKey },
{ Key.F6, OsxUnicodeSpecialKey.NSF6FunctionKey },
{ Key.F7, OsxUnicodeSpecialKey.NSF7FunctionKey },
{ Key.F8, OsxUnicodeSpecialKey.NSF8FunctionKey },
{ Key.F9, OsxUnicodeSpecialKey.NSF9FunctionKey },
{ Key.F10, OsxUnicodeSpecialKey.NSF10FunctionKey },
{ Key.F11, OsxUnicodeSpecialKey.NSF11FunctionKey },
{ Key.F12, OsxUnicodeSpecialKey.NSF12FunctionKey },
{ Key.F13, OsxUnicodeSpecialKey.NSF13FunctionKey },
{ Key.F14, OsxUnicodeSpecialKey.NSF14FunctionKey },
{ Key.F15, OsxUnicodeSpecialKey.NSF15FunctionKey },
{ Key.F16, OsxUnicodeSpecialKey.NSF16FunctionKey },
{ Key.F17, OsxUnicodeSpecialKey.NSF17FunctionKey },
{ Key.F18, OsxUnicodeSpecialKey.NSF18FunctionKey },
{ Key.F19, OsxUnicodeSpecialKey.NSF19FunctionKey },
{ Key.F20, OsxUnicodeSpecialKey.NSF20FunctionKey },
{ Key.F21, OsxUnicodeSpecialKey.NSF21FunctionKey },
{ Key.F22, OsxUnicodeSpecialKey.NSF22FunctionKey },
{ Key.F23, OsxUnicodeSpecialKey.NSF23FunctionKey },
{ Key.F24, OsxUnicodeSpecialKey.NSF24FunctionKey },
{ Key.Insert, OsxUnicodeSpecialKey.NSInsertFunctionKey },
{ Key.Delete, OsxUnicodeSpecialKey.NSDeleteFunctionKey },
{ Key.Home, OsxUnicodeSpecialKey.NSHomeFunctionKey },
//{ Key.Begin, OsxUnicodeSpecialKey.NSBeginFunctionKey },
{ Key.End, OsxUnicodeSpecialKey.NSEndFunctionKey },
{ Key.PageUp, OsxUnicodeSpecialKey.NSPageUpFunctionKey },
{ Key.PageDown, OsxUnicodeSpecialKey.NSPageDownFunctionKey },
{ Key.PrintScreen, OsxUnicodeSpecialKey.NSPrintScreenFunctionKey },
{ Key.Scroll, OsxUnicodeSpecialKey.NSScrollLockFunctionKey },
//{ Key.SysReq, OsxUnicodeSpecialKey.NSSysReqFunctionKey },
//{ Key.Break, OsxUnicodeSpecialKey.NSBreakFunctionKey },
//{ Key.Reset, OsxUnicodeSpecialKey.NSResetFunctionKey },
//{ Key.Stop, OsxUnicodeSpecialKey.NSStopFunctionKey },
//{ Key.Menu, OsxUnicodeSpecialKey.NSMenuFunctionKey },
//{ Key.UserFunction, OsxUnicodeSpecialKey.NSUserFunctionKey },
//{ Key.SystemFunction, OsxUnicodeSpecialKey.NSSystemFunctionKey },
{ Key.Print, OsxUnicodeSpecialKey.NSPrintFunctionKey },
//{ Key.ClearLine, OsxUnicodeSpecialKey.NSClearLineFunctionKey },
//{ Key.ClearDisplay, OsxUnicodeSpecialKey.NSClearDisplayFunctionKey },
};
public static string ConvertOSXSpecialKeyCodes(Key key)
{
if (s_osxKeys.ContainsKey(key))
{
return ((char)s_osxKeys[key]).ToString();
}
else
{
return key.ToString().ToLower();
}
}
}
}
Loading…
Cancel
Save