1#![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 }
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 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}