「OSS貢献」「ウィンドウが出ない」を追い詰める:Telegram×Wayland×COSMICの非自明バグを直すまで
正直に言うと、私のOSS貢献は長い間「小さな修正」しかありませんでした。
以前に入れたのは Dart linter の typo fix で、ルール説明の誤字を直した程度です(それでも “This is great. Thank you!” と言ってもらえたのは嬉しかった)。
でも今回、初めて「これは腰を据えてやり切りたい」と思える問題に出会いました。
私は普段から COSMIC Desktop を使っていて、Telegramのメディアビューアが beta.6 あたりからクラッシュ/再表示できない というIssueが上がっているのを見つけました。Issueは 2025/11/16 に報告され、後に私のPR #1975 でクローズされました。
1. 最初は「Smithayのバグ」だと思った
初期の切り分けでは「Waylandコンポジタの土台(Smithay)側が怪しいのでは?」という仮説が自然でした。
実際、Telegram(Qt)のようなクライアントは wl_surface を再利用する挙動があり、古いロールの状態が残っていると「初回configureを出しそびれる」系の事故が起きやすい。
そこで私は先に Smithay 側にPRを作り、get_toplevel のタイミングで古い状態を掃除して“新しいロールをクリーンな状態で開始する”方針を提案しました(reset_toplevel_surface_state の導入)。
ただレビューでは、「cleanupロジックが二重化するのはNG。既存の掃除が壊れているならそこを直すべき」という指摘も受けました。
この時点で「確かに、これは“強い修正”で押し切る話じゃない」と腹落ちしました。
2. 徹夜で cosmic-comp の根本原因を掘る
そこから一晩、cosmic-comp側の状態遷移を追いかけました。
鍵だったのは unmap_surface が“副作用として” pending_windows に突っ込む設計でした。
Telegramのように xdg_toplevel を壊しても wl_surface を保持し、その後同じsurfaceに新しいtoplevelを貼り直すクライアントでは、次のような不正な流れが起きていました:
- toplevel破棄 → “死んだウィンドウ”が
pending_windowsに残る - 直後にクリーンアップcommit(null buffer attachなど)が来る
- それに反応してconfigureを送ってしまい、内部的に
configured=trueになってしまう - そして次のtoplevel作成時に「もうconfiguredだから初回configure不要」と誤判定
- クライアントは初回configure待ちで固まり、ウィンドウが永遠に出ない
3. 修正:Unmap と Destroy を区別する
解決はシンプルですが、設計に踏み込みました。unmap_surface の「自動で pending_windows に入れる副作用」をやめ、Option<PendingWindow> を返すようにリファクタしました。
- X11(Unmap / 再mapあり):呼び出し側が戻り値を
pending_windowsに保存(既存挙動維持) - Wayland(Destroy / ロール消滅):呼び出し側が戻り値を捨てて即破棄(汚れた追跡状態を残さない)
この修正PRは 2026/01/09 にmasterへマージされ、レビューでも
“Thanks for digging into this! Seems like the correct fix for me.”
というコメントをもらえました。
4. この経験で得たこと
今回の学びは、単に「バグを直した」以上でした。
- プロトコル/ライフサイクルの意味論(Unmap vs Destroy)を正しく反映しないと、状態管理は簡単に破綻する
- “とりあえず全部掃除する”ような big hammer は、短期的に直っても設計負債になりうる
- 根本原因に到達するには、Issue→再現→ログ→状態遷移の追跡→設計変更、の順で粘り強く進める必要がある
普段使っている環境だからこそ、ユーザー視点の痛みも分かるし、直せた時の喜びも大きい。
これからも、使っているソフトに対して「使うだけ」ではなく「直す側」に回れるエンジニアでいたいと思っています。
末尾に付けると強い:リンク(本文の最後に)
- cosmic-comp PR: https://github.com/pop-os/cosmic-comp/pull/1975
- 関連Issue(再現・症状): https://github.com/pop-os/cosmic-comp/issues/1816
- Smithay PR(最初の仮説と検証): https://github.com/Smithay/smithay/pull/1901
- 過去の小さなOSS貢献(Dart linter): https://github.com/dart-archive/linter/pull/3806