everything_plugin/data/
config.rs

1use std::ffi::CString;
2
3use windows_sys::Win32::{
4    Globalization::{GetLocaleInfoW, GetThreadUILanguage, LOCALE_SNAME},
5    System::SystemServices::LOCALE_NAME_MAX_LENGTH,
6};
7
8use crate::{PluginApp, PluginHandler, PluginHost, sys};
9
10impl<A: PluginApp> PluginHandler<A> {
11    pub fn get_language_name(&self) -> String {
12        match self.get_host() {
13            Some(host) => host.config_get_language_name(),
14            None => PluginHost::get_thread_language_name(),
15        }
16    }
17}
18
19impl PluginHost {
20    /// Get an Everything setting value by setting name.
21    ///
22    /// Returns the integer value of the setting.
23    ///
24    /// ## Example
25    /// ```ignore
26    /// let app_data = host.config_get_int_value("app_data");
27    /// ```
28    pub fn config_get_int_value(&self, name: &str) -> i32 {
29        let config_get_int_value: unsafe extern "system" fn(
30            name: *const sys::everything_plugin_utf8_t,
31        ) -> i32 = unsafe { self.get("config_get_int_value").unwrap_unchecked() };
32        let name = CString::new(name).unwrap();
33        unsafe { config_get_int_value(name.as_ptr() as _) }
34    }
35
36    /// Set an Everything setting value by setting name.
37    ///
38    /// Returns 1 if the setting was changed.  
39    /// Returns 0 if the setting remains the same.
40    ///
41    /// ## Example
42    /// ```ignore
43    /// host.config_set_int_value("always_keep_sort", 1);
44    /// ```
45    pub fn config_set_int_value(&self, name: &str, value: i32) -> i32 {
46        let config_set_int_value: unsafe extern "system" fn(
47            name: *const sys::everything_plugin_utf8_t,
48            value: i32,
49        ) -> i32 = unsafe { self.get("config_set_int_value").unwrap_unchecked() };
50        let name = CString::new(name).unwrap();
51        unsafe { config_set_int_value(name.as_ptr() as _, value) }
52    }
53
54    /// ## Returns
55    /// - `None`: User Default
56    /// - `Some(u16)`: Language identifier
57    pub fn config_get_language(&self) -> Option<u16> {
58        match self.config_get_int_value("language") {
59            0 => None,
60            id => Some(id as u16),
61        }
62    }
63
64    pub fn get_language_name(language: u16) -> String {
65        let mut lcdata = [0u16; LOCALE_NAME_MAX_LENGTH as usize];
66        _ = unsafe {
67            GetLocaleInfoW(
68                language as u32,
69                LOCALE_SNAME,
70                lcdata.as_mut_ptr(),
71                size_of_val(&lcdata) as i32,
72            )
73        };
74        String::from_utf16_lossy(&lcdata)
75            .trim_end_matches('\0')
76            .to_string()
77    }
78
79    pub fn get_thread_language_name() -> String {
80        let language = unsafe { GetThreadUILanguage() };
81        Self::get_language_name(language)
82    }
83
84    pub fn config_get_language_name(&self) -> String {
85        let language = self
86            .config_get_language()
87            .unwrap_or_else(|| unsafe { GetThreadUILanguage() });
88        Self::get_language_name(language)
89    }
90}