maa_framework/controller/
win32.rs1use std::ops::Deref;
2
3use serde::{Deserialize, Serialize};
4
5use crate::{error, internal};
6
7#[derive(Debug, Serialize, Deserialize, Default, Clone, Copy)]
8pub enum MaaWin32ControllerTouchType {
9 Invalid,
10 #[default]
11 SendMessage,
12 Seize,
13}
14
15#[derive(Debug, Serialize, Deserialize, Default, Clone, Copy)]
16pub enum MaaWin32ControllerKeyType {
17 Invalid,
18 #[default]
19 SendMessage,
20 Seize,
21}
22
23#[derive(Debug, Serialize, Deserialize, Default, Clone, Copy)]
24pub enum MaaWin32ControllerScreencapType {
25 Invalid,
26 #[default]
27 GDI,
28 DXGIDesktopDup,
29 DXGIFramePool,
30}
31
32#[derive(Debug, Serialize, Deserialize, Default, Clone, Copy)]
33pub struct MaaWin32ControllerType {
34 pub touch_type: MaaWin32ControllerTouchType,
35 pub key_type: MaaWin32ControllerKeyType,
36 pub screencap_type: MaaWin32ControllerScreencapType,
37}
38
39impl TryFrom<internal::MaaWin32ControllerTypeEnum> for MaaWin32ControllerType {
40 type Error = error::Error;
41
42 fn try_from(value: internal::MaaWin32ControllerTypeEnum) -> Result<Self, Self::Error> {
43 let touch_type = match value & 0xFF {
44 internal::MaaWin32ControllerTypeEnum_MaaWin32Controller_Invalid => {
45 MaaWin32ControllerTouchType::Invalid
46 }
47 internal::MaaWin32ControllerTypeEnum_MaaWin32ControllerType_Touch_SendMessage => {
48 MaaWin32ControllerTouchType::SendMessage
49 }
50 _ => return Err(error::Error::MaaWin32ControllerTypeConversionError(value)),
51 };
52
53 let key_type = match value & 0xFF00 {
54 internal::MaaWin32ControllerTypeEnum_MaaWin32Controller_Invalid => {
55 MaaWin32ControllerKeyType::Invalid
56 }
57 internal::MaaWin32ControllerTypeEnum_MaaWin32ControllerType_Key_SendMessage => {
58 MaaWin32ControllerKeyType::SendMessage
59 }
60 _ => return Err(error::Error::MaaWin32ControllerTypeConversionError(value)),
61 };
62
63 let screencap_type = match value & 0xFF0000 {
64 internal::MaaWin32ControllerTypeEnum_MaaWin32Controller_Invalid => {
65 MaaWin32ControllerScreencapType::Invalid
66 }
67 internal::MaaWin32ControllerTypeEnum_MaaWin32ControllerType_Screencap_GDI => {
68 MaaWin32ControllerScreencapType::GDI
69 }
70 internal::MaaWin32ControllerTypeEnum_MaaWin32ControllerType_Screencap_DXGI_DesktopDup => {
71 MaaWin32ControllerScreencapType::DXGIDesktopDup
72 }
73 internal::MaaWin32ControllerTypeEnum_MaaWin32ControllerType_Screencap_DXGI_FramePool => {
74 MaaWin32ControllerScreencapType::DXGIFramePool
75 }
76 _ => return Err(error::Error::MaaWin32ControllerTypeConversionError(value))
77 };
78
79 Ok(MaaWin32ControllerType {
80 touch_type,
81 key_type,
82 screencap_type,
83 })
84 }
85}
86
87impl From<MaaWin32ControllerType> for internal::MaaWin32ControllerTypeEnum {
88 fn from(value: MaaWin32ControllerType) -> Self {
89 let touch_type = match value.touch_type {
90 MaaWin32ControllerTouchType::Invalid => {
91 internal::MaaWin32ControllerTypeEnum_MaaWin32Controller_Invalid
92 }
93 MaaWin32ControllerTouchType::SendMessage => {
94 internal::MaaWin32ControllerTypeEnum_MaaWin32ControllerType_Touch_SendMessage
95 }
96 MaaWin32ControllerTouchType::Seize => {
97 internal::MaaWin32ControllerTypeEnum_MaaWin32ControllerType_Touch_Seize
98 }
99 };
100
101 let key_type = match value.key_type {
102 MaaWin32ControllerKeyType::Invalid => {
103 internal::MaaWin32ControllerTypeEnum_MaaWin32Controller_Invalid
104 }
105 MaaWin32ControllerKeyType::SendMessage => {
106 internal::MaaWin32ControllerTypeEnum_MaaWin32ControllerType_Key_SendMessage
107 }
108 MaaWin32ControllerKeyType::Seize => {
109 internal::MaaWin32ControllerTypeEnum_MaaWin32ControllerType_Key_Seize
110 }
111 };
112
113 let screencap_type = match value.screencap_type {
114 MaaWin32ControllerScreencapType::Invalid => internal::MaaWin32ControllerTypeEnum_MaaWin32Controller_Invalid,
115 MaaWin32ControllerScreencapType::GDI => internal::MaaWin32ControllerTypeEnum_MaaWin32ControllerType_Screencap_GDI,
116 MaaWin32ControllerScreencapType::DXGIDesktopDup => internal::MaaWin32ControllerTypeEnum_MaaWin32ControllerType_Screencap_DXGI_DesktopDup,
117 MaaWin32ControllerScreencapType::DXGIFramePool => internal::MaaWin32ControllerTypeEnum_MaaWin32ControllerType_Screencap_DXGI_FramePool
118 };
119
120 touch_type | key_type | screencap_type
121 }
122}
123pub struct MaaWin32Hwnd(pub(crate) internal::MaaWin32Hwnd);
124
125impl Deref for MaaWin32Hwnd {
126 type Target = internal::MaaWin32Hwnd;
127
128 fn deref(&self) -> &Self::Target {
129 &self.0
130 }
131}
132
133unsafe impl Send for MaaWin32Hwnd {}
134unsafe impl Sync for MaaWin32Hwnd {}