add window swallowing

This commit is contained in:
Leon Kowarschick 2020-06-09 22:52:14 +02:00
parent 411be1ae5a
commit 0965527353
5 changed files with 67 additions and 9 deletions

View file

@ -12,8 +12,8 @@ window:
# y: 0 # y: 0
padding: padding:
x: 10 x: 20
y: 10 y: 20
#Spread additional padding evenly around the terminal content. #Spread additional padding evenly around the terminal content.
dynamic_padding: true dynamic_padding: true
@ -338,6 +338,7 @@ colors: *gruvbox
background_opacity: 1.0 background_opacity: 1.0
font: font:
#size: 10
size: 12 size: 12
normal: normal:
#family: JetBrainsMono Nerd Font #family: JetBrainsMono Nerd Font
@ -347,3 +348,6 @@ font:
#family: cherry #family: cherry
#family: lucy tewi2a #family: lucy tewi2a
#family: Scientifica #family: Scientifica
offset:
x: 0
y: 0

View file

@ -1,4 +1,4 @@
{ {
"optOut": false, "optOut": false,
"lastUpdateCheck": 1591520965287 "lastUpdateCheck": 1591697300975
} }

View file

@ -6,14 +6,22 @@ module Config (main) where
import qualified Data.Map.Strict as M import qualified Data.Map.Strict as M
import Control.Concurrent import Control.Concurrent
import Control.Exception ( catch , SomeException) import Control.Exception ( catch , SomeException)
import Control.Monad ( filterM ) import Control.Monad ( filterM
, when
, guard
)
import Control.Arrow ( (>>>) ) import Control.Arrow ( (>>>) )
import Data.List ( isPrefixOf , isSuffixOf) import Data.List ( isPrefixOf
, isSuffixOf
, isInfixOf
)
import qualified Foreign.C.Types
import System.Exit (exitSuccess) import System.Exit (exitSuccess)
import qualified XMonad.Util.ExtensibleState as XS
import qualified Rofi import qualified Rofi
import qualified DescribedSubmap import qualified DescribedSubmap
import qualified TiledDragging import qualified TiledDragging
import qualified GHC.Word
import Data.Foldable ( for_ ) import Data.Foldable ( for_ )
@ -64,7 +72,9 @@ import XMonad.Util.SpawnOnce (spawnOnce)
import XMonad.Util.WorkspaceCompare ( getSortByXineramaPhysicalRule , getSortByIndex) import XMonad.Util.WorkspaceCompare ( getSortByXineramaPhysicalRule , getSortByIndex)
import qualified Data.Monoid import qualified Data.Monoid
import Data.Monoid ( Endo )
import Data.Traversable ( for ) import Data.Traversable ( for )
import Data.Semigroup ( All(..) )
import qualified System.IO as SysIO import qualified System.IO as SysIO
import qualified XMonad.Actions.Navigation2D as Nav2d import qualified XMonad.Actions.Navigation2D as Nav2d
import qualified XMonad.Config.Desktop as Desktop import qualified XMonad.Config.Desktop as Desktop
@ -80,6 +90,7 @@ import qualified XMonad.Layout.MultiToggle.Instances as MTog
import qualified XMonad.Layout.ToggleLayouts as ToggleLayouts import qualified XMonad.Layout.ToggleLayouts as ToggleLayouts
import qualified XMonad.StackSet as W import qualified XMonad.StackSet as W
import qualified XMonad.Util.XSelection as XSel import qualified XMonad.Util.XSelection as XSel
import XMonad.Util.WindowProperties
import qualified XMonad.Layout.PerScreen as PerScreen import qualified XMonad.Layout.PerScreen as PerScreen
{-# ANN module "HLint: ignore Redundant $" #-} {-# ANN module "HLint: ignore Redundant $" #-}
{-# ANN module "HLint: ignore Redundant bracket" #-} {-# ANN module "HLint: ignore Redundant bracket" #-}
@ -488,7 +499,7 @@ main = do
, manageHook = manageSpawn <+> myManageHook <+> manageHook def , manageHook = manageSpawn <+> myManageHook <+> manageHook def
, focusedBorderColor = aqua , focusedBorderColor = aqua
, normalBorderColor = "#282828" , normalBorderColor = "#282828"
, handleEventHook = handleEventHook Desktop.desktopConfig , handleEventHook = mySwallowEventHook <+> handleEventHook Desktop.desktopConfig
--, handleEventHook = minimizeEventHook <+> handleEventHook def <+> hintsEventHook -- <+> Ewmh.fullscreenEventHook --, handleEventHook = minimizeEventHook <+> handleEventHook def <+> hintsEventHook -- <+> Ewmh.fullscreenEventHook
, mouseBindings = myMouseBindings <+> mouseBindings def , mouseBindings = myMouseBindings <+> mouseBindings def
} }
@ -501,6 +512,48 @@ main = do
-- }}} -- }}}
mySwallowEventHook = swallowEventHook ([className =? "Alacritty", className =? "Termite"]) ([return True])
swallowEventHook :: [Query Bool] -> [Query Bool] -> Event -> X All
swallowEventHook parentQueries childQueries event = do
case event of
(DestroyWindowEvent _ _ _ _ eventId window) ->
when (eventId == window) $ do
(SwallowedStorage swallowed) <- XS.get
case M.lookup window swallowed of
Just win -> windows (\ws -> W.shiftWin (W.tag . W.workspace . W.current $ ws) (fromIntegral win) ws)
Nothing -> return ()
return ()
(MapRequestEvent _ _ _ _ _ newWindow) -> withFocused $ \focused -> do
parentMatches <- mapM (`runQuery` focused) parentQueries
childMatches <- mapM (`runQuery` newWindow) childQueries
when (or parentMatches && or childMatches) $ do
newWindowPid <- getProp32s "_NET_WM_PID" newWindow
oldWindowPid <- getProp32s "_NET_WM_PID" focused
case (oldWindowPid, newWindowPid) of
(Just (oldPid:_), Just (newPid:_)) -> do
isChild <- liftIO $ (fromIntegral newPid) `isChildOf` (fromIntegral oldPid)
when isChild $ do
windows (W.shiftWin "NSP" focused) -- TODO use https://hackage.haskell.org/package/xmonad-contrib-0.16/docs/XMonad-Layout-Hidden.html
XS.modify (\(SwallowedStorage m) -> SwallowedStorage $ M.insert newWindow focused m)
_ -> return ()
return ()
_ -> return ()
return $ All True
isChildOf :: Int -> Int -> IO Bool
isChildOf child parent = do
output <- runProcessWithInput "pstree" ["-T", "-p", show parent] ""
return $ any ((show child) `isInfixOf`) $ lines output
newtype SwallowedStorage = SwallowedStorage (M.Map GHC.Word.Word64 GHC.Word.Word64) deriving Typeable
instance ExtensionClass SwallowedStorage where
initialValue = SwallowedStorage mempty
-- POLYBAR Kram -------------------------------------- {{{ -- POLYBAR Kram -------------------------------------- {{{
-- | Loghook for polybar on a given monitor. -- | Loghook for polybar on a given monitor.

View file

@ -23,4 +23,5 @@ executable my-xmonad
netlink >=1.1.1.0, netlink >=1.1.1.0,
containers >=0.6.2.1, containers >=0.6.2.1,
utf8-string >=1.0.1.1, utf8-string >=1.0.1.1,
text >=1.2.4.0 text >=1.2.4.0,
process >= 0.0.10