layout: Attempt to build xdg keymap at every load

This commit is contained in:
Dorota Czaplejewicz
2019-09-29 07:54:32 +00:00
parent e33f591a1f
commit 1b424bd663

View File

@ -40,7 +40,7 @@ pub mod c {
.expect("Bad layout name") .expect("Bad layout name")
.expect("Empty layout name"); .expect("Empty layout name");
let layout = build_layout_with_fallback(name); let layout = load_layout_with_fallback(name);
Box::into_raw(Box::new(layout)) Box::into_raw(Box::new(layout))
} }
} }
@ -97,7 +97,7 @@ fn load_layout(
name: &str, name: &str,
keyboards_path: Option<PathBuf>, keyboards_path: Option<PathBuf>,
) -> ( ) -> (
Result<Layout, LoadError>, // last attempted Result<::layout::Layout, LoadError>, // last attempted
DataSource, // last attempt source DataSource, // last attempt source
Option<(LoadError, DataSource)>, // first attempt source Option<(LoadError, DataSource)>, // first attempt source
) { ) {
@ -106,7 +106,10 @@ fn load_layout(
let layout = match path { let layout = match path {
Some(path) => Some(( Some(path) => Some((
Layout::from_yaml_stream(path.clone()) Layout::from_yaml_stream(path.clone())
.map_err(LoadError::BadData), .map_err(LoadError::BadData)
.and_then(|layout|
layout.build().map_err(LoadError::BadKeyMap)
),
DataSource::File(path), DataSource::File(path),
)), )),
None => None, // No env var, not an error None => None, // No env var, not an error
@ -121,7 +124,10 @@ fn load_layout(
let (layout, source) = match layout { let (layout, source) = match layout {
Some((layout, path)) => (Ok(layout), path), Some((layout, path)) => (Ok(layout), path),
None => ( None => (
load_layout_from_resource(name), load_layout_from_resource(name)
.and_then(|layout|
layout.build().map_err(LoadError::BadKeyMap)
),
DataSource::Resource(name.into()), DataSource::Resource(name.into()),
), ),
}; };
@ -129,32 +135,14 @@ fn load_layout(
(layout, source, failed_attempt) (layout, source, failed_attempt)
} }
fn build_layout( fn load_layout_with_fallback(
name: &str,
keyboards_path: Option<PathBuf>,
) -> (
Result<::layout::Layout, LoadError>, // last attempted
DataSource, // last attempt source
Option<(LoadError, DataSource)>, // first attempt source
) {
let (layout, source, failed_attempt) = load_layout(name, keyboards_path);
// FIXME: attempt at each step of fallback
let layout = layout.and_then(
|layout| layout.build().map_err(LoadError::BadKeyMap)
);
(layout, source, failed_attempt)
}
fn build_layout_with_fallback(
name: &str name: &str
) -> ::layout::Layout { ) -> ::layout::Layout {
let path = env::var_os("SQUEEKBOARD_KEYBOARDSDIR") let path = env::var_os("SQUEEKBOARD_KEYBOARDSDIR")
.map(PathBuf::from) .map(PathBuf::from)
.or_else(|| xdg::data_path("squeekboard/keyboards")); .or_else(|| xdg::data_path("squeekboard/keyboards"));
let (layout, source, attempt) = build_layout(name, path.clone()); let (layout, source, attempt) = load_layout(name, path.clone());
if let Some((e, source)) = attempt { if let Some((e, source)) = attempt {
eprintln!( eprintln!(
@ -169,7 +157,7 @@ fn build_layout_with_fallback(
"Failed to load layout from {}: {}, using fallback", "Failed to load layout from {}: {}, using fallback",
source, e source, e
); );
build_layout(FALLBACK_LAYOUT_NAME, path) load_layout(FALLBACK_LAYOUT_NAME, path)
}, },
(res, source) => (res, source, None), (res, source) => (res, source, None),
}; };