vty 4.7.0.10 → 4.7.0.12
raw patch · 9 files changed
+60/−56 lines, 9 files
Files
- cbits/gwinsz.c +1/−1
- cbits/gwinsz.h +1/−1
- cbits/mk_wcwidth.c +10/−10
- cbits/set_term_timing.c +1/−1
- src/Codec/Binary/UTF8/Width.hs +2/−2
- src/Graphics/Vty/LLInput.hs +41/−37
- src/Graphics/Vty/Terminal/TerminfoBased.hs +1/−1
- test/Makefile +2/−2
- vty.cabal +1/−1
cbits/gwinsz.c view
@@ -1,6 +1,6 @@ #include <sys/ioctl.h> -unsigned long c_get_window_size(void) {+unsigned long vty_c_get_window_size(void) { struct winsize w; if (ioctl (0, TIOCGWINSZ, &w) >= 0) return (w.ws_row << 16) + w.ws_col;
cbits/gwinsz.h view
@@ -1,1 +1,1 @@-unsigned long c_get_window_size(void);+unsigned long vty_c_get_window_size(void);
cbits/mk_wcwidth.c view
@@ -67,7 +67,7 @@ }; /* auxiliary function for binary search in interval table */-static int bisearch(wchar_t ucs, const struct interval *table, int max) {+static int vty_bisearch(wchar_t ucs, const struct interval *table, int max) { int min = 0; int mid; @@ -119,7 +119,7 @@ * in ISO 10646. */ -int mk_wcwidth(wchar_t ucs)+int vty_mk_wcwidth(wchar_t ucs) { /* sorted list of non-overlapping intervals of non-spacing characters */ /* generated by "uniset +cat=Me +cat=Mn +cat=Cf -00AD +1160-11FF +200B c" */@@ -181,7 +181,7 @@ return -1; /* binary search in table of non-spacing characters */- if (bisearch(ucs, combining,+ if (vty_bisearch(ucs, combining, sizeof(combining) / sizeof(struct interval) - 1)) return 0; @@ -204,12 +204,12 @@ } -int mk_wcswidth(const wchar_t *pwcs, size_t n)+int vty_mk_wcswidth(const wchar_t *pwcs, size_t n) { int w, width = 0; for (;n-- > 0; pwcs++)- if ((w = mk_wcwidth(*pwcs)) < 0)+ if ((w = vty_mk_wcwidth(*pwcs)) < 0) return -1; else width += w;@@ -227,7 +227,7 @@ * the traditional terminal character-width behaviour. It is not * otherwise recommended for general use. */-int mk_wcwidth_cjk(wchar_t ucs)+int vty_mk_wcwidth_cjk(wchar_t ucs) { /* sorted list of non-overlapping intervals of East Asian Ambiguous * characters, generated by "uniset +WIDTH-A -cat=Me -cat=Mn -cat=Cf c" */@@ -287,20 +287,20 @@ }; /* binary search in table of non-spacing characters */- if (bisearch(ucs, ambiguous,+ if (vty_bisearch(ucs, ambiguous, sizeof(ambiguous) / sizeof(struct interval) - 1)) return 2; - return mk_wcwidth(ucs);+ return vty_mk_wcwidth(ucs); } -int mk_wcswidth_cjk(const wchar_t *pwcs, size_t n)+int vty_mk_wcswidth_cjk(const wchar_t *pwcs, size_t n) { int w, width = 0; for (;n-- > 0; pwcs++)- if ((w = mk_wcwidth_cjk(*pwcs)) < 0)+ if ((w = vty_mk_wcwidth_cjk(*pwcs)) < 0) return -1; else width += w;
cbits/set_term_timing.c view
@@ -3,7 +3,7 @@ #include <unistd.h> #include <stdlib.h> -void set_term_timing(void)+void vty_set_term_timing(void) { struct termios trm; tcgetattr(STDIN_FILENO, &trm);
src/Codec/Binary/UTF8/Width.hs view
@@ -25,7 +25,7 @@ ) {-# NOINLINE wcwidth #-} -foreign import ccall unsafe "mk_wcwidth" wcwidth' :: CWchar -> CInt+foreign import ccall unsafe "vty_mk_wcwidth" wcwidth' :: CWchar -> CInt wcswidth :: String -> Int wcswidth str = unsafePerformIO (withCWStringLen str $! \(ws, ws_len) -> do@@ -36,4 +36,4 @@ ) {-# NOINLINE wcswidth #-} -foreign import ccall unsafe "mk_wcswidth" wcswidth' :: Ptr CWchar -> CSize -> CInt+foreign import ccall unsafe "vty_mk_wcswidth" wcswidth' :: Ptr CWchar -> CSize -> CInt
src/Graphics/Vty/LLInput.hs view
@@ -5,12 +5,12 @@ , Modifier(..) , Button(..) , Event(..)- , initTermInput - ) + , initTermInput+ ) where import Data.Char-import Data.Maybe ( mapMaybe +import Data.Maybe ( mapMaybe ) import Data.List( inits ) import Data.Word@@ -36,22 +36,22 @@ -- |Representations of non-modifier keys. data Key = KEsc | KFun Int | KBackTab | KPrtScr | KPause | KASCII Char | KBS | KIns | KHome | KPageUp | KDel | KEnd | KPageDown | KBegin | KNP5 | KUp | KMenu- | KLeft | KDown | KRight | KEnter + | KLeft | KDown | KRight | KEnter deriving (Eq,Show,Ord) -- |Modifier keys. Key codes are interpreted such that users are more likely to -- have Meta than Alt; for instance on the PC Linux console, 'MMeta' will -- generally correspond to the physical Alt key.-data Modifier = MShift | MCtrl | MMeta | MAlt +data Modifier = MShift | MCtrl | MMeta | MAlt deriving (Eq,Show,Ord) -- |Mouse buttons. Not yet used.-data Button = BLeft | BMiddle | BRight +data Button = BLeft | BMiddle | BRight deriving (Eq,Show,Ord) -- |Generic events. data Event = EvKey Key [Modifier] | EvMouse Int Int Button [Modifier]- | EvResize Int Int + | EvResize Int Int deriving (Eq,Show,Ord) data KClass = Valid Key [Modifier] | Invalid | Prefix | MisPfx Key [Modifier] [Char]@@ -70,7 +70,7 @@ setTerminalAttributes stdInput nattr Immediately set_term_timing let inputToEventThread :: IO ()- inputToEventThread = loop [] + inputToEventThread = loop [] where loop kb = case (classify kb) of Prefix -> do c <- readChan inputChannel loop (kb ++ [c])@@ -82,7 +82,7 @@ inputThread :: IO () inputThread = loop- where + where loop = do setFdOption stdInput NonBlockingRead False threadWaitRead stdInput@@ -97,7 +97,7 @@ writeChan inputChannel (head bytes) readAll -- | If there is no input for some time, this thread puts '\xFFFE' in the- -- inputChannel. + -- inputChannel. noInputThread :: IO () noInputThread = when (escDelay > 0) loop where loop = do@@ -107,8 +107,8 @@ when hadNoInput $ do finishAtomicInput loop- + compile :: [[([Char],(Key,[Modifier]))]] -> [Char] -> KClass compile lst = cl' where lst' = concat lst@@ -120,25 +120,25 @@ Just (k,m) -> Valid k m Nothing -> case head $ mapMaybe (\s -> (,) s `fmap` M.lookup s mlst) $ init $ inits str of (s,(k,m)) -> MisPfx k m (drop (length s) str)- + -- ANSI specific bits classify, classifyTab :: [Char] -> KClass- + -- As soon as classify "\xFFFE" = Invalid- classify s@(c:_) | ord c >= 0xC2 = + classify s@(c:_) | ord c >= 0xC2 = if utf8Length (ord c) > length s then Prefix else classifyUtf8 s -- beginning of an utf8 sequence classify other = classifyTab other classifyUtf8 s = case decode ((map (fromIntegral . ord) s) :: [Word8]) of Just (unicodeChar, _) -> Valid (KASCII unicodeChar) [] _ -> Invalid -- something bad happened; just ignore and continue.- + classifyTab = compile (caps_classify_table : ansi_classify_table)- - caps_tabls = [("khome", (KHome, [])), ++ caps_tabls = [("khome", (KHome, [])), ("kend", (KEnd, [])), ("cbt", (KBackTab, [])), ("kcud1", (KDown, [])),@@ -149,9 +149,9 @@ ("kLFT", (KLeft, [MShift])), ("kRIT", (KRight, [MShift])) ]- + caps_classify_table = [(x,y) | (Just x,y) <- map (first (getCapability terminal . tiGetStr)) $ caps_tabls]- + ansi_classify_table :: [[([Char], (Key, [Modifier]))]] ansi_classify_table = [ let k c s = ("\ESC["++c,(s,[])) in [ k "G" KNP5@@ -159,23 +159,28 @@ , k "A" KUp , k "B" KDown , k "C" KRight- , k "D" KLeft + , k "D" KLeft , k "H" KHome , k "F" KEnd , k "E" KBegin ], - -- Support for arrows- [("\ESC[" ++ charCnt ++ show mc++c,(s,m)) + -- Support for arrows and KHome/KEnd+ [("\ESC[" ++ charCnt ++ show mc++c,(s,m)) | charCnt <- ["1;", ""], -- we can have a count or not- (m,mc) <- [([MShift],2::Int), ([MCtrl],5), ([MMeta],3), + (m,mc) <- [([MShift],2::Int), ([MCtrl],5), ([MMeta],3), ([MShift, MCtrl],6), ([MShift, MMeta],4)], -- modifiers and their codes- (c,s) <- [("A", KUp), ("B", KDown), ("C", KRight), ("D", KLeft)] -- directions and their codes+ (c,s) <- [("A", KUp), ("B", KDown), ("C", KRight), ("D", KLeft), ("H", KHome), ("F", KEnd)] -- directions and their codes ],- - let k n s = ("\ESC["++show n++"~",(s,[])) in zipWith k [2::Int,3,5,6,1,4] - [KIns,KDel,KPageUp,KPageDown,KHome,KEnd], + let k n s = ("\ESC["++show n++"~",(s,[]))+ in zipWith k [2::Int,3,5,6,1,4]+ [KIns,KDel,KPageUp,KPageDown,KHome,KEnd],++ let k n s = ("\ESC["++show n++";5~",(s,[MCtrl]))+ in zipWith k [2::Int,3,5,6,1,4]+ [KIns,KDel,KPageUp,KPageDown,KHome,KEnd],+ -- Support for simple characters. [ (x:[],(KASCII x,[])) | x <- map toEnum [0..255] ], @@ -186,25 +191,25 @@ [ ('\ESC':[x],(KASCII x,[MMeta])) | x <- '\ESC':'\t':[' ' .. '\DEL'] ], -- Ctrl+Char- [ ([toEnum x],(KASCII y,[MCtrl])) + [ ([toEnum x],(KASCII y,[MCtrl])) | (x,y) <- zip ([0..31]) ('@':['a'..'z']++['['..'_']), y /= 'i' -- Resolve issue #3 where CTRL-i hides TAB. ],- + -- Ctrl+Meta+Char [ ('\ESC':[toEnum x],(KASCII y,[MMeta,MCtrl])) | (x,y) <- zip [0..31] ('@':['a'..'z']++['['..'_']) ], -- Special support- [ -- special support for ESC - ("\ESC",(KEsc,[])) , ("\ESC\ESC",(KEsc,[MMeta])), + [ -- special support for ESC+ ("\ESC",(KEsc,[])) , ("\ESC\ESC",(KEsc,[MMeta])), -- Special support for backspace ("\DEL",(KBS,[])), ("\ESC\DEL",(KBS,[MMeta])),- + -- Special support for Enter- ("\ESC\^J",(KEnter,[MMeta])), ("\^J",(KEnter,[])) ] + ("\ESC\^J",(KEnter,[MMeta])), ("\^J",(KEnter,[])) ] ]- + eventThreadId <- forkIO $ inputToEventThread inputThreadId <- forkIO $ inputThread noInputThreadId <- forkIO $ noInputThread@@ -225,11 +230,10 @@ first f (x,y) = (f x, y) utf8Length :: (Num t, Ord a, Num a) => a -> t-utf8Length c +utf8Length c | c < 0x80 = 1 | c < 0xE0 = 2 | c < 0xF0 = 3 | otherwise = 4 -foreign import ccall "set_term_timing" set_term_timing :: IO ()-+foreign import ccall "vty_set_term_timing" set_term_timing :: IO ()
src/Graphics/Vty/Terminal/TerminfoBased.hs view
@@ -181,7 +181,7 @@ output_handle t = return (term_handle t) -foreign import ccall "gwinsz.h c_get_window_size" c_get_window_size +foreign import ccall "gwinsz.h vty_c_get_window_size" c_get_window_size :: IO CLong get_window_size :: IO (Int,Int)
test/Makefile view
@@ -28,10 +28,10 @@ # TODO: Tests should also be buildable referencing the currently installed vty GHC_ARGS=--make -i../src \ -package parallel \- -package deepseq-1.1.0.2 \+ -package deepseq-1.3.0.0 \ -hide-package transformers \ -hide-package monads-tf \- -package QuickCheck-2.4 \+ -package QuickCheck \ -ignore-package vty \ ../cbits/gwinsz.c ../cbits/set_term_timing.c ../cbits/mk_wcwidth.c \ -O -funbox-strict-fields -Wall -threaded -fno-full-laziness -fspec-constr -fspec-constr-count=10 \
vty.cabal view
@@ -1,5 +1,5 @@ Name: vty-Version: 4.7.0.10+Version: 4.7.0.12 License: BSD3 License-file: LICENSE Author: Stefan O'Rear, Corey O'Connor