43 votos

Cómo eliminar el retraso del bloqueo de mayúsculas en el teclado de aluminio del Apple MacBook Pro

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

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

(Copiado de arriba de stackoverflow ya que se cerró allí como "off topic").

Para profundizar en el tema: Apple considera esto una característica, y su artículo de la base de conocimientos no revela cómo desactivar este retraso.

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

En particular, he comprobado que, al menos en mi experiencia, si reasignas la tecla de bloqueo de mayúsculas en Mac OS X (en Preferencias del Sistema Teclado Teclas modificadoras), y por ejemplo la asignas a Control, entonces el retraso se va mientras estoy conectado a Mac OS X.

Mi problema es que el retraso se mantiene cuando arranco en Ubuntu Linux, y en ese contexto, incluso cuando reasigno la tecla Caps Lock a Control, el retraso sigue presente.

Así que la pregunta es: ¿Cómo desactiva Apple el retraso y, lo que es más importante, cómo se puede replicar ese acto en el contexto de una instalación de Linux sobre el portátil?

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

0 votos

Nunca había notado esto antes, pero he jugado con el mío y puedo ver lo que quieres decir. Si tocas la tecla de bloqueo de mayúsculas demasiado rápido no hace nada. Nunca me había parecido un problema, pero acabo de probar el truco de desactivar/reactivar la tecla de bloqueo de mayúsculas y lo ha hecho instantáneamente. ¡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 el bloqueo de mayúsculas (en el lado de Mac OS X), parece hacer que el problema desaparezca una vez que uno reinicia posteriormente a Linux. Pero no me queda claro si el efecto es permanente - dejé mi máquina apagada durante algún tiempo (semanas o quizás incluso más de un mes), y cuando la arranqué directamente a Linux esta mañana, parecía que el retraso había vuelto. Sigue siendo bastante misterioso para mí.

28voto

jmrk Puntos 161

He descubierto cómo hacerlo. En resumen, debe enviar un "Informe de características" que consiste 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á abajo. Compila con gcc, toma el dispositivo hidraw como parámetro. Así que el flujo completo es:

  1. guardar el código de abajo 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 se reinicie (o se desenchufe y vuelva a enchufar el teclado); puede ponerlos en /etc/rc.local (o el equivalente de su distro) para ejecutarlos en el arranque (no necesita sudo en ese caso; y podría querer mover el binario compilado a /usr/local/sbin/ o algo así).

He puesto algunas comprobaciones de seguridad para el ID del proveedor, el ID del dispositivo y la longitud del descriptor del informe. Puede que tengas que cambiar los dos últimos si tu 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;
}

3 votos

Esto se ve muy bien, ¡gracias! Por interés, ¿cómo encontraste esto (los bytes mágicos requeridos para ser enviados)?

8 votos

@MikeH-R: He pasado un día aprendiendo cómo funciona el protocolo HID: esencialmente, los dispositivos describen qué paquetes de datos ("informes") entienden. Por desgracia, 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 y que sí contenía la descripción correcta del informe, y simplemente lo probé y descubrí que también funciona para el teclado externo con cable.

0 votos

¡Oh wow tengo que probar esto!

18voto

Brandon Puntos 1

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

Ir a Preferencias del sistema > Accesibilidad

Cuando la ventana de accesibilidad está abierta - en la parte izquierda de la ventana - haga clic en Teclado

A continuación, habrá 2 opciones - para las teclas fijas, y para las teclas lentas - haga clic en la casilla junto a las teclas lentas para habilitarlo - a continuación, haga clic en el Options... se abrirá una nueva ventana con un control deslizante para cambiar el tiempo de aceptación, que por defecto está en el centro. Deslice el botón hacia la izquierda, para que sea el menor tiempo posible.

Ahora debería estar arreglado. No he experimentado para ver si el arreglo se mantiene al reiniciar, pero tengo la esperanza de que lo haga.

0 votos

