diff options
author | Jesse Barnes <jbarnes@jbarnes-t61.(none)> | 2008-03-06 13:47:44 -0800 |
---|---|---|
committer | Jesse Barnes <jbarnes@jbarnes-t61.(none)> | 2008-03-06 13:50:58 -0800 |
commit | ca616b902b2c5d0f046c7a042c11f045479e373a (patch) | |
tree | 584864c7d618b4b5dcdd3d3fe967c2c26cc7f2cd /randr | |
parent | 34b69e3bc0e6462eb60029fbcb4f5479494007a2 (diff) |
Allow RandR get output property to call into drivers
In order to report accurate values to users of the RandR property interface,
it's sometimes necessary to ask the driver to update the value (for example
when backlight brightness changes without the server's knowledge, due to hotkey
events or direct sysfs banging).
This patch wires up the core server code with a new xf86CrtcFuncs callback,
get_property, to allow for this.
The new code is available under the RANDR_13_INTERFACE define, which in turn
depends on the RANDR_12_INTERFACE code.
Diffstat (limited to 'randr')
-rw-r--r-- | randr/mirandr.c | 11 | ||||
-rw-r--r-- | randr/randrstr.h | 10 | ||||
-rw-r--r-- | randr/rrproperty.c | 19 |
3 files changed, 34 insertions, 6 deletions
diff --git a/randr/mirandr.c b/randr/mirandr.c index 3c4991e5a..777785380 100644 --- a/randr/mirandr.c +++ b/randr/mirandr.c @@ -74,6 +74,14 @@ miRROutputSetProperty (ScreenPtr pScreen, } Bool +miRROutputGetProperty (ScreenPtr pScreen, + RROutputPtr output, + Atom property) +{ + return TRUE; +} + +Bool miRROutputValidateMode (ScreenPtr pScreen, RROutputPtr output, RRModePtr mode) @@ -116,6 +124,9 @@ miRandRInit (ScreenPtr pScreen) pScrPriv->rrCrtcSet = miRRCrtcSet; pScrPriv->rrCrtcSetGamma = miRRCrtcSetGamma; pScrPriv->rrOutputSetProperty = miRROutputSetProperty; +#if RANDR_13_INTERFACE + pScrPriv->rrOutputGetProperty = miRROutputGetProperty; +#endif pScrPriv->rrOutputValidateMode = miRROutputValidateMode; pScrPriv->rrModeDestroy = miRRModeDestroy; diff --git a/randr/randrstr.h b/randr/randrstr.h index e8358bc0c..3b48f5c2b 100644 --- a/randr/randrstr.h +++ b/randr/randrstr.h @@ -54,6 +54,7 @@ /* required for ABI compatibility for now */ #define RANDR_10_INTERFACE 1 #define RANDR_12_INTERFACE 1 +#define RANDR_13_INTERFACE 1 /* requires RANDR_12_INTERFACE */ typedef XID RRMode; typedef XID RROutput; @@ -175,6 +176,12 @@ typedef void (*RRModeDestroyProcPtr) (ScreenPtr pScreen, #endif +#if RANDR_13_INTERFACE +typedef Bool (*RROutputGetPropertyProcPtr) (ScreenPtr pScreen, + RROutputPtr output, + Atom property); +#endif /* RANDR_13_INTERFACE */ + typedef Bool (*RRGetInfoProcPtr) (ScreenPtr pScreen, Rotation *rotations); typedef Bool (*RRCloseScreenProcPtr) ( int i, ScreenPtr pscreen); @@ -220,6 +227,9 @@ typedef struct _rrScrPriv { RROutputValidateModeProcPtr rrOutputValidateMode; RRModeDestroyProcPtr rrModeDestroy; #endif +#if RANDR_13_INTERFACE + RROutputGetPropertyProcPtr rrOutputGetProperty; +#endif /* * Private part of the structure; not considered part of the ABI diff --git a/randr/rrproperty.c b/randr/rrproperty.c index 4617064e4..9bb7081ca 100644 --- a/randr/rrproperty.c +++ b/randr/rrproperty.c @@ -300,13 +300,21 @@ RRPropertyValuePtr RRGetOutputProperty (RROutputPtr output, Atom property, Bool pending) { RRPropertyPtr prop = RRQueryOutputProperty (output, property); + rrScrPrivPtr pScrPriv = rrGetScrPriv(output->pScreen); if (!prop) return NULL; if (pending && prop->is_pending) return &prop->pending; - else + else { +#if RANDR_13_INTERFACE + /* If we can, try to update the property value first */ + if (pScrPriv->rrOutputGetProperty) + pScrPriv->rrOutputGetProperty(output->pScreen, output, + prop->propertyName); +#endif return &prop->current; + } } int @@ -610,11 +618,10 @@ ProcRRGetOutputProperty (ClientPtr client) if (prop->immutable && stuff->delete) return BadAccess; - if (stuff->pending && prop->is_pending) - prop_value = &prop->pending; - else - prop_value = &prop->current; - + prop_value = RRGetOutputProperty(output, stuff->property, stuff->pending); + if (!prop_value) + return BadAtom; + /* If the request type and actual type don't match. Return the property information, but not the data. */ |