Environments

  • Thinkpad X Yoga
  • Debian Stretch (Linux 4.9.0)
  • qtile 0.12.0
    • python 3.5.3
  • i3lock 2.12

ボタン・ふたでSuspend

/etc/systemd/logind.conf[Login] 中の項目を設定。Linux Man Pages: logind

$ cat /etc/systemd/logind.conf
[Login]
HandlePowerKey=suspend
HandleLidSwitch=suspend

Suspend時にロック

screen lockにi3lockを使う。i3lockを起動するsystemd unitでbeforeを指定する。

$ cat /lib/systemd/system/wakelock.service
[Unit]
Description=Lock the screen on resume from suspend
Before=sleep.target suspend.target

[Service]
User=YOUR USER NAME
Type=forking
Environment=DISPLAY=:0
ExecStart=/usr/bin/i3lock

[Install]
WantedBy=sleep.target suspend.target

$ systemctl daemon-reload
$ systemctl enable wakelock.service

suspend 一定時間後 hibernate

以前はここにpm-utilsを使用する方法を書いていたが、動かなかったのでsystemdを使うようにする。i3lock 2.8 (debian 9のリポジトリから手に入るもの) だとハイバネート復帰後カーネルパニックを起こしたので、 2.12を使うようにしたところうまく動いている模様。

$ cat /usr/sbin/delayed_hibernate.sh
#!/bin/bash
TIMELOG=/tmp/autohibernate.log
ALARM=$(tail -n 1 $TIMELOG)
SLEEPTIME=10 #edit this line to change timer, e.g. 2 hours "$((2*60*60))"
if [ $1 == "resume" ]
then
    if [ $(date +%s) -ge $(( $ALARM + $SLEEPTIME )) ]
    then
        echo "hibernate triggered $(date +%H:%M:%S)">>$TIMELOG
        systemctl hibernate 2>> $TIMELOG
    else
        echo "normal wakeup $(date +%H:%M:%S)">>$TIMELOG
    fi
elif [ $1 == "suspend" ]
then
    echo "$(date +%s)" >> $TIMELOG
    /usr/sbin/rtcwake -m no -s $SLEEPTIME
fi
$ cat /lib/systemd/system/delayedhybernate.service
[Unit]
Description=Delayed hibernation trigger
Before=suspend.target
Conflicts=hibernate.target hybrid-suspend.target
StopWhenUnneeded=true

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/sbin/delayed_hibernate.sh suspend
ExecStop=/usr/sbin/delayed_hibernate.sh resume

[Install]
WantedBy=sleep.target
RequiredBy=suspend.target

i3lockなしなら問題なく動くが、(おそらく)i3lock追加後にhibernate復帰すると下記メッセージが現れる。

Message from syslogd@debian-thinkpad at Jan  3 08:36:00 ...
 kernel:[ 1079.913130] Uhhuh. NMI received for unknown reason 2c on CPU 0.

Message from syslogd@debian-thinkpad at Jan  3 08:36:00 ...
 kernel:[ 1079.913135] Do you have a strange power saving mode enabled?

Message from syslogd@debian-thinkpad at Jan  3 08:36:00 ...
 kernel:[ 1079.913138] Dazed and confused, but trying to continue

WLanの情報をBottom Barに

WLANじたいはwicdで管理している。

  • pythonのiwlibのビルドのためlibiw-devをいれる
  • pipでiwlibをいれる
$ sudo apt install libiw-dev
$ pip3 install iwlib

うごかん (N/A)

BacklightをFunction Keysで

xbacklightが動かないのでバックライトデバイスのsysfsを直接編集するようにする。はじめは一般ユーザで書き込めないので、それを変更するudevルールを書く。 https://wiki.archlinux.org/index.php/backlight 今回の場合はデバイスがacpi_video0ではなくintel_backlightなのでそこを置換する(このあたりの意味がよくわかっていない)。

cat /etc/udev/rules.d/99-backlight.rules
ACTION=="add", SUBSYSTEM=="backlight", KERNEL=="intel_backlight", RUN+="/bin/chgrp video /sys/class/backlight/%k/brightness"
ACTION=="add", SUBSYSTEM=="backlight", KERNEL=="intel_backlight", RUN+="/bin/chmod g+w /sys/class/backlight/%k/brightness"

あとはqtile configを書く。現在値を読み込みそれにある程度値を足して再度書き込むコマンドを作る。

echo $((`cat /sys/class/backlight/intel_backlight/brightness`+10)) | tee sys/class/backlight/intel_backlight/brightness

lazy.spawn()にこれを書けばいいのかと思ったがうまくごかない。ttyが割り当てられていなくてパイプが機能しないのだろうか(わからない)。同コマンドをファイルにして/usr/local/binに起き、+xしてlazy.spawn()の引数に書く。

低バッテリでhibernate

たぶんこれ (未検証) 2019-08-02追記: うごいてないのを確認。udevadmでちゃんと見てコンフィグを書く https://wiki.archlinux.org/index.php/laptop#Hibernate_on_low_battery_level

バッテリチェックするスクリプトを作る

