[PATCH 03/12] xf86Events: split xf86VTSwitch into xf86VTLeave and xf86VTEnter functions
Peter Hutterer
peter.hutterer at who-t.net
Mon Jan 27 22:33:38 PST 2014
On Wed, Jan 15, 2014 at 03:32:17PM +0100, Hans de Goede wrote:
> Signed-off-by: Hans de Goede <hdegoede at redhat.com>
Reviewed-by: Peter Hutterer <peter.hutterer at who-t.net>
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
>
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel
>
More information about the xorg-devel
mailing list