47 votos

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

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

Esto es muy molesto. ¿Alguien sabe cómo evitar que esto suceda?

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

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

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

En particular, he descubierto que, al menos en mi experiencia, si remapeas la tecla Bloq Mayús en Mac OS X (en Preferencias del Sistema .. Teclado .. Teclas de modificación), y por ejemplo, la asignas a Control, entonces 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 remapeo la tecla Bloq Mayús a Control, el retraso sigue presente.

Entonces, la pregunta es: ¿Cómo está Apple desactivando el retraso, y más importante aún, cómo se puede replicar ese acto en el contexto de una instalación de Linux en la computadora portátil?

Actualización: Hay un hilo en superuser que puede proporcionar soluciones alternativas. Aún no he probado las sugerencias allí (es decir: (1) desactivar/activar CapsLock-NoAction, y (2) una actualización de firmware). No puedo decir a partir del contexto de ese hilo si las soluciones alternativas han sido probadas en una instalación de Ubuntu.

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í.

29voto

jmrk Puntos 161

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:

  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 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;
}

4 votos

Esto se ve genial, ¡gracias! por cierto, ¿cómo encontraste esto (los bytes mágicos necesarios para ser enviados)?

10 votos

@MikeH-R: He pasado un día aprendiendo cómo funciona el protocolo HID: básicamente, 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 una MacBook que alguien había publicado, que contenía la descripción correcta del informe, y simplemente lo probé y descubrí que funciona para el teclado externo con cable también.

1 votos

¡Oh wow, tengo que probar esto!

20voto

Brandon Puntos 1

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

Ve a Preferencias del Sistema > Accesibilidad

Cuando se abra la ventana de accesibilidad, en la parte izquierda de la ventana, haz clic en Teclado

Luego aparecerán las 2 opciones — para teclas de adhesión (sticky keys) y para teclas lentas (slow keys) — haz clic en el recuadro junto a teclas lentas para habilitarlo — luego haz clic en el botón Opciones... – se abrirá una nueva ventana con un deslizador para cambiar el retraso de aceptación — por defecto esto está en el medio. Desliza el botón completamente hacia la izquierda, para que sea el tiempo más corto posible.

Ahora debería estar solucionado. No he experimentado para ver si la solución permanece al reiniciar, pero tengo esperanzas de que así sea.

0 votos

Me emocioné por un momento, pero cuando fui a mirar aquí, las teclas lentas no estaban habilitadas, así que solo funciona para las personas que usan teclas lentas :( ¡Algún día recuperaré mi preciado botón de bloqueo de mayúsculas!

5 votos

Esto sí 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 tecla se ralentiza a paso de tortuga, aunque la configuración esté en la más rápida. (Sierra 10.12.6)

5 votos

Esta no es una solución adecuada para el problema en cuestión, ya que ralentiza el repetidor de teclas y ya no se puede eliminar correctamente cosas al mantener presionado retroceso.

8voto

Bradley Puntos 121

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

Ve a Preferencias del Sistema; Accesibilidad; Teclado; habilita Teclas lentas y entra en opciones; baja la demora al mínimo. El único efecto secundario no deseado que he notado hasta ahora es una acción de retroceso lenta 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 versiones anteriores,

La solución es bastante difícil de encontrar, y realmente no sabrías que lo eliminaste a menos que específicamente estuvieras intentando deshacerte de él en primer lugar. La forma en la que te voy a mostrar es exclusivamente para la última versión (actual) de OSX, Yosemite. Sin embargo, puedes absolutamente aplicar este método a versiones anteriores y futuras.

La solución es simple. Si navegas hasta Teclado en las preferencias del Sistema a través del logo de la manzana en la esquina superior izquierda llegarás a esta pantalla

introduce aquí la descripción de la imagen

Si haces clic en el botón de teclas modificadoras, podrás cambiar la función de cada una de las teclas que son programables. Todo lo que tienes que hacer es establecer la tecla de bloqueo de mayúsculas sin acción y presionar aceptar para regresar al menú del teclado. Una vez hecho, vuelve a las teclas modificadoras y cambia la tecla de bloqueo de mayúsculas nuevamente a bloqueo de mayúsculas y esto eliminará la demora. Ten en cuenta que esta solución permanecerá en su lugar hasta que duermas, reinicies o apagues el dispositivo. En ese momento, la demora se restablece.

Son soluciones extrañas, y surge la pregunta de por qué no proporcionan una opción para eliminar la demora cuando esta solución es puramente basada en software. ¡Pero bueno, al menos hay una manera!

¡Feliz uso de las mayúsculas!

1 votos

¿Cómo resuelve esto mi problema en Linux?

0 votos

Para ser más claro: la pregunta original dijo: "... el retraso desaparece mientras estoy conectado en Mac OS X. Mi problema es que el retraso permanece cuando arranco en Ubuntu Linux, y en ese contexto, incluso cuando vuelvo a asignar la tecla Caps Lock a Control, el retraso sigue presente."

0 votos

Ah! Veo, supongo que debería leer las preguntas de OP más cuidadosamente. Encontré en OSX que desvincular completamente la tecla de mayúsculas y volver a enlazarla resolvió el problema. ¿Tal vez el retraso persiste porque estás enlazando a control en su lugar? ¡Vale la pena probarlo todo si aún no tienes una solución alternativa :)

