xserver/randr/rrsdispatch.c

672 lines
18 KiB
C

/*
* Copyright © 2006 Keith Packard
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that copyright
* notice and this permission notice appear in supporting documentation, and
* that the name of the copyright holders not be used in advertising or
* publicity pertaining to distribution of the software without specific,
* written prior permission. The copyright holders make no representations
* about the suitability of this software for any purpose. It is provided "as
* is" without express or implied warranty.
*
* THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
#include "randrstr_priv.h"
static int _X_COLD
SProcRRQueryVersion(ClientPtr client)
{
REQUEST(xRRQueryVersionReq);
REQUEST_SIZE_MATCH(xRRQueryVersionReq);
swapl(&stuff->majorVersion);
swapl(&stuff->minorVersion);
return ProcRRQueryVersion(client);
}
static int _X_COLD
SProcRRGetScreenInfo(ClientPtr client)
{
REQUEST(xRRGetScreenInfoReq);
REQUEST_SIZE_MATCH(xRRGetScreenInfoReq);
swapl(&stuff->window);
return ProcRRGetScreenInfo(client);
}
static int _X_COLD
SProcRRSetScreenConfig(ClientPtr client)
{
REQUEST(xRRSetScreenConfigReq);
if (RRClientKnowsRates(client)) {
REQUEST_SIZE_MATCH(xRRSetScreenConfigReq);
swaps(&stuff->rate);
}
else {
REQUEST_SIZE_MATCH(xRR1_0SetScreenConfigReq);
}
swapl(&stuff->drawable);
swapl(&stuff->timestamp);
swaps(&stuff->sizeID);
swaps(&stuff->rotation);
return ProcRRSetScreenConfig(client);
}
static int _X_COLD
SProcRRSelectInput(ClientPtr client)
{
REQUEST(xRRSelectInputReq);
REQUEST_SIZE_MATCH(xRRSelectInputReq);
swapl(&stuff->window);
swaps(&stuff->enable);
return ProcRRSelectInput(client);
}
static int _X_COLD
SProcRRGetScreenSizeRange(ClientPtr client)
{
REQUEST(xRRGetScreenSizeRangeReq);
REQUEST_SIZE_MATCH(xRRGetScreenSizeRangeReq);
swapl(&stuff->window);
return ProcRRGetScreenSizeRange(client);
}
static int _X_COLD
SProcRRSetScreenSize(ClientPtr client)
{
REQUEST(xRRSetScreenSizeReq);
REQUEST_SIZE_MATCH(xRRSetScreenSizeReq);
swapl(&stuff->window);
swaps(&stuff->width);
swaps(&stuff->height);
swapl(&stuff->widthInMillimeters);
swapl(&stuff->heightInMillimeters);
return ProcRRSetScreenSize(client);
}
static int _X_COLD
SProcRRGetScreenResources(ClientPtr client)
{
REQUEST(xRRGetScreenResourcesReq);
REQUEST_SIZE_MATCH(xRRGetScreenResourcesReq);
swapl(&stuff->window);
return ProcRRGetScreenResources(client);
}
static int _X_COLD
SProcRRGetScreenResourcesCurrent(ClientPtr client)
{
REQUEST(xRRGetScreenResourcesCurrentReq);
REQUEST_SIZE_MATCH(xRRGetScreenResourcesCurrentReq);
swaps(&stuff->length);
swapl(&stuff->window);
return ProcRRGetScreenResourcesCurrent(client);
}
static int _X_COLD
SProcRRGetOutputInfo(ClientPtr client)
{
REQUEST(xRRGetOutputInfoReq);
REQUEST_SIZE_MATCH(xRRGetOutputInfoReq);
swapl(&stuff->output);
swapl(&stuff->configTimestamp);
return ProcRRGetScreenResources(client);
}
static int _X_COLD
SProcRRListOutputProperties(ClientPtr client)
{
REQUEST(xRRListOutputPropertiesReq);
REQUEST_SIZE_MATCH(xRRListOutputPropertiesReq);
swapl(&stuff->output);
return ProcRRListOutputProperties(client);
}
static int _X_COLD
SProcRRQueryOutputProperty(ClientPtr client)
{
REQUEST(xRRQueryOutputPropertyReq);
REQUEST_SIZE_MATCH(xRRQueryOutputPropertyReq);
swapl(&stuff->output);
swapl(&stuff->property);
return ProcRRQueryOutputProperty(client);
}
static int _X_COLD
SProcRRConfigureOutputProperty(ClientPtr client)
{
REQUEST(xRRConfigureOutputPropertyReq);
REQUEST_AT_LEAST_SIZE(xRRConfigureOutputPropertyReq);
swapl(&stuff->output);
swapl(&stuff->property);
SwapRestL(stuff);
return ProcRRConfigureOutputProperty(client);
}
static int _X_COLD
SProcRRChangeOutputProperty(ClientPtr client)
{
REQUEST(xRRChangeOutputPropertyReq);
REQUEST_AT_LEAST_SIZE(xRRChangeOutputPropertyReq);
swapl(&stuff->output);
swapl(&stuff->property);
swapl(&stuff->type);
swapl(&stuff->nUnits);
switch (stuff->format) {
case 8:
break;
case 16:
SwapRestS(stuff);
break;
case 32:
SwapRestL(stuff);
break;
default:
client->errorValue = stuff->format;
return BadValue;
}
return ProcRRChangeOutputProperty(client);
}
static int _X_COLD
SProcRRDeleteOutputProperty(ClientPtr client)
{
REQUEST(xRRDeleteOutputPropertyReq);
REQUEST_SIZE_MATCH(xRRDeleteOutputPropertyReq);
swapl(&stuff->output);
swapl(&stuff->property);
return ProcRRDeleteOutputProperty(client);
}
static int _X_COLD
SProcRRGetOutputProperty(ClientPtr client)
{
REQUEST(xRRGetOutputPropertyReq);
REQUEST_SIZE_MATCH(xRRGetOutputPropertyReq);
swapl(&stuff->output);
swapl(&stuff->property);
swapl(&stuff->type);
swapl(&stuff->longOffset);
swapl(&stuff->longLength);
return ProcRRGetOutputProperty(client);
}
static int _X_COLD
SProcRRCreateMode(ClientPtr client)
{
xRRModeInfo *modeinfo;
REQUEST(xRRCreateModeReq);
REQUEST_AT_LEAST_SIZE(xRRCreateModeReq);
swapl(&stuff->window);
modeinfo = &stuff->modeInfo;
swapl(&modeinfo->id);
swaps(&modeinfo->width);
swaps(&modeinfo->height);
swapl(&modeinfo->dotClock);
swaps(&modeinfo->hSyncStart);
swaps(&modeinfo->hSyncEnd);
swaps(&modeinfo->hTotal);
swaps(&modeinfo->vSyncStart);
swaps(&modeinfo->vSyncEnd);
swaps(&modeinfo->vTotal);
swaps(&modeinfo->nameLength);
swapl(&modeinfo->modeFlags);
return ProcRRCreateMode(client);
}
static int _X_COLD
SProcRRDestroyMode(ClientPtr client)
{
REQUEST(xRRDestroyModeReq);
REQUEST_SIZE_MATCH(xRRDestroyModeReq);
swapl(&stuff->mode);
return ProcRRDestroyMode(client);
}
static int _X_COLD
SProcRRAddOutputMode(ClientPtr client)
{
REQUEST(xRRAddOutputModeReq);
REQUEST_SIZE_MATCH(xRRAddOutputModeReq);
swapl(&stuff->output);
swapl(&stuff->mode);
return ProcRRAddOutputMode(client);
}
static int _X_COLD
SProcRRDeleteOutputMode(ClientPtr client)
{
REQUEST(xRRDeleteOutputModeReq);
REQUEST_SIZE_MATCH(xRRDeleteOutputModeReq);
swapl(&stuff->output);
swapl(&stuff->mode);
return ProcRRDeleteOutputMode(client);
}
static int _X_COLD
SProcRRGetCrtcInfo(ClientPtr client)
{
REQUEST(xRRGetCrtcInfoReq);
REQUEST_SIZE_MATCH(xRRGetCrtcInfoReq);
swapl(&stuff->crtc);
swapl(&stuff->configTimestamp);
return ProcRRGetCrtcInfo(client);
}
static int _X_COLD
SProcRRSetCrtcConfig(ClientPtr client)
{
REQUEST(xRRSetCrtcConfigReq);
REQUEST_AT_LEAST_SIZE(xRRSetCrtcConfigReq);
swapl(&stuff->crtc);
swapl(&stuff->timestamp);
swapl(&stuff->configTimestamp);
swaps(&stuff->x);
swaps(&stuff->y);
swapl(&stuff->mode);
swaps(&stuff->rotation);
SwapRestL(stuff);
return ProcRRSetCrtcConfig(client);
}
static int _X_COLD
SProcRRGetCrtcGammaSize(ClientPtr client)
{
REQUEST(xRRGetCrtcGammaSizeReq);
REQUEST_SIZE_MATCH(xRRGetCrtcGammaSizeReq);
swapl(&stuff->crtc);
return ProcRRGetCrtcGammaSize(client);
}
static int _X_COLD
SProcRRGetCrtcGamma(ClientPtr client)
{
REQUEST(xRRGetCrtcGammaReq);
REQUEST_SIZE_MATCH(xRRGetCrtcGammaReq);
swapl(&stuff->crtc);
return ProcRRGetCrtcGamma(client);
}
static int _X_COLD
SProcRRSetCrtcGamma(ClientPtr client)
{
REQUEST(xRRSetCrtcGammaReq);
REQUEST_AT_LEAST_SIZE(xRRSetCrtcGammaReq);
swapl(&stuff->crtc);
swaps(&stuff->size);
SwapRestS(stuff);
return ProcRRSetCrtcGamma(client);
}
static int _X_COLD
SProcRRSetCrtcTransform(ClientPtr client)
{
int nparams;
char *filter;
CARD32 *params;
REQUEST(xRRSetCrtcTransformReq);
REQUEST_AT_LEAST_SIZE(xRRSetCrtcTransformReq);
swapl(&stuff->crtc);
SwapLongs((CARD32 *) &stuff->transform,
bytes_to_int32(sizeof(xRenderTransform)));
swaps(&stuff->nbytesFilter);
filter = (char *) (stuff + 1);
params = (CARD32 *) (filter + pad_to_int32(stuff->nbytesFilter));
nparams = ((CARD32 *) stuff + client->req_len) - params;
if (nparams < 0)
return BadLength;
SwapLongs(params, nparams);
return ProcRRSetCrtcTransform(client);
}
static int _X_COLD
SProcRRGetCrtcTransform(ClientPtr client)
{
REQUEST(xRRGetCrtcTransformReq);
REQUEST_SIZE_MATCH(xRRGetCrtcTransformReq);
swapl(&stuff->crtc);
return ProcRRGetCrtcTransform(client);
}
static int _X_COLD
SProcRRGetPanning(ClientPtr client)
{
REQUEST(xRRGetPanningReq);
REQUEST_SIZE_MATCH(xRRGetPanningReq);
swapl(&stuff->crtc);
return ProcRRGetPanning(client);
}
static int _X_COLD
SProcRRSetPanning(ClientPtr client)
{
REQUEST(xRRSetPanningReq);
REQUEST_SIZE_MATCH(xRRSetPanningReq);
swapl(&stuff->crtc);
swapl(&stuff->timestamp);
swaps(&stuff->left);
swaps(&stuff->top);
swaps(&stuff->width);
swaps(&stuff->height);
swaps(&stuff->track_left);
swaps(&stuff->track_top);
swaps(&stuff->track_width);
swaps(&stuff->track_height);
swaps(&stuff->border_left);
swaps(&stuff->border_top);
swaps(&stuff->border_right);
swaps(&stuff->border_bottom);
return ProcRRSetPanning(client);
}
static int _X_COLD
SProcRRSetOutputPrimary(ClientPtr client)
{
REQUEST(xRRSetOutputPrimaryReq);
REQUEST_SIZE_MATCH(xRRSetOutputPrimaryReq);
swapl(&stuff->window);
swapl(&stuff->output);
return ProcRRSetOutputPrimary(client);
}
static int _X_COLD
SProcRRGetOutputPrimary(ClientPtr client)
{
REQUEST(xRRGetOutputPrimaryReq);
REQUEST_SIZE_MATCH(xRRGetOutputPrimaryReq);
swapl(&stuff->window);
return ProcRRGetOutputPrimary(client);
}
static int _X_COLD
SProcRRGetProviders(ClientPtr client)
{
REQUEST(xRRGetProvidersReq);
REQUEST_SIZE_MATCH(xRRGetProvidersReq);
swapl(&stuff->window);
return ProcRRGetProviders(client);
}
static int _X_COLD
SProcRRGetProviderInfo(ClientPtr client)
{
REQUEST(xRRGetProviderInfoReq);
REQUEST_SIZE_MATCH(xRRGetProviderInfoReq);
swapl(&stuff->provider);
swapl(&stuff->configTimestamp);
return ProcRRGetProviderInfo(client);
}
static int _X_COLD
SProcRRSetProviderOffloadSink(ClientPtr client)
{
REQUEST(xRRSetProviderOffloadSinkReq);
REQUEST_SIZE_MATCH(xRRSetProviderOffloadSinkReq);
swapl(&stuff->provider);
swapl(&stuff->sink_provider);
swapl(&stuff->configTimestamp);
return ProcRRSetProviderOffloadSink(client);
}
static int _X_COLD
SProcRRSetProviderOutputSource(ClientPtr client)
{
REQUEST(xRRSetProviderOutputSourceReq);
REQUEST_SIZE_MATCH(xRRSetProviderOutputSourceReq);
swapl(&stuff->provider);
swapl(&stuff->source_provider);
swapl(&stuff->configTimestamp);
return ProcRRSetProviderOutputSource(client);
}
static int _X_COLD
SProcRRListProviderProperties(ClientPtr client)
{
REQUEST(xRRListProviderPropertiesReq);
REQUEST_SIZE_MATCH(xRRListProviderPropertiesReq);
swapl(&stuff->provider);
return ProcRRListProviderProperties(client);
}
static int _X_COLD
SProcRRQueryProviderProperty(ClientPtr client)
{
REQUEST(xRRQueryProviderPropertyReq);
REQUEST_SIZE_MATCH(xRRQueryProviderPropertyReq);
swapl(&stuff->provider);
swapl(&stuff->property);
return ProcRRQueryProviderProperty(client);
}
static int _X_COLD
SProcRRConfigureProviderProperty(ClientPtr client)
{
REQUEST(xRRConfigureProviderPropertyReq);
REQUEST_AT_LEAST_SIZE(xRRConfigureProviderPropertyReq);
swapl(&stuff->provider);
swapl(&stuff->property);
/* TODO: no way to specify format? */
SwapRestL(stuff);
return ProcRRConfigureProviderProperty(client);
}
static int _X_COLD
SProcRRChangeProviderProperty(ClientPtr client)
{
REQUEST(xRRChangeProviderPropertyReq);
REQUEST_AT_LEAST_SIZE(xRRChangeProviderPropertyReq);
swapl(&stuff->provider);
swapl(&stuff->property);
swapl(&stuff->type);
swapl(&stuff->nUnits);
switch (stuff->format) {
case 8:
break;
case 16:
SwapRestS(stuff);
break;
case 32:
SwapRestL(stuff);
break;
}
return ProcRRChangeProviderProperty(client);
}
static int _X_COLD
SProcRRDeleteProviderProperty(ClientPtr client)
{
REQUEST(xRRDeleteProviderPropertyReq);
REQUEST_SIZE_MATCH(xRRDeleteProviderPropertyReq);
swapl(&stuff->provider);
swapl(&stuff->property);
return ProcRRDeleteProviderProperty(client);
}
static int _X_COLD
SProcRRGetProviderProperty(ClientPtr client)
{
REQUEST(xRRGetProviderPropertyReq);
REQUEST_SIZE_MATCH(xRRGetProviderPropertyReq);
swapl(&stuff->provider);
swapl(&stuff->property);
swapl(&stuff->type);
swapl(&stuff->longOffset);
swapl(&stuff->longLength);
return ProcRRGetProviderProperty(client);
}
static int _X_COLD
SProcRRGetMonitors(ClientPtr client) {
REQUEST(xRRGetMonitorsReq);
REQUEST_SIZE_MATCH(xRRGetMonitorsReq);
swapl(&stuff->window);
return ProcRRGetMonitors(client);
}
static int _X_COLD
SProcRRSetMonitor(ClientPtr client) {
REQUEST(xRRSetMonitorReq);
REQUEST_AT_LEAST_SIZE(xRRGetMonitorsReq);
swapl(&stuff->window);
swapl(&stuff->monitor.name);
swaps(&stuff->monitor.noutput);
swaps(&stuff->monitor.x);
swaps(&stuff->monitor.y);
swaps(&stuff->monitor.width);
swaps(&stuff->monitor.height);
SwapRestL(stuff);
return ProcRRSetMonitor(client);
}
static int _X_COLD
SProcRRDeleteMonitor(ClientPtr client) {
REQUEST(xRRDeleteMonitorReq);
REQUEST_SIZE_MATCH(xRRDeleteMonitorReq);
swapl(&stuff->window);
swapl(&stuff->name);
return ProcRRDeleteMonitor(client);
}
static int _X_COLD
SProcRRCreateLease(ClientPtr client) {
REQUEST(xRRCreateLeaseReq);
REQUEST_AT_LEAST_SIZE(xRRCreateLeaseReq);
swapl(&stuff->window);
swaps(&stuff->nCrtcs);
swaps(&stuff->nOutputs);
SwapRestL(stuff);
return ProcRRCreateLease(client);
}
static int _X_COLD
SProcRRFreeLease(ClientPtr client) {
REQUEST(xRRFreeLeaseReq);
REQUEST_SIZE_MATCH(xRRFreeLeaseReq);
swapl(&stuff->lid);
return ProcRRFreeLease(client);
}
int
SProcRRDispatch(ClientPtr client)
{
REQUEST(xReq);
UpdateCurrentTimeIf();
switch (stuff->data) {
case X_RRQueryVersion: return SProcRRQueryVersion(client);
case X_RRSetScreenConfig: return SProcRRSetScreenConfig(client);
case X_RRSelectInput: return SProcRRSelectInput(client);
case X_RRGetScreenInfo: return SProcRRGetScreenInfo(client);
/* V1.2 additions */
case X_RRGetScreenSizeRange: return SProcRRGetScreenSizeRange(client);
case X_RRSetScreenSize: return SProcRRSetScreenSize(client);
case X_RRGetScreenResources: return SProcRRGetScreenResources(client);
case X_RRGetOutputInfo: return SProcRRGetOutputInfo(client);
case X_RRListOutputProperties: return SProcRRListOutputProperties(client);
case X_RRQueryOutputProperty: return SProcRRQueryOutputProperty(client);
case X_RRConfigureOutputProperty: return SProcRRConfigureOutputProperty(client);
case X_RRChangeOutputProperty: return SProcRRChangeOutputProperty(client);
case X_RRDeleteOutputProperty: return SProcRRDeleteOutputProperty(client);
case X_RRGetOutputProperty: return SProcRRGetOutputProperty(client);
case X_RRCreateMode: return SProcRRCreateMode(client);
case X_RRDestroyMode: return SProcRRDestroyMode(client);
case X_RRAddOutputMode: return SProcRRAddOutputMode(client);
case X_RRDeleteOutputMode: return SProcRRDeleteOutputMode(client);
case X_RRGetCrtcInfo: return SProcRRGetCrtcInfo(client);
case X_RRSetCrtcConfig: return SProcRRSetCrtcConfig(client);
case X_RRGetCrtcGammaSize: return SProcRRGetCrtcGammaSize(client);
case X_RRGetCrtcGamma: return SProcRRGetCrtcGamma(client);
case X_RRSetCrtcGamma: return SProcRRSetCrtcGamma(client);
/* V1.3 additions */
case X_RRGetScreenResourcesCurrent: return SProcRRGetScreenResourcesCurrent(client);
case X_RRSetCrtcTransform: return SProcRRSetCrtcTransform(client);
case X_RRGetCrtcTransform: return SProcRRGetCrtcTransform(client);
case X_RRGetPanning: return SProcRRGetPanning(client);
case X_RRSetPanning: return SProcRRSetPanning(client);
case X_RRSetOutputPrimary: return SProcRRSetOutputPrimary(client);
case X_RRGetOutputPrimary: return SProcRRGetOutputPrimary(client);
/* V1.4 additions */
case X_RRGetProviders: return SProcRRGetProviders(client);
case X_RRGetProviderInfo: return SProcRRGetProviderInfo(client);
case X_RRSetProviderOffloadSink: return SProcRRSetProviderOffloadSink(client);
case X_RRSetProviderOutputSource: return SProcRRSetProviderOutputSource(client);
case X_RRListProviderProperties: return SProcRRListProviderProperties(client);
case X_RRQueryProviderProperty: return SProcRRQueryProviderProperty(client);
case X_RRConfigureProviderProperty: return SProcRRConfigureProviderProperty(client);
case X_RRChangeProviderProperty: return SProcRRChangeProviderProperty(client);
case X_RRDeleteProviderProperty: return SProcRRDeleteProviderProperty(client);
case X_RRGetProviderProperty: return SProcRRGetProviderProperty(client);
/* V1.5 additions */
case X_RRGetMonitors: return SProcRRGetMonitors(client);
case X_RRSetMonitor: return SProcRRSetMonitor(client);
case X_RRDeleteMonitor: return SProcRRDeleteMonitor(client);
/* V1.6 additions */
case X_RRCreateLease: return SProcRRCreateLease(client);
case X_RRFreeLease: return SProcRRFreeLease(client);
}
return BadRequest;
}