Androidのダークモード切り替え

昨今ダークモードなる単語が話題になることが多い気がする。
昔から好きな人は好きでやってた暗い画面のやつね。ウェブサイトでいえば「がとらぼ」もここ数年はダークモード。
で、最近はPCのOSのテーマだけでなくアプリもそうだし、スマートフォンでもブラウザ・メール・連絡先など多くアプリでダークモードが利用できるようになっていたりする。(正式にはまだか・・)

3月あたりに話題になったのは現在開発中でAndroidの次のバージョンのQでダークモードにする方法。
Androidスマートフォン側でデバッグモードをオンにしてからPC側でADBコマンドを打つ。

adb shell settings put secure ui_night_mode 2
最後の数字を1にするとダークモードの無効、0にすると自動(壁紙の明るさで変わる?)とのこと。

で、Androidスマートフォンを再起動する。

難しくはないが、たかが画面モードの切り替えでシステムの再起動が必要なのが難点。

それをLineageOS 16 (Android P相当)で試してみた。

Androidダークモード 1
コマンドを打つ前。
上からスワイプしてタイルを表示。壁紙に動画を使っているので壁紙の明るさが判断されずに白地の黒文字の明るいモードになっている。

Androidダークモード 2
Androidの設定のメニューも同じく明るいモード。

Androidダークモード 3
ADBコマンドを打ってシステムを再起動してみた。
タイルを表示。ダークモードなので暗い背景に白文字になった。

Androidダークモード 4
Androidの設定のメニュー画面もダークモードになっている。

Androidダークモード 5
ただ、ダークモードとはいっても、濃い灰色なのであまり良い感じではない。 設定の「スタイル」で「ダークモード」を開き、「ブラック」を選択した。選択前は「デフォルト」
上の画像は既に「ブラック」に切り替わっている状態。

Androidダークモード 6
Androidの設定のメニューも背景が濃い灰色から完全な黒に変わった。こちらの方が好き。

メニューで切り替えれば再起動が不要で即切り替わるので(切り替えメニューがあるなら)それを使う方が良いやね。
3月あたりに話題になったのはAndroid Qのベータ版では、まだメニューでダークモードに切り替えられないのでADBコマンドで切り替えたってだけのようだし。「そんなコマンドが使えたのかぁ」というのはあったけど。

200円分のGoogle Playクレジットが貰えない?

結構な頻度で「200円分のGoogle Playクレジットをプレゼント」というメールが届く。 これは迷惑メールではなくて本物のGoogleが送ってくるありがたいもの。
で、以前は普通にメールの「クレジットを利用しよう」のリンクをクリックすることで普通にクレジットが貰えたのが、ここ2回ほど立て続けに「お住いの国からこのコードをご利用いただくことはできません。」になってしまったのでその対処。前回も一応対処したつもりだったが今回またNGだったのでメモしておこうかと。

やること。
Google Playの支払い情報のプロファイルの国名が間違ってたら登録し直す。
支払いプロファイルが複数ある場合は日本以外の国のプロファイルを削除する。
文字で書けばこれだけ。
しかし、意外とわかりにくいので画像付きで以下。

Google Playの支払い情報変更 1
画像 1:
Googleから届く「200円分のGoogle Playクレジットをプレゼント」のメール。結構な頻度で届くのだが「がとらぼ」の中の人は殆どゲームもしないしスマホでコンテンツの購入もしないので貰ってもむしろ使い途に困る感じ。
とはいえ、貰えるものは貰っておこうということで、「クレジットを利用しよう」のボタン(リンク)をクリック。

Google Playの支払い情報変更 2
画像 2:
ブラウザが起動して、Google Playのウェブサイトが開く。
何故か「お住いの国からこのコードをご利用いただくことはできません。」になって200円分のクレジットは貰えないらしい。
この画面は要らないのでブラウザは閉じても良い。引き続きGoogle Playを開いても可。

Google Playの支払い情報変更 3
画像 3:
ブラウザでGoogle Playのウェブサイトを開く。
上の画像はGoogleのメインページから右上のメニューアイコンをクリックし、[Play]のアイコンをクリックした。

Google Playの支払い情報変更 4
画像 4:
Google Playのメイン画面。
左のメニューから[お支払い方法]をクリック。

Google Playの支払い情報変更 5
画像 5:
すでに何らかの支払い方法を登録しているならその方法が表示されているので「お支払い方法の編集」をクリック。
上の画像ではVisaのクレジットカードが登録されている。
登録されていなければ「お支払い方法を追加」をクリックして何らかの支払い方法を登録する(画像11へ)ことなるが、その場合はこの記事の事象は発生しないかと。

