Я буду использовать исходный код XMonad.Layout.NoBorders в качестве ссылки, поскольку я не могу найти ничего более подходящего из уже существующего. Мы хотим увидеть, как он реализует «удаление границ в полноэкранных плавающих окнах», чтобы увидеть, можно ли легко смягчить его, чтобы «удалить границы в плавающих окнах» (без полноэкранного ограничения).
Согласно ответу на вопрос, который вы связали:
layoutHook = lessBorders OnlyFloat $ avoidStruts $ myLayout
OnlyFloat
кажется спецификатором для «удаления границ в полноэкранных плавающих окнах», поэтому давайте проверим определение этого:
data Ambiguity = Combine With Ambiguity Ambiguity
| OnlyFloat
| Never
| EmptyScreen
| OtherIndicated
| Screen
deriving (Read, Show)
Не слишком полезно само по себе. Мы должны посмотреть в другом месте, чтобы увидеть, как код обрабатывает эти значения.
Можно с уверенностью сказать, что первой нужно проверить функцию lessBorders
:
lessBorders :: (SetsAmbiguous p, Read p, Show p, LayoutClass l a) =>
p -> l a -> ModifiedLayout (ConfigurableBorder p) l a
lessBorders amb = ModifiedLayout (ConfigurableBorder amb [])
Из сигнатуры типа lessBorders
мы видим, что:
OnlyFloat :: (SetsAmbiguous p, Read p, Show p) => p
Это хороший знак, так как это означает, что lessBorders
явно не ожидает Ambiguity
: здесь мы можем расширить функциональность, реализовав собственный SetsAmbiguous
и передав его существующему lessBorders
. Давайте теперь посмотрим на SetsAmbiguous
и его реализацию Ambiguity
:
class SetsAmbiguous p where
hiddens :: p -> WindowSet -> Maybe (W.Stack Window) -> [(Window, Rectangle)] -> [Window]
instance SetsAmbiguous Ambiguity where
hiddens amb wset mst wrs
| Combine Union a b <- amb = on union next a b
| Combine Difference a b <- amb = on (\\) next a b
| Combine Intersection a b <- amb = on intersect next a b
| otherwise = tiled ms ++ floating
where next p = hiddens p wset mst wrs
nonzerorect (Rectangle _ _ 0 0) = False
nonzerorect _ = True
screens =
[ scr | scr <- W.screens wset,
case amb of
Never -> True
_ -> not $ null $ integrate scr,
nonzerorect . screenRect $ W.screenDetail scr]
floating = [ w |
(w, W.RationalRect px py wx wy) <- M.toList . W.floating $ wset,
px <= 0, py <= 0,
wx + px >= 1, wy + py >= 1]
ms = filter (`elem` W.integrate' mst) $ map fst wrs
tiled [w]
| Screen <- amb = [w]
| OnlyFloat <- amb = []
| OtherIndicated <- amb
, let nonF = map integrate $ W.current wset : W.visible wset
, length (concat nonF) > length wrs
, singleton $ filter (1==) $ map length nonF = [w]
| singleton screens = [w]
tiled _ = []
integrate y = W.integrate' . W.stack $ W.workspace y
hiddens
— единственный метод, который нам нужно реализовать. Его аргументами являются наше значение SetsAmbiguous
, WindowSet
и некоторые другие вещи, и он возвращает список окон, у которых не должно быть границ. Существует много логики для операций объединения и других значений Ambiguity
, но сейчас это не имеет для нас значения. Нас интересует вот этот фрагмент:
floating = [ w |
(w, W.RationalRect px py wx wy) <- M.toList . W.floating $ wset,
px <= 0, py <= 0,
wx + px >= 1, wy + py >= 1]
Это очень многообещающе. Он определяет набор плавающих окон, извлекая все окна из раздела floating
WindowSet
, преобразовывая его в список (изначально это Data.Map
) и отфильтровывая все окна, которые не покрывают весь экран. Все, что нам нужно сделать, это удалить фильтр.
После внесения этого изменения и удаления всего ненужного кода, относящегося к мозаичным окнам и операциям набора (что составляет большую часть реализации), мы просто получаем:
import XMonad.Layout.NoBorders
import qualified XMonad.StackSet as W
import qualified Data.Map as M
data AllFloats = AllFloats deriving (Read, Show)
instance SetsAmbiguous AllFloats where
hiddens _ wset _ _ = M.keys $ W.floating wset
Тогда мы можем сказать:
layoutHook = lessBorders AllFloats $ myLayout...
person
DarthFennec
schedule
31.07.2019