winbrew_windows\font/
user_fonts.rs

1use anyhow::{Context, Result};
2use winreg::{
3    RegKey,
4    enums::{HKEY_CURRENT_USER, KEY_SET_VALUE},
5};
6
7pub(crate) const USER_FONTS_REGISTRY_PATH: &str =
8    r"Software\Microsoft\Windows NT\CurrentVersion\Fonts";
9
10/// Write a per-user font registry entry.
11pub(crate) fn register_user_font_value(value_name: &str, value_data: &str) -> Result<()> {
12    let hkcu = RegKey::predef(HKEY_CURRENT_USER);
13    let (fonts_key, _) = hkcu
14        .create_subkey(USER_FONTS_REGISTRY_PATH)
15        .context("failed to create Windows fonts registry key")?;
16
17    fonts_key
18        .set_value(value_name, &value_data)
19        .with_context(|| format!("failed to write registry entry '{}'", value_name))?;
20
21    Ok(())
22}
23
24/// Remove a per-user font registry entry.
25pub(crate) fn unregister_user_font_value(value_name: &str) -> Result<()> {
26    let hkcu = RegKey::predef(HKEY_CURRENT_USER);
27
28    let Ok(fonts_key) = hkcu.open_subkey_with_flags(USER_FONTS_REGISTRY_PATH, KEY_SET_VALUE) else {
29        return Ok(());
30    };
31
32    match fonts_key.delete_value(value_name) {
33        Ok(()) => Ok(()),
34        Err(err) if err.kind() == std::io::ErrorKind::NotFound => Ok(()),
35        Err(err) => {
36            Err(err).with_context(|| format!("failed to remove registry entry '{}'", value_name))
37        }
38    }
39}