Google Playの支払い情報変更 6
画像 6:
お支払いセンターの画面が開くので左上のハンバーガーアイコンをクリックしてメインメニューを開く。

Google Playの支払い情報変更 7
画像 7:
左列のメニューから「設定」をクリック。

Google Playの支払い情報変更 8
画像 8:
お支払いプロファイルが表示される。「お住いの国からこのコードをご利用いただくことはできません。」になる原因はこのプロファイルに登録されている「国/地域」の情報が間違って日本以外になっていること。
前回この状態になったときはその場凌ぎで支払いプロファイルを1つ追加してそれの「国/地域」を日本にしたら問題無かったが、今回再びNGになってしまったので間違った国で登録されているプロファイルを削除することにした。
国の選択が違っているプロファイルをクリック。上の画像では「アメリカ合衆国」になっているのが間違い。プロファイルは編集されていて正しく日本の住所が登録されていた。「がとらぼ」の中の性格的にこの手の登録は慎重なので国を間違って選択するということはないと思われるが、10年ほど前に登録したときには「国の選択」が無かった?

Google Playの支払い情報変更 9
画像 9:
表示されるプロファイルが国の登録が間違ったものに切り替わる。(正しく切り替わらないことがあるようなのでしっかり確認する。切り替わらないならページを再表示してプロファイルを選択し直す。)
国情報は変更はできないので、そのお支払いプロファイルを削除して新しいものを作成しなくてはならない。
下にスクロールして「お支払いプロファイルを閉鎖」をクリックする。

Google Playの支払い情報変更 10
画像 10:
「お支払いプロファイルの閉鎖」ポップアップが表示されるので閉鎖理由を選択して「次へ」(削除完了まで進む)。
購入済みアプリやコンテンツはプロファイルではなくアカウントに紐付いているのでお支払いプロファイルの削除は基本的には躊躇わなくて良い筈。ただし、定期的に料金の引き落としがあるようなサービスを利用しているならそのサービスで、有効な支払いプロファイルの選択登録が必要になるかも。

すでに国情報が正しく登録された「お支払いプロファイル」が別に存在するならプロファイルの操作はこれで終わり。(画像14へ)
元々お支払いプロファイルが1つしか存在しなくてそれを削除したのであれば新しいお支払いプロファイルを登録する(次)

Google Playの支払い情報変更 11
画像 11:
Google Playのメイン画面の左メニューから「お支払い方法」をクリック。
(クレジットカード払いを登録するなら)「カードを追加」をクリック。

Google Playの支払い情報変更 12
画像 12:
カード情報を登録して[保存]

Google Playの支払い情報変更 13
画像 13:
画像7までと同じ方法でお支払いプロファイルを表示する。
「国/地域」の欄が日本になっていること。これが間違っていたら話しにならない。
他の欄の(ペンのアイコン)をクリックして必要な情報を編集する。
これでお支払いプロファイルの登録は終わり。

Google Playの支払い情報変更 14
画像 14:
再び「200円分のGoogle Playクレジットをプレゼント」メールの「クレジットを利用しよう」のリンクをクリック。
今度は「お住いの国からこのコードをご利用いただくことはできません。」にならずに「hoge@gmail.comに¥200を入金しようとしています」になる筈。「確認」ボタンを押す。

Google Playの支払い情報変更 15
画像 15:
Google Playで利用可能な200円分のクレジットを貰えた。すぐに何かを購入するのであれば[購入]をクリックでGoogle Playへ。
貰うだけ貰えばもう用は無いということであればブラウザを閉じて良い。

Google Playの支払い情報変更 16
画像 16:
もう一度Google Playのメイン画面のメニューから「お支払い方法」をクリックしてみる。
Google Playの残高: ¥200というのが表示されている筈。これは余程細かいことが気になる人以外は見なくて良いかと。

ヤッタァー!! 200円ゲットォ!!
微妙な額過ぎて使い途に困るわ。

Linuxでマウス/トラックボールのボタン割当て変更

人差し指トラックボール
© いらすとや

いまどきのマウスやトラックボールは多機能で多ボタンが多い。
Windows用にはマウスメーカーが提供するボタン割当変更ソフトなんてのが付いていたりウェブサイトで提供されてたりするが、Linuxでは大抵はメーカーからその手のアプリは提供されない。
それでも、多くは特に設定不要で左右ボタン「進む」「戻る」とホイール回転によるスクロール、ホイールの水平スクロールは機能する。問題はホイールクリックとマウス/トラックボールの機種固有のファンクションボタンへの機能割当て、それから割り当てられている機能を変更すること。

