[PATCH xserver 1/3] xfree86: Clean up DPMS support

Adam Jackson ajax at redhat.com
Fri Mar 24 16:30:56 UTC 2017


Rather than setting up a per-screen private, just conditionally
initialize ScrnInfoRec::DPMSSet based on the config options, and inspect
that to determine whether DPMS is supported.

We also move the "turn the screen back on at CloseScreen" logic into the
DPMS extension's (new) reset hook. This would be a behavior change for
the non-xfree86 servers, if any of them had non-stub DPMS support.

Signed-off-by: Adam Jackson <ajax at redhat.com>
---
 Xext/dpms.c                     |  8 +++-
 hw/xfree86/common/xf86DPMS.c    | 84 +++++------------------------------------
 hw/xfree86/common/xf86Privstr.h |  9 -----
 3 files changed, 16 insertions(+), 85 deletions(-)

diff --git a/Xext/dpms.c b/Xext/dpms.c
index 4b620d5..291dad0 100644
--- a/Xext/dpms.c
+++ b/Xext/dpms.c
@@ -354,10 +354,16 @@ SProcDPMSDispatch(ClientPtr client)
     }
 }
 
+static void
+DPMSCloseDownExtension(ExtensionEntry *e)
+{
+    DPMSSet(serverClient, DPMSModeOn);
+}
+
 void
 DPMSExtensionInit(void)
 {
     AddExtension(DPMSExtensionName, 0, 0,
                  ProcDPMSDispatch, SProcDPMSDispatch,
-                 NULL, StandardMinorOpcode);
+                 DPMSCloseDownExtension, StandardMinorOpcode);
 }
diff --git a/hw/xfree86/common/xf86DPMS.c b/hw/xfree86/common/xf86DPMS.c
index 2b5a3ed..a5324e0 100644
--- a/hw/xfree86/common/xf86DPMS.c
+++ b/hw/xfree86/common/xf86DPMS.c
@@ -47,50 +47,29 @@
 #include "xf86VGAarbiter.h"
 #endif
 
