Skip to content

Commit

Permalink
Support for the XINERAMA extension
Browse files Browse the repository at this point in the history
Contributed by Julian Stecklina

darcs-hash:20090510073252-df18d-de3560434bb592ec3e3b29e10018de7b1ed16ac4.gz
  • Loading branch information
csrhodes committed May 10, 2009
1 parent 59f9d31 commit bc2907b
Show file tree
Hide file tree
Showing 2 changed files with 95 additions and 1 deletion.
3 changes: 2 additions & 1 deletion clx.asd
Expand Up @@ -75,7 +75,8 @@
(:file "gl" :depends-on ("glx"))
(:file "dpms")
(:file "xtest")
(:file "screensaver")))
(:file "screensaver")
(:file "xinerama")))
(:module demo
:default-component-class example-source-file
:components
Expand Down
93 changes: 93 additions & 0 deletions xinerama.lisp
@@ -0,0 +1,93 @@
;;; -*- Mode: Lisp -*-
;;;
;;; Copyright (C) 2008, Julian Stecklina
;;;
;;; ((
;;; )) This file is COFFEEWARE. As long as you retain this notice
;;; | |o) you can do whatever you want with this code. If you think,
;;; |___|jgs it's worth it, you may buy the author a coffee in return.
;;;
;;; Description:
;;;
;;; This is an implementation of the XINERAMA extension. It does not
;;; include the obsolete PanoramiX calls.

(defpackage "XLIB.XINERAMA"
(:use "COMMON-LISP" "XLIB")
(:nicknames "XINERAMA")
(:import-from "XLIB"
"WITH-BUFFER-REQUEST"
"WITH-BUFFER-REQUEST-AND-REPLY"
"DATA"
"BOOLEAN" "BOOLEAN-GET"
"CARD8" "CARD8-GET"
"CARD16" "CARD16-GET"
"CARD32" "CARD32-GET"
"INT16" "INT16-GET")
(:export "SCREEN-INFO"
"SCREEN-INFO-NUMBER"
"SCREEN-INFO-X"
"SCREEN-INFO-Y"
"SCREEN-INFO-WIDTH"
"SCREEN-INFO-HEIGHT"
"XINERAMA-QUERY-VERSION"
"XINERAMA-IS-ACTIVE"
"XINERAMA-QUERY-SCREENS"))
(in-package "XINERAMA")

(define-extension "XINERAMA")

(defun xinerama-opcode (display)
(extension-opcode display "XINERAMA"))

(defconstant +major-version+ 1)
(defconstant +minor-version+ 1)

(defconstant +get-version+ 0)
(defconstant +get-state+ 1)
(defconstant +get-screen-count+ 2)
(defconstant +get-screen-size+ 3)
(defconstant +is-active+ 4)
(defconstant +query-screens+ 5)

(defstruct screen-info
(number 0 :type (unsigned-byte 32))
(x 0 :type (signed-byte 16))
(y 0 :type (signed-byte 16))
(width 0 :type (unsigned-byte 16))
(height 0 :type (unsigned-byte 16)))

(defun xinerama-query-version (display)
(with-buffer-request-and-reply (display (xinerama-opcode display) nil)
((data +get-version+)
(card8 +major-version+)
(card8 +minor-version+))
(values
(card16-get 8) ; server major version
(card16-get 10)))) ; server minor version

(defun xinerama-is-active (display)
"Returns T, iff Xinerama is supported and active."
(with-buffer-request-and-reply (display (xinerama-opcode display) nil)
((data +is-active+))
(values
;; XCB says this is actually a CARD32, but why?!
(boolean-get 8))))

(defun xinerama-query-screens (display)
"Returns a list of screen-info structures."
(with-buffer-request-and-reply (display (xinerama-opcode display) nil)
((data +query-screens+))
(values
(loop
with index = 32
for number from 0 below (card32-get 8)
collect (prog1
(make-screen-info :number number
:x (int16-get index)
:y (int16-get (+ index 2))
:width (card16-get (+ index 4))
:height (card16-get (+ index 6)))
(incf index 8))))))

;;; EOF

0 comments on commit bc2907b

Please sign in to comment.