Cómo eliminar el retraso de bloqueo de mayúsculas en el teclado de aluminio Apple MacBook Pro cuando se inicia en Linux

32

El MacBook Pro de Apple tiene un ligero retraso en la tecla de bloqueo de mayúsculas . Es decir, la tecla de bloqueo de mayúsculas debe mantenerse presionada un poco más de lo normal para registrar la presión de la tecla necesaria para activar el bloqueo de mayúsculas.

Esto es súper molesto. ¿Alguien sabe cómo evitar que suceda?

(Arriba copiado desde stackoverflow ya que se cerró allí como "fuera de tema").

Para más detalles: Apple considera que esta es una característica, y su artículo de la base de conocimientos no revela cómo deshabilitar este retraso.

Sin embargo, tengo razones para creer que es posible hacerlo.

En particular, he descubierto que, al menos en mi experiencia, si reasigna la tecla de bloqueo de mayúsculas en Mac OS X (en Preferencias del sistema ... Teclado ... Teclas modificadoras) y, por ejemplo, lo asigna a Control, el retraso desaparece mientras estoy conectado a Mac OS X.

Mi problema es que el retraso permanece cuando inicio en Ubuntu Linux, y en ese contexto, incluso cuando vuelvo a asignar la tecla Bloq Mayús a Control, el retraso aún está presente.

Entonces, la pregunta es: ¿cómo está Apple deshabilitando el retraso y, lo que es más importante, cómo se puede replicar eso en el contexto de una instalación de Linux en la computadora portátil?

Actualización: hay un hilo en el superusuario que puede proporcionar soluciones alternativas. Todavía no he probado las sugerencias allí (a saber: (1) activar / desactivar CapsLock-NoAction, y (2) una actualización de firmware). No puedo decir por el contexto de ese hilo si las soluciones han sido probadas en una instalación de Ubuntu.

