keybinding.go

  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}