Me emocioné por un segundo, pero cuando fui a mirar aquí, las teclas lentas no estaban habilitadas, así que sólo funciona para las personas que usan teclas lentas :( ¡un día tendré mi preciosa tecla de bloqueo de mayúsculas de vuelta!

4 votos

Esto lo reduce un poco, pero sigue siendo más lento activar el bloqueo de mayúsculas que desactivarlo. Además, la velocidad de repetición de las teclas se ralentiza, aunque el ajuste sea el más rápido. (Sierra 10.12.6)

3 votos

Esto no es una solución adecuada al problema en cuestión, ya que ralentiza el keyrepat y ya no se puede borrar correctamente cuando se mantiene el retroceso.

8voto

Bradley Puntos 121

EDIT: Esta parece ser una pregunta popular de aterrizaje 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,

Ir a Preferencias del Sistema; Accesibilidad; Teclado; activar Teclas Lentas y entra en opciones; baja el retardo al mínimo. El único efecto secundario no deseado que he notado hasta ahora es la lentitud de la acción de retroceso al mantenerla presionada. Generalmente uso CMD+A / CMD+SHIFT+L/R / CMD+SHIFT+CTRL+L/R así que no es un gran problema.

A partir de El Capitán y anteriores,

La solución es bastante elusiva, y no se sabría realmente que que lo has eliminado a menos que hayas intentado deshacerte de él en primer lugar. de deshacerse de él. La forma en que voy a mostrar es puramente para la (actual) última versión de OSX, Yosemite. Sin embargo, usted puede absolutamente aplicar este método a las versiones anteriores y futuras.

La solución es sencilla. Si navegas hasta Teclado en las a través del logo de la Apple en la esquina superior izquierda, llegarás a llegarás a esta pantalla

enter image description here

Si hace clic en el botón de las teclas modificadoras, podrá cambiar la función de cada una de las teclas que son programables. Todo lo que tienes que hacer es hacer es poner la tecla de bloqueo de mayúsculas a ninguna acción y pulsar ok para volver al menú del teclado. Una vez hecho esto, vuelve a las teclas modificadoras y cambie la tecla de bloqueo de mayúsculas de nuevo a bloqueo de mayúsculas y esto eliminará el retraso. Tenga en cuenta que esta solución se mantiene hasta que usted duerme, reiniciar o apagar el dispositivo. En ese momento el retardo se se restablece.

Son arreglos extraños, y se plantea la pregunta de por qué no proporcionan una opción para eliminar el retraso cuando este arreglo es puramente de software. Pero bueno, ¡al menos hay una manera!

Felizmente, el taponamiento.

1 votos

¿Cómo resuelve esto mi problema en Linux?

0 votos

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 retardo permanece cuando arranco en Ubuntu Linux, y en ese contexto, incluso cuando reasigno la tecla Bloqueo de mayúsculas a Control, el retardo sigue presente."

0 votos

Ya veo, creo que debería leer las preguntas del OP con más atención. En OSX descubrí que desvinculando la tecla de mayúsculas por completo y volviendo a vincularla se solucionaba el problema. ¿Tal vez el retraso se mantiene porque estás vinculando a control en su lugar? Vale la pena probar todo si aún no tienes una solución :)

3voto

Ve a las preferencias del sistema > accesibilidad > teclado > activar las teclas lentas > cambiar el retardo de aceptación completamente a la izquierda (corto). Esto me ha funcionado.

0 votos

¿Está describiendo un paso en Mac OS X? ¿Cómo se resuelve el problema en Ubuntu Linux, como se describe en la pregunta?

0 votos

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 de Apple MacBook Pro *" y tal vez la pregunta "¿Cómo es Apple desactivar el retraso". :-) Saludos Thomas, Suecia *Esa pregunta es la razón por la que encontré y leí este tread y nada ayudó así que lo resolví yo mismo :P

2 votos

Según la respuesta de Michelle: Esto lo reduce un poco, pero sigue siendo más lento activar el bloqueo de mayúsculas que desactivarlo. Además, la velocidad de repetición de las teclas se ralentiza, aunque el ajuste sea el más rápido. (Sierra 10.12.6)

2voto

Oskar Puntos 1242

Sé con certeza que el retardo del bloqueo de mayúsculas es una característica del firmware del propio teclado, así que puedes estar seguro de que el retardo se produce independientemente del sistema operativo que esté manejando el teclado en ese momento.

También sé que Apple no ofrece una ruta para flashear el firmware a un nivel inferior, así que todos tendremos que esperar hasta que alguien con suficiente experiencia en hardware publique en el blog las herramientas y los pasos que realizó para engañar al hardware para que cargue el firmware más antiguo (o proporcione lo que parece un firmware más nuevo que retroceda el retraso a como funcionaba antes sin ningún retraso).

Me disculpo 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 no en la tecla de bloqueo de mayúsculas.

2 votos

Hay un detalle que me confunde en su respuesta: ¿Estás diciendo que es falso que cuando uno reasigna la tecla de bloqueo de mayúsculas en Mac OS X, el retardo desaparece? (No sé de qué otra manera interpretar tu afirmación "el retardo en la sincronización ocurre sin importar el sistema operativo que esté manejando el teclado en ese momento"; pero eso contradice mi experiencia directa - a menos que Apple esté usando alguna API no documentada para el firmware para ajustar la sincronización).

0 votos

Yo tengo el mío remapeado a ESC y la retención ligeramente más larga sigue siendo necesaria. Sin embargo, lo hice utilizando una aplicación de terceros llamada Seil, y no a través de ninguna funcionalidad integrada en OSX. Es molesto, sin duda - ¿sus desarrolladores no usan Vim? Vaya.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X