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
7pub 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}