web-dev-qa-db-fra.com

Comment définir les touches de fonction par défaut sur un clavier Logitech K760 Bluetooth?

J'avais espéré que solaar aiderait, mais cela ne semble fonctionner que pour les périphériques sans fil Logitech qui utilisent le système exclusif de Logitech. J'ai un clavier Bluetooth (K760). Je sais qu’il est possible d’utiliser les touches de fonction (plutôt que les touches de support) par défaut, car je peux le faire sous OS X avec le logiciel Logitech. Le simple remappage des touches ne fonctionnera pas, car F1, F2 et F3 ont la particularité de changer le périphérique Bluetooth auquel je me connecte et les clés ne sont pas envoyées au système d'exploitation.

5
Chas. Owens

Il semble que les modifications apportées au code C de l'autre réponse fonctionnent (mais désactive les touches de fonction, je pensais que cela ferait cela). Je voulais étendre le code pour détecter automatiquement le clavier pour moi et je ne pouvais supporter l'idée d'écrire du code de recherche de fichier en C, j'ai donc porté le code sur Perl 5:

#!/usr/bin/Perl

use strict;
use warnings;

use constant HIDIOCGRAWINFO         => 2148026371;
use constant BUS_BLUETOOTH          =>          5;
use constant HID_VENDOR_ID_LOGITECH =>       1133;
use constant HID_DEVICE_ID_K760     =>     -19690;
use constant HID_DEVICE_ID_K760_ALT =>     -19688;
use constant HID_DEVICE_ID_K810     =>     -19687;

my %message = (
    HID_DEVICE_ID_K760() => {
        on   => (pack "C*", 0x10, 0xff, 0x05, 0x14, 0x00, 0x00, 0x00),
        off  => (pack "C*", 0x10, 0xff, 0x05, 0x14, 0x01, 0x00, 0x00),
    },
    HID_DEVICE_ID_K760_ALT() => {
        on   => (pack "C*", 0x10, 0xff, 0x05, 0x14, 0x00, 0x00, 0x00),
        off  => (pack "C*", 0x10, 0xff, 0x05, 0x14, 0x01, 0x00, 0x00),
    },
    HID_DEVICE_ID_K810() => {
        on   => (pack "C*", 0x10, 0xff, 0x06, 0x15, 0x00, 0x00, 0x00),
        off  => (pack "C*", 0x10, 0xff, 0x06, 0x15, 0x01, 0x00, 0x00),
    },
);

#die
#   "usage: $0 [on|off]\n",
#   "\ton  makes the media keys the default\n",
#   "\toff makes the function keys the default\n"
#unless @ARGV == 1 and my ($choice) = $ARGV[0] =~ /^(on|off)$/;
my ($choice) = @ARGV ? $ARGV[0] =~ /^(on|off)$/ : "off";

my $device;

# find the first device we can set the option on
# TODO: add a parameter to directly specify a device
# TODO: add a parameter to make it set all devices
FILE_SEARCH:
for my $file (</sys/class/hidraw/hidraw*/device/uevent>) {
    open my $fh, "<", $file or do {
        warn "could not open $file: $!\n";
        next;
    };

    while (<$fh>) {
        if (/HID_NAME=Logitech K(76|81)0/) {
            my ($hid_raw_name) = $file =~ m{(hidraw[^/]+)};
            $device = "/dev/$hid_raw_name";
            last FILE_SEARCH;
        }
    }
}

die "sorry, could not find a suported device on your machine\n" unless $device;

# re-exec with Sudo if we can't open the device
unless (-r $device and -w $device) {
    # unless we are already root
    exec "Sudo", $^X, $0, @ARGV unless $> == 0;
}

open my $dev, "+<", $device or die "could not open device $device: $!\n";

my $success = ioctl $dev, HIDIOCGRAWINFO, my $struct = "";

die "could not determine if $device is supported\n" unless $success;

my ($bus_type, $vendor, $product) = unpack "Lss", $struct;

die "detected device $device is not a Bluetooth device\n"
    unless $bus_type == BUS_BLUETOOTH;

die "detected device $device is not a Logitech product\n"
    unless $vendor == HID_VENDOR_ID_LOGITECH;

die "detected device $device is not a supported product\n"
    unless exists $message{$product};

syswrite $dev, $message{$product}{$choice};

close $dev;

Mise à jour: solution rapide et délicate s’il existe plusieurs ID de périphérique pour le K760.

4
Chas. Owens

Salut, j'ai le clavier K760 un im essayant également de trouver un moyen de le faire. Cela semble être un bon point de départ http://www.spinics.net/lists/linux-input/msg24280.html

Il a réussi à le faire fonctionner pour K810. si vous pouvez obtenir les codes de consigne pour le k760, vous devriez pouvoir modifier ce code pour qu'il fonctionne avec le k760, ce qui suppose que ces codes sont similaires.

Mise à jour: je l'ai fait travailler !!! utilisé la même procédure que celle décrite dans le lien.

#define HID_VENDOR_ID_LOGITECH          (__u32)0x046d
#define HID_DEVICE_ID_K810              (__s16)0xb316

const char k810_seq_fkeys_on[]  = {0x10, 0xff, 0x05, 0x14, 0x00, 0x00, 0x00};
const char k810_seq_fkeys_off[] = {0x10, 0xff, 0x05, 0x14, 0x01, 0x00, 0x00};
4
Steven