switcher: Switch layout on menu item click
This commit is contained in:
		@ -7,9 +7,9 @@ use ::locale::compare_current_locale;
 | 
			
		||||
use ::locale_config::system_locale;
 | 
			
		||||
use ::resources;
 | 
			
		||||
 | 
			
		||||
use gio::ActionExt;
 | 
			
		||||
use gio::ActionMapExt;
 | 
			
		||||
use gio::SettingsExt;
 | 
			
		||||
use gio::SimpleActionExt;
 | 
			
		||||
use glib::translate::FromGlibPtrNone;
 | 
			
		||||
use glib::variant::ToVariant;
 | 
			
		||||
use gtk::PopoverExt;
 | 
			
		||||
@ -195,7 +195,7 @@ pub fn show(window: EekGtkKeyboard, position: ::layout::c::Bounds) {
 | 
			
		||||
        height: position.width.floor() as i32,
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    let action = input_names.get(0).map(|current_name| {
 | 
			
		||||
    if let Some(current_name) = input_names.get(0) {
 | 
			
		||||
        let current_name = current_name.to_variant();
 | 
			
		||||
 | 
			
		||||
        let layout_action = gio::SimpleAction::new_stateful(
 | 
			
		||||
@ -204,36 +204,26 @@ pub fn show(window: EekGtkKeyboard, position: ::layout::c::Bounds) {
 | 
			
		||||
            ¤t_name,
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        layout_action.connect_change_state(|_action, state| {
 | 
			
		||||
            match state {
 | 
			
		||||
                Some(v) => {
 | 
			
		||||
                    v.get::<String>()
 | 
			
		||||
                        .or_else(|| {
 | 
			
		||||
                            eprintln!("Variant is not string: {:?}", v);
 | 
			
		||||
                            None
 | 
			
		||||
                        })
 | 
			
		||||
                        .map(|state| set_layout("xkb".into(), state));
 | 
			
		||||
                },
 | 
			
		||||
                None => eprintln!("No variant selected"),
 | 
			
		||||
            };
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        let action_group = gio::SimpleActionGroup::new();
 | 
			
		||||
        action_group.add_action(&layout_action);
 | 
			
		||||
 | 
			
		||||
        menu.insert_action_group("popup", Some(&action_group));
 | 
			
		||||
        layout_action
 | 
			
		||||
    });
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    menu.bind_model(Some(&model), Some("popup"));
 | 
			
		||||
 | 
			
		||||
    menu.connect_closed(move |_menu| {
 | 
			
		||||
        if let Some(layout_action) = &action {
 | 
			
		||||
            let state = match layout_action.get_state() {
 | 
			
		||||
                Some(v) => {
 | 
			
		||||
                    let s = v.get::<String>().or_else(|| {
 | 
			
		||||
                        eprintln!("Variant is not string: {:?}", v);
 | 
			
		||||
                        None
 | 
			
		||||
                    });
 | 
			
		||||
                    // FIXME: the `get_state` docs call for unrefing,
 | 
			
		||||
                    // but the function is nowhere to be found
 | 
			
		||||
                    // glib::Variant::unref(v);
 | 
			
		||||
                    s
 | 
			
		||||
                },
 | 
			
		||||
                None => {
 | 
			
		||||
                    eprintln!("No variant selected");
 | 
			
		||||
                    None
 | 
			
		||||
                },
 | 
			
		||||
            };
 | 
			
		||||
            set_layout("xkb".into(), state.unwrap_or("us".into()));
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    menu.popup();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user