summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.travis.yml10
-rw-r--r--Cargo.lock68
-rw-r--r--Cargo.toml3
-rw-r--r--src/list_fonts.rs57
-rw-r--r--src/main.rs6
5 files changed, 144 insertions, 0 deletions
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 00000000..e0aa2236
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,10 @@
+language: rust
+sudo: false
+
+rust:
+ # There's currently a cargo bug on stable which prevents libfontconfig_sys
+ # from building properly.
+ - nightly
+
+script:
+ - cargo test
diff --git a/Cargo.lock b/Cargo.lock
new file mode 100644
index 00000000..5afbf7ed
--- /dev/null
+++ b/Cargo.lock
@@ -0,0 +1,68 @@
+[root]
+name = "alacritty"
+version = "0.1.0"
+dependencies = [
+ "freetype 0.1.0 (git+https://github.com/servo/rust-freetype.git)",
+ "libc 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "servo-fontconfig 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "expat-sys"
+version = "2.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "make-cmd 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "pkg-config 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "freetype"
+version = "0.1.0"
+source = "git+https://github.com/servo/rust-freetype.git#d564ff90a3c69d987f5c015d7ec034cfaee21aff"
+dependencies = [
+ "libc 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "libc"
+version = "0.2.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "make-cmd"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "pkg-config"
+version = "0.3.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "servo-fontconfig"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "libc 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "servo-fontconfig-sys 2.11.3 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "servo-fontconfig-sys"
+version = "2.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "expat-sys 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "pkg-config 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "servo-freetype-sys 2.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "servo-freetype-sys"
+version = "2.4.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "pkg-config 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
diff --git a/Cargo.toml b/Cargo.toml
index e970b9ea..d2aa21e5 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -4,3 +4,6 @@ version = "0.1.0"
authors = ["Joe Wilm <joe@jwilm.com>"]
[dependencies]
+servo-fontconfig = "0.2"
+freetype = { git = "https://github.com/servo/rust-freetype.git" }
+libc = "*"
diff --git a/src/list_fonts.rs b/src/list_fonts.rs
new file mode 100644
index 00000000..9b15ea3d
--- /dev/null
+++ b/src/list_fonts.rs
@@ -0,0 +1,57 @@
+use std::ffi::CStr;
+use std::ptr;
+use std::str;
+
+use libc::{c_char, c_int};
+
+use fontconfig::fontconfig::{FcConfigGetCurrent, FcConfigGetFonts, FcSetSystem};
+use fontconfig::fontconfig::{FcPatternGetString};
+use fontconfig::fontconfig::{FcResultMatch};
+use fontconfig::fontconfig::{FcChar8};
+
+pub fn list_font_names() -> Vec<String> {
+ let mut fonts = Vec::new();
+ unsafe {
+ // https://www.freedesktop.org/software/fontconfig/fontconfig-devel/fcconfiggetcurrent.html
+ let config = FcConfigGetCurrent(); // *mut FcConfig
+
+ // https://www.freedesktop.org/software/fontconfig/fontconfig-devel/fcconfiggetfonts.html
+ let font_set = FcConfigGetFonts(config, FcSetSystem); // *mut FcFontSet
+
+ let nfont = (*font_set).nfont as isize;
+ for i in 0..nfont {
+ let font = (*font_set).fonts.offset(i); // *mut FcPattern
+ let id = 0 as c_int;
+ let mut fullname: *mut FcChar8 = ptr::null_mut();
+
+ // The second parameter here (fullname) is from the "FONT PROPERTIES" table:
+ // https://www.freedesktop.org/software/fontconfig/fontconfig-devel/x19.html
+ let result = FcPatternGetString(*font,
+ b"fullname\0".as_ptr() as *mut c_char,
+ id,
+ &mut fullname);
+ if result != FcResultMatch {
+ continue;
+ }
+
+ let s = str::from_utf8(CStr::from_ptr(fullname as *const c_char).to_bytes())
+ .unwrap().to_owned();
+ fonts.push(s);
+ }
+ }
+
+ fonts
+}
+
+#[cfg(test)]
+mod tests {
+ use super::list_font_names;
+
+ #[test]
+ fn list_fonts() {
+ let fonts = list_font_names();
+ assert!(!fonts.is_empty());
+
+ println!("fonts: {:?}", fonts);
+ }
+}
diff --git a/src/main.rs b/src/main.rs
index e7a11a96..66be9b34 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,3 +1,9 @@
+extern crate fontconfig;
+extern crate freetype;
+extern crate libc;
+
+mod list_fonts;
+
fn main() {
println!("Hello, world!");
}