houmain / keymapper

A cross-platform context-aware key remapper.
GNU General Public License v3.0
319 stars 25 forks source link

Keymapper stops working after some time, but only for class specific mappings #41

Closed mark2185 closed 9 months ago

mark2185 commented 2 years ago

I've had this issue for a while and now I've narrowed it down to only class specific abstract mappings.

E.g. I have things like these

# default mappings for abstract commands
  next_tab >> Ctrl{E}
  prev_tab >> Ctrl{Q}
  delete_word >> Ctrl{Backspace}

And then, in specific class names, I remap them

[class=/brave-browser|Navigator|chromium|google-chrome|betterbird|firefox/]
  next_tab >> Ctrl{Tab}
  prev_tab >> Ctrl{Shift{Tab}}

  Ext{1} >> Ctrl{1}
  Ext{2} >> Ctrl{2}
  Ext{3} >> Ctrl{3}

[class="guake"]
  next_tab >> Ctrl{PageDown}
  prev_tab >> Ctrl{PageUp}
  delete_word >> Ctrl{D}

But at some point in time (I'm not sure if it's timed with waking up from sleep, but if it is, it's not consistent) only the abstract command mappings stop working, i.e. I cannot switch tabs in firefox with capslock-e, but can jump to the first tab with capslock-1.

The capslock is also an alias.

# aliases
  Ext   = CapsLock
  Ctrl  = Control

The problem is fixed either by restarting both keymapper and keymapperd, or putting the system to sleep and waking it up again.

What else can I provide? Sadly I cannot reproduce it consistently so I'm hoping you might have a better insight into what's wrong.

houmain commented 2 years ago

Thanks for the report. I have no clue yet. Does it happen on Windows or Linux (X11, Wayland / Gnome or another WM)?

mark2185 commented 2 years ago

Ah, sorry, forgot to add.

Linux, X11, i3-wm, built from latest master.

mark2185 commented 2 years ago

Additional information: it might coincide with 100% CPU usage.

RichardFevrier commented 2 years ago

I will check that too, it stopped to work after hours on my Fedora Silverblue

RichardFevrier commented 2 years ago

journalctl does not seem very verbose about that... 😐️

mark2185 commented 2 years ago

Welp, it happened to me an hour ago, and I didn't feel like restarting the daemon.

An hour later it miraculously started working again. :shrug:

houmain commented 2 years ago

@RichardFevrier are you using Wayland/Gnome?

RichardFevrier commented 2 years ago

Correct!

houmain commented 2 years ago

And also only mappings for a specific window class stopped working?

RichardFevrier commented 2 years ago

No I think the client crashed, but I have a specific window class in my config

RichardFevrier commented 2 years ago

Maybe not related to this issue tho

mark2185 commented 2 years ago

To add (may be relevant, I don't know) - at random times, the keymapper -u command pins one CPU core at 100%.

It's still working as one would expect, but I have no idea what causes it to hog so much CPU time, I've only now added the --verbose flag so I'll report back if it happens again.

houmain commented 2 years ago

Thanks! I have also seen this once. I suspected two running keymapper processes to cause the problems, but I could not reproduce it.

mark2185 commented 2 years ago

Happened again, the log looked "normal", just messages about switching focused windows, but there was a reasonable number of them.

Also there was only one keymapper process, confirmed by running pgrep -x keymapper.

houmain commented 1 year ago

Hi, I fixed two things in the Linux version which might have caused these problems. So please give the 2.4.0 release a try.

mark2185 commented 1 year ago

~I've been running it since then and now it's the second time it stopped working, both occurrences coincided with high CPU usage after which keymapper --update --verbose hogs up one core at 100%.~

~The log contains nothing except Detected focused window changed blocks, and they aren't false, I did switch between those windows.~

~I'll try to reproduce it in a virtual machine with 1 CPU and will get back to you.~

~EDIT: I tried restarting only keymapper, but ultimately I had to restart keymapperd for it to start working again.~

I had two clones of keymapper and I was running the wrong one these past 3 weeks, sorry for the noise. Feel free to delete this comment after reading, I'm leaving it just for clarification. I'll get back to you if this issue appears again.

mark2185 commented 1 year ago

Unfortunately, it still happens.

keymapper pins one CPU core at 100%, certain mappings stop working, and I have to kill it and keymapperd and restart it all to get it hopefully working.

Sometimes I don't feel like doing that so I just put the laptop to sleep and wake it up again, and that may or may not fix it.

mark2185 commented 1 year ago

It looks like just restarting keymapperd is enough.

I usually started fixing it by killing keymapper since it pinned one core, but today I went with stopping the daemon first, and the CPU usage dropped to 0% after that, and after starting it again, everything seems to work.

At least it's an easy fix until we get to the bottom of this.

houmain commented 11 months ago

Hi @mark2185 may I ask if you are still having issues with a current version? Thanks!

mark2185 commented 11 months ago

Now that you've mentioned it, I'm on 3.1.0 currently and don't remember hitting the same issue in these past few months (I have reinstalled OS tho).

I suggest that we close this issue, I'll update to 3.2.0 and if it starts happening again I'll reopen it :)

houmain commented 11 months ago

Great thanks!

mark2185 commented 10 months ago

Unfortunately it resurfaced, a few times in the last couple of days, luckily restarting keymapperd fixes the issue.

ristomatti commented 10 months ago

I'm also experiencing this or something related. I've noticed it pretty much every morning after unlocking my computer, but also occasionally while I'm working. It doesn't reproduce simply by locking/unlocking though. I haven't yet checked if either of the processes is eating a lot of CPU, I'll check if this is the case when it happens the next time.

Some possibly relevant notes:

houmain commented 10 months ago

Hi, I just fixed a problem, when two keymapper instances were running. The context updates of the second instance were not processed by keymapperd and so the send buffer could fill up until it began to busy loop... Now it knows that it is not connected.

I could not reproduce it with one process yet. Maybe keymapperd still thinks that the lock-key is still pressed and therefore does not process any context updates. I need to do some more testing.

@ristomatti, wow your configuration is really impressive!

ristomatti commented 10 months ago

I'm pretty confident I only had a single instance. After my comment, I ran keymapper -u -v foreground to see if it would give some hints. It didn't took long for the bug to reproduce. I just had to go to get some groceries.

There was nothing on the verbose logs though, I didn't yet try with keymapperd on verbose though. System journal indicated my keyboard had disconnected and reconnected but I then remembered I disconnected it myself to charge another device. I've now built the latest version, I'll report back on the results.

Also, thanks for the kind words! I've been planning to post the config or some snippets of it on the discussion section at a later time. Keymapper has been very inspiring to say the least! It's also great for avoiding real work too... :sweat_smile:

ristomatti commented 10 months ago

Actually, I just found at least one way to reproduce the same behavior. Both my Keychron keyboards show up with different names depending on how they're connected:

# USB-cable
$ xinput list | grep K15
⎜   ↳ Keychron Keychron K15 Pro Consumer Control    id=32   [slave  pointer  (2)]
⎜   ↳ Keychron Keychron K15 Pro Mouse           id=37   [slave  pointer  (2)]
    ↳ Keychron Keychron K15 Pro                 id=20   [slave  keyboard (3)]
    ↳ Keychron Keychron K15 Pro System Control  id=23   [slave  keyboard (3)]
    ↳ Keychron Keychron K15 Pro Keyboard        id=24   [slave  keyboard (3)]
    ↳ Keychron Keychron K15 Pro Consumer Control    id=36   [slave  keyboard (3)]

# Bluetooth
$ xinput list | grep K15
⎜   ↳ Keychron K15 Pro Keyboard                 id=9    [slave  pointer  (2)]
⎜   ↳ Keychron K15 Pro Mouse                    id=17   [slave  pointer  (2)]
    ↳ Keychron K15 Pro Keyboard                 id=10   [slave  keyboard (3)]

Due to this behavior, I use a regex to match it:

[device=/Keychron K15 Pro Keyboard/]
  # ...

If I change from USB to Bluetooth or vice versa, the mappings stop working. So technically it's not the same device in this case, but should this work regardless? Typically I've had it on cable all the time, so there's something else going on though.

houmain commented 10 months ago

So technically it's not the same device in this case, but should this work regardless?

Yes, multiple devices with identical names should not cause problems. Maybe you can start keymapperd with -v and check if the devices are un/grabbed as expected when plugging in/out.

ristomatti commented 10 months ago

Will definitely do that, but it might take a while until I come back to this. Experimenting with keymapper is "somewhat" addicting. I'll need to focus a bit on actual work for a change. :grin:

Have you noticed #97 btw? I think I ran to another possibly related issue today with virtual modifiers and abstract commands. I managed to hack together an emulation of QMK's "Auto Shift" feature, then made it toggleable together with the config that allows me to write umlauts in a convenient manner. I then realized it'd be useful to somehow see when either is active. In the latest revisions of my config you'll see the initial implementation of the indicators. The indicators are shown on my i3wm status bar:

image

In the latest With this revision, I attempted to reduce the config required for the indicators but ran into odd issue and had to just work around with lots of trial and error. I'm wondering if I've misunderstood how the config is processed or if I ran across some bugs. To explain them, I'd need too recreate them as I've already deleted the parts. That will be some later time.

But briefly, I had added two sections at the end of the file. Something like this:

[modifier="!AutoShift"]
  toggle_autoshift >> $(show_indicator) ^ AutoShift

[modifier="AutoShift"]
  toggle_autoshift >> $(hide_indicator) ^ AutoShift

This toggled the feature correctly, but regardless of the state of AutoShift, keymapper would always call the script on the lower blow. So the indicator was either always on or off.

Mainly I'd appreciate to know if I'm attempting to pull of things that aren't implemented and just happen to work by accident...

ristomatti commented 10 months ago

I ended up trying at least the previously mentioned repro by switching between USB and Bluetooth.

Disconnect USB while mappings are working

Jan 11 23:31:21 x1e keymapperd[1113366]: Updating device list
Jan 11 23:31:21 x1e keymapperd[1113366]: Ignoring device event6 'Keymapper'
Jan 11 23:31:21 x1e keymapperd[1113366]: Ignoring device event19 'sof-hda-dsp Headphone'
Jan 11 23:31:21 x1e keymapperd[1113366]: Ignoring device event18 'sof-hda-dsp Mic'
Jan 11 23:31:21 x1e keymapperd[1113366]: Ignoring device event15 'HDA NVidia HDMI/DP,pcm=11'
Jan 11 23:31:21 x1e keymapperd[1113366]: Ignoring device event14 'HDA NVidia HDMI/DP,pcm=10'
Jan 11 23:31:21 x1e keymapperd[1113366]: Ignoring device event13 'HDA NVidia HDMI/DP,pcm=9'
Jan 11 23:31:21 x1e keymapperd[1113366]: Ignoring device event12 'HDA NVidia HDMI/DP,pcm=8'
Jan 11 23:31:21 x1e keymapperd[1113366]: Ignoring device event11 'HDA NVidia HDMI/DP,pcm=7'
Jan 11 23:31:21 x1e keymapperd[1113366]: Ignoring device event10 'HDA NVidia HDMI/DP,pcm=3'
Jan 11 23:31:22 x1e keymapperd[1113366]: Ignoring device event5 'SynPS/2 Synaptics TouchPad'
Jan 11 23:31:22 x1e keymapperd[1113366]: Ignoring device event1 'Lid Switch'
Jan 11 23:31:22 x1e keymapperd[1113366]: Ungrabbed device event22
Jan 11 23:31:22 x1e keymapperd[1113366]: Updating device list
Jan 11 23:31:22 x1e keymapperd[1113366]: Ignoring device event6 'Keymapper'
Jan 11 23:31:22 x1e keymapperd[1113366]: Ignoring device event19 'sof-hda-dsp Headphone'
Jan 11 23:31:22 x1e keymapperd[1113366]: Ignoring device event18 'sof-hda-dsp Mic'
Jan 11 23:31:22 x1e keymapperd[1113366]: Ignoring device event15 'HDA NVidia HDMI/DP,pcm=11'
Jan 11 23:31:22 x1e keymapperd[1113366]: Ignoring device event14 'HDA NVidia HDMI/DP,pcm=10'
Jan 11 23:31:22 x1e keymapperd[1113366]: Ignoring device event13 'HDA NVidia HDMI/DP,pcm=9'
Jan 11 23:31:22 x1e keymapperd[1113366]: Ignoring device event12 'HDA NVidia HDMI/DP,pcm=8'
Jan 11 23:31:22 x1e keymapperd[1113366]: Ignoring device event11 'HDA NVidia HDMI/DP,pcm=7'
Jan 11 23:31:22 x1e keymapperd[1113366]: Ignoring device event10 'HDA NVidia HDMI/DP,pcm=3'
Jan 11 23:31:22 x1e keymapperd[1113366]: Ignoring device event5 'SynPS/2 Synaptics TouchPad'
Jan 11 23:31:23 x1e keymapperd[1113366]: Ignoring device event1 'Lid Switch'
Jan 11 23:31:23 x1e keymapperd[1113366]: Ungrabbed device event258
Jan 11 23:31:23 x1e keymapperd[1113366]: Ungrabbed device event30
Jan 11 23:31:23 x1e keymapperd[1113366]: Ungrabbed device event25
Jan 11 23:31:23 x1e keymapperd[1113366]: Ungrabbed device event24

Reconnect USB -> mappings still work

Jan 11 23:32:25 x1e keymapperd[1113366]: Updating device list
Jan 11 23:32:25 x1e keymapperd[1113366]: Grabbed device event22 'Keychron Keychron K15 Pro'
Jan 11 23:32:25 x1e keymapperd[1113366]: Ignoring device event6 'Keymapper'
Jan 11 23:32:26 x1e keymapperd[1113366]: Ignoring device event19 'sof-hda-dsp Headphone'
Jan 11 23:32:26 x1e keymapperd[1113366]: Ignoring device event18 'sof-hda-dsp Mic'
Jan 11 23:32:26 x1e keymapperd[1113366]: Ignoring device event15 'HDA NVidia HDMI/DP,pcm=11'
Jan 11 23:32:26 x1e keymapperd[1113366]: Ignoring device event14 'HDA NVidia HDMI/DP,pcm=10'
Jan 11 23:32:26 x1e keymapperd[1113366]: Ignoring device event13 'HDA NVidia HDMI/DP,pcm=9'
Jan 11 23:32:26 x1e keymapperd[1113366]: Ignoring device event12 'HDA NVidia HDMI/DP,pcm=8'
Jan 11 23:32:26 x1e keymapperd[1113366]: Ignoring device event11 'HDA NVidia HDMI/DP,pcm=7'
Jan 11 23:32:26 x1e keymapperd[1113366]: Ignoring device event10 'HDA NVidia HDMI/DP,pcm=3'
Jan 11 23:32:26 x1e keymapperd[1113366]: Ignoring device event5 'SynPS/2 Synaptics TouchPad'
Jan 11 23:32:26 x1e keymapperd[1113366]: Ignoring device event1 'Lid Switch'
Jan 11 23:32:26 x1e keymapperd[1113366]: Updating device list
Jan 11 23:32:26 x1e keymapperd[1113366]: Grabbed device event258 'Keychron Keychron K15 Pro Keyboard'
Jan 11 23:32:26 x1e keymapperd[1113366]: Grabbed device event30 'Keychron Keychron K15 Pro Consumer Control'
Jan 11 23:32:26 x1e keymapperd[1113366]: Grabbed device event25 'Keychron Keychron K15 Pro System Control'
Jan 11 23:32:26 x1e keymapperd[1113366]: Grabbed device event24 'Keychron Keychron K15 Pro Mouse'
Jan 11 23:32:26 x1e keymapperd[1113366]: Ignoring device event6 'Keymapper'
Jan 11 23:32:26 x1e keymapperd[1113366]: Ignoring device event19 'sof-hda-dsp Headphone'
Jan 11 23:32:26 x1e keymapperd[1113366]: Ignoring device event18 'sof-hda-dsp Mic'
Jan 11 23:32:26 x1e keymapperd[1113366]: Ignoring device event15 'HDA NVidia HDMI/DP,pcm=11'
Jan 11 23:32:26 x1e keymapperd[1113366]: Ignoring device event14 'HDA NVidia HDMI/DP,pcm=10'
Jan 11 23:32:26 x1e keymapperd[1113366]: Ignoring device event13 'HDA NVidia HDMI/DP,pcm=9'
Jan 11 23:32:27 x1e keymapperd[1113366]: Ignoring device event12 'HDA NVidia HDMI/DP,pcm=8'
Jan 11 23:32:27 x1e keymapperd[1113366]: Ignoring device event11 'HDA NVidia HDMI/DP,pcm=7'
Jan 11 23:32:27 x1e keymapperd[1113366]: Ignoring device event10 'HDA NVidia HDMI/DP,pcm=3'
Jan 11 23:32:27 x1e keymapperd[1113366]: Ignoring device event5 'SynPS/2 Synaptics TouchPad'
Jan 11 23:32:27 x1e keymapperd[1113366]: Ignoring device event1 'Lid Switch'

Disconnect USB, then reconnect via Bluetooth -> mappings stop working

Jan 11 23:34:52 x1e keymapperd[1113366]: Updating device list
Jan 11 23:34:52 x1e keymapperd[1113366]: Grabbed device event22 'Keychron K15 Pro Keyboard'
Jan 11 23:34:52 x1e keymapperd[1113366]: Ignoring device event6 'Keymapper'
Jan 11 23:34:53 x1e keymapperd[1113366]: Ignoring device event19 'sof-hda-dsp Headphone'
Jan 11 23:34:53 x1e keymapperd[1113366]: Ignoring device event18 'sof-hda-dsp Mic'
Jan 11 23:34:53 x1e keymapperd[1113366]: Ignoring device event15 'HDA NVidia HDMI/DP,pcm=11'
Jan 11 23:34:53 x1e keymapperd[1113366]: Ignoring device event14 'HDA NVidia HDMI/DP,pcm=10'
Jan 11 23:34:53 x1e keymapperd[1113366]: Ignoring device event13 'HDA NVidia HDMI/DP,pcm=9'
Jan 11 23:34:53 x1e keymapperd[1113366]: Ignoring device event12 'HDA NVidia HDMI/DP,pcm=8'
Jan 11 23:34:53 x1e keymapperd[1113366]: Ignoring device event11 'HDA NVidia HDMI/DP,pcm=7'
Jan 11 23:34:53 x1e keymapperd[1113366]: Ignoring device event10 'HDA NVidia HDMI/DP,pcm=3'
Jan 11 23:34:53 x1e keymapperd[1113366]: Ignoring device event5 'SynPS/2 Synaptics TouchPad'
Jan 11 23:34:53 x1e keymapperd[1113366]: Ignoring device event1 'Lid Switch'
Jan 11 23:34:53 x1e keymapperd[1113366]: Updating device list
Jan 11 23:34:53 x1e keymapperd[1113366]: Grabbed device event24 'Keychron K15 Pro Mouse'
Jan 11 23:34:53 x1e keymapperd[1113366]: Ignoring device event6 'Keymapper'
Jan 11 23:34:53 x1e keymapperd[1113366]: Ignoring device event19 'sof-hda-dsp Headphone'
Jan 11 23:34:53 x1e keymapperd[1113366]: Ignoring device event18 'sof-hda-dsp Mic'
Jan 11 23:34:54 x1e keymapperd[1113366]: Ignoring device event15 'HDA NVidia HDMI/DP,pcm=11'
Jan 11 23:34:54 x1e keymapperd[1113366]: Ignoring device event14 'HDA NVidia HDMI/DP,pcm=10'
Jan 11 23:34:54 x1e keymapperd[1113366]: Ignoring device event13 'HDA NVidia HDMI/DP,pcm=9'
Jan 11 23:34:54 x1e keymapperd[1113366]: Ignoring device event12 'HDA NVidia HDMI/DP,pcm=8'
Jan 11 23:34:54 x1e keymapperd[1113366]: Ignoring device event11 'HDA NVidia HDMI/DP,pcm=7'
Jan 11 23:34:54 x1e keymapperd[1113366]: Ignoring device event10 'HDA NVidia HDMI/DP,pcm=3'
Jan 11 23:34:54 x1e keymapperd[1113366]: Ignoring device event5 'SynPS/2 Synaptics TouchPad'
Jan 11 23:34:54 x1e keymapperd[1113366]: Ignoring device event1 'Lid Switch'

touch the config file, nothing gets logged but the mappings start working again.


Disconnect Bluetooth by powering the device off while mappings still work

Jan 11 23:42:25 x1e keymapperd[1113366]: Received contexts (10)
Jan 11 23:42:25 x1e keymapperd[1113366]: Received contexts (11)
Jan 11 23:42:28 x1e keymapperd[1113366]: Updating device list
Jan 11 23:42:28 x1e keymapperd[1113366]: Ignoring device event6 'Keymapper'
Jan 11 23:42:28 x1e keymapperd[1113366]: Ignoring device event19 'sof-hda-dsp Headphone'
Jan 11 23:42:28 x1e keymapperd[1113366]: Ignoring device event18 'sof-hda-dsp Mic'
Jan 11 23:42:28 x1e keymapperd[1113366]: Ignoring device event15 'HDA NVidia HDMI/DP,pcm=11'
Jan 11 23:42:28 x1e keymapperd[1113366]: Ignoring device event14 'HDA NVidia HDMI/DP,pcm=10'
Jan 11 23:42:28 x1e keymapperd[1113366]: Ignoring device event13 'HDA NVidia HDMI/DP,pcm=9'
Jan 11 23:42:28 x1e keymapperd[1113366]: Ignoring device event12 'HDA NVidia HDMI/DP,pcm=8'
Jan 11 23:42:28 x1e keymapperd[1113366]: Ignoring device event11 'HDA NVidia HDMI/DP,pcm=7'
Jan 11 23:42:28 x1e keymapperd[1113366]: Ignoring device event10 'HDA NVidia HDMI/DP,pcm=3'
Jan 11 23:42:28 x1e keymapperd[1113366]: Ignoring device event5 'SynPS/2 Synaptics TouchPad'
Jan 11 23:42:29 x1e keymapperd[1113366]: Ignoring device event1 'Lid Switch'
Jan 11 23:42:29 x1e keymapperd[1113366]: Ungrabbed device event22
Jan 11 23:42:29 x1e keymapperd[1113366]: Updating device list
Jan 11 23:42:29 x1e keymapperd[1113366]: Ignoring device event6 'Keymapper'
Jan 11 23:42:29 x1e keymapperd[1113366]: Ignoring device event19 'sof-hda-dsp Headphone'
Jan 11 23:42:29 x1e keymapperd[1113366]: Ignoring device event18 'sof-hda-dsp Mic'
Jan 11 23:42:29 x1e keymapperd[1113366]: Ignoring device event15 'HDA NVidia HDMI/DP,pcm=11'
Jan 11 23:42:29 x1e keymapperd[1113366]: Ignoring device event14 'HDA NVidia HDMI/DP,pcm=10'
Jan 11 23:42:29 x1e keymapperd[1113366]: Ignoring device event13 'HDA NVidia HDMI/DP,pcm=9'
Jan 11 23:42:29 x1e keymapperd[1113366]: Ignoring device event12 'HDA NVidia HDMI/DP,pcm=8'
Jan 11 23:42:29 x1e keymapperd[1113366]: Ignoring device event11 'HDA NVidia HDMI/DP,pcm=7'
Jan 11 23:42:29 x1e keymapperd[1113366]: Ignoring device event10 'HDA NVidia HDMI/DP,pcm=3'
Jan 11 23:42:29 x1e keymapperd[1113366]: Ignoring device event5 'SynPS/2 Synaptics TouchPad'
Jan 11 23:42:29 x1e keymapperd[1113366]: Ignoring device event1 'Lid Switch'
Jan 11 23:42:29 x1e keymapperd[1113366]: Ungrabbed device event24

Reconnect via USB -> mappings again working

Jan 11 23:42:25 x1e keymapperd[1113366]: Received contexts (10)
Jan 11 23:42:25 x1e keymapperd[1113366]: Received contexts (11)
Jan 11 23:42:28 x1e keymapperd[1113366]: Updating device list
Jan 11 23:42:28 x1e keymapperd[1113366]: Ignoring device event6 'Keymapper'
Jan 11 23:42:28 x1e keymapperd[1113366]: Ignoring device event19 'sof-hda-dsp Headphone'
Jan 11 23:42:28 x1e keymapperd[1113366]: Ignoring device event18 'sof-hda-dsp Mic'
Jan 11 23:42:28 x1e keymapperd[1113366]: Ignoring device event15 'HDA NVidia HDMI/DP,pcm=11'
Jan 11 23:42:28 x1e keymapperd[1113366]: Ignoring device event14 'HDA NVidia HDMI/DP,pcm=10'
Jan 11 23:42:28 x1e keymapperd[1113366]: Ignoring device event13 'HDA NVidia HDMI/DP,pcm=9'
Jan 11 23:42:28 x1e keymapperd[1113366]: Ignoring device event12 'HDA NVidia HDMI/DP,pcm=8'
Jan 11 23:42:28 x1e keymapperd[1113366]: Ignoring device event11 'HDA NVidia HDMI/DP,pcm=7'
Jan 11 23:42:28 x1e keymapperd[1113366]: Ignoring device event10 'HDA NVidia HDMI/DP,pcm=3'
Jan 11 23:42:28 x1e keymapperd[1113366]: Ignoring device event5 'SynPS/2 Synaptics TouchPad'
Jan 11 23:42:29 x1e keymapperd[1113366]: Ignoring device event1 'Lid Switch'
Jan 11 23:42:29 x1e keymapperd[1113366]: Ungrabbed device event22
Jan 11 23:42:29 x1e keymapperd[1113366]: Updating device list
Jan 11 23:42:29 x1e keymapperd[1113366]: Ignoring device event6 'Keymapper'
Jan 11 23:42:29 x1e keymapperd[1113366]: Ignoring device event19 'sof-hda-dsp Headphone'
Jan 11 23:42:29 x1e keymapperd[1113366]: Ignoring device event18 'sof-hda-dsp Mic'
Jan 11 23:42:29 x1e keymapperd[1113366]: Ignoring device event15 'HDA NVidia HDMI/DP,pcm=11'
Jan 11 23:42:29 x1e keymapperd[1113366]: Ignoring device event14 'HDA NVidia HDMI/DP,pcm=10'
Jan 11 23:42:29 x1e keymapperd[1113366]: Ignoring device event13 'HDA NVidia HDMI/DP,pcm=9'
Jan 11 23:42:29 x1e keymapperd[1113366]: Ignoring device event12 'HDA NVidia HDMI/DP,pcm=8'
Jan 11 23:42:29 x1e keymapperd[1113366]: Ignoring device event11 'HDA NVidia HDMI/DP,pcm=7'
Jan 11 23:42:29 x1e keymapperd[1113366]: Ignoring device event10 'HDA NVidia HDMI/DP,pcm=3'
Jan 11 23:42:29 x1e keymapperd[1113366]: Ignoring device event5 'SynPS/2 Synaptics TouchPad'
Jan 11 23:42:29 x1e keymapperd[1113366]: Ignoring device event1 'Lid Switch'
Jan 11 23:42:29 x1e keymapperd[1113366]: Ungrabbed device event24

I then followed with disconnect and reconnect USB -> mappings still worked, logs skipped.


Disconnect USB and connect via Bluetooth -> mappings still work

Jan 11 23:47:13 x1e keymapperd[1113366]: Updating device list
Jan 11 23:47:13 x1e keymapperd[1113366]: Grabbed device event22 'Keychron K15 Pro Keyboard'
Jan 11 23:47:13 x1e keymapperd[1113366]: Ignoring device event6 'Keymapper'
Jan 11 23:47:14 x1e keymapperd[1113366]: Ignoring device event19 'sof-hda-dsp Headphone'
Jan 11 23:47:14 x1e keymapperd[1113366]: Ignoring device event18 'sof-hda-dsp Mic'
Jan 11 23:47:14 x1e keymapperd[1113366]: Ignoring device event15 'HDA NVidia HDMI/DP,pcm=11'
Jan 11 23:47:14 x1e keymapperd[1113366]: Ignoring device event14 'HDA NVidia HDMI/DP,pcm=10'
Jan 11 23:47:14 x1e keymapperd[1113366]: Ignoring device event13 'HDA NVidia HDMI/DP,pcm=9'
Jan 11 23:47:14 x1e keymapperd[1113366]: Ignoring device event12 'HDA NVidia HDMI/DP,pcm=8'
Jan 11 23:47:14 x1e keymapperd[1113366]: Ignoring device event11 'HDA NVidia HDMI/DP,pcm=7'
Jan 11 23:47:14 x1e keymapperd[1113366]: Ignoring device event10 'HDA NVidia HDMI/DP,pcm=3'
Jan 11 23:47:14 x1e keymapperd[1113366]: Ignoring device event5 'SynPS/2 Synaptics TouchPad'
Jan 11 23:47:14 x1e keymapperd[1113366]: Ignoring device event1 'Lid Switch'
Jan 11 23:47:14 x1e keymapperd[1113366]: Updating device list
Jan 11 23:47:14 x1e keymapperd[1113366]: Grabbed device event24 'Keychron K15 Pro Mouse'
Jan 11 23:47:14 x1e keymapperd[1113366]: Ignoring device event6 'Keymapper'
Jan 11 23:47:15 x1e keymapperd[1113366]: Ignoring device event19 'sof-hda-dsp Headphone'
Jan 11 23:47:15 x1e keymapperd[1113366]: Ignoring device event18 'sof-hda-dsp Mic'
Jan 11 23:47:15 x1e keymapperd[1113366]: Ignoring device event15 'HDA NVidia HDMI/DP,pcm=11'
Jan 11 23:47:15 x1e keymapperd[1113366]: Ignoring device event14 'HDA NVidia HDMI/DP,pcm=10'
Jan 11 23:47:15 x1e keymapperd[1113366]: Ignoring device event13 'HDA NVidia HDMI/DP,pcm=9'
Jan 11 23:47:15 x1e keymapperd[1113366]: Ignoring device event12 'HDA NVidia HDMI/DP,pcm=8'
Jan 11 23:47:15 x1e keymapperd[1113366]: Ignoring device event11 'HDA NVidia HDMI/DP,pcm=7'
Jan 11 23:47:15 x1e keymapperd[1113366]: Ignoring device event10 'HDA NVidia HDMI/DP,pcm=3'
Jan 11 23:47:15 x1e keymapperd[1113366]: Ignoring device event5 'SynPS/2 Synaptics TouchPad'
Jan 11 23:47:15 x1e keymapperd[1113366]: Ignoring device event1 'Lid Switch'
ristomatti commented 10 months ago

I diffed the log of the earlier failed reconnect via Bluetooth after USB and this later properly working one. I can't spot anything different.. 🤔

image

ristomatti commented 10 months ago

Is there any way to enable more verbose logging? I now tried swapping from Bluetooth to USB quicker, while the BT still seems to be connected. Mappings persisted.

ristomatti commented 10 months ago

Hmm. I realized on the first try (when the issue reproduced), I had keymapper running with --verbose. I tried again:

  1. Disconnect USB, reconnect via Bluetooth -> mappings broke
  2. Touch config file -> mappings resume
  3. Disconnect Bluetooth, reconnect via USB -> mappings broke
  4. Wait a few seconds -> mappings resume (without touching the config file)

Log of the full sequence, annotated with the events (hopefully correctly):


### Restart keymapper with --verbose ###

Jan 12 00:03:39 x1e keymapperd[1113366]: Connection to keymapper reset
Jan 12 00:03:39 x1e keymapperd[1113366]: Ungrabbing all devices
Jan 12 00:03:41 x1e keymapperd[1113366]: ---------------
Jan 12 00:03:41 x1e keymapperd[1113366]: Waiting for keymapper to connect
Jan 12 00:03:46 x1e keymapperd[1113366]: Updating device list
Jan 12 00:03:47 x1e keymapperd[1113366]: Grabbed device event260 'Keychron Keychron K15 Pro Keyboard'
Jan 12 00:03:47 x1e keymapperd[1113366]: Grabbed device event259 'Keychron Keychron K15 Pro Consumer Control'
Jan 12 00:03:47 x1e keymapperd[1113366]: Grabbed device event258 'Keychron Keychron K15 Pro System Control'
Jan 12 00:03:47 x1e keymapperd[1113366]: Grabbed device event30 'Keychron Keychron K15 Pro Mouse'
Jan 12 00:03:47 x1e keymapperd[1113366]: Grabbed device event25 'Keychron Keychron K15 Pro'
Jan 12 00:03:47 x1e keymapperd[1113366]: Grabbed device event29 'MX Anywhere 2S Mouse'
Jan 12 00:03:47 x1e keymapperd[1113366]: Grabbed device event21 'MX Anywhere 2S Keyboard'
Jan 12 00:03:47 x1e keymapperd[1113366]: Grabbed device event20 'WH-1000XM3 (AVRCP)'
Jan 12 00:03:47 x1e keymapperd[1113366]: Grabbed device event23 'Generic Blue Microphones'
Jan 12 00:03:47 x1e keymapperd[1113366]: Grabbed device event7 'Generic Blue Microphones Consumer Control'
Jan 12 00:03:47 x1e keymapperd[1113366]: Grabbed device event257 'MX Anywhere 2S Mouse'
Jan 12 00:03:47 x1e keymapperd[1113366]: Grabbed device event256 'MX Anywhere 2S Keyboard'
Jan 12 00:03:47 x1e keymapperd[1113366]: Grabbed device event26 'Lenovo ThinkPad Thunderbolt 3 Dock USB Audio'
Jan 12 00:03:47 x1e keymapperd[1113366]: Grabbed device event31 'Logitech Webcam C925e'
Jan 12 00:03:47 x1e keymapperd[1113366]: Grabbed device event28 'Logitech USB Receiver Keyboard'
Jan 12 00:03:47 x1e keymapperd[1113366]: Grabbed device event27 'Logitech USB Receiver'
Jan 12 00:03:47 x1e keymapperd[1113366]: Ignoring device event19 'sof-hda-dsp Headphone'
Jan 12 00:03:47 x1e keymapperd[1113366]: Ignoring device event18 'sof-hda-dsp Mic'
Jan 12 00:03:47 x1e keymapperd[1113366]: Grabbed device event17 'Integrated Camera: Integrated I'
Jan 12 00:03:47 x1e keymapperd[1113366]: Grabbed device event16 'Integrated Camera: Integrated C'
Jan 12 00:03:47 x1e keymapperd[1113366]: Ignoring device event15 'HDA NVidia HDMI/DP,pcm=11'
Jan 12 00:03:47 x1e keymapperd[1113366]: Ignoring device event14 'HDA NVidia HDMI/DP,pcm=10'
Jan 12 00:03:47 x1e keymapperd[1113366]: Ignoring device event13 'HDA NVidia HDMI/DP,pcm=9'
Jan 12 00:03:47 x1e keymapperd[1113366]: Ignoring device event12 'HDA NVidia HDMI/DP,pcm=8'
Jan 12 00:03:47 x1e keymapperd[1113366]: Ignoring device event11 'HDA NVidia HDMI/DP,pcm=7'
Jan 12 00:03:47 x1e keymapperd[1113366]: Ignoring device event10 'HDA NVidia HDMI/DP,pcm=3'
Jan 12 00:03:47 x1e keymapperd[1113366]: Grabbed device event9 'ThinkPad Extra Buttons'
Jan 12 00:03:47 x1e keymapperd[1113366]: Grabbed device event8 'TPPS/2 Elan TrackPoint'
Jan 12 00:03:47 x1e keymapperd[1113366]: Ignoring device event5 'SynPS/2 Synaptics TouchPad'
Jan 12 00:03:47 x1e keymapperd[1113366]: Grabbed device event4 'Video Bus'
Jan 12 00:03:47 x1e keymapperd[1113366]: Grabbed device event3 'AT Translated Set 2 keyboard'
Jan 12 00:03:47 x1e keymapperd[1113366]: Grabbed device event2 'Power Button'
Jan 12 00:03:47 x1e keymapperd[1113366]: Ignoring device event1 'Lid Switch'
Jan 12 00:03:47 x1e keymapperd[1113366]: Grabbed device event0 'Sleep Button'
Jan 12 00:03:47 x1e keymapperd[1113366]: Creating virtual device 'Keymapper'
Jan 12 00:03:47 x1e keymapperd[1113366]: Entering update loop
Jan 12 00:03:47 x1e keymapperd[1113366]: Updating device list
Jan 12 00:03:47 x1e keymapperd[1113366]: Ignoring device event6 'Keymapper'
Jan 12 00:03:47 x1e keymapperd[1113366]: Ignoring device event19 'sof-hda-dsp Headphone'
Jan 12 00:03:47 x1e keymapperd[1113366]: Ignoring device event18 'sof-hda-dsp Mic'
Jan 12 00:03:47 x1e keymapperd[1113366]: Ignoring device event15 'HDA NVidia HDMI/DP,pcm=11'
Jan 12 00:03:47 x1e keymapperd[1113366]: Ignoring device event14 'HDA NVidia HDMI/DP,pcm=10'
Jan 12 00:03:48 x1e keymapperd[1113366]: Ignoring device event13 'HDA NVidia HDMI/DP,pcm=9'
Jan 12 00:03:48 x1e keymapperd[1113366]: Ignoring device event12 'HDA NVidia HDMI/DP,pcm=8'
Jan 12 00:03:48 x1e keymapperd[1113366]: Ignoring device event11 'HDA NVidia HDMI/DP,pcm=7'
Jan 12 00:03:48 x1e keymapperd[1113366]: Ignoring device event10 'HDA NVidia HDMI/DP,pcm=3'
Jan 12 00:03:48 x1e keymapperd[1113366]: Ignoring device event5 'SynPS/2 Synaptics TouchPad'
Jan 12 00:03:48 x1e keymapperd[1113366]: Ignoring device event1 'Lid Switch'

### Disconnect USB ###

Jan 12 00:03:56 x1e keymapperd[1113366]: Updating device list
Jan 12 00:03:56 x1e keymapperd[1113366]: Ignoring device event6 'Keymapper'
Jan 12 00:03:56 x1e keymapperd[1113366]: Ignoring device event19 'sof-hda-dsp Headphone'
Jan 12 00:03:56 x1e keymapperd[1113366]: Ignoring device event18 'sof-hda-dsp Mic'
Jan 12 00:03:56 x1e keymapperd[1113366]: Ignoring device event15 'HDA NVidia HDMI/DP,pcm=11'
Jan 12 00:03:56 x1e keymapperd[1113366]: Ignoring device event14 'HDA NVidia HDMI/DP,pcm=10'
Jan 12 00:03:56 x1e keymapperd[1113366]: Ignoring device event13 'HDA NVidia HDMI/DP,pcm=9'
Jan 12 00:03:56 x1e keymapperd[1113366]: Ignoring device event12 'HDA NVidia HDMI/DP,pcm=8'
Jan 12 00:03:56 x1e keymapperd[1113366]: Ignoring device event11 'HDA NVidia HDMI/DP,pcm=7'
Jan 12 00:03:56 x1e keymapperd[1113366]: Ignoring device event10 'HDA NVidia HDMI/DP,pcm=3'
Jan 12 00:03:56 x1e keymapperd[1113366]: Ignoring device event5 'SynPS/2 Synaptics TouchPad'
Jan 12 00:03:57 x1e keymapperd[1113366]: Ignoring device event1 'Lid Switch'
Jan 12 00:03:57 x1e keymapperd[1113366]: Ungrabbed device event25
Jan 12 00:03:57 x1e keymapperd[1113366]: Updating device list
Jan 12 00:03:57 x1e keymapperd[1113366]: Ignoring device event6 'Keymapper'
Jan 12 00:03:57 x1e keymapperd[1113366]: Ignoring device event19 'sof-hda-dsp Headphone'
Jan 12 00:03:57 x1e keymapperd[1113366]: Ignoring device event18 'sof-hda-dsp Mic'
Jan 12 00:03:57 x1e keymapperd[1113366]: Ignoring device event15 'HDA NVidia HDMI/DP,pcm=11'
Jan 12 00:03:57 x1e keymapperd[1113366]: Ignoring device event14 'HDA NVidia HDMI/DP,pcm=10'
Jan 12 00:03:57 x1e keymapperd[1113366]: Ignoring device event13 'HDA NVidia HDMI/DP,pcm=9'
Jan 12 00:03:57 x1e keymapperd[1113366]: Ignoring device event12 'HDA NVidia HDMI/DP,pcm=8'
Jan 12 00:03:57 x1e keymapperd[1113366]: Ignoring device event11 'HDA NVidia HDMI/DP,pcm=7'
Jan 12 00:03:57 x1e keymapperd[1113366]: Ignoring device event10 'HDA NVidia HDMI/DP,pcm=3'
Jan 12 00:03:57 x1e keymapperd[1113366]: Ignoring device event5 'SynPS/2 Synaptics TouchPad'
Jan 12 00:03:57 x1e keymapperd[1113366]: Ignoring device event1 'Lid Switch'
Jan 12 00:03:58 x1e keymapperd[1113366]: Ungrabbed device event260
Jan 12 00:03:58 x1e keymapperd[1113366]: Ungrabbed device event259
Jan 12 00:03:58 x1e keymapperd[1113366]: Ungrabbed device event258
Jan 12 00:03:58 x1e keymapperd[1113366]: Ungrabbed device event30

### Reconnect via Bluetooth, here mappings stopped working ###

Jan 12 00:04:05 x1e keymapperd[1113366]: Updating device list
Jan 12 00:04:05 x1e keymapperd[1113366]: Grabbed device event22 'Keychron K15 Pro Keyboard'
Jan 12 00:04:05 x1e keymapperd[1113366]: Ignoring device event6 'Keymapper'
Jan 12 00:04:05 x1e keymapperd[1113366]: Ignoring device event19 'sof-hda-dsp Headphone'
Jan 12 00:04:05 x1e keymapperd[1113366]: Ignoring device event18 'sof-hda-dsp Mic'
Jan 12 00:04:05 x1e keymapperd[1113366]: Ignoring device event15 'HDA NVidia HDMI/DP,pcm=11'
Jan 12 00:04:05 x1e keymapperd[1113366]: Ignoring device event14 'HDA NVidia HDMI/DP,pcm=10'
Jan 12 00:04:05 x1e keymapperd[1113366]: Ignoring device event13 'HDA NVidia HDMI/DP,pcm=9'
Jan 12 00:04:05 x1e keymapperd[1113366]: Ignoring device event12 'HDA NVidia HDMI/DP,pcm=8'
Jan 12 00:04:05 x1e keymapperd[1113366]: Ignoring device event11 'HDA NVidia HDMI/DP,pcm=7'
Jan 12 00:04:05 x1e keymapperd[1113366]: Ignoring device event10 'HDA NVidia HDMI/DP,pcm=3'
Jan 12 00:04:05 x1e keymapperd[1113366]: Ignoring device event5 'SynPS/2 Synaptics TouchPad'
Jan 12 00:04:06 x1e keymapperd[1113366]: Ignoring device event1 'Lid Switch'
Jan 12 00:04:06 x1e keymapperd[1113366]: Updating device list
Jan 12 00:04:06 x1e keymapperd[1113366]: Grabbed device event24 'Keychron K15 Pro Mouse'
Jan 12 00:04:06 x1e keymapperd[1113366]: Ignoring device event6 'Keymapper'
Jan 12 00:04:06 x1e keymapperd[1113366]: Ignoring device event19 'sof-hda-dsp Headphone'
Jan 12 00:04:06 x1e keymapperd[1113366]: Ignoring device event18 'sof-hda-dsp Mic'
Jan 12 00:04:06 x1e keymapperd[1113366]: Ignoring device event15 'HDA NVidia HDMI/DP,pcm=11'
Jan 12 00:04:06 x1e keymapperd[1113366]: Ignoring device event14 'HDA NVidia HDMI/DP,pcm=10'
Jan 12 00:04:06 x1e keymapperd[1113366]: Ignoring device event13 'HDA NVidia HDMI/DP,pcm=9'
Jan 12 00:04:06 x1e keymapperd[1113366]: Ignoring device event12 'HDA NVidia HDMI/DP,pcm=8'
Jan 12 00:04:06 x1e keymapperd[1113366]: Ignoring device event11 'HDA NVidia HDMI/DP,pcm=7'
Jan 12 00:04:06 x1e keymapperd[1113366]: Ignoring device event10 'HDA NVidia HDMI/DP,pcm=3'
Jan 12 00:04:06 x1e keymapperd[1113366]: Ignoring device event5 'SynPS/2 Synaptics TouchPad'
Jan 12 00:04:06 x1e keymapperd[1113366]: Ignoring device event1 'Lid Switch'

### Reconnect via USB, without Bluetooth disconnect not yet noticed ###

Jan 12 00:05:40 x1e keymapperd[1113366]: Updating device list
Jan 12 00:05:40 x1e keymapperd[1113366]: Grabbed device event25 'Keychron Keychron K15 Pro'
Jan 12 00:05:40 x1e keymapperd[1113366]: Ignoring device event6 'Keymapper'
Jan 12 00:05:41 x1e keymapperd[1113366]: Ignoring device event19 'sof-hda-dsp Headphone'
Jan 12 00:05:41 x1e keymapperd[1113366]: Ignoring device event18 'sof-hda-dsp Mic'
Jan 12 00:05:41 x1e keymapperd[1113366]: Ignoring device event15 'HDA NVidia HDMI/DP,pcm=11'
Jan 12 00:05:41 x1e keymapperd[1113366]: Ignoring device event14 'HDA NVidia HDMI/DP,pcm=10'
Jan 12 00:05:41 x1e keymapperd[1113366]: Ignoring device event13 'HDA NVidia HDMI/DP,pcm=9'
Jan 12 00:05:41 x1e keymapperd[1113366]: Ignoring device event12 'HDA NVidia HDMI/DP,pcm=8'
Jan 12 00:05:41 x1e keymapperd[1113366]: Ignoring device event11 'HDA NVidia HDMI/DP,pcm=7'
Jan 12 00:05:41 x1e keymapperd[1113366]: Ignoring device event10 'HDA NVidia HDMI/DP,pcm=3'
Jan 12 00:05:41 x1e keymapperd[1113366]: Ignoring device event5 'SynPS/2 Synaptics TouchPad'
Jan 12 00:05:41 x1e keymapperd[1113366]: Ignoring device event1 'Lid Switch'
Jan 12 00:05:41 x1e keymapperd[1113366]: Updating device list
Jan 12 00:05:41 x1e keymapperd[1113366]: Grabbed device event260 'Keychron Keychron K15 Pro Keyboard'
Jan 12 00:05:41 x1e keymapperd[1113366]: Grabbed device event259 'Keychron Keychron K15 Pro Consumer Control'
Jan 12 00:05:41 x1e keymapperd[1113366]: Grabbed device event258 'Keychron Keychron K15 Pro System Control'
Jan 12 00:05:41 x1e keymapperd[1113366]: Grabbed device event30 'Keychron Keychron K15 Pro Mouse'
Jan 12 00:05:41 x1e keymapperd[1113366]: Ignoring device event6 'Keymapper'
Jan 12 00:05:42 x1e keymapperd[1113366]: Ignoring device event19 'sof-hda-dsp Headphone'
Jan 12 00:05:42 x1e keymapperd[1113366]: Ignoring device event18 'sof-hda-dsp Mic'
Jan 12 00:05:42 x1e keymapperd[1113366]: Ignoring device event15 'HDA NVidia HDMI/DP,pcm=11'
Jan 12 00:05:42 x1e keymapperd[1113366]: Ignoring device event14 'HDA NVidia HDMI/DP,pcm=10'
Jan 12 00:05:42 x1e keymapperd[1113366]: Ignoring device event13 'HDA NVidia HDMI/DP,pcm=9'
Jan 12 00:05:42 x1e keymapperd[1113366]: Ignoring device event12 'HDA NVidia HDMI/DP,pcm=8'
Jan 12 00:05:42 x1e keymapperd[1113366]: Ignoring device event11 'HDA NVidia HDMI/DP,pcm=7'
Jan 12 00:05:42 x1e keymapperd[1113366]: Ignoring device event10 'HDA NVidia HDMI/DP,pcm=3'
Jan 12 00:05:42 x1e keymapperd[1113366]: Ignoring device event5 'SynPS/2 Synaptics TouchPad'
Jan 12 00:05:42 x1e keymapperd[1113366]: Ignoring device event1 'Lid Switch'
Jan 12 00:05:47 x1e keymapperd[1113366]: Received contexts (10)

### Here Bluetooth disconnect is noticed ###

Jan 12 00:05:54 x1e keymapperd[1113366]: Updating device list
Jan 12 00:05:55 x1e keymapperd[1113366]: Opening device event24 failed
Jan 12 00:05:55 x1e keymapperd[1113366]: Ignoring device event6 'Keymapper'
Jan 12 00:05:55 x1e keymapperd[1113366]: Ignoring device event19 'sof-hda-dsp Headphone'
Jan 12 00:05:55 x1e keymapperd[1113366]: Ignoring device event18 'sof-hda-dsp Mic'
Jan 12 00:05:55 x1e keymapperd[1113366]: Ignoring device event15 'HDA NVidia HDMI/DP,pcm=11'
Jan 12 00:05:55 x1e keymapperd[1113366]: Ignoring device event14 'HDA NVidia HDMI/DP,pcm=10'
Jan 12 00:05:55 x1e keymapperd[1113366]: Ignoring device event13 'HDA NVidia HDMI/DP,pcm=9'
Jan 12 00:05:55 x1e keymapperd[1113366]: Ignoring device event12 'HDA NVidia HDMI/DP,pcm=8'
Jan 12 00:05:55 x1e keymapperd[1113366]: Ignoring device event11 'HDA NVidia HDMI/DP,pcm=7'
Jan 12 00:05:55 x1e keymapperd[1113366]: Ignoring device event10 'HDA NVidia HDMI/DP,pcm=3'
Jan 12 00:05:55 x1e keymapperd[1113366]: Ignoring device event5 'SynPS/2 Synaptics TouchPad'
Jan 12 00:05:55 x1e keymapperd[1113366]: Ignoring device event1 'Lid Switch'
Jan 12 00:05:55 x1e keymapperd[1113366]: Ungrabbed device event22
Jan 12 00:05:55 x1e keymapperd[1113366]: Ungrabbed device event24
Jan 12 00:05:55 x1e keymapperd[1113366]: Updating device list
Jan 12 00:05:56 x1e keymapperd[1113366]: Ignoring device event6 'Keymapper'
Jan 12 00:05:56 x1e keymapperd[1113366]: Ignoring device event19 'sof-hda-dsp Headphone'
Jan 12 00:05:56 x1e keymapperd[1113366]: Ignoring device event18 'sof-hda-dsp Mic'
Jan 12 00:05:56 x1e keymapperd[1113366]: Ignoring device event15 'HDA NVidia HDMI/DP,pcm=11'
Jan 12 00:05:56 x1e keymapperd[1113366]: Ignoring device event14 'HDA NVidia HDMI/DP,pcm=10'
Jan 12 00:05:56 x1e keymapperd[1113366]: Ignoring device event13 'HDA NVidia HDMI/DP,pcm=9'
Jan 12 00:05:56 x1e keymapperd[1113366]: Ignoring device event12 'HDA NVidia HDMI/DP,pcm=8'
Jan 12 00:05:56 x1e keymapperd[1113366]: Ignoring device event11 'HDA NVidia HDMI/DP,pcm=7'
Jan 12 00:05:56 x1e keymapperd[1113366]: Ignoring device event10 'HDA NVidia HDMI/DP,pcm=3'
Jan 12 00:05:56 x1e keymapperd[1113366]: Ignoring device event5 'SynPS/2 Synaptics TouchPad'
Jan 12 00:05:56 x1e keymapperd[1113366]: Ignoring device event1 'Lid Switch'
`
ristomatti commented 10 months ago

Likely not much use. I'd need some advice on how to assist further. Sadly my only "C++" experience is from intermediate hobby level Arduino snippets, in which all the actual low level parts are abstracted behind simplified libraries.

houmain commented 10 months ago

Thank you for your thorough tests! Ok, the grabbing seems to work as expected, good. I also tried un/plugging two keyboards with a basic configuration containing a context: [device=/Keyboard/] Unfortunately here the context's mappings never stopped working. I am thinking about whether the verbose logging can be improved somehow.

ristomatti commented 10 months ago

I am thinking about whether the verbose logging can be improved somehow.

In case you decide to add more verbose logging, it'd be very useful in debugging a config if you could see one or more of following:

Aside, I got slightly more useful logs from last night around 2h after locking the computer. At the very beginning there's Opening device event31 failed and at approx the same time, systemd journal shows a device has disconnected.

Jan 13 04:34:08 x1e acpid[2333]: input device has been disconnected, fd 30`

Further down, Keychron K15 is not listed when the devices get updated:

  Jan 13 04:34:08 x1e keymapperd[903649]: Updating device list
  Jan 13 04:34:08 x1e keymapperd[903649]: Ignoring device event29 'Keymapper'
  Jan 13 04:34:09 x1e keymapperd[903649]: Opening device event31 failed
  Jan 13 04:34:09 x1e keymapperd[903649]: Ignoring device event28 'sof-hda-dsp Headphone'
  Jan 13 04:34:09 x1e keymapperd[903649]: Ignoring device event27 'sof-hda-dsp Mic'
  Jan 13 04:34:09 x1e keymapperd[903649]: Ignoring device event23 'HDA NVidia HDMI/DP,pcm=11'
  Jan 13 04:34:09 x1e keymapperd[903649]: Ignoring device event22 'HDA NVidia HDMI/DP,pcm=10'
  Jan 13 04:34:09 x1e keymapperd[903649]: Ignoring device event21 'HDA NVidia HDMI/DP,pcm=9'
  Jan 13 04:34:09 x1e keymapperd[903649]: Ignoring device event20 'HDA NVidia HDMI/DP,pcm=8'
  Jan 13 04:34:09 x1e keymapperd[903649]: Ignoring device event19 'HDA NVidia HDMI/DP,pcm=7'
  Jan 13 04:34:09 x1e keymapperd[903649]: Ignoring device event18 'HDA NVidia HDMI/DP,pcm=3'
  Jan 13 04:34:09 x1e keymapperd[903649]: Ignoring device event5 'SynPS/2 Synaptics TouchPad'
  Jan 13 04:34:09 x1e keymapperd[903649]: Ignoring device event1 'Lid Switch'
  Jan 13 04:34:09 x1e keymapperd[903649]: Ungrabbed device event31
  Jan 13 04:34:09 x1e keymapperd[903649]: Ungrabbed device event30
  Jan 13 04:34:09 x1e keymapperd[903649]: Updating device list
  Jan 13 04:34:09 x1e keymapperd[903649]: Ignoring device event29 'Keymapper'
  Jan 13 04:34:09 x1e keymapperd[903649]: Ignoring device event28 'sof-hda-dsp Headphone'
  Jan 13 04:34:09 x1e keymapperd[903649]: Ignoring device event27 'sof-hda-dsp Mic'
  Jan 13 04:34:09 x1e keymapperd[903649]: Ignoring device event23 'HDA NVidia HDMI/DP,pcm=11'
  Jan 13 04:34:09 x1e keymapperd[903649]: Ignoring device event22 'HDA NVidia HDMI/DP,pcm=10'
  Jan 13 04:34:09 x1e keymapperd[903649]: Ignoring device event21 'HDA NVidia HDMI/DP,pcm=9'
  Jan 13 04:34:09 x1e keymapperd[903649]: Ignoring device event20 'HDA NVidia HDMI/DP,pcm=8'
  Jan 13 04:34:09 x1e keymapperd[903649]: Ignoring device event19 'HDA NVidia HDMI/DP,pcm=7'
  Jan 13 04:34:09 x1e keymapperd[903649]: Ignoring device event18 'HDA NVidia HDMI/DP,pcm=3'
  Jan 13 04:34:09 x1e keymapperd[903649]: Ignoring device event5 'SynPS/2 Synaptics TouchPad'
  Jan 13 04:34:10 x1e keymapperd[903649]: Ignoring device event1 'Lid Switch'

Today I could not wake the monitor from power saving mode from any input device. This is a fairly common issue I have with my USB-C dock. To recover I have to open the laptop lid, detach the dock cable and then reconnect it after first confirming the desktop comes up on the laptop then. After closing the lid I unlocked the desktop (typing my password on my Keychron). The key mappings didn't work. There's two Opening device eventX failed lines:

  Jan 13 16:29:25 x1e keymapperd[903649]: Updating device list
  Jan 13 16:29:25 x1e keymapperd[903649]: Grabbed device event30 'MX Anywhere 2S Keyboard'
  Jan 13 16:29:25 x1e keymapperd[903649]: Ignoring device event29 'Keymapper'
  Jan 13 16:29:25 x1e keymapperd[903649]: Ignoring device event28 'sof-hda-dsp Headphone'
  Jan 13 16:29:25 x1e keymapperd[903649]: Ignoring device event27 'sof-hda-dsp Mic'
  Jan 13 16:29:25 x1e keymapperd[903649]: Ignoring device event23 'HDA NVidia HDMI/DP,pcm=11'
  Jan 13 16:29:25 x1e keymapperd[903649]: Ignoring device event22 'HDA NVidia HDMI/DP,pcm=10'
  Jan 13 16:29:25 x1e keymapperd[903649]: Ignoring device event21 'HDA NVidia HDMI/DP,pcm=9'
  Jan 13 16:29:25 x1e keymapperd[903649]: Ignoring device event20 'HDA NVidia HDMI/DP,pcm=8'
  Jan 13 16:29:25 x1e keymapperd[903649]: Ignoring device event19 'HDA NVidia HDMI/DP,pcm=7'
  Jan 13 16:29:25 x1e keymapperd[903649]: Ignoring device event18 'HDA NVidia HDMI/DP,pcm=3'
  Jan 13 16:29:25 x1e keymapperd[903649]: Ignoring device event5 'SynPS/2 Synaptics TouchPad'
  Jan 13 16:29:25 x1e keymapperd[903649]: Ignoring device event1 'Lid Switch'
  Jan 13 16:29:25 x1e keymapperd[903649]: Updating device list
  Jan 13 16:29:25 x1e keymapperd[903649]: Grabbed device event31 'MX Anywhere 2S Mouse'
  Jan 13 16:29:25 x1e keymapperd[903649]: Ignoring device event29 'Keymapper'
  Jan 13 16:29:26 x1e keymapperd[903649]: Ignoring device event28 'sof-hda-dsp Headphone'
  Jan 13 16:29:26 x1e keymapperd[903649]: Ignoring device event27 'sof-hda-dsp Mic'
  Jan 13 16:29:26 x1e keymapperd[903649]: Ignoring device event23 'HDA NVidia HDMI/DP,pcm=11'
  Jan 13 16:29:26 x1e keymapperd[903649]: Ignoring device event22 'HDA NVidia HDMI/DP,pcm=10'
  Jan 13 16:29:26 x1e keymapperd[903649]: Ignoring device event21 'HDA NVidia HDMI/DP,pcm=9'
  Jan 13 16:29:26 x1e keymapperd[903649]: Ignoring device event20 'HDA NVidia HDMI/DP,pcm=8'
  Jan 13 16:29:26 x1e keymapperd[903649]: Ignoring device event19 'HDA NVidia HDMI/DP,pcm=7'
  Jan 13 16:29:26 x1e keymapperd[903649]: Ignoring device event18 'HDA NVidia HDMI/DP,pcm=3'
  Jan 13 16:29:26 x1e keymapperd[903649]: Ignoring device event5 'SynPS/2 Synaptics TouchPad'
  Jan 13 16:29:26 x1e keymapperd[903649]: Ignoring device event1 'Lid Switch'
  Jan 13 16:31:23 x1e keymapperd[903649]: Updating device list
  Jan 13 16:31:23 x1e keymapperd[903649]: Ignoring device event29 'Keymapper'
  Jan 13 16:31:23 x1e keymapperd[903649]: Opening device event9 failed
  Jan 13 16:31:23 x1e keymapperd[903649]: Opening device event8 failed
  Jan 13 16:31:23 x1e keymapperd[903649]: Ignoring device event28 'sof-hda-dsp Headphone'
  Jan 13 16:31:23 x1e keymapperd[903649]: Ignoring device event27 'sof-hda-dsp Mic'
  Jan 13 16:31:23 x1e keymapperd[903649]: Ignoring device event23 'HDA NVidia HDMI/DP,pcm=11'
  Jan 13 16:31:23 x1e keymapperd[903649]: Ignoring device event22 'HDA NVidia HDMI/DP,pcm=10'
  Jan 13 16:31:23 x1e keymapperd[903649]: Ignoring device event21 'HDA NVidia HDMI/DP,pcm=9'
  Jan 13 16:31:23 x1e keymapperd[903649]: Ignoring device event20 'HDA NVidia HDMI/DP,pcm=8'
  Jan 13 16:31:23 x1e keymapperd[903649]: Ignoring device event19 'HDA NVidia HDMI/DP,pcm=7'
  Jan 13 16:31:23 x1e keymapperd[903649]: Ignoring device event18 'HDA NVidia HDMI/DP,pcm=3'
  Jan 13 16:31:24 x1e keymapperd[903649]: Ignoring device event5 'SynPS/2 Synaptics TouchPad'
  Jan 13 16:31:24 x1e keymapperd[903649]: Ignoring device event1 'Lid Switch'
  Jan 13 16:31:24 x1e keymapperd[903649]: Ungrabbed device event9
  Jan 13 16:31:24 x1e keymapperd[903649]: Ungrabbed device event8
  Jan 13 16:31:24 x1e keymapperd[903649]: Ungrabbed device event7
  Jan 13 16:31:24 x1e keymapperd[903649]: Updating device list
  Jan 13 16:31:24 x1e keymapperd[903649]: Ignoring device event29 'Keymapper'
  Jan 13 16:31:24 x1e keymapperd[903649]: Ignoring device event28 'sof-hda-dsp Headphone'
  Jan 13 16:31:24 x1e keymapperd[903649]: Ignoring device event27 'sof-hda-dsp Mic'
  Jan 13 16:31:24 x1e keymapperd[903649]: Ignoring device event23 'HDA NVidia HDMI/DP,pcm=11'
  Jan 13 16:31:24 x1e keymapperd[903649]: Ignoring device event22 'HDA NVidia HDMI/DP,pcm=10'
  Jan 13 16:31:24 x1e keymapperd[903649]: Ignoring device event21 'HDA NVidia HDMI/DP,pcm=9'
  Jan 13 16:31:24 x1e keymapperd[903649]: Ignoring device event20 'HDA NVidia HDMI/DP,pcm=8'
  Jan 13 16:31:24 x1e keymapperd[903649]: Ignoring device event19 'HDA NVidia HDMI/DP,pcm=7'
  Jan 13 16:31:24 x1e keymapperd[903649]: Ignoring device event18 'HDA NVidia HDMI/DP,pcm=3'
  Jan 13 16:31:24 x1e keymapperd[903649]: Ignoring device event5 'SynPS/2 Synaptics TouchPad'
  Jan 13 16:31:25 x1e keymapperd[903649]: Ignoring device event1 'Lid Switch'
  Jan 13 16:31:25 x1e keymapperd[903649]: Ungrabbed device event11
  Jan 13 16:31:25 x1e keymapperd[903649]: Ungrabbed device event10

I saved the logs and did some other stuff. At 16:49, the same update device list sequence from yesterday is logged and the mappings started working. Unfortunately I don't remember if it was from touching the config file or reconnecting the keyboard, however I'm certain the issue did not got fixed by itself.

Based on this it seems like there's clearly some issue either with the keyboard or somewhere else. Next time Ill make sure to check the output ofxinput list` before doing anything else.

ristomatti commented 10 months ago

I guess I could also try removing the dock from the equation and connect the cable on the laptop and/or see if the Bluetooth connection is more stable.

I do prefer using the cable though since it always sits on the desk. Also I've only recently got the keyboard and still doing some QMK remaps using https://remap-keys.app/ or https://usevia.app/. I'm trying to get away with as little done there as possible since using just Keymapper would be much more convenient.

ristomatti commented 10 months ago

Since a couple of days ago, I've also seen keymapper suddently maxing out one CPU core. If I restart it before restarting 'keymapperd', it gets stuck waiting for connection. Somewhat interestingly, some mappings keep working even when keymapper is not running at all (before restarting keymapperd).

I don't remember having such issues other than this week. I've changed the config quite a bit and introduced a set of mappings to another keyboard after that for instance. I suspect it's in some way related to the parts included in the config I posted here: #99.

My earlier config did not use virtual keys or executing external commands, both of which I've added last week.

But this might be off topic and unrelated to this particular issue. I just thought to mention as this is @mark2185 also mentioned to the sudden high CPU usage.

ristomatti commented 10 months ago

A quick update. Yesterday I noticed a message on syslog there's indicated insufficient power to allow all functionality when a device had been connected. It turned out to be just my phone, and it indeed was not losing power rather than charging when connected. Anyway, after this I tested various USB power paths using two USB testers and didn't notice the voltage dropping even close to the minimum of the USB specification. Just in case, I tried swapping my keyboard to a separately powered USB hubx from my laptop dock.

That did not help though. I've got this happen at least 5 times today. There's been various input device disconnection events but no clear pattern has emerged. I suspect it might be a hardware issue as many are reporting frequent disconnection issues on some Keychron model. But then again, what device had caused a . All of them keep working just fine regardless. I wish there was a way to someway check when this occurs to be able to restart Keymapper.

Any chance the fix for #101 could have fixed this as a side effect?

houmain commented 10 months ago

I wish there was a way to someway check when this occurs to be able to restart Keymapper.

There should be no need for restarting keymapper when devices dis-/appear. Doesn't it work as expected?

Any chance the fix for #101 could have fixed this as a side effect?

I think #99 could have fixed this issue since with it context updates are no longer hold back. Together with the fix for the problem that occured when two instances of keymapper where running.

@mark2185 and @ristomatti can you confirm that it works now?

ristomatti commented 10 months ago

Sorry I haven't had time to post updates to this thread. Unless my memory is failing due to continous lack of proper sleep the last few weeks, I would say I saw this happen plenty of times after upgrading to v3.5.1.

Based on my logs, it's always been intermittent input device disconnections. At first it seemed to be some specific device or two, but after a while that was proven wrong as well. Some just disconnect more frequently:

$ journalctl -u acpid --since 2024-01-01 | rg '.*input device has been disconnected, fd (\d+)' -r '/dev/input/event$1' | sort | uniq -cd | sort -nr
    121 /dev/input/event29
     94 /dev/input/event8
     91 /dev/input/event7
     83 /dev/input/event9
     73 /dev/input/event26
     67 /dev/input/event24
     66 /dev/input/event23
     64 /dev/input/event25
     63 /dev/input/event10
     55 /dev/input/event18
     50 /dev/input/event30
     38 /dev/input/event27
     36 /dev/input/event31
     33 /dev/input/event22
     24 /dev/input/event28
     22 /dev/input/event32
     11 /dev/input/event11
     10 /dev/input/event12
      7 /dev/input/event19
      5 /dev/input/event33
      3 /dev/input/event35
      3 /dev/input/event34
      3 /dev/input/event20
      2 /dev/input/event21

event29 is keymapperd virtual device, so it's irrelevant.

But with that said, yesterday morning I switched some USB devices around between my dock and the two USB2 hubs attached to it. Since then the issue has not yet reproduced once. It includes two changes which I think could have made the difference.

  1. I connected my keyboard directly to a port on my USB-C dock
  2. I switched my seconcary (left hand side) Logitech Anywhere 2S mouse from Bluetooth to connection via a Unifying Receiver USB dongle.

If the reason is either of those, I'd put my money on the latter. I originally changed it to BT when I bought my new primary mouse, Logitech G502 X (it uses a Logitech Lightspeed dongle instead) due to interference issues. Namely, my then also new Keychron K3 Pro sufferenced from random stuck keys and this change fixed the issue completely, even though the keyboard was connected via USB.

I had noticed the mouse disconnecting several times a day (I assume for power saving), so I thought it's worth the shot to try the dongle again as the two hubs are further apart. And indeed, no interference issues so far either.

I believe swapping my keyboard to a port on the dock is less likely to have made a difference. as before doing that, I tried connecting it directly on the laptop. It didn't have any effect.

@houmain If you've got a Bluetooth input device at hand but not connected, it'd be interesting to hear if you'll then see this occur as well.

ristomatti commented 10 months ago

I already had an idea of using e.g. entr to restart the process after detecting a change in /dev/input but I haven't had to try that out yet.

ristomatti commented 10 months ago

Perhaps this could be some type of a race condition, like keymapperd grabbing the devices too fast after a change? For instance, my logs earlier on the thread show there's sometimes two consecutive Updating device list logs when a device is disconnected.

ristomatti commented 10 months ago

Regardless if this turns out to fix the issue for me for good, it would be useful to be able to either make keymapperd grab only specific devices or to be able to blacklist some of them. This would also prevent virtual keys releasing unnecessarily. So many devices seem to also show up as input devices. In my case as an example:

/dev/input/event0:      Sleep Button
/dev/input/event1:      Lid Switch
/dev/input/event2:      Power Button
/dev/input/event3:      AT Translated Set 2 keyboard
/dev/input/event4:      Video Bus
/dev/input/event5:      SynPS/2 Synaptics TouchPad
/dev/input/event6:      TPPS/2 Elan TrackPoint
/dev/input/event7:      Logitech USB Receiver
/dev/input/event8:      Logitech USB Receiver Keyboard
/dev/input/event9:      Keychron Keychron K15 Pro
/dev/input/event10:     Keychron Keychron K15 Pro Mouse
/dev/input/event11:     Keychron Keychron K15 Pro System Control
/dev/input/event12:     Keychron Keychron K15 Pro Consumer Control
/dev/input/event13:     Lenovo ThinkPad Thunderbolt 3 Dock USB Audio
/dev/input/event14:     Keychron Keychron K15 Pro Keyboard
/dev/input/event15:     ThinkPad Extra Buttons
/dev/input/event16:     HDA NVidia HDMI/DP,pcm=3
/dev/input/event17:     HDA NVidia HDMI/DP,pcm=7
/dev/input/event18:     HDA NVidia HDMI/DP,pcm=8
/dev/input/event19:     HDA NVidia HDMI/DP,pcm=9
/dev/input/event20:     HDA NVidia HDMI/DP,pcm=10
/dev/input/event21:     HDA NVidia HDMI/DP,pcm=11
/dev/input/event22:     Integrated Camera: Integrated C
/dev/input/event23:     Integrated Camera: Integrated I
/dev/input/event24:     Generic Blue Microphones Consumer Control
/dev/input/event25:     sof-hda-dsp Mic
/dev/input/event26:     sof-hda-dsp Headphone
/dev/input/event27:     Logitech Webcam C925e
/dev/input/event28:     Generic Blue Microphones
/dev/input/event29:     Keymapper
/dev/input/event30:     MX Anywhere 2S Keyboard
/dev/input/event31:     MX Anywhere 2S Mouse

From this list, I don't need Keymapper to grab any of these:

/dev/input/event0:      Sleep Button
/dev/input/event1:      Lid Switch
/dev/input/event2:      Power Button
/dev/input/event4:      Video Bus
/dev/input/event5:      SynPS/2 Synaptics TouchPad
/dev/input/event13:     Lenovo ThinkPad Thunderbolt 3 Dock USB Audio
/dev/input/event16:     HDA NVidia HDMI/DP,pcm=3
/dev/input/event17:     HDA NVidia HDMI/DP,pcm=7
/dev/input/event18:     HDA NVidia HDMI/DP,pcm=8
/dev/input/event19:     HDA NVidia HDMI/DP,pcm=9
/dev/input/event20:     HDA NVidia HDMI/DP,pcm=10
/dev/input/event21:     HDA NVidia HDMI/DP,pcm=11
/dev/input/event22:     Integrated Camera: Integrated C
/dev/input/event23:     Integrated Camera: Integrated I
/dev/input/event24:     Generic Blue Microphones Consumer Control
/dev/input/event25:     sof-hda-dsp Mic
/dev/input/event26:     sof-hda-dsp Headphone
/dev/input/event27:     Logitech Webcam C925e
/dev/input/event28:     Generic Blue Microphones
mark2185 commented 10 months ago

@mark2185 and @ristomatti can you confirm that it works now?

Unfortunately I could never reproduce it, so let's just hope it's fixed and I'll be sure to report back if it's not! :)

