xim_parser/
parser.rs

1// DO NOT EDIT YOURSELF
2// This source is auto generated by xim-gen
3
4#![allow(clippy::identity_op)]
5
6use alloc::string::{String, ToString};
7use alloc::vec::Vec;
8
9use core::convert::TryInto;
10use core::fmt;
11
12pub fn read<T>(b: &[u8]) -> Result<T, ReadError>
13where
14    T: XimRead,
15{
16    T::read(&mut Reader::new(b))
17}
18
19pub fn write<T>(val: T, out: &mut [u8])
20where
21    T: XimWrite,
22{
23    val.write(&mut Writer::new(out));
24}
25
26#[derive(Copy, Clone, Debug, Eq, PartialEq)]
27#[repr(u8)]
28pub enum Endian {
29    #[cfg(target_endian = "little")]
30    Native = 0x6c,
31    #[cfg(target_endian = "big")]
32    Native = 0x42,
33    // Big = 0x42,
34    // Little = 0x6c,
35}
36
37#[derive(Clone, Debug, Eq, PartialEq)]
38pub enum StatusContent {
39    Text(StatusTextContent),
40    Pixmap(u32),
41}
42
43#[derive(Clone, Debug, Eq, PartialEq)]
44pub enum CommitData {
45    Keysym {
46        keysym: u32,
47        syncronous: bool,
48    },
49    Chars {
50        commited: Vec<u8>,
51        syncronous: bool,
52    },
53    Both {
54        keysym: u32,
55        commited: Vec<u8>,
56        syncronous: bool,
57    },
58}
59#[derive(Clone, Debug, Eq, PartialEq)]
60pub struct InputStyleList {
61    pub styles: Vec<InputStyle>,
62}
63impl XimRead for InputStyleList {
64    fn read(reader: &mut Reader) -> Result<Self, ReadError> {
65        Ok(Self {
66            styles: {
67                let len = u16::read(reader)? as usize;
68                reader.consume(2)?;
69                let mut out = Vec::with_capacity(len);
70                for _ in 0..len {
71                    out.push(InputStyle::read(reader)?);
72                }
73                out
74            },
75        })
76    }
77}
78impl XimWrite for InputStyleList {
79    fn write(&self, writer: &mut Writer) {
80        (self.styles.len() as u16).write(writer);
81        0u16.write(writer);
82        for elem in self.styles.iter() {
83            elem.write(writer);
84        }
85    }
86    fn size(&self) -> usize {
87        self.styles.len() * 4 + 4
88    }
89}
90
91#[derive(Clone, Debug, Eq, PartialEq)]
92pub struct HotKeyTriggers {
93    pub triggers: Vec<(TriggerKey, HotKeyState)>,
94}
95
96#[derive(Debug)]
97pub enum ReadError {
98    EndOfStream,
99    InvalidData(&'static str, String),
100    Utf8Error(alloc::string::FromUtf8Error),
101    NotNativeEndian,
102}
103
104impl From<alloc::string::FromUtf8Error> for ReadError {
105    fn from(e: alloc::string::FromUtf8Error) -> Self {
106        Self::Utf8Error(e)
107    }
108}
109
110impl fmt::Display for ReadError {
111    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
112        match self {
113            Self::EndOfStream => write!(f, "End of Stream"),
114            Self::InvalidData(name, reason) => write!(f, "Invalid Data {}: {}", name, reason),
115            Self::Utf8Error(e) => write!(f, "Not a Utf8 text {}", e),
116            Self::NotNativeEndian => write!(f, "Not a native endian"),
117        }
118    }
119}
120
121#[cfg(feature = "std")]
122impl std::error::Error for ReadError {}
123
124fn pad4(len: usize) -> usize {
125    match len % 4 {
126        0 => 0,
127        x => 4 - x,
128    }
129}
130
131fn with_pad4(len: usize) -> usize {
132    len + pad4(len)
133}
134
135pub struct Reader<'b> {
136    bytes: &'b [u8],
137    start: usize,
138}
139
140impl<'b> Reader<'b> {
141    pub fn new(bytes: &'b [u8]) -> Self {
142        Self {
143            bytes,
144            start: bytes.as_ptr() as usize,
145        }
146    }
147
148    fn ptr_offset(&self) -> usize {
149        self.bytes.as_ptr() as usize - self.start
150    }
151
152    pub fn cursor(&self) -> usize {
153        self.bytes.len()
154    }
155
156    pub fn pad4(&mut self) -> Result<(), ReadError> {
157        self.consume(pad4(self.ptr_offset()))?;
158        Ok(())
159    }
160
161    #[inline(always)]
162    pub fn eos(&self) -> ReadError {
163        ReadError::EndOfStream
164    }
165
166    pub fn invalid_data(&self, ty: &'static str, item: impl ToString) -> ReadError {
167        ReadError::InvalidData(ty, item.to_string())
168    }
169
170    pub fn u8(&mut self) -> Result<u8, ReadError> {
171        let (b, new) = self.bytes.split_first().ok_or(ReadError::EndOfStream)?;
172        self.bytes = new;
173        Ok(*b)
174    }
175
176    pub fn i16(&mut self) -> Result<i16, ReadError> {
177        let bytes = self.consume(2)?.try_into().unwrap();
178        Ok(i16::from_ne_bytes(bytes))
179    }
180
181    pub fn u16(&mut self) -> Result<u16, ReadError> {
182        let bytes = self.consume(2)?.try_into().unwrap();
183        Ok(u16::from_ne_bytes(bytes))
184    }
185
186    pub fn u32(&mut self) -> Result<u32, ReadError> {
187        let bytes = self.consume(4)?.try_into().unwrap();
188        Ok(u32::from_ne_bytes(bytes))
189    }
190
191    pub fn i32(&mut self) -> Result<i32, ReadError> {
192        let bytes = self.consume(4)?.try_into().unwrap();
193        Ok(i32::from_ne_bytes(bytes))
194    }
195
196    pub fn consume(&mut self, len: usize) -> Result<&'b [u8], ReadError> {
197        if self.bytes.len() >= len {
198            let (out, new) = self.bytes.split_at(len);
199            self.bytes = new;
200            Ok(out)
201        } else {
202            Err(self.eos())
203        }
204    }
205}
206
207pub struct Writer<'b> {
208    out: &'b mut [u8],
209    idx: usize,
210}
211
212impl<'b> Writer<'b> {
213    pub fn new(out: &'b mut [u8]) -> Self {
214        Self { out, idx: 0 }
215    }
216
217    pub fn write_u8(&mut self, b: u8) {
218        self.out[self.idx] = b;
219        self.idx += 1;
220    }
221
222    pub fn write(&mut self, bytes: &[u8]) {
223        self.out[self.idx..self.idx + bytes.len()].copy_from_slice(bytes);
224        self.idx += bytes.len();
225    }
226
227    pub fn write_pad4(&mut self) {
228        let pad = pad4(self.idx);
229        let pad_bytes = [0; 4];
230        self.write(&pad_bytes[..pad]);
231    }
232}
233
234pub trait XimRead: Sized {
235    fn read(reader: &mut Reader) -> Result<Self, ReadError>;
236}
237
238pub trait XimWrite {
239    fn write(&self, writer: &mut Writer);
240    /// byte size of format
241    fn size(&self) -> usize;
242}
243
244impl<'a, T> XimWrite for &'a T
245where
246    T: XimWrite,
247{
248    #[inline(always)]
249    fn write(&self, writer: &mut Writer) {
250        (**self).write(writer);
251    }
252    #[inline(always)]
253    fn size(&self) -> usize {
254        (**self).size()
255    }
256}
257
258impl XimRead for Endian {
259    fn read(reader: &mut Reader) -> Result<Self, ReadError> {
260        let n = u8::read(reader)?;
261
262        if n == Endian::Native as u8 {
263            Ok(Self::Native)
264        } else {
265            Err(ReadError::NotNativeEndian)
266        }
267    }
268}
269
270impl XimWrite for Endian {
271    fn write(&self, writer: &mut Writer) {
272        (*self as u8).write(writer);
273    }
274
275    fn size(&self) -> usize {
276        1
277    }
278}
279
280impl XimRead for StatusContent {
281    fn read(reader: &mut Reader) -> Result<Self, ReadError> {
282        let ty = u32::read(reader)?;
283
284        match ty {
285            0 => Ok(Self::Text(StatusTextContent::read(reader)?)),
286            1 => Ok(Self::Pixmap(u32::read(reader)?)),
287            _ => Err(reader.invalid_data("StatusContentType", ty)),
288        }
289    }
290}
291
292impl XimWrite for StatusContent {
293    fn write(&self, writer: &mut Writer) {
294        match self {
295            StatusContent::Text(content) => {
296                0u32.write(writer);
297                content.write(writer);
298            }
299            StatusContent::Pixmap(pixmap) => {
300                1u32.write(writer);
301                pixmap.write(writer);
302            }
303        }
304    }
305
306    fn size(&self) -> usize {
307        let size = match self {
308            StatusContent::Text(content) => content.size(),
309            StatusContent::Pixmap(pixmap) => core::mem::size_of_val(pixmap),
310        };
311
312        size + 4
313    }
314}
315
316impl XimRead for CommitData {
317    fn read(reader: &mut Reader) -> Result<Self, ReadError> {
318        let ty = reader.u16()?;
319
320        match ty {
321            2 | 3 => {
322                let len = reader.u16()?;
323                let bytes = reader.consume(len as usize)?;
324                reader.pad4()?;
325                Ok(Self::Chars {
326                    commited: bytes.to_vec(),
327                    syncronous: ty == 5,
328                })
329            }
330            4 | 5 => {
331                reader.consume(2)?;
332                let keysym = reader.u32()?;
333                Ok(Self::Keysym {
334                    keysym,
335                    syncronous: ty == 3,
336                })
337            }
338            6 | 7 => {
339                reader.consume(2)?;
340                let keysym = reader.u32()?;
341                let len = reader.u16()?;
342                let bytes = reader.consume(len as usize)?;
343                reader.pad4()?;
344                Ok(Self::Both {
345                    keysym,
346                    commited: bytes.to_vec(),
347                    syncronous: ty == 7,
348                })
349            }
350            _ => Err(reader.invalid_data("CommitDataType", ty)),
351        }
352    }
353}
354
355impl XimWrite for CommitData {
356    fn write(&self, writer: &mut Writer) {
357        match self {
358            Self::Chars {
359                commited,
360                syncronous,
361            } => {
362                let flag = if *syncronous { 3u16 } else { 2u16 };
363                flag.write(writer);
364                (commited.len() as u16).write(writer);
365                writer.write(commited);
366                writer.write_pad4();
367            }
368            Self::Keysym { keysym, syncronous } => {
369                let flag = if *syncronous { 5u16 } else { 4u16 };
370                flag.write(writer);
371                0u16.write(writer);
372                keysym.write(writer);
373            }
374            Self::Both {
375                keysym,
376                commited,
377                syncronous,
378            } => {
379                let flag = if *syncronous { 7u16 } else { 6u16 };
380                flag.write(writer);
381                0u16.write(writer);
382                keysym.write(writer);
383                (commited.len() as u16).write(writer);
384                writer.write(commited);
385                writer.write_pad4();
386            }
387        }
388    }
389
390    fn size(&self) -> usize {
391        match self {
392            Self::Keysym { .. } => with_pad4(6),
393            Self::Chars { commited, .. } => with_pad4(commited.len() + 4),
394            Self::Both { commited, .. } => with_pad4(commited.len() + 4 + 6),
395        }
396    }
397}
398
399impl XimRead for HotKeyTriggers {
400    fn read(reader: &mut Reader) -> Result<Self, ReadError> {
401        let n = reader.u32()? as usize;
402        let mut out = Vec::with_capacity(n);
403
404        for _ in 0..n {
405            out.push((TriggerKey::read(reader)?, HotKeyState::Off));
406        }
407
408        for _ in 0..n {
409            out[n].1 = HotKeyState::read(reader)?;
410        }
411
412        Ok(Self { triggers: out })
413    }
414}
415
416impl XimWrite for HotKeyTriggers {
417    fn write(&self, writer: &mut Writer) {
418        (self.triggers.len() as u32).write(writer);
419
420        for (trigger, _) in self.triggers.iter() {
421            trigger.write(writer);
422        }
423
424        for (_, state) in self.triggers.iter() {
425            state.write(writer);
426        }
427    }
428
429    fn size(&self) -> usize {
430        self.triggers.len() * 8 + 4
431    }
432}
433
434impl XimRead for u8 {
435    fn read(reader: &mut Reader) -> Result<Self, ReadError> {
436        reader.u8()
437    }
438}
439
440impl XimWrite for u8 {
441    fn write(&self, writer: &mut Writer) {
442        writer.write_u8(*self)
443    }
444
445    fn size(&self) -> usize {
446        1
447    }
448}
449
450impl XimRead for bool {
451    fn read(reader: &mut Reader) -> Result<Self, ReadError> {
452        Ok(reader.u8()? != 0)
453    }
454}
455
456impl XimWrite for bool {
457    fn write(&self, writer: &mut Writer) {
458        writer.write_u8(*self as u8)
459    }
460
461    fn size(&self) -> usize {
462        1
463    }
464}
465
466macro_rules! impl_int {
467    ($ty:ident) => {
468        impl XimRead for $ty {
469            fn read(reader: &mut Reader) -> Result<Self, ReadError> {
470                reader.$ty()
471            }
472        }
473
474        impl XimWrite for $ty {
475            fn write(&self, writer: &mut Writer) {
476                writer.write(&self.to_ne_bytes())
477            }
478
479            fn size(&self) -> usize {
480                core::mem::size_of::<$ty>()
481            }
482        }
483    };
484}
485
486impl_int!(u16);
487impl_int!(i16);
488impl_int!(u32);
489impl_int!(i32);
490#[derive(Clone, Copy, Debug, Eq, PartialEq)]
491#[repr(u16)]
492pub enum AttrType {
493    Separator = 0,
494    Byte = 1,
495    Word = 2,
496    Long = 3,
497    Char = 4,
498    Window = 5,
499    Style = 10,
500    XRectangle = 11,
501    XPoint = 12,
502    XFontSet = 13,
503    HotkeyTriggers = 15,
504    StringConversion = 17,
505    PreeditState = 18,
506    ResetState = 19,
507    NestedList = 32767,
508}
509impl XimRead for AttrType {
510    fn read(reader: &mut Reader) -> Result<Self, ReadError> {
511        let repr = u16::read(reader)?;
512        match repr {
513            0 => Ok(Self::Separator),
514            1 => Ok(Self::Byte),
515            2 => Ok(Self::Word),
516            3 => Ok(Self::Long),
517            4 => Ok(Self::Char),
518            5 => Ok(Self::Window),
519            10 => Ok(Self::Style),
520            11 => Ok(Self::XRectangle),
521            12 => Ok(Self::XPoint),
522            13 => Ok(Self::XFontSet),
523            15 => Ok(Self::HotkeyTriggers),
524            17 => Ok(Self::StringConversion),
525            18 => Ok(Self::PreeditState),
526            19 => Ok(Self::ResetState),
527            32767 => Ok(Self::NestedList),
528            _ => Err(reader.invalid_data("AttrType", repr)),
529        }
530    }
531}
532impl XimWrite for AttrType {
533    fn write(&self, writer: &mut Writer) {
534        (*self as u16).write(writer);
535    }
536    fn size(&self) -> usize {
537        core::mem::size_of::<u16>()
538    }
539}
540#[derive(Clone, Copy, Debug, Eq, PartialEq)]
541#[repr(u32)]
542pub enum CaretDirection {
543    ForwardChar = 0,
544    BackwardChar = 1,
545    ForwardWord = 2,
546    BackwardWord = 3,
547    CaretUp = 4,
548    CaretDown = 5,
549    NextLine = 6,
550    PreviousLine = 7,
551    LineStart = 8,
552    LineEnd = 9,
553    AbsolutePosition = 10,
554    DontChange = 11,
555}
556impl XimRead for CaretDirection {
557    fn read(reader: &mut Reader) -> Result<Self, ReadError> {
558        let repr = u32::read(reader)?;
559        match repr {
560            0 => Ok(Self::ForwardChar),
561            1 => Ok(Self::BackwardChar),
562            2 => Ok(Self::ForwardWord),
563            3 => Ok(Self::BackwardWord),
564            4 => Ok(Self::CaretUp),
565            5 => Ok(Self::CaretDown),
566            6 => Ok(Self::NextLine),
567            7 => Ok(Self::PreviousLine),
568            8 => Ok(Self::LineStart),
569            9 => Ok(Self::LineEnd),
570            10 => Ok(Self::AbsolutePosition),
571            11 => Ok(Self::DontChange),
572            _ => Err(reader.invalid_data("CaretDirection", repr)),
573        }
574    }
575}
576impl XimWrite for CaretDirection {
577    fn write(&self, writer: &mut Writer) {
578        (*self as u32).write(writer);
579    }
580    fn size(&self) -> usize {
581        core::mem::size_of::<u32>()
582    }
583}
584#[derive(Clone, Copy, Debug, Eq, PartialEq)]
585#[repr(u32)]
586pub enum CaretStyle {
587    Invisible = 0,
588    Primary = 1,
589    Secondary = 2,
590}
591impl XimRead for CaretStyle {
592    fn read(reader: &mut Reader) -> Result<Self, ReadError> {
593        let repr = u32::read(reader)?;
594        match repr {
595            0 => Ok(Self::Invisible),
596            1 => Ok(Self::Primary),
597            2 => Ok(Self::Secondary),
598            _ => Err(reader.invalid_data("CaretStyle", repr)),
599        }
600    }
601}
602impl XimWrite for CaretStyle {
603    fn write(&self, writer: &mut Writer) {
604        (*self as u32).write(writer);
605    }
606    fn size(&self) -> usize {
607        core::mem::size_of::<u32>()
608    }
609}
610#[derive(Clone, Copy, Debug, Eq, PartialEq)]
611#[repr(u16)]
612pub enum ErrorCode {
613    BadAlloc = 1,
614    BadStyle = 2,
615    BadClientWindow = 3,
616    BadFocusWindow = 4,
617    BadArea = 5,
618    BadSpotLocation = 6,
619    BadColormap = 7,
620    BadAtom = 8,
621    BadPixel = 9,
622    BadPixmap = 10,
623    BadName = 11,
624    BadCursor = 12,
625    BadProtocol = 13,
626    BadForeground = 14,
627    BadBackground = 15,
628    LocaleNotSupported = 16,
629    BadSomething = 999,
630}
631impl XimRead for ErrorCode {
632    fn read(reader: &mut Reader) -> Result<Self, ReadError> {
633        let repr = u16::read(reader)?;
634        match repr {
635            1 => Ok(Self::BadAlloc),
636            2 => Ok(Self::BadStyle),
637            3 => Ok(Self::BadClientWindow),
638            4 => Ok(Self::BadFocusWindow),
639            5 => Ok(Self::BadArea),
640            6 => Ok(Self::BadSpotLocation),
641            7 => Ok(Self::BadColormap),
642            8 => Ok(Self::BadAtom),
643            9 => Ok(Self::BadPixel),
644            10 => Ok(Self::BadPixmap),
645            11 => Ok(Self::BadName),
646            12 => Ok(Self::BadCursor),
647            13 => Ok(Self::BadProtocol),
648            14 => Ok(Self::BadForeground),
649            15 => Ok(Self::BadBackground),
650            16 => Ok(Self::LocaleNotSupported),
651            999 => Ok(Self::BadSomething),
652            _ => Err(reader.invalid_data("ErrorCode", repr)),
653        }
654    }
655}
656impl XimWrite for ErrorCode {
657    fn write(&self, writer: &mut Writer) {
658        (*self as u16).write(writer);
659    }
660    fn size(&self) -> usize {
661        core::mem::size_of::<u16>()
662    }
663}
664bitflags::bitflags! {
665pub struct ErrorFlag: u16 {
666const INPUT_METHOD_ID_VALID = 1;
667const INPUT_CONTEXT_ID_VALID = 2;
668}
669}
670impl XimRead for ErrorFlag {
671    fn read(reader: &mut Reader) -> Result<Self, ReadError> {
672        let repr = u16::read(reader)?;
673        Self::from_bits(repr).ok_or_else(|| reader.invalid_data("ErrorFlag", repr))
674    }
675}
676impl XimWrite for ErrorFlag {
677    fn write(&self, writer: &mut Writer) {
678        self.bits().write(writer);
679    }
680    fn size(&self) -> usize {
681        core::mem::size_of::<u16>()
682    }
683}
684#[derive(Clone, Copy, Debug, Eq, PartialEq)]
685#[repr(u32)]
686pub enum Feedback {
687    Reverse = 1,
688    Underline = 2,
689    Highlight = 4,
690    Primary = 8,
691    Secondary = 16,
692    Tertiary = 32,
693    VisibleToForward = 64,
694    VisibleToBackward = 128,
695    VisibleCenter = 256,
696}
697impl XimRead for Feedback {
698    fn read(reader: &mut Reader) -> Result<Self, ReadError> {
699        let repr = u32::read(reader)?;
700        match repr {
701            1 => Ok(Self::Reverse),
702            2 => Ok(Self::Underline),
703            4 => Ok(Self::Highlight),
704            8 => Ok(Self::Primary),
705            16 => Ok(Self::Secondary),
706            32 => Ok(Self::Tertiary),
707            64 => Ok(Self::VisibleToForward),
708            128 => Ok(Self::VisibleToBackward),
709            256 => Ok(Self::VisibleCenter),
710            _ => Err(reader.invalid_data("Feedback", repr)),
711        }
712    }
713}
714impl XimWrite for Feedback {
715    fn write(&self, writer: &mut Writer) {
716        (*self as u32).write(writer);
717    }
718    fn size(&self) -> usize {
719        core::mem::size_of::<u32>()
720    }
721}
722bitflags::bitflags! {
723pub struct ForwardEventFlag: u16 {
724const SYNCHRONOUS = 1;
725const REQUEST_FILTERING = 2;
726const REQUEST_LOOP_UPSTRING = 4;
727}
728}
729impl XimRead for ForwardEventFlag {
730    fn read(reader: &mut Reader) -> Result<Self, ReadError> {
731        let repr = u16::read(reader)?;
732        Self::from_bits(repr).ok_or_else(|| reader.invalid_data("ForwardEventFlag", repr))
733    }
734}
735impl XimWrite for ForwardEventFlag {
736    fn write(&self, writer: &mut Writer) {
737        self.bits().write(writer);
738    }
739    fn size(&self) -> usize {
740        core::mem::size_of::<u16>()
741    }
742}
743#[derive(Clone, Copy, Debug, Eq, PartialEq)]
744#[repr(u32)]
745pub enum HotKeyState {
746    On = 1,
747    Off = 2,
748}
749impl XimRead for HotKeyState {
750    fn read(reader: &mut Reader) -> Result<Self, ReadError> {
751        let repr = u32::read(reader)?;
752        match repr {
753            1 => Ok(Self::On),
754            2 => Ok(Self::Off),
755            _ => Err(reader.invalid_data("HotKeyState", repr)),
756        }
757    }
758}
759impl XimWrite for HotKeyState {
760    fn write(&self, writer: &mut Writer) {
761        (*self as u32).write(writer);
762    }
763    fn size(&self) -> usize {
764        core::mem::size_of::<u32>()
765    }
766}
767bitflags::bitflags! {
768pub struct InputStyle: u32 {
769const PREEDIT_AREA = 1;
770const PREEDIT_CALLBACKS = 2;
771const PREEDIT_POSITION = 4;
772const PREEDIT_NOTHING = 8;
773const PREEDIT_NONE = 16;
774const STATUS_AREA = 256;
775const STATUS_CALLBACKS = 512;
776const STATUS_NOTHING = 1024;
777const STATUS_NONE = 2048;
778}
779}
780impl XimRead for InputStyle {
781    fn read(reader: &mut Reader) -> Result<Self, ReadError> {
782        let repr = u32::read(reader)?;
783        Self::from_bits(repr).ok_or_else(|| reader.invalid_data("InputStyle", repr))
784    }
785}
786impl XimWrite for InputStyle {
787    fn write(&self, writer: &mut Writer) {
788        self.bits().write(writer);
789    }
790    fn size(&self) -> usize {
791        core::mem::size_of::<u32>()
792    }
793}
794bitflags::bitflags! {
795pub struct PreeditDrawStatus: u32 {
796const NO_STRING = 1;
797const NO_FEEDBACK = 2;
798}
799}
800impl XimRead for PreeditDrawStatus {
801    fn read(reader: &mut Reader) -> Result<Self, ReadError> {
802        let repr = u32::read(reader)?;
803        Self::from_bits(repr).ok_or_else(|| reader.invalid_data("PreeditDrawStatus", repr))
804    }
805}
806impl XimWrite for PreeditDrawStatus {
807    fn write(&self, writer: &mut Writer) {
808        self.bits().write(writer);
809    }
810    fn size(&self) -> usize {
811        core::mem::size_of::<u32>()
812    }
813}
814bitflags::bitflags! {
815pub struct PreeditStateFlag: u32 {
816const UNKNOWN = 0;
817const ENABLE = 1;
818const DISABLE = 2;
819}
820}
821impl XimRead for PreeditStateFlag {
822    fn read(reader: &mut Reader) -> Result<Self, ReadError> {
823        let repr = u32::read(reader)?;
824        Self::from_bits(repr).ok_or_else(|| reader.invalid_data("PreeditStateFlag", repr))
825    }
826}
827impl XimWrite for PreeditStateFlag {
828    fn write(&self, writer: &mut Writer) {
829        self.bits().write(writer);
830    }
831    fn size(&self) -> usize {
832        core::mem::size_of::<u32>()
833    }
834}
835#[derive(Clone, Copy, Debug, Eq, PartialEq)]
836#[repr(u32)]
837pub enum TriggerNotifyFlag {
838    OnKeyList = 0,
839    OffKeyList = 1,
840}
841impl XimRead for TriggerNotifyFlag {
842    fn read(reader: &mut Reader) -> Result<Self, ReadError> {
843        let repr = u32::read(reader)?;
844        match repr {
845            0 => Ok(Self::OnKeyList),
846            1 => Ok(Self::OffKeyList),
847            _ => Err(reader.invalid_data("TriggerNotifyFlag", repr)),
848        }
849    }
850}
851impl XimWrite for TriggerNotifyFlag {
852    fn write(&self, writer: &mut Writer) {
853        (*self as u32).write(writer);
854    }
855    fn size(&self) -> usize {
856        core::mem::size_of::<u32>()
857    }
858}
859#[derive(Clone, Debug, Eq, PartialEq)]
860pub struct Attr {
861    pub id: u16,
862    pub ty: AttrType,
863    pub name: AttributeName,
864}
865impl XimRead for Attr {
866    fn read(reader: &mut Reader) -> Result<Self, ReadError> {
867        Ok(Self {
868            id: u16::read(reader)?,
869            ty: AttrType::read(reader)?,
870            name: {
871                let inner = AttributeName::read(reader)?;
872                reader.pad4()?;
873                inner
874            },
875        })
876    }
877}
878impl XimWrite for Attr {
879    fn write(&self, writer: &mut Writer) {
880        self.id.write(writer);
881        self.ty.write(writer);
882        self.name.write(writer);
883        writer.write_pad4();
884    }
885    fn size(&self) -> usize {
886        let mut content_size = 0;
887        content_size += self.id.size();
888        content_size += self.ty.size();
889        content_size += with_pad4(self.name.size() - 0);
890        content_size
891    }
892}
893#[derive(Clone, Debug, Eq, PartialEq)]
894pub struct Attribute {
895    pub id: u16,
896    pub value: Vec<u8>,
897}
898impl XimRead for Attribute {
899    fn read(reader: &mut Reader) -> Result<Self, ReadError> {
900        Ok(Self {
901            id: u16::read(reader)?,
902            value: {
903                let inner = {
904                    let len = u16::read(reader)?;
905                    reader.consume(len as usize)?.to_vec()
906                };
907                reader.pad4()?;
908                inner
909            },
910        })
911    }
912}
913impl XimWrite for Attribute {
914    fn write(&self, writer: &mut Writer) {
915        self.id.write(writer);
916        (self.value.len() as u16).write(writer);
917        writer.write(&self.value);
918        writer.write_pad4();
919    }
920    fn size(&self) -> usize {
921        let mut content_size = 0;
922        content_size += self.id.size();
923        content_size += with_pad4(self.value.len() + 2 - 2) + 2;
924        content_size
925    }
926}
927#[derive(Clone, Debug, Eq, PartialEq)]
928pub struct Extension {
929    pub major_opcode: u8,
930    pub minor_opcode: u8,
931    pub name: String,
932}
933impl XimRead for Extension {
934    fn read(reader: &mut Reader) -> Result<Self, ReadError> {
935        Ok(Self {
936            major_opcode: u8::read(reader)?,
937            minor_opcode: u8::read(reader)?,
938            name: {
939                let inner = {
940                    let len = u16::read(reader)?;
941                    String::from_utf8(reader.consume(len as usize)?.to_vec())?
942                };
943                reader.pad4()?;
944                inner
945            },
946        })
947    }
948}
949impl XimWrite for Extension {
950    fn write(&self, writer: &mut Writer) {
951        self.major_opcode.write(writer);
952        self.minor_opcode.write(writer);
953        (self.name.len() as u16).write(writer);
954        writer.write(self.name.as_bytes());
955        writer.write_pad4();
956    }
957    fn size(&self) -> usize {
958        let mut content_size = 0;
959        content_size += self.major_opcode.size();
960        content_size += self.minor_opcode.size();
961        content_size += with_pad4(self.name.len() + 2 + 0 - 0);
962        content_size
963    }
964}
965#[derive(Clone, Debug, Eq, PartialEq)]
966pub struct FontSet {
967    pub name: String,
968}
969impl XimRead for FontSet {
970    fn read(reader: &mut Reader) -> Result<Self, ReadError> {
971        Ok(Self {
972            name: {
973                let inner = {
974                    let len = u16::read(reader)?;
975                    String::from_utf8(reader.consume(len as usize)?.to_vec())?
976                };
977                reader.pad4()?;
978                inner
979            },
980        })
981    }
982}
983impl XimWrite for FontSet {
984    fn write(&self, writer: &mut Writer) {
985        (self.name.len() as u16).write(writer);
986        writer.write(self.name.as_bytes());
987        writer.write_pad4();
988    }
989    fn size(&self) -> usize {
990        let mut content_size = 0;
991        content_size += with_pad4(self.name.len() + 2 + 0 - 0);
992        content_size
993    }
994}
995#[derive(Clone, Debug, Eq, PartialEq)]
996pub struct Point {
997    pub x: i16,
998    pub y: i16,
999}
1000impl XimRead for Point {
1001    fn read(reader: &mut Reader) -> Result<Self, ReadError> {
1002        Ok(Self {
1003            x: i16::read(reader)?,
1004            y: i16::read(reader)?,
1005        })
1006    }
1007}
1008impl XimWrite for Point {
1009    fn write(&self, writer: &mut Writer) {
1010        self.x.write(writer);
1011        self.y.write(writer);
1012    }
1013    fn size(&self) -> usize {
1014        let mut content_size = 0;
1015        content_size += self.x.size();
1016        content_size += self.y.size();
1017        content_size
1018    }
1019}
1020#[derive(Clone, Debug, Eq, PartialEq)]
1021pub struct Rectangle {
1022    pub x: i16,
1023    pub y: i16,
1024    pub width: u16,
1025    pub height: u16,
1026}
1027impl XimRead for Rectangle {
1028    fn read(reader: &mut Reader) -> Result<Self, ReadError> {
1029        Ok(Self {
1030            x: i16::read(reader)?,
1031            y: i16::read(reader)?,
1032            width: u16::read(reader)?,
1033            height: u16::read(reader)?,
1034        })
1035    }
1036}
1037impl XimWrite for Rectangle {
1038    fn write(&self, writer: &mut Writer) {
1039        self.x.write(writer);
1040        self.y.write(writer);
1041        self.width.write(writer);
1042        self.height.write(writer);
1043    }
1044    fn size(&self) -> usize {
1045        let mut content_size = 0;
1046        content_size += self.x.size();
1047        content_size += self.y.size();
1048        content_size += self.width.size();
1049        content_size += self.height.size();
1050        content_size
1051    }
1052}
1053#[derive(Clone, Debug, Eq, PartialEq)]
1054pub struct StatusTextContent {
1055    pub status: PreeditDrawStatus,
1056    pub status_string: String,
1057    pub feedbacks: Vec<Feedback>,
1058}
1059impl XimRead for StatusTextContent {
1060    fn read(reader: &mut Reader) -> Result<Self, ReadError> {
1061        Ok(Self {
1062            status: PreeditDrawStatus::read(reader)?,
1063            status_string: {
1064                let inner = {
1065                    let len = u16::read(reader)?;
1066                    String::from_utf8(reader.consume(len as usize)?.to_vec())?
1067                };
1068                reader.pad4()?;
1069                inner
1070            },
1071            feedbacks: {
1072                let mut out = Vec::new();
1073                let len = u16::read(reader)? as usize;
1074                let end = reader.cursor() - len;
1075                u16::read(reader)?;
1076                while reader.cursor() > end {
1077                    out.push(Feedback::read(reader)?);
1078                }
1079                out
1080            },
1081        })
1082    }
1083}
1084impl XimWrite for StatusTextContent {
1085    fn write(&self, writer: &mut Writer) {
1086        self.status.write(writer);
1087        (self.status_string.len() as u16).write(writer);
1088        writer.write(self.status_string.as_bytes());
1089        writer.write_pad4();
1090        ((self.feedbacks.iter().map(|e| e.size()).sum::<usize>() + 2 + 2 - 2 - 2) as u16)
1091            .write(writer);
1092        0u16.write(writer);
1093        for elem in self.feedbacks.iter() {
1094            elem.write(writer);
1095        }
1096    }
1097    fn size(&self) -> usize {
1098        let mut content_size = 0;
1099        content_size += self.status.size();
1100        content_size += with_pad4(self.status_string.len() + 2 + 0 - 0);
1101        content_size += self.feedbacks.iter().map(|e| e.size()).sum::<usize>() + 2 + 2;
1102        content_size
1103    }
1104}
1105#[derive(Clone, Debug, Eq, PartialEq)]
1106pub struct TriggerKey {
1107    pub keysym: u32,
1108    pub modifier: u32,
1109    pub modifier_mask: u32,
1110}
1111impl XimRead for TriggerKey {
1112    fn read(reader: &mut Reader) -> Result<Self, ReadError> {
1113        Ok(Self {
1114            keysym: u32::read(reader)?,
1115            modifier: u32::read(reader)?,
1116            modifier_mask: u32::read(reader)?,
1117        })
1118    }
1119}
1120impl XimWrite for TriggerKey {
1121    fn write(&self, writer: &mut Writer) {
1122        self.keysym.write(writer);
1123        self.modifier.write(writer);
1124        self.modifier_mask.write(writer);
1125    }
1126    fn size(&self) -> usize {
1127        let mut content_size = 0;
1128        content_size += self.keysym.size();
1129        content_size += self.modifier.size();
1130        content_size += self.modifier_mask.size();
1131        content_size
1132    }
1133}
1134#[derive(Clone, Debug, Eq, PartialEq)]
1135pub struct XEvent {
1136    pub response_type: u8,
1137    pub detail: u8,
1138    pub sequence: u16,
1139    pub time: u32,
1140    pub root: u32,
1141    pub event: u32,
1142    pub child: u32,
1143    pub root_x: i16,
1144    pub root_y: i16,
1145    pub event_x: i16,
1146    pub event_y: i16,
1147    pub state: u16,
1148    pub same_screen: bool,
1149}
1150impl XimRead for XEvent {
1151    fn read(reader: &mut Reader) -> Result<Self, ReadError> {
1152        Ok(Self {
1153            response_type: u8::read(reader)?,
1154            detail: u8::read(reader)?,
1155            sequence: u16::read(reader)?,
1156            time: u32::read(reader)?,
1157            root: u32::read(reader)?,
1158            event: u32::read(reader)?,
1159            child: u32::read(reader)?,
1160            root_x: i16::read(reader)?,
1161            root_y: i16::read(reader)?,
1162            event_x: i16::read(reader)?,
1163            event_y: i16::read(reader)?,
1164            state: u16::read(reader)?,
1165            same_screen: {
1166                let inner = bool::read(reader)?;
1167                reader.consume(1)?;
1168                inner
1169            },
1170        })
1171    }
1172}
1173impl XimWrite for XEvent {
1174    fn write(&self, writer: &mut Writer) {
1175        self.response_type.write(writer);
1176        self.detail.write(writer);
1177        self.sequence.write(writer);
1178        self.time.write(writer);
1179        self.root.write(writer);
1180        self.event.write(writer);
1181        self.child.write(writer);
1182        self.root_x.write(writer);
1183        self.root_y.write(writer);
1184        self.event_x.write(writer);
1185        self.event_y.write(writer);
1186        self.state.write(writer);
1187        self.same_screen.write(writer);
1188        writer.write(&[0u8; 1]);
1189    }
1190    fn size(&self) -> usize {
1191        let mut content_size = 0;
1192        content_size += self.response_type.size();
1193        content_size += self.detail.size();
1194        content_size += self.sequence.size();
1195        content_size += self.time.size();
1196        content_size += self.root.size();
1197        content_size += self.event.size();
1198        content_size += self.child.size();
1199        content_size += self.root_x.size();
1200        content_size += self.root_y.size();
1201        content_size += self.event_x.size();
1202        content_size += self.event_y.size();
1203        content_size += self.state.size();
1204        content_size += self.same_screen.size() + 1;
1205        content_size
1206    }
1207}
1208#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash, Ord, PartialOrd)]
1209pub enum AttributeName {
1210    Area,
1211    AreaNeeded,
1212    Background,
1213    BackgroundPixmap,
1214    ClientWindow,
1215    ColorMap,
1216    Cursor,
1217    DestroyCallback,
1218    FilterEvents,
1219    FocusWindow,
1220    FontSet,
1221    Foreground,
1222    GeometryCallback,
1223    HotKey,
1224    HotKeyState,
1225    InputStyle,
1226    LineSpace,
1227    NestedList,
1228    PreeditAttributes,
1229    PreeditCaretCallback,
1230    PreeditDoneCallback,
1231    PreeditDrawCallback,
1232    PreeditStartCallback,
1233    PreeditState,
1234    PreeditStateNotifyCallback,
1235    QueryICValuesList,
1236    QueryIMValuesList,
1237    QueryInputStyle,
1238    R6PreeditCallback,
1239    ResetState,
1240    ResourceClass,
1241    ResourceName,
1242    SeparatorofNestedList,
1243    SpotLocation,
1244    StatusAttributes,
1245    StatusDoneCallback,
1246    StatusDrawCallback,
1247    StatusStartCallback,
1248    StdColorMap,
1249    StringConversion,
1250    StringConversionCallback,
1251    VisiblePosition,
1252}
1253impl AttributeName {
1254    pub fn name(self) -> &'static str {
1255        match self {
1256            Self::Area => "area",
1257            Self::AreaNeeded => "areaNeeded",
1258            Self::Background => "background",
1259            Self::BackgroundPixmap => "backgroundPixmap",
1260            Self::ClientWindow => "clientWindow",
1261            Self::ColorMap => "colorMap",
1262            Self::Cursor => "cursor",
1263            Self::DestroyCallback => "destroyCallback",
1264            Self::FilterEvents => "filterEvents",
1265            Self::FocusWindow => "focusWindow",
1266            Self::FontSet => "fontSet",
1267            Self::Foreground => "foreground",
1268            Self::GeometryCallback => "geometryCallback",
1269            Self::HotKey => "hotKey",
1270            Self::HotKeyState => "hotKeyState",
1271            Self::InputStyle => "inputStyle",
1272            Self::LineSpace => "lineSpace",
1273            Self::NestedList => "XNVaNestedList",
1274            Self::PreeditAttributes => "preeditAttributes",
1275            Self::PreeditCaretCallback => "preeditCaretCallback",
1276            Self::PreeditDoneCallback => "preeditDoneCallback",
1277            Self::PreeditDrawCallback => "preeditDrawCallback",
1278            Self::PreeditStartCallback => "preeditStartCallback",
1279            Self::PreeditState => "preeditState",
1280            Self::PreeditStateNotifyCallback => "preeditStateNotifyCallback",
1281            Self::QueryICValuesList => "queryICValuesList",
1282            Self::QueryIMValuesList => "queryIMValuesList",
1283            Self::QueryInputStyle => "queryInputStyle",
1284            Self::R6PreeditCallback => "r6PreeditCallback",
1285            Self::ResetState => "resetState",
1286            Self::ResourceClass => "resourceClass",
1287            Self::ResourceName => "resourceName",
1288            Self::SeparatorofNestedList => "separatorofNestedList",
1289            Self::SpotLocation => "spotLocation",
1290            Self::StatusAttributes => "statusAttributes",
1291            Self::StatusDoneCallback => "statusDoneCallback",
1292            Self::StatusDrawCallback => "statusDrawCallback",
1293            Self::StatusStartCallback => "statusStartCallback",
1294            Self::StdColorMap => "stdColorMap",
1295            Self::StringConversion => "stringConversion",
1296            Self::StringConversionCallback => "stringConversionCallback",
1297            Self::VisiblePosition => "visiblePosition",
1298        }
1299    }
1300}
1301impl XimRead for AttributeName {
1302    fn read(reader: &mut Reader) -> Result<Self, ReadError> {
1303        let len = u16::read(reader)?;
1304        match reader.consume(len as usize)? {
1305            b"area" => Ok(Self::Area),
1306            b"areaNeeded" => Ok(Self::AreaNeeded),
1307            b"background" => Ok(Self::Background),
1308            b"backgroundPixmap" => Ok(Self::BackgroundPixmap),
1309            b"clientWindow" => Ok(Self::ClientWindow),
1310            b"colorMap" => Ok(Self::ColorMap),
1311            b"cursor" => Ok(Self::Cursor),
1312            b"destroyCallback" => Ok(Self::DestroyCallback),
1313            b"filterEvents" => Ok(Self::FilterEvents),
1314            b"focusWindow" => Ok(Self::FocusWindow),
1315            b"fontSet" => Ok(Self::FontSet),
1316            b"foreground" => Ok(Self::Foreground),
1317            b"geometryCallback" => Ok(Self::GeometryCallback),
1318            b"hotKey" => Ok(Self::HotKey),
1319            b"hotKeyState" => Ok(Self::HotKeyState),
1320            b"inputStyle" => Ok(Self::InputStyle),
1321            b"lineSpace" => Ok(Self::LineSpace),
1322            b"XNVaNestedList" => Ok(Self::NestedList),
1323            b"preeditAttributes" => Ok(Self::PreeditAttributes),
1324            b"preeditCaretCallback" => Ok(Self::PreeditCaretCallback),
1325            b"preeditDoneCallback" => Ok(Self::PreeditDoneCallback),
1326            b"preeditDrawCallback" => Ok(Self::PreeditDrawCallback),
1327            b"preeditStartCallback" => Ok(Self::PreeditStartCallback),
1328            b"preeditState" => Ok(Self::PreeditState),
1329            b"preeditStateNotifyCallback" => Ok(Self::PreeditStateNotifyCallback),
1330            b"queryICValuesList" => Ok(Self::QueryICValuesList),
1331            b"queryIMValuesList" => Ok(Self::QueryIMValuesList),
1332            b"queryInputStyle" => Ok(Self::QueryInputStyle),
1333            b"r6PreeditCallback" => Ok(Self::R6PreeditCallback),
1334            b"resetState" => Ok(Self::ResetState),
1335            b"resourceClass" => Ok(Self::ResourceClass),
1336            b"resourceName" => Ok(Self::ResourceName),
1337            b"separatorofNestedList" => Ok(Self::SeparatorofNestedList),
1338            b"spotLocation" => Ok(Self::SpotLocation),
1339            b"statusAttributes" => Ok(Self::StatusAttributes),
1340            b"statusDoneCallback" => Ok(Self::StatusDoneCallback),
1341            b"statusDrawCallback" => Ok(Self::StatusDrawCallback),
1342            b"statusStartCallback" => Ok(Self::StatusStartCallback),
1343            b"stdColorMap" => Ok(Self::StdColorMap),
1344            b"stringConversion" => Ok(Self::StringConversion),
1345            b"stringConversionCallback" => Ok(Self::StringConversionCallback),
1346            b"visiblePosition" => Ok(Self::VisiblePosition),
1347            bytes => Err(reader.invalid_data(
1348                "AttributeName",
1349                core::str::from_utf8(bytes).unwrap_or("NOT_UTF8"),
1350            )),
1351        }
1352    }
1353}
1354impl XimWrite for AttributeName {
1355    fn write(&self, writer: &mut Writer) {
1356        let name = self.name();
1357        (name.len() as u16).write(writer);
1358        writer.write(name.as_bytes());
1359    }
1360    fn size(&self) -> usize {
1361        self.name().len() + 2
1362    }
1363}
1364#[derive(Debug, Clone, Eq, PartialEq)]
1365pub enum Request {
1366    AuthNext {},
1367    AuthNg {},
1368    AuthReply {},
1369    AuthRequired {},
1370    AuthSetup {},
1371    Close {
1372        input_method_id: u16,
1373    },
1374    CloseReply {
1375        input_method_id: u16,
1376    },
1377    Commit {
1378        input_method_id: u16,
1379        input_context_id: u16,
1380        data: CommitData,
1381    },
1382    Connect {
1383        endian: Endian,
1384        client_major_protocol_version: u16,
1385        client_minor_protocol_version: u16,
1386        client_auth_protocol_names: Vec<String>,
1387    },
1388    ConnectReply {
1389        server_major_protocol_version: u16,
1390        server_minor_protocol_version: u16,
1391    },
1392    CreateIc {
1393        input_method_id: u16,
1394        ic_attributes: Vec<Attribute>,
1395    },
1396    CreateIcReply {
1397        input_method_id: u16,
1398        input_context_id: u16,
1399    },
1400    DestroyIc {
1401        input_method_id: u16,
1402        input_context_id: u16,
1403    },
1404    DestroyIcReply {
1405        input_method_id: u16,
1406        input_context_id: u16,
1407    },
1408    Disconnect {},
1409    DisconnectReply {},
1410    EncodingNegotiation {
1411        input_method_id: u16,
1412        encodings: Vec<String>,
1413        encoding_infos: Vec<String>,
1414    },
1415    EncodingNegotiationReply {
1416        input_method_id: u16,
1417        category: u16,
1418        index: i16,
1419    },
1420    Error {
1421        input_method_id: u16,
1422        input_context_id: u16,
1423        flag: ErrorFlag,
1424        code: ErrorCode,
1425        detail: String,
1426    },
1427    ForwardEvent {
1428        input_method_id: u16,
1429        input_context_id: u16,
1430        flag: ForwardEventFlag,
1431        serial_number: u16,
1432        xev: XEvent,
1433    },
1434    Geometry {
1435        input_method_id: u16,
1436        input_context_id: u16,
1437    },
1438    GetIcValues {
1439        input_method_id: u16,
1440        input_context_id: u16,
1441        ic_attributes: Vec<u16>,
1442    },
1443    GetIcValuesReply {
1444        input_method_id: u16,
1445        input_context_id: u16,
1446        ic_attributes: Vec<Attribute>,
1447    },
1448    GetImValues {
1449        input_method_id: u16,
1450        im_attributes: Vec<u16>,
1451    },
1452    GetImValuesReply {
1453        input_method_id: u16,
1454        im_attributes: Vec<Attribute>,
1455    },
1456    Open {
1457        locale: String,
1458    },
1459    OpenReply {
1460        input_method_id: u16,
1461        im_attrs: Vec<Attr>,
1462        ic_attrs: Vec<Attr>,
1463    },
1464    PreeditCaret {
1465        input_method_id: u16,
1466        input_context_id: u16,
1467        position: i32,
1468        direction: CaretDirection,
1469        style: CaretStyle,
1470    },
1471    PreeditCaretReply {
1472        input_method_id: u16,
1473        input_context_id: u16,
1474        position: i32,
1475    },
1476    PreeditDone {
1477        input_method_id: u16,
1478        input_context_id: u16,
1479    },
1480    PreeditDraw {
1481        input_method_id: u16,
1482        input_context_id: u16,
1483        caret: i32,
1484        chg_first: i32,
1485        chg_length: i32,
1486        status: PreeditDrawStatus,
1487        preedit_string: Vec<u8>,
1488        feedbacks: Vec<Feedback>,
1489    },
1490    PreeditStart {
1491        input_method_id: u16,
1492        input_context_id: u16,
1493    },
1494    PreeditStartReply {
1495        input_method_id: u16,
1496        input_context_id: u16,
1497        return_value: i32,
1498    },
1499    PreeditState {
1500        input_method_id: u16,
1501        input_context_id: u16,
1502        state: PreeditStateFlag,
1503    },
1504    QueryExtension {
1505        input_method_id: u16,
1506        extensions: Vec<String>,
1507    },
1508    QueryExtensionReply {
1509        input_method_id: u16,
1510        extensions: Vec<Extension>,
1511    },
1512    RegisterTriggerKeys {
1513        input_method_id: u16,
1514        on_keys: Vec<TriggerKey>,
1515        off_keys: Vec<TriggerKey>,
1516    },
1517    ResetIc {
1518        input_method_id: u16,
1519        input_context_id: u16,
1520    },
1521    ResetIcReply {
1522        input_method_id: u16,
1523        input_context_id: u16,
1524        preedit_string: Vec<u8>,
1525    },
1526    SetEventMask {
1527        input_method_id: u16,
1528        input_context_id: u16,
1529        forward_event_mask: u32,
1530        synchronous_event_mask: u32,
1531    },
1532    SetIcFocus {
1533        input_method_id: u16,
1534        input_context_id: u16,
1535    },
1536    SetIcValues {
1537        input_method_id: u16,
1538        input_context_id: u16,
1539        ic_attributes: Vec<Attribute>,
1540    },
1541    SetIcValuesReply {
1542        input_method_id: u16,
1543        input_context_id: u16,
1544    },
1545    SetImValues {
1546        input_method_id: u16,
1547        attributes: Vec<Attribute>,
1548    },
1549    SetImValuesReply {
1550        input_method_id: u16,
1551    },
1552    StatusDone {
1553        input_method_id: u16,
1554        input_context_id: u16,
1555    },
1556    StatusDraw {
1557        input_method_id: u16,
1558        input_context_id: u16,
1559        content: StatusContent,
1560    },
1561    StatusStart {
1562        input_method_id: u16,
1563        input_context_id: u16,
1564    },
1565    StrConversion {},
1566    StrConversionReply {},
1567    Sync {
1568        input_method_id: u16,
1569        input_context_id: u16,
1570    },
1571    SyncReply {
1572        input_method_id: u16,
1573        input_context_id: u16,
1574    },
1575    TriggerNotify {
1576        input_method_id: u16,
1577        input_context_id: u16,
1578        flag: TriggerNotifyFlag,
1579        index: u32,
1580        event_mask: u32,
1581    },
1582    TriggerNotifyReply {
1583        input_method_id: u16,
1584        input_context_id: u16,
1585    },
1586    UnsetIcFocus {
1587        input_method_id: u16,
1588        input_context_id: u16,
1589    },
1590}
1591impl Request {
1592    pub fn name(&self) -> &'static str {
1593        match self {
1594            Request::AuthNext { .. } => "AuthNext",
1595            Request::AuthNg { .. } => "AuthNg",
1596            Request::AuthReply { .. } => "AuthReply",
1597            Request::AuthRequired { .. } => "AuthRequired",
1598            Request::AuthSetup { .. } => "AuthSetup",
1599            Request::Close { .. } => "Close",
1600            Request::CloseReply { .. } => "CloseReply",
1601            Request::Commit { .. } => "Commit",
1602            Request::Connect { .. } => "Connect",
1603            Request::ConnectReply { .. } => "ConnectReply",
1604            Request::CreateIc { .. } => "CreateIc",
1605            Request::CreateIcReply { .. } => "CreateIcReply",
1606            Request::DestroyIc { .. } => "destroyIc",
1607            Request::DestroyIcReply { .. } => "DestroyIcReply",
1608            Request::Disconnect { .. } => "Disconnect",
1609            Request::DisconnectReply { .. } => "DisconnectReply",
1610            Request::EncodingNegotiation { .. } => "EncodingNegotiation",
1611            Request::EncodingNegotiationReply { .. } => "EncodingNegotiationReply",
1612            Request::Error { .. } => "Error",
1613            Request::ForwardEvent { .. } => "ForwardEvent",
1614            Request::Geometry { .. } => "Geometry",
1615            Request::GetIcValues { .. } => "GetIcValues",
1616            Request::GetIcValuesReply { .. } => "GetIcValuesReply",
1617            Request::GetImValues { .. } => "GetImValues",
1618            Request::GetImValuesReply { .. } => "GetImValuesReply",
1619            Request::Open { .. } => "Open",
1620            Request::OpenReply { .. } => "OpenReply",
1621            Request::PreeditCaret { .. } => "PreeditCaret",
1622            Request::PreeditCaretReply { .. } => "PreeditCaretReply",
1623            Request::PreeditDone { .. } => "PreeditDone",
1624            Request::PreeditDraw { .. } => "PreeditDraw",
1625            Request::PreeditStart { .. } => "PreeditStart",
1626            Request::PreeditStartReply { .. } => "PreeditStartReply",
1627            Request::PreeditState { .. } => "PreeditState",
1628            Request::QueryExtension { .. } => "QueryExtension",
1629            Request::QueryExtensionReply { .. } => "QueryExtensionReply",
1630            Request::RegisterTriggerKeys { .. } => "RegisterTriggerKeys",
1631            Request::ResetIc { .. } => "ResetIc",
1632            Request::ResetIcReply { .. } => "ResetIcReply",
1633            Request::SetEventMask { .. } => "SetEventMask",
1634            Request::SetIcFocus { .. } => "SetIcFocus",
1635            Request::SetIcValues { .. } => "SetIcValues",
1636            Request::SetIcValuesReply { .. } => "SetIcValuesReply",
1637            Request::SetImValues { .. } => "SetImValues",
1638            Request::SetImValuesReply { .. } => "SetImValuesReply",
1639            Request::StatusDone { .. } => "StatusDone",
1640            Request::StatusDraw { .. } => "StatusDraw",
1641            Request::StatusStart { .. } => "StatusStart",
1642            Request::StrConversion { .. } => "StrConversion",
1643            Request::StrConversionReply { .. } => "StrConversionReply",
1644            Request::Sync { .. } => "Sync",
1645            Request::SyncReply { .. } => "SyncReply",
1646            Request::TriggerNotify { .. } => "TriggerNotify",
1647            Request::TriggerNotifyReply { .. } => "TriggerNotifyReply",
1648            Request::UnsetIcFocus { .. } => "UnsetIcFocus",
1649        }
1650    }
1651}
1652impl XimRead for Request {
1653    fn read(reader: &mut Reader) -> Result<Self, ReadError> {
1654        let major_opcode = reader.u8()?;
1655        let minor_opcode = reader.u8()?;
1656        let _length = reader.u16()?;
1657        match (major_opcode, minor_opcode) {
1658            (12, _) => Ok(Request::AuthNext {}),
1659            (14, _) => Ok(Request::AuthNg {}),
1660            (11, _) => Ok(Request::AuthReply {}),
1661            (10, _) => Ok(Request::AuthRequired {}),
1662            (13, _) => Ok(Request::AuthSetup {}),
1663            (32, _) => Ok(Request::Close {
1664                input_method_id: {
1665                    let inner = u16::read(reader)?;
1666                    reader.consume(2)?;
1667                    inner
1668                },
1669            }),
1670            (33, _) => Ok(Request::CloseReply {
1671                input_method_id: {
1672                    let inner = u16::read(reader)?;
1673                    reader.consume(2)?;
1674                    inner
1675                },
1676            }),
1677            (63, _) => Ok(Request::Commit {
1678                input_method_id: u16::read(reader)?,
1679                input_context_id: u16::read(reader)?,
1680                data: CommitData::read(reader)?,
1681            }),
1682            (1, _) => Ok(Request::Connect {
1683                endian: {
1684                    let inner = Endian::read(reader)?;
1685                    reader.consume(1)?;
1686                    inner
1687                },
1688                client_major_protocol_version: u16::read(reader)?,
1689                client_minor_protocol_version: u16::read(reader)?,
1690                client_auth_protocol_names: {
1691                    let mut out = Vec::new();
1692                    let len = u16::read(reader)? as usize;
1693                    let end = reader.cursor() - len;
1694                    while reader.cursor() > end {
1695                        out.push({
1696                            let inner = {
1697                                let len = u16::read(reader)?;
1698                                String::from_utf8(reader.consume(len as usize)?.to_vec())?
1699                            };
1700                            reader.pad4()?;
1701                            inner
1702                        });
1703                    }
1704                    out
1705                },
1706            }),
1707            (2, _) => Ok(Request::ConnectReply {
1708                server_major_protocol_version: u16::read(reader)?,
1709                server_minor_protocol_version: u16::read(reader)?,
1710            }),
1711            (50, _) => Ok(Request::CreateIc {
1712                input_method_id: u16::read(reader)?,
1713                ic_attributes: {
1714                    let mut out = Vec::new();
1715                    let len = u16::read(reader)? as usize;
1716                    let end = reader.cursor() - len;
1717                    while reader.cursor() > end {
1718                        out.push(Attribute::read(reader)?);
1719                    }
1720                    out
1721                },
1722            }),
1723            (51, _) => Ok(Request::CreateIcReply {
1724                input_method_id: u16::read(reader)?,
1725                input_context_id: u16::read(reader)?,
1726            }),
1727            (52, _) => Ok(Request::DestroyIc {
1728                input_method_id: u16::read(reader)?,
1729                input_context_id: u16::read(reader)?,
1730            }),
1731            (53, _) => Ok(Request::DestroyIcReply {
1732                input_method_id: u16::read(reader)?,
1733                input_context_id: u16::read(reader)?,
1734            }),
1735            (3, _) => Ok(Request::Disconnect {}),
1736            (4, _) => Ok(Request::DisconnectReply {}),
1737            (38, _) => Ok(Request::EncodingNegotiation {
1738                input_method_id: u16::read(reader)?,
1739                encodings: {
1740                    let inner = {
1741                        let mut out = Vec::new();
1742                        let len = u16::read(reader)? as usize;
1743                        let end = reader.cursor() - len;
1744                        while reader.cursor() > end {
1745                            out.push({
1746                                let len = u8::read(reader)?;
1747                                String::from_utf8(reader.consume(len as usize)?.to_vec())?
1748                            });
1749                        }
1750                        out
1751                    };
1752                    reader.pad4()?;
1753                    inner
1754                },
1755                encoding_infos: {
1756                    let mut out = Vec::new();
1757                    let len = u16::read(reader)? as usize;
1758                    let end = reader.cursor() - len;
1759                    u16::read(reader)?;
1760                    while reader.cursor() > end {
1761                        out.push({
1762                            let inner = {
1763                                let len = u16::read(reader)?;
1764                                String::from_utf8(reader.consume(len as usize)?.to_vec())?
1765                            };
1766                            reader.pad4()?;
1767                            inner
1768                        });
1769                    }
1770                    out
1771                },
1772            }),
1773            (39, _) => Ok(Request::EncodingNegotiationReply {
1774                input_method_id: u16::read(reader)?,
1775                category: u16::read(reader)?,
1776                index: {
1777                    let inner = i16::read(reader)?;
1778                    reader.consume(2)?;
1779                    inner
1780                },
1781            }),
1782            (20, _) => Ok(Request::Error {
1783                input_method_id: u16::read(reader)?,
1784                input_context_id: u16::read(reader)?,
1785                flag: ErrorFlag::read(reader)?,
1786                code: ErrorCode::read(reader)?,
1787                detail: {
1788                    let inner = {
1789                        let len = u16::read(reader)?;
1790                        reader.consume(2)?;
1791                        String::from_utf8(reader.consume(len as usize)?.to_vec())?
1792                    };
1793                    reader.pad4()?;
1794                    inner
1795                },
1796            }),
1797            (60, _) => Ok(Request::ForwardEvent {
1798                input_method_id: u16::read(reader)?,
1799                input_context_id: u16::read(reader)?,
1800                flag: ForwardEventFlag::read(reader)?,
1801                serial_number: u16::read(reader)?,
1802                xev: XEvent::read(reader)?,
1803            }),
1804            (70, _) => Ok(Request::Geometry {
1805                input_method_id: u16::read(reader)?,
1806                input_context_id: u16::read(reader)?,
1807            }),
1808            (56, _) => Ok(Request::GetIcValues {
1809                input_method_id: u16::read(reader)?,
1810                input_context_id: u16::read(reader)?,
1811                ic_attributes: {
1812                    let inner = {
1813                        let mut out = Vec::new();
1814                        let len = u16::read(reader)? as usize;
1815                        let end = reader.cursor() - len;
1816                        while reader.cursor() > end {
1817                            out.push(u16::read(reader)?);
1818                        }
1819                        out
1820                    };
1821                    reader.pad4()?;
1822                    inner
1823                },
1824            }),
1825            (57, _) => Ok(Request::GetIcValuesReply {
1826                input_method_id: u16::read(reader)?,
1827                input_context_id: u16::read(reader)?,
1828                ic_attributes: {
1829                    let mut out = Vec::new();
1830                    let len = u16::read(reader)? as usize;
1831                    let end = reader.cursor() - len;
1832                    u16::read(reader)?;
1833                    while reader.cursor() > end {
1834                        out.push(Attribute::read(reader)?);
1835                    }
1836                    out
1837                },
1838            }),
1839            (44, _) => Ok(Request::GetImValues {
1840                input_method_id: u16::read(reader)?,
1841                im_attributes: {
1842                    let inner = {
1843                        let mut out = Vec::new();
1844                        let len = u16::read(reader)? as usize;
1845                        let end = reader.cursor() - len;
1846                        while reader.cursor() > end {
1847                            out.push(u16::read(reader)?);
1848                        }
1849                        out
1850                    };
1851                    reader.pad4()?;
1852                    inner
1853                },
1854            }),
1855            (45, _) => Ok(Request::GetImValuesReply {
1856                input_method_id: u16::read(reader)?,
1857                im_attributes: {
1858                    let mut out = Vec::new();
1859                    let len = u16::read(reader)? as usize;
1860                    let end = reader.cursor() - len;
1861                    while reader.cursor() > end {
1862                        out.push(Attribute::read(reader)?);
1863                    }
1864                    out
1865                },
1866            }),
1867            (30, _) => Ok(Request::Open {
1868                locale: {
1869                    let inner = {
1870                        let len = u8::read(reader)?;
1871                        String::from_utf8(reader.consume(len as usize)?.to_vec())?
1872                    };
1873                    reader.pad4()?;
1874                    inner
1875                },
1876            }),
1877            (31, _) => Ok(Request::OpenReply {
1878                input_method_id: u16::read(reader)?,
1879                im_attrs: {
1880                    let mut out = Vec::new();
1881                    let len = u16::read(reader)? as usize;
1882                    let end = reader.cursor() - len;
1883                    while reader.cursor() > end {
1884                        out.push(Attr::read(reader)?);
1885                    }
1886                    out
1887                },
1888                ic_attrs: {
1889                    let mut out = Vec::new();
1890                    let len = u16::read(reader)? as usize;
1891                    let end = reader.cursor() - len;
1892                    u16::read(reader)?;
1893                    while reader.cursor() > end {
1894                        out.push(Attr::read(reader)?);
1895                    }
1896                    out
1897                },
1898            }),
1899            (76, _) => Ok(Request::PreeditCaret {
1900                input_method_id: u16::read(reader)?,
1901                input_context_id: u16::read(reader)?,
1902                position: i32::read(reader)?,
1903                direction: CaretDirection::read(reader)?,
1904                style: CaretStyle::read(reader)?,
1905            }),
1906            (77, _) => Ok(Request::PreeditCaretReply {
1907                input_method_id: u16::read(reader)?,
1908                input_context_id: u16::read(reader)?,
1909                position: i32::read(reader)?,
1910            }),
1911            (78, _) => Ok(Request::PreeditDone {
1912                input_method_id: u16::read(reader)?,
1913                input_context_id: u16::read(reader)?,
1914            }),
1915            (75, _) => Ok(Request::PreeditDraw {
1916                input_method_id: u16::read(reader)?,
1917                input_context_id: u16::read(reader)?,
1918                caret: i32::read(reader)?,
1919                chg_first: i32::read(reader)?,
1920                chg_length: i32::read(reader)?,
1921                status: PreeditDrawStatus::read(reader)?,
1922                preedit_string: {
1923                    let inner = {
1924                        let len = u16::read(reader)?;
1925                        reader.consume(len as usize)?.to_vec()
1926                    };
1927                    reader.pad4()?;
1928                    inner
1929                },
1930                feedbacks: {
1931                    let mut out = Vec::new();
1932                    let len = u16::read(reader)? as usize;
1933                    let end = reader.cursor() - len;
1934                    u16::read(reader)?;
1935                    while reader.cursor() > end {
1936                        out.push(Feedback::read(reader)?);
1937                    }
1938                    out
1939                },
1940            }),
1941            (73, _) => Ok(Request::PreeditStart {
1942                input_method_id: u16::read(reader)?,
1943                input_context_id: u16::read(reader)?,
1944            }),
1945            (74, _) => Ok(Request::PreeditStartReply {
1946                input_method_id: u16::read(reader)?,
1947                input_context_id: u16::read(reader)?,
1948                return_value: i32::read(reader)?,
1949            }),
1950            (82, _) => Ok(Request::PreeditState {
1951                input_method_id: u16::read(reader)?,
1952                input_context_id: u16::read(reader)?,
1953                state: PreeditStateFlag::read(reader)?,
1954            }),
1955            (40, _) => Ok(Request::QueryExtension {
1956                input_method_id: u16::read(reader)?,
1957                extensions: {
1958                    let inner = {
1959                        let mut out = Vec::new();
1960                        let len = u16::read(reader)? as usize;
1961                        let end = reader.cursor() - len;
1962                        while reader.cursor() > end {
1963                            out.push({
1964                                let len = u8::read(reader)?;
1965                                String::from_utf8(reader.consume(len as usize)?.to_vec())?
1966                            });
1967                        }
1968                        out
1969                    };
1970                    reader.pad4()?;
1971                    inner
1972                },
1973            }),
1974            (41, _) => Ok(Request::QueryExtensionReply {
1975                input_method_id: u16::read(reader)?,
1976                extensions: {
1977                    let mut out = Vec::new();
1978                    let len = u16::read(reader)? as usize;
1979                    let end = reader.cursor() - len;
1980                    while reader.cursor() > end {
1981                        out.push(Extension::read(reader)?);
1982                    }
1983                    out
1984                },
1985            }),
1986            (34, _) => Ok(Request::RegisterTriggerKeys {
1987                input_method_id: {
1988                    let inner = u16::read(reader)?;
1989                    reader.consume(2)?;
1990                    inner
1991                },
1992                on_keys: {
1993                    let mut out = Vec::new();
1994                    let len = u32::read(reader)? as usize;
1995                    let end = reader.cursor() - len;
1996                    while reader.cursor() > end {
1997                        out.push(TriggerKey::read(reader)?);
1998                    }
1999                    out
2000                },
2001                off_keys: {
2002                    let mut out = Vec::new();
2003                    let len = u32::read(reader)? as usize;
2004                    let end = reader.cursor() - len;
2005                    while reader.cursor() > end {
2006                        out.push(TriggerKey::read(reader)?);
2007                    }
2008                    out
2009                },
2010            }),
2011            (64, _) => Ok(Request::ResetIc {
2012                input_method_id: u16::read(reader)?,
2013                input_context_id: u16::read(reader)?,
2014            }),
2015            (65, _) => Ok(Request::ResetIcReply {
2016                input_method_id: u16::read(reader)?,
2017                input_context_id: u16::read(reader)?,
2018                preedit_string: {
2019                    let inner = {
2020                        let len = u16::read(reader)?;
2021                        reader.consume(len as usize)?.to_vec()
2022                    };
2023                    reader.pad4()?;
2024                    inner
2025                },
2026            }),
2027            (37, _) => Ok(Request::SetEventMask {
2028                input_method_id: u16::read(reader)?,
2029                input_context_id: u16::read(reader)?,
2030                forward_event_mask: u32::read(reader)?,
2031                synchronous_event_mask: u32::read(reader)?,
2032            }),
2033            (58, _) => Ok(Request::SetIcFocus {
2034                input_method_id: u16::read(reader)?,
2035                input_context_id: u16::read(reader)?,
2036            }),
2037            (54, _) => Ok(Request::SetIcValues {
2038                input_method_id: u16::read(reader)?,
2039                input_context_id: u16::read(reader)?,
2040                ic_attributes: {
2041                    let mut out = Vec::new();
2042                    let len = u16::read(reader)? as usize;
2043                    let end = reader.cursor() - len;
2044                    u16::read(reader)?;
2045                    while reader.cursor() > end {
2046                        out.push(Attribute::read(reader)?);
2047                    }
2048                    out
2049                },
2050            }),
2051            (55, _) => Ok(Request::SetIcValuesReply {
2052                input_method_id: u16::read(reader)?,
2053                input_context_id: u16::read(reader)?,
2054            }),
2055            (42, _) => Ok(Request::SetImValues {
2056                input_method_id: u16::read(reader)?,
2057                attributes: {
2058                    let mut out = Vec::new();
2059                    let len = u16::read(reader)? as usize;
2060                    let end = reader.cursor() - len;
2061                    while reader.cursor() > end {
2062                        out.push(Attribute::read(reader)?);
2063                    }
2064                    out
2065                },
2066            }),
2067            (43, _) => Ok(Request::SetImValuesReply {
2068                input_method_id: {
2069                    let inner = u16::read(reader)?;
2070                    reader.consume(2)?;
2071                    inner
2072                },
2073            }),
2074            (81, _) => Ok(Request::StatusDone {
2075                input_method_id: u16::read(reader)?,
2076                input_context_id: u16::read(reader)?,
2077            }),
2078            (80, _) => Ok(Request::StatusDraw {
2079                input_method_id: u16::read(reader)?,
2080                input_context_id: u16::read(reader)?,
2081                content: StatusContent::read(reader)?,
2082            }),
2083            (79, _) => Ok(Request::StatusStart {
2084                input_method_id: u16::read(reader)?,
2085                input_context_id: u16::read(reader)?,
2086            }),
2087            (71, _) => Ok(Request::StrConversion {}),
2088            (72, _) => Ok(Request::StrConversionReply {}),
2089            (61, _) => Ok(Request::Sync {
2090                input_method_id: u16::read(reader)?,
2091                input_context_id: u16::read(reader)?,
2092            }),
2093            (62, _) => Ok(Request::SyncReply {
2094                input_method_id: u16::read(reader)?,
2095                input_context_id: u16::read(reader)?,
2096            }),
2097            (35, _) => Ok(Request::TriggerNotify {
2098                input_method_id: u16::read(reader)?,
2099                input_context_id: u16::read(reader)?,
2100                flag: TriggerNotifyFlag::read(reader)?,
2101                index: u32::read(reader)?,
2102                event_mask: u32::read(reader)?,
2103            }),
2104            (36, _) => Ok(Request::TriggerNotifyReply {
2105                input_method_id: u16::read(reader)?,
2106                input_context_id: u16::read(reader)?,
2107            }),
2108            (59, _) => Ok(Request::UnsetIcFocus {
2109                input_method_id: u16::read(reader)?,
2110                input_context_id: u16::read(reader)?,
2111            }),
2112            _ => Err(reader.invalid_data(
2113                "Opcode",
2114                alloc::format!("({}, {})", major_opcode, minor_opcode),
2115            )),
2116        }
2117    }
2118}
2119impl XimWrite for Request {
2120    fn write(&self, writer: &mut Writer) {
2121        match self {
2122            Request::AuthNext {} => {
2123                12u8.write(writer);
2124                0u8.write(writer);
2125                (((self.size() - 4) / 4) as u16).write(writer);
2126            }
2127            Request::AuthNg {} => {
2128                14u8.write(writer);
2129                0u8.write(writer);
2130                (((self.size() - 4) / 4) as u16).write(writer);
2131            }
2132            Request::AuthReply {} => {
2133                11u8.write(writer);
2134                0u8.write(writer);
2135                (((self.size() - 4) / 4) as u16).write(writer);
2136            }
2137            Request::AuthRequired {} => {
2138                10u8.write(writer);
2139                0u8.write(writer);
2140                (((self.size() - 4) / 4) as u16).write(writer);
2141            }
2142            Request::AuthSetup {} => {
2143                13u8.write(writer);
2144                0u8.write(writer);
2145                (((self.size() - 4) / 4) as u16).write(writer);
2146            }
2147            Request::Close { input_method_id } => {
2148                32u8.write(writer);
2149                0u8.write(writer);
2150                (((self.size() - 4) / 4) as u16).write(writer);
2151                input_method_id.write(writer);
2152                writer.write(&[0u8; 2]);
2153            }
2154            Request::CloseReply { input_method_id } => {
2155                33u8.write(writer);
2156                0u8.write(writer);
2157                (((self.size() - 4) / 4) as u16).write(writer);
2158                input_method_id.write(writer);
2159                writer.write(&[0u8; 2]);
2160            }
2161            Request::Commit {
2162                input_method_id,
2163                input_context_id,
2164                data,
2165            } => {
2166                63u8.write(writer);
2167                0u8.write(writer);
2168                (((self.size() - 4) / 4) as u16).write(writer);
2169                input_method_id.write(writer);
2170                input_context_id.write(writer);
2171                data.write(writer);
2172            }
2173            Request::Connect {
2174                endian,
2175                client_major_protocol_version,
2176                client_minor_protocol_version,
2177                client_auth_protocol_names,
2178            } => {
2179                1u8.write(writer);
2180                0u8.write(writer);
2181                (((self.size() - 4) / 4) as u16).write(writer);
2182                endian.write(writer);
2183                writer.write(&[0u8; 1]);
2184                client_major_protocol_version.write(writer);
2185                client_minor_protocol_version.write(writer);
2186                ((client_auth_protocol_names
2187                    .iter()
2188                    .map(|e| with_pad4(e.len() + 2 + 0 - 0))
2189                    .sum::<usize>()
2190                    + 0
2191                    + 2
2192                    - 2
2193                    - 0) as u16)
2194                    .write(writer);
2195                for elem in client_auth_protocol_names.iter() {
2196                    (elem.len() as u16).write(writer);
2197                    writer.write(elem.as_bytes());
2198                    writer.write_pad4();
2199                }
2200            }
2201            Request::ConnectReply {
2202                server_major_protocol_version,
2203                server_minor_protocol_version,
2204            } => {
2205                2u8.write(writer);
2206                0u8.write(writer);
2207                (((self.size() - 4) / 4) as u16).write(writer);
2208                server_major_protocol_version.write(writer);
2209                server_minor_protocol_version.write(writer);
2210            }
2211            Request::CreateIc {
2212                input_method_id,
2213                ic_attributes,
2214            } => {
2215                50u8.write(writer);
2216                0u8.write(writer);
2217                (((self.size() - 4) / 4) as u16).write(writer);
2218                input_method_id.write(writer);
2219                ((ic_attributes.iter().map(|e| e.size()).sum::<usize>() + 0 + 2 - 2 - 0) as u16)
2220                    .write(writer);
2221                for elem in ic_attributes.iter() {
2222                    elem.write(writer);
2223                }
2224            }
2225            Request::CreateIcReply {
2226                input_method_id,
2227                input_context_id,
2228            } => {
2229                51u8.write(writer);
2230                0u8.write(writer);
2231                (((self.size() - 4) / 4) as u16).write(writer);
2232                input_method_id.write(writer);
2233                input_context_id.write(writer);
2234            }
2235            Request::DestroyIc {
2236                input_method_id,
2237                input_context_id,
2238            } => {
2239                52u8.write(writer);
2240                0u8.write(writer);
2241                (((self.size() - 4) / 4) as u16).write(writer);
2242                input_method_id.write(writer);
2243                input_context_id.write(writer);
2244            }
2245            Request::DestroyIcReply {
2246                input_method_id,
2247                input_context_id,
2248            } => {
2249                53u8.write(writer);
2250                0u8.write(writer);
2251                (((self.size() - 4) / 4) as u16).write(writer);
2252                input_method_id.write(writer);
2253                input_context_id.write(writer);
2254            }
2255            Request::Disconnect {} => {
2256                3u8.write(writer);
2257                0u8.write(writer);
2258                (((self.size() - 4) / 4) as u16).write(writer);
2259            }
2260            Request::DisconnectReply {} => {
2261                4u8.write(writer);
2262                0u8.write(writer);
2263                (((self.size() - 4) / 4) as u16).write(writer);
2264            }
2265            Request::EncodingNegotiation {
2266                input_method_id,
2267                encodings,
2268                encoding_infos,
2269            } => {
2270                38u8.write(writer);
2271                0u8.write(writer);
2272                (((self.size() - 4) / 4) as u16).write(writer);
2273                input_method_id.write(writer);
2274                ((encodings.iter().map(|e| e.len() + 1 + 0).sum::<usize>() + 0 + 2 - 2 - 0) as u16)
2275                    .write(writer);
2276                for elem in encodings.iter() {
2277                    (elem.len() as u8).write(writer);
2278                    writer.write(elem.as_bytes());
2279                }
2280                writer.write_pad4();
2281                ((encoding_infos
2282                    .iter()
2283                    .map(|e| with_pad4(e.len() + 2 + 0 - 0))
2284                    .sum::<usize>()
2285                    + 2
2286                    + 2
2287                    - 2
2288                    - 2) as u16)
2289                    .write(writer);
2290                0u16.write(writer);
2291                for elem in encoding_infos.iter() {
2292                    (elem.len() as u16).write(writer);
2293                    writer.write(elem.as_bytes());
2294                    writer.write_pad4();
2295                }
2296            }
2297            Request::EncodingNegotiationReply {
2298                input_method_id,
2299                category,
2300                index,
2301            } => {
2302                39u8.write(writer);
2303                0u8.write(writer);
2304                (((self.size() - 4) / 4) as u16).write(writer);
2305                input_method_id.write(writer);
2306                category.write(writer);
2307                index.write(writer);
2308                writer.write(&[0u8; 2]);
2309            }
2310            Request::Error {
2311                input_method_id,
2312                input_context_id,
2313                flag,
2314                code,
2315                detail,
2316            } => {
2317                20u8.write(writer);
2318                0u8.write(writer);
2319                (((self.size() - 4) / 4) as u16).write(writer);
2320                input_method_id.write(writer);
2321                input_context_id.write(writer);
2322                flag.write(writer);
2323                code.write(writer);
2324                (detail.len() as u16).write(writer);
2325                writer.write(&[0u8; 2]);
2326                writer.write(detail.as_bytes());
2327                writer.write_pad4();
2328            }
2329            Request::ForwardEvent {
2330                input_method_id,
2331                input_context_id,
2332                flag,
2333                serial_number,
2334                xev,
2335            } => {
2336                60u8.write(writer);
2337                0u8.write(writer);
2338                (((self.size() - 4) / 4) as u16).write(writer);
2339                input_method_id.write(writer);
2340                input_context_id.write(writer);
2341                flag.write(writer);
2342                serial_number.write(writer);
2343                xev.write(writer);
2344            }
2345            Request::Geometry {
2346                input_method_id,
2347                input_context_id,
2348            } => {
2349                70u8.write(writer);
2350                0u8.write(writer);
2351                (((self.size() - 4) / 4) as u16).write(writer);
2352                input_method_id.write(writer);
2353                input_context_id.write(writer);
2354            }
2355            Request::GetIcValues {
2356                input_method_id,
2357                input_context_id,
2358                ic_attributes,
2359            } => {
2360                56u8.write(writer);
2361                0u8.write(writer);
2362                (((self.size() - 4) / 4) as u16).write(writer);
2363                input_method_id.write(writer);
2364                input_context_id.write(writer);
2365                ((ic_attributes.iter().map(|e| e.size()).sum::<usize>() + 0 + 2 - 2 - 0) as u16)
2366                    .write(writer);
2367                for elem in ic_attributes.iter() {
2368                    elem.write(writer);
2369                }
2370                writer.write_pad4();
2371            }
2372            Request::GetIcValuesReply {
2373                input_method_id,
2374                input_context_id,
2375                ic_attributes,
2376            } => {
2377                57u8.write(writer);
2378                0u8.write(writer);
2379                (((self.size() - 4) / 4) as u16).write(writer);
2380                input_method_id.write(writer);
2381                input_context_id.write(writer);
2382                ((ic_attributes.iter().map(|e| e.size()).sum::<usize>() + 2 + 2 - 2 - 2) as u16)
2383                    .write(writer);
2384                0u16.write(writer);
2385                for elem in ic_attributes.iter() {
2386                    elem.write(writer);
2387                }
2388            }
2389            Request::GetImValues {
2390                input_method_id,
2391                im_attributes,
2392            } => {
2393                44u8.write(writer);
2394                0u8.write(writer);
2395                (((self.size() - 4) / 4) as u16).write(writer);
2396                input_method_id.write(writer);
2397                ((im_attributes.iter().map(|e| e.size()).sum::<usize>() + 0 + 2 - 2 - 0) as u16)
2398                    .write(writer);
2399                for elem in im_attributes.iter() {
2400                    elem.write(writer);
2401                }
2402                writer.write_pad4();
2403            }
2404            Request::GetImValuesReply {
2405                input_method_id,
2406                im_attributes,
2407            } => {
2408                45u8.write(writer);
2409                0u8.write(writer);
2410                (((self.size() - 4) / 4) as u16).write(writer);
2411                input_method_id.write(writer);
2412                ((im_attributes.iter().map(|e| e.size()).sum::<usize>() + 0 + 2 - 2 - 0) as u16)
2413                    .write(writer);
2414                for elem in im_attributes.iter() {
2415                    elem.write(writer);
2416                }
2417            }
2418            Request::Open { locale } => {
2419                30u8.write(writer);
2420                0u8.write(writer);
2421                (((self.size() - 4) / 4) as u16).write(writer);
2422                (locale.len() as u8).write(writer);
2423                writer.write(locale.as_bytes());
2424                writer.write_pad4();
2425            }
2426            Request::OpenReply {
2427                input_method_id,
2428                im_attrs,
2429                ic_attrs,
2430            } => {
2431                31u8.write(writer);
2432                0u8.write(writer);
2433                (((self.size() - 4) / 4) as u16).write(writer);
2434                input_method_id.write(writer);
2435                ((im_attrs.iter().map(|e| e.size()).sum::<usize>() + 0 + 2 - 2 - 0) as u16)
2436                    .write(writer);
2437                for elem in im_attrs.iter() {
2438                    elem.write(writer);
2439                }
2440                ((ic_attrs.iter().map(|e| e.size()).sum::<usize>() + 2 + 2 - 2 - 2) as u16)
2441                    .write(writer);
2442                0u16.write(writer);
2443                for elem in ic_attrs.iter() {
2444                    elem.write(writer);
2445                }
2446            }
2447            Request::PreeditCaret {
2448                input_method_id,
2449                input_context_id,
2450                position,
2451                direction,
2452                style,
2453            } => {
2454                76u8.write(writer);
2455                0u8.write(writer);
2456                (((self.size() - 4) / 4) as u16).write(writer);
2457                input_method_id.write(writer);
2458                input_context_id.write(writer);
2459                position.write(writer);
2460                direction.write(writer);
2461                style.write(writer);
2462            }
2463            Request::PreeditCaretReply {
2464                input_method_id,
2465                input_context_id,
2466                position,
2467            } => {
2468                77u8.write(writer);
2469                0u8.write(writer);
2470                (((self.size() - 4) / 4) as u16).write(writer);
2471                input_method_id.write(writer);
2472                input_context_id.write(writer);
2473                position.write(writer);
2474            }
2475            Request::PreeditDone {
2476                input_method_id,
2477                input_context_id,
2478            } => {
2479                78u8.write(writer);
2480                0u8.write(writer);
2481                (((self.size() - 4) / 4) as u16).write(writer);
2482                input_method_id.write(writer);
2483                input_context_id.write(writer);
2484            }
2485            Request::PreeditDraw {
2486                input_method_id,
2487                input_context_id,
2488                caret,
2489                chg_first,
2490                chg_length,
2491                status,
2492                preedit_string,
2493                feedbacks,
2494            } => {
2495                75u8.write(writer);
2496                0u8.write(writer);
2497                (((self.size() - 4) / 4) as u16).write(writer);
2498                input_method_id.write(writer);
2499                input_context_id.write(writer);
2500                caret.write(writer);
2501                chg_first.write(writer);
2502                chg_length.write(writer);
2503                status.write(writer);
2504                (preedit_string.len() as u16).write(writer);
2505                writer.write(preedit_string);
2506                writer.write_pad4();
2507                ((feedbacks.iter().map(|e| e.size()).sum::<usize>() + 2 + 2 - 2 - 2) as u16)
2508                    .write(writer);
2509                0u16.write(writer);
2510                for elem in feedbacks.iter() {
2511                    elem.write(writer);
2512                }
2513            }
2514            Request::PreeditStart {
2515                input_method_id,
2516                input_context_id,
2517            } => {
2518                73u8.write(writer);
2519                0u8.write(writer);
2520                (((self.size() - 4) / 4) as u16).write(writer);
2521                input_method_id.write(writer);
2522                input_context_id.write(writer);
2523            }
2524            Request::PreeditStartReply {
2525                input_method_id,
2526                input_context_id,
2527                return_value,
2528            } => {
2529                74u8.write(writer);
2530                0u8.write(writer);
2531                (((self.size() - 4) / 4) as u16).write(writer);
2532                input_method_id.write(writer);
2533                input_context_id.write(writer);
2534                return_value.write(writer);
2535            }
2536            Request::PreeditState {
2537                input_method_id,
2538                input_context_id,
2539                state,
2540            } => {
2541                82u8.write(writer);
2542                0u8.write(writer);
2543                (((self.size() - 4) / 4) as u16).write(writer);
2544                input_method_id.write(writer);
2545                input_context_id.write(writer);
2546                state.write(writer);
2547            }
2548            Request::QueryExtension {
2549                input_method_id,
2550                extensions,
2551            } => {
2552                40u8.write(writer);
2553                0u8.write(writer);
2554                (((self.size() - 4) / 4) as u16).write(writer);
2555                input_method_id.write(writer);
2556                ((extensions.iter().map(|e| e.len() + 1 + 0).sum::<usize>() + 0 + 2 - 2 - 0)
2557                    as u16)
2558                    .write(writer);
2559                for elem in extensions.iter() {
2560                    (elem.len() as u8).write(writer);
2561                    writer.write(elem.as_bytes());
2562                }
2563                writer.write_pad4();
2564            }
2565            Request::QueryExtensionReply {
2566                input_method_id,
2567                extensions,
2568            } => {
2569                41u8.write(writer);
2570                0u8.write(writer);
2571                (((self.size() - 4) / 4) as u16).write(writer);
2572                input_method_id.write(writer);
2573                ((extensions.iter().map(|e| e.size()).sum::<usize>() + 0 + 2 - 2 - 0) as u16)
2574                    .write(writer);
2575                for elem in extensions.iter() {
2576                    elem.write(writer);
2577                }
2578            }
2579            Request::RegisterTriggerKeys {
2580                input_method_id,
2581                on_keys,
2582                off_keys,
2583            } => {
2584                34u8.write(writer);
2585                0u8.write(writer);
2586                (((self.size() - 4) / 4) as u16).write(writer);
2587                input_method_id.write(writer);
2588                writer.write(&[0u8; 2]);
2589                ((on_keys.iter().map(|e| e.size()).sum::<usize>() + 0 + 4 - 4 - 0) as u32)
2590                    .write(writer);
2591                for elem in on_keys.iter() {
2592                    elem.write(writer);
2593                }
2594                ((off_keys.iter().map(|e| e.size()).sum::<usize>() + 0 + 4 - 4 - 0) as u32)
2595                    .write(writer);
2596                for elem in off_keys.iter() {
2597                    elem.write(writer);
2598                }
2599            }
2600            Request::ResetIc {
2601                input_method_id,
2602                input_context_id,
2603            } => {
2604                64u8.write(writer);
2605                0u8.write(writer);
2606                (((self.size() - 4) / 4) as u16).write(writer);
2607                input_method_id.write(writer);
2608                input_context_id.write(writer);
2609            }
2610            Request::ResetIcReply {
2611                input_method_id,
2612                input_context_id,
2613                preedit_string,
2614            } => {
2615                65u8.write(writer);
2616                0u8.write(writer);
2617                (((self.size() - 4) / 4) as u16).write(writer);
2618                input_method_id.write(writer);
2619                input_context_id.write(writer);
2620                (preedit_string.len() as u16).write(writer);
2621                writer.write(preedit_string);
2622                writer.write_pad4();
2623            }
2624            Request::SetEventMask {
2625                input_method_id,
2626                input_context_id,
2627                forward_event_mask,
2628                synchronous_event_mask,
2629            } => {
2630                37u8.write(writer);
2631                0u8.write(writer);
2632                (((self.size() - 4) / 4) as u16).write(writer);
2633                input_method_id.write(writer);
2634                input_context_id.write(writer);
2635                forward_event_mask.write(writer);
2636                synchronous_event_mask.write(writer);
2637            }
2638            Request::SetIcFocus {
2639                input_method_id,
2640                input_context_id,
2641            } => {
2642                58u8.write(writer);
2643                0u8.write(writer);
2644                (((self.size() - 4) / 4) as u16).write(writer);
2645                input_method_id.write(writer);
2646                input_context_id.write(writer);
2647            }
2648            Request::SetIcValues {
2649                input_method_id,
2650                input_context_id,
2651                ic_attributes,
2652            } => {
2653                54u8.write(writer);
2654                0u8.write(writer);
2655                (((self.size() - 4) / 4) as u16).write(writer);
2656                input_method_id.write(writer);
2657                input_context_id.write(writer);
2658                ((ic_attributes.iter().map(|e| e.size()).sum::<usize>() + 2 + 2 - 2 - 2) as u16)
2659                    .write(writer);
2660                0u16.write(writer);
2661                for elem in ic_attributes.iter() {
2662                    elem.write(writer);
2663                }
2664            }
2665            Request::SetIcValuesReply {
2666                input_method_id,
2667                input_context_id,
2668            } => {
2669                55u8.write(writer);
2670                0u8.write(writer);
2671                (((self.size() - 4) / 4) as u16).write(writer);
2672                input_method_id.write(writer);
2673                input_context_id.write(writer);
2674            }
2675            Request::SetImValues {
2676                input_method_id,
2677                attributes,
2678            } => {
2679                42u8.write(writer);
2680                0u8.write(writer);
2681                (((self.size() - 4) / 4) as u16).write(writer);
2682                input_method_id.write(writer);
2683                ((attributes.iter().map(|e| e.size()).sum::<usize>() + 0 + 2 - 2 - 0) as u16)
2684                    .write(writer);
2685                for elem in attributes.iter() {
2686                    elem.write(writer);
2687                }
2688            }
2689            Request::SetImValuesReply { input_method_id } => {
2690                43u8.write(writer);
2691                0u8.write(writer);
2692                (((self.size() - 4) / 4) as u16).write(writer);
2693                input_method_id.write(writer);
2694                writer.write(&[0u8; 2]);
2695            }
2696            Request::StatusDone {
2697                input_method_id,
2698                input_context_id,
2699            } => {
2700                81u8.write(writer);
2701                0u8.write(writer);
2702                (((self.size() - 4) / 4) as u16).write(writer);
2703                input_method_id.write(writer);
2704                input_context_id.write(writer);
2705            }
2706            Request::StatusDraw {
2707                input_method_id,
2708                input_context_id,
2709                content,
2710            } => {
2711                80u8.write(writer);
2712                0u8.write(writer);
2713                (((self.size() - 4) / 4) as u16).write(writer);
2714                input_method_id.write(writer);
2715                input_context_id.write(writer);
2716                content.write(writer);
2717            }
2718            Request::StatusStart {
2719                input_method_id,
2720                input_context_id,
2721            } => {
2722                79u8.write(writer);
2723                0u8.write(writer);
2724                (((self.size() - 4) / 4) as u16).write(writer);
2725                input_method_id.write(writer);
2726                input_context_id.write(writer);
2727            }
2728            Request::StrConversion {} => {
2729                71u8.write(writer);
2730                0u8.write(writer);
2731                (((self.size() - 4) / 4) as u16).write(writer);
2732            }
2733            Request::StrConversionReply {} => {
2734                72u8.write(writer);
2735                0u8.write(writer);
2736                (((self.size() - 4) / 4) as u16).write(writer);
2737            }
2738            Request::Sync {
2739                input_method_id,
2740                input_context_id,
2741            } => {
2742                61u8.write(writer);
2743                0u8.write(writer);
2744                (((self.size() - 4) / 4) as u16).write(writer);
2745                input_method_id.write(writer);
2746                input_context_id.write(writer);
2747            }
2748            Request::SyncReply {
2749                input_method_id,
2750                input_context_id,
2751            } => {
2752                62u8.write(writer);
2753                0u8.write(writer);
2754                (((self.size() - 4) / 4) as u16).write(writer);
2755                input_method_id.write(writer);
2756                input_context_id.write(writer);
2757            }
2758            Request::TriggerNotify {
2759                input_method_id,
2760                input_context_id,
2761                flag,
2762                index,
2763                event_mask,
2764            } => {
2765                35u8.write(writer);
2766                0u8.write(writer);
2767                (((self.size() - 4) / 4) as u16).write(writer);
2768                input_method_id.write(writer);
2769                input_context_id.write(writer);
2770                flag.write(writer);
2771                index.write(writer);
2772                event_mask.write(writer);
2773            }
2774            Request::TriggerNotifyReply {
2775                input_method_id,
2776                input_context_id,
2777            } => {
2778                36u8.write(writer);
2779                0u8.write(writer);
2780                (((self.size() - 4) / 4) as u16).write(writer);
2781                input_method_id.write(writer);
2782                input_context_id.write(writer);
2783            }
2784            Request::UnsetIcFocus {
2785                input_method_id,
2786                input_context_id,
2787            } => {
2788                59u8.write(writer);
2789                0u8.write(writer);
2790                (((self.size() - 4) / 4) as u16).write(writer);
2791                input_method_id.write(writer);
2792                input_context_id.write(writer);
2793            }
2794        }
2795    }
2796    fn size(&self) -> usize {
2797        let mut content_size = 0;
2798        match self {
2799            Request::AuthNext {} => {}
2800            Request::AuthNg {} => {}
2801            Request::AuthReply {} => {}
2802            Request::AuthRequired {} => {}
2803            Request::AuthSetup {} => {}
2804            Request::Close { input_method_id } => {
2805                content_size += input_method_id.size() + 2;
2806            }
2807            Request::CloseReply { input_method_id } => {
2808                content_size += input_method_id.size() + 2;
2809            }
2810            Request::Commit {
2811                input_method_id,
2812                input_context_id,
2813                data,
2814            } => {
2815                content_size += input_method_id.size();
2816                content_size += input_context_id.size();
2817                content_size += data.size();
2818            }
2819            Request::Connect {
2820                endian,
2821                client_major_protocol_version,
2822                client_minor_protocol_version,
2823                client_auth_protocol_names,
2824            } => {
2825                content_size += endian.size() + 1;
2826                content_size += client_major_protocol_version.size();
2827                content_size += client_minor_protocol_version.size();
2828                content_size += client_auth_protocol_names
2829                    .iter()
2830                    .map(|e| with_pad4(e.len() + 2 + 0 - 0))
2831                    .sum::<usize>()
2832                    + 0
2833                    + 2;
2834            }
2835            Request::ConnectReply {
2836                server_major_protocol_version,
2837                server_minor_protocol_version,
2838            } => {
2839                content_size += server_major_protocol_version.size();
2840                content_size += server_minor_protocol_version.size();
2841            }
2842            Request::CreateIc {
2843                input_method_id,
2844                ic_attributes,
2845            } => {
2846                content_size += input_method_id.size();
2847                content_size += ic_attributes.iter().map(|e| e.size()).sum::<usize>() + 0 + 2;
2848            }
2849            Request::CreateIcReply {
2850                input_method_id,
2851                input_context_id,
2852            } => {
2853                content_size += input_method_id.size();
2854                content_size += input_context_id.size();
2855            }
2856            Request::DestroyIc {
2857                input_method_id,
2858                input_context_id,
2859            } => {
2860                content_size += input_method_id.size();
2861                content_size += input_context_id.size();
2862            }
2863            Request::DestroyIcReply {
2864                input_method_id,
2865                input_context_id,
2866            } => {
2867                content_size += input_method_id.size();
2868                content_size += input_context_id.size();
2869            }
2870            Request::Disconnect {} => {}
2871            Request::DisconnectReply {} => {}
2872            Request::EncodingNegotiation {
2873                input_method_id,
2874                encodings,
2875                encoding_infos,
2876            } => {
2877                content_size += input_method_id.size();
2878                content_size +=
2879                    with_pad4(encodings.iter().map(|e| e.len() + 1 + 0).sum::<usize>() + 0 + 2 - 2)
2880                        + 2;
2881                content_size += encoding_infos
2882                    .iter()
2883                    .map(|e| with_pad4(e.len() + 2 + 0 - 0))
2884                    .sum::<usize>()
2885                    + 2
2886                    + 2;
2887            }
2888            Request::EncodingNegotiationReply {
2889                input_method_id,
2890                category,
2891                index,
2892            } => {
2893                content_size += input_method_id.size();
2894                content_size += category.size();
2895                content_size += index.size() + 2;
2896            }
2897            Request::Error {
2898                input_method_id,
2899                input_context_id,
2900                flag,
2901                code,
2902                detail,
2903            } => {
2904                content_size += input_method_id.size();
2905                content_size += input_context_id.size();
2906                content_size += flag.size();
2907                content_size += code.size();
2908                content_size += with_pad4(detail.len() + 2 + 2 - 0);
2909            }
2910            Request::ForwardEvent {
2911                input_method_id,
2912                input_context_id,
2913                flag,
2914                serial_number,
2915                xev,
2916            } => {
2917                content_size += input_method_id.size();
2918                content_size += input_context_id.size();
2919                content_size += flag.size();
2920                content_size += serial_number.size();
2921                content_size += xev.size();
2922            }
2923            Request::Geometry {
2924                input_method_id,
2925                input_context_id,
2926            } => {
2927                content_size += input_method_id.size();
2928                content_size += input_context_id.size();
2929            }
2930            Request::GetIcValues {
2931                input_method_id,
2932                input_context_id,
2933                ic_attributes,
2934            } => {
2935                content_size += input_method_id.size();
2936                content_size += input_context_id.size();
2937                content_size +=
2938                    with_pad4(ic_attributes.iter().map(|e| e.size()).sum::<usize>() + 0 + 2 - 0);
2939            }
2940            Request::GetIcValuesReply {
2941                input_method_id,
2942                input_context_id,
2943                ic_attributes,
2944            } => {
2945                content_size += input_method_id.size();
2946                content_size += input_context_id.size();
2947                content_size += ic_attributes.iter().map(|e| e.size()).sum::<usize>() + 2 + 2;
2948            }
2949            Request::GetImValues {
2950                input_method_id,
2951                im_attributes,
2952            } => {
2953                content_size += input_method_id.size();
2954                content_size +=
2955                    with_pad4(im_attributes.iter().map(|e| e.size()).sum::<usize>() + 0 + 2 - 2)
2956                        + 2;
2957            }
2958            Request::GetImValuesReply {
2959                input_method_id,
2960                im_attributes,
2961            } => {
2962                content_size += input_method_id.size();
2963                content_size += im_attributes.iter().map(|e| e.size()).sum::<usize>() + 0 + 2;
2964            }
2965            Request::Open { locale } => {
2966                content_size += with_pad4(locale.len() + 1 + 0 - 0);
2967            }
2968            Request::OpenReply {
2969                input_method_id,
2970                im_attrs,
2971                ic_attrs,
2972            } => {
2973                content_size += input_method_id.size();
2974                content_size += im_attrs.iter().map(|e| e.size()).sum::<usize>() + 0 + 2;
2975                content_size += ic_attrs.iter().map(|e| e.size()).sum::<usize>() + 2 + 2;
2976            }
2977            Request::PreeditCaret {
2978                input_method_id,
2979                input_context_id,
2980                position,
2981                direction,
2982                style,
2983            } => {
2984                content_size += input_method_id.size();
2985                content_size += input_context_id.size();
2986                content_size += position.size();
2987                content_size += direction.size();
2988                content_size += style.size();
2989            }
2990            Request::PreeditCaretReply {
2991                input_method_id,
2992                input_context_id,
2993                position,
2994            } => {
2995                content_size += input_method_id.size();
2996                content_size += input_context_id.size();
2997                content_size += position.size();
2998            }
2999            Request::PreeditDone {
3000                input_method_id,
3001                input_context_id,
3002            } => {
3003                content_size += input_method_id.size();
3004                content_size += input_context_id.size();
3005            }
3006            Request::PreeditDraw {
3007                input_method_id,
3008                input_context_id,
3009                caret,
3010                chg_first,
3011                chg_length,
3012                status,
3013                preedit_string,
3014                feedbacks,
3015            } => {
3016                content_size += input_method_id.size();
3017                content_size += input_context_id.size();
3018                content_size += caret.size();
3019                content_size += chg_first.size();
3020                content_size += chg_length.size();
3021                content_size += status.size();
3022                content_size += with_pad4(preedit_string.len() + 2 - 0);
3023                content_size += feedbacks.iter().map(|e| e.size()).sum::<usize>() + 2 + 2;
3024            }
3025            Request::PreeditStart {
3026                input_method_id,
3027                input_context_id,
3028            } => {
3029                content_size += input_method_id.size();
3030                content_size += input_context_id.size();
3031            }
3032            Request::PreeditStartReply {
3033                input_method_id,
3034                input_context_id,
3035                return_value,
3036            } => {
3037                content_size += input_method_id.size();
3038                content_size += input_context_id.size();
3039                content_size += return_value.size();
3040            }
3041            Request::PreeditState {
3042                input_method_id,
3043                input_context_id,
3044                state,
3045            } => {
3046                content_size += input_method_id.size();
3047                content_size += input_context_id.size();
3048                content_size += state.size();
3049            }
3050            Request::QueryExtension {
3051                input_method_id,
3052                extensions,
3053            } => {
3054                content_size += input_method_id.size();
3055                content_size += with_pad4(
3056                    extensions.iter().map(|e| e.len() + 1 + 0).sum::<usize>() + 0 + 2 - 0,
3057                );
3058            }
3059            Request::QueryExtensionReply {
3060                input_method_id,
3061                extensions,
3062            } => {
3063                content_size += input_method_id.size();
3064                content_size += extensions.iter().map(|e| e.size()).sum::<usize>() + 0 + 2;
3065            }
3066            Request::RegisterTriggerKeys {
3067                input_method_id,
3068                on_keys,
3069                off_keys,
3070            } => {
3071                content_size += input_method_id.size() + 2;
3072                content_size += on_keys.iter().map(|e| e.size()).sum::<usize>() + 0 + 4;
3073                content_size += off_keys.iter().map(|e| e.size()).sum::<usize>() + 0 + 4;
3074            }
3075            Request::ResetIc {
3076                input_method_id,
3077                input_context_id,
3078            } => {
3079                content_size += input_method_id.size();
3080                content_size += input_context_id.size();
3081            }
3082            Request::ResetIcReply {
3083                input_method_id,
3084                input_context_id,
3085                preedit_string,
3086            } => {
3087                content_size += input_method_id.size();
3088                content_size += input_context_id.size();
3089                content_size += with_pad4(preedit_string.len() + 2 - 0);
3090            }
3091            Request::SetEventMask {
3092                input_method_id,
3093                input_context_id,
3094                forward_event_mask,
3095                synchronous_event_mask,
3096            } => {
3097                content_size += input_method_id.size();
3098                content_size += input_context_id.size();
3099                content_size += forward_event_mask.size();
3100                content_size += synchronous_event_mask.size();
3101            }
3102            Request::SetIcFocus {
3103                input_method_id,
3104                input_context_id,
3105            } => {
3106                content_size += input_method_id.size();
3107                content_size += input_context_id.size();
3108            }
3109            Request::SetIcValues {
3110                input_method_id,
3111                input_context_id,
3112                ic_attributes,
3113            } => {
3114                content_size += input_method_id.size();
3115                content_size += input_context_id.size();
3116                content_size += ic_attributes.iter().map(|e| e.size()).sum::<usize>() + 2 + 2;
3117            }
3118            Request::SetIcValuesReply {
3119                input_method_id,
3120                input_context_id,
3121            } => {
3122                content_size += input_method_id.size();
3123                content_size += input_context_id.size();
3124            }
3125            Request::SetImValues {
3126                input_method_id,
3127                attributes,
3128            } => {
3129                content_size += input_method_id.size();
3130                content_size += attributes.iter().map(|e| e.size()).sum::<usize>() + 0 + 2;
3131            }
3132            Request::SetImValuesReply { input_method_id } => {
3133                content_size += input_method_id.size() + 2;
3134            }
3135            Request::StatusDone {
3136                input_method_id,
3137                input_context_id,
3138            } => {
3139                content_size += input_method_id.size();
3140                content_size += input_context_id.size();
3141            }
3142            Request::StatusDraw {
3143                input_method_id,
3144                input_context_id,
3145                content,
3146            } => {
3147                content_size += input_method_id.size();
3148                content_size += input_context_id.size();
3149                content_size += content.size();
3150            }
3151            Request::StatusStart {
3152                input_method_id,
3153                input_context_id,
3154            } => {
3155                content_size += input_method_id.size();
3156                content_size += input_context_id.size();
3157            }
3158            Request::StrConversion {} => {}
3159            Request::StrConversionReply {} => {}
3160            Request::Sync {
3161                input_method_id,
3162                input_context_id,
3163            } => {
3164                content_size += input_method_id.size();
3165                content_size += input_context_id.size();
3166            }
3167            Request::SyncReply {
3168                input_method_id,
3169                input_context_id,
3170            } => {
3171                content_size += input_method_id.size();
3172                content_size += input_context_id.size();
3173            }
3174            Request::TriggerNotify {
3175                input_method_id,
3176                input_context_id,
3177                flag,
3178                index,
3179                event_mask,
3180            } => {
3181                content_size += input_method_id.size();
3182                content_size += input_context_id.size();
3183                content_size += flag.size();
3184                content_size += index.size();
3185                content_size += event_mask.size();
3186            }
3187            Request::TriggerNotifyReply {
3188                input_method_id,
3189                input_context_id,
3190            } => {
3191                content_size += input_method_id.size();
3192                content_size += input_context_id.size();
3193            }
3194            Request::UnsetIcFocus {
3195                input_method_id,
3196                input_context_id,
3197            } => {
3198                content_size += input_method_id.size();
3199                content_size += input_context_id.size();
3200            }
3201        }
3202        content_size + 4
3203    }
3204}