Skip to content

Instantly share code, notes, and snippets.

@andrejcremoznik
Last active June 13, 2024 14:04
Show Gist options
  • Save andrejcremoznik/e56234138305226abd41fe4d1d2561a3 to your computer and use it in GitHub Desktop.
Save andrejcremoznik/e56234138305226abd41fe4d1d2561a3 to your computer and use it in GitHub Desktop.
Logitech K780 switch media and function keys on linux

Media/function keys on K780

K780 doesn't have a hard switch to lock the function keys. Logitech provides a utility to do this on Windows and iOS but not on Linux. You need to manually remap the keys.

Below works for Arch Linux, other systemd based distros should be about the same.

There's a problem with the F1-F3 keys as they're hardware specific and don't emit an event if pressed on their own and therefore can't be remapped. I might be wrong as I haven't spend any time on researching that.

Edit: about htat, see @tangruize comments below https://gist.github.com/andrejcremoznik/e56234138305226abd41fe4d1d2561a3#gistcomment-3390489

Create file /etc/udev/hwdb.d/95-k780.hwdb

# Logitech K780 map:
# Fn + F4/F5/F6 ==> F4/F5/F6
evdev:input:b0003v046Dp405B*
  KEYBOARD_KEY_c0223=f4
  KEYBOARD_KEY_70065=f5
  KEYBOARD_KEY_c0224=f6

Rebuild hwdb.bin and apply new keys

sudo systemd-hwdb update
sudo udevadm trigger

Make permanent

Make sure the ConditionNeedsUpdate=/etc is commented out in /usr/lib/systemd/system/systemd-hwdb-update.service. If it isn't create an override:

sudo systemctl edit --full systemd-hwdb-update.service

Comment out:
#ConditionNeedsUpdate=/etc

This creates a replacement systemd unit file in /etc/systemd/system/systemd-hwdb-update.service. If some update breaks anything related to this, remove it and recreate with systemctl edit like before.

Read more

@Roman2K
Copy link

Roman2K commented Jul 17, 2022

@tangruize Thanks for this concise solution and all the work that lead to it. Working perfectly for me!

I created an Arch PKGBUILD for it: Roman2K/arch-k780-fnkey

@tangruize
Copy link

The $SCRIPT_FILE can be simplified:
...

SUBSYSTEM=="hidraw", ACTION=="add", RUN+="$SCRIPT_FILE $name"

I found that it doesn't work sometimes (for bluetooth), and I improved it:

Delete the above rule and script file, and append below contents to /etc/udev/rules.d/00-k780.rules:

ACTION=="bind", KERNEL=="0005:046D:B33B*", SUBSYSTEM=="hid", RUN+="/bin/bash -c 'printf \"\x11\xff\x0c\x1d\" | cat - /dev/zero | dd of=/dev/$$(ls $$0/hidraw) count=20 iflag=count_bytes oflag=nonblock' %S%p"

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment