aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--WorkspaceDir.hs35
1 files changed, 35 insertions, 0 deletions
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)