3voto

Oskar Puntos 1242

Sé con certeza que el retraso de mayúsculas es una característica del firmware del teclado en sí mismo, por lo que puedes estar seguro de que el temporizador de retraso ocurre independientemente del sistema operativo que esté utilizando el teclado en ese momento.

También sé que Apple no ofrece un método para flashear el firmware a un nivel inferior, por lo que todos tendremos que esperar hasta que alguien con suficiente experiencia en hardware publique las herramientas y pasos que realizaron para engañar al hardware y cargar el firmware antiguo (o proporcionar lo que parece ser un firmware más reciente que retroceda el retraso a como funcionaba antes sin ningún retraso).

Pido disculpas por no dar una respuesta clara, 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 inexistente en la tecla de mayúsculas.

2 votos

Un detalle sobre el cual estoy confundido en tu respuesta: ¿Estás diciendo que es falso que cuando uno remapea la tecla de bloqueo de mayúsculas en Mac OS X, la demora desaparece? (No sé cómo interpretar tu afirmación "el retardo ocurre sin importar qué sistema operativo esté manejando el teclado en ese momento"; pero eso contradice mi experiencia directa -- ¿a menos que Apple esté utilizando alguna API no documentada con el firmware para ajustar el timing?)

0 votos

Tengo el mío reasignado a ESC y aún es necesario mantenerlo un poco más tiempo. Lo hice usando una aplicación de terceros llamada Seil, aunque no a través de ninguna funcionalidad incorporada en OSX. Molesto, sin duda, ¿no usan los desarrolladores de ellos Vim? Hombre.

3voto

Ve a preferencias del sistema > accesibilidad > teclado > habilita teclas lentas > cambia la demora de aceptación completamente a la izquierda (corta)! ¡Esto funcionó para mí!

0 votos

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

0 votos

Sí, correcto. No conozco Ubuntu Linux, lo siento. Creo que estoy resolviendo el título principal "Cómo eliminar la demora de bloqueo de mayúsculas en el teclado de aluminio Apple MacBook Pro*" y tal vez la pregunta "¿Cómo está desactivando Apple la demora?". :-) Saludos cordiales Thomas, Suecia *Esa pregunta es la razón por la que encontré y leí este hilo y nada ayudó, así que lo resolví yo mismo :P

2 votos

Según la respuesta de Michelle: Esto sí reduce un poco, pero aún es más lento activar la tecla Bloq Mayús que desactivarla. Además, la velocidad de repetición de la tecla se ralentiza a paso de tortuga, incluso cuando está configurada en la opción más rápida. (Sierra 10.12.6)

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