Ubuntu MATE で Win+P(Super+P)を無効化する

[追記]

Ubuntu MATE 20.04 で Win+P は無効になった。やったー 🎉

https://launchpad.net/ubuntu/+source/mate-settings-daemon/1.24.0-1

     + Drop 0001_new_video_key.patch. Rejected upstream.

Ubuntu 17.10 から Ubuntu MATE を使ってるんだけど、Ubuntu MATE 19.10 から Win+P(Super+P)キーで、ディスプレイの切り替わってしまうようになった。

マルチディスプレイ使用時にメインとサブが切り替わったり、1つだけになったり。それはまあいいんだけど、ちゃんと設定しておいたメインとサブの左右がリセットされたり位置がずれたりするのがいたい。

Win+P で切り替わるんじゃなくて、mate-display-properties (これ↓)が動くようになって欲しい。

f:id:tmtms:20200411192043p:plain
mate-display-properties

いろいろ調べてみても、このキーバインドを変更方法がわからず。ずっと放置してたんだけど、重い腰を上げて調べてみた。

まず誰が Win+P を処理してるのか。

Ubuntu MATE 19.10 のリリースノートの「MATE Desktop 1.22.2」に記述があったので、おそらく MATE 固有のもの。

https://github.com/mate-desktop/ 配下のリポジトリを手元に git clone して、grep したりしてみたところ、mate-settings-daemon/plugins/xrandr/ という怪しげなのを発見。

xrandr という名前がそのまんまだし、ソースを見たら Win+P に関する記述は見つからなかったけど、同じような動きをする XF86Display(ThinkPad では Fn+F7)キーに関する記述があった。

dconf-editor で /org/mate/settings-daemon/plugins/xrandr を見てみたが、キーに関する属性は無さそう。「このプラグインの有効化」という属性を見つけたのでオフにしてみる。

f:id:tmtms:20200411194033p:plain
dconf-editor

Win+P キーやFn+F7キーを押してもディスプレイには何の変化もない!やったー!

…と思ったのもつかの間、mate-display-properties での設定変更も効かなくなってしまった。

しかたないのでオンに戻して、もう一度ソースを見てみる。やはり Win+P に関する記述は見当たらない。

apt source mate-settings-daemon で Ubuntu MATE のパッケージのソースを取得。こっちに発見。(Mod4 = Super = Win)

#define VIDEO_KEYSYM    "XF86Display"
#define ROTATE_KEYSYM   "XF86RotateWindows"
#define NEW_VIDEO_KEYSYM    "p"
#define NEW_VIDEO_MODSYM    Mod4Mask

どうやら Ubuntu MATE 固有のキーバインドらしい。プログラムにハードコードされていて変更できそうにない。ひどい。

しかたないので、独自にパッチをあてて deb パッケージを作り直すことにした。

パッチ。キーイベントを拾ってるやつを全部無視するようにした。

バージョンを変更しないと apt upgrade で元のパッケージで上書きされてしまうのでテキトーにバージョンを変更。 はじめはどこでバージョンを指定するのかわからなかったんだけど、changelog に記述したものが使われるのね。面白い。

diff -ur mate-settings-daemon-1.22.1.orig/debian/changelog mate-settings-daemon-1.22.1/debian/changelog
--- mate-settings-daemon-1.22.1.orig/debian/changelog 2019-09-23 03:43:43.000000000 +0900
+++ mate-settings-daemon-1.22.1/debian/changelog  2020-04-11 15:14:52.577098106 +0900
@@ -1,3 +1,7 @@
+mate-settings-daemon (1.22.1-1tmtms) eoan; urgency=medium
+
+  * plugins/xrandr: disable key evnets.
+
 mate-settings-daemon (1.22.1-0ubuntu1) eoan; urgency=medium
 
   * New upstream release.
diff -ur mate-settings-daemon-1.22.1.orig/plugins/xrandr/msd-xrandr-manager.c mate-settings-daemon-1.22.1/plugins/xrandr/msd-xrandr-manager.c
--- mate-settings-daemon-1.22.1.orig/plugins/xrandr/msd-xrandr-manager.c  2020-04-11 15:13:27.000000000 +0900
+++ mate-settings-daemon-1.22.1/plugins/xrandr/msd-xrandr-manager.c   2020-04-11 15:14:14.505166359 +0900
@@ -2619,9 +2619,11 @@
         log_msg ("State of screen after initial configuration:\n");
         log_screen (manager->priv->rw_screen);
 
+/*
         gdk_window_add_filter (gdk_get_default_root_window(),
                                (GdkFilterFunc)event_filter,
                                manager);
+*/
 
         start_or_stop_icon (manager);
 
@@ -2675,9 +2677,11 @@
                 gdk_x11_display_error_trap_pop_ignored (display);
         }
 
+/*
         gdk_window_remove_filter (gdk_get_default_root_window (),
                                   (GdkFilterFunc) event_filter,
                                   manager);
+*/
 
         if (manager->priv->settings != NULL) {
                 g_object_unref (manager->priv->settings);

パッケージ作成&インストール。

% apt source mate-settings-daemon
% patch -p0  < tmp/mate-settings-daemon-1.22.1.patch
% cd mate-settings-daemon-1.22.1 
% debuild -uc -us -b
% cd ..
% sudo dpkg -i mate-settings-daemon_1.22.1-1tmtms_amd64.deb mate-settings-daemon-common_1.22.1-1tmtms_all.deb

うまくいった。しかしキーバインドがハードコーディングというのはやめてほしいなー。


deb パッケージを作るのに参考にしたもの。