submission: Move away from virtual-keyboard
This commit is contained in:
		@ -29,8 +29,9 @@ mod manager;
 | 
				
			|||||||
mod outputs;
 | 
					mod outputs;
 | 
				
			||||||
mod popover;
 | 
					mod popover;
 | 
				
			||||||
mod resources;
 | 
					mod resources;
 | 
				
			||||||
mod submission;
 | 
					 | 
				
			||||||
mod style;
 | 
					mod style;
 | 
				
			||||||
 | 
					mod submission;
 | 
				
			||||||
pub mod tests;
 | 
					pub mod tests;
 | 
				
			||||||
pub mod util;
 | 
					pub mod util;
 | 
				
			||||||
 | 
					mod vkeyboard;
 | 
				
			||||||
mod xdg;
 | 
					mod xdg;
 | 
				
			||||||
 | 
				
			|||||||
@ -1,67 +1,22 @@
 | 
				
			|||||||
/*! Managing the events belonging to virtual-keyboard interface. */
 | 
					/*! Managing the state of text input in the application.
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * This is a library module.
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * It needs to combine text-input and virtual-keyboard protocols
 | 
				
			||||||
 | 
					 * to achieve a consistent view of the text-input state,
 | 
				
			||||||
 | 
					 * and to submit exactly what the user wanted.
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * It must also not get tripped up by sudden disappearances of interfaces.
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * The virtual-keyboard interface is always present.
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * The text-input interface may not be presented,
 | 
				
			||||||
 | 
					 * and, for simplicity, no further attempt to claim it is made.
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * The text-input interface may be enabled and disabled at arbitrary times,
 | 
				
			||||||
 | 
					 * and those events SHOULD NOT cause any lost events.
 | 
				
			||||||
 | 
					 * */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use ::keyboard::{ KeyCode, PressType };
 | 
					/// Temporary reexport to keep stuff based directly on virtual-keyboard working
 | 
				
			||||||
 | 
					/// until a unified handler appears and prompts a rework.
 | 
				
			||||||
/// Gathers stuff defined in C or called by C
 | 
					pub use vkeyboard::*;
 | 
				
			||||||
pub mod c {
 | 
					 | 
				
			||||||
    use std::os::raw::c_void;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    #[repr(transparent)]
 | 
					 | 
				
			||||||
    #[derive(Clone, Copy)]
 | 
					 | 
				
			||||||
    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: ZwpVirtualKeyboardV1,
 | 
					 | 
				
			||||||
            timestamp: u32,
 | 
					 | 
				
			||||||
            keycode: u32,
 | 
					 | 
				
			||||||
            press: u32,
 | 
					 | 
				
			||||||
        );
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#[derive(Clone, Copy)]
 | 
					 | 
				
			||||||
pub struct Timestamp(pub u32);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/// Layout-independent backend. TODO: Have one instance per program or seat
 | 
					 | 
				
			||||||
pub struct VirtualKeyboard(pub c::ZwpVirtualKeyboardV1);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
impl VirtualKeyboard {
 | 
					 | 
				
			||||||
    // TODO: split out keyboard state management
 | 
					 | 
				
