Solaris: Avoid switching to inactive VT's
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: Aaron Zang <Aaron.Zang@Sun.COM> Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
This commit is contained in:
parent
d9c20ee419
commit
15ca3312c0
|
@ -202,8 +202,16 @@ xf86ProcessActionEvent(ActionEvent action, void *arg)
|
||||||
vtno--;
|
vtno--;
|
||||||
#endif
|
#endif
|
||||||
#if defined(sun)
|
#if defined(sun)
|
||||||
if (vtno == xf86Info.vtno)
|
if (vtno == xf86Info.vtno) {
|
||||||
break;
|
break;
|
||||||
|
} else {
|
||||||
|
struct vt_stat state;
|
||||||
|
if (ioctl(xf86Info.consoleFd, VT_GETSTATE, &state) < 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if ((state.v_state & (1 << vtno)) == 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
xf86Info.vtRequestsPending = TRUE;
|
xf86Info.vtRequestsPending = TRUE;
|
||||||
xf86Info.vtPendingNum = vtno;
|
xf86Info.vtPendingNum = vtno;
|
||||||
|
|
|
@ -38,17 +38,27 @@
|
||||||
* Handle the VT-switching interface for Solaris/OpenSolaris
|
* Handle the VT-switching interface for Solaris/OpenSolaris
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
static int xf86VTPruneDoor = 0;
|
||||||
|
|
||||||
void
|
void
|
||||||
xf86VTRequest(int sig)
|
xf86VTRelease(int sig)
|
||||||
{
|
{
|
||||||
if (xf86Info.vtPendingNum != -1)
|
if (xf86Info.vtPendingNum == -1)
|
||||||
{
|
{
|
||||||
|
xf86VTPruneDoor = 1;
|
||||||
|
xf86Info.vtRequestsPending = TRUE;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
ioctl(xf86Info.consoleFd, VT_RELDISP, 1);
|
ioctl(xf86Info.consoleFd, VT_RELDISP, 1);
|
||||||
xf86Info.vtPendingNum = -1;
|
xf86Info.vtPendingNum = -1;
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
xf86VTAcquire(int sig)
|
||||||
|
{
|
||||||
xf86Info.vtRequestsPending = TRUE;
|
xf86Info.vtRequestsPending = TRUE;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -68,6 +78,12 @@ xf86VTSwitchAway(void)
|
||||||
|
|
||||||
xf86Info.vtRequestsPending = FALSE;
|
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_ev = VT_EV_HOTKEYS;
|
||||||
vt_door_arg.vt_num = xf86Info.vtPendingNum;
|
vt_door_arg.vt_num = xf86Info.vtPendingNum;
|
||||||
door_arg.data_ptr = (char *)&vt_door_arg;
|
door_arg.data_ptr = (char *)&vt_door_arg;
|
||||||
|
|
|
@ -39,6 +39,8 @@ static Bool Protect0 = FALSE;
|
||||||
static int VTnum = -1;
|
static int VTnum = -1;
|
||||||
static int xf86StartVT = -1;
|
static int xf86StartVT = -1;
|
||||||
static int vtEnabled = 0;
|
static int vtEnabled = 0;
|
||||||
|
extern void xf86VTAcquire(int);
|
||||||
|
extern void xf86VTRelease(int);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Device to open as xf86Info.consoleFd */
|
/* Device to open as xf86Info.consoleFd */
|
||||||
|
@ -137,7 +139,8 @@ xf86OpenConsole(void)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if ((ioctl(fd, VT_OPENQRY, &xf86Info.vtno) < 0) ||
|
if ((ioctl(fd, VT_OPENQRY, &xf86Info.vtno) < 0) ||
|
||||||
(xf86Info.vtno == -1)) {
|
(xf86Info.vtno == -1))
|
||||||
|
{
|
||||||
FatalError("xf86OpenConsole: Cannot find a free VT\n");
|
FatalError("xf86OpenConsole: Cannot find a free VT\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -146,7 +149,8 @@ xf86OpenConsole(void)
|
||||||
snprintf(consoleDev, PATH_MAX, "/dev/vt/%d", xf86Info.vtno);
|
snprintf(consoleDev, PATH_MAX, "/dev/vt/%d", xf86Info.vtno);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fd != -1) {
|
if (fd != -1)
|
||||||
|
{
|
||||||
close(fd);
|
close(fd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -178,11 +182,12 @@ xf86OpenConsole(void)
|
||||||
if (ioctl(xf86Info.consoleFd, VT_GETMODE, &VT) < 0)
|
if (ioctl(xf86Info.consoleFd, VT_GETMODE, &VT) < 0)
|
||||||
FatalError("xf86OpenConsole: VT_GETMODE failed\n");
|
FatalError("xf86OpenConsole: VT_GETMODE failed\n");
|
||||||
|
|
||||||
OsSignal(SIGUSR1, xf86VTRequest);
|
OsSignal(SIGUSR1, xf86VTAcquire);
|
||||||
|
OsSignal(SIGUSR2, xf86VTRelease);
|
||||||
|
|
||||||
VT.mode = VT_PROCESS;
|
VT.mode = VT_PROCESS;
|
||||||
VT.relsig = SIGUSR1;
|
|
||||||
VT.acqsig = SIGUSR1;
|
VT.acqsig = SIGUSR1;
|
||||||
|
VT.relsig = SIGUSR2;
|
||||||
|
|
||||||
if (ioctl(xf86Info.consoleFd, VT_SETMODE, &VT) < 0)
|
if (ioctl(xf86Info.consoleFd, VT_SETMODE, &VT) < 0)
|
||||||
FatalError("xf86OpenConsole: VT_SETMODE VT_PROCESS failed\n");
|
FatalError("xf86OpenConsole: VT_SETMODE VT_PROCESS failed\n");
|
||||||
|
@ -204,7 +209,8 @@ xf86OpenConsole(void)
|
||||||
else /* serverGeneration != 1 */
|
else /* serverGeneration != 1 */
|
||||||
{
|
{
|
||||||
#ifdef HAS_USL_VTS
|
#ifdef HAS_USL_VTS
|
||||||
if (vtEnabled) {
|
if (vtEnabled)
|
||||||
|
{
|
||||||
/*
|
/*
|
||||||
* Now re-get the VT
|
* Now re-get the VT
|
||||||
*/
|
*/
|
||||||
|
@ -285,7 +291,8 @@ xf86CloseConsole(void)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HAS_USL_VTS
|
#ifdef HAS_USL_VTS
|
||||||
if (vtEnabled == 1) {
|
if (vtEnabled)
|
||||||
|
{
|
||||||
if (ioctl(xf86Info.consoleFd, VT_GETMODE, &VT) != -1)
|
if (ioctl(xf86Info.consoleFd, VT_GETMODE, &VT) != -1)
|
||||||
{
|
{
|
||||||
VT.mode = VT_AUTO; /* Set default vt handling */
|
VT.mode = VT_AUTO; /* Set default vt handling */
|
||||||
|
|
Loading…
Reference in New Issue
Block a user