From 2854dd0b15a46135f2396a3ce886b0b2dbad9aab Mon Sep 17 00:00:00 2001 From: David Roundy Date: Mon, 11 Jun 2007 17:40:41 +0200 Subject: add WorkspaceDir, which sets the current directory in a workspace. Actually, it sets the current directory in a layout, since there's no way I know of to attach a behavior to a workspace. This means that any terminals (or other programs) pulled up in that workspace (with that layout) will execute in that working directory. Sort of handy, I think. darcs-hash:20070611154041-72aca-86d2e97e073eae656407df497ab4e1236762c92b.gz --- WorkspaceDir.hs | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 WorkspaceDir.hs (limited to 'WorkspaceDir.hs') diff --git a/WorkspaceDir.hs b/WorkspaceDir.hs new file mode 100644 index 0000000..a109f64 --- /dev/null +++ b/WorkspaceDir.hs @@ -0,0 +1,35 @@ +module XMonadContrib.WorkspaceDir ( workspaceDir, changeDir ) where + +-- to use: + +-- import XMonadContrib.WorkspaceDir + +-- defaultLayouts = map (workspaceDir "~") [ tiled, ... ] + +-- In keybindings: +-- , ((modMask .|. shiftMask, xK_x ), changeDir ["~","/tmp"]) + +import System.Directory ( setCurrentDirectory, getCurrentDirectory ) +import Data.List ( nub ) + +import XMonad +import Operations ( sendMessage ) +import XMonadContrib.Dmenu ( dmenu, runProcessWithInput ) + +data Chdir = Chdir String deriving ( Typeable ) +instance Message Chdir + +workspaceDir :: String -> Layout -> Layout +workspaceDir wd l = l { doLayout = \r x -> scd wd >> doLayout l r x + , modifyLayout = ml } + where ml m | Just (Chdir wd') <- fromMessage m = return $ Just (workspaceDir wd' l) + | otherwise = fmap (workspaceDir wd) `fmap` modifyLayout l m + +scd :: String -> X () +scd x = do x' <- io (runProcessWithInput "bash" [] ("echo -n " ++ x) `catch` \_ -> return x) + safeIO $ setCurrentDirectory x' + +changeDir :: [String] -> X () +changeDir dirs = do thisd <- io getCurrentDirectory + dir <- dmenu (nub (thisd:dirs)) + sendMessage (Chdir dir) -- cgit v1.2.3