Skip to content

Commit

Permalink
support other hardware,such as macos
Browse files Browse the repository at this point in the history
  • Loading branch information
jingxu.zm committed Jul 2, 2024
1 parent c45b0bd commit a31c007
Showing 1 changed file with 118 additions and 3 deletions.
121 changes: 118 additions & 3 deletions crates/ironrdp-client/src/gui.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ use std::num::NonZeroU32;
use anyhow::Context as _;
use tokio::sync::mpsc;
use winit::dpi::LogicalPosition;
use winit::event::{self, Event, WindowEvent};
use winit::event::{self, Event, VirtualKeyCode, WindowEvent};
use winit::event_loop::{ControlFlow, EventLoop, EventLoopBuilder, EventLoopProxy};
use winit::window::{Window, WindowBuilder};

Expand Down Expand Up @@ -103,8 +103,11 @@ impl GuiContext {
// TODO(#376): Implement unicode input in native client
}
WindowEvent::KeyboardInput { input, .. } => {
let scancode = ironrdp::input::Scancode::from_u16(u16::try_from(input.scancode).unwrap());

let scancode = if let Some(virtual_keycode) = input.virtual_keycode {
ironrdp::input::Scancode::from_u16(to_scancode(virtual_keycode))
} else {
ironrdp::input::Scancode::from_u16(u16::try_from(input.scancode).unwrap())
};
let operation = match input.state {
event::ElementState::Pressed => ironrdp::input::Operation::KeyPressed(scancode),
event::ElementState::Released => ironrdp::input::Operation::KeyReleased(scancode),
Expand Down Expand Up @@ -297,3 +300,115 @@ fn send_fast_path_events(
let _ = input_event_sender.send(RdpInputEvent::FastPath(input_events));
}
}

fn to_scancode(key: VirtualKeyCode) -> u16 {
match key {
VirtualKeyCode::Escape => 0x0001,
VirtualKeyCode::Key1 => 0x0002,
VirtualKeyCode::Key2 => 0x0003,
VirtualKeyCode::Key3 => 0x0004,
VirtualKeyCode::Key4 => 0x0005,
VirtualKeyCode::Key5 => 0x0006,
VirtualKeyCode::Key6 => 0x0007,
VirtualKeyCode::Key7 => 0x0008,
VirtualKeyCode::Key8 => 0x0009,
VirtualKeyCode::Key9 => 0x000A,
VirtualKeyCode::Key0 => 0x000B,
VirtualKeyCode::Minus => 0x000C,
VirtualKeyCode::Equals => 0x000D,
VirtualKeyCode::Back => 0x000E,
VirtualKeyCode::Tab => 0x000F,
VirtualKeyCode::Q => 0x0010,
VirtualKeyCode::W => 0x0011,
VirtualKeyCode::E => 0x0012,
VirtualKeyCode::R => 0x0013,
VirtualKeyCode::T => 0x0014,
VirtualKeyCode::Y => 0x0015,
VirtualKeyCode::U => 0x0016,
VirtualKeyCode::I => 0x0017,
VirtualKeyCode::O => 0x0018,
VirtualKeyCode::P => 0x0019,
VirtualKeyCode::LBracket => 0x001A,
VirtualKeyCode::RBracket => 0x001B,
VirtualKeyCode::Return => 0x001C,
VirtualKeyCode::LControl => 0x001D,
VirtualKeyCode::A => 0x001E,
VirtualKeyCode::S => 0x001F,
VirtualKeyCode::D => 0x0020,
VirtualKeyCode::F => 0x0021,
VirtualKeyCode::G => 0x0022,
VirtualKeyCode::H => 0x0023,
VirtualKeyCode::J => 0x0024,
VirtualKeyCode::K => 0x0025,
VirtualKeyCode::L => 0x0026,
VirtualKeyCode::Semicolon => 0x0027,
VirtualKeyCode::Apostrophe => 0x0028,
VirtualKeyCode::Grave => 0x0029,
VirtualKeyCode::LShift => 0x002A,
VirtualKeyCode::Backslash => 0x002B,
VirtualKeyCode::Z => 0x002C,
VirtualKeyCode::X => 0x002D,
VirtualKeyCode::C => 0x002E,
VirtualKeyCode::V => 0x002F,
VirtualKeyCode::B => 0x0030,
VirtualKeyCode::N => 0x0031,
VirtualKeyCode::M => 0x0032,
VirtualKeyCode::Comma => 0x0033,
VirtualKeyCode::Period => 0x0034,
VirtualKeyCode::Slash => 0x0035,
VirtualKeyCode::RShift => 0x0036,
VirtualKeyCode::NumpadMultiply => 0x0037,
VirtualKeyCode::LAlt => 0x0038,
VirtualKeyCode::Space => 0x0039,
VirtualKeyCode::Capital => 0x003A,
VirtualKeyCode::F1 => 0x003B,
VirtualKeyCode::F2 => 0x003C,
VirtualKeyCode::F3 => 0x003D,
VirtualKeyCode::F4 => 0x003E,
VirtualKeyCode::F5 => 0x003F,
VirtualKeyCode::F6 => 0x0040,
VirtualKeyCode::F7 => 0x0041,
VirtualKeyCode::F8 => 0x0042,
VirtualKeyCode::F9 => 0x0043,
VirtualKeyCode::F10 => 0x0044,
VirtualKeyCode::Pause => 0x0045,
VirtualKeyCode::Scroll => 0x0046,
VirtualKeyCode::Numpad7 => 0x0047,
VirtualKeyCode::Numpad8 => 0x0048,
VirtualKeyCode::Numpad9 => 0x0049,
VirtualKeyCode::NumpadSubtract => 0x004A,
VirtualKeyCode::Numpad4 => 0x004B,
VirtualKeyCode::Numpad5 => 0x004C,
VirtualKeyCode::Numpad6 => 0x004D,
VirtualKeyCode::NumpadAdd => 0x004E,
VirtualKeyCode::Numpad1 => 0x004F,
VirtualKeyCode::Numpad2 => 0x0050,
VirtualKeyCode::Numpad3 => 0x0051,
VirtualKeyCode::Numpad0 => 0x0052,
VirtualKeyCode::NumpadDecimal => 0x0053,
VirtualKeyCode::F11 => 0x0057,
VirtualKeyCode::F12 => 0x0058,
VirtualKeyCode::F13 => 0x0064,
VirtualKeyCode::F14 => 0x0065,
VirtualKeyCode::F15 => 0x0066,
VirtualKeyCode::NumpadEnter => 0xE01C,
VirtualKeyCode::RControl => 0xE01D,
VirtualKeyCode::NumpadDivide => 0xE035,
VirtualKeyCode::RAlt => 0xE038,
VirtualKeyCode::Numlock => 0xE045,
VirtualKeyCode::Home => 0xE047,
VirtualKeyCode::Up => 0xE048,
VirtualKeyCode::PageUp => 0xE049,
VirtualKeyCode::Left => 0xE04B,
VirtualKeyCode::Right => 0xE04D,
VirtualKeyCode::End => 0xE04F,
VirtualKeyCode::Down => 0xE050,
VirtualKeyCode::PageDown => 0xE051,
VirtualKeyCode::Insert => 0xE052,
VirtualKeyCode::Delete => 0xE053,
VirtualKeyCode::LWin => 0xE05B,
VirtualKeyCode::RWin => 0xE05C,
VirtualKeyCode::Apps => 0xE05D,
_ => todo!(),
}
}

0 comments on commit a31c007

Please sign in to comment.