WSLgのRAIL-shellを他所でも使いたい会
とりあえずDockerfileに纏めた
あとはFlatpakか何か適当なパッケージマネージャーとxfce4の組合せを別のDocker containerにしてやればデスクトップ環境としては使えるんではないか。
いやまぁWSLgで使ってるのはVAIL(Virtualized〜: アプリがVM環境内にあるケース)だけど。。
WSLgのリポジトリ https://github.com/microsoft/wslg では、
These changes are not specific to WSLg; they add functionality to the existing RDP backend and are reusable in other scenarios as well (i.e. using the new Weston RDP backend to remote application running on a Raspberry Pi to another device running an RDP client).
ということらしいので。
MS版Westonのビルド
基本的にFreeRDP側の追加はVAILのサポートが主なようなので、まずは適当にWestonをビルドしてみる。
EDIT: この辺はDockerfileにした https://github.com/okuoku/desktop-container-proto/blob/bae561a48c5124890c1573ed518e50182c40152e/disp/Dockerfile 。
Alpineだと元のパッケージは weston-dev
https://pkgs.alpinelinux.org/package/v3.19/community/x86_64/weston-dev か。とりあえずwestonを抜いて:
apk add libxkbcommon-dev pixman-dev pkgconf wayland-dev
(Alpineを使っているのは、このサーバーはDocker containerにするつもりのため)
meson.build:143:15: ERROR: Dependency "libinput" not found, tried pkgconfig and cmake
... 無いじゃん。。 libinput-dev
libevdev-dev
libdrm-dev
wayland-protocols
cairo-dev
mesa-dev
freerdp-dev
xwayland-dev
xwayland
libxcursor-dev
を追加。EDIT: librsvg-dev
も追加。
オプション一覧 https://github.com/microsoft/weston-mirror/blob/f227edd681479ec3cb2290a25d84d2d3462aebfa/meson_options.txt からオプションを調整して、
meson build --prefix=/opt/rdprail --libdir=/opt/rdprail/lib --sysconfdir=/etc \
-Dimage-jpeg=false -Dimage-webp=false -Dlauncher-logind=false \
-Dbackend-default=rdp -Dbackend-drm=false -Dbackend-headless=false \
-Dbackend-wayland=false -Dbackend-x11=false -Dbackend-fbdev=false \
-Dcolor-management-lcms=false -Dcolor-management-colord=false \
-Dsystemd=false -Dremoting=false -Dpipewire=false -Ddemo-clients=false
static_assert
が変
../libweston/backend-rdp/rdprail.c: In function 'languageGuid_to_string':
../libweston/backend-rdp/rdprail.c:884:63: error: macro "static_assert" requires 2 arguments, but only 1 given
884 | static_assert(sizeof(struct lang_GUID) == sizeof(GUID));
| ^
In file included from ../libweston/backend-rdp/rdp.h:62,
from ../libweston/backend-rdp/rdprail.c:45:
../shared/helpers.h:133: note: macro "static_assert" defined here
133 | # define static_assert(cond, msg)
|
... 何で。。?
超どうでも良いけどGoogle IMEを特別扱いしてるのか。。少くともC99では _Static_assert
は2引数。というわけで rdprail.c
側に修正が必要。
load_image_svg
の型が衝突する
ninja: job failed: cc -Irdprail-shell/rdprail-shell.so.p -Irdprail-shell -I../rdprail-shell -I. -I.. -Iinclude -I../include -Icompositor -I../compositor -Iprotocol -I/usr/include/pixman-1 -I/usr/include/winpr2 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/freerdp2/ -fdiagnostics-color=always -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -Wextra -Wpedantic -std=gnu99 -O0 -g -Wmissing-prototypes -Wno-unused-parameter -Wno-shift-negative-value -Wno-missing-field-initializers -Wno-pedantic -fvisibility=hidden -fPIC -MD -MQ rdprail-shell/rdprail-shell.so.p/img-load.c.o -MF rdprail-shell/rdprail-shell.so.p/img-load.c.o.d -o rdprail-shell/rdprail-shell.so.p/img-load.c.o -c ../rdprail-shell/img-load.c
../rdprail-shell/img-load.c:193:1: error: conflicting types for 'load_image_svg'; have 'pixman_image_t *(struct desktop_shell *, const void *, uint32_t)' {aka 'union pixman_image *(struct desktop_shell *, const void *, unsigned int)'}
193 | load_image_svg(struct desktop_shell *, const void *, uint32_t)
| ^~~~~~~~~~~~~~
In file included from ../rdprail-shell/img-load.c:38:
../rdprail-shell/shell.h:209:17: note: previous declaration of 'load_image_svg' with type 'pixman_image_t *(struct desktop_shell *, const void *, uint32_t, const char *)' {aka 'union pixman_image *(struct desktop_shell *, const void *, unsigned int, const char *)'}
209 | pixman_image_t *load_image_svg(struct desktop_shell *shell, const void *data, uint32_t data_len, const char *filename);
| ^~~~~~~~~~~~~~
ninja: subcommand failed
これは、 ↓ の !HAVE_LIBRSVG2
側がメンテナンスされていないため。
まぁ必須なのかな。。
テストのビルドに失敗する
../tests/weston-test-fixture-compositor.c: In function 'wait_for_lock':
../tests/weston-test-fixture-compositor.c:135:14: warning: implicit declaration of function 'open'; did you mean 'popen'? [-Wimplicit-function-declaration]
135 | fd = open(lock_path, O_RDWR | O_CLOEXEC | O_CREAT, 00700);
| ^~~~
| popen
../tests/weston-test-fixture-compositor.c:135:30: error: 'O_RDWR' undeclared (first use in this function)
135 | fd = open(lock_path, O_RDWR | O_CLOEXEC | O_CREAT, 00700);
| ^~~~~~
../tests/weston-test-fixture-compositor.c:135:30: note: each undeclared identifier is reported only once for each function it appears in
../tests/weston-test-fixture-compositor.c:135:39: error: 'O_CLOEXEC' undeclared (first use in this function)
135 | fd = open(lock_path, O_RDWR | O_CLOEXEC | O_CREAT, 00700);
| ^~~~~~~~~
../tests/weston-test-fixture-compositor.c:135:51: error: 'O_CREAT' undeclared (first use in this function)
135 | fd = open(lock_path, O_RDWR | O_CLOEXEC | O_CREAT, 00700);
| ^~~~~~~
まぁAlpineはMUSLだしね。。たぶんWSLgは関係なくてPOSIX非準拠問題。 fcntl.h
を足し忘れているので追加する。
動いてはいるものの、RAILにならない
何か違うんだよな。。
できた
LD_LIBRARY_PATH=/opt/rdprail/lib XDG_RUNTIME_DIR=/tmp \
/opt/rdprail/bin/weston --shell=rdprail-shell.so --address=127.0.0.1 \
--port=5699 --xwayland
こういう感じに起動して接続すると、xeyesが出る .rdpファイルを用意できた。
一旦適当に接続する.rdpを作成して、その後.rdpファイルの方に
remoteapplicationmode:i:1
remoteapplicationname:s:hoge
remoteapplicationprogram:s:/usr/bin/xeyes
と書く必要があった。例によってUTF-16なテキストファイルなので notepad.exe
とかで編集せざるを得ない。
一度接続できるとリモートデスクトップクライアントが常駐するので、例えばxtermとかを起動してそこから追加のプロセスを起動することでWindowを追加できる。
ついでにPulseAudioも入れる
libsdnfile-dev
tdb-dev
libice-dev
libsm-dev
libxtst-dev
が追加、
meson build/ -Dtests=false -Ddoxygen=false -Dman=false \
-Doss-output=disabled -Dudev=disabled \
-Dopenssl=disabled --prefix=/opt/rdprail
libintlの参照がおかしい
/home/oku/wslg/PulseAudio-mirror/build/../src/pulse/error.c:75:(.text+0x4c): undefined reference to `libintl_dgettext'
そもそも dgettext
がbuilt-inならlibintl全体が不要って事は無いんじゃないの。。?glibcismだろうか。。
とりあえず常にlibintlをリンクするように変更する。
RDPrail-shellとPulseAudioを組み合わせてみる
PULSE_SERVER=/tmp/PulseServer PULSE_AUDIO_RDP_SINK=/tmp/PulseAudioRDPSink \
PULSE_AUDIO_RDP_SOURCE=/tmp/PulseAudioRDPSource \
LD_LIBRARY_PATH=/opt/rdprail/lib XDG_RUNTIME_DIR=/tmp \
/opt/rdprail/bin/weston --shell=rdprail-shell.so --address=127.0.0.1 --port=5699 --xwayland
LD_LIBRARY_PATH=/opt/rdprail/lib /opt/rdprail/bin/pulseaudio --disallow-exit=true \
--exit-idle-time=-1 \
"--load=module-rdp-sink sink_name=RDPSink" \
"--load=module-rdp-source source_name=RDPSource" \
"--load=module-native-protocol-unix socket=/tmp/PluseServer auth-anonymous=true"
... なんかPulseAudioのクライアントを起動するとストレージに書き込みがめっちゃ発生するんだけど。。
mount -t tmpfs none /tmp
/tmp
をtmpfsにしてみる ...とSourceが動かなくなった。まぁSinkだけで良いか。。たぶんWSL1のエミュレーションの方の問題だと思う。
とりあえずAudaciousで正常に音が出ることは確認した。pavucontrolを終了させると大量の書き込みが止まった。。