Adopt windows-sys (#2057)
This commit is contained in:
parent
78e5a395da
commit
b222dde835
17 changed files with 1424 additions and 1239 deletions
|
|
@ -1,22 +1,26 @@
|
|||
use std::{
|
||||
ffi::OsString,
|
||||
mem::{self, size_of},
|
||||
os::windows::prelude::OsStringExt,
|
||||
ptr,
|
||||
};
|
||||
|
||||
use winapi::{
|
||||
ctypes::wchar_t,
|
||||
shared::{
|
||||
hidusage::{HID_USAGE_GENERIC_KEYBOARD, HID_USAGE_GENERIC_MOUSE, HID_USAGE_PAGE_GENERIC},
|
||||
minwindef::{TRUE, UINT, USHORT},
|
||||
windef::HWND,
|
||||
use windows_sys::Win32::{
|
||||
Devices::HumanInterfaceDevice::{
|
||||
HID_USAGE_GENERIC_KEYBOARD, HID_USAGE_GENERIC_MOUSE, HID_USAGE_PAGE_GENERIC,
|
||||
},
|
||||
um::{
|
||||
winnt::HANDLE,
|
||||
winuser::{
|
||||
self, HRAWINPUT, RAWINPUT, RAWINPUTDEVICE, RAWINPUTDEVICELIST, RAWINPUTHEADER,
|
||||
RIDEV_DEVNOTIFY, RIDEV_INPUTSINK, RIDI_DEVICEINFO, RIDI_DEVICENAME, RID_DEVICE_INFO,
|
||||
RID_DEVICE_INFO_HID, RID_DEVICE_INFO_KEYBOARD, RID_DEVICE_INFO_MOUSE, RID_INPUT,
|
||||
RIM_TYPEHID, RIM_TYPEKEYBOARD, RIM_TYPEMOUSE,
|
||||
Foundation::{HANDLE, HWND},
|
||||
UI::{
|
||||
Input::{
|
||||
GetRawInputData, GetRawInputDeviceInfoW, GetRawInputDeviceList,
|
||||
RegisterRawInputDevices, HRAWINPUT, RAWINPUT, RAWINPUTDEVICE, RAWINPUTDEVICELIST,
|
||||
RAWINPUTHEADER, RIDEV_DEVNOTIFY, RIDEV_INPUTSINK, RIDI_DEVICEINFO, RIDI_DEVICENAME,
|
||||
RID_DEVICE_INFO, RID_DEVICE_INFO_HID, RID_DEVICE_INFO_KEYBOARD, RID_DEVICE_INFO_MOUSE,
|
||||
RID_INPUT, RIM_TYPEHID, RIM_TYPEKEYBOARD, RIM_TYPEMOUSE,
|
||||
},
|
||||
WindowsAndMessaging::{
|
||||
RI_MOUSE_LEFT_BUTTON_DOWN, RI_MOUSE_LEFT_BUTTON_UP, RI_MOUSE_MIDDLE_BUTTON_DOWN,
|
||||
RI_MOUSE_MIDDLE_BUTTON_UP, RI_MOUSE_RIGHT_BUTTON_DOWN, RI_MOUSE_RIGHT_BUTTON_UP,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
|
@ -25,23 +29,21 @@ use crate::{event::ElementState, platform_impl::platform::util};
|
|||
|
||||
#[allow(dead_code)]
|
||||
pub fn get_raw_input_device_list() -> Option<Vec<RAWINPUTDEVICELIST>> {
|
||||
let list_size = size_of::<RAWINPUTDEVICELIST>() as UINT;
|
||||
let list_size = size_of::<RAWINPUTDEVICELIST>() as u32;
|
||||
|
||||
let mut num_devices = 0;
|
||||
let status =
|
||||
unsafe { winuser::GetRawInputDeviceList(ptr::null_mut(), &mut num_devices, list_size) };
|
||||
let status = unsafe { GetRawInputDeviceList(ptr::null_mut(), &mut num_devices, list_size) };
|
||||
|
||||
if status == UINT::max_value() {
|
||||
if status == u32::MAX {
|
||||
return None;
|
||||
}
|
||||
|
||||
let mut buffer = Vec::with_capacity(num_devices as _);
|
||||
|
||||
let num_stored = unsafe {
|
||||
winuser::GetRawInputDeviceList(buffer.as_ptr() as _, &mut num_devices, list_size)
|
||||
};
|
||||
let num_stored =
|
||||
unsafe { GetRawInputDeviceList(buffer.as_mut_ptr(), &mut num_devices, list_size) };
|
||||
|
||||
if num_stored == UINT::max_value() {
|
||||
if num_stored == u32::MAX {
|
||||
return None;
|
||||
}
|
||||
|
||||
|
|
@ -63,9 +65,9 @@ impl From<RID_DEVICE_INFO> for RawDeviceInfo {
|
|||
fn from(info: RID_DEVICE_INFO) -> Self {
|
||||
unsafe {
|
||||
match info.dwType {
|
||||
RIM_TYPEMOUSE => RawDeviceInfo::Mouse(*info.u.mouse()),
|
||||
RIM_TYPEKEYBOARD => RawDeviceInfo::Keyboard(*info.u.keyboard()),
|
||||
RIM_TYPEHID => RawDeviceInfo::Hid(*info.u.hid()),
|
||||
RIM_TYPEMOUSE => RawDeviceInfo::Mouse(info.Anonymous.mouse),
|
||||
RIM_TYPEKEYBOARD => RawDeviceInfo::Keyboard(info.Anonymous.keyboard),
|
||||
RIM_TYPEHID => RawDeviceInfo::Hid(info.Anonymous.hid),
|
||||
_ => unreachable!(),
|
||||
}
|
||||
}
|
||||
|
|
@ -75,13 +77,13 @@ impl From<RID_DEVICE_INFO> for RawDeviceInfo {
|
|||
#[allow(dead_code)]
|
||||
pub fn get_raw_input_device_info(handle: HANDLE) -> Option<RawDeviceInfo> {
|
||||
let mut info: RID_DEVICE_INFO = unsafe { mem::zeroed() };
|
||||
let info_size = size_of::<RID_DEVICE_INFO>() as UINT;
|
||||
let info_size = size_of::<RID_DEVICE_INFO>() as u32;
|
||||
|
||||
info.cbSize = info_size;
|
||||
|
||||
let mut minimum_size = 0;
|
||||
let status = unsafe {
|
||||
winuser::GetRawInputDeviceInfoW(
|
||||
GetRawInputDeviceInfoW(
|
||||
handle,
|
||||
RIDI_DEVICEINFO,
|
||||
&mut info as *mut _ as _,
|
||||
|
|
@ -89,7 +91,7 @@ pub fn get_raw_input_device_info(handle: HANDLE) -> Option<RawDeviceInfo> {
|
|||
)
|
||||
};
|
||||
|
||||
if status == UINT::max_value() || status == 0 {
|
||||
if status == u32::MAX || status == 0 {
|
||||
return None;
|
||||
}
|
||||
|
||||
|
|
@ -101,17 +103,17 @@ pub fn get_raw_input_device_info(handle: HANDLE) -> Option<RawDeviceInfo> {
|
|||
pub fn get_raw_input_device_name(handle: HANDLE) -> Option<String> {
|
||||
let mut minimum_size = 0;
|
||||
let status = unsafe {
|
||||
winuser::GetRawInputDeviceInfoW(handle, RIDI_DEVICENAME, ptr::null_mut(), &mut minimum_size)
|
||||
GetRawInputDeviceInfoW(handle, RIDI_DEVICENAME, ptr::null_mut(), &mut minimum_size)
|
||||
};
|
||||
|
||||
if status != 0 {
|
||||
return None;
|
||||
}
|
||||
|
||||
let mut name: Vec<wchar_t> = Vec::with_capacity(minimum_size as _);
|
||||
let mut name: Vec<u16> = Vec::with_capacity(minimum_size as _);
|
||||
|
||||
let status = unsafe {
|
||||
winuser::GetRawInputDeviceInfoW(
|
||||
GetRawInputDeviceInfoW(
|
||||
handle,
|
||||
RIDI_DEVICENAME,
|
||||
name.as_ptr() as _,
|
||||
|
|
@ -119,7 +121,7 @@ pub fn get_raw_input_device_name(handle: HANDLE) -> Option<String> {
|
|||
)
|
||||
};
|
||||
|
||||
if status == UINT::max_value() || status == 0 {
|
||||
if status == u32::MAX || status == 0 {
|
||||
return None;
|
||||
}
|
||||
|
||||
|
|
@ -127,17 +129,15 @@ pub fn get_raw_input_device_name(handle: HANDLE) -> Option<String> {
|
|||
|
||||
unsafe { name.set_len(minimum_size as _) };
|
||||
|
||||
Some(util::wchar_to_string(&name))
|
||||
OsString::from_wide(&name).into_string().ok()
|
||||
}
|
||||
|
||||
pub fn register_raw_input_devices(devices: &[RAWINPUTDEVICE]) -> bool {
|
||||
let device_size = size_of::<RAWINPUTDEVICE>() as UINT;
|
||||
let device_size = size_of::<RAWINPUTDEVICE>() as u32;
|
||||
|
||||
let success = unsafe {
|
||||
winuser::RegisterRawInputDevices(devices.as_ptr() as _, devices.len() as _, device_size)
|
||||
};
|
||||
|
||||
success == TRUE
|
||||
unsafe {
|
||||
RegisterRawInputDevices(devices.as_ptr(), devices.len() as u32, device_size) == true.into()
|
||||
}
|
||||
}
|
||||
|
||||
pub fn register_all_mice_and_keyboards_for_raw_input(window_handle: HWND) -> bool {
|
||||
|
|
@ -165,11 +165,11 @@ pub fn register_all_mice_and_keyboards_for_raw_input(window_handle: HWND) -> boo
|
|||
|
||||
pub fn get_raw_input_data(handle: HRAWINPUT) -> Option<RAWINPUT> {
|
||||
let mut data: RAWINPUT = unsafe { mem::zeroed() };
|
||||
let mut data_size = size_of::<RAWINPUT>() as UINT;
|
||||
let header_size = size_of::<RAWINPUTHEADER>() as UINT;
|
||||
let mut data_size = size_of::<RAWINPUT>() as u32;
|
||||
let header_size = size_of::<RAWINPUTHEADER>() as u32;
|
||||
|
||||
let status = unsafe {
|
||||
winuser::GetRawInputData(
|
||||
GetRawInputData(
|
||||
handle,
|
||||
RID_INPUT,
|
||||
&mut data as *mut _ as _,
|
||||
|
|
@ -178,7 +178,7 @@ pub fn get_raw_input_data(handle: HRAWINPUT) -> Option<RAWINPUT> {
|
|||
)
|
||||
};
|
||||
|
||||
if status == UINT::max_value() || status == 0 {
|
||||
if status == u32::MAX || status == 0 {
|
||||
return None;
|
||||
}
|
||||
|
||||
|
|
@ -186,9 +186,9 @@ pub fn get_raw_input_data(handle: HRAWINPUT) -> Option<RAWINPUT> {
|
|||
}
|
||||
|
||||
fn button_flags_to_element_state(
|
||||
button_flags: USHORT,
|
||||
down_flag: USHORT,
|
||||
up_flag: USHORT,
|
||||
button_flags: u32,
|
||||
down_flag: u32,
|
||||
up_flag: u32,
|
||||
) -> Option<ElementState> {
|
||||
// We assume the same button won't be simultaneously pressed and released.
|
||||
if util::has_flag(button_flags, down_flag) {
|
||||
|
|
@ -200,22 +200,22 @@ fn button_flags_to_element_state(
|
|||
}
|
||||
}
|
||||
|
||||
pub fn get_raw_mouse_button_state(button_flags: USHORT) -> [Option<ElementState>; 3] {
|
||||
pub fn get_raw_mouse_button_state(button_flags: u32) -> [Option<ElementState>; 3] {
|
||||
[
|
||||
button_flags_to_element_state(
|
||||
button_flags,
|
||||
winuser::RI_MOUSE_LEFT_BUTTON_DOWN,
|
||||
winuser::RI_MOUSE_LEFT_BUTTON_UP,
|
||||
RI_MOUSE_LEFT_BUTTON_DOWN,
|
||||
RI_MOUSE_LEFT_BUTTON_UP,
|
||||
),
|
||||
button_flags_to_element_state(
|
||||
button_flags,
|
||||
winuser::RI_MOUSE_MIDDLE_BUTTON_DOWN,
|
||||
winuser::RI_MOUSE_MIDDLE_BUTTON_UP,
|
||||
RI_MOUSE_MIDDLE_BUTTON_DOWN,
|
||||
RI_MOUSE_MIDDLE_BUTTON_UP,
|
||||
),
|
||||
button_flags_to_element_state(
|
||||
button_flags,
|
||||
winuser::RI_MOUSE_RIGHT_BUTTON_DOWN,
|
||||
winuser::RI_MOUSE_RIGHT_BUTTON_UP,
|
||||
RI_MOUSE_RIGHT_BUTTON_DOWN,
|
||||
RI_MOUSE_RIGHT_BUTTON_UP,
|
||||
),
|
||||
]
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue