mirror of
https://github.com/xmonad/xmonad-contrib.git
synced 2025-05-19 11:30:22 -07:00
This patch takes runProcessWithInput out of Dmenu, runProcessWithInputAndWait out of Dzen, and runInXTerm out of RunInXTerm and collects them in one central module called Run. This way, other modules may include Run instead of Dmenu to get what they want without giving the impression of making use of dmenu.
79 lines
2.8 KiB
Haskell
79 lines
2.8 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.Run ( 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
|
|
-- >
|
|
-- > layouts = 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 layouts definition above,
|
|
-- %layout -- just before the list, like the following (don't uncomment next line):
|
|
-- %layout -- layouts = 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)
|