From 543de41f893e6621b6101cca79f16d95634563f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Date: Tue, 15 Nov 2022 15:49:01 +0400 Subject: [PATCH] qemu-rdw: lookup keymap from rdw MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Marc-André Lureau --- qemu-rdw/src/display.rs | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/qemu-rdw/src/display.rs b/qemu-rdw/src/display.rs index dfa684f..e95d6db 100644 --- a/qemu-rdw/src/display.rs +++ b/qemu-rdw/src/display.rs @@ -1,10 +1,10 @@ use futures_util::StreamExt; use glib::{clone, subclass::prelude::*, MainContext}; use gtk::glib; -use keycodemap::KEYMAP_XORGEVDEV2QNUM; use once_cell::sync::OnceCell; use qemu_display::{Console, ConsoleListenerHandler}; use rdw::{gtk, DisplayExt}; +use std::cell::Cell; #[cfg(unix)] use std::os::unix::io::IntoRawFd; @@ -41,6 +41,7 @@ mod imp { #[derive(Debug, Default)] pub struct Display { pub(crate) console: OnceCell, + keymap: Cell>, } #[glib::object_subclass] @@ -60,14 +61,15 @@ mod imp { self.obj().connect_key_event( clone!(@weak self as this => move |_, keyval, keycode, event| { - log::debug!("key-event: {:?}", (keyval, keycode, event)); - if let Some(qnum) = KEYMAP_XORGEVDEV2QNUM.get(keycode as usize) { + let mapped = this.keymap.get().and_then(|m| m.get(keycode as usize)).map(|x| *x as u32); + log::debug!("key-{event:?}: {keyval} {keycode} -> {mapped:?}"); + if let Some(qnum) = mapped { MainContext::default().spawn_local(clone!(@weak this => async move { if event.contains(rdw::KeyEvent::PRESS) { - let _ = this.obj().console().keyboard.press(*qnum as u32).await; + let _ = this.obj().console().keyboard.press(qnum).await; } if event.contains(rdw::KeyEvent::RELEASE) { - let _ = this.obj().console().keyboard.release(*qnum as u32).await; + let _ = this.obj().console().keyboard.release(qnum).await; } })); } @@ -146,6 +148,8 @@ mod imp { fn realize(&self) { self.parent_realize(); + self.keymap.set(rdw::keymap_qnum()); + MainContext::default().spawn_local(clone!(@weak self as this => async move { let console = this.console.get().unwrap(); // we have to use a channel, because widget is not Send..