[PATCH 03/12] xf86Events: split xf86VTSwitch into xf86VTLeave and xf86VTEnter functions

Hans de Goede hdegoede at redhat.com
Wed Jan 15 06:32:17 PST 2014


Signed-off-by: Hans de Goede <hdegoede at redhat.com>
---
 hw/xfree86/common/xf86.h       |   2 +
 hw/xfree86/common/xf86Events.c | 273 +++++++++++++++++++++--------------------
 2 files changed, 145 insertions(+), 130 deletions(-)

diff --git a/hw/xfree86/common/xf86.h b/hw/xfree86/common/xf86.h
index 89025fe..537d1d1 100644
--- a/hw/xfree86/common/xf86.h
+++ b/hw/xfree86/common/xf86.h
@@ -234,6 +234,8 @@ extern _X_EXPORT Bool xf86EnableVTSwitch(Bool new);
 extern _X_EXPORT void xf86ProcessActionEvent(ActionEvent action, void *arg);
 extern _X_EXPORT void xf86PrintBacktrace(void);
 extern _X_EXPORT Bool xf86VTOwner(void);
+extern _X_EXPORT void xf86VTLeave(void);
+extern _X_EXPORT void xf86VTEnter(void);
 
 /* xf86Helper.c */
 
diff --git a/hw/xfree86/common/xf86Events.c b/hw/xfree86/common/xf86Events.c
index cae7873..e4ec177 100644
--- a/hw/xfree86/common/xf86Events.c
+++ b/hw/xfree86/common/xf86Events.c
@@ -407,155 +407,74 @@ xf86ReleaseKeys(DeviceIntPtr pDev)
     }
 }
 
