On Tue, Dec 15, 2009 at 04:26:43AM +0100, ext Alan Coopersmith wrote:
> From: Aaron Zang <[email protected]>
> 
> Fix for OpenSolaris bug 6876992: "[vconsole] Ctrl+Alt+F12 switchs to blank
> console screen with hotkeys property turned-off"
> http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6876992
> 
> Xorg needs to do sanity test for the VT it is commanded to switch to.
> If the VT is not opened by any process, discard the switching request.
> 
> The changes also contain the fix for some flaws discovered when
> getting the new gdm to run.
> 
> Signed-off-by: Alan Coopersmith <[email protected]>
> ---
>  hw/xfree86/common/xf86Events.c           |   10 +++++++++-
>  hw/xfree86/os-support/solaris/sun_VTsw.c |   24 ++++++++++++++++++++----
>  hw/xfree86/os-support/solaris/sun_init.c |   19 +++++++++++++------
>  3 files changed, 42 insertions(+), 11 deletions(-)
> 
> diff --git a/hw/xfree86/common/xf86Events.c b/hw/xfree86/common/xf86Events.c
> index 8cd765a..8e6a15b 100644
> --- a/hw/xfree86/common/xf86Events.c
> +++ b/hw/xfree86/common/xf86Events.c
> @@ -202,8 +202,16 @@ xf86ProcessActionEvent(ActionEvent action, void *arg)
>           vtno--;
>  #endif
>  #if defined(sun)
> -         if (vtno == xf86Info.vtno)
> +         if (vtno == xf86Info.vtno) {
>               break;
> +         } else {
> +             struct vt_stat state;
> +             if (ioctl(xf86Info.consoleFd, VT_GETSTATE, &state) < 0)
> +                     break;
> +
> +             if ((state.v_state & (1 << vtno)) == 0)
> +                     break;
> +         }

bonus points if we could hide this OS code on os-support directories instead.


  
>           xf86Info.vtRequestsPending = TRUE;
>           xf86Info.vtPendingNum = vtno;
> diff --git a/hw/xfree86/os-support/solaris/sun_VTsw.c 
> b/hw/xfree86/os-support/solaris/sun_VTsw.c
> index 0dc76b8..517d6d9 100644
> --- a/hw/xfree86/os-support/solaris/sun_VTsw.c
> +++ b/hw/xfree86/os-support/solaris/sun_VTsw.c
> @@ -44,17 +44,27 @@
>   * Handle the VT-switching interface for Solaris/OpenSolaris
>   */
>  
> +static int xf86VTPruneDoor = 0;
> +
>  void
> -xf86VTRequest(int sig)
> +xf86VTRelease(int sig)
>  {
>       if (xf86Info.vtPendingNum != -1)
>       {
> -             ioctl(xf86Info.consoleFd, VT_RELDISP, 1);
> -             xf86Info.vtPendingNum = -1;
> -
> +             xf86VTPruneDoor = 1;
> +             xf86Info.vtRequestsPending = TRUE;
>               return;
>       }
>  
> +     ioctl(xf86Info.consoleFd, VT_RELDISP, 1);
> +     xf86Info.vtPendingNum = -1;
> +
> +     return;
> +}
> +
> +void
> +xf86VTAcquire(int sig)
> +{
>       xf86Info.vtRequestsPending = TRUE;
>       return;
>  }
> @@ -74,6 +84,12 @@ xf86VTSwitchAway(void)
>  
>       xf86Info.vtRequestsPending = FALSE;
>  
> +     if (xf86VTPruneDoor) {
> +             xf86VTPruneDoor = 0;
> +             ioctl(xf86Info.consoleFd, VT_RELDISP, 1);
> +             return (TRUE);
> +     }
> +
>       vt_door_arg.vt_ev = VT_EV_HOTKEYS;
>       vt_door_arg.vt_num = xf86Info.vtPendingNum;
>       door_arg.data_ptr = (char *)&vt_door_arg;
> diff --git a/hw/xfree86/os-support/solaris/sun_init.c 
> b/hw/xfree86/os-support/solaris/sun_init.c
> index 2c569f0..5846866 100644
> --- a/hw/xfree86/os-support/solaris/sun_init.c
> +++ b/hw/xfree86/os-support/solaris/sun_init.c
> @@ -39,6 +39,8 @@ static Bool Protect0 = FALSE;
>  static int VTnum = -1;
>  static int xf86StartVT = -1;
>  static int vtEnabled = 0;
> +extern void xf86VTAcquire(int);
> +extern void xf86VTRelease(int);
>  #endif
>  
>  /* Device to open as xf86Info.consoleFd */
> @@ -137,7 +139,8 @@ xf86OpenConsole(void)
>           else
>           {
>               if ((ioctl(fd, VT_OPENQRY, &xf86Info.vtno) < 0) ||
> -                 (xf86Info.vtno == -1)) {
> +                 (xf86Info.vtno == -1))
> +             {
>                   FatalError("xf86OpenConsole: Cannot find a free VT\n");
>               }
>           }
> @@ -146,7 +149,8 @@ xf86OpenConsole(void)
>           snprintf(consoleDev, PATH_MAX, "/dev/vt/%d", xf86Info.vtno);
>       }
>  
> -     if (fd != -1) {
> +     if (fd != -1)
> +     {
>           close(fd);
>       }
>  
> @@ -178,11 +182,12 @@ xf86OpenConsole(void)
>           if (ioctl(xf86Info.consoleFd, VT_GETMODE, &VT) < 0)
>               FatalError("xf86OpenConsole: VT_GETMODE failed\n");
>  
> -         OsSignal(SIGUSR1, xf86VTRequest);
> +         OsSignal(SIGUSR1, xf86VTAcquire);
> +         OsSignal(SIGUSR2, xf86VTRelease);
>  
>           VT.mode = VT_PROCESS;
> -         VT.relsig = SIGUSR1;
>           VT.acqsig = SIGUSR1;
> +         VT.relsig = SIGUSR2;
>  
>           if (ioctl(xf86Info.consoleFd, VT_SETMODE, &VT) < 0)
>               FatalError("xf86OpenConsole: VT_SETMODE VT_PROCESS failed\n");
> @@ -204,7 +209,8 @@ xf86OpenConsole(void)
>      else /* serverGeneration != 1 */
>      {
>  #ifdef HAS_USL_VTS
> -     if (vtEnabled) {
> +     if (vtEnabled)
> +     {
>           /*
>            * Now re-get the VT
>            */
> @@ -285,7 +291,8 @@ xf86CloseConsole(void)
>  #endif
>  
>  #ifdef HAS_USL_VTS
> -    if (vtEnabled == 1) {
> +    if (vtEnabled)
> +    {
>       if (ioctl(xf86Info.consoleFd, VT_GETMODE, &VT) != -1)
>       {
>           VT.mode = VT_AUTO;          /* Set default vt handling */
> -- 
> 1.5.6.5
> 
> _______________________________________________
> xorg-devel mailing list
> [email protected]
> http://lists.x.org/mailman/listinfo/xorg-devel
            Tiago
_______________________________________________
xorg-devel mailing list
[email protected]
http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to