Xmonad

在 XMonad 中的特定一側渲染視窗邊框

  • June 17, 2018

XMobar 允許配置邊框位置以及寬度:

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

我希望在 XMonad 中做同樣的事情,但似乎邊界只能通過以下屬性進行配置:

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

即使使用XMonad.Layout.NoBorders,這似乎也不是一個選項(或不是一個簡單的選項)。

最後,我想要一個像素的底部邊框,它總是被繪製並根據焦點改變顏色。這目前是否可行,我將如何進行這樣的設置?

在這個問題很少受到關注之後,我打開的 GitHub 問題已經充分回答了這個問題。

這樣做的問題是 xmonad 不繪製自己的邊界。它只是告訴 X 它們應該有多厚和什麼顏色。

$$ It is $$可以告訴 X 使用某些模式$$ with $$結構中的border_pixmap元素XSetWindowAttributes。 如果你假設所有的警告

$$ described $$在 [ https://tronche.com/gui/x/xlib/window/attributes/border.html]實際上並不存在或沒有任何意義,那麼您可能會得出結論$$ … $$可以通過指定一個環繞整個視窗的非常大的像素圖來設置僅底部邊框。 $$ As it stands, $$圖形驅動程序編寫者不斷打破伺服器端邊界,因為現在只有 xmonad 和 dwm 使用它們。而且兩者都沒有使用borderPixmap,所以那裡可能隱藏了很多錯誤。

這裡的要點是,雖然理論上應該可以為此使用視窗屬性,但這不是一個好主意。有一種替代方法可能更好:

要在 xmonad 中獲得此結果,您需要有寬度為 0 的邊框,然後實現視窗裝飾,在您想要“邊框”的位置放置一個彩色條。

實際上很容易編寫一個裝飾樣式類的實例,它將在視窗的一側放置一個類似邊框的裝飾。如果那一側是頂部或底部,那麼欄將足夠寬,並且視窗的標題文本將在其中呈現,但可以通過將文本設置為與欄相同的顏色或提供空白來解決問題字型。

{-# 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

引用自:https://unix.stackexchange.com/questions/413095