yaxi/display/
request.rs

1use std::mem;
2use std::ptr;
3use std::slice;
4
5// https://xcb.freedesktop.org/manual/xproto_8h_source.html
6
7#[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    // pub length: u32,
127    // pub event_type: u16,
128    // pub pad0: [u8; 22],
129    // pub full_sequence: u32,
130}
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}