maa_framework/controller/
win32.rs

1use 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 {}