Como posso definir as teclas de função como padrão em um teclado Logitech K760 Bluetooh?

5

Eu esperava que o solaar ajudasse, mas parece funcionar apenas para os dispositivos sem fio da Logitech que usam o esquema proprietário da Logitech. Eu tenho teclado Bluetooth (K760). Eu sei que pode ser dito para usar as teclas de função (em vez das teclas de mídia) por padrão, porque eu posso fazê-lo no OS X com o software da Logitech. Apenas remapear as teclas não funcionará, pois F1, F2 e F3 são especiais, na medida em que eles mudam para qual dispositivo Bluetooth eu me conecto e as chaves não são enviadas para o SO.

    
por Chas. Owens 31.07.2013 / 14:25

2 respostas

4

Parece que as mudanças no código C da outra resposta funcionam (mas desligar as teclas de função, pensei em fazer isso). Eu queria estender o código para detectar automaticamente o teclado para mim e não poderia suportar o pensamento de escrever código de busca de arquivo em C, então eu portei o código para o 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;

Atualização: solução rápida e suja para a existência de mais de um ID de dispositivo para o K760.

    
por Chas. Owens 24.08.2015 / 20:04
4

Oi eu tenho o teclado k760 um im também tentando encontrar uma maneira de fazer isso. Este parece ser um bom lugar para iniciar o link

Ele conseguiu trabalhar para o k810. Se você puder obter os códigos de setpoint para o k760, você deve ser capaz de modificar este código para fazer com que funcione para o k760, que é um sinal de que eles são similares.

Atualização: eu consegui trabalhar !!! usou o mesmo procedimento descrito no link.

#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};
    
por Steven 01.11.2013 / 13:34