Entorno MacOS-Sistema operativo de escritura a mano-38-Respuesta de tecla Shift

respuesta de la tecla Mayús

1. Introducción

En las secciones anteriores, dedicamos mucha energía al procesamiento de la respuesta del teclado.

Hasta ahora, nuestro núcleo puede mostrar de forma precisa y razonable los caracteres clave en la ventana especificada.

Pero todavía hay que lamentar que el kernel actual no responda al presionar la tecla Mayús.

Presione la tecla Shift y luego presione la tecla numérica 1

Entonces el carácter mostrado debería ser "!" en lugar de "1"

De lo que tenemos que ocuparnos en esta sección es de responder al procesamiento de clic de la tecla Mayús.

2.Código

Podemos ver que cuando presiona la tecla Mayús y luego hace clic en las teclas numéricas 1, 2, 3

Lo que se muestra ya no son caracteres numéricos sino los caracteres especiales correspondientes.

Echemos un vistazo a la implementación del código correspondiente.

Lo primero que hay que modificar es write_vga_desktop.c

static char keytable1[0x80] = {
        0,   0,   '!', '@', '#', '$', '%','^', '&', '*', '(', ')', '-', '=', '~', 0,   0,
        'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '`', '{', 0,   0,   'A', 'S',
        'D', 'F', 'G', 'H', 'J', 'K', 'L', '+', '*', 0,   0,   '}', 'Z', 'X', 'C', 'V',
        'B', 'N', 'M', '<', '>', '?', 0,   '*', 0,   ' ', 0,   0,   0,   0,   0,   0,
        0,   0,   0,   0,   0,   0,   0,   '7', '8', '9', '-', '4', '5', '6', '+', '1',
        '2', '3', '0', '.', 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
        0,   0,   0,   '_', 0,   0,   0,   0,   0,   0,   0,   0,   0,   '|', 0,   0
    };

int  key_shift = 0;

Primero agregamos una tabla de entrada keytable1 y una variable key_shift

El valor de esta variable deja de ser cero cuando se presiona la tecla Mayús.

El valor de esta variable vuelve a 0 cuando se suelta la tecla Mayús.

En consecuencia, la tabla keytable1 se utiliza cuando se muestran los caracteres del teclado cuando se presiona la tecla Mayús.

Si no se presiona la tecla Mayús, use la tabla de teclas

char  transferScanCode(int data) {
    if (data == 0x2a)  {//left shift key down
        key_shift |= 1;
    }

    if (data == 0x36) {
        //right shift key down 
        key_shift |= 2; 
    }

    if (data == 0xaa) {
        //left shift key up
        key_shift &= ~1;
    }

    if (data == 0xb6) {
       //right shift key up
        key_shift &= ~2;
    }

    if (data == 0x2a || data == 0x36 || data == 0xaa || data == 0xb6 || 
        data >= 0x54) {
        return 0;
    }

    char c = 0;

    if (key_shift == 0 && data<0x54 && keytable[data] != 0) {
        c = keytable[data];
    } 
    else if (key_shift != 0 && data < 0x80 && keytable1[data] != 0){
        c = keytable1[data];
    }
    else {
        c = 0;
    }

    return c;
}

La función anterior se utiliza para procesar los códigos de escaneo y los códigos de ruptura generados al presionar teclas.

Cuando se presiona la tecla Mayús izquierda, el código de escaneo enviado por el teclado es 0x2a

Cuando se presiona la tecla Mayús de la derecha, el código de escaneo del teclado es 0x36

Cuando se suelta la tecla Mayús izquierda, el código de interrupción enviado por el teclado es 0xaa

Después de soltar la tecla Mayús a la derecha, el código de interrupción enviado por el teclado es 0xb6

Una vez que se presiona la tecla Mayús izquierda, el valor de key_shift se establece en 1.

Cuando se presiona la tecla Mayús derecha, el valor de key_shift es 2

Cuando se suelta la tecla Mayús, el valor de key_shift cambia a 0.

También puede ver en el código que si el valor de key_shift no es igual a 0, es decir, se presiona la tecla Mayús.

Luego vamos a keytable1 para buscar los caracteres correspondientes a las claves.

Si el valor de key_shift es 0, es decir, no se presiona la tecla shift.

Luego vamos a la tabla de claves para encontrar los caracteres correspondientes a las claves.

Echemos un vistazo a cómo se muestran los personajes.

void CMain(void) {
....
    for(;;) {
    ....
    else if (key_to == 0) {
               if (transferScanCode(data) != 0 && cursor_x < 144) {
                   boxfill8(shtMsgBox->buf, shtMsgBox->bxsize, COL8_FFFFFF,cursor_x,
                   28, cursor_x + 7, 43);
                   sheet_refresh(shtctl, shtMsgBox, cursor_x, 28, cursor_x+8, 44);
                   char c = transferScanCode(data);
                   char buf[2] = {c, 0};
                   showString(shtctl,  shtMsgBox, cursor_x, 28, COL8_000000, buf);
                   cursor_x += 8;

                   stop_task_A = 1;

                   boxfill8(shtMsgBox->buf, shtMsgBox->bxsize, cursor_c, cursor_x,
                  28, cursor_x + 7, 43);
                  sheet_refresh(shtctl, shtMsgBox, cursor_x, 28, cursor_x+8, 44);
              } 
    }
....
}

void console_task(struct SHEET *sheet) {
....
    for(;;) {
    ....
    else {
                           if (cursor_x < 240  && transferScanCode(i) != 0) {
                           boxfill8(sheet->buf, sheet->bxsize, COL8_000000, cursor_x,
                28, cursor_x + 7, 43);
                           sheet_refresh(shtctl, sheet, cursor_x, 28, cursor_x+8, 44);

                           s[0] = transferScanCode(i);
                           s[1] = 0;
                           showString(shtctl, sheet, cursor_x, 28, COL8_FFFFFF, s);
                           cursor_x += 8;
                       }
       ....
    }
}

Del código anterior podemos ver si se trata de una ventana de consola o de un cuadro de texto.

Antes de mostrar caracteres, se llama a la función transferScanCode para convertir el valor enviado desde el teclado.

Si el resultado de la conversión no es 0, los caracteres resultantes se mostrarán en la ventana.

Después de completar el código anterior, puede obtener los resultados de ejecución descritos al principio de este artículo.

3. Compile y ejecute

Insertar descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/w776341482/article/details/128660700
Recomendado
Clasificación