On Wed, Jan 15, 2014 at 03:32:17PM +0100, Hans de Goede wrote: > Signed-off-by: Hans de Goede <[email protected]>
Reviewed-by: Peter Hutterer <[email protected]> Cheers, Peter > --- > 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 > > _______________________________________________ > [email protected]: X.Org development > Archives: http://lists.x.org/archives/xorg-devel > Info: http://lists.x.org/mailman/listinfo/xorg-devel > _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
