diff options
author | Keith Packard <keithp@keithp.com> | 2018-02-12 13:51:54 -0800 |
---|---|---|
committer | Adam Jackson <ajax@redhat.com> | 2018-02-27 12:34:26 -0500 |
commit | 39573605050f6253d14a4786bb79ce2b48537039 (patch) | |
tree | 4d5e1d34bb1a4c890d5db33287a0ebc6841c6b66 /randr | |
parent | b91c787c4cd2d20685db69426c539938c556128a (diff) |
randr: Support "non-desktop" property
Tracks changes to the non-desktop property so that when non-zero,
outputs will always appear to be disconnected.
Signed-off-by: Keith Packard <keithp@keithp.com>
Reviewed-by: Adam Jackson <ajax@nwnk.net>
Diffstat (limited to 'randr')
-rw-r--r-- | randr/randrstr.h | 3 | ||||
-rw-r--r-- | randr/rroutput.c | 26 | ||||
-rw-r--r-- | randr/rrproperty.c | 27 |
3 files changed, 55 insertions, 1 deletions
diff --git a/randr/randrstr.h b/randr/randrstr.h index 3f218009d..b4fe833d9 100644 --- a/randr/randrstr.h +++ b/randr/randrstr.h @@ -153,6 +153,7 @@ struct _rrOutput { int numUserModes; RRModePtr *userModes; Bool changed; + Bool nonDesktop; RRPropertyPtr properties; Bool pendingProperties; void *devPrivate; @@ -551,6 +552,8 @@ extern _X_EXPORT Bool RRScreenInit(ScreenPtr pScreen); extern _X_EXPORT RROutputPtr RRFirstOutput(ScreenPtr pScreen); +extern _X_EXPORT Bool RROutputSetNonDesktop(RROutputPtr output, Bool non_desktop); + extern _X_EXPORT CARD16 RRVerticalRefresh(xRRModeInfo * mode); diff --git a/randr/rroutput.c b/randr/rroutput.c index 90fe4e6c1..d5c30aded 100644 --- a/randr/rroutput.c +++ b/randr/rroutput.c @@ -22,6 +22,7 @@ */ #include "randrstr.h" +#include <X11/Xatom.h> RESTYPE RROutputType; @@ -65,6 +66,7 @@ RROutputCreate(ScreenPtr pScreen, RROutputPtr output; RROutputPtr *outputs; rrScrPrivPtr pScrPriv; + Atom nonDesktopAtom; if (!RRInit()) return NULL; @@ -111,6 +113,13 @@ RROutputCreate(ScreenPtr pScreen, pScrPriv->outputs[pScrPriv->numOutputs++] = output; + nonDesktopAtom = MakeAtom(RR_PROPERTY_NON_DESKTOP, strlen(RR_PROPERTY_NON_DESKTOP), TRUE); + if (nonDesktopAtom != BAD_RESOURCE) { + static const INT32 values[2] = { 0, 1 }; + (void) RRConfigureOutputProperty(output, nonDesktopAtom, FALSE, FALSE, FALSE, + 2, values); + } + RROutputSetNonDesktop(output, FALSE); RRResourcesChanged(pScreen); return output; @@ -311,6 +320,20 @@ RROutputSetPhysicalSize(RROutputPtr output, int mmWidth, int mmHeight) return TRUE; } +Bool +RROutputSetNonDesktop(RROutputPtr output, Bool nonDesktop) +{ + const char *nonDesktopStr = RR_PROPERTY_NON_DESKTOP; + Atom nonDesktopProp = MakeAtom(nonDesktopStr, strlen(nonDesktopStr), TRUE); + uint32_t value = nonDesktop ? 1 : 0; + + if (nonDesktopProp == None || nonDesktopProp == BAD_RESOURCE) + return FALSE; + + return RRChangeOutputProperty(output, nonDesktopProp, XA_INTEGER, 32, + PropModeReplace, 1, &value, TRUE, FALSE) == Success; +} + void RRDeliverOutputEvent(ClientPtr client, WindowPtr pWin, RROutputPtr output) { @@ -330,7 +353,7 @@ RRDeliverOutputEvent(ClientPtr client, WindowPtr pWin, RROutputPtr output) .crtc = crtc ? crtc->id : None, .mode = mode ? mode->mode.id : None, .rotation = crtc ? crtc->rotation : RR_Rotate_0, - .connection = output->connection, + .connection = output->nonDesktop ? RR_Disconnected : output->connection, .subpixelOrder = output->subpixelOrder }; WriteEventsToClient(client, 1, (xEvent *) &oe); @@ -442,6 +465,7 @@ ProcRRGetOutputInfo(ClientPtr client) .crtc = output->crtc ? output->crtc->id : None, .mmWidth = output->mmWidth, .mmHeight = output->mmHeight, + .connection = output->nonDesktop ? RR_Disconnected : output->connection, .connection = output->connection, .subpixelOrder = output->subpixelOrder, .nCrtcs = output->numCrtcs, diff --git a/randr/rrproperty.c b/randr/rrproperty.c index 6ffe91a47..6598f6259 100644 --- a/randr/rrproperty.c +++ b/randr/rrproperty.c @@ -23,6 +23,7 @@ #include "randrstr.h" #include "propertyst.h" #include "swaprep.h" +#include <X11/Xatom.h> static int DeliverPropertyEvent(WindowPtr pWin, void *value) @@ -132,6 +133,29 @@ RRDeleteOutputProperty(RROutputPtr output, Atom property) } } +static void +RRNoticePropertyChange(RROutputPtr output, Atom property, RRPropertyValuePtr value) +{ + const char *non_desktop_str = RR_PROPERTY_NON_DESKTOP; + Atom non_desktop_prop = MakeAtom(non_desktop_str, strlen(non_desktop_str), FALSE); + + if (property == non_desktop_prop) { + if (value->type == XA_INTEGER && value->format == 32 && value->size >= 1) { + uint32_t nonDesktopData; + Bool nonDesktop; + + memcpy(&nonDesktopData, value->data, sizeof (nonDesktopData)); + nonDesktop = nonDesktopData != 0; + + if (nonDesktop != output->nonDesktop) { + output->nonDesktop = nonDesktop; + RROutputChanged(output, 0); + RRTellChanged(output->pScreen); + } + } + } +} + int RRChangeOutputProperty(RROutputPtr output, Atom property, Atom type, int format, int mode, unsigned long len, @@ -235,6 +259,9 @@ RRChangeOutputProperty(RROutputPtr output, Atom property, Atom type, if (pending && prop->is_pending) output->pendingProperties = TRUE; + if (!(pending && prop->is_pending)) + RRNoticePropertyChange(output, prop->propertyName, prop_value); + if (sendevent) { xRROutputPropertyNotifyEvent event = { .type = RREventBase + RRNotify, |