Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
RustからX Window Systemを触る
Search
garasubo
January 27, 2020
0
610
RustからX Window Systemを触る
garasubo
January 27, 2020
Tweet
Share
More Decks by garasubo
See All by garasubo
Cancel Safetyとスレッドリーク
garasubo
1
410
RustでISUCONに勝つには
garasubo
1
620
Rustでの自作OSをやってきて
garasubo
0
1k
Armの仮想化支援機構を用いてハイパーバイザーを自作する
garasubo
3
6.9k
Rustで始める自作組込みOS
garasubo
1
3.4k
クラウド向けOS(?)Unikernelとは何か
garasubo
0
1.7k
論文紹介:KVM/ARM: The Design and Implementation of the Linux ARM Hypervisor
garasubo
0
560
Featured
See All Featured
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
8
1.2k
Rebuilding a faster, lazier Slack
samanthasiow
79
8.8k
Building a Scalable Design System with Sketch
lauravandoore
460
33k
Speed Design
sergeychernyshev
25
740
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
33
2.7k
GitHub's CSS Performance
jonrohan
1030
460k
Fireside Chat
paigeccino
34
3.1k
YesSQL, Process and Tooling at Scale
rocio
170
14k
Reflections from 52 weeks, 52 projects
jeffersonlam
348
20k
The Invisible Side of Design
smashingmag
299
50k
The Power of CSS Pseudo Elements
geoffreycrofte
74
5.4k
StorybookのUI Testing Handbookを読んだ
zakiyama
28
5.4k
Transcript
RustからX Window Systemを触る @garasubo
きっかけ Mozillaの新しいブラウザエンジンのServoのIssueに取り掛 かろうとした https://github.com/servo/servo/issues/24724 Servoの依存するライブラリに変更が必要なことがわかり、 x11を触ることに
X Window System (X11) Linuxのウィンドウシステムの1つ C言語用のインタフェースが提供されている RustもC言語インターフェースを呼び出しをサポート しているので、Rustでも使える
RustからX11ライブラリを触る バインディングのクレートが存在している https://crates.io/crates/x11-dl いくつか対応していないインターフェースもある
RustとC言語はデータ表現が違う 構造体にはrepr(C)をつける 文字列ではStringではなくCstring、CStrを使う 関数ポインタはOptionでラップする Rustでは関数ポインタは0(Null)にならないが、Cではなりえる
Optionは0になりなりえない型ではNoneを0とする最適化を行う
C言語の型はゆるい 例:XIMのPreedit Start Callback 型定義 typedef void (*XIMProc)(XIM,XPointer,XPointer); 現実 static
int preedit_start_callback( XIC xim, XPointer client_data, XPointer call_data){}
C言語にはライフタイムがない 一度参照から生ポインタに変換するとライフタイムや Mutabilityのチェックが消える C言語から渡されてくる生ポインタにもライフタイムがな い 例:C言語からくる文字列ポインタをCString::from_rawに 渡してしまう
Rust側にオーナーシップを渡してしまい、勝手にリソースを開放し てしまう CStrを使うのが正解
まとめ C言語とRustのデータ表現の差異から来る罠はたくさんある ただのC言語バインディングではRustの旨味が消えてしまう 適切にC言語ライブラリをラップして汚いところを隠蔽しま しょう X11直接触るよりはそれをラップしたwinitを使うと楽
https://github.com/rust-windowing/winit