XMonadの特定の側面にウィンドウの境界線をレンダリング

XMonadの特定の側面にウィンドウの境界線をレンダリング

XMobarを使用すると、境界線の位置と幅を設定できます。

{ border = BottomB
, borderColor = "#4F5B66"
, borderWidth = 1 }

XMonadでも同じことをしたいのですが、次のプロパティでのみ境界線を構成できるようです。

{ borderWidth = 1
, normalBorderColor = "#4F5B66"
, focusedBorderColor = "#96B5B4" }

可能であっても、XMonad.Layout.NoBordersこれはオプションではないようです(または簡単なオプションではないようです)。

最後に、常に描画され、フォーカスに応じて色が変わるピクセルの下側の境界線を持ちたいです。現在これは可能ですか?これを設定するにはどうすればよいですか?

ベストアンサー1

この質問に対する回答は完全に完了しました。GitHubの問題この問題がほとんど関心を受けていない後に開いてみました。

これの問題は、xmonadが独自の境界を描画しないことです。 Xには、境界がどれほど厚く、どの色なのかを伝えます。

[可能] Xに、構造border_pixmapの要素に特定のパターンを使用するように指示できますXSetWindowAttributes

[に記載されているすべての警告を仮定すると、https://tronche.com/gui/x/xlib/window/attributes/border.html]実際に存在しないか意味がない場合は、[...]ウィンドウ全体を囲む非常に大きなピックスマップを指定して下部の境界線を設定できると結論付けることができます。

[現在の状態では]グラフィックスドライバーの作成者は、xmonadとdwmだけがサーバー側の境界を使用しているため、サーバー側の境界を引き続き壊しています。そして両方ともborderPixmapを使用しないので、そこに多くのバグが隠れている可能性があります。

ここで重要なのは、これを達成するためにウィンドウプロパティを使用することが理論的には可能ですが、良い考えではないということです。より良い選択肢があるかもしれません。

xmonadでこの結果を得るには、ゼロの幅を持つ境界線が必要です。

実際、ウィンドウの片側に境界線のような装飾を配置するDecorStyleクラスのインスタンスを作成するのは非常に簡単です。その面が上部または下部の場合、バーは十分に広くなり、ウィンドウのタイトルテキストはその中にレンダリングされますが、テキストをバーと同じ色に設定するか、空のフォントを提供することでこの問題を解決できます。

{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances #-}

import qualified XMonad.StackSet as W
import XMonad.Layout.Decoration
import XMonad.Util.Types

data SideDecoration a = SideDecoration Direction2D
  deriving (Show, Read)

instance Eq a => DecorationStyle SideDecoration a where

  shrink b (Rectangle _ _ dw dh) (Rectangle x y w h)
    | SideDecoration U <- b = Rectangle x (y + fi dh) w (h - dh)
    | SideDecoration R <- b = Rectangle x y (w - dw) h
    | SideDecoration D <- b = Rectangle x y w (h - dh)
    | SideDecoration L <- b = Rectangle (x + fi dw) y (w - dw) h

  pureDecoration b dw dh _ st _ (win, Rectangle x y w h)
    | win `elem` W.integrate st && dw < w && dh < h = Just $ case b of
      SideDecoration U -> Rectangle x y w dh
      SideDecoration R -> Rectangle (x + fi (w - dw)) y dw h
      SideDecoration D -> Rectangle x (y + fi (h - dh)) w dh
      SideDecoration L -> Rectangle x y dw h
    | otherwise = Nothing

おすすめ記事