47 votes

Linux sur matériel Mac : Comment supprimer le délai de verrouillage des majuscules sur le clavier en aluminium de l'Apple MacBook Pro lors du démarrage de Linux ?

Le MacBook Pro d'Apple a un léger retard sur la touche de verrouillage des majuscules . C'est-à-dire que la touche de verrouillage des majuscules doit être maintenue enfoncée un peu plus longtemps que d'habitude plus longtemps que la normale pour enregistrer la pression sur la touche requise pour engager le verrouillage des majuscules.

C'est super ennuyeux. Quelqu'un sait-il comment l'empêcher de se produire ?

(Ci-dessus copié de stackoverflow car il y a été fermé comme "hors sujet").

Pour aller plus loin : Apple considère qu'il s'agit d'une fonctionnalité, et l'article de sa base de connaissances n'indique pas comment désactiver ce délai.

Cependant, j'ai des raisons de croire qu'il est possible de le faire.

Notamment, j'ai constaté, du moins dans mon expérience, que si vous remappez la touche de verrouillage des majuscules sous Mac OS X (dans Préférences Système Clavier Touches de modification), et que vous la mappez par exemple sur Control, le délai disparaît alors que je suis connecté à Mac OS X.

Mon problème est que le délai persiste lorsque je démarre sous Ubuntu Linux, et dans ce contexte, même lorsque je remappe la touche Caps Lock à Control, le délai est toujours présent.

La question est donc la suivante : comment Apple désactive-t-elle le délai et, surtout, comment peut-on reproduire cet acte dans le contexte d'une installation Linux sur l'ordinateur portable ?

Mise à jour : Il y a un fil de discussion sur superutilisateur qui peuvent fournir des solutions de contournement. Je n'ai pas encore essayé les suggestions qui y sont faites (à savoir : (1) activer/désactiver CapsLock-NoAction, et (2) mettre à jour le firmware). Je ne peux pas dire, d'après le contexte de ce fil de discussion, si les solutions de contournement ont été testées sur une installation Ubuntu.

29voto

jmrk Points 394

J'ai trouvé comment faire. En bref, vous devez envoyer un "Feature Report" composé des octets suivants 0x9, 0x0, 0x0, 0x0 au dispositif hidraw approprié comme Root.

Vous pouvez trouver le bon périphérique hidraw avec cette commande :

dmesg | grep Apple | grep Keyboard | grep input0 | tail -1 | sed -e 's/.*hidraw\([[:digit:]]\+\).*/\/dev\/hidraw\1/'

Le code pour envoyer le paquet de contrôle magique est ci-dessous. Compilé avec gcc, il prend le périphérique hidraw comme paramètre. Donc le flux entier est :

  1. sauvegarder le code ci-dessous en tant que 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

Les étapes 3 et 4 doivent être effectuées à chaque fois que vous redémarrez (ou débranchez et rebranchez le clavier) ; vous pouvez les placer dans la section /etc/rc.local (ou l'équivalent de votre distro) pour les exécuter au démarrage (vous n'avez pas besoin de sudo dans ce cas ; et vous pourriez vouloir déplacer le binaire compilé dans /usr/local/sbin/ ou autre).

J'ai mis en place des contrôles de sécurité pour l'ID du fournisseur, l'ID du dispositif et la longueur du descripteur de rapport. Vous devrez peut-être modifier ces deux derniers éléments si votre modèle diffère du mien.

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

20voto

michelle Points 199

Voici le correctif pour MacOS Sierra.

Aller à Préférences du système > Accessibilité

Lorsque la fenêtre d'accessibilité est ouverte - dans la partie gauche de la fenêtre - cliquez sur Clavier

Ensuite, il y aura 2 options - pour les touches collantes, et pour les touches lentes - cliquez sur la case à côté des touches lentes pour l'activer - puis cliquez sur l'icône de l'ordinateur. Options... une nouvelle fenêtre s'ouvre avec un curseur pour modifier le délai d'acceptation - par défaut, il est au milieu. Faites glisser le bouton vers la gauche, de façon à ce que le délai soit le plus court possible.

Maintenant, ça devrait être réparé. Je n'ai pas fait d'expérience pour voir si le correctif reste au redémarrage, mais j'espère que ce sera le cas.

8voto

Bradley Points 189

EDIT : Cela semble être une question d'atterrissage populaire pour les utilisateurs qui cherchent à supprimer le retard sur la touche de verrouillage des majuscules dans OS X. A partir de OS X Mojave,

Allez dans Préférences système ; Accessibilité ; Clavier ; activez les touches lentes. et allez dans les options ; réduisez le délai au minimum. Le seul effet secondaire indésirable que j'ai remarqué jusqu'à présent est la lenteur de l'action de retour en arrière lorsque vous la maintenez enfoncée. En général, j'utilise CMD+A / CMD+SHIFT+L/R / CMD+SHIFT+CTRL+L/R de toute façon, ce n'est pas un gros problème.

À partir d'El Capitan et des versions antérieures,

La solution est assez insaisissable, et vous ne le sauriez pas vraiment. que vous l'avez supprimé à moins que vous n'essayiez spécifiquement de vous en débarrasser en premier lieu. La méthode que je vais vous montrer s'applique uniquement à la dernière version (actuelle) d'OSX, Yosemite. dernière version (actuelle) d'OSX, Yosemite. Cependant, vous pouvez absolument appliquer cette méthode aux versions précédentes et futures.

