randr: Add [GS]etOutputPrimary

This commit is contained in:
Adam Jackson 2008-12-09 10:51:37 -05:00
parent d281866b74
commit 9d58d2a319
4 changed files with 145 additions and 1 deletions

View File

@ -2,6 +2,7 @@
* Copyright © 2000 Compaq Computer Corporation
* Copyright © 2002 Hewlett-Packard Company
* Copyright © 2006 Intel Corporation
* Copyright © 2008 Red Hat, Inc.
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@ -272,6 +273,7 @@ typedef struct _rrScrPriv {
int numOutputs;
RROutputPtr *outputs;
RROutputPtr primaryOutput;
int numCrtcs;
RRCrtcPtr *crtcs;
@ -811,6 +813,12 @@ RROutputDestroy (RROutputPtr output);
extern _X_EXPORT int
ProcRRGetOutputInfo (ClientPtr client);
extern int
ProcRRSetOutputPrimary (ClientPtr client);
extern int
ProcRRGetOutputPrimary (ClientPtr client);
/*
* Initialize output type
*/

View File

@ -217,5 +217,7 @@ int (*ProcRandrVector[RRNumberRequests])(ClientPtr) = {
ProcRRGetCrtcTransform, /* 27 */
ProcRRGetPanning, /* 28 */
ProcRRSetPanning, /* 29 */
ProcRRSetOutputPrimary, /* 30 */
ProcRRGetOutputPrimary, /* 31 */
};

View File

@ -1,5 +1,6 @@
/*
* Copyright © 2006 Keith Packard
* Copyright © 2008 Red Hat, Inc.
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@ -426,7 +427,7 @@ RROutputInit (void)
}
#define OutputInfoExtra (SIZEOF(xRRGetOutputInfoReply) - 32)
int
ProcRRGetOutputInfo (ClientPtr client)
{
@ -533,3 +534,109 @@ ProcRRGetOutputInfo (ClientPtr client)
return client->noClientException;
}
void
RRSetPrimaryOutput(ScreenPtr pScreen, rrScrPrivPtr pScrPriv,
RROutputPtr output)
{
if (pScrPriv->primaryOutput == output)
return;
/* clear the old primary */
if (pScrPriv->primaryOutput) {
RROutputChanged(pScrPriv->primaryOutput, 0);
pScrPriv->primaryOutput = NULL;
}
/* set the new primary */
if (output) {
pScrPriv->primaryOutput = output;
RROutputChanged(output, 0);
}
pScrPriv->layoutChanged = TRUE;
RRTellChanged(pScreen);
}
int
ProcRRSetOutputPrimary(ClientPtr client)
{
REQUEST(xRRSetOutputPrimaryReq);
RROutputPtr output = NULL;
WindowPtr pWin;
rrScrPrivPtr pScrPriv;
REQUEST_SIZE_MATCH(xRRSetOutputPrimaryReq);
pWin = SecurityLookupIDByType(client, stuff->window, RT_WINDOW,
DixReadAccess);
if (!pWin) {
client->errorValue = stuff->window;
return BadWindow;
}
if (stuff->output) {
output = LookupOutput(client, stuff->output, DixReadAccess);
if (!output) {
client->errorValue = stuff->output;
return RRErrorBase + BadRROutput;
}
if (output->crtc) {
client->errorValue = stuff->output;
return BadMatch;
}
if (output->pScreen != pWin->drawable.pScreen) {
client->errorValue = stuff->window;
return BadMatch;
}
}
pScrPriv = rrGetScrPriv(pWin->drawable.pScreen);
RRSetPrimaryOutput(pWin->drawable.pScreen, pScrPriv, output);
return client->noClientException;
}
int
ProcRRGetOutputPrimary(ClientPtr client)
{
REQUEST(xRRGetOutputPrimaryReq);
WindowPtr pWin;
rrScrPrivPtr pScrPriv;
xRRGetOutputPrimaryReply rep;
RROutputPtr primary = NULL;
REQUEST_SIZE_MATCH(xRRGetOutputPrimaryReq);
pWin = SecurityLookupIDByType(client, stuff->window, RT_WINDOW,
DixReadAccess);
if (!pWin) {
client->errorValue = stuff->window;
return BadWindow;
}
pScrPriv = rrGetScrPriv(pWin->drawable.pScreen);
if (pScrPriv)
primary = pScrPriv->primaryOutput;
memset(&rep, 0, sizeof(rep));
rep.type = X_Reply;
rep.sequenceNumber = client->sequence;
rep.output = primary ? primary->id : None;
if (client->swapped) {
int n;
swaps(&rep.sequenceNumber, n);
swapl(&rep.output, n);
}
WriteToClient(client, sizeof(xRRGetOutputPrimaryReply), &rep);
return client->noClientException;
}

View File

@ -436,6 +436,31 @@ SProcRRSetPanning (ClientPtr client)
return (*ProcRandrVector[stuff->randrReqType]) (client);
}
static int
SProcRRSetOutputPrimary (ClientPtr client)
{
int n;
REQUEST(xRRSetOutputPrimaryReq);
REQUEST_SIZE_MATCH(xRRSetOutputPrimaryReq);
swaps(&stuff->length, n);
swapl(&stuff->window, n);
swapl(&stuff->output, n);
return ProcRandrVector[stuff->randrReqType](client);
}
static int
SProcRRGetOutputPrimary (ClientPtr client)
{
int n;
REQUEST(xRRSetOutputPrimaryReq);
REQUEST_SIZE_MATCH(xRRGetOutputPrimaryReq);
swaps(&stuff->length, n);
swapl(&stuff->window, n);
return ProcRandrVector[stuff->randrReqType](client);
}
int (*SProcRandrVector[RRNumberRequests])(ClientPtr) = {
SProcRRQueryVersion, /* 0 */
/* we skip 1 to make old clients fail pretty immediately */
@ -472,5 +497,7 @@ int (*SProcRandrVector[RRNumberRequests])(ClientPtr) = {
SProcRRGetCrtcTransform, /* 27 */
SProcRRGetPanning, /* 28 */
SProcRRSetPanning, /* 29 */
SProcRRSetOutputPrimary, /* 30 */
SProcRRGetOutputPrimary, /* 31 */
};