on ffe6de2 help sign in
147 lines 4.7 kB history raw
1-- Copyright Corey O'Connor
2module Graphics.Vty.Input.Data where
4-- | Representations of non-modifier keys.
5data Key = KEsc | KFun Int | KBackTab | KPrtScr | KPause | KASCII Char | KBS | KIns
6 | KHome | KPageUp | KDel | KEnd | KPageDown | KBegin | KNP5 | KUp | KMenu
7 | KLeft | KDown | KRight | KEnter
8 deriving (Eq,Show,Ord)
10-- | Modifier keys. Key codes are interpreted such that users are more likely to
11-- have Meta than Alt; for instance on the PC Linux console, 'MMeta' will
12-- generally correspond to the physical Alt key.
13data Modifier = MShift | MCtrl | MMeta | MAlt
14 deriving (Eq,Show,Ord)
16-- |Mouse buttons. Not yet used.
17data Button = BLeft | BMiddle | BRight
18 deriving (Eq,Show,Ord)
20-- |Generic events.
21data Event = EvKey Key [Modifier] | EvMouse Int Int Button [Modifier]
22 | EvResize Int Int
23 deriving (Eq,Show,Ord)
25data KClass
26 = Valid Key [Modifier]
27 | Invalid
28 | EndLoop
29 | Prefix
30 | MisPfx Key [Modifier] [Char]
31 deriving(Show)
33type ClassifyTable = [(String, (Key, [Modifier]))]
35map_to_legacy_table :: [(String, Event)] -> ClassifyTable
36map_to_legacy_table = map f
37 where f (s, EvKey k mods) = (s, (k, mods))
38 f _ = error "no mapping for mouse or resize events"
40-- | classify table directly generated from terminfo cap strings
41keys_from_caps_table :: [(String, Event)]
42keys_from_caps_table =
43 [ ("khome", EvKey KHome [])
44 , ("kend", EvKey KEnd [])
45 , ("cbt", EvKey KBackTab [])
46 , ("kcud1", EvKey KDown [])
47 , ("kcuu1", EvKey KUp [])
48 , ("kcuf1", EvKey KRight [])
49 , ("kcub1", EvKey KLeft [])
50 , ("kLFT", EvKey KLeft [MShift])
51 , ("kRIT", EvKey KRight [MShift])
52 ]
54nav_keys_0 :: ClassifyTable
55nav_keys_0 =
56 [ k "G" KNP5
57 , k "P" KPause
58 , k "A" KUp
59 , k "B" KDown
60 , k "C" KRight
61 , k "D" KLeft
62 , k "H" KHome
63 , k "F" KEnd
64 , k "E" KBegin
65 ]
66 where k c s = ("\ESC["++c,(s,[]))
68-- Support for arrows and KHome/KEnd
69nav_keys_1 :: ClassifyTable
70nav_keys_1 =
71 [("\ESC[" ++ charCnt ++ show mc++c,(s,m))
72 | charCnt <- ["1;", ""], -- we can have a count or not
73 (m,mc) <- [([MShift],2::Int), ([MCtrl],5), ([MMeta],3),
74 ([MShift, MCtrl],6), ([MShift, MMeta],4)], -- modifiers and their codes
75 (c,s) <- [("A", KUp), ("B", KDown), ("C", KRight), ("D", KLeft), ("H", KHome), ("F", KEnd)] -- directions and their codes
76 ]
78nav_keys_2 :: ClassifyTable
79nav_keys_2 =
80 let k n s = ("\ESC["++show n++"~",(s,[]))
81 in zipWith k [2::Int,3,5,6,1,4]
82 [KIns,KDel,KPageUp,KPageDown,KHome,KEnd]
84nav_keys_3 :: ClassifyTable
85nav_keys_3 =
86 let k n s = ("\ESC["++show n++";5~",(s,[MCtrl]))
87 in zipWith k [2::Int,3,5,6,1,4]
88 [KIns,KDel,KPageUp,KPageDown,KHome,KEnd]
90-- Support for simple characters.
91-- we limit to < 0xC1. The UTF8 sequence detector will catch all values 0xC2 and above before this
92-- classify table is reached.
93simple_chars :: ClassifyTable
94simple_chars = [ (x:[],(KASCII x,[])) | x <- map toEnum [0..0xC1] ]
96-- Support for function keys (should use terminfo)
97function_keys_0 :: ClassifyTable
98function_keys_0 = [ ("\ESC[["++[toEnum(64+i)],(KFun i,[])) | i <- [1..5] ]
100function_keys_1 :: ClassifyTable
101function_keys_1 =
102 let f ff nrs m = [ ("\ESC["++show n++"~",(KFun (n-(nrs!!0)+ff), m)) | n <- nrs ] in
103 concat [ f 6 [17..21] [], f 11 [23,24] [], f 1 [25,26] [MShift], f 3 [28,29] [MShift], f 5 [31..34] [MShift] ]
105function_keys_2 :: ClassifyTable
106function_keys_2 = [ ('\ESC':[x],(KASCII x,[MMeta])) | x <- '\ESC':'\t':[' ' .. '\DEL'] ]
108-- Ctrl+Char
109ctrl_char_keys :: ClassifyTable
110ctrl_char_keys =
111 [ ([toEnum x],(KASCII y,[MCtrl]))
112 | (x,y) <- zip ([0..31]) ('@':['a'..'z']++['['..'_']),
113 y /= 'i' -- Resolve issue #3 where CTRL-i hides TAB.
114 ]
116-- Ctrl+Meta+Char
117ctrl_meta_keys :: ClassifyTable
118ctrl_meta_keys =
119 [ ('\ESC':[toEnum x],(KASCII y,[MMeta,MCtrl])) | (x,y) <- zip [0..31] ('@':['a'..'z']++['['..'_']) ]
121-- Special support
122special_support_keys :: ClassifyTable
123special_support_keys =
124 [ -- special support for ESC
125 ("\ESC",(KEsc,[])) , ("\ESC\ESC",(KEsc,[MMeta]))
126 -- Special support for backspace
127 , ("\DEL",(KBS,[])), ("\ESC\DEL",(KBS,[MMeta]))
128 -- Special support for Enter
129 , ("\ESC\^J",(KEnter,[MMeta])), ("\^J",(KEnter,[]))
130 ]
132-- | classify table for ANSI terminals
133ansi_classify_table :: [ClassifyTable]
134ansi_classify_table =
135 [ nav_keys_0
136 , nav_keys_1
137 , nav_keys_2
138 , nav_keys_3
139 , simple_chars
140 , function_keys_0
141 , function_keys_1
142 , function_keys_2
143 , ctrl_char_keys
144 , ctrl_meta_keys
145 , special_support_keys
146 ]