diff options
Diffstat (limited to 'pkgs/haskell/xmonad-tv/src/main.hs')
| -rw-r--r-- | pkgs/haskell/xmonad-tv/src/main.hs | 52 |
1 files changed, 32 insertions, 20 deletions
diff --git a/pkgs/haskell/xmonad-tv/src/main.hs b/pkgs/haskell/xmonad-tv/src/main.hs index 711f9eb..05817af 100644 --- a/pkgs/haskell/xmonad-tv/src/main.hs +++ b/pkgs/haskell/xmonad-tv/src/main.hs @@ -9,6 +9,7 @@ import XMonad.Hooks.EwmhDesktops (ewmh) import XMonad.Hooks.EwmhDesktops.Extra (ewmhExtra) import XMonad.Hooks.RefocusLast (refocusLastLayoutHook, toggleFocus) +import Control.Monad (void) import Control.Monad.Extra (whenJustM) import qualified Data.Aeson import qualified Data.ByteString.Char8 @@ -23,10 +24,10 @@ import System.Posix.Process (executeFile) import XMonad.Actions.DynamicWorkspaces (removeEmptyWorkspace) import XMonad.Actions.CycleWS (toggleWS) import XMonad.Layout.Gaps (Direction2D(U,R,D,L), gaps) -import XMonad.Layout.NoBorders ( smartBorders ) +import XMonad.Layout.FocusTracking (focusTracking) +import XMonad.Layout.NoBorders (noBorders) import XMonad.Layout.ResizableTile (ResizableTall(ResizableTall)) import XMonad.Layout.ResizableTile (MirrorResize(MirrorExpand,MirrorShrink)) -import XMonad.Layout.StateFull (pattern StateFull) import qualified XMonad.StackSet as W import Data.Map (Map) import qualified Data.Map as Map @@ -44,6 +45,11 @@ import XMonad.Hooks.Place (placeHook, smart) import XMonad.Actions.PerWorkspaceKeys (chooseAction) import Shutdown (shutdown, newShutdownEventHandler) +import System.IO.Unsafe (unsafePerformIO) + + +sliceEnvPath :: FilePath +sliceEnvPath = unsafePerformIO (getEnv "XMONAD_CACHE_DIR") <> "/slice.env" main :: IO () @@ -70,6 +76,7 @@ readEnv' defaultValue name = mainNoArgs :: IO () mainNoArgs = do + getEnvironment >>= \env -> writeFile sliceEnvPath $ unlines [ k <> "=" <> v | (k, v) <- env] myMasterDelta <- readEnv' (1 / 20) "XMONAD_MASTER_DELTA" :: IO Rational myMasterWidth <- readEnv' (1 / 2) "XMONAD_MASTER_WIDTH" :: IO Rational myScreenGaps <- readEnv' [] "XMONAD_SCREEN_GAPS" :: IO [Int] @@ -95,14 +102,13 @@ mainNoArgs = do , layoutHook = refocusLastLayoutHook $ gaps (zip [U,R,D,L] myScreenGaps) $ - smartBorders $ - ResizableTall - 1 - myMasterDelta - (myMasterWidth + 2 * fromIntegral (borderWidth def) / fromIntegral myScreenWidth) - [] - ||| - StateFull + ResizableTall + 1 + myMasterDelta + (myMasterWidth + 2 * fromIntegral (borderWidth def) / fromIntegral myScreenWidth) + [] + ||| + noBorders (focusTracking Full) , manageHook = composeAll [ appName =? "fzmenu-urxvt" --> doCenterFloat @@ -134,16 +140,22 @@ handleFocusChangeEvent = \case forkFile :: FilePath -> [String] -> Maybe [(String, String)] -> X () -forkFile path args env = - xfork (executeFile path True args env) >> return () +forkFile path args env = void . xfork $ do + environment <- getEnvironment + executeFile path True args (env <> Just environment) -spawnRootTerm :: X () -spawnRootTerm = - forkFile - {-pkg:alacritty-tv-}"alacritty" - ["--profile=root", "-e", "/run/wrappers/bin/su", "-"] - Nothing +forkFileInSlice :: String -> FilePath -> [String] -> X () +forkFileInSlice sliceName path args = void . xfork $ + executeFile {-pkg:systemd-}"systemd-run" True + ( "--collect" + : "--user" + : "--slice=" <> sliceName + : "--property=EnvironmentFile=" <> sliceEnvPath + : path + : args + ) + Nothing myKeys :: XConfig Layout -> Map (KeyMask, KeySym) (X ()) @@ -156,8 +168,8 @@ myKeys conf = Map.fromList $ , ((_4 , xK_p ), forkFile {-pkg:fzmenu-}"passmenu" [] Nothing) , ((_4C , xK_p ), forkFile {-pkg:fzmenu-}"passmenu" ["--phase2-method=copy"] Nothing) - , ((_4 , xK_x ), forkFile {-pkg:alacritty-tv-}"alacritty" ["--singleton"] Nothing) - , ((_4C , xK_x ), spawnRootTerm) + , ((_4 , xK_x ), forkFileInSlice "alacritty" {-pkg:alacritty-tv-}"alacritty" ["--dtach", "--singleton"]) + , ((_4C , xK_x ), forkFileInSlice "alacritty" {-pkg:alacritty-tv-}"alacritty" ["--profile=root", "-e", "/run/wrappers/bin/su", "-"]) , ((_C , xK_Menu ), toggleWS) |
