Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
N
nx-libs
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
1
Issues
1
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
dimbor
nx-libs
Commits
2ba50086
Commit
2ba50086
authored
May 01, 2016
by
Mike Gabriel
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
hw/nxagent/NXdispatch.c: Shrink file, drop duplicate code that can identically…
hw/nxagent/NXdispatch.c: Shrink file, drop duplicate code that can identically be found in dix/dispatch.c.
parent
a4346133
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
150 additions
and
3454 deletions
+150
-3454
Imakefile
nx-X11/programs/Xserver/dix/Imakefile
+2
-2
dispatch.c
nx-X11/programs/Xserver/dix/dispatch.c
+31
-1
NXdispatch.c
nx-X11/programs/Xserver/hw/nxagent/NXdispatch.c
+117
-3451
No files found.
nx-X11/programs/Xserver/dix/Imakefile
View file @
2ba50086
...
...
@@ -15,6 +15,7 @@ FFS_OBJ = ffs.o
#if (!(defined(NXAgentServer) && NXAgentServer))
NXAGENT_SKIP_SRCS = \
dispatch.c \
events.c \
extension.c \
glyphcurs.c \
...
...
@@ -23,6 +24,7 @@ NXAGENT_SKIP_SRCS = \
window.c \
$(NULL)
NXAGENT_SKIP_OBJS = \
dispatch.o \
events.o \
extension.o \
glyphcurs.o \
...
...
@@ -38,7 +40,6 @@ SRCS = \
colormap.c \
cursor.c \
devices.c \
dispatch.c \
dixutils.c \
gc.c \
globals.c \
...
...
@@ -61,7 +62,6 @@ OBJS = \
colormap.o \
cursor.o \
devices.o \
dispatch.o \
dixutils.o \
gc.o \
globals.o \
...
...
nx-X11/programs/Xserver/dix/dispatch.c
View file @
2ba50086
...
...
@@ -209,6 +209,7 @@ UpdateCurrentTimeIf()
currentTime
=
systime
;
}
#ifndef NXAGENT_SERVER
void
InitSelections
()
{
...
...
@@ -217,6 +218,7 @@ InitSelections()
CurrentSelections
=
(
Selection
*
)
NULL
;
NumCurrentSelections
=
0
;
}
#endif
/* NXAGENT_SERVER */
void
FlushClientCaches
(
XID
id
)
...
...
@@ -349,6 +351,7 @@ SmartScheduleClient (int *clientReady, int nready)
}
#endif
#ifndef NXAGENT_SERVER
#define MAJOROP ((xReq *)client->requestBuffer)->reqType
void
...
...
@@ -485,6 +488,7 @@ Dispatch(void)
}
#undef MAJOROP
#endif
/* NXAGENT_SERVER */
int
ProcBadRequest
(
ClientPtr
client
)
...
...
@@ -639,6 +643,7 @@ ProcChangeSaveSet(register ClientPtr client)
}
}
#ifndef NXAGENT_SERVER
int
ProcReparentWindow
(
register
ClientPtr
client
)
{
...
...
@@ -673,6 +678,7 @@ ProcReparentWindow(register ClientPtr client)
else
return
(
BadMatch
);
}
#endif
/* NXAGENT_SERVER */
int
ProcMapWindow
(
register
ClientPtr
client
)
...
...
@@ -790,6 +796,7 @@ GetGeometry(register ClientPtr client, xGetGeometryReply *rep)
REQUEST_SIZE_MATCH
(
xResourceReq
);
SECURITY_VERIFY_GEOMETRABLE
(
pDraw
,
stuff
->
id
,
client
,
SecurityReadAccess
);
memset
(
rep
,
0
,
sizeof
(
xGetGeometryReply
));
rep
->
type
=
X_Reply
;
rep
->
length
=
0
;
rep
->
sequenceNumber
=
client
->
sequence
;
...
...
@@ -829,7 +836,6 @@ ProcGetGeometry(register ClientPtr client)
xGetGeometryReply
rep
;
int
status
;
memset
(
&
rep
,
0
,
sizeof
(
xGetGeometryReply
));
if
((
status
=
GetGeometry
(
client
,
&
rep
))
!=
Success
)
return
status
;
...
...
@@ -838,6 +844,7 @@ ProcGetGeometry(register ClientPtr client)
}
#ifndef NXAGENT_SERVER
int
ProcQueryTree
(
register
ClientPtr
client
)
{
...
...
@@ -887,6 +894,8 @@ ProcQueryTree(register ClientPtr client)
return
(
client
->
noClientException
);
}
#endif
/* NXAGENT_SERVER */
int
ProcInternAtom
(
register
ClientPtr
client
)
...
...
@@ -950,6 +959,7 @@ ProcGetAtomName(register ClientPtr client)
extern
int
k5_bad
();
#endif
#ifndef NXAGENT_SERVER
int
ProcSetSelectionOwner
(
register
ClientPtr
client
)
{
...
...
@@ -1045,6 +1055,7 @@ ProcSetSelectionOwner(register ClientPtr client)
return
(
BadAtom
);
}
}
#endif
/* NXAGENT_SERVER */
int
ProcGetSelectionOwner
(
register
ClientPtr
client
)
...
...
@@ -1078,6 +1089,7 @@ ProcGetSelectionOwner(register ClientPtr client)
}
}
#ifndef NXAGENT_SERVER
int
ProcConvertSelection
(
register
ClientPtr
client
)
{
...
...
@@ -1143,6 +1155,7 @@ ProcConvertSelection(register ClientPtr client)
return
(
BadAtom
);
}
}
#endif
/* NXAGENT_SERVER */
int
ProcGrabServer
(
register
ClientPtr
client
)
...
...
@@ -1285,6 +1298,7 @@ ProcTranslateCoords(register ClientPtr client)
return
(
client
->
noClientException
);
}
#ifndef NXAGENT_SERVER
int
ProcOpenFont
(
register
ClientPtr
client
)
{
...
...
@@ -1324,6 +1338,7 @@ ProcCloseFont(register ClientPtr client)
return
(
BadFont
);
}
}
#endif
/* NXAGENT_SERVER */
int
ProcQueryFont
(
register
ClientPtr
client
)
...
...
@@ -1335,6 +1350,7 @@ ProcQueryFont(register ClientPtr client)
REQUEST_SIZE_MATCH
(
xResourceReq
);
client
->
errorValue
=
stuff
->
id
;
/* EITHER font or gc */
pFont
=
(
FontPtr
)
SecurityLookupIDByType
(
client
,
stuff
->
id
,
RT_FONT
,
SecurityReadAccess
);
if
(
!
pFont
)
...
...
@@ -1367,6 +1383,7 @@ ProcQueryFont(register ClientPtr client)
rlength
=
sizeof
(
xQueryFontReply
)
+
FONTINFONPROPS
(
FONTCHARSET
(
pFont
))
*
sizeof
(
xFontProp
)
+
nprotoxcistructs
*
sizeof
(
xCharInfo
);
reply
=
(
xQueryFontReply
*
)
ALLOCATE_LOCAL
(
rlength
);
if
(
!
reply
)
{
...
...
@@ -1435,6 +1452,7 @@ ProcQueryTextExtents(register ClientPtr client)
return
(
client
->
noClientException
);
}
#ifndef NXAGENT_SERVER
int
ProcListFonts
(
register
ClientPtr
client
)
{
...
...
@@ -1456,6 +1474,7 @@ ProcListFontsWithInfo(register ClientPtr client)
return
StartListFontsWithInfo
(
client
,
stuff
->
nbytes
,
(
unsigned
char
*
)
&
stuff
[
1
],
stuff
->
maxNames
);
}
#endif
/* NXAGENT_SERVER */
/**
*
...
...
@@ -1527,6 +1546,7 @@ CreatePmap:
return
(
BadAlloc
);
}
#ifndef NXAGENT_SERVER
int
ProcFreePixmap
(
register
ClientPtr
client
)
{
...
...
@@ -1548,6 +1568,7 @@ ProcFreePixmap(register ClientPtr client)
return
(
BadPixmap
);
}
}
#endif
/* NXAGENT_SERVER */
int
ProcCreateGC
(
register
ClientPtr
client
)
...
...
@@ -3186,6 +3207,7 @@ ProcQueryBestSize (register ClientPtr client)
}
#ifndef NXAGENT_SERVER
int
ProcSetScreenSaver
(
register
ClientPtr
client
)
{
...
...
@@ -3241,6 +3263,7 @@ ProcSetScreenSaver (register ClientPtr client)
SetScreenSaverTimer
();
return
(
client
->
noClientException
);
}
#endif
/* NXAGENT_SERVER */
int
ProcGetScreenSaver
(
register
ClientPtr
client
)
...
...
@@ -3446,6 +3469,7 @@ ProcChangeCloseDownMode(register ClientPtr client)
}
}
#ifndef NXAGENT_SERVER
int
ProcForceScreenSaver
(
register
ClientPtr
client
)
{
REQUEST
(
xForceScreenSaverReq
);
...
...
@@ -3461,6 +3485,7 @@ int ProcForceScreenSaver(register ClientPtr client)
SaveScreens
(
SCREEN_SAVER_FORCER
,
(
int
)
stuff
->
mode
);
return
client
->
noClientException
;
}
#endif
/* NXAGENT_SERVER */
int
ProcNoOperation
(
register
ClientPtr
client
)
{
...
...
@@ -3495,6 +3520,7 @@ InitProcVectors(void)
}
/**********************
* CloseDownClient
*
...
...
@@ -3502,6 +3528,7 @@ InitProcVectors(void)
* then killed again, the client is really destroyed.
*********************/
#ifndef NXAGENT_SERVER
char
dispatchExceptionAtReset
=
DE_RESET
;
void
...
...
@@ -3589,6 +3616,7 @@ CloseDownClient(register ClientPtr client)
currentMaxClients
--
;
}
}
#endif
/* NXAGENT_SERVER */
static
void
KillAllClients
()
...
...
@@ -3682,6 +3710,7 @@ extern int clientPrivateLen;
extern
unsigned
*
clientPrivateSizes
;
extern
unsigned
totalClientSize
;
#ifndef NXAGENT_SERVER
int
InitClientPrivates
(
ClientPtr
client
)
{
...
...
@@ -3716,6 +3745,7 @@ InitClientPrivates(ClientPtr client)
}
return
1
;
}
#endif
/* NXAGENT_SERVER */
/************************
* int NextAvailableClient(ospriv)
...
...
nx-X11/programs/Xserver/hw/nxagent/NXdispatch.c
View file @
2ba50086
...
...
@@ -95,15 +95,6 @@ Equipment Corporation.
/* $XFree86: xc/programs/Xserver/dix/dispatch.c,v 3.32 2003/11/10 18:21:45 tsi Exp $ */
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
#endif
#ifdef PANORAMIX_DEBUG
#include <stdio.h>
int
ProcInitialConnection
();
#endif
#ifdef __sun
#define False 0
#define True 1
...
...
@@ -115,37 +106,9 @@ int ProcInitialConnection();
#include <nx-X11/Xlib.h>
#undef GC
#include "../../dix/dispatch.c"
#include "windowstr.h"
#include "dixfontstr.h"
#include "gcstruct.h"
#include "selection.h"
#include "colormapst.h"
#include "cursorstr.h"
#include "scrnintstr.h"
#include "opaque.h"
#include "input.h"
#include "servermd.h"
#include "extnsionst.h"
#include "dixfont.h"
#include "../../dix/dispatch.h"
#include "swaprep.h"
#include "swapreq.h"
#ifdef PANORAMIX
#include "panoramiX.h"
#include "panoramiXsrv.h"
#endif
#ifdef XCSECURITY
#define _SECURITY_SERVER
#include <nx-X11/extensions/security.h>
#endif
#ifdef XAPPGROUP
#include <nx-X11/extensions/Xagsrv.h>
#endif
#ifdef XKB
#define XKB_IN_SERVER
#include "inputstr.h"
#include <nx-X11/extensions/XKBsrv.h>
#endif
#include "Atoms.h"
#include "Splash.h"
...
...
@@ -182,10 +145,6 @@ Bool nxagentWMPassed = 0;
int
nxagentAutoDisconnectTimeout
=
0
;
#ifdef LBX
#include "../../lbx/lbxserve.h"
#endif
#include "Xatom.h"
/*
...
...
@@ -211,21 +170,6 @@ int nxagentAutoDisconnectTimeout = 0;
#include "Literals.h"
#endif
#define mskcnt ((MAXCLIENTS + 31) / 32)
#define BITMASK(i) (1U << ((i) & 31))
#define MASKIDX(i) ((i) >> 5)
#define MASKWORD(buf, i) buf[MASKIDX(i)]
#define BITSET(buf, i) MASKWORD(buf, i) |= BITMASK(i)
#define BITCLEAR(buf, i) MASKWORD(buf, i) &= ~BITMASK(i)
#define GETBIT(buf, i) (MASKWORD(buf, i) & BITMASK(i))
extern
xConnSetupPrefix
connSetupPrefix
;
extern
char
*
ConnectionInfo
;
Selection
*
CurrentSelections
;
int
NumCurrentSelections
;
CallbackListPtr
SelectionCallback
=
NULL
;
#ifdef VIEWPORT_FRAME
extern
WindowPtr
nxagentViewportFrameLeft
;
...
...
@@ -248,82 +192,6 @@ extern int nxagentMaxAllowedResets;
extern
int
nxagentFindClientResource
(
int
,
RESTYPE
,
void
*
);
static
ClientPtr
grabClient
;
#define GrabNone 0
#define GrabActive 1
#define GrabKickout 2
static
int
grabState
=
GrabNone
;
static
long
grabWaiters
[
mskcnt
];
CallbackListPtr
ServerGrabCallback
=
NULL
;
HWEventQueuePtr
checkForInput
[
2
];
extern
int
connBlockScreenStart
;
static
void
KillAllClients
(
void
);
static
void
DeleteClientFromAnySelections
(
ClientPtr
client
);
static
int
nextFreeClientID
;
/* always MIN free client ID */
static
int
nClients
;
/* number of authorized clients */
CallbackListPtr
ClientStateCallback
;
/* dispatchException & isItTimeToYield must be declared volatile since they
* are modified by signal handlers - otherwise optimizer may assume it doesn't
* need to actually check value in memory when used and may miss changes from
* signal handlers.
*/
volatile
char
dispatchException
=
0
;
volatile
char
isItTimeToYield
;
/* Various of the DIX function interfaces were not designed to allow
* the client->errorValue to be set on BadValue and other errors.
* Rather than changing interfaces and breaking untold code we introduce
* a new global that dispatch can use.
*/
XID
clientErrorValue
;
/* XXX this is a kludge */
#define SAME_SCREENS(a, b) (\
(a.pScreen == b.pScreen))
void
SetInputCheck
(
HWEventQueuePtr
c0
,
HWEventQueuePtr
c1
)
{
checkForInput
[
0
]
=
c0
;
checkForInput
[
1
]
=
c1
;
}
void
UpdateCurrentTime
()
{
TimeStamp
systime
;
/* To avoid time running backwards, we must call GetTimeInMillis before
* calling ProcessInputEvents.
*/
systime
.
months
=
currentTime
.
months
;
systime
.
milliseconds
=
GetTimeInMillis
();
if
(
systime
.
milliseconds
<
currentTime
.
milliseconds
)
systime
.
months
++
;
if
(
*
checkForInput
[
0
]
!=
*
checkForInput
[
1
])
ProcessInputEvents
();
if
(
CompareTimeStamps
(
systime
,
currentTime
)
==
LATER
)
currentTime
=
systime
;
}
/* Like UpdateCurrentTime, but can't call ProcessInputEvents */
void
UpdateCurrentTimeIf
()
{
TimeStamp
systime
;
systime
.
months
=
currentTime
.
months
;
systime
.
milliseconds
=
GetTimeInMillis
();
if
(
systime
.
milliseconds
<
currentTime
.
milliseconds
)
systime
.
months
++
;
if
(
*
checkForInput
[
0
]
==
*
checkForInput
[
1
])
currentTime
=
systime
;
}
void
InitSelections
()
...
...
@@ -358,137 +226,6 @@ InitSelections()
}
void
FlushClientCaches
(
XID
id
)
{
int
i
;
register
ClientPtr
client
;
client
=
clients
[
CLIENT_ID
(
id
)];
if
(
client
==
NullClient
)
return
;
for
(
i
=
0
;
i
<
currentMaxClients
;
i
++
)
{
client
=
clients
[
i
];
if
(
client
!=
NullClient
)
{
if
(
client
->
lastDrawableID
==
id
)
{
client
->
lastDrawableID
=
screenInfo
.
screens
[
0
]
->
root
->
drawable
.
id
;
client
->
lastDrawable
=
(
DrawablePtr
)
screenInfo
.
screens
[
0
]
->
root
;
}
else
if
(
client
->
lastGCID
==
id
)
{
client
->
lastGCID
=
INVALID
;
client
->
lastGC
=
(
GCPtr
)
NULL
;
}
}
}
}
#ifdef SMART_SCHEDULE
#undef SMART_DEBUG
#define SMART_SCHEDULE_DEFAULT_INTERVAL 20
/* ms */
#define SMART_SCHEDULE_MAX_SLICE 200
/* ms */
Bool
SmartScheduleDisable
=
FALSE
;
long
SmartScheduleSlice
=
SMART_SCHEDULE_DEFAULT_INTERVAL
;
long
SmartScheduleInterval
=
SMART_SCHEDULE_DEFAULT_INTERVAL
;
long
SmartScheduleMaxSlice
=
SMART_SCHEDULE_MAX_SLICE
;
long
SmartScheduleTime
;
ClientPtr
SmartLastClient
;
int
SmartLastIndex
[
SMART_MAX_PRIORITY
-
SMART_MIN_PRIORITY
+
1
];
int
SmartScheduleClient
(
int
*
clientReady
,
int
nready
);
#ifdef SMART_DEBUG
long
SmartLastPrint
;
#endif
void
Dispatch
(
void
);
void
InitProcVectors
(
void
);
int
SmartScheduleClient
(
int
*
clientReady
,
int
nready
)
{
ClientPtr
pClient
;
int
i
;
int
client
;
int
bestPrio
,
best
=
0
;
int
bestRobin
,
robin
;
long
now
=
SmartScheduleTime
;
long
idle
;
bestPrio
=
-
0x7fffffff
;
bestRobin
=
0
;
idle
=
2
*
SmartScheduleSlice
;
for
(
i
=
0
;
i
<
nready
;
i
++
)
{
client
=
clientReady
[
i
];
pClient
=
clients
[
client
];
/* Praise clients which are idle */
if
((
now
-
pClient
->
smart_check_tick
)
>=
idle
)
{
if
(
pClient
->
smart_priority
<
0
)
pClient
->
smart_priority
++
;
}
pClient
->
smart_check_tick
=
now
;
/* check priority to select best client */
robin
=
(
pClient
->
index
-
SmartLastIndex
[
pClient
->
smart_priority
-
SMART_MIN_PRIORITY
])
&
0xff
;
if
(
pClient
->
smart_priority
>
bestPrio
||
(
pClient
->
smart_priority
==
bestPrio
&&
robin
>
bestRobin
))
{
bestPrio
=
pClient
->
smart_priority
;
bestRobin
=
robin
;
best
=
client
;
}
#ifdef SMART_DEBUG
if
((
now
-
SmartLastPrint
)
>=
5000
)
fprintf
(
stderr
,
" %2d: %3d"
,
client
,
pClient
->
smart_priority
);
#endif
}
#ifdef SMART_DEBUG
if
((
now
-
SmartLastPrint
)
>=
5000
)
{
fprintf
(
stderr
,
" use %2d
\n
"
,
best
);
SmartLastPrint
=
now
;
}
#endif
pClient
=
clients
[
best
];
SmartLastIndex
[
bestPrio
-
SMART_MIN_PRIORITY
]
=
pClient
->
index
;
/*
* Set current client pointer
*/
if
(
SmartLastClient
!=
pClient
)
{
pClient
->
smart_start_tick
=
now
;
SmartLastClient
=
pClient
;
}
/*
* Adjust slice
*/
if
(
nready
==
1
)
{
/*
* If it's been a long time since another client
* has run, bump the slice up to get maximal
* performance from a single client
*/
if
((
now
-
pClient
->
smart_start_tick
)
>
1000
&&
SmartScheduleSlice
<
SmartScheduleMaxSlice
)
{
SmartScheduleSlice
+=
SmartScheduleInterval
;
}
}
else
{
SmartScheduleSlice
=
SmartScheduleInterval
;
}
return
best
;
}
#endif
#define MAJOROP ((xReq *)client->requestBuffer)->reqType
void
...
...
@@ -846,159 +583,6 @@ Reply Total Cached Bits In Bits Out Bits/Reply Ratio
#undef MAJOROP
int
ProcBadRequest
(
ClientPtr
client
)
{
return
(
BadRequest
);
}
int
ProcCreateWindow
(
ClientPtr
client
)
{
register
WindowPtr
pParent
,
pWin
;
REQUEST
(
xCreateWindowReq
);
int
result
;
int
len
;
REQUEST_AT_LEAST_SIZE
(
xCreateWindowReq
);
LEGAL_NEW_RESOURCE
(
stuff
->
wid
,
client
);
if
(
!
(
pParent
=
(
WindowPtr
)
SecurityLookupWindow
(
stuff
->
parent
,
client
,
SecurityWriteAccess
)))
return
BadWindow
;
len
=
client
->
req_len
-
(
sizeof
(
xCreateWindowReq
)
>>
2
);
if
(
Ones
(
stuff
->
mask
)
!=
len
)
return
BadLength
;
if
(
!
stuff
->
width
||
!
stuff
->
height
)
{
client
->
errorValue
=
0
;
return
BadValue
;
}
pWin
=
CreateWindow
(
stuff
->
wid
,
pParent
,
stuff
->
x
,
stuff
->
y
,
stuff
->
width
,
stuff
->
height
,
stuff
->
borderWidth
,
stuff
->
class
,
stuff
->
mask
,
(
XID
*
)
&
stuff
[
1
],
(
int
)
stuff
->
depth
,
client
,
stuff
->
visual
,
&
result
);
if
(
pWin
)
{
Mask
mask
=
pWin
->
eventMask
;
pWin
->
eventMask
=
0
;
/* subterfuge in case AddResource fails */
if
(
!
AddResource
(
stuff
->
wid
,
RT_WINDOW
,
(
void
*
)
pWin
))
return
BadAlloc
;
pWin
->
eventMask
=
mask
;
}
if
(
client
->
noClientException
!=
Success
)
return
(
client
->
noClientException
);
else
return
(
result
);
}
int
ProcChangeWindowAttributes
(
register
ClientPtr
client
)
{
register
WindowPtr
pWin
;
REQUEST
(
xChangeWindowAttributesReq
);
register
int
result
;
int
len
;
REQUEST_AT_LEAST_SIZE
(
xChangeWindowAttributesReq
);
pWin
=
(
WindowPtr
)
SecurityLookupWindow
(
stuff
->
window
,
client
,
SecurityWriteAccess
);
if
(
!
pWin
)
return
(
BadWindow
);
len
=
client
->
req_len
-
(
sizeof
(
xChangeWindowAttributesReq
)
>>
2
);
if
(
len
!=
Ones
(
stuff
->
valueMask
))
return
BadLength
;
result
=
ChangeWindowAttributes
(
pWin
,
stuff
->
valueMask
,
(
XID
*
)
&
stuff
[
1
],
client
);
if
(
client
->
noClientException
!=
Success
)
return
(
client
->
noClientException
);
else
return
(
result
);
}
int
ProcGetWindowAttributes
(
register
ClientPtr
client
)
{
register
WindowPtr
pWin
;
REQUEST
(
xResourceReq
);
xGetWindowAttributesReply
wa
;
REQUEST_SIZE_MATCH
(
xResourceReq
);
pWin
=
(
WindowPtr
)
SecurityLookupWindow
(
stuff
->
id
,
client
,
SecurityReadAccess
);
if
(
!
pWin
)
return
(
BadWindow
);
memset
(
&
wa
,
0
,
sizeof
(
xGetWindowAttributesReply
));
GetWindowAttributes
(
pWin
,
client
,
&
wa
);
WriteReplyToClient
(
client
,
sizeof
(
xGetWindowAttributesReply
),
&
wa
);
return
(
client
->
noClientException
);
}
int
ProcDestroyWindow
(
register
ClientPtr
client
)
{
register
WindowPtr
pWin
;
REQUEST
(
xResourceReq
);
REQUEST_SIZE_MATCH
(
xResourceReq
);
pWin
=
(
WindowPtr
)
SecurityLookupWindow
(
stuff
->
id
,
client
,
SecurityDestroyAccess
);
if
(
!
pWin
)
return
(
BadWindow
);
if
(
pWin
->
parent
)
FreeResource
(
stuff
->
id
,
RT_NONE
);
return
(
client
->
noClientException
);
}
int
ProcDestroySubwindows
(
register
ClientPtr
client
)
{
register
WindowPtr
pWin
;
REQUEST
(
xResourceReq
);
REQUEST_SIZE_MATCH
(
xResourceReq
);
pWin
=
(
WindowPtr
)
SecurityLookupWindow
(
stuff
->
id
,
client
,
SecurityDestroyAccess
);
if
(
!
pWin
)
return
(
BadWindow
);
DestroySubwindows
(
pWin
,
client
);
return
(
client
->
noClientException
);
}
int
ProcChangeSaveSet
(
register
ClientPtr
client
)
{
register
WindowPtr
pWin
;
REQUEST
(
xChangeSaveSetReq
);
register
int
result
;
REQUEST_SIZE_MATCH
(
xChangeSaveSetReq
);
pWin
=
(
WindowPtr
)
SecurityLookupWindow
(
stuff
->
window
,
client
,
SecurityReadAccess
);
if
(
!
pWin
)
return
(
BadWindow
);
if
(
client
->
clientAsMask
==
(
CLIENT_BITS
(
pWin
->
drawable
.
id
)))
return
BadMatch
;
if
((
stuff
->
mode
==
SetModeInsert
)
||
(
stuff
->
mode
==
SetModeDelete
))
{
result
=
AlterSaveSetForClient
(
client
,
pWin
,
stuff
->
mode
,
FALSE
,
TRUE
);
if
(
client
->
noClientException
!=
Success
)
return
(
client
->
noClientException
);
else
return
(
result
);
}
else
{
client
->
errorValue
=
stuff
->
mode
;
return
(
BadValue
);
}
}
int
ProcReparentWindow
(
register
ClientPtr
client
)
{
register
WindowPtr
pWin
,
pParent
;
...
...
@@ -1039,10 +623,14 @@ ProcReparentWindow(register ClientPtr client)
return
(
BadMatch
);
}
int
Proc
MapWindow
(
register
ClientPtr
client
)
Proc
QueryTree
(
register
ClientPtr
client
)
{
register
WindowPtr
pWin
;
xQueryTreeReply
reply
;
int
numChildren
=
0
;
register
WindowPtr
pChild
,
pWin
,
pHead
;
Window
*
childIDs
=
(
Window
*
)
NULL
;
REQUEST
(
xResourceReq
);
REQUEST_SIZE_MATCH
(
xResourceReq
);
...
...
@@ -1050,285 +638,55 @@ ProcMapWindow(register ClientPtr client)
SecurityReadAccess
);
if
(
!
pWin
)
return
(
BadWindow
);
MapWindow
(
pWin
,
client
);
/* update cache to say it is mapped */
return
(
client
->
noClientException
);
}
int
ProcMapSubwindows
(
register
ClientPtr
client
)
{
register
WindowPtr
pWin
;
REQUEST
(
xResourceReq
);
memset
(
&
reply
,
0
,
sizeof
(
xQueryTreeReply
));
reply
.
type
=
X_Reply
;
reply
.
root
=
pWin
->
drawable
.
pScreen
->
root
->
drawable
.
id
;
reply
.
sequenceNumber
=
client
->
sequence
;
if
(
pWin
->
parent
)
reply
.
parent
=
pWin
->
parent
->
drawable
.
id
;
else
reply
.
parent
=
(
Window
)
None
;
pHead
=
RealChildHead
(
pWin
);
for
(
pChild
=
pWin
->
lastChild
;
pChild
!=
pHead
;
pChild
=
pChild
->
prevSib
)
{
if
(
!
IsViewportFrame
(
pChild
))
{
numChildren
++
;
}
}
if
(
numChildren
)
{
int
curChild
=
0
;
REQUEST_SIZE_MATCH
(
xResourceReq
);
pWin
=
(
WindowPtr
)
SecurityLookupWindow
(
stuff
->
id
,
client
,
SecurityReadAccess
);
if
(
!
pWin
)
return
(
BadWindow
);
MapSubwindows
(
pWin
,
client
);
/* update cache to say it is mapped */
return
(
client
->
noClientException
);
}
childIDs
=
(
Window
*
)
ALLOCATE_LOCAL
(
numChildren
*
sizeof
(
Window
));
if
(
!
childIDs
)
return
BadAlloc
;
for
(
pChild
=
pWin
->
lastChild
;
pChild
!=
pHead
;
pChild
=
pChild
->
prevSib
)
{
if
(
!
IsViewportFrame
(
pChild
))
{
childIDs
[
curChild
++
]
=
pChild
->
drawable
.
id
;
}
}
}
int
ProcUnmapWindow
(
register
ClientPtr
client
)
{
register
WindowPtr
pWin
;
REQUEST
(
xResourceReq
);
reply
.
nChildren
=
numChildren
;
reply
.
length
=
(
numChildren
*
sizeof
(
Window
))
>>
2
;
REQUEST_SIZE_MATCH
(
xResourceReq
);
pWin
=
(
WindowPtr
)
SecurityLookupWindow
(
stuff
->
id
,
client
,
SecurityReadAccess
);
if
(
!
pWin
)
return
(
BadWindow
);
UnmapWindow
(
pWin
,
FALSE
);
/* update cache to say it is mapped */
WriteReplyToClient
(
client
,
sizeof
(
xQueryTreeReply
),
&
reply
);
if
(
numChildren
)
{
client
->
pSwapReplyFunc
=
(
ReplySwapPtr
)
Swap32Write
;
WriteSwappedDataToClient
(
client
,
numChildren
*
sizeof
(
Window
),
childIDs
);
DEALLOCATE_LOCAL
(
childIDs
);
}
return
(
client
->
noClientException
);
}
int
ProcUnmapSubwindows
(
register
ClientPtr
client
)
{
register
WindowPtr
pWin
;
REQUEST
(
xResourceReq
);
REQUEST_SIZE_MATCH
(
xResourceReq
);
pWin
=
(
WindowPtr
)
SecurityLookupWindow
(
stuff
->
id
,
client
,
SecurityReadAccess
);
if
(
!
pWin
)
return
(
BadWindow
);
UnmapSubwindows
(
pWin
);
return
(
client
->
noClientException
);
}
int
ProcConfigureWindow
(
register
ClientPtr
client
)
{
register
WindowPtr
pWin
;
REQUEST
(
xConfigureWindowReq
);
register
int
result
;
int
len
;
REQUEST_AT_LEAST_SIZE
(
xConfigureWindowReq
);
pWin
=
(
WindowPtr
)
SecurityLookupWindow
(
stuff
->
window
,
client
,
SecurityWriteAccess
);
if
(
!
pWin
)
return
(
BadWindow
);
len
=
client
->
req_len
-
(
sizeof
(
xConfigureWindowReq
)
>>
2
);
if
(
Ones
((
Mask
)
stuff
->
mask
)
!=
len
)
return
BadLength
;
result
=
ConfigureWindow
(
pWin
,
(
Mask
)
stuff
->
mask
,
(
XID
*
)
&
stuff
[
1
],
client
);
if
(
client
->
noClientException
!=
Success
)
return
(
client
->
noClientException
);
else
return
(
result
);
}
int
ProcCirculateWindow
(
register
ClientPtr
client
)
{
register
WindowPtr
pWin
;
REQUEST
(
xCirculateWindowReq
);
REQUEST_SIZE_MATCH
(
xCirculateWindowReq
);
if
((
stuff
->
direction
!=
RaiseLowest
)
&&
(
stuff
->
direction
!=
LowerHighest
))
{
client
->
errorValue
=
stuff
->
direction
;
return
BadValue
;
}
pWin
=
(
WindowPtr
)
SecurityLookupWindow
(
stuff
->
window
,
client
,
SecurityWriteAccess
);
if
(
!
pWin
)
return
(
BadWindow
);
CirculateWindow
(
pWin
,
(
int
)
stuff
->
direction
,
client
);
return
(
client
->
noClientException
);
}
int
GetGeometry
(
register
ClientPtr
client
,
xGetGeometryReply
*
rep
)
{
register
DrawablePtr
pDraw
;
REQUEST
(
xResourceReq
);
REQUEST_SIZE_MATCH
(
xResourceReq
);
SECURITY_VERIFY_GEOMETRABLE
(
pDraw
,
stuff
->
id
,
client
,
SecurityReadAccess
);
memset
(
rep
,
0
,
sizeof
(
xGetGeometryReply
));
rep
->
type
=
X_Reply
;
rep
->
length
=
0
;
rep
->
sequenceNumber
=
client
->
sequence
;
rep
->
root
=
pDraw
->
pScreen
->
root
->
drawable
.
id
;
rep
->
depth
=
pDraw
->
depth
;
rep
->
width
=
pDraw
->
width
;
rep
->
height
=
pDraw
->
height
;
/* XXX - Because the pixmap-implementation of the multibuffer extension
* may have the buffer-id's drawable resource value be a pointer
* to the buffer's window instead of the buffer itself
* (this happens if the buffer is the displayed buffer),
* we also have to check that the id matches before we can
* truly say that it is a DRAWABLE_WINDOW.
*/
if
((
pDraw
->
type
==
UNDRAWABLE_WINDOW
)
||
((
pDraw
->
type
==
DRAWABLE_WINDOW
)
&&
(
stuff
->
id
==
pDraw
->
id
)))
{
register
WindowPtr
pWin
=
(
WindowPtr
)
pDraw
;
rep
->
x
=
pWin
->
origin
.
x
-
wBorderWidth
(
pWin
);
rep
->
y
=
pWin
->
origin
.
y
-
wBorderWidth
(
pWin
);
rep
->
borderWidth
=
pWin
->
borderWidth
;
}
else
/* DRAWABLE_PIXMAP or DRAWABLE_BUFFER */
{
rep
->
x
=
rep
->
y
=
rep
->
borderWidth
=
0
;
}
return
Success
;
}
int
ProcGetGeometry
(
register
ClientPtr
client
)
{
xGetGeometryReply
rep
;
int
status
;
if
((
status
=
GetGeometry
(
client
,
&
rep
))
!=
Success
)
return
status
;
WriteReplyToClient
(
client
,
sizeof
(
xGetGeometryReply
),
&
rep
);
return
(
client
->
noClientException
);
}
int
ProcQueryTree
(
register
ClientPtr
client
)
{
xQueryTreeReply
reply
;
int
numChildren
=
0
;
register
WindowPtr
pChild
,
pWin
,
pHead
;
Window
*
childIDs
=
(
Window
*
)
NULL
;
REQUEST
(
xResourceReq
);
REQUEST_SIZE_MATCH
(
xResourceReq
);
pWin
=
(
WindowPtr
)
SecurityLookupWindow
(
stuff
->
id
,
client
,
SecurityReadAccess
);
if
(
!
pWin
)
return
(
BadWindow
);
memset
(
&
reply
,
0
,
sizeof
(
xQueryTreeReply
));
reply
.
type
=
X_Reply
;
reply
.
root
=
pWin
->
drawable
.
pScreen
->
root
->
drawable
.
id
;
reply
.
sequenceNumber
=
client
->
sequence
;
if
(
pWin
->
parent
)
reply
.
parent
=
pWin
->
parent
->
drawable
.
id
;
else
reply
.
parent
=
(
Window
)
None
;
pHead
=
RealChildHead
(
pWin
);
for
(
pChild
=
pWin
->
lastChild
;
pChild
!=
pHead
;
pChild
=
pChild
->
prevSib
)
{
if
(
!
IsViewportFrame
(
pChild
))
{
numChildren
++
;
}
}
if
(
numChildren
)
{
int
curChild
=
0
;
childIDs
=
(
Window
*
)
ALLOCATE_LOCAL
(
numChildren
*
sizeof
(
Window
));
if
(
!
childIDs
)
return
BadAlloc
;
for
(
pChild
=
pWin
->
lastChild
;
pChild
!=
pHead
;
pChild
=
pChild
->
prevSib
)
{
if
(
!
IsViewportFrame
(
pChild
))
{
childIDs
[
curChild
++
]
=
pChild
->
drawable
.
id
;
}
}
}
reply
.
nChildren
=
numChildren
;
reply
.
length
=
(
numChildren
*
sizeof
(
Window
))
>>
2
;
WriteReplyToClient
(
client
,
sizeof
(
xQueryTreeReply
),
&
reply
);
if
(
numChildren
)
{
client
->
pSwapReplyFunc
=
(
ReplySwapPtr
)
Swap32Write
;
WriteSwappedDataToClient
(
client
,
numChildren
*
sizeof
(
Window
),
childIDs
);
DEALLOCATE_LOCAL
(
childIDs
);
}
return
(
client
->
noClientException
);
}
int
ProcInternAtom
(
register
ClientPtr
client
)
{
Atom
atom
;
char
*
tchar
;
REQUEST
(
xInternAtomReq
);
REQUEST_FIXED_SIZE
(
xInternAtomReq
,
stuff
->
nbytes
);
if
((
stuff
->
onlyIfExists
!=
xTrue
)
&&
(
stuff
->
onlyIfExists
!=
xFalse
))
{
client
->
errorValue
=
stuff
->
onlyIfExists
;
return
(
BadValue
);
}
tchar
=
(
char
*
)
&
stuff
[
1
];
atom
=
MakeAtom
(
tchar
,
stuff
->
nbytes
,
!
stuff
->
onlyIfExists
);
if
(
atom
!=
BAD_RESOURCE
)
{
xInternAtomReply
reply
;
memset
(
&
reply
,
0
,
sizeof
(
xInternAtomReply
));
reply
.
type
=
X_Reply
;
reply
.
length
=
0
;
reply
.
sequenceNumber
=
client
->
sequence
;
reply
.
atom
=
atom
;
WriteReplyToClient
(
client
,
sizeof
(
xInternAtomReply
),
&
reply
);
return
(
client
->
noClientException
);
}
else
return
(
BadAlloc
);
}
int
ProcGetAtomName
(
register
ClientPtr
client
)
{
char
*
str
;
xGetAtomNameReply
reply
;
int
len
;
REQUEST
(
xResourceReq
);
REQUEST_SIZE_MATCH
(
xResourceReq
);
if
(
(
str
=
NameForAtom
(
stuff
->
id
))
)
{
len
=
strlen
(
str
);
memset
(
&
reply
,
0
,
sizeof
(
xGetAtomNameReply
));
reply
.
type
=
X_Reply
;
reply
.
length
=
(
len
+
3
)
>>
2
;
reply
.
sequenceNumber
=
client
->
sequence
;
reply
.
nameLength
=
len
;
WriteReplyToClient
(
client
,
sizeof
(
xGetAtomNameReply
),
&
reply
);
(
void
)
WriteToClient
(
client
,
len
,
str
);
return
(
client
->
noClientException
);
}
else
{
client
->
errorValue
=
stuff
->
id
;
return
(
BadAtom
);
}
}
#ifdef K5AUTH
extern
int
k5_bad
();
#endif
int
ProcSetSelectionOwner
(
register
ClientPtr
client
)
ProcSetSelectionOwner
(
register
ClientPtr
client
)
{
WindowPtr
pWin
;
TimeStamp
time
;
...
...
@@ -1433,37 +791,6 @@ ProcSetSelectionOwner(register ClientPtr client)
}
}
int
ProcGetSelectionOwner
(
register
ClientPtr
client
)
{
REQUEST
(
xResourceReq
);
REQUEST_SIZE_MATCH
(
xResourceReq
);
if
(
ValidAtom
(
stuff
->
id
))
{
int
i
;
xGetSelectionOwnerReply
reply
;
i
=
0
;
while
((
i
<
NumCurrentSelections
)
&&
CurrentSelections
[
i
].
selection
!=
stuff
->
id
)
i
++
;
memset
(
&
reply
,
0
,
sizeof
(
xGetSelectionOwnerReply
));
reply
.
type
=
X_Reply
;
reply
.
length
=
0
;
reply
.
sequenceNumber
=
client
->
sequence
;
if
(
i
<
NumCurrentSelections
)
reply
.
owner
=
CurrentSelections
[
i
].
window
;
else
reply
.
owner
=
None
;
WriteReplyToClient
(
client
,
sizeof
(
xGetSelectionOwnerReply
),
&
reply
);
return
(
client
->
noClientException
);
}
else
{
client
->
errorValue
=
stuff
->
id
;
return
(
BadAtom
);
}
}
int
ProcConvertSelection
(
register
ClientPtr
client
)
...
...
@@ -1553,146 +880,6 @@ ProcConvertSelection(register ClientPtr client)
}
}
int
ProcGrabServer
(
register
ClientPtr
client
)
{
REQUEST_SIZE_MATCH
(
xReq
);
if
(
grabState
!=
GrabNone
&&
client
!=
grabClient
)
{
ResetCurrentRequest
(
client
);
client
->
sequence
--
;
BITSET
(
grabWaiters
,
client
->
index
);
IgnoreClient
(
client
);
return
(
client
->
noClientException
);
}
OnlyListenToOneClient
(
client
);
grabState
=
GrabKickout
;
grabClient
=
client
;
if
(
ServerGrabCallback
)
{
ServerGrabInfoRec
grabinfo
;
grabinfo
.
client
=
client
;
grabinfo
.
grabstate
=
SERVER_GRABBED
;
CallCallbacks
(
&
ServerGrabCallback
,
(
void
*
)
&
grabinfo
);
}
return
(
client
->
noClientException
);
}
static
void
UngrabServer
(
ClientPtr
client
)
{
int
i
;
grabState
=
GrabNone
;
ListenToAllClients
();
for
(
i
=
mskcnt
;
--
i
>=
0
&&
!
grabWaiters
[
i
];
)
;
if
(
i
>=
0
)
{
i
<<=
5
;
while
(
!
GETBIT
(
grabWaiters
,
i
))
i
++
;
BITCLEAR
(
grabWaiters
,
i
);
AttendClient
(
clients
[
i
]);
}
if
(
ServerGrabCallback
)
{
ServerGrabInfoRec
grabinfo
;
grabinfo
.
client
=
client
;
grabinfo
.
grabstate
=
SERVER_UNGRABBED
;
CallCallbacks
(
&
ServerGrabCallback
,
(
void
*
)
&
grabinfo
);
}
}
int
ProcUngrabServer
(
register
ClientPtr
client
)
{
REQUEST_SIZE_MATCH
(
xReq
);
UngrabServer
(
client
);
return
(
client
->
noClientException
);
}
int
ProcTranslateCoords
(
register
ClientPtr
client
)
{
REQUEST
(
xTranslateCoordsReq
);
register
WindowPtr
pWin
,
pDst
;
xTranslateCoordsReply
rep
;
REQUEST_SIZE_MATCH
(
xTranslateCoordsReq
);
pWin
=
(
WindowPtr
)
SecurityLookupWindow
(
stuff
->
srcWid
,
client
,
SecurityReadAccess
);
if
(
!
pWin
)
return
(
BadWindow
);
pDst
=
(
WindowPtr
)
SecurityLookupWindow
(
stuff
->
dstWid
,
client
,
SecurityReadAccess
);
if
(
!
pDst
)
return
(
BadWindow
);
memset
(
&
rep
,
0
,
sizeof
(
xTranslateCoordsReply
));
rep
.
type
=
X_Reply
;
rep
.
length
=
0
;
rep
.
sequenceNumber
=
client
->
sequence
;
if
(
!
SAME_SCREENS
(
pWin
->
drawable
,
pDst
->
drawable
))
{
rep
.
sameScreen
=
xFalse
;
rep
.
child
=
None
;
rep
.
dstX
=
rep
.
dstY
=
0
;
}
else
{
INT16
x
,
y
;
rep
.
sameScreen
=
xTrue
;
rep
.
child
=
None
;
/* computing absolute coordinates -- adjust to destination later */
x
=
pWin
->
drawable
.
x
+
stuff
->
srcX
;
y
=
pWin
->
drawable
.
y
+
stuff
->
srcY
;
pWin
=
pDst
->
firstChild
;
while
(
pWin
)
{
#ifdef SHAPE
BoxRec
box
;
#endif
if
((
pWin
->
mapped
)
&&
(
x
>=
pWin
->
drawable
.
x
-
wBorderWidth
(
pWin
))
&&
(
x
<
pWin
->
drawable
.
x
+
(
int
)
pWin
->
drawable
.
width
+
wBorderWidth
(
pWin
))
&&
(
y
>=
pWin
->
drawable
.
y
-
wBorderWidth
(
pWin
))
&&
(
y
<
pWin
->
drawable
.
y
+
(
int
)
pWin
->
drawable
.
height
+
wBorderWidth
(
pWin
))
#ifdef SHAPE
/* When a window is shaped, a further check
* is made to see if the point is inside
* borderSize
*/
&&
(
!
wBoundingShape
(
pWin
)
||
RegionContainsPoint
(
&
pWin
->
borderSize
,
x
,
y
,
&
box
))
&&
(
!
wInputShape
(
pWin
)
||
RegionContainsPoint
(
wInputShape
(
pWin
),
x
-
pWin
->
drawable
.
x
,
y
-
pWin
->
drawable
.
y
,
&
box
))
#endif
)
{
rep
.
child
=
pWin
->
drawable
.
id
;
pWin
=
(
WindowPtr
)
NULL
;
}
else
pWin
=
pWin
->
nextSib
;
}
/* adjust to destination coordinates */
rep
.
dstX
=
x
-
pDst
->
drawable
.
x
;
rep
.
dstY
=
y
-
pDst
->
drawable
.
y
;
}
WriteReplyToClient
(
client
,
sizeof
(
xTranslateCoordsReply
),
&
rep
);
return
(
client
->
noClientException
);
}
int
ProcOpenFont
(
register
ClientPtr
client
)
...
...
@@ -1784,164 +971,25 @@ ProcCloseFont(register ClientPtr client)
}
}
int
Proc
QueryFont
(
register
ClientPtr
client
)
Proc
ListFonts
(
register
ClientPtr
client
)
{
xQueryFontReply
*
reply
;
FontPtr
pFont
;
register
GC
*
pGC
;
REQUEST
(
xResourceReq
);
REQUEST_SIZE_MATCH
(
xResourceReq
);
client
->
errorValue
=
stuff
->
id
;
/* EITHER font or gc */
char
tmp
[
256
];
pFont
=
NULL
;
pFont
=
(
FontPtr
)
SecurityLookupIDByType
(
client
,
stuff
->
id
,
RT_FONT
,
SecurityReadAccess
);
if
(
!
pFont
)
{
/* can't use VERIFY_GC because it might return BadGC */
pGC
=
(
GC
*
)
SecurityLookupIDByType
(
client
,
stuff
->
id
,
RT_GC
,
SecurityReadAccess
);
if
(
!
pGC
)
{
client
->
errorValue
=
stuff
->
id
;
return
(
BadFont
);
/* procotol spec says only error is BadFont */
}
pFont
=
pGC
->
font
;
}
REQUEST
(
xListFontsReq
);
/* test
{
Atom name_atom, value_atom;
int nprops;
FontPropPtr props;
int i;
char *name;
REQUEST_FIXED_SIZE
(
xListFontsReq
,
stuff
->
nbytes
);
memcpy
(
tmp
,(
unsigned
char
*
)
&
stuff
[
1
],(
stuff
->
nbytes
<
256
)
?
stuff
->
nbytes
:
255
);
tmp
[
stuff
->
nbytes
]
=
0
;
name_atom = MakeAtom("FONT", 4, True);
value_atom = 0L;
nprops = pFont->info.nprops;
props = pFont->info.props;
for (i = 0; i < nprops; i++)
if (props[i].name == name_atom) {
value_atom = props[i].value;
break;
}
if (!value_atom) return (BadFont);
name = (char *)NameForAtom(value_atom);
fprintf(stderr, "QueryFont: font name [%s]\n",name);
}
end test */
{
xCharInfo
*
pmax
=
FONTINKMAX
(
pFont
);
xCharInfo
*
pmin
=
FONTINKMIN
(
pFont
);
int
nprotoxcistructs
;
int
rlength
;
nprotoxcistructs
=
(
pmax
->
rightSideBearing
==
pmin
->
rightSideBearing
&&
pmax
->
leftSideBearing
==
pmin
->
leftSideBearing
&&
pmax
->
descent
==
pmin
->
descent
&&
pmax
->
ascent
==
pmin
->
ascent
&&
pmax
->
characterWidth
==
pmin
->
characterWidth
)
?
0
:
N2dChars
(
pFont
);
rlength
=
sizeof
(
xQueryFontReply
)
+
FONTINFONPROPS
(
FONTCHARSET
(
pFont
))
*
sizeof
(
xFontProp
)
+
nprotoxcistructs
*
sizeof
(
xCharInfo
);
reply
=
NULL
;
reply
=
(
xQueryFontReply
*
)
ALLOCATE_LOCAL
(
rlength
);
if
(
!
reply
)
{
return
(
BadAlloc
);
}
memset
(
reply
,
0
,
rlength
);
reply
->
type
=
X_Reply
;
reply
->
length
=
(
rlength
-
sizeof
(
xGenericReply
))
>>
2
;
reply
->
sequenceNumber
=
client
->
sequence
;
QueryFont
(
pFont
,
reply
,
nprotoxcistructs
);
WriteReplyToClient
(
client
,
rlength
,
reply
);
DEALLOCATE_LOCAL
(
reply
);
return
(
client
->
noClientException
);
}
}
int
ProcQueryTextExtents
(
register
ClientPtr
client
)
{
REQUEST
(
xQueryTextExtentsReq
);
xQueryTextExtentsReply
reply
;
FontPtr
pFont
;
GC
*
pGC
;
ExtentInfoRec
info
;
unsigned
long
length
;
REQUEST_AT_LEAST_SIZE
(
xQueryTextExtentsReq
);
pFont
=
(
FontPtr
)
SecurityLookupIDByType
(
client
,
stuff
->
fid
,
RT_FONT
,
SecurityReadAccess
);
if
(
!
pFont
)
{
pGC
=
(
GC
*
)
SecurityLookupIDByType
(
client
,
stuff
->
fid
,
RT_GC
,
SecurityReadAccess
);
if
(
!
pGC
)
{
client
->
errorValue
=
stuff
->
fid
;
return
(
BadFont
);
}
pFont
=
pGC
->
font
;
}
length
=
client
->
req_len
-
(
sizeof
(
xQueryTextExtentsReq
)
>>
2
);
length
=
length
<<
1
;
if
(
stuff
->
oddLength
)
{
if
(
length
==
0
)
return
(
BadLength
);
length
--
;
}
if
(
!
QueryTextExtents
(
pFont
,
length
,
(
unsigned
char
*
)
&
stuff
[
1
],
&
info
))
return
(
BadAlloc
);
reply
.
type
=
X_Reply
;
reply
.
length
=
0
;
reply
.
sequenceNumber
=
client
->
sequence
;
reply
.
drawDirection
=
info
.
drawDirection
;
reply
.
fontAscent
=
info
.
fontAscent
;
reply
.
fontDescent
=
info
.
fontDescent
;
reply
.
overallAscent
=
info
.
overallAscent
;
reply
.
overallDescent
=
info
.
overallDescent
;
reply
.
overallWidth
=
info
.
overallWidth
;
reply
.
overallLeft
=
info
.
overallLeft
;
reply
.
overallRight
=
info
.
overallRight
;
WriteReplyToClient
(
client
,
sizeof
(
xQueryTextExtentsReply
),
&
reply
);
return
(
client
->
noClientException
);
}
int
ProcListFonts
(
register
ClientPtr
client
)
{
char
tmp
[
256
];
REQUEST
(
xListFontsReq
);
REQUEST_FIXED_SIZE
(
xListFontsReq
,
stuff
->
nbytes
);
memcpy
(
tmp
,(
unsigned
char
*
)
&
stuff
[
1
],(
stuff
->
nbytes
<
256
)
?
stuff
->
nbytes
:
255
);
tmp
[
stuff
->
nbytes
]
=
0
;
#ifdef NXAGENT_FONTMATCH_DEBUG
fprintf
(
stderr
,
"Dispatch: ListFont request with pattern %s max_names=%d
\n
"
,
tmp
,
stuff
->
maxNames
);
#endif
nxagentListRemoteFonts
(
tmp
,
stuff
->
maxNames
<
nxagentMaxFontNames
?
nxagentMaxFontNames
:
stuff
->
maxNames
);
return
ListFonts
(
client
,
(
unsigned
char
*
)
&
stuff
[
1
],
stuff
->
nbytes
,
stuff
->
maxNames
);
}
#ifdef NXAGENT_FONTMATCH_DEBUG
fprintf
(
stderr
,
"Dispatch: ListFont request with pattern %s max_names=%d
\n
"
,
tmp
,
stuff
->
maxNames
);
#endif
nxagentListRemoteFonts
(
tmp
,
stuff
->
maxNames
<
nxagentMaxFontNames
?
nxagentMaxFontNames
:
stuff
->
maxNames
);
return
ListFonts
(
client
,
(
unsigned
char
*
)
&
stuff
[
1
],
stuff
->
nbytes
,
stuff
->
maxNames
);
}
int
ProcListFontsWithInfo
(
register
ClientPtr
client
)
...
...
@@ -1962,75 +1010,6 @@ ProcListFontsWithInfo(register ClientPtr client)
(
unsigned
char
*
)
&
stuff
[
1
],
stuff
->
maxNames
);
}
/**
*
* \param value must conform to DeleteType
*/
int
dixDestroyPixmap
(
void
*
value
,
XID
pid
)
{
PixmapPtr
pPixmap
=
(
PixmapPtr
)
value
;
return
(
*
pPixmap
->
drawable
.
pScreen
->
DestroyPixmap
)(
pPixmap
);
}
int
ProcCreatePixmap
(
register
ClientPtr
client
)
{
PixmapPtr
pMap
;
register
DrawablePtr
pDraw
;
REQUEST
(
xCreatePixmapReq
);
DepthPtr
pDepth
;
register
int
i
;
REQUEST_SIZE_MATCH
(
xCreatePixmapReq
);
client
->
errorValue
=
stuff
->
pid
;
LEGAL_NEW_RESOURCE
(
stuff
->
pid
,
client
);
SECURITY_VERIFY_GEOMETRABLE
(
pDraw
,
stuff
->
drawable
,
client
,
SecurityReadAccess
);
if
(
!
stuff
->
width
||
!
stuff
->
height
)
{
client
->
errorValue
=
0
;
return
BadValue
;
}
if
(
stuff
->
width
>
32767
||
stuff
->
height
>
32767
)
{
/* It is allowed to try and allocate a pixmap which is larger than
* 32767 in either dimension. However, all of the framebuffer code
* is buggy and does not reliably draw to such big pixmaps, basically
* because the Region data structure operates with signed shorts
* for the rectangles in it.
*
* Furthermore, several places in the X server computes the
* size in bytes of the pixmap and tries to store it in an
* integer. This integer can overflow and cause the allocated size
* to be much smaller.
*
* So, such big pixmaps are rejected here with a BadAlloc
*/
return
BadAlloc
;
}
if
(
stuff
->
depth
!=
1
)
{
pDepth
=
pDraw
->
pScreen
->
allowedDepths
;
for
(
i
=
0
;
i
<
pDraw
->
pScreen
->
numDepths
;
i
++
,
pDepth
++
)
if
(
pDepth
->
depth
==
stuff
->
depth
)
goto
CreatePmap
;
client
->
errorValue
=
stuff
->
depth
;
return
BadValue
;
}
CreatePmap:
pMap
=
(
PixmapPtr
)(
*
pDraw
->
pScreen
->
CreatePixmap
)
(
pDraw
->
pScreen
,
stuff
->
width
,
stuff
->
height
,
stuff
->
depth
);
if
(
pMap
)
{
pMap
->
drawable
.
serialNumber
=
NEXT_SERIAL_NUMBER
;
pMap
->
drawable
.
id
=
stuff
->
pid
;
if
(
AddResource
(
stuff
->
pid
,
RT_PIXMAP
,
(
void
*
)
pMap
))
return
(
client
->
noClientException
);
}
return
(
BadAlloc
);
}
int
ProcFreePixmap
(
register
ClientPtr
client
)
...
...
@@ -2088,2004 +1067,107 @@ ProcFreePixmap(register ClientPtr client)
}
}
int
ProcCreateGC
(
register
ClientPtr
client
)
{
int
error
;
GC
*
pGC
;
register
DrawablePtr
pDraw
;
unsigned
len
;
REQUEST
(
xCreateGCReq
);
REQUEST_AT_LEAST_SIZE
(
xCreateGCReq
);
client
->
errorValue
=
stuff
->
gc
;
LEGAL_NEW_RESOURCE
(
stuff
->
gc
,
client
);
SECURITY_VERIFY_DRAWABLE
(
pDraw
,
stuff
->
drawable
,
client
,
SecurityReadAccess
);
len
=
client
->
req_len
-
(
sizeof
(
xCreateGCReq
)
>>
2
);
if
(
len
!=
Ones
(
stuff
->
mask
))
return
BadLength
;
pGC
=
(
GC
*
)
CreateGC
(
pDraw
,
stuff
->
mask
,
(
XID
*
)
&
stuff
[
1
],
&
error
);
if
(
error
!=
Success
)
return
error
;
if
(
!
AddResource
(
stuff
->
gc
,
RT_GC
,
(
void
*
)
pGC
))
return
(
BadAlloc
);
return
(
client
->
noClientException
);
}
int
ProcChangeGC
(
register
ClientPtr
client
)
{
GC
*
pGC
;
REQUEST
(
xChangeGCReq
);
int
result
;
unsigned
len
;
REQUEST_AT_LEAST_SIZE
(
xChangeGCReq
);
SECURITY_VERIFY_GC
(
pGC
,
stuff
->
gc
,
client
,
SecurityWriteAccess
);
len
=
client
->
req_len
-
(
sizeof
(
xChangeGCReq
)
>>
2
);
if
(
len
!=
Ones
(
stuff
->
mask
))
return
BadLength
;
result
=
dixChangeGC
(
client
,
pGC
,
stuff
->
mask
,
(
CARD32
*
)
&
stuff
[
1
],
0
);
if
(
client
->
noClientException
!=
Success
)
return
(
client
->
noClientException
);
else
{
client
->
errorValue
=
clientErrorValue
;
return
(
result
);
}
}
int
ProcCopyGC
(
register
ClientPtr
client
)
{
register
GC
*
dstGC
;
register
GC
*
pGC
;
int
result
;
REQUEST
(
xCopyGCReq
);
REQUEST_SIZE_MATCH
(
xCopyGCReq
);
SECURITY_VERIFY_GC
(
pGC
,
stuff
->
srcGC
,
client
,
SecurityReadAccess
);
SECURITY_VERIFY_GC
(
dstGC
,
stuff
->
dstGC
,
client
,
SecurityWriteAccess
);
if
((
dstGC
->
pScreen
!=
pGC
->
pScreen
)
||
(
dstGC
->
depth
!=
pGC
->
depth
))
return
(
BadMatch
);
result
=
CopyGC
(
pGC
,
dstGC
,
stuff
->
mask
);
if
(
client
->
noClientException
!=
Success
)
return
(
client
->
noClientException
);
else
{
client
->
errorValue
=
clientErrorValue
;
return
(
result
);
}
}
int
ProcSet
Dashes
(
register
ClientPtr
client
)
ProcSet
ScreenSaver
(
register
ClientPtr
client
)
{
register
GC
*
pGC
;
int
result
;
REQUEST
(
xSetDashesReq
);
int
blankingOption
,
exposureOption
;
REQUEST
(
xSetScreenSaverReq
);
REQUEST_FIXED_SIZE
(
xSetDashesReq
,
stuff
->
nDashes
);
if
(
stuff
->
nDashes
==
0
)
REQUEST_SIZE_MATCH
(
xSetScreenSaverReq
);
blankingOption
=
stuff
->
preferBlank
;
if
((
blankingOption
!=
DontPreferBlanking
)
&&
(
blankingOption
!=
PreferBlanking
)
&&
(
blankingOption
!=
DefaultBlanking
))
{
client
->
errorValue
=
0
;
client
->
errorValue
=
blankingOption
;
return
BadValue
;
}
SECURITY_VERIFY_GC
(
pGC
,
stuff
->
gc
,
client
,
SecurityWriteAccess
);
result
=
SetDashes
(
pGC
,
stuff
->
dashOffset
,
stuff
->
nDashes
,
(
unsigned
char
*
)
&
stuff
[
1
]);
if
(
client
->
noClientException
!=
Success
)
return
(
client
->
noClientException
);
else
{
client
->
errorValue
=
clientErrorValue
;
return
(
result
);
}
}
int
ProcSetClipRectangles
(
register
ClientPtr
client
)
{
int
nr
;
int
result
;
register
GC
*
pGC
;
REQUEST
(
xSetClipRectanglesReq
);
REQUEST_AT_LEAST_SIZE
(
xSetClipRectanglesReq
);
if
((
stuff
->
ordering
!=
Unsorted
)
&&
(
stuff
->
ordering
!=
YSorted
)
&&
(
stuff
->
ordering
!=
YXSorted
)
&&
(
stuff
->
ordering
!=
YXBanded
))
exposureOption
=
stuff
->
allowExpose
;
if
((
exposureOption
!=
DontAllowExposures
)
&&
(
exposureOption
!=
AllowExposures
)
&&
(
exposureOption
!=
DefaultExposures
))
{
client
->
errorValue
=
stuff
->
ordering
;
client
->
errorValue
=
exposureOption
;
return
BadValue
;
}
SECURITY_VERIFY_GC
(
pGC
,
stuff
->
gc
,
client
,
SecurityWriteAccess
);
nr
=
(
client
->
req_len
<<
2
)
-
sizeof
(
xSetClipRectanglesReq
);
if
(
nr
&
4
)
return
(
BadLength
);
nr
>>=
3
;
result
=
SetClipRects
(
pGC
,
stuff
->
xOrigin
,
stuff
->
yOrigin
,
nr
,
(
xRectangle
*
)
&
stuff
[
1
],
(
int
)
stuff
->
ordering
);
if
(
client
->
noClientException
!=
Success
)
return
(
client
->
noClientException
);
else
return
(
result
);
}
int
ProcFreeGC
(
register
ClientPtr
client
)
{
register
GC
*
pGC
;
REQUEST
(
xResourceReq
);
REQUEST_SIZE_MATCH
(
xResourceReq
);
SECURITY_VERIFY_GC
(
pGC
,
stuff
->
id
,
client
,
SecurityDestroyAccess
);
FreeResource
(
stuff
->
id
,
RT_NONE
);
return
(
client
->
noClientException
);
}
int
ProcClearToBackground
(
register
ClientPtr
client
)
{
REQUEST
(
xClearAreaReq
);
register
WindowPtr
pWin
;
REQUEST_SIZE_MATCH
(
xClearAreaReq
);
pWin
=
(
WindowPtr
)
SecurityLookupWindow
(
stuff
->
window
,
client
,
SecurityWriteAccess
);
if
(
!
pWin
)
return
(
BadWindow
);
if
(
pWin
->
drawable
.
class
==
InputOnly
)
{
client
->
errorValue
=
stuff
->
window
;
return
(
BadMatch
);
}
if
((
stuff
->
exposures
!=
xTrue
)
&&
(
stuff
->
exposures
!=
xFalse
))
{
client
->
errorValue
=
stuff
->
exposures
;
return
(
BadValue
);
}
(
*
pWin
->
drawable
.
pScreen
->
ClearToBackground
)(
pWin
,
stuff
->
x
,
stuff
->
y
,
stuff
->
width
,
stuff
->
height
,
(
Bool
)
stuff
->
exposures
);
return
(
client
->
noClientException
);
}
int
ProcCopyArea
(
register
ClientPtr
client
)
{
register
DrawablePtr
pDst
;
register
DrawablePtr
pSrc
;
register
GC
*
pGC
;
REQUEST
(
xCopyAreaReq
);
RegionPtr
pRgn
;
REQUEST_SIZE_MATCH
(
xCopyAreaReq
);
VALIDATE_DRAWABLE_AND_GC
(
stuff
->
dstDrawable
,
pDst
,
pGC
,
client
);
if
(
stuff
->
dstDrawable
!=
stuff
->
srcDrawable
)
{
SECURITY_VERIFY_DRAWABLE
(
pSrc
,
stuff
->
srcDrawable
,
client
,
SecurityReadAccess
);
if
((
pDst
->
pScreen
!=
pSrc
->
pScreen
)
||
(
pDst
->
depth
!=
pSrc
->
depth
))
{
client
->
errorValue
=
stuff
->
dstDrawable
;
return
(
BadMatch
);
}
}
else
pSrc
=
pDst
;
SET_DBE_SRCBUF
(
pSrc
,
stuff
->
srcDrawable
);
pRgn
=
(
*
pGC
->
ops
->
CopyArea
)(
pSrc
,
pDst
,
pGC
,
stuff
->
srcX
,
stuff
->
srcY
,
stuff
->
width
,
stuff
->
height
,
stuff
->
dstX
,
stuff
->
dstY
);
if
(
pGC
->
graphicsExposures
)
{
(
*
pDst
->
pScreen
->
SendGraphicsExpose
)
(
client
,
pRgn
,
stuff
->
dstDrawable
,
X_CopyArea
,
0
);
if
(
pRgn
)
RegionDestroy
(
pRgn
);
}
return
(
client
->
noClientException
);
}
int
ProcCopyPlane
(
register
ClientPtr
client
)
{
register
DrawablePtr
psrcDraw
,
pdstDraw
;
register
GC
*
pGC
;
REQUEST
(
xCopyPlaneReq
);
RegionPtr
pRgn
;
REQUEST_SIZE_MATCH
(
xCopyPlaneReq
);
VALIDATE_DRAWABLE_AND_GC
(
stuff
->
dstDrawable
,
pdstDraw
,
pGC
,
client
);
if
(
stuff
->
dstDrawable
!=
stuff
->
srcDrawable
)
{
SECURITY_VERIFY_DRAWABLE
(
psrcDraw
,
stuff
->
srcDrawable
,
client
,
SecurityReadAccess
);
if
(
pdstDraw
->
pScreen
!=
psrcDraw
->
pScreen
)
{
client
->
errorValue
=
stuff
->
dstDrawable
;
return
(
BadMatch
);
}
}
else
psrcDraw
=
pdstDraw
;
SET_DBE_SRCBUF
(
psrcDraw
,
stuff
->
srcDrawable
);
/* Check to see if stuff->bitPlane has exactly ONE good bit set */
if
(
stuff
->
bitPlane
==
0
||
(
stuff
->
bitPlane
&
(
stuff
->
bitPlane
-
1
))
||
(
stuff
->
bitPlane
>
(
1L
<<
(
psrcDraw
->
depth
-
1
))))
{
client
->
errorValue
=
stuff
->
bitPlane
;
return
(
BadValue
);
}
pRgn
=
(
*
pGC
->
ops
->
CopyPlane
)(
psrcDraw
,
pdstDraw
,
pGC
,
stuff
->
srcX
,
stuff
->
srcY
,
stuff
->
width
,
stuff
->
height
,
stuff
->
dstX
,
stuff
->
dstY
,
stuff
->
bitPlane
);
if
(
pGC
->
graphicsExposures
)
{
(
*
pdstDraw
->
pScreen
->
SendGraphicsExpose
)
(
client
,
pRgn
,
stuff
->
dstDrawable
,
X_CopyPlane
,
0
);
if
(
pRgn
)
RegionDestroy
(
pRgn
);
}
return
(
client
->
noClientException
);
}
int
ProcPolyPoint
(
register
ClientPtr
client
)
{
int
npoint
;
register
GC
*
pGC
;
register
DrawablePtr
pDraw
;
REQUEST
(
xPolyPointReq
);
REQUEST_AT_LEAST_SIZE
(
xPolyPointReq
);
if
((
stuff
->
coordMode
!=
CoordModeOrigin
)
&&
(
stuff
->
coordMode
!=
CoordModePrevious
))
if
(
stuff
->
timeout
<
-
1
)
{
client
->
errorValue
=
stuff
->
coordMode
;
client
->
errorValue
=
stuff
->
timeout
;
return
BadValue
;
}
VALIDATE_DRAWABLE_AND_GC
(
stuff
->
drawable
,
pDraw
,
pGC
,
client
);
npoint
=
((
client
->
req_len
<<
2
)
-
sizeof
(
xPolyPointReq
))
>>
2
;
if
(
npoint
)
{
(
*
pGC
->
ops
->
PolyPoint
)(
pDraw
,
pGC
,
stuff
->
coordMode
,
npoint
,
(
xPoint
*
)
&
stuff
[
1
]);
}
return
(
client
->
noClientException
);
}
int
ProcPolyLine
(
register
ClientPtr
client
)
{
int
npoint
;
register
GC
*
pGC
;
register
DrawablePtr
pDraw
;
REQUEST
(
xPolyLineReq
);
REQUEST_AT_LEAST_SIZE
(
xPolyLineReq
);
if
((
stuff
->
coordMode
!=
CoordModeOrigin
)
&&
(
stuff
->
coordMode
!=
CoordModePrevious
))
if
(
stuff
->
interval
<
-
1
)
{
client
->
errorValue
=
stuff
->
coordMode
;
client
->
errorValue
=
stuff
->
interval
;
return
BadValue
;
}
VALIDATE_DRAWABLE_AND_GC
(
stuff
->
drawable
,
pDraw
,
pGC
,
client
);
npoint
=
((
client
->
req_len
<<
2
)
-
sizeof
(
xPolyLineReq
))
>>
2
;
if
(
npoint
>
1
)
{
(
*
pGC
->
ops
->
Polylines
)(
pDraw
,
pGC
,
stuff
->
coordMode
,
npoint
,
(
DDXPointPtr
)
&
stuff
[
1
]);
}
return
(
client
->
noClientException
);
}
int
ProcPolySegment
(
register
ClientPtr
client
)
{
int
nsegs
;
register
GC
*
pGC
;
register
DrawablePtr
pDraw
;
REQUEST
(
xPolySegmentReq
);
REQUEST_AT_LEAST_SIZE
(
xPolySegmentReq
);
VALIDATE_DRAWABLE_AND_GC
(
stuff
->
drawable
,
pDraw
,
pGC
,
client
);
nsegs
=
(
client
->
req_len
<<
2
)
-
sizeof
(
xPolySegmentReq
);
if
(
nsegs
&
4
)
return
(
BadLength
);
nsegs
>>=
3
;
if
(
nsegs
)
{
(
*
pGC
->
ops
->
PolySegment
)(
pDraw
,
pGC
,
nsegs
,
(
xSegment
*
)
&
stuff
[
1
]);
}
return
(
client
->
noClientException
);
}
int
ProcPolyRectangle
(
register
ClientPtr
client
)
{
int
nrects
;
register
GC
*
pGC
;
register
DrawablePtr
pDraw
;
REQUEST
(
xPolyRectangleReq
);
REQUEST_AT_LEAST_SIZE
(
xPolyRectangleReq
);
VALIDATE_DRAWABLE_AND_GC
(
stuff
->
drawable
,
pDraw
,
pGC
,
client
);
nrects
=
(
client
->
req_len
<<
2
)
-
sizeof
(
xPolyRectangleReq
);
if
(
nrects
&
4
)
return
(
BadLength
);
nrects
>>=
3
;
if
(
nrects
)
{
(
*
pGC
->
ops
->
PolyRectangle
)(
pDraw
,
pGC
,
nrects
,
(
xRectangle
*
)
&
stuff
[
1
]);
}
return
(
client
->
noClientException
);
}
int
ProcPolyArc
(
register
ClientPtr
client
)
{
int
narcs
;
register
GC
*
pGC
;
register
DrawablePtr
pDraw
;
REQUEST
(
xPolyArcReq
);
REQUEST_AT_LEAST_SIZE
(
xPolyArcReq
);
VALIDATE_DRAWABLE_AND_GC
(
stuff
->
drawable
,
pDraw
,
pGC
,
client
);
narcs
=
(
client
->
req_len
<<
2
)
-
sizeof
(
xPolyArcReq
);
if
(
narcs
%
sizeof
(
xArc
))
return
(
BadLength
);
narcs
/=
sizeof
(
xArc
);
if
(
narcs
)
{
(
*
pGC
->
ops
->
PolyArc
)(
pDraw
,
pGC
,
narcs
,
(
xArc
*
)
&
stuff
[
1
]);
}
return
(
client
->
noClientException
);
}
/*
* The NX agent uses the screen saver procedure
* to monitor the user activities and launch its
* handlers (like timeout feature), so we can't
* always allow the clients to change our values.
*/
int
ProcFillPoly
(
register
ClientPtr
client
)
{
int
things
;
register
GC
*
pGC
;
register
DrawablePtr
pDraw
;
REQUEST
(
xFillPolyReq
);
REQUEST_AT_LEAST_SIZE
(
xFillPolyReq
);
if
((
stuff
->
shape
!=
Complex
)
&&
(
stuff
->
shape
!=
Nonconvex
)
&&
(
stuff
->
shape
!=
Convex
))
{
client
->
errorValue
=
stuff
->
shape
;
return
BadValue
;
}
if
((
stuff
->
coordMode
!=
CoordModeOrigin
)
&&
(
stuff
->
coordMode
!=
CoordModePrevious
))
{
client
->
errorValue
=
stuff
->
coordMode
;
return
BadValue
;
}
VALIDATE_DRAWABLE_AND_GC
(
stuff
->
drawable
,
pDraw
,
pGC
,
client
);
things
=
((
client
->
req_len
<<
2
)
-
sizeof
(
xFillPolyReq
))
>>
2
;
if
(
things
)
{
(
*
pGC
->
ops
->
FillPolygon
)
(
pDraw
,
pGC
,
stuff
->
shape
,
stuff
->
coordMode
,
things
,
(
DDXPointPtr
)
&
stuff
[
1
]);
}
return
(
client
->
noClientException
);
}
int
ProcPolyFillRectangle
(
register
ClientPtr
client
)
{
int
things
;
register
GC
*
pGC
;
register
DrawablePtr
pDraw
;
REQUEST
(
xPolyFillRectangleReq
);
REQUEST_AT_LEAST_SIZE
(
xPolyFillRectangleReq
);
VALIDATE_DRAWABLE_AND_GC
(
stuff
->
drawable
,
pDraw
,
pGC
,
client
);
things
=
(
client
->
req_len
<<
2
)
-
sizeof
(
xPolyFillRectangleReq
);
if
(
things
&
4
)
return
(
BadLength
);
things
>>=
3
;
if
(
things
)
{
(
*
pGC
->
ops
->
PolyFillRect
)
(
pDraw
,
pGC
,
things
,
(
xRectangle
*
)
&
stuff
[
1
]);
}
return
(
client
->
noClientException
);
}
int
ProcPolyFillArc
(
register
ClientPtr
client
)
{
int
narcs
;
register
GC
*
pGC
;
register
DrawablePtr
pDraw
;
REQUEST
(
xPolyFillArcReq
);
REQUEST_AT_LEAST_SIZE
(
xPolyFillArcReq
);
VALIDATE_DRAWABLE_AND_GC
(
stuff
->
drawable
,
pDraw
,
pGC
,
client
);
narcs
=
(
client
->
req_len
<<
2
)
-
sizeof
(
xPolyFillArcReq
);
if
(
narcs
%
sizeof
(
xArc
))
return
(
BadLength
);
narcs
/=
sizeof
(
xArc
);
if
(
narcs
)
{
(
*
pGC
->
ops
->
PolyFillArc
)
(
pDraw
,
pGC
,
narcs
,
(
xArc
*
)
&
stuff
[
1
]);
}
return
(
client
->
noClientException
);
}
#ifdef MATCH_CLIENT_ENDIAN
int
ServerOrder
(
void
)
{
int
whichbyte
=
1
;
if
(
*
((
char
*
)
&
whichbyte
))
return
LSBFirst
;
return
MSBFirst
;
}
#define ClientOrder(client) ((client)->swapped ? !ServerOrder() : ServerOrder())
void
ReformatImage
(
char
*
base
,
int
nbytes
,
int
bpp
,
int
order
)
{
switch
(
bpp
)
{
case
1
:
/* yuck */
if
(
BITMAP_BIT_ORDER
!=
order
)
BitOrderInvert
((
unsigned
char
*
)
base
,
nbytes
);
#if IMAGE_BYTE_ORDER != BITMAP_BIT_ORDER && BITMAP_SCANLINE_UNIT != 8
ReformatImage
(
base
,
nbytes
,
BITMAP_SCANLINE_UNIT
,
order
);
#endif
break
;
case
4
:
break
;
/* yuck */
case
8
:
break
;
case
16
:
if
(
IMAGE_BYTE_ORDER
!=
order
)
TwoByteSwap
((
unsigned
char
*
)
base
,
nbytes
);
break
;
case
32
:
if
(
IMAGE_BYTE_ORDER
!=
order
)
FourByteSwap
((
unsigned
char
*
)
base
,
nbytes
);
break
;
}
}
#else
#define ReformatImage(b,n,bpp,o)
#endif
/* 64-bit server notes: the protocol restricts padding of images to
* 8-, 16-, or 32-bits. We would like to have 64-bits for the server
* to use internally. Removes need for internal alignment checking.
* All of the PutImage functions could be changed individually, but
* as currently written, they call other routines which require things
* to be 64-bit padded on scanlines, so we changed things here.
* If an image would be padded differently for 64- versus 32-, then
* copy each scanline to a 64-bit padded scanline.
* Also, we need to make sure that the image is aligned on a 64-bit
* boundary, even if the scanlines are padded to our satisfaction.
*/
int
ProcPutImage
(
register
ClientPtr
client
)
{
register
GC
*
pGC
;
register
DrawablePtr
pDraw
;
long
length
;
/* length of scanline server padded */
long
lengthProto
;
/* length of scanline protocol padded */
char
*
tmpImage
;
REQUEST
(
xPutImageReq
);
REQUEST_AT_LEAST_SIZE
(
xPutImageReq
);
VALIDATE_DRAWABLE_AND_GC
(
stuff
->
drawable
,
pDraw
,
pGC
,
client
);
if
(
stuff
->
format
==
XYBitmap
)
{
if
((
stuff
->
depth
!=
1
)
||
(
stuff
->
leftPad
>=
(
unsigned
int
)
screenInfo
.
bitmapScanlinePad
))
return
BadMatch
;
length
=
BitmapBytePad
(
stuff
->
width
+
stuff
->
leftPad
);
}
else
if
(
stuff
->
format
==
XYPixmap
)
{
if
((
pDraw
->
depth
!=
stuff
->
depth
)
||
(
stuff
->
leftPad
>=
(
unsigned
int
)
screenInfo
.
bitmapScanlinePad
))
return
BadMatch
;
length
=
BitmapBytePad
(
stuff
->
width
+
stuff
->
leftPad
);
length
*=
stuff
->
depth
;
}
else
if
(
stuff
->
format
==
ZPixmap
)
{
if
((
pDraw
->
depth
!=
stuff
->
depth
)
||
(
stuff
->
leftPad
!=
0
))
return
BadMatch
;
length
=
PixmapBytePad
(
stuff
->
width
,
stuff
->
depth
);
}
else
{
client
->
errorValue
=
stuff
->
format
;
return
BadValue
;
}
tmpImage
=
(
char
*
)
&
stuff
[
1
];
lengthProto
=
length
;
if
(
stuff
->
height
!=
0
&&
lengthProto
>=
(
INT32_MAX
/
stuff
->
height
))
return
BadLength
;
if
(((((
lengthProto
*
stuff
->
height
)
+
(
unsigned
)
3
)
>>
2
)
+
(
sizeof
(
xPutImageReq
)
>>
2
))
!=
client
->
req_len
)
return
BadLength
;
ReformatImage
(
tmpImage
,
lengthProto
*
stuff
->
height
,
stuff
->
format
==
ZPixmap
?
BitsPerPixel
(
stuff
->
depth
)
:
1
,
ClientOrder
(
client
));
(
*
pGC
->
ops
->
PutImage
)
(
pDraw
,
pGC
,
stuff
->
depth
,
stuff
->
dstX
,
stuff
->
dstY
,
stuff
->
width
,
stuff
->
height
,
stuff
->
leftPad
,
stuff
->
format
,
tmpImage
);
return
(
client
->
noClientException
);
}
int
DoGetImage
(
register
ClientPtr
client
,
int
format
,
Drawable
drawable
,
int
x
,
int
y
,
int
width
,
int
height
,
Mask
planemask
,
xGetImageReply
**
im_return
)
{
register
DrawablePtr
pDraw
;
int
nlines
,
linesPerBuf
;
register
int
linesDone
;
long
widthBytesLine
,
length
;
Mask
plane
=
0
;
char
*
pBuf
;
xGetImageReply
xgi
;
#ifdef XCSECURITY
RegionPtr
pVisibleRegion
=
NULL
;
#endif
if
((
format
!=
XYPixmap
)
&&
(
format
!=
ZPixmap
))
{
client
->
errorValue
=
format
;
return
(
BadValue
);
}
SECURITY_VERIFY_DRAWABLE
(
pDraw
,
drawable
,
client
,
SecurityReadAccess
);
memset
(
&
xgi
,
0
,
sizeof
(
xGetImageReply
));
if
(
pDraw
->
type
==
DRAWABLE_WINDOW
)
{
if
(
/* check for being viewable */
!
((
WindowPtr
)
pDraw
)
->
realized
||
/* check for being on screen */
pDraw
->
x
+
x
<
0
||
pDraw
->
x
+
x
+
width
>
pDraw
->
pScreen
->
width
||
pDraw
->
y
+
y
<
0
||
pDraw
->
y
+
y
+
height
>
pDraw
->
pScreen
->
height
||
/* check for being inside of border */
x
<
-
wBorderWidth
((
WindowPtr
)
pDraw
)
||
x
+
width
>
wBorderWidth
((
WindowPtr
)
pDraw
)
+
(
int
)
pDraw
->
width
||
y
<
-
wBorderWidth
((
WindowPtr
)
pDraw
)
||
y
+
height
>
wBorderWidth
((
WindowPtr
)
pDraw
)
+
(
int
)
pDraw
->
height
)
return
(
BadMatch
);
xgi
.
visual
=
wVisual
(((
WindowPtr
)
pDraw
));
}
else
{
if
(
x
<
0
||
x
+
width
>
(
int
)
pDraw
->
width
||
y
<
0
||
y
+
height
>
(
int
)
pDraw
->
height
)
return
(
BadMatch
);
xgi
.
visual
=
None
;
}
SET_DBE_SRCBUF
(
pDraw
,
drawable
);
xgi
.
type
=
X_Reply
;
xgi
.
sequenceNumber
=
client
->
sequence
;
xgi
.
depth
=
pDraw
->
depth
;
if
(
format
==
ZPixmap
)
{
widthBytesLine
=
PixmapBytePad
(
width
,
pDraw
->
depth
);
length
=
widthBytesLine
*
height
;
}
else
{
widthBytesLine
=
BitmapBytePad
(
width
);
plane
=
((
Mask
)
1
)
<<
(
pDraw
->
depth
-
1
);
/* only planes asked for */
length
=
widthBytesLine
*
height
*
Ones
(
planemask
&
(
plane
|
(
plane
-
1
)));
}
xgi
.
length
=
length
;
if
(
im_return
)
{
pBuf
=
(
char
*
)
xcalloc
(
1
,
sz_xGetImageReply
+
length
);
if
(
!
pBuf
)
return
(
BadAlloc
);
if
(
widthBytesLine
==
0
)
linesPerBuf
=
0
;
else
linesPerBuf
=
height
;
*
im_return
=
(
xGetImageReply
*
)
pBuf
;
*
(
xGetImageReply
*
)
pBuf
=
xgi
;
pBuf
+=
sz_xGetImageReply
;
}
else
{
xgi
.
length
=
(
xgi
.
length
+
3
)
>>
2
;
if
(
widthBytesLine
==
0
||
height
==
0
)
linesPerBuf
=
0
;
else
if
(
widthBytesLine
>=
IMAGE_BUFSIZE
)
linesPerBuf
=
1
;
else
{
linesPerBuf
=
IMAGE_BUFSIZE
/
widthBytesLine
;
if
(
linesPerBuf
>
height
)
linesPerBuf
=
height
;
}
length
=
linesPerBuf
*
widthBytesLine
;
if
(
linesPerBuf
<
height
)
{
/* we have to make sure intermediate buffers don't need padding */
while
((
linesPerBuf
>
1
)
&&
(
length
&
((
1L
<<
LOG2_BYTES_PER_SCANLINE_PAD
)
-
1
)))
{
linesPerBuf
--
;
length
-=
widthBytesLine
;
}
while
(
length
&
((
1L
<<
LOG2_BYTES_PER_SCANLINE_PAD
)
-
1
))
{
linesPerBuf
++
;
length
+=
widthBytesLine
;
}
}
if
(
!
(
pBuf
=
(
char
*
)
ALLOCATE_LOCAL
(
length
)))
return
(
BadAlloc
);
memset
(
pBuf
,
0
,
length
);
WriteReplyToClient
(
client
,
sizeof
(
xGetImageReply
),
&
xgi
);
}
#ifdef XCSECURITY
if
(
client
->
trustLevel
!=
XSecurityClientTrusted
&&
pDraw
->
type
==
DRAWABLE_WINDOW
)
{
pVisibleRegion
=
NotClippedByChildren
((
WindowPtr
)
pDraw
);
if
(
pVisibleRegion
)
{
RegionTranslate
(
pVisibleRegion
,
-
pDraw
->
x
,
-
pDraw
->
y
);
}
}
#endif
if
(
linesPerBuf
==
0
)
{
/* nothing to do */
}
else
if
(
format
==
ZPixmap
)
{
linesDone
=
0
;
while
(
height
-
linesDone
>
0
)
{
nlines
=
min
(
linesPerBuf
,
height
-
linesDone
);
(
*
pDraw
->
pScreen
->
GetImage
)
(
pDraw
,
x
,
y
+
linesDone
,
width
,
nlines
,
format
,
planemask
,
(
void
*
)
pBuf
);
#ifdef XCSECURITY
if
(
pVisibleRegion
)
SecurityCensorImage
(
client
,
pVisibleRegion
,
widthBytesLine
,
pDraw
,
x
,
y
+
linesDone
,
width
,
nlines
,
format
,
pBuf
);
#endif
/* Note that this is NOT a call to WriteSwappedDataToClient,
as we do NOT byte swap */
if
(
!
im_return
)
{
ReformatImage
(
pBuf
,
(
int
)(
nlines
*
widthBytesLine
),
BitsPerPixel
(
pDraw
->
depth
),
ClientOrder
(
client
));
/* Don't split me, gcc pukes when you do */
(
void
)
WriteToClient
(
client
,
(
int
)(
nlines
*
widthBytesLine
),
pBuf
);
}
linesDone
+=
nlines
;
}
}
else
/* XYPixmap */
{
for
(;
plane
;
plane
>>=
1
)
{
if
(
planemask
&
plane
)
{
linesDone
=
0
;
while
(
height
-
linesDone
>
0
)
{
nlines
=
min
(
linesPerBuf
,
height
-
linesDone
);
(
*
pDraw
->
pScreen
->
GetImage
)
(
pDraw
,
x
,
y
+
linesDone
,
width
,
nlines
,
format
,
plane
,
(
void
*
)
pBuf
);
#ifdef XCSECURITY
if
(
pVisibleRegion
)
SecurityCensorImage
(
client
,
pVisibleRegion
,
widthBytesLine
,
pDraw
,
x
,
y
+
linesDone
,
width
,
nlines
,
format
,
pBuf
);
#endif
/* Note: NOT a call to WriteSwappedDataToClient,
as we do NOT byte swap */
if
(
im_return
)
{
pBuf
+=
nlines
*
widthBytesLine
;
}
else
{
ReformatImage
(
pBuf
,
(
int
)(
nlines
*
widthBytesLine
),
1
,
ClientOrder
(
client
));
/* Don't split me, gcc pukes when you do */
(
void
)
WriteToClient
(
client
,
(
int
)(
nlines
*
widthBytesLine
),
pBuf
);
}
linesDone
+=
nlines
;
}
}
}
}
#ifdef XCSECURITY
if
(
pVisibleRegion
)
RegionDestroy
(
pVisibleRegion
);
#endif
if
(
!
im_return
)
DEALLOCATE_LOCAL
(
pBuf
);
return
(
client
->
noClientException
);
}
int
ProcGetImage
(
register
ClientPtr
client
)
{
REQUEST
(
xGetImageReq
);
REQUEST_SIZE_MATCH
(
xGetImageReq
);
return
DoGetImage
(
client
,
stuff
->
format
,
stuff
->
drawable
,
stuff
->
x
,
stuff
->
y
,
(
int
)
stuff
->
width
,
(
int
)
stuff
->
height
,
stuff
->
planeMask
,
(
xGetImageReply
**
)
NULL
);
}
int
ProcPolyText
(
register
ClientPtr
client
)
{
int
err
;
REQUEST
(
xPolyTextReq
);
DrawablePtr
pDraw
;
GC
*
pGC
;
REQUEST_AT_LEAST_SIZE
(
xPolyTextReq
);
VALIDATE_DRAWABLE_AND_GC
(
stuff
->
drawable
,
pDraw
,
pGC
,
client
);
err
=
PolyText
(
client
,
pDraw
,
pGC
,
(
unsigned
char
*
)
&
stuff
[
1
],
((
unsigned
char
*
)
stuff
)
+
(
client
->
req_len
<<
2
),
stuff
->
x
,
stuff
->
y
,
stuff
->
reqType
,
stuff
->
drawable
);
if
(
err
==
Success
)
{
return
(
client
->
noClientException
);
}
else
return
err
;
}
int
ProcImageText8
(
register
ClientPtr
client
)
{
int
err
;
register
DrawablePtr
pDraw
;
register
GC
*
pGC
;
REQUEST
(
xImageTextReq
);
REQUEST_FIXED_SIZE
(
xImageTextReq
,
stuff
->
nChars
);
VALIDATE_DRAWABLE_AND_GC
(
stuff
->
drawable
,
pDraw
,
pGC
,
client
);
err
=
ImageText
(
client
,
pDraw
,
pGC
,
stuff
->
nChars
,
(
unsigned
char
*
)
&
stuff
[
1
],
stuff
->
x
,
stuff
->
y
,
stuff
->
reqType
,
stuff
->
drawable
);
if
(
err
==
Success
)
{
return
(
client
->
noClientException
);
}
else
return
err
;
}
int
ProcImageText16
(
register
ClientPtr
client
)
{
int
err
;
register
DrawablePtr
pDraw
;
register
GC
*
pGC
;
REQUEST
(
xImageTextReq
);
REQUEST_FIXED_SIZE
(
xImageTextReq
,
stuff
->
nChars
<<
1
);
VALIDATE_DRAWABLE_AND_GC
(
stuff
->
drawable
,
pDraw
,
pGC
,
client
);
err
=
ImageText
(
client
,
pDraw
,
pGC
,
stuff
->
nChars
,
(
unsigned
char
*
)
&
stuff
[
1
],
stuff
->
x
,
stuff
->
y
,
stuff
->
reqType
,
stuff
->
drawable
);
if
(
err
==
Success
)
{
return
(
client
->
noClientException
);
}
else
return
err
;
}
int
ProcCreateColormap
(
register
ClientPtr
client
)
{
VisualPtr
pVisual
;
ColormapPtr
pmap
;
Colormap
mid
;
register
WindowPtr
pWin
;
ScreenPtr
pScreen
;
REQUEST
(
xCreateColormapReq
);
int
i
,
result
;
REQUEST_SIZE_MATCH
(
xCreateColormapReq
);
if
((
stuff
->
alloc
!=
AllocNone
)
&&
(
stuff
->
alloc
!=
AllocAll
))
{
client
->
errorValue
=
stuff
->
alloc
;
return
(
BadValue
);
}
mid
=
stuff
->
mid
;
LEGAL_NEW_RESOURCE
(
mid
,
client
);
pWin
=
(
WindowPtr
)
SecurityLookupWindow
(
stuff
->
window
,
client
,
SecurityReadAccess
);
if
(
!
pWin
)
return
(
BadWindow
);
pScreen
=
pWin
->
drawable
.
pScreen
;
for
(
i
=
0
,
pVisual
=
pScreen
->
visuals
;
i
<
pScreen
->
numVisuals
;
i
++
,
pVisual
++
)
{
if
(
pVisual
->
vid
!=
stuff
->
visual
)
continue
;
result
=
CreateColormap
(
mid
,
pScreen
,
pVisual
,
&
pmap
,
(
int
)
stuff
->
alloc
,
client
->
index
);
if
(
client
->
noClientException
!=
Success
)
return
(
client
->
noClientException
);
else
return
(
result
);
}
client
->
errorValue
=
stuff
->
visual
;
return
(
BadValue
);
}
int
ProcFreeColormap
(
register
ClientPtr
client
)
{
ColormapPtr
pmap
;
REQUEST
(
xResourceReq
);
REQUEST_SIZE_MATCH
(
xResourceReq
);
pmap
=
(
ColormapPtr
)
SecurityLookupIDByType
(
client
,
stuff
->
id
,
RT_COLORMAP
,
SecurityDestroyAccess
);
if
(
pmap
)
{
/* Freeing a default colormap is a no-op */
if
(
!
(
pmap
->
flags
&
IsDefault
))
FreeResource
(
stuff
->
id
,
RT_NONE
);
return
(
client
->
noClientException
);
}
else
{
client
->
errorValue
=
stuff
->
id
;
return
(
BadColor
);
}
}
int
ProcCopyColormapAndFree
(
register
ClientPtr
client
)
{
Colormap
mid
;
ColormapPtr
pSrcMap
;
REQUEST
(
xCopyColormapAndFreeReq
);
int
result
;
REQUEST_SIZE_MATCH
(
xCopyColormapAndFreeReq
);
mid
=
stuff
->
mid
;
LEGAL_NEW_RESOURCE
(
mid
,
client
);
if
(
(
pSrcMap
=
(
ColormapPtr
)
SecurityLookupIDByType
(
client
,
stuff
->
srcCmap
,
RT_COLORMAP
,
SecurityReadAccess
|
SecurityWriteAccess
))
)
{
result
=
CopyColormapAndFree
(
mid
,
pSrcMap
,
client
->
index
);
if
(
client
->
noClientException
!=
Success
)
return
(
client
->
noClientException
);
else
return
(
result
);
}
else
{
client
->
errorValue
=
stuff
->
srcCmap
;
return
(
BadColor
);
}
}
int
ProcInstallColormap
(
register
ClientPtr
client
)
{
ColormapPtr
pcmp
;
REQUEST
(
xResourceReq
);
REQUEST_SIZE_MATCH
(
xResourceReq
);
pcmp
=
(
ColormapPtr
)
SecurityLookupIDByType
(
client
,
stuff
->
id
,
RT_COLORMAP
,
SecurityReadAccess
);
if
(
pcmp
)
{
(
*
(
pcmp
->
pScreen
->
InstallColormap
))
(
pcmp
);
return
(
client
->
noClientException
);
}
else
{
client
->
errorValue
=
stuff
->
id
;
return
(
BadColor
);
}
}
int
ProcUninstallColormap
(
register
ClientPtr
client
)
{
ColormapPtr
pcmp
;
REQUEST
(
xResourceReq
);
REQUEST_SIZE_MATCH
(
xResourceReq
);
pcmp
=
(
ColormapPtr
)
SecurityLookupIDByType
(
client
,
stuff
->
id
,
RT_COLORMAP
,
SecurityReadAccess
);
if
(
pcmp
)
{
if
(
pcmp
->
mid
!=
pcmp
->
pScreen
->
defColormap
)
(
*
(
pcmp
->
pScreen
->
UninstallColormap
))
(
pcmp
);
return
(
client
->
noClientException
);
}
else
{
client
->
errorValue
=
stuff
->
id
;
return
(
BadColor
);
}
}
int
ProcListInstalledColormaps
(
register
ClientPtr
client
)
{
xListInstalledColormapsReply
*
preply
;
int
nummaps
;
WindowPtr
pWin
;
REQUEST
(
xResourceReq
);
REQUEST_SIZE_MATCH
(
xResourceReq
);
pWin
=
(
WindowPtr
)
SecurityLookupWindow
(
stuff
->
id
,
client
,
SecurityReadAccess
);
if
(
!
pWin
)
return
(
BadWindow
);
preply
=
(
xListInstalledColormapsReply
*
)
ALLOCATE_LOCAL
(
sizeof
(
xListInstalledColormapsReply
)
+
pWin
->
drawable
.
pScreen
->
maxInstalledCmaps
*
sizeof
(
Colormap
));
if
(
!
preply
)
return
(
BadAlloc
);
preply
->
type
=
X_Reply
;
preply
->
sequenceNumber
=
client
->
sequence
;
nummaps
=
(
*
pWin
->
drawable
.
pScreen
->
ListInstalledColormaps
)
(
pWin
->
drawable
.
pScreen
,
(
Colormap
*
)
&
preply
[
1
]);
preply
->
nColormaps
=
nummaps
;
preply
->
length
=
nummaps
;
WriteReplyToClient
(
client
,
sizeof
(
xListInstalledColormapsReply
),
preply
);
client
->
pSwapReplyFunc
=
(
ReplySwapPtr
)
Swap32Write
;
WriteSwappedDataToClient
(
client
,
nummaps
*
sizeof
(
Colormap
),
&
preply
[
1
]);
DEALLOCATE_LOCAL
(
preply
);
return
(
client
->
noClientException
);
}
int
ProcAllocColor
(
register
ClientPtr
client
)
{
ColormapPtr
pmap
;
int
retval
;
xAllocColorReply
acr
;
REQUEST
(
xAllocColorReq
);
REQUEST_SIZE_MATCH
(
xAllocColorReq
);
pmap
=
(
ColormapPtr
)
SecurityLookupIDByType
(
client
,
stuff
->
cmap
,
RT_COLORMAP
,
SecurityWriteAccess
);
if
(
pmap
)
{
#ifdef LBX
/*
* If the colormap is grabbed by a proxy, the server will have
* to regain control over the colormap. This AllocColor request
* will be handled after the server gets back the colormap control.
*/
if
(
LbxCheckColorRequest
(
client
,
pmap
,
(
xReq
*
)
stuff
))
return
Success
;
#endif
acr
.
type
=
X_Reply
;
acr
.
length
=
0
;
acr
.
sequenceNumber
=
client
->
sequence
;
acr
.
red
=
stuff
->
red
;
acr
.
green
=
stuff
->
green
;
acr
.
blue
=
stuff
->
blue
;
acr
.
pixel
=
0
;
if
(
(
retval
=
AllocColor
(
pmap
,
&
acr
.
red
,
&
acr
.
green
,
&
acr
.
blue
,
&
acr
.
pixel
,
client
->
index
))
)
{
if
(
client
->
noClientException
!=
Success
)
return
(
client
->
noClientException
);
else
return
(
retval
);
}
#ifdef PANORAMIX
if
(
noPanoramiXExtension
||
!
pmap
->
pScreen
->
myNum
)
#endif
WriteReplyToClient
(
client
,
sizeof
(
xAllocColorReply
),
&
acr
);
return
(
client
->
noClientException
);
}
else
{
client
->
errorValue
=
stuff
->
cmap
;
return
(
BadColor
);
}
}
int
ProcAllocNamedColor
(
register
ClientPtr
client
)
{
ColormapPtr
pcmp
;
REQUEST
(
xAllocNamedColorReq
);
REQUEST_FIXED_SIZE
(
xAllocNamedColorReq
,
stuff
->
nbytes
);
pcmp
=
(
ColormapPtr
)
SecurityLookupIDByType
(
client
,
stuff
->
cmap
,
RT_COLORMAP
,
SecurityWriteAccess
);
if
(
pcmp
)
{
int
retval
;
xAllocNamedColorReply
ancr
;
#ifdef LBX
/*
* If the colormap is grabbed by a proxy, the server will have
* to regain control over the colormap. This AllocNamedColor request
* will be handled after the server gets back the colormap control.
*/
if
(
LbxCheckColorRequest
(
client
,
pcmp
,
(
xReq
*
)
stuff
))
return
Success
;
#endif
ancr
.
type
=
X_Reply
;
ancr
.
length
=
0
;
ancr
.
sequenceNumber
=
client
->
sequence
;
if
(
OsLookupColor
(
pcmp
->
pScreen
->
myNum
,
(
char
*
)
&
stuff
[
1
],
stuff
->
nbytes
,
&
ancr
.
exactRed
,
&
ancr
.
exactGreen
,
&
ancr
.
exactBlue
))
{
ancr
.
screenRed
=
ancr
.
exactRed
;
ancr
.
screenGreen
=
ancr
.
exactGreen
;
ancr
.
screenBlue
=
ancr
.
exactBlue
;
ancr
.
pixel
=
0
;
if
(
(
retval
=
AllocColor
(
pcmp
,
&
ancr
.
screenRed
,
&
ancr
.
screenGreen
,
&
ancr
.
screenBlue
,
&
ancr
.
pixel
,
client
->
index
))
)
{
if
(
client
->
noClientException
!=
Success
)
return
(
client
->
noClientException
);
else
return
(
retval
);
}
#ifdef PANORAMIX
if
(
noPanoramiXExtension
||
!
pcmp
->
pScreen
->
myNum
)
#endif
WriteReplyToClient
(
client
,
sizeof
(
xAllocNamedColorReply
),
&
ancr
);
return
(
client
->
noClientException
);
}
else
return
(
BadName
);
}
else
{
client
->
errorValue
=
stuff
->
cmap
;
return
(
BadColor
);
}
}
int
ProcAllocColorCells
(
register
ClientPtr
client
)
{
ColormapPtr
pcmp
;
REQUEST
(
xAllocColorCellsReq
);
REQUEST_SIZE_MATCH
(
xAllocColorCellsReq
);
pcmp
=
(
ColormapPtr
)
SecurityLookupIDByType
(
client
,
stuff
->
cmap
,
RT_COLORMAP
,
SecurityWriteAccess
);
if
(
pcmp
)
{
xAllocColorCellsReply
accr
;
int
npixels
,
nmasks
,
retval
;
long
length
;
Pixel
*
ppixels
,
*
pmasks
;
#ifdef LBX
/*
* If the colormap is grabbed by a proxy, the server will have
* to regain control over the colormap. This AllocColorCells request
* will be handled after the server gets back the colormap control.
*/
if
(
LbxCheckColorRequest
(
client
,
pcmp
,
(
xReq
*
)
stuff
))
return
Success
;
#endif
npixels
=
stuff
->
colors
;
if
(
!
npixels
)
{
client
->
errorValue
=
npixels
;
return
(
BadValue
);
}
if
(
stuff
->
contiguous
!=
xTrue
&&
stuff
->
contiguous
!=
xFalse
)
{
client
->
errorValue
=
stuff
->
contiguous
;
return
(
BadValue
);
}
nmasks
=
stuff
->
planes
;
length
=
((
long
)
npixels
+
(
long
)
nmasks
)
*
sizeof
(
Pixel
);
ppixels
=
(
Pixel
*
)
ALLOCATE_LOCAL
(
length
);
if
(
!
ppixels
)
return
(
BadAlloc
);
pmasks
=
ppixels
+
npixels
;
if
(
(
retval
=
AllocColorCells
(
client
->
index
,
pcmp
,
npixels
,
nmasks
,
(
Bool
)
stuff
->
contiguous
,
ppixels
,
pmasks
))
)
{
DEALLOCATE_LOCAL
(
ppixels
);
if
(
client
->
noClientException
!=
Success
)
return
(
client
->
noClientException
);
else
return
(
retval
);
}
#ifdef PANORAMIX
if
(
noPanoramiXExtension
||
!
pcmp
->
pScreen
->
myNum
)
#endif
{
accr
.
type
=
X_Reply
;
accr
.
length
=
length
>>
2
;
accr
.
sequenceNumber
=
client
->
sequence
;
accr
.
nPixels
=
npixels
;
accr
.
nMasks
=
nmasks
;
WriteReplyToClient
(
client
,
sizeof
(
xAllocColorCellsReply
),
&
accr
);
client
->
pSwapReplyFunc
=
(
ReplySwapPtr
)
Swap32Write
;
WriteSwappedDataToClient
(
client
,
length
,
ppixels
);
}
DEALLOCATE_LOCAL
(
ppixels
);
return
(
client
->
noClientException
);
}
else
{
client
->
errorValue
=
stuff
->
cmap
;
return
(
BadColor
);
}
}
int
ProcAllocColorPlanes
(
register
ClientPtr
client
)
{
ColormapPtr
pcmp
;
REQUEST
(
xAllocColorPlanesReq
);
REQUEST_SIZE_MATCH
(
xAllocColorPlanesReq
);
pcmp
=
(
ColormapPtr
)
SecurityLookupIDByType
(
client
,
stuff
->
cmap
,
RT_COLORMAP
,
SecurityWriteAccess
);
if
(
pcmp
)
{
xAllocColorPlanesReply
acpr
;
int
npixels
,
retval
;
long
length
;
Pixel
*
ppixels
;
#ifdef LBX
/*
* If the colormap is grabbed by a proxy, the server will have
* to regain control over the colormap. This AllocColorPlanes request
* will be handled after the server gets back the colormap control.
*/
if
(
LbxCheckColorRequest
(
client
,
pcmp
,
(
xReq
*
)
stuff
))
return
Success
;
#endif
npixels
=
stuff
->
colors
;
if
(
!
npixels
)
{
client
->
errorValue
=
npixels
;
return
(
BadValue
);
}
if
(
stuff
->
contiguous
!=
xTrue
&&
stuff
->
contiguous
!=
xFalse
)
{
client
->
errorValue
=
stuff
->
contiguous
;
return
(
BadValue
);
}
acpr
.
type
=
X_Reply
;
acpr
.
sequenceNumber
=
client
->
sequence
;
acpr
.
nPixels
=
npixels
;
length
=
(
long
)
npixels
*
sizeof
(
Pixel
);
ppixels
=
(
Pixel
*
)
ALLOCATE_LOCAL
(
length
);
if
(
!
ppixels
)
return
(
BadAlloc
);
if
(
(
retval
=
AllocColorPlanes
(
client
->
index
,
pcmp
,
npixels
,
(
int
)
stuff
->
red
,
(
int
)
stuff
->
green
,
(
int
)
stuff
->
blue
,
(
Bool
)
stuff
->
contiguous
,
ppixels
,
&
acpr
.
redMask
,
&
acpr
.
greenMask
,
&
acpr
.
blueMask
))
)
{
DEALLOCATE_LOCAL
(
ppixels
);
if
(
client
->
noClientException
!=
Success
)
return
(
client
->
noClientException
);
else
return
(
retval
);
}
acpr
.
length
=
length
>>
2
;
#ifdef PANORAMIX
if
(
noPanoramiXExtension
||
!
pcmp
->
pScreen
->
myNum
)
#endif
{
WriteReplyToClient
(
client
,
sizeof
(
xAllocColorPlanesReply
),
&
acpr
);
client
->
pSwapReplyFunc
=
(
ReplySwapPtr
)
Swap32Write
;
WriteSwappedDataToClient
(
client
,
length
,
ppixels
);
}
DEALLOCATE_LOCAL
(
ppixels
);
return
(
client
->
noClientException
);
}
else
{
client
->
errorValue
=
stuff
->
cmap
;
return
(
BadColor
);
}
}
int
ProcFreeColors
(
register
ClientPtr
client
)
{
ColormapPtr
pcmp
;
REQUEST
(
xFreeColorsReq
);
REQUEST_AT_LEAST_SIZE
(
xFreeColorsReq
);
pcmp
=
(
ColormapPtr
)
SecurityLookupIDByType
(
client
,
stuff
->
cmap
,
RT_COLORMAP
,
SecurityWriteAccess
);
if
(
pcmp
)
{
int
count
;
int
retval
;
if
(
pcmp
->
flags
&
AllAllocated
)
return
(
BadAccess
);
count
=
((
client
->
req_len
<<
2
)
-
sizeof
(
xFreeColorsReq
))
>>
2
;
retval
=
FreeColors
(
pcmp
,
client
->
index
,
count
,
(
Pixel
*
)
&
stuff
[
1
],
(
Pixel
)
stuff
->
planeMask
);
if
(
client
->
noClientException
!=
Success
)
return
(
client
->
noClientException
);
else
{
client
->
errorValue
=
clientErrorValue
;
return
(
retval
);
}
}
else
{
client
->
errorValue
=
stuff
->
cmap
;
return
(
BadColor
);
}
}
int
ProcStoreColors
(
ClientPtr
client
)
{
ColormapPtr
pcmp
;
REQUEST
(
xStoreColorsReq
);
REQUEST_AT_LEAST_SIZE
(
xStoreColorsReq
);
pcmp
=
(
ColormapPtr
)
SecurityLookupIDByType
(
client
,
stuff
->
cmap
,
RT_COLORMAP
,
SecurityWriteAccess
);
if
(
pcmp
)
{
int
count
;
int
retval
;
count
=
(
client
->
req_len
<<
2
)
-
sizeof
(
xStoreColorsReq
);
if
(
count
%
sizeof
(
xColorItem
))
return
(
BadLength
);
count
/=
sizeof
(
xColorItem
);
retval
=
StoreColors
(
pcmp
,
count
,
(
xColorItem
*
)
&
stuff
[
1
]);
if
(
client
->
noClientException
!=
Success
)
return
(
client
->
noClientException
);
else
{
client
->
errorValue
=
clientErrorValue
;
return
(
retval
);
}
}
else
{
client
->
errorValue
=
stuff
->
cmap
;
return
(
BadColor
);
}
}
int
ProcStoreNamedColor
(
register
ClientPtr
client
)
{
ColormapPtr
pcmp
;
REQUEST
(
xStoreNamedColorReq
);
REQUEST_FIXED_SIZE
(
xStoreNamedColorReq
,
stuff
->
nbytes
);
pcmp
=
(
ColormapPtr
)
SecurityLookupIDByType
(
client
,
stuff
->
cmap
,
RT_COLORMAP
,
SecurityWriteAccess
);
if
(
pcmp
)
{
xColorItem
def
;
int
retval
;
if
(
OsLookupColor
(
pcmp
->
pScreen
->
myNum
,
(
char
*
)
&
stuff
[
1
],
stuff
->
nbytes
,
&
def
.
red
,
&
def
.
green
,
&
def
.
blue
))
{
def
.
flags
=
stuff
->
flags
;
def
.
pixel
=
stuff
->
pixel
;
retval
=
StoreColors
(
pcmp
,
1
,
&
def
);
if
(
client
->
noClientException
!=
Success
)
return
(
client
->
noClientException
);
else
return
(
retval
);
}
return
(
BadName
);
}
else
{
client
->
errorValue
=
stuff
->
cmap
;
return
(
BadColor
);
}
}
int
ProcQueryColors
(
register
ClientPtr
client
)
{
ColormapPtr
pcmp
;
REQUEST
(
xQueryColorsReq
);
REQUEST_AT_LEAST_SIZE
(
xQueryColorsReq
);
pcmp
=
(
ColormapPtr
)
SecurityLookupIDByType
(
client
,
stuff
->
cmap
,
RT_COLORMAP
,
SecurityReadAccess
);
if
(
pcmp
)
{
int
count
,
retval
;
xrgb
*
prgbs
;
xQueryColorsReply
qcr
;
count
=
((
client
->
req_len
<<
2
)
-
sizeof
(
xQueryColorsReq
))
>>
2
;
prgbs
=
(
xrgb
*
)
ALLOCATE_LOCAL
(
count
*
sizeof
(
xrgb
));
if
(
!
prgbs
&&
count
)
return
(
BadAlloc
);
memset
(
prgbs
,
0
,
count
*
sizeof
(
xrgb
));
if
(
(
retval
=
QueryColors
(
pcmp
,
count
,
(
Pixel
*
)
&
stuff
[
1
],
prgbs
))
)
{
if
(
prgbs
)
DEALLOCATE_LOCAL
(
prgbs
);
if
(
client
->
noClientException
!=
Success
)
return
(
client
->
noClientException
);
else
{
client
->
errorValue
=
clientErrorValue
;
return
(
retval
);
}
}
memset
(
&
qcr
,
0
,
sizeof
(
xQueryColorsReply
));
qcr
.
type
=
X_Reply
;
qcr
.
length
=
(
count
*
sizeof
(
xrgb
))
>>
2
;
qcr
.
sequenceNumber
=
client
->
sequence
;
qcr
.
nColors
=
count
;
WriteReplyToClient
(
client
,
sizeof
(
xQueryColorsReply
),
&
qcr
);
if
(
count
)
{
client
->
pSwapReplyFunc
=
(
ReplySwapPtr
)
SQColorsExtend
;
WriteSwappedDataToClient
(
client
,
count
*
sizeof
(
xrgb
),
prgbs
);
}
if
(
prgbs
)
DEALLOCATE_LOCAL
(
prgbs
);
return
(
client
->
noClientException
);
}
else
{
client
->
errorValue
=
stuff
->
cmap
;
return
(
BadColor
);
}
}
int
ProcLookupColor
(
register
ClientPtr
client
)
{
ColormapPtr
pcmp
;
REQUEST
(
xLookupColorReq
);
REQUEST_FIXED_SIZE
(
xLookupColorReq
,
stuff
->
nbytes
);
pcmp
=
(
ColormapPtr
)
SecurityLookupIDByType
(
client
,
stuff
->
cmap
,
RT_COLORMAP
,
SecurityReadAccess
);
if
(
pcmp
)
{
xLookupColorReply
lcr
;
if
(
OsLookupColor
(
pcmp
->
pScreen
->
myNum
,
(
char
*
)
&
stuff
[
1
],
stuff
->
nbytes
,
&
lcr
.
exactRed
,
&
lcr
.
exactGreen
,
&
lcr
.
exactBlue
))
{
lcr
.
type
=
X_Reply
;
lcr
.
length
=
0
;
lcr
.
sequenceNumber
=
client
->
sequence
;
lcr
.
screenRed
=
lcr
.
exactRed
;
lcr
.
screenGreen
=
lcr
.
exactGreen
;
lcr
.
screenBlue
=
lcr
.
exactBlue
;
(
*
pcmp
->
pScreen
->
ResolveColor
)(
&
lcr
.
screenRed
,
&
lcr
.
screenGreen
,
&
lcr
.
screenBlue
,
pcmp
->
pVisual
);
WriteReplyToClient
(
client
,
sizeof
(
xLookupColorReply
),
&
lcr
);
return
(
client
->
noClientException
);
}
return
(
BadName
);
}
else
{
client
->
errorValue
=
stuff
->
cmap
;
return
(
BadColor
);
}
}
int
ProcCreateCursor
(
register
ClientPtr
client
)
{
CursorPtr
pCursor
;
register
PixmapPtr
src
;
register
PixmapPtr
msk
;
unsigned
char
*
srcbits
;
unsigned
char
*
mskbits
;
unsigned
short
width
,
height
;
long
n
;
CursorMetricRec
cm
;
REQUEST
(
xCreateCursorReq
);
REQUEST_SIZE_MATCH
(
xCreateCursorReq
);
LEGAL_NEW_RESOURCE
(
stuff
->
cid
,
client
);
src
=
(
PixmapPtr
)
SecurityLookupIDByType
(
client
,
stuff
->
source
,
RT_PIXMAP
,
SecurityReadAccess
);
msk
=
(
PixmapPtr
)
SecurityLookupIDByType
(
client
,
stuff
->
mask
,
RT_PIXMAP
,
SecurityReadAccess
);
if
(
src
==
(
PixmapPtr
)
NULL
)
{
client
->
errorValue
=
stuff
->
source
;
return
(
BadPixmap
);
}
if
(
msk
==
(
PixmapPtr
)
NULL
)
{
if
(
stuff
->
mask
!=
None
)
{
client
->
errorValue
=
stuff
->
mask
;
return
(
BadPixmap
);
}
}
else
if
(
src
->
drawable
.
width
!=
msk
->
drawable
.
width
||
src
->
drawable
.
height
!=
msk
->
drawable
.
height
||
src
->
drawable
.
depth
!=
1
||
msk
->
drawable
.
depth
!=
1
)
return
(
BadMatch
);
width
=
src
->
drawable
.
width
;
height
=
src
->
drawable
.
height
;
if
(
stuff
->
x
>
width
||
stuff
->
y
>
height
)
return
(
BadMatch
);
n
=
BitmapBytePad
(
width
)
*
height
;
srcbits
=
(
unsigned
char
*
)
xalloc
(
n
);
if
(
!
srcbits
)
return
(
BadAlloc
);
mskbits
=
(
unsigned
char
*
)
xalloc
(
n
);
if
(
!
mskbits
)
{
xfree
(
srcbits
);
return
(
BadAlloc
);
}
/* zeroing the (pad) bits helps some ddx cursor handling */
bzero
((
char
*
)
srcbits
,
n
);
(
*
src
->
drawable
.
pScreen
->
GetImage
)(
(
DrawablePtr
)
src
,
0
,
0
,
width
,
height
,
XYPixmap
,
1
,
(
void
*
)
srcbits
);
if
(
msk
==
(
PixmapPtr
)
NULL
)
{
register
unsigned
char
*
bits
=
mskbits
;
while
(
--
n
>=
0
)
*
bits
++
=
~
0
;
}
else
{
/* zeroing the (pad) bits helps some ddx cursor handling */
bzero
((
char
*
)
mskbits
,
n
);
(
*
msk
->
drawable
.
pScreen
->
GetImage
)(
(
DrawablePtr
)
msk
,
0
,
0
,
width
,
height
,
XYPixmap
,
1
,
(
void
*
)
mskbits
);
}
cm
.
width
=
width
;
cm
.
height
=
height
;
cm
.
xhot
=
stuff
->
x
;
cm
.
yhot
=
stuff
->
y
;
pCursor
=
AllocCursor
(
srcbits
,
mskbits
,
&
cm
,
stuff
->
foreRed
,
stuff
->
foreGreen
,
stuff
->
foreBlue
,
stuff
->
backRed
,
stuff
->
backGreen
,
stuff
->
backBlue
);
if
(
pCursor
&&
AddResource
(
stuff
->
cid
,
RT_CURSOR
,
(
void
*
)
pCursor
))
{
#ifdef TEST
fprintf
(
stderr
,
"ProcCreateCursor: Created cursor at [%p].
\n
"
,
(
void
*
)
pCursor
);
#endif
return
(
client
->
noClientException
);
}
return
BadAlloc
;
}
int
ProcCreateGlyphCursor
(
register
ClientPtr
client
)
{
CursorPtr
pCursor
;
int
res
;
REQUEST
(
xCreateGlyphCursorReq
);
REQUEST_SIZE_MATCH
(
xCreateGlyphCursorReq
);
LEGAL_NEW_RESOURCE
(
stuff
->
cid
,
client
);
res
=
AllocGlyphCursor
(
stuff
->
source
,
stuff
->
sourceChar
,
stuff
->
mask
,
stuff
->
maskChar
,
stuff
->
foreRed
,
stuff
->
foreGreen
,
stuff
->
foreBlue
,
stuff
->
backRed
,
stuff
->
backGreen
,
stuff
->
backBlue
,
&
pCursor
,
client
);
if
(
res
!=
Success
)
return
res
;
if
(
AddResource
(
stuff
->
cid
,
RT_CURSOR
,
(
void
*
)
pCursor
))
return
client
->
noClientException
;
return
BadAlloc
;
}
int
ProcFreeCursor
(
register
ClientPtr
client
)
{
CursorPtr
pCursor
;
REQUEST
(
xResourceReq
);
REQUEST_SIZE_MATCH
(
xResourceReq
);
pCursor
=
(
CursorPtr
)
SecurityLookupIDByType
(
client
,
stuff
->
id
,
RT_CURSOR
,
SecurityDestroyAccess
);
if
(
pCursor
)
{
FreeResource
(
stuff
->
id
,
RT_NONE
);
return
(
client
->
noClientException
);
}
else
{
client
->
errorValue
=
stuff
->
id
;
return
(
BadCursor
);
}
}
int
ProcQueryBestSize
(
register
ClientPtr
client
)
{
xQueryBestSizeReply
reply
;
register
DrawablePtr
pDraw
;
ScreenPtr
pScreen
;
REQUEST
(
xQueryBestSizeReq
);
REQUEST_SIZE_MATCH
(
xQueryBestSizeReq
);
if
((
stuff
->
class
!=
CursorShape
)
&&
(
stuff
->
class
!=
TileShape
)
&&
(
stuff
->
class
!=
StippleShape
))
{
client
->
errorValue
=
stuff
->
class
;
return
(
BadValue
);
}
SECURITY_VERIFY_GEOMETRABLE
(
pDraw
,
stuff
->
drawable
,
client
,
SecurityReadAccess
);
if
(
stuff
->
class
!=
CursorShape
&&
pDraw
->
type
==
UNDRAWABLE_WINDOW
)
return
(
BadMatch
);
pScreen
=
pDraw
->
pScreen
;
(
*
pScreen
->
QueryBestSize
)(
stuff
->
class
,
&
stuff
->
width
,
&
stuff
->
height
,
pScreen
);
memset
(
&
reply
,
0
,
sizeof
(
xQueryBestSizeReply
));
reply
.
type
=
X_Reply
;
reply
.
length
=
0
;
reply
.
sequenceNumber
=
client
->
sequence
;
reply
.
width
=
stuff
->
width
;
reply
.
height
=
stuff
->
height
;
WriteReplyToClient
(
client
,
sizeof
(
xQueryBestSizeReply
),
&
reply
);
return
(
client
->
noClientException
);
}
int
ProcSetScreenSaver
(
register
ClientPtr
client
)
{
int
blankingOption
,
exposureOption
;
REQUEST
(
xSetScreenSaverReq
);
REQUEST_SIZE_MATCH
(
xSetScreenSaverReq
);
blankingOption
=
stuff
->
preferBlank
;
if
((
blankingOption
!=
DontPreferBlanking
)
&&
(
blankingOption
!=
PreferBlanking
)
&&
(
blankingOption
!=
DefaultBlanking
))
{
client
->
errorValue
=
blankingOption
;
return
BadValue
;
}
exposureOption
=
stuff
->
allowExpose
;
if
((
exposureOption
!=
DontAllowExposures
)
&&
(
exposureOption
!=
AllowExposures
)
&&
(
exposureOption
!=
DefaultExposures
))
{
client
->
errorValue
=
exposureOption
;
return
BadValue
;
}
if
(
stuff
->
timeout
<
-
1
)
{
client
->
errorValue
=
stuff
->
timeout
;
return
BadValue
;
}
if
(
stuff
->
interval
<
-
1
)
{
client
->
errorValue
=
stuff
->
interval
;
return
BadValue
;
}
/*
* The NX agent uses the screen saver procedure
* to monitor the user activities and launch its
* handlers (like timeout feature), so we can't
* always allow the clients to change our values.
*/
#ifdef TEST
fprintf
(
stderr
,
"ProcSetScreenSaver: Called with timeout [%d] interval [%d] Blanking [%d] Exposure [%d].
\n
"
,
stuff
->
timeout
,
stuff
->
interval
,
blankingOption
,
exposureOption
);
#endif
if
(
nxagentOption
(
Timeout
)
==
0
)
{
if
(
blankingOption
==
DefaultBlanking
)
{
ScreenSaverBlanking
=
defaultScreenSaverBlanking
;
}
else
{
ScreenSaverBlanking
=
blankingOption
;
}
if
(
exposureOption
==
DefaultExposures
)
{
ScreenSaverAllowExposures
=
defaultScreenSaverAllowExposures
;
}
else
{
ScreenSaverAllowExposures
=
exposureOption
;
}
if
(
stuff
->
timeout
>=
0
)
{
ScreenSaverTime
=
stuff
->
timeout
*
MILLI_PER_SECOND
;
}
else
{
ScreenSaverTime
=
defaultScreenSaverTime
;
}
if
(
stuff
->
interval
>=
0
)
{
ScreenSaverInterval
=
stuff
->
interval
*
MILLI_PER_SECOND
;
}
else
{
ScreenSaverInterval
=
defaultScreenSaverInterval
;
}
SetScreenSaverTimer
();
}
#ifdef TEST
fprintf
(
stderr
,
"ProcSetScreenSaver: Called with timeout [%d] interval [%d] Blanking [%d] Exposure [%d].
\n
"
,
stuff
->
timeout
,
stuff
->
interval
,
blankingOption
,
exposureOption
);
#endif
else
{
fprintf
(
stderr
,
"ProcSetScreenSaver: Keeping auto-disconnect timeout set to [%d] seconds.
\n
"
,
nxagentOption
(
Timeout
));
}
#endif
return
(
client
->
noClientException
);
}
int
ProcGetScreenSaver
(
register
ClientPtr
client
)
{
xGetScreenSaverReply
rep
;
REQUEST_SIZE_MATCH
(
xReq
);
rep
.
type
=
X_Reply
;
rep
.
length
=
0
;
rep
.
sequenceNumber
=
client
->
sequence
;
rep
.
timeout
=
ScreenSaverTime
/
MILLI_PER_SECOND
;
rep
.
interval
=
ScreenSaverInterval
/
MILLI_PER_SECOND
;
rep
.
preferBlanking
=
ScreenSaverBlanking
;
rep
.
allowExposures
=
ScreenSaverAllowExposures
;
WriteReplyToClient
(
client
,
sizeof
(
xGetScreenSaverReply
),
&
rep
);
return
(
client
->
noClientException
);
}
int
ProcChangeHosts
(
register
ClientPtr
client
)
{
REQUEST
(
xChangeHostsReq
);
int
result
;
REQUEST_FIXED_SIZE
(
xChangeHostsReq
,
stuff
->
hostLength
);
if
(
stuff
->
mode
==
HostInsert
)
result
=
AddHost
(
client
,
(
int
)
stuff
->
hostFamily
,
stuff
->
hostLength
,
(
void
*
)
&
stuff
[
1
]);
else
if
(
stuff
->
mode
==
HostDelete
)
result
=
RemoveHost
(
client
,
(
int
)
stuff
->
hostFamily
,
stuff
->
hostLength
,
(
void
*
)
&
stuff
[
1
]);
else
{
client
->
errorValue
=
stuff
->
mode
;
return
BadValue
;
}
if
(
!
result
)
result
=
client
->
noClientException
;
return
(
result
);
}
int
ProcListHosts
(
register
ClientPtr
client
)
{
xListHostsReply
reply
;
int
len
,
nHosts
,
result
;
void
*
pdata
;
/* REQUEST(xListHostsReq); */
REQUEST_SIZE_MATCH
(
xListHostsReq
);
#ifdef XCSECURITY
/* untrusted clients can't list hosts */
if
(
client
->
trustLevel
!=
XSecurityClientTrusted
)
if
(
nxagentOption
(
Timeout
)
==
0
)
{
if
(
blankingOption
==
DefaultBlanking
)
{
SecurityAudit
(
"client %d attempted to list hosts
\n
"
,
client
->
index
);
return
BadAccess
;
ScreenSaverBlanking
=
defaultScreenSaverBlanking
;
}
#endif
result
=
GetHosts
(
&
pdata
,
&
nHosts
,
&
len
,
&
reply
.
enabled
);
if
(
result
!=
Success
)
return
(
result
);
reply
.
type
=
X_Reply
;
reply
.
sequenceNumber
=
client
->
sequence
;
reply
.
nHosts
=
nHosts
;
reply
.
length
=
len
>>
2
;
WriteReplyToClient
(
client
,
sizeof
(
xListHostsReply
),
&
reply
);
if
(
nHosts
)
else
{
client
->
pSwapReplyFunc
=
(
ReplySwapPtr
)
SLHostsExtend
;
WriteSwappedDataToClient
(
client
,
len
,
pdata
);
ScreenSaverBlanking
=
blankingOption
;
}
xfree
(
pdata
);
return
(
client
->
noClientException
);
}
int
ProcChangeAccessControl
(
register
ClientPtr
client
)
{
int
result
;
REQUEST
(
xSetAccessControlReq
);
REQUEST_SIZE_MATCH
(
xSetAccessControlReq
);
if
((
stuff
->
mode
!=
EnableAccess
)
&&
(
stuff
->
mode
!=
DisableAccess
))
if
(
exposureOption
==
DefaultExposures
)
{
client
->
errorValue
=
stuff
->
mode
;
return
BadValue
;
ScreenSaverAllowExposures
=
defaultScreenSaverAllowExposures
;
}
result
=
ChangeAccessControl
(
client
,
stuff
->
mode
==
EnableAccess
);
if
(
!
result
)
result
=
client
->
noClientException
;
return
(
result
);
}
int
ProcKillClient
(
register
ClientPtr
client
)
{
REQUEST
(
xResourceReq
);
ClientPtr
killclient
;
REQUEST_SIZE_MATCH
(
xResourceReq
);
if
(
stuff
->
id
==
AllTemporary
)
else
{
CloseDownRetainedResources
();
return
(
client
->
noClientException
);
ScreenSaverAllowExposures
=
exposureOption
;
}
if
((
killclient
=
LookupClient
(
stuff
->
id
,
client
)))
{
CloseDownClient
(
killclient
);
/* if an LBX proxy gets killed, isItTimeToYield will be set */
if
(
isItTimeToYield
||
(
client
==
killclient
))
if
(
stuff
->
timeout
>=
0
)
{
/* force yield and return Success, so that Dispatch()
* doesn't try to touch client
*/
isItTimeToYield
=
TRUE
;
return
(
Success
);
}
return
(
client
->
noClientException
);
ScreenSaverTime
=
stuff
->
timeout
*
MILLI_PER_SECOND
;
}
else
{
client
->
errorValue
=
stuff
->
id
;
return
(
BadValue
);
ScreenSaverTime
=
defaultScreenSaverTime
;
}
}
int
ProcSetFontPath
(
register
ClientPtr
client
)
{
unsigned
char
*
ptr
;
unsigned
long
nbytes
,
total
;
long
nfonts
;
int
n
,
result
;
int
error
;
REQUEST
(
xSetFontPathReq
);
REQUEST_AT_LEAST_SIZE
(
xSetFontPathReq
);
nbytes
=
(
client
->
req_len
<<
2
)
-
sizeof
(
xSetFontPathReq
);
total
=
nbytes
;
ptr
=
(
unsigned
char
*
)
&
stuff
[
1
];
nfonts
=
stuff
->
nFonts
;
while
(
--
nfonts
>=
0
)
if
(
stuff
->
interval
>=
0
)
{
if
((
total
==
0
)
||
(
total
<
(
n
=
(
*
ptr
+
1
))))
return
(
BadLength
);
total
-=
n
;
ptr
+=
n
;
ScreenSaverInterval
=
stuff
->
interval
*
MILLI_PER_SECOND
;
}
if
(
total
>=
4
)
return
(
BadLength
);
result
=
SetFontPath
(
client
,
stuff
->
nFonts
,
(
unsigned
char
*
)
&
stuff
[
1
],
&
error
);
if
(
!
result
)
else
{
result
=
client
->
noClientException
;
client
->
errorValue
=
error
;
ScreenSaverInterval
=
defaultScreenSaverInterval
;
}
return
(
result
);
}
int
ProcGetFontPath
(
register
ClientPtr
client
)
{
xGetFontPathReply
reply
;
int
stringLens
,
numpaths
;
unsigned
char
*
bufferStart
;
/* REQUEST (xReq); */
REQUEST_SIZE_MATCH
(
xReq
);
bufferStart
=
GetFontPath
(
&
numpaths
,
&
stringLens
);
reply
.
type
=
X_Reply
;
reply
.
sequenceNumber
=
client
->
sequence
;
reply
.
length
=
(
stringLens
+
numpaths
+
3
)
>>
2
;
reply
.
nPaths
=
numpaths
;
WriteReplyToClient
(
client
,
sizeof
(
xGetFontPathReply
),
&
reply
);
if
(
stringLens
||
numpaths
)
(
void
)
WriteToClient
(
client
,
stringLens
+
numpaths
,
(
char
*
)
bufferStart
);
return
(
client
->
noClientException
);
}
int
ProcChangeCloseDownMode
(
register
ClientPtr
client
)
{
REQUEST
(
xSetCloseDownModeReq
);
REQUEST_SIZE_MATCH
(
xSetCloseDownModeReq
);
if
((
stuff
->
mode
==
AllTemporary
)
||
(
stuff
->
mode
==
RetainPermanent
)
||
(
stuff
->
mode
==
RetainTemporary
))
{
client
->
closeDownMode
=
stuff
->
mode
;
return
(
client
->
noClientException
);
SetScreenSaverTimer
();
}
#ifdef TEST
else
{
client
->
errorValue
=
stuff
->
mode
;
return
(
BadValue
);
fprintf
(
stderr
,
"ProcSetScreenSaver: Keeping auto-disconnect timeout set to [%d] seconds.
\n
"
,
nxagentOption
(
Timeout
)
);
}
#endif
return
(
client
->
noClientException
);
}
int
ProcForceScreenSaver
(
register
ClientPtr
client
)
{
REQUEST
(
xForceScreenSaverReq
);
...
...
@@ -4125,38 +1207,6 @@ int ProcForceScreenSaver(register ClientPtr client)
return
client
->
noClientException
;
}
int
ProcNoOperation
(
register
ClientPtr
client
)
{
REQUEST_AT_LEAST_SIZE
(
xReq
);
/* noop -- don't do anything */
return
(
client
->
noClientException
);
}
void
InitProcVectors
(
void
)
{
int
i
;
for
(
i
=
0
;
i
<
256
;
i
++
)
{
if
(
!
ProcVector
[
i
])
{
ProcVector
[
i
]
=
SwappedProcVector
[
i
]
=
ProcBadRequest
;
ReplySwapVector
[
i
]
=
ReplyNotSwappd
;
}
#ifdef K5AUTH
if
(
!
k5_Vector
[
i
])
{
k5_Vector
[
i
]
=
k5_bad
;
}
#endif
}
for
(
i
=
LASTEvent
;
i
<
128
;
i
++
)
{
EventSwapVector
[
i
]
=
NotImplemented
;
}
}
/**********************
* CloseDownClient
...
...
@@ -4276,104 +1326,6 @@ CloseDownClient(register ClientPtr client)
}
}
static
void
KillAllClients
()
{
int
i
;
for
(
i
=
1
;
i
<
currentMaxClients
;
i
++
)
if
(
clients
[
i
])
{
/* Make sure Retained clients are released. */
clients
[
i
]
->
closeDownMode
=
DestroyAll
;
CloseDownClient
(
clients
[
i
]);
}
}
/*********************
* CloseDownRetainedResources
*
* Find all clients that are gone and have terminated in RetainTemporary
* and destroy their resources.
*********************/
void
CloseDownRetainedResources
()
{
register
int
i
;
register
ClientPtr
client
;
for
(
i
=
1
;
i
<
currentMaxClients
;
i
++
)
{
client
=
clients
[
i
];
if
(
client
&&
(
client
->
closeDownMode
==
RetainTemporary
)
&&
(
client
->
clientGone
))
CloseDownClient
(
client
);
}
}
void
InitClient
(
ClientPtr
client
,
int
i
,
void
*
ospriv
)
{
client
->
index
=
i
;
client
->
sequence
=
0
;
client
->
clientAsMask
=
((
Mask
)
i
)
<<
CLIENTOFFSET
;
client
->
clientGone
=
FALSE
;
if
(
i
)
{
client
->
closeDownMode
=
DestroyAll
;
client
->
lastDrawable
=
(
DrawablePtr
)
screenInfo
.
screens
[
0
]
->
root
;
client
->
lastDrawableID
=
screenInfo
.
screens
[
0
]
->
root
->
drawable
.
id
;
}
else
{
client
->
closeDownMode
=
RetainPermanent
;
client
->
lastDrawable
=
(
DrawablePtr
)
NULL
;
client
->
lastDrawableID
=
INVALID
;
}
client
->
lastGC
=
(
GCPtr
)
NULL
;
client
->
lastGCID
=
INVALID
;
client
->
numSaved
=
0
;
client
->
saveSet
=
(
SaveSetElt
*
)
NULL
;
client
->
noClientException
=
Success
;
#ifdef LOG_DEBUG
client
->
requestLogIndex
=
0
;
#endif
client
->
requestVector
=
InitialVector
;
client
->
osPrivate
=
ospriv
;
client
->
swapped
=
FALSE
;
client
->
big_requests
=
FALSE
;
client
->
priority
=
0
;
client
->
clientState
=
ClientStateInitial
;
#ifdef XKB
if
(
!
noXkbExtension
)
{
client
->
xkbClientFlags
=
0
;
client
->
mapNotifyMask
=
0
;
QueryMinMaxKeyCodes
(
&
client
->
minKC
,
&
client
->
maxKC
);
}
#endif
client
->
replyBytesRemaining
=
0
;
#ifdef LBX
client
->
readRequest
=
StandardReadRequestFromClient
;
#endif
#ifdef XCSECURITY
client
->
trustLevel
=
XSecurityClientTrusted
;
client
->
CheckAccess
=
NULL
;
client
->
authId
=
0
;
#endif
#ifdef XAPPGROUP
client
->
appgroup
=
NULL
;
#endif
client
->
fontResFunc
=
NULL
;
#ifdef SMART_SCHEDULE
client
->
smart_priority
=
0
;
client
->
smart_start_tick
=
SmartScheduleTime
;
client
->
smart_stop_tick
=
SmartScheduleTime
;
client
->
smart_check_tick
=
SmartScheduleTime
;
#endif
}
extern
int
clientPrivateLen
;
extern
unsigned
*
clientPrivateSizes
;
extern
unsigned
totalClientSize
;
int
InitClientPrivates
(
ClientPtr
client
)
{
...
...
@@ -4415,289 +1367,3 @@ InitClientPrivates(ClientPtr client)
return
1
;
}
/************************
* int NextAvailableClient(ospriv)
*
* OS dependent portion can't assign client id's because of CloseDownModes.
* Returns NULL if there are no free clients.
*************************/
ClientPtr
NextAvailableClient
(
void
*
ospriv
)
{
register
int
i
;
register
ClientPtr
client
;
xReq
data
;
i
=
nextFreeClientID
;
if
(
i
==
MAXCLIENTS
)
return
(
ClientPtr
)
NULL
;
clients
[
i
]
=
client
=
(
ClientPtr
)
xalloc
(
totalClientSize
);
if
(
!
client
)
return
(
ClientPtr
)
NULL
;
InitClient
(
client
,
i
,
ospriv
);
InitClientPrivates
(
client
);
if
(
!
InitClientResources
(
client
))
{
xfree
(
client
);
return
(
ClientPtr
)
NULL
;
}
data
.
reqType
=
1
;
data
.
length
=
(
sz_xReq
+
sz_xConnClientPrefix
)
>>
2
;
if
(
!
InsertFakeRequest
(
client
,
(
char
*
)
&
data
,
sz_xReq
))
{
FreeClientResources
(
client
);
xfree
(
client
);
return
(
ClientPtr
)
NULL
;
}
if
(
i
==
currentMaxClients
)
currentMaxClients
++
;
while
((
nextFreeClientID
<
MAXCLIENTS
)
&&
clients
[
nextFreeClientID
])
nextFreeClientID
++
;
if
(
ClientStateCallback
)
{
NewClientInfoRec
clientinfo
;
clientinfo
.
client
=
client
;
clientinfo
.
prefix
=
(
xConnSetupPrefix
*
)
NULL
;
clientinfo
.
setup
=
(
xConnSetup
*
)
NULL
;
CallCallbacks
((
&
ClientStateCallback
),
(
void
*
)
&
clientinfo
);
}
return
(
client
);
}
int
ProcInitialConnection
(
register
ClientPtr
client
)
{
REQUEST
(
xReq
);
register
xConnClientPrefix
*
prefix
;
int
whichbyte
=
1
;
prefix
=
(
xConnClientPrefix
*
)((
char
*
)
stuff
+
sz_xReq
);
if
((
prefix
->
byteOrder
!=
'l'
)
&&
(
prefix
->
byteOrder
!=
'B'
))
return
(
client
->
noClientException
=
-
1
);
if
(((
*
(
char
*
)
&
whichbyte
)
&&
(
prefix
->
byteOrder
==
'B'
))
||
(
!
(
*
(
char
*
)
&
whichbyte
)
&&
(
prefix
->
byteOrder
==
'l'
)))
{
client
->
swapped
=
TRUE
;
SwapConnClientPrefix
(
prefix
);
}
stuff
->
reqType
=
2
;
stuff
->
length
+=
((
prefix
->
nbytesAuthProto
+
(
unsigned
)
3
)
>>
2
)
+
((
prefix
->
nbytesAuthString
+
(
unsigned
)
3
)
>>
2
);
if
(
client
->
swapped
)
{
swaps
(
&
stuff
->
length
,
whichbyte
);
}
ResetCurrentRequest
(
client
);
return
(
client
->
noClientException
);
}
#ifdef LBX
void
IncrementClientCount
()
{
nClients
++
;
}
#endif
int
SendConnSetup
(
register
ClientPtr
client
,
char
*
reason
)
{
register
xWindowRoot
*
root
;
register
int
i
;
int
numScreens
;
char
*
lConnectionInfo
;
xConnSetupPrefix
*
lconnSetupPrefix
;
if
(
reason
)
{
xConnSetupPrefix
csp
;
csp
.
success
=
xFalse
;
csp
.
lengthReason
=
strlen
(
reason
);
csp
.
length
=
(
csp
.
lengthReason
+
(
unsigned
)
3
)
>>
2
;
csp
.
majorVersion
=
X_PROTOCOL
;
csp
.
minorVersion
=
X_PROTOCOL_REVISION
;
if
(
client
->
swapped
)
WriteSConnSetupPrefix
(
client
,
&
csp
);
else
(
void
)
WriteToClient
(
client
,
sz_xConnSetupPrefix
,
(
char
*
)
&
csp
);
(
void
)
WriteToClient
(
client
,
(
int
)
csp
.
lengthReason
,
reason
);
return
(
client
->
noClientException
=
-
1
);
}
numScreens
=
screenInfo
.
numScreens
;
lConnectionInfo
=
ConnectionInfo
;
lconnSetupPrefix
=
&
connSetupPrefix
;
/* We're about to start speaking X protocol back to the client by
* sending the connection setup info. This means the authorization
* step is complete, and we can count the client as an
* authorized one.
*/
nClients
++
;
client
->
requestVector
=
client
->
swapped
?
SwappedProcVector
:
ProcVector
;
client
->
sequence
=
0
;
#ifdef XAPPGROUP
XagConnectionInfo
(
client
,
&
lconnSetupPrefix
,
&
lConnectionInfo
,
&
numScreens
);
#endif
((
xConnSetup
*
)
lConnectionInfo
)
->
ridBase
=
client
->
clientAsMask
;
((
xConnSetup
*
)
lConnectionInfo
)
->
ridMask
=
RESOURCE_ID_MASK
;
#ifdef MATCH_CLIENT_ENDIAN
((
xConnSetup
*
)
lConnectionInfo
)
->
imageByteOrder
=
ClientOrder
(
client
);
((
xConnSetup
*
)
lConnectionInfo
)
->
bitmapBitOrder
=
ClientOrder
(
client
);
#endif
/* fill in the "currentInputMask" */
root
=
(
xWindowRoot
*
)(
lConnectionInfo
+
connBlockScreenStart
);
#ifdef PANORAMIX
if
(
noPanoramiXExtension
)
numScreens
=
screenInfo
.
numScreens
;
else
numScreens
=
((
xConnSetup
*
)
ConnectionInfo
)
->
numRoots
;
#endif
for
(
i
=
0
;
i
<
numScreens
;
i
++
)
{
register
unsigned
int
j
;
register
xDepth
*
pDepth
;
root
->
currentInputMask
=
screenInfo
.
screens
[
i
]
->
root
->
eventMask
|
wOtherEventMasks
(
screenInfo
.
screens
[
i
]
->
root
);
pDepth
=
(
xDepth
*
)(
root
+
1
);
for
(
j
=
0
;
j
<
root
->
nDepths
;
j
++
)
{
pDepth
=
(
xDepth
*
)(((
char
*
)(
pDepth
+
1
))
+
pDepth
->
nVisuals
*
sizeof
(
xVisualType
));
}
root
=
(
xWindowRoot
*
)
pDepth
;
}
if
(
client
->
swapped
)
{
WriteSConnSetupPrefix
(
client
,
lconnSetupPrefix
);
WriteSConnectionInfo
(
client
,
(
unsigned
long
)(
lconnSetupPrefix
->
length
<<
2
),
lConnectionInfo
);
}
else
{
(
void
)
WriteToClient
(
client
,
sizeof
(
xConnSetupPrefix
),
(
char
*
)
lconnSetupPrefix
);
(
void
)
WriteToClient
(
client
,
(
int
)(
lconnSetupPrefix
->
length
<<
2
),
lConnectionInfo
);
}
client
->
clientState
=
ClientStateRunning
;
if
(
ClientStateCallback
)
{
NewClientInfoRec
clientinfo
;
clientinfo
.
client
=
client
;
clientinfo
.
prefix
=
lconnSetupPrefix
;
clientinfo
.
setup
=
(
xConnSetup
*
)
lConnectionInfo
;
CallCallbacks
((
&
ClientStateCallback
),
(
void
*
)
&
clientinfo
);
}
return
(
client
->
noClientException
);
}
int
ProcEstablishConnection
(
register
ClientPtr
client
)
{
char
*
reason
,
*
auth_proto
,
*
auth_string
;
register
xConnClientPrefix
*
prefix
;
REQUEST
(
xReq
);
prefix
=
(
xConnClientPrefix
*
)((
char
*
)
stuff
+
sz_xReq
);
auth_proto
=
(
char
*
)
prefix
+
sz_xConnClientPrefix
;
auth_string
=
auth_proto
+
((
prefix
->
nbytesAuthProto
+
3
)
&
~
3
);
if
((
prefix
->
majorVersion
!=
X_PROTOCOL
)
||
(
prefix
->
minorVersion
!=
X_PROTOCOL_REVISION
))
reason
=
"Protocol version mismatch"
;
else
reason
=
ClientAuthorized
(
client
,
(
unsigned
short
)
prefix
->
nbytesAuthProto
,
auth_proto
,
(
unsigned
short
)
prefix
->
nbytesAuthString
,
auth_string
);
/*
* If Kerberos is being used for this client, the clientState
* will be set to ClientStateAuthenticating at this point.
* More messages need to be exchanged among the X server, Kerberos
* server, and client to figure out if everyone is authorized.
* So we don't want to send the connection setup info yet, since
* the auth step isn't really done.
*/
if
(
client
->
clientState
==
ClientStateCheckingSecurity
)
client
->
clientState
=
ClientStateCheckedSecurity
;
else
if
(
client
->
clientState
!=
ClientStateAuthenticating
)
return
(
SendConnSetup
(
client
,
reason
));
return
(
client
->
noClientException
);
}
void
SendErrorToClient
(
ClientPtr
client
,
unsigned
majorCode
,
unsigned
minorCode
,
XID
resId
,
int
errorCode
)
{
xError
rep
;
memset
(
&
rep
,
0
,
sizeof
(
xError
));
rep
.
type
=
X_Error
;
rep
.
sequenceNumber
=
client
->
sequence
;
rep
.
errorCode
=
errorCode
;
rep
.
majorCode
=
majorCode
;
rep
.
minorCode
=
minorCode
;
rep
.
resourceID
=
resId
;
WriteEventsToClient
(
client
,
1
,
(
xEvent
*
)
&
rep
);
}
void
DeleteWindowFromAnySelections
(
WindowPtr
pWin
)
{
register
int
i
;
for
(
i
=
0
;
i
<
NumCurrentSelections
;
i
++
)
if
(
CurrentSelections
[
i
].
pWin
==
pWin
)
{
if
(
SelectionCallback
)
{
SelectionInfoRec
info
;
info
.
selection
=
&
CurrentSelections
[
i
];
info
.
kind
=
SelectionWindowDestroy
;
CallCallbacks
(
&
SelectionCallback
,
&
info
);
}
CurrentSelections
[
i
].
pWin
=
(
WindowPtr
)
NULL
;
CurrentSelections
[
i
].
window
=
None
;
CurrentSelections
[
i
].
client
=
NullClient
;
}
}
static
void
DeleteClientFromAnySelections
(
ClientPtr
client
)
{
register
int
i
;
for
(
i
=
0
;
i
<
NumCurrentSelections
;
i
++
)
if
(
CurrentSelections
[
i
].
client
==
client
)
{
if
(
SelectionCallback
)
{
SelectionInfoRec
info
;
info
.
selection
=
&
CurrentSelections
[
i
];
info
.
kind
=
SelectionWindowDestroy
;
CallCallbacks
(
&
SelectionCallback
,
&
info
);
}
CurrentSelections
[
i
].
pWin
=
(
WindowPtr
)
NULL
;
CurrentSelections
[
i
].
window
=
None
;
CurrentSelections
[
i
].
client
=
NullClient
;
}
}
void
MarkClientException
(
ClientPtr
client
)
{
client
->
noClientException
=
-
1
;
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment