新しいデスクトップ環境、NuDesktopについての技術的解説+α
概要
- 2022年度未踏ジュニア採択プロジェクト
- CentRaなる人が作っている
- デバイスの状態などに合わせてUIを切り替えられる
- カスタマイズの幅が広い
何故書いたのか
- 結構YouTubeの動画を見ていない・見る暇がない人がいそうだった
- ここに上がっています
- 成果報告会では喋りきれなかったことが大量にあった
- 技術的詳細を書きたくなった
- これを見れば自分でデスクトップ環境が作れるくらいのやつを書きたい
- こぼれ話&ぶっちゃけた話を書きたくなった(自己顕示欲ですねはい)
- 技術的詳細を書きたくなった
NuDesktopとは何か、何ができるのか
NuDesktopは、Linux向けのデスクトップ環境です。
Qt/QuickとKDE Frameworkを使用して作成しています。
できること
- JSONでどんなUIを表示するか記述できる
- ランチャー、ウィンドウスイッチャー、コントロールセンターなどについてそれぞれの要素を数種類ずつ実装してあり、それらもカスタマイズ可能
- どんな感じのUIなのかは固定されていなくて、自分で自由にUIを書ける
- それらを動的に切替可能
こういう具合なので、今のところはi3とかOpenboxをベースに自分好みの環境を作っているLinuxパワーユーザーに向いていると思います。
ちなみに名前は、もともと軽量志向だったので「μUI」の予定だったんですが文字化けしたり検索しにくかったりと最悪だったので「新しいという意味をもたせられそうだしいいか〜」というノリで「NuUI」となり、しかしやっぱりGoogleabilityが低いということで「NuDesktop」となりました。
モチベーション
まず、私は変なデバイスが大好きです。
UMPCも好きだし、
持ってるUMPCその1・Kohjinsha SC3
2008年製なのに2in1である。先見の明ありすぎ。Linuxを入れて使っていた
持ってるUMPCその2・NANOTE P8
この名前で7インチスクリーン。当然2in1
電子辞書も好きです。
持ってる電子辞書・PW-SS6
当然Linuxが動作。WindowsCEでもアプリを入れて楽しめるので2度美味しい。
で、電子辞書に向けてのLinuxディストリビューションを作るプロジェクトを発見しました。
このコミュニティに参加し、変なデバイス向けのソフトウェア開発の楽しさに気づき、このコミュニティのイベントであるBrain Hackers Meetupの#0,#1にどちらも参加しています。やっぱり変なデバイスは面白い以外にも「使ってなんぼだ」と私は思っているので、変なデバイスをより使いやすくするためのソフトウェア開発をしたいと思っていました。そこで、Brain Hackers Meetup#0では電子辞書のキーボードに足りないキーを補完するためのスクリーンキーボードについて、#1ではこのプロジェクトについて(!?)発表しています。
Brain Hackers Meetup #1のアーカイブ
というわけで、変なデバイスをより良く使うためのデスクトップ環境としてこのプロジェクトはスタートしました。
技術的詳細
やったこと
実は発表会のデモで見せたのがやったことのほぼ全てです。
-
ランチャーを実装した
- Android風のやつと普通の縦スクロールのやつ
-
ウィンドウスイッチャーを実装した(特にパネルに直接ウィンドウを表示するタイプのウィンドウスイッチャーが難しかった)
- パネルにこんな感じで表示される
-
パネル状に表示される時計を実装した
-
JSONによる設定の読み込み機構を作った
-
(一日で)- すごいでしょ
- と思うじゃん?
- 60行のシェルスクリプトです()
構成
QtとQuickを使っています。
詳しい実装としては
-
C++でまず何も乗っていないQt製パネルを表示
-
QMLで定義した何かをその上に表示している
- パネルと「何か」はC++からComponentとして作っている
- ComponentはC++からsetPropertyでパラメータをいじれる
→カスタマイズできる!
→JSONを読んだC++がそのとおりにカスタマイズして表示している
- ComponentはC++からsetPropertyでパラメータをいじれる
- パネルと「何か」はC++からComponentとして作っている
-
「何か」とは
- これはControls.ButtonだったりただのItemだったりする、要するにQMLとして呼び出せるComponentとだったら何でも良い
- ランチャーやウィンドウスイッチャー、時計がこれに当たる
-
この「何か」を制御するC++を書いてやることで「何か」から送られてきたシグナル(ボタンのクリックなど)を動きにつなげている
-
Qt Quick ControlsとKirigamiを使用
- QQCは普通にButtonなどの実装に使っている
- Kirigamiはテーマなどの実装に使っている
- 基本的にはKDEのHIGに従うようにしている
- Kirigamiをテーマの実装に使ったことで、KDEと同じテーマの切り替え機構が使えるように
-
デスクトップの切り替え機構はシェルスクリプトを使用
- dmesg(カーネルがイベントをここに残す)を読んでいる
tail -f -n 0 /var/log/kern.log
- dmesgにキーボード刺さったよ〜みたいなイベントが来る
- するとこのスクリプトが前のデスクトップ環境をキルして、別の設定ファイルを基にもう一度起動する
- 要するに、コマンドで実行可能なことなら何でもできる(!)
- ウィンドウマネージャを切り替えたり...
デモ動画のリンク - オンスクリーンキーボードをオンオフしたり
- 可能性が無限大
- ウィンドウマネージャを切り替えたり...
苦労したところ
QMLをデスクトップ環境の実装に使うときに困った点とか言う世界一誰の得にもならない情報を羅列していきます。
- そもそもウィンドウの情報をC++で、しかもLinuxでどうやって受け取るのか見当もつかない人が大半だと思います
→KWindowSystemを使うべし!
→KDEによって開発されているライブラリで、これ一つでウィンドウ一覧の取得も、それぞれのウィンドウの情報も見られるし、最大化・最小化もこれでできる!神! - と思っていた時期が私にもありました
→KWindowSystemではなぜかウィンドウの削除がそのままではできません(何故か実装されてない)
→このためだけにX11のライブラリを直接触るはめになり、調査と実装に2週間かかりました
→と思ったらKWindowSystemの付属のライブラリでってやるだけでできるじゃねえか!!私の2週間を返せ!!!あとそれをドキュメントに書け!!NETRootInfo(QX11Info::connection(), NET::CloseWindow).closeWindowRequest(wid);
- どうにかしてC++でウィンドウのリストを取得しても、それを一体どうQMLに伝えればいいかわからない
→QAbstractListModelを継承すればいいことがわかる、そして実装しました - しかし、愚直に実装したらListModelの変更がQMLに伝わらない事態に(プログラムを起動したときの状態のまま変わらない)
→BeginInsertRows、BeginInsertRowsを使ってやらないといけないらしい(初めて知った)
楽しかったところ
普段PCを使っていて存在しているのが当たり前な機能を自分で好きなように実装していくのが楽しかったです。人に見せると「それ自分で実装できるんだ」と言われるのがかなりモチベーションになりました(実際にめちゃくちゃ大変なので、それを褒められるとウンウンってなる)。
言いたいこと
デスクトップ環境自作、おすすめ
既存のツールをうまく組み合わせるだけでそこそこいい感じの環境を作れたりします。ただし楽しすぎて時間は大いに失うのでそこは注意が必要です。
未踏ジュニアはいいぞ
潤沢な資金を使って開発ができるので、学生には嬉しいです。しかも、計画性を失いがちな学生のプロジェクトにおいてアドバイスをしてくれるメンターの存在はすごく重要だと思います。
CASE Shinjukuはいいぞ
集中して作業ができるコワーキングスペースです。めっちゃ利用しました。新宿近辺の方はぜひ。
今後ともNuDesktopを応援よろしくおねがいします。
頑張れ〜って思った方はバッジでもください。
早急に実用可能な感じにしたいと思っています。
ではでは。
Discussion