[PATCH] Solaris: Avoid switching to inactive VT's
Tiago Vignatti
tiago.vignatti at nokia.com
Tue Dec 15 06:31:14 PST 2009
On Tue, Dec 15, 2009 at 04:26:43AM +0100, ext Alan Coopersmith wrote:
> From: Aaron Zang <Aaron.Zang at Sun.COM>
>
> 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 <alan.coopersmith at sun.com>
> ---
> 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
> xorg-devel at lists.x.org
> http://lists.x.org/mailman/listinfo/xorg-devel
Tiago
More information about the xorg-devel
mailing list