core_graphics2/
event_source.rs1use core_foundation::{
2 base::{CFTypeID, TCFType},
3 date::CFTimeInterval,
4};
5use libc::c_double;
6
7use crate::{
8 event_types::{CGEventFlags, CGEventSourceKeyboardType, CGEventSourceRef, CGEventSourceStateID, CGEventType, CGMouseButton},
9 remote_operation::CGKeyCode,
10};
11
12extern "C" {
13 pub fn CGEventSourceGetTypeID() -> CFTypeID;
14 pub fn CGEventSourceCreate(stateID: CGEventSourceStateID) -> CGEventSourceRef;
15 pub fn CGEventSourceGetKeyboardType(source: CGEventSourceRef) -> CGEventSourceKeyboardType;
16 pub fn CGEventSourceSetKeyboardType(source: CGEventSourceRef, keyboardType: CGEventSourceKeyboardType);
17 pub fn CGEventSourceGetPixelsPerLine(source: CGEventSourceRef) -> c_double;
18 pub fn CGEventSourceSetPixelsPerLine(source: CGEventSourceRef, pixelsPerLine: c_double);
19 pub fn CGEventSourceGetSourceStateID(source: CGEventSourceRef) -> CGEventSourceStateID;
20 pub fn CGEventSourceButtonState(stateID: CGEventSourceStateID, button: CGMouseButton) -> bool;
21 pub fn CGEventSourceKeyState(stateID: CGEventSourceStateID, key: CGKeyCode) -> bool;
22 pub fn CGEventSourceFlagsState(stateID: CGEventSourceStateID) -> CGEventFlags;
23 pub fn CGEventSourceSecondsSinceLastEventType(stateID: CGEventSourceStateID, eventType: CGEventType) -> CFTimeInterval;
24 pub fn CGEventSourceCounterForEventType(stateID: CGEventSourceStateID, eventType: CGEventType) -> u32;
25 pub fn CGEventSourceSetUserData(source: CGEventSourceRef, userData: i64);
26 pub fn CGEventSourceGetUserData(source: CGEventSourceRef) -> i64;
27 pub fn CGEventSourceSetLocalEventsSuppressionInterval(source: CGEventSourceRef, seconds: CFTimeInterval);
28 pub fn CGEventSourceGetLocalEventsSuppressionInterval(source: CGEventSourceRef) -> CFTimeInterval;
29}
30
31declare_TCFType!(CGEventSource, CGEventSourceRef);
32impl_TCFType!(CGEventSource, CGEventSourceRef, CGEventSourceGetTypeID);
33impl_CFTypeDescription!(CGEventSource);
34
35impl CGEventSource {
36 pub fn new(state_id: CGEventSourceStateID) -> Result<Self, ()> {
37 unsafe {
38 let event_source = CGEventSourceCreate(state_id);
39 if event_source.is_null() {
40 Err(())
41 } else {
42 Ok(TCFType::wrap_under_create_rule(event_source))
43 }
44 }
45 }
46
47 pub fn get_keyboard_type(&self) -> CGEventSourceKeyboardType {
48 unsafe { CGEventSourceGetKeyboardType(self.as_concrete_TypeRef()) }
49 }
50
51 pub fn set_keyboard_type(&self, keyboard_type: CGEventSourceKeyboardType) {
52 unsafe { CGEventSourceSetKeyboardType(self.as_concrete_TypeRef(), keyboard_type) }
53 }
54
55 pub fn get_pixels_per_line(&self) -> c_double {
56 unsafe { CGEventSourceGetPixelsPerLine(self.as_concrete_TypeRef()) }
57 }
58
59 pub fn set_pixels_per_line(&self, pixels_per_line: c_double) {
60 unsafe { CGEventSourceSetPixelsPerLine(self.as_concrete_TypeRef(), pixels_per_line) }
61 }
62
63 pub fn get_source_state_id(&self) -> CGEventSourceStateID {
64 unsafe { CGEventSourceGetSourceStateID(self.as_concrete_TypeRef()) }
65 }
66
67 pub fn button_state(state_id: CGEventSourceStateID, button: CGMouseButton) -> bool {
68 unsafe { CGEventSourceButtonState(state_id, button) }
69 }
70
71 pub fn key_state(state_id: CGEventSourceStateID, key: CGKeyCode) -> bool {
72 unsafe { CGEventSourceKeyState(state_id, key) }
73 }
74
75 pub fn flags_state(state_id: CGEventSourceStateID) -> CGEventFlags {
76 unsafe { CGEventSourceFlagsState(state_id) }
77 }
78
79 pub fn seconds_since_last_event_type(state_id: CGEventSourceStateID, event_type: CGEventType) -> CFTimeInterval {
80 unsafe { CGEventSourceSecondsSinceLastEventType(state_id, event_type) }
81 }
82
83 pub fn counter_for_event_type(state_id: CGEventSourceStateID, event_type: CGEventType) -> u32 {
84 unsafe { CGEventSourceCounterForEventType(state_id, event_type) }
85 }
86
87 pub fn set_user_data(&self, user_data: i64) {
88 unsafe { CGEventSourceSetUserData(self.as_concrete_TypeRef(), user_data) }
89 }
90
91 pub fn get_user_data(&self) -> i64 {
92 unsafe { CGEventSourceGetUserData(self.as_concrete_TypeRef()) }
93 }
94
95 pub fn set_local_events_suppression_interval(&self, seconds: CFTimeInterval) {
96 unsafe { CGEventSourceSetLocalEventsSuppressionInterval(self.as_concrete_TypeRef(), seconds) }
97 }
98
99 pub fn get_local_events_suppression_interval(&self) -> CFTimeInterval {
100 unsafe { CGEventSourceGetLocalEventsSuppressionInterval(self.as_concrete_TypeRef()) }
101 }
102}