固定(_NET_WM_STATE_STICKY)ウィンドウとフローティング(_NET_WM_STATE_ABOVE)ウィンドウラベルを尊重するようにxmonadを設定する方法

固定(_NET_WM_STATE_STICKY)ウィンドウとフローティング(_NET_WM_STATE_ABOVE)ウィンドウラベルを尊重するようにxmonadを設定する方法

一つxpropこれらのウィンドウを呼び出すと、_NET_WM_STATEプロパティに次の2つのフラグが表示されます。

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

解決策は次のとおりです。

  1. ウィンドウを_NET_WM_STATE_ABOVEフローティングとして表示します。
  2. 表示されたウィンドウを_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

おすすめ記事