feat: add JIS keyboard support for macOS in RustDesk

Signed-off-by: Amirhossein Akhlaghpour <m9.akhlaghpoor@gmail.com>
This commit is contained in:
Amirhossein Akhlaghpour 2026-05-16 19:05:12 +03:30
parent 472c4fc03a
commit 473cdf66cf
No known key found for this signature in database
GPG key ID: D7A35F11FB70A961

View file

@ -234,10 +234,7 @@ impl MouseControllable for Enigo {
// Use saturating_sub to prevent negative thresholds on very small displays
let right = (display_width as i32).saturating_sub(margin);
let bottom = (display_height as i32).saturating_sub(margin);
let near_edge = new_x < margin
|| new_x > right
|| new_y < margin
|| new_y > bottom;
let near_edge = new_x < margin || new_x > right || new_y < margin || new_y > bottom;
if near_edge {
// Reset cursor to screen center to allow continuous movement
@ -510,9 +507,7 @@ impl Enigo {
let dest = CGPoint::new(x as f64, y as f64);
if let Some(src) = self.event_source.as_ref() {
if let Ok(event) =
CGEvent::new_mouse_event(src.clone(), event_type, dest, button)
{
if let Ok(event) = CGEvent::new_mouse_event(src.clone(), event_type, dest, button) {
// Set delta fields for relative mouse movement
// This is essential for Pointer Lock API in browsers
if let Some((dx, dy)) = delta {
@ -629,6 +624,24 @@ impl Enigo {
// no idea why below char not working with shift, https://github.com/rustdesk/rustdesk/issues/406#issuecomment-1145157327
// seems related to numpad char
if ch == '-' || ch == '=' || ch == '.' || ch == '/' || (ch >= '0' && ch <= '9') {
// Fallback to JIS if current keyboard layout is JIS
unsafe {
let (keyboard, _layout) = get_layout();
if !keyboard.is_null() {
let name_ref = TISGetInputSourceProperty(keyboard, kTISPropertyInputSourceID);
if !name_ref.is_null() {
if let Some(name) = get_string(name_ref as _) {
if name.contains("JIS") {
CFRelease(keyboard);
return self.map_key_board_jis(ch);
}
}
}
CFRelease(keyboard);
}
}
// fallback ANSI
return self.map_key_board_en(ch);
}
let mut code = u16::MAX;
@ -713,6 +726,61 @@ impl Enigo {
}
}
#[inline]
fn map_key_board_jis(&mut self, ch: char) -> CGKeyCode {
match ch {
'a' => kVK_ANSI_A,
'b' => kVK_ANSI_B,
'c' => kVK_ANSI_C,
'd' => kVK_ANSI_D,
'e' => kVK_ANSI_E,
'f' => kVK_ANSI_F,
'g' => kVK_ANSI_G,
'h' => kVK_ANSI_H,
'i' => kVK_ANSI_I,
'j' => kVK_ANSI_J,
'k' => kVK_ANSI_K,
'l' => kVK_ANSI_L,
'm' => kVK_ANSI_M,
'n' => kVK_ANSI_N,
'o' => kVK_ANSI_O,
'p' => kVK_ANSI_P,
'q' => kVK_ANSI_Q,
'r' => kVK_ANSI_R,
's' => kVK_ANSI_S,
't' => kVK_ANSI_T,
'u' => kVK_ANSI_U,
'v' => kVK_ANSI_V,
'w' => kVK_ANSI_W,
'x' => kVK_ANSI_X,
'y' => kVK_ANSI_Y,
'z' => kVK_ANSI_Z,
'0' => kVK_ANSI_0,
'1' => kVK_ANSI_1,
'2' => kVK_ANSI_2,
'3' => kVK_ANSI_3,
'4' => kVK_ANSI_4,
'5' => kVK_ANSI_5,
'6' => kVK_ANSI_6,
'7' => kVK_ANSI_7,
'8' => kVK_ANSI_8,
'9' => kVK_ANSI_9,
'-' => kVK_ANSI_Minus,
'=' => kVK_ANSI_Equal,
'\\' => kVK_ANSI_Backslash,
'@' => kVK_ANSI_Quote,
':' => kVK_ANSI_Semicolon,
';' => kVK_ANSI_Semicolon,
'*' => kVK_ANSI_Quote,
',' => kVK_ANSI_Comma,
'.' => kVK_ANSI_Period,
'/' => kVK_ANSI_Slash,
'`' => kVK_ANSI_Grave,
'"' => kVK_ANSI_2,
_ => self.map_key_board_en(ch),
}
}
#[inline]
fn mouse_scroll_impl(&mut self, length: i32, is_track_pad: bool, is_horizontal: bool) {
let mut scroll_direction = -1; // 1 left -1 right;