Open7

WSLgのRAIL-shellを他所でも使いたい会

okuokuokuoku

いやまぁ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).

ということらしいので。

okuokuokuoku

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)
      |

... 何で。。?

https://github.com/microsoft/weston-mirror/blob/f227edd681479ec3cb2290a25d84d2d3462aebfa/libweston/backend-rdp/rdprail.c#L884-L888

超どうでも良いけどGoogle IMEを特別扱いしてるのか。。少くともC99では _Static_assert は2引数。というわけで rdprail.c 側に修正が必要。

https://github.com/okuoku/weston-mirror/commit/aae6f79b827a8c890b16178726cc2800684ec34a

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 側がメンテナンスされていないため。

https://github.com/microsoft/weston-mirror/blob/f227edd681479ec3cb2290a25d84d2d3462aebfa/rdprail-shell/img-load.c#L192-L196

まぁ必須なのかな。。

テストのビルドに失敗する

../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 を足し忘れているので追加する。

https://github.com/okuoku/weston-mirror/commit/e604e8365acf183eff8caaade4db5de2b01c1e3d

okuokuokuoku

動いてはいるものの、RAILにならない

何か違うんだよな。。

okuokuokuoku

できた

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を追加できる。

okuokuokuoku

ついでに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だろうか。。

https://github.com/microsoft/pulseaudio-mirror/blob/aafdf1b5f90073b4cf26a8e095e2fe433b0ebb2e/meson.build#L378-L386

とりあえず常にlibintlをリンクするように変更する。

https://github.com/okuoku/pulseaudio-mirror/commit/90f0d3865f1b9aab6a80dbce4841727c944311d7

okuokuokuoku

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を終了させると大量の書き込みが止まった。。