[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