He descubierto cómo hacer esto. En resumen, debes enviar un "Informe de Características" consistente en los bytes 0x9, 0x0, 0x0, 0x0
al dispositivo hidraw apropiado como root.
Puedes encontrar el dispositivo hidraw correcto con este comando:
dmesg | grep Apple | grep Keyboard | grep input0 | tail -1 | sed -e 's/.*hidraw\([[:digit:]]\+\).*/\/dev\/hidraw\1/'
El código para enviar el paquete de control mágico está a continuación. Compila con gcc, toma el dispositivo hidraw como parámetro. Así que el flujo completo es:
- guarda el siguiente código como
disable-capslock-delay.c
gcc -o disable-capslock-delay disable-capslock-delay.c
HIDDEVICE=$(dmesg | grep Apple | grep Keyboard | grep input0 | tail -1 | sed -e 's/.*hidraw\([[:digit:]]\+\).*/\/dev\/hidraw\1/')
sudo ./disable-capslock-delay $HIDDEVICE
Los pasos 3 y 4 deben realizarse cada vez que reinicies (o desconectes y vuelvas a conectar el teclado); puedes ponerlos en /etc/rc.local
(o su equivalente en tu distribución) para ejecutarlos en el arranque (en ese caso no necesitas sudo
; y es posible que quieras mover el binario compilado a /usr/local/sbin/
o algo así).
He agregado algunas comprobaciones de seguridad para el ID del fabricante, ID del dispositivo y longitud del descriptor de informe. Es posible que tengas que cambiar los dos últimos si tu modelo difiere del mío.
#include
#include
#include
#include
#include
int main(int argc, char **argv) {
if (argc != 2 || strcmp(argv[1], "-h") == 0) {
printf("¡Pasa un dispositivo hidraw como primer y único parámetro!\n");
printf("Puedes encontrar el dispositivo correcto con:\n");
printf(" dmesg | grep Apple | grep Keyboard | grep input0 | tail -1 | "
"sed -e 's/.hidraw\([[:digit:]]\+\)./\/dev\/hidraw\1/'\n");
return 1;
}
int fd, i, res, desc_size = 0;
char buf[256];
struct hidraw_devinfo info;
char *device = argv[1];
fd = open(device, O_RDWR | O_NONBLOCK);
if (fd < 0) {
perror("No se puede abrir el dispositivo");
return 1;
}
memset(&info, 0, sizeof(info));
memset(buf, 0, sizeof(buf));
// Obtener Tamaño del Descriptor de Informe
res = ioctl(fd, HIDIOCGRDESCSIZE, &desc_size);
if (res < 0) {
perror("HIDIOCGRDESCSIZE");
}
if (desc_size != 75) {
printf("Error: tamaño de descriptor inesperado %d; ¡probablemente tienes el "
"dispositivo hidraw incorrecto!\n", desc_size);
return 1;
}
// Obtener Información Cruda
res = ioctl(fd, HIDIOCGRAWINFO, &info);
if (res < 0) {
perror("HIDIOCGRAWINFO");
} else {
if (info.vendor != 0x05ac) {
printf("Error: ID de fabricante incorrecto, asegúrate de tener el "
"dispositivo hidraw correcto!\n");
return 1;
}
if (info.product != 0x0250) {
printf("Advertencia: ¡ID de producto desconocido 0x%x!\n", info.product);
}
}
// Obtener Característica
buf[0] = 0x09; // Número de Reporte
res = ioctl(fd, HIDIOCGFEATURE(256), buf);
if (res < 0) {
perror("HIDIOCGFEATURE");
} else {
printf("Informe de Característica HID (antes del cambio):\n\t");
for (i = 0; i < res; i++) printf("%hhx ", buf[i]);
puts("\n");
}
// Establecer Característica
buf[0] = 0x09; // Número de Reporte
buf[1] = 0x00; // Datos de Reporte
buf[2] = 0x00; // relleno
buf[3] = 0x00; // relleno
res = ioctl(fd, HIDIOCSFEATURE(4), buf);
if (res < 0) {
perror("HIDIOCSFEATURE");
} else {
printf("Retardo de Caps Lock desactivado.\n");
}
// Obtener Característica
buf[0] = 0x09; // Número de Reporte
res = ioctl(fd, HIDIOCGFEATURE(256), buf);
if (res < 0) {
perror("HIDIOCGFEATURE");
} else {
printf("Informe de Característica HID (después del cambio):\n\t");
for (i = 0; i < res; i++) printf("%hhx ", buf[i]);
puts("\n");
}
close(fd);
return 0;
}
0 votos
Nunca antes había notado esto, pero he probado con el mío y puedo ver a qué te refieres. Si presionas rápidamente la tecla de bloqueo de mayúsculas no pasa nada. Antes no lo encontraba un problema, pero acabo de probar el truco de desactivar/reactivar la tecla de bloqueo de mayúsculas ¡y ahora es instantáneo! Ahora, no importa lo rápido que presione la tecla, siempre activa el bloqueo de mayúsculas. ¡Muy extraño!
0 votos
Siempre pensé que me estaba volviendo loco :p Puedo ver su beneficio, pero en algunas situaciones realmente me molesta. ¡Sería bueno saber si es posible!
0 votos
De hecho, el truco de desactivar/reactivar Bloq Mayús (en el lado de Mac OS X) parece hacer que el problema desaparezca una vez que se reinicia posteriormente en Linux. Pero no está claro si el efecto es permanente: dejé mi máquina apagada durante algún tiempo (semanas o incluso más de un mes), y cuando la encendí directamente en Linux esta mañana, parecía que el retraso había regresado. Todavía bastante misterioso para mí.
1 votos
Entonces, solo para verificar, ¿no parece haber una solución para Linux para este problema?
0 votos
No he encontrado una solución aún. No he buscado una solución recientemente, pero voy a intentar ejecutar Linux de forma nativa más a menudo ahora (en lugar de en una máquina virtual, donde no surge el problema) para que pueda usar
rr
para depurar, y tal vez vuelva a intentar encontrar una solución.1 votos
Aquí hay una solución que funciona para macOS y se puede ejecutar en macOS.
0 votos
No me sorprendería si el 99% de las víctimas de esta "característica" ni siquiera supieran que estaba sucediendo. Las primeras 10 veces o así que esto sucedió, pensé que era culpa mía, hasta que comencé a experimentar con pulsar el botón. Esa es la peor parte de esta "característica"; literalmente hace que las personas crean que son malas escribiendo.