wayvr: interface to set keymap
This commit is contained in:
@@ -1,11 +1,13 @@
|
|||||||
use std::{io::Read, os::unix::net::UnixStream, path::PathBuf, sync::Arc};
|
use std::{io::Read, os::unix::net::UnixStream, path::PathBuf, sync::Arc};
|
||||||
|
|
||||||
|
use anyhow::Context;
|
||||||
use smithay::{
|
use smithay::{
|
||||||
backend::input::Keycode,
|
backend::input::Keycode,
|
||||||
input::{keyboard::KeyboardHandle, pointer::PointerHandle},
|
input::{keyboard::KeyboardHandle, pointer::PointerHandle},
|
||||||
reexports::wayland_server,
|
reexports::wayland_server,
|
||||||
utils::SerialCounter,
|
utils::SerialCounter,
|
||||||
};
|
};
|
||||||
|
use xkbcommon::xkb::{self, KEYMAP_FORMAT_USE_ORIGINAL};
|
||||||
|
|
||||||
use crate::backend::wayvr::{ExternalProcessRequest, WayVRTask};
|
use crate::backend::wayvr::{ExternalProcessRequest, WayVRTask};
|
||||||
|
|
||||||
@@ -207,6 +209,16 @@ impl WayVRCompositor {
|
|||||||
|_, _, _| smithay::input::keyboard::FilterResult::Forward,
|
|_, _, _| smithay::input::keyboard::FilterResult::Forward,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn set_keymap(&mut self, keymap: &xkb::Keymap) -> anyhow::Result<()> {
|
||||||
|
// Smithay only accepts keymaps in a string form due to thread safety concerns
|
||||||
|
self.seat_keyboard
|
||||||
|
.set_keymap_from_string(
|
||||||
|
&mut self.state,
|
||||||
|
keymap.get_as_string(xkb::KEYMAP_FORMAT_USE_ORIGINAL),
|
||||||
|
)
|
||||||
|
.context("Failed to set keymap")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const STARTING_WAYLAND_ADDR_IDX: u32 = 20;
|
const STARTING_WAYLAND_ADDR_IDX: u32 = 20;
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ use smithay::{
|
|||||||
selection::data_device::DataDeviceState,
|
selection::data_device::DataDeviceState,
|
||||||
shell::xdg::{ToplevelSurface, XdgShellState},
|
shell::xdg::{ToplevelSurface, XdgShellState},
|
||||||
shm::ShmState,
|
shm::ShmState,
|
||||||
|
xwayland_keyboard_grab::XWaylandKeyboardGrabHandler,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
use std::{
|
use std::{
|
||||||
@@ -42,6 +43,7 @@ use std::{
|
|||||||
};
|
};
|
||||||
use time::get_millis;
|
use time::get_millis;
|
||||||
use wayvr_ipc::{packet_client, packet_server};
|
use wayvr_ipc::{packet_client, packet_server};
|
||||||
|
use xkbcommon::xkb;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
state::AppState,
|
state::AppState,
|
||||||
@@ -519,6 +521,10 @@ impl WayVRState {
|
|||||||
self.manager.send_key(virtual_key, down);
|
self.manager.send_key(virtual_key, down);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn set_keymap(&mut self, keymap: &xkb::Keymap) -> anyhow::Result<()> {
|
||||||
|
self.manager.set_keymap(keymap)
|
||||||
|
}
|
||||||
|
|
||||||
pub fn set_modifiers(&mut self, modifiers: u8) {
|
pub fn set_modifiers(&mut self, modifiers: u8) {
|
||||||
let changed = self.cur_modifiers ^ modifiers;
|
let changed = self.cur_modifiers ^ modifiers;
|
||||||
for i in 0..8 {
|
for i in 0..8 {
|
||||||
|
|||||||
@@ -117,6 +117,11 @@ impl Dispatch<WlKeyboard, ()> for WlKeymapHandler {
|
|||||||
|
|
||||||
match maybe_keymap {
|
match maybe_keymap {
|
||||||
Ok(Some(keymap)) => {
|
Ok(Some(keymap)) => {
|
||||||
|
for l in keymap.layouts() {
|
||||||
|
log::info!("wayland keymap: {l}");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
state.keymap = Some(XkbKeymap { keymap });
|
state.keymap = Some(XkbKeymap { keymap });
|
||||||
}
|
}
|
||||||
Ok(None) => {
|
Ok(None) => {
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
use super::hid::{self, HidProvider, VirtualKey};
|
use super::hid::{self, HidProvider, VirtualKey};
|
||||||
|
|
||||||
|
use xkbcommon::xkb;
|
||||||
|
|
||||||
#[cfg(feature = "wayvr")]
|
#[cfg(feature = "wayvr")]
|
||||||
use crate::overlays::wayvr::WayVRData;
|
use crate::overlays::wayvr::WayVRData;
|
||||||
#[cfg(feature = "wayvr")]
|
#[cfg(feature = "wayvr")]
|
||||||
@@ -48,6 +50,23 @@ impl HidWrapper {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn keymap_changed(&self, keymap: &xkb::Keymap) {
|
||||||
|
#[cfg(feature = "wayvr")]
|
||||||
|
if let Some(wayvr) = &self.wayvr {
|
||||||
|
let _ = wayvr
|
||||||
|
.borrow_mut()
|
||||||
|
.data
|
||||||
|
.state
|
||||||
|
.set_keymap(keymap)
|
||||||
|
.inspect_err(|e| log::error!("Could not set WayVR keymap: {e:?}"));
|
||||||
|
}
|
||||||
|
|
||||||
|
log::info!(
|
||||||
|
"Keymap changed: {}",
|
||||||
|
keymap.layouts().next().unwrap_or("Unknown")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
pub fn set_modifiers_routed(&mut self, mods: u8) {
|
pub fn set_modifiers_routed(&mut self, mods: u8) {
|
||||||
match self.keyboard_focus {
|
match self.keyboard_focus {
|
||||||
KeyboardFocus::PhysicalScreen => self.inner.set_modifiers(mods),
|
KeyboardFocus::PhysicalScreen => self.inner.set_modifiers(mods),
|
||||||
|
|||||||
Reference in New Issue
Block a user