From 103e64b96ca817b41a4433584eef6ef170ba3585 Mon Sep 17 00:00:00 2001 From: Dorota Czaplejewicz Date: Thu, 3 Dec 2020 15:45:45 +0000 Subject: [PATCH 1/4] data: Made data flow in fallback clearer --- src/data.rs | 60 +++++++++++++++++++++++++++++++---------------------- 1 file changed, 35 insertions(+), 25 deletions(-) diff --git a/src/data.rs b/src/data.rs index ab0c4d5a..b8eb62c6 100644 --- a/src/data.rs +++ b/src/data.rs @@ -97,6 +97,8 @@ impl fmt::Display for DataSource { } } +type LayoutSource = (ArrangementKind, DataSource); + /// Lists possible sources, with 0 as the most preferred one /// Trying order: native lang of the right kind, native base, /// fallback lang of the right kind, fallback base @@ -104,9 +106,29 @@ fn list_layout_sources( name: &str, kind: ArrangementKind, keyboards_path: Option, -) -> Vec<(ArrangementKind, DataSource)> { - let mut ret = Vec::new(); - { +) -> Vec { + let add_by_name = | + mut ret: Vec, + name: &str, + kind: &ArrangementKind, + | -> Vec { + if let Some(path) = keyboards_path.clone() { + ret.push(( + kind.clone(), + DataSource::File( + path.join(name.to_owned()).with_extension("yaml") + ) + )) + } + + ret.push(( + kind.clone(), + DataSource::Resource(name.into()) + )); + ret + }; + + let ret = { fn name_with_arrangement(name: String, kind: &ArrangementKind) -> String { @@ -116,42 +138,30 @@ fn list_layout_sources( } } - let mut add_by_name = |name: &str, kind: &ArrangementKind| { - if let Some(path) = keyboards_path.clone() { - ret.push(( - kind.clone(), - DataSource::File( - path.join(name.to_owned()).with_extension("yaml") - ) - )) - } - - ret.push(( - kind.clone(), - DataSource::Resource(name.into()) - )); - }; + let ret = Vec::new(); - match &kind { - ArrangementKind::Base => {}, + let ret = match &kind { + ArrangementKind::Base => ret, kind => add_by_name( + ret, &name_with_arrangement(name.into(), &kind), &kind, ), }; - add_by_name(name, &ArrangementKind::Base); + let ret = add_by_name(ret, name, &ArrangementKind::Base); - match &kind { - ArrangementKind::Base => {}, + let ret = match &kind { + ArrangementKind::Base => ret, kind => add_by_name( + ret, &name_with_arrangement(FALLBACK_LAYOUT_NAME.into(), &kind), &kind, ), }; - add_by_name(FALLBACK_LAYOUT_NAME, &ArrangementKind::Base); - } + add_by_name(ret, FALLBACK_LAYOUT_NAME, &ArrangementKind::Base) + }; ret } From cc4f14e8c6dee3f9f64f1db6814d32a7b9f782a0 Mon Sep 17 00:00:00 2001 From: Dorota Czaplejewicz Date: Thu, 3 Dec 2020 15:47:44 +0000 Subject: [PATCH 2/4] data: Flattened layout fallback function --- src/data.rs | 57 ++++++++++++++++++++++++----------------------------- 1 file changed, 26 insertions(+), 31 deletions(-) diff --git a/src/data.rs b/src/data.rs index b8eb62c6..8075d38e 100644 --- a/src/data.rs +++ b/src/data.rs @@ -128,41 +128,36 @@ fn list_layout_sources( ret }; - let ret = { - fn name_with_arrangement(name: String, kind: &ArrangementKind) - -> String - { - match kind { - ArrangementKind::Base => name, - ArrangementKind::Wide => name + "_wide", - } + fn name_with_arrangement(name: String, kind: &ArrangementKind) -> String { + match kind { + ArrangementKind::Base => name, + ArrangementKind::Wide => name + "_wide", } + } - let ret = Vec::new(); + let ret = Vec::new(); - let ret = match &kind { - ArrangementKind::Base => ret, - kind => add_by_name( - ret, - &name_with_arrangement(name.into(), &kind), - &kind, - ), - }; - - let ret = add_by_name(ret, name, &ArrangementKind::Base); - - let ret = match &kind { - ArrangementKind::Base => ret, - kind => add_by_name( - ret, - &name_with_arrangement(FALLBACK_LAYOUT_NAME.into(), &kind), - &kind, - ), - }; - - add_by_name(ret, FALLBACK_LAYOUT_NAME, &ArrangementKind::Base) + let ret = match &kind { + ArrangementKind::Base => ret, + kind => add_by_name( + ret, + &name_with_arrangement(name.into(), &kind), + &kind, + ), }; - ret + + let ret = add_by_name(ret, name, &ArrangementKind::Base); + + let ret = match &kind { + ArrangementKind::Base => ret, + kind => add_by_name( + ret, + &name_with_arrangement(FALLBACK_LAYOUT_NAME.into(), &kind), + &kind, + ), + }; + + add_by_name(ret, FALLBACK_LAYOUT_NAME, &ArrangementKind::Base) } fn load_layout_data(source: DataSource) From ba2e1919185f786da4ffb4c8d84f86e1ea12cf18 Mon Sep 17 00:00:00 2001 From: Dorota Czaplejewicz Date: Thu, 3 Dec 2020 16:15:22 +0000 Subject: [PATCH 3/4] layouts: Use base as fallback for alternative layouts --- src/data.rs | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/src/data.rs b/src/data.rs index 8075d38e..b8feacc5 100644 --- a/src/data.rs +++ b/src/data.rs @@ -137,6 +137,7 @@ fn list_layout_sources( let ret = Vec::new(); + // Name as given takes priority. let ret = match &kind { ArrangementKind::Base => ret, kind => add_by_name( @@ -148,6 +149,35 @@ fn list_layout_sources( let ret = add_by_name(ret, name, &ArrangementKind::Base); + // Then try non-alternative name if applicable (`us` for `us+colemak`). + let ret = { + let mut parts = name.splitn(2, '+'); + match parts.next() { + Some(base) => { + // The name is already equal to base, so it was already added. + if base == name { ret } + else { + let ret = match &kind { + ArrangementKind::Base => ret, + kind => add_by_name( + ret, + &name_with_arrangement(base.into(), &kind), + &kind, + ), + }; + + add_by_name(ret, base, &ArrangementKind::Base) + } + }, + // The layout's base name starts with a "+". Weird but OK. + None => { + log_print!(logging::Level::Surprise, "Base layout name is empty: {}", name); + ret + } + } + }; + + // Finally, fallback name let ret = match &kind { ArrangementKind::Base => ret, kind => add_by_name( @@ -914,7 +944,26 @@ mod tests { ) ); } + + /// If layout contains a "+", it should reach for what's in front of it too. + #[test] + fn fallbacks_order_base() { + let sources = list_layout_sources("nb+aliens", ArrangementKind::Base, None); + + assert_eq!( + sources, + vec!( + (ArrangementKind::Base, DataSource::Resource("nb+aliens".into())), + (ArrangementKind::Base, DataSource::Resource("nb".into())), + ( + ArrangementKind::Base, + DataSource::Resource(FALLBACK_LAYOUT_NAME.into()) + ), + ) + ); + } + #[test] fn unicode_keysym() { let keysym = xkb::keysym_from_name( From fcd0eaddf2abcb6a5eff50581eb9f37b1432b7db Mon Sep 17 00:00:00 2001 From: Dorota Czaplejewicz Date: Thu, 3 Dec 2020 16:26:47 +0000 Subject: [PATCH 4/4] layouts: Simplify the main flow of source list --- src/data.rs | 50 +++++++++++++++++++------------------------------- 1 file changed, 19 insertions(+), 31 deletions(-) diff --git a/src/data.rs b/src/data.rs index b8feacc5..0787d33a 100644 --- a/src/data.rs +++ b/src/data.rs @@ -107,6 +107,7 @@ fn list_layout_sources( kind: ArrangementKind, keyboards_path: Option, ) -> Vec { + // Just a simplification of often called code. let add_by_name = | mut ret: Vec, name: &str, @@ -128,6 +129,20 @@ fn list_layout_sources( ret }; + // Another grouping. + let add_by_kind = |ret, name: &str, kind| { + let ret = match kind { + &ArrangementKind::Base => ret, + kind => add_by_name( + ret, + &name_with_arrangement(name.into(), kind), + kind, + ), + }; + + add_by_name(ret, name, &ArrangementKind::Base) + }; + fn name_with_arrangement(name: String, kind: &ArrangementKind) -> String { match kind { ArrangementKind::Base => name, @@ -138,16 +153,7 @@ fn list_layout_sources( let ret = Vec::new(); // Name as given takes priority. - let ret = match &kind { - ArrangementKind::Base => ret, - kind => add_by_name( - ret, - &name_with_arrangement(name.into(), &kind), - &kind, - ), - }; - - let ret = add_by_name(ret, name, &ArrangementKind::Base); + let ret = add_by_kind(ret, name, &kind); // Then try non-alternative name if applicable (`us` for `us+colemak`). let ret = { @@ -157,16 +163,7 @@ fn list_layout_sources( // The name is already equal to base, so it was already added. if base == name { ret } else { - let ret = match &kind { - ArrangementKind::Base => ret, - kind => add_by_name( - ret, - &name_with_arrangement(base.into(), &kind), - &kind, - ), - }; - - add_by_name(ret, base, &ArrangementKind::Base) + add_by_kind(ret, base, &kind) } }, // The layout's base name starts with a "+". Weird but OK. @@ -177,17 +174,8 @@ fn list_layout_sources( } }; - // Finally, fallback name - let ret = match &kind { - ArrangementKind::Base => ret, - kind => add_by_name( - ret, - &name_with_arrangement(FALLBACK_LAYOUT_NAME.into(), &kind), - &kind, - ), - }; - - add_by_name(ret, FALLBACK_LAYOUT_NAME, &ArrangementKind::Base) + // No other choices left, so give anything. + add_by_kind(ret, FALLBACK_LAYOUT_NAME.into(), &kind) } fn load_layout_data(source: DataSource)