simconnect_sdk/simconnect/
events.rs1use crate::{
2 bindings, success, ClientEventRequest, SimConnect, SimConnectError, SystemEventRequest,
3};
4
5const NOTIFICATION_GROUP_ID: u32 = 0;
7
8impl SimConnect {
9 #[tracing::instrument(
11 name = "SimConnect::subscribe_to_system_event",
12 level = "debug",
13 skip(self)
14 )]
15 pub fn subscribe_to_system_event(
16 &mut self,
17 event: SystemEventRequest,
18 ) -> Result<(), SimConnectError> {
19 self.system_event_register.register(event)?;
20
21 success!(unsafe {
22 bindings::SimConnect_SubscribeToSystemEvent(
23 self.handle.as_ptr(),
24 event as u32,
25 event.into_c_char(),
26 )
27 })?;
28
29 Ok(())
30 }
31
32 #[tracing::instrument(
35 name = "SimConnect::unsubscribe_from_system_event",
36 level = "debug",
37 skip(self)
38 )]
39 pub fn unsubscribe_from_system_event(
40 &mut self,
41 event: SystemEventRequest,
42 ) -> Result<(), SimConnectError> {
43 if self.system_event_register.is_registered(event) {
44 success!(unsafe {
45 bindings::SimConnect_UnsubscribeFromSystemEvent(self.handle.as_ptr(), event as u32)
46 })?;
47
48 self.system_event_register.clear();
49 }
50
51 Ok(())
52 }
53
54 #[tracing::instrument(
56 name = "SimConnect::subscribe_to_client_event",
57 level = "debug",
58 skip(self)
59 )]
60 pub fn subscribe_to_client_event(
61 &mut self,
62 event: ClientEventRequest,
63 ) -> Result<(), SimConnectError> {
64 self.client_event_register.register(event)?;
65
66 success!(unsafe {
67 bindings::SimConnect_MapClientEventToSimEvent(
68 self.handle.as_ptr(),
69 event as u32,
70 event.into_c_char(),
71 )
72 })?;
73
74 success!(unsafe {
75 bindings::SimConnect_AddClientEventToNotificationGroup(
76 self.handle.as_ptr(),
77 NOTIFICATION_GROUP_ID,
78 event as u32,
79 0,
80 )
81 })?;
82
83 success!(unsafe {
84 bindings::SimConnect_SetNotificationGroupPriority(
85 self.handle.as_ptr(),
86 NOTIFICATION_GROUP_ID,
87 bindings::SIMCONNECT_GROUP_PRIORITY_HIGHEST,
88 )
89 })?;
90
91 Ok(())
92 }
93
94 #[tracing::instrument(
97 name = "SimConnect::unsubscribe_from_client_event",
98 level = "debug",
99 skip(self)
100 )]
101 pub fn unsubscribe_from_client_event(
102 &mut self,
103 event: ClientEventRequest,
104 ) -> Result<(), SimConnectError> {
105 if self.client_event_register.is_registered(event) {
106 success!(unsafe {
107 bindings::SimConnect_RemoveClientEvent(
108 self.handle.as_ptr(),
109 NOTIFICATION_GROUP_ID,
110 event as u32,
111 )
112 })?;
113
114 self.client_event_register.unregister(event)?;
115 }
116
117 Ok(())
118 }
119
120 #[tracing::instrument(
122 name = "SimConnect::unsubscribe_from_all_client_events",
123 level = "debug",
124 skip(self)
125 )]
126 pub fn unsubscribe_from_all_client_events(&mut self) -> Result<(), SimConnectError> {
127 success!(unsafe {
128 bindings::SimConnect_ClearNotificationGroup(self.handle.as_ptr(), NOTIFICATION_GROUP_ID)
129 })?;
130
131 self.client_event_register.clear();
132
133 Ok(())
134 }
135}