system_settings.rs

 1use std::{
 2    cell::Cell,
 3    ffi::{c_uint, c_void},
 4};
 5
 6use ::util::ResultExt;
 7use windows::Win32::UI::WindowsAndMessaging::{
 8    SPI_GETWHEELSCROLLCHARS, SPI_GETWHEELSCROLLLINES, SYSTEM_PARAMETERS_INFO_ACTION,
 9    SYSTEM_PARAMETERS_INFO_UPDATE_FLAGS, SystemParametersInfoW,
10};
11
12/// Windows settings pulled from SystemParametersInfo
13/// https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-systemparametersinfow
14#[derive(Default, Debug, Clone)]
15pub(crate) struct WindowsSystemSettings {
16    pub(crate) mouse_wheel_settings: MouseWheelSettings,
17}
18
19#[derive(Default, Debug, Clone)]
20pub(crate) struct MouseWheelSettings {
21    /// SEE: SPI_GETWHEELSCROLLCHARS
22    pub(crate) wheel_scroll_chars: Cell<u32>,
23    /// SEE: SPI_GETWHEELSCROLLLINES
24    pub(crate) wheel_scroll_lines: Cell<u32>,
25}
26
27impl WindowsSystemSettings {
28    pub(crate) fn new() -> Self {
29        let mut settings = Self::default();
30        settings.init();
31        settings
32    }
33
34    fn init(&mut self) {
35        self.mouse_wheel_settings.update();
36    }
37
38    pub(crate) fn update(&self, wparam: usize) {
39        match SYSTEM_PARAMETERS_INFO_ACTION(wparam as u32) {
40            SPI_GETWHEELSCROLLLINES | SPI_GETWHEELSCROLLCHARS => self.update_mouse_wheel_settings(),
41            _ => {}
42        }
43    }
44
45    fn update_mouse_wheel_settings(&self) {
46        self.mouse_wheel_settings.update();
47    }
48}
49
50impl MouseWheelSettings {
51    fn update(&self) {
52        self.update_wheel_scroll_chars();
53        self.update_wheel_scroll_lines();
54    }
55
56    fn update_wheel_scroll_chars(&self) {
57        let mut value = c_uint::default();
58        let result = unsafe {
59            SystemParametersInfoW(
60                SPI_GETWHEELSCROLLCHARS,
61                0,
62                Some((&mut value) as *mut c_uint as *mut c_void),
63                SYSTEM_PARAMETERS_INFO_UPDATE_FLAGS::default(),
64            )
65        };
66
67        if result.log_err() != None && self.wheel_scroll_chars.get() != value {
68            self.wheel_scroll_chars.set(value);
69        }
70    }
71
72    fn update_wheel_scroll_lines(&self) {
73        let mut value = c_uint::default();
74        let result = unsafe {
75            SystemParametersInfoW(
76                SPI_GETWHEELSCROLLLINES,
77                0,
78                Some((&mut value) as *mut c_uint as *mut c_void),
79                SYSTEM_PARAMETERS_INFO_UPDATE_FLAGS::default(),
80            )
81        };
82
83        if result.log_err() != None && self.wheel_scroll_lines.get() != value {
84            self.wheel_scroll_lines.set(value);
85        }
86    }
87}