on master help sign in
factor out more input classify data for easier reading by me.
ad4b218Corey O'Connor
src/Graphics/Vty/Input.hs+7−61
@@ -2,7 +2,10 @@
2-- Copyright 2009-2010 Corey O'Connor
2-- Copyright 2009-2010 Corey O'Connor
3{-# OPTIONS_GHC -Wall #-}
3{-# OPTIONS_GHC -Wall #-}
4{-# LANGUAGE ForeignFunctionInterface #-}
4{-# LANGUAGE ForeignFunctionInterface #-}
5−module Graphics.Vty.Input ( module Graphics.Vty.Input.Data
5+module Graphics.Vty.Input ( Key(..)
6+ , Modifier(..)
7+ , Button(..)
8+ , Event(..)
6 , initTermInput
9 , initTermInput
7 )
10 )
8 where
11 where
@@ -43,8 +46,9 @@ initTermInput escDelay terminal = do
43 inputChannel <- newChan
46 inputChannel <- newChan
44 hadInput <- newEmptyMVar
47 hadInput <- newEmptyMVar
45 oattr <- getTerminalAttributes stdInput
48 oattr <- getTerminalAttributes stdInput
46− let nattr = foldl withoutMode oattr [StartStopOutput, KeyboardInterrupts,
49+ let nattr = foldl withoutMode oattr [ StartStopOutput, KeyboardInterrupts
47− EnableEcho, ProcessInput, ExtendedFunctions]
50+ , EnableEcho, ProcessInput, ExtendedFunctions
51+ ]
48 setTerminalAttributes stdInput nattr Immediately
52 setTerminalAttributes stdInput nattr Immediately
49 set_term_timing
53 set_term_timing
50 let inputToEventThread :: IO ()
54 let inputToEventThread :: IO ()
@@ -126,64 +130,6 @@ initTermInput escDelay terminal = do
126 caps_classify_table
130 caps_classify_table
127 = map_to_legacy_table [(x,y) | (Just x,y) <- map (first (getCapability terminal . tiGetStr)) $ caps_table]
131 = map_to_legacy_table [(x,y) | (Just x,y) <- map (first (getCapability terminal . tiGetStr)) $ caps_table]
128
132
129− ansi_classify_table :: [[([Char], (Key, [Modifier]))]]
130− ansi_classify_table =
131− [ let k c s = ("\ESC["++c,(s,[])) in [ k "G" KNP5
132− , k "P" KPause
133− , k "A" KUp
134− , k "B" KDown
135− , k "C" KRight
136− , k "D" KLeft
137− , k "H" KHome
138− , k "F" KEnd
139− , k "E" KBegin
140− ],
141−
142− -- Support for arrows and KHome/KEnd
143− [("\ESC[" ++ charCnt ++ show mc++c,(s,m))
144− | charCnt <- ["1;", ""], -- we can have a count or not
145− (m,mc) <- [([MShift],2::Int), ([MCtrl],5), ([MMeta],3),
146− ([MShift, MCtrl],6), ([MShift, MMeta],4)], -- modifiers and their codes
147− (c,s) <- [("A", KUp), ("B", KDown), ("C", KRight), ("D", KLeft), ("H", KHome), ("F", KEnd)] -- directions and their codes
148− ],
149−
150− let k n s = ("\ESC["++show n++"~",(s,[]))
151− in zipWith k [2::Int,3,5,6,1,4]
152− [KIns,KDel,KPageUp,KPageDown,KHome,KEnd],
153−
154− let k n s = ("\ESC["++show n++";5~",(s,[MCtrl]))
155− in zipWith k [2::Int,3,5,6,1,4]
156− [KIns,KDel,KPageUp,KPageDown,KHome,KEnd],
157−
158− -- Support for simple characters.
159− [ (x:[],(KASCII x,[])) | x <- map toEnum [0..255] ],
160−
161− -- Support for function keys (should use terminfo)
162− [ ("\ESC[["++[toEnum(64+i)],(KFun i,[])) | i <- [1..5] ],
163− let f ff nrs m = [ ("\ESC["++show n++"~",(KFun (n-(nrs!!0)+ff), m)) | n <- nrs ] in
164− concat [ f 6 [17..21] [], f 11 [23,24] [], f 1 [25,26] [MShift], f 3 [28,29] [MShift], f 5 [31..34] [MShift] ],
165− [ ('\ESC':[x],(KASCII x,[MMeta])) | x <- '\ESC':'\t':[' ' .. '\DEL'] ],
166−
167− -- Ctrl+Char
168− [ ([toEnum x],(KASCII y,[MCtrl]))
169− | (x,y) <- zip ([0..31]) ('@':['a'..'z']++['['..'_']),
170− y /= 'i' -- Resolve issue #3 where CTRL-i hides TAB.
171− ],
172−
173− -- Ctrl+Meta+Char
174− [ ('\ESC':[toEnum x],(KASCII y,[MMeta,MCtrl])) | (x,y) <- zip [0..31] ('@':['a'..'z']++['['..'_']) ],
175−
176− -- Special support
177− [ -- special support for ESC
178− ("\ESC",(KEsc,[])) , ("\ESC\ESC",(KEsc,[MMeta])),
179−
180− -- Special support for backspace
181− ("\DEL",(KBS,[])), ("\ESC\DEL",(KBS,[MMeta])),
182−
183− -- Special support for Enter
184− ("\ESC\^J",(KEnter,[MMeta])), ("\^J",(KEnter,[])) ]
185− ]
186−
187 eventThreadId <- forkIO $ inputToEventThread
133 eventThreadId <- forkIO $ inputToEventThread
188 inputThreadId <- forkIO $ inputThread
134 inputThreadId <- forkIO $ inputThread
189 noInputThreadId <- forkIO $ noInputThread
135 noInputThreadId <- forkIO $ noInputThread
src/Graphics/Vty/Input/Data.hs+60
@@ -32,6 +32,7 @@ map_to_legacy_table = map f
32 where f (s, EvKey k mods) = (s, (k, mods))
32 where f (s, EvKey k mods) = (s, (k, mods))
33 f _ = error "no mapping for mouse or resize events"
33 f _ = error "no mapping for mouse or resize events"
34
34
35+-- | classify table directly generated from terminfo cap strings
35caps_table :: [(String, Event)]
36caps_table :: [(String, Event)]
36caps_table =
37caps_table =
37 [ ("khome", EvKey KHome [])
38 [ ("khome", EvKey KHome [])
@@ -45,3 +46,62 @@ caps_table =
45 , ("kRIT", EvKey KRight [MShift])
46 , ("kRIT", EvKey KRight [MShift])
46 ]
47 ]
47
48
49+
50+-- | classify table for ANSI terminals
51+ansi_classify_table :: [[([Char], (Key, [Modifier]))]]
52+ansi_classify_table =
53+ [ let k c s = ("\ESC["++c,(s,[])) in [ k "G" KNP5
54+ , k "P" KPause
55+ , k "A" KUp
56+ , k "B" KDown
57+ , k "C" KRight
58+ , k "D" KLeft
59+ , k "H" KHome
60+ , k "F" KEnd
61+ , k "E" KBegin
62+ ],
63+
64+ -- Support for arrows and KHome/KEnd
65+ [("\ESC[" ++ charCnt ++ show mc++c,(s,m))
66+ | charCnt <- ["1;", ""], -- we can have a count or not
67+ (m,mc) <- [([MShift],2::Int), ([MCtrl],5), ([MMeta],3),
68+ ([MShift, MCtrl],6), ([MShift, MMeta],4)], -- modifiers and their codes
69+ (c,s) <- [("A", KUp), ("B", KDown), ("C", KRight), ("D", KLeft), ("H", KHome), ("F", KEnd)] -- directions and their codes
70+ ],
71+
72+ let k n s = ("\ESC["++show n++"~",(s,[]))
73+ in zipWith k [2::Int,3,5,6,1,4]
74+ [KIns,KDel,KPageUp,KPageDown,KHome,KEnd],
75+
76+ let k n s = ("\ESC["++show n++";5~",(s,[MCtrl]))
77+ in zipWith k [2::Int,3,5,6,1,4]
78+ [KIns,KDel,KPageUp,KPageDown,KHome,KEnd],
79+
80+ -- Support for simple characters.
81+ [ (x:[],(KASCII x,[])) | x <- map toEnum [0..255] ],
82+
83+ -- Support for function keys (should use terminfo)
84+ [ ("\ESC[["++[toEnum(64+i)],(KFun i,[])) | i <- [1..5] ],
85+ let f ff nrs m = [ ("\ESC["++show n++"~",(KFun (n-(nrs!!0)+ff), m)) | n <- nrs ] in
86+ concat [ f 6 [17..21] [], f 11 [23,24] [], f 1 [25,26] [MShift], f 3 [28,29] [MShift], f 5 [31..34] [MShift] ],
87+ [ ('\ESC':[x],(KASCII x,[MMeta])) | x <- '\ESC':'\t':[' ' .. '\DEL'] ],
88+
89+ -- Ctrl+Char
90+ [ ([toEnum x],(KASCII y,[MCtrl]))
91+ | (x,y) <- zip ([0..31]) ('@':['a'..'z']++['['..'_']),
92+ y /= 'i' -- Resolve issue #3 where CTRL-i hides TAB.
93+ ],
94+
95+ -- Ctrl+Meta+Char
96+ [ ('\ESC':[toEnum x],(KASCII y,[MMeta,MCtrl])) | (x,y) <- zip [0..31] ('@':['a'..'z']++['['..'_']) ],
97+
98+ -- Special support
99+ [ -- special support for ESC
100+ ("\ESC",(KEsc,[])) , ("\ESC\ESC",(KEsc,[MMeta])),
101+
102+ -- Special support for backspace
103+ ("\DEL",(KBS,[])), ("\ESC\DEL",(KBS,[MMeta])),
104+
105+ -- Special support for Enter
106+ ("\ESC\^J",(KEnter,[MMeta])), ("\^J",(KEnter,[])) ]
107+ ]