1use std::mem;
2use std::ptr;
3use std::slice;
4
5#[repr(packed, C)]
8pub struct SetupRequest {
9 endian: u8,
10 pad0: u8,
11 major_version: u16,
12 minor_version: u16,
13 name_len: u16,
14 data_len: u16,
15 pad1: [u8; 2],
16}
17
18impl SetupRequest {
19 pub fn new(
20 endian: u8,
21 major_version: u16,
22 minor_version: u16,
23 name_len: u16,
24 data_len: u16,
25 ) -> SetupRequest {
26 SetupRequest {
27 endian,
28 pad0: endian,
29 major_version,
30 minor_version,
31 name_len,
32 data_len,
33 pad1: [endian; 2],
34 }
35 }
36}
37
38#[repr(packed, C)]
39#[derive(Debug)]
40pub struct SetupResponse {
41 pub status: u8,
42 pub padding: u8,
43 pub major_version: u16,
44 pub minor_version: u16,
45 pub length: u16,
46}
47
48#[repr(packed, C)]
49#[derive(Debug, Clone, Default)]
50pub struct SuccessResponse {
51 pub release_number: u32,
52 pub resource_id_base: u32,
53 pub resource_id_mask: u32,
54 pub motion_buffer_size: u32,
55 pub vendor_len: u16,
56 pub maximum_request_len: u16,
57 pub roots_len: u8,
58 pub pixmap_formats_len: u8,
59 pub image_byte_order: u8,
60 pub bitmap_format_bit_order: u8,
61 pub bitmap_format_scanline_unit: u8,
62 pub bitmap_format_scanline_pad: u8,
63 pub min_keycode: u8,
64 pub max_keycode: u8,
65 pub padding: [u8; 4],
66}
67
68#[repr(packed, C)]
69#[derive(Debug)]
70pub struct PixmapFormat {
71 depth: u8,
72 bits_per_pixel: u8,
73 scanline_pad: u8,
74 padding: [u8; 5],
75}
76
77#[repr(packed, C)]
78#[derive(Debug, Clone)]
79pub struct ScreenResponse {
80 pub root: u32,
81 pub default_colormap: u32,
82 pub white_pixel: u32,
83 pub black_pixel: u32,
84 pub current_input_mask: u32,
85 pub width_in_pixels: u16,
86 pub height_in_pixels: u16,
87 pub width_in_mm: u16,
88 pub height_in_mm: u16,
89 pub min_installed_maps: u16,
90 pub max_installed_maps: u16,
91 pub root_visual: u32,
92 pub backing_stores: u8,
93 pub save_unders: u8,
94 pub root_depth: u8,
95 pub allowed_depths_len: u8,
96}
97
98#[repr(packed, C)]
99#[derive(Debug)]
100pub struct DepthResponse {
101 pub depth: u8,
102 pub pad0: u8,
103 pub visuals_len: u16,
104 pub pad1: [u8; 4],
105}
106
107#[repr(packed, C)]
108#[derive(Debug, Clone, Copy)]
109pub struct VisualResponse {
110 pub visual_id: u32,
111 pub class: u8,
112 pub bits_per_rgb_value: u8,
113 pub colormap_entries: u16,
114 pub red_mask: u32,
115 pub green_mask: u32,
116 pub blue_mask: u32,
117 pub pad0: [u8; 4],
118}
119
120#[repr(packed, C)]
121#[derive(Debug)]
122pub struct GenericEvent {
123 pub opcode: u8,
124 pub detail: u8,
125 pub sequence: u16,
126 }
131
132#[repr(packed, C)]
133#[derive(Debug)]
134pub struct ErrorEvent {
135 pub bad_value: u32,
136 pub minor_opcode: u16,
137 pub major_opcode: u8,
138 pub pad0: [u8; 21],
139}
140
141#[repr(packed, C)]
142#[derive(Debug)]
143pub struct KeyEvent {
144 pub time: u32,
145 pub root: u32,
146 pub event: u32,
147 pub child: u32,
148 pub root_x: u16,
149 pub root_y: u16,
150 pub event_x: u16,
151 pub event_y: u16,
152 pub state: u16,
153 pub same_screen: u8,
154 pub pad0: u8,
155}
156
157#[repr(packed, C)]
158#[derive(Debug)]
159pub struct ButtonEvent {
160 pub time: u32,
161 pub root: u32,
162 pub event: u32,
163 pub child: u32,
164 pub root_x: u16,
165 pub root_y: u16,
166 pub event_x: u16,
167 pub event_y: u16,
168 pub state: u16,
169 pub same_screen: u8,
170 pub pad0: u8,
171}
172
173pub type MotionNotify = ButtonEvent;
174
175#[repr(packed, C)]
176#[derive(Debug)]
177pub struct CircNotify {
178 pub event: u32,
179 pub window: u32,
180 pub unused: u32,
181 pub place: u8,
182 pub pad0: [u8; 15],
183}
184
185#[repr(packed, C)]
186#[derive(Debug)]
187pub struct ConfigNotify {
188 pub event: u32,
189 pub window: u32,
190 pub above_sibling: u32,
191 pub x: u16,
192 pub y: u16,
193 pub width: u16,
194 pub height: u16,
195 pub border_width: u16,
196 pub override_redirect: u8,
197 pub pad0: [u8; 5],
198}
199
200#[repr(packed, C)]
201#[derive(Debug)]
202pub struct CreateNotify {
203 pub event: u32,
204 pub window: u32,
205 pub x: u16,
206 pub y: u16,
207 pub width: u16,
208 pub height: u16,
209 pub border_width: u16,
210 pub override_redirect: u8,
211 pub pad0: [u8; 9],
212}
213
214#[repr(packed, C)]
215#[derive(Debug)]
216pub struct DestroyNotify {
217 pub event: u32,
218 pub window: u32,
219 pub pad0: [u8; 20],
220}
221
222#[repr(packed, C)]
223#[derive(Debug)]
224pub struct GravityNotify {
225 pub event: u32,
226 pub window: u32,
227 pub x: u16,
228 pub y: u16,
229 pub pad0: [u8; 16],
230}
231
232#[repr(packed, C)]
233#[derive(Debug)]
234pub struct MapNotify {
235 pub event: u32,
236 pub window: u32,
237 pub override_redirect: u8,
238 pub pad0: [u8; 19],
239}
240
241#[repr(packed, C)]
242#[derive(Debug)]
243pub struct ReparentNotify {
244 pub event: u32,
245 pub window: u32,
246 pub parent: u32,
247 pub x: u16,
248 pub y: u16,
249 pub override_redirect: u8,
250 pub pad0: [u8; 11],
251}
252
253#[repr(packed, C)]
254#[derive(Debug)]
255pub struct UnmapNotify {
256 pub event: u32,
257 pub window: u32,
258 pub from_configure: u8,
259 pub pad0: [u8; 19],
260}
261
262pub type CircReq = CircNotify;
263
264#[repr(packed, C)]
265#[derive(Debug)]
266pub struct ConfigReq {
267 pub parent: u32,
268 pub window: u32,
269 pub sibling: u32,
270 pub x: u16,
271 pub y: u16,
272 pub width: u16,
273 pub height: u16,
274 pub border_width: u16,
275 pub value_mask: u16,
276 pub pad0: [u8; 4],
277}
278
279#[repr(packed, C)]
280#[derive(Debug)]
281pub struct MapReq {
282 pub parent: u32,
283 pub window: u32,
284 pub pad0: [u8; 20],
285}
286
287#[repr(packed, C)]
288#[derive(Debug)]
289pub struct ClientMessage {
290 pub window: u32,
291 pub type_: u32,
292}
293
294#[repr(packed, C)]
295#[derive(Debug)]
296pub struct MappingNotify {
297 pub request: u8,
298 pub keycode: u8,
299 pub count: u8,
300 pub pad0: [u8; 25],
301}
302
303#[repr(packed, C)]
304#[derive(Debug)]
305pub struct SelectionClear {
306 pub time: u32,
307 pub owner: u32,
308 pub selection: u32,
309 pub pad0: [u8; 16],
310}
311
312#[repr(packed, C)]
313#[derive(Debug)]
314pub struct SelectionNotify {
315 pub time: u32,
316 pub requestor: u32,
317 pub selection: u32,
318 pub target: u32,
319 pub property: u32,
320 pub pad0: [u8; 8],
321}
322
323#[repr(packed, C)]
324#[derive(Debug)]
325pub struct SelectionReq {
326 pub time: u32,
327 pub owner: u32,
328 pub requestor: u32,
329 pub selection: u32,
330 pub target: u32,
331 pub property: u32,
332 pub pad0: [u8; 4],
333}
334
335#[repr(packed, C)]
336#[derive(Debug)]
337pub struct EnterNotify {
338 pub time: u32,
339 pub root: u32,
340 pub event: u32,
341 pub child: u32,
342 pub root_x: u16,
343 pub root_y: u16,
344 pub event_x: u16,
345 pub event_y: u16,
346 pub state: u16,
347 pub mode: u8,
348 pub sf: u8,
349}
350
351#[repr(packed, C)]
352#[derive(Debug)]
353pub struct PropertyNotify {
354 pub window: u32,
355 pub atom: u32,
356 pub time: u32,
357 pub state: u8,
358 pub pad0: [u8; 15],
359}
360
361#[repr(packed, C)]
362#[derive(Debug)]
363pub struct CreateWindow {
364 pub opcode: u8,
365 pub depth: u8,
366 pub length: u16,
367 pub wid: u32,
368 pub parent: u32,
369 pub x: i16,
370 pub y: i16,
371 pub width: u16,
372 pub height: u16,
373 pub border_width: u16,
374 pub class: u16,
375 pub visual: u32,
376 pub value_mask: u32,
377}
378
379#[repr(packed, C)]
380#[derive(Debug)]
381pub struct GenericWindow {
382 pub opcode: u8,
383 pub pad0: u8,
384 pub length: u16,
385 pub wid: u32,
386}
387
388#[repr(packed, C)]
389#[derive(Debug)]
390pub struct InternAtom {
391 pub opcode: u8,
392 pub only_if_exists: u8,
393 pub length: u16,
394 pub name_len: u16,
395 pub pad1: [u8; 2],
396}
397
398#[repr(packed, C)]
399#[derive(Debug, Clone)]
400pub struct InternAtomResponse {
401 pub(crate) length: u32,
402 pub atom: u32,
403 pub(crate) pad0: [u8; 20],
404}
405
406#[repr(packed, C)]
407#[derive(Debug)]
408pub struct ChangeProperty {
409 pub opcode: u8,
410 pub mode: u8,
411 pub length: u16,
412 pub window: u32,
413 pub property: u32,
414 pub type_: u32,
415 pub format: u8,
416 pub pad0: [u8; 3],
417 pub data_len: u32,
418}
419
420#[repr(packed, C)]
421#[derive(Debug)]
422pub struct GetProperty {
423 pub opcode: u8,
424 pub delete: u8,
425 pub length: u16,
426 pub window: u32,
427 pub property: u32,
428 pub type_: u32,
429 pub long_offset: u32,
430 pub long_length: u32,
431}
432
433#[repr(packed, C)]
434#[derive(Debug, Clone)]
435pub struct GetPropertyResponse {
436 pub length: u32,
437 pub type_: u32,
438 pub bytes_after: u32,
439 pub value_len: u32,
440 pub pad0: [u8; 12],
441}
442
443#[repr(packed, C)]
444#[derive(Debug)]
445pub struct ReparentWindow {
446 pub opcode: u8,
447 pub pad0: u8,
448 pub length: u32,
449 pub window: u32,
450 pub parent: u32,
451 pub x: u16,
452 pub y: u16,
453}
454
455#[repr(packed, C)]
456#[derive(Debug)]
457pub struct GetWindowAttributes {
458 pub opcode: u8,
459 pub pad0: u8,
460 pub length: u16,
461 pub wid: u32,
462}
463
464#[repr(packed, C)]
465#[derive(Debug, Clone)]
466pub struct GetWindowAttributesResponse {
467 pub(crate) length: u32,
468 pub visual: u32,
469 pub class: u16,
470 pub bit_gravity: u8,
471 pub win_gravity: u8,
472 pub backing_planes: u32,
473 pub backing_pixel: u32,
474 pub save_under: u8,
475 pub map_is_installed: u8,
476 pub map_state: u8,
477 pub override_redirect: u8,
478 pub colormap: u32,
479 pub all_event_mask: u32,
480 pub your_event_mask: u32,
481 pub do_not_propogate_mask: u16,
482 pub(crate) pad0: [u8; 2],
483}
484
485#[repr(packed, C)]
486#[derive(Debug)]
487pub struct ChangeWindowAttributes {
488 pub opcode: u8,
489 pub pad0: u8,
490 pub length: u16,
491 pub wid: u32,
492 pub mask: u32,
493}
494
495#[repr(packed, C)]
496#[derive(Debug)]
497pub struct QueryPointer {
498 pub opcode: u8,
499 pub pad0: u8,
500 pub length: u16,
501 pub wid: u32,
502}
503
504#[repr(packed, C)]
505#[derive(Debug, Clone)]
506pub struct QueryPointerResponse {
507 pub(crate) length: u32,
508 pub root: u32,
509 pub child: u32,
510 pub root_x: u16,
511 pub root_y: u16,
512 pub win_x: u16,
513 pub win_y: u16,
514 pub mask: u16,
515 pub(crate) pad0: [u8; 6],
516}
517
518#[repr(packed, C)]
519#[derive(Debug, Clone)]
520pub struct GetKeyboardMapping {
521 pub opcode: u8,
522 pub pad0: u8,
523 pub length: u16,
524 pub first: u8,
525 pub count: u8,
526 pub pad1: [u8; 2],
527}
528
529#[repr(packed, C)]
530#[derive(Debug, Clone)]
531pub struct KeyboardMappingResponse {
532 pub length: u32,
533 pub pad0: [u8; 24],
534}
535
536#[repr(packed, C)]
537#[derive(Debug)]
538pub struct GrabKey {
539 pub opcode: u8,
540 pub owner_events: u8,
541 pub length: u16,
542 pub grab_window: u32,
543 pub modifiers: u16,
544 pub key: u8,
545 pub pointer_mode: u8,
546 pub keyboard_mode: u8,
547 pub pad0: [u8; 3],
548}
549
550#[repr(packed, C)]
551#[derive(Debug)]
552pub struct GrabButton {
553 pub opcode: u8,
554 pub owner_events: u8,
555 pub length: u16,
556 pub grab_window: u32,
557 pub event_mask: u16,
558 pub pointer_mode: u8,
559 pub keyboard_mode: u8,
560 pub confine_to: u32,
561 pub cursor: u32,
562 pub button: u8,
563 pub pad0: u8,
564 pub modifiers: u16,
565}
566
567#[repr(packed, C)]
568#[derive(Debug)]
569pub struct UngrabButton {
570 pub opcode: u8,
571 pub button: u8,
572 pub length: u16,
573 pub grab_window: u32,
574 pub modifiers: u16,
575 pub pad0: [u8; 2],
576}
577
578#[repr(packed, C)]
579#[derive(Debug)]
580pub struct GrabPointer {
581 pub opcode: u8,
582 pub owner_events: u8,
583 pub length: u16,
584 pub grab_window: u32,
585 pub event_mask: u16,
586 pub pointer_mode: u8,
587 pub keyboard_mode: u8,
588 pub confine_to: u32,
589 pub cursor: u32,
590 pub time: u32,
591}
592
593#[repr(packed, C)]
594#[derive(Debug, Clone)]
595pub struct GrabPointerResponse {
596 pub length: u32,
597 pub(crate) pad0: [u8; 24],
598}
599
600#[repr(packed, C)]
601#[derive(Debug)]
602pub struct UngrabPointer {
603 pub opcode: u8,
604 pub pad0: u8,
605 pub length: u16,
606 pub time: u32,
607}
608
609#[repr(packed, C)]
610#[derive(Debug)]
611pub struct ConfigureWindow {
612 pub opcode: u8,
613 pub pad0: u8,
614 pub length: u16,
615 pub wid: u32,
616 pub mask: u16,
617 pub pad1: u16,
618}
619
620#[repr(packed, C)]
621#[derive(Debug)]
622pub struct KillClient {
623 pub opcode: u8,
624 pub pad0: u8,
625 pub length: u16,
626 pub resource: u32,
627}
628
629#[repr(packed, C)]
630#[derive(Debug)]
631pub struct SetInputFocus {
632 pub opcode: u8,
633 pub revert_to: u8,
634 pub length: u16,
635 pub focus: u32,
636 pub time: u32,
637}
638
639#[repr(packed, C)]
640#[derive(Debug)]
641pub struct GetInputFocus {
642 pub opcode: u8,
643 pub pad0: u8,
644 pub length: u16,
645}
646
647#[repr(packed, C)]
648#[derive(Debug, Clone)]
649pub struct GetInputFocusResponse {
650 pub(crate) length: u32,
651 pub window: u32,
652 pub(crate) pad0: [u8; 20],
653}
654
655#[repr(packed, C)]
656#[derive(Debug, Clone)]
657pub struct FocusIn {
658 pub event: u32,
659 pub mode: u8,
660 pub(crate) pad0: [u8; 23],
661}
662
663#[repr(packed, C)]
664#[derive(Debug, Clone)]
665pub struct FocusOut {
666 pub event: u32,
667 pub mode: u8,
668 pub(crate) pad0: [u8; 23],
669}
670
671#[repr(packed, C)]
672#[derive(Debug, Clone)]
673pub struct GetGeometry {
674 pub opcode: u8,
675 pub pad0: u8,
676 pub length: u16,
677 pub window: u32,
678}
679
680#[repr(packed, C)]
681#[derive(Debug, Clone)]
682pub struct GetGeometryResponse {
683 pub(crate) length: u32,
684 pub root: u32,
685 pub x: u16,
686 pub y: u16,
687 pub width: u16,
688 pub height: u16,
689 pub border_width: u16,
690 pub(crate) pad0: [u8; 10],
691}
692
693#[repr(packed, C)]
694#[derive(Debug, Clone)]
695pub struct QueryExtension {
696 pub opcode: u8,
697 pub pad0: u8,
698 pub length: u16,
699 pub name_len: u16,
700 pub pad1: u16,
701}
702
703#[repr(packed, C)]
704#[derive(Debug, Clone)]
705pub struct QueryExtensionResponse {
706 pub(crate) length: u32,
707 pub present: u8,
708 pub major_opcode: u8,
709 pub first_event: u8,
710 pub first_error: u8,
711 pub(crate) pad0: [u8; 20],
712}
713
714#[repr(packed, C)]
715#[derive(Debug, Clone)]
716pub struct XineramaIsActive {
717 pub opcode: u8,
718 pub minor: u8,
719 pub length: u16,
720}
721
722#[repr(packed, C)]
723#[derive(Debug, Clone)]
724pub struct XineramaIsActiveResponse {
725 pub(crate) length: u32,
726 pub state: u32,
727 pub(crate) pad0: [u32; 5],
728}
729
730#[repr(packed, C)]
731#[derive(Debug, Clone)]
732pub struct XineramaQueryScreens {
733 pub opcode: u8,
734 pub minor: u8,
735 pub length: u16,
736}
737
738#[repr(packed, C)]
739#[derive(Debug, Clone)]
740pub struct XineramaQueryScreensResponse {
741 pub(crate) length: u32,
742 pub number: u32,
743 pub(crate) pad0: [u32; 5],
744}
745
746#[repr(packed, C)]
747#[derive(Debug, Clone, Default)]
748pub struct XineramaScreenInfo {
749 pub x: u16,
750 pub y: u16,
751 pub width: u16,
752 pub height: u16,
753}
754
755#[repr(packed, C)]
756#[derive(Debug, Clone)]
757pub struct SetSelectionOwner {
758 pub opcode: u8,
759 pub pad0: u8,
760 pub length: u16,
761 pub owner: u32,
762 pub selection: u32,
763 pub time: u32,
764}
765
766#[repr(packed, C)]
767#[derive(Debug, Clone)]
768pub struct GetSelectionOwner {
769 pub opcode: u8,
770 pub pad0: u8,
771 pub length: u16,
772 pub selection: u32,
773}
774
775#[repr(packed, C)]
776#[derive(Debug, Clone)]
777pub struct GetSelectionOwnerResponse {
778 pub length: u32,
779 pub owner: u32,
780 pub pad0: [u8; 20],
781}
782
783#[repr(packed, C)]
784#[derive(Debug, Clone)]
785pub struct ConvertSelection {
786 pub opcode: u8,
787 pub pad0: u8,
788 pub length: u16,
789 pub requestor: u32,
790 pub selection: u32,
791 pub target: u32,
792 pub property: u32,
793 pub time: u32,
794}
795
796#[repr(packed, C)]
797#[derive(Debug, Clone)]
798pub struct SendEvent {
799 pub opcode: u8,
800 pub propogate: u8,
801 pub length: u16,
802 pub destination: u32,
803 pub event_mask: u32,
804}
805
806#[repr(packed, C)]
807#[derive(Debug, Clone)]
808pub struct ChangeSaveSet {
809 pub opcode: u8,
810 pub mode: u8,
811 pub length: u16,
812 pub wid: u32,
813}
814
815#[repr(packed, C)]
816#[derive(Debug, Clone)]
817pub struct CirculateWindow {
818 pub opcode: u8,
819 pub direction: u8,
820 pub length: u16,
821 pub wid: u32,
822}
823
824#[repr(packed, C)]
825#[derive(Debug, Clone)]
826pub struct GetAtomName {
827 pub opcode: u8,
828 pub pad0: u8,
829 pub length: u16,
830 pub atom: u32,
831}
832
833#[repr(packed, C)]
834#[derive(Debug, Clone)]
835pub struct GetAtomNameResponse {
836 pub length: u32,
837 pub name_len: u16,
838 pub pad0: [u8; 22],
839}
840
841#[repr(packed, C)]
842#[derive(Debug, Clone)]
843pub struct QueryTree {
844 pub opcode: u8,
845 pub pad0: u8,
846 pub length: u16,
847 pub wid: u32,
848}
849
850#[repr(packed, C)]
851#[derive(Debug, Clone)]
852pub struct QueryTreeResponse {
853 pub length: u32,
854 pub root: u32,
855 pub parent: u32,
856 pub num_children: u16,
857 pub pad0: [u8; 14],
858}
859
860#[repr(packed, C)]
861#[derive(Debug, Clone)]
862pub struct ChangeActivePointerGrab {
863 pub opcode: u8,
864 pub pad0: u8,
865 pub length: u16,
866 pub cursor: u32,
867 pub time: u32,
868 pub event_mask: u16,
869 pub pad1: u16,
870}
871
872#[repr(packed, C)]
873#[derive(Debug, Clone)]
874pub struct GrabKeyboard {
875 pub opcode: u8,
876 pub owner_events: u8,
877 pub length: u16,
878 pub grab_window: u32,
879 pub time: u32,
880 pub pointer_mode: u8,
881 pub keyboard_mode: u8,
882 pub pad0: u16,
883}
884
885#[repr(packed, C)]
886#[derive(Debug, Clone)]
887pub struct GrabKeyboardResponse {
888 pub length: u32,
889 pub pad0: [u8; 24],
890}
891
892#[repr(packed, C)]
893#[derive(Debug, Clone)]
894pub struct UngrabKeyboard {
895 pub opcode: u8,
896 pub pad0: u8,
897 pub length: u16,
898 pub time: u32,
899}
900
901#[repr(packed, C)]
902#[derive(Debug, Clone)]
903pub struct WarpPointer {
904 pub opcode: u8,
905 pub pad0: u8,
906 pub length: u16,
907 pub src_window: u32,
908 pub dst_window: u32,
909 pub src_x: i16,
910 pub src_y: i16,
911 pub src_width: u16,
912 pub src_height: u16,
913 pub dst_x: i16,
914 pub dst_y: i16,
915}
916
917pub fn encode<T>(ptr: &T) -> &[u8] {
918 unsafe { slice::from_raw_parts((ptr as *const T) as *const u8, mem::size_of::<T>()) }
919}
920
921pub fn decode<'a, T>(bytes: &'a [u8]) -> T {
922 unsafe {
923 assert_eq!(bytes.len(), mem::size_of::<T>());
924
925 ptr::read(bytes.as_ptr() as *const T)
926 }
927}
928
929pub fn decode_slice<'a, T>(bytes: &'a [u8], length: usize) -> &'a [T] {
930 unsafe {
931 assert_eq!(bytes.len(), mem::size_of::<T>() * length);
932
933 std::slice::from_raw_parts(bytes.as_ptr() as *const T, length)
934 }
935}
936
937pub fn pad(len: usize) -> usize {
938 (4 - (len % 4)) % 4
939}