pnkfelix
fuente
Nunca antes me había dado cuenta de esto, pero he tenido una jugada con la mía y puedo ver a qué te refieres. Si toca la tecla de bloqueo de mayúsculas demasiado rápido, no hace nada. Nunca lo encontré un problema antes, pero solo intenté desactivar / volver a habilitar el truco de la tecla de bloqueo de mayúsculas y ¡lo hizo instantáneo! ahora no importa rápidamente, presiono la tecla, siempre se activa el bloqueo de mayúsculas ¡Muy extraño!
tom1990
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!
OrangeBox 01 de
De hecho, el truco de bloqueo de mayúsculas de deshabilitar / volver a habilitar (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 para mí si el efecto es permanente: dejé mi máquina apagada durante algún tiempo (semanas o incluso más de un mes), y cuando lo arranqué directamente a Linux esta mañana, parecía que el la demora había regresado. Todavía bastante misterioso para mí.
pnkfelix
Entonces, solo para verificar, ¿no parece haber una solución para Linux para este problema?
Mike HR
1
Aquí hay una solución que funciona para macOS y se puede ejecutar en macOS.
fel1x

Respuestas:

22

He descubierto cómo hacer esto. En resumen, debe enviar un "Informe de características" que consta de los bytes 0x9, 0x0, 0x0, 0x0al dispositivo de hidratación apropiado como raíz.

Puede encontrar el dispositivo de hidratación adecuado 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á debajo. Compila con gcc, toma el dispositivo hidraw como parámetro. Entonces todo el flujo es:

  1. guarda el siguiente código como disable-capslock-delay.c
  2. gcc -o disable-capslock-delay disable-capslock-delay.c
  3. HIDDEVICE=$(dmesg | grep Apple | grep Keyboard | grep input0 | tail -1 | sed -e 's/.*hidraw\([[:digit:]]\+\).*/\/dev\/hidraw\1/')
  4. sudo ./disable-capslock-delay $HIDDEVICE

Los pasos 3 y 4 deben realizarse cada vez que reinicie (o desenchufe y vuelva a enchufar el teclado); puede ponerlos en /etc/rc.local(o el equivalente de su distribución) para ejecutarlos en el arranque (no es necesario sudoen ese caso; y es posible que desee mover el binario compilado a /usr/local/sbin/algo o algo así).

He realizado algunas comprobaciones de seguridad para la identificación del proveedor, la identificación del dispositivo y la longitud del descriptor del informe. Puede que tenga que cambiar los dos últimos si su modelo difiere del mío.


#include <linux/hidraw.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char **argv) { if (argc != 2 || strcmp(argv[1], "-h") == 0) { printf("Pass a hidraw device as the first and only parameter!\n"); printf("You may find the right device with:\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("Unable to open device"); return 1; } memset(&info, 0, sizeof(info)); memset(buf, 0, sizeof(buf)); // Get Report Descriptor Size res = ioctl(fd, HIDIOCGRDESCSIZE, &desc_size); if (res < 0) { perror("HIDIOCGRDESCSIZE"); } if (desc_size != 75) { printf("Error: unexpected descriptor size %d; you've probably got " "the wrong hidraw device!\n", desc_size); return 1; } // Get Raw Info res = ioctl(fd, HIDIOCGRAWINFO, &info); if (res < 0) { perror("HIDIOCGRAWINFO"); } else { if (info.vendor != 0x05ac) { printf("Error: Wrong vendor ID, make sure you got the right " "hidraw device!\n"); return 1; } if (info.product != 0x0250) { printf("Warning: Unknown product ID 0x%x!\n", info.product); } } // Get Feature buf[0] = 0x09; // Report Number res = ioctl(fd, HIDIOCGFEATURE(256), buf); if (res < 0) { perror("HIDIOCGFEATURE"); } else { printf("HID Feature Report (before change):\n\t"); for (i = 0; i < res; i++) printf("%hhx ", buf[i]); puts("\n"); } // Set Feature buf[0] = 0x09; // Report Number buf[1] = 0x00; // Report data buf[2] = 0x00; // padding buf[3] = 0x00; // padding res = ioctl(fd, HIDIOCSFEATURE(4), buf); if (res < 0) { perror("HIDIOCSFEATURE"); } else { printf("Caps lock delay disabled.\n"); } // Get Feature buf[0] = 0x09; // Report Number res = ioctl(fd, HIDIOCGFEATURE(256), buf); if (res < 0) { perror("HIDIOCGFEATURE"); } else { printf("HID Feature Report (after change):\n\t"); for (i = 0; i < res; i++) printf("%hhx ", buf[i]); puts("\n"); } close(fd); return 0; }

jmrk
fuente
2
Esto se ve genial, gracias! fuera de interés, ¿cómo encontraste esto (los bytes mágicos requeridos para ser enviados)?
Mike HR
66
@ MikeH-R: He pasado un día aprendiendo cómo funciona el protocolo HID: esencialmente, los dispositivos describen qué paquetes de datos ("informes") entienden. Desafortunadamente, el teclado de Apple no menciona el informe en cuestión en sus descriptores HID. Sin embargo, encontré un volcado de los descriptores HID del teclado interno de un MacBook que alguien había publicado que contenía la descripción correcta del informe, y simplemente lo intenté y descubrí que también funciona para el teclado con cable externo.
jmrk
¡Oh wow, tengo que probar esto!
pnkfelix
(Parece que obtengo diferentes tamaños de descriptores, como mínimo. Sin embargo, los ajustaré y veré cómo funciona)
Pnkfelix
Voy a aceptar esta respuesta porque es lo más parecido a reconocer el problema tal como se describe y proporcionarle una solución creíble (aunque en mi propio caso los tamaños de los descriptores son diferentes).
pnkfelix
13

Aquí está la solución para macOS Sierra.

Vaya a Preferencias del sistema > Accesibilidad

Cuando la ventana de accesibilidad esté abierta, en la parte izquierda de la ventana, haga clic en Teclado

Luego habrá las 2 opciones: para teclas fijas y para teclas lentas: haga clic en el cuadro junto a las teclas lentas para habilitarlo, luego haga clic en el Options...botón; aparecerá una nueva ventana con un control deslizante para cambiar el retraso de aceptación, de forma predeterminada Esto está en el medio. Deslice el botón completamente hacia la izquierda, de modo que sea el menor tiempo posible.

Ahora debería estar arreglado. No he experimentado para ver si la solución se mantiene al reiniciar, pero espero que así sea.

michelle
fuente
Me emocioné por un segundo, pero cuando fui a buscar aquí, las teclas lentas no estaban habilitadas, así que solo funciona para las personas que usan las teclas lentas :( ¡algún día recuperaré mi preciosa tecla de bloqueo de mayúsculas!
Bradley
44
Esto lo reduce un poco, pero aún es más lento activar el bloqueo de mayúsculas que desactivarlo. Además, la frecuencia de repetición de la tecla se ralentiza a pesar de que la configuración está más rápida. (Sierra 10.12.6)
scipilot
1
esta no es una solución adecuada para el problema en cuestión, ya que ralentiza el reparación de claves y ya no puede eliminar correctamente las cosas al mantener presionado el espacio de retroceso.
Denialos
7

EDITAR: Esta parece ser una pregunta de aterrizaje popular para los usuarios que buscan eliminar el retraso en la tecla de bloqueo de mayúsculas en OS X. A partir de OS X Mojave,

Vaya a Preferencias del sistema; Accesibilidad; Teclado; habilite las teclas lentas y entre en opciones; baje el retraso al mínimo. El único efecto secundario no deseado que he notado hasta ahora es una acción lenta de retroceso al mantenerlo presionado. Generalmente uso CMD + A / CMD + SHIFT + L / R / CMD + SHIFT + CTRL + L / R de todos modos, así que no es un gran problema.

A partir de El Capitán y anteriores,

La solución es bastante difícil de alcanzar, y realmente no sabría que la eliminó a menos que estuviera tratando específicamente de deshacerse de ella en primer lugar. La forma en que te voy a mostrar es puramente para la última versión (actual) de OSX, Yosemite. Sin embargo, puede aplicar absolutamente este método a versiones anteriores y futuras.

La solución es simple. ¡Si navega al Teclado en las preferencias del Sistema a través del logotipo de Apple en la esquina superior izquierda, llegará a esta pantalla! [Ingrese la descripción de la imagen aquí] [1]

[1]: http://i.stack.imgur.com/DIbZD.png

Si hace clic en el botón de teclas modificadoras, puede cambiar la función de cada una de las teclas que son programables. Todo lo que tiene que hacer es configurar la tecla de bloqueo de mayúsculas en ninguna acción y presionar ok para regresar al menú del teclado. Una vez hecho esto, regrese a las teclas modificadoras y cambie la tecla de bloqueo de mayúsculas a bloqueo de mayúsculas y esto eliminará el retraso. Tenga en cuenta que esta solución permanece en su lugar hasta que duerma, reinicie o apague el dispositivo. En ese momento la demora se restablece.

Son soluciones extrañas, y surge la pregunta de por qué no ofrecen una opción para eliminar el retraso cuando esta solución está basada exclusivamente en software. Pero bueno, al menos hay un camino!

Feliz volcado.

Bradley
fuente
¿Cómo resuelve esto mi problema en Linux?
pnkfelix
Para ser más claro: la pregunta original decía: "... el retraso desaparece mientras estoy conectado a Mac OS X. Mi problema es que el retraso persiste cuando inicio en Ubuntu Linux, y en ese contexto, incluso cuando vuelvo a asignar el Tecla de bloqueo de mayúsculas para controlar, el retraso todavía está presente ".
pnkfelix
Ah! Ya veo, creo que debería leer las preguntas de OP con más cuidado. Descubrí en OSX que desenlazar la tecla de mayúsculas por completo y volver a vincular resolvió el problema. ¿Quizás la demora persiste porque estás obligado a controlar? Vale la pena intentarlo todo si aún no tienes una solución :)
Bradley
1
Este enfoque no tuvo ningún efecto para mí. (Sierra 10.12.6)
scipilot
3

¡Vaya a Preferencias del sistema> Accesibilidad> Teclado> Habilitar teclas lentas> Cambiar retraso de aceptación completamente a la izquierda (corto) Esto funcionó para mí.

Thomas Carl-Erik Jönsson
fuente
¿Estás describiendo un paso en Mac OS X? ¿Cómo resuelve esto el problema en Ubuntu Linux, como se describe en la pregunta?
pnkfelix
Sí correcto. No sé Ubuntu Linux, lo siento. Creo que estoy resolviendo el título principal "Cómo eliminar el retraso de bloqueo de mayúsculas en el teclado de aluminio Apple MacBook Pro *" y tal vez la pregunta "¿Cómo está Apple deshabilitando el retraso?". :-) Saludos cordiales Thomas, Suecia * Esa pregunta es la razón por la que encontré y leí este dibujo y nada ayudó, así que lo resolví yo mismo: P
Thomas Carl-Erik Jönsson
2
Según la respuesta de Michelle: Esto lo reduce un poco, pero aún es más lento activar el bloqueo de mayúsculas que desactivarlo. Además, la frecuencia de repetición de la tecla se ralentiza a pesar de que la configuración está más rápida. (Sierra 10.12.6)
scipilot
2

