emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/xelb 23285493ad 3/6: Handle <length> elements in XCB sp


From: ELPA Syncer
Subject: [elpa] externals/xelb 23285493ad 3/6: Handle <length> elements in XCB specs
Date: Thu, 18 Jan 2024 12:59:14 -0500 (EST)

branch: externals/xelb
commit 23285493ad1460e08331969cd580595cc3973702
Author: Steven Allen <steven@stebalien.com>
Commit: Steven Allen <steven@stebalien.com>

    Handle <length> elements in XCB specs
    
    See https://cgit.freedesktop.org/xcb/proto/tree/doc/xml-xcb.txt,
    xinput's DeviceClass needed this.
    
    * el_client.el (xelb-parse-length): Add a function to handle length
      nodes.
      (xelb-parse-structure-content): Use `xelb-parse-length'.
---
 xcb-types.el | 9 +++++++--
 xelb-gen     | 6 ++++++
 2 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/xcb-types.el b/xcb-types.el
index 42e6913f6f..7a9521a799 100644
--- a/xcb-types.el
+++ b/xcb-types.el
@@ -498,7 +498,8 @@ Consider let-bind it rather than change its global value."))
 (defclass xcb:-struct (xcb:--struct)
   ((~lsb :initarg :~lsb
          :initform (symbol-value 'xcb:lsb) ;see `eieio-default-eval-maybe'
-         :type xcb:-ignore))
+         :type xcb:-ignore)
+   (~size :initform nil :type xcb:-ignore))
   :documentation "Struct type.")
 
 (cl-defmethod xcb:marshal ((obj xcb:-struct))
@@ -639,7 +640,11 @@ The optional argument CTX is for <paramref>."
           (setq result (+ result (cadr tmp)))
           (when (eq type 'xcb:-switch) ;xcb:-switch always finishes a struct
             (throw 'break 'nil)))))
-    result))
+    (if-let ((size (slot-value obj '~size)))
+        ;; Let the struct compute it's size if a length field is specified. 
This lets us skip
+        ;; unknown fields.
+        (eval (slot-value obj '~size) `((obj . ,obj)))
+      result)))
 
 (cl-defmethod xcb:-unmarshal-field ((obj xcb:-struct) type data offset
                                     initform &optional ctx total-length)
diff --git a/xelb-gen b/xelb-gen
index 9d3c634503..7873d120f3 100755
--- a/xelb-gen
+++ b/xelb-gen
@@ -494,6 +494,7 @@ The `combine-adjacent' attribute is simply ignored."
     (`pad (xelb-parse-pad node))
     (`required_start_align (xelb-parse-required_start_align node))
     (`field (xelb-parse-field node))
+    (`length (xelb-parse-length node))
     (`fd (xelb-parse-fd node))
     (`list (xelb-parse-list node))
     (`exprfield (xelb-parse-exprfield node))
@@ -531,6 +532,11 @@ The `combine-adjacent' attribute is simply ignored."
          (type (xelb-node-type node)))
     `((,name :initarg ,(intern (concat ":" (symbol-name name))) :type ,type))))
 
+(defun xelb-parse-length (node)
+  "Parse <length>."
+  (let ((length (xelb-parse-expression (xelb-node-subnode node))))
+  `((~size :initform ',length))))
+
 (defun xelb-parse-fd (node)
   "Parse <fd>."
   (let ((name (intern (xelb-node-attr-escape node 'name))))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]