X Windowの現在の設定を見る

$ xinput list
⎡ Virtual core pointer                          id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ ELECOM TrackBall Mouse DEFT Pro TrackBall id=12   [slave  pointer  (2)]
⎜   ↳ Logitech USB Keyboard                     id=15   [slave  pointer  (2)]
⎣ Virtual core keyboard                         id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Power Button                              id=6    [slave  keyboard (3)]
    ↳ Video Bus                                 id=7    [slave  keyboard (3)]
    ↳ Power Button                              id=8    [slave  keyboard (3)]
    ↳ Sleep Button                              id=9    [slave  keyboard (3)]
    ↳ UVC Camera (046d:0825)                    id=10   [slave  keyboard (3)]
    ↳ ELECOM TrackBall Mouse DEFT Pro TrackBall id=11   [slave  keyboard (3)]
    ↳ ELECOM TrackBall Mouse DEFT Pro TrackBall id=13   [slave  keyboard (3)]
    ↳ Logitech USB Keyboard                     id=14   [slave  keyboard (3)]

今回はELECOMのトラックボール DEFT PROを設定したいのだが、DEFT Proが3行表示されている。とりあえず右列のslave pointerの行を見てデバイスのIDを求める。今回はid=12になっていたので12がそれ。
xinput get-button-mapの後に求めたデバイスIDの12を指定して実行。同じデバイス名が複数表示されていない場合はデバイスのIDではなくそのデバイス名をクォーテーションで括って指定する。(その方がデバイスIDが変化した場合にも追随しやすい。特に設定ファイルに書く場合)

$ xinput get-button-map 12
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

1〜16の何かの操作可能な部分があるっぽい(当てにはならないが)。その割当ては数字が順に並んでいるだけなので機能の重複や入れ替えが既に行われているわけではなさそう。

マウス/トラックボールのボタンの無効化や入れ替え

マウス/トラックボールの何も押さずに実行

$ xinput query-state 12
2 classes :
ButtonClass
        button[1]=up
        button[2]=up
        button[3]=up
        button[4]=up
        button[5]=up
        button[6]=up
        button[7]=up
        button[8]=up
        button[9]=up
        button[10]=up
        button[11]=up
        button[12]=up
        button[13]=up
        button[14]=up
        button[15]=up
        button[16]=up
ValuatorClass Mode=Relative Proximity=In
        valuator[0]=426
        valuator[1]=16
        valuator[2]=5
        valuator[3]=-3748

button[1]〜button[16]の全てがup(押されていない)であることを確認。

次に、マウス/トラックボールの「左クリック」[L]ボタンを押しながら実行。

$ xinput query-state 12
2 classes :
ButtonClass
        button[1]=down
        button[2]=up
        button[3]=up
        button[4]=up
        button[5]=up
        button[6]=up
        button[7]=up
        button[8]=up
        button[9]=up
        button[10]=up
        button[11]=up
        button[12]=up
        button[13]=up
        button[14]=up
        button[15]=up
        button[16]=up
ValuatorClass Mode=Relative Proximity=In
        valuator[0]=407
        valuator[1]=14
        valuator[2]=5
        valuator[3]=-3748

これでbutton[1]=downになったので[L]ボタンはbutton[1]と解った。
同様に違うボタンを押してbutton[ID]を調べる。

調べた結果

button[1]: [L]
button[2]: ホイールクリック
button[3]: [R]
button[4]:
button[5]:
button[6]:
button[7]:
button[8]: [→](戻る)
button[9]: [←](進む)
button[10]: [Fn1]
button[11]: [Fn2]
button[12]: [Fn3]
button[13]:
button[14]:
button[15]:
button[16]:

ホイールの左倒し右倒しは機能するのにxinput query-stateでは検出されなかった。

個人的には特別なアプリを除いて通常はホイールクリックは要らない。また、DEFT PROでは右クリックが(若干)押しにくくその隣の薬指で押す[Fn2]に特に与えたい機能があるわけではなので[Fn2]も右クリックにしたい。

割当て変更はxinput set-button-mapで行う。
$ xinput set-button-map 12 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
これだと初期値だが、button[2]を無効にしてbutton[11]をbutton[3]と同じにしたいということになるので
$ xinput set-button-map 12 1 0 3 4 5 6 7 8 9 10 3 12 13 14 15 16
こうする。
人によってはホイールクリックに[Home]を当てる等したいということがあるかもしれない。その場合はbutton[2]は触る必要がないので
$ xinput set-button-map 12 1 2 3 4 5 6 7 8 9 10 3 12 13 14 15 16
(これは後で)