houmain commented 9 months ago

I finally got my hands on a bluetooth device and tried it out. The problem was that the device filters were only reapplied when the configuration changed not when the devices changed. This is finally fixed in 3.5.2. Sorry, it took so long!

Regardless if this turns out to fix the issue for me for good, it would be useful to be able to either make keymapperd grab only specific devices

Yes, right, I should really make this configurable.

This would also prevent virtual keys releasing unnecessarily

They are only reset when the configuration changes, not when the devices change.

ristomatti commented 9 months ago

Awesome, so you were able to reproduce it? I'll pull in the changes and deliberately reconnect the other mouse via BT and leave it running for the night. :crossed_fingers:

ristomatti commented 9 months ago

A quick unrelated question that I remembered when I was about to build the package: I've added a niceness setting to keymapperd.service:

[Service]
ExecStart=keymapperd
Nice=-5

What's your opinion, could this have any meaningful effect on the input latency?

houmain commented 9 months ago

so you were able to reproduce it?

Yes, even quicker I guess, since my device had different names when connecting via dongle/bluetooh.

What's your opinion, could this have any meaningful effect on the input latency?

Maybe, do you perceive any latency or can measure it somehow?

Are you still having problems with context mappings which stop working?

ristomatti commented 9 months ago

Maybe, do you perceive any latency or can measure it somehow?

It's difficult to answer on perceived latency. I've noticed a strong correlation with perceived latency and lack of sleep. I haven't done any back and forth testing if I notice a difference after changing the nice/priority setting. As an experiment I've been using the duration based mappings quite a lot. I'll try to tweak each duration to the shortest I can consistently get. Sometimes i've tweaked with 5ms increments. Somehow I'd lean to thinking this could make a difference on a heavy load...

Are you still having problems with context mappings which stop working?

Nope. I'm pretty confident you found the root cause. From my side this can be closed. If the issue re-appears, I'd be willing to say it will be a different issue and therefore better handled on a new issue.

That was the last actual issue I've ran across. Stellar work! 👏

Yesterday it occurred to me that AutoHotkey was the one of the few Windows apps I haven't found a replacement I'd be willing to do. Most of my use for AHK was application specific mappings and hotstring replacements, both of which can be achieved with Keymapper. :100:

houmain commented 9 months ago

Awesome! Thank you very much!