Awesome に MWM ヒント プロパティを理解させてウィンドウに装飾を付けない
他のウィンドウ マネージャーでは装飾の無い CSD (Client Side Decoration) ウィンドウに、awesome では装飾が付くのでこれが付かないようにいじってみ ました。Awesome のバージョンは 3.5.9 です。
out of the box では付箋アプリケーションや、Gtk3 アプリケーションにウィ ンドウ枠が付くと思います。タイトルバーを有効にしている場合はタイトルバー も付くので二重にタイトルバー(Gtk3の場合はヘッダーバーと呼ぶようですが) が付いて具合が悪いです。
これらのアプリケーションのウィンドウは(古より伝わる) _MOTIF_WM_HINTS
というプロパティでウィンドウ装飾をして欲しくない事をウィンドウマネー
ジャーに伝えています。
Awesome の API にはウィンドウの X プロパティを読む関数(client
の
get_xproperty
メソッド)があるのですが、これは既知の文字列型やブール
型のプロパティしか読めません。
一方、
Xlib How Does This (Removing Window Decoration) Work? - Stack Overflow
によると _MOTIF_WM_HINTS
の構造は以下のようになっています。
typedef struct Hints
{
unsigned long flags;
unsigned long functions;
unsigned long decorations;
long inputMode;
unsigned long status;
} Hints;
また、xprop
コマンドで装飾の付くべきでないウィンドウのプロパティを見ると、以下のように出ます。
_MOTIF_WM_HINTS(_MOTIF_WM_HINTS) = 0x3, 0x21, 0x0, 0x0, 0x0
3つ目の数字が 0 だったら装飾無しを指示していると考えて良いようです。
というわけで、シェル芸でウィンドウに装飾無しヒントが付いているかどうか 判定する関数を書きます。
function is_client_side_decoration (id)
local code = os.execute("xprop -id " .. tostring(id) .. " _MOTIF_WM_HINTS | awk '{ print $5; }' | grep 0x0, > /dev/null")
if code == 0 then
return true
else
return false
end
end
Awesome のバージョンによってやり方が違うと思いますが、自分が使っている
バージョンの awesome では rc.lua
で “manage” シグナルのハンドラでタ
イトルバーを付けるかどうかの処理があるので、ここの if 文
if titlebars_enabled and (c.type == "normal" or c.type == "dialog") then
-- タイトルバーを付ける処理…
を次のように変更してやれば CSD ウィンドウにタイトルバーが付かなくなります。
if titlebars_enabled and (c.type == "normal" or c.type == "dialog") and not is_client_side_decoration(c.window) then
同様に CSD ウィンドウの時に c.border_width = 0
としてやると枠が付か
なくなりますね。がんばってみてください。