mirror of
https://github.com/xmonad/xmonad-contrib.git
synced 2025-05-19 03:20:21 -07:00
79 lines
2.9 KiB
Haskell
79 lines
2.9 KiB
Haskell
{-# OPTIONS_GHC -fglasgow-exts #-} -- For deriving Data/Typeable
|
|
{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-}
|
|
|
|
-----------------------------------------------------------------------------
|
|
-- |
|
|
-- Module : XMonadContrib.WorkspaceDir
|
|
-- Copyright : (c) 2007 David Roundy <droundy@darcs.net>
|
|
-- License : BSD3-style (see LICENSE)
|
|
--
|
|
-- Maintainer : David Roundy <droundy@darcs.net>
|
|
-- Stability : unstable
|
|
-- Portability : unportable
|
|
--
|
|
-- WorkspaceDir is an extension to set 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.
|
|
--
|
|
-- Requires the 'directory' package
|
|
--
|
|
-----------------------------------------------------------------------------
|
|
|
|
module XMonadContrib.WorkspaceDir (
|
|
-- * Usage
|
|
-- $usage
|
|
workspaceDir,
|
|
changeDir
|
|
) where
|
|
|
|
import System.Directory ( setCurrentDirectory )
|
|
|
|
import XMonad
|
|
import Operations ( sendMessage )
|
|
import XMonadContrib.Dmenu ( runProcessWithInput )
|
|
import XMonadContrib.XPrompt ( XPConfig )
|
|
import XMonadContrib.DirectoryPrompt ( directoryPrompt )
|
|
import XMonadContrib.LayoutModifier
|
|
|
|
-- $usage
|
|
-- You can use this module with the following in your Config.hs file:
|
|
--
|
|
-- > import XMonadContrib.WorkspaceDir
|
|
-- >
|
|
-- > defaultLayouts = map (workspaceDir "~") [ tiled, ... ]
|
|
--
|
|
-- In keybindings:
|
|
--
|
|
-- > , ((modMask .|. shiftMask, xK_x ), changeDir defaultXPConfig)
|
|
|
|
-- %import XMonadContrib.WorkspaceDir
|
|
-- %keybind , ((modMask .|. shiftMask, xK_x ), changeDir defaultXPConfig)
|
|
-- %layout -- prepend 'map (workspaceDir "~")' to defaultLayouts definition above,
|
|
-- %layout -- just before the list, like the following (don't uncomment next line):
|
|
-- %layout -- defaultLayouts = map (workspaceDir "~") [ tiled, ... ]
|
|
|
|
|
|
data Chdir = Chdir String deriving ( Typeable )
|
|
instance Message Chdir
|
|
|
|
data WorkspaceDir a = WorkspaceDir String deriving ( Read, Show )
|
|
|
|
instance LayoutModifier WorkspaceDir a where
|
|
hook (WorkspaceDir s) = scd s
|
|
handleMess (WorkspaceDir _) m = return $ do Chdir wd <- fromMessage m
|
|
Just (WorkspaceDir wd)
|
|
|
|
workspaceDir :: LayoutClass l a => String -> l a
|
|
-> ModifiedLayout WorkspaceDir l a
|
|
workspaceDir s = ModifiedLayout (WorkspaceDir s)
|
|
|
|
scd :: String -> X ()
|
|
scd x = do x' <- io (runProcessWithInput "bash" [] ("echo -n " ++ x) `catch` \_ -> return x)
|
|
catchIO $ setCurrentDirectory x'
|
|
|
|
changeDir :: XPConfig -> X ()
|
|
changeDir c = directoryPrompt c "Set working directory: " (sendMessage . Chdir)
|