Merge pull request #574 from slotThe/only-float

X.L.NoBorders: Add OnlyFloat
This commit is contained in:
slotThe 2021-07-24 10:22:46 +02:00 committed by GitHub
commit 97289ff6ca
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 38 additions and 0 deletions

View File

@ -582,6 +582,9 @@
- Fixed handling of floating window borders in multihead setups that was - Fixed handling of floating window borders in multihead setups that was
broken since 0.14. broken since 0.14.
- Added `OnlyFloat` constructor to `Ambiguity` to unconditionally
remove all borders on floating windows.
* `XMonad.Hooks.UrgencyHook` * `XMonad.Hooks.UrgencyHook`

View File

@ -279,6 +279,8 @@ instance SetsAmbiguous Ambiguity where
in lr == wr1 && (not . or) vu in lr == wr1 && (not . or) vu
OnlyLayoutFloat -> OnlyLayoutFloat ->
lr == wr1 lr == wr1
OnlyFloat ->
True
_ -> _ ->
wr1 `R.supersetOf` sr wr1 `R.supersetOf` sr
return w1 return w1
@ -288,6 +290,7 @@ instance SetsAmbiguous Ambiguity where
| Screen <- amb = [w] | Screen <- amb = [w]
| OnlyScreenFloat <- amb = [] | OnlyScreenFloat <- amb = []
| OnlyLayoutFloat <- amb = [] | OnlyLayoutFloat <- amb = []
| OnlyFloat <- amb = []
| OnlyLayoutFloatBelow <- amb = [] | OnlyLayoutFloatBelow <- amb = []
| OtherIndicated <- amb | OtherIndicated <- amb
, let nonF = map integrate $ W.current wset : W.visible wset , let nonF = map integrate $ W.current wset : W.visible wset
@ -326,6 +329,9 @@ data Ambiguity
-- ^ Focus in an empty screen does not count as ambiguous. -- ^ Focus in an empty screen does not count as ambiguous.
| OtherIndicated | OtherIndicated
-- ^ No borders on full when all other screens have borders. -- ^ No borders on full when all other screens have borders.
| OnlyFloat
-- ^ Remove borders on all floating windows; tiling windows of
-- any kinds are not affected.
| Screen | Screen
-- ^ Borders are never drawn on singleton screens. With this one you -- ^ Borders are never drawn on singleton screens. With this one you
-- really need another way such as a statusbar to detect focus. -- really need another way such as a statusbar to detect focus.

View File

@ -122,6 +122,10 @@ instance Arbitrary RectC where
instance Arbitrary Rectangle where instance Arbitrary Rectangle where
arbitrary = Rectangle <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary arbitrary = Rectangle <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary
instance Arbitrary RationalRect where
arbitrary = RationalRect <$> dim <*> dim <*> dim <*> dim
where
dim = arbitrary `suchThat` liftM2 (&&) (>= 0) (<= 1)
newtype SizedPositive = SizedPositive Int newtype SizedPositive = SizedPositive Int
deriving (Eq, Ord, Show, Read) deriving (Eq, Ord, Show, Read)

View File

@ -1,13 +1,17 @@
{-# LANGUAGE ViewPatterns #-}
{-# LANGUAGE RecordWildCards #-} {-# LANGUAGE RecordWildCards #-}
{-# OPTIONS_GHC -Wall #-} {-# OPTIONS_GHC -Wall #-}
module NoBorders where module NoBorders where
import Instances ()
import Test.Hspec import Test.Hspec
import Test.Hspec.QuickCheck
import qualified Data.Map as M import qualified Data.Map as M
import XMonad hiding (Screen) import XMonad hiding (Screen)
import qualified XMonad.Layout.NoBorders as NB import qualified XMonad.Layout.NoBorders as NB
import XMonad.Prelude
import XMonad.StackSet import XMonad.StackSet
spec :: Spec spec :: Spec
@ -39,6 +43,27 @@ spec = do
NB.hiddens amb ws r1 s1 [] `shouldBe` [1] NB.hiddens amb ws r1 s1 [] `shouldBe` [1]
it "removes border on visible screen" $ do it "removes border on visible screen" $ do
NB.hiddens amb ws r2 s2 [] `shouldBe` [2] NB.hiddens amb ws r2 s2 [] `shouldBe` [2]
prop "prop_OnlyFloat" prop_OnlyFloat
-- | All floating windows should be borderless.
prop_OnlyFloat
:: [Window] -- ^ Windows on the first monitor
-> [Window] -- ^ Windows on the second monitor
-> [RationalRect] -- ^ Floating window rectangles
-> Bool -- ^ Whether to consider focused or visible screen
-> Bool
prop_OnlyFloat (nub -> w1) (nub -> w2) frs b
= sort (w `intersect` map fst floats)
== sort (NB.hiddens NB.OnlyFloat ws r (differentiate w) [])
where
(w, w', r) = if b then (w1, w2, r1) else (w2, w1, r2)
ws = wsDualHead (differentiate w1) (differentiate w2) floats
floats = zip (interleave w w') frs
interleave :: [a] -> [a] -> [a]
interleave (x : xs) (y : ys) = x : y : interleave xs ys
interleave [] ys = ys
interleave xs [] = xs
-- +------+------+ -- +------+------+
-- | r1 | r2 | -- | r1 | r2 |