53 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			53 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
extern crate rs;
 | 
						|
extern crate xkbcommon;
 | 
						|
 | 
						|
use std::env;
 | 
						|
 | 
						|
use rs::data::{ Layout, LoadError };
 | 
						|
 | 
						|
use xkbcommon::xkb;
 | 
						|
 | 
						|
 | 
						|
fn check_layout(name: &str) {
 | 
						|
    let layout = Layout::from_resource(name)
 | 
						|
        .and_then(|layout| layout.build().map_err(LoadError::BadKeyMap))
 | 
						|
        .expect("layout broken");
 | 
						|
    
 | 
						|
    let context = xkb::Context::new(xkb::CONTEXT_NO_FLAGS);
 | 
						|
    
 | 
						|
    let keymap_str = layout.keymap_str
 | 
						|
        .clone()
 | 
						|
        .into_string().expect("Failed to decode keymap string");
 | 
						|
    
 | 
						|
    let keymap = xkb::Keymap::new_from_string(
 | 
						|
        &context,
 | 
						|
        keymap_str.clone(),
 | 
						|
        xkb::KEYMAP_FORMAT_TEXT_V1,
 | 
						|
        xkb::KEYMAP_COMPILE_NO_FLAGS,
 | 
						|
    ).expect("Failed to create keymap");
 | 
						|
 | 
						|
    let state = xkb::State::new(&keymap);
 | 
						|
    
 | 
						|
    // "Press" each button with keysyms
 | 
						|
    for view in layout.views.values() {
 | 
						|
        for row in &view.rows {
 | 
						|
            for button in &row.buttons {
 | 
						|
                let keystate = button.state.borrow();
 | 
						|
                for keycode in &keystate.keycodes {
 | 
						|
                    match state.key_get_one_sym(*keycode) {
 | 
						|
                        xkb::KEY_NoSymbol => {
 | 
						|
                            eprintln!("{}", keymap_str);
 | 
						|
                            panic!("Keysym {} on key {:?} can't be resolved", keycode, button.name);
 | 
						|
                        },
 | 
						|
                        _ => {},
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
fn main() -> () {
 | 
						|
    check_layout(env::args().nth(1).expect("No argument given").as_str());
 | 
						|
}
 |