From 31a4b8d61e587fc5425df48fb95a5a7553c2a31d Mon Sep 17 00:00:00 2001 From: janabhumi Date: Mon, 12 Sep 2022 00:05:25 +0300 Subject: [PATCH] home/xmonad: kill previous workspace windows --- home/ui/xmonad/config.hs | 232 +++++++++++++++++++++++---------------- 1 file changed, 136 insertions(+), 96 deletions(-) diff --git a/home/ui/xmonad/config.hs b/home/ui/xmonad/config.hs index 44e428e..87c5ef1 100644 --- a/home/ui/xmonad/config.hs +++ b/home/ui/xmonad/config.hs @@ -8,6 +8,7 @@ -- import qualified Codec.Binary.UTF8.String as UTF8 +import Control.Monad (replicateM_, sequence_) import qualified DBus as D import qualified DBus.Client as D import Data.Map.Strict (Map) @@ -196,7 +197,9 @@ myLayout = avoidStruts . smartBorders $ (Mirror tiled ||| tiled ||| column3 ||| -- per-workspace layout choices. -- -- By default, do nothing. -myStartupHook = return () +myStartupHook = do + spawn "kotatogram-desktop" + spawn "nheko" ------------------------------------------------------------------------ -- Status bars and logging @@ -254,94 +257,95 @@ myManageHook = manageApps -- Key bindings. Add, modify or remove key bindings here. -- myKeys conf = - let easyMotionConfig = - def - { sKeys = AnyKeys [xK_a, xK_o, xK_e, xK_u, xK_h, xK_t, xK_n, xK_s] - } + mkKeymap conf $ + apps_kb ++ workspaces_kb ++ windows_kb ++ layout_kb ++ system_kb ++ misc_kb + where + apps_kb = + [ -- launch a terminal + ("M-S-", spawn $ XMonad.terminal conf), + -- launch a 'flameshot' to screenshot + ("M-S-s", safeSpawn "flameshot" ["gui"]), + -- launch 'librewolf' browser + ("M-S-b", spawn "librewolf"), + -- launch 'dmenu_run' to choose applications + ("M-p", spawn "dmenu_run") + -- Open calculator + -- ("", spawn "gnome-calculator"), + ] - apps_kb = - [ -- launch a terminal - ("M-S-", spawn $ XMonad.terminal conf), - -- launch a 'flameshot' to screenshot - ("M-S-s", safeSpawn "flameshot" ["gui"]), - -- launch 'librewolf' browser - ("M-S-b", spawn "librewolf"), - -- launch 'dmenu_run' to choose applications - ("M-p", spawn "dmenu_run") - -- Open calculator - -- ("", spawn "gnome-calculator"), - ] + workspaces_kb = + -- + -- mod-[1..9], Switch to workspace N + -- mod-shift-[1..9], Move client to workspace N + -- + [ ("M-" ++ m ++ show k, windows $ f i) + | (i, k) <- zip (XMonad.workspaces conf) [1 .. 9], + (f, m) <- [(W.greedyView, ""), (W.shift, "S-")] + ] - workspaces_kb = + windows_kb = + [ -- close focused window + ("M4-S-c", kill), + -- Resize viewed windows to the correct size + ("M-n", refresh), + -- Easy moution to focus windows + ("M-s", selectWindow easyMotionConfig >>= (`whenJust` windows . W.focusWindow)), + -- Move focus to the next window + ("M-j", windows W.focusDown), + -- Move focus to the previous window + ("M-k", windows W.focusUp), + -- Move focus to the master window + ("M-m", windows W.focusMaster), + -- Swap the focused window and the master window + ("M-", windows W.swapMaster), + -- Swap the focused window with the next window + ("M-S-j", windows W.swapDown), + -- Swap the focused window with the previous window + ("M-S-k", windows W.swapUp) + ] + where + easyMotionConfig = + def + { sKeys = AnyKeys [xK_a, xK_o, xK_e, xK_u, xK_h, xK_t, xK_n, xK_s] + } + + layout_kb = + [ -- Rotate through the available layout algorithms + ("M-", cycleThroughLayouts ["Full", "Mirror Spacing Tall"]), + ("M-", cycleThroughLayouts ["Spacing ThreeCol", "Spacing Tall", "Mirror Spacing Tall"]), + -- Reset the layouts on the current workspace to default + ("M-S-", setLayout $ XMonad.layoutHook conf), + -- Shrink the master area + ("M-h", sendMessage Shrink), + -- Expand the master area + ("M-l", sendMessage Expand), + -- Push window back into tiling + ("M-t", withFocused $ windows . W.sink), + -- Increment the number of windows in the master area + ("M-,", sendMessage $ IncMasterN 1), + -- Deincrement the number of windows in the master area + ("M-.", sendMessage $ IncMasterN (-1)) + -- Toggle the status bar gap + -- Use this binding with avoidStruts from Hooks.ManageDocks. + -- See also the statusBar function from Hooks.DynamicLog. -- - -- mod-[1..9], Switch to workspace N - -- mod-shift-[1..9], Move client to workspace N - -- - [ ("M-" ++ m ++ show k, windows $ f i) - | (i, k) <- zip (XMonad.workspaces conf) [1 .. 9], - (f, m) <- [(W.greedyView, ""), (W.shift, "S-")] - ] + -- , ("M-b", sendMessage ToggleStruts) + ] - windows_kb = - [ -- close focused window - ("M4-S-c", kill), - -- Resize viewed windows to the correct size - ("M-n", refresh), - -- Easy moution to focus windows - ("M-s", selectWindow easyMotionConfig >>= (`whenJust` windows . W.focusWindow)), - -- Move focus to the next window - ("M-j", windows W.focusDown), - -- Move focus to the previous window - ("M-k", windows W.focusUp), - -- Move focus to the master window - ("M-m", windows W.focusMaster), - -- Swap the focused window and the master window - ("M-", windows W.swapMaster), - -- Swap the focused window with the next window - ("M-S-j", windows W.swapDown), - -- Swap the focused window with the previous window - ("M-S-k", windows W.swapUp) - ] + system_kb = + [ -- Lock screen + ("M4-l", spawn "betterlockscreen --lock --display 1 -- -e"), + -- Quit xmonad + ("M4-S-q", io exitSuccess) + ] - layout_kb = - [ -- Rotate through the available layout algorithms - ("M-", cycleThroughLayouts ["Full", "Mirror Spacing Tall"]), - ("M-", cycleThroughLayouts ["Spacing ThreeCol", "Spacing Tall", "Mirror Spacing Tall"]), - -- Reset the layouts on the current workspace to default - ("M-S-", setLayout $ XMonad.layoutHook conf), - -- Shrink the master area - ("M-h", sendMessage Shrink), - -- Expand the master area - ("M-l", sendMessage Expand), - -- Push window back into tiling - ("M-t", withFocused $ windows . W.sink), - -- Increment the number of windows in the master area - ("M-,", sendMessage $ IncMasterN 1), - -- Deincrement the number of windows in the master area - ("M-.", sendMessage $ IncMasterN (-1)) - -- Toggle the status bar gap - -- Use this binding with avoidStruts from Hooks.ManageDocks. - -- See also the statusBar function from Hooks.DynamicLog. - -- - -- , ("M-b", sendMessage ToggleStruts) - ] - - system_kb = - [ -- Lock screen - ("M4-l", spawn "betterlockscreen --lock --display 1 -- -e"), - -- Quit xmonad - ("M4-S-q", io exitSuccess) - ] - - misc_kb = - [ ("M-o", projectPrompt def), - -- Change volume - ("", spawn "amixer -q sset Master toggle"), - ("", spawn "amixer -q sset Master 5%+"), - ("", spawn "amixer -q sset Master 5%-") - ] - in mkKeymap conf $ - apps_kb ++ workspaces_kb ++ windows_kb ++ layout_kb ++ system_kb ++ misc_kb + misc_kb = + [ ("M-o", projectPrompt def), + -- Change volume + ("", spawn "amixer -q sset Master toggle"), + ("", spawn "amixer -q sset Master 5%+"), + ("", spawn "amixer -q sset Master 5%-") + ] ------------------------------------------------------------------------ -- Mouse bindings: default actions bound to mouse events @@ -359,17 +363,51 @@ myMouseBindings (XConfig {XMonad.modMask = modm}) = myProjects :: [Project] myProjects = - [ Project - { projectName = "foo", - projectStartHook = Just $ do - spawn "alacritty --working-directory ~/repos/myconfig" - spawn "alacritty --working-directory ~/repos/tas" + [ -- my work + Project + { projectName = "bm-back", + projectStartHook = do + let workdir = "~/projects/binarymanagement/bm-back" + spawn $ terminal' workdir $ Just "docker-compose -f docker-compose.dev.yml up -d" + replicateM_ 3 $ spawn $ terminal workdir }, Project - { projectName = "bar", - projectStartHook = Nothing + { projectName = "bm-front", + projectStartHook = do + let workdir = "~/projects/binarymanagement/bm-front" + replicateM_ 3 $ spawn $ terminal workdir + }, + -- personal + Project + { projectName = "myconfig", + projectStartHook = replicateM_ 2 $ spawn $ terminal "~/repos/myconfig" + }, + Project + { projectName = "tas", + projectStartHook = replicateM_ 2 $ spawn $ terminal "~/repos/tas" + }, + -- community + Project + { projectName = "dexios", + projectStartHook = replicateM_ 2 $ spawn $ terminal "~/repos/dexios" + }, + Project + { projectName = "home-manager (nix)", + projectStartHook = replicateM_ 2 $ spawn $ terminal "~/repos/home-manager" } ] + where + terminal :: String -> String + terminal wd = terminal' wd Nothing + + terminal' :: String -> Maybe String -> String + terminal' wd' cmd' = + "alacritty" ++ workdir ++ command + where + workdir = " --working-directory " ++ wd' + command = case cmd' of + Just c -> " --command " ++ c + _ -> "" ------------------------------------------------------------------------ -- Project @@ -377,7 +415,7 @@ type ProjectName = String data Project = Project { projectName :: !ProjectName, - projectStartHook :: !(Maybe (X ())) + projectStartHook :: !(X ()) } type ProjectTable = Map ProjectName Project @@ -419,10 +457,12 @@ instance XPrompt ProjectPrompt where Nothing -> return () openProject :: Project -> X () -openProject p = - case projectStartHook p of - Just h -> h - Nothing -> return () +openProject p = do + -- kill all windows in the current workspace + wins <- gets (W.integrate' . W.stack . W.workspace . W.current . windowset) + sequence_ $ map killWindow wins + + projectStartHook p projectPrompt :: XPConfig -> X () projectPrompt c = do