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}