diff options
Diffstat (limited to 'decode_randr.c')
-rw-r--r-- | decode_randr.c | 465 |
1 files changed, 455 insertions, 10 deletions
diff --git a/decode_randr.c b/decode_randr.c index 7bba005..59ebc7f 100644 --- a/decode_randr.c +++ b/decode_randr.c @@ -1,5 +1,6 @@ /* * Copyright © 2001 Keith Packard, member of The XFree86 Project, Inc. + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -33,6 +34,8 @@ static unsigned char RANDRRequest, RANDRError, RANDREvent; +#define RANDRNError 4 /* as of RandR 1.4 - 2012-07-03 */ + static void randr_decode_req(FD fd, const unsigned char *buf) { @@ -40,12 +43,13 @@ randr_decode_req(FD fd, const unsigned char *buf) short Minor = IByte(&buf[1]); switch (Minor) { +/* RandR 0.x & 1.0 requests are intermixed in minor codes 0-5 */ case 0: RandrQueryVersion(fd, buf); ExtendedReplyExpected(fd, Major, Minor); break; case 1: - RandrGetScreenInfo(fd, buf); + RandrOldGetScreenInfo(fd, buf); ExtendedReplyExpected(fd, Major, Minor); break; case 2: @@ -53,7 +57,151 @@ randr_decode_req(FD fd, const unsigned char *buf) ExtendedReplyExpected(fd, Major, Minor); break; case 3: - RandrScreenChangeSelectInput(fd, buf); + RandrOldScreenChangeSelectInput(fd, buf); + break; + case 4: + RandrSelectInput(fd, buf); + break; + case 5: + RandrGetScreenInfo(fd, buf); + ExtendedReplyExpected(fd, Major, Minor); + break; + +/* RandR 1.2 additions */ + case 6: + RandrGetScreenSizeRange(fd, buf); + ExtendedReplyExpected(fd, Major, Minor); + break; + case 7: + RandrSetScreenSize(fd, buf); + break; + case 8: + RandrGetScreenResources(fd, buf); + ExtendedReplyExpected(fd, Major, Minor); + break; + case 9: + RandrGetOutputInfo(fd, buf); + ExtendedReplyExpected(fd, Major, Minor); + break; + case 10: + RandrListOutputProperties(fd, buf); + ExtendedReplyExpected(fd, Major, Minor); + break; + case 11: + RandrQueryOutputProperty(fd, buf); + ExtendedReplyExpected(fd, Major, Minor); + break; + case 12: + RandrConfigureOutputProperty(fd, buf); + break; + case 13: + RandrChangeOutputProperty(fd, buf); + break; + case 14: + RandrDeleteOutputProperty(fd, buf); + break; + case 15: + RandrGetOutputProperty(fd, buf); + ExtendedReplyExpected(fd, Major, Minor); + break; + case 16: + RandrCreateMode(fd, buf); + ExtendedReplyExpected(fd, Major, Minor); + break; + case 17: + RandrDestroyMode(fd, buf); + break; + case 18: + RandrAddOutputMode(fd, buf); + break; + case 19: + RandrDeleteOutputMode(fd, buf); + break; + case 20: + RandrGetCrtcInfo(fd, buf); + ExtendedReplyExpected(fd, Major, Minor); + break; + case 21: + RandrSetCrtcConfig(fd, buf); + ExtendedReplyExpected(fd, Major, Minor); + break; + case 22: + RandrGetCrtcGammaSize(fd, buf); + ExtendedReplyExpected(fd, Major, Minor); + break; + case 23: + RandrGetCrtcGamma(fd, buf); + ExtendedReplyExpected(fd, Major, Minor); + break; + case 24: + RandrSetCrtcGamma(fd, buf); + break; + +/* RandR 1.3 additions */ + case 25: + RandrGetScreenResourcesCurrent(fd, buf); + ExtendedReplyExpected(fd, Major, Minor); + break; + case 26: + RandrSetCrtcTransform(fd, buf); + break; + case 27: + RandrGetCrtcTransform(fd, buf); + ExtendedReplyExpected(fd, Major, Minor); + break; + case 28: + RandrGetPanning(fd, buf); + ExtendedReplyExpected(fd, Major, Minor); + break; + case 29: + RandrSetPanning(fd, buf); + ExtendedReplyExpected(fd, Major, Minor); + break; + case 30: + RandrSetOutputPrimary(fd, buf); + break; + case 31: + RandrGetOutputPrimary(fd, buf); + ExtendedReplyExpected(fd, Major, Minor); + break; + +/* RandR 1.4 additions */ + case 32: + RandrGetProviders(fd, buf); + ExtendedReplyExpected(fd, Major, Minor); + break; + case 33: + RandrGetProviderInfo(fd, buf); + ExtendedReplyExpected(fd, Major, Minor); + break; + case 34: + RandrSetProviderOffloadSink(fd, buf); + break; + case 35: + RandrSetProviderOutputSource(fd, buf); + break; + case 36: + RandrListProviderProperties(fd, buf); + ExtendedReplyExpected(fd, Major, Minor); + break; + case 37: + RandrQueryProviderProperty(fd, buf); + ExtendedReplyExpected(fd, Major, Minor); + break; + case 38: + RandrConfigureProviderProperty(fd, buf); + break; + case 39: + RandrChangeProviderProperty(fd, buf); + break; + case 40: + RandrDeleteProviderProperty(fd, buf); + break; + case 41: + RandrGetProviderProperty(fd, buf); + ExtendedReplyExpected(fd, Major, Minor); + break; + default: ExtendedRequest(fd, buf); ExtendedReplyExpected(fd, Major, Minor); @@ -65,15 +213,89 @@ static void randr_decode_reply(FD fd, const unsigned char *buf, short RequestMinor) { switch (RequestMinor) { +/* RandR 0.x & 1.0 requests are intermixed in minor codes 0-5 */ case 0: RandrQueryVersionReply(fd, buf); break; case 1: - RandrGetScreenInfoReply(fd, buf); + RandrOldGetScreenInfoReply(fd, buf); break; case 2: RandrSetScreenConfigReply(fd, buf); break; + case 5: + RandrGetScreenInfoReply(fd, buf); + break; + +/* RandR 1.2 additions */ + case 6: + RandrGetScreenSizeRangeReply(fd, buf); + break; + case 8: + RandrGetScreenResourcesReply(fd, buf); + break; + case 9: + RandrGetOutputInfoReply(fd, buf); + break; + case 10: + RandrListOutputPropertiesReply(fd, buf); + break; + case 11: + RandrQueryOutputPropertyReply(fd, buf); + break; + case 15: + RandrGetOutputPropertyReply(fd, buf); + break; + case 16: + RandrCreateModeReply(fd, buf); + break; + case 20: + RandrGetCrtcInfoReply(fd, buf); + break; + case 21: + RandrSetCrtcConfigReply(fd, buf); + break; + case 22: + RandrGetCrtcGammaSizeReply(fd, buf); + break; + case 23: + RandrGetCrtcGammaReply(fd, buf); + break; + +/* RandR 1.3 additions */ + case 25: + RandrGetScreenResourcesCurrentReply(fd, buf); + break; + case 27: + RandrGetCrtcTransformReply(fd, buf); + break; + case 28: + RandrGetPanningReply(fd, buf); + break; + case 29: + RandrSetPanningReply(fd, buf); + break; + case 31: + RandrGetOutputPrimaryReply(fd, buf); + break; + +/* RandR 1.4 additions */ + case 32: + RandrGetProvidersReply(fd, buf); + break; + case 33: + RandrGetProviderInfoReply(fd, buf); + break; + case 36: + RandrListProviderPropertiesReply(fd, buf); + break; + case 37: + RandrQueryProviderPropertyReply(fd, buf); + break; + case 41: + RandrGetProviderPropertyReply(fd, buf); + break; + default: UnknownReply(buf); break; @@ -83,7 +305,71 @@ randr_decode_reply(FD fd, const unsigned char *buf, short RequestMinor) static void randr_decode_event(FD fd, const unsigned char *buf) { - RandrScreenChangeNotifyEvent(buf); + short event = IByte(&buf[0]) - RANDREvent; + + switch (event) { + case 0: + RandrScreenChangeNotifyEvent(buf); + break; +/* RandR 1.2 and later additions share this event code and use sub-codes */ + case 1: + { + short minor = IByte(&buf[1]); + switch (minor) { + case 0: + RandrCrtcChangeNotifyEvent(buf); + break; + case 1: + RandrOutputChangeNotifyEvent(buf); + break; + case 2: + RandrOutputPropertyNotifyEvent(buf); + break; + case 3: + RandrProviderChangeNotifyEvent(buf); + break; + case 4: + RandrProviderPropertyNotifyEvent(buf); + break; + case 5: + RandrResourceChangeNotifyEvent(buf); + break; + default: + UnknownEvent(buf); + break; + } + } + break; + default: + UnknownEvent(buf); + break; + } +} + +static void +randr_decode_error(FD fd, const unsigned char *buf) +{ + short error = IByte(&buf[1]) - RANDRError; + + switch (error) { +/* RandR 1.2 additions */ + case 0: + RandrOutputError(fd, buf); + break; + case 1: + RandrCrtcError(fd, buf); + break; + case 2: + RandrModeError(fd, buf); + break; +/* RandR 1.4 additions */ + case 3: + RandrProviderError(fd, buf); + break; + default: + UnknownError(buf); + break; + } } void @@ -99,24 +385,183 @@ InitializeRANDR(const unsigned char *buf) DefineEValue(&TD[REPLY], (unsigned long) RANDRRequest, "RandrReply"); DefineEValue(&TD[EVENT], (unsigned long) RANDREvent, "RRScreenChangeNotify"); + DefineEValue(&TD[EVENT], (unsigned long) RANDREvent + 1, "RandrNotify"); + + DefineEValue(&TD[ERROR], (unsigned long) RANDRError + 0, "BadOutput"); + DefineEValue(&TD[ERROR], (unsigned long) RANDRError + 1, "BadCrtc"); + DefineEValue(&TD[ERROR], (unsigned long) RANDRError + 2, "BadMode"); + DefineEValue(&TD[ERROR], (unsigned long) RANDRError + 3, "BadProvider"); + p = DefineType(RANDRREQUEST, ENUMERATED, "RANDRREQUEST", (PrintProcType) PrintENUMERATED); DefineEValue(p, 0L, "RandrQueryVersion"); - DefineEValue(p, 1L, "RandrGetScreenInfo"); + DefineEValue(p, 1L, "RandrOldGetScreenInfo"); DefineEValue(p, 2L, "RandrSetScreenConfig"); - DefineEValue(p, 3L, "RandrScreenChangeSelectInput"); + DefineEValue(p, 3L, "RandrOldScreenChangeSelectInput"); + DefineEValue(p, 4L, "RandrSelectInput"); + DefineEValue(p, 5L, "RandrGetScreenInfo"); + DefineEValue(p, 6L, "RandrGetScreenSizeRange"); + DefineEValue(p, 7L, "RandrSetScreenSize"); + DefineEValue(p, 8L, "RandrGetScreenResources"); + DefineEValue(p, 9L, "RandrGetOutputInfo"); + DefineEValue(p, 10L, "RandrListOutputProperties"); + DefineEValue(p, 11L, "RandrQueryOutputProperty"); + DefineEValue(p, 12L, "RandrConfigureOutputProperty"); + DefineEValue(p, 13L, "RandrChangeOutputProperty"); + DefineEValue(p, 14L, "RandrDeleteOutputProperty"); + DefineEValue(p, 15L, "RandrGetOutputProperty"); + DefineEValue(p, 16L, "RandrCreateMode"); + DefineEValue(p, 17L, "RandrDestroyMode"); + DefineEValue(p, 18L, "RandrAddOutputMode"); + DefineEValue(p, 19L, "RandrDeleteOutputMode"); + DefineEValue(p, 20L, "RandrGetCrtcInfo"); + DefineEValue(p, 21L, "RandrSetCrtcConfig"); + DefineEValue(p, 22L, "RandrGetCrtcGammaSize"); + DefineEValue(p, 23L, "RandrGetCrtcGamma"); + DefineEValue(p, 24L, "RandrSetCrtcGamma"); + DefineEValue(p, 25L, "RandrGetScreenResourcesCurrent"); + DefineEValue(p, 26L, "RandrSetCrtcTransform"); + DefineEValue(p, 27L, "RandrGetCrtcTransform"); + DefineEValue(p, 28L, "RandrGetPanning"); + DefineEValue(p, 29L, "RandrSetPanning"); + DefineEValue(p, 30L, "RandrSetOutputPrimary"); + DefineEValue(p, 31L, "RandrGetOutputPrimary"); + DefineEValue(p, 32L, "RandrGetProviders"); + DefineEValue(p, 33L, "RandrGetProviderInfo"); + DefineEValue(p, 34L, "RandrSetProviderOffloadSink"); + DefineEValue(p, 35L, "RandrSetProviderOutputSource"); + DefineEValue(p, 36L, "RandrListProviderProperties"); + DefineEValue(p, 37L, "RandrQueryProviderProperty"); + DefineEValue(p, 38L, "RandrConfigureProviderProperty"); + DefineEValue(p, 39L, "RandrChangeProviderProperty"); + DefineEValue(p, 40L, "RandrDeleteProviderProperty"); + DefineEValue(p, 41L, "RandrGetProviderProperty"); p = DefineType(RANDRREPLY, ENUMERATED, "RANDRREPLY", (PrintProcType) PrintENUMERATED); DefineEValue(p, 0L, "QueryVersion"); - DefineEValue(p, 1L, "GetScreenInfo"); + DefineEValue(p, 1L, "OldGetScreenInfo"); DefineEValue(p, 2L, "SetScreenConfig"); + DefineEValue(p, 3L, "OldScreenChangeSelectInput"); + DefineEValue(p, 4L, "SelectInput"); + DefineEValue(p, 5L, "GetScreenInfo"); + DefineEValue(p, 6L, "GetScreenSizeRange"); + DefineEValue(p, 7L, "SetScreenSize"); + DefineEValue(p, 8L, "GetScreenResources"); + DefineEValue(p, 9L, "GetOutputInfo"); + DefineEValue(p, 10L, "ListOutputProperties"); + DefineEValue(p, 11L, "QueryOutputProperty"); + DefineEValue(p, 12L, "ConfigureOutputProperty"); + DefineEValue(p, 13L, "ChangeOutputProperty"); + DefineEValue(p, 14L, "DeleteOutputProperty"); + DefineEValue(p, 15L, "GetOutputProperty"); + DefineEValue(p, 16L, "CreateMode"); + DefineEValue(p, 17L, "DestroyMode"); + DefineEValue(p, 18L, "AddOutputMode"); + DefineEValue(p, 19L, "DeleteOutputMode"); + DefineEValue(p, 20L, "GetCrtcInfo"); + DefineEValue(p, 21L, "SetCrtcConfig"); + DefineEValue(p, 22L, "GetCrtcGammaSize"); + DefineEValue(p, 23L, "GetCrtcGamma"); + DefineEValue(p, 24L, "SetCrtcGamma"); + DefineEValue(p, 25L, "GetScreenResourcesCurrent"); + DefineEValue(p, 26L, "SetCrtcTransform"); + DefineEValue(p, 27L, "GetCrtcTransform"); + DefineEValue(p, 28L, "GetPanning"); + DefineEValue(p, 29L, "SetPanning"); + DefineEValue(p, 30L, "SetOutputPrimary"); + DefineEValue(p, 31L, "GetOutputPrimary"); + DefineEValue(p, 32L, "GetProviders"); + DefineEValue(p, 33L, "GetProviderInfo"); + DefineEValue(p, 34L, "SetProviderOffloadSink"); + DefineEValue(p, 35L, "SetProviderOutputSource"); + DefineEValue(p, 36L, "ListProviderProperties"); + DefineEValue(p, 37L, "QueryProviderProperty"); + DefineEValue(p, 38L, "ConfigureProviderProperty"); + DefineEValue(p, 39L, "ChangeProviderProperty"); + DefineEValue(p, 40L, "DeleteProviderProperty"); + DefineEValue(p, 41L, "GetProviderProperty"); + + p = DefineType(RANDREVENT, ENUMERATED, "RANDREVENT", + (PrintProcType) PrintENUMERATED); + /* V1.2 additions */ + DefineEValue(p, 0L, "RRCrtcChangeNotify"); + DefineEValue(p, 1L, "RROutputChangeNotify"); + DefineEValue(p, 2L, "RROutputPropertyNotify"); + /* V1.4 additions */ + DefineEValue(p, 3L, "RRProviderChangeNotify"); + DefineEValue(p, 4L, "RRProviderPropertyNotify"); + DefineEValue(p, 5L, "RRResourceChangeNotify"); + + p = DefineType(SETofRREVENT, SET, "SETofRREVENT", (PrintProcType) PrintSET); + /* Event selection bits */ + DefineEValue(p, (1L << 0), "ScreenChangeNotifyMask"); + /* V1.2 additions */ + DefineEValue(p, (1L << 1), "CrtcChangeNotifyMask"); + DefineEValue(p, (1L << 2), "OutputChangeNotifyMask"); + DefineEValue(p, (1L << 3), "OutputPropertyNotifyMask"); + /* V1.4 additions */ + DefineEValue(p, (1L << 4), "ProviderChangeNotifyMask"); + DefineEValue(p, (1L << 5), "ProviderPropertyNotifyMask"); + DefineEValue(p, (1L << 6), "ResourceChangeNotifyMask"); + + p = DefineType(SETofROTATION, SET, "ROTATION", (PrintProcType) PrintSET); + DefineEValue(p, 1L, "Rotate_0"); + DefineEValue(p, 2L, "Rotate_90"); + DefineEValue(p, 4L, "Rotate_180"); + DefineEValue(p, 8L, "Rotate_270"); + DefineEValue(p, 16L, "Reflect_X"); + DefineEValue(p, 32L, "Reflect_Y"); + + DefineType(SCREENSIZE, RECORD, "SCREENSIZE", PrintSCREENSIZE); + + /* RandR 1.2 additions */ + p = DefineType(SETofMODEFLAG, SET, "MODEFLAG", (PrintProcType) PrintSET); + DefineEValue(p, 0x00000001, "HSyncPositive"); + DefineEValue(p, 0x00000002, "HSyncNegative"); + DefineEValue(p, 0x00000004, "VSyncPositive"); + DefineEValue(p, 0x00000008, "VSyncNegative"); + DefineEValue(p, 0x00000010, "Interlace"); + DefineEValue(p, 0x00000020, "DoubleScan"); + DefineEValue(p, 0x00000040, "CSync"); + DefineEValue(p, 0x000100080, "CSyncPositive"); + DefineEValue(p, 0x00000100, "CSyncNegative"); + DefineEValue(p, 0x00000200, "HSkewPresent"); + DefineEValue(p, 0x00000400, "BCast"); + DefineEValue(p, 0x00000800, "PixelMultiplex"); + DefineEValue(p, 0x00001000, "DoubleClock"); + DefineEValue(p, 0x00002000, "ClockDivideBy2"); + + DefineType(MODEINFO, RECORD, "MODEINFO", PrintMODEINFO); + DefineType(MODE, BUILTIN, "MODE", PrintMODE); + DefineType(CRTC, BUILTIN, "CRTC", PrintCRTC); + DefineType(OUTPUT, BUILTIN, "OUTPUT", PrintOUTPUT); + + p = DefineType(CONNECTION, ENUMERATED, "CONNECTION", + (PrintProcType) PrintENUMERATED); + DefineEValue(p, 0L, "Connected"); + DefineEValue(p, 1L, "Disconnected"); + DefineEValue(p, 2L, "UnknownConnection"); + + /* RandR depends on Render's SUBPIXEL & TRANSFORM types */ + InitializeCommonRenderTypes(); + + /* RandR 1.4 additions */ + p = DefineType(SETofPROVIDER_CAPS, SET, "PROVIDER_CAPS", + (PrintProcType) PrintSET); + DefineEValue(p, 0x00000001, "SourceOutput"); + DefineEValue(p, 0x00000002, "SinkOutput"); + DefineEValue(p, 0x00000004, "SourceOffload"); + DefineEValue(p, 0x00000008, "SinkOffload"); + InitializeExtensionDecoder(RANDRRequest, randr_decode_req, randr_decode_reply); - /* Not yet implemented: - InitializeExtensionErrorDecoder(RANDRError, randr_decode_error); */ InitializeExtensionEventDecoder(RANDREvent, randr_decode_event); - + InitializeExtensionEventDecoder(RANDREvent + 1, randr_decode_event); + for (int errcode = RANDRError; errcode < (RANDRError + RANDRNError); + errcode++) { + InitializeExtensionErrorDecoder(errcode, randr_decode_error); + } } |