1// Copyright 2014 The gocui Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package gocui
6
7import "github.com/nsf/termbox-go"
8
9type (
10 // Key represents special keys or keys combinations.
11 Key termbox.Key
12
13 // Modifier allows to define special keys combinations. They can be used
14 // in combination with Keys or Runes when a new keybinding is defined.
15 Modifier termbox.Modifier
16
17 // KeybindingHandler represents the handler linked to a specific
18 // keybindings. The handler is called when a key-press event satisfies a
19 // configured keybinding.
20 KeybindingHandler func(*Gui, *View) error
21)
22
23// Special keys.
24const (
25 KeyF1 Key = Key(termbox.KeyF1)
26 KeyF2 = Key(termbox.KeyF2)
27 KeyF3 = Key(termbox.KeyF3)
28 KeyF4 = Key(termbox.KeyF4)
29 KeyF5 = Key(termbox.KeyF5)
30 KeyF6 = Key(termbox.KeyF6)
31 KeyF7 = Key(termbox.KeyF7)
32 KeyF8 = Key(termbox.KeyF8)
33 KeyF9 = Key(termbox.KeyF9)
34 KeyF10 = Key(termbox.KeyF10)
35 KeyF11 = Key(termbox.KeyF11)
36 KeyF12 = Key(termbox.KeyF12)
37 KeyInsert = Key(termbox.KeyInsert)
38 KeyDelete = Key(termbox.KeyDelete)
39 KeyHome = Key(termbox.KeyHome)
40 KeyEnd = Key(termbox.KeyEnd)
41 KeyPgup = Key(termbox.KeyPgup)
42 KeyPgdn = Key(termbox.KeyPgdn)
43 KeyArrowUp = Key(termbox.KeyArrowUp)
44 KeyArrowDown = Key(termbox.KeyArrowDown)
45 KeyArrowLeft = Key(termbox.KeyArrowLeft)
46 KeyArrowRight = Key(termbox.KeyArrowRight)
47
48 MouseLeft = Key(termbox.MouseLeft)
49 MouseMiddle = Key(termbox.MouseMiddle)
50 MouseRight = Key(termbox.MouseRight)
51)
52
53// Keys combinations.
54const (
55 KeyCtrlTilde Key = Key(termbox.KeyCtrlTilde)
56 KeyCtrl2 = Key(termbox.KeyCtrl2)
57 KeyCtrlSpace = Key(termbox.KeyCtrlSpace)
58 KeyCtrlA = Key(termbox.KeyCtrlA)
59 KeyCtrlB = Key(termbox.KeyCtrlB)
60 KeyCtrlC = Key(termbox.KeyCtrlC)
61 KeyCtrlD = Key(termbox.KeyCtrlD)
62 KeyCtrlE = Key(termbox.KeyCtrlE)
63 KeyCtrlF = Key(termbox.KeyCtrlF)
64 KeyCtrlG = Key(termbox.KeyCtrlG)
65 KeyBackspace = Key(termbox.KeyBackspace)
66 KeyCtrlH = Key(termbox.KeyCtrlH)
67 KeyTab = Key(termbox.KeyTab)
68 KeyCtrlI = Key(termbox.KeyCtrlI)
69 KeyCtrlJ = Key(termbox.KeyCtrlJ)
70 KeyCtrlK = Key(termbox.KeyCtrlK)
71 KeyCtrlL = Key(termbox.KeyCtrlL)
72 KeyEnter = Key(termbox.KeyEnter)
73 KeyCtrlM = Key(termbox.KeyCtrlM)
74 KeyCtrlN = Key(termbox.KeyCtrlN)
75 KeyCtrlO = Key(termbox.KeyCtrlO)
76 KeyCtrlP = Key(termbox.KeyCtrlP)
77 KeyCtrlQ = Key(termbox.KeyCtrlQ)
78 KeyCtrlR = Key(termbox.KeyCtrlR)
79 KeyCtrlS = Key(termbox.KeyCtrlS)
80 KeyCtrlT = Key(termbox.KeyCtrlT)
81 KeyCtrlU = Key(termbox.KeyCtrlU)
82 KeyCtrlV = Key(termbox.KeyCtrlV)
83 KeyCtrlW = Key(termbox.KeyCtrlW)
84 KeyCtrlX = Key(termbox.KeyCtrlX)
85 KeyCtrlY = Key(termbox.KeyCtrlY)
86 KeyCtrlZ = Key(termbox.KeyCtrlZ)
87 KeyEsc = Key(termbox.KeyEsc)
88 KeyCtrlLsqBracket = Key(termbox.KeyCtrlLsqBracket)
89 KeyCtrl3 = Key(termbox.KeyCtrl3)
90 KeyCtrl4 = Key(termbox.KeyCtrl4)
91 KeyCtrlBackslash = Key(termbox.KeyCtrlBackslash)
92 KeyCtrl5 = Key(termbox.KeyCtrl5)
93 KeyCtrlRsqBracket = Key(termbox.KeyCtrlRsqBracket)
94 KeyCtrl6 = Key(termbox.KeyCtrl6)
95 KeyCtrl7 = Key(termbox.KeyCtrl7)
96 KeyCtrlSlash = Key(termbox.KeyCtrlSlash)
97 KeyCtrlUnderscore = Key(termbox.KeyCtrlUnderscore)
98 KeySpace = Key(termbox.KeySpace)
99 KeyBackspace2 = Key(termbox.KeyBackspace2)
100 KeyCtrl8 = Key(termbox.KeyCtrl8)
101)
102
103// Modifiers.
104const (
105 ModNone Modifier = Modifier(0)
106 ModAlt = Modifier(termbox.ModAlt)
107)
108
109// Keybidings are used to link a given key-press event with a handler.
110type keybinding struct {
111 viewName string
112 key Key
113 ch rune
114 mod Modifier
115 h KeybindingHandler
116}
117
118// newKeybinding returns a new Keybinding object.
119func newKeybinding(viewname string, key Key, ch rune, mod Modifier, h KeybindingHandler) (kb *keybinding) {
120 kb = &keybinding{
121 viewName: viewname,
122 key: key,
123 ch: ch,
124 mod: mod,
125 h: h,
126 }
127 return kb
128}
129
130// matchKeypress returns if the keybinding matches the keypress.
131func (kb *keybinding) matchKeypress(key Key, ch rune, mod Modifier) bool {
132 return kb.key == key && kb.ch == ch && kb.mod == mod
133}
134
135// matchView returns if the keybinding matches the current view.
136func (kb *keybinding) matchView(v *View) bool {
137 if kb.viewName == "" {
138 return true
139 }
140 return v != nil && kb.viewName == v.name
141}