Skip to main content

fc_list/
fc-list.rs

1use std::{env, ffi::CString};
2
3use fontconfig::{self, Fontconfig, FontconfigError};
4
5fn main() -> Result<(), FontconfigError> {
6    let fc = Fontconfig::new().expect("unable to init Fontconfig");
7
8    let Some(family) = env::args().nth(1) else {
9        eprintln!("Error: font family not specified");
10        eprintln!(
11            "Usage: {}: family",
12            env::args().next().as_deref().unwrap_or("fc-list")
13        );
14        return Ok(());
15    };
16    let family = CString::new(family)?;
17
18    let mut pattern = fontconfig::Pattern::new(&fc)?;
19    pattern.add_string(fontconfig::FC_FAMILY, &family)?;
20
21    let mut objects = fontconfig::ObjectSet::new(&fc)?;
22    objects.add(fontconfig::FC_FAMILY)?;
23    objects.add(fontconfig::FC_FILE)?;
24    objects.add(fontconfig::FC_FONTFORMAT)?;
25    objects.add(fontconfig::FC_INDEX)?;
26    objects.add(fontconfig::FC_STYLE)?;
27
28    let fontset = fontconfig::list_fonts(&pattern, Some(&objects))?;
29
30    for pattern in fontset.iter() {
31        let family = pattern.get_string(fontconfig::FC_FAMILY)?;
32        let style = pattern.get_string(fontconfig::FC_STYLE)?;
33
34        println!(
35            "{}[{}] ({}): {}:style={}",
36            pattern.filename()?,
37            pattern.face_index()?,
38            pattern
39                .format()
40                .map(|f| f.to_string())
41                .unwrap_or_else(|_| String::from("Unknown")),
42            family,
43            style
44        )
45    }
46    Ok(())
47}