			||||||
    pub fn switch(
 | 
					 | 
				
			||||||
        &self,
 | 
					 | 
				
			||||||
        keycodes: &Vec<KeyCode>,
 | 
					 | 
				
			||||||
        action: PressType,
 | 
					 | 
				
			||||||
        timestamp: Timestamp,
 | 
					 | 
				
			||||||
    ) {
 | 
					 | 
				
			||||||
        let keycodes_count = keycodes.len();
 | 
					 | 
				
			||||||
        for keycode in keycodes.iter() {
 | 
					 | 
				
			||||||
            let keycode = keycode - 8;
 | 
					 | 
				
			||||||
            match (action, keycodes_count) {
 | 
					 | 
				
			||||||
                // Pressing a key made out of a single keycode is simple:
 | 
					 | 
				
			||||||
                // press on press, release on release.
 | 
					 | 
				
			||||||
                (_, 1) => unsafe {
 | 
					 | 
				
			||||||
                    c::eek_virtual_keyboard_v1_key(
 | 
					 | 
				
			||||||
                        self.0, timestamp.0, keycode, action.clone() as u32
 | 
					 | 
				
			||||||
                    );
 | 
					 | 
				
			||||||
                },
 | 
					 | 
				
			||||||
                // A key made of multiple keycodes
 | 
					 | 
				
			||||||
                // has to submit them one after the other
 | 
					 | 
				
			||||||
                (PressType::Pressed, _) => unsafe {
 | 
					 | 
				
			||||||
                    c::eek_virtual_keyboard_v1_key(
 | 
					 | 
				
			||||||
                        self.0, timestamp.0, keycode, PressType::Pressed as u32
 | 
					 | 
				
			||||||
                    );
 | 
					 | 
				
			||||||
                    c::eek_virtual_keyboard_v1_key(
 | 
					 | 
				
			||||||
                        self.0, timestamp.0, keycode, PressType::Released as u32
 | 
					 | 
				
			||||||
                    );
 | 
					 | 
				
			||||||
                },
 | 
					 | 
				
			||||||
                // Design choice here: submit multiple all at press time
 | 
					 | 
				
			||||||
                // and do nothing at release time
 | 
					 | 
				
			||||||
                (PressType::Released, _) => {},
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										67
									
								
								src/vkeyboard.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								src/vkeyboard.rs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,67 @@
 | 
				
			|||||||
 | 
					/*! Managing the events belonging to virtual-keyboard interface. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use ::keyboard::{ KeyCode, PressType };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Gathers stuff defined in C or called by C
 | 
				
			||||||
 | 
					pub mod c {
 | 
				
			||||||
 | 
					    use std::os::raw::c_void;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    #[repr(transparent)]
 | 
				
			||||||
 | 
					    #[derive(Clone, Copy)]
 | 
				
			||||||
 | 
					    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: ZwpVirtualKeyboardV1,
 | 
				
			||||||
 | 
					            timestamp: u32,
 | 
				
			||||||
 | 
					            keycode: u32,
 | 
				
			||||||
 | 
					            press: u32,
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[derive(Clone, Copy)]
 | 
				
			||||||
 | 
					pub struct Timestamp(pub u32);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Layout-independent backend. TODO: Have one instance per program or seat
 | 
				
			||||||
 | 
					pub struct VirtualKeyboard(pub c::ZwpVirtualKeyboardV1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl VirtualKeyboard {
 | 
				
			||||||
 | 
					    // TODO: split out keyboard state management
 | 
				
			||||||
 | 
					    pub fn switch(
 | 
				
			||||||
 | 
					        &self,
 | 
				
			||||||
 | 
					        keycodes: &Vec<KeyCode>,
 | 
				
			||||||
 | 
					        action: PressType,
 | 
				
			||||||
 | 
					        timestamp: Timestamp,
 | 
				
			||||||
 | 
					    ) {
 | 
				
			||||||
 | 
					        let keycodes_count = keycodes.len();
 | 
				
			||||||
 | 
					        for keycode in keycodes.iter() {
 | 
				
			||||||
 | 
					            let keycode = keycode - 8;
 | 
				
			||||||
 | 
					            match (action, keycodes_count) {
 | 
				
			||||||
 | 
					                // Pressing a key made out of a single keycode is simple:
 | 
				
			||||||
 | 
					                // press on press, release on release.
 | 
				
			||||||
 | 
					                (_, 1) => unsafe {
 | 
				
			||||||
 | 
					                    c::eek_virtual_keyboard_v1_key(
 | 
				
			||||||
 | 
					                        self.0, timestamp.0, keycode, action.clone() as u32
 | 
				
			||||||
 | 
					                    );
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                // A key made of multiple keycodes
 | 
				
			||||||
 | 
					                // has to submit them one after the other
 | 
				
			||||||
 | 
					                (PressType::Pressed, _) => unsafe {
 | 
				
			||||||
 | 
					                    c::eek_virtual_keyboard_v1_key(
 | 
				
			||||||
 | 
					                        self.0, timestamp.0, keycode, PressType::Pressed as u32
 | 
				
			||||||
 | 
					                    );
 | 
				
			||||||
 | 
					                    c::eek_virtual_keyboard_v1_key(
 | 
				
			||||||
 | 
					                        self.0, timestamp.0, keycode, PressType::Released as u32
 | 
				
			||||||
 | 
					                    );
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                // Design choice here: submit multiple all at press time
 | 
				
			||||||
 | 
					                // and do nothing at release time
 | 
				
			||||||
 | 
					                (PressType::Released, _) => {},
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user