Xlibint.h revision 677833bc953b6cb418c701facbdcf4aa18d6c44e
/* $Xorg: Xlibint.h,v 1.5 2001/02/09 02:03:38 xorgcvs Exp $ */
/*
Copyright 1984, 1985, 1987, 1989, 1998 The Open Group
Permission to use, copy, modify, distribute, and sell this software and its
documentation for any purpose is hereby granted without fee, provided that
the above copyright notice appear in all copies and that both that
copyright notice and this permission notice appear in supporting
documentation.
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
Except as contained in this notice, the name of The Open Group shall
not be used in advertising or otherwise to promote the sale, use or
other dealings in this Software without prior written authorization
from The Open Group.
*/
#ifndef _XLIBINT_H_
#define _XLIBINT_H_ 1
/*
* Xlibint.h - Header definition and support file for the internal
* support routines used by the C subroutine interface
* library (Xlib) to the X Window System.
*
* Warning, there be dragons here....
*/
#ifdef WIN32
#endif
/*
* If your BytesReadable correctly detects broken connections, then
* you should NOT define XCONN_CHECK_FREQ.
*/
#ifndef XCONN_CHECK_FREQ
#define XCONN_CHECK_FREQ 256
#endif
struct _XGC
{
unsigned long dirty;/* cache dirty bits */
};
struct _XDisplay
{
int fd; /* Network socket. */
int conn_checker; /* ugly thing used by _XEventsQueued */
int proto_major_version;/* maj. version of server's X protocol */
int proto_minor_version;/* minor version of server's X protocol */
char *vendor; /* vendor of the server hardware */
int resource_shift; /* allocator shift to correct bits */
struct _XDisplay*
);
int byte_order; /* screen byte order, LSBFirst, MSBFirst */
int bitmap_unit; /* padding and data requirements */
int bitmap_pad; /* padding requirements on bitmaps */
int bitmap_bit_order; /* LeastSignificant or MostSignificant */
int nformats; /* number of pixmap formats in list */
int vnumber; /* Xlib's X protocol version number. */
int release; /* release of the server */
int qlen; /* Length of input event queue */
unsigned long last_request_read; /* seq number of last event read */
unsigned long request; /* sequence number of last request. */
char *last_req; /* beginning of last request, or dummy */
char *buffer; /* Output buffer starting address. */
char *bufptr; /* Output buffer index pointer. */
char *bufmax; /* Output buffer maximum+1 address. */
unsigned max_request_size; /* maximum number 32 bit words in request*/
struct _XrmHashBucketRec *db;
int (*synchandler)( /* Synchronization handler */
struct _XDisplay*
);
char *display_name; /* "host:display" string used on this connect*/
int default_screen; /* default screen for operations */
int nscreens; /* number of screens on this server*/
unsigned long motion_buffer; /* size of motion buffer */
unsigned long flags; /* internal connection flags */
int min_keycode; /* minimum defined keycode */
int max_keycode; /* maximum defined keycode */
int keysyms_per_keycode;/* number of rows */
char *xdefaults; /* contents of defaults from server */
char *scratch_buffer; /* place to hang scratch buffer */
unsigned long scratch_length; /* length of scratch buffer */
int ext_number; /* extension number on this display */
/*
* the following can be fixed size, as the protocol defines how
* much address space is available.
* While this could be done using the extension vector, there
* may be MANY events processed, so a search through the extension
* list to find the right procedure for each event might be
* expensive if many extensions are being used.
*/
Display * /* dpy */,
XEvent * /* re */,
xEvent * /* event */
);
Display * /* dpy */,
XEvent * /* re */,
xEvent * /* event */
);
unsigned long bigreq_size; /* max size of big requests */
void (*idlist_alloc)( /* XID list allocator function */
Display * /* dpy */,
XID * /* ids */,
int /* count */
);
/* things above this line should not move, for binary compatibility */
unsigned int mode_switch; /* keyboard group modifiers */
unsigned int num_lock; /* keyboard numlock modifiers */
Display * /* display */,
XErrorEvent * /* he */,
xError * /* we */
);
/*
* Xcms information
*/
struct {
/* linked list of XcmsIntensityMap */
} cms;
struct _XIMFilter *im_filters;
unsigned long next_event_serial_num; /* inserted into next queue elt */
int im_fd_length; /* number of im_fd_info */
int watcher_count; /* number of conn_watchers */
int (*savedsynchandler)( /* user synchandler when Xlib usurps */
Display * /* dpy */
);
int xcmisc_opcode; /* major opcode for XC-MISC */
};
/*
* define the following if you want the Data macro to be a procedure instead
*/
#ifdef CRAY
#define DataRoutineIsProcedure
#endif /* CRAY */
#ifndef _XEVENT_
/*
* _QEvent datatype for use in input queueing.
*/
typedef struct _XSQEvent
{
unsigned long qserial_num; /* so multi-threaded code can find new ones */
} _XQEvent;
#endif
#ifdef XTHREADS /* for xReply */
#define NEED_REPLIES
#endif
#define NEED_EVENTS
#define NEED_REPLIES
#ifdef __sgi
#define _SGI_MP_SOURCE /* turn this on to get MP safe errno */
#endif
#include <errno.h>
#define _XBCOPYFUNC _Xbcopy
/* Utek leaves kernel macros around in include files (bleah) */
#ifdef dirty
#endif
#include <stdlib.h>
#include <string.h>
#include <X11/Xfuncproto.h>
/*
* The following definitions can be used for locking requests in multi-threaded
* address spaces.
*/
#ifdef XTHREADS
/* Author: Stephen Gildea, MIT X Consortium
*
* declarations for C Threads locking
*/
typedef struct _LockInfoRec *LockInfoPtr;
/* interfaces for locking.c */
struct _XLockPtrs {
/* used by all, including extensions; do not move */
void (*lock_display)(
#if defined(XTHREADS_WARN) || defined(XTHREADS_FILE_LINE)
, char *file
, int line
#endif
);
void (*unlock_display)(
#if defined(XTHREADS_WARN) || defined(XTHREADS_FILE_LINE)
, char *file
, int line
#endif
);
};
#define _XCreateMutex_fn (*_XCreateMutex_fn_p)
#define _XFreeMutex_fn (*_XFreeMutex_fn_p)
#define _XLockMutex_fn (*_XLockMutex_fn_p)
#define _XUnlockMutex_fn (*_XUnlockMutex_fn_p)
#define _Xglobal_lock (*_Xglobal_lock_p)
#endif
/* in XlibInt.c */
extern void (*_XCreateMutex_fn)(
LockInfoPtr /* lock */
);
extern void (*_XFreeMutex_fn)(
LockInfoPtr /* lock */
);
extern void (*_XLockMutex_fn)(
LockInfoPtr /* lock */
#if defined(XTHREADS_WARN) || defined(XTHREADS_FILE_LINE)
, char * /* file */
, int /* line */
#endif
);
extern void (*_XUnlockMutex_fn)(
LockInfoPtr /* lock */
#if defined(XTHREADS_WARN) || defined(XTHREADS_FILE_LINE)
, char * /* file */
, int /* line */
#endif
);
extern LockInfoPtr _Xglobal_lock;
#if defined(XTHREADS_WARN) || defined(XTHREADS_FILE_LINE)
#else
/* used everywhere, so must be fast if not using threads */
#endif
#else /* XTHREADS */
#define LockDisplay(dis)
#define _XLockMutex(lock)
#define _XUnlockMutex(lock)
#define UnlockDisplay(dis)
#define _XCreateMutex(lock)
#define _XFreeMutex(lock)
#endif
/*
* Note that some machines do not return a valid pointer for malloc(0), in
* which case we provide an alternate under the control of the
* define MALLOC_0_RETURNS_NULL. This is necessary because some
* Xlib code expects malloc(0) to return a valid pointer to storage.
*/
#ifdef MALLOC_0_RETURNS_NULL
#else
#endif
#include <stddef.h>
#define LOCKED 1
#define UNLOCKED 0
#ifndef BUFSIZE
#endif
#ifndef PTSPERBATCH
#endif
#ifndef WLNSPERBATCH
#endif
#ifndef ZLNSPERBATCH
#endif
#ifndef WRCTSPERBATCH
#endif
#ifndef ZRCTSPERBATCH
#endif
#ifndef FRCTSPERBATCH
#endif
#ifndef FARCSPERBATCH
#endif
#ifndef CURSORFONT
#endif
/*
* Display flags
*/
#define XlibDisplayIOError (1L << 0)
/*
* X Protocol packetizing macros.
*/
/* Need to start requests on 64 bit word boundaries
* on a CRAY computer so add a NoOp (127) if needed.
* A character pointer on a CRAY computer will be non-zero
* after shifting right 61 bits of it is not pointing to
* a word boundary.
*/
#ifdef WORD64
}
#else /* else does not require alignment on 64-bit boundaries */
#define WORD64ALIGN
#endif /* WORD64 */
/*
* GetReq - Get the next available X request packet in the buffer and
* return it.
*
* "name" is the name of the request, e.g. CreatePixmap, OpenFont, etc.
* "req" is the name of the request pointer.
*
*/
#else /* non-ANSI C uses empty comment instead of "##" for token concatenation */
#endif
/* GetReqExtra is the same as GetReq, but allocates "n" additional
bytes after the request. "n" must be a multiple of 4! */
#else
#endif
/*
* GetResReq is for those requests that have a resource ID
* (Window, Pixmap, GContext, etc.) as their single argument.
* "rid" is the name of the resource.
*/
#else
#endif
/*
* GetEmptyReq is for those requests that have no arguments
* at all.
*/
#else
#endif
#ifdef WORD64
#define MakeBigReq(req,n) \
{ \
char _BRdat[4]; \
}
#else
#ifdef LONG64
#define MakeBigReq(req,n) \
{ \
}
#else
#define MakeBigReq(req,n) \
{ \
}
#endif
#endif
if (dpy->bigreq_size) { \
MakeBigReq(req,n) \
} else { \
n = badlen; \
} \
} else \
#define SyncHandle() \
/*
* Data - Place data in the buffer and pad the end to provide
* 32 bit word alignment. Transmit if the buffer fills.
*
* "dpy" is a pointer to a Display.
* "data" is a pinter to a data buffer.
* "len" is the length of the data buffer.
*/
#ifndef DataRoutineIsProcedure
} else\
}
#endif /* DataRoutineIsProcedure */
/* Allocate bytes from the buffer. No padding is done, so if
* the length is not a multiple of 4, the caller must be
* careful to leave the buffer aligned after sending the
* current request.
*
* "type" is the type of the pointer being assigned to.
* "ptr" is the pointer being assigned to.
* "n" is the number of bytes to allocate.
*
* Example:
* xTextElt *elt;
* BufAlloc (xTextElt *, elt, nbytes)
*/
(void)ptr; \
#ifdef WORD64
#else
#ifdef LONG64
extern int _XData32(
register long *data,
unsigned len
);
extern void _XRead32(
register long *data,
long len
);
#else
#endif
#endif /* not WORD64 */
/* Xlib manual is bogus */
#define min(a,b) (((a) < (b)) ? (a) : (b))
#define max(a,b) (((a) > (b)) ? (a) : (b))
/*
* CI_GET_CHAR_INFO_1D - return the charinfo struct for the indicated 8bit
* character. If the character is in the column and exists, then return the
* appropriate metrics (note that fonts with common per-character metrics will
* return min_bounds). If none of these hold true, try again with the default
* char.
*/
{ \
} else { \
} \
} \
}
/*
* CI_GET_CHAR_INFO_2D - return the charinfo struct for the indicated row and
* column. This is used for fonts that have more than row zero.
*/
{ \
} else { \
(fs->max_char_or_byte2 - \
} \
} \
}
{ \
}
#ifdef MUSTCOPY
/* for when 32-bit alignment is not good enough */
#else
/* srcvar must be a variable for large architecture version */
#endif /* MUSTCOPY */
typedef struct _XInternalAsync {
struct _XInternalAsync *next;
/*
* handler arguments:
* rep is the generic reply that caused this handler
* to be invoked. It must also be passed to _XGetAsyncReply.
* buf and len are opaque values that must be passed to
* _XGetAsyncReply or _XGetAsyncData.
* data is the closure stored in this struct.
* The handler returns True iff it handled this reply.
*/
Display* /* dpy */,
xReply* /* rep */,
char* /* buf */,
int /* len */,
XPointer /* data */
);
typedef struct _XAsyncEState {
unsigned long min_sequence_number;
unsigned long max_sequence_number;
unsigned char error_code;
unsigned char major_opcode;
unsigned short minor_opcode;
unsigned char last_error_received;
int error_count;
else \
}
typedef void (*FreeFuncType) (
Display* /* display */
);
typedef int (*FreeModmapType) (
XModifierKeymap* /* modmap */
);
/*
* This structure is private to the library.
*/
typedef struct _XFreeFuncs {
/* types for InitExt.c */
typedef int (*CreateGCType) (
Display* /* display */,
GC /* gc */,
XExtCodes* /* codes */
);
typedef int (*CopyGCType)(
Display* /* display */,
GC /* gc */,
XExtCodes* /* codes */
);
typedef int (*FlushGCType) (
Display* /* display */,
GC /* gc */,
XExtCodes* /* codes */
);
typedef int (*FreeGCType) (
Display* /* display */,
GC /* gc */,
XExtCodes* /* codes */
);
typedef int (*CreateFontType) (
Display* /* display */,
XFontStruct* /* fs */,
XExtCodes* /* codes */
);
typedef int (*FreeFontType) (
Display* /* display */,
XFontStruct* /* fs */,
XExtCodes* /* codes */
);
typedef int (*CloseDisplayType) (
Display* /* display */,
XExtCodes* /* codes */
);
typedef int (*ErrorType) (
Display* /* display */,
xError* /* err */,
XExtCodes* /* codes */,
int* /* ret_code */
);
typedef char* (*ErrorStringType) (
Display* /* display */,
int /* code */,
XExtCodes* /* codes */,
char* /* buffer */,
int /* nbytes */
);
typedef void (*PrintErrorType)(
Display* /* display */,
XErrorEvent* /* ev */,
void* /* fp */
);
typedef void (*BeforeFlushType)(
Display* /* display */,
XExtCodes* /* codes */,
_Xconst char* /* data */,
long /* len */
);
/*
* This structure is private to the library.
*/
typedef struct _XExten { /* private to extension mechanism */
char *name; /* name of this extension */
} _XExtension;
/* extension hooks */
#ifdef DataRoutineIsProcedure
#endif
extern int _XError(
Display* /* dpy */,
xError* /* rep */
);
extern int _XIOError(
Display* /* dpy */
);
extern int (*_XIOErrorFunction)(
Display* /* dpy */
);
extern int (*_XErrorFunction)(
Display* /* dpy */,
XErrorEvent* /* error_event */
);
extern void _XEatData(
Display* /* dpy */,
unsigned long /* n */
);
extern char *_XAllocScratch(
Display* /* dpy */,
unsigned long /* nbytes */
);
extern char *_XAllocTemp(
Display* /* dpy */,
unsigned long /* nbytes */
);
extern void _XFreeTemp(
Display* /* dpy */,
char* /* buf */,
unsigned long /* nbytes */
);
extern Visual *_XVIDtoVisual(
Display* /* dpy */,
VisualID /* id */
);
extern unsigned long _XSetLastRequestRead(
Display* /* dpy */,
xGenericReply* /* rep */
);
extern int _XGetHostname(
char* /* buf */,
int /* maxlen */
);
extern Screen *_XScreenOfWindow(
Display* /* dpy */,
Window /* w */
);
extern Bool _XAsyncErrorHandler(
Display* /* dpy */,
xReply* /* rep */,
char* /* buf */,
int /* len */,
XPointer /* data */
);
extern char *_XGetAsyncReply(
Display* /* dpy */,
char* /* replbuf */,
xReply* /* rep */,
char* /* buf */,
int /* len */,
int /* extra */,
Bool /* discard */
);
extern void _XGetAsyncData(
Display* /* dpy */,
char * /* data */,
char * /* buf */,
int /* len */,
int /* skip */,
int /* datalen */,
int /* discardtotal */
);
extern void _XFlush(
Display* /* dpy */
);
extern int _XEventsQueued(
Display* /* dpy */,
int /* mode */
);
extern void _XReadEvents(
Display* /* dpy */
);
extern int _XRead(
Display* /* dpy */,
char* /* data */,
long /* size */
);
extern void _XReadPad(
Display* /* dpy */,
char* /* data */,
long /* size */
);
extern void _XSend(
Display* /* dpy */,
_Xconst char* /* data */,
long /* size */
);
Display* /* dpy */,
xReply* /* rep */,
int /* extra */,
Bool /* discard */
);
extern void _XEnq(
Display* /* dpy */,
xEvent* /* event */
);
extern void _XDeq(
Display* /* dpy */,
_XQEvent* /* prev */,
_XQEvent* /* qelt */
);
extern Bool _XUnknownWireEvent(
Display* /* dpy */,
XEvent* /* re */,
xEvent* /* event */
);
extern Status _XUnknownNativeEvent(
Display* /* dpy */,
XEvent* /* re */,
xEvent* /* event */
);
extern int _XFreeExtData(
XExtData* /* extension */
);
extern int (*XESetCreateGC(
Display* /* display */,
int /* extension */,
int (*) (
Display* /* display */,
GC /* gc */,
XExtCodes* /* codes */
) /* proc */
))(
);
extern int (*XESetCopyGC(
Display* /* display */,
int /* extension */,
int (*) (
Display* /* display */,
GC /* gc */,
XExtCodes* /* codes */
) /* proc */
))(
);
extern int (*XESetFlushGC(
Display* /* display */,
int /* extension */,
int (*) (
Display* /* display */,
GC /* gc */,
XExtCodes* /* codes */
) /* proc */
))(
);
extern int (*XESetFreeGC(
Display* /* display */,
int /* extension */,
int (*) (
Display* /* display */,
GC /* gc */,
XExtCodes* /* codes */
) /* proc */
))(
);
extern int (*XESetCreateFont(
Display* /* display */,
int /* extension */,
int (*) (
Display* /* display */,
XFontStruct* /* fs */,
XExtCodes* /* codes */
) /* proc */
))(
);
extern int (*XESetFreeFont(
Display* /* display */,
int /* extension */,
int (*) (
Display* /* display */,
XFontStruct* /* fs */,
XExtCodes* /* codes */
) /* proc */
))(
);
extern int (*XESetCloseDisplay(
Display* /* display */,
int /* extension */,
int (*) (
Display* /* display */,
XExtCodes* /* codes */
) /* proc */
))(
);
extern int (*XESetError(
Display* /* display */,
int /* extension */,
int (*) (
Display* /* display */,
xError* /* err */,
XExtCodes* /* codes */,
int* /* ret_code */
) /* proc */
))(
);
extern char* (*XESetErrorString(
Display* /* display */,
int /* extension */,
char* (*) (
Display* /* display */,
int /* code */,
XExtCodes* /* codes */,
char* /* buffer */,
int /* nbytes */
) /* proc */
))(
);
extern void (*XESetPrintErrorValues (
Display* /* display */,
int /* extension */,
void (*)(
Display* /* display */,
XErrorEvent* /* ev */,
void* /* fp */
) /* proc */
))(
Display*, XErrorEvent*, void*
);
extern Bool (*XESetWireToEvent(
Display* /* display */,
int /* event_number */,
Bool (*) (
Display* /* display */,
XEvent* /* re */,
xEvent* /* event */
) /* proc */
))(
);
extern Status (*XESetEventToWire(
Display* /* display */,
int /* event_number */,
Status (*) (
Display* /* display */,
XEvent* /* re */,
xEvent* /* event */
) /* proc */
))(
);
extern Bool (*XESetWireToError(
Display* /* display */,
int /* error_number */,
Bool (*) (
Display* /* display */,
XErrorEvent* /* he */,
xError* /* we */
) /* proc */
))(
);
extern void (*XESetBeforeFlush(
Display* /* display */,
int /* error_number */,
void (*) (
Display* /* display */,
XExtCodes* /* codes */,
_Xconst char* /* data */,
long /* len */
) /* proc */
))(
);
/* internal connections for IMs */
typedef void (*_XInternalConnectionProc)(
Display* /* dpy */,
int /* fd */,
XPointer /* call_data */
);
extern Status _XRegisterInternalConnection(
Display* /* dpy */,
int /* fd */,
_XInternalConnectionProc /* callback */,
XPointer /* call_data */
);
extern void _XUnregisterInternalConnection(
Display* /* dpy */,
int /* fd */
);
/* Display structure has pointers to these */
struct _XConnectionInfo { /* info from _XRegisterInternalConnection */
int fd;
struct _XConnectionInfo *next;
};
struct _XConnWatchInfo { /* info from XAddConnectionWatch */
struct _XConnWatchInfo *next;
};
#ifdef __UNIXOS2__
extern char* __XOS2RedirRoot(
char*
);
#endif
extern int _XTextHeight(
XFontStruct* /* font_struct */,
_Xconst char* /* string */,
int /* count */
);
extern int _XTextHeight16(
XFontStruct* /* font_struct */,
int /* count */
);
#if defined(WIN32)
extern int _XOpenFile(
_Xconst char* /* path */,
int /* flags */
);
extern void* _XFopenFile(
_Xconst char* /* path */,
_Xconst char* /* mode */
);
extern int _XAccessFile(
_Xconst char* /* path */
);
#else
#endif
/* EvToWire.c */
extern int _XF86LoadQueryLocaleFont(
Display* /* dpy */,
_Xconst char* /* name*/,
XFontStruct** /* xfp*/,
Font* /* fidp */
);
extern void _XProcessWindowAttributes (
register unsigned long valuemask,
register XSetWindowAttributes *attributes);
extern int _XDefaultError(
XErrorEvent *event);
extern int _XDefaultIOError(
extern void _XSetClipRectangles (
int clip_x_origin, int clip_y_origin,
int n,
int ordering);
Window w,
int _XPutBackEvent (
#endif /* _XLIBINT_H_ */