branch: externals/xelb commit 5b969ed9aac902766a3d76f4ed2fd6788d49b86b Author: Chris Feng <chris.w.f...@gmail.com> Commit: Chris Feng <chris.w.f...@gmail.com>
Detect implicit list length * el_client.el (xelb-request-fields): New variable holding fields in the current request. (xelb-parse-request): Set/Clear the variable accordingly. (xelb-parse-fieldref): Detect implicit list length. * el_client.el (xelb-parse-request): Remove the extra argument. (xelb-parse-exprfield): Remove the extra quote. --- el_client.el | 26 ++++++++++++++++++++++---- xcb-types.el | 1 - xcb-xim.el | 12 ++++-------- xcb-xproto.el | 12 ++++++------ 4 files changed, 32 insertions(+), 19 deletions(-) diff --git a/el_client.el b/el_client.el index 820f7c7..02d78ad 100644 --- a/el_client.el +++ b/el_client.el @@ -60,6 +60,9 @@ (defvar xelb-pad-count -1 "<pad> node counter.") (make-variable-buffer-local 'xelb-pad-count) +(defvar xelb-request-fields nil "Fields in the current request.") +(make-variable-buffer-local 'xelb-request-fields) + ;;;; Helper functions (defsubst xelb-node-name (node) @@ -324,6 +327,13 @@ The `combine-adjacent' attribute is simply ignored." (subnodes (xelb-node-subnodes node t)) expressions result reply-name reply-contents) + ;; Fill `xelb-request-fields'. + (setq xelb-request-fields nil) + (dolist (i subnodes) + (unless (eq (xelb-node-name i) 'reply) + (let ((name (xelb-node-attr i 'name))) + (when name + (push (intern (xelb-escape-name name)) xelb-request-fields))))) (dolist (i subnodes) (if (not (eq (xelb-node-name i) 'reply)) (progn @@ -335,6 +345,7 @@ The `combine-adjacent' attribute is simply ignored." (setq contents (nconc contents result)))) ;; Parse <reply> (setq xelb-pad-count -1) ;reset padding counter + (setq xelb-request-fields nil) ;Clear `xelb-request-fields'. (setq reply-name (intern (concat xelb-prefix (xelb-node-attr node 'name) "~reply"))) @@ -342,14 +353,15 @@ The `combine-adjacent' attribute is simply ignored." (setq reply-contents (apply #'nconc (mapcar #'xelb-parse-structure-content reply-contents))))) + (setq xelb-request-fields nil) ;Clear `xelb-request-fields'. (delq nil contents) (delq nil `((defclass ,name (xcb:-request) ,contents) ;; The optional expressions ,(when expressions - `(cl-defmethod xcb:marshal ((obj ,name) connection) nil + `(cl-defmethod xcb:marshal ((obj ,name)) nil ,@expressions - (cl-call-next-method obj connection))) + (cl-call-next-method obj))) ;; The optional reply body ,(when reply-name (delq nil reply-contents) @@ -468,7 +480,7 @@ KeymapNotify event; instead, we handle this case in `xcb:unmarshal'." (type (xelb-node-type node)) (value (xelb-parse-expression (xelb-node-subnode node)))) `((,name :type ,type) - (setf (slot-value obj ',name) ',value)))) + (setf (slot-value obj ',name) ,value)))) ;; The only difference between <bitcase> and <case> is whether the `condition' ;; is a list @@ -559,7 +571,13 @@ KeymapNotify event; instead, we handle this case in `xcb:unmarshal'." (defun xelb-parse-fieldref (node) "Parse <fieldref>." - `(xcb:-fieldref ',(intern (xelb-escape-name (xelb-node-subnode node))))) + (let ((name (intern (xelb-escape-name (xelb-node-subnode node))))) + (if (or (not xelb-request-fields) ;Probably not a request. + (memq name xelb-request-fields) + (not (string-suffix-p "-len" (symbol-name name)))) + `(xcb:-fieldref ',name) + `(length + (xcb:-fieldref ',(intern (substring (symbol-name name) 0 -4))))))) (defun xelb-parse-paramref (node) "Parse <paramref>." diff --git a/xcb-types.el b/xcb-types.el index 5bc8908..f4e41f0 100644 --- a/xcb-types.el +++ b/xcb-types.el @@ -41,7 +41,6 @@ ;; + The current implementation of `eieio-default-eval-maybe' only `eval's a ;; certain type of forms. If this is changed in the future, we will have to ;; adapt our codes accordingly. -;; + STRING16 and CHAR2B should always be big-endian. ;; + <paramref> for `xcb:-marshal-field'? ;; References: diff --git a/xcb-xim.el b/xcb-xim.el index 01229f3..db46f84 100644 --- a/xcb-xim.el +++ b/xcb-xim.el @@ -145,8 +145,7 @@ Consider let-bind it rather than change its global value.")) (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)) + (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))) @@ -418,8 +417,7 @@ Consider let-bind it rather than change its global value.")) (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)) + (names~ :initform '(name names type xim:STRING size (xcb:-fieldref 'number)) :type xcb:-list))) (defclass xim:auth-ng (xim:-request) @@ -834,8 +832,7 @@ Consider let-bind it rather than change its global value.")) ((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)) + (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))) @@ -858,8 +855,7 @@ Consider let-bind it rather than change its global value.")) (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)) + (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))) diff --git a/xcb-xproto.el b/xcb-xproto.el index 764aed3..92e4a22 100644 --- a/xcb-xproto.el +++ b/xcb-xproto.el @@ -1556,15 +1556,15 @@ '(name string type xcb:CHAR2B size nil) :type xcb:-list))) (cl-defmethod xcb:marshal - ((obj xcb:QueryTextExtents) - connection) + ((obj xcb:QueryTextExtents)) nil (setf (slot-value obj 'odd-length) - '(logand - (xcb:-fieldref 'string-len) - 1)) - (cl-call-next-method obj connection)) + (logand + (length + (xcb:-fieldref 'string)) + 1)) + (cl-call-next-method obj)) (defclass xcb:QueryTextExtents~reply (xcb:-reply) ((draw-direction :initarg :draw-direction :type xcb:BYTE)