system_settings.rs

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