How can I make the function keys the default on a Logitech K760 Bluetooh keyboard?

8,745

Solution 1

It looks like the changes to the C code from the other answer do work (but off turns on the function keys, I had thought on would do that). I wanted to extend the code to auto-detect the keyboard for me and couldn't bear the thought of writing file searching code in C, so I ported the code to 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;

Update: quick and dirty solution to the there being more than one device id for K760.

Solution 2

Hi I have the k760 keyboard an im also trying to find a way to do this. This seems to be a good place to start http://www.spinics.net/lists/linux-input/msg24280.html

He has managed to get it working for k810. if you can get the setpoint codes for the k760 you should be able to modify this code to make it work for k760 that is asuming that they are similar.

Update: I got it working !!! used the same procedure as describedd in the 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};
Share:
8,745

Related videos on Youtube

Chas. Owens
Author by

Chas. Owens

UNIX, Perl, what more is there to say?

Updated on September 18, 2022

Comments

  • Chas. Owens
    Chas. Owens over 1 year

    I had hoped that solaar would help, but it seems to only work for the Logitech wireless devices that use Logitech's proprietary scheme. I have Bluetooth keyboard (K760). I know it can be told to use the function keys (rather than the media keys) by default because I can do it on under OS X with software from Logitech. Just remapping the keys won't work as F1, F2, and F3 are special in that they switch which Bluetooth device I connect to and the keys are not sent to the OS.

    • Ilia
      Ilia over 10 years
      What was your solution? I'm planning to get one for my Fedora GNU/Linux?
  • Steven
    Steven about 10 years
    Yeah you might need to try with another hidraw device.
  • Chas. Owens
    Chas. Owens about 10 years
    The problem was that the device should have been /dev/hidraw2. However, now the problem is that it is saying write: 0 were written instead of 7. The write(1) call is not able to write any bytes to the device. I am emailing with the author of the utility, hopefully he will be able to shed some light on the problem.
  • Steven
    Steven about 10 years
    I've seen that, but I think the functions key should be set as default now
  • Chas. Owens
    Chas. Owens about 10 years
    The media keys are still the default. So it works for you even after the error message?
  • Alexey Hariton
    Alexey Hariton over 8 years
    Answer above wont work on some K760 keyboards (at least at mine), so you have to change use constant HID_DEVICE_ID_K760 => -19690; to use constant HID_DEVICE_ID_K760 => -19688;
  • Chas. Owens
    Chas. Owens over 8 years
    @AlexeyHariton I have updated the code with the additional device id, please let me know if it works for you.