Assume locale is utf8 for spawn.

This adds the utf8-string dependency so that users no longer need to encode
strings they (possibly indirectly) pass to spawn. This is the expected
behavior, since each Char in String should be an actual character.

For systems that do not use utf8 this does not help. Fixing this by using iconv
or similar libraries may be done later.
This commit is contained in:
Adam Vogt
2011-11-18 18:29:20 +00:00
parent 75889ab62e
commit 4be3b39cd2
2 changed files with 6 additions and 2 deletions

View File

@@ -32,6 +32,7 @@ module XMonad.Core (
import XMonad.StackSet hiding (modify) import XMonad.StackSet hiding (modify)
import Prelude hiding ( catch ) import Prelude hiding ( catch )
import Codec.Binary.UTF8.String (encodeString)
import Control.Exception.Extensible (catch, fromException, try, bracket, throw, finally, SomeException(..)) import Control.Exception.Extensible (catch, fromException, try, bracket, throw, finally, SomeException(..))
import Control.Applicative import Control.Applicative
import Control.Monad.State import Control.Monad.State
@@ -384,12 +385,14 @@ catchIO f = io (f `catch` \(SomeException e) -> hPrint stderr e >> hFlush stderr
-- | spawn. Launch an external application. Specifically, it double-forks and -- | spawn. Launch an external application. Specifically, it double-forks and
-- runs the 'String' you pass as a command to \/bin\/sh. -- runs the 'String' you pass as a command to \/bin\/sh.
--
-- Note this function assumes your locale uses utf8.
spawn :: MonadIO m => String -> m () spawn :: MonadIO m => String -> m ()
spawn x = spawnPID x >> return () spawn x = spawnPID x >> return ()
-- | Like 'spawn', but returns the 'ProcessID' of the launched application -- | Like 'spawn', but returns the 'ProcessID' of the launched application
spawnPID :: MonadIO m => String -> m ProcessID spawnPID :: MonadIO m => String -> m ProcessID
spawnPID x = xfork $ executeFile "/bin/sh" False ["-c", x] Nothing spawnPID x = xfork $ executeFile "/bin/sh" False ["-c", encodeString x] Nothing
-- | A replacement for 'forkProcess' which resets default signal handlers. -- | A replacement for 'forkProcess' which resets default signal handlers.
xfork :: MonadIO m => IO () -> m ProcessID xfork :: MonadIO m => IO () -> m ProcessID

View File

@@ -46,7 +46,8 @@ library
build-depends: base < 5 && >=3, containers, directory, process, filepath, extensible-exceptions build-depends: base < 5 && >=3, containers, directory, process, filepath, extensible-exceptions
else else
build-depends: base < 3 build-depends: base < 3
build-depends: X11>=1.5.0.0 && < 1.6, mtl, unix build-depends: X11>=1.5.0.0 && < 1.6, mtl, unix,
utf8-string >= 0.3 && < 0.4
if true if true
ghc-options: -funbox-strict-fields -Wall ghc-options: -funbox-strict-fields -Wall