<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Keyboards on mm-dev</title>
    <link>https://mm-dev.rocks/tags/keyboards/</link>
    <description>Recent content in Keyboards on mm-dev</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-gb</language>
    <lastBuildDate>Thu, 08 Feb 2024 12:05:30 +0000</lastBuildDate><atom:link href="https://mm-dev.rocks/tags/keyboards/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Android Bluetooth Keyboard Mapping</title>
      <link>https://mm-dev.rocks/posts/android-bluetooth-keyboard-mapping/</link>
      <pubDate>Thu, 08 Feb 2024 12:05:30 +0000</pubDate>
      <guid>https://mm-dev.rocks/posts/android-bluetooth-keyboard-mapping/</guid>
      <description>&lt;p&gt;I use Bluetooth keyboards with Android a lot, and often want to remap keys (eg swapping &lt;code&gt;CAPS_LOCK&lt;/code&gt; to &lt;code&gt;CTRL_LEFT&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Maybe it&amp;rsquo;s a failing in my search technique or I&amp;rsquo;m doing something that nobody else does nowadays, but whenever I search for info about this I find really old articles with out-of-date info, or just links to apps. To be fair &lt;a href = &#34;https://f-droid.org/packages/io.github.sds100.keymapper/&#34; target = &#34;_blank&#34; rel = &#34;nofollow noopener noreferrer&#34;&gt;Key Mapper&lt;/a&gt; is good and I do use it, but sometimes I just want to be able to do it at a system level without requiring extra apps.&lt;/p&gt;
&lt;p&gt;To remap keys in Android, you need to edit a particular keylayout &lt;code&gt;*.kl&lt;/code&gt; file, specific to the device (eg Bluetooth keyboard) you want to re-map. The files have names like &lt;code&gt;Vendor_04e8.kl&lt;/code&gt;. The name is derived from various properties of the device, such as vendor ID, product ID and other things &lt;a href = &#34;https://source.android.com/docs/core/interaction/input/key-layout-files&#34; target = &#34;_blank&#34; rel = &#34;nofollow noopener noreferrer&#34;&gt;as explained here in the Android docs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The sticking point for me, for &lt;em&gt;ages&lt;/em&gt;, was that I had trouble finding the vendor and product codes and, consequently, the correct file to edit. In Linux I&amp;rsquo;d use &lt;code&gt;lsusb&lt;/code&gt; or &lt;code&gt;bluetoothctl&lt;/code&gt; or something like that, but on Android even in the wonderful &lt;a href = &#34;https://termux.dev/en/&#34; target = &#34;_blank&#34; rel = &#34;nofollow noopener noreferrer&#34;&gt;Termux&lt;/a&gt;, these things don&amp;rsquo;t work properly for reasons I haven&amp;rsquo;t completely wrapped my head around, related to security and/or the way Android and its underlying Linux kernel inter-relate.&lt;/p&gt;
&lt;h2 id=&#34;problem-1-finding-which-keylayout-file-needs-to-be-edited&#34;&gt;Problem 1: Finding which keylayout file needs to be edited&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;In Termux or whichever shell/terminal you use, do &lt;code&gt;su&lt;/code&gt; to log in as superuser&lt;/li&gt;
&lt;li&gt;Do &lt;code&gt;dumpsys&lt;/code&gt; and wait for it to finish. It can take a while (couple of minutes on some of my devices)&amp;hellip;&lt;br&gt;
&lt;em&gt;If I don&amp;rsquo;t do this step, on some devices the next step doesn&amp;rsquo;t work&amp;hellip; I hate this kind of situation as I have no idea why this should work and it feels nonsensical, but all I know is it fixed the problem when I encountered it.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Do &lt;code&gt;dumpsys input&lt;/code&gt; to narrow the output&lt;br&gt;
&lt;em&gt;Even this input-specific command outputs quite a lot. I tend to just take my time and scroll through it, but you can make it easier by trying something like:&lt;/em&gt;&lt;br&gt;
&lt;code&gt;dumpsys input | grep -i -A12 bluetooth&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;-i&lt;/code&gt; means case-insensitive&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;-A12&lt;/code&gt; means &lt;em&gt;show the matching line plus the &lt;code&gt;12&lt;/code&gt; lines &lt;code&gt;A&lt;/code&gt;fter it&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;You may want to tweak the number but for me 12 was good&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;In the output, look for a description for your device (mine is &lt;code&gt;Device 45: Bluetooth 3.0 Keyboard&lt;/code&gt;), and soon after that you&amp;rsquo;ll find a line like &lt;code&gt;KeyLayoutFile: /system/usr/keylayout/Vendor_04e8.kl&lt;/code&gt; &amp;mdash; that&amp;rsquo;s the &lt;code&gt;*.kl&lt;/code&gt; file you need to edit to remap your keyboard&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;problem-2-editing-system-files-on-modern-android&#34;&gt;Problem 2: Editing system files on modern Android&lt;/h2&gt;
&lt;p&gt;On modern versions of Android, even if you have root, it&amp;rsquo;s not possible to directly edit files in the &lt;code&gt;/system/&lt;/code&gt; directory (it is mounted as read-only).&lt;/p&gt;
&lt;p&gt;The way around this is to &lt;a href = &#34;https://topjohnwu.github.io/Magisk/guides.html#magisk-modules&#34; target = &#34;_blank&#34; rel = &#34;nofollow noopener noreferrer&#34;&gt;make a Magisk module&lt;/a&gt;. This is simpler than it might sound. The basic idea is that you create a folder in &lt;code&gt;/data/adb/modules&lt;/code&gt;, (eg in my case I use &lt;code&gt;mm&lt;/code&gt;, so &lt;code&gt;/data/adb/modules/mm/&lt;/code&gt;). Inside that folder, you can create files and folders which Magisk will overlay onto the system at boot time, eg:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/data/adb/modules/mm/system/usr
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# becomes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/system/usr
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/data/adb/modules/mm/system/usr/keylayout/Vendor_04e8.kl
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# becomes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/system/usr/keylayout/Vendor_04e8.kl
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now you can edit the keylayout file to make your changes, eg to change &lt;code&gt;CAPS_LOCK&lt;/code&gt; to &lt;code&gt;CTRL_LEFT&lt;/code&gt; on my keyboard it&amp;rsquo;s:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# key 58    CAPS_LOCK&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;key &lt;span class=&#34;m&#34;&gt;58&lt;/span&gt;    CTRL_LEFT
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;other-apps-which-might-be-useful&#34;&gt;Other apps which might be useful&lt;/h2&gt;
&lt;p&gt;Depending on your Android device and software version, it can be difficult/confusing to find the right key codes. I find that one or another of the apps below usually gets me what I need:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href = &#34;https://apkpure.net/hardware-keyboard-check/com.darkoak.android.hardwarekeyboardcheck&#34; target = &#34;_blank&#34; rel = &#34;nofollow noopener noreferrer&#34;&gt;HardwareKeyboardCheck by Mr. Greenheart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href = &#34;https://apkpure.net/key-tester/com.flossga.android.whichbutton&#34; target = &#34;_blank&#34; rel = &#34;nofollow noopener noreferrer&#34;&gt;WhichButton aka Key Tester by FLOSS AG&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
  </channel>
</rss>
