aboutsummaryrefslogtreecommitdiff
path: root/xorg-server/hw/xfree86/common/xf86Events.c
diff options
context:
space:
mode:
Diffstat (limited to 'xorg-server/hw/xfree86/common/xf86Events.c')
-rw-r--r--xorg-server/hw/xfree86/common/xf86Events.c299
1 files changed, 157 insertions, 142 deletions
diff --git a/xorg-server/hw/xfree86/common/xf86Events.c b/xorg-server/hw/xfree86/common/xf86Events.c
index cae78732c..7b53949fa 100644
--- a/xorg-server/hw/xfree86/common/xf86Events.c
+++ b/xorg-server/hw/xfree86/common/xf86Events.c
@@ -407,178 +407,193 @@ xf86ReleaseKeys(DeviceIntPtr pDev)
}
}
-/*
- * xf86VTSwitch --
- * Handle requests for switching the vt.
- */
-static void
-xf86VTSwitch(void)
+void
+xf86DisableInputDeviceForVTSwitch(InputInfoPtr pInfo)
+{
+ if (!pInfo->dev)
+ return;
+
+ if (!pInfo->dev->enabled)
+ pInfo->flags |= XI86_DEVICE_DISABLED;
+
+ xf86ReleaseKeys(pInfo->dev);
+ ProcessInputEvents();
+ DisableDevice(pInfo->dev, TRUE);
+}
+
+void
+xf86EnableInputDeviceForVTSwitch(InputInfoPtr pInfo)
+{
+ if (pInfo->dev && (pInfo->flags & XI86_DEVICE_DISABLED) == 0)
+ EnableDevice(pInfo->dev, TRUE);
+ pInfo->flags &= ~XI86_DEVICE_DISABLED;
+}
+
+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()) {
+ for (ih = InputHandlers; ih; ih = ih->next) {
+ if (ih->is_input)
+ xf86DisableInputHandler(ih);
+ else
+ xf86DisableGeneralHandler(ih);
+ }
+ for (pInfo = xf86InputDevs; pInfo; pInfo = pInfo->next)
+ xf86DisableInputDeviceForVTSwitch(pInfo);
- DebugF("xf86VTSwitch: Leaving, xf86Exiting is %s\n",
- BOOLTOSTRING((dispatchException & DE_TERMINATE) ? TRUE : FALSE));
-#ifdef DPMSExtension
- if (DPMSPowerLevel != DPMSModeOn)
- DPMSSet(serverClient, DPMSModeOn);
+ 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())
+ goto switch_failed;
+
+#ifdef XF86PM
+ if (xf86OSPMClose)
+ xf86OSPMClose();
+ xf86OSPMClose = NULL;
#endif
- for (i = 0; i < xf86NumScreens; i++) {
- if (!(dispatchException & DE_TERMINATE))
- if (xf86Screens[i]->EnableDisableFBAccess)
- (*xf86Screens[i]->EnableDisableFBAccess) (xf86Screens[i], FALSE);
- }
+ for (i = 0; i < xf86NumScreens; i++) {
/*
- * Keep the order: Disable Device > LeaveVT
- * EnterVT > EnableDevice
+ * zero all access functions to
+ * trap calls when switched away.
*/
- 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]);
+ xf86Screens[i]->vtSema = FALSE;
+ }
+ if (xorgHWAccess)
+ xf86DisableIO();
- xf86AccessLeave(); /* We need this here, otherwise */
+ return;
- if (!xf86VTSwitchAway()) {
- /*
- * switch failed
- */
+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);
+
+ for (pInfo = xf86InputDevs; pInfo; pInfo = pInfo->next)
+ xf86EnableInputDeviceForVTSwitch(pInfo);
+ for (ih = InputHandlers; ih; ih = ih->next) {
+ if (ih->is_input)
+ xf86EnableInputHandler(ih);
+ else
+ xf86EnableGeneralHandler(ih);
+ }
+ OsReleaseSIGIO();
+}
- 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);
+void
+xf86VTEnter(void)
+{
+ int i;
+ InputInfoPtr pInfo;
+ IHPtr ih;
- 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();
+ DebugF("xf86VTSwitch: Entering\n");
+ if (!xf86VTSwitchTo())
+ return;
- }
- else {
#ifdef XF86PM
- if (xf86OSPMClose)
- xf86OSPMClose();
- xf86OSPMClose = NULL;
+ xf86OSPMClose = xf86OSPMOpen();
#endif
- for (i = 0; i < xf86NumScreens; i++) {
- /*
- * zero all access functions to
- * trap calls when switched away.
- */
- xf86Screens[i]->vtSema = FALSE;
- }
- if (xorgHWAccess)
- xf86DisableIO();
- }
+ 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);
}
- else {
- DebugF("xf86VTSwitch: Entering\n");
- if (!xf86VTSwitchTo())
- return;
-#ifdef XF86PM
- xf86OSPMClose = xf86OSPMOpen();
-#endif
+ /* Turn screen saver off when switching back */
+ dixSaveScreens(serverClient, SCREEN_SAVER_FORCER, ScreenSaverReset);
- 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);
- }
+ for (pInfo = xf86InputDevs; pInfo; pInfo = pInfo->next)
+ xf86EnableInputDeviceForVTSwitch(pInfo);
+ 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
- /* Turn screen saver off when switching back */
- dixSaveScreens(serverClient, SCREEN_SAVER_FORCER, ScreenSaverReset);
+ OsReleaseSIGIO();
+}
- 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;
- }
+/*
+ * xf86VTSwitch --
+ * Handle requests for switching the vt.
+ */
+static void
+xf86VTSwitch(void)
+{
+ DebugF("xf86VTSwitch()\n");
- 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();
+#ifdef XFreeXDGA
+ if (!DGAVTSwitch())
+ return;
#endif
- OsReleaseSIGIO();
- }
+ /*
+ * 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 */