XSelection.hs: update docs w/r/t unicode

see http://code.google.com/p/xmonad/issues/detail?id=348
This commit is contained in:
gwern0
2010-06-15 00:09:02 +00:00
parent e708caf2ac
commit f23f8e0bf7

View File

@@ -39,23 +39,13 @@ import Codec.Binary.UTF8.String (decode)
> , ((modm .|. shiftMask, xK_b), promptSelection "firefox") > , ((modm .|. shiftMask, xK_b), promptSelection "firefox")
There are a number of known problems with XSelection: Future improvements for XSelection:
* Unicode handling is busted. But it's still better than calling * More elaborate functionality: Emacs' registers are nice; if you
'chr' to translate to ASCII, at least.
As near as I can tell, the mangling happens when the String is
outputted somewhere, such as via promptSelection's passing through
the shell, or GHCi printing to the terminal. utf-string has IO functions
which can fix this, though I do not know have to use them here. It's
a complex issue; see
<http://www.haskell.org/pipermail/xmonad/2007-September/001967.html>
and <http://www.haskell.org/pipermail/xmonad/2007-September/001966.html>.
* Needs more elaborate functionality: Emacs' registers are nice; if you
don't know what they are, see <http://www.gnu.org/software/emacs/manual/html_node/emacs/Registers.html#Registers> -} don't know what they are, see <http://www.gnu.org/software/emacs/manual/html_node/emacs/Registers.html#Registers> -}
-- | Returns a String corresponding to the current mouse selection in X; if there is none, an empty string is returned. Note that this is -- | Returns a String corresponding to the current mouse selection in X;
-- really only reliable for ASCII text and currently escapes or otherwise mangles more complex UTF-8 characters. -- if there is none, an empty string is returned.
getSelection :: MonadIO m => m String getSelection :: MonadIO m => m String
getSelection = io $ do getSelection = io $ do
dpy <- openDisplay "" dpy <- openDisplay ""
@@ -79,22 +69,24 @@ getSelection = io $ do
else destroyWindow dpy win >> return "" else destroyWindow dpy win >> return ""
{- | A wrapper around 'getSelection'. Makes it convenient to run a program with the current selection as an argument. {- | A wrapper around 'getSelection'. Makes it convenient to run a program with the current selection as an argument.
This is convenient for handling URLs, in particular. For example, in your Config.hs you could bind a key to This is convenient for handling URLs, in particular. For example, in your Config.hs you could bind a key to
@promptSelection \"firefox\"@; @promptSelection \"firefox\"@;
this would allow you to highlight a URL string and then immediately open it up in Firefox. this would allow you to highlight a URL string and then immediately open it up in Firefox.
'promptSelection' passes strings through the system shell, \/bin\/sh; if you do not wish your selected text 'promptSelection' passes strings through the system shell, \/bin\/sh; if you do not wish your selected text
to be interpreted or mangled by the shell, use 'safePromptSelection'. safePromptSelection will bypass the to be interpreted or mangled by the shell, use 'safePromptSelection'. safePromptSelection will bypass the
shell using 'safeSpawn' from "XMonad.Util.Run"; see its documentation for more shell using 'safeSpawn' from "XMonad.Util.Run"; see its documentation for more
details on the advantages and disadvantages of using safeSpawn. -} details on the advantages and disadvantages of using safeSpawn. -}
promptSelection, safePromptSelection, unsafePromptSelection :: String -> X () promptSelection, safePromptSelection, unsafePromptSelection :: String -> X ()
promptSelection = unsafePromptSelection promptSelection = unsafePromptSelection
safePromptSelection app = join $ io $ liftM (safeSpawn app . return) getSelection safePromptSelection app = join $ io $ liftM (safeSpawn app . return) getSelection
unsafePromptSelection app = join $ io $ liftM unsafeSpawn $ fmap (\x -> app ++ " " ++ x) getSelection unsafePromptSelection app = join $ io $ liftM unsafeSpawn $ fmap (\x -> app ++ " " ++ x) getSelection
{- | A wrapper around 'promptSelection' and its safe variant. They take two parameters, the first is a function that transforms strings, and the second is the application to run. The transformer essentially transforms the selection in X. {- | A wrapper around 'promptSelection' and its safe variant. They take two parameters, the
One example is to wrap code, such as a command line action copied out of the browser to be run as @"sudo" ++ cmd@ or @"su - -c \""++ cmd ++"\""@. first is a function that transforms strings, and the second is the application to run.
-} The transformer essentially transforms the selection in X.
One example is to wrap code, such as a command line action copied out of the browser
to be run as @"sudo" ++ cmd@ or @"su - -c \""++ cmd ++"\""@. -}
transformPromptSelection, transformSafePromptSelection :: (String -> String) -> String -> X () transformPromptSelection, transformSafePromptSelection :: (String -> String) -> String -> X ()
transformPromptSelection f app = join $ io $ liftM (safeSpawn app . return) (fmap f getSelection) transformPromptSelection f app = join $ io $ liftM (safeSpawn app . return) (fmap f getSelection)
transformSafePromptSelection f app = join $ io $ liftM unsafeSpawn $ fmap (\x -> app ++ " " ++ x) (fmap f getSelection) transformSafePromptSelection f app = join $ io $ liftM unsafeSpawn $ fmap (\x -> app ++ " " ++ x) (fmap f getSelection)