Commit 282b071a authored by dscho's avatar dscho

dropped miregion and all the X stuff in favour of Wez' sraRegion, added dox

parent c30ded8d
CC=cc #CC=cc
CFLAGS=-g -Wall CFLAGS=-g -Wall
#CFLAGS=-O2 -Wall #CFLAGS=-O2 -Wall
RANLIB=ranlib RANLIB=ranlib
INCLUDES=-I. -Iinclude INCLUDES=-I.
VNCSERVERLIB=-L. -lvncserver -L/usr/local/lib -lz -ljpeg VNCSERVERLIB=-L. -lvncserver -L/usr/local/lib -lz -ljpeg
# These two lines enable useage of PThreads # These two lines enable useage of PThreads
...@@ -17,11 +17,11 @@ OSX_LIBS = -framework ApplicationServices -framework Carbon ...@@ -17,11 +17,11 @@ OSX_LIBS = -framework ApplicationServices -framework Carbon
# for Example # for Example
SOURCES=main.c rfbserver.c miregion.c auth.c sockets.c xalloc.c \ SOURCES=main.c rfbserver.c sraRegion.c auth.c sockets.c \
stats.c corre.c hextile.c rre.c translate.c cutpaste.c \ stats.c corre.c hextile.c rre.c translate.c cutpaste.c \
zlib.c tight.c httpd.c cursor.o \ zlib.c tight.c httpd.c cursor.o \
d3des.c vncauth.c d3des.c vncauth.c
OBJS=main.o rfbserver.o miregion.o auth.o sockets.o xalloc.o \ OBJS=main.o rfbserver.o sraRegion.o auth.o sockets.o \
stats.o corre.o hextile.o rre.o translate.o cutpaste.o \ stats.o corre.o hextile.o rre.o translate.o cutpaste.o \
zlib.o tight.o httpd.o cursor.o \ zlib.o tight.o httpd.o cursor.o \
d3des.o vncauth.o d3des.o vncauth.o
...@@ -50,9 +50,15 @@ OSXvnc-server: mac.o libvncserver.a ...@@ -50,9 +50,15 @@ OSXvnc-server: mac.o libvncserver.a
storepasswd: storepasswd.o d3des.o vncauth.o storepasswd: storepasswd.o d3des.o vncauth.o
$(CC) -o storepasswd storepasswd.o d3des.o vncauth.o $(CC) -o storepasswd storepasswd.o d3des.o vncauth.o
sratest: sratest.o
$(CC) -o sratest sratest.o
sratest.o: sraRegion.c
$(CC) $(CFLAGS) $(INCLUDES) -DSRA_TEST -c -o sratest.o sraRegion.c
clean: clean:
rm -f $(OBJS) *~ core "#"* *.bak *.orig storepasswd.o \ rm -f $(OBJS) *~ core "#"* *.bak *.orig storepasswd.o \
mac.o example.o pnmshow.o $(OBJS) mac.o example.o pnmshow.o sratest.o $(OBJS)
realclean: clean realclean: clean
rm -f OSXvnc-server storepasswd example pnmshow libvncserver.a rm -f OSXvnc-server storepasswd example pnmshow libvncserver.a
......
...@@ -18,17 +18,45 @@ There are two examples included: ...@@ -18,17 +18,45 @@ There are two examples included:
The examples are not too well documented, but easy straight forward and a The examples are not too well documented, but easy straight forward and a
good starting point. good starting point.
Try example: it outputs on which port it listens (default: 5900), so it is
display 0. To view, call
vncviewer :0
You should see a sheet with a gradient and "Hello World!" written on it. Try
to paint something. Note that everytime you click, there is some bigger blot.
The size depends on the mouse button you click. Open a second vncviewer with
the same parameters and watch it as you paint in the other window. This also
works over internet. You just have to know either the name or the IP of your
machine. Then it is
vncviewer machine.where.example.runs.com:0
or similar for the remote client. Now you are ready to type something. Be sure
that your mouse sits still, because everytime the mouse moves, the cursor is
reset! If you are done with that demo, just press Escape in the viewer. Note
that the server still runs, even if you closed both windows. When you
reconnect now, everything you painted and wrote is still there. So you press
"Page Up" for a blank page.
The demo pnmshow is much simpler: you either provide a filename as argument
or pipe a file through stdin. Note that the file has to be a raw pnm/ppm file,
i.e. a truecolour graphics. Only the Escape key is implemented. This may be
the best starting point if you want to learn how to use LibVNCServer. You
are confronted with the fact that the bytes per pixel can only be 8, 16 or 32.
How to use How to use
---------- ----------
To make a server, you just have to initialise a server structure using the To make a server, you just have to initialise a server structure using the
function rfbDefaultScreenInit, like function rfbDefaultScreenInit, like
rfbScreenInfoPtr rfbScreen = rfbScreenInfoPtr rfbScreen =
rfbGetScreen(argc,argv,maxx,maxy,8,3,bpp); rfbGetScreen(argc,argv,width,height,8,3,bpp);
where byte per pixel is 1, 2 or 4. This is so because of speed considerations
(you can use native data types of that width).
You then can set hooks and io functions (see below) or other You then can set hooks and io functions (see below) or other
options (see below). options (see below).
And you allocate the frame buffer like this:
rfbScreen->frameBuffer = (char*)malloc(width*height*bpp);
After that, you initialize the server, like After that, you initialize the server, like
rfbInitServer(rfbScreen); rfbInitServer(rfbScreen);
...@@ -60,6 +88,11 @@ that network traffic is low, and also the cursor doesn't need to be ...@@ -60,6 +88,11 @@ that network traffic is low, and also the cursor doesn't need to be
drawn the cursor everytime an update is sent. LibVNCServer handles drawn the cursor everytime an update is sent. LibVNCServer handles
all the details. Just set the cursor and don't bother any more. all the details. Just set the cursor and don't bother any more.
To set the mouse coordinates (or emulate mouse clicks), call
defaultPtrAddEvent(buttonMask,x,y,cl);
However, this works only if your client doesn't do local cursor drawing. There
is no way (to my knowledge) to set the pointer of a client via RFB protocol.
What is the difference between rfbScreenInfoPtr and rfbClientPtr? What is the difference between rfbScreenInfoPtr and rfbClientPtr?
----------------------------------------------------------------- -----------------------------------------------------------------
...@@ -121,6 +154,9 @@ kbdReleaseAllKeys(rfbClientPtr cl) ...@@ -121,6 +154,9 @@ kbdReleaseAllKeys(rfbClientPtr cl)
is not called at all (maybe in the future). is not called at all (maybe in the future).
ptrAddEvent(int buttonMask,int x,int y,rfbClientPtr cl) ptrAddEvent(int buttonMask,int x,int y,rfbClientPtr cl)
is called when the mouse moves or a button is pressed. is called when the mouse moves or a button is pressed.
WARNING: if you want to have proper cursor handling, call
defaultPtrAddEvent(buttonMask,x,y,cl)
in your own function. This sets the coordinates of the cursor.
setXCutText(char* str,int len,rfbClientPtr cl) setXCutText(char* str,int len,rfbClientPtr cl)
is called when the selection changes. is called when the selection changes.
......
...@@ -10,7 +10,6 @@ in the works: ...@@ -10,7 +10,6 @@ in the works:
adapt rdp2vnc (rdesktop) adapt rdp2vnc (rdesktop)
optionally dont draw rich cursors as xcursors optionally dont draw rich cursors as xcursors
use sraRegion from Wez instead of miregion, because it is much smaller
later: later:
------ ------
...@@ -32,4 +31,5 @@ done: ...@@ -32,4 +31,5 @@ done:
.other encodings .other encodings
.test drawing of cursors when not using xcursor or rich cursor encoding .test drawing of cursors when not using xcursor or rich cursor encoding
fix bug with odd width (depends on client depth: width has to be multiple of server.bytesPerPixel/client.bytesPerPixel). only raw!! -> bug of vncviewer! fix bug with odd width (depends on client depth: width has to be multiple of server.bytesPerPixel/client.bytesPerPixel). only raw!! -> bug of vncviewer!
.use sraRegion from Wez instead of miregion, because it is much smaller
/*
* $XConsortium: X.h,v 1.69 94/04/17 20:10:48 dpw Exp $
*/
/* Definitions for the X window system likely to be used by applications */
#ifndef X_H
#define X_H
/***********************************************************
Copyright (c) 1987 X Consortium
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
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
X CONSORTIUM 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 X Consortium 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 X Consortium.
Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
All Rights Reserved
Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the name of Digital not be
used in advertising or publicity pertaining to distribution of the
software without specific, written prior permission.
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
SOFTWARE.
******************************************************************/
#define X_PROTOCOL 11 /* current protocol version */
#define X_PROTOCOL_REVISION 0 /* current minor version */
/* Resources */
/*
* _XSERVER64 must ONLY be defined when compiling X server sources on
* systems where unsigned long is not 32 bits, must NOT be used in
* client or library code.
*/
#ifndef _XSERVER64
typedef unsigned long XID;
typedef unsigned long Mask;
typedef unsigned long Atom;
typedef unsigned long VisualID;
typedef unsigned long Time;
#else
#include <X11/Xmd.h>
typedef CARD32 XID;
typedef CARD32 Mask;
typedef CARD32 Atom;
typedef CARD32 VisualID;
typedef CARD32 Time;
#endif
typedef XID Window;
typedef XID Drawable;
typedef XID Font;
typedef XID Pixmap;
typedef XID X11Cursor; /* conflict with CoreGraphics */
typedef XID Colormap;
typedef XID GContext;
typedef XID KeySym;
typedef unsigned char KeyCode;
/*****************************************************************
* RESERVED RESOURCE AND CONSTANT DEFINITIONS
*****************************************************************/
#define None 0L /* universal null resource or null atom */
#define ParentRelative 1L /* background pixmap in CreateWindow
and ChangeWindowAttributes */
#define CopyFromParent 0L /* border pixmap in CreateWindow
and ChangeWindowAttributes
special VisualID and special window
class passed to CreateWindow */
#define PointerWindow 0L /* destination window in SendEvent */
#define InputFocus 1L /* destination window in SendEvent */
#define PointerRoot 1L /* focus window in SetInputFocus */
#define AnyPropertyType 0L /* special Atom, passed to GetProperty */
#define AnyKey 0L /* special Key Code, passed to GrabKey */
#define AnyButton 0L /* special Button Code, passed to GrabButton */
#define AllTemporary 0L /* special Resource ID passed to KillClient */
#define CurrentTime 0L /* special Time */
#define NoSymbol 0L /* special KeySym */
/*****************************************************************
* EVENT DEFINITIONS
*****************************************************************/
/* Input Event Masks. Used as event-mask window attribute and as arguments
to Grab requests. Not to be confused with event names. */
#define NoEventMask 0L
#define KeyPressMask (1L<<0)
#define KeyReleaseMask (1L<<1)
#define ButtonPressMask (1L<<2)
#define ButtonReleaseMask (1L<<3)
#define EnterWindowMask (1L<<4)
#define LeaveWindowMask (1L<<5)
#define PointerMotionMask (1L<<6)
#define PointerMotionHintMask (1L<<7)
#define Button1MotionMask (1L<<8)
#define Button2MotionMask (1L<<9)
#define Button3MotionMask (1L<<10)
#define Button4MotionMask (1L<<11)
#define Button5MotionMask (1L<<12)
#define ButtonMotionMask (1L<<13)
#define KeymapStateMask (1L<<14)
#define ExposureMask (1L<<15)
#define VisibilityChangeMask (1L<<16)
#define StructureNotifyMask (1L<<17)
#define ResizeRedirectMask (1L<<18)
#define SubstructureNotifyMask (1L<<19)
#define SubstructureRedirectMask (1L<<20)
#define FocusChangeMask (1L<<21)
#define PropertyChangeMask (1L<<22)
#define ColormapChangeMask (1L<<23)
#define OwnerGrabButtonMask (1L<<24)
/* Event names. Used in "type" field in XEvent structures. Not to be
confused with event masks above. They start from 2 because 0 and 1
are reserved in the protocol for errors and replies. */
#define KeyPress 2
#define KeyRelease 3
#define ButtonPress 4
#define ButtonRelease 5
#define MotionNotify 6
#define EnterNotify 7
#define LeaveNotify 8
#define FocusIn 9
#define FocusOut 10
#define KeymapNotify 11
#define Expose 12
#define GraphicsExpose 13
#define NoExpose 14
#define VisibilityNotify 15
#define CreateNotify 16
#define DestroyNotify 17
#define UnmapNotify 18
#define MapNotify 19
#define MapRequest 20
#define ReparentNotify 21
#define ConfigureNotify 22
#define ConfigureRequest 23
#define GravityNotify 24
#define ResizeRequest 25
#define CirculateNotify 26
#define CirculateRequest 27
#define PropertyNotify 28
#define SelectionClear 29
#define SelectionRequest 30
#define SelectionNotify 31
#define ColormapNotify 32
#define ClientMessage 33
#define MappingNotify 34
#define LASTEvent 35 /* must be bigger than any event # */
/* Key masks. Used as modifiers to GrabButton and GrabKey, results of QueryPointer,
state in various key-, mouse-, and button-related events. */
#define ShiftMask (1<<0)
#define LockMask (1<<1)
#define ControlMask (1<<2)
#define Mod1Mask (1<<3)
#define Mod2Mask (1<<4)
#define Mod3Mask (1<<5)
#define Mod4Mask (1<<6)
#define Mod5Mask (1<<7)
/* modifier names. Used to build a SetModifierMapping request or
to read a GetModifierMapping request. These correspond to the
masks defined above. */
#define ShiftMapIndex 0
#define LockMapIndex 1
#define ControlMapIndex 2
#define Mod1MapIndex 3
#define Mod2MapIndex 4
#define Mod3MapIndex 5
#define Mod4MapIndex 6
#define Mod5MapIndex 7
/* button masks. Used in same manner as Key masks above. Not to be confused
with button names below. */
#define Button1Mask (1<<8)
#define Button2Mask (1<<9)
#define Button3Mask (1<<10)
#define Button4Mask (1<<11)
#define Button5Mask (1<<12)
#define AnyModifier (1<<15) /* used in GrabButton, GrabKey */
/* button names. Used as arguments to GrabButton and as detail in ButtonPress
and ButtonRelease events. Not to be confused with button masks above.
Note that 0 is already defined above as "AnyButton". */
#define Button1 1
#define Button2 2
#define Button3 3
#define Button4 4
#define Button5 5
/* Notify modes */
#define NotifyNormal 0
#define NotifyGrab 1
#define NotifyUngrab 2
#define NotifyWhileGrabbed 3
#define NotifyHint 1 /* for MotionNotify events */
/* Notify detail */
#define NotifyAncestor 0
#define NotifyVirtual 1
#define NotifyInferior 2
#define NotifyNonlinear 3
#define NotifyNonlinearVirtual 4
#define NotifyPointer 5
#define NotifyPointerRoot 6
#define NotifyDetailNone 7
/* Visibility notify */
#define VisibilityUnobscured 0
#define VisibilityPartiallyObscured 1
#define VisibilityFullyObscured 2
/* Circulation request */
#define PlaceOnTop 0
#define PlaceOnBottom 1
/* protocol families */
#define FamilyInternet 0
#define FamilyDECnet 1
#define FamilyChaos 2
/* Property notification */
#define PropertyNewValue 0
#define PropertyDelete 1
/* Color Map notification */
#define ColormapUninstalled 0
#define ColormapInstalled 1
/* GrabPointer, GrabButton, GrabKeyboard, GrabKey Modes */
#define GrabModeSync 0
#define GrabModeAsync 1
/* GrabPointer, GrabKeyboard reply status */
#define GrabSuccess 0
#define AlreadyGrabbed 1
#define GrabInvalidTime 2
#define GrabNotViewable 3
#define GrabFrozen 4
/* AllowEvents modes */
#define AsyncPointer 0
#define SyncPointer 1
#define ReplayPointer 2
#define AsyncKeyboard 3
#define SyncKeyboard 4
#define ReplayKeyboard 5
#define AsyncBoth 6
#define SyncBoth 7
/* Used in SetInputFocus, GetInputFocus */
#define RevertToNone (int)None
#define RevertToPointerRoot (int)PointerRoot
#define RevertToParent 2
/*****************************************************************
* ERROR CODES
*****************************************************************/
#define Success 0 /* everything's okay */
#define BadRequest 1 /* bad request code */
#define BadValue 2 /* int parameter out of range */
#define BadWindow 3 /* parameter not a Window */
#define BadPixmap 4 /* parameter not a Pixmap */
#define BadAtom 5 /* parameter not an Atom */
#define BadCursor 6 /* parameter not a Cursor */
#define BadFont 7 /* parameter not a Font */
#define BadMatch 8 /* parameter mismatch */
#define BadDrawable 9 /* parameter not a Pixmap or Window */
#define BadAccess 10 /* depending on context:
- key/button already grabbed
- attempt to free an illegal
cmap entry
- attempt to store into a read-only
color map entry.
- attempt to modify the access control
list from other than the local host.
*/
#define BadAlloc 11 /* insufficient resources */
#define BadColor 12 /* no such colormap */
#define BadGC 13 /* parameter not a GC */
#define BadIDChoice 14 /* choice not in range or already used */
#define BadName 15 /* font or color name doesn't exist */
#define BadLength 16 /* Request length incorrect */
#define BadImplementation 17 /* server is defective */
#define FirstExtensionError 128
#define LastExtensionError 255
/*****************************************************************
* WINDOW DEFINITIONS
*****************************************************************/
/* Window classes used by CreateWindow */
/* Note that CopyFromParent is already defined as 0 above */
#define InputOutput 1
#define InputOnly 2
/* Window attributes for CreateWindow and ChangeWindowAttributes */
#define CWBackPixmap (1L<<0)
#define CWBackPixel (1L<<1)
#define CWBorderPixmap (1L<<2)
#define CWBorderPixel (1L<<3)
#define CWBitGravity (1L<<4)
#define CWWinGravity (1L<<5)
#define CWBackingStore (1L<<6)
#define CWBackingPlanes (1L<<7)
#define CWBackingPixel (1L<<8)
#define CWOverrideRedirect (1L<<9)
#define CWSaveUnder (1L<<10)
#define CWEventMask (1L<<11)
#define CWDontPropagate (1L<<12)
#define CWColormap (1L<<13)
#define CWCursor (1L<<14)
/* ConfigureWindow structure */
#define CWX (1<<0)
#define CWY (1<<1)
#define CWWidth (1<<2)
#define CWHeight (1<<3)
#define CWBorderWidth (1<<4)
#define CWSibling (1<<5)
#define CWStackMode (1<<6)
/* Bit Gravity */
#define ForgetGravity 0
#define NorthWestGravity 1
#define NorthGravity 2
#define NorthEastGravity 3
#define WestGravity 4
#define CenterGravity 5
#define EastGravity 6
#define SouthWestGravity 7
#define SouthGravity 8
#define SouthEastGravity 9
#define StaticGravity 10
/* Window gravity + bit gravity above */
#define UnmapGravity 0
/* Used in CreateWindow for backing-store hint */
#define NotUseful 0
#define WhenMapped 1
#define Always 2
/* Used in GetWindowAttributes reply */
#define IsUnmapped 0
#define IsUnviewable 1
#define IsViewable 2
/* Used in ChangeSaveSet */
#define SetModeInsert 0
#define SetModeDelete 1
/* Used in ChangeCloseDownMode */
#define DestroyAll 0
#define RetainPermanent 1
#define RetainTemporary 2
/* Window stacking method (in configureWindow) */
#define Above 0
#define Below 1
#define TopIf 2
#define BottomIf 3
#define Opposite 4
/* Circulation direction */
#define RaiseLowest 0
#define LowerHighest 1
/* Property modes */
#define PropModeReplace 0
#define PropModePrepend 1
#define PropModeAppend 2
/*****************************************************************
* GRAPHICS DEFINITIONS
*****************************************************************/
/* graphics functions, as in GC.alu */
#define GXclear 0x0 /* 0 */
#define GXand 0x1 /* src AND dst */
#define GXandReverse 0x2 /* src AND NOT dst */
#define GXcopy 0x3 /* src */
#define GXandInverted 0x4 /* NOT src AND dst */
#define GXnoop 0x5 /* dst */
#define GXxor 0x6 /* src XOR dst */
#define GXor 0x7 /* src OR dst */
#define GXnor 0x8 /* NOT src AND NOT dst */
#define GXequiv 0x9 /* NOT src XOR dst */
#define GXinvert 0xa /* NOT dst */
#define GXorReverse 0xb /* src OR NOT dst */
#define GXcopyInverted 0xc /* NOT src */
#define GXorInverted 0xd /* NOT src OR dst */
#define GXnand 0xe /* NOT src OR NOT dst */
#define GXset 0xf /* 1 */
/* LineStyle */
#define LineSolid 0
#define LineOnOffDash 1
#define LineDoubleDash 2
/* capStyle */
#define CapNotLast 0
#define CapButt 1
#define CapRound 2
#define CapProjecting 3
/* joinStyle */
#define JoinMiter 0
#define JoinRound 1
#define JoinBevel 2
/* fillStyle */
#define FillSolid 0
#define FillTiled 1
#define FillStippled 2
#define FillOpaqueStippled 3
/* fillRule */
#define EvenOddRule 0
#define WindingRule 1
/* subwindow mode */
#define ClipByChildren 0
#define IncludeInferiors 1
/* SetClipRectangles ordering */
#define Unsorted 0
#define YSorted 1
#define YXSorted 2
#define YXBanded 3
/* CoordinateMode for drawing routines */
#define CoordModeOrigin 0 /* relative to the origin */
#define CoordModePrevious 1 /* relative to previous point */
/* Polygon shapes */
#define Complex 0 /* paths may intersect */
#define Nonconvex 1 /* no paths intersect, but not convex */
#define Convex 2 /* wholly convex */
/* Arc modes for PolyFillArc */
#define ArcChord 0 /* join endpoints of arc */
#define ArcPieSlice 1 /* join endpoints to center of arc */
/* GC components: masks used in CreateGC, CopyGC, ChangeGC, OR'ed into
GC.stateChanges */
#define GCFunction (1L<<0)
#define GCPlaneMask (1L<<1)
#define GCForeground (1L<<2)
#define GCBackground (1L<<3)
#define GCLineWidth (1L<<4)
#define GCLineStyle (1L<<5)
#define GCCapStyle (1L<<6)
#define GCJoinStyle (1L<<7)
#define GCFillStyle (1L<<8)
#define GCFillRule (1L<<9)
#define GCTile (1L<<10)
#define GCStipple (1L<<11)
#define GCTileStipXOrigin (1L<<12)
#define GCTileStipYOrigin (1L<<13)
#define GCFont (1L<<14)
#define GCSubwindowMode (1L<<15)
#define GCGraphicsExposures (1L<<16)
#define GCClipXOrigin (1L<<17)
#define GCClipYOrigin (1L<<18)
#define GCClipMask (1L<<19)
#define GCDashOffset (1L<<20)
#define GCDashList (1L<<21)
#define GCArcMode (1L<<22)
#define GCLastBit 22
/*****************************************************************
* FONTS
*****************************************************************/
/* used in QueryFont -- draw direction */
#define FontLeftToRight 0
#define FontRightToLeft 1
#define FontChange 255
/*****************************************************************
* IMAGING
*****************************************************************/
/* ImageFormat -- PutImage, GetImage */
#define XYBitmap 0 /* depth 1, XYFormat */
#define XYPixmap 1 /* depth == drawable depth */
#define ZPixmap 2 /* depth == drawable depth */
/*****************************************************************
* COLOR MAP STUFF
*****************************************************************/
/* For CreateColormap */
#define AllocNone 0 /* create map with no entries */
#define AllocAll 1 /* allocate entire map writeable */
/* Flags used in StoreNamedColor, StoreColors */
#define DoRed (1<<0)
#define DoGreen (1<<1)
#define DoBlue (1<<2)
/*****************************************************************
* CURSOR STUFF
*****************************************************************/
/* QueryBestSize Class */
#define CursorShape 0 /* largest size that can be displayed */
#define TileShape 1 /* size tiled fastest */
#define StippleShape 2 /* size stippled fastest */
/*****************************************************************
* KEYBOARD/POINTER STUFF
*****************************************************************/
#define AutoRepeatModeOff 0
#define AutoRepeatModeOn 1
#define AutoRepeatModeDefault 2
#define LedModeOff 0
#define LedModeOn 1
/* masks for ChangeKeyboardControl */
#define KBKeyClickPercent (1L<<0)
#define KBBellPercent (1L<<1)
#define KBBellPitch (1L<<2)
#define KBBellDuration (1L<<3)
#define KBLed (1L<<4)
#define KBLedMode (1L<<5)
#define KBKey (1L<<6)
#define KBAutoRepeatMode (1L<<7)
#define MappingSuccess 0
#define MappingBusy 1
#define MappingFailed 2
#define MappingModifier 0
#define MappingKeyboard 1
#define MappingPointer 2
/*****************************************************************
* SCREEN SAVER STUFF
*****************************************************************/
#define DontPreferBlanking 0
#define PreferBlanking 1
#define DefaultBlanking 2
#define DisableScreenSaver 0
#define DisableScreenInterval 0
#define DontAllowExposures 0
#define AllowExposures 1
#define DefaultExposures 2
/* for ForceScreenSaver */
#define ScreenSaverReset 0
#define ScreenSaverActive 1
/*****************************************************************
* HOSTS AND CONNECTIONS
*****************************************************************/
/* for ChangeHosts */
#define HostInsert 0
#define HostDelete 1
/* for ChangeAccessControl */
#define EnableAccess 1
#define DisableAccess 0
/* Display classes used in opening the connection
* Note that the statically allocated ones are even numbered and the
* dynamically changeable ones are odd numbered */
#define StaticGray 0
#define GrayScale 1
#define StaticColor 2
#define PseudoColor 3
#define TrueColor 4
#define DirectColor 5
/* Byte order used in imageByteOrder and bitmapBitOrder */
#define LSBFirst 0
#define MSBFirst 1
#endif /* X_H */
/* $XConsortium: Xalloca.h /main/6 1996/09/28 16:17:22 rws $ */
/*
Copyright (c) 1995 X Consortium
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
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 X CONSORTIUM 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 X Consortium 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 X Consortium.
*/
/*
* The purpose of this header is to define the macros ALLOCATE_LOCAL and
* DEALLOCATE_LOCAL appropriately for the platform being compiled on.
* These macros are used to make fast, function-local memory allocations.
* Their characteristics are as follows:
*
* void *ALLOCATE_LOCAL(int size)
* Returns a pointer to size bytes of memory, or NULL if the allocation
* failed. The memory must be freed with DEALLOCATE_LOCAL before the
* function that made the allocation returns. You should not ask for
* large blocks of memory with this function, since on many platforms
* the memory comes from the stack, which may have limited size.
*
* void DEALLOCATE_LOCAL(void *)
* Frees the memory allocated by ALLOCATE_LOCAL. Omission of this
* step may be harmless on some platforms, but will result in
* memory leaks or worse on others.
*
* Before including this file, you should define two macros,
* ALLOCATE_LOCAL_FALLBACK and DEALLOCATE_LOCAL_FALLBACK, that have the
* same characteristics as ALLOCATE_LOCAL and DEALLOCATE_LOCAL. The
* header uses the fallbacks if it doesn't know a "better" way to define
* ALLOCATE_LOCAL and DEALLOCATE_LOCAL. Typical usage would be:
*
* #define ALLOCATE_LOCAL_FALLBACK(_size) malloc(_size)
* #define DEALLOCATE_LOCAL_FALLBACK(_ptr) free(_ptr)
* #include "Xalloca.h"
*/
#ifndef XALLOCA_H
#define XALLOCA_H 1
#ifdef INCLUDE_ALLOCA_H
# include <alloca.h>
#endif
#ifndef NO_ALLOCA
/*
* os-dependent definition of local allocation and deallocation
* If you want something other than (DE)ALLOCATE_LOCAL_FALLBACK
* for ALLOCATE/DEALLOCATE_LOCAL then you add that in here.
*/
# if defined(__HIGHC__)
# ifndef NCR
extern char *alloca();
# if HCVERSION < 21003
# define ALLOCATE_LOCAL(size) alloca((int)(size))
pragma on(alloca);
# else /* HCVERSION >= 21003 */
# define ALLOCATE_LOCAL(size) _Alloca((int)(size))
# endif /* HCVERSION < 21003 */
# else /* NCR */
# define ALLOCATE_LOCAL(size) alloca(size)
# endif
# define DEALLOCATE_LOCAL(ptr) /* as nothing */
# endif /* defined(__HIGHC__) */
# ifdef __GNUC__
# ifndef alloca
# define alloca __builtin_alloca
# endif /* !alloca */
# define ALLOCATE_LOCAL(size) alloca((int)(size))
# define DEALLOCATE_LOCAL(ptr) /* as nothing */
# else /* ! __GNUC__ */
/*
* warning: old mips alloca (pre 2.10) is unusable, new one is built in
* Test is easy, the new one is named __builtin_alloca and comes
* from alloca.h which #defines alloca.
*/
# ifndef NCR
# if defined(vax) || defined(sun) || defined(apollo) || defined(stellar) || defined(USL) || defined(alloca)
/*
* Some System V boxes extract alloca.o from /lib/libPW.a; if you
* decide that you don't want to use alloca, you might want to fix it here.
*/
/* alloca might be a macro taking one arg (hi, Sun!), so give it one. */
# ifndef __sgi /* IRIX 5/6 has definition */
# define __Xnullarg /* as nothing */
# ifndef X_NOT_STDC_ENV
extern void *alloca(__Xnullarg);
# else
extern char *alloca(__Xnullarg);
# endif
# endif /* __sgi */
# define ALLOCATE_LOCAL(size) alloca((int)(size))
# define DEALLOCATE_LOCAL(ptr) /* as nothing */
# endif /* who does alloca */
# endif /* NCR */
# endif /* __GNUC__ */
#endif /* NO_ALLOCA */
#if !defined(ALLOCATE_LOCAL)
# if defined(ALLOCATE_LOCAL_FALLBACK) && defined(DEALLOCATE_LOCAL_FALLBACK)
# define ALLOCATE_LOCAL(_size) ALLOCATE_LOCAL_FALLBACK(_size)
# define DEALLOCATE_LOCAL(_ptr) DEALLOCATE_LOCAL_FALLBACK(_ptr)
# else /* no fallbacks supplied; error */
# define ALLOCATE_LOCAL(_size) ALLOCATE_LOCAL_FALLBACK undefined!
# define DEALLOCATE_LOCAL(_ptr) DEALLOCATE_LOCAL_FALLBACK undefined!
# endif /* defined(ALLOCATE_LOCAL_FALLBACK && DEALLOCATE_LOCAL_FALLBACK) */
#endif /* !defined(ALLOCATE_LOCAL) */
#endif /* XALLOCA_H */
/* $XConsortium: Xfuncproto.h,v 1.9 95/06/08 23:20:39 gildea Exp $ */
/*
*
Copyright (c) 1989, 1991 X Consortium
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
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
X CONSORTIUM 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 X Consortium 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 X Consortium.
*
*/
/* Definitions to make function prototypes manageable */
#ifndef _XFUNCPROTO_H_
#define _XFUNCPROTO_H_
#ifndef NeedFunctionPrototypes
#if defined(FUNCPROTO) || defined(__STDC__) || defined(__cplusplus) || defined(c_plusplus)
#define NeedFunctionPrototypes 1
#else
#define NeedFunctionPrototypes 0
#endif
#endif /* NeedFunctionPrototypes */
#ifndef NeedVarargsPrototypes
#if defined(__STDC__) || defined(__cplusplus) || defined(c_plusplus) || (FUNCPROTO&2)
#define NeedVarargsPrototypes 1
#else
#define NeedVarargsPrototypes 0
#endif
#endif /* NeedVarargsPrototypes */
#if NeedFunctionPrototypes
#ifndef NeedNestedPrototypes
#if defined(__STDC__) || defined(__cplusplus) || defined(c_plusplus) || (FUNCPROTO&8)
#define NeedNestedPrototypes 1
#else
#define NeedNestedPrototypes 0
#endif
#endif /* NeedNestedPrototypes */
#ifndef _Xconst
#if defined(__STDC__) || defined(__cplusplus) || defined(c_plusplus) || (FUNCPROTO&4)
#define _Xconst const
#else
#define _Xconst
#endif
#endif /* _Xconst */
#ifndef NeedWidePrototypes
#ifdef NARROWPROTO
#define NeedWidePrototypes 0
#else
#define NeedWidePrototypes 1 /* default to make interropt. easier */
#endif
#endif /* NeedWidePrototypes */
#endif /* NeedFunctionPrototypes */
#ifndef _XFUNCPROTOBEGIN
#ifdef __cplusplus /* for C++ V2.0 */
#define _XFUNCPROTOBEGIN extern "C" { /* do not leave open across includes */
#define _XFUNCPROTOEND }
#else
#define _XFUNCPROTOBEGIN
#define _XFUNCPROTOEND
#endif
#endif /* _XFUNCPROTOBEGIN */
#endif /* _XFUNCPROTO_H_ */
/*
* $XConsortium: Xfuncs.h,v 1.16 94/12/01 16:25:53 kaleb Exp $
* $XFree86: xc/include/Xfuncs.h,v 3.2 1995/01/28 15:42:03 dawes Exp $
*
*
Copyright (c) 1990 X Consortium
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
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
X CONSORTIUM 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 X Consortium 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 X Consortium.
*
*/
#ifndef _XFUNCS_H_
#define _XFUNCS_H_
#include <X11/Xosdefs.h>
/* the old Xfuncs.h, for pre-R6 */
#ifdef X_USEBFUNCS
void bcopy();
void bzero();
int bcmp();
#else
#if (__STDC__ && !defined(X_NOT_STDC_ENV) && !defined(sun) && !defined(macII) && !defined(apollo)) || defined(SVR4) || defined(hpux) || defined(_IBMR2) || defined(_SEQUENT_)
#include <string.h>
#define _XFUNCS_H_INCLUDED_STRING_H
#define bcopy(b1,b2,len) memmove(b2, b1, (size_t)(len))
#define bzero(b,len) memset(b, 0, (size_t)(len))
#define bcmp(b1,b2,len) memcmp(b1, b2, (size_t)(len))
#else
#ifdef sgi
#include <bstring.h>
#else
#ifdef SYSV
#include <memory.h>
void bcopy();
#define bzero(b,len) memset(b, 0, len)
#define bcmp(b1,b2,len) memcmp(b1, b2, len)
#else
#ifdef __EMX__
#include <strings.h>
#define _XFUNCS_H_INCLUDED_STRING_H
/* bcopy, bcmp, bzero declared */
#else /* bsd */
void bcopy();
void bzero();
int bcmp();
#endif
#endif /* SYSV */
#endif /* sgi */
#endif /* __STDC__ and relatives */
#endif /* X_USEBFUNCS */
/* the new Xfuncs.h */
#if !defined(X_NOT_STDC_ENV) && (!defined(sun) || defined(SVR4))
/* the ANSI C way */
#ifndef _XFUNCS_H_INCLUDED_STRING_H
#include <string.h>
#endif
#undef bzero
#define bzero(b,len) memset(b,0,len)
#else /* else X_NOT_STDC_ENV or SunOS 4 */
#if defined(SYSV) || defined(luna) || defined(sun) || defined(__sxg__)
#include <memory.h>
#define memmove(dst,src,len) bcopy((char *)(src),(char *)(dst),(int)(len))
#if defined(SYSV) && defined(_XBCOPYFUNC)
#undef memmove
#define memmove(dst,src,len) _XBCOPYFUNC((char *)(src),(char *)(dst),(int)(len))
#define _XNEEDBCOPYFUNC
#endif
#else /* else vanilla BSD */
#define memmove(dst,src,len) bcopy((char *)(src),(char *)(dst),(int)(len))
#define memcpy(dst,src,len) bcopy((char *)(src),(char *)(dst),(int)(len))
#define memcmp(b1,b2,len) bcmp((char *)(b1),(char *)(b2),(int)(len))
#endif /* SYSV else */
#endif /* ! X_NOT_STDC_ENV else */
#endif /* _XFUNCS_H_ */
/***********************************************************
Copyright (c) 1987 X Consortium
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
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
X CONSORTIUM 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 X Consortium 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 X Consortium.
Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
All Rights Reserved
Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the name of Digital not be
used in advertising or publicity pertaining to distribution of the
software without specific, written prior permission.
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
SOFTWARE.
******************************************************************/
#ifndef XMD_H
#define XMD_H 1
/* $XConsortium: Xmd.h,v 1.49 95/06/08 23:20:39 gildea Exp $ */
/* $XFree86: xc/include/Xmd.h,v 3.4 1996/12/31 04:15:20 dawes Exp $ */
/*
* Xmd.h: MACHINE DEPENDENT DECLARATIONS.
*/
/*
* Special per-machine configuration flags.
*/
#ifdef CRAY
#define WORD64 /* 64-bit architecture */
#endif
#if defined(__alpha) || defined(__alpha__)
#define LONG64 /* 32/64-bit architecture */
#endif
#ifdef __sgi
#if (_MIPS_SZLONG == 64)
#define LONG64
#endif
#endif
/*
* Stuff to handle large architecture machines; the constants were generated
* on a 32-bit machine and must coorespond to the protocol.
*/
#ifdef WORD64
#define MUSTCOPY
#endif /* WORD64 */
/*
* Definition of macro used to set constants for size of network structures;
* machines with preprocessors that can't handle all of the sz_ symbols
* can define this macro to be sizeof(x) if and only if their compiler doesn't
* pad out structures (esp. the xTextElt structure which contains only two
* one-byte fields). Network structures should always define sz_symbols.
*
* The sz_ prefix is used instead of something more descriptive so that the
* symbols are no more than 32 characters long (which causes problems for some
* compilers and preprocessors).
*
* The extra indirection in the __STDC__ case is to get macro arguments to
* expand correctly before the concatenation, rather than afterward.
*/
#if ((defined(__STDC__) || defined(__cplusplus) || defined(c_plusplus)) && !defined(UNIXCPP)) || defined(ANSICPP)
#define _SIZEOF(x) sz_##x
#define SIZEOF(x) _SIZEOF(x)
#else
#define SIZEOF(x) sz_/**/x
#endif /* if ANSI C compiler else not */
/*
* Bitfield suffixes for the protocol structure elements, if you
* need them. Note that bitfields are not guarranteed to be signed
* (or even unsigned) according to ANSI C.
*/
#ifdef WORD64
typedef long INT64;
typedef unsigned long CARD64;
#define B32 :32
#define B16 :16
#ifdef UNSIGNEDBITFIELDS
typedef unsigned int INT32;
typedef unsigned int INT16;
#else
#ifdef __STDC__
typedef signed int INT32;
typedef signed int INT16;
#else
typedef int INT32;
typedef int INT16;
#endif
#endif
#else
#define B32
#define B16
#ifdef LONG64
typedef long INT64;
typedef int INT32;
#else
typedef long INT32;
#endif
typedef short INT16;
#endif
#if defined(__STDC__) || defined(sgi) || defined(AIXV3)
typedef signed char INT8;
#else
typedef char INT8;
#endif
#ifdef LONG64
typedef unsigned long CARD64;
typedef unsigned int CARD32;
#else
typedef unsigned long CARD32;
#endif
typedef unsigned short CARD16;
typedef unsigned char CARD8;
typedef CARD32 BITS32;
typedef CARD16 BITS16;
#ifndef __EMX__
typedef CARD8 BYTE;
typedef CARD8 BOOL;
#else
/*
* This is bad style, but the central include file <os2.h> declares them
* as well
*/
#define BYTE CARD8
#define BOOL CARD8
#endif
/*
* definitions for sign-extending bitfields on 64-bit architectures
*/
#if defined(WORD64) && defined(UNSIGNEDBITFIELDS)
#define cvtINT8toInt(val) (((val) & 0x00000080) ? ((val) | 0xffffffffffffff00) : (val))
#define cvtINT16toInt(val) (((val) & 0x00008000) ? ((val) | 0xffffffffffff0000) : (val))
#define cvtINT32toInt(val) (((val) & 0x80000000) ? ((val) | 0xffffffff00000000) : (val))
#define cvtINT8toShort(val) cvtINT8toInt(val)
#define cvtINT16toShort(val) cvtINT16toInt(val)
#define cvtINT32toShort(val) cvtINT32toInt(val)
#define cvtINT8toLong(val) cvtINT8toInt(val)
#define cvtINT16toLong(val) cvtINT16toInt(val)
#define cvtINT32toLong(val) cvtINT32toInt(val)
#else
#define cvtINT8toInt(val) (val)
#define cvtINT16toInt(val) (val)
#define cvtINT32toInt(val) (val)
#define cvtINT8toShort(val) (val)
#define cvtINT16toShort(val) (val)
#define cvtINT32toShort(val) (val)
#define cvtINT8toLong(val) (val)
#define cvtINT16toLong(val) (val)
#define cvtINT32toLong(val) (val)
#endif /* WORD64 and UNSIGNEDBITFIELDS */
#ifdef MUSTCOPY
/*
* This macro must not cast or else pointers will get aligned and be wrong
*/
#define NEXTPTR(p,t) (((char *) p) + SIZEOF(t))
#else /* else not MUSTCOPY, this is used for 32-bit machines */
/*
* this version should leave result of type (t *), but that should only be
* used when not in MUSTCOPY
*/
#define NEXTPTR(p,t) (((t *)(p)) + 1)
#endif /* MUSTCOPY - used machines whose C structs don't line up with proto */
#endif /* XMD_H */
/*
* $XConsortium: Xos.h /main/70 1996/11/15 16:00:41 kaleb $
* $XFree86: xc/include/Xos.h,v 3.21.2.1 1998/01/23 12:35:11 dawes Exp $
*
*
Copyright (c) 1987 X Consortium
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
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
X CONSORTIUM 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 X Consortium 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 X Consortium.
*
* The X Window System is a Trademark of X Consortium.
*
*/
/* This is a collection of things to try and minimize system dependencies
* in a "signficant" number of source files.
*/
#ifndef _XOS_H_
#define _XOS_H_
#include <X11/Xosdefs.h>
/*
* Get major data types (esp. caddr_t)
*/
#ifdef USG
#ifndef __TYPES__
#ifdef CRAY
#define word word_t
#endif /* CRAY */
#include <sys/types.h> /* forgot to protect it... */
#define __TYPES__
#endif /* __TYPES__ */
#else /* USG */
#if defined(_POSIX_SOURCE) && (defined(MOTOROLA) || defined(AMOEBA))
#undef _POSIX_SOURCE
#include <sys/types.h>
#define _POSIX_SOURCE
#else
#include <sys/types.h>
#endif
#endif /* USG */
/*
* Just about everyone needs the strings routines. We provide both forms here,
* index/rindex and strchr/strrchr, so any systems that don't provide them all
* need to have #defines here.
*
* NOTE: The following ISN'T true for this XFree86 version of this file.
*
* These macros are defined this way, rather than, e.g.:
* #defined index(s,c) strchr(s,c)
* because someone might be using them as function pointers, and such
* a change would break compatibility for anyone who's relying on them
* being the way they currently are. So we're stuck with them this way,
* which can be really inconvenient. :-(
*/
#ifndef X_NOT_STDC_ENV
#include <string.h>
#ifdef __STDC__
#ifndef index
#define index(s,c) (strchr((s),(c)))
#endif
#ifndef rindex
#define rindex(s,c) (strrchr((s),(c)))
#endif
#else
#ifndef index
#define index strchr
#endif
#ifndef rindex
#define rindex strrchr
#endif
#endif
#else
#ifdef SYSV
#if defined(clipper) || defined(__clipper__)
#include <malloc.h>
#endif
#include <string.h>
#define index strchr
#define rindex strrchr
#else
#include <strings.h>
#define strchr index
#define strrchr rindex
#endif
#endif /* X_NOT_STDC_ENV */
/*
* strerror()
*/
#if (defined(X_NOT_STDC_ENV) || (defined(sun) && !defined(SVR4)) || defined(macII)) && !defined(__GLIBC__)
#ifndef strerror
extern char *sys_errlist[];
extern int sys_nerr;
#define strerror(n) \
(((n) >= 0 && (n) < sys_nerr) ? sys_errlist[n] : "unknown error")
#endif
#endif
/*
* Get open(2) constants
*/
#ifdef X_NOT_POSIX
#include <fcntl.h>
#if defined(USL) || defined(CRAY) || defined(MOTOROLA) || (defined(i386) && (defined(SYSV) || defined(SVR4))) || defined(__sxg__)
#include <unistd.h>
#endif
#ifdef WIN32
#include <X11/Xw32defs.h>
#else
#include <sys/file.h>
#endif
#else /* X_NOT_POSIX */
#if !defined(_POSIX_SOURCE) && defined(macII)
#define _POSIX_SOURCE
#include <fcntl.h>
#include <unistd.h>
#undef _POSIX_SOURCE
#else
#include <fcntl.h>
#include <unistd.h>
#endif
#endif /* X_NOT_POSIX else */
#ifdef CSRG_BASED
#include <stdlib.h>
#include <unistd.h>
#endif /* CSRG_BASED */
/*
* Get struct timeval
*/
#ifdef SYSV
#ifndef USL
#include <sys/time.h>
#endif
#include <time.h>
#ifdef CRAY
#undef word
#endif /* CRAY */
#if defined(USG) && !defined(CRAY) && !defined(MOTOROLA) && !defined(uniosu) && !defined(__sxg__) && !defined(clipper) && !defined(__clipper__)
struct timeval {
long tv_sec;
long tv_usec;
};
#ifndef USL_SHARELIB
struct timezone {
int tz_minuteswest;
int tz_dsttime;
};
#endif /* USL_SHARELIB */
#endif /* USG */
#ifdef _SEQUENT_
struct timezone {
int tz_minuteswest;
int tz_dsttime;
};
#endif /* _SEQUENT_ */
#else /* not SYSV */
#if defined(_ANSI_SOURCE) && defined(__bsdi__)
#undef _ANSI_SOURCE
#include <sys/time.h>
#define _ANSI_SOURCE
#endif
#if defined(_POSIX_SOURCE) && defined(SVR4)
/* need to omit _POSIX_SOURCE in order to get what we want in SVR4 */
#undef _POSIX_SOURCE
#include <sys/time.h>
#define _POSIX_SOURCE
#else /* defined(_POSIX_SOURCE) && defined(SVR4) */
#ifdef WIN32
#include <time.h>
#if !defined(_WINSOCKAPI_) && !defined(_WILLWINSOCK_)
struct timeval {
long tv_sec; /* seconds */
long tv_usec; /* and microseconds */
};
#endif
#include <sys/timeb.h>
#define gettimeofday(t) \
{ \
struct _timeb _gtodtmp; \
_ftime (&_gtodtmp); \
(t)->tv_sec = _gtodtmp.time; \
(t)->tv_usec = _gtodtmp.millitm * 1000; \
}
#else /* WIN32 */
#ifdef _SEQUENT_
#include <time.h>
#else /* _SEQUENT_ */
#ifdef AMOEBA
#include <time.h>
#include <sys/time.h>
#else /* AMOEBA */
#ifdef MINIX
#include <time.h>
#else /* !MINIX */
#ifndef Lynx
#include <sys/time.h>
#else
#include <time.h>
#endif /* Lynx */
#endif /* MINIX */
#endif /* AMOEBA */
#endif /* _SEQUENT_ */
#endif /* WIN32 else */
#endif /* defined(_POSIX_SOURCE) && defined(SVR4) */
#endif /* SYSV */
/* define X_GETTIMEOFDAY macro, a portable gettimeofday() */
#if defined(_XOPEN_XPG4) || defined(_XOPEN_UNIX) /* _XOPEN_UNIX is XPG4.2 */
#define X_GETTIMEOFDAY(t) gettimeofday(t, (struct timezone*)0)
#else
#if defined(SVR4) || defined(VMS) || defined(WIN32)
#define X_GETTIMEOFDAY(t) gettimeofday(t)
#else
#define X_GETTIMEOFDAY(t) gettimeofday(t, (struct timezone*)0)
#endif
#endif /* XPG4 else */
#ifdef MINIX
#include <errno.h>
#include <net/gen/in.h>
#include <net/gen/socket.h>
#include <net/gen/udp.h>
#include <net/gen/udp_hdr.h>
struct sockaddr
{
u16_t sa_family;
char sa_data[14];
};
struct sockaddr_in
{
u16_t sin_family;
u16_t sin_port;
struct
{
ipaddr_t s_addr;
} sin_addr;
char sin_zero[8];
};
struct in_addr
{
ipaddr_t s_addr;
};
typedef char *caddr_t;
typedef unsigned char u_char;
#endif /* MINIX */
#ifdef __EMX__
typedef unsigned long fd_mask;
#endif
/* use POSIX name for signal */
#if defined(X_NOT_POSIX) && defined(SYSV) && !defined(SIGCHLD) && !defined(ISC)
#define SIGCHLD SIGCLD
#endif
#ifdef ISC
#include <sys/bsdtypes.h>
#include <sys/limits.h>
#define NGROUPS 16
#endif
#if defined(ISC) || defined(__EMX__)
/*
* Some OS's may not have this
*/
#define X_NO_SYS_UN 1
struct sockaddr_un {
short sun_family;
char sun_path[108];
};
#endif
#endif /* _XOS_H_ */
/*
* O/S-dependent (mis)feature macro definitions
*
* $XConsortium: Xosdefs.h /main/16 1996/09/28 16:17:29 rws $
* $XFree86: xc/include/Xosdefs.h,v 3.11 1996/12/23 05:58:09 dawes Exp $
*
Copyright (c) 1991 X Consortium
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
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
X CONSORTIUM 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 X Consortium 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 X Consortium.
*/
#ifndef _XOSDEFS_H_
#define _XOSDEFS_H_
/*
* X_NOT_STDC_ENV means does not have ANSI C header files. Lack of this
* symbol does NOT mean that the system has stdarg.h.
*
* X_NOT_POSIX means does not have POSIX header files. Lack of this
* symbol does NOT mean that the POSIX environment is the default.
* You may still have to define _POSIX_SOURCE to get it.
*/
#ifdef NOSTDHDRS
#define X_NOT_POSIX
#define X_NOT_STDC_ENV
#endif
#ifdef sony
#if !defined(SYSTYPE_SYSV) && !defined(_SYSTYPE_SYSV)
#define X_NOT_POSIX
#endif
#endif
#ifdef UTEK
#define X_NOT_POSIX
#define X_NOT_STDC_ENV
#endif
#ifdef vax
#ifndef ultrix /* assume vanilla BSD */
#define X_NOT_POSIX
#define X_NOT_STDC_ENV
#endif
#endif
#ifdef luna
#define X_NOT_POSIX
#define X_NOT_STDC_ENV
#endif
#ifdef Mips
#define X_NOT_POSIX
#define X_NOT_STDC_ENV
#endif
#ifdef USL
#ifdef SYSV /* (release 3.2) */
#define X_NOT_POSIX
#define X_NOT_STDC_ENV
#endif
#endif
#ifdef i386
#ifdef SYSV
#if !(defined(ISC) && defined(_POSIX_SOURCE))
#ifndef SCO
#ifndef _SCO_DS /* SCO 5.0 has SVR4 header files */
#define X_NOT_POSIX
#endif
#define X_NOT_STDC_ENV
#endif
#endif /* !(defined(ISC) && defined(_POSIX_SOURCE)) */
#endif
#endif
#ifdef MOTOROLA
#ifdef SYSV
#define X_NOT_STDC_ENV
#endif
#endif
#ifdef sun
#ifdef SVR4
/* define this to whatever it needs to be */
#define X_POSIX_C_SOURCE 199300L
#endif
#endif
#ifdef WIN32
#ifndef _POSIX_
#define X_NOT_POSIX
#endif
#endif
#if defined(nec_ews_svr2) || defined(SX) || defined(PC_UX)
#define X_NOT_POSIX
#define X_NOT_STDC_ENV
#endif
#ifdef __EMX__
#define USGISH
/* EMX claims to be ANSI, so X_NOT_STDC_ENV does not hold */
/* could have been provided as std flags as well */
#define X_WCHAR
#define X_LOCALE
#endif
#endif /* _XOSDEFS_H_ */
/*
* $XConsortium: Xproto.h /main/21 1996/03/20 15:27:51 mor $
*/
/* Definitions for the X window system used by server and c bindings */
/*
* This packet-construction scheme makes the following assumptions:
*
* 1. The compiler is able
* to generate code which addresses one- and two-byte quantities.
* In the worst case, this would be done with bit-fields. If bit-fields
* are used it may be necessary to reorder the request fields in this file,
* depending on the order in which the machine assigns bit fields to
* machine words. There may also be a problem with sign extension,
* as K+R specify that bitfields are always unsigned.
*
* 2. 2- and 4-byte fields in packet structures must be ordered by hand
* such that they are naturally-aligned, so that no compiler will ever
* insert padding bytes.
*
* 3. All packets are hand-padded to a multiple of 4 bytes, for
* the same reason.
*/
#ifndef XPROTO_H
#define XPROTO_H
/***********************************************************
Copyright (c) 1987 X Consortium
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
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
X CONSORTIUM 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 X Consortium 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 X Consortium.
Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
All Rights Reserved
Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the name of Digital not be
used in advertising or publicity pertaining to distribution of the
software without specific, written prior permission.
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
SOFTWARE.
******************************************************************/
#include <X11/Xmd.h>
#include <X11/Xprotostr.h>
/*
* Define constants for the sizes of the network packets. The sz_ prefix is
* used instead of something more descriptive so that the symbols are no more
* than 32 characters in length (which causes problems for some compilers).
*/
#define sz_xSegment 8
#define sz_xPoint 4
#define sz_xRectangle 8
#define sz_xArc 12
#define sz_xConnClientPrefix 12
#define sz_xConnSetupPrefix 8
#define sz_xConnSetup 32
#define sz_xPixmapFormat 8
#define sz_xDepth 8
#define sz_xVisualType 24
#define sz_xWindowRoot 40
#define sz_xTimecoord 8
#define sz_xHostEntry 4
#define sz_xCharInfo 12
#define sz_xFontProp 8
#define sz_xTextElt 2
#define sz_xColorItem 12
#define sz_xrgb 8
#define sz_xGenericReply 32
#define sz_xGetWindowAttributesReply 44
#define sz_xGetGeometryReply 32
#define sz_xQueryTreeReply 32
#define sz_xInternAtomReply 32
#define sz_xGetAtomNameReply 32
#define sz_xGetPropertyReply 32
#define sz_xListPropertiesReply 32
#define sz_xGetSelectionOwnerReply 32
#define sz_xGrabPointerReply 32
#define sz_xQueryPointerReply 32
#define sz_xGetMotionEventsReply 32
#define sz_xTranslateCoordsReply 32
#define sz_xGetInputFocusReply 32
#define sz_xQueryKeymapReply 40
#define sz_xQueryFontReply 60
#define sz_xQueryTextExtentsReply 32
#define sz_xListFontsReply 32
#define sz_xGetFontPathReply 32
#define sz_xGetImageReply 32
#define sz_xListInstalledColormapsReply 32
#define sz_xAllocColorReply 32
#define sz_xAllocNamedColorReply 32
#define sz_xAllocColorCellsReply 32
#define sz_xAllocColorPlanesReply 32
#define sz_xQueryColorsReply 32
#define sz_xLookupColorReply 32
#define sz_xQueryBestSizeReply 32
#define sz_xQueryExtensionReply 32
#define sz_xListExtensionsReply 32
#define sz_xSetMappingReply 32
#define sz_xGetKeyboardControlReply 52
#define sz_xGetPointerControlReply 32
#define sz_xGetScreenSaverReply 32
#define sz_xListHostsReply 32
#define sz_xSetModifierMappingReply 32
#define sz_xError 32
#define sz_xEvent 32
#define sz_xKeymapEvent 32
#define sz_xReq 4
#define sz_xResourceReq 8
#define sz_xCreateWindowReq 32
#define sz_xChangeWindowAttributesReq 12
#define sz_xChangeSaveSetReq 8
#define sz_xReparentWindowReq 16
#define sz_xConfigureWindowReq 12
#define sz_xCirculateWindowReq 8
#define sz_xInternAtomReq 8
#define sz_xChangePropertyReq 24
#define sz_xDeletePropertyReq 12
#define sz_xGetPropertyReq 24
#define sz_xSetSelectionOwnerReq 16
#define sz_xConvertSelectionReq 24
#define sz_xSendEventReq 44
#define sz_xGrabPointerReq 24
#define sz_xGrabButtonReq 24
#define sz_xUngrabButtonReq 12
#define sz_xChangeActivePointerGrabReq 16
#define sz_xGrabKeyboardReq 16
#define sz_xGrabKeyReq 16
#define sz_xUngrabKeyReq 12
#define sz_xAllowEventsReq 8
#define sz_xGetMotionEventsReq 16
#define sz_xTranslateCoordsReq 16
#define sz_xWarpPointerReq 24
#define sz_xSetInputFocusReq 12
#define sz_xOpenFontReq 12
#define sz_xQueryTextExtentsReq 8
#define sz_xListFontsReq 8
#define sz_xSetFontPathReq 8
#define sz_xCreatePixmapReq 16
#define sz_xCreateGCReq 16
#define sz_xChangeGCReq 12
#define sz_xCopyGCReq 16
#define sz_xSetDashesReq 12
#define sz_xSetClipRectanglesReq 12
#define sz_xCopyAreaReq 28
#define sz_xCopyPlaneReq 32
#define sz_xPolyPointReq 12
#define sz_xPolySegmentReq 12
#define sz_xFillPolyReq 16
#define sz_xPutImageReq 24
#define sz_xGetImageReq 20
#define sz_xPolyTextReq 16
#define sz_xImageTextReq 16
#define sz_xCreateColormapReq 16
#define sz_xCopyColormapAndFreeReq 12
#define sz_xAllocColorReq 16
#define sz_xAllocNamedColorReq 12
#define sz_xAllocColorCellsReq 12
#define sz_xAllocColorPlanesReq 16
#define sz_xFreeColorsReq 12
#define sz_xStoreColorsReq 8
#define sz_xStoreNamedColorReq 16
#define sz_xQueryColorsReq 8
#define sz_xLookupColorReq 12
#define sz_xCreateCursorReq 32
#define sz_xCreateGlyphCursorReq 32
#define sz_xRecolorCursorReq 20
#define sz_xQueryBestSizeReq 12
#define sz_xQueryExtensionReq 8
#define sz_xChangeKeyboardControlReq 8
#define sz_xBellReq 4
#define sz_xChangePointerControlReq 12
#define sz_xSetScreenSaverReq 12
#define sz_xChangeHostsReq 8
#define sz_xListHostsReq 4
#define sz_xChangeModeReq 4
#define sz_xRotatePropertiesReq 12
#define sz_xReply 32
#define sz_xGrabKeyboardReply 32
#define sz_xListFontsWithInfoReply 60
#define sz_xSetPointerMappingReply 32
#define sz_xGetKeyboardMappingReply 32
#define sz_xGetPointerMappingReply 32
#define sz_xGetModifierMappingReply 32
#define sz_xListFontsWithInfoReq 8
#define sz_xPolyLineReq 12
#define sz_xPolyArcReq 12
#define sz_xPolyRectangleReq 12
#define sz_xPolyFillRectangleReq 12
#define sz_xPolyFillArcReq 12
#define sz_xPolyText8Req 16
#define sz_xPolyText16Req 16
#define sz_xImageText8Req 16
#define sz_xImageText16Req 16
#define sz_xSetPointerMappingReq 4
#define sz_xForceScreenSaverReq 4
#define sz_xSetCloseDownModeReq 4
#define sz_xClearAreaReq 16
#define sz_xSetAccessControlReq 4
#define sz_xGetKeyboardMappingReq 8
#define sz_xSetModifierMappingReq 4
#define sz_xPropIconSize 24
#define sz_xChangeKeyboardMappingReq 8
/* For the purpose of the structure definitions in this file,
we must redefine the following types in terms of Xmd.h's types, which may
include bit fields. All of these are #undef'd at the end of this file,
restoring the definitions in X.h. */
#define Window CARD32
#define Drawable CARD32
#define Font CARD32
#define Pixmap CARD32
#define Cursor CARD32
#define Colormap CARD32
#define GContext CARD32
#define Atom CARD32
#define VisualID CARD32
#define Time CARD32
#define KeyCode CARD8
#define KeySym CARD32
#define X_TCP_PORT 6000 /* add display number */
#define xTrue 1
#define xFalse 0
typedef CARD16 KeyButMask;
/*****************
connection setup structure. This is followed by
numRoots xWindowRoot structs.
*****************/
typedef struct {
CARD8 byteOrder;
BYTE pad;
CARD16 majorVersion B16, minorVersion B16;
CARD16 nbytesAuthProto B16; /* Authorization protocol */
CARD16 nbytesAuthString B16; /* Authorization string */
CARD16 pad2 B16;
} xConnClientPrefix;
typedef struct {
CARD8 success;
BYTE lengthReason; /*num bytes in string following if failure */
CARD16 majorVersion B16,
minorVersion B16;
CARD16 length B16; /* 1/4 additional bytes in setup info */
} xConnSetupPrefix;
typedef struct {
CARD32 release B32;
CARD32 ridBase B32,
ridMask B32;
CARD32 motionBufferSize B32;
CARD16 nbytesVendor B16; /* number of bytes in vendor string */
CARD16 maxRequestSize B16;
CARD8 numRoots; /* number of roots structs to follow */
CARD8 numFormats; /* number of pixmap formats */
CARD8 imageByteOrder; /* LSBFirst, MSBFirst */
CARD8 bitmapBitOrder; /* LeastSignificant, MostSign...*/
CARD8 bitmapScanlineUnit, /* 8, 16, 32 */
bitmapScanlinePad; /* 8, 16, 32 */
KeyCode minKeyCode, maxKeyCode;
CARD32 pad2 B32;
} xConnSetup;
typedef struct {
CARD8 depth;
CARD8 bitsPerPixel;
CARD8 scanLinePad;
CARD8 pad1;
CARD32 pad2 B32;
} xPixmapFormat;
/* window root */
typedef struct {
CARD8 depth;
CARD8 pad1;
CARD16 nVisuals B16; /* number of xVisualType structures following */
CARD32 pad2 B32;
} xDepth;
typedef struct {
VisualID visualID B32;
#if defined(__cplusplus) || defined(c_plusplus)
CARD8 c_class;
#else
CARD8 class;
#endif
CARD8 bitsPerRGB;
CARD16 colormapEntries B16;
CARD32 redMask B32, greenMask B32, blueMask B32;
CARD32 pad B32;
} xVisualType;
typedef struct {
Window windowId B32;
Colormap defaultColormap B32;
CARD32 whitePixel B32, blackPixel B32;
CARD32 currentInputMask B32;
CARD16 pixWidth B16, pixHeight B16;
CARD16 mmWidth B16, mmHeight B16;
CARD16 minInstalledMaps B16, maxInstalledMaps B16;
VisualID rootVisualID B32;
CARD8 backingStore;
BOOL saveUnders;
CARD8 rootDepth;
CARD8 nDepths; /* number of xDepth structures following */
} xWindowRoot;
/*****************************************************************
* Structure Defns
* Structures needed for replies
*****************************************************************/
/* Used in GetMotionEvents */
typedef struct {
CARD32 time B32;
INT16 x B16, y B16;
} xTimecoord;
typedef struct {
CARD8 family;
BYTE pad;
CARD16 length B16;
} xHostEntry;
typedef struct {
INT16 leftSideBearing B16,
rightSideBearing B16,
characterWidth B16,
ascent B16,
descent B16;
CARD16 attributes B16;
} xCharInfo;
typedef struct {
Atom name B32;
CARD32 value B32;
} xFontProp;
/*
* non-aligned big-endian font ID follows this struct
*/
typedef struct { /* followed by string */
CARD8 len; /* number of *characters* in string, or FontChange (255)
for font change, or 0 if just delta given */
INT8 delta;
} xTextElt;
typedef struct {
CARD32 pixel B32;
CARD16 red B16, green B16, blue B16;
CARD8 flags; /* DoRed, DoGreen, DoBlue booleans */
CARD8 pad;
} xColorItem;
typedef struct {
CARD16 red B16, green B16, blue B16, pad B16;
} xrgb;
typedef CARD8 KEYCODE;
/*****************
* XRep:
* meant to be 32 byte quantity
*****************/
/* GenericReply is the common format of all replies. The "data" items
are specific to each individual reply type. */
typedef struct {
BYTE type; /* X_Reply */
BYTE data1; /* depends on reply type */
CARD16 sequenceNumber B16; /* of last request received by server */
CARD32 length B32; /* 4 byte quantities beyond size of GenericReply */
CARD32 data00 B32;
CARD32 data01 B32;
CARD32 data02 B32;
CARD32 data03 B32;
CARD32 data04 B32;
CARD32 data05 B32;
} xGenericReply;
/* Individual reply formats. */
typedef struct {
BYTE type; /* X_Reply */
CARD8 backingStore;
CARD16 sequenceNumber B16;
CARD32 length B32; /* NOT 0; this is an extra-large reply */
VisualID visualID B32;
#if defined(__cplusplus) || defined(c_plusplus)
CARD16 c_class B16;
#else
CARD16 class B16;
#endif
CARD8 bitGravity;
CARD8 winGravity;
CARD32 backingBitPlanes B32;
CARD32 backingPixel B32;
BOOL saveUnder;
BOOL mapInstalled;
CARD8 mapState;
BOOL override;
Colormap colormap B32;
CARD32 allEventMasks B32;
CARD32 yourEventMask B32;
CARD16 doNotPropagateMask B16;
CARD16 pad B16;
} xGetWindowAttributesReply;
typedef struct {
BYTE type; /* X_Reply */
CARD8 depth;
CARD16 sequenceNumber B16;
CARD32 length B32; /* 0 */
Window root B32;
INT16 x B16, y B16;
CARD16 width B16, height B16;
CARD16 borderWidth B16;
CARD16 pad1 B16;
CARD32 pad2 B32;
CARD32 pad3 B32;
} xGetGeometryReply;
typedef struct {
BYTE type; /* X_Reply */
BYTE pad1;
CARD16 sequenceNumber B16;
CARD32 length B32;
Window root B32, parent B32;
CARD16 nChildren B16;
CARD16 pad2 B16;
CARD32 pad3 B32;
CARD32 pad4 B32;
CARD32 pad5 B32;
} xQueryTreeReply;
typedef struct {
BYTE type; /* X_Reply */
BYTE pad1;
CARD16 sequenceNumber B16;
CARD32 length B32; /* 0 */
Atom atom B32;
CARD32 pad2 B32;
CARD32 pad3 B32;
CARD32 pad4 B32;
CARD32 pad5 B32;
CARD32 pad6 B32;
} xInternAtomReply;
typedef struct {
BYTE type; /* X_Reply */
BYTE pad1;
CARD16 sequenceNumber B16;
CARD32 length B32; /* of additional bytes */
CARD16 nameLength B16; /* # of characters in name */
CARD16 pad2 B16;
CARD32 pad3 B32;
CARD32 pad4 B32;
CARD32 pad5 B32;
CARD32 pad6 B32;
CARD32 pad7 B32;
} xGetAtomNameReply;
typedef struct {
BYTE type; /* X_Reply */
CARD8 format;
CARD16 sequenceNumber B16;
CARD32 length B32; /* of additional bytes */
Atom propertyType B32;
CARD32 bytesAfter B32;
CARD32 nItems B32; /* # of 8, 16, or 32-bit entities in reply */
CARD32 pad1 B32;
CARD32 pad2 B32;
CARD32 pad3 B32;
} xGetPropertyReply;
typedef struct {
BYTE type; /* X_Reply */
BYTE pad1;
CARD16 sequenceNumber B16;
CARD32 length B32;
CARD16 nProperties B16;
CARD16 pad2 B16;
CARD32 pad3 B32;
CARD32 pad4 B32;
CARD32 pad5 B32;
CARD32 pad6 B32;
CARD32 pad7 B32;
} xListPropertiesReply;
typedef struct {
BYTE type; /* X_Reply */
BYTE pad1;
CARD16 sequenceNumber B16;
CARD32 length B32; /* 0 */
Window owner B32;
CARD32 pad2 B32;
CARD32 pad3 B32;
CARD32 pad4 B32;
CARD32 pad5 B32;
CARD32 pad6 B32;
} xGetSelectionOwnerReply;
typedef struct {
BYTE type; /* X_Reply */
BYTE status;
CARD16 sequenceNumber B16;
CARD32 length B32; /* 0 */
CARD32 pad1 B32;
CARD32 pad2 B32;
CARD32 pad3 B32;
CARD32 pad4 B32;
CARD32 pad5 B32;
CARD32 pad6 B32;
} xGrabPointerReply;
typedef xGrabPointerReply xGrabKeyboardReply;
typedef struct {
BYTE type; /* X_Reply */
BOOL sameScreen;
CARD16 sequenceNumber B16;
CARD32 length B32; /* 0 */
Window root B32, child B32;
INT16 rootX B16, rootY B16, winX B16, winY B16;
CARD16 mask B16;
CARD16 pad1 B16;
CARD32 pad B32;
} xQueryPointerReply;
typedef struct {
BYTE type; /* X_Reply */
BYTE pad1;
CARD16 sequenceNumber B16;
CARD32 length B32;
CARD32 nEvents B32;
CARD32 pad2 B32;
CARD32 pad3 B32;
CARD32 pad4 B32;
CARD32 pad5 B32;
CARD32 pad6 B32;
} xGetMotionEventsReply;
typedef struct {
BYTE type; /* X_Reply */
BOOL sameScreen;
CARD16 sequenceNumber B16;
CARD32 length B32; /* 0 */
Window child B32;
INT16 dstX B16, dstY B16;
CARD32 pad2 B32;
CARD32 pad3 B32;
CARD32 pad4 B32;
CARD32 pad5 B32;
} xTranslateCoordsReply;
typedef struct {
BYTE type; /* X_Reply */
CARD8 revertTo;
CARD16 sequenceNumber B16;
CARD32 length B32; /* 0 */
Window focus B32;
CARD32 pad1 B32;
CARD32 pad2 B32;
CARD32 pad3 B32;
CARD32 pad4 B32;
CARD32 pad5 B32;
} xGetInputFocusReply;
typedef struct {
BYTE type; /* X_Reply */
BYTE pad1;
CARD16 sequenceNumber B16;
CARD32 length B32; /* 2, NOT 0; this is an extra-large reply */
BYTE map[32];
} xQueryKeymapReply;
/* Warning: this MUST match (up to component renaming) xListFontsWithInfoReply */
typedef struct _xQueryFontReply {
BYTE type; /* X_Reply */
BYTE pad1;
CARD16 sequenceNumber B16;
CARD32 length B32; /* definitely > 0, even if "nCharInfos" is 0 */
xCharInfo minBounds;
#ifndef WORD64
CARD32 walign1 B32;
#endif
xCharInfo maxBounds;
#ifndef WORD64
CARD32 walign2 B32;
#endif
CARD16 minCharOrByte2 B16, maxCharOrByte2 B16;
CARD16 defaultChar B16;
CARD16 nFontProps B16; /* followed by this many xFontProp structures */
CARD8 drawDirection;
CARD8 minByte1, maxByte1;
BOOL allCharsExist;
INT16 fontAscent B16, fontDescent B16;
CARD32 nCharInfos B32; /* followed by this many xCharInfo structures */
} xQueryFontReply;
typedef struct {
BYTE type; /* X_Reply */
CARD8 drawDirection;
CARD16 sequenceNumber B16;
CARD32 length B32; /* 0 */
INT16 fontAscent B16, fontDescent B16;
INT16 overallAscent B16, overallDescent B16;
INT32 overallWidth B32, overallLeft B32, overallRight B32;
CARD32 pad B32;
} xQueryTextExtentsReply;
typedef struct {
BYTE type; /* X_Reply */
BYTE pad1;
CARD16 sequenceNumber B16;
CARD32 length B32;
CARD16 nFonts B16;
CARD16 pad2 B16;
CARD32 pad3 B32;
CARD32 pad4 B32;
CARD32 pad5 B32;
CARD32 pad6 B32;
CARD32 pad7 B32;
} xListFontsReply;
/* Warning: this MUST match (up to component renaming) xQueryFontReply */
typedef struct {
BYTE type; /* X_Reply */
CARD8 nameLength; /* 0 indicates end-of-reply-sequence */
CARD16 sequenceNumber B16;
CARD32 length B32; /* definitely > 0, even if "nameLength" is 0 */
xCharInfo minBounds;
#ifndef WORD64
CARD32 walign1 B32;
#endif
xCharInfo maxBounds;
#ifndef WORD64
CARD32 walign2 B32;
#endif
CARD16 minCharOrByte2 B16, maxCharOrByte2 B16;
CARD16 defaultChar B16;
CARD16 nFontProps B16; /* followed by this many xFontProp structures */
CARD8 drawDirection;
CARD8 minByte1, maxByte1;
BOOL allCharsExist;
INT16 fontAscent B16, fontDescent B16;
CARD32 nReplies B32; /* hint as to how many more replies might be coming */
} xListFontsWithInfoReply;
typedef struct {
BYTE type; /* X_Reply */
BYTE pad1;
CARD16 sequenceNumber B16;
CARD32 length B32;
CARD16 nPaths B16;
CARD16 pad2 B16;
CARD32 pad3 B32;
CARD32 pad4 B32;
CARD32 pad5 B32;
CARD32 pad6 B32;
CARD32 pad7 B32;
} xGetFontPathReply;
typedef struct {
BYTE type; /* X_Reply */
CARD8 depth;
CARD16 sequenceNumber B16;
CARD32 length B32;
VisualID visual B32;
CARD32 pad3 B32;
CARD32 pad4 B32;
CARD32 pad5 B32;
CARD32 pad6 B32;
CARD32 pad7 B32;
} xGetImageReply;
typedef struct {
BYTE type; /* X_Reply */
BYTE pad1;
CARD16 sequenceNumber B16;
CARD32 length B32;
CARD16 nColormaps B16;
CARD16 pad2 B16;
CARD32 pad3 B32;
CARD32 pad4 B32;
CARD32 pad5 B32;
CARD32 pad6 B32;
CARD32 pad7 B32;
} xListInstalledColormapsReply;
typedef struct {
BYTE type; /* X_Reply */
BYTE pad1;
CARD16 sequenceNumber B16;
CARD32 length B32; /* 0 */
CARD16 red B16, green B16, blue B16;
CARD16 pad2 B16;
CARD32 pixel B32;
CARD32 pad3 B32;
CARD32 pad4 B32;
CARD32 pad5 B32;
} xAllocColorReply;
typedef struct {
BYTE type; /* X_Reply */
BYTE pad1;
CARD16 sequenceNumber B16;
CARD32 length B32; /* 0 */
CARD32 pixel B32;
CARD16 exactRed B16, exactGreen B16, exactBlue B16;
CARD16 screenRed B16, screenGreen B16, screenBlue B16;
CARD32 pad2 B32;
CARD32 pad3 B32;
} xAllocNamedColorReply;
typedef struct {
BYTE type; /* X_Reply */
BYTE pad1;
CARD16 sequenceNumber B16;
CARD32 length B32;
CARD16 nPixels B16, nMasks B16;
CARD32 pad3 B32;
CARD32 pad4 B32;
CARD32 pad5 B32;
CARD32 pad6 B32;
CARD32 pad7 B32;
} xAllocColorCellsReply;
typedef struct {
BYTE type; /* X_Reply */
BYTE pad1;
CARD16 sequenceNumber B16;
CARD32 length B32;
CARD16 nPixels B16;
CARD16 pad2 B16;
CARD32 redMask B32, greenMask B32, blueMask B32;
CARD32 pad3 B32;
CARD32 pad4 B32;
} xAllocColorPlanesReply;
typedef struct {
BYTE type; /* X_Reply */
BYTE pad1;
CARD16 sequenceNumber B16;
CARD32 length B32;
CARD16 nColors B16;
CARD16 pad2 B16;
CARD32 pad3 B32;
CARD32 pad4 B32;
CARD32 pad5 B32;
CARD32 pad6 B32;
CARD32 pad7 B32;
} xQueryColorsReply;
typedef struct {
BYTE type; /* X_Reply */
BYTE pad1;
CARD16 sequenceNumber B16;
CARD32 length B32; /* 0 */
CARD16 exactRed B16, exactGreen B16, exactBlue B16;
CARD16 screenRed B16, screenGreen B16, screenBlue B16;
CARD32 pad3 B32;
CARD32 pad4 B32;
CARD32 pad5 B32;
} xLookupColorReply;
typedef struct {
BYTE type; /* X_Reply */
BYTE pad1;
CARD16 sequenceNumber B16;
CARD32 length B32; /* 0 */
CARD16 width B16, height B16;
CARD32 pad3 B32;
CARD32 pad4 B32;
CARD32 pad5 B32;
CARD32 pad6 B32;
CARD32 pad7 B32;
} xQueryBestSizeReply;
typedef struct {
BYTE type; /* X_Reply */
BYTE pad1;
CARD16 sequenceNumber B16;
CARD32 length B32; /* 0 */
BOOL present;
CARD8 major_opcode;
CARD8 first_event;
CARD8 first_error;
CARD32 pad3 B32;
CARD32 pad4 B32;
CARD32 pad5 B32;
CARD32 pad6 B32;
CARD32 pad7 B32;
} xQueryExtensionReply;
typedef struct {
BYTE type; /* X_Reply */
CARD8 nExtensions;
CARD16 sequenceNumber B16;
CARD32 length B32;
CARD32 pad2 B32;
CARD32 pad3 B32;
CARD32 pad4 B32;
CARD32 pad5 B32;
CARD32 pad6 B32;
CARD32 pad7 B32;
} xListExtensionsReply;
typedef struct {
BYTE type; /* X_Reply */
CARD8 success;
CARD16 sequenceNumber B16;
CARD32 length B32;
CARD32 pad2 B32;
CARD32 pad3 B32;
CARD32 pad4 B32;
CARD32 pad5 B32;
CARD32 pad6 B32;
CARD32 pad7 B32;
} xSetMappingReply;
typedef xSetMappingReply xSetPointerMappingReply;
typedef xSetMappingReply xSetModifierMappingReply;
typedef struct {
BYTE type; /* X_Reply */
CARD8 nElts; /* how many elements does the map have */
CARD16 sequenceNumber B16;
CARD32 length B32;
CARD32 pad2 B32;
CARD32 pad3 B32;
CARD32 pad4 B32;
CARD32 pad5 B32;
CARD32 pad6 B32;
CARD32 pad7 B32;
} xGetPointerMappingReply;
typedef struct {
BYTE type;
CARD8 keySymsPerKeyCode;
CARD16 sequenceNumber B16;
CARD32 length B32;
CARD32 pad2 B32;
CARD32 pad3 B32;
CARD32 pad4 B32;
CARD32 pad5 B32;
CARD32 pad6 B32;
CARD32 pad7 B32;
} xGetKeyboardMappingReply;
typedef struct {
BYTE type;
CARD8 numKeyPerModifier;
CARD16 sequenceNumber B16;
CARD32 length B32;
CARD32 pad1 B32;
CARD32 pad2 B32;
CARD32 pad3 B32;
CARD32 pad4 B32;
CARD32 pad5 B32;
CARD32 pad6 B32;
} xGetModifierMappingReply;
typedef struct {
BYTE type; /* X_Reply */
BOOL globalAutoRepeat;
CARD16 sequenceNumber B16;
CARD32 length B32; /* 5 */
CARD32 ledMask B32;
CARD8 keyClickPercent, bellPercent;
CARD16 bellPitch B16, bellDuration B16;
CARD16 pad B16;
BYTE map[32]; /* bit masks start here */
} xGetKeyboardControlReply;
typedef struct {
BYTE type; /* X_Reply */
BYTE pad1;
CARD16 sequenceNumber B16;
CARD32 length B32; /* 0 */
CARD16 accelNumerator B16, accelDenominator B16;
CARD16 threshold B16;
CARD16 pad2 B16;
CARD32 pad3 B32;
CARD32 pad4 B32;
CARD32 pad5 B32;
CARD32 pad6 B32;
} xGetPointerControlReply;
typedef struct {
BYTE type; /* X_Reply */
BYTE pad1;
CARD16 sequenceNumber B16;
CARD32 length B32; /* 0 */
CARD16 timeout B16, interval B16;
BOOL preferBlanking;
BOOL allowExposures;
CARD16 pad2 B16;
CARD32 pad3 B32;
CARD32 pad4 B32;
CARD32 pad5 B32;
CARD32 pad6 B32;
} xGetScreenSaverReply;
typedef struct {
BYTE type; /* X_Reply */
BOOL enabled;
CARD16 sequenceNumber B16;
CARD32 length B32;
CARD16 nHosts B16;
CARD16 pad1 B16;
CARD32 pad3 B32;
CARD32 pad4 B32;
CARD32 pad5 B32;
CARD32 pad6 B32;
CARD32 pad7 B32;
} xListHostsReply;
/*****************************************************************
* Xerror
* All errors are 32 bytes
*****************************************************************/
typedef struct {
BYTE type; /* X_Error */
BYTE errorCode;
CARD16 sequenceNumber B16; /* the nth request from this client */
CARD32 resourceID B32;
CARD16 minorCode B16;
CARD8 majorCode;
BYTE pad1;
CARD32 pad3 B32;
CARD32 pad4 B32;
CARD32 pad5 B32;
CARD32 pad6 B32;
CARD32 pad7 B32;
} xError;
/*****************************************************************
* xEvent
* All events are 32 bytes
*****************************************************************/
typedef struct _xEvent {
union {
struct {
BYTE type;
BYTE detail;
CARD16 sequenceNumber B16;
} u;
struct {
CARD32 pad00 B32;
Time time B32;
Window root B32, event B32, child B32;
INT16 rootX B16, rootY B16, eventX B16, eventY B16;
KeyButMask state B16;
BOOL sameScreen;
BYTE pad1;
} keyButtonPointer;
struct {
CARD32 pad00 B32;
Time time B32;
Window root B32, event B32, child B32;
INT16 rootX B16, rootY B16, eventX B16, eventY B16;
KeyButMask state B16;
BYTE mode; /* really XMode */
BYTE flags; /* sameScreen and focus booleans, packed together */
#define ELFlagFocus (1<<0)
#define ELFlagSameScreen (1<<1)
} enterLeave;
struct {
CARD32 pad00 B32;
Window window B32;
BYTE mode; /* really XMode */
BYTE pad1, pad2, pad3;
} focus;
struct {
CARD32 pad00 B32;
Window window B32;
CARD16 x B16, y B16, width B16, height B16;
CARD16 count B16;
CARD16 pad2 B16;
} expose;
struct {
CARD32 pad00 B32;
Drawable drawable B32;
CARD16 x B16, y B16, width B16, height B16;
CARD16 minorEvent B16;
CARD16 count B16;
BYTE majorEvent;
BYTE pad1, pad2, pad3;
} graphicsExposure;
struct {
CARD32 pad00 B32;
Drawable drawable B32;
CARD16 minorEvent B16;
BYTE majorEvent;
BYTE bpad;
} noExposure;
struct {
CARD32 pad00 B32;
Window window B32;
CARD8 state;
BYTE pad1, pad2, pad3;
} visibility;
struct {
CARD32 pad00 B32;
Window parent B32, window B32;
INT16 x B16, y B16;
CARD16 width B16, height B16, borderWidth B16;
BOOL override;
BYTE bpad;
} createNotify;
/*
* The event feilds in the structures for DestroyNotify, UnmapNotify,
* MapNotify, ReparentNotify, ConfigureNotify, CirclulateNotify, GravityNotify,
* must be at the same offset because server internal code is depending upon
* this to patch up the events before they are delivered.
* Also note that MapRequest, ConfigureRequest and CirculateRequest have
* the same offset for the event window.
*/
struct {
CARD32 pad00 B32;
Window event B32, window B32;
} destroyNotify;
struct {
CARD32 pad00 B32;
Window event B32, window B32;
BOOL fromConfigure;
BYTE pad1, pad2, pad3;
} unmapNotify;
struct {
CARD32 pad00 B32;
Window event B32, window B32;
BOOL override;
BYTE pad1, pad2, pad3;
} mapNotify;
struct {
CARD32 pad00 B32;
Window parent B32, window B32;
} mapRequest;
struct {
CARD32 pad00 B32;
Window event B32, window B32, parent B32;
INT16 x B16, y B16;
BOOL override;
BYTE pad1, pad2, pad3;
} reparent;
struct {
CARD32 pad00 B32;
Window event B32, window B32, aboveSibling B32;
INT16 x B16, y B16;
CARD16 width B16, height B16, borderWidth B16;
BOOL override;
BYTE bpad;
} configureNotify;
struct {
CARD32 pad00 B32;
Window parent B32, window B32, sibling B32;
INT16 x B16, y B16;
CARD16 width B16, height B16, borderWidth B16;
CARD16 valueMask B16;
CARD32 pad1 B32;
} configureRequest;
struct {
CARD32 pad00 B32;
Window event B32, window B32;
INT16 x B16, y B16;
CARD32 pad1 B32, pad2 B32, pad3 B32, pad4 B32;
} gravity;
struct {
CARD32 pad00 B32;
Window window B32;
CARD16 width B16, height B16;
} resizeRequest;
struct {
/* The event field in the circulate record is really the parent when this
is used as a CirculateRequest insteaad of a CircluateNotify */
CARD32 pad00 B32;
Window event B32, window B32, parent B32;
BYTE place; /* Top or Bottom */
BYTE pad1, pad2, pad3;
} circulate;
struct {
CARD32 pad00 B32;
Window window B32;
Atom atom B32;
Time time B32;
BYTE state; /* NewValue or Deleted */
BYTE pad1;
CARD16 pad2 B16;
} property;
struct {
CARD32 pad00 B32;
Time time B32;
Window window B32;
Atom atom B32;
} selectionClear;
struct {
CARD32 pad00 B32;
Time time B32;
Window owner B32, requestor B32;
Atom selection B32, target B32, property B32;
} selectionRequest;
struct {
CARD32 pad00 B32;
Time time B32;
Window requestor B32;
Atom selection B32, target B32, property B32;
} selectionNotify;
struct {
CARD32 pad00 B32;
Window window B32;
Colormap colormap B32;
#if defined(__cplusplus) || defined(c_plusplus)
BOOL c_new;
#else
BOOL new;
#endif
BYTE state; /* Installed or UnInstalled */
BYTE pad1, pad2;
} colormap;
struct {
CARD32 pad00 B32;
CARD8 request;
KeyCode firstKeyCode;
CARD8 count;
BYTE pad1;
} mappingNotify;
struct {
CARD32 pad00 B32;
Window window B32;
union {
struct {
Atom type B32;
INT32 longs0 B32;
INT32 longs1 B32;
INT32 longs2 B32;
INT32 longs3 B32;
INT32 longs4 B32;
} l;
struct {
Atom type B32;
INT16 shorts0 B16;
INT16 shorts1 B16;
INT16 shorts2 B16;
INT16 shorts3 B16;
INT16 shorts4 B16;
INT16 shorts5 B16;
INT16 shorts6 B16;
INT16 shorts7 B16;
INT16 shorts8 B16;
INT16 shorts9 B16;
} s;
struct {
Atom type B32;
INT8 bytes[20];
} b;
} u;
} clientMessage;
} u;
} xEvent;
/* KeymapNotify events are not included in the above union because they
are different from all other events: they do not have a "detail"
or "sequenceNumber", so there is room for a 248-bit key mask. */
typedef struct {
BYTE type;
BYTE map[31];
} xKeymapEvent;
#define XEventSize (sizeof(xEvent))
/* XReply is the union of all the replies above whose "fixed part"
fits in 32 bytes. It does NOT include GetWindowAttributesReply,
QueryFontReply, QueryKeymapReply, or GetKeyboardControlReply
ListFontsWithInfoReply */
typedef union {
xGenericReply generic;
xGetGeometryReply geom;
xQueryTreeReply tree;
xInternAtomReply atom;
xGetAtomNameReply atomName;
xGetPropertyReply property;
xListPropertiesReply listProperties;
xGetSelectionOwnerReply selection;
xGrabPointerReply grabPointer;
xGrabKeyboardReply grabKeyboard;
xQueryPointerReply pointer;
xGetMotionEventsReply motionEvents;
xTranslateCoordsReply coords;
xGetInputFocusReply inputFocus;
xQueryTextExtentsReply textExtents;
xListFontsReply fonts;
xGetFontPathReply fontPath;
xGetImageReply image;
xListInstalledColormapsReply colormaps;
xAllocColorReply allocColor;
xAllocNamedColorReply allocNamedColor;
xAllocColorCellsReply colorCells;
xAllocColorPlanesReply colorPlanes;
xQueryColorsReply colors;
xLookupColorReply lookupColor;
xQueryBestSizeReply bestSize;
xQueryExtensionReply extension;
xListExtensionsReply extensions;
xSetModifierMappingReply setModifierMapping;
xGetModifierMappingReply getModifierMapping;
xSetPointerMappingReply setPointerMapping;
xGetKeyboardMappingReply getKeyboardMapping;
xGetPointerMappingReply getPointerMapping;
xGetPointerControlReply pointerControl;
xGetScreenSaverReply screenSaver;
xListHostsReply hosts;
xError error;
xEvent event;
} xReply;
/*****************************************************************
* REQUESTS
*****************************************************************/
/* Request structure */
typedef struct _xReq {
CARD8 reqType;
CARD8 data; /* meaning depends on request type */
CARD16 length B16; /* length in 4 bytes quantities
of whole request, including this header */
} xReq;
/*****************************************************************
* structures that follow request.
*****************************************************************/
/* ResourceReq is used for any request which has a resource ID
(or Atom or Time) as its one and only argument. */
typedef struct {
CARD8 reqType;
BYTE pad;
CARD16 length B16;
CARD32 id B32; /* a Window, Drawable, Font, GContext, Pixmap, etc. */
} xResourceReq;
typedef struct {
CARD8 reqType;
CARD8 depth;
CARD16 length B16;
Window wid B32, parent B32;
INT16 x B16, y B16;
CARD16 width B16, height B16, borderWidth B16;
#if defined(__cplusplus) || defined(c_plusplus)
CARD16 c_class B16;
#else
CARD16 class B16;
#endif
VisualID visual B32;
CARD32 mask B32;
} xCreateWindowReq;
typedef struct {
CARD8 reqType;
BYTE pad;
CARD16 length B16;
Window window B32;
CARD32 valueMask B32;
} xChangeWindowAttributesReq;
typedef struct {
CARD8 reqType;
BYTE mode;
CARD16 length B16;
Window window B32;
} xChangeSaveSetReq;
typedef struct {
CARD8 reqType;
BYTE pad;
CARD16 length B16;
Window window B32, parent B32;
INT16 x B16, y B16;
} xReparentWindowReq;
typedef struct {
CARD8 reqType;
CARD8 pad;
CARD16 length B16;
Window window B32;
CARD16 mask B16;
CARD16 pad2 B16;
} xConfigureWindowReq;
typedef struct {
CARD8 reqType;
CARD8 direction;
CARD16 length B16;
Window window B32;
} xCirculateWindowReq;
typedef struct { /* followed by padded string */
CARD8 reqType;
BOOL onlyIfExists;
CARD16 length B16;
CARD16 nbytes B16; /* number of bytes in string */
CARD16 pad B16;
} xInternAtomReq;
typedef struct {
CARD8 reqType;
CARD8 mode;
CARD16 length B16;
Window window B32;
Atom property B32, type B32;
CARD8 format;
BYTE pad[3];
CARD32 nUnits B32; /* length of stuff following, depends on format */
} xChangePropertyReq;
typedef struct {
CARD8 reqType;
BYTE pad;
CARD16 length B16;
Window window B32;
Atom property B32;
} xDeletePropertyReq;
typedef struct {
CARD8 reqType;
#if defined(__cplusplus) || defined(c_plusplus)
BOOL c_delete;
#else
BOOL delete;
#endif
CARD16 length B16;
Window window B32;
Atom property B32, type B32;
CARD32 longOffset B32;
CARD32 longLength B32;
} xGetPropertyReq;
typedef struct {
CARD8 reqType;
BYTE pad;
CARD16 length B16;
Window window B32;
Atom selection B32;
Time time B32;
} xSetSelectionOwnerReq;
typedef struct {
CARD8 reqType;
BYTE pad;
CARD16 length B16;
Window requestor B32;
Atom selection B32, target B32, property B32;
Time time B32;
} xConvertSelectionReq;
typedef struct {
CARD8 reqType;
BOOL propagate;
CARD16 length B16;
Window destination B32;
CARD32 eventMask B32;
#ifdef WORD64
/* the structure should have been quad-aligned */
BYTE eventdata[SIZEOF(xEvent)];
#else
xEvent event;
#endif /* WORD64 */
} xSendEventReq;
typedef struct {
CARD8 reqType;
BOOL ownerEvents;
CARD16 length B16;
Window grabWindow B32;
CARD16 eventMask B16;
BYTE pointerMode, keyboardMode;
Window confineTo B32;
Cursor cursor B32;
Time time B32;
} xGrabPointerReq;
typedef struct {
CARD8 reqType;
BOOL ownerEvents;
CARD16 length B16;
Window grabWindow B32;
CARD16 eventMask B16;
BYTE pointerMode, keyboardMode;
Window confineTo B32;
Cursor cursor B32;
CARD8 button;
BYTE pad;
CARD16 modifiers B16;
} xGrabButtonReq;
typedef struct {
CARD8 reqType;
CARD8 button;
CARD16 length B16;
Window grabWindow B32;
CARD16 modifiers B16;
CARD16 pad B16;
} xUngrabButtonReq;
typedef struct {
CARD8 reqType;
BYTE pad;
CARD16 length B16;
Cursor cursor B32;
Time time B32;
CARD16 eventMask B16;
CARD16 pad2 B16;
} xChangeActivePointerGrabReq;
typedef struct {
CARD8 reqType;
BOOL ownerEvents;
CARD16 length B16;
Window grabWindow B32;
Time time B32;
BYTE pointerMode, keyboardMode;
CARD16 pad B16;
} xGrabKeyboardReq;
typedef struct {
CARD8 reqType;
BOOL ownerEvents;
CARD16 length B16;
Window grabWindow B32;
CARD16 modifiers B16;
CARD8 key;
BYTE pointerMode, keyboardMode;
BYTE pad1, pad2, pad3;
} xGrabKeyReq;
typedef struct {
CARD8 reqType;
CARD8 key;
CARD16 length B16;
Window grabWindow B32;
CARD16 modifiers B16;
CARD16 pad B16;
} xUngrabKeyReq;
typedef struct {
CARD8 reqType;
CARD8 mode;
CARD16 length B16;
Time time B32;
} xAllowEventsReq;
typedef struct {
CARD8 reqType;
BYTE pad;
CARD16 length B16;
Window window B32;
Time start B32, stop B32;
} xGetMotionEventsReq;
typedef struct {
CARD8 reqType;
BYTE pad;
CARD16 length B16;
Window srcWid B32, dstWid B32;
INT16 srcX B16, srcY B16;
} xTranslateCoordsReq;
typedef struct {
CARD8 reqType;
BYTE pad;
CARD16 length B16;
Window srcWid B32, dstWid B32;
INT16 srcX B16, srcY B16;
CARD16 srcWidth B16, srcHeight B16;
INT16 dstX B16, dstY B16;
} xWarpPointerReq;
typedef struct {
CARD8 reqType;
CARD8 revertTo;
CARD16 length B16;
Window focus B32;
Time time B32;
} xSetInputFocusReq;
typedef struct {
CARD8 reqType;
BYTE pad;
CARD16 length B16;
Font fid B32;
CARD16 nbytes B16;
BYTE pad1, pad2; /* string follows on word boundary */
} xOpenFontReq;
typedef struct {
CARD8 reqType;
BOOL oddLength;
CARD16 length B16;
Font fid B32;
} xQueryTextExtentsReq;
typedef struct {
CARD8 reqType;
BYTE pad;
CARD16 length B16;
CARD16 maxNames B16;
CARD16 nbytes B16; /* followed immediately by string bytes */
} xListFontsReq;
typedef xListFontsReq xListFontsWithInfoReq;
typedef struct {
CARD8 reqType;
BYTE pad;
CARD16 length B16;
CARD16 nFonts B16;
BYTE pad1, pad2; /* LISTofSTRING8 follows on word boundary */
} xSetFontPathReq;
typedef struct {
CARD8 reqType;
CARD8 depth;
CARD16 length B16;
Pixmap pid B32;
Drawable drawable B32;
CARD16 width B16, height B16;
} xCreatePixmapReq;
typedef struct {
CARD8 reqType;
BYTE pad;
CARD16 length B16;
GContext gc B32;
Drawable drawable B32;
CARD32 mask B32;
} xCreateGCReq;
typedef struct {
CARD8 reqType;
BYTE pad;
CARD16 length B16;
GContext gc B32;
CARD32 mask B32;
} xChangeGCReq;
typedef struct {
CARD8 reqType;
BYTE pad;
CARD16 length B16;
GContext srcGC B32, dstGC B32;
CARD32 mask B32;
} xCopyGCReq;
typedef struct {
CARD8 reqType;
BYTE pad;
CARD16 length B16;
GContext gc B32;
CARD16 dashOffset B16;
CARD16 nDashes B16; /* length LISTofCARD8 of values following */
} xSetDashesReq;
typedef struct {
CARD8 reqType;
BYTE ordering;
CARD16 length B16;
GContext gc B32;
INT16 xOrigin B16, yOrigin B16;
} xSetClipRectanglesReq;
typedef struct {
CARD8 reqType;
BOOL exposures;
CARD16 length B16;
Window window B32;
INT16 x B16, y B16;
CARD16 width B16, height B16;
} xClearAreaReq;
typedef struct {
CARD8 reqType;
BYTE pad;
CARD16 length B16;
Drawable srcDrawable B32, dstDrawable B32;
GContext gc B32;
INT16 srcX B16, srcY B16, dstX B16, dstY B16;
CARD16 width B16, height B16;
} xCopyAreaReq;
typedef struct {
CARD8 reqType;
BYTE pad;
CARD16 length B16;
Drawable srcDrawable B32, dstDrawable B32;
GContext gc B32;
INT16 srcX B16, srcY B16, dstX B16, dstY B16;
CARD16 width B16, height B16;
CARD32 bitPlane B32;
} xCopyPlaneReq;
typedef struct {
CARD8 reqType;
BYTE coordMode;
CARD16 length B16;
Drawable drawable B32;
GContext gc B32;
} xPolyPointReq;
typedef xPolyPointReq xPolyLineReq; /* same request structure */
/* The following used for PolySegment, PolyRectangle, PolyArc, PolyFillRectangle, PolyFillArc */
typedef struct {
CARD8 reqType;
BYTE pad;
CARD16 length B16;
Drawable drawable B32;
GContext gc B32;
} xPolySegmentReq;
typedef xPolySegmentReq xPolyArcReq;
typedef xPolySegmentReq xPolyRectangleReq;
typedef xPolySegmentReq xPolyFillRectangleReq;
typedef xPolySegmentReq xPolyFillArcReq;
typedef struct _FillPolyReq {
CARD8 reqType;
BYTE pad;
CARD16 length B16;
Drawable drawable B32;
GContext gc B32;
BYTE shape;
BYTE coordMode;
CARD16 pad1 B16;
} xFillPolyReq;
typedef struct _PutImageReq {
CARD8 reqType;
CARD8 format;
CARD16 length B16;
Drawable drawable B32;
GContext gc B32;
CARD16 width B16, height B16;
INT16 dstX B16, dstY B16;
CARD8 leftPad;
CARD8 depth;
CARD16 pad B16;
} xPutImageReq;
typedef struct {
CARD8 reqType;
CARD8 format;
CARD16 length B16;
Drawable drawable B32;
INT16 x B16, y B16;
CARD16 width B16, height B16;
CARD32 planeMask B32;
} xGetImageReq;
/* the folloiwng used by PolyText8 and PolyText16 */
typedef struct {
CARD8 reqType;
CARD8 pad;
CARD16 length B16;
Drawable drawable B32;
GContext gc B32;
INT16 x B16, y B16; /* items (xTextElt) start after struct */
} xPolyTextReq;
typedef xPolyTextReq xPolyText8Req;
typedef xPolyTextReq xPolyText16Req;
typedef struct {
CARD8 reqType;
BYTE nChars;
CARD16 length B16;
Drawable drawable B32;
GContext gc B32;
INT16 x B16, y B16;
} xImageTextReq;
typedef xImageTextReq xImageText8Req;
typedef xImageTextReq xImageText16Req;
typedef struct {
CARD8 reqType;
BYTE alloc;
CARD16 length B16;
Colormap mid B32;
Window window B32;
VisualID visual B32;
} xCreateColormapReq;
typedef struct {
CARD8 reqType;
BYTE pad;
CARD16 length B16;
Colormap mid B32;
Colormap srcCmap B32;
} xCopyColormapAndFreeReq;
typedef struct {
CARD8 reqType;
BYTE pad;
CARD16 length B16;
Colormap cmap B32;
CARD16 red B16, green B16, blue B16;
CARD16 pad2 B16;
} xAllocColorReq;
typedef struct {
CARD8 reqType;
BYTE pad;
CARD16 length B16;
Colormap cmap B32;
CARD16 nbytes B16; /* followed by structure */
BYTE pad1, pad2;
} xAllocNamedColorReq;
typedef struct {
CARD8 reqType;
BOOL contiguous;
CARD16 length B16;
Colormap cmap B32;
CARD16 colors B16, planes B16;
} xAllocColorCellsReq;
typedef struct {
CARD8 reqType;
BOOL contiguous;
CARD16 length B16;
Colormap cmap B32;
CARD16 colors B16, red B16, green B16, blue B16;
} xAllocColorPlanesReq;
typedef struct {
CARD8 reqType;
BYTE pad;
CARD16 length B16;
Colormap cmap B32;
CARD32 planeMask B32;
} xFreeColorsReq;
typedef struct {
CARD8 reqType;
BYTE pad;
CARD16 length B16;
Colormap cmap B32;
} xStoreColorsReq;
typedef struct {
CARD8 reqType;
CARD8 flags; /* DoRed, DoGreen, DoBlue, as in xColorItem */
CARD16 length B16;
Colormap cmap B32;
CARD32 pixel B32;
CARD16 nbytes B16; /* number of name string bytes following structure */
BYTE pad1, pad2;
} xStoreNamedColorReq;
typedef struct {
CARD8 reqType;
BYTE pad;
CARD16 length B16;
Colormap cmap B32;
} xQueryColorsReq;
typedef struct { /* followed by string of length len */
CARD8 reqType;
BYTE pad;
CARD16 length B16;
Colormap cmap B32;
CARD16 nbytes B16; /* number of string bytes following structure*/
BYTE pad1, pad2;
} xLookupColorReq;
typedef struct {
CARD8 reqType;
BYTE pad;
CARD16 length B16;
Cursor cid B32;
Pixmap source B32, mask B32;
CARD16 foreRed B16, foreGreen B16, foreBlue B16;
CARD16 backRed B16, backGreen B16, backBlue B16;
CARD16 x B16, y B16;
} xCreateCursorReq;
typedef struct {
CARD8 reqType;
BYTE pad;
CARD16 length B16;
Cursor cid B32;
Font source B32, mask B32;
CARD16 sourceChar B16, maskChar B16;
CARD16 foreRed B16, foreGreen B16, foreBlue B16;
CARD16 backRed B16, backGreen B16, backBlue B16;
} xCreateGlyphCursorReq;
typedef struct {
CARD8 reqType;
BYTE pad;
CARD16 length B16;
Cursor cursor B32;
CARD16 foreRed B16, foreGreen B16, foreBlue B16;
CARD16 backRed B16, backGreen B16, backBlue B16;
} xRecolorCursorReq;
typedef struct {
CARD8 reqType;
#if defined(__cplusplus) || defined(c_plusplus)
CARD8 c_class;
#else
CARD8 class;
#endif
CARD16 length B16;
Drawable drawable B32;
CARD16 width B16, height B16;
} xQueryBestSizeReq;
typedef struct {
CARD8 reqType;
BYTE pad;
CARD16 length B16;
CARD16 nbytes B16; /* number of string bytes following structure */
BYTE pad1, pad2;
} xQueryExtensionReq;
typedef struct {
CARD8 reqType;
CARD8 numKeyPerModifier;
CARD16 length B16;
} xSetModifierMappingReq;
typedef struct {
CARD8 reqType;
CARD8 nElts; /* how many elements in the map */
CARD16 length B16;
} xSetPointerMappingReq;
typedef struct {
CARD8 reqType;
BYTE pad;
CARD16 length B16;
KeyCode firstKeyCode;
CARD8 count;
CARD16 pad1 B16;
} xGetKeyboardMappingReq;
typedef struct {
CARD8 reqType;
CARD8 keyCodes;
CARD16 length B16;
KeyCode firstKeyCode;
CARD8 keySymsPerKeyCode;
CARD16 pad1 B16;
} xChangeKeyboardMappingReq;
typedef struct {
CARD8 reqType;
BYTE pad;
CARD16 length B16;
CARD32 mask B32;
} xChangeKeyboardControlReq;
typedef struct {
CARD8 reqType;
INT8 percent; /* -100 to 100 */
CARD16 length B16;
} xBellReq;
typedef struct {
CARD8 reqType;
BYTE pad;
CARD16 length B16;
INT16 accelNum B16, accelDenum B16;
INT16 threshold B16;
BOOL doAccel, doThresh;
} xChangePointerControlReq;
typedef struct {
CARD8 reqType;
BYTE pad;
CARD16 length B16;
INT16 timeout B16, interval B16;
BYTE preferBlank, allowExpose;
CARD16 pad2 B16;
} xSetScreenSaverReq;
typedef struct {
CARD8 reqType;
BYTE mode;
CARD16 length B16;
CARD8 hostFamily;
BYTE pad;
CARD16 hostLength B16;
} xChangeHostsReq;
typedef struct {
CARD8 reqType;
BYTE pad;
CARD16 length B16;
} xListHostsReq;
typedef struct {
CARD8 reqType;
BYTE mode;
CARD16 length B16;
} xChangeModeReq;
typedef xChangeModeReq xSetAccessControlReq;
typedef xChangeModeReq xSetCloseDownModeReq;
typedef xChangeModeReq xForceScreenSaverReq;
typedef struct { /* followed by LIST of ATOM */
CARD8 reqType;
BYTE pad;
CARD16 length B16;
Window window B32;
CARD16 nAtoms B16;
INT16 nPositions B16;
} xRotatePropertiesReq;
/* Reply codes */
#define X_Reply 1 /* Normal reply */
#define X_Error 0 /* Error */
/* Request codes */
#define X_CreateWindow 1
#define X_ChangeWindowAttributes 2
#define X_GetWindowAttributes 3
#define X_DestroyWindow 4
#define X_DestroySubwindows 5
#define X_ChangeSaveSet 6
#define X_ReparentWindow 7
#define X_MapWindow 8
#define X_MapSubwindows 9
#define X_UnmapWindow 10
#define X_UnmapSubwindows 11
#define X_ConfigureWindow 12
#define X_CirculateWindow 13
#define X_GetGeometry 14
#define X_QueryTree 15
#define X_InternAtom 16
#define X_GetAtomName 17
#define X_ChangeProperty 18
#define X_DeleteProperty 19
#define X_GetProperty 20
#define X_ListProperties 21
#define X_SetSelectionOwner 22
#define X_GetSelectionOwner 23
#define X_ConvertSelection 24
#define X_SendEvent 25
#define X_GrabPointer 26
#define X_UngrabPointer 27
#define X_GrabButton 28
#define X_UngrabButton 29
#define X_ChangeActivePointerGrab 30
#define X_GrabKeyboard 31
#define X_UngrabKeyboard 32
#define X_GrabKey 33
#define X_UngrabKey 34
#define X_AllowEvents 35
#define X_GrabServer 36
#define X_UngrabServer 37
#define X_QueryPointer 38
#define X_GetMotionEvents 39
#define X_TranslateCoords 40
#define X_WarpPointer 41
#define X_SetInputFocus 42
#define X_GetInputFocus 43
#define X_QueryKeymap 44
#define X_OpenFont 45
#define X_CloseFont 46
#define X_QueryFont 47
#define X_QueryTextExtents 48
#define X_ListFonts 49
#define X_ListFontsWithInfo 50
#define X_SetFontPath 51
#define X_GetFontPath 52
#define X_CreatePixmap 53
#define X_FreePixmap 54
#define X_CreateGC 55
#define X_ChangeGC 56
#define X_CopyGC 57
#define X_SetDashes 58
#define X_SetClipRectangles 59
#define X_FreeGC 60
#define X_ClearArea 61
#define X_CopyArea 62
#define X_CopyPlane 63
#define X_PolyPoint 64
#define X_PolyLine 65
#define X_PolySegment 66
#define X_PolyRectangle 67
#define X_PolyArc 68
#define X_FillPoly 69
#define X_PolyFillRectangle 70
#define X_PolyFillArc 71
#define X_PutImage 72
#define X_GetImage 73
#define X_PolyText8 74
#define X_PolyText16 75
#define X_ImageText8 76
#define X_ImageText16 77
#define X_CreateColormap 78
#define X_FreeColormap 79
#define X_CopyColormapAndFree 80
#define X_InstallColormap 81
#define X_UninstallColormap 82
#define X_ListInstalledColormaps 83
#define X_AllocColor 84
#define X_AllocNamedColor 85
#define X_AllocColorCells 86
#define X_AllocColorPlanes 87
#define X_FreeColors 88
#define X_StoreColors 89
#define X_StoreNamedColor 90
#define X_QueryColors 91
#define X_LookupColor 92
#define X_CreateCursor 93
#define X_CreateGlyphCursor 94
#define X_FreeCursor 95
#define X_RecolorCursor 96
#define X_QueryBestSize 97
#define X_QueryExtension 98
#define X_ListExtensions 99
#define X_ChangeKeyboardMapping 100
#define X_GetKeyboardMapping 101
#define X_ChangeKeyboardControl 102
#define X_GetKeyboardControl 103
#define X_Bell 104
#define X_ChangePointerControl 105
#define X_GetPointerControl 106
#define X_SetScreenSaver 107
#define X_GetScreenSaver 108
#define X_ChangeHosts 109
#define X_ListHosts 110
#define X_SetAccessControl 111
#define X_SetCloseDownMode 112
#define X_KillClient 113
#define X_RotateProperties 114
#define X_ForceScreenSaver 115
#define X_SetPointerMapping 116
#define X_GetPointerMapping 117
#define X_SetModifierMapping 118
#define X_GetModifierMapping 119
#define X_NoOperation 127
/* restore these definitions back to the typedefs in X.h */
#undef Window
#undef Drawable
#undef Font
#undef Pixmap
#undef Cursor
#undef Colormap
#undef GContext
#undef Atom
#undef VisualID
#undef Time
#undef KeyCode
#undef KeySym
#endif /* XPROTO_H */
/* $XConsortium: Xprotostr.h,v 1.5 94/04/17 20:10:53 rws Exp $ */
#ifndef XPROTOSTRUCTS_H
#define XPROTOSTRUCTS_H
/***********************************************************
Copyright (c) 1987 X Consortium
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
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
X CONSORTIUM 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 X Consortium 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 X Consortium.
Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
All Rights Reserved
Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the name of Digital not be
used in advertising or publicity pertaining to distribution of the
software without specific, written prior permission.
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
SOFTWARE.
******************************************************************/
#include <X11/Xmd.h>
/* Used by PolySegment */
typedef struct _xSegment {
INT16 x1 B16, y1 B16, x2 B16, y2 B16;
} xSegment;
/* POINT */
typedef struct _xPoint {
INT16 x B16, y B16;
} xPoint;
typedef struct _xRectangle {
INT16 x B16, y B16;
CARD16 width B16, height B16;
} xRectangle;
/* ARC */
typedef struct _xArc {
INT16 x B16, y B16;
CARD16 width B16, height B16;
INT16 angle1 B16, angle2 B16;
} xArc;
#endif /* XPROTOSTRUCTS_H */
/* $XConsortium: keysym.h,v 1.15 94/04/17 20:10:55 rws Exp $ */
/***********************************************************
Copyright (c) 1987 X Consortium
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
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
X CONSORTIUM 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 X Consortium 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 X Consortium.
Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
All Rights Reserved
Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the name of Digital not be
used in advertising or publicity pertaining to distribution of the
software without specific, written prior permission.
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
SOFTWARE.
******************************************************************/
/* default keysyms */
#define XK_MISCELLANY
#define XK_XKB_KEYS
#define XK_LATIN1
#define XK_LATIN2
#define XK_LATIN3
#define XK_LATIN4
#define XK_GREEK
#include <X11/keysymdef.h>
/* $TOG: keysymdef.h /main/25 1997/06/21 10:54:51 kaleb $ */
/***********************************************************
Copyright (c) 1987, 1994 X Consortium
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
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 X CONSORTIUM 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 X Consortium 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 X Consortium.
Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts
All Rights Reserved
Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the name of Digital not be
used in advertising or publicity pertaining to distribution of the
software without specific, written prior permission.
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
SOFTWARE.
******************************************************************/
#define XK_VoidSymbol 0xFFFFFF /* void symbol */
#ifdef XK_MISCELLANY
/*
* TTY Functions, cleverly chosen to map to ascii, for convenience of
* programming, but could have been arbitrary (at the cost of lookup
* tables in client code.
*/
#define XK_BackSpace 0xFF08 /* back space, back char */
#define XK_Tab 0xFF09
#define XK_Linefeed 0xFF0A /* Linefeed, LF */
#define XK_Clear 0xFF0B
#define XK_Return 0xFF0D /* Return, enter */
#define XK_Pause 0xFF13 /* Pause, hold */
#define XK_Scroll_Lock 0xFF14
#define XK_Sys_Req 0xFF15
#define XK_Escape 0xFF1B
#define XK_Delete 0xFFFF /* Delete, rubout */
/* International & multi-key character composition */
#define XK_Multi_key 0xFF20 /* Multi-key character compose */
#define XK_SingleCandidate 0xFF3C
#define XK_MultipleCandidate 0xFF3D
#define XK_PreviousCandidate 0xFF3E
/* Japanese keyboard support */
#define XK_Kanji 0xFF21 /* Kanji, Kanji convert */
#define XK_Muhenkan 0xFF22 /* Cancel Conversion */
#define XK_Henkan_Mode 0xFF23 /* Start/Stop Conversion */
#define XK_Henkan 0xFF23 /* Alias for Henkan_Mode */
#define XK_Romaji 0xFF24 /* to Romaji */
#define XK_Hiragana 0xFF25 /* to Hiragana */
#define XK_Katakana 0xFF26 /* to Katakana */
#define XK_Hiragana_Katakana 0xFF27 /* Hiragana/Katakana toggle */
#define XK_Zenkaku 0xFF28 /* to Zenkaku */
#define XK_Hankaku 0xFF29 /* to Hankaku */
#define XK_Zenkaku_Hankaku 0xFF2A /* Zenkaku/Hankaku toggle */
#define XK_Touroku 0xFF2B /* Add to Dictionary */
#define XK_Massyo 0xFF2C /* Delete from Dictionary */
#define XK_Kana_Lock 0xFF2D /* Kana Lock */
#define XK_Kana_Shift 0xFF2E /* Kana Shift */
#define XK_Eisu_Shift 0xFF2F /* Alphanumeric Shift */
#define XK_Eisu_toggle 0xFF30 /* Alphanumeric toggle */
#define XK_Zen_Koho 0xFF3D /* Multiple/All Candidate(s) */
#define XK_Mae_Koho 0xFF3E /* Previous Candidate */
/* 0xFF31 thru 0xFF3F are under XK_KOREAN */
/* Cursor control & motion */
#define XK_Home 0xFF50
#define XK_Left 0xFF51 /* Move left, left arrow */
#define XK_Up 0xFF52 /* Move up, up arrow */
#define XK_Right 0xFF53 /* Move right, right arrow */
#define XK_Down 0xFF54 /* Move down, down arrow */
#define XK_Prior 0xFF55 /* Prior, previous */
#define XK_Page_Up 0xFF55
#define XK_Next 0xFF56 /* Next */
#define XK_Page_Down 0xFF56
#define XK_End 0xFF57 /* EOL */
#define XK_Begin 0xFF58 /* BOL */
/* Misc Functions */
#define XK_Select 0xFF60 /* Select, mark */
#define XK_Print 0xFF61
#define XK_Execute 0xFF62 /* Execute, run, do */
#define XK_Insert 0xFF63 /* Insert, insert here */
#define XK_Undo 0xFF65 /* Undo, oops */
#define XK_Redo 0xFF66 /* redo, again */
#define XK_Menu 0xFF67
#define XK_Find 0xFF68 /* Find, search */
#define XK_Cancel 0xFF69 /* Cancel, stop, abort, exit */
#define XK_Help 0xFF6A /* Help */
#define XK_Break 0xFF6B
#define XK_Mode_switch 0xFF7E /* Character set switch */
#define XK_script_switch 0xFF7E /* Alias for mode_switch */
#define XK_Num_Lock 0xFF7F
/* Keypad Functions, keypad numbers cleverly chosen to map to ascii */
#define XK_KP_Space 0xFF80 /* space */
#define XK_KP_Tab 0xFF89
#define XK_KP_Enter 0xFF8D /* enter */
#define XK_KP_F1 0xFF91 /* PF1, KP_A, ... */
#define XK_KP_F2 0xFF92
#define XK_KP_F3 0xFF93
#define XK_KP_F4 0xFF94
#define XK_KP_Home 0xFF95
#define XK_KP_Left 0xFF96
#define XK_KP_Up 0xFF97
#define XK_KP_Right 0xFF98
#define XK_KP_Down 0xFF99
#define XK_KP_Prior 0xFF9A
#define XK_KP_Page_Up 0xFF9A
#define XK_KP_Next 0xFF9B
#define XK_KP_Page_Down 0xFF9B
#define XK_KP_End 0xFF9C
#define XK_KP_Begin 0xFF9D
#define XK_KP_Insert 0xFF9E
#define XK_KP_Delete 0xFF9F
#define XK_KP_Equal 0xFFBD /* equals */
#define XK_KP_Multiply 0xFFAA
#define XK_KP_Add 0xFFAB
#define XK_KP_Separator 0xFFAC /* separator, often comma */
#define XK_KP_Subtract 0xFFAD
#define XK_KP_Decimal 0xFFAE
#define XK_KP_Divide 0xFFAF
#define XK_KP_0 0xFFB0
#define XK_KP_1 0xFFB1
#define XK_KP_2 0xFFB2
#define XK_KP_3 0xFFB3
#define XK_KP_4 0xFFB4
#define XK_KP_5 0xFFB5
#define XK_KP_6 0xFFB6
#define XK_KP_7 0xFFB7
#define XK_KP_8 0xFFB8
#define XK_KP_9 0xFFB9
/*
* Auxilliary Functions; note the duplicate definitions for left and right
* function keys; Sun keyboards and a few other manufactures have such
* function key groups on the left and/or right sides of the keyboard.
* We've not found a keyboard with more than 35 function keys total.
*/
#define XK_F1 0xFFBE
#define XK_F2 0xFFBF
#define XK_F3 0xFFC0
#define XK_F4 0xFFC1
#define XK_F5 0xFFC2
#define XK_F6 0xFFC3
#define XK_F7 0xFFC4
#define XK_F8 0xFFC5
#define XK_F9 0xFFC6
#define XK_F10 0xFFC7
#define XK_F11 0xFFC8
#define XK_L1 0xFFC8
#define XK_F12 0xFFC9
#define XK_L2 0xFFC9
#define XK_F13 0xFFCA
#define XK_L3 0xFFCA
#define XK_F14 0xFFCB
#define XK_L4 0xFFCB
#define XK_F15 0xFFCC
#define XK_L5 0xFFCC
#define XK_F16 0xFFCD
#define XK_L6 0xFFCD
#define XK_F17 0xFFCE
#define XK_L7 0xFFCE
#define XK_F18 0xFFCF
#define XK_L8 0xFFCF
#define XK_F19 0xFFD0
#define XK_L9 0xFFD0
#define XK_F20 0xFFD1
#define XK_L10 0xFFD1
#define XK_F21 0xFFD2
#define XK_R1 0xFFD2
#define XK_F22 0xFFD3
#define XK_R2 0xFFD3
#define XK_F23 0xFFD4
#define XK_R3 0xFFD4
#define XK_F24 0xFFD5
#define XK_R4 0xFFD5
#define XK_F25 0xFFD6
#define XK_R5 0xFFD6
#define XK_F26 0xFFD7
#define XK_R6 0xFFD7
#define XK_F27 0xFFD8
#define XK_R7 0xFFD8
#define XK_F28 0xFFD9
#define XK_R8 0xFFD9
#define XK_F29 0xFFDA
#define XK_R9 0xFFDA
#define XK_F30 0xFFDB
#define XK_R10 0xFFDB
#define XK_F31 0xFFDC
#define XK_R11 0xFFDC
#define XK_F32 0xFFDD
#define XK_R12 0xFFDD
#define XK_F33 0xFFDE
#define XK_R13 0xFFDE
#define XK_F34 0xFFDF
#define XK_R14 0xFFDF
#define XK_F35 0xFFE0
#define XK_R15 0xFFE0
/* Modifiers */
#define XK_Shift_L 0xFFE1 /* Left shift */
#define XK_Shift_R 0xFFE2 /* Right shift */
#define XK_Control_L 0xFFE3 /* Left control */
#define XK_Control_R 0xFFE4 /* Right control */
#define XK_Caps_Lock 0xFFE5 /* Caps lock */
#define XK_Shift_Lock 0xFFE6 /* Shift lock */
#define XK_Meta_L 0xFFE7 /* Left meta */
#define XK_Meta_R 0xFFE8 /* Right meta */
#define XK_Alt_L 0xFFE9 /* Left alt */
#define XK_Alt_R 0xFFEA /* Right alt */
#define XK_Super_L 0xFFEB /* Left super */
#define XK_Super_R 0xFFEC /* Right super */
#define XK_Hyper_L 0xFFED /* Left hyper */
#define XK_Hyper_R 0xFFEE /* Right hyper */
#endif /* XK_MISCELLANY */
/*
* ISO 9995 Function and Modifier Keys
* Byte 3 = 0xFE
*/
#ifdef XK_XKB_KEYS
#define XK_ISO_Lock 0xFE01
#define XK_ISO_Level2_Latch 0xFE02
#define XK_ISO_Level3_Shift 0xFE03
#define XK_ISO_Level3_Latch 0xFE04
#define XK_ISO_Level3_Lock 0xFE05
#define XK_ISO_Group_Shift 0xFF7E /* Alias for mode_switch */
#define XK_ISO_Group_Latch 0xFE06
#define XK_ISO_Group_Lock 0xFE07
#define XK_ISO_Next_Group 0xFE08
#define XK_ISO_Next_Group_Lock 0xFE09
#define XK_ISO_Prev_Group 0xFE0A
#define XK_ISO_Prev_Group_Lock 0xFE0B
#define XK_ISO_First_Group 0xFE0C
#define XK_ISO_First_Group_Lock 0xFE0D
#define XK_ISO_Last_Group 0xFE0E
#define XK_ISO_Last_Group_Lock 0xFE0F
#define XK_ISO_Left_Tab 0xFE20
#define XK_ISO_Move_Line_Up 0xFE21
#define XK_ISO_Move_Line_Down 0xFE22
#define XK_ISO_Partial_Line_Up 0xFE23
#define XK_ISO_Partial_Line_Down 0xFE24
#define XK_ISO_Partial_Space_Left 0xFE25
#define XK_ISO_Partial_Space_Right 0xFE26
#define XK_ISO_Set_Margin_Left 0xFE27
#define XK_ISO_Set_Margin_Right 0xFE28
#define XK_ISO_Release_Margin_Left 0xFE29
#define XK_ISO_Release_Margin_Right 0xFE2A
#define XK_ISO_Release_Both_Margins 0xFE2B
#define XK_ISO_Fast_Cursor_Left 0xFE2C
#define XK_ISO_Fast_Cursor_Right 0xFE2D
#define XK_ISO_Fast_Cursor_Up 0xFE2E
#define XK_ISO_Fast_Cursor_Down 0xFE2F
#define XK_ISO_Continuous_Underline 0xFE30
#define XK_ISO_Discontinuous_Underline 0xFE31
#define XK_ISO_Emphasize 0xFE32
#define XK_ISO_Center_Object 0xFE33
#define XK_ISO_Enter 0xFE34
#define XK_dead_grave 0xFE50
#define XK_dead_acute 0xFE51
#define XK_dead_circumflex 0xFE52
#define XK_dead_tilde 0xFE53
#define XK_dead_macron 0xFE54
#define XK_dead_breve 0xFE55
#define XK_dead_abovedot 0xFE56
#define XK_dead_diaeresis 0xFE57
#define XK_dead_abovering 0xFE58
#define XK_dead_doubleacute 0xFE59
#define XK_dead_caron 0xFE5A
#define XK_dead_cedilla 0xFE5B
#define XK_dead_ogonek 0xFE5C
#define XK_dead_iota 0xFE5D
#define XK_dead_voiced_sound 0xFE5E
#define XK_dead_semivoiced_sound 0xFE5F
#define XK_dead_belowdot 0xFE60
#define XK_First_Virtual_Screen 0xFED0
#define XK_Prev_Virtual_Screen 0xFED1
#define XK_Next_Virtual_Screen 0xFED2
#define XK_Last_Virtual_Screen 0xFED4
#define XK_Terminate_Server 0xFED5
#define XK_AccessX_Enable 0xFE70
#define XK_AccessX_Feedback_Enable 0xFE71
#define XK_RepeatKeys_Enable 0xFE72
#define XK_SlowKeys_Enable 0xFE73
#define XK_BounceKeys_Enable 0xFE74
#define XK_StickyKeys_Enable 0xFE75
#define XK_MouseKeys_Enable 0xFE76
#define XK_MouseKeys_Accel_Enable 0xFE77
#define XK_Overlay1_Enable 0xFE78
#define XK_Overlay2_Enable 0xFE79
#define XK_AudibleBell_Enable 0xFE7A
#define XK_Pointer_Left 0xFEE0
#define XK_Pointer_Right 0xFEE1
#define XK_Pointer_Up 0xFEE2
#define XK_Pointer_Down 0xFEE3
#define XK_Pointer_UpLeft 0xFEE4
#define XK_Pointer_UpRight 0xFEE5
#define XK_Pointer_DownLeft 0xFEE6
#define XK_Pointer_DownRight 0xFEE7
#define XK_Pointer_Button_Dflt 0xFEE8
#define XK_Pointer_Button1 0xFEE9
#define XK_Pointer_Button2 0xFEEA
#define XK_Pointer_Button3 0xFEEB
#define XK_Pointer_Button4 0xFEEC
#define XK_Pointer_Button5 0xFEED
#define XK_Pointer_DblClick_Dflt 0xFEEE
#define XK_Pointer_DblClick1 0xFEEF
#define XK_Pointer_DblClick2 0xFEF0
#define XK_Pointer_DblClick3 0xFEF1
#define XK_Pointer_DblClick4 0xFEF2
#define XK_Pointer_DblClick5 0xFEF3
#define XK_Pointer_Drag_Dflt 0xFEF4
#define XK_Pointer_Drag1 0xFEF5
#define XK_Pointer_Drag2 0xFEF6
#define XK_Pointer_Drag3 0xFEF7
#define XK_Pointer_Drag4 0xFEF8
#define XK_Pointer_Drag5 0xFEFD
#define XK_Pointer_EnableKeys 0xFEF9
#define XK_Pointer_Accelerate 0xFEFA
#define XK_Pointer_DfltBtnNext 0xFEFB
#define XK_Pointer_DfltBtnPrev 0xFEFC
#endif
/*
* 3270 Terminal Keys
* Byte 3 = 0xFD
*/
#ifdef XK_3270
#define XK_3270_Duplicate 0xFD01
#define XK_3270_FieldMark 0xFD02
#define XK_3270_Right2 0xFD03
#define XK_3270_Left2 0xFD04
#define XK_3270_BackTab 0xFD05
#define XK_3270_EraseEOF 0xFD06
#define XK_3270_EraseInput 0xFD07
#define XK_3270_Reset 0xFD08
#define XK_3270_Quit 0xFD09
#define XK_3270_PA1 0xFD0A
#define XK_3270_PA2 0xFD0B
#define XK_3270_PA3 0xFD0C
#define XK_3270_Test 0xFD0D
#define XK_3270_Attn 0xFD0E
#define XK_3270_CursorBlink 0xFD0F
#define XK_3270_AltCursor 0xFD10
#define XK_3270_KeyClick 0xFD11
#define XK_3270_Jump 0xFD12
#define XK_3270_Ident 0xFD13
#define XK_3270_Rule 0xFD14
#define XK_3270_Copy 0xFD15
#define XK_3270_Play 0xFD16
#define XK_3270_Setup 0xFD17
#define XK_3270_Record 0xFD18
#define XK_3270_ChangeScreen 0xFD19
#define XK_3270_DeleteWord 0xFD1A
#define XK_3270_ExSelect 0xFD1B
#define XK_3270_CursorSelect 0xFD1C
#define XK_3270_PrintScreen 0xFD1D
#define XK_3270_Enter 0xFD1E
#endif
/*
* Latin 1
* Byte 3 = 0
*/
#ifdef XK_LATIN1
#define XK_space 0x020
#define XK_exclam 0x021
#define XK_quotedbl 0x022
#define XK_numbersign 0x023
#define XK_dollar 0x024
#define XK_percent 0x025
#define XK_ampersand 0x026
#define XK_apostrophe 0x027
#define XK_quoteright 0x027 /* deprecated */
#define XK_parenleft 0x028
#define XK_parenright 0x029
#define XK_asterisk 0x02a
#define XK_plus 0x02b
#define XK_comma 0x02c
#define XK_minus 0x02d
#define XK_period 0x02e
#define XK_slash 0x02f
#define XK_0 0x030
#define XK_1 0x031
#define XK_2 0x032
#define XK_3 0x033
#define XK_4 0x034
#define XK_5 0x035
#define XK_6 0x036
#define XK_7 0x037
#define XK_8 0x038
#define XK_9 0x039
#define XK_colon 0x03a
#define XK_semicolon 0x03b
#define XK_less 0x03c
#define XK_equal 0x03d
#define XK_greater 0x03e
#define XK_question 0x03f
#define XK_at 0x040
#define XK_A 0x041
#define XK_B 0x042
#define XK_C 0x043
#define XK_D 0x044
#define XK_E 0x045
#define XK_F 0x046
#define XK_G 0x047
#define XK_H 0x048
#define XK_I 0x049
#define XK_J 0x04a
#define XK_K 0x04b
#define XK_L 0x04c
#define XK_M 0x04d
#define XK_N 0x04e
#define XK_O 0x04f
#define XK_P 0x050
#define XK_Q 0x051
#define XK_R 0x052
#define XK_S 0x053
#define XK_T 0x054
#define XK_U 0x055
#define XK_V 0x056
#define XK_W 0x057
#define XK_X 0x058
#define XK_Y 0x059
#define XK_Z 0x05a
#define XK_bracketleft 0x05b
#define XK_backslash 0x05c
#define XK_bracketright 0x05d
#define XK_asciicircum 0x05e
#define XK_underscore 0x05f
#define XK_grave 0x060
#define XK_quoteleft 0x060 /* deprecated */
#define XK_a 0x061
#define XK_b 0x062
#define XK_c 0x063
#define XK_d 0x064
#define XK_e 0x065
#define XK_f 0x066
#define XK_g 0x067
#define XK_h 0x068
#define XK_i 0x069
#define XK_j 0x06a
#define XK_k 0x06b
#define XK_l 0x06c
#define XK_m 0x06d
#define XK_n 0x06e
#define XK_o 0x06f
#define XK_p 0x070
#define XK_q 0x071
#define XK_r 0x072
#define XK_s 0x073
#define XK_t 0x074
#define XK_u 0x075
#define XK_v 0x076
#define XK_w 0x077
#define XK_x 0x078
#define XK_y 0x079
#define XK_z 0x07a
#define XK_braceleft 0x07b
#define XK_bar 0x07c
#define XK_braceright 0x07d
#define XK_asciitilde 0x07e
#define XK_nobreakspace 0x0a0
#define XK_exclamdown 0x0a1
#define XK_cent 0x0a2
#define XK_sterling 0x0a3
#define XK_currency 0x0a4
#define XK_yen 0x0a5
#define XK_brokenbar 0x0a6
#define XK_section 0x0a7
#define XK_diaeresis 0x0a8
#define XK_copyright 0x0a9
#define XK_ordfeminine 0x0aa
#define XK_guillemotleft 0x0ab /* left angle quotation mark */
#define XK_notsign 0x0ac
#define XK_hyphen 0x0ad
#define XK_registered 0x0ae
#define XK_macron 0x0af
#define XK_degree 0x0b0
#define XK_plusminus 0x0b1
#define XK_twosuperior 0x0b2
#define XK_threesuperior 0x0b3
#define XK_acute 0x0b4
#define XK_mu 0x0b5
#define XK_paragraph 0x0b6
#define XK_periodcentered 0x0b7
#define XK_cedilla 0x0b8
#define XK_onesuperior 0x0b9
#define XK_masculine 0x0ba
#define XK_guillemotright 0x0bb /* right angle quotation mark */
#define XK_onequarter 0x0bc
#define XK_onehalf 0x0bd
#define XK_threequarters 0x0be
#define XK_questiondown 0x0bf
#define XK_Agrave 0x0c0
#define XK_Aacute 0x0c1
#define XK_Acircumflex 0x0c2
#define XK_Atilde 0x0c3
#define XK_Adiaeresis 0x0c4
#define XK_Aring 0x0c5
#define XK_AE 0x0c6
#define XK_Ccedilla 0x0c7
#define XK_Egrave 0x0c8
#define XK_Eacute 0x0c9
#define XK_Ecircumflex 0x0ca
#define XK_Ediaeresis 0x0cb
#define XK_Igrave 0x0cc
#define XK_Iacute 0x0cd
#define XK_Icircumflex 0x0ce
#define XK_Idiaeresis 0x0cf
#define XK_ETH 0x0d0
#define XK_Eth 0x0d0 /* deprecated */
#define XK_Ntilde 0x0d1
#define XK_Ograve 0x0d2
#define XK_Oacute 0x0d3
#define XK_Ocircumflex 0x0d4
#define XK_Otilde 0x0d5
#define XK_Odiaeresis 0x0d6
#define XK_multiply 0x0d7
#define XK_Ooblique 0x0d8
#define XK_Ugrave 0x0d9
#define XK_Uacute 0x0da
#define XK_Ucircumflex 0x0db
#define XK_Udiaeresis 0x0dc
#define XK_Yacute 0x0dd
#define XK_THORN 0x0de
#define XK_Thorn 0x0de /* deprecated */
#define XK_ssharp 0x0df
#define XK_agrave 0x0e0
#define XK_aacute 0x0e1
#define XK_acircumflex 0x0e2
#define XK_atilde 0x0e3
#define XK_adiaeresis 0x0e4
#define XK_aring 0x0e5
#define XK_ae 0x0e6
#define XK_ccedilla 0x0e7
#define XK_egrave 0x0e8
#define XK_eacute 0x0e9
#define XK_ecircumflex 0x0ea
#define XK_ediaeresis 0x0eb
#define XK_igrave 0x0ec
#define XK_iacute 0x0ed
#define XK_icircumflex 0x0ee
#define XK_idiaeresis 0x0ef
#define XK_eth 0x0f0
#define XK_ntilde 0x0f1
#define XK_ograve 0x0f2
#define XK_oacute 0x0f3
#define XK_ocircumflex 0x0f4
#define XK_otilde 0x0f5
#define XK_odiaeresis 0x0f6
#define XK_division 0x0f7
#define XK_oslash 0x0f8
#define XK_ugrave 0x0f9
#define XK_uacute 0x0fa
#define XK_ucircumflex 0x0fb
#define XK_udiaeresis 0x0fc
#define XK_yacute 0x0fd
#define XK_thorn 0x0fe
#define XK_ydiaeresis 0x0ff
#endif /* XK_LATIN1 */
/*
* Latin 2
* Byte 3 = 1
*/
#ifdef XK_LATIN2
#define XK_Aogonek 0x1a1
#define XK_breve 0x1a2
#define XK_Lstroke 0x1a3
#define XK_Lcaron 0x1a5
#define XK_Sacute 0x1a6
#define XK_Scaron 0x1a9
#define XK_Scedilla 0x1aa
#define XK_Tcaron 0x1ab
#define XK_Zacute 0x1ac
#define XK_Zcaron 0x1ae
#define XK_Zabovedot 0x1af
#define XK_aogonek 0x1b1
#define XK_ogonek 0x1b2
#define XK_lstroke 0x1b3
#define XK_lcaron 0x1b5
#define XK_sacute 0x1b6
#define XK_caron 0x1b7
#define XK_scaron 0x1b9
#define XK_scedilla 0x1ba
#define XK_tcaron 0x1bb
#define XK_zacute 0x1bc
#define XK_doubleacute 0x1bd
#define XK_zcaron 0x1be
#define XK_zabovedot 0x1bf
#define XK_Racute 0x1c0
#define XK_Abreve 0x1c3
#define XK_Lacute 0x1c5
#define XK_Cacute 0x1c6
#define XK_Ccaron 0x1c8
#define XK_Eogonek 0x1ca
#define XK_Ecaron 0x1cc
#define XK_Dcaron 0x1cf
#define XK_Dstroke 0x1d0
#define XK_Nacute 0x1d1
#define XK_Ncaron 0x1d2
#define XK_Odoubleacute 0x1d5
#define XK_Rcaron 0x1d8
#define XK_Uring 0x1d9
#define XK_Udoubleacute 0x1db
#define XK_Tcedilla 0x1de
#define XK_racute 0x1e0
#define XK_abreve 0x1e3
#define XK_lacute 0x1e5
#define XK_cacute 0x1e6
#define XK_ccaron 0x1e8
#define XK_eogonek 0x1ea
#define XK_ecaron 0x1ec
#define XK_dcaron 0x1ef
#define XK_dstroke 0x1f0
#define XK_nacute 0x1f1
#define XK_ncaron 0x1f2
#define XK_odoubleacute 0x1f5
#define XK_udoubleacute 0x1fb
#define XK_rcaron 0x1f8
#define XK_uring 0x1f9
#define XK_tcedilla 0x1fe
#define XK_abovedot 0x1ff
#endif /* XK_LATIN2 */
/*
* Latin 3
* Byte 3 = 2
*/
#ifdef XK_LATIN3
#define XK_Hstroke 0x2a1
#define XK_Hcircumflex 0x2a6
#define XK_Iabovedot 0x2a9
#define XK_Gbreve 0x2ab
#define XK_Jcircumflex 0x2ac
#define XK_hstroke 0x2b1
#define XK_hcircumflex 0x2b6
#define XK_idotless 0x2b9
#define XK_gbreve 0x2bb
#define XK_jcircumflex 0x2bc
#define XK_Cabovedot 0x2c5
#define XK_Ccircumflex 0x2c6
#define XK_Gabovedot 0x2d5
#define XK_Gcircumflex 0x2d8
#define XK_Ubreve 0x2dd
#define XK_Scircumflex 0x2de
#define XK_cabovedot 0x2e5
#define XK_ccircumflex 0x2e6
#define XK_gabovedot 0x2f5
#define XK_gcircumflex 0x2f8
#define XK_ubreve 0x2fd
#define XK_scircumflex 0x2fe
#endif /* XK_LATIN3 */
/*
* Latin 4
* Byte 3 = 3
*/
#ifdef XK_LATIN4
#define XK_kra 0x3a2
#define XK_kappa 0x3a2 /* deprecated */
#define XK_Rcedilla 0x3a3
#define XK_Itilde 0x3a5
#define XK_Lcedilla 0x3a6
#define XK_Emacron 0x3aa
#define XK_Gcedilla 0x3ab
#define XK_Tslash 0x3ac
#define XK_rcedilla 0x3b3
#define XK_itilde 0x3b5
#define XK_lcedilla 0x3b6
#define XK_emacron 0x3ba
#define XK_gcedilla 0x3bb
#define XK_tslash 0x3bc
#define XK_ENG 0x3bd
#define XK_eng 0x3bf
#define XK_Amacron 0x3c0
#define XK_Iogonek 0x3c7
#define XK_Eabovedot 0x3cc
#define XK_Imacron 0x3cf
#define XK_Ncedilla 0x3d1
#define XK_Omacron 0x3d2
#define XK_Kcedilla 0x3d3
#define XK_Uogonek 0x3d9
#define XK_Utilde 0x3dd
#define XK_Umacron 0x3de
#define XK_amacron 0x3e0
#define XK_iogonek 0x3e7
#define XK_eabovedot 0x3ec
#define XK_imacron 0x3ef
#define XK_ncedilla 0x3f1
#define XK_omacron 0x3f2
#define XK_kcedilla 0x3f3
#define XK_uogonek 0x3f9
#define XK_utilde 0x3fd
#define XK_umacron 0x3fe
#endif /* XK_LATIN4 */
/*
* Katakana
* Byte 3 = 4
*/
#ifdef XK_KATAKANA
#define XK_overline 0x47e
#define XK_kana_fullstop 0x4a1
#define XK_kana_openingbracket 0x4a2
#define XK_kana_closingbracket 0x4a3
#define XK_kana_comma 0x4a4
#define XK_kana_conjunctive 0x4a5
#define XK_kana_middledot 0x4a5 /* deprecated */
#define XK_kana_WO 0x4a6
#define XK_kana_a 0x4a7
#define XK_kana_i 0x4a8
#define XK_kana_u 0x4a9
#define XK_kana_e 0x4aa
#define XK_kana_o 0x4ab
#define XK_kana_ya 0x4ac
#define XK_kana_yu 0x4ad
#define XK_kana_yo 0x4ae
#define XK_kana_tsu 0x4af
#define XK_kana_tu 0x4af /* deprecated */
#define XK_prolongedsound 0x4b0
#define XK_kana_A 0x4b1
#define XK_kana_I 0x4b2
#define XK_kana_U 0x4b3
#define XK_kana_E 0x4b4
#define XK_kana_O 0x4b5
#define XK_kana_KA 0x4b6
#define XK_kana_KI 0x4b7
#define XK_kana_KU 0x4b8
#define XK_kana_KE 0x4b9
#define XK_kana_KO 0x4ba
#define XK_kana_SA 0x4bb
#define XK_kana_SHI 0x4bc
#define XK_kana_SU 0x4bd
#define XK_kana_SE 0x4be
#define XK_kana_SO 0x4bf
#define XK_kana_TA 0x4c0
#define XK_kana_CHI 0x4c1
#define XK_kana_TI 0x4c1 /* deprecated */
#define XK_kana_TSU 0x4c2
#define XK_kana_TU 0x4c2 /* deprecated */
#define XK_kana_TE 0x4c3
#define XK_kana_TO 0x4c4
#define XK_kana_NA 0x4c5
#define XK_kana_NI 0x4c6
#define XK_kana_NU 0x4c7
#define XK_kana_NE 0x4c8
#define XK_kana_NO 0x4c9
#define XK_kana_HA 0x4ca
#define XK_kana_HI 0x4cb
#define XK_kana_FU 0x4cc
#define XK_kana_HU 0x4cc /* deprecated */
#define XK_kana_HE 0x4cd
#define XK_kana_HO 0x4ce
#define XK_kana_MA 0x4cf
#define XK_kana_MI 0x4d0
#define XK_kana_MU 0x4d1
#define XK_kana_ME 0x4d2
#define XK_kana_MO 0x4d3
#define XK_kana_YA 0x4d4
#define XK_kana_YU 0x4d5
#define XK_kana_YO 0x4d6
#define XK_kana_RA 0x4d7
#define XK_kana_RI 0x4d8
#define XK_kana_RU 0x4d9
#define XK_kana_RE 0x4da
#define XK_kana_RO 0x4db
#define XK_kana_WA 0x4dc
#define XK_kana_N 0x4dd
#define XK_voicedsound 0x4de
#define XK_semivoicedsound 0x4df
#define XK_kana_switch 0xFF7E /* Alias for mode_switch */
#endif /* XK_KATAKANA */
/*
* Arabic
* Byte 3 = 5
*/
#ifdef XK_ARABIC
#define XK_Arabic_comma 0x5ac
#define XK_Arabic_semicolon 0x5bb
#define XK_Arabic_question_mark 0x5bf
#define XK_Arabic_hamza 0x5c1
#define XK_Arabic_maddaonalef 0x5c2
#define XK_Arabic_hamzaonalef 0x5c3
#define XK_Arabic_hamzaonwaw 0x5c4
#define XK_Arabic_hamzaunderalef 0x5c5
#define XK_Arabic_hamzaonyeh 0x5c6
#define XK_Arabic_alef 0x5c7
#define XK_Arabic_beh 0x5c8
#define XK_Arabic_tehmarbuta 0x5c9
#define XK_Arabic_teh 0x5ca
#define XK_Arabic_theh 0x5cb
#define XK_Arabic_jeem 0x5cc
#define XK_Arabic_hah 0x5cd
#define XK_Arabic_khah 0x5ce
#define XK_Arabic_dal 0x5cf
#define XK_Arabic_thal 0x5d0
#define XK_Arabic_ra 0x5d1
#define XK_Arabic_zain 0x5d2
#define XK_Arabic_seen 0x5d3
#define XK_Arabic_sheen 0x5d4
#define XK_Arabic_sad 0x5d5
#define XK_Arabic_dad 0x5d6
#define XK_Arabic_tah 0x5d7
#define XK_Arabic_zah 0x5d8
#define XK_Arabic_ain 0x5d9
#define XK_Arabic_ghain 0x5da
#define XK_Arabic_tatweel 0x5e0
#define XK_Arabic_feh 0x5e1
#define XK_Arabic_qaf 0x5e2
#define XK_Arabic_kaf 0x5e3
#define XK_Arabic_lam 0x5e4
#define XK_Arabic_meem 0x5e5
#define XK_Arabic_noon 0x5e6
#define XK_Arabic_ha 0x5e7
#define XK_Arabic_heh 0x5e7 /* deprecated */
#define XK_Arabic_waw 0x5e8
#define XK_Arabic_alefmaksura 0x5e9
#define XK_Arabic_yeh 0x5ea
#define XK_Arabic_fathatan 0x5eb
#define XK_Arabic_dammatan 0x5ec
#define XK_Arabic_kasratan 0x5ed
#define XK_Arabic_fatha 0x5ee
#define XK_Arabic_damma 0x5ef
#define XK_Arabic_kasra 0x5f0
#define XK_Arabic_shadda 0x5f1
#define XK_Arabic_sukun 0x5f2
#define XK_Arabic_switch 0xFF7E /* Alias for mode_switch */
#endif /* XK_ARABIC */
/*
* Cyrillic
* Byte 3 = 6
*/
#ifdef XK_CYRILLIC
#define XK_Serbian_dje 0x6a1
#define XK_Macedonia_gje 0x6a2
#define XK_Cyrillic_io 0x6a3
#define XK_Ukrainian_ie 0x6a4
#define XK_Ukranian_je 0x6a4 /* deprecated */
#define XK_Macedonia_dse 0x6a5
#define XK_Ukrainian_i 0x6a6
#define XK_Ukranian_i 0x6a6 /* deprecated */
#define XK_Ukrainian_yi 0x6a7
#define XK_Ukranian_yi 0x6a7 /* deprecated */
#define XK_Cyrillic_je 0x6a8
#define XK_Serbian_je 0x6a8 /* deprecated */
#define XK_Cyrillic_lje 0x6a9
#define XK_Serbian_lje 0x6a9 /* deprecated */
#define XK_Cyrillic_nje 0x6aa
#define XK_Serbian_nje 0x6aa /* deprecated */
#define XK_Serbian_tshe 0x6ab
#define XK_Macedonia_kje 0x6ac
#define XK_Byelorussian_shortu 0x6ae
#define XK_Cyrillic_dzhe 0x6af
#define XK_Serbian_dze 0x6af /* deprecated */
#define XK_numerosign 0x6b0
#define XK_Serbian_DJE 0x6b1
#define XK_Macedonia_GJE 0x6b2
#define XK_Cyrillic_IO 0x6b3
#define XK_Ukrainian_IE 0x6b4
#define XK_Ukranian_JE 0x6b4 /* deprecated */
#define XK_Macedonia_DSE 0x6b5
#define XK_Ukrainian_I 0x6b6
#define XK_Ukranian_I 0x6b6 /* deprecated */
#define XK_Ukrainian_YI 0x6b7
#define XK_Ukranian_YI 0x6b7 /* deprecated */
#define XK_Cyrillic_JE 0x6b8
#define XK_Serbian_JE 0x6b8 /* deprecated */
#define XK_Cyrillic_LJE 0x6b9
#define XK_Serbian_LJE 0x6b9 /* deprecated */
#define XK_Cyrillic_NJE 0x6ba
#define XK_Serbian_NJE 0x6ba /* deprecated */
#define XK_Serbian_TSHE 0x6bb
#define XK_Macedonia_KJE 0x6bc
#define XK_Byelorussian_SHORTU 0x6be
#define XK_Cyrillic_DZHE 0x6bf
#define XK_Serbian_DZE 0x6bf /* deprecated */
#define XK_Cyrillic_yu 0x6c0
#define XK_Cyrillic_a 0x6c1
#define XK_Cyrillic_be 0x6c2
#define XK_Cyrillic_tse 0x6c3
#define XK_Cyrillic_de 0x6c4
#define XK_Cyrillic_ie 0x6c5
#define XK_Cyrillic_ef 0x6c6
#define XK_Cyrillic_ghe 0x6c7
#define XK_Cyrillic_ha 0x6c8
#define XK_Cyrillic_i 0x6c9
#define XK_Cyrillic_shorti 0x6ca
#define XK_Cyrillic_ka 0x6cb
#define XK_Cyrillic_el 0x6cc
#define XK_Cyrillic_em 0x6cd
#define XK_Cyrillic_en 0x6ce
#define XK_Cyrillic_o 0x6cf
#define XK_Cyrillic_pe 0x6d0
#define XK_Cyrillic_ya 0x6d1
#define XK_Cyrillic_er 0x6d2
#define XK_Cyrillic_es 0x6d3
#define XK_Cyrillic_te 0x6d4
#define XK_Cyrillic_u 0x6d5
#define XK_Cyrillic_zhe 0x6d6
#define XK_Cyrillic_ve 0x6d7
#define XK_Cyrillic_softsign 0x6d8
#define XK_Cyrillic_yeru 0x6d9
#define XK_Cyrillic_ze 0x6da
#define XK_Cyrillic_sha 0x6db
#define XK_Cyrillic_e 0x6dc
#define XK_Cyrillic_shcha 0x6dd
#define XK_Cyrillic_che 0x6de
#define XK_Cyrillic_hardsign 0x6df
#define XK_Cyrillic_YU 0x6e0
#define XK_Cyrillic_A 0x6e1
#define XK_Cyrillic_BE 0x6e2
#define XK_Cyrillic_TSE 0x6e3
#define XK_Cyrillic_DE 0x6e4
#define XK_Cyrillic_IE 0x6e5
#define XK_Cyrillic_EF 0x6e6
#define XK_Cyrillic_GHE 0x6e7
#define XK_Cyrillic_HA 0x6e8
#define XK_Cyrillic_I 0x6e9
#define XK_Cyrillic_SHORTI 0x6ea
#define XK_Cyrillic_KA 0x6eb
#define XK_Cyrillic_EL 0x6ec
#define XK_Cyrillic_EM 0x6ed
#define XK_Cyrillic_EN 0x6ee
#define XK_Cyrillic_O 0x6ef
#define XK_Cyrillic_PE 0x6f0
#define XK_Cyrillic_YA 0x6f1
#define XK_Cyrillic_ER 0x6f2
#define XK_Cyrillic_ES 0x6f3
#define XK_Cyrillic_TE 0x6f4
#define XK_Cyrillic_U 0x6f5
#define XK_Cyrillic_ZHE 0x6f6
#define XK_Cyrillic_VE 0x6f7
#define XK_Cyrillic_SOFTSIGN 0x6f8
#define XK_Cyrillic_YERU 0x6f9
#define XK_Cyrillic_ZE 0x6fa
#define XK_Cyrillic_SHA 0x6fb
#define XK_Cyrillic_E 0x6fc
#define XK_Cyrillic_SHCHA 0x6fd
#define XK_Cyrillic_CHE 0x6fe
#define XK_Cyrillic_HARDSIGN 0x6ff
#endif /* XK_CYRILLIC */
/*
* Greek
* Byte 3 = 7
*/
#ifdef XK_GREEK
#define XK_Greek_ALPHAaccent 0x7a1
#define XK_Greek_EPSILONaccent 0x7a2
#define XK_Greek_ETAaccent 0x7a3
#define XK_Greek_IOTAaccent 0x7a4
#define XK_Greek_IOTAdiaeresis 0x7a5
#define XK_Greek_OMICRONaccent 0x7a7
#define XK_Greek_UPSILONaccent 0x7a8
#define XK_Greek_UPSILONdieresis 0x7a9
#define XK_Greek_OMEGAaccent 0x7ab
#define XK_Greek_accentdieresis 0x7ae
#define XK_Greek_horizbar 0x7af
#define XK_Greek_alphaaccent 0x7b1
#define XK_Greek_epsilonaccent 0x7b2
#define XK_Greek_etaaccent 0x7b3
#define XK_Greek_iotaaccent 0x7b4
#define XK_Greek_iotadieresis 0x7b5
#define XK_Greek_iotaaccentdieresis 0x7b6
#define XK_Greek_omicronaccent 0x7b7
#define XK_Greek_upsilonaccent 0x7b8
#define XK_Greek_upsilondieresis 0x7b9
#define XK_Greek_upsilonaccentdieresis 0x7ba
#define XK_Greek_omegaaccent 0x7bb
#define XK_Greek_ALPHA 0x7c1
#define XK_Greek_BETA 0x7c2
#define XK_Greek_GAMMA 0x7c3
#define XK_Greek_DELTA 0x7c4
#define XK_Greek_EPSILON 0x7c5
#define XK_Greek_ZETA 0x7c6
#define XK_Greek_ETA 0x7c7
#define XK_Greek_THETA 0x7c8
#define XK_Greek_IOTA 0x7c9
#define XK_Greek_KAPPA 0x7ca
#define XK_Greek_LAMDA 0x7cb
#define XK_Greek_LAMBDA 0x7cb
#define XK_Greek_MU 0x7cc
#define XK_Greek_NU 0x7cd
#define XK_Greek_XI 0x7ce
#define XK_Greek_OMICRON 0x7cf
#define XK_Greek_PI 0x7d0
#define XK_Greek_RHO 0x7d1
#define XK_Greek_SIGMA 0x7d2
#define XK_Greek_TAU 0x7d4
#define XK_Greek_UPSILON 0x7d5
#define XK_Greek_PHI 0x7d6
#define XK_Greek_CHI 0x7d7
#define XK_Greek_PSI 0x7d8
#define XK_Greek_OMEGA 0x7d9
#define XK_Greek_alpha 0x7e1
#define XK_Greek_beta 0x7e2
#define XK_Greek_gamma 0x7e3
#define XK_Greek_delta 0x7e4
#define XK_Greek_epsilon 0x7e5
#define XK_Greek_zeta 0x7e6
#define XK_Greek_eta 0x7e7
#define XK_Greek_theta 0x7e8
#define XK_Greek_iota 0x7e9
#define XK_Greek_kappa 0x7ea
#define XK_Greek_lamda 0x7eb
#define XK_Greek_lambda 0x7eb
#define XK_Greek_mu 0x7ec
#define XK_Greek_nu 0x7ed
#define XK_Greek_xi 0x7ee
#define XK_Greek_omicron 0x7ef
#define XK_Greek_pi 0x7f0
#define XK_Greek_rho 0x7f1
#define XK_Greek_sigma 0x7f2
#define XK_Greek_finalsmallsigma 0x7f3
#define XK_Greek_tau 0x7f4
#define XK_Greek_upsilon 0x7f5
#define XK_Greek_phi 0x7f6
#define XK_Greek_chi 0x7f7
#define XK_Greek_psi 0x7f8
#define XK_Greek_omega 0x7f9
#define XK_Greek_switch 0xFF7E /* Alias for mode_switch */
#endif /* XK_GREEK */
/*
* Technical
* Byte 3 = 8
*/
#ifdef XK_TECHNICAL
#define XK_leftradical 0x8a1
#define XK_topleftradical 0x8a2
#define XK_horizconnector 0x8a3
#define XK_topintegral 0x8a4
#define XK_botintegral 0x8a5
#define XK_vertconnector 0x8a6
#define XK_topleftsqbracket 0x8a7
#define XK_botleftsqbracket 0x8a8
#define XK_toprightsqbracket 0x8a9
#define XK_botrightsqbracket 0x8aa
#define XK_topleftparens 0x8ab
#define XK_botleftparens 0x8ac
#define XK_toprightparens 0x8ad
#define XK_botrightparens 0x8ae
#define XK_leftmiddlecurlybrace 0x8af
#define XK_rightmiddlecurlybrace 0x8b0
#define XK_topleftsummation 0x8b1
#define XK_botleftsummation 0x8b2
#define XK_topvertsummationconnector 0x8b3
#define XK_botvertsummationconnector 0x8b4
#define XK_toprightsummation 0x8b5
#define XK_botrightsummation 0x8b6
#define XK_rightmiddlesummation 0x8b7
#define XK_lessthanequal 0x8bc
#define XK_notequal 0x8bd
#define XK_greaterthanequal 0x8be
#define XK_integral 0x8bf
#define XK_therefore 0x8c0
#define XK_variation 0x8c1
#define XK_infinity 0x8c2
#define XK_nabla 0x8c5
#define XK_approximate 0x8c8
#define XK_similarequal 0x8c9
#define XK_ifonlyif 0x8cd
#define XK_implies 0x8ce
#define XK_identical 0x8cf
#define XK_radical 0x8d6
#define XK_includedin 0x8da
#define XK_includes 0x8db
#define XK_intersection 0x8dc
#define XK_union 0x8dd
#define XK_logicaland 0x8de
#define XK_logicalor 0x8df
#define XK_partialderivative 0x8ef
#define XK_function 0x8f6
#define XK_leftarrow 0x8fb
#define XK_uparrow 0x8fc
#define XK_rightarrow 0x8fd
#define XK_downarrow 0x8fe
#endif /* XK_TECHNICAL */
/*
* Special
* Byte 3 = 9
*/
#ifdef XK_SPECIAL
#define XK_blank 0x9df
#define XK_soliddiamond 0x9e0
#define XK_checkerboard 0x9e1
#define XK_ht 0x9e2
#define XK_ff 0x9e3
#define XK_cr 0x9e4
#define XK_lf 0x9e5
#define XK_nl 0x9e8
#define XK_vt 0x9e9
#define XK_lowrightcorner 0x9ea
#define XK_uprightcorner 0x9eb
#define XK_upleftcorner 0x9ec
#define XK_lowleftcorner 0x9ed
#define XK_crossinglines 0x9ee
#define XK_horizlinescan1 0x9ef
#define XK_horizlinescan3 0x9f0
#define XK_horizlinescan5 0x9f1
#define XK_horizlinescan7 0x9f2
#define XK_horizlinescan9 0x9f3
#define XK_leftt 0x9f4
#define XK_rightt 0x9f5
#define XK_bott 0x9f6
#define XK_topt 0x9f7
#define XK_vertbar 0x9f8
#endif /* XK_SPECIAL */
/*
* Publishing
* Byte 3 = a
*/
#ifdef XK_PUBLISHING
#define XK_emspace 0xaa1
#define XK_enspace 0xaa2
#define XK_em3space 0xaa3
#define XK_em4space 0xaa4
#define XK_digitspace 0xaa5
#define XK_punctspace 0xaa6
#define XK_thinspace 0xaa7
#define XK_hairspace 0xaa8
#define XK_emdash 0xaa9
#define XK_endash 0xaaa
#define XK_signifblank 0xaac
#define XK_ellipsis 0xaae
#define XK_doubbaselinedot 0xaaf
#define XK_onethird 0xab0
#define XK_twothirds 0xab1
#define XK_onefifth 0xab2
#define XK_twofifths 0xab3
#define XK_threefifths 0xab4
#define XK_fourfifths 0xab5
#define XK_onesixth 0xab6
#define XK_fivesixths 0xab7
#define XK_careof 0xab8
#define XK_figdash 0xabb
#define XK_leftanglebracket 0xabc
#define XK_decimalpoint 0xabd
#define XK_rightanglebracket 0xabe
#define XK_marker 0xabf
#define XK_oneeighth 0xac3
#define XK_threeeighths 0xac4
#define XK_fiveeighths 0xac5
#define XK_seveneighths 0xac6
#define XK_trademark 0xac9
#define XK_signaturemark 0xaca
#define XK_trademarkincircle 0xacb
#define XK_leftopentriangle 0xacc
#define XK_rightopentriangle 0xacd
#define XK_emopencircle 0xace
#define XK_emopenrectangle 0xacf
#define XK_leftsinglequotemark 0xad0
#define XK_rightsinglequotemark 0xad1
#define XK_leftdoublequotemark 0xad2
#define XK_rightdoublequotemark 0xad3
#define XK_prescription 0xad4
#define XK_minutes 0xad6
#define XK_seconds 0xad7
#define XK_latincross 0xad9
#define XK_hexagram 0xada
#define XK_filledrectbullet 0xadb
#define XK_filledlefttribullet 0xadc
#define XK_filledrighttribullet 0xadd
#define XK_emfilledcircle 0xade
#define XK_emfilledrect 0xadf
#define XK_enopencircbullet 0xae0
#define XK_enopensquarebullet 0xae1
#define XK_openrectbullet 0xae2
#define XK_opentribulletup 0xae3
#define XK_opentribulletdown 0xae4
#define XK_openstar 0xae5
#define XK_enfilledcircbullet 0xae6
#define XK_enfilledsqbullet 0xae7
#define XK_filledtribulletup 0xae8
#define XK_filledtribulletdown 0xae9
#define XK_leftpointer 0xaea
#define XK_rightpointer 0xaeb
#define XK_club 0xaec
#define XK_diamond 0xaed
#define XK_heart 0xaee
#define XK_maltesecross 0xaf0
#define XK_dagger 0xaf1
#define XK_doubledagger 0xaf2
#define XK_checkmark 0xaf3
#define XK_ballotcross 0xaf4
#define XK_musicalsharp 0xaf5
#define XK_musicalflat 0xaf6
#define XK_malesymbol 0xaf7
#define XK_femalesymbol 0xaf8
#define XK_telephone 0xaf9
#define XK_telephonerecorder 0xafa
#define XK_phonographcopyright 0xafb
#define XK_caret 0xafc
#define XK_singlelowquotemark 0xafd
#define XK_doublelowquotemark 0xafe
#define XK_cursor 0xaff
#endif /* XK_PUBLISHING */
/*
* APL
* Byte 3 = b
*/
#ifdef XK_APL
#define XK_leftcaret 0xba3
#define XK_rightcaret 0xba6
#define XK_downcaret 0xba8
#define XK_upcaret 0xba9
#define XK_overbar 0xbc0
#define XK_downtack 0xbc2
#define XK_upshoe 0xbc3
#define XK_downstile 0xbc4
#define XK_underbar 0xbc6
#define XK_jot 0xbca
#define XK_quad 0xbcc
#define XK_uptack 0xbce
#define XK_circle 0xbcf
#define XK_upstile 0xbd3
#define XK_downshoe 0xbd6
#define XK_rightshoe 0xbd8
#define XK_leftshoe 0xbda
#define XK_lefttack 0xbdc
#define XK_righttack 0xbfc
#endif /* XK_APL */
/*
* Hebrew
* Byte 3 = c
*/
#ifdef XK_HEBREW
#define XK_hebrew_doublelowline 0xcdf
#define XK_hebrew_aleph 0xce0
#define XK_hebrew_bet 0xce1
#define XK_hebrew_beth 0xce1 /* deprecated */
#define XK_hebrew_gimel 0xce2
#define XK_hebrew_gimmel 0xce2 /* deprecated */
#define XK_hebrew_dalet 0xce3
#define XK_hebrew_daleth 0xce3 /* deprecated */
#define XK_hebrew_he 0xce4
#define XK_hebrew_waw 0xce5
#define XK_hebrew_zain 0xce6
#define XK_hebrew_zayin 0xce6 /* deprecated */
#define XK_hebrew_chet 0xce7
#define XK_hebrew_het 0xce7 /* deprecated */
#define XK_hebrew_tet 0xce8
#define XK_hebrew_teth 0xce8 /* deprecated */
#define XK_hebrew_yod 0xce9
#define XK_hebrew_finalkaph 0xcea
#define XK_hebrew_kaph 0xceb
#define XK_hebrew_lamed 0xcec
#define XK_hebrew_finalmem 0xced
#define XK_hebrew_mem 0xcee
#define XK_hebrew_finalnun 0xcef
#define XK_hebrew_nun 0xcf0
#define XK_hebrew_samech 0xcf1
#define XK_hebrew_samekh 0xcf1 /* deprecated */
#define XK_hebrew_ayin 0xcf2
#define XK_hebrew_finalpe 0xcf3
#define XK_hebrew_pe 0xcf4
#define XK_hebrew_finalzade 0xcf5
#define XK_hebrew_finalzadi 0xcf5 /* deprecated */
#define XK_hebrew_zade 0xcf6
#define XK_hebrew_zadi 0xcf6 /* deprecated */
#define XK_hebrew_qoph 0xcf7
#define XK_hebrew_kuf 0xcf7 /* deprecated */
#define XK_hebrew_resh 0xcf8
#define XK_hebrew_shin 0xcf9
#define XK_hebrew_taw 0xcfa
#define XK_hebrew_taf 0xcfa /* deprecated */
#define XK_Hebrew_switch 0xFF7E /* Alias for mode_switch */
#endif /* XK_HEBREW */
/*
* Thai
* Byte 3 = d
*/
#ifdef XK_THAI
#define XK_Thai_kokai 0xda1
#define XK_Thai_khokhai 0xda2
#define XK_Thai_khokhuat 0xda3
#define XK_Thai_khokhwai 0xda4
#define XK_Thai_khokhon 0xda5
#define XK_Thai_khorakhang 0xda6
#define XK_Thai_ngongu 0xda7
#define XK_Thai_chochan 0xda8
#define XK_Thai_choching 0xda9
#define XK_Thai_chochang 0xdaa
#define XK_Thai_soso 0xdab
#define XK_Thai_chochoe 0xdac
#define XK_Thai_yoying 0xdad
#define XK_Thai_dochada 0xdae
#define XK_Thai_topatak 0xdaf
#define XK_Thai_thothan 0xdb0
#define XK_Thai_thonangmontho 0xdb1
#define XK_Thai_thophuthao 0xdb2
#define XK_Thai_nonen 0xdb3
#define XK_Thai_dodek 0xdb4
#define XK_Thai_totao 0xdb5
#define XK_Thai_thothung 0xdb6
#define XK_Thai_thothahan 0xdb7
#define XK_Thai_thothong 0xdb8
#define XK_Thai_nonu 0xdb9
#define XK_Thai_bobaimai 0xdba
#define XK_Thai_popla 0xdbb
#define XK_Thai_phophung 0xdbc
#define XK_Thai_fofa 0xdbd
#define XK_Thai_phophan 0xdbe
#define XK_Thai_fofan 0xdbf
#define XK_Thai_phosamphao 0xdc0
#define XK_Thai_moma 0xdc1
#define XK_Thai_yoyak 0xdc2
#define XK_Thai_rorua 0xdc3
#define XK_Thai_ru 0xdc4
#define XK_Thai_loling 0xdc5
#define XK_Thai_lu 0xdc6
#define XK_Thai_wowaen 0xdc7
#define XK_Thai_sosala 0xdc8
#define XK_Thai_sorusi 0xdc9
#define XK_Thai_sosua 0xdca
#define XK_Thai_hohip 0xdcb
#define XK_Thai_lochula 0xdcc
#define XK_Thai_oang 0xdcd
#define XK_Thai_honokhuk 0xdce
#define XK_Thai_paiyannoi 0xdcf
#define XK_Thai_saraa 0xdd0
#define XK_Thai_maihanakat 0xdd1
#define XK_Thai_saraaa 0xdd2
#define XK_Thai_saraam 0xdd3
#define XK_Thai_sarai 0xdd4
#define XK_Thai_saraii 0xdd5
#define XK_Thai_saraue 0xdd6
#define XK_Thai_sarauee 0xdd7
#define XK_Thai_sarau 0xdd8
#define XK_Thai_sarauu 0xdd9
#define XK_Thai_phinthu 0xdda
#define XK_Thai_maihanakat_maitho 0xdde
#define XK_Thai_baht 0xddf
#define XK_Thai_sarae 0xde0
#define XK_Thai_saraae 0xde1
#define XK_Thai_sarao 0xde2
#define XK_Thai_saraaimaimuan 0xde3
#define XK_Thai_saraaimaimalai 0xde4
#define XK_Thai_lakkhangyao 0xde5
#define XK_Thai_maiyamok 0xde6
#define XK_Thai_maitaikhu 0xde7
#define XK_Thai_maiek 0xde8
#define XK_Thai_maitho 0xde9
#define XK_Thai_maitri 0xdea
#define XK_Thai_maichattawa 0xdeb
#define XK_Thai_thanthakhat 0xdec
#define XK_Thai_nikhahit 0xded
#define XK_Thai_leksun 0xdf0
#define XK_Thai_leknung 0xdf1
#define XK_Thai_leksong 0xdf2
#define XK_Thai_leksam 0xdf3
#define XK_Thai_leksi 0xdf4
#define XK_Thai_lekha 0xdf5
#define XK_Thai_lekhok 0xdf6
#define XK_Thai_lekchet 0xdf7
#define XK_Thai_lekpaet 0xdf8
#define XK_Thai_lekkao 0xdf9
#endif /* XK_THAI */
/*
* Korean
* Byte 3 = e
*/
#ifdef XK_KOREAN
#define XK_Hangul 0xff31 /* Hangul start/stop(toggle) */
#define XK_Hangul_Start 0xff32 /* Hangul start */
#define XK_Hangul_End 0xff33 /* Hangul end, English start */
#define XK_Hangul_Hanja 0xff34 /* Start Hangul->Hanja Conversion */
#define XK_Hangul_Jamo 0xff35 /* Hangul Jamo mode */
#define XK_Hangul_Romaja 0xff36 /* Hangul Romaja mode */
#define XK_Hangul_Codeinput 0xff37 /* Hangul code input mode */
#define XK_Hangul_Jeonja 0xff38 /* Jeonja mode */
#define XK_Hangul_Banja 0xff39 /* Banja mode */
#define XK_Hangul_PreHanja 0xff3a /* Pre Hanja conversion */
#define XK_Hangul_PostHanja 0xff3b /* Post Hanja conversion */
#define XK_Hangul_SingleCandidate 0xff3c /* Single candidate */
#define XK_Hangul_MultipleCandidate 0xff3d /* Multiple candidate */
#define XK_Hangul_PreviousCandidate 0xff3e /* Previous candidate */
#define XK_Hangul_Special 0xff3f /* Special symbols */
#define XK_Hangul_switch 0xFF7E /* Alias for mode_switch */
/* Hangul Consonant Characters */
#define XK_Hangul_Kiyeog 0xea1
#define XK_Hangul_SsangKiyeog 0xea2
#define XK_Hangul_KiyeogSios 0xea3
#define XK_Hangul_Nieun 0xea4
#define XK_Hangul_NieunJieuj 0xea5
#define XK_Hangul_NieunHieuh 0xea6
#define XK_Hangul_Dikeud 0xea7
#define XK_Hangul_SsangDikeud 0xea8
#define XK_Hangul_Rieul 0xea9
#define XK_Hangul_RieulKiyeog 0xeaa
#define XK_Hangul_RieulMieum 0xeab
#define XK_Hangul_RieulPieub 0xeac
#define XK_Hangul_RieulSios 0xead
#define XK_Hangul_RieulTieut 0xeae
#define XK_Hangul_RieulPhieuf 0xeaf
#define XK_Hangul_RieulHieuh 0xeb0
#define XK_Hangul_Mieum 0xeb1
#define XK_Hangul_Pieub 0xeb2
#define XK_Hangul_SsangPieub 0xeb3
#define XK_Hangul_PieubSios 0xeb4
#define XK_Hangul_Sios 0xeb5
#define XK_Hangul_SsangSios 0xeb6
#define XK_Hangul_Ieung 0xeb7
#define XK_Hangul_Jieuj 0xeb8
#define XK_Hangul_SsangJieuj 0xeb9
#define XK_Hangul_Cieuc 0xeba
#define XK_Hangul_Khieuq 0xebb
#define XK_Hangul_Tieut 0xebc
#define XK_Hangul_Phieuf 0xebd
#define XK_Hangul_Hieuh 0xebe
/* Hangul Vowel Characters */
#define XK_Hangul_A 0xebf
#define XK_Hangul_AE 0xec0
#define XK_Hangul_YA 0xec1
#define XK_Hangul_YAE 0xec2
#define XK_Hangul_EO 0xec3
#define XK_Hangul_E 0xec4
#define XK_Hangul_YEO 0xec5
#define XK_Hangul_YE 0xec6
#define XK_Hangul_O 0xec7
#define XK_Hangul_WA 0xec8
#define XK_Hangul_WAE 0xec9
#define XK_Hangul_OE 0xeca
#define XK_Hangul_YO 0xecb
#define XK_Hangul_U 0xecc
#define XK_Hangul_WEO 0xecd
#define XK_Hangul_WE 0xece
#define XK_Hangul_WI 0xecf
#define XK_Hangul_YU 0xed0
#define XK_Hangul_EU 0xed1
#define XK_Hangul_YI 0xed2
#define XK_Hangul_I 0xed3
/* Hangul syllable-final (JongSeong) Characters */
#define XK_Hangul_J_Kiyeog 0xed4
#define XK_Hangul_J_SsangKiyeog 0xed5
#define XK_Hangul_J_KiyeogSios 0xed6
#define XK_Hangul_J_Nieun 0xed7
#define XK_Hangul_J_NieunJieuj 0xed8
#define XK_Hangul_J_NieunHieuh 0xed9
#define XK_Hangul_J_Dikeud 0xeda
#define XK_Hangul_J_Rieul 0xedb
#define XK_Hangul_J_RieulKiyeog 0xedc
#define XK_Hangul_J_RieulMieum 0xedd
#define XK_Hangul_J_RieulPieub 0xede
#define XK_Hangul_J_RieulSios 0xedf
#define XK_Hangul_J_RieulTieut 0xee0
#define XK_Hangul_J_RieulPhieuf 0xee1
#define XK_Hangul_J_RieulHieuh 0xee2
#define XK_Hangul_J_Mieum 0xee3
#define XK_Hangul_J_Pieub 0xee4
#define XK_Hangul_J_PieubSios 0xee5
#define XK_Hangul_J_Sios 0xee6
#define XK_Hangul_J_SsangSios 0xee7
#define XK_Hangul_J_Ieung 0xee8
#define XK_Hangul_J_Jieuj 0xee9
#define XK_Hangul_J_Cieuc 0xeea
#define XK_Hangul_J_Khieuq 0xeeb
#define XK_Hangul_J_Tieut 0xeec
#define XK_Hangul_J_Phieuf 0xeed
#define XK_Hangul_J_Hieuh 0xeee
/* Ancient Hangul Consonant Characters */
#define XK_Hangul_RieulYeorinHieuh 0xeef
#define XK_Hangul_SunkyeongeumMieum 0xef0
#define XK_Hangul_SunkyeongeumPieub 0xef1
#define XK_Hangul_PanSios 0xef2
#define XK_Hangul_KkogjiDalrinIeung 0xef3
#define XK_Hangul_SunkyeongeumPhieuf 0xef4
#define XK_Hangul_YeorinHieuh 0xef5
/* Ancient Hangul Vowel Characters */
#define XK_Hangul_AraeA 0xef6
#define XK_Hangul_AraeAE 0xef7
/* Ancient Hangul syllable-final (JongSeong) Characters */
#define XK_Hangul_J_PanSios 0xef8
#define XK_Hangul_J_KkogjiDalrinIeung 0xef9
#define XK_Hangul_J_YeorinHieuh 0xefa
/* Korean currency symbol */
#define XK_Korean_Won 0xeff
#endif /* XK_KOREAN */
/*
Copyright (c) 1987 X Consortium
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
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
X CONSORTIUM 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 X Consortium 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 X Consortium.
Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
All Rights Reserved
Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the name of Digital not be
used in advertising or publicity pertaining to distribution of the
software without specific, written prior permission.
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
SOFTWARE.
*/
/* $XConsortium: colormap.h,v 1.28 94/04/17 20:25:32 dpw Exp $ */
/* $XFree86: xc/programs/Xserver/include/colormap.h,v 1.2 1997/01/14 22:22:38 dawes Exp $ */
#ifndef CMAP_H
#define CMAP_H 1
#include "X11/Xproto.h"
#include "screenint.h"
#include "window.h"
/* these follow X.h's AllocNone and AllocAll */
#define CM_PSCREEN 2
#define CM_PWIN 3
/* Passed internally in colormap.c */
#define REDMAP 0
#define GREENMAP 1
#define BLUEMAP 2
#define PSEUDOMAP 3
#define AllocPrivate (-1)
#define AllocTemporary (-2)
#define DynamicClass 1
/* Values for the flags field of a colormap. These should have 1 bit set
* and not overlap */
#define IsDefault 1
#define AllAllocated 2
#define BeingCreated 4
typedef CARD32 Pixel;
typedef struct _CMEntry *EntryPtr;
/* moved to screenint.h: typedef struct _ColormapRec *ColormapPtr */
typedef struct _colorResource *colorResourcePtr;
extern int CreateColormap(
#if NeedFunctionPrototypes
Colormap /*mid*/,
ScreenPtr /*pScreen*/,
VisualPtr /*pVisual*/,
ColormapPtr* /*ppcmap*/,
int /*alloc*/,
int /*client*/
#endif
);
extern int FreeColormap(
#if NeedFunctionPrototypes
pointer /*pmap*/,
XID /*mid*/
#endif
);
extern int TellLostMap(
#if NeedFunctionPrototypes
X11WindowPtr /*pwin*/,
pointer /* Colormap *pmid */
#endif
);
extern int TellGainedMap(
#if NeedFunctionPrototypes
X11WindowPtr /*pwin*/,
pointer /* Colormap *pmid */
#endif
);
extern int CopyColormapAndFree(
#if NeedFunctionPrototypes
Colormap /*mid*/,
ColormapPtr /*pSrc*/,
int /*client*/
#endif
);
extern int AllocColor(
#if NeedFunctionPrototypes
ColormapPtr /*pmap*/,
unsigned short* /*pred*/,
unsigned short* /*pgreen*/,
unsigned short* /*pblue*/,
Pixel* /*pPix*/,
int /*client*/
#endif
);
extern void FakeAllocColor(
#if NeedFunctionPrototypes
ColormapPtr /*pmap*/,
xColorItem * /*item*/
#endif
);
extern void FakeFreeColor(
#if NeedFunctionPrototypes
ColormapPtr /*pmap*/,
Pixel /*pixel*/
#endif
);
typedef int (*ColorCompareProcPtr)(
#if NeedNestedPrototypes
EntryPtr /*pent*/,
xrgb * /*prgb*/
#endif
);
extern int FindColor(
#if NeedFunctionPrototypes
ColormapPtr /*pmap*/,
EntryPtr /*pentFirst*/,
int /*size*/,
xrgb* /*prgb*/,
Pixel* /*pPixel*/,
int /*channel*/,
int /*client*/,
ColorCompareProcPtr /*comp*/
#endif
);
extern int QueryColors(
#if NeedFunctionPrototypes
ColormapPtr /*pmap*/,
int /*count*/,
Pixel* /*ppixIn*/,
xrgb* /*prgbList*/
#endif
);
extern int FreeClientPixels(
#if NeedFunctionPrototypes
pointer /*pcr*/,
XID /*fakeid*/
#endif
);
extern int AllocColorCells(
#if NeedFunctionPrototypes
int /*client*/,
ColormapPtr /*pmap*/,
int /*colors*/,
int /*planes*/,
Bool /*contig*/,
Pixel* /*ppix*/,
Pixel* /*masks*/
#endif
);
extern int AllocColorPlanes(
#if NeedFunctionPrototypes
int /*client*/,
ColormapPtr /*pmap*/,
int /*colors*/,
int /*r*/,
int /*g*/,
int /*b*/,
Bool /*contig*/,
Pixel* /*pixels*/,
Pixel* /*prmask*/,
Pixel* /*pgmask*/,
Pixel* /*pbmask*/
#endif
);
extern int FreeColors(
#if NeedFunctionPrototypes
ColormapPtr /*pmap*/,
int /*client*/,
int /*count*/,
Pixel* /*pixels*/,
Pixel /*mask*/
#endif
);
extern int StoreColors(
#if NeedFunctionPrototypes
ColormapPtr /*pmap*/,
int /*count*/,
xColorItem* /*defs*/
#endif
);
extern int IsMapInstalled(
#if NeedFunctionPrototypes
Colormap /*map*/,
X11WindowPtr /*pWin*/
#endif
);
#endif /* CMAP_H */
/***********************************************************
Copyright (c) 1987 X Consortium
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
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
X CONSORTIUM 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 X Consortium 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 X Consortium.
Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
All Rights Reserved
Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the name of Digital not be
used in advertising or publicity pertaining to distribution of the
software without specific, written prior permission.
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
SOFTWARE.
******************************************************************/
/* $XConsortium: cursor.h,v 1.22 94/04/17 20:25:34 dpw Exp $ */
#ifndef CURSOR_H
#define CURSOR_H
#include "misc.h"
#include "screenint.h"
#include "window.h"
#define NullCursor ((CursorPtr)NULL)
typedef struct _Cursor *CursorPtr;
typedef struct _CursorMetric *CursorMetricPtr;
extern CursorPtr rootCursor;
extern int FreeCursor(
#if NeedFunctionPrototypes
pointer /*pCurs*/,
XID /*cid*/
#endif
);
extern CursorPtr X11AllocCursor(
#if NeedFunctionPrototypes
unsigned char* /*psrcbits*/,
unsigned char* /*pmaskbits*/,
CursorMetricPtr /*cm*/,
unsigned /*foreRed*/,
unsigned /*foreGreen*/,
unsigned /*foreBlue*/,
unsigned /*backRed*/,
unsigned /*backGreen*/,
unsigned /*backBlue*/
#endif
);
extern int AllocGlyphCursor(
#if NeedFunctionPrototypes
Font /*source*/,
unsigned int /*sourceChar*/,
Font /*mask*/,
unsigned int /*maskChar*/,
unsigned /*foreRed*/,
unsigned /*foreGreen*/,
unsigned /*foreBlue*/,
unsigned /*backRed*/,
unsigned /*backGreen*/,
unsigned /*backBlue*/,
CursorPtr* /*ppCurs*/,
ClientPtr /*client*/
#endif
);
extern CursorPtr CreateRootCursor(
#if NeedFunctionPrototypes
char* /*pfilename*/,
unsigned int /*glyph*/
#endif
);
extern int ServerBitsFromGlyph(
#if NeedFunctionPrototypes
FontPtr /*pfont*/,
unsigned int /*ch*/,
register CursorMetricPtr /*cm*/,
unsigned char ** /*ppbits*/
#endif
);
extern Bool CursorMetricsFromGlyph(
#if NeedFunctionPrototypes
FontPtr /*pfont*/,
unsigned /*ch*/,
CursorMetricPtr /*cm*/
#endif
);
extern void CheckCursorConfinement(
#if NeedFunctionPrototypes
X11WindowPtr /*pWin*/
#endif
);
extern void NewCurrentScreen(
#if NeedFunctionPrototypes
ScreenPtr /*newScreen*/,
int /*x*/,
int /*y*/
#endif
);
extern Bool PointerConfinedToScreen(
#if NeedFunctionPrototypes
void
#endif
);
extern void GetSpritePosition(
#if NeedFunctionPrototypes
int * /*px*/,
int * /*py*/
#endif
);
#endif /* CURSOR_H */
/***********************************************************
Copyright (c) 1987 X Consortium
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
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
X CONSORTIUM 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 X Consortium 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 X Consortium.
Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
All Rights Reserved
Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the name of Digital not be
used in advertising or publicity pertaining to distribution of the
software without specific, written prior permission.
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
SOFTWARE.
******************************************************************/
/* $XConsortium: dix.h /main/44 1996/12/15 21:24:57 rws $ */
/* $XFree86: xc/programs/Xserver/include/dix.h,v 3.7 1996/12/31 04:17:46 dawes Exp $ */
#ifndef DIX_H
#define DIX_H
#include "gc.h"
#include "window.h"
#include "input.h"
#define EARLIER -1
#define SAMETIME 0
#define LATER 1
#define NullClient ((ClientPtr) 0)
#define REQUEST(type) \
register type *stuff = (type *)client->requestBuffer
#define REQUEST_SIZE_MATCH(req)\
if ((sizeof(req) >> 2) != client->req_len)\
return(BadLength)
#define REQUEST_AT_LEAST_SIZE(req) \
if ((sizeof(req) >> 2) > client->req_len )\
return(BadLength)
#define REQUEST_FIXED_SIZE(req, n)\
if (((sizeof(req) >> 2) > client->req_len) || \
(((sizeof(req) + (n) + 3) >> 2) != client->req_len)) \
return(BadLength)
#define LEGAL_NEW_RESOURCE(id,client)\
if (!LegalNewID(id,client)) \
{\
client->errorValue = id;\
return(BadIDChoice);\
}
/* XXX if you are using this macro, you are probably not generating Match
* errors where appropriate */
#define LOOKUP_DRAWABLE(did, client)\
((client->lastDrawableID == did) ? \
client->lastDrawable : (DrawablePtr)LookupDrawable(did, client))
#ifdef XCSECURITY
#define SECURITY_VERIFY_DRAWABLE(pDraw, did, client, mode)\
if (client->lastDrawableID == did && !client->trustLevel)\
pDraw = client->lastDrawable;\
else \
{\
pDraw = (DrawablePtr) SecurityLookupIDByClass(client, did, \
RC_DRAWABLE, mode);\
if (!pDraw) \
{\
client->errorValue = did; \
return BadDrawable;\
}\
if (pDraw->type == UNDRAWABLE_WINDOW)\
return BadMatch;\
}
#define SECURITY_VERIFY_GEOMETRABLE(pDraw, did, client, mode)\
if (client->lastDrawableID == did && !client->trustLevel)\
pDraw = client->lastDrawable;\
else \
{\
pDraw = (DrawablePtr) SecurityLookupIDByClass(client, did, \
RC_DRAWABLE, mode);\
if (!pDraw) \
{\
client->errorValue = did; \
return BadDrawable;\
}\
}
#define SECURITY_VERIFY_GC(pGC, rid, client, mode)\
if (client->lastGCID == rid && !client->trustLevel)\
pGC = client->lastGC;\
else\
pGC = (GC *) SecurityLookupIDByType(client, rid, RT_GC, mode);\
if (!pGC)\
{\
client->errorValue = rid;\
return (BadGC);\
}
#define VERIFY_DRAWABLE(pDraw, did, client)\
SECURITY_VERIFY_DRAWABLE(pDraw, did, client, SecurityUnknownAccess)
#define VERIFY_GEOMETRABLE(pDraw, did, client)\
SECURITY_VERIFY_GEOMETRABLE(pDraw, did, client, SecurityUnknownAccess)
#define VERIFY_GC(pGC, rid, client)\
SECURITY_VERIFY_GC(pGC, rid, client, SecurityUnknownAccess)
#else /* not XCSECURITY */
#define VERIFY_DRAWABLE(pDraw, did, client)\
if (client->lastDrawableID == did)\
pDraw = client->lastDrawable;\
else \
{\
pDraw = (DrawablePtr) LookupIDByClass(did, RC_DRAWABLE);\
if (!pDraw) \
{\
client->errorValue = did; \
return BadDrawable;\
}\
if (pDraw->type == UNDRAWABLE_WINDOW)\
return BadMatch;\
}
#define VERIFY_GEOMETRABLE(pDraw, did, client)\
if (client->lastDrawableID == did)\
pDraw = client->lastDrawable;\
else \
{\
pDraw = (DrawablePtr) LookupIDByClass(did, RC_DRAWABLE);\
if (!pDraw) \
{\
client->errorValue = did; \
return BadDrawable;\
}\
}
#define VERIFY_GC(pGC, rid, client)\
if (client->lastGCID == rid)\
pGC = client->lastGC;\
else\
pGC = (GC *)LookupIDByType(rid, RT_GC);\
if (!pGC)\
{\
client->errorValue = rid;\
return (BadGC);\
}
#define SECURITY_VERIFY_DRAWABLE(pDraw, did, client, mode)\
VERIFY_DRAWABLE(pDraw, did, client)
#define SECURITY_VERIFY_GEOMETRABLE(pDraw, did, client, mode)\
VERIFY_GEOMETRABLE(pDraw, did, client)
#define SECURITY_VERIFY_GC(pGC, rid, client, mode)\
VERIFY_GC(pGC, rid, client)
#endif /* XCSECURITY */
/*
* We think that most hardware implementations of DBE will want
* LookupID*(dbe_back_buffer_id) to return the window structure that the
* id is a back buffer for. Since both front and back buffers will
* return the same structure, you need to be able to distinguish
* somewhere what kind of buffer (front/back) was being asked for, so
* that ddx can render to the right place. That's the problem that the
* following code solves. Note: we couldn't embed this in the LookupID*
* functions because the VALIDATE_DRAWABLE_AND_GC macro often circumvents
* those functions by checking a one-element cache. That's why we're
* mucking with VALIDATE_DRAWABLE_AND_GC.
*
* If you put -DNEED_DBE_BUF_BITS into PervasiveDBEDefines, the window
* structure will have two additional bits defined, srcBuffer and
* dstBuffer, and their values will be maintained via the macros
* SET_DBE_DSTBUF and SET_DBE_SRCBUF (below). If you also
* put -DNEED_DBE_BUF_VALIDATE into PervasiveDBEDefines, the function
* DbeValidateBuffer will be called any time the bits change to give you
* a chance to do some setup. See the DBE code for more details on this
* function. We put in these levels of conditionality so that you can do
* just what you need to do, and no more. If neither of these defines
* are used, the bits won't be there, and VALIDATE_DRAWABLE_AND_GC will
* be unchanged. dpw
*/
#if defined(NEED_DBE_BUF_BITS)
#define SET_DBE_DSTBUF(_pDraw, _drawID) \
SET_DBE_BUF(_pDraw, _drawID, dstBuffer, TRUE)
#define SET_DBE_SRCBUF(_pDraw, _drawID) \
SET_DBE_BUF(_pDraw, _drawID, srcBuffer, FALSE)
#if defined (NEED_DBE_BUF_VALIDATE)
#define SET_DBE_BUF(_pDraw, _drawID, _whichBuffer, _dstbuf) \
if (_pDraw->type == DRAWABLE_WINDOW)\
{\
int thisbuf = (_pDraw->id == _drawID);\
if (thisbuf != ((X11WindowPtr)_pDraw)->_whichBuffer)\
{\
((X11WindowPtr)_pDraw)->_whichBuffer = thisbuf;\
DbeValidateBuffer((X11WindowPtr)_pDraw, _drawID, _dstbuf);\
}\
}
#else /* want buffer bits, but don't need to call DbeValidateBuffer */
#define SET_DBE_BUF(_pDraw, _drawID, _whichBuffer, _dstbuf) \
if (_pDraw->type == DRAWABLE_WINDOW)\
{\
((X11WindowPtr)_pDraw)->_whichBuffer = (_pDraw->id == _drawID);\
}
#endif /* NEED_DBE_BUF_VALIDATE */
#else /* don't want buffer bits in window */
#define SET_DBE_DSTBUF(_pDraw, _drawID) /**/
#define SET_DBE_SRCBUF(_pDraw, _drawID) /**/
#endif /* NEED_DBE_BUF_BITS */
#define VALIDATE_DRAWABLE_AND_GC(drawID, pDraw, pGC, client)\
if ((stuff->gc == INVALID) || (client->lastGCID != stuff->gc) ||\
(client->lastDrawableID != drawID))\
{\
SECURITY_VERIFY_GEOMETRABLE(pDraw, drawID, client, SecurityWriteAccess);\
SECURITY_VERIFY_GC(pGC, stuff->gc, client, SecurityReadAccess);\
if ((pGC->depth != pDraw->depth) ||\
(pGC->pScreen != pDraw->pScreen))\
return (BadMatch);\
client->lastDrawable = pDraw;\
client->lastDrawableID = drawID;\
client->lastGC = pGC;\
client->lastGCID = stuff->gc;\
}\
else\
{\
pGC = client->lastGC;\
pDraw = client->lastDrawable;\
}\
SET_DBE_DSTBUF(pDraw, drawID);\
if (pGC->serialNumber != pDraw->serialNumber)\
ValidateGC(pDraw, pGC);
#define WriteReplyToClient(pClient, size, pReply) \
if ((pClient)->swapped) \
(*ReplySwapVector[((xReq *)(pClient)->requestBuffer)->reqType]) \
(pClient, (int)(size), pReply); \
else (void) WriteToClient(pClient, (int)(size), (char *)(pReply));
#define WriteSwappedDataToClient(pClient, size, pbuf) \
if ((pClient)->swapped) \
(*(pClient)->pSwapReplyFunc)(pClient, (int)(size), pbuf); \
else (void) WriteToClient (pClient, (int)(size), (char *)(pbuf));
typedef struct _TimeStamp *TimeStampPtr;
#ifndef _XTYPEDEF_CLIENTPTR
typedef struct _Client *ClientPtr; /* also in misc.h */
#define _XTYPEDEF_CLIENTPTR
#endif
typedef struct _WorkQueue *WorkQueuePtr;
extern ClientPtr requestingClient;
extern ClientPtr *clients;
extern ClientPtr serverClient;
extern int currentMaxClients;
#if !(defined(__alpha) || defined(__alpha__))
typedef long HWEventQueueType;
#else
typedef int HWEventQueueType;
#endif
typedef HWEventQueueType* HWEventQueuePtr;
extern HWEventQueuePtr checkForInput[2];
typedef struct _TimeStamp {
CARD32 months; /* really ~49.7 days */
CARD32 milliseconds;
} TimeStamp;
/* dispatch.c */
extern void SetInputCheck(
#if NeedFunctionPrototypes
HWEventQueuePtr /*c0*/,
HWEventQueuePtr /*c1*/
#endif
);
extern void CloseDownClient(
#if NeedFunctionPrototypes
ClientPtr /*client*/
#endif
);
extern void UpdateCurrentTime(
#if NeedFunctionPrototypes
void
#endif
);
extern void UpdateCurrentTimeIf(
#if NeedFunctionPrototypes
void
#endif
);
extern void InitSelections(
#if NeedFunctionPrototypes
void
#endif
);
extern void FlushClientCaches(
#if NeedFunctionPrototypes
XID /*id*/
#endif
);
extern int dixDestroyPixmap(
#if NeedFunctionPrototypes
pointer /*value*/,
XID /*pid*/
#endif
);
extern void CloseDownRetainedResources(
#if NeedFunctionPrototypes
void
#endif
);
extern void InitClient(
#if NeedFunctionPrototypes
ClientPtr /*client*/,
int /*i*/,
pointer /*ospriv*/
#endif
);
extern ClientPtr NextAvailableClient(
#if NeedFunctionPrototypes
pointer /*ospriv*/
#endif
);
extern void SendErrorToClient(
#if NeedFunctionPrototypes
ClientPtr /*client*/,
unsigned int /*majorCode*/,
unsigned int /*minorCode*/,
XID /*resId*/,
int /*errorCode*/
#endif
);
extern void DeleteWindowFromAnySelections(
#if NeedFunctionPrototypes
X11WindowPtr /*pWin*/
#endif
);
extern void MarkClientException(
#if NeedFunctionPrototypes
ClientPtr /*client*/
#endif
);
extern int GetGeometry(
#if NeedFunctionPrototypes
ClientPtr /*client*/,
xGetGeometryReply* /* wa */
#endif
);
/* dixutils.c */
extern void CopyISOLatin1Lowered(
#if NeedFunctionPrototypes
unsigned char * /*dest*/,
unsigned char * /*source*/,
int /*length*/
#endif
);
#ifdef XCSECURITY
extern X11WindowPtr SecurityLookupWindow(
#if NeedFunctionPrototypes
XID /*rid*/,
ClientPtr /*client*/,
Mask /*access_mode*/
#endif
);
extern pointer SecurityLookupDrawable(
#if NeedFunctionPrototypes
XID /*rid*/,
ClientPtr /*client*/,
Mask /*access_mode*/
#endif
);
extern X11WindowPtr LookupWindow(
#if NeedFunctionPrototypes
XID /*rid*/,
ClientPtr /*client*/
#endif
);
extern pointer LookupDrawable(
#if NeedFunctionPrototypes
XID /*rid*/,
ClientPtr /*client*/
#endif
);
#else
extern X11WindowPtr LookupWindow(
#if NeedFunctionPrototypes
XID /*rid*/,
ClientPtr /*client*/
#endif
);
extern pointer LookupDrawable(
#if NeedFunctionPrototypes
XID /*rid*/,
ClientPtr /*client*/
#endif
);
#define SecurityLookupWindow(rid, client, access_mode) \
LookupWindow(rid, client)
#define SecurityLookupDrawable(rid, client, access_mode) \
LookupDrawable(rid, client)
#endif /* XCSECURITY */
extern ClientPtr LookupClient(
#if NeedFunctionPrototypes
XID /*rid*/,
ClientPtr /*client*/
#endif
);
extern void NoopDDA(
#if NeedVarargsPrototypes
void *,
...
#endif
);
extern int AlterSaveSetForClient(
#if NeedFunctionPrototypes
ClientPtr /*client*/,
X11WindowPtr /*pWin*/,
unsigned /*mode*/
#endif
);
extern void DeleteWindowFromAnySaveSet(
#if NeedFunctionPrototypes
X11WindowPtr /*pWin*/
#endif
);
extern void BlockHandler(
#if NeedFunctionPrototypes
pointer /*pTimeout*/,
pointer /*pReadmask*/
#endif
);
extern void WakeupHandler(
#if NeedFunctionPrototypes
int /*result*/,
pointer /*pReadmask*/
#endif
);
typedef struct timeval ** OSTimePtr;
typedef void (* BlockHandlerProcPtr)(
#if NeedNestedPrototypes
pointer /* blockData */,
OSTimePtr /* pTimeout */,
pointer /* pReadmask */
#endif
);
typedef void (* WakeupHandlerProcPtr)(
#if NeedNestedPrototypes
pointer /* blockData */,
int /* result */,
pointer /* pReadmask */
#endif
);
extern Bool RegisterBlockAndWakeupHandlers(
#if NeedFunctionPrototypes
BlockHandlerProcPtr /*blockHandler*/,
WakeupHandlerProcPtr /*wakeupHandler*/,
pointer /*blockData*/
#endif
);
extern void RemoveBlockAndWakeupHandlers(
#if NeedFunctionPrototypes
BlockHandlerProcPtr /*blockHandler*/,
WakeupHandlerProcPtr /*wakeupHandler*/,
pointer /*blockData*/
#endif
);
extern void InitBlockAndWakeupHandlers(
#if NeedFunctionPrototypes
void
#endif
);
extern void ProcessWorkQueue(
#if NeedFunctionPrototypes
void
#endif
);
extern Bool QueueWorkProc(
#if NeedFunctionPrototypes
Bool (* /*function*/)(
#if NeedNestedPrototypes
ClientPtr /*clientUnused*/,
pointer /*closure*/
#endif
),
ClientPtr /*client*/,
pointer /*closure*/
#endif
);
typedef Bool (* ClientSleepProcPtr)(
#if NeedFunctionPrototypes
ClientPtr /*client*/,
pointer /*closure*/
#endif
);
extern Bool ClientSleep(
#if NeedFunctionPrototypes
ClientPtr /*client*/,
ClientSleepProcPtr /* function */,
pointer /*closure*/
#endif
);
extern Bool ClientSignal(
#if NeedFunctionPrototypes
ClientPtr /*client*/
#endif
);
extern void ClientWakeup(
#if NeedFunctionPrototypes
ClientPtr /*client*/
#endif
);
extern Bool ClientIsAsleep(
#if NeedFunctionPrototypes
ClientPtr /*client*/
#endif
);
/* atom.c */
extern Atom MakeAtom(
#if NeedFunctionPrototypes
char * /*string*/,
unsigned /*len*/,
Bool /*makeit*/
#endif
);
extern Bool ValidAtom(
#if NeedFunctionPrototypes
Atom /*atom*/
#endif
);
extern char *NameForAtom(
#if NeedFunctionPrototypes
Atom /*atom*/
#endif
);
extern void AtomError(
#if NeedFunctionPrototypes
void
#endif
);
extern void FreeAllAtoms(
#if NeedFunctionPrototypes
void
#endif
);
extern void InitAtoms(
#if NeedFunctionPrototypes
void
#endif
);
/* events.c */
extern void SetMaskForEvent(
#if NeedFunctionPrototypes
Mask /* mask */,
int /* event */
#endif
);
extern Bool PointerConfinedToScreen(
#if NeedFunctionPrototypes
void
#endif
);
extern Bool IsParent(
#if NeedFunctionPrototypes
X11WindowPtr /* maybeparent */,
X11WindowPtr /* child */
#endif
);
extern X11WindowPtr GetCurrentRootWindow(
#if NeedFunctionPrototypes
void
#endif
);
extern X11WindowPtr GetSpriteWindow(
#if NeedFunctionPrototypes
void
#endif
);
extern void GetSpritePosition(
#if NeedFunctionPrototypes
int * /* px */,
int * /* py */
#endif
);
extern void NoticeEventTime(
#if NeedFunctionPrototypes
xEventPtr /* xE */
#endif
);
extern void EnqueueEvent(
#if NeedFunctionPrototypes
xEventPtr /* xE */,
DeviceIntPtr /* device */,
int /* count */
#endif
);
extern void ComputeFreezes(
#if NeedFunctionPrototypes
void
#endif
);
extern void CheckGrabForSyncs(
#if NeedFunctionPrototypes
DeviceIntPtr /* dev */,
Bool /* thisMode */,
Bool /* otherMode */
#endif
);
extern void ActivatePointerGrab(
#if NeedFunctionPrototypes
DeviceIntPtr /* mouse */,
GrabPtr /* grab */,
TimeStamp /* time */,
Bool /* autoGrab */
#endif
);
extern void DeactivatePointerGrab(
#if NeedFunctionPrototypes
DeviceIntPtr /* mouse */
#endif
);
extern void ActivateKeyboardGrab(
#if NeedFunctionPrototypes
DeviceIntPtr /* keybd */,
GrabPtr /* grab */,
TimeStamp /* time */,
Bool /* passive */
#endif
);
extern void DeactivateKeyboardGrab(
#if NeedFunctionPrototypes
DeviceIntPtr /* keybd */
#endif
);
extern void AllowSome(
#if NeedFunctionPrototypes
ClientPtr /* client */,
TimeStamp /* time */,
DeviceIntPtr /* thisDev */,
int /* newState */
#endif
);
extern void ReleaseActiveGrabs(
#if NeedFunctionPrototypes
ClientPtr client
#endif
);
extern int DeliverEventsToWindow(
#if NeedFunctionPrototypes
X11WindowPtr /* pWin */,
xEventPtr /* pEvents */,
int /* count */,
Mask /* filter */,
GrabPtr /* grab */,
int /* mskidx */
#endif
);
extern int DeliverDeviceEvents(
#if NeedFunctionPrototypes
X11WindowPtr /* pWin */,
xEventPtr /* xE */,
GrabPtr /* grab */,
X11WindowPtr /* stopAt */,
DeviceIntPtr /* dev */,
int /* count */
#endif
);
extern void DefineInitialRootWindow(
#if NeedFunctionPrototypes
X11WindowPtr /* win */
#endif
);
extern void WindowHasNewCursor(
#if NeedFunctionPrototypes
X11WindowPtr /* pWin */
#endif
);
extern Bool CheckDeviceGrabs(
#if NeedFunctionPrototypes
DeviceIntPtr /* device */,
xEventPtr /* xE */,
int /* checkFirst */,
int /* count */
#endif
);
extern void DeliverFocusedEvent(
#if NeedFunctionPrototypes
DeviceIntPtr /* keybd */,
xEventPtr /* xE */,
X11WindowPtr /* window */,
int /* count */
#endif
);
extern void DeliverGrabbedEvent(
#if NeedFunctionPrototypes
xEventPtr /* xE */,
DeviceIntPtr /* thisDev */,
Bool /* deactivateGrab */,
int /* count */
#endif
);
extern void RecalculateDeliverableEvents(
#if NeedFunctionPrototypes
X11WindowPtr /* pWin */
#endif
);
extern int OtherClientGone(
#if NeedFunctionPrototypes
pointer /* value */,
XID /* id */
#endif
);
extern void DoFocusEvents(
#if NeedFunctionPrototypes
DeviceIntPtr /* dev */,
X11WindowPtr /* fromWin */,
X11WindowPtr /* toWin */,
int /* mode */
#endif
);
extern int SetInputFocus(
#if NeedFunctionPrototypes
ClientPtr /* client */,
DeviceIntPtr /* dev */,
Window /* focusID */,
CARD8 /* revertTo */,
Time /* ctime */,
Bool /* followOK */
#endif
);
extern int GrabDevice(
#if NeedFunctionPrototypes
ClientPtr /* client */,
DeviceIntPtr /* dev */,
unsigned /* this_mode */,
unsigned /* other_mode */,
Window /* grabWindow */,
unsigned /* ownerEvents */,
Time /* ctime */,
Mask /* mask */,
CARD8 * /* status */
#endif
);
extern void InitEvents(
#if NeedFunctionPrototypes
void
#endif
);
extern void DeleteWindowFromAnyEvents(
#if NeedFunctionPrototypes
X11WindowPtr /* pWin */,
Bool /* freeResources */
#endif
);
extern void CheckCursorConfinement(
#if NeedFunctionPrototypes
X11WindowPtr /* pWin */
#endif
);
extern Mask EventMaskForClient(
#if NeedFunctionPrototypes
X11WindowPtr /* pWin */,
ClientPtr /* client */
#endif
);
extern int DeliverEvents(
#if NeedFunctionPrototypes
X11WindowPtr /*pWin*/,
xEventPtr /*xE*/,
int /*count*/,
X11WindowPtr /*otherParent*/
#endif
);
extern void WriteEventsToClient(
#if NeedFunctionPrototypes
ClientPtr /*pClient*/,
int /*count*/,
xEventPtr /*events*/
#endif
);
extern int TryClientEvents(
#if NeedFunctionPrototypes
ClientPtr /*client*/,
xEventPtr /*pEvents*/,
int /*count*/,
Mask /*mask*/,
Mask /*filter*/,
GrabPtr /*grab*/
#endif
);
extern int EventSelectForWindow(
#if NeedFunctionPrototypes
X11WindowPtr /*pWin*/,
ClientPtr /*client*/,
Mask /*mask*/
#endif
);
extern int EventSuppressForWindow(
#if NeedFunctionPrototypes
X11WindowPtr /*pWin*/,
ClientPtr /*client*/,
Mask /*mask*/,
Bool * /*checkOptional*/
#endif
);
extern int MaybeDeliverEventsToClient(
#if NeedFunctionPrototypes
X11WindowPtr /*pWin*/,
xEventPtr /*pEvents*/,
int /*count*/,
Mask /*filter*/,
ClientPtr /*dontClient*/
#endif
);
extern void WindowsRestructured(
#if NeedFunctionPrototypes
void
#endif
);
extern void ResetClientPrivates(
#if NeedFunctionPrototypes
void
#endif
);
extern int AllocateClientPrivateIndex(
#if NeedFunctionPrototypes
void
#endif
);
extern Bool AllocateClientPrivate(
#if NeedFunctionPrototypes
int /*index*/,
unsigned /*amount*/
#endif
);
/*
* callback manager stuff
*/
#ifndef _XTYPEDEF_CALLBACKLISTPTR
typedef struct _CallbackList *CallbackListPtr; /* also in misc.h */
#define _XTYPEDEF_CALLBACKLISTPTR
#endif
typedef void (*CallbackProcPtr) (
#if NeedNestedPrototypes
CallbackListPtr *, pointer, pointer
#endif
);
typedef Bool (*AddCallbackProcPtr) (
#if NeedNestedPrototypes
CallbackListPtr *, CallbackProcPtr, pointer
#endif
);
typedef Bool (*DeleteCallbackProcPtr) (
#if NeedNestedPrototypes
CallbackListPtr *, CallbackProcPtr, pointer
#endif
);
typedef void (*CallCallbacksProcPtr) (
#if NeedNestedPrototypes
CallbackListPtr *, pointer
#endif
);
typedef void (*DeleteCallbackListProcPtr) (
#if NeedNestedPrototypes
CallbackListPtr *
#endif
);
typedef struct _CallbackProcs {
AddCallbackProcPtr AddCallback;
DeleteCallbackProcPtr DeleteCallback;
CallCallbacksProcPtr CallCallbacks;
DeleteCallbackListProcPtr DeleteCallbackList;
} CallbackFuncsRec, *CallbackFuncsPtr;
extern Bool CreateCallbackList(
#if NeedFunctionPrototypes
CallbackListPtr * /*pcbl*/,
CallbackFuncsPtr /*cbfuncs*/
#endif
);
extern Bool AddCallback(
#if NeedFunctionPrototypes
CallbackListPtr * /*pcbl*/,
CallbackProcPtr /*callback*/,
pointer /*data*/
#endif
);
extern Bool DeleteCallback(
#if NeedFunctionPrototypes
CallbackListPtr * /*pcbl*/,
CallbackProcPtr /*callback*/,
pointer /*data*/
#endif
);
extern void CallCallbacks(
#if NeedFunctionPrototypes
CallbackListPtr * /*pcbl*/,
pointer /*call_data*/
#endif
);
extern void DeleteCallbackList(
#if NeedFunctionPrototypes
CallbackListPtr * /*pcbl*/
#endif
);
extern void InitCallbackManager(
#if NeedFunctionPrototypes
void
#endif
);
/*
* ServerGrabCallback stuff
*/
extern CallbackListPtr ServerGrabCallback;
typedef enum {SERVER_GRABBED, SERVER_UNGRABBED,
CLIENT_PERVIOUS, CLIENT_IMPERVIOUS } ServerGrabState;
typedef struct {
ClientPtr client;
ServerGrabState grabstate;
} ServerGrabInfoRec;
/*
* EventCallback stuff
*/
extern CallbackListPtr EventCallback;
typedef struct {
ClientPtr client;
xEventPtr events;
int count;
} EventInfoRec;
/*
* DeviceEventCallback stuff
*/
extern CallbackListPtr DeviceEventCallback;
typedef struct {
xEventPtr events;
int count;
} DeviceEventInfoRec;
#endif /* DIX_H */
/***********************************************************
Copyright (c) 1987 X Consortium
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
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
X CONSORTIUM 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 X Consortium 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 X Consortium.
Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
All Rights Reserved
Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the name of Digital not be
used in advertising or publicity pertaining to distribution of the
software without specific, written prior permission.
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
SOFTWARE.
******************************************************************/
/* $XConsortium: gc.h /main/16 1996/08/01 19:18:17 dpw $ */
#ifndef GC_H
#define GC_H
#include "misc.h" /* for Bool */
#include "X11/X.h" /* for GContext, Mask */
#include "X11/Xproto.h"
#include "screenint.h" /* for ScreenPtr */
#include "pixmap.h" /* for DrawablePtr */
/* clientClipType field in GC */
#define CT_NONE 0
#define CT_PIXMAP 1
#define CT_REGION 2
#define CT_UNSORTED 6
#define CT_YSORTED 10
#define CT_YXSORTED 14
#define CT_YXBANDED 18
#define GCQREASON_VALIDATE 1
#define GCQREASON_CHANGE 2
#define GCQREASON_COPY_SRC 3
#define GCQREASON_COPY_DST 4
#define GCQREASON_DESTROY 5
#define GC_CHANGE_SERIAL_BIT (((unsigned long)1)<<31)
#define GC_CALL_VALIDATE_BIT (1L<<30)
#define GCExtensionInterest (1L<<29)
#define DRAWABLE_SERIAL_BITS (~(GC_CHANGE_SERIAL_BIT))
#define MAX_SERIAL_NUM (1L<<28)
#define NEXT_SERIAL_NUMBER ((++globalSerialNumber) > MAX_SERIAL_NUM ? \
(globalSerialNumber = 1): globalSerialNumber)
typedef struct _GCInterest *GCInterestPtr;
typedef struct _GC *GCPtr;
typedef struct _GCOps *GCOpsPtr;
extern void ValidateGC(
#if NeedFunctionPrototypes
DrawablePtr /*pDraw*/,
GCPtr /*pGC*/
#endif
);
extern int ChangeGC(
#if NeedFunctionPrototypes
GCPtr/*pGC*/,
BITS32 /*mask*/,
XID* /*pval*/
#endif
);
extern int DoChangeGC(
#if NeedFunctionPrototypes
GCPtr/*pGC*/,
BITS32 /*mask*/,
XID* /*pval*/,
int /*fPointer*/
#endif
);
typedef union {
CARD32 val;
pointer ptr;
} ChangeGCVal, *ChangeGCValPtr;
extern int dixChangeGC(
#if NeedFunctionPrototypes
ClientPtr /*client*/,
GCPtr /*pGC*/,
BITS32 /*mask*/,
CARD32 * /*pval*/,
ChangeGCValPtr /*pCGCV*/
#endif
);
extern GCPtr CreateGC(
#if NeedFunctionPrototypes
DrawablePtr /*pDrawable*/,
BITS32 /*mask*/,
XID* /*pval*/,
int* /*pStatus*/
#endif
);
extern int CopyGC(
#if NeedFunctionPrototypes
GCPtr/*pgcSrc*/,
GCPtr/*pgcDst*/,
BITS32 /*mask*/
#endif
);
extern int FreeGC(
#if NeedFunctionPrototypes
pointer /*pGC*/,
XID /*gid*/
#endif
);
extern void SetGCMask(
#if NeedFunctionPrototypes
GCPtr /*pGC*/,
Mask /*selectMask*/,
Mask /*newDataMask*/
#endif
);
extern GCPtr CreateScratchGC(
#if NeedFunctionPrototypes
ScreenPtr /*pScreen*/,
unsigned /*depth*/
#endif
);
extern void FreeGCperDepth(
#if NeedFunctionPrototypes
int /*screenNum*/
#endif
);
extern Bool CreateGCperDepth(
#if NeedFunctionPrototypes
int /*screenNum*/
#endif
);
extern Bool CreateDefaultStipple(
#if NeedFunctionPrototypes
int /*screenNum*/
#endif
);
extern void FreeDefaultStipple(
#if NeedFunctionPrototypes
int /*screenNum*/
#endif
);
extern int SetDashes(
#if NeedFunctionPrototypes
GCPtr /*pGC*/,
unsigned /*offset*/,
unsigned /*ndash*/,
unsigned char* /*pdash*/
#endif
);
extern int VerifyRectOrder(
#if NeedFunctionPrototypes
int /*nrects*/,
xRectangle* /*prects*/,
int /*ordering*/
#endif
);
extern int SetClipRects(
#if NeedFunctionPrototypes
GCPtr /*pGC*/,
int /*xOrigin*/,
int /*yOrigin*/,
int /*nrects*/,
xRectangle* /*prects*/,
int /*ordering*/
#endif
);
extern GCPtr GetScratchGC(
#if NeedFunctionPrototypes
unsigned /*depth*/,
ScreenPtr /*pScreen*/
#endif
);
extern void FreeScratchGC(
#if NeedFunctionPrototypes
GCPtr /*pGC*/
#endif
);
#endif /* GC_H */
/* $XConsortium: input.h /main/22 1996/09/25 00:50:39 dpw $ */
/* $XFree86: xc/programs/Xserver/include/input.h,v 3.4 1996/12/23 07:09:28 dawes Exp $ */
/************************************************************
Copyright (c) 1987 X Consortium
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
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
X CONSORTIUM 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 X Consortium 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 X Consortium.
Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
All Rights Reserved
Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the name of Digital not be
used in advertising or publicity pertaining to distribution of the
software without specific, written prior permission.
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
SOFTWARE.
********************************************************/
#ifndef INPUT_H
#define INPUT_H
#include "misc.h"
#include "screenint.h"
#include "X11/Xmd.h"
#include "X11/Xproto.h"
#include "window.h" /* for WindowPtr */
#define DEVICE_INIT 0
#define DEVICE_ON 1
#define DEVICE_OFF 2
#define DEVICE_CLOSE 3
#define MAP_LENGTH 256
#define DOWN_LENGTH 32 /* 256/8 => number of bytes to hold 256 bits */
#define NullGrab ((GrabPtr)NULL)
#define PointerRootWin ((WindowPtr)PointerRoot)
#define NoneWin ((WindowPtr)None)
#define NullDevice ((DevicePtr)NULL)
#ifndef FollowKeyboard
#define FollowKeyboard 3
#endif
#ifndef FollowKeyboardWin
#define FollowKeyboardWin ((WindowPtr) FollowKeyboard)
#endif
#ifndef RevertToFollowKeyboard
#define RevertToFollowKeyboard 3
#endif
typedef unsigned long Leds;
typedef struct _OtherClients *OtherClientsPtr;
typedef struct _InputClients *InputClientsPtr;
typedef struct _DeviceIntRec *DeviceIntPtr;
typedef int (*DeviceProc)(
#if NeedNestedPrototypes
DeviceIntPtr /*device*/,
int /*what*/
#endif
);
typedef void (*ProcessInputProc)(
#if NeedNestedPrototypes
xEventPtr /*events*/,
DeviceIntPtr /*device*/,
int /*count*/
#endif
);
typedef struct _DeviceRec {
pointer devicePrivate;
ProcessInputProc processInputProc; /* current */
ProcessInputProc realInputProc; /* deliver */
ProcessInputProc enqueueInputProc; /* enqueue */
Bool on; /* used by DDX to keep state */
} DeviceRec, *DevicePtr;
typedef struct {
int click, bell, bell_pitch, bell_duration;
Bool autoRepeat;
unsigned char autoRepeats[32];
Leds leds;
unsigned char id;
} KeybdCtrl;
typedef struct {
KeySym *map;
KeyCode minKeyCode,
maxKeyCode;
int mapWidth;
} KeySymsRec, *KeySymsPtr;
typedef struct {
int num, den, threshold;
unsigned char id;
} PtrCtrl;
typedef struct {
int resolution, min_value, max_value;
int integer_displayed;
unsigned char id;
} IntegerCtrl;
typedef struct {
int max_symbols, num_symbols_supported;
int num_symbols_displayed;
KeySym *symbols_supported;
KeySym *symbols_displayed;
unsigned char id;
} StringCtrl;
typedef struct {
int percent, pitch, duration;
unsigned char id;
} BellCtrl;
typedef struct {
Leds led_values;
Mask led_mask;
unsigned char id;
} LedCtrl;
extern KeybdCtrl defaultKeyboardControl;
extern PtrCtrl defaultPointerControl;
#undef AddInputDevice
extern DevicePtr AddInputDevice(
#if NeedFunctionPrototypes
DeviceProc /*deviceProc*/,
Bool /*autoStart*/
#endif
);
#define AddInputDevice(deviceProc, autoStart) \
_AddInputDevice(deviceProc, autoStart)
extern DeviceIntPtr _AddInputDevice(
#if NeedFunctionPrototypes
DeviceProc /*deviceProc*/,
Bool /*autoStart*/
#endif
);
extern Bool EnableDevice(
#if NeedFunctionPrototypes
DeviceIntPtr /*device*/
#endif
);
extern Bool DisableDevice(
#if NeedFunctionPrototypes
DeviceIntPtr /*device*/
#endif
);
extern int InitAndStartDevices(
#if NeedFunctionPrototypes
void
#endif
);
extern void CloseDownDevices(
#if NeedFunctionPrototypes
void
#endif
);
extern void RemoveDevice(
#if NeedFunctionPrototypes
DeviceIntPtr /*dev*/
#endif
);
extern int NumMotionEvents(
#if NeedFunctionPrototypes
void
#endif
);
#undef RegisterPointerDevice
extern void RegisterPointerDevice(
#if NeedFunctionPrototypes
DevicePtr /*device*/
#endif
);
#define RegisterPointerDevice(device) \
_RegisterPointerDevice(device)
extern void _RegisterPointerDevice(
#if NeedFunctionPrototypes
DeviceIntPtr /*device*/
#endif
);
#undef RegisterKeyboardDevice
extern void RegisterKeyboardDevice(
#if NeedFunctionPrototypes
DevicePtr /*device*/
#endif
);
#define RegisterKeyboardDevice(device) \
_RegisterKeyboardDevice(device)
extern void _RegisterKeyboardDevice(
#if NeedFunctionPrototypes
DeviceIntPtr /*device*/
#endif
);
extern DevicePtr LookupKeyboardDevice(
#if NeedFunctionPrototypes
void
#endif
);
extern DevicePtr LookupPointerDevice(
#if NeedFunctionPrototypes
void
#endif
);
extern DevicePtr LookupDevice(
#if NeedFunctionPrototypes
int /* id */
#endif
);
extern void QueryMinMaxKeyCodes(
#if NeedFunctionPrototypes
KeyCode* /*minCode*/,
KeyCode* /*maxCode*/
#endif
);
extern Bool SetKeySymsMap(
#if NeedFunctionPrototypes
KeySymsPtr /*dst*/,
KeySymsPtr /*src*/
#endif
);
extern Bool InitKeyClassDeviceStruct(
#if NeedFunctionPrototypes
DeviceIntPtr /*device*/,
KeySymsPtr /*pKeySyms*/,
CARD8 /*pModifiers*/[]
#endif
);
extern Bool InitButtonClassDeviceStruct(
#if NeedFunctionPrototypes
DeviceIntPtr /*device*/,
int /*numButtons*/,
CARD8* /*map*/
#endif
);
typedef int (*ValuatorMotionProcPtr)(
#if NeedNestedPrototypes
DeviceIntPtr /*pdevice*/,
xTimecoord * /*coords*/,
unsigned long /*start*/,
unsigned long /*stop*/,
ScreenPtr /*pScreen*/
#endif
);
extern Bool InitValuatorClassDeviceStruct(
#if NeedFunctionPrototypes
DeviceIntPtr /*device*/,
int /*numAxes*/,
ValuatorMotionProcPtr /* motionProc */,
int /*numMotionEvents*/,
int /*mode*/
#endif
);
extern Bool InitFocusClassDeviceStruct(
#if NeedFunctionPrototypes
DeviceIntPtr /*device*/
#endif
);
typedef void (*BellProcPtr)(
#if NeedNestedPrototypes
int /*percent*/,
DeviceIntPtr /*device*/,
pointer /*ctrl*/,
int
#endif
);
typedef void (*KbdCtrlProcPtr)(
#if NeedNestedPrototypes
DeviceIntPtr /*device*/,
KeybdCtrl * /*ctrl*/
#endif
);
extern Bool InitKbdFeedbackClassDeviceStruct(
#if NeedFunctionPrototypes
DeviceIntPtr /*device*/,
BellProcPtr /*bellProc*/,
KbdCtrlProcPtr /*controlProc*/
#endif
);
typedef void (*PtrCtrlProcPtr)(
#if NeedNestedPrototypes
DeviceIntPtr /*device*/,
PtrCtrl * /*ctrl*/
#endif
);
extern Bool InitPtrFeedbackClassDeviceStruct(
#if NeedFunctionPrototypes
DeviceIntPtr /*device*/,
PtrCtrlProcPtr /*controlProc*/
#endif
);
typedef void (*StringCtrlProcPtr)(
#if NeedNestedPrototypes
DeviceIntPtr /*device*/,
StringCtrl * /*ctrl*/
#endif
);
extern Bool InitStringFeedbackClassDeviceStruct(
#if NeedFunctionPrototypes
DeviceIntPtr /*device*/,
StringCtrlProcPtr /*controlProc*/,
int /*max_symbols*/,
int /*num_symbols_supported*/,
KeySym* /*symbols*/
#endif
);
typedef void (*BellCtrlProcPtr)(
#if NeedNestedPrototypes
DeviceIntPtr /*device*/,
BellCtrl * /*ctrl*/
#endif
);
extern Bool InitBellFeedbackClassDeviceStruct(
#if NeedFunctionPrototypes
DeviceIntPtr /*device*/,
BellProcPtr /*bellProc*/,
BellCtrlProcPtr /*controlProc*/
#endif
);
typedef void (*LedCtrlProcPtr)(
#if NeedNestedPrototypes
DeviceIntPtr /*device*/,
LedCtrl * /*ctrl*/
#endif
);
extern Bool InitLedFeedbackClassDeviceStruct(
#if NeedFunctionPrototypes
DeviceIntPtr /*device*/,
LedCtrlProcPtr /*controlProc*/
#endif
);
typedef void (*IntegerCtrlProcPtr)(
#if NeedNestedPrototypes
DeviceIntPtr /*device*/,
IntegerCtrl * /*ctrl*/
#endif
);
extern Bool InitIntegerFeedbackClassDeviceStruct(
#if NeedFunctionPrototypes
DeviceIntPtr /*device*/,
IntegerCtrlProcPtr /*controlProc*/
#endif
);
extern Bool InitPointerDeviceStruct(
#if NeedFunctionPrototypes
DevicePtr /*device*/,
CARD8* /*map*/,
int /*numButtons*/,
ValuatorMotionProcPtr /*motionProc*/,
PtrCtrlProcPtr /*controlProc*/,
int /*numMotionEvents*/
#endif
);
extern Bool InitKeyboardDeviceStruct(
#if NeedFunctionPrototypes
DevicePtr /*device*/,
KeySymsPtr /*pKeySyms*/,
CARD8 /*pModifiers*/[],
BellProcPtr /*bellProc*/,
KbdCtrlProcPtr /*controlProc*/
#endif
);
extern void SendMappingNotify(
#if NeedFunctionPrototypes
unsigned int /*request*/,
unsigned int /*firstKeyCode*/,
unsigned int /*count*/,
ClientPtr /* client */
#endif
);
extern Bool BadDeviceMap(
#if NeedFunctionPrototypes
BYTE* /*buff*/,
int /*length*/,
unsigned /*low*/,
unsigned /*high*/,
XID* /*errval*/
#endif
);
extern Bool AllModifierKeysAreUp(
#if NeedFunctionPrototypes
DeviceIntPtr /*device*/,
CARD8* /*map1*/,
int /*per1*/,
CARD8* /*map2*/,
int /*per2*/
#endif
);
extern void NoteLedState(
#if NeedFunctionPrototypes
DeviceIntPtr /*keybd*/,
int /*led*/,
Bool /*on*/
#endif
);
extern void MaybeStopHint(
#if NeedFunctionPrototypes
DeviceIntPtr /*device*/,
ClientPtr /*client*/
#endif
);
extern void ProcessPointerEvent(
#if NeedFunctionPrototypes
xEventPtr /*xE*/,
DeviceIntPtr /*mouse*/,
int /*count*/
#endif
);
extern void ProcessKeyboardEvent(
#if NeedFunctionPrototypes
xEventPtr /*xE*/,
DeviceIntPtr /*keybd*/,
int /*count*/
#endif
);
#ifdef XKB
extern void CoreProcessPointerEvent(
#if NeedFunctionPrototypes
xEventPtr /*xE*/,
DeviceIntPtr /*mouse*/,
int /*count*/
#endif
);
extern void CoreProcessKeyboardEvent(
#if NeedFunctionPrototypes
xEventPtr /*xE*/,
DeviceIntPtr /*keybd*/,
int /*count*/
#endif
);
#endif
extern Bool LegalModifier(
#if NeedFunctionPrototypes
unsigned int /*key*/,
DevicePtr /*pDev*/
#endif
);
extern void ProcessInputEvents(
#if NeedFunctionPrototypes
void
#endif
);
extern void InitInput(
#if NeedFunctionPrototypes
int /*argc*/,
char ** /*argv*/
#endif
);
#endif /* INPUT_H */
/***********************************************************
Copyright (c) 1987 X Consortium
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
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
X CONSORTIUM 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 X Consortium 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 X Consortium.
Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
All Rights Reserved
Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the name of Digital not be
used in advertising or publicity pertaining to distribution of the
software without specific, written prior permission.
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
SOFTWARE.
Copyright 1992, 1993 Data General Corporation;
Copyright 1992, 1993 OMRON Corporation
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, and that
neither the name OMRON or DATA GENERAL be used in advertising or publicity
pertaining to distribution of the software without specific, written prior
permission of the party whose name is to be used. Neither OMRON or
DATA GENERAL make any representation about the suitability of this software
for any purpose. It is provided "as is" without express or implied warranty.
OMRON AND DATA GENERAL EACH DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
IN NO EVENT SHALL OMRON OR DATA GENERAL BE LIABLE FOR ANY SPECIAL, INDIRECT
OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
OF THIS SOFTWARE.
******************************************************************/
/* $XConsortium: misc.h /main/28 1996/12/02 10:22:01 lehors $ */
/* $XFree86: xc/programs/Xserver/include/misc.h,v 3.5 1996/12/23 07:09:29 dawes Exp $ */
#ifndef MISC_H
#define MISC_H 1
/*
* X internal definitions
*
*/
extern unsigned long globalSerialNumber;
extern unsigned long serverGeneration;
#include <X11/Xosdefs.h>
#include <X11/Xfuncproto.h>
#include <X11/Xmd.h>
#include <X11/X.h>
#ifndef NULL
#ifndef X_NOT_STDC_ENV
#include <stddef.h>
#else
#define NULL 0
#endif
#endif
#ifndef MAXSCREENS
#define MAXSCREENS 3
#endif
#define MAXCLIENTS 128
#define MAXDITS 1
#define MAXEXTENSIONS 128
#define MAXFORMATS 8
#define MAXVISUALS_PER_SCREEN 50
#if NeedFunctionPrototypes
typedef void *pointer;
#else
typedef unsigned char *pointer;
#endif
typedef int Bool;
typedef unsigned long PIXEL;
typedef unsigned long ATOM;
#ifndef TRUE
#define TRUE 1
#define FALSE 0
#endif
#ifndef _XTYPEDEF_FONTPTR
typedef struct _Font *FontPtr; /* also in fonts/include/font.h */
#define _XTYPEDEF_FONTPTR
#endif
#ifndef _XTYPEDEF_CLIENTPTR
typedef struct _Client *ClientPtr; /* also in dix.h */
#define _XTYPEDEF_CLIENTPTR
#endif
#ifndef _XTYPEDEF_CALLBACKLISTPTR
typedef struct _CallbackList *CallbackListPtr; /* also in dix.h */
#define _XTYPEDEF_CALLBACKLISTPTR
#endif
typedef struct _xReq *xReqPtr;
#include "os.h" /* for ALLOCATE_LOCAL and DEALLOCATE_LOCAL */
#include <X11/Xfuncs.h> /* for bcopy, bzero, and bcmp */
#define NullBox ((BoxPtr)0)
#define MILLI_PER_MIN (1000 * 60)
#define MILLI_PER_SECOND (1000)
/* this next is used with None and ParentRelative to tell
PaintWin() what to use to paint the background. Also used
in the macro IS_VALID_PIXMAP */
#define USE_BACKGROUND_PIXEL 3
#define USE_BORDER_PIXEL 3
/* byte swap a 32-bit literal */
#define lswapl(x) ((((x) & 0xff) << 24) |\
(((x) & 0xff00) << 8) |\
(((x) & 0xff0000) >> 8) |\
(((x) >> 24) & 0xff))
/* byte swap a short literal */
#define lswaps(x) ((((x) & 0xff) << 8) | (((x) >> 8) & 0xff))
#define min(a, b) (((a) < (b)) ? (a) : (b))
#define max(a, b) (((a) > (b)) ? (a) : (b))
#if !defined(AMOEBA) && !defined(__EMX__)
#ifndef abs
#define abs(a) ((a) > 0 ? (a) : -(a))
#endif
#else /* AMOEBA || __EMX__ */
/* abs() is a function, not a macro; include the file declaring
* it in case we haven't done that yet.
*/
#include <stdlib.h>
#endif /* AMOEBA */
#ifndef Fabs
#define Fabs(a) ((a) > 0.0 ? (a) : -(a)) /* floating absolute value */
#endif
#define sign(x) ((x) < 0 ? -1 : ((x) > 0 ? 1 : 0))
/* this assumes b > 0 */
#define modulus(a, b, d) if (((d) = (a) % (b)) < 0) (d) += (b)
/*
* return the least significant bit in x which is set
*
* This works on 1's complement and 2's complement machines.
* If you care about the extra instruction on 2's complement
* machines, change to ((x) & (-(x)))
*/
#define lowbit(x) ((x) & (~(x) + 1))
#ifndef MAXSHORT
#define MAXSHORT 32767
#endif
#ifndef MINSHORT
#define MINSHORT -MAXSHORT
#endif
/* some macros to help swap requests, replies, and events */
#define LengthRestB(stuff) \
((client->req_len << 2) - sizeof(*stuff))
#define LengthRestS(stuff) \
((client->req_len << 1) - (sizeof(*stuff) >> 1))
#define LengthRestL(stuff) \
(client->req_len - (sizeof(*stuff) >> 2))
#define SwapRestS(stuff) \
SwapShorts((short *)(stuff + 1), LengthRestS(stuff))
#define SwapRestL(stuff) \
SwapLongs((CARD32 *)(stuff + 1), LengthRestL(stuff))
/* byte swap a 32-bit value */
#define swapl(x, n) { \
n = ((char *) (x))[0];\
((char *) (x))[0] = ((char *) (x))[3];\
((char *) (x))[3] = n;\
n = ((char *) (x))[1];\
((char *) (x))[1] = ((char *) (x))[2];\
((char *) (x))[2] = n; }
/* byte swap a short */
#define swaps(x, n) { \
n = ((char *) (x))[0];\
((char *) (x))[0] = ((char *) (x))[1];\
((char *) (x))[1] = n; }
/* copy 32-bit value from src to dst byteswapping on the way */
#define cpswapl(src, dst) { \
((char *)&(dst))[0] = ((char *) &(src))[3];\
((char *)&(dst))[1] = ((char *) &(src))[2];\
((char *)&(dst))[2] = ((char *) &(src))[1];\
((char *)&(dst))[3] = ((char *) &(src))[0]; }
/* copy short from src to dst byteswapping on the way */
#define cpswaps(src, dst) { \
((char *) &(dst))[0] = ((char *) &(src))[1];\
((char *) &(dst))[1] = ((char *) &(src))[0]; }
extern void SwapLongs(
#if NeedFunctionPrototypes
CARD32 *list,
unsigned long count
#endif
);
extern void SwapShorts(
#if NeedFunctionPrototypes
short *list,
unsigned long count
#endif
);
extern void MakePredeclaredAtoms(
#if NeedFunctionPrototypes
void
#endif
);
extern int Ones(
#if NeedFunctionPrototypes
unsigned long /*mask*/
#endif
);
typedef struct _xPoint *DDXPointPtr;
typedef struct _Box *BoxPtr;
typedef struct _xEvent *xEventPtr;
typedef struct _xRectangle *xRectanglePtr;
typedef struct _GrabRec *GrabPtr;
/* typedefs from other places - duplicated here to minimize the amount
* of unnecessary junk that one would normally have to include to get
* these symbols defined
*/
#ifndef _XTYPEDEF_CHARINFOPTR
typedef struct _CharInfo *CharInfoPtr; /* also in fonts/include/font.h */
#define _XTYPEDEF_CHARINFOPTR
#endif
#endif /* MISC_H */
/* $XConsortium: miscstruct.h,v 5.5 94/04/17 20:25:50 dpw Exp $ */
/* $XFree86: xc/programs/Xserver/include/miscstruct.h,v 3.0 1996/02/18 03:45:10 dawes Exp $ */
/***********************************************************
Copyright (c) 1987 X Consortium
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
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
X CONSORTIUM 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 X Consortium 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 X Consortium.
Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
All Rights Reserved
Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the name of Digital not be
used in advertising or publicity pertaining to distribution of the
software without specific, written prior permission.
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
SOFTWARE.
******************************************************************/
#ifndef MISCSTRUCT_H
#define MISCSTRUCT_H 1
#include "misc.h"
#include "X11/Xprotostr.h"
typedef xPoint DDXPointRec;
typedef struct _Box {
short x1, y1, x2, y2;
} BoxRec;
typedef union _DevUnion {
pointer ptr;
long val;
unsigned long uval;
pointer (*fptr)(
#if NeedFunctionPrototypes
void
#endif
);
} DevUnion;
#endif /* MISCSTRUCT_H */
/* $XConsortium: opaque.h,v 1.19 94/04/17 20:25:51 dpw Exp $ */
/*
Copyright (c) 1987 X Consortium
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
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 X CONSORTIUM 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 X Consortium 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 X Consortium.
*/
/* $XFree86: xc/programs/Xserver/include/opaque.h,v 1.2.2.1 1997/06/01 12:33:43 dawes Exp $ */
#ifndef OPAQUE_H
#define OPAQUE_H
#include <X11/Xmd.h>
extern char *defaultFontPath;
extern char *defaultTextFont;
extern char *defaultCursorFont;
extern char *rgbPath;
extern int MaxClients;
extern char isItTimeToYield;
extern char dispatchException;
/* bit values for dispatchException */
#define DE_RESET 1
#define DE_TERMINATE 2
#define DE_PRIORITYCHANGE 4 /* set when a client's priority changes */
extern CARD32 TimeOutValue;
extern CARD32 ScreenSaverTime;
extern CARD32 ScreenSaverInterval;
extern int ScreenSaverBlanking;
extern int ScreenSaverAllowExposures;
extern int argcGlobal;
extern char **argvGlobal;
#if DPMSExtension
extern CARD32 defaultDPMSStandbyTime;
extern CARD32 defaultDPMSSuspendTime;
extern CARD32 defaultDPMSOffTime;
extern CARD32 DPMSStandbyTime;
extern CARD32 DPMSSuspendTime;
extern CARD32 DPMSOffTime;
extern CARD16 DPMSPowerLevel;
extern Bool defaultDPMSEnabled;
extern Bool DPMSEnabled;
extern Bool DPMSEnabledSwitch;
extern Bool DPMSDisabledSwitch;
extern Bool DPMSCapableFlag;
#endif
#endif /* OPAQUE_H */
/***********************************************************
Copyright (c) 1987 X Consortium
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
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
X CONSORTIUM 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 X Consortium 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 X Consortium.
Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
All Rights Reserved
Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the name of Digital not be
used in advertising or publicity pertaining to distribution of the
software without specific, written prior permission.
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
SOFTWARE.
******************************************************************/
/* $XConsortium: os.h /main/60 1996/12/15 21:25:13 rws $ */
/* $XFree86: xc/programs/Xserver/include/os.h,v 3.16.2.1 1998/01/22 10:47:13 dawes Exp $ */
#ifndef OS_H
#define OS_H
#include "Xserver/misc.h"
#define ALLOCATE_LOCAL_FALLBACK(_size) Xalloc((unsigned long)(_size))
#define DEALLOCATE_LOCAL_FALLBACK(_ptr) Xfree((pointer)(_ptr))
#include "X11/Xalloca.h"
#define NullFID ((FID) 0)
#define SCREEN_SAVER_ON 0
#define SCREEN_SAVER_OFF 1
#define SCREEN_SAVER_FORCER 2
#define SCREEN_SAVER_CYCLE 3
#ifndef MAX_REQUEST_SIZE
#define MAX_REQUEST_SIZE 65535
#endif
#ifndef MAX_BIG_REQUEST_SIZE
#define MAX_BIG_REQUEST_SIZE 1048575
#endif
typedef pointer FID;
typedef struct _FontPathRec *FontPathPtr;
typedef struct _NewClientRec *NewClientPtr;
#define xnfalloc(size) XNFalloc((unsigned long)(size))
#define xnfrealloc(ptr, size) XNFrealloc((pointer)(ptr), (unsigned long)(size))
#define xalloc(size) Xalloc((unsigned long)(size))
#define xnfalloc(size) XNFalloc((unsigned long)(size))
#define xcalloc(_num, _size) Xcalloc((unsigned long)(_num)*(unsigned long)(_size))
#define xrealloc(ptr, size) Xrealloc((pointer)(ptr), (unsigned long)(size))
#define xnfrealloc(ptr, size) XNFrealloc((pointer)(ptr), (unsigned long)(size))
#define xfree(ptr) Xfree((pointer)(ptr))
#ifdef SCO
#include <stdio.h>
#endif
#ifndef X_NOT_STDC_ENV
#include <string.h>
#else
#ifdef SYSV
#include <string.h>
#else
#include <strings.h>
#endif
#endif
/* have to put $(SIGNAL_DEFINES) in DEFINES in Imakefile to get this right */
#ifdef SIGNALRETURNSINT
#define SIGVAL int
#else
#define SIGVAL void
#endif
extern Bool OsDelayInitColors;
extern int WaitForSomething(
#if NeedFunctionPrototypes
int* /*pClientsReady*/
#endif
);
#ifdef LBX
#define ReadRequestFromClient(client) ((client)->readRequest(client))
extern int StandardReadRequestFromClient(
#if NeedFunctionPrototypes
ClientPtr /*client*/
#endif
);
#else
extern int ReadRequestFromClient(
#if NeedFunctionPrototypes
ClientPtr /*client*/
#endif
);
#endif /* LBX */
extern Bool InsertFakeRequest(
#if NeedFunctionPrototypes
ClientPtr /*client*/,
char* /*data*/,
int /*count*/
#endif
);
extern int ResetCurrentRequest(
#if NeedFunctionPrototypes
ClientPtr /*client*/
#endif
);
extern void FlushAllOutput(
#if NeedFunctionPrototypes
void
#endif
);
extern void FlushIfCriticalOutputPending(
#if NeedFunctionPrototypes
void
#endif
);
extern void SetCriticalOutputPending(
#if NeedFunctionPrototypes
void
#endif
);
extern int WriteToClient(
#if NeedFunctionPrototypes
ClientPtr /*who*/,
int /*count*/,
char* /*buf*/
#endif
);
extern void ResetOsBuffers(
#if NeedFunctionPrototypes
void
#endif
);
extern void CreateWellKnownSockets(
#if NeedFunctionPrototypes
void
#endif
);
extern void ResetWellKnownSockets(
#if NeedFunctionPrototypes
void
#endif
);
extern XID
AuthorizationIDOfClient(
#if NeedFunctionPrototypes
ClientPtr /*client*/
#endif
);
extern char *ClientAuthorized(
#if NeedFunctionPrototypes
ClientPtr /*client*/,
unsigned int /*proto_n*/,
char* /*auth_proto*/,
unsigned int /*string_n*/,
char* /*auth_string*/
#endif
);
extern Bool EstablishNewConnections(
#if NeedFunctionPrototypes
ClientPtr /*clientUnused*/,
pointer /*closure*/
#endif
);
extern void CheckConnections(
#if NeedFunctionPrototypes
void
#endif
);
extern void CloseDownConnection(
#if NeedFunctionPrototypes
ClientPtr /*client*/
#endif
);
extern int AddEnabledDevice(
#if NeedFunctionPrototypes
int /*fd*/
#endif
);
extern int RemoveEnabledDevice(
#if NeedFunctionPrototypes
int /*fd*/
#endif
);
extern int OnlyListenToOneClient(
#if NeedFunctionPrototypes
ClientPtr /*client*/
#endif
);
extern int ListenToAllClients(
#if NeedFunctionPrototypes
void
#endif
);
extern int IgnoreClient(
#if NeedFunctionPrototypes
ClientPtr /*client*/
#endif
);
extern int AttendClient(
#if NeedFunctionPrototypes
ClientPtr /*client*/
#endif
);
extern int MakeClientGrabImpervious(
#if NeedFunctionPrototypes
ClientPtr /*client*/
#endif
);
extern int MakeClientGrabPervious(
#if NeedFunctionPrototypes
ClientPtr /*client*/
#endif
);
extern void Error(
#if NeedFunctionPrototypes
char* /*str*/
#endif
);
extern CARD32 GetTimeInMillis(
#if NeedFunctionPrototypes
void
#endif
);
extern int AdjustWaitForDelay(
#if NeedFunctionPrototypes
pointer /*waitTime*/,
unsigned long /*newdelay*/
#endif
);
typedef struct _OsTimerRec *OsTimerPtr;
typedef CARD32 (*OsTimerCallback)(
#if NeedFunctionPrototypes
OsTimerPtr /* timer */,
CARD32 /* time */,
pointer /* arg */
#endif
);
extern void TimerInit(
#if NeedFunctionPrototypes
void
#endif
);
extern Bool TimerForce(
#if NeedFunctionPrototypes
OsTimerPtr /* timer */
#endif
);
#define TimerAbsolute (1<<0)
#define TimerForceOld (1<<1)
extern OsTimerPtr TimerSet(
#if NeedFunctionPrototypes
OsTimerPtr /* timer */,
int /* flags */,
CARD32 /* millis */,
OsTimerCallback /* func */,
pointer /* arg */
#endif
);
extern void TimerCheck(
#if NeedFunctionPrototypes
void
#endif
);
extern void TimerCancel(
#if NeedFunctionPrototypes
OsTimerPtr /* pTimer */
#endif
);
extern void TimerFree(
#if NeedFunctionPrototypes
OsTimerPtr /* pTimer */
#endif
);
extern SIGVAL AutoResetServer(
#if NeedFunctionPrototypes
int /*sig*/
#endif
);
extern SIGVAL GiveUp(
#if NeedFunctionPrototypes
int /*sig*/
#endif
);
extern void UseMsg(
#if NeedFunctionPrototypes
void
#endif
);
extern void ProcessCommandLine(
#if NeedFunctionPrototypes
int /*argc*/,
char* /*argv*/[]
#endif
);
extern unsigned long *Xalloc(
#if NeedFunctionPrototypes
unsigned long /*amount*/
#endif
);
extern unsigned long *XNFalloc(
#if NeedFunctionPrototypes
unsigned long /*amount*/
#endif
);
extern unsigned long *Xcalloc(
#if NeedFunctionPrototypes
unsigned long /*amount*/
#endif
);
extern unsigned long *Xrealloc(
#if NeedFunctionPrototypes
pointer /*ptr*/,
unsigned long /*amount*/
#endif
);
extern unsigned long *XNFrealloc(
#if NeedFunctionPrototypes
pointer /*ptr*/,
unsigned long /*amount*/
#endif
);
extern void Xfree(
#if NeedFunctionPrototypes
pointer /*ptr*/
#endif
);
extern void OsInitAllocator(
#if NeedFunctionPrototypes
void
#endif
);
typedef SIGVAL (*OsSigHandlerPtr)(
#if NeedFunctionPrototypes
int /* sig */
#endif
);
extern OsSigHandlerPtr OsSignal(
#if NeedFunctionPrototypes
int /* sig */,
OsSigHandlerPtr /* handler */
#endif
);
extern int auditTrailLevel;
extern void AuditF(
#if NeedVarargsPrototypes
char* /*f*/,
...
#endif
);
extern void FatalError(
#if NeedVarargsPrototypes
char* /*f*/,
...
#endif
)
#if __GNUC__ == 2 && __GNUC_MINOR__ > 4
__attribute((noreturn))
#endif
;
extern void ErrorF(
#if NeedVarargsPrototypes
char* /*f*/,
...
#endif
);
#ifdef SERVER_LOCK
extern void LockServer(
#if NeedFunctionPrototypes
void
#endif
);
extern void UnlockServer(
#if NeedFunctionPrototypes
void
#endif
);
#endif
extern int OsLookupColor(
#if NeedFunctionPrototypes
int /*screen*/,
char * /*name*/,
unsigned /*len*/,
unsigned short * /*pred*/,
unsigned short * /*pgreen*/,
unsigned short * /*pblue*/
#endif
);
extern void OsInit(
#if NeedFunctionPrototypes
void
#endif
);
extern void OsCleanup(
#if NeedFunctionPrototypes
void
#endif
);
extern void OsVendorFatalError(
#if NeedFunctionPrototypes
void
#endif
);
extern void OsVendorInit(
#if NeedFunctionPrototypes
void
#endif
);
extern int OsInitColors(
#if NeedFunctionPrototypes
void
#endif
);
#if !defined(WIN32) && !defined(__EMX__)
extern int System(
#if NeedFunctionPrototypes
char *
#endif
);
extern pointer Popen(
#if NeedFunctionPrototypes
char *,
char *
#endif
);
extern int Pclose(
#if NeedFunctionPrototypes
pointer
#endif
);
#else
#define System(a) system(a)
#define Popen(a,b) popen(a,b)
#define Pclose(a) pclose(a)
#endif
extern int AddHost(
#if NeedFunctionPrototypes
ClientPtr /*client*/,
int /*family*/,
unsigned /*length*/,
pointer /*pAddr*/
#endif
);
extern Bool ForEachHostInFamily (
#if NeedFunctionPrototypes
int /*family*/,
Bool (* /*func*/ )(
#if NeedNestedPrototypes
unsigned char * /* addr */,
short /* len */,
pointer /* closure */
#endif
),
pointer /*closure*/
#endif
);
extern int RemoveHost(
#if NeedFunctionPrototypes
ClientPtr /*client*/,
int /*family*/,
unsigned /*length*/,
pointer /*pAddr*/
#endif
);
extern int GetHosts(
#if NeedFunctionPrototypes
pointer * /*data*/,
int * /*pnHosts*/,
int * /*pLen*/,
BOOL * /*pEnabled*/
#endif
);
typedef struct sockaddr * sockaddrPtr;
extern int InvalidHost(
#if NeedFunctionPrototypes
sockaddrPtr /*saddr*/,
int /*len*/
#endif
);
extern int LocalClient(
#if NeedFunctionPrototypes
ClientPtr /* client */
#endif
);
extern int ChangeAccessControl(
#if NeedFunctionPrototypes
ClientPtr /*client*/,
int /*fEnabled*/
#endif
);
extern int GetAccessControl(
#if NeedFunctionPrototypes
void
#endif
);
extern void AddLocalHosts(
#if NeedFunctionPrototypes
void
#endif
);
extern void ResetHosts(
#if NeedFunctionPrototypes
char *display
#endif
);
extern void EnableLocalHost(
#if NeedFunctionPrototypes
void
#endif
);
extern void DisableLocalHost(
#if NeedFunctionPrototypes
void
#endif
);
extern void AccessUsingXdmcp(
#if NeedFunctionPrototypes
void
#endif
);
extern void DefineSelf(
#if NeedFunctionPrototypes
int /*fd*/
#endif
);
extern void AugmentSelf(
#if NeedFunctionPrototypes
pointer /*from*/,
int /*len*/
#endif
);
extern void InitAuthorization(
#if NeedFunctionPrototypes
char * /*filename*/
#endif
);
extern int LoadAuthorization(
#if NeedFunctionPrototypes
void
#endif
);
extern void RegisterAuthorizations(
#if NeedFunctionPrototypes
void
#endif
);
extern XID CheckAuthorization(
#if NeedFunctionPrototypes
unsigned int /*namelength*/,
char * /*name*/,
unsigned int /*datalength*/,
char * /*data*/,
ClientPtr /*client*/,
char ** /*reason*/
#endif
);
extern void ResetAuthorization(
#if NeedFunctionPrototypes
void
#endif
);
extern int AddAuthorization(
#if NeedFunctionPrototypes
unsigned int /*name_length*/,
char * /*name*/,
unsigned int /*data_length*/,
char * /*data*/
#endif
);
extern XID GenerateAuthorization(
#if NeedFunctionPrototypes
unsigned int /* name_length */,
char * /* name */,
unsigned int /* data_length */,
char * /* data */,
unsigned int * /* data_length_return */,
char ** /* data_return */
#endif
);
extern void ExpandCommandLine(
#if NeedFunctionPrototypes
int * /*pargc*/,
char *** /*pargv*/
#endif
);
extern int ddxProcessArgument(
#if NeedFunctionPrototypes
int /*argc*/,
char * /*argv*/ [],
int /*i*/
#endif
);
/*
* idiom processing stuff
*/
xReqPtr PeekNextRequest(
#if NeedFunctionPrototypes
xReqPtr req, ClientPtr client, Bool readmore
#endif
);
void SkipRequests(
#if NeedFunctionPrototypes
xReqPtr req, ClientPtr client, int numskipped
#endif
);
/* int ReqLen(xReq *req, ClientPtr client)
* Given a pointer to a *complete* request, return its length in bytes.
* Note that if the request is a big request (as defined in the Big
* Requests extension), the macro lies by returning 4 less than the
* length that it actually occupies in the request buffer. This is so you
* can blindly compare the length with the various sz_<request> constants
* in Xproto.h without having to know/care about big requests.
*/
#define ReqLen(_pxReq, _client) \
((_pxReq->length ? \
(_client->swapped ? lswaps(_pxReq->length) : _pxReq->length) \
: ((_client->swapped ? \
lswapl(((CARD32*)_pxReq)[1]) : ((CARD32*)_pxReq)[1])-1) \
) << 2)
/* otherReqTypePtr CastxReq(xReq *req, otherReqTypePtr)
* Cast the given request to one of type otherReqTypePtr to access
* fields beyond the length field.
*/
#define CastxReq(_pxReq, otherReqTypePtr) \
(_pxReq->length ? (otherReqTypePtr)_pxReq \
: (otherReqTypePtr)(((CARD32*)_pxReq)+1))
/* stuff for SkippedRequestsCallback */
extern CallbackListPtr SkippedRequestsCallback;
typedef struct {
xReqPtr req;
ClientPtr client;
int numskipped;
} SkippedRequestInfoRec;
/* stuff for ReplyCallback */
extern CallbackListPtr ReplyCallback;
typedef struct {
ClientPtr client;
pointer replyData;
unsigned long dataLenBytes;
unsigned long bytesRemaining;
Bool startOfReply;
} ReplyInfoRec;
/* stuff for FlushCallback */
extern CallbackListPtr FlushCallback;
#endif /* OS_H */
/* $XConsortium: pixmap.h,v 5.6 94/04/17 20:25:53 dpw Exp $ */
/***********************************************************
Copyright (c) 1987 X Consortium
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
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
X CONSORTIUM 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 X Consortium 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 X Consortium.
Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
All Rights Reserved
Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the name of Digital not be
used in advertising or publicity pertaining to distribution of the
software without specific, written prior permission.
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
SOFTWARE.
******************************************************************/
#ifndef PIXMAP_H
#define PIXMAP_H
#include "misc.h"
#include "screenint.h"
/* types for Drawable */
#define DRAWABLE_WINDOW 0
#define DRAWABLE_PIXMAP 1
#define UNDRAWABLE_WINDOW 2
#define DRAWABLE_BUFFER 3
/* flags to PaintWindow() */
#define PW_BACKGROUND 0
#define PW_BORDER 1
#define NullPixmap ((PixmapPtr)0)
typedef struct _Drawable *DrawablePtr;
typedef struct _Pixmap *PixmapPtr;
typedef union _PixUnion {
PixmapPtr pixmap;
unsigned long pixel;
} PixUnion;
#define SamePixUnion(a,b,isPixel)\
((isPixel) ? (a).pixel == (b).pixel : (a).pixmap == (b).pixmap)
#define EqualPixUnion(as, a, bs, b) \
((as) == (bs) && (SamePixUnion (a, b, as)))
#define OnScreenDrawable(type) \
((type == DRAWABLE_WINDOW) || (type == DRAWABLE_BUFFER))
#define WindowDrawable(type) \
((type == DRAWABLE_WINDOW) || (type == UNDRAWABLE_WINDOW))
extern PixmapPtr GetScratchPixmapHeader(
#if NeedFunctionPrototypes
ScreenPtr /*pScreen*/,
int /*width*/,
int /*height*/,
int /*depth*/,
int /*bitsPerPixel*/,
int /*devKind*/,
pointer /*pPixData*/
#endif
);
extern void FreeScratchPixmapHeader(
#if NeedFunctionPrototypes
PixmapPtr /*pPixmap*/
#endif
);
extern Bool CreateScratchPixmapsForScreen(
#if NeedFunctionPrototypes
int /*scrnum*/
#endif
);
extern void FreeScratchPixmapsForScreen(
#if NeedFunctionPrototypes
int /*scrnum*/
#endif
);
extern PixmapPtr AllocatePixmap(
#if NeedFunctionPrototypes
ScreenPtr /*pScreen*/,
int /*pixDataSize*/
#endif
);
#endif /* PIXMAP_H */
/* $XConsortium: region.h,v 1.5 94/04/17 20:25:59 dpw Exp $ */
/***********************************************************
Copyright (c) 1987 X Consortium
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
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
X CONSORTIUM 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 X Consortium 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 X Consortium.
Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
All Rights Reserved
Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the name of Digital not be
used in advertising or publicity pertaining to distribution of the
software without specific, written prior permission.
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
SOFTWARE.
******************************************************************/
#ifndef REGION_H
#define REGION_H
#include "regionstr.h"
#endif /* REGION_H */
/* $XConsortium: regionstr.h,v 1.8 94/04/17 20:26:01 dpw Exp $ */
/***********************************************************
Copyright (c) 1987 X Consortium
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
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
X CONSORTIUM 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 X Consortium 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 X Consortium.
Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
All Rights Reserved
Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the name of Digital not be
used in advertising or publicity pertaining to distribution of the
software without specific, written prior permission.
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
SOFTWARE.
******************************************************************/
#ifndef REGIONSTRUCT_H
#define REGIONSTRUCT_H
#include "miscstruct.h"
/* Return values from RectIn() */
#define rgnOUT 0
#define rgnIN 1
#define rgnPART 2
#define NullRegion ((RegionPtr)0)
/*
* clip region
*/
typedef struct _RegData {
long size;
long numRects;
/* BoxRec rects[size]; in memory but not explicitly declared */
} RegDataRec, *RegDataPtr;
typedef struct _Region {
BoxRec extents;
RegDataPtr data;
} RegionRec, *RegionPtr;
extern BoxRec miEmptyBox;
extern RegDataRec miEmptyData;
#define REGION_NIL(reg) ((reg)->data && !(reg)->data->numRects)
#define REGION_NUM_RECTS(reg) ((reg)->data ? (reg)->data->numRects : 1)
#define REGION_SIZE(reg) ((reg)->data ? (reg)->data->size : 0)
#define REGION_RECTS(reg) ((reg)->data ? (BoxPtr)((reg)->data + 1) \
: &(reg)->extents)
#define REGION_BOXPTR(reg) ((BoxPtr)((reg)->data + 1))
#define REGION_BOX(reg,i) (&REGION_BOXPTR(reg)[i])
#define REGION_TOP(reg) REGION_BOX(reg, (reg)->data->numRects)
#define REGION_END(reg) REGION_BOX(reg, (reg)->data->numRects - 1)
#define REGION_SZOF(n) (sizeof(RegDataRec) + ((n) * sizeof(BoxRec)))
#ifdef NEED_SCREEN_REGIONS
#define REGION_CREATE(_pScreen, _rect, _size) \
(*(_pScreen)->RegionCreate)(_rect, _size)
#define REGION_INIT(_pScreen, _pReg, _rect, _size) \
(*(_pScreen)->RegionInit)(_pReg, _rect, _size)
#define REGION_COPY(_pScreen, dst, src) \
(*(_pScreen)->RegionCopy)(dst, src)
#define REGION_DESTROY(_pScreen, _pReg) \
(*(_pScreen)->RegionDestroy)(_pReg)
#define REGION_UNINIT(_pScreen, _pReg) \
(*(_pScreen)->RegionUninit)(_pReg)
#define REGION_INTERSECT(_pScreen, newReg, reg1, reg2) \
(*(_pScreen)->Intersect)(newReg, reg1, reg2)
#define REGION_UNION(_pScreen, newReg, reg1, reg2) \
(*(_pScreen)->Union)(newReg, reg1, reg2)
#define REGION_SUBTRACT(_pScreen, newReg, reg1, reg2) \
(*(_pScreen)->Subtract)(newReg, reg1, reg2)
#define REGION_INVERSE(_pScreen, newReg, reg1, invRect) \
(*(_pScreen)->Inverse)(newReg, reg1, invRect)
#define REGION_RESET(_pScreen, _pReg, _pBox) \
(*(_pScreen)->RegionReset)(_pReg, _pBox)
#define REGION_TRANSLATE(_pScreen, _pReg, _x, _y) \
(*(_pScreen)->TranslateRegion)(_pReg, _x, _y)
#define RECT_IN_REGION(_pScreen, _pReg, prect) \
(*(_pScreen)->RectIn)(_pReg, prect)
#define POINT_IN_REGION(_pScreen, _pReg, _x, _y, prect) \
(*(_pScreen)->PointInRegion)(_pReg, _x, _y, prect)
#define REGION_NOTEMPTY(_pScreen, _pReg) \
(*(_pScreen)->RegionNotEmpty)(_pReg)
#define REGION_EMPTY(_pScreen, _pReg) \
(*(_pScreen)->RegionEmpty)(_pReg)
#define REGION_EXTENTS(_pScreen, _pReg) \
(*(_pScreen)->RegionExtents)(_pReg)
#define REGION_APPEND(_pScreen, dstrgn, rgn) \
(*(_pScreen)->RegionAppend)(dstrgn, rgn)
#define REGION_VALIDATE(_pScreen, badreg, pOverlap) \
(*(_pScreen)->RegionValidate)(badreg, pOverlap)
#define BITMAP_TO_REGION(_pScreen, pPix) \
(*(_pScreen)->BitmapToRegion)(pPix)
#define RECTS_TO_REGION(_pScreen, nrects, prect, ctype) \
(*(_pScreen)->RectsToRegion)(nrects, prect, ctype)
#else /* !NEED_SCREEN_REGIONS */
#define REGION_CREATE(_pScreen, _rect, _size) \
miRegionCreate(_rect, _size)
#define REGION_COPY(_pScreen, dst, src) \
miRegionCopy(dst, src)
#define REGION_DESTROY(_pScreen, _pReg) \
miRegionDestroy(_pReg)
#define REGION_INTERSECT(_pScreen, newReg, reg1, reg2) \
miIntersect(newReg, reg1, reg2)
#define REGION_UNION(_pScreen, newReg, reg1, reg2) \
miUnion(newReg, reg1, reg2)
#define REGION_SUBTRACT(_pScreen, newReg, reg1, reg2) \
miSubtract(newReg, reg1, reg2)
#define REGION_INVERSE(_pScreen, newReg, reg1, invRect) \
miInverse(newReg, reg1, invRect)
#define REGION_TRANSLATE(_pScreen, _pReg, _x, _y) \
miTranslateRegion(_pReg, _x, _y)
#define RECT_IN_REGION(_pScreen, _pReg, prect) \
miRectIn(_pReg, prect)
#define POINT_IN_REGION(_pScreen, _pReg, _x, _y, prect) \
miPointInRegion(_pReg, _x, _y, prect)
#define REGION_APPEND(_pScreen, dstrgn, rgn) \
miRegionAppend(dstrgn, rgn)
#define REGION_VALIDATE(_pScreen, badreg, pOverlap) \
miRegionValidate(badreg, pOverlap)
#define BITMAP_TO_REGION(_pScreen, pPix) \
(*(_pScreen)->BitmapToRegion)(pPix) /* no mi version?! */
#define RECTS_TO_REGION(_pScreen, nrects, prect, ctype) \
miRectsToRegion(nrects, prect, ctype)
#ifdef DONT_INLINE_REGION_OPS
#define REGION_INIT(_pScreen, _pReg, _rect, _size) \
miRegionInit(_pReg, _rect, _size)
#define REGION_UNINIT(_pScreen, _pReg) \
miRegionUninit(_pReg)
#define REGION_RESET(_pScreen, _pReg, _pBox) \
miRegionReset(_pReg, _pBox)
#define REGION_NOTEMPTY(_pScreen, _pReg) \
miRegionNotEmpty(_pReg)
#define REGION_EMPTY(_pScreen, _pReg) \
miRegionEmpty(_pReg)
#define REGION_EXTENTS(_pScreen, _pReg) \
miRegionExtents(_pReg)
#else /* inline certain simple region ops for performance */
#define REGION_INIT(_pScreen, _pReg, _rect, _size) \
{ \
if (_rect) \
{ \
(_pReg)->extents = *(_rect); \
(_pReg)->data = (RegDataPtr)NULL; \
} \
else \
{ \
(_pReg)->extents = miEmptyBox; \
if (((_size) > 1) && ((_pReg)->data = \
(RegDataPtr)xalloc(REGION_SZOF(_size)))) \
{ \
(_pReg)->data->size = (_size); \
(_pReg)->data->numRects = 0; \
} \
else \
(_pReg)->data = &miEmptyData; \
} \
}
#define REGION_UNINIT(_pScreen, _pReg) \
{ \
if ((_pReg)->data && (_pReg)->data->size) xfree((_pReg)->data); \
}
#define REGION_RESET(_pScreen, _pReg, _pBox) \
{ \
(_pReg)->extents = *(_pBox); \
REGION_UNINIT(_pScreen, _pReg); \
(_pReg)->data = (RegDataPtr)NULL; \
}
#define REGION_NOTEMPTY(_pScreen, _pReg) \
!REGION_NIL(_pReg)
#define REGION_EMPTY(_pScreen, _pReg) \
{ \
REGION_UNINIT(_pScreen, _pReg); \
(_pReg)->extents.x2 = (_pReg)->extents.x1; \
(_pReg)->extents.y2 = (_pReg)->extents.y1; \
(_pReg)->data = &miEmptyData; \
}
#define REGION_EXTENTS(_pScreen, _pReg) \
&(_pReg)->extents
#endif /* DONT_INLINE_REGION_OPS */
#endif /* NEED_SCREEN_REGIONS */
/* moved from mi.h */
extern RegionPtr miRegionCreate(
#if NeedFunctionPrototypes
BoxPtr /*rect*/,
int /*size*/
#endif
);
extern void miRegionInit(
#if NeedFunctionPrototypes
RegionPtr /*pReg*/,
BoxPtr /*rect*/,
int /*size*/
#endif
);
extern void miRegionDestroy(
#if NeedFunctionPrototypes
RegionPtr /*pReg*/
#endif
);
extern void miRegionUninit(
#if NeedFunctionPrototypes
RegionPtr /*pReg*/
#endif
);
extern Bool miRegionCopy(
#if NeedFunctionPrototypes
RegionPtr /*dst*/,
RegionPtr /*src*/
#endif
);
extern Bool miIntersect(
#if NeedFunctionPrototypes
RegionPtr /*newReg*/,
RegionPtr /*reg1*/,
RegionPtr /*reg2*/
#endif
);
extern Bool miUnion(
#if NeedFunctionPrototypes
RegionPtr /*newReg*/,
RegionPtr /*reg1*/,
RegionPtr /*reg2*/
#endif
);
extern Bool miRegionAppend(
#if NeedFunctionPrototypes
RegionPtr /*dstrgn*/,
RegionPtr /*rgn*/
#endif
);
extern Bool miRegionValidate(
#if NeedFunctionPrototypes
RegionPtr /*badreg*/,
Bool * /*pOverlap*/
#endif
);
extern RegionPtr miRectsToRegion(
#if NeedFunctionPrototypes
int /*nrects*/,
xRectanglePtr /*prect*/,
int /*ctype*/
#endif
);
extern Bool miSubtract(
#if NeedFunctionPrototypes
RegionPtr /*regD*/,
RegionPtr /*regM*/,
RegionPtr /*regS*/
#endif
);
extern Bool miInverse(
#if NeedFunctionPrototypes
RegionPtr /*newReg*/,
RegionPtr /*reg1*/,
BoxPtr /*invRect*/
#endif
);
extern int miRectIn(
#if NeedFunctionPrototypes
RegionPtr /*region*/,
BoxPtr /*prect*/
#endif
);
extern void miTranslateRegion(
#if NeedFunctionPrototypes
RegionPtr /*pReg*/,
int /*x*/,
int /*y*/
#endif
);
extern void miRegionReset(
#if NeedFunctionPrototypes
RegionPtr /*pReg*/,
BoxPtr /*pBox*/
#endif
);
extern Bool miPointInRegion(
#if NeedFunctionPrototypes
RegionPtr /*pReg*/,
int /*x*/,
int /*y*/,
BoxPtr /*box*/
#endif
);
extern Bool miRegionNotEmpty(
#if NeedFunctionPrototypes
RegionPtr /*pReg*/
#endif
);
extern void miRegionEmpty(
#if NeedFunctionPrototypes
RegionPtr /*pReg*/
#endif
);
extern BoxPtr miRegionExtents(
#if NeedFunctionPrototypes
RegionPtr /*pReg*/
#endif
);
#endif /* REGIONSTRUCT_H */
/* $XConsortium: screenint.h /main/6 1996/06/17 10:55:15 mor $ */
/***********************************************************
Copyright (c) 1987 X Consortium
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
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
X CONSORTIUM 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 X Consortium 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 X Consortium.
Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
All Rights Reserved
Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the name of Digital not be
used in advertising or publicity pertaining to distribution of the
software without specific, written prior permission.
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
SOFTWARE.
******************************************************************/
/* $XFree86: xc/programs/Xserver/include/screenint.h,v 1.2 1997/01/14 22:22:40 dawes Exp $ */
#ifndef SCREENINT_H
#define SCREENINT_H
#include "misc.h"
typedef struct _PixmapFormat *PixmapFormatPtr;
typedef struct _Visual *VisualPtr;
typedef struct _Depth *DepthPtr;
typedef struct _Screen *ScreenPtr;
extern void ResetScreenPrivates(
#if NeedFunctionPrototypes
void
#endif
);
extern int AllocateScreenPrivateIndex(
#if NeedFunctionPrototypes
void
#endif
);
extern void ResetWindowPrivates(
#if NeedFunctionPrototypes
void
#endif
);
extern int AllocateWindowPrivateIndex(
#if NeedFunctionPrototypes
void
#endif
);
extern Bool AllocateWindowPrivate(
#if NeedFunctionPrototypes
ScreenPtr /* pScreen */,
int /* index */,
unsigned /* amount */
#endif
);
extern void ResetGCPrivates(
#if NeedFunctionPrototypes
void
#endif
);
extern int AllocateGCPrivateIndex(
#if NeedFunctionPrototypes
void
#endif
);
extern Bool AllocateGCPrivate(
#if NeedFunctionPrototypes
ScreenPtr /* pScreen */,
int /* index */,
unsigned /* amount */
#endif
);
extern int AddScreen(
#if NeedFunctionPrototypes
Bool (* /*pfnInit*/)(
#if NeedNestedPrototypes
int /*index*/,
ScreenPtr /*pScreen*/,
int /*argc*/,
char ** /*argv*/
#endif
),
int /*argc*/,
char** /*argv*/
#endif
);
#ifdef PIXPRIV
extern void ResetPixmapPrivates(
#if NeedFunctionPrototypes
void
#endif
);
extern int AllocatePixmapPrivateIndex(
#if NeedFunctionPrototypes
void
#endif
);
extern Bool AllocatePixmapPrivate(
#if NeedFunctionPrototypes
ScreenPtr /* pScreen */,
int /* index */,
unsigned /* amount */
#endif
);
#endif /* PIXPRIV */
extern void ResetColormapPrivates(
#if NeedFunctionPrototypes
void
#endif
);
typedef struct _ColormapRec *ColormapPtr;
typedef int (*InitCmapPrivFunc)(
#if NeedNestedPrototypes
ColormapPtr
#endif
);
extern int AllocateColormapPrivateIndex(
#if NeedFunctionPrototypes
InitCmapPrivFunc /* initPrivFunc */
#endif
);
#endif /* SCREENINT_H */
/* $XConsortium: scrnintstr.h /main/32 1996/09/28 17:14:32 rws $ */
/***********************************************************
Copyright (c) 1987 X Consortium
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
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
X CONSORTIUM 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 X Consortium 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 X Consortium.
Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
All Rights Reserved
Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the name of Digital not be
used in advertising or publicity pertaining to distribution of the
software without specific, written prior permission.
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
SOFTWARE.
******************************************************************/
#ifndef SCREENINTSTRUCT_H
#define SCREENINTSTRUCT_H
#include "screenint.h"
#include "miscstruct.h"
#include "region.h"
#include "pixmap.h"
#include "gc.h"
#include "colormap.h"
#include "cursor.h"
#include "validate.h"
#include "window.h"
#include "X11/Xproto.h"
#include "dix.h"
typedef struct _PixmapFormat {
unsigned char depth;
unsigned char bitsPerPixel;
unsigned char scanlinePad;
} PixmapFormatRec;
typedef struct _Visual {
VisualID vid;
short class;
short bitsPerRGBValue;
short ColormapEntries;
short nplanes;/* = log2 (ColormapEntries). This does not
* imply that the screen has this many planes.
* it may have more or fewer */
unsigned long redMask, greenMask, blueMask;
int offsetRed, offsetGreen, offsetBlue;
} VisualRec;
typedef struct _Depth {
unsigned char depth;
short numVids;
VisualID *vids; /* block of visual ids for this depth */
} DepthRec;
/*
* There is a typedef for each screen function pointer so that code that
* needs to declare a screen function pointer (e.g. in a screen private
* or as a local variable) can easily do so and retain full type checking.
*/
typedef Bool (* CloseScreenProcPtr)(
#if NeedNestedPrototypes
int /*index*/,
ScreenPtr /*pScreen*/
#endif
);
typedef void (* QueryBestSizeProcPtr)(
#if NeedNestedPrototypes
int /*class*/,
unsigned short * /*pwidth*/,
unsigned short * /*pheight*/,
ScreenPtr /*pScreen*/
#endif
);
typedef Bool (* SaveScreenProcPtr)(
#if NeedNestedPrototypes
ScreenPtr /*pScreen*/,
int /*on*/
#endif
);
typedef void (* GetImageProcPtr)(
#if NeedNestedPrototypes
DrawablePtr /*pDrawable*/,
int /*sx*/,
int /*sy*/,
int /*w*/,
int /*h*/,
unsigned int /*format*/,
unsigned long /*planeMask*/,
char * /*pdstLine*/
#endif
);
typedef void (* GetSpansProcPtr)(
#if NeedNestedPrototypes
DrawablePtr /*pDrawable*/,
int /*wMax*/,
DDXPointPtr /*ppt*/,
int* /*pwidth*/,
int /*nspans*/,
char * /*pdstStart*/
#endif
);
typedef void (* PointerNonInterestBoxProcPtr)(
#if NeedNestedPrototypes
ScreenPtr /*pScreen*/,
BoxPtr /*pBox*/
#endif
);
typedef void (* SourceValidateProcPtr)(
#if NeedNestedPrototypes
DrawablePtr /*pDrawable*/,
int /*x*/,
int /*y*/,
int /*width*/,
int /*height*/
#endif
);
typedef Bool (* CreateWindowProcPtr)(
#if NeedNestedPrototypes
X11WindowPtr /*pWindow*/
#endif
);
typedef Bool (* DestroyWindowProcPtr)(
#if NeedNestedPrototypes
X11WindowPtr /*pWindow*/
#endif
);
typedef Bool (* PositionWindowProcPtr)(
#if NeedNestedPrototypes
X11WindowPtr /*pWindow*/,
int /*x*/,
int /*y*/
#endif
);
typedef Bool (* ChangeWindowAttributesProcPtr)(
#if NeedNestedPrototypes
X11WindowPtr /*pWindow*/,
unsigned long /*mask*/
#endif
);
typedef Bool (* RealizeWindowProcPtr)(
#if NeedNestedPrototypes
X11WindowPtr /*pWindow*/
#endif
);
typedef Bool (* UnrealizeWindowProcPtr)(
#if NeedNestedPrototypes
X11WindowPtr /*pWindow*/
#endif
);
typedef int (* ValidateTreeProcPtr)(
#if NeedNestedPrototypes
X11WindowPtr /*pParent*/,
X11WindowPtr /*pChild*/,
VTKind /*kind*/
#endif
);
typedef void (* PostValidateTreeProcPtr)(
#if NeedNestedPrototypes
X11WindowPtr /*pParent*/,
X11WindowPtr /*pChild*/,
VTKind /*kind*/
#endif
);
typedef void (* WindowExposuresProcPtr)(
#if NeedNestedPrototypes
X11WindowPtr /*pWindow*/,
RegionPtr /*prgn*/,
RegionPtr /*other_exposed*/
#endif
);
typedef void (* PaintWindowBackgroundProcPtr)(
#if NeedNestedPrototypes
X11WindowPtr /*pWindow*/,
RegionPtr /*pRegion*/,
int /*what*/
#endif
);
typedef void (* PaintWindowBorderProcPtr)(
#if NeedNestedPrototypes
X11WindowPtr /*pWindow*/,
RegionPtr /*pRegion*/,
int /*what*/
#endif
);
typedef void (* CopyWindowProcPtr)(
#if NeedNestedPrototypes
X11WindowPtr /*pWindow*/,
DDXPointRec /*ptOldOrg*/,
RegionPtr /*prgnSrc*/
#endif
);
typedef void (* ClearToBackgroundProcPtr)(
#if NeedNestedPrototypes
X11WindowPtr /*pWindow*/,
int /*x*/,
int /*y*/,
int /*w*/,
int /*h*/,
Bool /*generateExposures*/
#endif
);
typedef void (* ClipNotifyProcPtr)(
#if NeedNestedPrototypes
X11WindowPtr /*pWindow*/,
int /*dx*/,
int /*dy*/
#endif
);
typedef PixmapPtr (* CreatePixmapProcPtr)(
#if NeedNestedPrototypes
ScreenPtr /*pScreen*/,
int /*width*/,
int /*height*/,
int /*depth*/
#endif
);
typedef Bool (* DestroyPixmapProcPtr)(
#if NeedNestedPrototypes
PixmapPtr /*pPixmap*/
#endif
);
typedef void (* SaveDoomedAreasProcPtr)(
#if NeedNestedPrototypes
X11WindowPtr /*pWindow*/,
RegionPtr /*prgnSave*/,
int /*xorg*/,
int /*yorg*/
#endif
);
typedef RegionPtr (* RestoreAreasProcPtr)(
#if NeedNestedPrototypes
X11WindowPtr /*pWindow*/,
RegionPtr /*prgnRestore*/
#endif
);
typedef void (* ExposeCopyProcPtr)(
#if NeedNestedPrototypes
X11WindowPtr /*pSrc*/,
DrawablePtr /*pDst*/,
GCPtr /*pGC*/,
RegionPtr /*prgnExposed*/,
int /*srcx*/,
int /*srcy*/,
int /*dstx*/,
int /*dsty*/,
unsigned long /*plane*/
#endif
);
typedef RegionPtr (* TranslateBackingStoreProcPtr)(
#if NeedNestedPrototypes
X11WindowPtr /*pWindow*/,
int /*windx*/,
int /*windy*/,
RegionPtr /*oldClip*/,
int /*oldx*/,
int /*oldy*/
#endif
);
typedef RegionPtr (* ClearBackingStoreProcPtr)(
#if NeedNestedPrototypes
X11WindowPtr /*pWindow*/,
int /*x*/,
int /*y*/,
int /*w*/,
int /*h*/,
Bool /*generateExposures*/
#endif
);
typedef void (* DrawGuaranteeProcPtr)(
#if NeedNestedPrototypes
X11WindowPtr /*pWindow*/,
GCPtr /*pGC*/,
int /*guarantee*/
#endif
);
typedef Bool (* RealizeFontProcPtr)(
#if NeedNestedPrototypes
ScreenPtr /*pScreen*/,
FontPtr /*pFont*/
#endif
);
typedef Bool (* UnrealizeFontProcPtr)(
#if NeedNestedPrototypes
ScreenPtr /*pScreen*/,
FontPtr /*pFont*/
#endif
);
typedef void (* ConstrainCursorProcPtr)(
#if NeedNestedPrototypes
ScreenPtr /*pScreen*/,
BoxPtr /*pBox*/
#endif
);
typedef void (* CursorLimitsProcPtr)(
#if NeedNestedPrototypes
ScreenPtr /*pScreen*/,
CursorPtr /*pCursor*/,
BoxPtr /*pHotBox*/,
BoxPtr /*pTopLeftBox*/
#endif
);
typedef Bool (* DisplayCursorProcPtr)(
#if NeedNestedPrototypes
ScreenPtr /*pScreen*/,
CursorPtr /*pCursor*/
#endif
);
typedef Bool (* RealizeCursorProcPtr)(
#if NeedNestedPrototypes
ScreenPtr /*pScreen*/,
CursorPtr /*pCursor*/
#endif
);
typedef Bool (* UnrealizeCursorProcPtr)(
#if NeedNestedPrototypes
ScreenPtr /*pScreen*/,
CursorPtr /*pCursor*/
#endif
);
typedef void (* RecolorCursorProcPtr)(
#if NeedNestedPrototypes
ScreenPtr /*pScreen*/,
CursorPtr /*pCursor*/,
Bool /*displayed*/
#endif
);
typedef Bool (* SetCursorPositionProcPtr)(
#if NeedNestedPrototypes
ScreenPtr /*pScreen*/,
int /*x*/,
int /*y*/,
Bool /*generateEvent*/
#endif
);
typedef Bool (* CreateGCProcPtr)(
#if NeedNestedPrototypes
GCPtr /*pGC*/
#endif
);
typedef Bool (* CreateColormapProcPtr)(
#if NeedNestedPrototypes
ColormapPtr /*pColormap*/
#endif
);
typedef void (* DestroyColormapProcPtr)(
#if NeedNestedPrototypes
ColormapPtr /*pColormap*/
#endif
);
typedef void (* InstallColormapProcPtr)(
#if NeedNestedPrototypes
ColormapPtr /*pColormap*/
#endif
);
typedef void (* UninstallColormapProcPtr)(
#if NeedNestedPrototypes
ColormapPtr /*pColormap*/
#endif
);
typedef int (* ListInstalledColormapsProcPtr) (
#if NeedNestedPrototypes
ScreenPtr /*pScreen*/,
XID* /*pmaps */
#endif
);
typedef void (* StoreColorsProcPtr)(
#if NeedNestedPrototypes
ColormapPtr /*pColormap*/,
int /*ndef*/,
xColorItem * /*pdef*/
#endif
);
typedef void (* ResolveColorProcPtr)(
#if NeedNestedPrototypes
unsigned short* /*pred*/,
unsigned short* /*pgreen*/,
unsigned short* /*pblue*/,
VisualPtr /*pVisual*/
#endif
);
typedef RegionPtr (* RegionCreateProcPtr)(
#if NeedNestedPrototypes
BoxPtr /*rect*/,
int /*size*/
#endif
);
typedef void (* RegionInitProcPtr)(
#if NeedNestedPrototypes
RegionPtr /*pReg*/,
BoxPtr /*rect*/,
int /*size*/
#endif
);
typedef Bool (* RegionCopyProcPtr)(
#if NeedNestedPrototypes
RegionPtr /*dst*/,
RegionPtr /*src*/
#endif
);
typedef void (* RegionDestroyProcPtr)(
#if NeedNestedPrototypes
RegionPtr /*pReg*/
#endif
);
typedef void (* RegionUninitProcPtr)(
#if NeedNestedPrototypes
RegionPtr /*pReg*/
#endif
);
typedef Bool (* IntersectProcPtr)(
#if NeedNestedPrototypes
RegionPtr /*newReg*/,
RegionPtr /*reg1*/,
RegionPtr /*reg2*/
#endif
);
typedef Bool (* UnionProcPtr)(
#if NeedNestedPrototypes
RegionPtr /*newReg*/,
RegionPtr /*reg1*/,
RegionPtr /*reg2*/
#endif
);
typedef Bool (* SubtractProcPtr)(
#if NeedNestedPrototypes
RegionPtr /*regD*/,
RegionPtr /*regM*/,
RegionPtr /*regS*/
#endif
);
typedef Bool (* InverseProcPtr)(
#if NeedNestedPrototypes
RegionPtr /*newReg*/,
RegionPtr /*reg1*/,
BoxPtr /*invRect*/
#endif
);
typedef void (* RegionResetProcPtr)(
#if NeedNestedPrototypes
RegionPtr /*pReg*/,
BoxPtr /*pBox*/
#endif
);
typedef void (* TranslateRegionProcPtr)(
#if NeedNestedPrototypes
RegionPtr /*pReg*/,
int /*x*/,
int /*y*/
#endif
);
typedef int (* RectInProcPtr)(
#if NeedNestedPrototypes
RegionPtr /*region*/,
BoxPtr /*prect*/
#endif
);
typedef Bool (* PointInRegionProcPtr)(
#if NeedNestedPrototypes
RegionPtr /*pReg*/,
int /*x*/,
int /*y*/,
BoxPtr /*box*/
#endif
);
typedef Bool (* RegionNotEmptyProcPtr)(
#if NeedNestedPrototypes
RegionPtr /*pReg*/
#endif
);
typedef void (* RegionEmptyProcPtr)(
#if NeedNestedPrototypes
RegionPtr /*pReg*/
#endif
);
typedef BoxPtr (* RegionExtentsProcPtr)(
#if NeedNestedPrototypes
RegionPtr /*pReg*/
#endif
);
typedef Bool (* RegionAppendProcPtr)(
#if NeedNestedPrototypes
RegionPtr /*dstrgn*/,
RegionPtr /*rgn*/
#endif
);
typedef Bool (* RegionValidateProcPtr)(
#if NeedNestedPrototypes
RegionPtr /*badreg*/,
Bool* /*pOverlap*/
#endif
);
typedef RegionPtr (* BitmapToRegionProcPtr)(
#if NeedNestedPrototypes
PixmapPtr /*pPix*/
#endif
);
typedef RegionPtr (* RectsToRegionProcPtr)(
#if NeedNestedPrototypes
int /*nrects*/,
xRectangle* /*prect*/,
int /*ctype*/
#endif
);
typedef void (* SendGraphicsExposeProcPtr)(
#if NeedNestedPrototypes
ClientPtr /*client*/,
RegionPtr /*pRgn*/,
XID /*drawable*/,
int /*major*/,
int /*minor*/
#endif
);
typedef void (* ScreenBlockHandlerProcPtr)(
#if NeedNestedPrototypes
int /*screenNum*/,
pointer /*blockData*/,
struct timeval ** /*pTimeout*/,
pointer /*pReadmask*/
#endif
);
typedef void (* ScreenWakeupHandlerProcPtr)(
#if NeedNestedPrototypes
int /*screenNum*/,
pointer /*wakeupData*/,
unsigned long /*result*/,
pointer /*pReadMask*/
#endif
);
typedef Bool (* CreateScreenResourcesProcPtr)(
#if NeedNestedPrototypes
ScreenPtr /*pScreen*/
#endif
);
typedef Bool (* ModifyPixmapHeaderProcPtr)(
#if NeedNestedPrototypes
PixmapPtr /*pPixmap*/,
int /*width*/,
int /*height*/,
int /*depth*/,
int /*bitsPerPixel*/,
int /*devKind*/,
pointer /*pPixData*/
#endif
);
typedef void (* MarkWindowProcPtr)(
#if NeedNestedPrototypes
X11WindowPtr /*pWin*/
#endif
);
typedef Bool (* MarkOverlappedWindowsProcPtr)(
#if NeedNestedPrototypes
X11WindowPtr /*parent*/,
X11WindowPtr /*firstChild*/,
X11WindowPtr * /*pLayerWin*/
#endif
);
typedef Bool (* ChangeSaveUnderProcPtr)(
#if NeedNestedPrototypes
X11WindowPtr /*pLayerWin*/,
X11WindowPtr /*firstChild*/
#endif
);
typedef void (* PostChangeSaveUnderProcPtr)(
#if NeedNestedPrototypes
X11WindowPtr /*pLayerWin*/,
X11WindowPtr /*firstChild*/
#endif
);
typedef void (* MoveWindowProcPtr)(
#if NeedNestedPrototypes
X11WindowPtr /*pWin*/,
int /*x*/,
int /*y*/,
X11WindowPtr /*pSib*/,
VTKind /*kind*/
#endif
);
typedef void (* ResizeWindowProcPtr)(
#if NeedNestedPrototypes
X11WindowPtr /*pWin*/,
int /*x*/,
int /*y*/,
unsigned int /*w*/,
unsigned int /*h*/,
X11WindowPtr /*pSib*/
#endif
);
typedef X11WindowPtr (* GetLayerWindowProcPtr)(
#if NeedNestedPrototypes
X11WindowPtr /*pWin*/
#endif
);
typedef void (* HandleExposuresProcPtr)(
#if NeedNestedPrototypes
X11WindowPtr /*pWin*/
#endif
);
typedef void (* ReparentWindowProcPtr)(
#if NeedNestedPrototypes
X11WindowPtr /*pWin*/,
X11WindowPtr /*pPriorParent*/
#endif
);
#ifdef SHAPE
typedef void (* SetShapeProcPtr)(
#if NeedFunctionPrototypes
X11WindowPtr /*pWin*/
#endif
);
#endif /* SHAPE */
typedef void (* ChangeBorderWidthProcPtr)(
#if NeedFunctionPrototypes
X11WindowPtr /*pWin*/,
unsigned int /*width*/
#endif
);
typedef void (* MarkUnrealizedWindowProcPtr)(
#if NeedFunctionPrototypes
X11WindowPtr /*pChild*/,
X11WindowPtr /*pWin*/,
Bool /*fromConfigure*/
#endif
);
typedef struct _Screen {
int myNum; /* index of this instance in Screens[] */
ATOM id;
short width, height;
short mmWidth, mmHeight;
short numDepths;
unsigned char rootDepth;
DepthPtr allowedDepths;
unsigned long rootVisual;
unsigned long defColormap;
short minInstalledCmaps, maxInstalledCmaps;
char backingStoreSupport, saveUnderSupport;
unsigned long whitePixel, blackPixel;
unsigned long rgf; /* array of flags; she's -- HUNGARIAN */
GCPtr GCperDepth[MAXFORMATS+1];
/* next field is a stipple to use as default in
a GC. we don't build default tiles of all depths
because they are likely to be of a color
different from the default fg pixel, so
we don't win anything by building
a standard one.
*/
PixmapPtr PixmapPerDepth[1];
pointer devPrivate;
short numVisuals;
VisualPtr visuals;
int WindowPrivateLen;
unsigned *WindowPrivateSizes;
unsigned totalWindowSize;
int GCPrivateLen;
unsigned *GCPrivateSizes;
unsigned totalGCSize;
/* Random screen procedures */
CloseScreenProcPtr CloseScreen;
QueryBestSizeProcPtr QueryBestSize;
SaveScreenProcPtr SaveScreen;
GetImageProcPtr GetImage;
GetSpansProcPtr GetSpans;
PointerNonInterestBoxProcPtr PointerNonInterestBox;
SourceValidateProcPtr SourceValidate;
/* Window Procedures */
CreateWindowProcPtr CreateWindow;
DestroyWindowProcPtr DestroyWindow;
PositionWindowProcPtr PositionWindow;
ChangeWindowAttributesProcPtr ChangeWindowAttributes;
RealizeWindowProcPtr RealizeWindow;
UnrealizeWindowProcPtr UnrealizeWindow;
ValidateTreeProcPtr ValidateTree;
PostValidateTreeProcPtr PostValidateTree;
WindowExposuresProcPtr WindowExposures;
PaintWindowBackgroundProcPtr PaintWindowBackground;
PaintWindowBorderProcPtr PaintWindowBorder;
CopyWindowProcPtr CopyWindow;
ClearToBackgroundProcPtr ClearToBackground;
ClipNotifyProcPtr ClipNotify;
/* Pixmap procedures */
CreatePixmapProcPtr CreatePixmap;
DestroyPixmapProcPtr DestroyPixmap;
/* Backing store procedures */
SaveDoomedAreasProcPtr SaveDoomedAreas;
RestoreAreasProcPtr RestoreAreas;
ExposeCopyProcPtr ExposeCopy;
TranslateBackingStoreProcPtr TranslateBackingStore;
ClearBackingStoreProcPtr ClearBackingStore;
DrawGuaranteeProcPtr DrawGuarantee;
/* Font procedures */
RealizeFontProcPtr RealizeFont;
UnrealizeFontProcPtr UnrealizeFont;
/* Cursor Procedures */
ConstrainCursorProcPtr ConstrainCursor;
CursorLimitsProcPtr CursorLimits;
DisplayCursorProcPtr DisplayCursor;
RealizeCursorProcPtr RealizeCursor;
UnrealizeCursorProcPtr UnrealizeCursor;
RecolorCursorProcPtr RecolorCursor;
SetCursorPositionProcPtr SetCursorPosition;
/* GC procedures */
CreateGCProcPtr CreateGC;
/* Colormap procedures */
CreateColormapProcPtr CreateColormap;
DestroyColormapProcPtr DestroyColormap;
InstallColormapProcPtr InstallColormap;
UninstallColormapProcPtr UninstallColormap;
ListInstalledColormapsProcPtr ListInstalledColormaps;
StoreColorsProcPtr StoreColors;
ResolveColorProcPtr ResolveColor;
/* Region procedures */
RegionCreateProcPtr RegionCreate;
RegionInitProcPtr RegionInit;
RegionCopyProcPtr RegionCopy;
RegionDestroyProcPtr RegionDestroy;
RegionUninitProcPtr RegionUninit;
IntersectProcPtr Intersect;
UnionProcPtr Union;
SubtractProcPtr Subtract;
InverseProcPtr Inverse;
RegionResetProcPtr RegionReset;
TranslateRegionProcPtr TranslateRegion;
RectInProcPtr RectIn;
PointInRegionProcPtr PointInRegion;
RegionNotEmptyProcPtr RegionNotEmpty;
RegionEmptyProcPtr RegionEmpty;
RegionExtentsProcPtr RegionExtents;
RegionAppendProcPtr RegionAppend;
RegionValidateProcPtr RegionValidate;
BitmapToRegionProcPtr BitmapToRegion;
RectsToRegionProcPtr RectsToRegion;
SendGraphicsExposeProcPtr SendGraphicsExpose;
/* os layer procedures */
ScreenBlockHandlerProcPtr BlockHandler;
ScreenWakeupHandlerProcPtr WakeupHandler;
pointer blockData;
pointer wakeupData;
/* anybody can get a piece of this array */
DevUnion *devPrivates;
CreateScreenResourcesProcPtr CreateScreenResources;
ModifyPixmapHeaderProcPtr ModifyPixmapHeader;
PixmapPtr pScratchPixmap; /* scratch pixmap "pool" */
#ifdef PIXPRIV
int PixmapPrivateLen;
unsigned *PixmapPrivateSizes;
unsigned totalPixmapSize;
#endif
MarkWindowProcPtr MarkWindow;
MarkOverlappedWindowsProcPtr MarkOverlappedWindows;
ChangeSaveUnderProcPtr ChangeSaveUnder;
PostChangeSaveUnderProcPtr PostChangeSaveUnder;
MoveWindowProcPtr MoveWindow;
ResizeWindowProcPtr ResizeWindow;
GetLayerWindowProcPtr GetLayerWindow;
HandleExposuresProcPtr HandleExposures;
ReparentWindowProcPtr ReparentWindow;
#ifdef SHAPE
SetShapeProcPtr SetShape;
#endif /* SHAPE */
ChangeBorderWidthProcPtr ChangeBorderWidth;
MarkUnrealizedWindowProcPtr MarkUnrealizedWindow;
} ScreenRec;
typedef struct _ScreenInfo {
int imageByteOrder;
int bitmapScanlineUnit;
int bitmapScanlinePad;
int bitmapBitOrder;
int numPixmapFormats;
PixmapFormatRec
formats[MAXFORMATS];
int arraySize;
int numScreens;
ScreenPtr screens[MAXSCREENS];
int numVideoScreens;
} ScreenInfo;
extern ScreenInfo screenInfo;
extern void InitOutput(
#if NeedFunctionPrototypes
ScreenInfo * /*pScreenInfo*/,
int /*argc*/,
char ** /*argv*/
#endif
);
#endif /* SCREENINTSTRUCT_H */
/* $XConsortium: validate.h,v 5.4 94/04/17 20:26:11 dpw Exp $ */
/*
Copyright (c) 1989 X Consortium
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
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
X CONSORTIUM 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 X Consortium 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 X Consortium.
*/
#ifndef VALIDATE_H
#define VALIDATE_H
#include "miscstruct.h"
#include "regionstr.h"
typedef enum { VTOther, VTStack, VTMove, VTUnmap, VTMap } VTKind;
/* union _Validate is now device dependent; see mivalidate.h for an example */
typedef union _Validate *ValidatePtr;
#define UnmapValData ((ValidatePtr)1)
#endif /* VALIDATE_H */
/* $XConsortium: window.h /main/8 1996/03/21 13:35:33 mor $ */
/***********************************************************
Copyright (c) 1987 X Consortium
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
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
X CONSORTIUM 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 X Consortium 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 X Consortium.
Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
All Rights Reserved
Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the name of Digital not be
used in advertising or publicity pertaining to distribution of the
software without specific, written prior permission.
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
SOFTWARE.
******************************************************************/
#ifndef WINDOW_H
#define WINDOW_H
#include "misc.h"
#include "region.h"
#include "screenint.h"
#include "X11/Xproto.h"
#define TOTALLY_OBSCURED 0
#define UNOBSCURED 1
#define OBSCURED 2
#define VisibilityNotViewable 3
/* return values for tree-walking callback procedures */
#define WT_STOPWALKING 0
#define WT_WALKCHILDREN 1
#define WT_DONTWALKCHILDREN 2
#define WT_NOMATCH 3
#define NullWindow ((X11WindowPtr) 0)
typedef struct _BackingStore *BackingStorePtr;
typedef struct _Window *X11WindowPtr; /* conflict with CoreGraphics */
typedef int (*VisitWindowProcPtr)(
#if NeedNestedPrototypes
X11WindowPtr /*pWin*/,
pointer /*data*/
#endif
);
extern int TraverseTree(
#if NeedFunctionPrototypes
X11WindowPtr /*pWin*/,
VisitWindowProcPtr /*func*/,
pointer /*data*/
#endif
);
extern int WalkTree(
#if NeedFunctionPrototypes
ScreenPtr /*pScreen*/,
VisitWindowProcPtr /*func*/,
pointer /*data*/
#endif
);
extern X11WindowPtr AllocateWindow(
#if NeedFunctionPrototypes
ScreenPtr /*pScreen*/
#endif
);
extern Bool CreateRootWindow(
#if NeedFunctionPrototypes
ScreenPtr /*pScreen*/
#endif
);
extern void InitRootWindow(
#if NeedFunctionPrototypes
X11WindowPtr /*pWin*/
#endif
);
extern void ClippedRegionFromBox(
#if NeedFunctionPrototypes
X11WindowPtr /*pWin*/,
RegionPtr /*Rgn*/,
int /*x*/,
int /*y*/,
int /*w*/,
int /*h*/
#endif
);
extern X11WindowPtr RealChildHead(
#if NeedFunctionPrototypes
X11WindowPtr /*pWin*/
#endif
);
extern X11WindowPtr CreateWindow(
#if NeedFunctionPrototypes
Window /*wid*/,
X11WindowPtr /*pParent*/,
int /*x*/,
int /*y*/,
unsigned int /*w*/,
unsigned int /*h*/,
unsigned int /*bw*/,
unsigned int /*class*/,
Mask /*vmask*/,
XID* /*vlist*/,
int /*depth*/,
ClientPtr /*client*/,
VisualID /*visual*/,
int* /*error*/
#endif
);
extern int DeleteWindow(
#if NeedFunctionPrototypes
pointer /*pWin*/,
XID /*wid*/
#endif
);
extern void DestroySubwindows(
#if NeedFunctionPrototypes
X11WindowPtr /*pWin*/,
ClientPtr /*client*/
#endif
);
extern int X11ChangeWindowAttributes(
#if NeedFunctionPrototypes
X11WindowPtr /*pWin*/,
Mask /*vmask*/,
XID* /*vlist*/,
ClientPtr /*client*/
#endif
);
extern void X11GetWindowAttributes(
#if NeedFunctionPrototypes
X11WindowPtr /*pWin*/,
ClientPtr /*client*/,
xGetWindowAttributesReply* /* wa */
#endif
);
extern RegionPtr CreateUnclippedWinSize(
#if NeedFunctionPrototypes
X11WindowPtr /*pWin*/
#endif
);
extern void GravityTranslate(
#if NeedFunctionPrototypes
int /*x*/,
int /*y*/,
int /*oldx*/,
int /*oldy*/,
int /*dw*/,
int /*dh*/,
unsigned /*gravity*/,
int* /*destx*/,
int* /*desty*/
#endif
);
extern int ConfigureWindow(
#if NeedFunctionPrototypes
X11WindowPtr /*pWin*/,
Mask /*mask*/,
XID* /*vlist*/,
ClientPtr /*client*/
#endif
);
extern int CirculateWindow(
#if NeedFunctionPrototypes
X11WindowPtr /*pParent*/,
int /*direction*/,
ClientPtr /*client*/
#endif
);
extern int ReparentWindow(
#if NeedFunctionPrototypes
X11WindowPtr /*pWin*/,
X11WindowPtr /*pParent*/,
int /*x*/,
int /*y*/,
ClientPtr /*client*/
#endif
);
extern int MapWindow(
#if NeedFunctionPrototypes
X11WindowPtr /*pWin*/,
ClientPtr /*client*/
#endif
);
extern void MapSubwindows(
#if NeedFunctionPrototypes
X11WindowPtr /*pParent*/,
ClientPtr /*client*/
#endif
);
extern int UnmapWindow(
#if NeedFunctionPrototypes
X11WindowPtr /*pWin*/,
Bool /*fromConfigure*/
#endif
);
extern void UnmapSubwindows(
#if NeedFunctionPrototypes
X11WindowPtr /*pWin*/
#endif
);
extern void HandleSaveSet(
#if NeedFunctionPrototypes
ClientPtr /*client*/
#endif
);
extern Bool VisibleBoundingBoxFromPoint(
#if NeedFunctionPrototypes
X11WindowPtr /*pWin*/,
int /*x*/,
int /*y*/,
BoxPtr /*box*/
#endif
);
extern Bool PointInWindowIsVisible(
#if NeedFunctionPrototypes
X11WindowPtr /*pWin*/,
int /*x*/,
int /*y*/
#endif
);
extern RegionPtr NotClippedByChildren(
#if NeedFunctionPrototypes
X11WindowPtr /*pWin*/
#endif
);
extern void SendVisibilityNotify(
#if NeedFunctionPrototypes
X11WindowPtr /*pWin*/
#endif
);
extern void SaveScreens(
#if NeedFunctionPrototypes
int /*on*/,
int /*mode*/
#endif
);
extern X11WindowPtr FindWindowWithOptional(
#if NeedFunctionPrototypes
X11WindowPtr /*w*/
#endif
);
extern void CheckWindowOptionalNeed(
#if NeedFunctionPrototypes
X11WindowPtr /*w*/
#endif
);
extern Bool MakeWindowOptional(
#if NeedFunctionPrototypes
X11WindowPtr /*pWin*/
#endif
);
extern void DisposeWindowOptional(
#if NeedFunctionPrototypes
X11WindowPtr /*pWin*/
#endif
);
extern X11WindowPtr MoveWindowInStack(
#if NeedFunctionPrototypes
X11WindowPtr /*pWin*/,
X11WindowPtr /*pNextSib*/
#endif
);
void SetWinSize(
#if NeedFunctionPrototypes
X11WindowPtr /*pWin*/
#endif
);
void SetBorderSize(
#if NeedFunctionPrototypes
X11WindowPtr /*pWin*/
#endif
);
void ResizeChildrenWinSize(
#if NeedFunctionPrototypes
X11WindowPtr /*pWin*/,
int /*dx*/,
int /*dy*/,
int /*dw*/,
int /*dh*/
#endif
);
#endif /* WINDOW_H */
...@@ -46,13 +46,13 @@ rfbLog(char *format, ...) ...@@ -46,13 +46,13 @@ rfbLog(char *format, ...)
{ {
va_list args; va_list args;
char buf[256]; char buf[256];
time_t clock; time_t log_clock;
IF_PTHREADS(pthread_mutex_lock(&logMutex)); IF_PTHREADS(pthread_mutex_lock(&logMutex));
va_start(args, format); va_start(args, format);
time(&clock); time(&log_clock);
strftime(buf, 255, "%d/%m/%Y %T ", localtime(&clock)); strftime(buf, 255, "%d/%m/%Y %T ", localtime(&log_clock));
fprintf(stderr, buf); fprintf(stderr, buf);
vfprintf(stderr, format, args); vfprintf(stderr, format, args);
...@@ -68,22 +68,20 @@ void rfbLogPerror(char *str) ...@@ -68,22 +68,20 @@ void rfbLogPerror(char *str)
} }
void rfbMarkRegionAsModified(rfbScreenInfoPtr rfbScreen,RegionPtr modRegion) void rfbMarkRegionAsModified(rfbScreenInfoPtr rfbScreen,sraRegionPtr modRegion)
{ {
rfbClientIteratorPtr iterator; rfbClientIteratorPtr iterator;
rfbClientPtr cl; rfbClientPtr cl;
iterator=rfbGetClientIterator(rfbScreen); iterator=rfbGetClientIterator(rfbScreen);
while((cl=rfbClientIteratorNext(iterator))) { while((cl=rfbClientIteratorNext(iterator)))
REGION_UNION(cl->screen,&cl->modifiedRegion,&cl->modifiedRegion,modRegion); sraRgnOr(cl->modifiedRegion,modRegion);
}
rfbReleaseClientIterator(iterator); rfbReleaseClientIterator(iterator);
} }
void rfbMarkRectAsModified(rfbScreenInfoPtr rfbScreen,int x1,int y1,int x2,int y2) void rfbMarkRectAsModified(rfbScreenInfoPtr rfbScreen,int x1,int y1,int x2,int y2)
{ {
BoxRec box; //=(BoxRec*)malloc(sizeof(BoxRec)); sraRegionPtr region;
RegionRec* region=(RegionRec*)malloc(sizeof(RegionRec));
int i; int i;
if(x1>x2) { i=x1; x1=x2; x2=i; } if(x1>x2) { i=x1; x1=x2; x2=i; }
x2++; x2++;
...@@ -95,9 +93,9 @@ void rfbMarkRectAsModified(rfbScreenInfoPtr rfbScreen,int x1,int y1,int x2,int y ...@@ -95,9 +93,9 @@ void rfbMarkRectAsModified(rfbScreenInfoPtr rfbScreen,int x1,int y1,int x2,int y
if(y1<0) { y1=0; if(y2==y1) y2++; } if(y1<0) { y1=0; if(y2==y1) y2++; }
if(y2>=rfbScreen->height) { y2=rfbScreen->height-1; if(y1==y2) y1--; } if(y2>=rfbScreen->height) { y2=rfbScreen->height-1; if(y1==y2) y1--; }
box.x1=x1; box.y1=y1; box.x2=x2; box.y2=y2; region = sraRgnCreateRect(x1,y1,x2,y2);
REGION_INIT(cl->screen,region,&box,0);
rfbMarkRegionAsModified(rfbScreen,region); rfbMarkRegionAsModified(rfbScreen,region);
sraRgnDestroy(region);
} }
int rfbDeferUpdateTime = 40; /* ms */ int rfbDeferUpdateTime = 40; /* ms */
...@@ -119,12 +117,9 @@ clientOutput(void *data) ...@@ -119,12 +117,9 @@ clientOutput(void *data)
pthread_mutex_unlock(&cl->updateMutex); pthread_mutex_unlock(&cl->updateMutex);
return NULL; return NULL;
} }
updateRegion = sraRgnCreateRgn(cl->modifiedRegion);
REGION_INIT(&hackScreen, &updateRegion, NullBox, 0); haveUpdate = sraRgnAnd(updateRegion,cl->requestedRegion);
REGION_INTERSECT(&hackScreen, &updateRegion, sraRgnDestroy(updateRegion);
&cl->modifiedRegion, &cl->requestedRegion);
haveUpdate = REGION_NOTEMPTY(&hackScreen, &updateRegion);
REGION_UNINIT(&hackScreen, &updateRegion);
if (!haveUpdate) { if (!haveUpdate) {
pthread_cond_wait(&cl->updateCond, &cl->updateMutex); pthread_cond_wait(&cl->updateCond, &cl->updateMutex);
...@@ -141,17 +136,15 @@ clientOutput(void *data) ...@@ -141,17 +136,15 @@ clientOutput(void *data)
That way, if anything that overlaps the region we're sending That way, if anything that overlaps the region we're sending
is updated, we'll be sure to do another update later. */ is updated, we'll be sure to do another update later. */
pthread_mutex_lock(&cl->updateMutex); pthread_mutex_lock(&cl->updateMutex);
REGION_INIT(&hackScreen, &updateRegion, NullBox, 0); updateRegion = sraRgnCreateRgn(cl->modifiedRegion);
REGION_INTERSECT(&hackScreen, &updateRegion, sraRgnAnd(updateRegion,cl->requestedRegion);
&cl->modifiedRegion, &cl->requestedRegion); sraRgnSubtract(cl->modifiedRegion,updateRegion);
REGION_SUBTRACT(&hackScreen, &cl->modifiedRegion,
&cl->modifiedRegion, &updateRegion);
pthread_mutex_unlock(&cl->updateMutex); pthread_mutex_unlock(&cl->updateMutex);
/* Now actually send the update. */ /* Now actually send the update. */
rfbSendFramebufferUpdate(cl, updateRegion); rfbSendFramebufferUpdate(cl, updateRegion);
REGION_UNINIT(&hackScreen, &updateRegion); sraRgnDestroy(updateRegion);
} }
return NULL; return NULL;
...@@ -377,6 +370,7 @@ rfbScreenInfoPtr rfbGetScreen(int argc,char** argv, ...@@ -377,6 +370,7 @@ rfbScreenInfoPtr rfbGetScreen(int argc,char** argv,
format->depth = rfbScreen->depth; format->depth = rfbScreen->depth;
format->bigEndian = rfbEndianTest?FALSE:TRUE; format->bigEndian = rfbEndianTest?FALSE:TRUE;
format->trueColour = TRUE; format->trueColour = TRUE;
rfbScreen->colourMap = NULL;
if(bytesPerPixel == 8) { if(bytesPerPixel == 8) {
format->redMax = 7; format->redMax = 7;
......
/***********************************************************
Copyright (c) 1987, 1988, 1989 X Consortium
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
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
X CONSORTIUM 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 X Consortium 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 X Consortium.
Copyright 1987, 1988, 1989 by
Digital Equipment Corporation, Maynard, Massachusetts.
All Rights Reserved
Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the name of Digital not be
used in advertising or publicity pertaining to distribution of the
software without specific, written prior permission.
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
SOFTWARE.
******************************************************************/
/* $XConsortium: miregion.c,v 1.60 94/04/17 20:27:49 dpw Exp $ */
#include <stdio.h>
#include <stdlib.h>
#include "Xserver/miscstruct.h"
#include "Xserver/regionstr.h"
#include "X11/Xprotostr.h"
#include "Xserver/gc.h"
#if defined (__GNUC__) && !defined (NO_INLINES)
#define INLINE __inline
#else
#define INLINE
#endif
#undef xalloc
#undef xrealloc
#undef xfree
#define xalloc malloc
#define xrealloc realloc
#define xfree free
/*
* hack until callers of these functions can deal with out-of-memory
*/
extern Bool Must_have_memory;
#ifdef DEBUG
#define assert(expr) {if (!(expr)) \
FatalError("Assertion failed file %s, line %d: expr\n", \
__FILE__, __LINE__); }
#else
#define assert(expr)
#endif
#define good(reg) assert(miValidRegion(reg))
/*
* The functions in this file implement the Region abstraction used extensively
* throughout the X11 sample server. A Region is simply a set of disjoint
* (non-overlapping) rectangles, plus an "extent" rectangle which is the
* smallest single rectangle that contains all the non-overlapping rectangles.
*
* A Region is implemented as a "y-x-banded" array of rectangles. This array
* imposes two degrees of order. First, all rectangles are sorted by top side
* y coordinate first (y1), and then by left side x coordinate (x1).
*
* Furthermore, the rectangles are grouped into "bands". Each rectangle in a
* band has the same top y coordinate (y1), and each has the same bottom y
* coordinate (y2). Thus all rectangles in a band differ only in their left
* and right side (x1 and x2). Bands are implicit in the array of rectangles:
* there is no separate list of band start pointers.
*
* The y-x band representation does not minimize rectangles. In particular,
* if a rectangle vertically crosses a band (the rectangle has scanlines in
* the y1 to y2 area spanned by the band), then the rectangle may be broken
* down into two or more smaller rectangles stacked one atop the other.
*
* ----------- -----------
* | | | | band 0
* | | -------- ----------- --------
* | | | | in y-x banded | | | | band 1
* | | | | form is | | | |
* ----------- | | ----------- --------
* | | | | band 2
* -------- --------
*
* An added constraint on the rectangles is that they must cover as much
* horizontal area as possible: no two rectangles within a band are allowed
* to touch.
*
* Whenever possible, bands will be merged together to cover a greater vertical
* distance (and thus reduce the number of rectangles). Two bands can be merged
* only if the bottom of one touches the top of the other and they have
* rectangles in the same places (of the same width, of course).
*
* Adam de Boor wrote most of the original region code. Joel McCormack
* substantially modified or rewrote most of the core arithmetic routines,
* and added miRegionValidate in order to support several speed improvements
* to miValidateTree. Bob Scheifler changed the representation to be more
* compact when empty or a single rectangle, and did a bunch of gratuitous
* reformatting.
*/
/* true iff two Boxes overlap */
#define EXTENTCHECK(r1,r2) \
(!( ((r1)->x2 <= (r2)->x1) || \
((r1)->x1 >= (r2)->x2) || \
((r1)->y2 <= (r2)->y1) || \
((r1)->y1 >= (r2)->y2) ) )
/* true iff (x,y) is in Box */
#define INBOX(r,x,y) \
( ((r)->x2 > x) && \
((r)->x1 <= x) && \
((r)->y2 > y) && \
((r)->y1 <= y) )
/* true iff Box r1 contains Box r2 */
#define SUBSUMES(r1,r2) \
( ((r1)->x1 <= (r2)->x1) && \
((r1)->x2 >= (r2)->x2) && \
((r1)->y1 <= (r2)->y1) && \
((r1)->y2 >= (r2)->y2) )
#define xallocData(n) (RegDataPtr)xalloc(REGION_SZOF(n))
#define xfreeData(reg) if ((reg)->data && (reg)->data->size) xfree((reg)->data)
#define RECTALLOC(pReg,n) \
if (!(pReg)->data || (((pReg)->data->numRects + (n)) > (pReg)->data->size)) \
miRectAlloc(pReg, n)
#define ADDRECT(pNextRect,nx1,ny1,nx2,ny2) \
{ \
pNextRect->x1 = nx1; \
pNextRect->y1 = ny1; \
pNextRect->x2 = nx2; \
pNextRect->y2 = ny2; \
pNextRect++; \
}
#define NEWRECT(pReg,pNextRect,nx1,ny1,nx2,ny2) \
{ \
if (!(pReg)->data || ((pReg)->data->numRects == (pReg)->data->size))\
{ \
miRectAlloc(pReg, 1); \
pNextRect = REGION_TOP(pReg); \
} \
ADDRECT(pNextRect,nx1,ny1,nx2,ny2); \
pReg->data->numRects++; \
assert(pReg->data->numRects<=pReg->data->size); \
}
#define DOWNSIZE(reg,numRects) \
if (((numRects) < ((reg)->data->size >> 1)) && ((reg)->data->size > 50)) \
{ \
RegDataPtr NewData; \
NewData = (RegDataPtr)xrealloc((reg)->data, REGION_SZOF(numRects)); \
if (NewData) \
{ \
NewData->size = (numRects); \
(reg)->data = NewData; \
} \
}
BoxRec miEmptyBox = {0, 0, 0, 0};
RegDataRec miEmptyData = {0, 0};
#ifdef DEBUG
int
miPrintRegion(rgn)
RegionPtr rgn;
{
int num, size;
register int i;
BoxPtr rects;
num = REGION_NUM_RECTS(rgn);
size = REGION_SIZE(rgn);
rects = REGION_RECTS(rgn);
ErrorF("num: %d size: %d\n", num, size);
ErrorF("extents: %d %d %d %d\n",
rgn->extents.x1, rgn->extents.y1, rgn->extents.x2, rgn->extents.y2);
for (i = 0; i < num; i++)
ErrorF("%d %d %d %d \n",
rects[i].x1, rects[i].y1, rects[i].x2, rects[i].y2);
ErrorF("\n");
return(num);
}
Bool
miRegionsEqual(reg1, reg2)
RegionPtr reg1;
RegionPtr reg2;
{
int i;
BoxPtr rects1, rects2;
if (reg1->extents.x1 != reg2->extents.x1) return FALSE;
if (reg1->extents.x2 != reg2->extents.x2) return FALSE;
if (reg1->extents.y1 != reg2->extents.y1) return FALSE;
if (reg1->extents.y2 != reg2->extents.y2) return FALSE;
if (REGION_NUM_RECTS(reg1) != REGION_NUM_RECTS(reg2)) return FALSE;
rects1 = REGION_RECTS(reg1);
rects2 = REGION_RECTS(reg2);
for (i = 0; i != REGION_NUM_RECTS(reg1); i++) {
if (rects1[i].x1 != rects2[i].x1) return FALSE;
if (rects1[i].x2 != rects2[i].x2) return FALSE;
if (rects1[i].y1 != rects2[i].y1) return FALSE;
if (rects1[i].y2 != rects2[i].y2) return FALSE;
}
return TRUE;
}
Bool
miValidRegion(reg)
RegionPtr reg;
{
register int i, numRects;
if ((reg->extents.x1 > reg->extents.x2) ||
(reg->extents.y1 > reg->extents.y2))
return FALSE;
numRects = REGION_NUM_RECTS(reg);
if (!numRects)
return ((reg->extents.x1 == reg->extents.x2) &&
(reg->extents.y1 == reg->extents.y2) &&
(reg->data->size || (reg->data == &miEmptyData)));
else if (numRects == 1)
return (!reg->data);
else
{
register BoxPtr pboxP, pboxN;
BoxRec box;
pboxP = REGION_RECTS(reg);
box = *pboxP;
box.y2 = pboxP[numRects-1].y2;
pboxN = pboxP + 1;
for (i = numRects; --i > 0; pboxP++, pboxN++)
{
if ((pboxN->x1 >= pboxN->x2) ||
(pboxN->y1 >= pboxN->y2))
return FALSE;
if (pboxN->x1 < box.x1)
box.x1 = pboxN->x1;
if (pboxN->x2 > box.x2)
box.x2 = pboxN->x2;
if ((pboxN->y1 < pboxP->y1) ||
((pboxN->y1 == pboxP->y1) &&
((pboxN->x1 < pboxP->x2) || (pboxN->y2 != pboxP->y2))))
return FALSE;
}
return ((box.x1 == reg->extents.x1) &&
(box.x2 == reg->extents.x2) &&
(box.y1 == reg->extents.y1) &&
(box.y2 == reg->extents.y2));
}
}
#endif /* DEBUG */
/*****************************************************************
* RegionCreate(rect, size)
* This routine does a simple malloc to make a structure of
* REGION of "size" number of rectangles.
*****************************************************************/
RegionPtr
miRegionCreate(rect, size)
BoxPtr rect;
int size;
{
register RegionPtr pReg;
Must_have_memory = TRUE; /* XXX */
pReg = (RegionPtr)xalloc(sizeof(RegionRec));
Must_have_memory = FALSE; /* XXX */
if (rect)
{
pReg->extents = *rect;
pReg->data = (RegDataPtr)NULL;
}
else
{
pReg->extents = miEmptyBox;
if ((size > 1) && (pReg->data = xallocData(size)))
{
pReg->data->size = size;
pReg->data->numRects = 0;
}
else
pReg->data = &miEmptyData;
}
return(pReg);
}
/*****************************************************************
* RegionInit(pReg, rect, size)
* Outer region rect is statically allocated.
*****************************************************************/
void
miRegionInit(pReg, rect, size)
RegionPtr pReg;
BoxPtr rect;
int size;
{
if (rect)
{
pReg->extents = *rect;
pReg->data = (RegDataPtr)NULL;
}
else
{
pReg->extents = miEmptyBox;
if ((size > 1) && (pReg->data = xallocData(size)))
{
pReg->data->size = size;
pReg->data->numRects = 0;
}
else
pReg->data = &miEmptyData;
}
}
void
miRegionDestroy(pReg)
RegionPtr pReg;
{
good(pReg);
xfreeData(pReg);
xfree(pReg);
}
void
miRegionUninit(pReg)
RegionPtr pReg;
{
good(pReg);
xfreeData(pReg);
}
Bool
miRectAlloc(pRgn, n)
register RegionPtr pRgn;
int n;
{
Must_have_memory = TRUE; /* XXX */
if (!pRgn->data)
{
n++;
pRgn->data = xallocData(n);
pRgn->data->numRects = 1;
*REGION_BOXPTR(pRgn) = pRgn->extents;
}
else if (!pRgn->data->size)
{
pRgn->data = xallocData(n);
pRgn->data->numRects = 0;
}
else
{
if (n == 1)
{
n = pRgn->data->numRects;
if (n > 500) /* XXX pick numbers out of a hat */
n = 250;
}
n += pRgn->data->numRects;
pRgn->data = (RegDataPtr)xrealloc(pRgn->data, REGION_SZOF(n));
}
Must_have_memory = FALSE; /* XXX */
pRgn->data->size = n;
return TRUE;
}
Bool
miRegionCopy(dst, src)
register RegionPtr dst;
register RegionPtr src;
{
good(dst);
good(src);
if (dst == src)
return TRUE;
dst->extents = src->extents;
if (!src->data || !src->data->size)
{
xfreeData(dst);
dst->data = src->data;
return TRUE;
}
if (!dst->data || (dst->data->size < src->data->numRects))
{
xfreeData(dst);
Must_have_memory = TRUE; /* XXX */
dst->data = xallocData(src->data->numRects);
Must_have_memory = FALSE; /* XXX */
dst->data->size = src->data->numRects;
}
dst->data->numRects = src->data->numRects;
memmove((char *)REGION_BOXPTR(dst),(char *)REGION_BOXPTR(src),
dst->data->numRects * sizeof(BoxRec));
return TRUE;
}
/*======================================================================
* Generic Region Operator
*====================================================================*/
/*-
*-----------------------------------------------------------------------
* miCoalesce --
* Attempt to merge the boxes in the current band with those in the
* previous one. We are guaranteed that the current band extends to
* the end of the rects array. Used only by miRegionOp.
*
* Results:
* The new index for the previous band.
*
* Side Effects:
* If coalescing takes place:
* - rectangles in the previous band will have their y2 fields
* altered.
* - pReg->data->numRects will be decreased.
*
*-----------------------------------------------------------------------
*/
INLINE static int
miCoalesce (pReg, prevStart, curStart)
register RegionPtr pReg; /* Region to coalesce */
int prevStart; /* Index of start of previous band */
int curStart; /* Index of start of current band */
{
register BoxPtr pPrevBox; /* Current box in previous band */
register BoxPtr pCurBox; /* Current box in current band */
register int numRects; /* Number rectangles in both bands */
register int y2; /* Bottom of current band */
/*
* Figure out how many rectangles are in the band.
*/
numRects = curStart - prevStart;
assert(numRects == pReg->data->numRects - curStart);
if (!numRects) return curStart;
/*
* The bands may only be coalesced if the bottom of the previous
* matches the top scanline of the current.
*/
pPrevBox = REGION_BOX(pReg, prevStart);
pCurBox = REGION_BOX(pReg, curStart);
if (pPrevBox->y2 != pCurBox->y1) return curStart;
/*
* Make sure the bands have boxes in the same places. This
* assumes that boxes have been added in such a way that they
* cover the most area possible. I.e. two boxes in a band must
* have some horizontal space between them.
*/
y2 = pCurBox->y2;
do {
if ((pPrevBox->x1 != pCurBox->x1) || (pPrevBox->x2 != pCurBox->x2)) {
return (curStart);
}
pPrevBox++;
pCurBox++;
numRects--;
} while (numRects);
/*
* The bands may be merged, so set the bottom y of each box
* in the previous band to the bottom y of the current band.
*/
numRects = curStart - prevStart;
pReg->data->numRects -= numRects;
do {
pPrevBox--;
pPrevBox->y2 = y2;
numRects--;
} while (numRects);
return prevStart;
}
/* Quicky macro to avoid trivial reject procedure calls to miCoalesce */
#define Coalesce(newReg, prevBand, curBand) \
if (curBand - prevBand == newReg->data->numRects - curBand) { \
prevBand = miCoalesce(newReg, prevBand, curBand); \
} else { \
prevBand = curBand; \
}
/*-
*-----------------------------------------------------------------------
* miAppendNonO --
* Handle a non-overlapping band for the union and subtract operations.
* Just adds the (top/bottom-clipped) rectangles into the region.
* Doesn't have to check for subsumption or anything.
*
* Results:
* None.
*
* Side Effects:
* pReg->data->numRects is incremented and the rectangles overwritten
* with the rectangles we're passed.
*
*-----------------------------------------------------------------------
*/
INLINE static Bool
miAppendNonO (pReg, r, rEnd, y1, y2)
register RegionPtr pReg;
register BoxPtr r;
BoxPtr rEnd;
register int y1;
register int y2;
{
register BoxPtr pNextRect;
register int newRects;
newRects = rEnd - r;
assert(y1 < y2);
assert(newRects != 0);
/* Make sure we have enough space for all rectangles to be added */
RECTALLOC(pReg, newRects);
pNextRect = REGION_TOP(pReg);
pReg->data->numRects += newRects;
do {
assert(r->x1 < r->x2);
ADDRECT(pNextRect, r->x1, y1, r->x2, y2);
r++;
} while (r != rEnd);
return TRUE;
}
#define FindBand(r, rBandEnd, rEnd, ry1) \
{ \
ry1 = r->y1; \
rBandEnd = r+1; \
while ((rBandEnd != rEnd) && (rBandEnd->y1 == ry1)) { \
rBandEnd++; \
} \
}
#define AppendRegions(newReg, r, rEnd) \
{ \
int newRects; \
if ((newRects = rEnd - r)) { \
RECTALLOC(newReg, newRects); \
memmove((char *)REGION_TOP(newReg),(char *)r, \
newRects * sizeof(BoxRec)); \
newReg->data->numRects += newRects; \
} \
}
/*-
*-----------------------------------------------------------------------
* miRegionOp --
* Apply an operation to two regions. Called by miUnion, miInverse,
* miSubtract, miIntersect.... Both regions MUST have at least one
* rectangle, and cannot be the same object.
*
* Results:
* TRUE if successful.
*
* Side Effects:
* The new region is overwritten.
* pOverlap set to TRUE if overlapFunc ever returns TRUE.
*
* Notes:
* The idea behind this function is to view the two regions as sets.
* Together they cover a rectangle of area that this function divides
* into horizontal bands where points are covered only by one region
* or by both. For the first case, the nonOverlapFunc is called with
* each the band and the band's upper and lower extents. For the
* second, the overlapFunc is called to process the entire band. It
* is responsible for clipping the rectangles in the band, though
* this function provides the boundaries.
* At the end of each band, the new region is coalesced, if possible,
* to reduce the number of rectangles in the region.
*
*-----------------------------------------------------------------------
*/
static Bool
miRegionOp(newReg, reg1, reg2, overlapFunc, appendNon1, appendNon2, pOverlap)
RegionPtr newReg; /* Place to store result */
RegionPtr reg1; /* First region in operation */
RegionPtr reg2; /* 2d region in operation */
Bool (*overlapFunc)(); /* Function to call for over-
* lapping bands */
Bool appendNon1; /* Append non-overlapping bands */
/* in region 1 ? */
Bool appendNon2; /* Append non-overlapping bands */
/* in region 2 ? */
Bool *pOverlap;
{
register BoxPtr r1; /* Pointer into first region */
register BoxPtr r2; /* Pointer into 2d region */
BoxPtr r1End; /* End of 1st region */
BoxPtr r2End; /* End of 2d region */
short ybot; /* Bottom of intersection */
short ytop; /* Top of intersection */
RegDataPtr oldData; /* Old data for newReg */
int prevBand; /* Index of start of
* previous band in newReg */
int curBand; /* Index of start of current
* band in newReg */
register BoxPtr r1BandEnd; /* End of current band in r1 */
register BoxPtr r2BandEnd; /* End of current band in r2 */
short top; /* Top of non-overlapping band */
short bot; /* Bottom of non-overlapping band*/
register int r1y1; /* Temps for r1->y1 and r2->y1 */
register int r2y1;
int newSize;
int numRects;
/*
* Initialization:
* set r1, r2, r1End and r2End appropriately, save the rectangles
* of the destination region until the end in case it's one of
* the two source regions, then mark the "new" region empty, allocating
* another array of rectangles for it to use.
*/
r1 = REGION_RECTS(reg1);
newSize = REGION_NUM_RECTS(reg1);
r1End = r1 + newSize;
numRects = REGION_NUM_RECTS(reg2);
r2 = REGION_RECTS(reg2);
r2End = r2 + numRects;
assert(r1 != r1End);
assert(r2 != r2End);
oldData = (RegDataPtr)NULL;
if (((newReg == reg1) && (newSize > 1)) ||
((newReg == reg2) && (numRects > 1)))
{
oldData = newReg->data;
newReg->data = &miEmptyData;
}
/* guess at new size */
if (numRects > newSize)
newSize = numRects;
newSize <<= 1;
if (!newReg->data)
newReg->data = &miEmptyData;
else if (newReg->data->size)
newReg->data->numRects = 0;
if (newSize > newReg->data->size)
miRectAlloc(newReg, newSize);
/*
* Initialize ybot.
* In the upcoming loop, ybot and ytop serve different functions depending
* on whether the band being handled is an overlapping or non-overlapping
* band.
* In the case of a non-overlapping band (only one of the regions
* has points in the band), ybot is the bottom of the most recent
* intersection and thus clips the top of the rectangles in that band.
* ytop is the top of the next intersection between the two regions and
* serves to clip the bottom of the rectangles in the current band.
* For an overlapping band (where the two regions intersect), ytop clips
* the top of the rectangles of both regions and ybot clips the bottoms.
*/
ybot = min(r1->y1, r2->y1);
/*
* prevBand serves to mark the start of the previous band so rectangles
* can be coalesced into larger rectangles. qv. miCoalesce, above.
* In the beginning, there is no previous band, so prevBand == curBand
* (curBand is set later on, of course, but the first band will always
* start at index 0). prevBand and curBand must be indices because of
* the possible expansion, and resultant moving, of the new region's
* array of rectangles.
*/
prevBand = 0;
do {
/*
* This algorithm proceeds one source-band (as opposed to a
* destination band, which is determined by where the two regions
* intersect) at a time. r1BandEnd and r2BandEnd serve to mark the
* rectangle after the last one in the current band for their
* respective regions.
*/
assert(r1 != r1End);
assert(r2 != r2End);
FindBand(r1, r1BandEnd, r1End, r1y1);
FindBand(r2, r2BandEnd, r2End, r2y1);
/*
* First handle the band that doesn't intersect, if any.
*
* Note that attention is restricted to one band in the
* non-intersecting region at once, so if a region has n
* bands between the current position and the next place it overlaps
* the other, this entire loop will be passed through n times.
*/
if (r1y1 < r2y1) {
if (appendNon1) {
top = max(r1y1, ybot);
bot = min(r1->y2, r2y1);
if (top != bot) {
curBand = newReg->data->numRects;
miAppendNonO(newReg, r1, r1BandEnd, top, bot);
Coalesce(newReg, prevBand, curBand);
}
}
ytop = r2y1;
} else if (r2y1 < r1y1) {
if (appendNon2) {
top = max(r2y1, ybot);
bot = min(r2->y2, r1y1);
if (top != bot) {
curBand = newReg->data->numRects;
miAppendNonO(newReg, r2, r2BandEnd, top, bot);
Coalesce(newReg, prevBand, curBand);
}
}
ytop = r1y1;
} else {
ytop = r1y1;
}
/*
* Now see if we've hit an intersecting band. The two bands only
* intersect if ybot > ytop
*/
ybot = min(r1->y2, r2->y2);
if (ybot > ytop) {
curBand = newReg->data->numRects;
(* overlapFunc)(newReg, r1, r1BandEnd, r2, r2BandEnd, ytop, ybot,
pOverlap);
Coalesce(newReg, prevBand, curBand);
}
/*
* If we've finished with a band (y2 == ybot) we skip forward
* in the region to the next band.
*/
if (r1->y2 == ybot) r1 = r1BandEnd;
if (r2->y2 == ybot) r2 = r2BandEnd;
} while (r1 != r1End && r2 != r2End);
/*
* Deal with whichever region (if any) still has rectangles left.
*
* We only need to worry about banding and coalescing for the very first
* band left. After that, we can just group all remaining boxes,
* regardless of how many bands, into one final append to the list.
*/
if ((r1 != r1End) && appendNon1) {
/* Do first nonOverlap1Func call, which may be able to coalesce */
FindBand(r1, r1BandEnd, r1End, r1y1);
curBand = newReg->data->numRects;
miAppendNonO(newReg, r1, r1BandEnd, max(r1y1, ybot), r1->y2);
Coalesce(newReg, prevBand, curBand);
/* Just append the rest of the boxes */
AppendRegions(newReg, r1BandEnd, r1End);
} else if ((r2 != r2End) && appendNon2) {
/* Do first nonOverlap2Func call, which may be able to coalesce */
FindBand(r2, r2BandEnd, r2End, r2y1);
curBand = newReg->data->numRects;
miAppendNonO(newReg, r2, r2BandEnd, max(r2y1, ybot), r2->y2);
Coalesce(newReg, prevBand, curBand);
/* Append rest of boxes */
AppendRegions(newReg, r2BandEnd, r2End);
}
if (oldData)
xfree(oldData);
if (!(numRects = newReg->data->numRects))
{
xfreeData(newReg);
newReg->data = &miEmptyData;
}
else if (numRects == 1)
{
newReg->extents = *REGION_BOXPTR(newReg);
xfreeData(newReg);
newReg->data = (RegDataPtr)NULL;
}
else
{
DOWNSIZE(newReg, numRects);
}
return TRUE;
}
/*-
*-----------------------------------------------------------------------
* miSetExtents --
* Reset the extents of a region to what they should be. Called by
* miSubtract and miIntersect as they can't figure it out along the
* way or do so easily, as miUnion can.
*
* Results:
* None.
*
* Side Effects:
* The region's 'extents' structure is overwritten.
*
*-----------------------------------------------------------------------
*/
void
miSetExtents (pReg)
register RegionPtr pReg;
{
register BoxPtr pBox, pBoxEnd;
if (!pReg->data)
return;
if (!pReg->data->size)
{
pReg->extents.x2 = pReg->extents.x1;
pReg->extents.y2 = pReg->extents.y1;
return;
}
pBox = REGION_BOXPTR(pReg);
pBoxEnd = REGION_END(pReg);
/*
* Since pBox is the first rectangle in the region, it must have the
* smallest y1 and since pBoxEnd is the last rectangle in the region,
* it must have the largest y2, because of banding. Initialize x1 and
* x2 from pBox and pBoxEnd, resp., as good things to initialize them
* to...
*/
pReg->extents.x1 = pBox->x1;
pReg->extents.y1 = pBox->y1;
pReg->extents.x2 = pBoxEnd->x2;
pReg->extents.y2 = pBoxEnd->y2;
assert(pReg->extents.y1 < pReg->extents.y2);
while (pBox <= pBoxEnd) {
if (pBox->x1 < pReg->extents.x1)
pReg->extents.x1 = pBox->x1;
if (pBox->x2 > pReg->extents.x2)
pReg->extents.x2 = pBox->x2;
pBox++;
};
assert(pReg->extents.x1 < pReg->extents.x2);
}
/*======================================================================
* Region Intersection
*====================================================================*/
/*-
*-----------------------------------------------------------------------
* miIntersectO --
* Handle an overlapping band for miIntersect.
*
* Results:
* TRUE if successful.
*
* Side Effects:
* Rectangles may be added to the region.
*
*-----------------------------------------------------------------------
*/
/*ARGSUSED*/
static Bool
miIntersectO (pReg, r1, r1End, r2, r2End, y1, y2, pOverlap)
register RegionPtr pReg;
register BoxPtr r1;
BoxPtr r1End;
register BoxPtr r2;
BoxPtr r2End;
short y1;
short y2;
Bool *pOverlap;
{
register int x1;
register int x2;
register BoxPtr pNextRect;
pNextRect = REGION_TOP(pReg);
assert(y1 < y2);
assert(r1 != r1End && r2 != r2End);
do {
x1 = max(r1->x1, r2->x1);
x2 = min(r1->x2, r2->x2);
/*
* If there's any overlap between the two rectangles, add that
* overlap to the new region.
*/
if (x1 < x2)
NEWRECT(pReg, pNextRect, x1, y1, x2, y2);
/*
* Advance the pointer(s) with the leftmost right side, since the next
* rectangle on that list may still overlap the other region's
* current rectangle.
*/
if (r1->x2 == x2) {
r1++;
}
if (r2->x2 == x2) {
r2++;
}
} while ((r1 != r1End) && (r2 != r2End));
return TRUE;
}
Bool
miIntersect(newReg, reg1, reg2)
register RegionPtr newReg; /* destination Region */
register RegionPtr reg1;
register RegionPtr reg2; /* source regions */
{
good(reg1);
good(reg2);
good(newReg);
/* check for trivial reject */
if (REGION_NIL(reg1) || REGION_NIL(reg2) ||
!EXTENTCHECK(&reg1->extents, &reg2->extents))
{
/* Covers about 20% of all cases */
xfreeData(newReg);
newReg->extents.x2 = newReg->extents.x1;
newReg->extents.y2 = newReg->extents.y1;
newReg->data = &miEmptyData;
}
else if (!reg1->data && !reg2->data)
{
/* Covers about 80% of cases that aren't trivially rejected */
newReg->extents.x1 = max(reg1->extents.x1, reg2->extents.x1);
newReg->extents.y1 = max(reg1->extents.y1, reg2->extents.y1);
newReg->extents.x2 = min(reg1->extents.x2, reg2->extents.x2);
newReg->extents.y2 = min(reg1->extents.y2, reg2->extents.y2);
xfreeData(newReg);
newReg->data = (RegDataPtr)NULL;
}
else if (!reg2->data && SUBSUMES(&reg2->extents, &reg1->extents))
{
return miRegionCopy(newReg, reg1);
}
else if (!reg1->data && SUBSUMES(&reg1->extents, &reg2->extents))
{
return miRegionCopy(newReg, reg2);
}
else if (reg1 == reg2)
{
return miRegionCopy(newReg, reg1);
}
else
{
/* General purpose intersection */
Bool overlap; /* result ignored */
if (!miRegionOp(newReg, reg1, reg2, miIntersectO, FALSE, FALSE,
&overlap))
return FALSE;
miSetExtents(newReg);
}
good(newReg);
return(TRUE);
}
#define MERGERECT(r) \
{ \
if (r->x1 <= x2) { \
/* Merge with current rectangle */ \
if (r->x1 < x2) *pOverlap = TRUE; \
if (x2 < r->x2) x2 = r->x2; \
} else { \
/* Add current rectangle, start new one */ \
NEWRECT(pReg, pNextRect, x1, y1, x2, y2); \
x1 = r->x1; \
x2 = r->x2; \
} \
r++; \
}
/*======================================================================
* Region Union
*====================================================================*/
/*-
*-----------------------------------------------------------------------
* miUnionO --
* Handle an overlapping band for the union operation. Picks the
* left-most rectangle each time and merges it into the region.
*
* Results:
* TRUE if successful.
*
* Side Effects:
* pReg is overwritten.
* pOverlap is set to TRUE if any boxes overlap.
*
*-----------------------------------------------------------------------
*/
static Bool
miUnionO (pReg, r1, r1End, r2, r2End, y1, y2, pOverlap)
register RegionPtr pReg;
register BoxPtr r1;
BoxPtr r1End;
register BoxPtr r2;
BoxPtr r2End;
short y1;
short y2;
Bool *pOverlap;
{
register BoxPtr pNextRect;
register int x1; /* left and right side of current union */
register int x2;
assert (y1 < y2);
assert(r1 != r1End && r2 != r2End);
pNextRect = REGION_TOP(pReg);
/* Start off current rectangle */
if (r1->x1 < r2->x1)
{
x1 = r1->x1;
x2 = r1->x2;
r1++;
}
else
{
x1 = r2->x1;
x2 = r2->x2;
r2++;
}
while (r1 != r1End && r2 != r2End)
{
if (r1->x1 < r2->x1) MERGERECT(r1) else MERGERECT(r2);
}
/* Finish off whoever (if any) is left */
if (r1 != r1End)
{
do
{
MERGERECT(r1);
} while (r1 != r1End);
}
else if (r2 != r2End)
{
do
{
MERGERECT(r2);
} while (r2 != r2End);
}
/* Add current rectangle */
NEWRECT(pReg, pNextRect, x1, y1, x2, y2);
return TRUE;
}
Bool
miUnion(newReg, reg1, reg2)
RegionPtr newReg; /* destination Region */
register RegionPtr reg1;
register RegionPtr reg2; /* source regions */
{
Bool overlap; /* result ignored */
/* Return TRUE if some overlap between reg1, reg2 */
good(reg1);
good(reg2);
good(newReg);
/* checks all the simple cases */
/*
* Region 1 and 2 are the same
*/
if (reg1 == reg2)
{
return miRegionCopy(newReg, reg1);
}
/*
* Region 1 is empty
*/
if (REGION_NIL(reg1))
{
if (newReg != reg2)
return miRegionCopy(newReg, reg2);
return TRUE;
}
/*
* Region 2 is empty
*/
if (REGION_NIL(reg2))
{
if (newReg != reg1)
return miRegionCopy(newReg, reg1);
return TRUE;
}
/*
* Region 1 completely subsumes region 2
*/
if (!reg1->data && SUBSUMES(&reg1->extents, &reg2->extents))
{
if (newReg != reg1)
return miRegionCopy(newReg, reg1);
return TRUE;
}
/*
* Region 2 completely subsumes region 1
*/
if (!reg2->data && SUBSUMES(&reg2->extents, &reg1->extents))
{
if (newReg != reg2)
return miRegionCopy(newReg, reg2);
return TRUE;
}
if (!miRegionOp(newReg, reg1, reg2, miUnionO, TRUE, TRUE, &overlap))
return FALSE;
newReg->extents.x1 = min(reg1->extents.x1, reg2->extents.x1);
newReg->extents.y1 = min(reg1->extents.y1, reg2->extents.y1);
newReg->extents.x2 = max(reg1->extents.x2, reg2->extents.x2);
newReg->extents.y2 = max(reg1->extents.y2, reg2->extents.y2);
good(newReg);
return TRUE;
}
/*======================================================================
* Batch Rectangle Union
*====================================================================*/
/*-
*-----------------------------------------------------------------------
* miRegionAppend --
*
* "Append" the rgn rectangles onto the end of dstrgn, maintaining
* knowledge of YX-banding when it's easy. Otherwise, dstrgn just
* becomes a non-y-x-banded random collection of rectangles, and not
* yet a true region. After a sequence of appends, the caller must
* call miRegionValidate to ensure that a valid region is constructed.
*
* Results:
* TRUE if successful.
*
* Side Effects:
* dstrgn is modified if rgn has rectangles.
*
*/
Bool
miRegionAppend(dstrgn, rgn)
register RegionPtr dstrgn;
register RegionPtr rgn;
{
int numRects, dnumRects, size;
BoxPtr new, old;
Bool prepend;
if (!rgn->data && (dstrgn->data == &miEmptyData))
{
dstrgn->extents = rgn->extents;
dstrgn->data = (RegDataPtr)NULL;
return TRUE;
}
numRects = REGION_NUM_RECTS(rgn);
if (!numRects)
return TRUE;
prepend = FALSE;
size = numRects;
dnumRects = REGION_NUM_RECTS(dstrgn);
if (!dnumRects && (size < 200))
size = 200; /* XXX pick numbers out of a hat */
RECTALLOC(dstrgn, size);
old = REGION_RECTS(rgn);
if (!dnumRects)
dstrgn->extents = rgn->extents;
else if (dstrgn->extents.x2 > dstrgn->extents.x1)
{
register BoxPtr first, last;
first = old;
last = REGION_BOXPTR(dstrgn) + (dnumRects - 1);
if ((first->y1 > last->y2) ||
((first->y1 == last->y1) && (first->y2 == last->y2) &&
(first->x1 > last->x2)))
{
if (rgn->extents.x1 < dstrgn->extents.x1)
dstrgn->extents.x1 = rgn->extents.x1;
if (rgn->extents.x2 > dstrgn->extents.x2)
dstrgn->extents.x2 = rgn->extents.x2;
dstrgn->extents.y2 = rgn->extents.y2;
}
else
{
first = REGION_BOXPTR(dstrgn);
last = old + (numRects - 1);
if ((first->y1 > last->y2) ||
((first->y1 == last->y1) && (first->y2 == last->y2) &&
(first->x1 > last->x2)))
{
prepend = TRUE;
if (rgn->extents.x1 < dstrgn->extents.x1)
dstrgn->extents.x1 = rgn->extents.x1;
if (rgn->extents.x2 > dstrgn->extents.x2)
dstrgn->extents.x2 = rgn->extents.x2;
dstrgn->extents.y1 = rgn->extents.y1;
}
else
dstrgn->extents.x2 = dstrgn->extents.x1;
}
}
if (prepend)
{
new = REGION_BOX(dstrgn, numRects);
if (dnumRects == 1)
*new = *REGION_BOXPTR(dstrgn);
else
memmove((char *)new,(char *)REGION_BOXPTR(dstrgn),
dnumRects * sizeof(BoxRec));
new = REGION_BOXPTR(dstrgn);
}
else
new = REGION_BOXPTR(dstrgn) + dnumRects;
if (numRects == 1)
*new = *old;
else
memmove((char *)new, (char *)old, numRects * sizeof(BoxRec));
dstrgn->data->numRects += numRects;
return TRUE;
}
#define ExchangeRects(a, b) \
{ \
BoxRec t; \
t = rects[a]; \
rects[a] = rects[b]; \
rects[b] = t; \
}
static void
QuickSortRects(rects, numRects)
register BoxRec rects[];
register int numRects;
{
register int y1;
register int x1;
register int i, j;
register BoxPtr r;
/* Always called with numRects > 1 */
do
{
if (numRects == 2)
{
if (rects[0].y1 > rects[1].y1 ||
(rects[0].y1 == rects[1].y1 && rects[0].x1 > rects[1].x1))
ExchangeRects(0, 1);
return;
}
/* Choose partition element, stick in location 0 */
ExchangeRects(0, numRects >> 1);
y1 = rects[0].y1;
x1 = rects[0].x1;
/* Partition array */
i = 0;
j = numRects;
do
{
r = &(rects[i]);
do
{
r++;
i++;
} while (i != numRects &&
(r->y1 < y1 || (r->y1 == y1 && r->x1 < x1)));
r = &(rects[j]);
do
{
r--;
j--;
} while (y1 < r->y1 || (y1 == r->y1 && x1 < r->x1));
if (i < j)
ExchangeRects(i, j);
} while (i < j);
/* Move partition element back to middle */
ExchangeRects(0, j);
/* Recurse */
if (numRects-j-1 > 1)
QuickSortRects(&rects[j+1], numRects-j-1);
numRects = j;
} while (numRects > 1);
}
/*-
*-----------------------------------------------------------------------
* miRegionValidate --
*
* Take a ``region'' which is a non-y-x-banded random collection of
* rectangles, and compute a nice region which is the union of all the
* rectangles.
*
* Results:
* TRUE if successful.
*
* Side Effects:
* The passed-in ``region'' may be modified.
* pOverlap set to TRUE if any retangles overlapped, else FALSE;
*
* Strategy:
* Step 1. Sort the rectangles into ascending order with primary key y1
* and secondary key x1.
*
* Step 2. Split the rectangles into the minimum number of proper y-x
* banded regions. This may require horizontally merging
* rectangles, and vertically coalescing bands. With any luck,
* this step in an identity tranformation (ala the Box widget),
* or a coalescing into 1 box (ala Menus).
*
* Step 3. Merge the separate regions down to a single region by calling
* miUnion. Maximize the work each miUnion call does by using
* a binary merge.
*
*-----------------------------------------------------------------------
*/
Bool
miRegionValidate(badreg, pOverlap)
RegionPtr badreg;
Bool *pOverlap;
{
/* Descriptor for regions under construction in Step 2. */
typedef struct {
RegionRec reg;
int prevBand;
int curBand;
} RegionInfo;
int numRects; /* Original numRects for badreg */
RegionInfo *ri; /* Array of current regions */
int numRI; /* Number of entries used in ri */
int sizeRI; /* Number of entries available in ri */
int i; /* Index into rects */
register int j; /* Index into ri */
register RegionInfo *rit; /* &ri[j] */
register RegionPtr reg; /* ri[j].reg */
register BoxPtr box; /* Current box in rects */
register BoxPtr riBox; /* Last box in ri[j].reg */
register RegionPtr hreg; /* ri[j_half].reg */
*pOverlap = FALSE;
if (!badreg->data)
{
good(badreg);
return TRUE;
}
numRects = badreg->data->numRects;
if (!numRects)
{
good(badreg);
return TRUE;
}
if (badreg->extents.x1 < badreg->extents.x2)
{
if ((numRects) == 1)
{
xfreeData(badreg);
badreg->data = (RegDataPtr) NULL;
}
else
{
DOWNSIZE(badreg, numRects);
}
good(badreg);
return TRUE;
}
/* Step 1: Sort the rects array into ascending (y1, x1) order */
QuickSortRects(REGION_BOXPTR(badreg), numRects);
/* Step 2: Scatter the sorted array into the minimum number of regions */
/* Set up the first region to be the first rectangle in badreg */
/* Note that step 2 code will never overflow the ri[0].reg rects array */
Must_have_memory = TRUE; /* XXX */
ri = (RegionInfo *) xalloc(4 * sizeof(RegionInfo));
Must_have_memory = FALSE; /* XXX */
sizeRI = 4;
numRI = 1;
ri[0].prevBand = 0;
ri[0].curBand = 0;
ri[0].reg = *badreg;
box = REGION_BOXPTR(&ri[0].reg);
ri[0].reg.extents = *box;
ri[0].reg.data->numRects = 1;
/* Now scatter rectangles into the minimum set of valid regions. If the
next rectangle to be added to a region would force an existing rectangle
in the region to be split up in order to maintain y-x banding, just
forget it. Try the next region. If it doesn't fit cleanly into any
region, make a new one. */
for (i = numRects; --i > 0;)
{
box++;
/* Look for a region to append box to */
for (j = numRI, rit = ri; --j >= 0; rit++)
{
reg = &rit->reg;
riBox = REGION_END(reg);
if (box->y1 == riBox->y1 && box->y2 == riBox->y2)
{
/* box is in same band as riBox. Merge or append it */
if (box->x1 <= riBox->x2)
{
/* Merge it with riBox */
if (box->x1 < riBox->x2) *pOverlap = TRUE;
if (box->x2 > riBox->x2) riBox->x2 = box->x2;
}
else
{
RECTALLOC(reg, 1);
*REGION_TOP(reg) = *box;
reg->data->numRects++;
}
goto NextRect; /* So sue me */
}
else if (box->y1 >= riBox->y2)
{
/* Put box into new band */
if (reg->extents.x2 < riBox->x2) reg->extents.x2 = riBox->x2;
if (reg->extents.x1 > box->x1) reg->extents.x1 = box->x1;
Coalesce(reg, rit->prevBand, rit->curBand);
rit->curBand = reg->data->numRects;
RECTALLOC(reg, 1);
*REGION_TOP(reg) = *box;
reg->data->numRects++;
goto NextRect;
}
/* Well, this region was inappropriate. Try the next one. */
} /* for j */
/* Uh-oh. No regions were appropriate. Create a new one. */
if (sizeRI == numRI)
{
/* Oops, allocate space for new region information */
sizeRI <<= 1;
Must_have_memory = TRUE; /* XXX */
ri = (RegionInfo *) xrealloc(ri, sizeRI * sizeof(RegionInfo));
Must_have_memory = FALSE; /* XXX */
rit = &ri[numRI];
}
numRI++;
rit->prevBand = 0;
rit->curBand = 0;
rit->reg.extents = *box;
rit->reg.data = (RegDataPtr)NULL;
miRectAlloc(&rit->reg, (i+numRI) / numRI); /* MUST force allocation */
NextRect: ;
} /* for i */
/* Make a final pass over each region in order to Coalesce and set
extents.x2 and extents.y2 */
for (j = numRI, rit = ri; --j >= 0; rit++)
{
reg = &rit->reg;
riBox = REGION_END(reg);
reg->extents.y2 = riBox->y2;
if (reg->extents.x2 < riBox->x2) reg->extents.x2 = riBox->x2;
Coalesce(reg, rit->prevBand, rit->curBand);
if (reg->data->numRects == 1) /* keep unions happy below */
{
xfreeData(reg);
reg->data = (RegDataPtr)NULL;
}
}
/* Step 3: Union all regions into a single region */
while (numRI > 1)
{
int half = numRI/2;
for (j = numRI & 1; j < (half + (numRI & 1)); j++)
{
reg = &ri[j].reg;
hreg = &ri[j+half].reg;
miRegionOp(reg, reg, hreg, miUnionO, TRUE, TRUE, pOverlap);
if (hreg->extents.x1 < reg->extents.x1)
reg->extents.x1 = hreg->extents.x1;
if (hreg->extents.y1 < reg->extents.y1)
reg->extents.y1 = hreg->extents.y1;
if (hreg->extents.x2 > reg->extents.x2)
reg->extents.x2 = hreg->extents.x2;
if (hreg->extents.y2 > reg->extents.y2)
reg->extents.y2 = hreg->extents.y2;
xfreeData(hreg);
}
numRI -= half;
}
*badreg = ri[0].reg;
xfree(ri);
good(badreg);
return TRUE;
}
RegionPtr
miRectsToRegion(nrects, prect, ctype)
int nrects;
register xRectangle *prect;
int ctype;
{
register RegionPtr pRgn;
register RegDataPtr pData;
register BoxPtr pBox;
register int i;
int x1, y1, x2, y2;
pRgn = miRegionCreate(NullBox, 0);
if (!nrects)
return pRgn;
if (nrects == 1)
{
x1 = prect->x;
y1 = prect->y;
if ((x2 = x1 + (int) prect->width) > MAXSHORT)
x2 = MAXSHORT;
if ((y2 = y1 + (int) prect->height) > MAXSHORT)
y2 = MAXSHORT;
if (x1 != x2 && y1 != y2)
{
pRgn->extents.x1 = x1;
pRgn->extents.y1 = y1;
pRgn->extents.x2 = x2;
pRgn->extents.y2 = y2;
pRgn->data = (RegDataPtr)NULL;
}
return pRgn;
}
Must_have_memory = TRUE; /* XXX */
pData = xallocData(nrects);
pBox = (BoxPtr) (pData + 1);
Must_have_memory = FALSE; /* XXX */
for (i = nrects; --i >= 0; prect++)
{
x1 = prect->x;
y1 = prect->y;
if ((x2 = x1 + (int) prect->width) > MAXSHORT)
x2 = MAXSHORT;
if ((y2 = y1 + (int) prect->height) > MAXSHORT)
y2 = MAXSHORT;
if (x1 != x2 && y1 != y2)
{
pBox->x1 = x1;
pBox->y1 = y1;
pBox->x2 = x2;
pBox->y2 = y2;
pBox++;
}
}
if (pBox != (BoxPtr) (pData + 1))
{
pData->size = nrects;
pData->numRects = pBox - (BoxPtr) (pData + 1);
pRgn->data = pData;
if (ctype != CT_YXBANDED)
{
Bool overlap; /* result ignored */
pRgn->extents.x1 = pRgn->extents.x2 = 0;
miRegionValidate(pRgn, &overlap);
}
else
miSetExtents(pRgn);
good(pRgn);
}
else
{
xfree (pData);
}
return pRgn;
}
/*======================================================================
* Region Subtraction
*====================================================================*/
/*-
*-----------------------------------------------------------------------
* miSubtractO --
* Overlapping band subtraction. x1 is the left-most point not yet
* checked.
*
* Results:
* TRUE if successful.
*
* Side Effects:
* pReg may have rectangles added to it.
*
*-----------------------------------------------------------------------
*/
/*ARGSUSED*/
static Bool
miSubtractO (pReg, r1, r1End, r2, r2End, y1, y2, pOverlap)
register RegionPtr pReg;
register BoxPtr r1;
BoxPtr r1End;
register BoxPtr r2;
BoxPtr r2End;
register int y1;
int y2;
Bool *pOverlap;
{
register BoxPtr pNextRect;
register int x1;
x1 = r1->x1;
assert(y1<y2);
assert(r1 != r1End && r2 != r2End);
pNextRect = REGION_TOP(pReg);
do
{
if (r2->x2 <= x1)
{
/*
* Subtrahend entirely to left of minuend: go to next subtrahend.
*/
r2++;
}
else if (r2->x1 <= x1)
{
/*
* Subtrahend preceeds minuend: nuke left edge of minuend.
*/
x1 = r2->x2;
if (x1 >= r1->x2)
{
/*
* Minuend completely covered: advance to next minuend and
* reset left fence to edge of new minuend.
*/
r1++;
if (r1 != r1End)
x1 = r1->x1;
}
else
{
/*
* Subtrahend now used up since it doesn't extend beyond
* minuend
*/
r2++;
}
}
else if (r2->x1 < r1->x2)
{
/*
* Left part of subtrahend covers part of minuend: add uncovered
* part of minuend to region and skip to next subtrahend.
*/
assert(x1<r2->x1);
NEWRECT(pReg, pNextRect, x1, y1, r2->x1, y2);
x1 = r2->x2;
if (x1 >= r1->x2)
{
/*
* Minuend used up: advance to new...
*/
r1++;
if (r1 != r1End)
x1 = r1->x1;
}
else
{
/*
* Subtrahend used up
*/
r2++;
}
}
else
{
/*
* Minuend used up: add any remaining piece before advancing.
*/
if (r1->x2 > x1)
NEWRECT(pReg, pNextRect, x1, y1, r1->x2, y2);
r1++;
if (r1 != r1End)
x1 = r1->x1;
}
} while ((r1 != r1End) && (r2 != r2End));
/*
* Add remaining minuend rectangles to region.
*/
while (r1 != r1End)
{
assert(x1<r1->x2);
NEWRECT(pReg, pNextRect, x1, y1, r1->x2, y2);
r1++;
if (r1 != r1End)
x1 = r1->x1;
}
return TRUE;
}
/*-
*-----------------------------------------------------------------------
* miSubtract --
* Subtract regS from regM and leave the result in regD.
* S stands for subtrahend, M for minuend and D for difference.
*
* Results:
* TRUE if successful.
*
* Side Effects:
* regD is overwritten.
*
*-----------------------------------------------------------------------
*/
Bool
miSubtract(regD, regM, regS)
register RegionPtr regD;
register RegionPtr regM;
register RegionPtr regS;
{
Bool overlap; /* result ignored */
good(regM);
good(regS);
good(regD);
/* check for trivial rejects */
if (REGION_NIL(regM) || REGION_NIL(regS) ||
!EXTENTCHECK(&regM->extents, &regS->extents))
{
return miRegionCopy(regD, regM);
}
else if (regM == regS)
{
xfreeData(regD);
regD->extents.x2 = regD->extents.x1;
regD->extents.y2 = regD->extents.y1;
regD->data = &miEmptyData;
return TRUE;
}
/* Add those rectangles in region 1 that aren't in region 2,
do yucky substraction for overlaps, and
just throw away rectangles in region 2 that aren't in region 1 */
if (!miRegionOp(regD, regM, regS, miSubtractO, TRUE, FALSE, &overlap))
return FALSE;
/*
* Can't alter RegD's extents before we call miRegionOp because
* it might be one of the source regions and miRegionOp depends
* on the extents of those regions being unaltered. Besides, this
* way there's no checking against rectangles that will be nuked
* due to coalescing, so we have to examine fewer rectangles.
*/
miSetExtents(regD);
good(regD);
return TRUE;
}
/*======================================================================
* Region Inversion
*====================================================================*/
/*-
*-----------------------------------------------------------------------
* miInverse --
* Take a region and a box and return a region that is everything
* in the box but not in the region. The careful reader will note
* that this is the same as subtracting the region from the box...
*
* Results:
* TRUE.
*
* Side Effects:
* newReg is overwritten.
*
*-----------------------------------------------------------------------
*/
Bool
miInverse(newReg, reg1, invRect)
RegionPtr newReg; /* Destination region */
RegionPtr reg1; /* Region to invert */
BoxPtr invRect; /* Bounding box for inversion */
{
RegionRec invReg; /* Quick and dirty region made from the
* bounding box */
Bool overlap; /* result ignored */
good(reg1);
good(newReg);
/* check for trivial rejects */
if (REGION_NIL(reg1) || !EXTENTCHECK(invRect, &reg1->extents))
{
newReg->extents = *invRect;
xfreeData(newReg);
newReg->data = (RegDataPtr)NULL;
return TRUE;
}
/* Add those rectangles in region 1 that aren't in region 2,
do yucky substraction for overlaps, and
just throw away rectangles in region 2 that aren't in region 1 */
invReg.extents = *invRect;
invReg.data = (RegDataPtr)NULL;
if (!miRegionOp(newReg, &invReg, reg1, miSubtractO, TRUE, FALSE, &overlap))
return FALSE;
/*
* Can't alter newReg's extents before we call miRegionOp because
* it might be one of the source regions and miRegionOp depends
* on the extents of those regions being unaltered. Besides, this
* way there's no checking against rectangles that will be nuked
* due to coalescing, so we have to examine fewer rectangles.
*/
miSetExtents(newReg);
good(newReg);
return TRUE;
}
/*
* RectIn(region, rect)
* This routine takes a pointer to a region and a pointer to a box
* and determines if the box is outside/inside/partly inside the region.
*
* The idea is to travel through the list of rectangles trying to cover the
* passed box with them. Anytime a piece of the rectangle isn't covered
* by a band of rectangles, partOut is set TRUE. Any time a rectangle in
* the region covers part of the box, partIn is set TRUE. The process ends
* when either the box has been completely covered (we reached a band that
* doesn't overlap the box, partIn is TRUE and partOut is false), the
* box has been partially covered (partIn == partOut == TRUE -- because of
* the banding, the first time this is true we know the box is only
* partially in the region) or is outside the region (we reached a band
* that doesn't overlap the box at all and partIn is false)
*/
int
miRectIn(region, prect)
register RegionPtr region;
register BoxPtr prect;
{
register int x;
register int y;
register BoxPtr pbox;
register BoxPtr pboxEnd;
int partIn, partOut;
int numRects;
good(region);
numRects = REGION_NUM_RECTS(region);
/* useful optimization */
if (!numRects || !EXTENTCHECK(&region->extents, prect))
return(rgnOUT);
if (numRects == 1)
{
/* We know that it must be rgnIN or rgnPART */
if (SUBSUMES(&region->extents, prect))
return(rgnIN);
else
return(rgnPART);
}
partOut = FALSE;
partIn = FALSE;
/* (x,y) starts at upper left of rect, moving to the right and down */
x = prect->x1;
y = prect->y1;
/* can stop when both partOut and partIn are TRUE, or we reach prect->y2 */
for (pbox = REGION_BOXPTR(region), pboxEnd = pbox + numRects;
pbox != pboxEnd;
pbox++)
{
if (pbox->y2 <= y)
continue; /* getting up to speed or skipping remainder of band */
if (pbox->y1 > y)
{
partOut = TRUE; /* missed part of rectangle above */
if (partIn || (pbox->y1 >= prect->y2))
break;
y = pbox->y1; /* x guaranteed to be == prect->x1 */
}
if (pbox->x2 <= x)
continue; /* not far enough over yet */
if (pbox->x1 > x)
{
partOut = TRUE; /* missed part of rectangle to left */
if (partIn)
break;
}
if (pbox->x1 < prect->x2)
{
partIn = TRUE; /* definitely overlap */
if (partOut)
break;
}
if (pbox->x2 >= prect->x2)
{
y = pbox->y2; /* finished with this band */
if (y >= prect->y2)
break;
x = prect->x1; /* reset x out to left again */
}
else
{
/*
* Because boxes in a band are maximal width, if the first box
* to overlap the rectangle doesn't completely cover it in that
* band, the rectangle must be partially out, since some of it
* will be uncovered in that band. partIn will have been set true
* by now...
*/
partOut = TRUE;
break;
}
}
return(partIn ? ((y < prect->y2) ? rgnPART : rgnIN) : rgnOUT);
}
/* TranslateRegion(pReg, x, y)
translates in place
*/
void
miTranslateRegion(pReg, x, y)
register RegionPtr pReg;
register int x;
register int y;
{
int x1, x2, y1, y2;
register int nbox;
register BoxPtr pbox;
good(pReg);
pReg->extents.x1 = x1 = pReg->extents.x1 + x;
pReg->extents.y1 = y1 = pReg->extents.y1 + y;
pReg->extents.x2 = x2 = pReg->extents.x2 + x;
pReg->extents.y2 = y2 = pReg->extents.y2 + y;
if (((x1 - MINSHORT)|(y1 - MINSHORT)|(MAXSHORT - x2)|(MAXSHORT - y2)) >= 0)
{
if (pReg->data && (nbox = pReg->data->numRects))
{
for (pbox = REGION_BOXPTR(pReg); nbox--; pbox++)
{
pbox->x1 += x;
pbox->y1 += y;
pbox->x2 += x;
pbox->y2 += y;
}
}
return;
}
if (((x2 - MINSHORT)|(y2 - MINSHORT)|(MAXSHORT - x1)|(MAXSHORT - y1)) <= 0)
{
pReg->extents.x2 = pReg->extents.x1;
pReg->extents.y2 = pReg->extents.y1;
xfreeData(pReg);
pReg->data = &miEmptyData;
return;
}
if (x1 < MINSHORT)
pReg->extents.x1 = MINSHORT;
else if (x2 > MAXSHORT)
pReg->extents.x2 = MAXSHORT;
if (y1 < MINSHORT)
pReg->extents.y1 = MINSHORT;
else if (y2 > MAXSHORT)
pReg->extents.y2 = MAXSHORT;
if (pReg->data && (nbox = pReg->data->numRects))
{
register BoxPtr pboxout;
for (pboxout = pbox = REGION_BOXPTR(pReg); nbox--; pbox++)
{
pboxout->x1 = x1 = pbox->x1 + x;
pboxout->y1 = y1 = pbox->y1 + y;
pboxout->x2 = x2 = pbox->x2 + x;
pboxout->y2 = y2 = pbox->y2 + y;
if (((x2 - MINSHORT)|(y2 - MINSHORT)|
(MAXSHORT - x1)|(MAXSHORT - y1)) <= 0)
{
pReg->data->numRects--;
continue;
}
if (x1 < MINSHORT)
pboxout->x1 = MINSHORT;
else if (x2 > MAXSHORT)
pboxout->x2 = MAXSHORT;
if (y1 < MINSHORT)
pboxout->y1 = MINSHORT;
else if (y2 > MAXSHORT)
pboxout->y2 = MAXSHORT;
pboxout++;
}
if (pboxout != pbox)
{
if (pReg->data->numRects == 1)
{
pReg->extents = *REGION_BOXPTR(pReg);
xfreeData(pReg);
pReg->data = (RegDataPtr)NULL;
}
else
miSetExtents(pReg);
}
}
}
void
miRegionReset(pReg, pBox)
RegionPtr pReg;
BoxPtr pBox;
{
good(pReg);
assert(pBox->x1<=pBox->x2);
assert(pBox->y1<=pBox->y2);
pReg->extents = *pBox;
xfreeData(pReg);
pReg->data = (RegDataPtr)NULL;
}
Bool
miPointInRegion(pReg, x, y, box)
register RegionPtr pReg;
register int x, y;
BoxPtr box; /* "return" value */
{
register BoxPtr pbox, pboxEnd;
int numRects;
good(pReg);
numRects = REGION_NUM_RECTS(pReg);
if (!numRects || !INBOX(&pReg->extents, x, y))
return(FALSE);
if (numRects == 1)
{
*box = pReg->extents;
return(TRUE);
}
for (pbox = REGION_BOXPTR(pReg), pboxEnd = pbox + numRects;
pbox != pboxEnd;
pbox++)
{
if (y >= pbox->y2)
continue; /* not there yet */
if ((y < pbox->y1) || (x < pbox->x1))
break; /* missed it */
if (x >= pbox->x2)
continue; /* not there yet */
*box = *pbox;
return(TRUE);
}
return(FALSE);
}
Bool
miRegionNotEmpty(pReg)
RegionPtr pReg;
{
good(pReg);
return(!REGION_NIL(pReg));
}
void
miRegionEmpty(pReg)
RegionPtr pReg;
{
good(pReg);
xfreeData(pReg);
pReg->extents.x2 = pReg->extents.x1;
pReg->extents.y2 = pReg->extents.y1;
pReg->data = &miEmptyData;
}
BoxPtr
miRegionExtents(pReg)
RegionPtr pReg;
{
good(pReg);
return(&pReg->extents);
}
#define ExchangeSpans(a, b) \
{ \
DDXPointRec tpt; \
register int tw; \
\
tpt = spans[a]; spans[a] = spans[b]; spans[b] = tpt; \
tw = widths[a]; widths[a] = widths[b]; widths[b] = tw; \
}
/* ||| I should apply the merge sort code to rectangle sorting above, and see
if mapping time can be improved. But right now I've been at work 12 hours,
so forget it.
*/
static void QuickSortSpans(spans, widths, numSpans)
register DDXPointRec spans[];
register int widths[];
register int numSpans;
{
register int y;
register int i, j, m;
register DDXPointPtr r;
/* Always called with numSpans > 1 */
/* Sorts only by y, doesn't bother to sort by x */
do
{
if (numSpans < 9)
{
/* Do insertion sort */
register int yprev;
yprev = spans[0].y;
i = 1;
do
{ /* while i != numSpans */
y = spans[i].y;
if (yprev > y)
{
/* spans[i] is out of order. Move into proper location. */
DDXPointRec tpt;
int tw, k;
for (j = 0; y >= spans[j].y; j++) {}
tpt = spans[i];
tw = widths[i];
for (k = i; k != j; k--)
{
spans[k] = spans[k-1];
widths[k] = widths[k-1];
}
spans[j] = tpt;
widths[j] = tw;
y = spans[i].y;
} /* if out of order */
yprev = y;
i++;
} while (i != numSpans);
return;
}
/* Choose partition element, stick in location 0 */
m = numSpans / 2;
if (spans[m].y > spans[0].y) ExchangeSpans(m, 0);
if (spans[m].y > spans[numSpans-1].y) ExchangeSpans(m, numSpans-1);
if (spans[m].y > spans[0].y) ExchangeSpans(m, 0);
y = spans[0].y;
/* Partition array */
i = 0;
j = numSpans;
do
{
r = &(spans[i]);
do
{
r++;
i++;
} while (i != numSpans && r->y < y);
r = &(spans[j]);
do
{
r--;
j--;
} while (y < r->y);
if (i < j)
ExchangeSpans(i, j);
} while (i < j);
/* Move partition element back to middle */
ExchangeSpans(0, j);
/* Recurse */
if (numSpans-j-1 > 1)
QuickSortSpans(&spans[j+1], &widths[j+1], numSpans-j-1);
numSpans = j;
} while (numSpans > 1);
}
#define NextBand() \
{ \
clipy1 = pboxBandStart->y1; \
clipy2 = pboxBandStart->y2; \
pboxBandEnd = pboxBandStart + 1; \
while (pboxBandEnd != pboxLast && pboxBandEnd->y1 == clipy1) { \
pboxBandEnd++; \
} \
for (; ppt != pptLast && ppt->y < clipy1; ppt++, pwidth++) {} \
}
/*
Clip a list of scanlines to a region. The caller has allocated the
space. FSorted is non-zero if the scanline origins are in ascending
order.
returns the number of new, clipped scanlines.
*/
int
miClipSpans(prgnDst, ppt, pwidth, nspans, pptNew, pwidthNew, fSorted)
RegionPtr prgnDst;
register DDXPointPtr ppt;
register int *pwidth;
int nspans;
register DDXPointPtr pptNew;
int *pwidthNew;
int fSorted;
{
register DDXPointPtr pptLast;
int *pwidthNewStart; /* the vengeance of Xerox! */
register int y, x1, x2;
register int numRects;
good(prgnDst);
pptLast = ppt + nspans;
pwidthNewStart = pwidthNew;
if (!prgnDst->data)
{
/* Do special fast code with clip boundaries in registers(?) */
/* It doesn't pay much to make use of fSorted in this case,
so we lump everything together. */
register int clipx1, clipx2, clipy1, clipy2;
clipx1 = prgnDst->extents.x1;
clipy1 = prgnDst->extents.y1;
clipx2 = prgnDst->extents.x2;
clipy2 = prgnDst->extents.y2;
for (; ppt != pptLast; ppt++, pwidth++)
{
y = ppt->y;
x1 = ppt->x;
if (clipy1 <= y && y < clipy2)
{
x2 = x1 + *pwidth;
if (x1 < clipx1) x1 = clipx1;
if (x2 > clipx2) x2 = clipx2;
if (x1 < x2)
{
/* part of span in clip rectangle */
pptNew->x = x1;
pptNew->y = y;
*pwidthNew = x2 - x1;
pptNew++;
pwidthNew++;
}
}
} /* end for */
}
else if ((numRects = prgnDst->data->numRects))
{
/* Have to clip against many boxes */
BoxPtr pboxBandStart, pboxBandEnd;
register BoxPtr pbox;
register BoxPtr pboxLast;
register int clipy1, clipy2;
/* In this case, taking advantage of sorted spans gains more than
the sorting costs. */
if ((! fSorted) && (nspans > 1))
QuickSortSpans(ppt, pwidth, nspans);
pboxBandStart = REGION_BOXPTR(prgnDst);
pboxLast = pboxBandStart + numRects;
NextBand();
for (; ppt != pptLast; )
{
y = ppt->y;
if (y < clipy2)
{
/* span is in the current band */
pbox = pboxBandStart;
x1 = ppt->x;
x2 = x1 + *pwidth;
do
{ /* For each box in band */
register int newx1, newx2;
newx1 = x1;
newx2 = x2;
if (newx1 < pbox->x1) newx1 = pbox->x1;
if (newx2 > pbox->x2) newx2 = pbox->x2;
if (newx1 < newx2)
{
/* Part of span in clip rectangle */
pptNew->x = newx1;
pptNew->y = y;
*pwidthNew = newx2 - newx1;
pptNew++;
pwidthNew++;
}
pbox++;
} while (pbox != pboxBandEnd);
ppt++;
pwidth++;
}
else
{
/* Move to next band, adjust ppt as needed */
pboxBandStart = pboxBandEnd;
if (pboxBandStart == pboxLast)
break; /* We're completely done */
NextBand();
}
}
}
return (pwidthNew - pwidthNewStart);
}
/* find the band in a region with the most rectangles */
int
miFindMaxBand(prgn)
RegionPtr prgn;
{
register int nbox;
register BoxPtr pbox;
register int nThisBand;
register int nMaxBand = 0;
short yThisBand;
good(prgn);
nbox = REGION_NUM_RECTS(prgn);
pbox = REGION_RECTS(prgn);
while(nbox > 0)
{
yThisBand = pbox->y1;
nThisBand = 0;
while((nbox > 0) && (pbox->y1 == yThisBand))
{
nbox--;
pbox++;
nThisBand++;
}
if (nThisBand > nMaxBand)
nMaxBand = nThisBand;
}
return (nMaxBand);
}
#ifndef REGION_H #ifndef REGION_H
#define REGION_H #define REGION_H
#include "sraRegion.h"
#if 0
#define NullRegion ((RegionPtr)0) #define NullRegion ((RegionPtr)0)
#define NullBox ((BoxPtr)0) #define NullBox ((BoxPtr)0)
...@@ -38,5 +41,6 @@ extern void miTranslateRegion(RegionPtr,int,int); ...@@ -38,5 +41,6 @@ extern void miTranslateRegion(RegionPtr,int,int);
#define REGION_SUBTRACT(s,newReg,reg1,reg2) miSubtract(newReg,reg1,reg2) #define REGION_SUBTRACT(s,newReg,reg1,reg2) miSubtract(newReg,reg1,reg2)
#define REGION_UNION(s,newReg,reg1,reg2) miUnion(newReg,reg1,reg2) #define REGION_UNION(s,newReg,reg1,reg2) miUnion(newReg,reg1,reg2)
#define REGION_TRANSLATE(s,pReg,x,y) miTranslateRegion(pReg,x,y) #define REGION_TRANSLATE(s,pReg,x,y) miTranslateRegion(pReg,x,y)
#endif
#endif #endif
...@@ -182,6 +182,7 @@ typedef struct ...@@ -182,6 +182,7 @@ typedef struct
ScreenRec screen; ScreenRec screen;
*/ */
rfbPixelFormat rfbServerFormat; rfbPixelFormat rfbServerFormat;
CARD16* colourMap; /* set this if rfbServerFormat.trueColour==FALSE */
char* desktopName; char* desktopName;
char rfbThisHost[255]; char rfbThisHost[255];
int rfbPort; int rfbPort;
...@@ -256,16 +257,8 @@ extern void vncEncryptBytes(unsigned char *bytes, char *passwd); ...@@ -256,16 +257,8 @@ extern void vncEncryptBytes(unsigned char *bytes, char *passwd);
/* region stuff */ /* region stuff */
typedef struct BoxRec { struct sraRegion;
short x1, y1, x2, y2; typedef struct sraRegion* sraRegionPtr;
} BoxRec, *BoxPtr;
typedef struct RegDataRec* RegDataPtr;
typedef struct RegionRec {
BoxRec extents;
RegDataPtr data;
} RegionRec, *RegionPtr;
/* /*
* Per-client structure. * Per-client structure.
...@@ -333,7 +326,7 @@ typedef struct rfbClientRec { ...@@ -333,7 +326,7 @@ typedef struct rfbClientRec {
the destination copyRegion. Just before an update is sent we remove the destination copyRegion. Just before an update is sent we remove
from the copyRegion anything in the modifiedRegion. */ from the copyRegion anything in the modifiedRegion. */
RegionRec copyRegion; /* the destination region of the copy */ sraRegionPtr copyRegion; /* the destination region of the copy */
int copyDX, copyDY; /* the translation by which the copy happens */ int copyDX, copyDY; /* the translation by which the copy happens */
...@@ -342,14 +335,14 @@ typedef struct rfbClientRec { ...@@ -342,14 +335,14 @@ typedef struct rfbClientRec {
pthread_cond_t updateCond; pthread_cond_t updateCond;
#endif #endif
RegionRec modifiedRegion; sraRegionPtr modifiedRegion;
/* As part of the FramebufferUpdateRequest, a client can express interest /* As part of the FramebufferUpdateRequest, a client can express interest
in a subrectangle of the whole framebuffer. This is stored in the in a subrectangle of the whole framebuffer. This is stored in the
requestedRegion member. In the normal case this is the whole requestedRegion member. In the normal case this is the whole
framebuffer if the client is ready, empty if it's not. */ framebuffer if the client is ready, empty if it's not. */
RegionRec requestedRegion; sraRegionPtr requestedRegion;
/* The following members represent the state of the "deferred update" timer /* The following members represent the state of the "deferred update" timer
- when the framebuffer is modified and the client is ready, in most - when the framebuffer is modified and the client is ready, in most
...@@ -429,8 +422,10 @@ typedef struct rfbClientRec { ...@@ -429,8 +422,10 @@ typedef struct rfbClientRec {
#define FB_UPDATE_PENDING(cl) \ #define FB_UPDATE_PENDING(cl) \
((!(cl)->enableCursorShapeUpdates && !(cl)->screen->cursorIsDrawn) || \ ((!(cl)->enableCursorShapeUpdates && !(cl)->screen->cursorIsDrawn) || \
((cl)->enableCursorShapeUpdates && (cl)->cursorWasChanged) || \ ((cl)->enableCursorShapeUpdates && (cl)->cursorWasChanged) || \
REGION_NOTEMPTY(&((cl)->screenInfo->screen),&(cl)->copyRegion) || \ !sraRgnEmpty((cl)->copyRegion) || !sraRgnEmpty((cl)->modifiedRegion))
REGION_NOTEMPTY(&((cl)->screenInfo->screen),&(cl)->modifiedRegion))
//REGION_NOTEMPTY(&((cl)->screenInfo->screen),&(cl)->copyRegion) ||
//REGION_NOTEMPTY(&((cl)->screenInfo->screen),&(cl)->modifiedRegion))
/* /*
* This macro creates an empty region (ie. a region with no areas) if it is * This macro creates an empty region (ie. a region with no areas) if it is
...@@ -509,11 +504,11 @@ extern void rfbProcessClientMessage(rfbClientPtr cl); ...@@ -509,11 +504,11 @@ extern void rfbProcessClientMessage(rfbClientPtr cl);
extern void rfbClientConnFailed(rfbClientPtr cl, char *reason); extern void rfbClientConnFailed(rfbClientPtr cl, char *reason);
extern void rfbNewUDPConnection(rfbScreenInfoPtr rfbScreen,int sock); extern void rfbNewUDPConnection(rfbScreenInfoPtr rfbScreen,int sock);
extern void rfbProcessUDPInput(rfbClientPtr cl); extern void rfbProcessUDPInput(rfbClientPtr cl);
extern Bool rfbSendFramebufferUpdate(rfbClientPtr cl, RegionRec updateRegion); extern Bool rfbSendFramebufferUpdate(rfbClientPtr cl, sraRegionPtr updateRegion);
extern Bool rfbSendRectEncodingRaw(rfbClientPtr cl, int x,int y,int w,int h); extern Bool rfbSendRectEncodingRaw(rfbClientPtr cl, int x,int y,int w,int h);
extern Bool rfbSendUpdateBuf(rfbClientPtr cl); extern Bool rfbSendUpdateBuf(rfbClientPtr cl);
extern void rfbSendServerCutText(rfbScreenInfoPtr rfbScreen,char *str, int len); extern void rfbSendServerCutText(rfbScreenInfoPtr rfbScreen,char *str, int len);
extern Bool rfbSendCopyRegion(rfbClientPtr cl,RegionPtr reg,int dx,int dy); extern Bool rfbSendCopyRegion(rfbClientPtr cl,sraRegionPtr reg,int dx,int dy);
extern Bool rfbSendLastRectMarker(rfbClientPtr cl); extern Bool rfbSendLastRectMarker(rfbClientPtr cl);
void rfbGotXCutText(rfbScreenInfoPtr rfbScreen, char *str, int len); void rfbGotXCutText(rfbScreenInfoPtr rfbScreen, char *str, int len);
...@@ -627,7 +622,7 @@ extern void rfbInitSockets(rfbScreenInfoPtr rfbScreen); ...@@ -627,7 +622,7 @@ extern void rfbInitSockets(rfbScreenInfoPtr rfbScreen);
extern void rfbDisconnectUDPSock(rfbScreenInfoPtr cl); extern void rfbDisconnectUDPSock(rfbScreenInfoPtr cl);
void rfbMarkRectAsModified(rfbScreenInfoPtr rfbScreen,int x1,int y1,int x2,int y2); void rfbMarkRectAsModified(rfbScreenInfoPtr rfbScreen,int x1,int y1,int x2,int y2);
void rfbMarkRegionAsModified(rfbScreenInfoPtr rfbScreen,RegionPtr modRegion); void rfbMarkRegionAsModified(rfbScreenInfoPtr rfbScreen,sraRegionPtr modRegion);
void doNothingWithClient(rfbClientPtr cl); void doNothingWithClient(rfbClientPtr cl);
/* functions to make a vnc server */ /* functions to make a vnc server */
......
...@@ -151,7 +151,6 @@ rfbNewClient(rfbScreen,sock) ...@@ -151,7 +151,6 @@ rfbNewClient(rfbScreen,sock)
rfbProtocolVersionMsg pv; rfbProtocolVersionMsg pv;
rfbClientIteratorPtr iterator; rfbClientIteratorPtr iterator;
rfbClientPtr cl; rfbClientPtr cl;
BoxRec box;
struct sockaddr_in addr; struct sockaddr_in addr;
int addrlen = sizeof(struct sockaddr_in); int addrlen = sizeof(struct sockaddr_in);
int i; int i;
...@@ -183,21 +182,19 @@ rfbNewClient(rfbScreen,sock) ...@@ -183,21 +182,19 @@ rfbNewClient(rfbScreen,sock)
cl->correMaxWidth = 48; cl->correMaxWidth = 48;
cl->correMaxHeight = 48; cl->correMaxHeight = 48;
REGION_INIT(rfbScreen,&cl->copyRegion,NullBox,0); cl->copyRegion = sraRgnCreate();
cl->copyDX = 0; cl->copyDX = 0;
cl->copyDY = 0; cl->copyDY = 0;
box.x1 = box.y1 = 0; cl->modifiedRegion =
box.x2 = rfbScreen->width; sraRgnCreateRect(0,0,rfbScreen->width,rfbScreen->height);
box.y2 = rfbScreen->height;
REGION_INIT(pScreen,&cl->modifiedRegion,&box,0);
#ifdef HAVE_PTHREADS #ifdef HAVE_PTHREADS
pthread_mutex_init(&cl->updateMutex, NULL); pthread_mutex_init(&cl->updateMutex, NULL);
pthread_cond_init(&cl->updateCond, NULL); pthread_cond_init(&cl->updateCond, NULL);
#endif #endif
REGION_INIT(pScreen,&cl->requestedRegion,NullBox,0); cl->requestedRegion = sraRgnCreate();
cl->format = cl->screen->rfbServerFormat; cl->format = cl->screen->rfbServerFormat;
cl->translateFn = rfbTranslateNone; cl->translateFn = rfbTranslateNone;
...@@ -296,7 +293,7 @@ rfbClientConnectionGone(cl) ...@@ -296,7 +293,7 @@ rfbClientConnectionGone(cl)
pthread_mutex_unlock(&rfbClientListMutex); pthread_mutex_unlock(&rfbClientListMutex);
#endif #endif
REGION_UNINIT(pScreen,&cl->modifiedRegion); sraRgnDestroy(cl->modifiedRegion);
rfbPrintStats(cl); rfbPrintStats(cl);
...@@ -676,8 +673,7 @@ rfbProcessClientNormalMessage(cl) ...@@ -676,8 +673,7 @@ rfbProcessClientNormalMessage(cl)
case rfbFramebufferUpdateRequest: case rfbFramebufferUpdateRequest:
{ {
RegionRec tmpRegion; sraRegionPtr tmpRegion;
BoxRec box;
if ((n = ReadExact(cl, ((char *)&msg) + 1, if ((n = ReadExact(cl, ((char *)&msg) + 1,
sz_rfbFramebufferUpdateRequestMsg-1)) <= 0) { sz_rfbFramebufferUpdateRequestMsg-1)) <= 0) {
...@@ -687,17 +683,16 @@ rfbProcessClientNormalMessage(cl) ...@@ -687,17 +683,16 @@ rfbProcessClientNormalMessage(cl)
return; return;
} }
box.x1 = Swap16IfLE(msg.fur.x); tmpRegion =
box.y1 = Swap16IfLE(msg.fur.y); sraRgnCreateRect(Swap16IfLE(msg.fur.x),
box.x2 = box.x1 + Swap16IfLE(msg.fur.w); Swap16IfLE(msg.fur.y),
box.y2 = box.y1 + Swap16IfLE(msg.fur.h); Swap16IfLE(msg.fur.x)+Swap16IfLE(msg.fur.w),
SAFE_REGION_INIT(pScreen,&tmpRegion,&box,0); Swap16IfLE(msg.fur.y)+Swap16IfLE(msg.fur.h));
#ifdef HAVE_PTHREADS #ifdef HAVE_PTHREADS
pthread_mutex_lock(&cl->updateMutex); pthread_mutex_lock(&cl->updateMutex);
#endif #endif
REGION_UNION(pScreen, &cl->requestedRegion, &cl->requestedRegion, sraRgnOr(cl->requestedRegion,tmpRegion);
&tmpRegion);
#ifdef NOT_YET #ifdef NOT_YET
if (!cl->readyForSetColourMapEntries) { if (!cl->readyForSetColourMapEntries) {
...@@ -705,7 +700,7 @@ rfbProcessClientNormalMessage(cl) ...@@ -705,7 +700,7 @@ rfbProcessClientNormalMessage(cl)
cl->readyForSetColourMapEntries = TRUE; cl->readyForSetColourMapEntries = TRUE;
if (!cl->format.trueColour) { if (!cl->format.trueColour) {
if (!rfbSetClientColourMap(cl, 0, 0)) { if (!rfbSetClientColourMap(cl, 0, 0)) {
REGION_UNINIT(pScreen,&tmpRegion); sraRgnDestroy(tmpRegion);
return; return;
} }
} }
...@@ -713,9 +708,8 @@ rfbProcessClientNormalMessage(cl) ...@@ -713,9 +708,8 @@ rfbProcessClientNormalMessage(cl)
#endif #endif
if (!msg.fur.incremental) { if (!msg.fur.incremental) {
REGION_UNION(pScreen,&cl->modifiedRegion,&cl->modifiedRegion, sraRgnOr(cl->modifiedRegion,tmpRegion);
&tmpRegion); sraRgnSubtract(cl->copyRegion,tmpRegion);
REGION_SUBTRACT(pScreen,&cl->copyRegion,&cl->copyRegion,&tmpRegion);
} }
#ifdef HAVE_PTHREADS #ifdef HAVE_PTHREADS
pthread_cond_signal(&cl->updateCond); pthread_cond_signal(&cl->updateCond);
...@@ -726,7 +720,7 @@ rfbProcessClientNormalMessage(cl) ...@@ -726,7 +720,7 @@ rfbProcessClientNormalMessage(cl)
rfbSendFramebufferUpdate(cl,cl->modifiedRegion); rfbSendFramebufferUpdate(cl,cl->modifiedRegion);
} }
REGION_UNINIT(pScreen,&tmpRegion); sraRgnDestroy(tmpRegion);
return; return;
} }
...@@ -820,12 +814,13 @@ rfbProcessClientNormalMessage(cl) ...@@ -820,12 +814,13 @@ rfbProcessClientNormalMessage(cl)
Bool Bool
rfbSendFramebufferUpdate(cl, updateRegion) rfbSendFramebufferUpdate(cl, updateRegion)
rfbClientPtr cl; rfbClientPtr cl;
RegionRec updateRegion; sraRegionPtr updateRegion;
{ {
int i; sraRectangleIterator* i;
sraRect rect;
int nUpdateRegionRects; int nUpdateRegionRects;
rfbFramebufferUpdateMsg *fu = (rfbFramebufferUpdateMsg *)cl->updateBuf; rfbFramebufferUpdateMsg *fu = (rfbFramebufferUpdateMsg *)cl->updateBuf;
RegionRec updateCopyRegion; sraRegionPtr updateCopyRegion;
int dx, dy; int dx, dy;
Bool sendCursorShape = FALSE; Bool sendCursorShape = FALSE;
Bool cursorWasDrawn = FALSE; Bool cursorWasDrawn = FALSE;
...@@ -835,29 +830,26 @@ rfbSendFramebufferUpdate(cl, updateRegion) ...@@ -835,29 +830,26 @@ rfbSendFramebufferUpdate(cl, updateRegion)
* removed from the framebuffer. Otherwise, make sure it's put up. * removed from the framebuffer. Otherwise, make sure it's put up.
*/ */
cursorWasDrawn = cl->screen->cursorIsDrawn; cursorWasDrawn = cl->screen->cursorIsDrawn;
if (cl->enableCursorShapeUpdates) { if (cl->enableCursorShapeUpdates) {
if (cl->screen->cursorIsDrawn) { if (cl->screen->cursorIsDrawn) {
rfbUndrawCursor(cl); rfbUndrawCursor(cl);
//fprintf(stderr,"rfbSpriteRemoveCursor(pScreen); not yet!\n");
} }
if (!cl->screen->cursorIsDrawn && cl->cursorWasChanged) if (!cl->screen->cursorIsDrawn && cl->cursorWasChanged)
sendCursorShape = TRUE; sendCursorShape = TRUE;
} else { } else {
if (!cl->screen->cursorIsDrawn) if (!cl->screen->cursorIsDrawn)
rfbDrawCursor(cl); rfbDrawCursor(cl);
//fprintf(stderr,"rfbSpriteRestoreCursor(pScreen); not yet!\n"); }
}
/* /*
* The modifiedRegion may overlap the destination copyRegion. We remove * The modifiedRegion may overlap the destination copyRegion. We remove
* any overlapping bits from the copyRegion (since they'd only be * any overlapping bits from the copyRegion (since they'd only be
* overwritten anyway). * overwritten anyway).
*/ */
REGION_SUBTRACT(pScreen, &cl->copyRegion, &cl->copyRegion, sraRgnSubtract(cl->copyRegion,cl->modifiedRegion);
&cl->modifiedRegion);
/* /*
* The client is interested in the region requestedRegion. The region * The client is interested in the region requestedRegion. The region
...@@ -866,15 +858,11 @@ rfbSendFramebufferUpdate(cl, updateRegion) ...@@ -866,15 +858,11 @@ rfbSendFramebufferUpdate(cl, updateRegion)
* no update is needed. * no update is needed.
*/ */
REGION_INIT(pScreen,&updateRegion,NullBox,0); updateRegion = sraRgnCreateRgn(cl->copyRegion);
REGION_UNION(pScreen, &updateRegion, &cl->copyRegion, sraRgnOr(updateRegion,cl->modifiedRegion);
&cl->modifiedRegion); if(!sraRgnAnd(updateRegion,cl->requestedRegion) && !sendCursorShape) {
REGION_INTERSECT(pScreen, &updateRegion, &cl->requestedRegion, sraRgnDestroy(updateRegion);
&updateRegion); return TRUE;
if (!REGION_NOTEMPTY(pScreen,&updateRegion) && !sendCursorShape) {
REGION_UNINIT(pScreen,&updateRegion);
return TRUE;
} }
/* /*
...@@ -886,12 +874,10 @@ rfbSendFramebufferUpdate(cl, updateRegion) ...@@ -886,12 +874,10 @@ rfbSendFramebufferUpdate(cl, updateRegion)
* updateCopyRegion to this. * updateCopyRegion to this.
*/ */
REGION_INIT(pScreen,&updateCopyRegion,NullBox,0); updateCopyRegion = sraRgnCreateRgn(cl->copyRegion);
REGION_INTERSECT(pScreen, &updateCopyRegion, &cl->copyRegion, sraRgnAnd(updateCopyRegion,cl->requestedRegion);
&cl->requestedRegion); sraRgnOffset(cl->requestedRegion,cl->copyDX,cl->copyDY);
REGION_TRANSLATE(pScreen, &cl->requestedRegion, cl->copyDX, cl->copyDY); sraRgnAnd(updateCopyRegion,cl->requestedRegion);
REGION_INTERSECT(pScreen, &updateCopyRegion, &updateCopyRegion,
&cl->requestedRegion);
dx = cl->copyDX; dx = cl->copyDX;
dy = cl->copyDY; dy = cl->copyDY;
...@@ -901,7 +887,7 @@ rfbSendFramebufferUpdate(cl, updateRegion) ...@@ -901,7 +887,7 @@ rfbSendFramebufferUpdate(cl, updateRegion)
* a copy). * a copy).
*/ */
REGION_SUBTRACT(pScreen, &updateRegion, &updateRegion, &updateCopyRegion); sraRgnSubtract(updateRegion,updateCopyRegion);
/* /*
* Finally we leave modifiedRegion to be the remainder (if any) of parts of * Finally we leave modifiedRegion to be the remainder (if any) of parts of
...@@ -911,19 +897,15 @@ rfbSendFramebufferUpdate(cl, updateRegion) ...@@ -911,19 +897,15 @@ rfbSendFramebufferUpdate(cl, updateRegion)
*/ */
REGION_UNION(pScreen, &cl->modifiedRegion, &cl->modifiedRegion, sraRgnOr(cl->modifiedRegion,cl->copyRegion);
&cl->copyRegion); sraRgnSubtract(cl->modifiedRegion,updateRegion);
REGION_SUBTRACT(pScreen, &cl->modifiedRegion, &cl->modifiedRegion, sraRgnSubtract(cl->modifiedRegion,updateCopyRegion);
&updateRegion);
REGION_SUBTRACT(pScreen, &cl->modifiedRegion, &cl->modifiedRegion,
&updateCopyRegion);
REGION_EMPTY(pScreen, &cl->requestedRegion); sraRgnMakeEmpty(cl->requestedRegion);
REGION_EMPTY(pScreen, &cl->copyRegion); sraRgnMakeEmpty(cl->copyRegion);
cl->copyDX = 0; cl->copyDX = 0;
cl->copyDY = 0; cl->copyDY = 0;
/* /*
* Now send the update. * Now send the update.
*/ */
...@@ -933,32 +915,32 @@ rfbSendFramebufferUpdate(cl, updateRegion) ...@@ -933,32 +915,32 @@ rfbSendFramebufferUpdate(cl, updateRegion)
if (cl->preferredEncoding == rfbEncodingCoRRE) { if (cl->preferredEncoding == rfbEncodingCoRRE) {
nUpdateRegionRects = 0; nUpdateRegionRects = 0;
for (i = 0; i < REGION_NUM_RECTS(&updateRegion); i++) { for(i = sraRgnGetIterator(updateRegion); sraRgnIteratorNext(i,&rect);){
int x = REGION_RECTS(&updateRegion)[i].x1; int x = rect.x1;
int y = REGION_RECTS(&updateRegion)[i].y1; int y = rect.y1;
int w = REGION_RECTS(&updateRegion)[i].x2 - x; int w = rect.x2 - x;
int h = REGION_RECTS(&updateRegion)[i].y2 - y; int h = rect.y2 - y;
nUpdateRegionRects += (((w-1) / cl->correMaxWidth + 1) nUpdateRegionRects += (((w-1) / cl->correMaxWidth + 1)
* ((h-1) / cl->correMaxHeight + 1)); * ((h-1) / cl->correMaxHeight + 1));
} }
} else if (cl->preferredEncoding == rfbEncodingZlib) { } else if (cl->preferredEncoding == rfbEncodingZlib) {
nUpdateRegionRects = 0; nUpdateRegionRects = 0;
for (i = 0; i < REGION_NUM_RECTS(&updateRegion); i++) { for(i = sraRgnGetIterator(updateRegion); sraRgnIteratorNext(i,&rect);){
int x = REGION_RECTS(&updateRegion)[i].x1; int x = rect.x1;
int y = REGION_RECTS(&updateRegion)[i].y1; int y = rect.y1;
int w = REGION_RECTS(&updateRegion)[i].x2 - x; int w = rect.x2 - x;
int h = REGION_RECTS(&updateRegion)[i].y2 - y; int h = rect.y2 - y;
nUpdateRegionRects += (((h-1) / (ZLIB_MAX_SIZE( w ) / w)) + 1); nUpdateRegionRects += (((h-1) / (ZLIB_MAX_SIZE( w ) / w)) + 1);
} }
} else if (cl->preferredEncoding == rfbEncodingTight) { } else if (cl->preferredEncoding == rfbEncodingTight) {
nUpdateRegionRects = 0; nUpdateRegionRects = 0;
for (i = 0; i < REGION_NUM_RECTS(&updateRegion); i++) { for(i = sraRgnGetIterator(updateRegion); sraRgnIteratorNext(i,&rect);){
int x = REGION_RECTS(&updateRegion)[i].x1; int x = rect.x1;
int y = REGION_RECTS(&updateRegion)[i].y1; int y = rect.y1;
int w = REGION_RECTS(&updateRegion)[i].x2 - x; int w = rect.x2 - x;
int h = REGION_RECTS(&updateRegion)[i].y2 - y; int h = rect.y2 - y;
int n = rfbNumCodedRectsTight(cl, x, y, w, h); int n = rfbNumCodedRectsTight(cl, x, y, w, h);
if (n == 0) { if (n == 0) {
nUpdateRegionRects = 0xFFFF; nUpdateRegionRects = 0xFFFF;
...@@ -967,12 +949,12 @@ rfbSendFramebufferUpdate(cl, updateRegion) ...@@ -967,12 +949,12 @@ rfbSendFramebufferUpdate(cl, updateRegion)
nUpdateRegionRects += n; nUpdateRegionRects += n;
} }
} else { } else {
nUpdateRegionRects = REGION_NUM_RECTS(&updateRegion); nUpdateRegionRects = sraRgnCountRects(updateRegion);
} }
fu->type = rfbFramebufferUpdate; fu->type = rfbFramebufferUpdate;
if (nUpdateRegionRects != 0xFFFF) { if (nUpdateRegionRects != 0xFFFF) {
fu->nRects = Swap16IfLE(REGION_NUM_RECTS(&updateCopyRegion) fu->nRects = Swap16IfLE(sraRgnCountRects(updateCopyRegion)
+ nUpdateRegionRects + !!sendCursorShape); + nUpdateRegionRects + !!sendCursorShape);
} else { } else {
fu->nRects = 0xFFFF; fu->nRects = 0xFFFF;
...@@ -985,21 +967,21 @@ rfbSendFramebufferUpdate(cl, updateRegion) ...@@ -985,21 +967,21 @@ rfbSendFramebufferUpdate(cl, updateRegion)
return FALSE; return FALSE;
} }
if (REGION_NOTEMPTY(pScreen,&updateCopyRegion)) { if (!sraRgnEmpty(updateCopyRegion)) {
if (!rfbSendCopyRegion(cl,&updateCopyRegion,dx,dy)) { if (!rfbSendCopyRegion(cl,updateCopyRegion,dx,dy)) {
REGION_UNINIT(pScreen,&updateRegion); sraRgnDestroy(updateRegion);
REGION_UNINIT(pScreen,&updateCopyRegion); sraRgnDestroy(updateCopyRegion);
return FALSE; return FALSE;
} }
} }
REGION_UNINIT(pScreen,&updateCopyRegion); sraRgnDestroy(updateCopyRegion);
for (i = 0; i < REGION_NUM_RECTS(&updateRegion); i++) { for(i = sraRgnGetIterator(updateRegion); sraRgnIteratorNext(i,&rect);){
int x = REGION_RECTS(&updateRegion)[i].x1; int x = rect.x1;
int y = REGION_RECTS(&updateRegion)[i].y1; int y = rect.y1;
int w = REGION_RECTS(&updateRegion)[i].x2 - x; int w = rect.x2 - x;
int h = REGION_RECTS(&updateRegion)[i].y2 - y; int h = rect.y2 - y;
cl->rfbRawBytesEquivalent += (sz_rfbFramebufferUpdateRectHeader cl->rfbRawBytesEquivalent += (sz_rfbFramebufferUpdateRectHeader
+ w * (cl->format.bitsPerPixel / 8) * h); + w * (cl->format.bitsPerPixel / 8) * h);
...@@ -1027,13 +1009,13 @@ rfbSendFramebufferUpdate(cl, updateRegion) ...@@ -1027,13 +1009,13 @@ rfbSendFramebufferUpdate(cl, updateRegion)
break; break;
case rfbEncodingZlib: case rfbEncodingZlib:
if (!rfbSendRectEncodingZlib(cl, x, y, w, h)) { if (!rfbSendRectEncodingZlib(cl, x, y, w, h)) {
REGION_UNINIT(pScreen,&updateRegion); sraRgnDestroy(updateRegion);
return FALSE; return FALSE;
} }
break; break;
case rfbEncodingTight: case rfbEncodingTight:
if (!rfbSendRectEncodingTight(cl, x, y, w, h)) { if (!rfbSendRectEncodingTight(cl, x, y, w, h)) {
REGION_UNINIT(pScreen,&updateRegion); sraRgnDestroy(updateRegion);
return FALSE; return FALSE;
} }
break; break;
...@@ -1051,10 +1033,8 @@ rfbSendFramebufferUpdate(cl, updateRegion) ...@@ -1051,10 +1033,8 @@ rfbSendFramebufferUpdate(cl, updateRegion)
if(cursorWasDrawn != cl->screen->cursorIsDrawn) { if(cursorWasDrawn != cl->screen->cursorIsDrawn) {
if(cursorWasDrawn) if(cursorWasDrawn)
rfbDrawCursor(cl); rfbDrawCursor(cl);
//fprintf(stderr,"rfbSpriteRestoreCursor(pScreen); not yet!!\n");
else else
rfbUndrawCursor(cl); rfbUndrawCursor(cl);
//fprintf(stderr,"rfbSpriteRemoveCursor(pScreen); not yet!!\n");
} }
return TRUE; return TRUE;
...@@ -1071,86 +1051,43 @@ rfbSendFramebufferUpdate(cl, updateRegion) ...@@ -1071,86 +1051,43 @@ rfbSendFramebufferUpdate(cl, updateRegion)
Bool Bool
rfbSendCopyRegion(cl, reg, dx, dy) rfbSendCopyRegion(cl, reg, dx, dy)
rfbClientPtr cl; rfbClientPtr cl;
RegionPtr reg; sraRegionPtr reg;
int dx, dy; int dx, dy;
{ {
int nrects, nrectsInBand, x_inc, y_inc, thisRect, firstInNextBand;
int x, y, w, h; int x, y, w, h;
rfbFramebufferUpdateRectHeader rect; rfbFramebufferUpdateRectHeader rect;
rfbCopyRect cr; rfbCopyRect cr;
sraRectangleIterator* i;
sraRect rect1;
nrects = REGION_NUM_RECTS(reg); i = sraRgnGetReverseIterator(reg,dx<0,dy<0);
if (dx <= 0) { while(sraRgnIteratorNext(i,&rect1)) {
x_inc = 1; x = rect1.x1;
} else { y = rect1.y1;
x_inc = -1; w = rect1.x2 - x;
} h = rect1.y2 - y;
if (dy <= 0) { rect.r.x = Swap16IfLE(x);
thisRect = 0; rect.r.y = Swap16IfLE(y);
y_inc = 1; rect.r.w = Swap16IfLE(w);
} else { rect.r.h = Swap16IfLE(h);
thisRect = nrects - 1; rect.encoding = Swap32IfLE(rfbEncodingCopyRect);
y_inc = -1;
}
while (nrects > 0) { memcpy(&cl->updateBuf[cl->ublen], (char *)&rect,
sz_rfbFramebufferUpdateRectHeader);
cl->ublen += sz_rfbFramebufferUpdateRectHeader;
firstInNextBand = thisRect; cr.srcX = Swap16IfLE(x - dx);
nrectsInBand = 0; cr.srcY = Swap16IfLE(y - dy);
while ((nrects > 0) && memcpy(&cl->updateBuf[cl->ublen], (char *)&cr, sz_rfbCopyRect);
(REGION_RECTS(reg)[firstInNextBand].y1 cl->ublen += sz_rfbCopyRect;
== REGION_RECTS(reg)[thisRect].y1))
{
firstInNextBand += y_inc;
nrects--;
nrectsInBand++;
}
if (x_inc != y_inc) { cl->rfbRectanglesSent[rfbEncodingCopyRect]++;
thisRect = firstInNextBand - y_inc; cl->rfbBytesSent[rfbEncodingCopyRect]
} += sz_rfbFramebufferUpdateRectHeader + sz_rfbCopyRect;
while (nrectsInBand > 0) {
if ((cl->ublen + sz_rfbFramebufferUpdateRectHeader
+ sz_rfbCopyRect) > UPDATE_BUF_SIZE)
{
if (!rfbSendUpdateBuf(cl))
return FALSE;
}
x = REGION_RECTS(reg)[thisRect].x1;
y = REGION_RECTS(reg)[thisRect].y1;
w = REGION_RECTS(reg)[thisRect].x2 - x;
h = REGION_RECTS(reg)[thisRect].y2 - y;
rect.r.x = Swap16IfLE(x);
rect.r.y = Swap16IfLE(y);
rect.r.w = Swap16IfLE(w);
rect.r.h = Swap16IfLE(h);
rect.encoding = Swap32IfLE(rfbEncodingCopyRect);
memcpy(&cl->updateBuf[cl->ublen], (char *)&rect,
sz_rfbFramebufferUpdateRectHeader);
cl->ublen += sz_rfbFramebufferUpdateRectHeader;
cr.srcX = Swap16IfLE(x - dx);
cr.srcY = Swap16IfLE(y - dy);
memcpy(&cl->updateBuf[cl->ublen], (char *)&cr, sz_rfbCopyRect);
cl->ublen += sz_rfbCopyRect;
cl->rfbRectanglesSent[rfbEncodingCopyRect]++;
cl->rfbBytesSent[rfbEncodingCopyRect]
+= sz_rfbFramebufferUpdateRectHeader + sz_rfbCopyRect;
thisRect += x_inc;
nrectsInBand--;
}
thisRect = firstInNextBand;
} }
return TRUE; return TRUE;
......
/* -=- sraRegion.c
* Copyright (c) 2001 James "Wez" Weatherall, Johannes E. Schindelin
*
* A general purpose region clipping library
* Only deals with rectangular regions, though.
*/
#include "rfb.h"
#include "sraRegion.h"
#include <stdlib.h>
#include <stdio.h>
/* -=- Internal Span structure */
struct sraRegion;
typedef struct sraSpan {
struct sraSpan *_next;
struct sraSpan *_prev;
int start;
int end;
struct sraRegion *subspan;
} sraSpan;
typedef struct sraRegion {
sraSpan front;
sraSpan back;
} sraSpanList;
/* -=- Span routines */
sraSpanList *sraSpanListDup(const sraSpanList *src);
void sraSpanListDestroy(sraSpanList *list);
sraSpan *
sraSpanCreate(int start, int end, const sraSpanList *subspan) {
sraSpan *item = (sraSpan*)malloc(sizeof(sraSpan));
item->_next = item->_prev = NULL;
item->start = start;
item->end = end;
item->subspan = sraSpanListDup(subspan);
return item;
}
sraSpan *
sraSpanDup(const sraSpan *src) {
sraSpan *span;
if (!src) return NULL;
span = sraSpanCreate(src->start, src->end, src->subspan);
return span;
}
void
sraSpanInsertAfter(sraSpan *newspan, sraSpan *after) {
newspan->_next = after->_next;
newspan->_prev = after;
after->_next->_prev = newspan;
after->_next = newspan;
}
void
sraSpanInsertBefore(sraSpan *newspan, sraSpan *before) {
newspan->_next = before;
newspan->_prev = before->_prev;
before->_prev->_next = newspan;
before->_prev = newspan;
}
void
sraSpanRemove(sraSpan *span) {
span->_prev->_next = span->_next;
span->_next->_prev = span->_prev;
}
void
sraSpanDestroy(sraSpan *span) {
if (span->subspan) sraSpanListDestroy(span->subspan);
xfree(span);
}
void
sraSpanCheck(const sraSpan *span, const char *text) {
// Check the span is valid!
if (span->start == span->end) {
printf(text);
printf(":%d-%d\n", span->start, span->end);
exit(0);
}
}
/* -=- SpanList routines */
void sraSpanPrint(const sraSpan *s);
void
sraSpanListPrint(const sraSpanList *l) {
sraSpan *curr;
if (!l) {
printf("NULL");
return;
}
curr = l->front._next;
printf("[");
while (curr != &(l->back)) {
sraSpanPrint(curr);
curr = curr->_next;
}
printf("]");
}
void
sraSpanPrint(const sraSpan *s) {
printf("(%d-%d)", (s->start), (s->end));
if (s->subspan)
sraSpanListPrint(s->subspan);
}
sraSpanList *
sraSpanListCreate() {
sraSpanList *item = (sraSpanList*)malloc(sizeof(sraSpanList));
item->front._next = &(item->back);
item->front._prev = NULL;
item->back._prev = &(item->front);
item->back._next = NULL;
return item;
}
sraSpanList *
sraSpanListDup(const sraSpanList *src) {
sraSpanList *newlist;
sraSpan *newspan, *curr;
if (!src) return NULL;
newlist = sraSpanListCreate();
curr = src->front._next;
while (curr != &(src->back)) {
newspan = sraSpanDup(curr);
sraSpanInsertBefore(newspan, &(newlist->back));
curr = curr->_next;
}
return newlist;
}
void
sraSpanListDestroy(sraSpanList *list) {
sraSpan *curr, *next;
while (list->front._next != &(list->back)) {
curr = list->front._next;
next = curr->_next;
sraSpanRemove(curr);
sraSpanDestroy(curr);
curr = next;
}
xfree(list);
}
void
sraSpanListMakeEmpty(sraSpanList *list) {
sraSpan *curr, *next;
while (list->front._next != &(list->back)) {
curr = list->front._next;
next = curr->_next;
sraSpanRemove(curr);
sraSpanDestroy(curr);
curr = next;
}
list->front._next = &(list->back);
list->front._prev = NULL;
list->back._prev = &(list->front);
list->back._next = NULL;
}
int sraMax(int a, int b) {return (a>b)?a:b;};
int sraMin(int a, int b) {return (a<b)?a:b;};
Bool
sraSpanListEqual(const sraSpanList *s1, const sraSpanList *s2) {
sraSpan *sp1, *sp2;
if (!s1) {
if (!s2) {
return 1;
} else {
printf("sraSpanListEqual:incompatible spans (only one NULL!)\n");
exit(1);
}
}
sp1 = s1->front._next;
sp2 = s2->front._next;
while ((sp1 != &(s1->back)) &&
(sp2 != &(s2->back))) {
if ((sp1->start != sp2->start) ||
(sp1->end != sp2->end) ||
(!sraSpanListEqual(sp1->subspan, sp2->subspan))) {
return 0;
}
sp1 = sp1->_next;
sp2 = sp2->_next;
}
if ((sp1 == &(s1->back)) && (sp2 == &(s2->back))) {
return 1;
} else {
return 0;
}
}
Bool
sraSpanListEmpty(const sraSpanList *list) {
return (list->front._next == &(list->back));
}
unsigned long
sraSpanListCount(const sraSpanList *list) {
sraSpan *curr = list->front._next;
unsigned long count = 0;
while (curr != &(list->back)) {
if (curr->subspan) {
count += sraSpanListCount(curr->subspan);
} else {
count += 1;
}
curr = curr->_next;
}
return count;
}
void
sraSpanMergePrevious(sraSpan *dest) {
sraSpan *prev = dest->_prev;
while ((prev->end == dest->start) &&
(prev->_prev) &&
(sraSpanListEqual(prev->subspan, dest->subspan))) {
/*
printf("merge_prev:");
sraSpanPrint(prev);
printf(" & ");
sraSpanPrint(dest);
printf("\n");
*/
dest->start = prev->start;
sraSpanRemove(prev);
sraSpanDestroy(prev);
prev = dest->_prev;
}
}
void
sraSpanMergeNext(sraSpan *dest) {
sraSpan *next = dest->_next;
while ((next->start == dest->end) &&
(next->_next) &&
(sraSpanListEqual(next->subspan, dest->subspan))) {
/*
printf("merge_next:");
sraSpanPrint(dest);
printf(" & ");
sraSpanPrint(next);
printf("\n");
*/
dest->end = next->end;
sraSpanRemove(next);
sraSpanDestroy(next);
next = dest->_next;
}
}
void
sraSpanListOr(sraSpanList *dest, const sraSpanList *src) {
sraSpan *d_curr, *s_curr;
int s_start, s_end;
if (!dest) {
if (!src) {
return;
} else {
printf("sraSpanListOr:incompatible spans (only one NULL!)\n");
exit(1);
}
}
d_curr = dest->front._next;
s_curr = src->front._next;
s_start = s_curr->start;
s_end = s_curr->end;
while (s_curr != &(src->back)) {
// - If we are at end of destination list OR
// If the new span comes before the next destination one
if ((d_curr == &(dest->back)) ||
(d_curr->start >= s_end)) {
// - Add the span
sraSpanInsertBefore(sraSpanCreate(s_start, s_end,
s_curr->subspan),
d_curr);
if (d_curr != &(dest->back))
sraSpanMergePrevious(d_curr);
s_curr = s_curr->_next;
s_start = s_curr->start;
s_end = s_curr->end;
} else {
// - If the new span overlaps the existing one
if ((s_start < d_curr->end) &&
(s_end > d_curr->start)) {
// - Insert new span before the existing destination one?
if (s_start < d_curr->start) {
sraSpanInsertBefore(sraSpanCreate(s_start,
d_curr->start,
s_curr->subspan),
d_curr);
sraSpanMergePrevious(d_curr);
}
// Split the existing span if necessary
if (s_end < d_curr->end) {
sraSpanInsertAfter(sraSpanCreate(s_end,
d_curr->end,
d_curr->subspan),
d_curr);
d_curr->end = s_end;
}
if (s_start > d_curr->start) {
sraSpanInsertBefore(sraSpanCreate(d_curr->start,
s_start,
d_curr->subspan),
d_curr);
d_curr->start = s_start;
}
// Recursively OR subspans
sraSpanListOr(d_curr->subspan, s_curr->subspan);
// Merge this span with previous or next?
if (d_curr->_prev != &(dest->front))
sraSpanMergePrevious(d_curr);
if (d_curr->_next != &(dest->back))
sraSpanMergeNext(d_curr);
// Move onto the next pair to compare
if (s_end > d_curr->end) {
s_start = d_curr->end;
d_curr = d_curr->_next;
} else {
s_curr = s_curr->_next;
s_start = s_curr->start;
s_end = s_curr->end;
}
} else {
// - No overlap. Move to the next destination span
d_curr = d_curr->_next;
}
}
}
}
Bool
sraSpanListAnd(sraSpanList *dest, const sraSpanList *src) {
sraSpan *d_curr, *s_curr, *d_next;
if (!dest) {
if (!src) {
return 1;
} else {
printf("sraSpanListAnd:incompatible spans (only one NULL!)\n");
exit(1);
}
}
d_curr = dest->front._next;
s_curr = src->front._next;
while ((s_curr != &(src->back)) && (d_curr != &(dest->back))) {
// - If we haven't reached a destination span yet then move on
if (d_curr->start >= s_curr->end) {
s_curr = s_curr->_next;
continue;
}
// - If we are beyond the current destination span then remove it
if (d_curr->end <= s_curr->start) {
sraSpan *next = d_curr->_next;
sraSpanRemove(d_curr);
sraSpanDestroy(d_curr);
d_curr = next;
continue;
}
// - If we partially overlap a span then split it up or remove bits
if (s_curr->start > d_curr->start) {
// - The top bit of the span does not match
d_curr->start = s_curr->start;
}
if (s_curr->end < d_curr->end) {
// - The end of the span does not match
sraSpanInsertAfter(sraSpanCreate(s_curr->end,
d_curr->end,
d_curr->subspan),
d_curr);
d_curr->end = s_curr->end;
}
// - Now recursively process the affected span
if (!sraSpanListAnd(d_curr->subspan, s_curr->subspan)) {
// - The destination subspan is now empty, so we should remove it
sraSpan *next = d_curr->_next;
sraSpanRemove(d_curr);
sraSpanDestroy(d_curr);
d_curr = next;
} else {
// Merge this span with previous or next?
if (d_curr->_prev != &(dest->front))
sraSpanMergePrevious(d_curr);
// - Move on to the next span
d_next = d_curr;
if (s_curr->end >= d_curr->end) {
d_next = d_curr->_next;
}
if (s_curr->end <= d_curr->end) {
s_curr = s_curr->_next;
}
d_curr = d_next;
}
}
while (d_curr != &(dest->back)) {
sraSpan *next = d_curr->_next;
sraSpanRemove(d_curr);
sraSpanDestroy(d_curr);
d_curr=next;
}
return !sraSpanListEmpty(dest);
}
Bool
sraSpanListSubtract(sraSpanList *dest, const sraSpanList *src) {
sraSpan *d_curr, *s_curr;
if (!dest) {
if (!src) {
return 1;
} else {
printf("sraSpanListSubtract:incompatible spans (only one NULL!)\n");
exit(1);
}
}
d_curr = dest->front._next;
s_curr = src->front._next;
while ((s_curr != &(src->back)) && (d_curr != &(dest->back))) {
// - If we haven't reached a destination span yet then move on
if (d_curr->start >= s_curr->end) {
s_curr = s_curr->_next;
continue;
}
// - If we are beyond the current destination span then skip it
if (d_curr->end <= s_curr->start) {
d_curr = d_curr->_next;
continue;
}
// - If we partially overlap the current span then split it up
if (s_curr->start > d_curr->start) {
sraSpanInsertBefore(sraSpanCreate(d_curr->start,
s_curr->start,
d_curr->subspan),
d_curr);
d_curr->start = s_curr->start;
}
if (s_curr->end < d_curr->end) {
sraSpanInsertAfter(sraSpanCreate(s_curr->end,
d_curr->end,
d_curr->subspan),
d_curr);
d_curr->end = s_curr->end;
}
// - Now recursively process the affected span
if ((!d_curr->subspan) || !sraSpanListSubtract(d_curr->subspan, s_curr->subspan)) {
// - The destination subspan is now empty, so we should remove it
sraSpan *next = d_curr->_next;
sraSpanRemove(d_curr);
sraSpanDestroy(d_curr);
d_curr = next;
} else {
// Merge this span with previous or next?
if (d_curr->_prev != &(dest->front))
sraSpanMergePrevious(d_curr);
if (d_curr->_next != &(dest->back))
sraSpanMergeNext(d_curr);
// - Move on to the next span
if (s_curr->end > d_curr->end) {
d_curr = d_curr->_next;
} else {
s_curr = s_curr->_next;
}
}
}
return !sraSpanListEmpty(dest);
}
/* -=- Region routines */
sraRegion *
sraRgnCreate() {
return (sraRegion*)sraSpanListCreate();
}
sraRegion *
sraRgnCreateRect(int x1, int y1, int x2, int y2) {
sraSpanList *vlist, *hlist;
sraSpan *vspan, *hspan;
/* - Build the horizontal portion of the span */
hlist = sraSpanListCreate();
hspan = sraSpanCreate(x1, x2, NULL);
sraSpanInsertAfter(hspan, &(hlist->front));
/* - Build the vertical portion of the span */
vlist = sraSpanListCreate();
vspan = sraSpanCreate(y1, y2, hlist);
sraSpanInsertAfter(vspan, &(vlist->front));
sraSpanListDestroy(hlist);
return (sraRegion*)vlist;
}
sraRegion *
sraRgnCreateRgn(const sraRegion *src) {
return (sraRegion*)sraSpanListDup((sraSpanList*)src);
}
void
sraRgnDestroy(sraRegion *rgn) {
sraSpanListDestroy((sraSpanList*)rgn);
}
void
sraRgnMakeEmpty(sraRegion *rgn) {
sraSpanListMakeEmpty((sraSpanList*)rgn);
}
/* -=- Boolean Region ops */
Bool
sraRgnAnd(sraRegion *dst, const sraRegion *src) {
return sraSpanListAnd((sraSpanList*)dst, (sraSpanList*)src);
}
void
sraRgnOr(sraRegion *dst, const sraRegion *src) {
sraSpanListOr((sraSpanList*)dst, (sraSpanList*)src);
}
Bool
sraRgnSubtract(sraRegion *dst, const sraRegion *src) {
return sraSpanListSubtract((sraSpanList*)dst, (sraSpanList*)src);
}
void
sraRgnOffset(sraRegion *dst, int dx, int dy) {
sraSpan *vcurr, *hcurr;
vcurr = ((sraSpanList*)dst)->front._next;
while (vcurr != &(((sraSpanList*)dst)->back)) {
vcurr->start += dy;
vcurr->end += dy;
hcurr = vcurr->subspan->front._next;
while (hcurr != &(vcurr->subspan->back)) {
hcurr->start += dx;
hcurr->end += dx;
hcurr = hcurr->_next;
}
vcurr = vcurr->_next;
}
}
Bool
sraRgnPopRect(sraRegion *rgn, sraRect *rect, unsigned long flags) {
sraSpan *vcurr, *hcurr;
sraSpan *vend, *hend;
Bool right2left = flags & 2;
Bool bottom2top = flags & 1;
// - Pick correct order
if (bottom2top) {
vcurr = ((sraSpanList*)rgn)->back._prev;
vend = &(((sraSpanList*)rgn)->front);
} else {
vcurr = ((sraSpanList*)rgn)->front._next;
vend = &(((sraSpanList*)rgn)->back);
}
if (vcurr != vend) {
rect->y1 = vcurr->start;
rect->y2 = vcurr->end;
// - Pick correct order
if (right2left) {
hcurr = vcurr->subspan->back._prev;
hend = &(vcurr->subspan->front);
} else {
hcurr = vcurr->subspan->front._next;
hend = &(vcurr->subspan->back);
}
if (hcurr != hend) {
rect->x1 = hcurr->start;
rect->x2 = hcurr->end;
sraSpanRemove(hcurr);
sraSpanDestroy(hcurr);
if (sraSpanListEmpty(vcurr->subspan)) {
sraSpanRemove(vcurr);
sraSpanDestroy(vcurr);
}
#if 0
printf("poprect:(%dx%d)-(%dx%d)\n",
rect->x1, rect->y1, rect->x2, rect->y2);
#endif
return 1;
}
}
return 0;
}
unsigned long
sraRgnCountRects(const sraRegion *rgn) {
unsigned long count = sraSpanListCount((sraSpanList*)rgn);
return count;
}
Bool
sraRgnEmpty(const sraRegion *rgn) {
return sraSpanListEmpty((sraSpanList*)rgn);
}
/* iterator stuff */
sraRectangleIterator *sraRgnGetIterator(sraRegion *s)
{
/* these values have to be multiples of 4 */
#define DEFSIZE 4
#define DEFSTEP 8
sraRectangleIterator *i =
(sraRectangleIterator*)malloc(sizeof(sraRectangleIterator));
if(!i)
return(0);
/* we have to recurse eventually. So, the first sPtr is the pointer to
the sraSpan in the first level. the second sPtr is the pointer to
the sraRegion.back. The third and fourth sPtr are for the second
recursion level and so on. */
i->sPtrs = (sraSpan**)malloc(sizeof(sraSpan*)*DEFSIZE);
if(!i->sPtrs) {
free(i);
return(0);
}
i->ptrSize = DEFSIZE;
i->sPtrs[0] = &(s->front);
i->sPtrs[1] = &(s->back);
i->ptrPos = 0;
i->reverseX = 0;
i->reverseY = 0;
return(i);
}
sraRectangleIterator *sraRgnGetReverseIterator(sraRegion *s,Bool reverseX,Bool reverseY)
{
sraRectangleIterator *i = sraRgnGetIterator(s);
if(reverseY) {
i->sPtrs[1] = &(s->front);
i->sPtrs[0] = &(s->back);
}
i->reverseX = reverseX;
i->reverseY = reverseY;
return(i);
}
Bool sraReverse(sraRectangleIterator *i)
{
return( ((i->ptrPos&2) && i->reverseX) ||
(!(i->ptrPos&2) && i->reverseY));
}
sraSpan* sraNextSpan(sraRectangleIterator *i)
{
if(sraReverse(i))
return(i->sPtrs[i->ptrPos]->_prev);
else
return(i->sPtrs[i->ptrPos]->_next);
}
Bool sraRgnIteratorNext(sraRectangleIterator* i,sraRect* r)
{
/* is the subspan finished? */
while(sraNextSpan(i) == i->sPtrs[i->ptrPos+1]) {
i->ptrPos -= 2;
if(i->ptrPos < 0) /* the end */
return(0);
}
i->sPtrs[i->ptrPos] = sraNextSpan(i);
/* is this a new subspan? */
while(i->sPtrs[i->ptrPos]->subspan) {
if(i->ptrPos+2 > i->ptrSize) { /* array is too small */
i->ptrSize += DEFSTEP;
i->sPtrs = (sraSpan**)realloc(i->sPtrs, sizeof(sraSpan*)*i->ptrSize);
}
i->ptrPos =+ 2;
if(sraReverse(i)) {
i->sPtrs[i->ptrPos] = i->sPtrs[i->ptrPos-2]->subspan->back._prev;
i->sPtrs[i->ptrPos+1] = &(i->sPtrs[i->ptrPos-2]->subspan->front);
} else {
i->sPtrs[i->ptrPos] = i->sPtrs[i->ptrPos-2]->subspan->front._next;
i->sPtrs[i->ptrPos+1] = &(i->sPtrs[i->ptrPos-2]->subspan->back);
}
}
if((i->ptrPos%4)!=2) {
fprintf(stderr,"sraRgnIteratorNext: offset is wrong (%d%%4!=2)\n",i->ptrPos);
exit(-1);
}
r->y1 = i->sPtrs[i->ptrPos-2]->start;
r->y2 = i->sPtrs[i->ptrPos-2]->end;
r->x1 = i->sPtrs[i->ptrPos]->start;
r->x2 = i->sPtrs[i->ptrPos]->end;
return(-1);
}
void sraRgnReleaseIterator(sraRectangleIterator* i)
{
free(i->sPtrs);
free(i);
}
void
sraRgnPrint(const sraRegion *rgn) {
sraSpanListPrint((sraSpanList*)rgn);
}
Bool
sraClipRect(int *x, int *y, int *w, int *h,
int cx, int cy, int cw, int ch) {
if (*x < cx) {
*w -= (cx-*x);
*x = cx;
}
if (*y < cy) {
*h -= (cy-*y);
*y = cy;
}
if (*x+*w > cx+cw) {
*w = (cx+cw)-*x;
}
if (*y+*h > cy+ch) {
*h = (cy+ch)-*y;
}
return (*w>0) && (*h>0);
}
/* test */
#ifdef SRA_TEST
/* pipe the output to sort|uniq -u and you'll get the errors. */
int main(int argc, char** argv)
{
sraRegionPtr region, region1, region2;
sraRectangleIterator* i;
sraRect rect;
Bool b;
region = sraRgnCreateRect(10, 10, 600, 300);
region1 = sraRgnCreateRect(40, 50, 350, 200);
region2 = sraRgnCreateRect(0, 0, 20, 40);
sraRgnPrint(region);
printf("\n[(10-300)[(10-600)]]\n\n");
b = sraRgnSubtract(region, region1);
printf("%s ",b?"true":"false");
sraRgnPrint(region);
printf("\ntrue [(10-50)[(10-600)](50-200)[(10-40)(350-600)](200-300)[(10-600)]]\n\n");
sraRgnOr(region, region2);
printf("%ld\n6\n\n", sraRgnCountRects(region));
i = sraRgnGetIterator(region);
while(sraRgnIteratorNext(i, &rect))
printf("%dx%d+%d+%d ",
rect.x2-rect.x1,rect.y2-rect.y1,
rect.x1,rect.y1);
sraRgnReleaseIterator(i);
printf("\n20x10+0+0 600x30+0+10 590x10+10+40 30x150+10+50 250x150+350+50 590x100+10+200\n\n");
i = sraRgnGetReverseIterator(region,1,0);
while(sraRgnIteratorNext(i, &rect))
printf("%dx%d+%d+%d ",
rect.x2-rect.x1,rect.y2-rect.y1,
rect.x1,rect.y1);
sraRgnReleaseIterator(i);
printf("\n20x10+0+0 600x30+0+10 590x10+10+40 250x150+350+50 30x150+10+50 590x100+10+200\n\n");
i = sraRgnGetReverseIterator(region,1,1);
while(sraRgnIteratorNext(i, &rect))
printf("%dx%d+%d+%d ",
rect.x2-rect.x1,rect.y2-rect.y1,
rect.x1,rect.y1);
sraRgnReleaseIterator(i);
printf("\n590x100+10+200 250x150+350+50 30x150+10+50 590x10+10+40 600x30+0+10 20x10+0+0\n\n");
return(0);
}
#endif
/* -=- SRA - Simple Region Algorithm
* A simple rectangular region implementation.
* Copyright (c) 2001 James "Wez" Weatherall, Johannes E. Schindelin
*/
/* -=- sraRect */
typedef struct _rect {
int x1;
int y1;
int x2;
int y2;
} sraRect;
//struct sraRegion;
typedef struct sraRegion sraRegion;
/* -=- Region manipulation functions */
extern sraRegion *sraRgnCreate();
extern sraRegion *sraRgnCreateRect(int x1, int y1, int x2, int y2);
extern sraRegion *sraRgnCreateRgn(const sraRegion *src);
extern void sraRgnDestroy(sraRegion *rgn);
extern void sraRgnMakeEmpty(sraRegion *rgn);
extern Bool sraRgnAnd(sraRegion *dst, const sraRegion *src);
extern void sraRgnOr(sraRegion *dst, const sraRegion *src);
extern Bool sraRgnSubtract(sraRegion *dst, const sraRegion *src);
extern void sraRgnOffset(sraRegion *dst, int dx, int dy);
extern Bool sraRgnPopRect(sraRegion *region, sraRect *rect,
unsigned long flags);
extern unsigned long sraRgnCountRects(const sraRegion *rgn);
extern Bool sraRgnEmpty(const sraRegion *rgn);
/* -=- rectangle iterator */
typedef struct sraRectangleIterator {
Bool reverseX,reverseY;
int ptrSize,ptrPos;
struct sraSpan** sPtrs;
} sraRectangleIterator;
extern sraRectangleIterator *sraRgnGetIterator(sraRegion *s);
extern sraRectangleIterator *sraRgnGetReverseIterator(sraRegion *s,Bool reverseX,Bool reverseY);
extern Bool sraRgnIteratorNext(sraRectangleIterator *i,sraRect *r);
extern void sraRgnReleaseIterator(sraRectangleIterator *i);
void sraRgnPrint(const sraRegion *s);
/* -=- Rectangle clipper (for speed) */
extern Bool sraClipRect(int *x, int *y, int *w, int *h,
int cx, int cy, int cw, int ch);
...@@ -346,11 +346,9 @@ rfbSetClientColourMap(cl, firstColour, nColours) ...@@ -346,11 +346,9 @@ rfbSetClientColourMap(cl, firstColour, nColours)
[cl->format.bitsPerPixel / 16]) (&cl->translateLookupTable, [cl->format.bitsPerPixel / 16]) (&cl->translateLookupTable,
&rfbServerFormat, &cl->format); &rfbServerFormat, &cl->format);
REGION_UNINIT(pScreen,&cl->modifiedRegion); sraRgnDestroy(cl->modifiedRegion);
box.x1 = box.y1 = 0; cl->modifiedRegion =
box.x2 = rfbScreen.width; sraRgnCreateRect(0,0,rfbScreen.width,rfbScreen.height);
box.y2 = rfbScreen.height;
REGION_INIT(pScreen,&cl->modifiedRegion,&box,0);
return TRUE; return TRUE;
} }
......
/* XALLOC -- X's internal memory allocator. Why does it return unsigned
* long * instead of the more common char *? Well, if you read K&R you'll
* see they say that alloc must return a pointer "suitable for conversion"
* to whatever type you really want. In a full-blown generic allocator
* there's no way to solve the alignment problems without potentially
* wasting lots of space. But we have a more limited problem. We know
* we're only ever returning pointers to structures which will have to
* be long word aligned. So we are making a stronger guarantee. It might
* have made sense to make Xalloc return char * to conform with people's
* expectations of malloc, but this makes lint happier.
*/
#ifdef WIN32
#include <X11/Xwinsock.h>
#endif
#include "X11/Xos.h"
#include <stdio.h>
#include "Xserver/misc.h"
#include "X11/X.h"
#include "Xserver/input.h"
#include "Xserver/opaque.h"
#ifdef X_POSIX_C_SOURCE
#define _POSIX_C_SOURCE X_POSIX_C_SOURCE
#include <signal.h>
#undef _POSIX_C_SOURCE
#else
#if defined(X_NOT_POSIX) || defined(_POSIX_SOURCE)
#include <signal.h>
#else
#define _POSIX_SOURCE
#include <signal.h>
#undef _POSIX_SOURCE
#endif
#endif
#if !defined(SYSV) && !defined(AMOEBA) && !defined(_MINIX) && !defined(WIN32) && !defined(Lynx)
#include <sys/resource.h>
#endif
#include <time.h>
#include <sys/stat.h>
#include <ctype.h> /* for isspace */
#if NeedVarargsPrototypes
#include <stdarg.h>
#endif
#ifdef __sgi__
#undef abs
#endif
#include <stdlib.h>
#ifndef INTERNAL_MALLOC
Bool Must_have_memory = FALSE;
unsigned long *
Xalloc (amount)
unsigned long amount;
{
#if !defined(__STDC__) && !defined(AMOEBA)
char *malloc();
#endif
register pointer ptr;
if ((long)amount <= 0) {
return (unsigned long *)NULL;
}
/* aligned extra on long word boundary */
amount = (amount + (sizeof(long) - 1)) & ~(sizeof(long) - 1);
#ifdef MEMBUG
if (!Must_have_memory && Memory_fail &&
((random() % MEM_FAIL_SCALE) < Memory_fail))
return (unsigned long *)NULL;
#endif
if ((ptr = (pointer)malloc(amount))) {
return (unsigned long *)ptr;
}
if (Must_have_memory)
FatalError("Out of memory");
return (unsigned long *)NULL;
}
/*****************
* XNFalloc
* "no failure" realloc, alternate interface to Xalloc w/o Must_have_memory
*****************/
unsigned long *
XNFalloc (amount)
unsigned long amount;
{
#if !defined(__STDC__) && !defined(AMOEBA)
char *malloc();
#endif
register pointer ptr;
if ((long)amount <= 0)
{
return (unsigned long *)NULL;
}
/* aligned extra on long word boundary */
amount = (amount + (sizeof(long) - 1)) & ~(sizeof(long) - 1);
ptr = (pointer)malloc(amount);
if (!ptr)
{
FatalError("Out of memory");
}
return ((unsigned long *)ptr);
}
/*****************
* Xcalloc
*****************/
unsigned long *
Xcalloc (amount)
unsigned long amount;
{
unsigned long *ret;
ret = Xalloc (amount);
if (ret)
bzero ((char *) ret, (int) amount);
return ret;
}
/*****************
* Xrealloc
*****************/
unsigned long *
Xrealloc (ptr, amount)
register pointer ptr;
unsigned long amount;
{
#if !defined(__STDC__) && !defined(AMOEBA)
char *malloc();
char *realloc();
#endif
#ifdef MEMBUG
if (!Must_have_memory && Memory_fail &&
((random() % MEM_FAIL_SCALE) < Memory_fail))
return (unsigned long *)NULL;
#endif
if ((long)amount <= 0)
{
if (ptr && !amount)
free(ptr);
return (unsigned long *)NULL;
}
amount = (amount + (sizeof(long) - 1)) & ~(sizeof(long) - 1);
if (ptr)
ptr = (pointer)realloc((char *)ptr, amount);
else
ptr = (pointer)malloc(amount);
if (ptr)
return (unsigned long *)ptr;
if (Must_have_memory)
FatalError("Out of memory");
return (unsigned long *)NULL;
}
/*****************
* XNFrealloc
* "no failure" realloc, alternate interface to Xrealloc w/o Must_have_memory
*****************/
unsigned long *
XNFrealloc (ptr, amount)
register pointer ptr;
unsigned long amount;
{
if (( ptr = (pointer)Xrealloc( ptr, amount ) ) == NULL)
{
FatalError( "Out of memory" );
}
return ((unsigned long *)ptr);
}
/*****************
* Xfree
* calls free
*****************/
void
Xfree(ptr)
register pointer ptr;
{
if (ptr)
free((char *)ptr);
}
void
FatalError(char *f, ...)
{
va_list args;
fprintf(stderr, "\nFatal server error:\n");
va_start(args, f);
vfprintf(stderr, f, args);
va_end(args);
fprintf(stderr, "\n");
exit(1);
}
#endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment