summaryrefslogtreecommitdiff
path: root/elpa/xelb-0.20/xcb-xim.el
diff options
context:
space:
mode:
Diffstat (limited to 'elpa/xelb-0.20/xcb-xim.el')
-rw-r--r--elpa/xelb-0.20/xcb-xim.el1022
1 files changed, 1022 insertions, 0 deletions
diff --git a/elpa/xelb-0.20/xcb-xim.el b/elpa/xelb-0.20/xcb-xim.el
new file mode 100644
index 0000000..be71f5b
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-xim.el
@@ -0,0 +1,1022 @@
+;;; xcb-xim.el --- XIM Protocol -*- lexical-binding: t -*-
+
+;; Copyright (C) 2015-2024 Free Software Foundation, Inc.
+
+;; Author: Chris Feng <chris.w.feng@gmail.com>
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; This library implements the X Input Method Protocol.
+
+;; Please note that the byte order of an XIM packet can be different from that
+;; of X packets. Moreover, if you are writing an XIM server, the byte order is
+;; actually specified by the client. Therefore we provide a different global
+;; variable `xim:lsb' to indicate the byte order of classes in this library.
+;; You should let-bind it whenever creating new objects.
+
+;; Todo:
+;; + Add extension support.
+
+;; References:
+;; + XIM (http://www.x.org/releases/X11R7.7/doc/libX11/XIM/xim.txt)
+
+;;; Code:
+
+(require 'xcb-types)
+(require 'xcb-xlib)
+
+;;;; Protocol number
+
+(defconst xim:opcode:connect 1)
+(defconst xim:opcode:connect-reply 2)
+(defconst xim:opcode:disconnect 3)
+(defconst xim:opcode:disconnect-reply 4)
+
+(defconst xim:opcode:auth-required 10)
+(defconst xim:opcode:auth-reply 11)
+(defconst xim:opcode:auth-next 12)
+(defconst xim:opcode:auth-setup 13)
+(defconst xim:opcode:auth-ng 14)
+
+(defconst xim:opcode:error 20)
+
+(defconst xim:opcode:open 30)
+(defconst xim:opcode:open-reply 31)
+(defconst xim:opcode:close 32)
+(defconst xim:opcode:close-reply 33)
+(defconst xim:opcode:register-triggerkeys 34)
+(defconst xim:opcode:trigger-notify 35)
+(defconst xim:opcode:trigger-notify-reply 36)
+(defconst xim:opcode:set-event-mask 37)
+(defconst xim:opcode:encoding-negotiation 38)
+(defconst xim:opcode:encoding-negotiation-reply 39)
+(defconst xim:opcode:query-extension 40)
+(defconst xim:opcode:query-extension-reply 41)
+(defconst xim:opcode:set-im-values 42)
+(defconst xim:opcode:set-im-values-reply 43)
+(defconst xim:opcode:get-im-values 44)
+(defconst xim:opcode:get-im-values-reply 45)
+
+(defconst xim:opcode:create-ic 50)
+(defconst xim:opcode:create-ic-reply 51)
+(defconst xim:opcode:destroy-ic 52)
+(defconst xim:opcode:destroy-ic-reply 53)
+(defconst xim:opcode:set-ic-values 54)
+(defconst xim:opcode:set-ic-values-reply 55)
+(defconst xim:opcode:get-ic-values 56)
+(defconst xim:opcode:get-ic-values-reply 57)
+(defconst xim:opcode:set-ic-focus 58)
+(defconst xim:opcode:unset-ic-focus 59)
+(defconst xim:opcode:forward-event 60)
+(defconst xim:opcode:sync 61)
+(defconst xim:opcode:sync-reply 62)
+(defconst xim:opcode:commit 63)
+(defconst xim:opcode:reset-ic 64)
+(defconst xim:opcode:reset-ic-reply 65)
+
+(defconst xim:opcode:geometry 70)
+(defconst xim:opcode:str-conversion 71)
+(defconst xim:opcode:str-conversion-reply 72)
+(defconst xim:opcode:preedit-start 73)
+(defconst xim:opcode:preedit-start-reply 74)
+(defconst xim:opcode:preedit-draw 75)
+(defconst xim:opcode:preedit-caret 76)
+(defconst xim:opcode:preedit-caret-reply 77)
+(defconst xim:opcode:preedit-done 78)
+(defconst xim:opcode:status-start 79)
+(defconst xim:opcode:status-draw 80)
+(defconst xim:opcode:status-done 81)
+(defconst xim:opcode:preeditstate 82)
+
+;;;; Basic requests packet format
+
+(eval-and-compile
+ (defvar xim:lsb xcb:lsb "Non-nil for LSB first, nil otherwise.
+
+Consider let-bind it rather than change its global value."))
+
+(defclass xim:-struct (xcb:-struct)
+ ((~lsb :initform (symbol-value 'xim:lsb)))
+ :documentation "Struct type for XIM.")
+
+(defclass xim:-request (xim:-struct)
+ ((~major-opcode :type xcb:CARD8)
+ (~minor-opcode :initform 0 :type xcb:CARD8)
+ (~length :initform 0 :type xcb:CARD16))
+ :documentation "XIM request type.")
+
+(cl-defmethod xcb:marshal ((obj xim:-request))
+ "Return the byte-array representation of XIM request OBJ."
+ (let ((result (cl-call-next-method obj)))
+ (vconcat (substring result 0 2)
+ (funcall (if (slot-value obj '~lsb)
+ #'xcb:-pack-u2-lsb
+ #'xcb:-pack-u2)
+ (1- (/ (length result) 4)))
+ (substring result 4))))
+
+;;;; Data types
+
+(xcb:deftypealias 'xim:BITMASK16 'xcb:CARD16)
+
+(xcb:deftypealias 'xim:BITMASK32 'xcb:CARD32)
+
+(defsubst xim:PADDING (N)
+ "Pad N to 4 bytes."
+ (% (- 4 (% N 4)) 4))
+
+(xcb:deftypealias 'xim:LPCE 'xcb:char)
+
+(defclass xim:STRING (xim:-struct)
+ ((length :initarg :length :type xcb:-u2)
+ (string :initarg :string :type xcb:-ignore)
+ (string~ :initform '(name string type xim:LPCE size (xcb:-fieldref 'length))
+ :type xcb:-list)
+ (pad~0 :initform '(xim:PADDING (+ 2 (xcb:-fieldref 'length)))
+ :type xcb:-pad)))
+
+(defclass xim:STR (xim:-struct)
+ ((length :initarg :length :type xcb:-u1)
+ (name :initarg :name :type xcb:-ignore)
+ (name~ :initform '(name name type xcb:char size (xcb:-fieldref 'length))
+ :type xcb:-list)))
+
+(defclass xim:XIMATTR (xim:-struct)
+ ((id :initarg :id :type xcb:CARD16)
+ (type :initarg :type :type xcb:CARD16)
+ (length :initarg :length :type xcb:-u2)
+ (attribute :initarg :attribute :type xcb:-ignore)
+ (attribute~ :initform '(name attribute type xcb:char
+ size (xcb:-fieldref 'length))
+ :type xcb:-list)
+ (pad~0 :initform '(xim:PADDING (+ 2 (xcb:-fieldref 'length)))
+ :type xcb:-pad)))
+
+(defclass xim:XICATTR (xim:XIMATTR)
+ nil)
+
+(defconst xim:ATTRIBUTE-VALUE-TYPE:separator-of-nestedlist 0)
+(defconst xim:ATTRIBUTE-VALUE-TYPE:byte-data 1)
+(defconst xim:ATTRIBUTE-VALUE-TYPE:word-data 2)
+(defconst xim:ATTRIBUTE-VALUE-TYPE:long-data 3)
+(defconst xim:ATTRIBUTE-VALUE-TYPE:char-data 4)
+(defconst xim:ATTRIBUTE-VALUE-TYPE:window 5)
+(defconst xim:ATTRIBUTE-VALUE-TYPE:xim-styles 10)
+(defconst xim:ATTRIBUTE-VALUE-TYPE:x-rectangle 11)
+(defconst xim:ATTRIBUTE-VALUE-TYPE:x-point 12)
+(defconst xim:ATTRIBUTE-VALUE-TYPE:x-font-set 13)
+(defconst xim:ATTRIBUTE-VALUE-TYPE:xim-hot-key-triggers 15)
+(defconst xim:ATTRIBUTE-VALUE-TYPE:xim-string-conversion 17)
+(defconst xim:ATTRIBUTE-VALUE-TYPE:xim-preedit-state 18)
+(defconst xim:ATTRIBUTE-VALUE-TYPE:xim-reset-state 19)
+(defconst xim:ATTRIBUTE-VALUE-TYPE:xim-nested-list #x7FFF)
+
+(defclass xim:XIMStyles (xim:-struct)
+ ((number :initarg :number :type xcb:-u2)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (styles :initarg :styles :type xcb:-ignore)
+ (styles~ :initform '(name styles type xcb:CARD32
+ size (/ (xcb:-fieldref 'number) 4))
+ :type xcb:-list)))
+
+;; Auto set the number slot
+(cl-defmethod xcb:marshal ((obj xim:XIMStyles))
+ (setf (slot-value obj 'number) (* 4 (length (slot-value obj 'styles))))
+ (cl-call-next-method obj))
+
+(defclass xim:XFontSet (xim:-struct)
+ ((length :initarg :length :type xcb:-u2)
+ (base-font-name :initarg :base-font-name :type xcb:-ignore)
+ (base-font-name~ :initform '(name base-font-name type xim:LPCE
+ size (xcb:-fieldref 'length))
+ :type xcb:-list)
+ (pad~0 :initform '(xim:PADDING (+ 2 (xcb:-fieldref 'length)))
+ :type xcb:-pad)))
+
+(defclass xim:XIMHotKeyTriggers (xim:-struct)
+ ((number :type xcb:-u4)
+ (triggers :type xcb:-ignore)
+ (triggers~ :initform '(name triggers type xim:XIMTRIGGERKEY
+ size (xcb:-fieldref 'number))
+ :type xcb:-list)
+ (states :type xcb:-ignore)
+ (states~ :initform '(name states type xim:XIMHOTKEYSTATE
+ size (xcb:-fieldref 'number))
+ :type xcb:-list)))
+
+(defclass xim:XIMTRIGGERKEY (xim:-struct)
+ ((keysym :initarg :keysym :type xcb:CARD32)
+ (modifier :initarg :modifier :type xcb:CARD32)
+ (modifier-mask :initarg :modifier-mask :type xcb:CARD32)))
+
+(defclass xim:ENCODINGINFO (xim:-struct)
+ ((length :initarg :length :type xcb:-u2)
+ (encoding-info :initarg :encoding-info :type xcb:-ignore)
+ (encoding-info~ :initform '(name encoding-info type xcb:char
+ size (xcb:-fieldref 'length))
+ :type xcb:-list)
+ (pad~0 :initform '(xim:PADDING (+ 2 (xcb:-fieldref 'length)))
+ :type xcb:-pad)))
+
+(defclass xim:EXT (xim:-struct)
+ ((major-opcode :initarg :major-opcode :type xcb:CARD8)
+ (minor-opcode :initarg :minor-opcode :type xcb:CARD8)
+ (length :initarg :length :type xcb:-u2)
+ (name :initarg :name :type xcb:-ignore)
+ (name~ :initform '(name name type xcb:char size (xcb:-fieldref 'length))
+ :type xcb:-list)
+ (pad~0 :initform '(xim:PADDING (xcb:-fieldref 'length)) :type xcb:-pad)))
+
+(defclass xim:XIMATTRIBUTE (xim:-struct)
+ ((id :initarg :id :type xcb:CARD16)
+ (length :initarg :length :type xcb:-u2)
+ (value :initarg :value :type xcb:-ignore)
+ (value~ :initform '(name value type xcb:void size (xcb:-fieldref 'length))
+ :type xcb:-list)
+ (pad~0 :initform '(xim:PADDING (xcb:-fieldref 'length)) :type xcb:-pad)))
+
+(cl-defmethod xcb:marshal ((obj xim:XIMATTRIBUTE))
+ (let ((value (slot-value obj 'value)))
+ (when (eieio-object-p value)
+ (setq value (xcb:marshal value))
+ (setf (slot-value obj 'length) (length value)
+ (slot-value obj 'value) value))
+ (cl-call-next-method obj)))
+
+(defclass xim:XICATTRIBUTE (xim:XIMATTRIBUTE)
+ nil)
+
+(defclass xim:XIMSTRCONVTEXT (xim:-struct)
+ ((feedback :initarg :feedback :type xcb:CARD16)
+ (string-length :initarg :string-length :type xcb:-u2)
+ (string :initarg :string :type xcb:-ignore)
+ (string~ :initform '(name string type xcb:char
+ size (xcb:-fieldref 'string-length))
+ :type xcb:-list)
+ (pad~0 :initform '(xim:PADDING (xcb:-fieldref 'string-length))
+ :type xcb:-pad)
+ (feedbacks-length :initarg :feedbacks-length :type xcb:-u2)
+ (pad~1 :initform 2 :type xcb:-pad)
+ (feedbacks :initarg :feedbacks :type xcb:-ignore)
+ (feedbacks~ :initform '(name feedbacks type xcb:void
+ size (xcb:-fieldref 'feedbacks-length))
+ :type xcb:-list)))
+
+(cl-defmethod xcb:marshal ((obj xim:XIMSTRCONVTEXT))
+ (let ((feedbacks (mapconcat 'xcb:marshal (slot-value obj 'feedbacks) [])))
+ (setf (slot-value obj 'feedbacks-length) (length feedbacks)
+ (slot-value obj 'feedbacks) feedbacks)
+ (cl-call-next-method obj)))
+
+(cl-defmethod xcb:unmarshal ((obj xim:XIMSTRCONVTEXT) byte-array)
+ (let ((retval (cl-call-next-method obj byte-array))
+ (data (slot-value obj 'feedbacks))
+ feedback feedbacks)
+ (while (< 0 (length data))
+ (setq feedback (make-instance 'xim:XIMSTRCONVFEEDBACK)
+ data (substring data (xcb:unmarshal feedback data))
+ feedbacks (nconc feedbacks (list feedback))))
+ (setf (slot-value obj 'feedbacks) feedbacks)
+ retval))
+
+(defconst xim:string-conversion:left-edge #x0000001)
+(defconst xim:string-conversion:right-edge #x0000002)
+(defconst xim:string-conversion:top-edge #x0000004)
+(defconst xim:string-conversion:bottom-edge #x0000008)
+(defconst xim:string-conversion:convealed #x0000010)
+(defconst xim:string-conversion:wrapped #x0000020)
+
+(xcb:deftypealias 'xim:XIMFEEDBACK 'xcb:CARD32)
+
+;; FIXME: different from Xlib:XIM*
+(defconst xim:reverse #x000001)
+(defconst xim:underline #x000002)
+(defconst xim:highlight #x000004)
+(defconst xim:primary #x000008)
+(defconst xim:secondary #x000010)
+(defconst xim:tertiary #x000020)
+(defconst xim:visible-to-forward #x000040)
+(defconst xim:visible-to-backward #x000080)
+(defconst xim:visible-center #x000100)
+
+(xcb:deftypealias 'xim:XIMHOTKEYSTATE 'xcb:CARD32)
+
+(defconst xim:hot-key-state:on #x0000001)
+(defconst xim:hot-key-state:off #x0000002)
+
+(xcb:deftypealias 'xim:XIMPREEDITSTATE 'xcb:CARD32)
+
+(defconst xim:preedit:enable #x0000001)
+(defconst xim:preedit:disable #x0000002)
+
+(xcb:deftypealias 'xim:XIMRESETSTATE 'xcb:CARD32)
+
+(defconst xim:initial-state #x0000001)
+(defconst xim:preserve-state #x0000002)
+
+;;;; Error notification
+
+(defclass xim:error (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:error)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)
+ (flag :initarg :flag :type xim:BITMASK16)
+ (error-code :initarg :error-code :type xcb:CARD16)
+ (length :initarg :length :type xcb:-u2)
+ (type :initarg :type :type xcb:CARD16)
+ (detail :initarg :detail :type xcb:-ignore)
+ (detail~ :initform '(name detail type xcb:char
+ size (xcb:-fieldref 'length)) :type xcb:-list)
+ (pad~0 :initform '(xim:PADDING (xcb:-fieldref 'length)) :type xcb:-pad)))
+
+(defconst xim:error-flag:invalid-both 0)
+(defconst xim:error-flag:invalid-im-id 1)
+(defconst xim:error-flag:invalid-ic-id 2)
+
+(defconst xim:error-code:bad-alloc 1)
+(defconst xim:error-code:bad-style 2)
+(defconst xim:error-code:bad-client-window 3)
+(defconst xim:error-code:bad-focus-window 4)
+(defconst xim:error-code:bad-area 5)
+(defconst xim:error-code:bad-spot-location 6)
+(defconst xim:error-code:bad-colormap 7)
+(defconst xim:error-code:bad-atom 8)
+(defconst xim:error-code:bad-pixel 9)
+(defconst xim:error-code:bad-pixmap 10)
+(defconst xim:error-code:bad-name 11)
+(defconst xim:error-code:bad-cursor 12)
+(defconst xim:error-code:bad-protocol 13)
+(defconst xim:error-code:bad-foreground 14)
+(defconst xim:error-code:bad-background 15)
+(defconst xim:error-code:locale-not-supported 16)
+(defconst xim:error-code:bad-something 999)
+
+;;;; Connection establishment
+
+(defclass xim:connect (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:connect)
+ (byte-order :initarg :byte-order :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (major-version :initarg :major-version :type xcb:CARD16)
+ (minor-version :initarg :minor-version :type xcb:CARD16)
+ (number :initarg :number :type xcb:CARD16)
+ (auth-names :initarg :auth-names :type xcb:-ignore)
+ (auth-names~ :initform '(name auth-names type xim:STRING
+ size (xcb:-fieldref 'number))
+ :type xcb:-list)))
+
+(defconst xim:connect-byte-order:msb-first #x42)
+(defconst xim:connect-byte-order:lsb-first #x6c)
+
+(defclass xim:auth-required (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:auth-required)
+ (index :initarg :index :type xcb:CARD8)
+ (pad~0 :initform 3 :type xcb:-pad)
+ (length :initarg :length :type xcb:-u2)
+ (pad~1 :initform 2 :type xcb:-pad)
+ (data :initarg :data :type xcb:-ignore)
+ (data~ :initform '(name data type xcb:void size (xcb:-fieldref 'length))
+ :type xcb:-list)
+ (pad~1 :initform '(xim:PADDING (slot-value length)) :type xcb:-pad)))
+
+(defclass xim:auth-reply (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:auth-reply)
+ (length :initarg :length :type xcb:-u2)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (data :initarg :data :type xcb:-ignore)
+ (data~ :initform '(name data type xcb:void size (xcb:-fieldref 'length))
+ :type xcb:-list)
+ (pad~1 :initform '(xim:PADDING (xcb:-fieldref 'length)) :type xcb:-pad)))
+
+(defclass xim:auth-next (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:auth-next)
+ (length :initarg :length :type xcb:-u2)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (data :initarg :data :type xcb:-ignore)
+ (data~ :initform '(name data type xcb:void size (xcb:-fieldref 'length))
+ :type xcb:-list)
+ (pad~1 :initform '(xim:PADDING (xcb:-fieldref 'length)) :type xcb:-pad)))
+
+(defclass xim:auth-setup (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:auth-setup)
+ (number :initarg :number :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (names :initarg :names :type xcb:-ignore)
+ (names~ :initform '(name names type xim:STRING size (xcb:-fieldref 'number))
+ :type xcb:-list)))
+
+(defclass xim:auth-ng (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:auth-ng)))
+
+(defclass xim:connect-reply (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:connect-reply)
+ ;; Default to version 1.0
+ (major-version :initarg :major-version :initform 1 :type xcb:CARD16)
+ (minor-version :initarg :minor-version :initform 0 :type xcb:CARD16)))
+
+(defclass xim:disconnect (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:disconnect)))
+
+(defclass xim:disconnect-reply (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:disconnect-reply)))
+
+(defclass xim:open (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:open)
+ (locale-name :initarg :locale-name :type xim:STR)
+ (pad~0 :initform '(xim:PADDING (1+ (slot-value (xcb:-fieldref 'locale-name)
+ 'length)))
+ :type xcb:-pad)))
+
+(defclass xim:open-reply (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:open-reply)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (im-attrs-length :initarg :im-attrs-length :type xcb:-u2)
+ (im-attrs :initarg :im-attrs :type xcb:-ignore)
+ (im-attrs~ :initform '(name im-attrs type xcb:void
+ size (xcb:-fieldref 'im-attrs-length))
+ :type xcb:-list)
+ (ic-attrs-length :initarg :ic-attrs-length :type xcb:-u2)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (ic-attrs :initarg :ic-attrs :type xcb:-ignore)
+ (ic-attrs~ :initform '(name ic-attrs type xcb:void
+ size (xcb:-fieldref 'ic-attrs-length))
+ :type xcb:-list)))
+
+(cl-defmethod xcb:marshal ((obj xim:open-reply))
+ (let ((im-attrs (mapconcat #'xcb:marshal (slot-value obj 'im-attrs) []))
+ (ic-attrs (mapconcat #'xcb:marshal (slot-value obj 'ic-attrs) [])))
+ (setf (slot-value obj 'im-attrs-length) (length im-attrs)
+ (slot-value obj 'im-attrs) im-attrs
+ (slot-value obj 'ic-attrs-length) (length ic-attrs)
+ (slot-value obj 'ic-attrs) ic-attrs)
+ (cl-call-next-method obj)))
+
+(cl-defmethod xcb:unmarshal ((obj xim:open-reply) byte-array)
+ (let ((retval (cl-call-next-method obj byte-array))
+ (im-data (slot-value obj 'im-attrs))
+ (ic-data (slot-value obj 'ic-attrs))
+ im-attr im-attrs ic-attr ic-attrs)
+ (while (< 0 (length im-data))
+ (setq im-attr (make-instance 'xim:XIMATTR)
+ im-data (substring im-data (xcb:unmarshal im-attr im-data))
+ im-attrs (nconc im-attrs (list im-attr))))
+ (while (< 0 (length ic-data))
+ (setq ic-attr (make-instance 'xim:XICATTR)
+ ic-data (substring ic-data (xcb:unmarshal ic-attr ic-data))
+ ic-attrs (nconc ic-attrs (list ic-attr))))
+ (setf (slot-value obj 'im-attrs) im-attrs
+ (slot-value obj 'ic-attrs) ic-attrs)
+ retval))
+
+(defclass xim:close (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:close)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)))
+
+(defclass xim:close-reply (xim:close)
+ ((~major-opcode :initform 'xim:opcode:close-reply)))
+
+;;;; Event flow control
+
+(defclass xim:set-event-mask (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:set-event-mask)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)
+ (forward-event-mask :initarg :forward-event-mask :type xcb:-u4)
+ (synchronous-event-mask :initarg :synchronous-event-mask :type xcb:-u4)))
+
+(defclass xim:register-triggerkeys (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:register-triggerkeys)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (on-keys-length :initarg :on-keys-length :type xcb:-u4)
+ (on-keys :initarg :on-keys :type xcb:-ignore)
+ (on-keys~ :initform '(name on-keys type xim:XIMTRIGGERKEY
+ size (/ (xcb:-fieldref 'on-keys-length) 12))
+ :type xcb:-list)
+ (off-keys-length :initarg :off-keys-length :type xcb:-u4)
+ (off-keys :initarg :off-keys :type xcb:-ignore)
+ (off-keys~ :initform '(name off-keys type xim:XIMTRIGGERKEY
+ size (/ (xcb:-fieldref 'off-keys-length) 12))
+ :type xcb:-list)))
+
+(defclass xim:trigger-nofity (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:trigger-notify)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)
+ (flag :initarg :flag :type xcb:CARD32)
+ (index :initarg :index :type xcb:CARD32)
+ (client-select-event-mask :initarg :client-select-event-mask
+ :type xcb:-u4)))
+
+(defconst xim:trigger-nofity-flag:on-keys 0)
+(defconst xim:trigger-nofity-flag:off-keys 1)
+
+(defclass xim:trigger-nofity-reply (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:trigger-notify-reply)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)))
+
+;;;; Encoding negotiation
+
+(defclass xim:encoding-negotiation (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:encoding-negotiation)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (names-length :initarg :names-length :type xcb:-u2)
+ (names :initarg :names :type xcb:-ignore)
+ (names~ :initform '(name names type xcb:void
+ size (xcb:-fieldref 'names-length))
+ :type xcb:-list)
+ (pad~0 :initform '(xim:PADDING (xcb:-fieldref 'names-length))
+ :type xcb:-pad)
+ (encodings-length :initarg :encoding-length :type xcb:-u2)
+ (pad~1 :initform 2 :type xcb:-pad)
+ (encodings :initarg :encodings :type xcb:-ignore)
+ (encodings~ :initform '(name encodings type xcb:void
+ size (xcb:-fieldref 'encodings-length))
+ :type xcb:-list)))
+
+(cl-defmethod xcb:marshal ((obj xim:encoding-negotiation))
+ (let ((names (mapconcat #'xcb:marshal (slot-value obj 'names) []))
+ (encodings (mapconcat #'xcb:marshal (slot-value obj 'encodings) [])))
+ (setf (slot-value obj 'names-length) (length names)
+ (slot-value obj 'names) names
+ (slot-value obj 'encodings-length) (length encodings)
+ (slot-value obj 'encodings) encodings)
+ (cl-call-next-method obj)))
+
+(cl-defmethod xcb:unmarshal ((obj xim:encoding-negotiation) byte-array)
+ (let ((retval (cl-call-next-method obj byte-array))
+ (names-data (slot-value obj 'names))
+ (encodings-data (slot-value obj 'encodings))
+ name names encoding encodings)
+ (while (< 0 (length names-data))
+ (setq name (make-instance 'xim:STR)
+ names-data (substring names-data (xcb:unmarshal name names-data))
+ names (nconc names (list name))))
+ (while (< 0 (length encodings-data))
+ (setq encoding (make-instance 'xim:ENCODINGINFO)
+ encodings-data
+ (substring encodings-data (xcb:unmarshal encoding encodings-data))
+ encodings (nconc encodings (list encoding))))
+ (setf (slot-value obj 'names) names
+ (slot-value obj 'encodings) encodings)
+ retval))
+
+(defclass xim:encoding-negotiation-reply (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:encoding-negotiation-reply)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (category :initarg :category :type xcb:CARD16)
+ (index :initarg :index :type xcb:INT16)
+ (pad~0 :initform 2 :type xcb:-pad)))
+
+(defconst xim:encoding-negotiation-reply-category:name 0)
+(defconst xim:encoding-negotiation-reply-category:data 1)
+
+;;;; Query the supported extension protocol list
+
+(defclass xim:query-extension (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:query-extension)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (length :initarg :length :type xcb:-u2)
+ (extensions :initarg :extensions :type xcb:-ignore)
+ (extensions~ :initform '(name extensions type xcb:void
+ size (xcb:-fieldref 'length))
+ :type xcb:-list)
+ (pad~0 :initform '(xim:PADDING (xcb:-fieldref 'length)) :type xcb:-pad)))
+
+(cl-defmethod xcb:marshal ((obj xim:query-extension))
+ (let ((extensions (mapconcat #'xcb:marshal (slot-value obj 'extensions) [])))
+ (setf (slot-value obj 'length) (length extensions)
+ (slot-value obj 'extensions) extensions)
+ (cl-call-next-method obj)))
+
+(cl-defmethod xcb:unmarshal ((obj xim:query-extension) byte-array)
+ (let ((retval (cl-call-next-method obj byte-array))
+ (data (slot-value obj 'extensions))
+ extension extensions)
+ (while (< 0 (length data))
+ (setq extension (make-instance 'xim:STR)
+ data (substring data (xcb:unmarshal extension data))
+ extensions (nconc extensions (list extension))))
+ (setf (slot-value obj 'extensions) extensions)
+ retval))
+
+(defclass xim:query-extension-reply (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:query-extension-reply)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (length :initarg :length :type xcb:-u2)
+ (extensions :initarg :extensions :type xcb:-ignore)
+ (extensions~ :initform '(name extensions type xcb:void
+ size (xcb:-fieldref 'length))
+ :type xcb:-list)))
+
+(cl-defmethod xcb:marshal ((obj xim:query-extension-reply))
+ (let ((extensions (mapconcat 'xcb:marshal (slot-value obj 'extensions) [])))
+ (setf (slot-value obj 'length) (length extensions)
+ (slot-value obj 'extensions) extensions)
+ (cl-call-next-method obj)))
+
+(cl-defmethod xcb:unmarshal ((obj xim:query-extension-reply) byte-array)
+ (let ((retval (cl-call-next-method obj byte-array))
+ (data (slot-value obj 'extensions))
+ extension extensions)
+ (while (< 0 (length data))
+ (setq extension (make-instance 'xim:EXT)
+ data (substring data (xcb:unmarshal extension data))
+ extensions (nconc extensions (list extension))))
+ (setf (slot-value obj 'extensions) extensions)
+ retval))
+
+;;;; Setting IM values
+
+(defclass xim:set-im-values (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:set-im-values)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (length :initarg :length :type xcb:-u2)
+ (im-attributes :initarg :im-attributes :type xcb:-ignore)
+ (im-attributes~ :initform '(name im-attributes type xcb:void
+ size (xcb:-fieldref 'length))
+ :type xcb:-list)))
+
+(cl-defmethod xcb:marshal ((obj xim:set-im-values))
+ (let ((im-attributes (mapconcat #'xcb:marshal
+ (slot-value obj 'im-attributes) [])))
+ (setf (slot-value obj 'length) (length im-attributes)
+ (slot-value obj 'im-attributes) im-attributes)
+ (cl-call-next-method obj)))
+
+(defclass xim:set-im-values-reply (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:set-im-values-reply)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)))
+
+;;;; Getting IM values
+
+(defclass xim:get-im-values (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:get-im-values)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (length :initarg :length :type xcb:-u2)
+ (im-attributes-id :initarg :im-attributes-id :type xcb:-ignore)
+ (im-attributes-id~ :initform '(name im-attributes-id type xcb:CARD16
+ size (/ (xcb:-fieldref 'length) 2))
+ :type xcb:-list)))
+
+(defclass xim:get-im-values-reply (xim:set-im-values)
+ ((~major-opcode :initform 'xim:opcode:get-im-values-reply)))
+
+;;;; Creating an IC
+
+(defclass xim:create-ic (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:create-ic)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (length :initarg :length :type xcb:-u2)
+ (ic-attributes :initarg :ic-attributes :type xcb:-ignore)
+ (ic-attributes~ :initform '(name ic-attributes type xcb:void
+ size (xcb:-fieldref 'length))
+ :type xcb:-list)))
+
+(cl-defmethod xcb:marshal ((obj xim:create-ic))
+ (let ((ic-attributes (mapconcat #'xcb:marshal
+ (slot-value obj 'ic-attributes) [])))
+ (setf (slot-value obj 'length) (length ic-attributes)
+ (slot-value obj 'ic-attributes) ic-attributes)
+ (cl-call-next-method obj)))
+
+(cl-defmethod xcb:unmarshal ((obj xim:create-ic) byte-array)
+ (let ((retval (cl-call-next-method obj byte-array))
+ (data (slot-value obj 'ic-attributes))
+ ic-attribute ic-attributes)
+ (while (< 0 (length data))
+ (setq ic-attribute (make-instance 'xim:XICATTRIBUTE)
+ data (substring data (xcb:unmarshal ic-attribute data))
+ ic-attributes (nconc ic-attributes (list ic-attribute))))
+ (setf (slot-value obj 'ic-attributes) ic-attributes)
+ retval))
+
+(defclass xim:create-ic-reply (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:create-ic-reply)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)))
+
+;;;; Destroy the IC
+
+(defclass xim:destroy-ic (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:destroy-ic)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)))
+
+(defclass xim:destroy-ic-reply (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:destroy-ic-reply)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)))
+
+;;;; Setting IC values
+
+(defclass xim:set-ic-values (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:set-ic-values)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)
+ (length :initarg :length :type xcb:-u2)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (ic-attributes :initarg :ic-attributes :type xcb:-ignore)
+ (ic-attributes~ :initform '(name ic-attributes type xcb:void
+ size (xcb:-fieldref 'length))
+ :type xcb:-list)))
+
+(cl-defmethod xcb:marshal ((obj xim:set-ic-values))
+ (let ((ic-attributes (mapconcat 'xcb:marshal
+ (slot-value obj 'ic-attributes) [])))
+ (setf (slot-value obj 'length) (length ic-attributes)
+ (slot-value obj 'ic-attributes) ic-attributes)
+ (cl-call-next-method obj)))
+
+(defclass xim:set-ic-values-reply (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:set-ic-values-reply)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)))
+
+;;;; Getting IC values
+
+(defclass xim:get-ic-values (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:get-ic-values)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)
+ (length :initarg :length :type xcb:-u2)
+ (ic-attributes-id :initarg :ic-attributes-id :type xcb:-ignore)
+ (ic-attributes-id~ :initform '(name ic-attributes-id type xcb:CARD16
+ size (/ (xcb:-fieldref 'length) 2))
+ :type xcb:-list)
+ (pad~0 :initform '(xim:PADDING (+ 2 (xcb:-fieldref 'length)))
+ :type xcb:-pad)))
+
+(defclass xim:get-ic-values-reply (xim:set-ic-values)
+ ((~major-opcode :initform 'xim:opcode:get-ic-values-reply)))
+
+;;;; Setting IC focus
+
+(defclass xim:set-ic-focus (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:set-ic-focus)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)))
+
+;;;; Unsetting IC focus
+
+(defclass xim:unset-ic-focus (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:unset-ic-focus)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)))
+
+;;;; Filtering events
+
+(defclass xim:forward-event (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:forward-event)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)
+ (flag :initarg :flag :type xim:BITMASK16)
+ (serial-number :initarg :serial-number :type xcb:CARD16)
+ (event :initarg :event :type xcb:-ignore)
+ (event~ :initform '(name event type xcb:void size 32) :type xcb:-list)))
+
+(defconst xim:forward-event-flag:synchronous 1)
+(defconst xim:forward-event-flag:request-filtering 2)
+(defconst xim:forward-event-flag:request-lookupstring 4)
+
+;;;; Synchronizing with the IM server
+
+(defclass xim:sync (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:sync)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)))
+
+(defclass xim:sync-reply (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:sync-reply)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)))
+
+;;;; Sending a committed string
+
+(defclass xim:commit (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:commit)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)
+ (flag :initarg :flag :type xim:BITMASK16)))
+
+(defconst xim:commit-flag:synchronous 1)
+;; FIXME: different from Xlib:XLookup*
+(defconst xim:commit-flag:x-lookup-chars 2)
+(defconst xim:commit-flag:x-lookup-key-sym 4)
+(defconst xim:commit-flag:x-lookup-both 6)
+
+(defclass xim:commit-x-lookup-key-sym (xim:commit)
+ ((flag :initform 'xim:commit-flag:x-lookup-key-sym)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (key-sym :initarg :key-sym :type xcb:KEYSYM)))
+
+(defclass xim:commit-x-lookup-chars (xim:commit)
+ ((flag :initform 'xim:commit-flag:x-lookup-chars)
+ (length :initarg :length :type xcb:-u2)
+ (string :initarg :string :type xcb:-ignore)
+ (string~ :initform '(name string type xcb:BYTE size (xcb:-fieldref 'length))
+ :type xcb:-list)
+ (pad~1 :initform '(xim:PADDING (xcb:-fieldref 'length)) :type xcb:-pad)))
+
+(defclass xim:commit-x-lookup-both (xim:commit-x-lookup-key-sym
+ xim:commit-x-lookup-chars)
+ ((flag :initform 'xim:commit-flag:x-lookup-both)
+ (pad~1 :initform '(xim:PADDING (+ 2 (xcb:-fieldref 'length)))
+ :type xcb:-pad)))
+
+;;;; Reset IC
+
+(defclass xim:reset-ic (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:reset-ic)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)))
+
+(defclass xim:reset-ic-reply (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:reset-ic-reply)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)
+ (length :initarg :length :type xcb:-u2)
+ (string :initarg :string :type xcb:-ignore)
+ (string~ :initform '(name string type xcb:BYTE size (xcb:-fieldref 'length))
+ :type xcb:-list)
+ (pad~0 :initform '(xim:PADDING (+ 2 (xcb:-fieldref 'length)))
+ :type xcb:-pad)))
+
+;;;; Callbacks
+
+;; Negotiating geometry
+(defclass xim:geometry (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:geometry)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)))
+
+;; Converting a string
+(defclass xim:str-conversion (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:str-conversion)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)
+ (position :initarg :position :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (direction :initarg :direction :type xcb:CARD32)
+ (factor :initarg :factor :type xcb:CARD16)
+ (operation :initarg :operation :type xcb:CARD16)
+ (length :initarg :length :type xcb:INT16)))
+
+(defconst xim:caret-direction:forward-char 0)
+(defconst xim:caret-direction:backward-char 1)
+(defconst xim:caret-direction:forward-word 2)
+(defconst xim:caret-direction:backward-word 3)
+(defconst xim:caret-direction:caret-up 4)
+(defconst xim:caret-direction:caret-down 5)
+(defconst xim:caret-direction:next-line 6)
+(defconst xim:caret-direction:previous-line 7)
+(defconst xim:caret-direction:line-start 8)
+(defconst xim:caret-direction:line-end 9)
+(defconst xim:caret-direction:absolute-position 10)
+(defconst xim:caret-direction:dont-change 11)
+
+(defconst xim:string-conversion-operation:substitution 1)
+(defconst xim:string-conversion-operation:retrieval 2)
+
+(defclass xim:str-conversion-reply (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:str-conversion-reply)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)
+ (feedback :initarg :feedback :type xcb:CARD32)
+ (text :initarg :text :type xim:XIMSTRCONVTEXT)))
+
+;; Preedit callbacks
+(defclass xim:preedit-start (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:preedit-start)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)))
+
+(defclass xim:preedit-start-reply (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:preedit-start-reply)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)
+ (return-value :initarg :return-value :type xcb:INT32)))
+
+(defclass xim:preedit-draw (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:preedit-draw)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)
+ (caret :initarg :caret :type xcb:INT32)
+ (chg-first :initarg :chg-first :type xcb:INT32)
+ (chg-length :initarg :chg-length :type xcb:INT32)
+ (status :initarg :status :type xim:BITMASK32)
+ (string-length :initarg :string-length :type xcb:-u2)
+ (string :initarg :string :type xcb:-ignore)
+ (string~ :initform '(name string type xcb:char
+ size (xcb:-fieldref 'string-length))
+ :type xcb:-list)
+ (pad~0 :initform '(xim:PADDING (+ 2 (xcb:-fieldref 'string-length)))
+ :type xcb:-pad)
+ (feedback-length :initarg :feedback-length :type xcb:-u2)
+ (pad~1 :initform 2 :type xcb:-pad)
+ (feedback :initarg :feedback :type xcb:-ignore)
+ (feedback~ :initform '(name feedback type xim:XIMFEEDBACK
+ size (/ (xcb:-fieldref 'feedback-length) 4))
+ :type xcb:-list)))
+
+(defconst xim:preedit-draw-status:no-string 1)
+(defconst xim:preedit-draw-status:no-feedback 2)
+
+(defclass xim:preedit-caret (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:preedit-caret)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)
+ (position :initarg :position :type xcb:INT32)
+ (direction :initarg :direction :type xcb:CARD32)
+ (style :initarg :style :type xcb:CARD32)))
+
+(defconst xim:preedit-caret-style:invisible 0)
+(defconst xim:preedit-caret-style:primary 1)
+(defconst xim:preedit-caret-style:secondary 2)
+
+(defclass xim:preedit-caret-reply (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:preedit-caret-reply)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)
+ (position :initarg :position :type xcb:CARD32)))
+
+(defclass xim:preedit-done (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:preedit-done)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)))
+
+;; Preedit state notify
+(defclass xim:preeditstate (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:preeditstate)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)
+ (state :initarg :state :type xim:BITMASK32)))
+
+(defconst xim:preeditstate:unknown 0)
+(defconst xim:preeditstate:enable 1)
+(defconst xim:preeditstate:disable 2)
+
+;; Status callbacks
+(defclass xim:status-start (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:status-start)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)))
+
+(defclass xim:status-draw (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:status-draw)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)
+ (type :initarg :type :type xcb:CARD32)))
+
+(defconst xim:status-draw-type:text 0)
+(defconst xim:status-draw-type:bitmap 1)
+
+(defclass xim:status-draw-text (xim:status-draw)
+ ((type :initarg :type :initform 'xim:status-draw-type:text)
+ (status :initarg :status :type xim:BITMASK32)
+ (string-length :initarg :string-length :type xcb:-u2)
+ (string :initarg :string :type xcb:-ignore)
+ (string~ :initform '(name string type xcb:char
+ size (xcb:-fieldref 'string-lessp))
+ :type xcb:-list)
+ (pad~0 :initform '(xim:PADDING (+ 2 (xcb:-fieldref 'string-length)))
+ :type xcb:-pad)
+ (feedback-length :initarg :feedback-length :type xcb:-u2)
+ (pad~1 :initform 2 :type xcb:-pad)
+ (feedback :initarg :feedback :type xcb:-ignore)
+ (feedback~ :initform '(name feedback type xim:XIMFEEDBACK
+ size (/ (xcb:-fieldref 'feedback-length) 4))
+ :type xcb:-list)))
+
+(defclass xim:status-draw-bitmap (xim:status-draw)
+ ((type :initarg :type :initform 'xim:status-draw-type:bitmap)
+ (pixmap-data :initarg :pixmap-data :type xcb:PIXMAP)))
+
+(defclass xim:status-done (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:status-done)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)))
+
+
+
+(provide 'xcb-xim)
+
+;;; xcb-xim.el ends here