/// <inheritdoc />
        protected override void OnTextInput(TextInputEventArgs e)
        {
            base.OnTextInput(e);
            if (e.Handled)
            {
                return;
            }

            // Get connection
            RfbConnection?connection = Connection;

            if (connection == null)
            {
                return;
            }

            // Send chars one by one
            foreach (char c in e.Text)
            {
                KeySymbol keySymbol = KeyMapping.GetSymbolFromChar(c);

                // Press and release key
                if (!connection.EnqueueMessage(new KeyEventMessage(true, keySymbol)))
                {
                    break;
                }
                connection.EnqueueMessage(new KeyEventMessage(false, keySymbol));
            }

            e.Handled = true;
        }
        private bool HandleKeyEvent(bool downFlag, Key key, KeyModifiers keyModifiers)
        {
            // Get connection
            RfbConnection?connection = Connection;

            if (connection == null)
            {
                return(false);
            }

            // Might this key be part of a shortcut? When modifies are present, OnTextInput doesn't get called,
            // so we have to handle printable characters here now, too.
            bool includePrintable = (keyModifiers & KeyModifiers.Control) != 0;

            // Get key symbol
            KeySymbol keySymbol = KeyMapping.GetSymbolFromKey(key, includePrintable);

            if (keySymbol == KeySymbol.Null)
            {
                return(false);
            }

            // Send key event to server
            bool queued = connection.EnqueueMessage(new KeyEventMessage(downFlag, keySymbol));

            if (downFlag && queued)
            {
                _pressedKeys.Add(keySymbol);
            }
            else if (!downFlag)
            {
                _pressedKeys.Remove(keySymbol);
            }

            return(queued);
        }
Beispiel #3
0
        /// <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);
        }