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에서 이 결과를 얻으려면 너비가 0인 테두리가 있어야 하며 "테두리"를 원하는 위치에 색상 막대를 배치하는 창 장식을 구현해야 합니다.

실제로 창 한쪽에 테두리 같은 장식을 배치하는 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

관련 정보