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}