summaryrefslogtreecommitdiffstats
path: root/pkgs/haskell/xmonad-tv/src/main.hs
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/haskell/xmonad-tv/src/main.hs')
-rw-r--r--pkgs/haskell/xmonad-tv/src/main.hs52
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)