$ cat /usr/local/bin/hibernateonlowbattery.sh
#!/bin/sh
acpi -b | awk -F'[,:%]' '{print $2, $3}' | {
        read -r status capacity

        if [ "$status" = Discharging -a "$capacity" -lt 5 ]; then
                logger "Critical battery threshold"
                systemctl hibernate
        fi
}

systemd.timer にあずける

$ cat /lib/systemd/system/hibernateonlowbattery.service
[Unit]
Description=Hibernate when low battery

[Service]
Type=oneshot
ExecStart=/usr/local/bin/hibernateonlowbattery.sh
$ cat /lib/systemd/system/hibernateonlowbattery.timer
[Unit]
Description=Hibernate when low battery

[Timer]
OnBootSec=10min
OnUnitActiveSec=2min

Persistent=false

[Install]
WantedBy=timers.target

Fonts

  • Noto Fontsをインストール
    • packageにあるものはaptでインストール (Sans CJKはある)
      • sudo apt install fonts-noto*
    • ないものはGoogleからダウンロードインストール
  • ~/.fonts.conf を編集 (See man fonts-conf)
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<!-- $XDG_CONFIG_HOME/fontconfig/fonts.conf for per-user font configuration -->
<fontconfig>
  <!--
  <match target="scan">
    <test name="family">
      <string>Noto Color Emoji</string>
    </test>
    <edit name="scalable" mode="assign">
      <bool>true</bool>
    </edit>
    <edit name="pixelsize" mode="assign">
      <double>18</double>
    </edit>
  </match>
  <match>
    <test name="family"><string>sans-serif</string></test>
    <edit name="family" mode="prepend" binding="strong">
      <string>Noto Color Emoji</string>
    </edit>
  </match>
  <match>
    <test name="family"><string>serif</string></test>
    <edit name="family" mode="assign" binding="strong">
      <string>Noto Color Emoji</string>
    </edit>
  </match>
  <match>
    <test name="family"><string>Apple Color Emoji</string></test>
    <edit name="family" mode="assign" binding="strong">
      <string>Noto Color Emoji</string>
    </edit>
  </match>
  -->
    <alias binding="strong">
      <family>emoji</family>
      <default><family>Emoji One</family></default>
    </alias>

  <alias>
    <family>sans</family>
    <prefer>
      <family>Noto Sans CJK JP</family>
    </prefer>
  </alias>
  <alias>
    <family>serif</family>
    <prefer>
      <family>Noto Serif CJK JP</family>
    </prefer>
  </alias>
  <alias>
    <family>sans-serif</family>
    <prefer>
      <family>Noto Sans CJK JP</family>
    </prefer>
  </alias>
  <alias>
    <family>monospace</family>
    <prefer>
      <family>DejaVu Sans Mono</family>
    </prefer>
  </alias>
  <alias>
    <family>sans-serif</family>
    <prefer><family>Noto Color Emoji</family></prefer>
  </alias>
</fontconfig>
  • fc-cache -f

Trackpoint

速度を早める

TL;DR

systemdのpathexistsでなんとかする

以下udevによるものは間違い

$ cat /etc/udev/rules.d/10-trackpoint.rules
ACTION=="add", SUBSYSTEM=="serio", DRIVERS=="psmouse", ATTR{name}=="TPPS/2 IBM TrackPoint", ATTR{sensitivity}="255", ATTR{speed}="255"

ruleのかきかた

参考: udevルールの書き方 - Qiita

trackpointのデバイスを探す。/dev/input/mouse{0,1,2,3}に割り当たっていることが予想ついたので udevadm info -q path -n /dev/input/mouse{0,1,2,3} して/sys以下の記述を探し、devadm info -a -p ${syspath} になげ、trackpointという記述があるところを探す。つまり、 udevadm info -a -p $(udevadm info -q path -n /dev/input/mouse{0,1,2,3}) の中でtrackpointと名前がつくものを探す。今回はmouse2がtrackpointだったので、udevadm info -a -p $(udevadm info -q path -n /dev/input/mouse1)とする。

↑で出てきた情報でデバイスを絞り込むキーを絞る。KERNELS, SYSSYSTEMS, DRIVERS, ATTRS{name}で絞り込めそうだと判断したので、ruleファイルの条件部にそれをかく。sensitivityとspeedを調整したいので、それを書き込む。

Touchpad

タッチでクリック、感度最大

libinputを使う。xinputから設定できる項目を確認。

$ xinput list
⎜   ↳ SynPS/2 Synaptics TouchPad                id=13   [slave  pointer  (2)]

id=13なので、

$ xinput list-props 13

libinput Tapping Enabled あたりかなとあたりをつける

man libinputman xorg.conf を読むなどして、/etc/X11/xorg.conf.d/99-libinput-custom-config.conf

Section "InputClass"
        Identifier "TouchPad"
        MatchDriver "libinput"
        MatchProduct "TouchPad"
        Option "Tapping" "yes"
        Option "TappingDrag" "yes"
        Option "AccelSpeed" "1.0"
        Option "AccelProfile" "flat"
EndSection