summaryrefslogtreecommitdiff
path: root/elpa/xelb-0.20/xcb-icccm.el
diff options
context:
space:
mode:
Diffstat (limited to 'elpa/xelb-0.20/xcb-icccm.el')
-rw-r--r--elpa/xelb-0.20/xcb-icccm.el563
1 files changed, 563 insertions, 0 deletions
diff --git a/elpa/xelb-0.20/xcb-icccm.el b/elpa/xelb-0.20/xcb-icccm.el
new file mode 100644
index 0000000..44ea8a1
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-icccm.el
@@ -0,0 +1,563 @@
+;;; xcb-icccm.el --- Inter-Client Communication -*- lexical-binding: t -*-
+;;; Conventions Manual
+
+;; 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 ICCCM the same way as xcb/util-wm.
+
+;; Usage tips:
+;; + Do not forget to call `xcb:icccm:init' for _every_ connection using
+;; this library.
+;; + Use `xcb:icccm:SendEvent' instead of `xcb:SendEvent' to send client
+;; messages defined in this library.
+
+;; Todo:
+;; + Interned atoms are actually connection-dependent. Currently they are
+;; simply saved as global variables.
+
+;; References:
+;; + ICCCM (http://www.x.org/releases/X11R7.7/doc/xorg-docs/icccm/icccm.txt)
+;; + xcb/util-wm (git://anongit.freedesktop.org/xcb/util-wm)
+
+;;; Code:
+
+(eval-when-compile (require 'cl-lib))
+(require 'xcb)
+
+;;;; ICCCM atoms
+
+(eval-and-compile
+ (defconst xcb:icccm:-atoms
+ '(UTF8_STRING COMPOUND_TEXT TEXT C_STRING MANAGER
+ WM_PROTOCOLS WM_TAKE_FOCUS WM_DELETE_WINDOW
+ WM_STATE WM_CHANGE_STATE WM_S0)
+ "Atoms involved in ICCCM.")
+
+ (dolist (atom xcb:icccm:-atoms)
+ (eval `(defvar ,(intern (concat "xcb:Atom:" (symbol-name atom))) nil))))
+
+(cl-defmethod xcb:icccm:init ((obj xcb:connection) &optional force)
+ "Initialize ICCCM module.
+
+This method must be called before using any other method in this module."
+ (when (or force (not xcb:Atom:WM_PROTOCOLS))
+ (let ((atoms xcb:icccm:-atoms))
+ (dotimes (i (1- (x-display-screens)))
+ (push (intern (format "WM_S%d" (1+ i))) atoms))
+ (xcb:icccm:intern-atoms obj atoms force))))
+
+(cl-defmethod xcb:icccm:intern-atoms ((obj xcb:connection) atoms
+ &optional force)
+ "Intern the X atoms listed in the list ATOMS.
+
+The value of these atoms will be available in `xcb:Atom' namespace."
+ (dolist (atom atoms)
+ (let* ((name (symbol-name atom))
+ (var-name (intern (concat "xcb:Atom:" name))))
+ (when (or force (not (and (boundp var-name) (symbol-value var-name))))
+ (set var-name
+ (slot-value (xcb:+request-unchecked+reply obj
+ (make-instance 'xcb:InternAtom
+ :only-if-exists 0
+ :name-len (length name)
+ :name name))
+ 'atom))))))
+
+;;;; Client message
+
+(defclass xcb:icccm:SendEvent (xcb:SendEvent)
+ ((propagate :initform 0)
+ (event-mask :initform 'xcb:EventMask:NoEvent))
+ :documentation "A fork of `xcb:SendEvent' to send ICCCM client messages.")
+
+(defclass xcb:icccm:--ClientMessage (xcb:--struct)
+ ((data :type xcb:-ignore)) ;shadowed slot
+ :documentation "To shadow the data slot in `xcb:ClientMessage'.")
+;;
+(defclass xcb:icccm:-ClientMessage
+ (xcb:icccm:--ClientMessage xcb:ClientMessage)
+ ((format :initform 32)
+ (type :initform 'xcb:Atom:WM_PROTOCOLS)
+ (protocol :type xcb:ATOM) ;new slot
+ (time :initarg :time :type xcb:TIMESTAMP) ;new slot
+ (pad~0 :initform 12 :type xcb:-pad)) ;new slot
+ :documentation "An ICCCM client message with data slot replaced by
+protocol and time.")
+
+(defclass xcb:icccm:-ManagerSelection
+ (xcb:icccm:--ClientMessage xcb:ClientMessage)
+ ((format :initform 32)
+ (type :initform 'xcb:Atom:MANAGER)
+ (time :initarg :time :type xcb:TIMESTAMP) ;new slot
+ (selection :initarg :selection :type xcb:ATOM) ;new slot
+ (owner :initarg :owner :type xcb:WINDOW)) ;new slot
+ :documentation "Announce that selection was successfully acquired.")
+
+(defclass xcb:icccm:WM_DELETE_WINDOW (xcb:icccm:-ClientMessage)
+ ((protocol :initform 'xcb:Atom:WM_DELETE_WINDOW)
+ (time :initform 'xcb:Time:CurrentTime))
+ :documentation "Delete a window using the WM_DELETE_WINDOW client message.")
+
+(defclass xcb:icccm:WM_TAKE_FOCUS (xcb:icccm:-ClientMessage)
+ ((protocol :initform 'xcb:Atom:WM_TAKE_FOCUS))
+ :documentation "Set a focus using the WM_TAKE_FOCUS client message.
+
+A valid timestamp (rather than `xcb:Time:CurrentTime') must be supplied.")
+
+;;;; Abstract classes for getting/changing (plain) list properties
+
+(defclass xcb:icccm:-GetProperty (xcb:GetProperty)
+ ((delete :initform 0)
+ (long-offset :initform 0)
+ (long-length :initform 1000000000.)) ;as long as possible
+ :documentation "Get an ICCCM property (request part).")
+
+(defclass xcb:icccm:-GetProperty~reply (xcb:GetProperty~reply)
+ nil
+ :documentation "Get an ICCCM property (reply part).")
+;;
+(cl-defmethod xcb:unmarshal ((obj xcb:icccm:-GetProperty~reply) byte-array)
+ "Fill in the fields in the reply of ICCCM GetProperty request OBJ
+according to BYTE-ARRAY.
+
+This method automatically format the value as 8, 16 or 32 bits array."
+ (let ((retval (cl-call-next-method obj byte-array))
+ tmp)
+ (with-slots (~lsb length format value-len value) obj
+ (if (or (= 0 value-len) (= 0 length))
+ (setf value nil) ;no available value
+ (setq tmp value ;long-offset is always 0
+ value nil)
+ (pcase format
+ (8
+ (cl-assert (= value-len (length tmp)))
+ (setf value tmp))
+ (16
+ (cl-assert (= (* 2 value-len) (length tmp)))
+ (if ~lsb
+ (dotimes (_ value-len)
+ (setf value (vconcat value
+ (vector (xcb:-unpack-u2-lsb tmp 0))))
+ (setq tmp (substring tmp 2)))
+ (dotimes (_ value-len)
+ (setf value (vconcat value
+ (vector (xcb:-unpack-u2 tmp 0))))
+ (setq tmp (substring tmp 2)))))
+ (32
+ (cl-assert (= (* 4 value-len) (length tmp)))
+ (if ~lsb
+ (dotimes (_ value-len)
+ (setf value (vconcat value
+ (vector (xcb:-unpack-u4-lsb tmp 0))))
+ (setq tmp (substring tmp 4)))
+ (dotimes (_ value-len)
+ (setf value (vconcat value (vector (xcb:-unpack-u4 tmp 0))))
+ (setq tmp (substring tmp 4)))))
+ (_ (cl-assert nil)))))
+ retval))
+
+(defclass xcb:icccm:-ChangeProperty (xcb:ChangeProperty)
+ ((mode :initform 'xcb:PropMode:Replace)
+ (format :initform 32)
+ (data :initform nil))
+ :documentation "Change an ICCCM property.")
+;;
+(cl-defmethod xcb:marshal ((obj xcb:icccm:-ChangeProperty))
+ "Return the byte-array representation of an ICCCM ChangeProperty request.
+
+This method automatically sets the data length."
+ (with-slots (~lsb format data-len data) obj
+ (setf data-len (length data))
+ (setf data
+ (pcase format
+ (8 data)
+ (16 (mapconcat (lambda (i) (if ~lsb (xcb:-pack-u2-lsb i)
+ (xcb:-pack-u2 i)))
+ data []))
+ (32 (mapconcat (lambda (i) (if ~lsb (xcb:-pack-u4-lsb i)
+ (xcb:-pack-u4 i)))
+ data []))
+ (_ (cl-assert nil)))))
+ (cl-call-next-method obj))
+
+;;;; Abstract classes for getting/changing text properties
+
+(defclass xcb:icccm:-GetProperty-text (xcb:icccm:-GetProperty)
+ ((type :initform 'xcb:GetPropertyType:Any))
+ :documentation "Get an ICCCM text property (request part).")
+
+(defclass xcb:icccm:-GetProperty-text~reply (xcb:icccm:-GetProperty~reply)
+ nil
+ :documentation "Get an ICCCM text property (reply part).")
+;;
+(cl-defmethod xcb:unmarshal ((obj xcb:icccm:-GetProperty-text~reply)
+ byte-array)
+ "Fill in the fields in the reply of ICCCM GetProperty (text) request OBJ
+according to BYTE-ARRAY.
+
+This method automatically decodes the value (as string)."
+ (let* ((retval (cl-call-next-method obj byte-array)))
+ (with-slots (format type value) obj
+ (when (symbolp type) (setq type (symbol-value type)))
+ (when (and value (= format 8))
+ (setf value
+ (decode-coding-string
+ (apply #'unibyte-string (append value nil))
+ (cond ((= type xcb:Atom:UTF8_STRING) 'utf-8)
+ ((= type xcb:Atom:STRING) 'iso-latin-1)
+ ((= type xcb:Atom:COMPOUND_TEXT)
+ 'compound-text-with-extensions)
+ ((or (eq type xcb:Atom:TEXT) (eq type xcb:Atom:C_STRING))
+ 'no-conversion)
+ (t (error "[XELB:ICCCM] Unsupported encoding: %d"
+ type)))))))
+ retval))
+
+(defclass xcb:icccm:-ChangeProperty-text (xcb:icccm:-ChangeProperty)
+ ((type :initform 'xcb:Atom:STRING) ;may be changed
+ (format :initform 8))
+ :documentation "Change an ICCCM text property.")
+;;
+(cl-defmethod xcb:marshal ((obj xcb:icccm:-ChangeProperty-text))
+ "Return the byte-array representation of an ICCCM ChangeProperty (text)
+request OBJ.
+
+This method automatically encodes the data (which is a string)."
+ (with-slots (type data) obj
+ (when (symbolp type) (setq type (symbol-value type)))
+ (setf data
+ (vconcat
+ (encode-coding-string
+ data
+ (cond ((= type xcb:Atom:UTF8_STRING) 'utf-8)
+ ((= type xcb:Atom:STRING) 'iso-latin-1)
+ ((= type xcb:Atom:COMPOUND_TEXT)
+ 'compound-text-with-extensions)
+ ((or (eq type xcb:Atom:TEXT) (eq type xcb:Atom:C_STRING))
+ 'no-conversion)
+ (t (error "[XELB:ICCCM] Unsupported encoding: %d" type)))))))
+ (cl-call-next-method obj))
+
+;;;; Abstract classes for getting/changing single field properties
+
+(defclass xcb:icccm:-GetProperty-single (xcb:icccm:-GetProperty)
+ nil
+ :documentation "Get an ICCCM single-valued property (request part).")
+
+(defclass xcb:icccm:-GetProperty-single~reply (xcb:icccm:-GetProperty~reply)
+ nil
+ :documentation "Get a single-valued ICCCM property (reply part).")
+;;
+(cl-defmethod xcb:unmarshal ((obj xcb:icccm:-GetProperty-single~reply)
+ byte-array)
+ "Fill in the fields in the reply of an ICCCM GetProperty (single-valued)
+request OBJ according to BYTE-ARRAY."
+ (let ((retval (cl-call-next-method obj byte-array)))
+ (with-slots (value) obj
+ (when value
+ (cl-assert (= 1 (length value)))
+ (setf value (elt value 0))))
+ retval))
+
+(defclass xcb:icccm:-ChangeProperty-single (xcb:icccm:-ChangeProperty)
+ nil
+ :documentation "Change a single-valued ICCCM property.")
+;;
+(cl-defmethod xcb:marshal ((obj xcb:icccm:-ChangeProperty-single))
+ "Return the byte-array representation of a single-valued ICCCM ChangeProperty
+request OBJ."
+ (with-slots (data) obj
+ (setf data `[,data]))
+ (cl-call-next-method obj))
+
+;;;; Abstract classes for getting/changing property with explicit fields
+
+(defclass xcb:icccm:-GetProperty-explicit (xcb:icccm:-GetProperty)
+ nil
+ :documentation "Get an ICCCM property whose fields are explicitly listed out
+(request part).")
+
+(defclass xcb:icccm:-GetProperty-explicit~reply (xcb:icccm:-GetProperty~reply)
+ nil
+ :documentation "Get an ICCCM property whose fields are explicitly listed out
+(reply part).")
+;;
+(cl-defmethod xcb:unmarshal ((obj xcb:icccm:-GetProperty-explicit~reply)
+ byte-array)
+ "Fill in the reply of an ICCCM GetProperty request whose fields are
+explicitly listed out."
+ (let* ((retval (cl-call-next-method obj byte-array))
+ (slots-orig (eieio-class-slots 'xcb:icccm:-GetProperty~reply))
+ (slots (eieio-class-slots (eieio-object-class obj)))
+ (slots (nthcdr (length slots-orig) slots))
+ (value (slot-value obj 'value)))
+ (unless value (setq value (make-vector (length slots) nil))) ;fallback
+ ;; Set explicit fields from value field
+ (dotimes (i (length value))
+ (setf (slot-value obj (eieio-slot-descriptor-name (elt slots i)))
+ (elt value i)))
+ retval))
+
+(defclass xcb:icccm:-ChangeProperty-explicit (xcb:icccm:-ChangeProperty)
+ ((format :initform 32))
+ :documentation "Change an ICCCM property whose fields are explicitly listed
+out.")
+;;
+(cl-defmethod xcb:marshal ((obj xcb:icccm:-ChangeProperty-explicit))
+ "Return the byte-array representation of an ICCCM ChangeProperty request
+whose fields are explicitly listed out."
+ (let* ((slots-orig (eieio-class-slots 'xcb:icccm:-ChangeProperty))
+ (slots (eieio-class-slots (eieio-object-class obj)))
+ (slots (nthcdr (length slots-orig) slots)))
+ ;; Set data field from explicit fields
+ (setf (slot-value obj 'data)
+ (mapconcat (lambda (slot)
+ (list (slot-value obj
+ (eieio-slot-descriptor-name slot))))
+ slots []))
+ (cl-call-next-method obj)))
+
+;;;; Client Properties
+
+;; WM_NAME
+(defclass xcb:icccm:get-WM_NAME (xcb:icccm:-GetProperty-text)
+ ((property :initform 'xcb:Atom:WM_NAME)))
+(defclass xcb:icccm:get-WM_NAME~reply (xcb:icccm:-GetProperty-text~reply)
+ nil)
+(defclass xcb:icccm:set-WM_NAME (xcb:icccm:-ChangeProperty-text)
+ ((property :initform 'xcb:Atom:WM_NAME)))
+
+;; WM_ICON_NAME
+(defclass xcb:icccm:get-WM_ICON_NAME (xcb:icccm:-GetProperty-text)
+ ((property :initform 'xcb:Atom:WM_ICON_NAME)))
+(defclass xcb:icccm:get-WM_ICON_NAME~reply (xcb:icccm:-GetProperty-text~reply)
+ nil)
+(defclass xcb:icccm:set-WM_ICON_NAME (xcb:icccm:-ChangeProperty-text)
+ ((property :initform 'xcb:Atom:WM_ICON_NAME)))
+
+;; WM_SIZE_HINTS
+(defconst xcb:icccm:WM_SIZE_HINTS:USPosition 1)
+(defconst xcb:icccm:WM_SIZE_HINTS:USSize 2)
+(defconst xcb:icccm:WM_SIZE_HINTS:PPosition 4)
+(defconst xcb:icccm:WM_SIZE_HINTS:PSize 8)
+(defconst xcb:icccm:WM_SIZE_HINTS:PMinSize 16)
+(defconst xcb:icccm:WM_SIZE_HINTS:PMaxSize 32)
+(defconst xcb:icccm:WM_SIZE_HINTS:PResizeInc 64)
+(defconst xcb:icccm:WM_SIZE_HINTS:PAspect 128)
+(defconst xcb:icccm:WM_SIZE_HINTS:PBaseSize 256)
+(defconst xcb:icccm:WM_SIZE_HINTS:PWinGravity 512)
+;;
+(defclass xcb:icccm:-WM_SIZE_HINTS (xcb:--struct)
+ ((flags :initarg :flags :initform 0 :type xcb:-ignore)
+ (x :initarg :x :initform 0 :type xcb:-ignore)
+ (y :initarg :y :initform 0 :type xcb:-ignore)
+ (width :initarg :width :initform 0 :type xcb:-ignore)
+ (height :initarg :height :initform 0 :type xcb:-ignore)
+ (min-width :initarg :min-width :initform 0 :type xcb:-ignore)
+ (min-height :initarg :min-height :initform 0 :type xcb:-ignore)
+ (max-width :initarg :max-width :initform 0 :type xcb:-ignore)
+ (max-height :initarg :max-height :initform 0 :type xcb:-ignore)
+ (width-inc :initarg :width-inc :initform 0 :type xcb:-ignore)
+ (height-inc :initarg :height-inc :initform 0 :type xcb:-ignore)
+ (min-aspect-num :initarg :min-aspect-num :initform 0 :type xcb:-ignore)
+ (min-aspect-den :initarg :min-aspect-den :initform 0 :type xcb:-ignore)
+ (max-aspect-num :initarg :max-aspect-num :initform 0 :type xcb:-ignore)
+ (max-aspect-den :initarg :max-aspect-den :initform 0 :type xcb:-ignore)
+ (base-width :initarg :base-width :initform 0 :type xcb:-ignore)
+ (base-height :initarg :base-height :initform 0 :type xcb:-ignore)
+ (win-gravity :initarg :win-gravity :initform 0 :type xcb:-ignore)))
+;;
+(defclass xcb:icccm:get-WM_SIZE_HINTS (xcb:icccm:-GetProperty-explicit)
+ ((property :initform 'xcb:Atom:WM_SIZE_HINTS)
+ (type :initform 'xcb:Atom:WM_SIZE_HINTS)
+ (long-length :initform 18))) ;fixed
+(defclass xcb:icccm:get-WM_SIZE_HINTS~reply
+ (xcb:icccm:-GetProperty-explicit~reply xcb:icccm:-WM_SIZE_HINTS)
+ nil)
+(defclass xcb:icccm:set-WM_SIZE_HINTS
+ (xcb:icccm:-ChangeProperty-explicit xcb:icccm:-WM_SIZE_HINTS)
+ ((property :initform 'xcb:Atom:WM_SIZE_HINTS)
+ (type :initform 'xcb:Atom:WM_SIZE_HINTS)))
+
+;; WM_NORMAL_HINTS
+(defclass xcb:icccm:get-WM_NORMAL_HINTS (xcb:icccm:get-WM_SIZE_HINTS)
+ ((property :initform 'xcb:Atom:WM_NORMAL_HINTS)))
+(defclass xcb:icccm:get-WM_NORMAL_HINTS~reply
+ (xcb:icccm:get-WM_SIZE_HINTS~reply)
+ nil)
+(defclass xcb:icccm:set-WM_NORMAL_HINTS (xcb:icccm:set-WM_SIZE_HINTS)
+ ((property :initform 'xcb:Atom:WM_NORMAL_HINTS)))
+
+;; WM_HINTS
+(defconst xcb:icccm:WM_HINTS:InputHint 1)
+(defconst xcb:icccm:WM_HINTS:StateHint 2)
+(defconst xcb:icccm:WM_HINTS:IconPixmapHint 4)
+(defconst xcb:icccm:WM_HINTS:IconWindowHint 8)
+(defconst xcb:icccm:WM_HINTS:IconPositionHint 16)
+(defconst xcb:icccm:WM_HINTS:IconMaskHint 32)
+(defconst xcb:icccm:WM_HINTS:WindowGroupHint 64)
+(defconst xcb:icccm:WM_HINTS:MessageHint 128)
+(defconst xcb:icccm:WM_HINTS:UrgencyHint 256)
+;;
+(defclass xcb:icccm:-WM_HINTS (xcb:--struct)
+ ((flags :initarg :flags :initform 0 :type xcb:-ignore)
+ (input :initarg :input :initform 0 :type xcb:-ignore)
+ (initial-state :initarg :initial-state :initform 0 :type xcb:-ignore)
+ (icon-pixmap :initarg :icon-pixmap :initform 0 :type xcb:-ignore)
+ (icon-window :initarg :icon-window :initform 0 :type xcb:-ignore)
+ (icon-x :initarg :icon-x :initform 0 :type xcb:-ignore)
+ (icon-y :initarg :icon-y :initform 0 :type xcb:-ignore)
+ (icon-mask :initarg :icon-mask :initform 0 :type xcb:-ignore)
+ (window-group :initarg :window-group :initform 0 :type xcb:-ignore)))
+;;
+(defclass xcb:icccm:get-WM_HINTS (xcb:icccm:-GetProperty-explicit)
+ ;; (xcb:icccm:-GetProperty)
+ ((property :initform 'xcb:Atom:WM_HINTS)
+ (type :initform 'xcb:Atom:WM_HINTS)
+ (long-length :initform 9))) ;fixed
+(defclass xcb:icccm:get-WM_HINTS~reply
+ (xcb:icccm:-GetProperty-explicit~reply xcb:icccm:-WM_HINTS)
+ nil)
+(defclass xcb:icccm:set-WM_HINTS
+ (xcb:icccm:-ChangeProperty-explicit xcb:icccm:-WM_HINTS)
+ ((property :initform 'xcb:Atom:WM_HINTS)
+ (type :initform 'xcb:Atom:WM_HINTS)))
+
+;; WM_CLASS
+(defclass xcb:icccm:get-WM_CLASS (xcb:icccm:-GetProperty-text)
+ ((property :initform 'xcb:Atom:WM_CLASS)
+ (type :initform 'xcb:Atom:STRING)))
+(defclass xcb:icccm:get-WM_CLASS~reply (xcb:icccm:-GetProperty-text~reply)
+ ((instance-name :type xcb:-ignore)
+ (class-name :type xcb:-ignore)))
+;;
+(cl-defmethod xcb:unmarshal ((obj xcb:icccm:get-WM_CLASS~reply) byte-array)
+ ;; Split value into instance & class names
+ (let* ((retval (cl-call-next-method obj byte-array))
+ (tmp (slot-value obj 'value))
+ (tmp (if tmp (split-string tmp "\0" t) '(nil nil))))
+ (with-slots (instance-name class-name) obj
+ (setf instance-name (car tmp)
+ class-name (cadr tmp)))
+ retval))
+;;
+(defclass xcb:icccm:set-WM_CLASS (xcb:icccm:-ChangeProperty-text)
+ ((property :initform 'xcb:Atom:WM_CLASS)
+ (type :initform 'xcb:Atom:STRING)
+ (instance-name :initarg :instance-name :type xcb:-ignore)
+ (class-name :initarg :class-name :type xcb:-ignore)))
+;;
+(cl-defmethod xcb:marshal ((obj xcb:icccm:set-WM_CLASS))
+ (with-slots (data instance-name class-name) obj
+ (setf data (concat instance-name "\0" class-name "\0")))
+ (cl-call-next-method obj))
+
+;; WM_TRANSIENT_FOR
+(defclass xcb:icccm:get-WM_TRANSIENT_FOR (xcb:icccm:-GetProperty-single)
+ ((property :initform 'xcb:Atom:WM_TRANSIENT_FOR)
+ (type :initform 'xcb:Atom:WINDOW)
+ (long-length :initform 1)))
+(defclass xcb:icccm:get-WM_TRANSIENT_FOR~reply
+ (xcb:icccm:-GetProperty-single~reply)
+ nil)
+(defclass xcb:icccm:set-WM_TRANSIENT_FOR (xcb:icccm:-ChangeProperty-single)
+ ((property :initform 'xcb:Atom:WM_TRANSIENT_FOR)
+ (type :initform 'xcb:Atom:WINDOW)))
+
+;; WM_PROTOCOLS
+(defclass xcb:icccm:get-WM_PROTOCOLS (xcb:icccm:-GetProperty)
+ ((property :initform 'xcb:Atom:WM_PROTOCOLS)
+ (type :initform 'xcb:Atom:ATOM)))
+(defclass xcb:icccm:get-WM_PROTOCOLS~reply (xcb:icccm:-GetProperty~reply)
+ nil)
+(defclass xcb:icccm:set-WM_PROTOCOLS (xcb:icccm:-ChangeProperty)
+ ((type :initform 'xcb:Atom:ATOM)
+ (format :initform 32)))
+
+;; WM_COLORMAP_WINDOWS
+(defclass xcb:icccm:get-WM_COLORMAP_WINDOWS (xcb:icccm:-GetProperty)
+ ((type :initform 'xcb:Atom:WINDOW)))
+(defclass xcb:icccm:get-WM_COLORMAP_WINDOWS~reply
+ (xcb:icccm:-GetProperty~reply)
+ nil)
+(defclass xcb:icccm:set-WM_COLORMAP_WINDOWS (xcb:icccm:-ChangeProperty)
+ ((type :initform 'xcb:Atom:WINDOW)
+ (format :initform 32)))
+
+;; WM_CLIENT_MACHINE
+(defclass xcb:icccm:get-WM_CLIENT_MACHINE (xcb:icccm:-GetProperty-text)
+ ((property :initform 'xcb:Atom:WM_CLIENT_MACHINE)))
+(defclass xcb:icccm:get-WM_CLIENT_MACHINE~reply
+ (xcb:icccm:-GetProperty-text~reply)
+ nil)
+(defclass xcb:icccm:set-WM_CLIENT_MACHINE (xcb:icccm:-ChangeProperty-text)
+ ((property :initform 'xcb:Atom:WM_CLIENT_MACHINE)))
+
+;;;; Window Manager Properties
+
+;; WM_STATE
+(defconst xcb:icccm:WM_STATE:WithdrawnState 0)
+(defconst xcb:icccm:WM_STATE:NormalState 1)
+(defconst xcb:icccm:WM_STATE:IconicState 3)
+;;
+(defclass xcb:icccm:-WM_STATE (xcb:--struct)
+ ((state :initarg :state :type xcb:-ignore)
+ (icon :initarg :icon :type xcb:-ignore)))
+;;
+(defclass xcb:icccm:get-WM_STATE (xcb:icccm:-GetProperty-explicit)
+ ((property :initform 'xcb:Atom:WM_STATE)
+ (type :initform 'xcb:Atom:WM_STATE)
+ (long-length :initform 2)))
+(defclass xcb:icccm:get-WM_STATE~reply
+ (xcb:icccm:-GetProperty-explicit~reply xcb:icccm:-WM_STATE)
+ nil)
+(defclass xcb:icccm:set-WM_STATE
+ (xcb:icccm:-ChangeProperty-explicit xcb:icccm:-WM_STATE)
+ ((property :initform 'xcb:Atom:WM_STATE)
+ (type :initform 'xcb:Atom:WM_STATE)))
+
+;; WM_ICON_SIZE
+(defclass xcb:icccm:-WM_ICON_SIZE (xcb:--struct)
+ ((min-width :initarg :min-width :type xcb:-ignore)
+ (min-height :initarg :min-height :type xcb:-ignore)
+ (max-width :initarg :max-width :type xcb:-ignore)
+ (max-height :initarg :max-height :type xcb:-ignore)
+ (width-inc :initarg :width-inc :type xcb:-ignore)
+ (height-inc :initarg :height-inc :type xcb:-ignore)))
+;;
+(defclass xcb:icccm:get-WM_ICON_SIZE (xcb:icccm:-GetProperty-explicit)
+ ((property :initform 'xcb:Atom:WM_ICON_SIZE)
+ (type :initform 'xcb:Atom:WM_ICON_SIZE)
+ (long-length :initform 6)))
+(defclass xcb:icccm:get-WM_ICON_SIZE~reply
+ (xcb:icccm:-GetProperty-explicit~reply xcb:icccm:-WM_ICON_SIZE)
+ nil)
+(defclass xcb:icccm:set-WM_ICON_SIZE
+ (xcb:icccm:-ChangeProperty-explicit xcb:icccm:-WM_ICON_SIZE)
+ ((property :initform 'xcb:Atom:WM_ICON_SIZE)
+ (type :initform 'xcb:Atom:WM_ICON_SIZE)))
+
+
+
+(provide 'xcb-icccm)
+
+;;; xcb-icccm.el ends here