セット後すぐには有効にならないかもなので少し待ってから確認する。

$ xinput --get-button-map 12
1 0 3 4 5 6 7 8 9 10 3 12 13 14 15 16

これでホイールクリックをして何もなく、[Fn2]を押したときに右クリックと同じようにメニューウインドウが表示されれば割当変更は成功。

このままだとシステムを再起動するなどで上の設定は失われるので起動時に同様に実行されるようにする。先の設定コマンドxinput set-button-map ‥‥ 1行を自身のホームディレクトリの.profileファイルの末尾などに追記する。

上のxinput query-stateでボタンの対応確認は面倒なので、もしxevが使えるのであればその方が簡単かも。
Event Testerという窓が開くのでその上でマウスのボタンを押す。
コンソールの表示を見ながらマウス/トラックボールのボタンを操作する。

$ xev
Outer window is 0x4e00001, inner window is 0x4e00002

PropertyNotify event, serial 8, synthetic NO, window 0x4e00001,
    atom 0x27 (WM_NAME), time 3824318, state PropertyNewValue

PropertyNotify event, serial 9, synthetic NO, window 0x4e00001,
    atom 0x22 (WM_COMMAND), time 3824318, state PropertyNewValue

中略

マウスのボタンを押す

ButtonPress event, serial 40, synthetic NO, window 0x4e00001,
    root 0x140, subw 0x4e00002, time 4238242, (33,26), root:(33,1591),
    state 0x10, button 12, same_screen YES

押した瞬間の表示を見る。ボヤボヤしてるとログがどんどん流れるかも。
この場合は押したボタンが黄色部分(button 12)と認識された。

マウス/トラックボールのボタンに機能を割り当てる

X-Window用の仮想キーボードxvkbdをインストールする。(方法は省略)
キーバインドを変更するxbindkeysをインストールする。(方法は省略)

今回はDEFT PROのボール左側にあるFn1に[Ctrl]+[Ins](コピー)を、左クリックボタンの隣で親指の根本側にあるFn3に[Shift]+[Ins](ペースト)を割り当てる。何故[Ctrl]+[c]、[Ctrl]+[v]じゃないかというと、これらはLinuxでは別の役割のショートカットが割り当てられることが多いので[Ctrl]+[Ins](コピー)や[Shift]+[Ins](ペースト)の方が良いかなと思ったので。個人的にはこのショートカットをキーボードで使うし。ちなみにカットは[Shift]+[Del]ね。これらは右手だけで使えるショートカットなのでWindowsの人も覚えると役に立つと思う。

自身のホームディレクトリにxbindkeys用の設定ファイルを作成する。

~/.xbindkeysrc (新規ファイル)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# Fn1: [Ctrl]+[Ins](Copy)
"xvkbd -xsendevent -text '\C\[Insert]'"
b:10        #button[10]

# Fn3: [Shift]+[Ins](Paste)
"xvkbd -xsendevent -text '\S\[Insert]'"
b:12        #button[12]

# Wheel Click: [Home]
"xvkbd -xsendevent -text '\[Home]'"
b:2        #button[2]

設定ファイルは書き方とても簡単。
\Cは[Ctrl]キー、\Sは[Shift]キーの省略系。挿入キーはそのまま\[Insert]と書く。(それぞれ前にバックスラッシュを付ける)

先の方でやったようにホイールクリックを無効にしてたら[Home]キーの割当ては効かない。 このページの割当て変更はあくまで参考なので、使い易くないと思ったら自分に合うように好きに変えて欲しい。

設定したら再ログインするなりシステムを再起動するなり。

GUIで設定できるEasystrokeとかあるけど、結果的にこっちの方が簡単な気がする。

余談

人差し指タイプ、親指タイプ、センターボールタイプでそれぞれ1つずつ挙げたけど、これら3種類のトラックボールは「トラックボール」だといっても全く別物。それぞれマウスとトラックボールくらい違うと思って良い。利用環境や自分の手に合うタイプを考慮した上でさらに手にしっくりくるモデルを選ぶことが大事。例えば親指を動かすとすぐに疲れる人がいるが、そういう人が親指を酷使する親指タイプを選んだらダメだし、大画面とか複数画面で使う人が小玉タイプを選ぶのもダメ。間違って選ぶと後悔するので注意。