-/*
- * xf86VTSwitch --
- *      Handle requests for switching the vt.
- */
-static void
-xf86VTSwitch(void)
+void
+xf86VTLeave(void)
 {
     int i;
     InputInfoPtr pInfo;
     IHPtr ih;
 
-    DebugF("xf86VTSwitch()\n");
-
-#ifdef XFreeXDGA
-    if (!DGAVTSwitch())
-        return;
+    DebugF("xf86VTSwitch: Leaving, xf86Exiting is %s\n",
+           BOOLTOSTRING((dispatchException & DE_TERMINATE) ? TRUE : FALSE));
+#ifdef DPMSExtension
+    if (DPMSPowerLevel != DPMSModeOn)
+        DPMSSet(serverClient, DPMSModeOn);
 #endif
+    for (i = 0; i < xf86NumScreens; i++) {
+        if (!(dispatchException & DE_TERMINATE))
+            if (xf86Screens[i]->EnableDisableFBAccess)
+                (*xf86Screens[i]->EnableDisableFBAccess) (xf86Screens[i], FALSE);
+    }
 
     /*
-     * Since all screens are currently all in the same state it is sufficient
-     * check the first.  This might change in future.
+     * Keep the order: Disable Device > LeaveVT
+     *                        EnterVT > EnableDevice
      */
-    if (xf86VTOwner()) {
-
-        DebugF("xf86VTSwitch: Leaving, xf86Exiting is %s\n",
-               BOOLTOSTRING((dispatchException & DE_TERMINATE) ? TRUE : FALSE));
-#ifdef DPMSExtension
-        if (DPMSPowerLevel != DPMSModeOn)
-            DPMSSet(serverClient, DPMSModeOn);
-#endif
-        for (i = 0; i < xf86NumScreens; i++) {
-            if (!(dispatchException & DE_TERMINATE))
-                if (xf86Screens[i]->EnableDisableFBAccess)
-                    (*xf86Screens[i]->EnableDisableFBAccess) (xf86Screens[i], FALSE);
-        }
-
-        /*
-         * Keep the order: Disable Device > LeaveVT
-         *                        EnterVT > EnableDevice
-         */
-        for (ih = InputHandlers; ih; ih = ih->next) {
-            if (ih->is_input)
-                xf86DisableInputHandler(ih);
-            else
-                xf86DisableGeneralHandler(ih);
-        }
-        for (pInfo = xf86InputDevs; pInfo; pInfo = pInfo->next) {
-            if (pInfo->dev) {
-                if (!pInfo->dev->enabled)
-                    pInfo->flags |= XI86_DEVICE_DISABLED;
-                xf86ReleaseKeys(pInfo->dev);
-                ProcessInputEvents();
-                DisableDevice(pInfo->dev, TRUE);
-            }
+    for (ih = InputHandlers; ih; ih = ih->next) {
+        if (ih->is_input)
+            xf86DisableInputHandler(ih);
+        else
+            xf86DisableGeneralHandler(ih);
+    }
+    for (pInfo = xf86InputDevs; pInfo; pInfo = pInfo->next) {
+        if (pInfo->dev) {
+            if (!pInfo->dev->enabled)
+                pInfo->flags |= XI86_DEVICE_DISABLED;
+            xf86ReleaseKeys(pInfo->dev);
+            ProcessInputEvents();
+            DisableDevice(pInfo->dev, TRUE);
         }
+    }
 
-        OsBlockSIGIO();
-        for (i = 0; i < xf86NumScreens; i++)
-            xf86Screens[i]->LeaveVT(xf86Screens[i]);
-        for (i = 0; i < xf86NumGPUScreens; i++)
-            xf86GPUScreens[i]->LeaveVT(xf86GPUScreens[i]);
-
-        xf86AccessLeave();      /* We need this here, otherwise */
-
-        if (!xf86VTSwitchAway()) {
-            /*
-             * switch failed
-             */
-
-            DebugF("xf86VTSwitch: Leave failed\n");
-            xf86AccessEnter();
-            for (i = 0; i < xf86NumScreens; i++) {
-                if (!xf86Screens[i]->EnterVT(xf86Screens[i]))
-                    FatalError("EnterVT failed for screen %d\n", i);
-            }
-            for (i = 0; i < xf86NumGPUScreens; i++) {
-                if (!xf86GPUScreens[i]->EnterVT(xf86GPUScreens[i]))
-                    FatalError("EnterVT failed for gpu screen %d\n", i);
-            }
-            if (!(dispatchException & DE_TERMINATE)) {
-                for (i = 0; i < xf86NumScreens; i++) {
-                    if (xf86Screens[i]->EnableDisableFBAccess)
-                        (*xf86Screens[i]->EnableDisableFBAccess) (xf86Screens[i], TRUE);
-                }
-            }
-            dixSaveScreens(serverClient, SCREEN_SAVER_FORCER, ScreenSaverReset);
-
-            pInfo = xf86InputDevs;
-            while (pInfo) {
-                if (pInfo->dev && (pInfo->flags & XI86_DEVICE_DISABLED) == 0)
-                    EnableDevice(pInfo->dev, TRUE);
-                pInfo->flags &= ~XI86_DEVICE_DISABLED;
-                pInfo = pInfo->next;
-            }
-            for (ih = InputHandlers; ih; ih = ih->next) {
-                if (ih->is_input)
-                    xf86EnableInputHandler(ih);
-                else
-                    xf86EnableGeneralHandler(ih);
-            }
-            OsReleaseSIGIO();
-
-        }
-        else {
-#ifdef XF86PM
-            if (xf86OSPMClose)
-                xf86OSPMClose();
-            xf86OSPMClose = NULL;
-#endif
+    OsBlockSIGIO();
+    for (i = 0; i < xf86NumScreens; i++)
+        xf86Screens[i]->LeaveVT(xf86Screens[i]);
+    for (i = 0; i < xf86NumGPUScreens; i++)
+        xf86GPUScreens[i]->LeaveVT(xf86GPUScreens[i]);
 
-            for (i = 0; i < xf86NumScreens; i++) {
-                /*
-                 * zero all access functions to
-                 * trap calls when switched away.
-                 */
-                xf86Screens[i]->vtSema = FALSE;
-            }
-            if (xorgHWAccess)
-                xf86DisableIO();
-        }
-    }
-    else {
-        DebugF("xf86VTSwitch: Entering\n");
-        if (!xf86VTSwitchTo())
-            return;
+    xf86AccessLeave();      /* We need this here, otherwise */
 
-#ifdef XF86PM
-        xf86OSPMClose = xf86OSPMOpen();
-#endif
+    if (!xf86VTSwitchAway()) {
+        /*
+         * switch failed
+         */
 
-        if (xorgHWAccess)
-            xf86EnableIO();
+        DebugF("xf86VTSwitch: Leave failed\n");
         xf86AccessEnter();
         for (i = 0; i < xf86NumScreens; i++) {
-            xf86Screens[i]->vtSema = TRUE;
             if (!xf86Screens[i]->EnterVT(xf86Screens[i]))
                 FatalError("EnterVT failed for screen %d\n", i);
         }
         for (i = 0; i < xf86NumGPUScreens; i++) {
-            xf86GPUScreens[i]->vtSema = TRUE;
             if (!xf86GPUScreens[i]->EnterVT(xf86GPUScreens[i]))
                 FatalError("EnterVT failed for gpu screen %d\n", i);
         }
-        for (i = 0; i < xf86NumScreens; i++) {
-            if (xf86Screens[i]->EnableDisableFBAccess)
-                (*xf86Screens[i]->EnableDisableFBAccess) (xf86Screens[i], TRUE);
+        if (!(dispatchException & DE_TERMINATE)) {
+            for (i = 0; i < xf86NumScreens; i++) {
+                if (xf86Screens[i]->EnableDisableFBAccess)
+                    (*xf86Screens[i]->EnableDisableFBAccess) (xf86Screens[i], TRUE);
+            }
         }
-
-        /* Turn screen saver off when switching back */
         dixSaveScreens(serverClient, SCREEN_SAVER_FORCER, ScreenSaverReset);
 
         pInfo = xf86InputDevs;
@@ -565,20 +484,114 @@ xf86VTSwitch(void)
             pInfo->flags &= ~XI86_DEVICE_DISABLED;
             pInfo = pInfo->next;
         }
-
         for (ih = InputHandlers; ih; ih = ih->next) {
             if (ih->is_input)
                 xf86EnableInputHandler(ih);
             else
                 xf86EnableGeneralHandler(ih);
         }
-#ifdef XSERVER_PLATFORM_BUS
-        /* check for any new output devices */
-        xf86platformVTProbe();
+        OsReleaseSIGIO();
+
+    }
+    else {
+#ifdef XF86PM
+        if (xf86OSPMClose)
+            xf86OSPMClose();
+        xf86OSPMClose = NULL;
 #endif
 
-        OsReleaseSIGIO();
+        for (i = 0; i < xf86NumScreens; i++) {
+            /*
+             * zero all access functions to
+             * trap calls when switched away.
+             */
+            xf86Screens[i]->vtSema = FALSE;
+        }
+        if (xorgHWAccess)
+            xf86DisableIO();
+    }
+}
+
+void
+xf86VTEnter(void)
+{
+    int i;
+    InputInfoPtr pInfo;
+    IHPtr ih;
+
+    DebugF("xf86VTSwitch: Entering\n");
+    if (!xf86VTSwitchTo())
+        return;
+
+#ifdef XF86PM
+    xf86OSPMClose = xf86OSPMOpen();
+#endif
+
+    if (xorgHWAccess)
+        xf86EnableIO();
+    xf86AccessEnter();
+    for (i = 0; i < xf86NumScreens; i++) {
+        xf86Screens[i]->vtSema = TRUE;
+        if (!xf86Screens[i]->EnterVT(xf86Screens[i]))
+            FatalError("EnterVT failed for screen %d\n", i);
+    }
+    for (i = 0; i < xf86NumGPUScreens; i++) {
+        xf86GPUScreens[i]->vtSema = TRUE;
+        if (!xf86GPUScreens[i]->EnterVT(xf86GPUScreens[i]))
+            FatalError("EnterVT failed for gpu screen %d\n", i);
+    }
+    for (i = 0; i < xf86NumScreens; i++) {
+        if (xf86Screens[i]->EnableDisableFBAccess)
+            (*xf86Screens[i]->EnableDisableFBAccess) (xf86Screens[i], TRUE);
+    }
+
+    /* Turn screen saver off when switching back */
+    dixSaveScreens(serverClient, SCREEN_SAVER_FORCER, ScreenSaverReset);
+
+    pInfo = xf86InputDevs;
+    while (pInfo) {
+        if (pInfo->dev && (pInfo->flags & XI86_DEVICE_DISABLED) == 0)
+            EnableDevice(pInfo->dev, TRUE);
+        pInfo->flags &= ~XI86_DEVICE_DISABLED;
+        pInfo = pInfo->next;
+    }
+
+    for (ih = InputHandlers; ih; ih = ih->next) {
+        if (ih->is_input)
+            xf86EnableInputHandler(ih);
+        else
+            xf86EnableGeneralHandler(ih);
     }
+#ifdef XSERVER_PLATFORM_BUS
+    /* check for any new output devices */
+    xf86platformVTProbe();
+#endif
+
+    OsReleaseSIGIO();
+}
+
+/*
+ * xf86VTSwitch --
+ *      Handle requests for switching the vt.
+ */
+static void
+xf86VTSwitch(void)
+{
+    DebugF("xf86VTSwitch()\n");
+
+#ifdef XFreeXDGA
+    if (!DGAVTSwitch())
+        return;
+#endif
+
+    /*
+     * Since all screens are currently all in the same state it is sufficient
+     * check the first.  This might change in future.
+     */
+    if (xf86VTOwner())
+        xf86VTLeave();
+    else
+        xf86VTEnter();
 }
 
 /* Input handler registration */
-- 
1.8.4.2



More information about the xorg-devel mailing list