Sé con certeza que el retraso de bloqueo de mayúsculas es una característica del firmware en el teclado en sí mismo, por lo que puede estar seguro de que el tiempo de retraso ocurre sin importar qué sistema operativo esté manejando el teclado en este momento.

También sé que Apple no ofrece una ruta para actualizar el firmware a un nivel inferior, por lo que todos tendremos que esperar hasta que alguien con suficiente experiencia en hardware bloguee las herramientas y los pasos que realizaron para engañar al hardware para que cargue el firmware anterior (o proporcione lo que parece un firmware más nuevo que hace retroceder la demora a cómo funcionaba antes sin demora).

Pido disculpas por la falta de respuesta, pero el camino para lograr esto está bien iluminado y puede ayudar a otros a tomar medidas (seleccionar un teclado más antiguo o abstenerse de actualizar el firmware) mientras esperamos una solución real para implementar un temporizador corto o nulo en la tecla de bloqueo de mayúsculas.

bmike
fuente
2
Un detalle sobre el que estoy confundido en su respuesta: ¿Está diciendo que es falso que cuando se reasigna la tecla de bloqueo de mayúsculas en Mac OS X, el retraso desaparece? (No sé cómo interpretar su declaración "el tiempo de retraso ocurre sin importar qué sistema operativo esté manejando el teclado en este momento"; pero eso contradice mi experiencia directa, a menos que Apple esté usando alguna API no documentada en el firmware para ajustar el timing?)
pnkfelix
Tengo el mío reasignado a ESC y la retención un poco más larga todavía es necesaria. Sin embargo, hice esto usando una aplicación de terceros llamada Seil, y no a través de ninguna funcionalidad integrada en OSX. Molesto, sin duda, ¿sus desarrolladores no usan Vim? Geez
intuido
0

La solución "activar / desactivar CapsLock-NoAction" a la que se refiere el OP funciona tanto en mi teclado Mac con cable como en mi teclado MacBookPro. Bradley dice que esto solo funciona en Yosemite, pero lo he usado con éxito en Snow Leopard (10.6.8) y Mavericks (10.9.5). También he probado esto dentro de una VM Kubuntu y Caps Lock continuó funcionando correctamente dentro de la VM.

  • Abra la Preferencia del sistema del teclado y haga clic en Modifier Keys...:

ingrese la descripción de la imagen aquí

  • Establezca la tecla Bloq Mayús en No Actiony haga clic en OK:

                    ingrese la descripción de la imagen aquí

  • Haga clic de Modifier Keys...nuevo y configure la tecla Bloq Mayús en Caps Locky haga clic en OK:

                    ingrese la descripción de la imagen aquí

Esto solo permanece vigente hasta el próximo reinicio.

Neil Steiner
fuente
1
Esto no tuvo ningún efecto para mí. (Sierra 10.12.6, teclado USB Mac e interno en MBPro)
scipilot