1 /***********************************************************
3 Copyright 1987, 1998 The Open Group
5 Permission to use, copy, modify, distribute, and sell this software and its
6 documentation for any purpose is hereby granted without fee, provided that
7 the above copyright notice appear in all copies and that both that
8 copyright notice and this permission notice appear in supporting
11 The above copyright notice and this permission notice shall be included in
12 all copies or substantial portions of the Software.
14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
18 AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
19 CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21 Except as contained in this notice, the name of The Open Group shall not be
22 used in advertising or otherwise to promote the sale, use or other dealings
23 in this Software without prior written authorization from The Open Group.
25 Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
29 Permission to use, copy, modify, and distribute this software and its
30 documentation for any purpose and without fee is hereby granted,
31 provided that the above copyright notice appear in all copies and that
32 both that copyright notice and this permission notice appear in
33 supporting documentation, and that the name of Digital not be
34 used in advertising or publicity pertaining to distribution of the
35 software without specific, written prior permission.
37 DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
38 ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
39 DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
40 ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
41 WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
42 ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
45 Copyright 1992, 1993 Data General Corporation;
46 Copyright 1992, 1993 OMRON Corporation
48 Permission to use, copy, modify, distribute, and sell this software and its
49 documentation for any purpose is hereby granted without fee, provided that the
50 above copyright notice appear in all copies and that both that copyright
51 notice and this permission notice appear in supporting documentation, and that
52 neither the name OMRON or DATA GENERAL be used in advertising or publicity
53 pertaining to distribution of the software without specific, written prior
54 permission of the party whose name is to be used. Neither OMRON or
55 DATA GENERAL make any representation about the suitability of this software
56 for any purpose. It is provided "as is" without express or implied warranty.
58 OMRON AND DATA GENERAL EACH DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
59 SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
60 IN NO EVENT SHALL OMRON OR DATA GENERAL BE LIABLE FOR ANY SPECIAL, INDIRECT
61 OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
62 DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
63 TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
66 ******************************************************************/
70 * X internal definitions
74 #include <X11/Xosdefs.h>
75 #include <X11/Xfuncproto.h>
78 #include <X11/Xdefs.h>
87 #define MAXGPUSCREENS 16
89 #define MAXCLIENTS 256
90 #define MAXEXTENSIONS 128
92 #define MAXDEVICES 40 /* input devices */
93 #define GPU_SCREEN_OFFSET 256
95 /* 128 event opcodes for core + extension events, excluding GE */
97 #define EXTENSION_EVENT_BASE 64
98 #define EXTENSION_BASE 128
100 typedef uint32_t ATOM
;
107 #ifndef _XTYPEDEF_CALLBACKLISTPTR
108 typedef struct _CallbackList
*CallbackListPtr
; /* also in dix.h */
110 #define _XTYPEDEF_CALLBACKLISTPTR
113 typedef struct _xReq
*xReqPtr
;
115 #include "os.h" /* for ALLOCATE_LOCAL and DEALLOCATE_LOCAL */
116 #include <X11/Xfuncs.h> /* for bcopy, bzero, and bcmp */
118 #define NullBox ((BoxPtr)0)
119 #define MILLI_PER_MIN (1000 * 60)
120 #define MILLI_PER_SECOND (1000)
122 /* this next is used with None and ParentRelative to tell
123 PaintWin() what to use to paint the background. Also used
124 in the macro IS_VALID_PIXMAP */
126 #define USE_BACKGROUND_PIXEL 3
127 #define USE_BORDER_PIXEL 3
129 /* byte swap a 32-bit literal */
130 static inline uint32_t
133 return ((x
& 0xff) << 24) |
134 ((x
& 0xff00) << 8) | ((x
& 0xff0000) >> 8) | ((x
>> 24) & 0xff);
137 /* byte swap a 16-bit literal */
138 static inline uint16_t
141 return ((x
& 0xff) << 8) | ((x
>> 8) & 0xff);
147 #define min(a, b) (((a) < (b)) ? (a) : (b))
148 #define max(a, b) (((a) > (b)) ? (a) : (b))
149 /* abs() is a function, not a macro; include the file declaring
150 * it in case we haven't done that yet.
153 #define sign(x) ((x) < 0 ? -1 : ((x) > 0 ? 1 : 0))
154 /* this assumes b > 0 */
155 #define modulus(a, b, d) if (((d) = (a) % (b)) < 0) (d) += (b)
157 * return the least significant bit in x which is set
159 * This works on 1's complement and 2's complement machines.
160 * If you care about the extra instruction on 2's complement
161 * machines, change to ((x) & (-(x)))
163 #define lowbit(x) ((x) & (~(x) + 1))
165 /* XXX Not for modules */
167 #if !defined(MAXSHORT) || !defined(MINSHORT) || \
168 !defined(MAXINT) || !defined(MININT)
170 * Some implementations #define these through <math.h>, so preclude
171 * #include'ing it later.
176 #define MAXSHORT SHRT_MAX
178 #define MINSHORT SHRT_MIN
180 #define MAXINT INT_MAX
182 #define MININT INT_MIN
186 #include <stdio.h> /* for fopen, etc... */
191 #include <sys/param.h>
194 #define PATH_MAX MAXPATHLEN
196 #define PATH_MAX 1024
202 * Calculate the number of bytes needed to hold bits.
203 * @param bits The minimum number of bits needed.
204 * @return The number of bytes needed to hold bits.
207 bits_to_bytes(const int bits
)
209 return ((bits
+ 7) >> 3);
213 * Calculate the number of 4-byte units needed to hold the given number of
215 * @param bytes The minimum number of bytes needed.
216 * @return The number of 4-byte units needed to hold bytes.
219 bytes_to_int32(const int bytes
)
221 return (((bytes
) + 3) >> 2);
225 * Calculate the number of bytes (in multiples of 4) needed to hold bytes.
226 * @param bytes The minimum number of bytes needed.
227 * @return The closest multiple of 4 that is equal or higher than bytes.
230 pad_to_int32(const int bytes
)
232 return (((bytes
) + 3) & ~3);
236 * Calculate padding needed to bring the number of bytes to an even
238 * @param bytes The minimum number of bytes needed.
239 * @return The bytes of padding needed to arrive at the closest multiple of 4
240 * that is equal or higher than bytes.
243 padding_for_int32(const int bytes
)
245 return ((-bytes
) & 3);
249 extern char **xstrtokenize(const char *str
, const char *separators
);
250 extern void FormatInt64(int64_t num
, char *string
);
251 extern void FormatUInt64(uint64_t num
, char *string
);
252 extern void FormatUInt64Hex(uint64_t num
, char *string
);
253 extern void FormatDouble(double dbl
, char *string
);
256 * Compare the two version numbers comprising of major.minor.
258 * @return A value less than 0 if a is less than b, 0 if a is equal to b,
259 * or a value greater than 0
262 version_compare(uint16_t a_major
, uint16_t a_minor
,
263 uint16_t b_major
, uint16_t b_minor
)
267 a
= a_major
<< 16 | a_minor
;
268 b
= b_major
<< 16 | b_minor
;
273 /* some macros to help swap requests, replies, and events */
275 #define LengthRestB(stuff) \
276 ((client->req_len << 2) - sizeof(*stuff))
278 #define LengthRestS(stuff) \
279 ((client->req_len << 1) - (sizeof(*stuff) >> 1))
281 #define LengthRestL(stuff) \
282 (client->req_len - (sizeof(*stuff) >> 2))
284 #define SwapRestS(stuff) \
285 SwapShorts((short *)(stuff + 1), LengthRestS(stuff))
287 #define SwapRestL(stuff) \
288 SwapLongs((CARD32 *)(stuff + 1), LengthRestL(stuff))
290 #if defined(__GNUC__) && ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))
291 void __attribute__ ((error("wrong sized variable passed to swap")))
300 #if !(defined(__GNUC__) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590)))
302 __builtin_constant_p(int x
)
308 /* byte swap a 64-bit value */
310 swap_uint64(uint64_t *x
)
315 ((char *) x
)[0] = ((char *) x
)[7];
319 ((char *) x
)[1] = ((char *) x
)[6];
323 ((char *) x
)[2] = ((char *) x
)[5];
327 ((char *) x
)[3] = ((char *) x
)[4];
331 #define swapll(x) do { \
332 if (sizeof(*(x)) != 8) \
334 swap_uint64((uint64_t *)(x)); \
337 /* byte swap a 32-bit value */
339 swap_uint32(uint32_t * x
)
341 char n
= ((char *) x
)[0];
343 ((char *) x
)[0] = ((char *) x
)[3];
346 ((char *) x
)[1] = ((char *) x
)[2];
350 #define swapl(x) do { \
351 if (sizeof(*(x)) != 4) \
353 if (__builtin_constant_p((uintptr_t)(x) & 3) && ((uintptr_t)(x) & 3) == 0) \
354 *(x) = lswapl(*(x)); \
356 swap_uint32((uint32_t *)(x)); \
359 /* byte swap a 16-bit value */
361 swap_uint16(uint16_t * x
)
363 char n
= ((char *) x
)[0];
365 ((char *) x
)[0] = ((char *) x
)[1];
369 #define swaps(x) do { \
370 if (sizeof(*(x)) != 2) \
372 if (__builtin_constant_p((uintptr_t)(x) & 1) && ((uintptr_t)(x) & 1) == 0) \
373 *(x) = lswaps(*(x)); \
375 swap_uint16((uint16_t *)(x)); \
378 /* copy 32-bit value from src to dst byteswapping on the way */
379 #define cpswapl(src, dst) do { \
380 if (sizeof((src)) != 4 || sizeof((dst)) != 4) \
382 (dst) = lswapl((src)); \
385 /* copy short from src to dst byteswapping on the way */
386 #define cpswaps(src, dst) do { \
387 if (sizeof((src)) != 2 || sizeof((dst)) != 2) \
389 (dst) = lswaps((src)); \
392 extern _X_EXPORT
void SwapLongs(CARD32
*list
, unsigned long count
);
394 extern _X_EXPORT
void SwapShorts(short *list
, unsigned long count
);
396 extern _X_EXPORT
void MakePredeclaredAtoms(void);
398 extern _X_EXPORT
int Ones(unsigned long /*mask */ );
400 typedef struct _xPoint
*DDXPointPtr
;
401 typedef struct pixman_box16
*BoxPtr
;
402 typedef struct _xEvent
*xEventPtr
;
403 typedef struct _xRectangle
*xRectanglePtr
;
404 typedef struct _GrabRec
*GrabPtr
;
406 /* typedefs from other places - duplicated here to minimize the amount
407 * of unnecessary junk that one would normally have to include to get
408 * these symbols defined
411 #ifndef _XTYPEDEF_CHARINFOPTR
412 typedef struct _CharInfo
*CharInfoPtr
; /* also in fonts/include/font.h */
414 #define _XTYPEDEF_CHARINFOPTR
417 extern _X_EXPORT
unsigned long globalSerialNumber
;
418 extern _X_EXPORT
unsigned long serverGeneration
;
420 /* Don't use this directly, use BUG_WARN or BUG_WARN_MSG instead */
421 #define __BUG_WARN_MSG(cond, with_msg, ...) \
423 ErrorFSigSafe("BUG: triggered 'if (" #cond ")'\n"); \
424 ErrorFSigSafe("BUG: %s:%u in %s()\n", \
425 __FILE__, __LINE__, __func__); \
426 if (with_msg) ErrorFSigSafe(__VA_ARGS__); \
430 #define BUG_WARN_MSG(cond, ...) \
431 __BUG_WARN_MSG(cond, 1, __VA_ARGS__)
433 #define BUG_WARN(cond) __BUG_WARN_MSG(cond, 0, NULL)
435 #define BUG_RETURN(cond) \
436 do { if (cond) { __BUG_WARN_MSG(cond, 0, NULL); return; } } while(0)
438 #define BUG_RETURN_MSG(cond, ...) \
439 do { if (cond) { __BUG_WARN_MSG(cond, 1, __VA_ARGS__); return; } } while(0)
441 #define BUG_RETURN_VAL(cond, val) \
442 do { if (cond) { __BUG_WARN_MSG(cond, 0, NULL); return (val); } } while(0)
444 #define BUG_RETURN_VAL_MSG(cond, val, ...) \
445 do { if (cond) { __BUG_WARN_MSG(cond, 1, __VA_ARGS__); return (val); } } while(0)