ime for text input
This commit is contained in:
parent
a2b086a779
commit
5f89601ef2
10 changed files with 784 additions and 48 deletions
|
|
@ -64,7 +64,6 @@ pub fn MouseArea() -> Element {
|
|||
});
|
||||
|
||||
let key_down_handler = use_callback(move |evt: Event<KeyboardData>| {
|
||||
tracing::info!("Keydown");
|
||||
spawn(async move {
|
||||
_ = socket
|
||||
.send(ClientEvent::KeyEvent {
|
||||
|
|
@ -75,12 +74,49 @@ pub fn MouseArea() -> Element {
|
|||
});
|
||||
});
|
||||
|
||||
let key_up_handler = use_callback(move |evt: Event<KeyboardData>| {
|
||||
// let key_up_handler = use_callback(move |evt: Event<KeyboardData>| {
|
||||
// spawn(async move {
|
||||
// _ = socket
|
||||
// .send(ClientEvent::KeyEvent {
|
||||
// key: evt.key().to_string(),
|
||||
// is_pressed: false,
|
||||
// })
|
||||
// .await;
|
||||
// });
|
||||
// });
|
||||
|
||||
let mut input_state = use_signal(String::new);
|
||||
let input_handler = use_callback(move |evt: Event<FormData>| {
|
||||
let v = evt.value();
|
||||
input_state.set(v.clone());
|
||||
|
||||
spawn(async move {
|
||||
_ = socket.send(ClientEvent::TextInputEvent { text: v }).await;
|
||||
});
|
||||
});
|
||||
let key_press_handler = use_callback(move |evt: Event<KeyboardData>| {
|
||||
if evt.key() == Key::Enter {
|
||||
spawn(async move {
|
||||
_ = socket
|
||||
.send(ClientEvent::TextInputDoneEvent {
|
||||
text: input_state.replace(String::new()),
|
||||
})
|
||||
.await;
|
||||
});
|
||||
}
|
||||
});
|
||||
let input_focus_handler = use_callback(move |evt: Event<FocusData>| {
|
||||
input_state.set(String::new());
|
||||
spawn(async move {
|
||||
_ = socket.send(ClientEvent::TextInputStartEvent).await;
|
||||
});
|
||||
});
|
||||
|
||||
let input_blur_handler = use_callback(move |evt: Event<FocusData>| {
|
||||
spawn(async move {
|
||||
_ = socket
|
||||
.send(ClientEvent::KeyEvent {
|
||||
key: evt.key().to_string(),
|
||||
is_pressed: false,
|
||||
.send(ClientEvent::TextInputDoneEvent {
|
||||
text: input_state.replace(String::new()),
|
||||
})
|
||||
.await;
|
||||
});
|
||||
|
|
@ -88,7 +124,12 @@ pub fn MouseArea() -> Element {
|
|||
|
||||
rsx! {
|
||||
div {
|
||||
input { onkeydown: key_down_handler, onkeyup: key_up_handler}
|
||||
input {
|
||||
oninput: input_handler,
|
||||
value: input_state,
|
||||
onkeypress: key_press_handler,
|
||||
onfocus: input_focus_handler,
|
||||
onblur: input_blur_handler }
|
||||
div {
|
||||
class: Styles::mouse_area,
|
||||
|
||||
|
|
@ -105,6 +146,9 @@ enum ClientEvent {
|
|||
MouseMove { dx: f64, dy: f64 },
|
||||
Click,
|
||||
KeyEvent { key: String, is_pressed: bool },
|
||||
TextInputStartEvent,
|
||||
TextInputEvent { text: String },
|
||||
TextInputDoneEvent { text: String },
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize, Debug)]
|
||||
|
|
@ -131,6 +175,15 @@ async fn mouse_move(
|
|||
ClientEvent::KeyEvent { key, is_pressed } => {
|
||||
mouse_service.key_event(key, is_pressed).await;
|
||||
},
|
||||
ClientEvent::TextInputEvent { text } => {
|
||||
mouse_service.text_input(text).await;
|
||||
},
|
||||
ClientEvent::TextInputStartEvent => {
|
||||
mouse_service.text_input_start().await;
|
||||
},
|
||||
ClientEvent::TextInputDoneEvent { text } => {
|
||||
mouse_service.text_input_end(text).await;
|
||||
},
|
||||
}
|
||||
}
|
||||
}))
|
||||
|
|
|
|||
|
|
@ -1,8 +1,7 @@
|
|||
use std::{io::Write, str::FromStr, sync::Arc, time::Duration};
|
||||
use std::{io::Write, sync::Arc, time::Duration};
|
||||
|
||||
use dioxus::{
|
||||
fullstack::{FullstackContext, extract::FromRef},
|
||||
html::Key,
|
||||
logger::tracing,
|
||||
};
|
||||
use memfile::MemFile;
|
||||
|
|
@ -16,9 +15,14 @@ use wayland_client::{
|
|||
wl_seat::{self, WlSeat},
|
||||
},
|
||||
};
|
||||
use wayland_protocols_misc::zwp_virtual_keyboard_v1::client::{
|
||||
zwp_virtual_keyboard_manager_v1::ZwpVirtualKeyboardManagerV1,
|
||||
zwp_virtual_keyboard_v1::ZwpVirtualKeyboardV1,
|
||||
use wayland_protocols_misc::{
|
||||
zwp_input_method_v2::client::{
|
||||
zwp_input_method_manager_v2::ZwpInputMethodManagerV2, zwp_input_method_v2::ZwpInputMethodV2,
|
||||
},
|
||||
zwp_virtual_keyboard_v1::client::{
|
||||
zwp_virtual_keyboard_manager_v1::ZwpVirtualKeyboardManagerV1,
|
||||
zwp_virtual_keyboard_v1::ZwpVirtualKeyboardV1,
|
||||
},
|
||||
};
|
||||
use wayland_protocols_wlr::virtual_pointer::v1::client::{
|
||||
zwlr_virtual_pointer_manager_v1::ZwlrVirtualPointerManagerV1,
|
||||
|
|
@ -93,14 +97,49 @@ impl InputProxyService {
|
|||
key: String,
|
||||
is_pressed: bool,
|
||||
) {
|
||||
let guard = self.input_proxy_service_state.lock().await;
|
||||
if let Some(keyboard) = &guard.state.virtual_keyboard() {
|
||||
let time = get_wayland_timestamp();
|
||||
todo!();
|
||||
}
|
||||
|
||||
let key = Key::from_str(key.as_str()).unwrap().legacy_charcode();
|
||||
pub async fn text_input_start(&self) {
|
||||
let mut guard = self.input_proxy_service_state.lock().await;
|
||||
|
||||
keyboard.key(time, key, if is_pressed { 1 } else { 0 });
|
||||
if let Some(keyboard) = guard.state.input_method_mut() {
|
||||
keyboard.input_method_state += 1;
|
||||
|
||||
tracing::info!("Text Input Start");
|
||||
keyboard.input_method.delete_surrounding_text(4, 4);
|
||||
keyboard.input_method.commit(keyboard.input_method_state);
|
||||
|
||||
guard.event_queue.flush().unwrap();
|
||||
}
|
||||
}
|
||||
pub async fn text_input(
|
||||
&self,
|
||||
key: String,
|
||||
) {
|
||||
let mut guard = self.input_proxy_service_state.lock().await;
|
||||
|
||||
if let Some(keyboard) = guard.state.input_method_mut() {
|
||||
keyboard.input_method_state += 1;
|
||||
|
||||
tracing::info!("Text Input {key}");
|
||||
keyboard.input_method.set_preedit_string(key, 0, 0);
|
||||
keyboard.input_method.commit(keyboard.input_method_state);
|
||||
guard.event_queue.flush().unwrap();
|
||||
}
|
||||
}
|
||||
pub async fn text_input_end(
|
||||
&self,
|
||||
text: String,
|
||||
) {
|
||||
let mut guard = self.input_proxy_service_state.lock().await;
|
||||
|
||||
if let Some(keyboard) = guard.state.input_method_mut() {
|
||||
keyboard.input_method_state += 1;
|
||||
|
||||
tracing::info!("Text Input End");
|
||||
keyboard.input_method.commit_string(text);
|
||||
keyboard.input_method.commit(keyboard.input_method_state);
|
||||
guard.event_queue.flush().unwrap();
|
||||
}
|
||||
}
|
||||
|
|
@ -143,12 +182,18 @@ struct Keymap {
|
|||
size: u32,
|
||||
}
|
||||
|
||||
struct InputMethod {
|
||||
input_method: ZwpInputMethodV2,
|
||||
input_method_state: u32,
|
||||
}
|
||||
|
||||
enum InputProxyServiceState {
|
||||
Incomplete {
|
||||
queue_handle: QueueHandle<Self>,
|
||||
seat: Option<WlSeat>,
|
||||
virtual_pointer_manager: Option<ZwlrVirtualPointerManagerV1>,
|
||||
virtual_keyboard_manager: Option<ZwpVirtualKeyboardManagerV1>,
|
||||
input_method_manager: Option<ZwpInputMethodManagerV2>,
|
||||
keymap: Keymap,
|
||||
},
|
||||
Running {
|
||||
|
|
@ -158,6 +203,8 @@ enum InputProxyServiceState {
|
|||
|
||||
virtual_pointer: ZwlrVirtualPointerV1,
|
||||
virtual_keyboard: ZwpVirtualKeyboardV1,
|
||||
|
||||
input_method: InputMethod,
|
||||
},
|
||||
}
|
||||
impl InputProxyServiceState {
|
||||
|
|
@ -177,6 +224,7 @@ impl InputProxyServiceState {
|
|||
seat: None,
|
||||
virtual_pointer_manager: None,
|
||||
virtual_keyboard_manager: None,
|
||||
input_method_manager: None,
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -198,6 +246,13 @@ impl InputProxyServiceState {
|
|||
}
|
||||
}
|
||||
|
||||
fn input_method_mut(&mut self) -> Option<&mut InputMethod> {
|
||||
match self {
|
||||
Self::Running { input_method, .. } => Some(input_method),
|
||||
Self::Incomplete { .. } => None,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn set_seat(
|
||||
&mut self,
|
||||
seat: WlSeat,
|
||||
|
|
@ -249,35 +304,63 @@ impl InputProxyServiceState {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn set_input_method_manager(
|
||||
&mut self,
|
||||
input_method_manager: ZwpInputMethodManagerV2,
|
||||
) {
|
||||
if let Self::Incomplete {
|
||||
input_method_manager: existing @ None,
|
||||
..
|
||||
} = self
|
||||
{
|
||||
*existing = Some(input_method_manager);
|
||||
tracing::info!("Obtained Input Method Manager!");
|
||||
self.try_upgrade();
|
||||
} else {
|
||||
tracing::info!("Received duplicate ZwpInputMethodManagerV2");
|
||||
}
|
||||
}
|
||||
|
||||
pub fn try_upgrade(&mut self) {
|
||||
if let Self::Incomplete {
|
||||
queue_handle,
|
||||
keymap,
|
||||
seat: oseat @ Some(..),
|
||||
virtual_pointer_manager: ovpm @ Some(..),
|
||||
virtual_keyboard_manager: ovkm @ Some(..),
|
||||
seat: seat @ Some(..),
|
||||
virtual_pointer_manager: vpm @ Some(..),
|
||||
virtual_keyboard_manager: vkm @ Some(..),
|
||||
input_method_manager: imm @ Some(..),
|
||||
} = self
|
||||
{
|
||||
let virtual_keyboard = ovkm.as_ref().unwrap().create_virtual_keyboard(
|
||||
oseat.as_ref().unwrap(),
|
||||
let virtual_keyboard = vkm.as_ref().unwrap().create_virtual_keyboard(
|
||||
seat.as_ref().unwrap(),
|
||||
queue_handle,
|
||||
(),
|
||||
);
|
||||
|
||||
virtual_keyboard.keymap(XKB_V1, keymap.file.as_fd(), keymap.size);
|
||||
|
||||
let virtual_pointer = ovpm.as_ref().unwrap().create_virtual_pointer(
|
||||
Some(oseat.as_ref().unwrap()),
|
||||
let virtual_pointer = vpm.as_ref().unwrap().create_virtual_pointer(
|
||||
Some(seat.as_ref().unwrap()),
|
||||
queue_handle,
|
||||
(),
|
||||
);
|
||||
|
||||
let input_method =
|
||||
imm.as_ref()
|
||||
.unwrap()
|
||||
.get_input_method(seat.as_ref().unwrap(), queue_handle, ());
|
||||
|
||||
tracing::info!("InputProxyServiceState upgraded to running");
|
||||
*self = Self::Running {
|
||||
seat: oseat.take().unwrap(),
|
||||
virtual_pointer_manager: ovpm.take().unwrap(),
|
||||
virtual_keyboard_manager: ovkm.take().unwrap(),
|
||||
seat: seat.take().unwrap(),
|
||||
virtual_pointer_manager: vpm.take().unwrap(),
|
||||
virtual_keyboard_manager: vkm.take().unwrap(),
|
||||
virtual_pointer,
|
||||
virtual_keyboard,
|
||||
input_method: InputMethod {
|
||||
input_method,
|
||||
input_method_state: 0,
|
||||
},
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
@ -339,6 +422,33 @@ impl Dispatch<ZwpVirtualKeyboardManagerV1, ()> for InputProxyServiceState {
|
|||
}
|
||||
}
|
||||
|
||||
impl Dispatch<ZwpInputMethodManagerV2, ()> for InputProxyServiceState {
|
||||
fn event(
|
||||
_state: &mut Self,
|
||||
_proxy: &ZwpInputMethodManagerV2,
|
||||
_event: <ZwpInputMethodManagerV2 as Proxy>::Event,
|
||||
_data: &(),
|
||||
_conn: &Connection,
|
||||
_qhandle: &QueueHandle<Self>,
|
||||
) {
|
||||
tracing::warn!("Unknown event received from ZwpInputMethodManagerV2");
|
||||
}
|
||||
}
|
||||
|
||||
impl Dispatch<ZwpInputMethodV2, ()> for InputProxyServiceState {
|
||||
fn event(
|
||||
_state: &mut Self,
|
||||
_proxy: &ZwpInputMethodV2,
|
||||
_event: <ZwpInputMethodV2 as Proxy>::Event,
|
||||
_data: &(),
|
||||
_conn: &Connection,
|
||||
_qhandle: &QueueHandle<Self>,
|
||||
) {
|
||||
panic!();
|
||||
tracing::warn!("Unknown event received from ZwpInputMethodV2");
|
||||
}
|
||||
}
|
||||
|
||||
impl Dispatch<WlSeat, ()> for InputProxyServiceState {
|
||||
fn event(
|
||||
_state: &mut Self,
|
||||
|
|
@ -399,6 +509,15 @@ impl Dispatch<WlRegistry, ()> for InputProxyServiceState {
|
|||
);
|
||||
app_data.set_virtual_keyboard_manager(manager);
|
||||
},
|
||||
"zwp_input_method_manager_v2" => {
|
||||
let manager = registry.bind::<ZwpInputMethodManagerV2, _, _>(
|
||||
name,
|
||||
version,
|
||||
queue_handle,
|
||||
(),
|
||||
);
|
||||
app_data.set_input_method_manager(manager);
|
||||
},
|
||||
_ => {},
|
||||
},
|
||||
Event::GlobalRemove { .. } => todo!(),
|
||||
|
|
|
|||
|
|
@ -1,3 +1,571 @@
|
|||
fn is_key_string(s: &str) -> bool {
|
||||
s.chars().all(|c| !c.is_control()) && s.chars().skip(1).all(|c| !c.is_ascii())
|
||||
}
|
||||
|
||||
pub fn web_key_to_linux_keycode(s: &str) -> Option<u32> {
|
||||
match s {
|
||||
//s if is_key_string(s) => Ok(Character(s.to_string())),
|
||||
"Unidentified" => todo!(),
|
||||
"Alt" => Some(KEY_LEFTALT),
|
||||
"AltGraph" => Some(KEY_RIGHTALT),
|
||||
"CapsLock" => todo!(),
|
||||
"Control" => todo!(),
|
||||
"Fn" => todo!(),
|
||||
"FnLock" => todo!(),
|
||||
"Meta" => todo!(),
|
||||
"NumLock" => todo!(),
|
||||
"ScrollLock" => todo!(),
|
||||
"Shift" => todo!(),
|
||||
"Symbol" => todo!(),
|
||||
"SymbolLock" => todo!(),
|
||||
"Hyper" => todo!(),
|
||||
"Super" => todo!(),
|
||||
"Enter" => todo!(),
|
||||
"Tab" => todo!(),
|
||||
"ArrowDown" => todo!(),
|
||||
"ArrowLeft" => todo!(),
|
||||
"ArrowRight" => todo!(),
|
||||
"ArrowUp" => todo!(),
|
||||
"End" => todo!(),
|
||||
"Home" => todo!(),
|
||||
"PageDown" => todo!(),
|
||||
"PageUp" => todo!(),
|
||||
"Backspace" => todo!(),
|
||||
"Clear" => todo!(),
|
||||
"Copy" => todo!(),
|
||||
"CrSel" => todo!(),
|
||||
"Cut" => todo!(),
|
||||
"Delete" => todo!(),
|
||||
"EraseEof" => todo!(),
|
||||
"ExSel" => todo!(),
|
||||
"Insert" => todo!(),
|
||||
"Paste" => todo!(),
|
||||
"Redo" => todo!(),
|
||||
"Undo" => todo!(),
|
||||
"Accept" => todo!(),
|
||||
"Again" => todo!(),
|
||||
"Attn" => todo!(),
|
||||
"Cancel" => todo!(),
|
||||
"ContextMenu" => todo!(),
|
||||
"Escape" => todo!(),
|
||||
"Execute" => todo!(),
|
||||
"Find" => todo!(),
|
||||
"Help" => todo!(),
|
||||
"Pause" => todo!(),
|
||||
"Play" => todo!(),
|
||||
"Props" => todo!(),
|
||||
"Select" => todo!(),
|
||||
"ZoomIn" => todo!(),
|
||||
"ZoomOut" => todo!(),
|
||||
"BrightnessDown" => todo!(),
|
||||
"BrightnessUp" => todo!(),
|
||||
"Eject" => todo!(),
|
||||
"LogOff" => todo!(),
|
||||
"Power" => todo!(),
|
||||
"PowerOff" => todo!(),
|
||||
"PrintScreen" => todo!(),
|
||||
"Hibernate" => todo!(),
|
||||
"Standby" => todo!(),
|
||||
"WakeUp" => todo!(),
|
||||
"AllCandidates" => todo!(),
|
||||
"Alphanumeric" => todo!(),
|
||||
"CodeInput" => todo!(),
|
||||
"Compose" => todo!(),
|
||||
"Convert" => todo!(),
|
||||
"Dead" => todo!(),
|
||||
"FinalMode" => todo!(),
|
||||
"GroupFirst" => todo!(),
|
||||
"GroupLast" => todo!(),
|
||||
"GroupNext" => todo!(),
|
||||
"GroupPrevious" => todo!(),
|
||||
"ModeChange" => todo!(),
|
||||
"NextCandidate" => todo!(),
|
||||
"NonConvert" => todo!(),
|
||||
"PreviousCandidate" => todo!(),
|
||||
"Process" => todo!(),
|
||||
"SingleCandidate" => todo!(),
|
||||
"HangulMode" => todo!(),
|
||||
"HanjaMode" => todo!(),
|
||||
"JunjaMode" => todo!(),
|
||||
"Eisu" => todo!(),
|
||||
"Hankaku" => todo!(),
|
||||
"Hiragana" => todo!(),
|
||||
"HiraganaKatakana" => todo!(),
|
||||
"KanaMode" => todo!(),
|
||||
"KanjiMode" => todo!(),
|
||||
"Katakana" => todo!(),
|
||||
"Romaji" => todo!(),
|
||||
"Zenkaku" => todo!(),
|
||||
"ZenkakuHankaku" => todo!(),
|
||||
"Soft1" => todo!(),
|
||||
"Soft2" => todo!(),
|
||||
"Soft3" => todo!(),
|
||||
"Soft4" => todo!(),
|
||||
"ChannelDown" => todo!(),
|
||||
"ChannelUp" => todo!(),
|
||||
"Close" => todo!(),
|
||||
"MailForward" => todo!(),
|
||||
"MailReply" => todo!(),
|
||||
"MailSend" => todo!(),
|
||||
"MediaClose" => todo!(),
|
||||
"MediaFastForward" => todo!(),
|
||||
"MediaPause" => todo!(),
|
||||
"MediaPlay" => todo!(),
|
||||
"MediaPlayPause" => todo!(),
|
||||
"MediaRecord" => todo!(),
|
||||
"MediaRewind" => todo!(),
|
||||
"MediaStop" => todo!(),
|
||||
"MediaTrackNext" => todo!(),
|
||||
"MediaTrackPrevious" => todo!(),
|
||||
"New" => todo!(),
|
||||
"Open" => todo!(),
|
||||
"Print" => todo!(),
|
||||
"Save" => todo!(),
|
||||
"SpellCheck" => todo!(),
|
||||
"Key11" => todo!(),
|
||||
"Key12" => todo!(),
|
||||
"AudioBalanceLeft" => todo!(),
|
||||
"AudioBalanceRight" => todo!(),
|
||||
"AudioBassBoostDown" => todo!(),
|
||||
"AudioBassBoostToggle" => todo!(),
|
||||
"AudioBassBoostUp" => todo!(),
|
||||
"AudioFaderFront" => todo!(),
|
||||
"AudioFaderRear" => todo!(),
|
||||
"AudioSurroundModeNext" => todo!(),
|
||||
"AudioTrebleDown" => todo!(),
|
||||
"AudioTrebleUp" => todo!(),
|
||||
"AudioVolumeDown" => todo!(),
|
||||
"AudioVolumeUp" => todo!(),
|
||||
"AudioVolumeMute" => todo!(),
|
||||
"MicrophoneToggle" => todo!(),
|
||||
"MicrophoneVolumeDown" => todo!(),
|
||||
"MicrophoneVolumeUp" => todo!(),
|
||||
"MicrophoneVolumeMute" => todo!(),
|
||||
"SpeechCorrectionList" => todo!(),
|
||||
"SpeechInputToggle" => todo!(),
|
||||
"LaunchApplication1" => todo!(),
|
||||
"LaunchApplication2" => todo!(),
|
||||
"LaunchCalendar" => todo!(),
|
||||
"LaunchContacts" => todo!(),
|
||||
"LaunchMail" => todo!(),
|
||||
"LaunchMediaPlayer" => todo!(),
|
||||
"LaunchMusicPlayer" => todo!(),
|
||||
"LaunchPhone" => todo!(),
|
||||
"LaunchScreenSaver" => todo!(),
|
||||
"LaunchSpreadsheet" => todo!(),
|
||||
"LaunchWebBrowser" => todo!(),
|
||||
"LaunchWebCam" => todo!(),
|
||||
"LaunchWordProcessor" => todo!(),
|
||||
"BrowserBack" => todo!(),
|
||||
"BrowserFavorites" => todo!(),
|
||||
"BrowserForward" => todo!(),
|
||||
"BrowserHome" => todo!(),
|
||||
"BrowserRefresh" => todo!(),
|
||||
"BrowserSearch" => todo!(),
|
||||
"BrowserStop" => todo!(),
|
||||
"AppSwitch" => todo!(),
|
||||
"Call" => todo!(),
|
||||
"Camera" => todo!(),
|
||||
"CameraFocus" => todo!(),
|
||||
"EndCall" => todo!(),
|
||||
"GoBack" => todo!(),
|
||||
"GoHome" => todo!(),
|
||||
"HeadsetHook" => todo!(),
|
||||
"LastNumberRedial" => todo!(),
|
||||
"Notification" => todo!(),
|
||||
"MannerMode" => todo!(),
|
||||
"VoiceDial" => todo!(),
|
||||
"TV" => todo!(),
|
||||
"TV3DMode" => todo!(),
|
||||
"TVAntennaCable" => todo!(),
|
||||
"TVAudioDescription" => todo!(),
|
||||
"TVAudioDescriptionMixDown" => todo!(),
|
||||
"TVAudioDescriptionMixUp" => todo!(),
|
||||
"TVContentsMenu" => todo!(),
|
||||
"TVDataService" => todo!(),
|
||||
"TVInput" => todo!(),
|
||||
"TVInputComponent1" => todo!(),
|
||||
"TVInputComponent2" => todo!(),
|
||||
"TVInputComposite1" => todo!(),
|
||||
"TVInputComposite2" => todo!(),
|
||||
"TVInputHDMI1" => todo!(),
|
||||
"TVInputHDMI2" => todo!(),
|
||||
"TVInputHDMI3" => todo!(),
|
||||
"TVInputHDMI4" => todo!(),
|
||||
"TVInputVGA1" => todo!(),
|
||||
"TVMediaContext" => todo!(),
|
||||
"TVNetwork" => todo!(),
|
||||
"TVNumberEntry" => todo!(),
|
||||
"TVPower" => todo!(),
|
||||
"TVRadioService" => todo!(),
|
||||
"TVSatellite" => todo!(),
|
||||
"TVSatelliteBS" => todo!(),
|
||||
"TVSatelliteCS" => todo!(),
|
||||
"TVSatelliteToggle" => todo!(),
|
||||
"TVTerrestrialAnalog" => todo!(),
|
||||
"TVTerrestrialDigital" => todo!(),
|
||||
"TVTimer" => todo!(),
|
||||
"AVRInput" => todo!(),
|
||||
"AVRPower" => todo!(),
|
||||
"ColorF0Red" => todo!(),
|
||||
"ColorF1Green" => todo!(),
|
||||
"ColorF2Yellow" => todo!(),
|
||||
"ColorF3Blue" => todo!(),
|
||||
"ColorF4Grey" => todo!(),
|
||||
"ColorF5Brown" => todo!(),
|
||||
"ClosedCaptionToggle" => todo!(),
|
||||
"Dimmer" => todo!(),
|
||||
"DisplaySwap" => todo!(),
|
||||
"DVR" => todo!(),
|
||||
"Exit" => todo!(),
|
||||
"FavoriteClear0" => todo!(),
|
||||
"FavoriteClear1" => todo!(),
|
||||
"FavoriteClear2" => todo!(),
|
||||
"FavoriteClear3" => todo!(),
|
||||
"FavoriteRecall0" => todo!(),
|
||||
"FavoriteRecall1" => todo!(),
|
||||
"FavoriteRecall2" => todo!(),
|
||||
"FavoriteRecall3" => todo!(),
|
||||
"FavoriteStore0" => todo!(),
|
||||
"FavoriteStore1" => todo!(),
|
||||
"FavoriteStore2" => todo!(),
|
||||
"FavoriteStore3" => todo!(),
|
||||
"Guide" => todo!(),
|
||||
"GuideNextDay" => todo!(),
|
||||
"GuidePreviousDay" => todo!(),
|
||||
"Info" => todo!(),
|
||||
"InstantReplay" => todo!(),
|
||||
"Link" => todo!(),
|
||||
"ListProgram" => todo!(),
|
||||
"LiveContent" => todo!(),
|
||||
"Lock" => todo!(),
|
||||
"MediaApps" => todo!(),
|
||||
"MediaAudioTrack" => todo!(),
|
||||
"MediaLast" => todo!(),
|
||||
"MediaSkipBackward" => todo!(),
|
||||
"MediaSkipForward" => todo!(),
|
||||
"MediaStepBackward" => todo!(),
|
||||
"MediaStepForward" => todo!(),
|
||||
"MediaTopMenu" => todo!(),
|
||||
"NavigateIn" => todo!(),
|
||||
"NavigateNext" => todo!(),
|
||||
"NavigateOut" => todo!(),
|
||||
"NavigatePrevious" => todo!(),
|
||||
"NextFavoriteChannel" => todo!(),
|
||||
"NextUserProfile" => todo!(),
|
||||
"OnDemand" => todo!(),
|
||||
"Pairing" => todo!(),
|
||||
"PinPDown" => todo!(),
|
||||
"PinPMove" => todo!(),
|
||||
"PinPToggle" => todo!(),
|
||||
"PinPUp" => todo!(),
|
||||
"PlaySpeedDown" => todo!(),
|
||||
"PlaySpeedReset" => todo!(),
|
||||
"PlaySpeedUp" => todo!(),
|
||||
"RandomToggle" => todo!(),
|
||||
"RcLowBattery" => todo!(),
|
||||
"RecordSpeedNext" => todo!(),
|
||||
"RfBypass" => todo!(),
|
||||
"ScanChannelsToggle" => todo!(),
|
||||
"ScreenModeNext" => todo!(),
|
||||
"Settings" => todo!(),
|
||||
"SplitScreenToggle" => todo!(),
|
||||
"STBInput" => todo!(),
|
||||
"STBPower" => todo!(),
|
||||
"Subtitle" => todo!(),
|
||||
"Teletext" => todo!(),
|
||||
"VideoModeNext" => todo!(),
|
||||
"Wink" => todo!(),
|
||||
"ZoomToggle" => todo!(),
|
||||
"F1" => todo!(),
|
||||
"F2" => todo!(),
|
||||
"F3" => todo!(),
|
||||
"F4" => todo!(),
|
||||
"F5" => todo!(),
|
||||
"F6" => todo!(),
|
||||
"F7" => todo!(),
|
||||
"F8" => todo!(),
|
||||
"F9" => todo!(),
|
||||
"F10" => todo!(),
|
||||
"F11" => todo!(),
|
||||
"F12" => todo!(),
|
||||
"F13" => todo!(),
|
||||
"F14" => todo!(),
|
||||
"F15" => todo!(),
|
||||
"F16" => todo!(),
|
||||
"F17" => todo!(),
|
||||
"F18" => todo!(),
|
||||
"F19" => todo!(),
|
||||
"F20" => todo!(),
|
||||
"F21" => todo!(),
|
||||
"F22" => todo!(),
|
||||
"F23" => todo!(),
|
||||
"F24" => todo!(),
|
||||
"F25" => todo!(),
|
||||
"F26" => todo!(),
|
||||
"F27" => todo!(),
|
||||
"F28" => todo!(),
|
||||
"F29" => todo!(),
|
||||
"F30" => todo!(),
|
||||
"F31" => todo!(),
|
||||
"F32" => todo!(),
|
||||
"F33" => todo!(),
|
||||
"F34" => todo!(),
|
||||
"F35" => todo!(),
|
||||
_ => todo!(),
|
||||
}
|
||||
}
|
||||
|
||||
const KEY_RESERVED: u32 = 0;
|
||||
const KEY_ESC: u32 = 1;
|
||||
const KEY_1: u32 = 2;
|
||||
const KEY_2: u32 = 3;
|
||||
const KEY_3: u32 = 4;
|
||||
const KEY_4: u32 = 5;
|
||||
const KEY_5: u32 = 6;
|
||||
const KEY_6: u32 = 7;
|
||||
const KEY_7: u32 = 8;
|
||||
const KEY_8: u32 = 9;
|
||||
const KEY_9: u32 = 10;
|
||||
const KEY_0: u32 = 11;
|
||||
const KEY_MINUS: u32 = 12;
|
||||
const KEY_EQUAL: u32 = 13;
|
||||
const KEY_BACKSPACE: u32 = 14;
|
||||
const KEY_TAB: u32 = 15;
|
||||
const KEY_Q: u32 = 16;
|
||||
const KEY_W: u32 = 17;
|
||||
const KEY_E: u32 = 18;
|
||||
const KEY_R: u32 = 19;
|
||||
const KEY_T: u32 = 20;
|
||||
const KEY_Y: u32 = 21;
|
||||
const KEY_U: u32 = 22;
|
||||
const KEY_I: u32 = 23;
|
||||
const KEY_O: u32 = 24;
|
||||
const KEY_P: u32 = 25;
|
||||
const KEY_LEFTBRACE: u32 = 26;
|
||||
const KEY_RIGHTBRACE: u32 = 27;
|
||||
const KEY_ENTER: u32 = 28;
|
||||
const KEY_LEFTCTRL: u32 = 29;
|
||||
const KEY_A: u32 = 30;
|
||||
const KEY_S: u32 = 31;
|
||||
const KEY_D: u32 = 32;
|
||||
const KEY_F: u32 = 33;
|
||||
const KEY_G: u32 = 34;
|
||||
const KEY_H: u32 = 35;
|
||||
const KEY_J: u32 = 36;
|
||||
const KEY_K: u32 = 37;
|
||||
const KEY_L: u32 = 38;
|
||||
const KEY_SEMICOLON: u32 = 39;
|
||||
const KEY_APOSTROPHE: u32 = 40;
|
||||
const KEY_GRAVE: u32 = 41;
|
||||
const KEY_LEFTSHIFT: u32 = 42;
|
||||
const KEY_BACKSLASH: u32 = 43;
|
||||
const KEY_Z: u32 = 44;
|
||||
const KEY_X: u32 = 45;
|
||||
const KEY_C: u32 = 46;
|
||||
const KEY_V: u32 = 47;
|
||||
const KEY_B: u32 = 48;
|
||||
const KEY_N: u32 = 49;
|
||||
const KEY_M: u32 = 50;
|
||||
const KEY_COMMA: u32 = 51;
|
||||
const KEY_DOT: u32 = 52;
|
||||
const KEY_SLASH: u32 = 53;
|
||||
const KEY_RIGHTSHIFT: u32 = 54;
|
||||
const KEY_KPASTERISK: u32 = 55;
|
||||
const KEY_LEFTALT: u32 = 56;
|
||||
const KEY_SPACE: u32 = 57;
|
||||
const KEY_CAPSLOCK: u32 = 58;
|
||||
const KEY_F1: u32 = 59;
|
||||
const KEY_F2: u32 = 60;
|
||||
const KEY_F3: u32 = 61;
|
||||
const KEY_F4: u32 = 62;
|
||||
const KEY_F5: u32 = 63;
|
||||
const KEY_F6: u32 = 64;
|
||||
const KEY_F7: u32 = 65;
|
||||
const KEY_F8: u32 = 66;
|
||||
const KEY_F9: u32 = 67;
|
||||
const KEY_F10: u32 = 68;
|
||||
const KEY_NUMLOCK: u32 = 69;
|
||||
const KEY_SCROLLLOCK: u32 = 70;
|
||||
const KEY_KP7: u32 = 71;
|
||||
const KEY_KP8: u32 = 72;
|
||||
const KEY_KP9: u32 = 73;
|
||||
const KEY_KPMINUS: u32 = 74;
|
||||
const KEY_KP4: u32 = 75;
|
||||
const KEY_KP5: u32 = 76;
|
||||
const KEY_KP6: u32 = 77;
|
||||
const KEY_KPPLUS: u32 = 78;
|
||||
const KEY_KP1: u32 = 79;
|
||||
const KEY_KP2: u32 = 80;
|
||||
const KEY_KP3: u32 = 81;
|
||||
const KEY_KP0: u32 = 82;
|
||||
const KEY_KPDOT: u32 = 83;
|
||||
const KEY_ZENKAKUHANKAKU: u32 = 85;
|
||||
const KEY_102ND: u32 = 86;
|
||||
const KEY_F11: u32 = 87;
|
||||
const KEY_F12: u32 = 88;
|
||||
const KEY_RO: u32 = 89;
|
||||
const KEY_KATAKANA: u32 = 90;
|
||||
const KEY_HIRAGANA: u32 = 91;
|
||||
const KEY_HENKAN: u32 = 92;
|
||||
const KEY_KATAKANAHIRAGANA: u32 = 93;
|
||||
const KEY_MUHENKAN: u32 = 94;
|
||||
const KEY_KPJPCOMMA: u32 = 95;
|
||||
const KEY_KPENTER: u32 = 96;
|
||||
const KEY_RIGHTCTRL: u32 = 97;
|
||||
const KEY_KPSLASH: u32 = 98;
|
||||
const KEY_SYSRQ: u32 = 99;
|
||||
const KEY_RIGHTALT: u32 = 100;
|
||||
const KEY_LINEFEED: u32 = 101;
|
||||
const KEY_HOME: u32 = 102;
|
||||
const KEY_UP: u32 = 103;
|
||||
const KEY_PAGEUP: u32 = 104;
|
||||
const KEY_LEFT: u32 = 105;
|
||||
const KEY_RIGHT: u32 = 106;
|
||||
const KEY_END: u32 = 107;
|
||||
const KEY_DOWN: u32 = 108;
|
||||
const KEY_PAGEDOWN: u32 = 109;
|
||||
const KEY_INSERT: u32 = 110;
|
||||
const KEY_DELETE: u32 = 111;
|
||||
const KEY_MACRO: u32 = 112;
|
||||
const KEY_MUTE: u32 = 113;
|
||||
const KEY_VOLUMEDOWN: u32 = 114;
|
||||
const KEY_VOLUMEUP: u32 = 115;
|
||||
const KEY_POWER : u32 = 116 /* SC System Power Down */;
|
||||
const KEY_KPEQUAL: u32 = 117;
|
||||
const KEY_KPPLUSMINUS: u32 = 118;
|
||||
const KEY_PAUSE: u32 = 119;
|
||||
const KEY_SCALE : u32 = 120 /* AL Compiz Scale (Expose) */;
|
||||
const KEY_KPCOMMA: u32 = 121;
|
||||
const KEY_HANGEUL: u32 = 122;
|
||||
const KEY_HANGUEL: u32 = KEY_HANGEUL;
|
||||
const KEY_HANJA: u32 = 123;
|
||||
const KEY_YEN: u32 = 124;
|
||||
const KEY_LEFTMETA: u32 = 125;
|
||||
const KEY_RIGHTMETA: u32 = 126;
|
||||
const KEY_COMPOSE: u32 = 127;
|
||||
const KEY_STOP : u32 = 128 /* AC Stop */;
|
||||
const KEY_AGAIN: u32 = 129;
|
||||
const KEY_PROPS : u32 = 130 /* AC Properties */;
|
||||
const KEY_UNDO : u32 = 131 /* AC Undo */;
|
||||
const KEY_FRONT: u32 = 132;
|
||||
const KEY_COPY : u32 = 133 /* AC Copy */;
|
||||
const KEY_OPEN : u32 = 134 /* AC Open */;
|
||||
const KEY_PASTE : u32 = 135 /* AC Paste */;
|
||||
const KEY_FIND : u32 = 136 /* AC Search */;
|
||||
const KEY_CUT : u32 = 137 /* AC Cut */;
|
||||
const KEY_HELP : u32 = 138 /* AL Integrated Help Center */;
|
||||
const KEY_MENU : u32 = 139 /* Menu (show menu) */;
|
||||
const KEY_CALC : u32 = 140 /* AL Calculator */;
|
||||
const KEY_SETUP: u32 = 141;
|
||||
const KEY_SLEEP : u32 = 142 /* SC System Sleep */;
|
||||
const KEY_WAKEUP : u32 = 143 /* System Wake Up */;
|
||||
const KEY_FILE : u32 = 144 /* AL Local Machine Browser */;
|
||||
const KEY_SENDFILE: u32 = 145;
|
||||
const KEY_DELETEFILE: u32 = 146;
|
||||
const KEY_XFER: u32 = 147;
|
||||
const KEY_PROG1: u32 = 148;
|
||||
const KEY_PROG2: u32 = 149;
|
||||
const KEY_WWW : u32 = 150 /* AL Internet Browser */;
|
||||
const KEY_MSDOS: u32 = 151;
|
||||
const KEY_COFFEE : u32 = 152 /* AL Terminal Lock/Screensaver */;
|
||||
const KEY_SCREENLOCK: u32 = KEY_COFFEE;
|
||||
const KEY_ROTATE_DISPLAY : u32 = 153 /* Display orientation for e.g. tablets */;
|
||||
const KEY_DIRECTION: u32 = KEY_ROTATE_DISPLAY;
|
||||
const KEY_CYCLEWINDOWS: u32 = 154;
|
||||
const KEY_MAIL: u32 = 155;
|
||||
const KEY_BOOKMARKS : u32 = 156 /* AC Bookmarks */;
|
||||
const KEY_COMPUTER: u32 = 157;
|
||||
const KEY_BACK : u32 = 158 /* AC Back */;
|
||||
const KEY_FORWARD : u32 = 159 /* AC Forward */;
|
||||
const KEY_CLOSECD: u32 = 160;
|
||||
const KEY_EJECTCD: u32 = 161;
|
||||
const KEY_EJECTCLOSECD: u32 = 162;
|
||||
const KEY_NEXTSONG: u32 = 163;
|
||||
const KEY_PLAYPAUSE: u32 = 164;
|
||||
const KEY_PREVIOUSSONG: u32 = 165;
|
||||
const KEY_STOPCD: u32 = 166;
|
||||
const KEY_RECORD: u32 = 167;
|
||||
const KEY_REWIND: u32 = 168;
|
||||
const KEY_PHONE : u32 = 169 /* Media Select Telephone */;
|
||||
const KEY_ISO: u32 = 170;
|
||||
const KEY_CONFIG : u32 = 171 /* AL Consumer Control Configuration */;
|
||||
const KEY_HOMEPAGE : u32 = 172 /* AC Home */;
|
||||
const KEY_REFRESH : u32 = 173 /* AC Refresh */;
|
||||
const KEY_EXIT : u32 = 174 /* AC Exit */;
|
||||
const KEY_MOVE: u32 = 175;
|
||||
const KEY_EDIT: u32 = 176;
|
||||
const KEY_SCROLLUP: u32 = 177;
|
||||
const KEY_SCROLLDOWN: u32 = 178;
|
||||
const KEY_KPLEFTPAREN: u32 = 179;
|
||||
const KEY_KPRIGHTPAREN: u32 = 180;
|
||||
const KEY_NEW : u32 = 181 /* AC New */;
|
||||
const KEY_REDO : u32 = 182 /* AC Redo/Repeat */;
|
||||
const KEY_F13: u32 = 183;
|
||||
const KEY_F14: u32 = 184;
|
||||
const KEY_F15: u32 = 185;
|
||||
const KEY_F16: u32 = 186;
|
||||
const KEY_F17: u32 = 187;
|
||||
const KEY_F18: u32 = 188;
|
||||
const KEY_F19: u32 = 189;
|
||||
const KEY_F20: u32 = 190;
|
||||
const KEY_F21: u32 = 191;
|
||||
const KEY_F22: u32 = 192;
|
||||
const KEY_F23: u32 = 193;
|
||||
const KEY_F24: u32 = 194;
|
||||
const KEY_PLAYCD: u32 = 200;
|
||||
const KEY_PAUSECD: u32 = 201;
|
||||
const KEY_PROG3: u32 = 202;
|
||||
const KEY_PROG4: u32 = 203;
|
||||
const KEY_ALL_APPLICATIONS : u32 = 204 /* AC Desktop Show All Applications */;
|
||||
const KEY_DASHBOARD: u32 = KEY_ALL_APPLICATIONS;
|
||||
const KEY_SUSPEND: u32 = 205;
|
||||
const KEY_CLOSE : u32 = 206 /* AC Close */;
|
||||
const KEY_PLAY: u32 = 207;
|
||||
const KEY_FASTFORWARD: u32 = 208;
|
||||
const KEY_BASSBOOST: u32 = 209;
|
||||
const KEY_PRINT : u32 = 210 /* AC Print */;
|
||||
const KEY_HP: u32 = 211;
|
||||
const KEY_CAMERA: u32 = 212;
|
||||
const KEY_SOUND: u32 = 213;
|
||||
const KEY_QUESTION: u32 = 214;
|
||||
const KEY_EMAIL: u32 = 215;
|
||||
const KEY_CHAT: u32 = 216;
|
||||
const KEY_SEARCH: u32 = 217;
|
||||
const KEY_CONNECT: u32 = 218;
|
||||
const KEY_FINANCE : u32 = 219 /* AL Checkbook/Finance */;
|
||||
const KEY_SPORT: u32 = 220;
|
||||
const KEY_SHOP: u32 = 221;
|
||||
const KEY_ALTERASE: u32 = 222;
|
||||
const KEY_CANCEL : u32 = 223 /* AC Cancel */;
|
||||
const KEY_BRIGHTNESSDOWN: u32 = 224;
|
||||
const KEY_BRIGHTNESSUP: u32 = 225;
|
||||
const KEY_MEDIA: u32 = 226;
|
||||
const KEY_SWITCHVIDEOMODE : u32 = 227 /* Cycle between available video outputs (Monitor/LCD/TV-out/etc) */;
|
||||
const KEY_KBDILLUMTOGGLE: u32 = 228;
|
||||
const KEY_KBDILLUMDOWN: u32 = 229;
|
||||
const KEY_KBDILLUMUP: u32 = 230;
|
||||
const KEY_SEND : u32 = 231 /* AC Send */;
|
||||
const KEY_REPLY : u32 = 232 /* AC Reply */;
|
||||
const KEY_FORWARDMAIL : u32 = 233 /* AC Forward Msg */;
|
||||
const KEY_SAVE : u32 = 234 /* AC Save */;
|
||||
const KEY_DOCUMENTS: u32 = 235;
|
||||
const KEY_BATTERY: u32 = 236;
|
||||
const KEY_BLUETOOTH: u32 = 237;
|
||||
const KEY_WLAN: u32 = 238;
|
||||
const KEY_UWB: u32 = 239;
|
||||
const KEY_UNKNOWN: u32 = 240;
|
||||
const KEY_VIDEO_NEXT : u32 = 241 /* drive next video source */;
|
||||
const KEY_VIDEO_PREV : u32 = 242 /* drive previous video source */;
|
||||
const KEY_BRIGHTNESS_CYCLE : u32 = 243 /* brightness up, after max is min */;
|
||||
const KEY_BRIGHTNESS_AUTO : u32 = 244 /* Set Auto Brightness: manual brightness control is off, rely on ambient */;
|
||||
const KEY_BRIGHTNESS_ZERO: u32 = KEY_BRIGHTNESS_AUTO;
|
||||
const KEY_DISPLAY_OFF : u32 = 245 /* display device to off state */;
|
||||
const KEY_WWAN : u32 = 246 /* Wireless WAN (LTE, UMTS, GSM, etc.) */;
|
||||
const KEY_WIMAX: u32 = KEY_WWAN;
|
||||
const KEY_RFKILL : u32 = 247 /* Key that controls all radios */;
|
||||
const KEY_MICMUTE : u32 = 248 /* Mute / unmute the microphone */;
|
||||
|
||||
pub const KEYMAP: &str = "xkb_keymap {}";
|
||||
|
||||
pub const KEYMAP_: &str = "xkb_keymap {\
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue