views: Change based on layout file
This commit is contained in:
		@ -224,33 +224,6 @@ pub mod c {
 | 
			
		||||
            .as_ref() as *const View
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// FIXME: very temporary way to minimize level impact
 | 
			
		||||
    #[no_mangle]
 | 
			
		||||
    pub extern "C"
 | 
			
		||||
    fn squeek_layout_get_level(layout: *const Layout) -> u32 {
 | 
			
		||||
        let layout = unsafe { &*layout };
 | 
			
		||||
        match layout.current_view.as_str() {
 | 
			
		||||
            "base" => 0,
 | 
			
		||||
            "upper" => 1,
 | 
			
		||||
            "numbers" => 2,
 | 
			
		||||
            "symbols" => 3,
 | 
			
		||||
            _ => 0
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #[no_mangle]
 | 
			
		||||
    pub extern "C"
 | 
			
		||||
    fn squeek_layout_set_level(layout: *mut Layout, level: u32) {
 | 
			
		||||
        let mut layout = unsafe { &mut*layout };
 | 
			
		||||
        layout.current_view = String::from(match level {
 | 
			
		||||
            0 => "base",
 | 
			
		||||
            1 => "upper",
 | 
			
		||||
            2 => "numbers",
 | 
			
		||||
            3 => "symbols",
 | 
			
		||||
            _ => "base",
 | 
			
		||||
        })
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #[no_mangle]
 | 
			
		||||
    pub extern "C"
 | 
			
		||||
    fn squeek_layout_get_keymap(layout: *const Layout) -> *const c_char {
 | 
			
		||||
@ -275,6 +248,9 @@ pub mod c {
 | 
			
		||||
            row: *const Row,
 | 
			
		||||
            button: *const Button,
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        #[repr(transparent)]
 | 
			
		||||
        pub struct LevelKeyboard(*const c_void);
 | 
			
		||||
 | 
			
		||||
        #[no_mangle]
 | 
			
		||||
        extern "C" {
 | 
			
		||||
@ -285,6 +261,53 @@ pub mod c {
 | 
			
		||||
                origin: Point,
 | 
			
		||||
                angle: i32
 | 
			
		||||
            ) -> u32;
 | 
			
		||||
            
 | 
			
		||||
            pub fn eek_keyboard_set_button_locked(
 | 
			
		||||
                keyboard: *mut LevelKeyboard,
 | 
			
		||||
                button: *const Button
 | 
			
		||||
            );
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        #[no_mangle]
 | 
			
		||||
        pub extern "C"
 | 
			
		||||
        fn squeek_layout_set_state_from_press(
 | 
			
		||||
            layout: *mut Layout,
 | 
			
		||||
            keyboard: *mut LevelKeyboard,
 | 
			
		||||
            button_ptr: *const Button,
 | 
			
		||||
        ) {
 | 
			
		||||
            let layout = unsafe { &mut *layout };
 | 
			
		||||
            let button = unsafe { &*button_ptr };
 | 
			
		||||
            // don't want to leave this borrowed in the function body
 | 
			
		||||
            let state = {
 | 
			
		||||
                let state = button.state.borrow();
 | 
			
		||||
                state.clone()
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            let view_name = match state.symbol.action {
 | 
			
		||||
                ::symbol::Action::SetLevel(name) => {
 | 
			
		||||
                    Some(name.clone())
 | 
			
		||||
                },
 | 
			
		||||
                ::symbol::Action::LockLevel { lock, unlock } => {
 | 
			
		||||
                    let mut current_state = button.state.borrow_mut();
 | 
			
		||||
                    current_state.locked ^= true;
 | 
			
		||||
                    if current_state.locked {
 | 
			
		||||
                        unsafe {
 | 
			
		||||
                            eek_keyboard_set_button_locked(
 | 
			
		||||
                                keyboard,
 | 
			
		||||
                                button_ptr
 | 
			
		||||
                            )
 | 
			
		||||
                        };
 | 
			
		||||
                    }
 | 
			
		||||
                    Some(if state.locked { unlock } else { lock }.clone())
 | 
			
		||||
                },
 | 
			
		||||
                _ => None,
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            if let Some(view_name) = view_name {
 | 
			
		||||
                if let Err(_e) = layout.set_view(view_name.clone()) {
 | 
			
		||||
                    eprintln!("No such view: {}, ignoring switch", view_name)
 | 
			
		||||
                };
 | 
			
		||||
            };
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// Places each button in order, starting from 0 on the left,
 | 
			
		||||
@ -464,7 +487,7 @@ pub mod c {
 | 
			
		||||
                locked: false,
 | 
			
		||||
                keycode: None,
 | 
			
		||||
                symbol: Symbol {
 | 
			
		||||
                    action: Action::SetLevel(0),
 | 
			
		||||
                    action: Action::SetLevel("default".into()),
 | 
			
		||||
                }
 | 
			
		||||
            }))
 | 
			
		||||
        }
 | 
			
		||||
@ -710,6 +733,19 @@ pub struct Layout {
 | 
			
		||||
    pub keymap_str: CString,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct NoSuchView;
 | 
			
		||||
 | 
			
		||||
impl Layout {
 | 
			
		||||
    fn set_view(&mut self, view: String) -> Result<(), NoSuchView> {
 | 
			
		||||
        if self.views.contains_key(&view) {
 | 
			
		||||
            self.current_view = view;
 | 
			
		||||
            Ok(())
 | 
			
		||||
        } else {
 | 
			
		||||
            Err(NoSuchView)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
mod procedures {
 | 
			
		||||
    use super::*;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user