![고정(_NET_WM_STATE_STICKY) 및 부동(_NET_WM_STATE_ABOVE) 창 레이블을 존중하도록 xmonad를 구성하는 방법](https://linux55.com/image/207711/%EA%B3%A0%EC%A0%95(_NET_WM_STATE_STICKY)%20%EB%B0%8F%20%EB%B6%80%EB%8F%99(_NET_WM_STATE_ABOVE)%20%EC%B0%BD%20%EB%A0%88%EC%9D%B4%EB%B8%94%EC%9D%84%20%EC%A1%B4%EC%A4%91%ED%95%98%EB%8F%84%EB%A1%9D%20xmonad%EB%A5%BC%20%EA%B5%AC%EC%84%B1%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
하나xprop
이러한 창을 호출하면 _NET_WM_STATE
속성에 다음 두 플래그가 표시됩니다.
WM_STATE(WM_STATE):
window state: Normal
icon window: 0x0
_NET_WM_STATE(ATOM) = _NET_WM_STATE_ABOVE, _NET_WM_STATE_STICKY
...
WM_NAME(UTF8_STRING) = "Picture in picture"
_NET_WM_NAME(UTF8_STRING) = "Picture in picture"
우리가 어떻게 설정했는지xmonad두 플래그를 모두 존중하시겠습니까?
답변1
해결책은 다음과 같습니다.
- 창을
_NET_WM_STATE_ABOVE
부동으로 표시합니다. - 표시된 창을
_NET_WM_STATE_STICKY
모든 작업 공간에 복사합니다.
import Data.Maybe ( fromMaybe )
import XMonad.Actions.CopyWindow ( copyToAll )
import XMonad.Util.WindowProperties ( getProp32 )
-- Other standard xmonad imports omitted.
myManageHook =
composeAll
$ [ hasNetWMState "_NET_WM_STATE_ABOVE" --> doFloat
, hasNetWMState "_NET_WM_STATE_STICKY" --> doF copyToAll
, ...
]
where
-- | Get the `_NET_WM_STATE` property as a list of atoms.
getNetWMState :: Window -> X [Atom]
getNetWMState w = do
atom <- getAtom "_NET_WM_STATE"
map fromIntegral . fromMaybe [] <$> getProp32 atom w
hasNetWMState :: String -> Query Bool
hasNetWMState state = do
window <- ask
wmstate <- liftX $ getNetWMState window
atom <- liftX $ getAtom state
return $ elem atom wmstate