<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Sway on オブライエンの日誌</title><link>https://america.github.io/tags/sway/</link><description>Recent content in Sway on オブライエンの日誌</description><generator>Hugo</generator><language>ja-JP</language><lastBuildDate>Sun, 09 Aug 2026 17:00:00 +0900</lastBuildDate><atom:link href="https://america.github.io/tags/sway/index.xml" rel="self" type="application/rss+xml"/><item><title>swayfxのscratchpadクラッシュを追う: git blameで見つけたupstreamとの噛み合わせ問題</title><link>https://america.github.io/post/2026-08-09-swayfx-scratchpad-null-crash/</link><pubDate>Sun, 09 Aug 2026 17:00:00 +0900</pubDate><guid>https://america.github.io/post/2026-08-09-swayfx-scratchpad-null-crash/</guid><description>&lt;h2 id="事象"&gt;事象&lt;/h2&gt;
&lt;p&gt;普段使っているswayfx上で、scratchpadに入れたウィンドウを表示している状態からもう一度&lt;code&gt;scratchpad show&lt;/code&gt;を叩くと、コンポジタごと丸ごと落ちる現象に遭遇した。SDDMのログイン画面まで戻される、なかなか派手なクラッシュ。&lt;/p&gt;
&lt;p&gt;環境:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;項目&lt;/th&gt;
&lt;th&gt;値&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;swayfx&lt;/td&gt;
&lt;td&gt;0.5.3-4(sway 1.11.0ベース、Arch Linuxパッケージ)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;wlroots&lt;/td&gt;
&lt;td&gt;0.19.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPU&lt;/td&gt;
&lt;td&gt;AMD Radeon RX 6600 XT(amdgpu)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;bindsymはこう組んでいた:&lt;/p&gt;
&lt;div class="codeblock-wrapper"&gt;
&lt;pre&gt;
&lt;code id="codeblock-0" class="language-"&gt;bindsym $mod+minus scratchpad show, resize set width 90 ppt height 90 ppt, move position center&lt;/code&gt;
&lt;/pre&gt;
&lt;button class="copy-btn" onclick="copyToClipboard('codeblock-0', this)"&gt;Copy&lt;/button&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;scratchpad show&lt;/code&gt;と同時に&lt;code&gt;resize&lt;/code&gt;・&lt;code&gt;move&lt;/code&gt;を連続実行する形。これを2回続けて押す(1回目で表示、2回目でフォーカスしたまま押してhideパスに入る)とクラッシュする。&lt;/p&gt;
&lt;h2 id="スタックトレースを取る"&gt;スタックトレースを取る&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;coredumpctl&lt;/code&gt; + &lt;code&gt;gdb&lt;/code&gt;(デバッグシンボル入り)でコアダンプを解析した。&lt;/p&gt;
&lt;div class="codeblock-wrapper"&gt;
&lt;pre&gt;
&lt;code id="codeblock-1" class="language-"&gt;#0 root_scratchpad_hide (con=0x55f058a52400) at ../swayfx-0.5.3/sway/tree/root.c:257
257 set_container_transform(con-&gt;pending.workspace, con);
seat = 0x55f0580db940
focus = 0x55f058a41760
ws = 0x0&lt;/code&gt;
&lt;/pre&gt;
&lt;button class="copy-btn" onclick="copyToClipboard('codeblock-1', this)"&gt;Copy&lt;/button&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;ws&lt;/code&gt;(= &lt;code&gt;con-&amp;gt;pending.workspace&lt;/code&gt;)が&lt;code&gt;NULL&lt;/code&gt;のまま&lt;code&gt;set_container_transform()&lt;/code&gt;に渡され、内部で参照外しして落ちていた。該当箇所のコードはこうなっていた:&lt;/p&gt;
&lt;div class="codeblock-wrapper"&gt;
&lt;pre&gt;
&lt;code id="codeblock-2" class="language-c"&gt;void root_scratchpad_hide(struct sway_container *con) {
struct sway_seat *seat = input_manager_current_seat();
struct sway_node *focus = seat_get_focus_inactive(seat, &amp;root-&gt;node);
struct sway_workspace *ws = con-&gt;pending.workspace;
if (con-&gt;pending.fullscreen_mode == FULLSCREEN_GLOBAL &amp;&amp; !con-&gt;pending.workspace) {
// If the container was made fullscreen global while in the scratchpad,
// it should be shown until fullscreen has been disabled
return;
}
...
set_container_transform(con-&gt;pending.workspace, con); // ガードなし&lt;/code&gt;
&lt;/pre&gt;
&lt;button class="copy-btn" onclick="copyToClipboard('codeblock-2', this)"&gt;Copy&lt;/button&gt;
&lt;/div&gt;
&lt;p&gt;NULLチェックが「&lt;code&gt;FULLSCREEN_GLOBAL&lt;/code&gt;のときだけ」に絞られていて、それ以外の理由で&lt;code&gt;pending.workspace&lt;/code&gt;がNULLになるケースを素通りしてしまう。&lt;code&gt;set_container_transform()&lt;/code&gt;はswayfx独自の追加関数(本家swayには存在しない)なので、一見swayfx側のバグに見えた。&lt;/p&gt;</description></item></channel></rss>