[xmonad] Issue 495 in xmonad: XMonad.Util.Run.safeRunInTerm does not work correctly

codesite-noreply at google.com codesite-noreply at google.com
Sun Feb 19 17:50:16 CET 2012

Status: New
Owner: ----

New issue 495 by woofy1... at gmail.com: XMonad.Util.Run.safeRunInTerm does  
not work correctly

What steps will reproduce the problem?
1. Add a keybinding such as  ((myModMask, xK_a ),  
safeRunInTerm "" "alsamixer" )
2. Recompile and press M-a

What is the expected output? What do you see instead?
Expected: an xterm window with alsamixer running in it.
Actual: nothing, xterm silently dies ('xterm: bad command line option "-e"')

What version of the product are you using? On what operating system?
xmonad 0.10-2 and xmonad-contrib 0.10-1 on Arch Linux.

Please provide any additional information below.
The definition of safeRunInTerm is broken:

safeRunInTerm :: String -> String -> X ()
safeRunInTerm options command = asks (terminal . config) >>= \t ->  
safeSpawn t [options, " -e " ++ command]

In the example, 'safeRunInTerm "" "alsamixer"' will run 'safeSpawn xterm  
["", " -e alsamixer"], which is not the format that xterm, urxvt nor  
lxterminal expect (I have not tested with other terminals).

A possible fix would be a definition such as
safeRunInTermP :: [String] -> [String] -> X ()
safeRunInTermP options command =
     asks (terminal . config) >>= \t -> safeSpawn t (options ++ ["-e"] ++  

which gives the desired behaviour for 'safeRunInTerm [] ["alsamixer"]', and  
correctly allows the specification of multiple arguments to both the  
terminal and the program to be run, eg 'safeRunInTerm ["-fg","#ffff00"]  
["alsamixer","-V","capture"]' works correctly.

The Strings passed to safeRunInTerm could be broken up with 'words' for a  
back compatible wrapper.

More information about the xmonad mailing list