201 lines
5.7 KiB
C
201 lines
5.7 KiB
C
/************************************************************
|
|
Copyright (c) 1997 by Silicon Graphics Computer Systems, Inc.
|
|
Permission to use, copy, modify, and distribute this
|
|
software and its documentation for any purpose and without
|
|
fee is hereby granted, provided that the above copyright
|
|
notice appear in all copies and that both that copyright
|
|
notice and this permission notice appear in supporting
|
|
documentation, and that the name of Silicon Graphics not be
|
|
used in advertising or publicity pertaining to distribution
|
|
of the software without specific prior written permission.
|
|
Silicon Graphics makes no representation about the suitability
|
|
of this software for any purpose. It is provided "as is"
|
|
without any express or implied warranty.
|
|
SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
|
|
SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
|
|
GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
|
|
DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
|
|
DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
|
|
OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
|
|
THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
********************************************************/
|
|
|
|
#ifdef HAVE_DIX_CONFIG_H
|
|
#include <dix-config.h>
|
|
#endif
|
|
|
|
#include <X11/X.h>
|
|
#include <X11/Xproto.h>
|
|
#include "dixstruct.h"
|
|
#include "extnsionst.h"
|
|
#include "dix.h"
|
|
#define _XEVI_SERVER_
|
|
#include <X11/extensions/XEVIstr.h>
|
|
#include "EVIstruct.h"
|
|
#include "modinit.h"
|
|
#include "scrnintstr.h"
|
|
|
|
static EviPrivPtr eviPriv;
|
|
|
|
static int
|
|
ProcEVIQueryVersion(ClientPtr client)
|
|
{
|
|
/* REQUEST(xEVIQueryVersionReq); */
|
|
xEVIQueryVersionReply rep;
|
|
register int n;
|
|
REQUEST_SIZE_MATCH (xEVIQueryVersionReq);
|
|
rep.type = X_Reply;
|
|
rep.length = 0;
|
|
rep.sequenceNumber = client->sequence;
|
|
rep.majorVersion = XEVI_MAJOR_VERSION;
|
|
rep.minorVersion = XEVI_MAJOR_VERSION;
|
|
if (client->swapped) {
|
|
swaps(&rep.sequenceNumber, n);
|
|
swapl(&rep.length, n);
|
|
swaps(&rep.majorVersion, n);
|
|
swaps(&rep.minorVersion, n);
|
|
}
|
|
WriteToClient(client, sizeof (xEVIQueryVersionReply), (char *)&rep);
|
|
return (client->noClientException);
|
|
}
|
|
#define swapEviInfo(eviInfo, l) \
|
|
{ \
|
|
int l1 = l; \
|
|
xExtendedVisualInfo *eviInfo1 = eviInfo; \
|
|
while (l1-- > 0) { \
|
|
swapl(&eviInfo1->core_visual_id, n); \
|
|
swapl(&eviInfo1->transparency_value, n); \
|
|
swaps(&eviInfo1->num_colormap_conflicts, n); \
|
|
eviInfo1++; \
|
|
} \
|
|
}
|
|
#define swapVisual(visual, l) \
|
|
{ \
|
|
int l1 = l; \
|
|
VisualID32 *visual1 = visual; \
|
|
while (l1-- > 0) { \
|
|
swapl(visual1, n); \
|
|
visual1++; \
|
|
} \
|
|
}
|
|
|
|
static int
|
|
ProcEVIGetVisualInfo(ClientPtr client)
|
|
{
|
|
REQUEST(xEVIGetVisualInfoReq);
|
|
xEVIGetVisualInfoReply rep;
|
|
int i, n, n_conflict, n_info, sz_info, sz_conflict;
|
|
VisualID32 *conflict;
|
|
unsigned int total_visuals = 0;
|
|
xExtendedVisualInfo *eviInfo;
|
|
int status;
|
|
|
|
/*
|
|
* do this first, otherwise REQUEST_FIXED_SIZE can overflow. we assume
|
|
* here that you don't have more than 2^32 visuals over all your screens;
|
|
* this seems like a safe assumption.
|
|
*/
|
|
for (i = 0; i < screenInfo.numScreens; i++)
|
|
total_visuals += screenInfo.screens[i]->numVisuals;
|
|
if (stuff->n_visual > total_visuals)
|
|
return BadValue;
|
|
|
|
REQUEST_FIXED_SIZE(xEVIGetVisualInfoReq, stuff->n_visual * sz_VisualID32);
|
|
status = eviPriv->getVisualInfo((VisualID32 *)&stuff[1], (int)stuff->n_visual,
|
|
&eviInfo, &n_info, &conflict, &n_conflict);
|
|
if (status != Success)
|
|
return status;
|
|
sz_info = n_info * sz_xExtendedVisualInfo;
|
|
sz_conflict = n_conflict * sz_VisualID32;
|
|
rep.type = X_Reply;
|
|
rep.n_info = n_info;
|
|
rep.n_conflicts = n_conflict;
|
|
rep.sequenceNumber = client->sequence;
|
|
rep.length = (sz_info + sz_conflict) >> 2;
|
|
if (client->swapped) {
|
|
swaps(&rep.sequenceNumber, n);
|
|
swapl(&rep.length, n);
|
|
swapl(&rep.n_info, n);
|
|
swapl(&rep.n_conflicts, n);
|
|
swapEviInfo(eviInfo, n_info);
|
|
swapVisual(conflict, n_conflict);
|
|
}
|
|
WriteToClient(client, sz_xEVIGetVisualInfoReply, (char *)&rep);
|
|
WriteToClient(client, sz_info, (char *)eviInfo);
|
|
WriteToClient(client, sz_conflict, (char *)conflict);
|
|
eviPriv->freeVisualInfo(eviInfo, conflict);
|
|
return (client->noClientException);
|
|
}
|
|
|
|
static int
|
|
ProcEVIDispatch(ClientPtr client)
|
|
{
|
|
REQUEST(xReq);
|
|
switch (stuff->data) {
|
|
case X_EVIQueryVersion:
|
|
return ProcEVIQueryVersion (client);
|
|
case X_EVIGetVisualInfo:
|
|
return ProcEVIGetVisualInfo (client);
|
|
default:
|
|
return BadRequest;
|
|
}
|
|
}
|
|
|
|
static int
|
|
SProcEVIQueryVersion(ClientPtr client)
|
|
{
|
|
REQUEST(xEVIQueryVersionReq);
|
|
int n;
|
|
swaps(&stuff->length, n);
|
|
return ProcEVIQueryVersion(client);
|
|
}
|
|
|
|
static int
|
|
SProcEVIGetVisualInfo(ClientPtr client)
|
|
{
|
|
register int n;
|
|
REQUEST(xEVIGetVisualInfoReq);
|
|
swaps(&stuff->length, n);
|
|
return ProcEVIGetVisualInfo(client);
|
|
}
|
|
|
|
static int
|
|
SProcEVIDispatch(ClientPtr client)
|
|
{
|
|
REQUEST(xReq);
|
|
switch (stuff->data)
|
|
{
|
|
case X_EVIQueryVersion:
|
|
return SProcEVIQueryVersion (client);
|
|
case X_EVIGetVisualInfo:
|
|
return SProcEVIGetVisualInfo (client);
|
|
default:
|
|
return BadRequest;
|
|
}
|
|
}
|
|
|
|
/*ARGSUSED*/
|
|
static void
|
|
EVIResetProc(ExtensionEntry *extEntry)
|
|
{
|
|
eviDDXReset();
|
|
}
|
|
|
|
/****************
|
|
* XEVIExtensionInit
|
|
*
|
|
* Called from InitExtensions in main() or from QueryExtension() if the
|
|
* extension is dynamically loaded.
|
|
*
|
|
****************/
|
|
void
|
|
EVIExtensionInit(INITARGS)
|
|
{
|
|
if (AddExtension(EVINAME, 0, 0,
|
|
ProcEVIDispatch, SProcEVIDispatch,
|
|
EVIResetProc, StandardMinorOpcode)) {
|
|
eviPriv = eviDDXInit();
|
|
}
|
|
}
|