Initial Commit
[packages] / xemacs-packages / xlib / lisp / xlib-xinerama.el
1 ;;; xlib-xinerama.el --- Xinerama support.
2
3 ;; Copyright (C) 2003-2005 by XWEM Org.
4
5 ;; Author: Zajcev Evgeny <zevlg@yandex.ru>
6 ;; Created: Mon Nov 17 19:23:03 MSK 2003
7 ;; Keywords: xlib, xwem
8 ;; X-CVS: $Id: xlib-xinerama.el,v 1.7 2005-04-04 19:55:29 lg Exp $
9
10 ;; This file is part of XWEM.
11
12 ;; XWEM is free software; you can redistribute it and/or modify it
13 ;; under the terms of the GNU General Public License as published by
14 ;; the Free Software Foundation; either version 2, or (at your option)
15 ;; any later version.
16
17 ;; XWEM is distributed in the hope that it will be useful, but WITHOUT
18 ;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
19 ;; or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
20 ;; License for more details.
21
22 ;; You should have received a copy of the GNU General Public License
23 ;; along with XEmacs; see the file COPYING.  If not, write to the Free
24 ;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
25 ;; 02111-1307, USA.
26
27 ;;; Synched up with: Not in FSF
28
29 ;;; Commentary:
30
31 ;; XInerama support.
32
33 ;;; Code:
34 \f
35 (require 'xlib-xlib)
36
37 (defconst X-XInerama-major 1)
38 (defconst X-XInerama-minor 1)
39
40 (defconst X-XInerama-op-QueryVersion    0)
41 (defconst X-XInerama-op-GetState        1)
42 (defconst X-XInerama-op-GetScreenCount  2)
43 (defconst X-XInerama-op-GetScreenSize   3)
44
45 (defconst X-XInerama-op-IsActive        4)
46 (defconst X-XInerama-op-QueryScreens    5)
47
48 (defun X-XIneramaQueryVersion (xdpy &optional major minor)
49   "On display XDPY query for version of XInerama extension."
50   (X-Dpy-p xdpy 'X-XIneramaQueryVersion)
51
52   (let* ((xin-ext (X-Dpy-get-extension xdpy "XINERAMA"))
53          (ListOfFields
54           (list (vector 1 (nth 4 xin-ext)) ; opcode
55                 [1 X-XInerama-op-QueryVersion]
56                 [2 2]                   ; length
57
58                 [2 (or major X-XInerama-major)]
59                 [2 (or minor X-XInerama-minor)]))
60          (msg (X-Create-message ListOfFields))
61          (ReceiveFields
62           (list [1 success]             ;success field
63                 nil
64                 (list [1 nil]           ;not used
65                       [2 integerp]      ;sequence number
66                       [4 nil]           ;length
67                       [2 integerp]      ;major version
68                       [2 integerp]      ;minor version
69                       [20 nil]))))      ;pad
70     (and (car xin-ext)
71          (X-Dpy-send-read xdpy msg ReceiveFields))))
72
73 (defun X-XIneramaGetState (xdpy d)
74   "Get state of drawable D."
75   (X-Dpy-p xdpy 'X-XIneramaGetState)
76
77   (let* ((xin-ext (X-Dpy-get-extension xdpy "XINERAMA" 'X-XIneramaGetState))
78          (ListOfFields
79           (list (vector 1 (nth 4 xin-ext)) ; opcode
80                 [1 X-XInerama-op-GetState]
81                 [2 2]                   ; length
82                 [4 (X-Drawable-id d)]))
83          (msg (X-Create-message ListOfFields))
84          (ReceiveFields
85           (list [1 success]
86                 nil
87                 (list [1 integerp]      ; state
88                       [2 nil]           ; sequence number
89                       [4 nil]           ; length
90                       [4 integerp]
91                       [20 nil])))
92          (r (X-Dpy-send-read xdpy msg ReceiveFields)))
93     r))
94
95 (defun X-XIneramaGetScreenCount (xdpy d)
96   "Get screen count."
97   (X-Dpy-p xdpy 'X-XIneramaGetScreenCount)
98
99   (let* ((xin-ext (X-Dpy-get-extension xdpy "XINERAMA" 'X-XIneramaGetScreenCount))
100          (ListOfFields
101           (list (vector 1 (nth 4 xin-ext)) ; opcode
102                 [1 X-XInerama-op-GetScreenCount]
103                 [2 2]                   ; length
104                 [4 (X-Drawable-id d)]))
105          (msg (X-Create-message ListOfFields))
106          (ReceiveFields
107           (list [1 success]
108                 nil
109                 (list [1 integerp]      ; screen count
110                       [2 nil]           ; sequence number
111                       [4 nil]           ; length
112                       [4 integerp]
113                       [20 nil])))
114          (r (X-Dpy-send-read xdpy msg ReceiveFields)))
115     r))
116
117 (defun X-XIneramaGetScreenSize (xdpy d scr)
118   "Get screens sizes."
119   (X-Dpy-p xdpy 'X-XIneramaGetScreenSize)
120
121   (let* ((xin-ext (X-Dpy-get-extension xdpy "XINERAMA" 'X-XIneramaGetScreenSize))
122          (ListOfFields
123           (list (vector 1 (nth 4 xin-ext)) ; opcode
124                 [1 X-XInerama-op-GetScreenSize]
125                 [2 3]                   ; length
126                 [4 (X-Drawable-id d)]
127                 [4 scr]))
128          (msg (X-Create-message ListOfFields))
129          (ReceiveFields
130           (list [1 success]
131                 nil
132                 (list [1 nil]           ; unused
133                       [2 nil]           ; sequence number
134                       [4 nil]           ; length
135                       [4 integerp]      ; width
136                       [4 integerp]      ; height
137                       [4 integerp]      ; window
138                       [4 integerp]      ; screen
139                       [8 nil])))
140          (r (X-Dpy-send-read xdpy msg ReceiveFields)))
141     r))
142
143 ;;; Alternative protocol
144
145 (defun X-XIneramaIsActive (xdpy)
146   "Return non-nil if XINERAMA is active."
147   (X-Dpy-p xdpy 'X-XIneramaIsActive)
148
149   (let* ((xin-ext (X-Dpy-get-extension xdpy "XINERAMA" 'X-XIneramaIsActive))
150          (ListOfFields
151           (list (vector 1 (nth 4 xin-ext)) ; opcode
152                 [1 X-XInerama-op-IsActive]
153                 [2 1]                   ; length
154                 ))
155          (msg (X-Create-message ListOfFields))
156          (ReceiveFields
157           (list [1 success]
158                 nil
159                 (list [1 nil]           ; unused
160                       [2 nil]           ; sequence
161                       [4 nil]           ; length
162                       [4 integerp]      ; state
163                       [20 nil])))
164          (r (X-Dpy-send-read xdpy msg ReceiveFields)))
165     (and (car r) (nth 1 r))))
166
167 (defun X-XIneramaQueryScreens (xdpy)
168   "On display XDPY query for XINERAMA screens."
169   (X-Dpy-p xdpy 'X-XIneramaIsActive)
170
171   (let* ((xin-ext (X-Dpy-get-extension xdpy "XINERAMA"))
172          (ListOfFields
173           (list (vector 1 (nth 4 xin-ext)) ; opcode
174                 [1 X-XInerama-op-QueryScreens]
175                 [2 1]                   ; length
176                 ))
177          (msg (X-Create-message ListOfFields))
178          (ReceiveFields
179           (list [1 success]
180                 nil
181                 (list [1 nil]           ; unused
182                       [2 nil]           ; sequence
183                       [4 nil]           ; length
184                       [4 length-1]      ; number
185                       [20 nil]
186                       [(* 8 length-1) :X-Rect]))))
187     (and (car xin-ext)
188          (X-Dpy-send-read xdpy msg ReceiveFields))))
189
190 \f
191 (provide 'xlib-xinerama)
192
193 ;;; xlib-xinerama.el ends here