try this
This commit is contained in:
@@ -21,3 +21,4 @@ serde = { version = "1", features = ["derive"] }
|
|||||||
audiotags = "0.5.0"
|
audiotags = "0.5.0"
|
||||||
bmp-rust = "0.4.1"
|
bmp-rust = "0.4.1"
|
||||||
dirs = "5.0.1"
|
dirs = "5.0.1"
|
||||||
|
uinput = "0.1.3"
|
||||||
|
|||||||
@@ -2,6 +2,9 @@ use std::vec;
|
|||||||
use std::vec::Vec;
|
use std::vec::Vec;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
use uinput::Device;
|
||||||
|
use uinput::event::keyboard;
|
||||||
|
|
||||||
use crate::window_manager::{ DrawInstructions, WindowLike, WindowLikeType, KeyChar };
|
use crate::window_manager::{ DrawInstructions, WindowLike, WindowLikeType, KeyChar };
|
||||||
use crate::messages::{ WindowMessage, WindowMessageResponse, WindowManagerRequest };
|
use crate::messages::{ WindowMessage, WindowMessageResponse, WindowManagerRequest };
|
||||||
use crate::framebuffer::Dimensions;
|
use crate::framebuffer::Dimensions;
|
||||||
@@ -47,13 +50,13 @@ enum KeyResponse {
|
|||||||
//if alt is true and ctrl is true, only alt will be sent.
|
//if alt is true and ctrl is true, only alt will be sent.
|
||||||
//because I don't care about ctrl+alt stuff, and won't use it.
|
//because I don't care about ctrl+alt stuff, and won't use it.
|
||||||
//(and probably not supported by this with a real keyboard anyways)
|
//(and probably not supported by this with a real keyboard anyways)
|
||||||
#[derive(Default)]
|
|
||||||
pub struct OnscreenKeyboard {
|
pub struct OnscreenKeyboard {
|
||||||
dimensions: Dimensions,
|
dimensions: Dimensions,
|
||||||
components: Vec<Box<PressButton<KeyResponse>>>,
|
components: Vec<Box<PressButton<KeyResponse>>>,
|
||||||
alt: bool,
|
alt: bool,
|
||||||
ctrl: bool,
|
ctrl: bool,
|
||||||
board: Board,
|
board: Board,
|
||||||
|
device: Device,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl WindowLike for OnscreenKeyboard {
|
impl WindowLike for OnscreenKeyboard {
|
||||||
@@ -71,6 +74,12 @@ impl WindowLike for OnscreenKeyboard {
|
|||||||
if let Some(returned) = returned {
|
if let Some(returned) = returned {
|
||||||
return match returned {
|
return match returned {
|
||||||
KeyResponse::Key(ch) => {
|
KeyResponse::Key(ch) => {
|
||||||
|
//for now just send a random keypress to see if it refreshes the framebuffer
|
||||||
|
//(with just touch event fb doesn't seem to be written to screen, needs key... or stdin?)
|
||||||
|
self.device.click(&keyboard::Key::Down).unwrap();
|
||||||
|
//sync to indicate the events were at the same time
|
||||||
|
//(so alt+key, ctrl+key is possible)
|
||||||
|
self.device.synchronize().unwrap();
|
||||||
WindowMessageResponse::Request(WindowManagerRequest::DoKeyChar(if self.alt {
|
WindowMessageResponse::Request(WindowManagerRequest::DoKeyChar(if self.alt {
|
||||||
KeyChar::Alt(ch)
|
KeyChar::Alt(ch)
|
||||||
} else if self.ctrl {
|
} else if self.ctrl {
|
||||||
@@ -120,7 +129,14 @@ impl WindowLike for OnscreenKeyboard {
|
|||||||
|
|
||||||
impl OnscreenKeyboard {
|
impl OnscreenKeyboard {
|
||||||
pub fn new() -> Self {
|
pub fn new() -> Self {
|
||||||
Self::default()
|
Self {
|
||||||
|
dimensions: [0, 0],
|
||||||
|
components: Vec::new(),
|
||||||
|
alt: false,
|
||||||
|
ctrl: false,
|
||||||
|
board: Board::default(),
|
||||||
|
device: uinput::default().unwrap().name("uinput").unwrap().event(uinput::event::Keyboard::All).unwrap().create().unwrap(),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn set_key_components(&mut self) {
|
fn set_key_components(&mut self) {
|
||||||
|
|||||||
Reference in New Issue
Block a user