gsettings: Don't crash on switching when unavailable

This commit is contained in:
Dorota Czaplejewicz
2020-03-03 19:46:53 +00:00
parent 8bae8fe5bb
commit 8ac2b5a713

View File

@ -132,19 +132,40 @@ fn make_menu_builder(inputs: Vec<(&str, OwnedTranslation)>) -> gtk::Builder {
) )
} }
fn get_settings(schema_name: &str) -> Option<gio::Settings> {
let mut error_handler = logging::Print{};
gio::SettingsSchemaSource::get_default()
.or_warn(
&mut error_handler,
logging::Problem::Surprise,
"No gsettings schemas installed.",
)
.and_then(|sss|
sss.lookup(schema_name, true)
.or_warn(
&mut error_handler,
logging::Problem::Surprise,
&format!("Gsettings schema {} not installed", schema_name),
)
)
.map(|_sschema| gio::Settings::new(schema_name))
}
fn set_layout(kind: String, name: String) { fn set_layout(kind: String, name: String) {
let settings = gio::Settings::new("org.gnome.desktop.input-sources"); let settings = get_settings("org.gnome.desktop.input-sources");
let inputs = settings.get_value("sources").unwrap(); if let Some(settings) = settings {
let current = (kind.clone(), name.clone()); let inputs = settings.get_value("sources").unwrap();
let inputs = variants::get_tuples(inputs).into_iter() let current = (kind.clone(), name.clone());
.filter(|t| t != &current); let inputs = variants::get_tuples(inputs).into_iter()
let inputs = vec![(kind, name)].into_iter() .filter(|t| t != &current);
.chain(inputs).collect(); let inputs = vec![(kind, name)].into_iter()
settings.set_value( .chain(inputs).collect();
"sources", settings.set_value(
&variants::ArrayPairString(inputs).to_variant(), "sources",
); &variants::ArrayPairString(inputs).to_variant(),
settings.apply(); );
settings.apply();
}
} }
/// A reference to what the user wants to see /// A reference to what the user wants to see
@ -284,9 +305,13 @@ pub fn show(
let overlay_layouts = resources::get_overlays().into_iter() let overlay_layouts = resources::get_overlays().into_iter()
.map(|name| LayoutId::Local(name.to_string())); .map(|name| LayoutId::Local(name.to_string()));
let settings = gio::Settings::new("org.gnome.desktop.input-sources"); let settings = get_settings("org.gnome.desktop.input-sources");
let inputs = settings.get_value("sources").unwrap(); let inputs = settings
let inputs = variants::get_tuples(inputs); .map(|settings| {
let inputs = settings.get_value("sources").unwrap();
variants::get_tuples(inputs)
})
.unwrap_or_else(|| Vec::new());
let system_layouts: Vec<LayoutId> = inputs.into_iter() let system_layouts: Vec<LayoutId> = inputs.into_iter()
.map(|(kind, name)| LayoutId::System { kind, name }) .map(|(kind, name)| LayoutId::System { kind, name })