presses: Move press handling to Rust
This fixes some rendering things which would happen with multiple state-sharing buttons. It also removes some interfaces exposing rows, views, layouts, and buttons, bringing the code closer to removing them from the FFI entirely.
This commit is contained in:
		@ -1,9 +1,9 @@
 | 
			
		||||
/*! State of the emulated keyboard and keys */
 | 
			
		||||
/*! State of the emulated keyboard and keys.
 | 
			
		||||
 * Regards the keyboard as if it was composed of switches. */
 | 
			
		||||
 | 
			
		||||
use std::collections::HashMap;
 | 
			
		||||
use std::fmt;
 | 
			
		||||
use std::io;
 | 
			
		||||
use std::rc::Rc;
 | 
			
		||||
use std::string::FromUtf8Error;
 | 
			
		||||
 | 
			
		||||
use ::action::Action;
 | 
			
		||||
@ -17,34 +17,10 @@ pub mod c {
 | 
			
		||||
    use super::*;
 | 
			
		||||
    use ::util::c;
 | 
			
		||||
 | 
			
		||||
    use std::os::raw::c_void;
 | 
			
		||||
 | 
			
		||||
    pub type CKeyState = c::Wrapped<KeyState>;
 | 
			
		||||
 | 
			
		||||
    #[repr(transparent)]
 | 
			
		||||
    pub struct ZwpVirtualKeyboardV1(*const c_void);
 | 
			
		||||
 | 
			
		||||
    #[no_mangle]
 | 
			
		||||
    extern "C" {
 | 
			
		||||
        /// Checks if point falls within bounds,
 | 
			
		||||
        /// which are relative to origin and rotated by angle (I think)
 | 
			
		||||
        pub fn eek_virtual_keyboard_v1_key(
 | 
			
		||||
            virtual_keyboard: *mut ZwpVirtualKeyboardV1,
 | 
			
		||||
            timestamp: u32,
 | 
			
		||||
            keycode: u32,
 | 
			
		||||
            press: u32,
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // The following defined in Rust. TODO: wrap naked pointers to Rust data inside RefCells to prevent multiple writers
 | 
			
		||||
 | 
			
		||||
    /// Compares pointers to the data
 | 
			
		||||
    #[no_mangle]
 | 
			
		||||
    pub extern "C"
 | 
			
		||||
    fn squeek_key_equal(key: CKeyState, key2: CKeyState) -> u32 {
 | 
			
		||||
        return Rc::ptr_eq(&key.clone_ref(), &key2.clone_ref()) as u32
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    #[no_mangle]
 | 
			
		||||
    pub extern "C"
 | 
			
		||||
    fn squeek_key_is_pressed(key: CKeyState) -> u32 {
 | 
			
		||||
@ -57,59 +33,17 @@ pub mod c {
 | 
			
		||||
    fn squeek_key_is_locked(key: CKeyState) -> u32 {
 | 
			
		||||
        return key.clone_owned().locked as u32;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    #[no_mangle]
 | 
			
		||||
    pub extern "C"
 | 
			
		||||
    fn squeek_key_set_locked(key: CKeyState, locked: u32) {
 | 
			
		||||
        let key = key.clone_ref();
 | 
			
		||||
        let mut key = key.borrow_mut();
 | 
			
		||||
        key.locked = locked != 0;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
    #[no_mangle]
 | 
			
		||||
    pub extern "C"
 | 
			
		||||
    fn squeek_key_press(
 | 
			
		||||
        key: CKeyState,
 | 
			
		||||
        virtual_keyboard: *mut ZwpVirtualKeyboardV1,
 | 
			
		||||
        press: u32,
 | 
			
		||||
        timestamp: u32,
 | 
			
		||||
    ) {
 | 
			
		||||
        let key = key.clone_ref();
 | 
			
		||||
        let mut key = key.borrow_mut();
 | 
			
		||||
        key.pressed = press != 0;
 | 
			
		||||
 | 
			
		||||
        let keycodes_count = key.keycodes.len();
 | 
			
		||||
        for keycode in key.keycodes.iter() {
 | 
			
		||||
            let keycode = keycode - 8;
 | 
			
		||||
            match (key.pressed, keycodes_count) {
 | 
			
		||||
                // Pressing a key made out of a single keycode is simple:
 | 
			
		||||
                // press on press, release on release.
 | 
			
		||||
                (_, 1) => unsafe {
 | 
			
		||||
                    eek_virtual_keyboard_v1_key(
 | 
			
		||||
                        virtual_keyboard, timestamp, keycode, press
 | 
			
		||||
                    );
 | 
			
		||||
                },
 | 
			
		||||
                // A key made of multiple keycodes
 | 
			
		||||
                // has to submit them one after the other
 | 
			
		||||
                (true, _) => unsafe {
 | 
			
		||||
                    eek_virtual_keyboard_v1_key(
 | 
			
		||||
                        virtual_keyboard, timestamp, keycode, 1
 | 
			
		||||
                    );
 | 
			
		||||
                    eek_virtual_keyboard_v1_key(
 | 
			
		||||
                        virtual_keyboard, timestamp, keycode, 0
 | 
			
		||||
                    );
 | 
			
		||||
                },
 | 
			
		||||
                // Design choice here: submit multiple all at press time
 | 
			
		||||
                // and do nothing at release time
 | 
			
		||||
                (false, _) => {},
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
#[derive(Debug, Clone, Copy)]
 | 
			
		||||
pub enum PressType {
 | 
			
		||||
    Released = 0,
 | 
			
		||||
    Pressed = 1,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Clone)]
 | 
			
		||||
pub struct KeyState {
 | 
			
		||||
    pub pressed: bool,
 | 
			
		||||
    pub pressed: PressType,
 | 
			
		||||
    pub locked: bool,
 | 
			
		||||
    /// A cache of raw keycodes derived from Action::Sumbit given a keymap
 | 
			
		||||
    pub keycodes: Vec<u32>,
 | 
			
		||||
@ -245,7 +179,7 @@ mod tests {
 | 
			
		||||
                },
 | 
			
		||||
                keycodes: vec!(9, 10),
 | 
			
		||||
                locked: false,
 | 
			
		||||
                pressed: false,
 | 
			
		||||
                pressed: PressType::Released,
 | 
			
		||||
            },
 | 
			
		||||
        }).unwrap();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user