1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
//! This file has been automatically generated by `objc2`'s `header-translator`.
//! DO NOT EDIT
use objc2::__framework_prelude::*;
use objc2_foundation::*;

use crate::*;

// NS_ENUM
#[repr(transparent)]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct UIEventType(pub NSInteger);
impl UIEventType {
    #[doc(alias = "UIEventTypeTouches")]
    pub const Touches: Self = Self(0);
    #[doc(alias = "UIEventTypeMotion")]
    pub const Motion: Self = Self(1);
    #[doc(alias = "UIEventTypeRemoteControl")]
    pub const RemoteControl: Self = Self(2);
    #[doc(alias = "UIEventTypePresses")]
    pub const Presses: Self = Self(3);
    #[doc(alias = "UIEventTypeScroll")]
    pub const Scroll: Self = Self(10);
    #[doc(alias = "UIEventTypeHover")]
    pub const Hover: Self = Self(11);
    #[doc(alias = "UIEventTypeTransform")]
    pub const Transform: Self = Self(14);
}

unsafe impl Encode for UIEventType {
    const ENCODING: Encoding = NSInteger::ENCODING;
}

unsafe impl RefEncode for UIEventType {
    const ENCODING_REF: Encoding = Encoding::Pointer(&Self::ENCODING);
}

// NS_ENUM
#[repr(transparent)]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct UIEventSubtype(pub NSInteger);
impl UIEventSubtype {
    #[doc(alias = "UIEventSubtypeNone")]
    pub const None: Self = Self(0);
    #[doc(alias = "UIEventSubtypeMotionShake")]
    pub const MotionShake: Self = Self(1);
    #[doc(alias = "UIEventSubtypeRemoteControlPlay")]
    pub const RemoteControlPlay: Self = Self(100);
    #[doc(alias = "UIEventSubtypeRemoteControlPause")]
    pub const RemoteControlPause: Self = Self(101);
    #[doc(alias = "UIEventSubtypeRemoteControlStop")]
    pub const RemoteControlStop: Self = Self(102);
    #[doc(alias = "UIEventSubtypeRemoteControlTogglePlayPause")]
    pub const RemoteControlTogglePlayPause: Self = Self(103);
    #[doc(alias = "UIEventSubtypeRemoteControlNextTrack")]
    pub const RemoteControlNextTrack: Self = Self(104);
    #[doc(alias = "UIEventSubtypeRemoteControlPreviousTrack")]
    pub const RemoteControlPreviousTrack: Self = Self(105);
    #[doc(alias = "UIEventSubtypeRemoteControlBeginSeekingBackward")]
    pub const RemoteControlBeginSeekingBackward: Self = Self(106);
    #[doc(alias = "UIEventSubtypeRemoteControlEndSeekingBackward")]
    pub const RemoteControlEndSeekingBackward: Self = Self(107);
    #[doc(alias = "UIEventSubtypeRemoteControlBeginSeekingForward")]
    pub const RemoteControlBeginSeekingForward: Self = Self(108);
    #[doc(alias = "UIEventSubtypeRemoteControlEndSeekingForward")]
    pub const RemoteControlEndSeekingForward: Self = Self(109);
}

unsafe impl Encode for UIEventSubtype {
    const ENCODING: Encoding = NSInteger::ENCODING;
}

unsafe impl RefEncode for UIEventSubtype {
    const ENCODING_REF: Encoding = Encoding::Pointer(&Self::ENCODING);
}

// NS_OPTIONS
#[repr(transparent)]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct UIEventButtonMask(pub NSInteger);
bitflags::bitflags! {
    impl UIEventButtonMask: NSInteger {
        #[doc(alias = "UIEventButtonMaskPrimary")]
        const Primary = 1<<0;
        #[doc(alias = "UIEventButtonMaskSecondary")]
        const Secondary = 1<<1;
    }
}

unsafe impl Encode for UIEventButtonMask {
    const ENCODING: Encoding = NSInteger::ENCODING;
}

unsafe impl RefEncode for UIEventButtonMask {
    const ENCODING_REF: Encoding = Encoding::Pointer(&Self::ENCODING);
}

extern "C" {
    pub fn UIEventButtonMaskForButtonNumber(button_number: NSInteger) -> UIEventButtonMask;
}

extern_class!(
    #[derive(Debug, PartialEq, Eq, Hash)]
    pub struct UIEvent;

    unsafe impl ClassType for UIEvent {
        type Super = NSObject;
        type Mutability = MainThreadOnly;
    }
);

unsafe impl NSObjectProtocol for UIEvent {}

extern_methods!(
    unsafe impl UIEvent {
        #[method(type)]
        pub unsafe fn r#type(&self) -> UIEventType;

        #[method(subtype)]
        pub unsafe fn subtype(&self) -> UIEventSubtype;

        #[method(timestamp)]
        pub unsafe fn timestamp(&self) -> NSTimeInterval;

        #[cfg(feature = "UICommand")]
        #[method(modifierFlags)]
        pub unsafe fn modifierFlags(&self) -> UIKeyModifierFlags;

        #[method(buttonMask)]
        pub unsafe fn buttonMask(&self) -> UIEventButtonMask;

        #[cfg(feature = "UITouch")]
        #[method_id(@__retain_semantics Other allTouches)]
        pub unsafe fn allTouches(&self) -> Option<Retained<NSSet<UITouch>>>;

        #[cfg(all(
            feature = "UIResponder",
            feature = "UITouch",
            feature = "UIView",
            feature = "UIWindow"
        ))]
        #[method_id(@__retain_semantics Other touchesForWindow:)]
        pub unsafe fn touchesForWindow(
            &self,
            window: &UIWindow,
        ) -> Option<Retained<NSSet<UITouch>>>;

        #[cfg(all(feature = "UIResponder", feature = "UITouch", feature = "UIView"))]
        #[method_id(@__retain_semantics Other touchesForView:)]
        pub unsafe fn touchesForView(&self, view: &UIView) -> Option<Retained<NSSet<UITouch>>>;

        #[cfg(all(feature = "UIGestureRecognizer", feature = "UITouch"))]
        #[method_id(@__retain_semantics Other touchesForGestureRecognizer:)]
        pub unsafe fn touchesForGestureRecognizer(
            &self,
            gesture: &UIGestureRecognizer,
        ) -> Option<Retained<NSSet<UITouch>>>;

        #[cfg(feature = "UITouch")]
        #[method_id(@__retain_semantics Other coalescedTouchesForTouch:)]
        pub unsafe fn coalescedTouchesForTouch(
            &self,
            touch: &UITouch,
        ) -> Option<Retained<NSArray<UITouch>>>;

        #[cfg(feature = "UITouch")]
        #[method_id(@__retain_semantics Other predictedTouchesForTouch:)]
        pub unsafe fn predictedTouchesForTouch(
            &self,
            touch: &UITouch,
        ) -> Option<Retained<NSArray<UITouch>>>;
    }
);

extern_methods!(
    /// Methods declared on superclass `NSObject`
    unsafe impl UIEvent {
        #[method_id(@__retain_semantics Init init)]
        pub unsafe fn init(this: Allocated<Self>) -> Retained<Self>;

        #[method_id(@__retain_semantics New new)]
        pub unsafe fn new(mtm: MainThreadMarker) -> Retained<Self>;
    }
);