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 old Windows context menu.
8/// You must restart explorer.exe for changes to take effect.
9///
10/// # Examples
11///
12/// ```no_run
13/// win_ctx::toggle_old_menu(true);
14/// ```
15pub fn toggle_old_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 enable_old_menu() {
35        toggle_old_menu(true).expect("Failed to enable old context menu");
36        // Duplicate calls shouldn't panic
37        toggle_old_menu(true).expect("Failed to enable old context menu");
38        HKCU.open_subkey(CTX_MENU_PATH)
39            .expect("Old context menu key should exist");
40    }
41
42    #[test]
43    fn disable_old_menu() {
44        toggle_old_menu(false).expect("Failed to disable old context menu");
45        // Duplicate calls shouldn't panic
46        toggle_old_menu(false).expect("Failed to disable old context menu");
47        HKCU.open_subkey(CTX_MENU_PATH)
48            .expect_err("Old context menu key should not exist");
49    }
50}