Save keyboard LED state on startup and restore on exit so text console mode

LEDs match text console mode state. Move push of streams module earlier
    so it's loaded before we start using kbd ioctls provided by the streams
    module.
This commit is contained in:
Alan Coopersmith 2005-08-30 22:34:14 +00:00
parent fa6fbd018d
commit 9d3b5e89d6
2 changed files with 30 additions and 24 deletions

View File

@ -102,7 +102,7 @@ sunKbdOpen(const char *devName, pointer options)
if (kbdFD == -1) {
xf86Msg(X_ERROR, "%s: cannot open \"%s\"\n", devName, kbdPath);
} else {
xf86Msg(X_INFO, "%s: Opened device \"%s\"\n", devName , kbdPath);
xf86MsgVerb(X_INFO, 3, "%s: Opened device \"%s\"\n", devName, kbdPath);
}
if ((kbdPath != NULL) && (kbdPath != defaultKbd)) {
@ -127,6 +127,28 @@ sunKbdInit(sunKbdPrivPtr priv, int kbdFD, const char *devName, pointer options)
priv->devName = devName;
priv->otranslation = -1;
priv->odirect = -1;
if (options != NULL) {
priv->strmod = xf86SetStrOption(options, "StreamsModule", NULL);
priv->audioDevName = xf86SetStrOption(options, "BellDevice", NULL);
if (priv->audioDevName && (priv->audioDevName[0] == '\0')) {
xfree(priv->audioDevName);
priv->audioDevName = NULL;
}
} else {
priv->strmod = NULL;
priv->audioDevName = NULL;
}
if (priv->strmod) {
SYSCALL(i = ioctl(priv->kbdFD, I_PUSH, priv->strmod));
if (i < 0) {
xf86Msg(X_ERROR,
"%s: cannot push module '%s' onto keyboard device: %s\n",
priv->devName, priv->strmod, strerror(errno));
}
}
SYSCALL(i = ioctl(kbdFD, KIOCTYPE, &ktype));
if (i < 0) {
@ -162,20 +184,8 @@ sunKbdInit(sunKbdPrivPtr priv, int kbdFD, const char *devName, pointer options)
priv->ktype = ktype;
priv->keyMap = sunGetKbdMapping(ktype);
priv->audioState = AB_INITIALIZING;
priv->oleds = sunKbdGetLeds(priv);
if (options != NULL) {
priv->strmod = xf86SetStrOption(options, "StreamsModule", NULL);
priv->audioDevName = xf86SetStrOption(options, "BellDevice", NULL);
if (priv->audioDevName && (priv->audioDevName[0] == '\0')) {
xfree(priv->audioDevName);
priv->audioDevName = NULL;
}
} else {
priv->strmod = NULL;
priv->audioDevName = NULL;
}
return Success;
}
@ -184,15 +194,6 @@ sunKbdOn(sunKbdPrivPtr priv)
{
int ktrans, kdirect, i;
if (priv->strmod) {
SYSCALL(i = ioctl(priv->kbdFD, I_PUSH, priv->strmod));
if (i < 0) {
xf86Msg(X_ERROR,
"%s: cannot push module '%s' onto keyboard device: %s\n",
priv->devName, priv->strmod, strerror(errno));
}
}
SYSCALL(i = ioctl(priv->kbdFD, KIOCGDIRECT, &kdirect));
if (i < 0) {
xf86Msg(X_ERROR,
@ -238,6 +239,10 @@ _X_HIDDEN int
sunKbdOff(sunKbdPrivPtr priv)
{
int i;
/* restore original state */
sunKbdSetLeds(priv, priv->oleds);
if (priv->otranslation != -1) {
SYSCALL(i = ioctl(priv->kbdFD, KIOCTRANS, &priv->otranslation));
@ -478,7 +483,7 @@ sunKbdSetLeds(sunKbdPrivPtr priv, int leds)
_X_HIDDEN int
sunKbdGetLeds(sunKbdPrivPtr priv)
{
int i, leds;
int i, leds = 0;
SYSCALL(i = ioctl(priv->kbdFD, KIOCGLED, &leds));
if (i < 0) {

View File

@ -41,6 +41,7 @@ typedef struct {
Bool kbdActive; /* Have we set kbd modes for X? */
int otranslation; /* Original translation mode */
int odirect; /* Original "direct" mode setting */
unsigned char oleds; /* Original LED state */
const char * strmod; /* Streams module pushed on kbd device */
const char * audioDevName; /* Audio device path to use for bell
or NULL to use keyboard beeper */