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