boo-bee-macs/elpa/xelb-0.18/xcb-xim.el
2021-04-15 18:46:01 +05:00

1023 lines
40 KiB
EmacsLisp
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;;; xcb-xim.el --- XIM Protocol -*- lexical-binding: t -*-
;; Copyright (C) 2015-2019 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