layouts: Use base as fallback for alternative layouts
This commit is contained in:
		
							
								
								
									
										49
									
								
								src/data.rs
									
									
									
									
									
								
							
							
						
						
									
										49
									
								
								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(
 | 
			
		||||
@ -915,6 +945,25 @@ 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(
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user