Compare commits
	
		
			1 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 06849fe668 | 
							
								
								
									
										20
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										20
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							@ -54,6 +54,15 @@ name = "cc"
 | 
				
			|||||||
version = "1.0.45"
 | 
					version = "1.0.45"
 | 
				
			||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[[package]]
 | 
				
			||||||
 | 
					name = "dbus"
 | 
				
			||||||
 | 
					version = "0.6.5"
 | 
				
			||||||
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
 | 
					dependencies = [
 | 
				
			||||||
 | 
					 "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
				
			||||||
 | 
					 "libdbus-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "dtoa"
 | 
					name = "dtoa"
 | 
				
			||||||
version = "0.4.4"
 | 
					version = "0.4.4"
 | 
				
			||||||
@ -232,6 +241,14 @@ name = "libc"
 | 
				
			|||||||
version = "0.2.62"
 | 
					version = "0.2.62"
 | 
				
			||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[[package]]
 | 
				
			||||||
 | 
					name = "libdbus-sys"
 | 
				
			||||||
 | 
					version = "0.2.1"
 | 
				
			||||||
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
 | 
					dependencies = [
 | 
				
			||||||
 | 
					 "pkg-config 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "linked-hash-map"
 | 
					name = "linked-hash-map"
 | 
				
			||||||
version = "0.5.2"
 | 
					version = "0.5.2"
 | 
				
			||||||
@ -324,6 +341,7 @@ name = "rs"
 | 
				
			|||||||
version = "0.1.0"
 | 
					version = "0.1.0"
 | 
				
			||||||
dependencies = [
 | 
					dependencies = [
 | 
				
			||||||
 "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
					 "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
				
			||||||
 | 
					 "dbus 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
				
			||||||
 "gio 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
					 "gio 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
				
			||||||
 "glib 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
					 "glib 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
				
			||||||
 "glib-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
					 "glib-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
				
			||||||
@ -436,6 +454,7 @@ dependencies = [
 | 
				
			|||||||
"checksum cairo-rs 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dd940f0d609699e343ef71c4af5f66423afbf30d666f796dabd8fd15229cf5b6"
 | 
					"checksum cairo-rs 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dd940f0d609699e343ef71c4af5f66423afbf30d666f796dabd8fd15229cf5b6"
 | 
				
			||||||
"checksum cairo-sys-rs 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d25596627380be4381247dba06c69ad05ca21b3b065bd9827e416882ac41dcd2"
 | 
					"checksum cairo-sys-rs 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d25596627380be4381247dba06c69ad05ca21b3b065bd9827e416882ac41dcd2"
 | 
				
			||||||
"checksum cc 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)" = "4fc9a35e1f4290eb9e5fc54ba6cf40671ed2a2514c3eeb2b2a908dda2ea5a1be"
 | 
					"checksum cc 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)" = "4fc9a35e1f4290eb9e5fc54ba6cf40671ed2a2514c3eeb2b2a908dda2ea5a1be"
 | 
				
			||||||
 | 
					"checksum dbus 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "48b5f0f36f1eebe901b0e6bee369a77ed3396334bf3f09abd46454a576f71819"
 | 
				
			||||||
"checksum dtoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "ea57b42383d091c85abcc2706240b94ab2a8fa1fc81c10ff23c4de06e2a90b5e"
 | 
					"checksum dtoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "ea57b42383d091c85abcc2706240b94ab2a8fa1fc81c10ff23c4de06e2a90b5e"
 | 
				
			||||||
"checksum fragile 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "05f8140122fa0d5dcb9fc8627cfce2b37cc1500f752636d46ea28bc26785c2f9"
 | 
					"checksum fragile 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "05f8140122fa0d5dcb9fc8627cfce2b37cc1500f752636d46ea28bc26785c2f9"
 | 
				
			||||||
"checksum gdk 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bcc52c7244046df9d959df87289f1fc5cca23f9f850bab0c967963e2ecb83a96"
 | 
					"checksum gdk 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bcc52c7244046df9d959df87289f1fc5cca23f9f850bab0c967963e2ecb83a96"
 | 
				
			||||||
@ -451,6 +470,7 @@ dependencies = [
 | 
				
			|||||||
"checksum gtk-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d487d333a4b87072e6bf9f2e55befa0ebef01b9496c2e263c0f4a1ff3d6c04b1"
 | 
					"checksum gtk-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d487d333a4b87072e6bf9f2e55befa0ebef01b9496c2e263c0f4a1ff3d6c04b1"
 | 
				
			||||||
"checksum lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
 | 
					"checksum lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
 | 
				
			||||||
"checksum libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)" = "34fcd2c08d2f832f376f4173a231990fa5aef4e99fb569867318a227ef4c06ba"
 | 
					"checksum libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)" = "34fcd2c08d2f832f376f4173a231990fa5aef4e99fb569867318a227ef4c06ba"
 | 
				
			||||||
 | 
					"checksum libdbus-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dc12a3bc971424edbbf7edaf6e5740483444db63aa8e23d3751ff12a30f306f0"
 | 
				
			||||||
"checksum linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ae91b68aebc4ddb91978b11a1b02ddd8602a05ec19002801c5666000e05e0f83"
 | 
					"checksum linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ae91b68aebc4ddb91978b11a1b02ddd8602a05ec19002801c5666000e05e0f83"
 | 
				
			||||||
"checksum maplit 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d"
 | 
					"checksum maplit 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d"
 | 
				
			||||||
"checksum memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "88579771288728879b57485cc7d6b07d648c9f0141eb955f8ab7f9d45394468e"
 | 
					"checksum memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "88579771288728879b57485cc7d6b07d648c9f0141eb955f8ab7f9d45394468e"
 | 
				
			||||||
 | 
				
			|||||||
@ -4,6 +4,7 @@ version = "0.1.0"
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[dependencies]
 | 
					[dependencies]
 | 
				
			||||||
bitflags = "1.0.*"
 | 
					bitflags = "1.0.*"
 | 
				
			||||||
 | 
					dbus = "0.6.*"
 | 
				
			||||||
maplit = "1.0.*"
 | 
					maplit = "1.0.*"
 | 
				
			||||||
regex = "1.1.*"
 | 
					regex = "1.1.*"
 | 
				
			||||||
serde = { version = "1.0.*", features = ["derive"] }
 | 
					serde = { version = "1.0.*", features = ["derive"] }
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										1
									
								
								debian/control
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								debian/control
									
									
									
									
										vendored
									
									
								
							@ -12,6 +12,7 @@ Build-Depends:
 | 
				
			|||||||
 libgtk-3-dev,
 | 
					 libgtk-3-dev,
 | 
				
			||||||
 libcroco3-dev,
 | 
					 libcroco3-dev,
 | 
				
			||||||
 librust-bitflags-1-dev (>= 1.0),
 | 
					 librust-bitflags-1-dev (>= 1.0),
 | 
				
			||||||
 | 
					 librust-dbus-0.6-dev (>= 0.6),
 | 
				
			||||||
 librust-gio+v2-44-dev,
 | 
					 librust-gio+v2-44-dev,
 | 
				
			||||||
 librust-glib+v2-44-dev,
 | 
					 librust-glib+v2-44-dev,
 | 
				
			||||||
 librust-glib-sys-dev,
 | 
					 librust-glib-sys-dev,
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,6 @@
 | 
				
			|||||||
#[macro_use]
 | 
					#[macro_use]
 | 
				
			||||||
extern crate bitflags;
 | 
					extern crate bitflags;
 | 
				
			||||||
 | 
					extern crate dbus;
 | 
				
			||||||
extern crate gio;
 | 
					extern crate gio;
 | 
				
			||||||
extern crate glib;
 | 
					extern crate glib;
 | 
				
			||||||
extern crate glib_sys;
 | 
					extern crate glib_sys;
 | 
				
			||||||
 | 
				
			|||||||
@ -1,8 +1,8 @@
 | 
				
			|||||||
/*! Locale detection and management.
 | 
					/*! Locale detection and management.
 | 
				
			||||||
 * Based on https://github.com/rust-locale/locale_config
 | 
					 * Based on https://github.com/rust-locale/locale_config
 | 
				
			||||||
 * 
 | 
					 * 
 | 
				
			||||||
 * Ready for deletion/replacement once Debian starts packaging this,
 | 
					 * Modified for dbus querying.
 | 
				
			||||||
 * although this version doesn't need lazy_static.
 | 
					 * This version doesn't need lazy_static.
 | 
				
			||||||
 * 
 | 
					 * 
 | 
				
			||||||
 * Copyright (c) 2016–2019 Jan Hudec <bulb@ucw.cz>
 | 
					 * Copyright (c) 2016–2019 Jan Hudec <bulb@ucw.cz>
 | 
				
			||||||
   Copyright (c) 2016 A.J. Gardner <aaron.j.gardner@gmail.com>
 | 
					   Copyright (c) 2016 A.J. Gardner <aaron.j.gardner@gmail.com>
 | 
				
			||||||
@ -11,10 +11,13 @@
 | 
				
			|||||||
   Copyright (c) 2019, Sophie Tauchert <999eagle@999eagle.moe>
 | 
					   Copyright (c) 2019, Sophie Tauchert <999eagle@999eagle.moe>
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use dbus::Connection;
 | 
				
			||||||
use regex::Regex;
 | 
					use regex::Regex;
 | 
				
			||||||
use std::borrow::Cow;
 | 
					use std::borrow::Cow;
 | 
				
			||||||
use std::env;
 | 
					use std::env;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use dbus::stdintf::org_freedesktop_dbus::Properties;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// Errors that may be returned by `locale_config`.
 | 
					/// Errors that may be returned by `locale_config`.
 | 
				
			||||||
#[derive(Copy,Clone,Debug,PartialEq,Eq)]
 | 
					#[derive(Copy,Clone,Debug,PartialEq,Eq)]
 | 
				
			||||||
pub enum Error {
 | 
					pub enum Error {
 | 
				
			||||||
@ -463,19 +466,23 @@ fn tag(s: &str) -> Result<LanguageRange> {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// TODO: Read /etc/locale.alias
 | 
					// TODO: Read /etc/locale.alias
 | 
				
			||||||
fn tag_inv(s: &str) -> LanguageRange {
 | 
					fn tag_inv(s: &str) -> LanguageRange {
 | 
				
			||||||
    tag(s).unwrap_or(LanguageRange::invariant())
 | 
					    tag(s).unwrap_or_else(|_e| LanguageRange::invariant())
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub fn system_locale() -> Option<Locale> {
 | 
					/// Returns the locale using Unix roles and the given lookup method.
 | 
				
			||||||
 | 
					// TODO: maybe don't drop all errors on the floor like that
 | 
				
			||||||
 | 
					fn unix_locale<'a, 'b, F, E>(get: F) -> Locale
 | 
				
			||||||
 | 
					    where F: Fn(&'a str) -> ::std::result::Result<String, E>
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
    // LC_ALL overrides everything
 | 
					    // LC_ALL overrides everything
 | 
				
			||||||
    if let Ok(all) = env::var("LC_ALL") {
 | 
					    if let Ok(all) = get("LC_ALL") {
 | 
				
			||||||
        if let Ok(t) = tag(all.as_ref()) {
 | 
					        if let Ok(t) = tag(all.as_ref()) {
 | 
				
			||||||
            return Some(Locale::from(t));
 | 
					            return Locale::from(t);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    // LANG is default
 | 
					    // LANG is default
 | 
				
			||||||
    let mut loc =
 | 
					    let mut loc =
 | 
				
			||||||
        if let Ok(lang) = env::var("LANG") {
 | 
					        if let Ok(lang) = get("LANG") {
 | 
				
			||||||
            Locale::from(tag_inv(lang.as_ref()))
 | 
					            Locale::from(tag_inv(lang.as_ref()))
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            Locale::invariant()
 | 
					            Locale::invariant()
 | 
				
			||||||
@ -494,7 +501,7 @@ pub fn system_locale() -> Option<Locale> {
 | 
				
			|||||||
        ("telephone",   "LC_TELEPHONE"),
 | 
					        ("telephone",   "LC_TELEPHONE"),
 | 
				
			||||||
        ("measurement", "LC_MEASUREMENT"),
 | 
					        ("measurement", "LC_MEASUREMENT"),
 | 
				
			||||||
    ].iter() {
 | 
					    ].iter() {
 | 
				
			||||||
        if let Ok(val) = env::var(var) {
 | 
					        if let Ok(val) = get(var) {
 | 
				
			||||||
            if let Ok(tag) = tag(val.as_ref())
 | 
					            if let Ok(tag) = tag(val.as_ref())
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                loc.add_category(cat, &tag);
 | 
					                loc.add_category(cat, &tag);
 | 
				
			||||||
@ -502,7 +509,7 @@ pub fn system_locale() -> Option<Locale> {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    // LANGUAGE defines fallbacks
 | 
					    // LANGUAGE defines fallbacks
 | 
				
			||||||
    if let Ok(langs) = env::var("LANGUAGE") {
 | 
					    if let Ok(langs) = get("LANGUAGE") {
 | 
				
			||||||
        for i in langs.split(':') {
 | 
					        for i in langs.split(':') {
 | 
				
			||||||
            if i != "" {
 | 
					            if i != "" {
 | 
				
			||||||
                if let Ok(tag) = tag(i) {
 | 
					                if let Ok(tag) = tag(i) {
 | 
				
			||||||
@ -511,16 +518,44 @@ pub fn system_locale() -> Option<Locale> {
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if loc.as_ref() != "" {
 | 
					
 | 
				
			||||||
        return Some(loc);
 | 
					    loc
 | 
				
			||||||
    } else {
 | 
					}
 | 
				
			||||||
        return None;
 | 
					
 | 
				
			||||||
 | 
					fn env_locale() -> Locale {
 | 
				
			||||||
 | 
					    unix_locale(env::var)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fn dbus_locale()
 | 
				
			||||||
 | 
					    -> std::result::Result<Locale, Box<dyn std::error::Error>> 
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    let connection = Connection::get_private(dbus::BusType::Session)?;
 | 
				
			||||||
 | 
					    let property = connection.with_path(
 | 
				
			||||||
 | 
					        "org.freedesktop.locale1", "/org/freedesktop/locale1", 100
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					    let locales: Vec<String>
 | 
				
			||||||
 | 
					        = property.get("org.freedesktop.locale1", "Locale")?;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    let val_pairs: Vec<(String, String)> = locales.into_iter().map(|s| {
 | 
				
			||||||
 | 
					        let mut splits = s.splitn(2, "=");
 | 
				
			||||||
 | 
					        (splits.next().unwrap().into(), splits.next().unwrap_or("").into())
 | 
				
			||||||
 | 
					    }).collect();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Ok(unix_locale(|var| {
 | 
				
			||||||
 | 
					        match val_pairs.iter().find(|(name, _val)| name == &var) {
 | 
				
			||||||
 | 
					            Some((_name, val)) => Ok(val.clone()),
 | 
				
			||||||
 | 
					            None => Err(()),
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					    }))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pub fn system_locale() -> Locale {
 | 
				
			||||||
 | 
					    dbus_locale().unwrap_or_else(|_e| env_locale())
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[cfg(test)]
 | 
					#[cfg(test)]
 | 
				
			||||||
mod test {
 | 
					mod test {
 | 
				
			||||||
    use super::LanguageRange;
 | 
					    use super::*;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    #[test]
 | 
					    #[test]
 | 
				
			||||||
    fn unix_tags() {
 | 
					    fn unix_tags() {
 | 
				
			||||||
 | 
				
			|||||||
@ -39,6 +39,7 @@ cc = meson.get_compiler('c')
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
deps = [
 | 
					deps = [
 | 
				
			||||||
#  dependency('glib-2.0', version: '>=2.26.0'),
 | 
					#  dependency('glib-2.0', version: '>=2.26.0'),
 | 
				
			||||||
 | 
					  dependency('dbus-1', version: '>=1.3'),
 | 
				
			||||||
  dependency('gio-2.0', version: '>=2.26.0'),
 | 
					  dependency('gio-2.0', version: '>=2.26.0'),
 | 
				
			||||||
  dependency('gtk+-3.0', version: '>=3.0'),
 | 
					  dependency('gtk+-3.0', version: '>=3.0'),
 | 
				
			||||||
  dependency('libcroco-0.6'),
 | 
					  dependency('libcroco-0.6'),
 | 
				
			||||||
 | 
				
			|||||||
@ -110,14 +110,11 @@ pub fn show(window: EekGtkKeyboard, position: ::layout::c::Bounds) {
 | 
				
			|||||||
        .map(|(_kind, name)| name.as_str())
 | 
					        .map(|(_kind, name)| name.as_str())
 | 
				
			||||||
        .collect();
 | 
					        .collect();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let translations = system_locale()
 | 
					    let translations = resources::get_layout_names(system_locale()
 | 
				
			||||||
        .map(|locale|
 | 
					        .tags_for("messages")
 | 
				
			||||||
            locale.tags_for("messages")
 | 
					        .next().unwrap() // guaranteed to exist by locale_config
 | 
				
			||||||
                .next().unwrap() // guaranteed to exist
 | 
					 | 
				
			||||||
        .as_ref()
 | 
					        .as_ref()
 | 
				
			||||||
                .to_owned()
 | 
					    );
 | 
				
			||||||
        )
 | 
					 | 
				
			||||||
        .and_then(|lang| resources::get_layout_names(lang.as_str()));
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // sorted collection of human and machine names
 | 
					    // sorted collection of human and machine names
 | 
				
			||||||
    let mut human_names: Vec<(&str, &str)> = match translations {
 | 
					    let mut human_names: Vec<(&str, &str)> = match translations {
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user