1#![cfg(target_os = "linux")]
6#![no_std]
7
8extern crate input_event_codes;
9extern crate libc;
10extern crate nix;
11
12use core::mem::size_of;
13
14use input_event_codes::{ABS_CNT, BTN_MISC, KEY_CNT};
15use libc::{__s16, __s32, __u16, __u32, __u8, c_long, c_longlong, c_ulong, size_t};
16use nix::{request_code_read, request_code_write};
17
18#[allow(non_camel_case_types)]
19pub type __s64 = c_longlong;
20
21pub const JS_VERSION: __u32 = 0x0002_0100;
22
23pub const JS_EVENT_BUTTON: __u8 = 0x01;
24pub const JS_EVENT_AXIS: __u8 = 0x02;
25pub const JS_EVENT_INIT: __u8 = 0x80;
26
27#[allow(non_camel_case_types)]
28#[cfg_attr(feature = "extra_traits", derive(Debug, Eq, Hash, PartialEq))]
29#[repr(C)]
30pub struct js_event {
31 pub time: __u32,
32 pub value: __s16,
33 pub type_: __u8,
34 pub number: __u8,
35}
36
37impl Copy for js_event {}
38
39impl Clone for js_event {
40 fn clone(&self) -> Self {
41 *self
42 }
43}
44
45pub const JSIOCGVERSION: c_ulong = request_code_read!(b'j', 0x01, size_of::<__u32>());
46
47pub const JSIOCGAXES: c_ulong = request_code_read!(b'j', 0x11, size_of::<__u8>());
48pub const JSIOCGBUTTONS: c_ulong = request_code_read!(b'j', 0x12, size_of::<__u8>());
49#[allow(non_snake_case)]
50pub const fn JSIOCGNAME(len: size_t) -> c_ulong {
51 request_code_read!(b'j', 0x13, len)
52}
53
54pub const JSIOCSCORR: c_ulong = request_code_write!(b'j', 0x21, size_of::<js_corr>());
55pub const JSIOCGCORR: c_ulong = request_code_read!(b'j', 0x22, size_of::<js_corr>());
56
57pub const JSIOCSAXMAP: c_ulong = request_code_write!(b'j', 0x31, size_of::<[__u8; ABS_CNT as usize]>());
58pub const JSIOCGAXMAP: c_ulong = request_code_read!(b'j', 0x32, size_of::<[__u8; ABS_CNT as usize]>());
59pub const JSIOCSBTNMAP: c_ulong = request_code_write!(b'j', 0x33, size_of::<[__u16; (KEY_CNT - BTN_MISC) as usize]>());
60pub const JSIOCGBTNMAP: c_ulong = request_code_read!(b'j', 0x34, size_of::<[__u16; (KEY_CNT - BTN_MISC) as usize]>());
61
62pub const JS_CORR_NONE: __u16 = 0x00;
63pub const JS_CORR_BROKEN: __u16 = 0x01;
64
65#[allow(non_camel_case_types)]
66#[cfg_attr(feature = "extra_traits", derive(Debug, Eq, Hash, PartialEq))]
67#[repr(C)]
68pub struct js_corr {
69 pub coef: [__s32; 8],
70 pub prec: __s16,
71 pub type_: __u16,
72}
73
74impl Copy for js_corr {}
75
76impl Clone for js_corr {
77 fn clone(&self) -> Self {
78 *self
79 }
80}
81
82pub const JS_RETURN: size_t = size_of::<JS_DATA_TYPE>();
83pub const JS_TRUE: __u8 = 1;
84pub const JS_FALSE: __u8 = 0;
85pub const JS_X_0: __u8 = 0x01;
86pub const JS_Y_0: __u8 = 0x02;
87pub const JS_X_1: __u8 = 0x04;
88pub const JS_Y_1: __u8 = 0x08;
89pub const JS_MAX: __u8 = 2;
90
91pub const JS_DEF_TIMEOUT: __u16 = 0x1300;
92pub const JS_DEF_CORR: __u8 = 0;
93pub const JS_DEF_TIMELIMIT: c_long = 10;
94
95pub const JS_SET_CAL: __u8 = 1;
96pub const JS_GET_CAL: __u8 = 2;
97pub const JS_SET_TIMEOUT: __u8 = 3;
98pub const JS_GET_TIMEOUT: __u8 = 4;
99pub const JS_SET_TIMELIMIT: __u8 = 5;
100pub const JS_GET_TIMELIMIT: __u8 = 6;
101pub const JS_GET_ALL: __u8 = 7;
102pub const JS_SET_ALL: __u8 = 8;
103
104#[allow(non_camel_case_types)]
105#[cfg_attr(feature = "extra_traits", derive(Debug, Eq, Hash, PartialEq))]
106#[repr(C)]
107pub struct JS_DATA_TYPE {
108 pub buttons: __s32,
109 pub x: __s32,
110 pub y: __s32,
111}
112
113impl Copy for JS_DATA_TYPE {}
114
115impl Clone for JS_DATA_TYPE {
116 fn clone(&self) -> Self {
117 *self
118 }
119}
120
121#[allow(non_camel_case_types)]
122#[allow(non_snake_case)]
123#[cfg_attr(feature = "extra_traits", derive(Debug, Eq, Hash, PartialEq))]
124#[repr(C)]
125pub struct JS_DATA_SAVE_TYPE_32 {
126 pub JS_TIMEOUT: __s32,
127 pub BUSY: __s32,
128 pub JS_EXPIRETIME: __s32,
129 pub JS_TIMELIMIT: __s32,
130 pub JS_SAVE: JS_DATA_TYPE,
131 pub JS_CORR: JS_DATA_TYPE,
132}
133
134impl Copy for JS_DATA_SAVE_TYPE_32 {}
135
136impl Clone for JS_DATA_SAVE_TYPE_32 {
137 fn clone(&self) -> Self {
138 *self
139 }
140}
141
142#[allow(non_camel_case_types)]
143#[allow(non_snake_case)]
144#[cfg_attr(feature = "extra_traits", derive(Debug, Eq, Hash, PartialEq))]
145#[repr(C)]
146pub struct JS_DATA_SAVE_TYPE_64 {
147 pub JS_TIMEOUT: __s32,
148 pub BUSY: __s32,
149 pub JS_EXPIRETIME: __s64,
150 pub JS_TIMELIMIT: __s64,
151 pub JS_SAVE: JS_DATA_TYPE,
152 pub JS_CORR: JS_DATA_TYPE,
153}
154
155impl Copy for JS_DATA_SAVE_TYPE_64 {}
156
157impl Clone for JS_DATA_SAVE_TYPE_64 {
158 fn clone(&self) -> Self {
159 *self
160 }
161}