-#ifdef DPMSExtension
-static DevPrivateKeyRec DPMSKeyRec;
-static DevPrivateKey DPMSKey;
-static Bool DPMSClose(ScreenPtr pScreen);
-static int DPMSCount = 0;
-#endif
-
 Bool
 xf86DPMSInit(ScreenPtr pScreen, DPMSSetProcPtr set, int flags)
 {
 #ifdef DPMSExtension
     ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
-    DPMSPtr pDPMS;
     void *DPMSOpt;
-    MessageType enabled_from;
+    MessageType enabled_from = X_DEFAULT;
+    Bool enabled = TRUE;
 
-    DPMSKey = &DPMSKeyRec;
-
-    if (!dixRegisterPrivateKey(&DPMSKeyRec, PRIVATE_SCREEN, sizeof(DPMSRec)))
-        return FALSE;
-
-    pDPMS = dixLookupPrivate(&pScreen->devPrivates, DPMSKey);
-    pScrn->DPMSSet = set;
-    pDPMS->Flags = flags;
     DPMSOpt = xf86FindOption(pScrn->options, "dpms");
     if (DPMSDisabledSwitch) {
         enabled_from = X_CMDLINE;
-        DPMSEnabled = FALSE;
+        enabled = FALSE;
     }
     else if (DPMSOpt) {
         enabled_from = X_CONFIG;
-        DPMSEnabled = xf86CheckBoolOption(pScrn->options, "dpms", FALSE);
+        enabled = xf86CheckBoolOption(pScrn->options, "dpms", FALSE);
         xf86MarkOptionUsed(DPMSOpt);
     }
-    else {
-        enabled_from = X_DEFAULT;
-        DPMSEnabled = TRUE;
-    }
-    if (DPMSEnabled)
+    if (enabled) {
         xf86DrvMsg(pScreen->myNum, enabled_from, "DPMS enabled\n");
-    pDPMS->Enabled = DPMSEnabled;
-    pDPMS->CloseScreen = pScreen->CloseScreen;
-    pScreen->CloseScreen = DPMSClose;
-    DPMSCount++;
+        pScrn->DPMSSet = set;
+    }
     return TRUE;
 #else
     return FALSE;
@@ -99,45 +78,10 @@ xf86DPMSInit(ScreenPtr pScreen, DPMSSetProcPtr set, int flags)
 
 #ifdef DPMSExtension
 
-static Bool
-DPMSClose(ScreenPtr pScreen)
-{
-    DPMSPtr pDPMS;
-    ScrnInfoPtr pScrn;
-    /* This shouldn't happen */
-    if (DPMSKey == NULL)
-        return FALSE;
-
-    pDPMS = dixLookupPrivate(&pScreen->devPrivates, DPMSKey);
-
-    /* This shouldn't happen */
-    if (!pDPMS)
-        return FALSE;
-
-    pScreen->CloseScreen = pDPMS->CloseScreen;
-    pScrn = xf86ScreenToScrn(pScreen);
-    /*
-     * Turn on DPMS when shutting down. If this function can be used
-     * depends on the order the driver wraps things. If this is called
-     * after the driver has shut down everything the driver will have
-     * to deal with this internally.
-     */
-    if (pScrn->vtSema && pScrn->DPMSSet) {
-        pScrn->DPMSSet(pScrn, DPMSModeOn, 0);
-    }
-
-    if (--DPMSCount == 0)
-        DPMSKey = NULL;
-    return pScreen->CloseScreen(pScreen);
-}
-
 static void
 DPMSSetScreen(ScrnInfoPtr pScrn, int level)
 {
-    ScreenPtr pScreen = xf86ScrnToScreen(pScrn);
-    DPMSPtr pDPMS = dixLookupPrivate(&pScreen->devPrivates, DPMSKey);
-
-    if (pDPMS && pScrn->DPMSSet && pDPMS->Enabled && pScrn->vtSema) {
+    if (pScrn->DPMSSet && pScrn->vtSema) {
         xf86VGAarbiterLock(pScrn);
         pScrn->DPMSSet(pScrn, level, 0);
         xf86VGAarbiterUnlock(pScrn);
@@ -156,9 +100,6 @@ DPMSSet(ClientPtr client, int level)
 
     DPMSPowerLevel = level;
 
-    if (DPMSKey == NULL)
-        return Success;
-
     if (level != DPMSModeOn) {
         if (xf86IsUnblank(screenIsSaved)) {
             rc = dixSaveScreens(client, SCREEN_SAVER_FORCER, ScreenSaverActive);
@@ -184,10 +125,7 @@ DPMSSet(ClientPtr client, int level)
 static Bool
 DPMSSupportedOnScreen(ScrnInfoPtr pScrn)
 {
-    ScreenPtr pScreen = xf86ScrnToScreen(pScrn);
-    DPMSPtr pDPMS = dixLookupPrivate(&pScreen->devPrivates, DPMSKey);
-
-    return pDPMS && pScrn->DPMSSet;
+    return pScrn->DPMSSet != NULL;
 }
 
 /*
@@ -199,10 +137,6 @@ DPMSSupported(void)
 {
     int i;
 
-    if (DPMSKey == NULL) {
-        return FALSE;
-    }
-
     /* For each screen, check if DPMS is supported */
     for (i = 0; i < xf86NumScreens; i++) {
         if (DPMSSupportedOnScreen(xf86Screens[i]))
diff --git a/hw/xfree86/common/xf86Privstr.h b/hw/xfree86/common/xf86Privstr.h
index bb8f3ab..e4b479f 100644
--- a/hw/xfree86/common/xf86Privstr.h
+++ b/hw/xfree86/common/xf86Privstr.h
@@ -102,15 +102,6 @@ typedef struct {
     Bool autoAddGPU;
 } xf86InfoRec, *xf86InfoPtr;
 
-#ifdef DPMSExtension
-/* Private info for DPMS */
-typedef struct {
-    CloseScreenProcPtr CloseScreen;
-    Bool Enabled;
-    int Flags;
-} DPMSRec, *DPMSPtr;
-#endif
-
 /* ISC's cc can't handle ~ of UL constants, so explicitly type cast them. */
 #define XLED1   ((unsigned long) 0x00000001)
 #define XLED2   ((unsigned long) 0x00000002)
-- 
2.9.3



More information about the xorg-devel mailing list