Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
RustからX Window Systemを触る
Search
garasubo
January 27, 2020
710
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
RustからX Window Systemを触る
garasubo
January 27, 2020
More Decks by garasubo
See All by garasubo
Cancel Safetyとスレッドリーク
garasubo
1
800
RustでISUCONに勝つには
garasubo
1
840
Rustでの自作OSをやってきて
garasubo
0
1.3k
Armの仮想化支援機構を用いてハイパーバイザーを自作する
garasubo
3
8.2k
Rustで始める自作組込みOS
garasubo
1
3.6k
クラウド向けOS(?)Unikernelとは何か
garasubo
0
1.8k
論文紹介:KVM/ARM: The Design and Implementation of the Linux ARM Hypervisor
garasubo
0
700
Featured
See All Featured
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.8k
Producing Creativity
orderedlist
PRO
348
41k
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
2
410
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
Balancing Empowerment & Direction
lara
6
1.3k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
74
42k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3k
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
720
Why Our Code Smells
bkeepers
PRO
340
58k
Art, The Web, and Tiny UX
lynnandtonic
304
22k
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