Hey all,

I noticed recently that the screen rotation button on my Lenovo X201T
tablet was no longer working, whereas it had been working some time ago.
Long story short, there was a change around version 226 of systemd that
broke this.  I wanted to document how I got it working again and send it
out in case it helps anyone else.

This issue on Github [1] explains the problem and the patch that fixes it:

[1]: https://github.com/systemd/systemd/issues/1151

Rather than unmask a newer version of systemd I decided to try applying the
pull request to the current stable version in gentoo, which is
systemd-226-r2.  I created /etc/portage/patches/sys-apps/systemd and saved
the patch from the PR (cleaned up for 226-r2 and attached) there.  I then
rebuilt systemd, rebooted, and - voila - the rotate button is working again.

So (as root):

    # mkdir -p /etc/portage/patches/sys-apps/systemd # then copy the patch
here
    # emerge --oneshot sys-apps/systemd

That took a fair amount of googling around to root cause since I had no
idea where to begin, but ended up being a pretty simple fix.  When a newer
version of systemd gets stabilized I'll probably be able to drop that patch.

I do have a question though for anyone that can explain it: in the
patchfile I ended up putting in /etc/portage/patches I had to delete the
first slash in the filenames.  So for instance lines 27-31 of the patchfile
that works are this:

    diff --git a/Makefile.am b/Makefile.am
    index 8646e55..e3e07b8 100644
    --- Makefile.am
    +++ Makefile.am

But in the raw git diff they were:

    diff --git a/Makefile.am b/Makefile.am
    index 8646e55..e3e07b8 100644
    --- a/Makefile.am
    +++ b/Makefile.am

If I don't delete those prefixes then portage complains when applying the
patch:

    ERROR: prepare
    Failed Patch: fix-keymap-aliases.patch !
     ( /etc/portage/patches//sys-apps/systemd/fix-keymap-aliases.patch )

But existing patches in the /usr/portage/sys-apps/systemd/files directory
have the a/ and b/ prefixes.  So what gives?

Thanks,
Devrin
From 4c1482202957828a37e88e42c49e9ac8ef12c960 Mon Sep 17 00:00:00 2001
From: Martin Pitt <martin.p...@ubuntu.com>
Date: Tue, 13 Oct 2015 18:20:34 +0200
Subject: [PATCH 1/3] keymap: Recognize KEY_* aliases
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

linux/input.h contains alias definitions like

  #define KEY_COFFEE              152
  #define KEY_SCREENLOCK          KEY_COFFEE
  #define KEY_ROTATE_DISPLAY      153
  #define KEY_DIRECTION           KEY_ROTATE_DISPLAY

But we ignored these when building keyboard-keys-list.txt. Also allow the value
to start with "K" now (for KEY_*), and drop the hardcoded COFFEE →  SCREENLOCK
aliasing.

This fixes assignments to key "direction".

Fixes #1151
---
 Makefile.am | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Makefile.am b/Makefile.am
index 8646e55..e3e07b8 100644
--- Makefile.am
+++ Makefile.am
@@ -3483,7 +3483,7 @@ noinst_LTLIBRARIES += \
 
 src/udev/keyboard-keys-list.txt:
 	$(AM_V_at)$(MKDIR_P) $(dir $@)
-	$(AM_V_GEN)$(CPP) $(CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) -dM -include linux/input.h - < /dev/null | $(AWK) '/^#define[ \t]+KEY_[^ ]+[ \t]+[0-9]/ { if ($$2 != "KEY_MAX") { print $$2 } }' | sed 's/^KEY_COFFEE$$/KEY_SCREENLOCK/' > $@
+	$(AM_V_GEN)$(CPP) $(CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) -dM -include linux/input.h - < /dev/null | $(AWK) '/^#define[ \t]+KEY_[^ ]+[ \t]+[0-9K]/ { if ($$2 != "KEY_MAX") { print $$2 } }' > $@
 
 src/udev/keyboard-keys-from-name.gperf: src/udev/keyboard-keys-list.txt
 	$(AM_V_GEN)$(AWK) 'BEGIN{ print "struct key { const char* name; unsigned short id; };"; print "%null-strings"; print "%%";} { print tolower(substr($$1 ,5)) ", " $$1 }' < $< > $@

From 1d3f8fa747b71db60872bc21df5b6489b73b740d Mon Sep 17 00:00:00 2001
From: Martin Pitt <martin.p...@ubuntu.com>
Date: Wed, 14 Oct 2015 06:52:41 +0200
Subject: [PATCH 3/3] keymap: Drop keyboard-keys-to-name.h

We don't use that anywhere any more. With the introduction of alias names it
also is not a proper mapping any more as several keys (e. g. KEY_COFFEE and
KEY_SCREENLOCK) have the same numerical mapping.
---
 Makefile.am         | 6 +-----
 src/udev/.gitignore | 1 -
 2 files changed, 1 insertion(+), 6 deletions(-)

diff --git a/Makefile.am b/Makefile.am
index e3e07b8..336ba0a 100644
--- Makefile.am
+++ Makefile.am
@@ -1229,7 +1229,7 @@ BUILT_SOURCES += \
 	$(gperf_gperf_m4_sources:-gperf.gperf.m4=-gperf-nulstr.c) \
 	$(gperf_gperf_sources:-gperf.gperf=-gperf.c) \
 	$(gperf_txt_sources:-list.txt=-from-name.h) \
-	$(gperf_txt_sources:-list.txt=-to-name.h)
+	$(filter-out %keyboard-keys-to-name.h,$(gperf_txt_sources:-list.txt=-to-name.h))
 
 CLEANFILES += \
 	$(gperf_txt_sources:-list.txt=-from-name.gperf)
@@ -3491,9 +3491,6 @@ src/udev/keyboard-keys-from-name.gperf: src/udev/keyboard-keys-list.txt
 src/udev/keyboard-keys-from-name.h: src/udev/keyboard-keys-from-name.gperf
 	$(AM_V_GPERF)$(GPERF) -L ANSI-C -t -N keyboard_lookup_key -H hash_key_name -p -C < $< > $@
 
-src/udev/keyboard-keys-to-name.h: src/udev/keyboard-keys-list.txt
-	$(AM_V_GEN)$(AWK) 'BEGIN{ print "const char* const key_names[KEY_CNT] = { "} { print "[" $$1 "] = \"" $$1 "\"," } END{print "};"}' < $< > $@
-
 gperf_txt_sources += \
 	src/udev/keyboard-keys-list.txt
 
@@ -3520,7 +3517,6 @@ libudev_core_la_SOURCES = \
 
 nodist_libudev_core_la_SOURCES = \
 	src/udev/keyboard-keys-from-name.h \
-	src/udev/keyboard-keys-to-name.h \
 	src/udev/net/link-config-gperf.c
 
 gperf_gperf_sources += \
diff --git a/src/udev/.gitignore b/src/udev/.gitignore
index ba112ce..f5d8be3 100644
--- src/udev/.gitignore
+++ src/udev/.gitignore
@@ -1,5 +1,4 @@
 /udev.pc
 /keyboard-keys-from-name.gperf
 /keyboard-keys-from-name.h
-/keyboard-keys-to-name.h
 /keyboard-keys-list.txt

Reply via email to