win_ctx/
utils.rs

1use crate::path::CTX_MENU_PATH;
2use std::io::{self, ErrorKind};
3use winreg::{RegKey, enums::HKEY_CURRENT_USER};
4
5const HKCU: RegKey = RegKey::predef(HKEY_CURRENT_USER);
6
7/// Enable or disable the pre-Windows 11 context menu.
8/// You must restart explorer.exe for changes to take effect.
9///
10/// # Examples
11///
12/// ```no_run
13/// win_ctx::toggle_classic_menu(true)?;
14/// ```
15pub fn toggle_classic_menu(enable: bool) -> io::Result<()> {
16    if enable {
17        let path = format!("{}\\InprocServer32\\", CTX_MENU_PATH);
18        let (key, _) = HKCU.create_subkey(path).unwrap();
19        key.set_value("", &"")
20    } else {
21        match HKCU.delete_subkey_all(CTX_MENU_PATH) {
22            Err(e) if e.kind() == ErrorKind::NotFound => Ok(()),
23            Err(e) => Err(e),
24            Ok(_) => Ok(()),
25        }
26    }
27}
28
29#[cfg(test)]
30mod tests {
31    use super::*;
32
33    #[test]
34    fn disable_enable_classic_menu() {
35        toggle_classic_menu(false).expect("Failed to disable classic menu");
36        toggle_classic_menu(false).expect("Duplicate menu disable call should be ok");
37        HKCU.open_subkey(CTX_MENU_PATH)
38            .expect_err("Classic menu key should not exist");
39
40        toggle_classic_menu(true).expect("Failed to enable classic menu");
41        toggle_classic_menu(true).expect("Duplicate menu enable call should be ok");
42        HKCU.open_subkey(CTX_MENU_PATH)
43            .expect("Classic menu key should exist");
44    }
45}