La solution est simple. Si vous naviguez vers Clavier dans les préférences du système système, en cliquant sur le logo de la Apple dans le coin supérieur gauche. cet écran

enter image description here

Si vous cliquez sur le bouton des touches de modification, vous êtes en mesure de changer les fonction de chacune des touches qui sont programmables. Tout ce que vous avez à faire Tout ce que vous avez à faire est de régler la touche de verrouillage des majuscules sur aucune action et d'appuyer sur ok pour vous ramener au menu du clavier. pour revenir au menu du clavier. Une fois cela fait, retournez dans les touches de modification et remettez la touche de verrouillage des majuscules sur verrouillage des majuscules, ce qui supprimera la le retard ! Notez que cette correction reste en place jusqu'à ce que vous dormiez, redémarrez ou éteignez l'appareil. À ce moment-là, le délai est rétabli.

Ce sont des corrections étranges, et on peut se demander pourquoi ils ne fournissent pas une option pour supprimer le délai alors que cette correction est purement logicielle. Mais bon, au moins il y a un moyen !

Joyeux capsing.

4voto

jyp Points 41

Développant la réponse de @jmrk. Son code fonctionne bien pour le clavier dit "aluminium", mais apple a aussi sorti des claviers sans fil, sous le nom de "magic keyboard", avec l'id produit 0x022d. (Ils ont également un châssis en aluminium, et je pense que mon modèle date de 2008 environ). Ce produit a le même problème de verrouillage des majuscules, et presque le même code peut le résoudre. En plus de changer l'identifiant du produit, la taille du descripteur est de 218, et les données à envoyer ne sont pas 0x00, mais 0x01 :

buf[0] = 0x09;  // Report Number
buf[1] = 0x01;  // Report data

J'ai trouvé ceci aujourd'hui et j'ai pensé enregistrer ma réponse ici au cas où cela aiderait quelqu'un, y compris mon futur moi.

Voici un programme complet qui résout le problème sur les deux types d'appareils. Vous pouvez passer des appareils cachés supplémentaires, il ne s'appliquera qu'à ceux qui sont connus. Donc vous pouvez simplement l'appeler comme ./a.out /dev/hidraw*

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

int main(int argc, char **argv) {
  printf("Pass all devices to configure. For example, like this: %s /dev/hidraw*\n", argv[0]);
  int expected_desc_size;
  char data_to_set;
  for (int argnum=1;argnum<argc;argnum++) {
    printf("Trying to configure %s...\n", argv[argnum]);

    int fd, i, res, desc_size = 0;
    char buf[256];
    struct hidraw_devinfo info;
    char *device = argv[argnum];
    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 Raw Info
    res = ioctl(fd, HIDIOCGRAWINFO, &info);
    if (res < 0) {
      perror("HIDIOCGRAWINFO");
      return 1;
    }
    if (info.vendor == 0x05ac) {
      printf("Apple device found!\n");
    } else {
      printf("Not an apple device.\n");
      continue;
    }
    if (info.product == 0x022d) {
      printf("We have a 'magic' keyboard\n");
      expected_desc_size = 218;
      data_to_set = 1;
    } else if (info.product == 0x0250) {
      printf("We have an 'aluminium' keyboard\n");
      expected_desc_size = 75;
      data_to_set = 0;
    }
    else {
      printf("Warning: Unknown product ID 0x%x!\n", info.product);
      continue;
    }
    // Get Report Descriptor Size
    res = ioctl(fd, HIDIOCGRDESCSIZE, &desc_size);
    if (res < 0) {
      perror("HIDIOCGRDESCSIZE");
      return 1;
    }
    if (desc_size != expected_desc_size) {
      printf("Error: unexpected descriptor size %d; panic'ing", desc_size);
      return 1;
    }
    // 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] = data_to_set;  // 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");
      return 1;
    } 
    printf("HID Feature Report (after change):\n\t");
    for (i = 0; i < res; i++) printf("%hhx ", buf[i]);
    puts("\n");
    close(fd);
    }
  return 0;
}

3voto

Oskar Points 1242

Je sais avec certitude que le délai de verrouillage des majuscules est une caractéristique du microprogramme du clavier lui-même - vous pouvez donc être sûr que le délai se produit quel que soit le système d'exploitation utilisé par le clavier à ce moment-là.

Je sais aussi qu'Apple n'offre pas de chemin pour flasher le firmware à un niveau inférieur, donc nous devrons tous attendre jusqu'à ce que quelqu'un avec suffisamment d'expérience matérielle blogue les outils et les étapes qu'ils ont effectuées pour tromper le matériel en chargeant l'ancien firmware (ou fournir ce qui ressemble à un firmware plus récent qui rétablit le retard à la façon dont il fonctionnait avant sans aucun retard).

Je m'excuse pour l'absence de réponse, mais le chemin pour y parvenir est bien éclairé et cela peut aider d'autres personnes à prendre des mesures (en choisissant un clavier plus ancien - ou en s'abstenant de mettre à jour le micrologiciel) pendant que nous attendons une vraie solution pour mettre en œuvre une minuterie courte ou nulle sur la touche de verrouillage des majuscules.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X