Misc fixes for TUI
This commit is contained in:
parent
818f68ec53
commit
4b18b575cd
4
setup.py
4
setup.py
@ -903,9 +903,9 @@ def build_kitty_tool(args: Options, launcher_dir: str, for_freeze: bool = False)
|
|||||||
if not go:
|
if not go:
|
||||||
raise SystemExit('The go tool was not found on this system. Install Go')
|
raise SystemExit('The go tool was not found on this system. Install Go')
|
||||||
update_go_generated_files(args, os.path.join(launcher_dir, appname))
|
update_go_generated_files(args, os.path.join(launcher_dir, appname))
|
||||||
cmd = [go, 'build']
|
cmd = [go, 'build', '-v']
|
||||||
if args.verbose:
|
if args.verbose:
|
||||||
cmd.append('-v')
|
cmd.append('-x')
|
||||||
ld_flags = [f"-X 'kitty.VCSRevision={get_vcs_rev_define()}'"]
|
ld_flags = [f"-X 'kitty.VCSRevision={get_vcs_rev_define()}'"]
|
||||||
if for_freeze:
|
if for_freeze:
|
||||||
ld_flags.append("-X 'kitty.IsFrozenBuild=true")
|
ld_flags.append("-X 'kitty.IsFrozenBuild=true")
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
package tui
|
package tui
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
@ -40,8 +41,50 @@ const (
|
|||||||
NUM_LOCK KeyModifiers = 128
|
NUM_LOCK KeyModifiers = 128
|
||||||
)
|
)
|
||||||
|
|
||||||
func (self *KeyModifiers) WithoutLocks() KeyModifiers {
|
func (self KeyModifiers) WithoutLocks() KeyModifiers {
|
||||||
return *self & ^(CAPS_LOCK | NUM_LOCK)
|
return self & ^(CAPS_LOCK | NUM_LOCK)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (self KeyEventType) String() string {
|
||||||
|
switch self {
|
||||||
|
case PRESS:
|
||||||
|
return "PRESS"
|
||||||
|
case REPEAT:
|
||||||
|
return "REPEAT"
|
||||||
|
case RELEASE:
|
||||||
|
return "RELEASE"
|
||||||
|
default:
|
||||||
|
return fmt.Sprintf("KeyEventType:%d", int(self))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (self *KeyModifiers) String() string {
|
||||||
|
ans := make([]string, 0)
|
||||||
|
if *self&SHIFT != 0 {
|
||||||
|
ans = append(ans, "shift")
|
||||||
|
}
|
||||||
|
if *self&ALT != 0 {
|
||||||
|
ans = append(ans, "alt")
|
||||||
|
}
|
||||||
|
if *self&CTRL != 0 {
|
||||||
|
ans = append(ans, "ctrl")
|
||||||
|
}
|
||||||
|
if *self&SUPER != 0 {
|
||||||
|
ans = append(ans, "super")
|
||||||
|
}
|
||||||
|
if *self&HYPER != 0 {
|
||||||
|
ans = append(ans, "hyper")
|
||||||
|
}
|
||||||
|
if *self&META != 0 {
|
||||||
|
ans = append(ans, "meta")
|
||||||
|
}
|
||||||
|
if *self&CAPS_LOCK != 0 {
|
||||||
|
ans = append(ans, "caps_lock")
|
||||||
|
}
|
||||||
|
if *self&NUM_LOCK != 0 {
|
||||||
|
ans = append(ans, "num_lock")
|
||||||
|
}
|
||||||
|
return strings.Join(ans, "+")
|
||||||
}
|
}
|
||||||
|
|
||||||
type KeyEvent struct {
|
type KeyEvent struct {
|
||||||
@ -54,6 +97,24 @@ type KeyEvent struct {
|
|||||||
Handled bool
|
Handled bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (self *KeyEvent) String() string {
|
||||||
|
key := self.Key
|
||||||
|
if self.Mods > 0 {
|
||||||
|
key = self.Mods.String() + "+" + key
|
||||||
|
}
|
||||||
|
ans := fmt.Sprint(self.Type, "{ ", key, " ")
|
||||||
|
if self.Text != "" {
|
||||||
|
ans += "Text: " + self.Text + " "
|
||||||
|
}
|
||||||
|
if self.ShiftedKey != "" {
|
||||||
|
ans += "ShiftedKey: " + self.ShiftedKey + " "
|
||||||
|
}
|
||||||
|
if self.AlternateKey != "" {
|
||||||
|
ans += "AlternateKey: " + self.AlternateKey + " "
|
||||||
|
}
|
||||||
|
return ans + "}"
|
||||||
|
}
|
||||||
|
|
||||||
func KeyEventFromCSI(csi string) *KeyEvent {
|
func KeyEventFromCSI(csi string) *KeyEvent {
|
||||||
if len(csi) == 0 {
|
if len(csi) == 0 {
|
||||||
return nil
|
return nil
|
||||||
@ -86,7 +147,7 @@ func KeyEventFromCSI(csi string) *KeyEvent {
|
|||||||
if len(sections) > 2 {
|
if len(sections) > 2 {
|
||||||
third_section = get_sub_sections(sections[2])
|
third_section = get_sub_sections(sections[2])
|
||||||
}
|
}
|
||||||
var ans KeyEvent
|
var ans = KeyEvent{Type: PRESS}
|
||||||
keynum := first_section[0]
|
keynum := first_section[0]
|
||||||
if val, ok := letter_trailer_to_csi_number_map[last_char]; ok {
|
if val, ok := letter_trailer_to_csi_number_map[last_char]; ok {
|
||||||
keynum = val
|
keynum = val
|
||||||
@ -148,6 +209,14 @@ type ParsedShortcut struct {
|
|||||||
KeyName string
|
KeyName string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (self *ParsedShortcut) String() string {
|
||||||
|
ans := self.KeyName
|
||||||
|
if self.Mods > 0 {
|
||||||
|
ans = self.Mods.String() + "+" + ans
|
||||||
|
}
|
||||||
|
return ans
|
||||||
|
}
|
||||||
|
|
||||||
var parsed_shortcut_cache map[string]ParsedShortcut
|
var parsed_shortcut_cache map[string]ParsedShortcut
|
||||||
|
|
||||||
func ParseShortcut(spec string) *ParsedShortcut {
|
func ParseShortcut(spec string) *ParsedShortcut {
|
||||||
|
|||||||
@ -46,8 +46,9 @@ type Loop struct {
|
|||||||
write_buf []byte
|
write_buf []byte
|
||||||
|
|
||||||
// Callbacks
|
// Callbacks
|
||||||
OnKeyEvent func(loop *Loop, event *KeyEvent) error
|
OnInitialize func(loop *Loop) string
|
||||||
OnText func(loop *Loop, text string, from_key_event bool, in_bracketed_paste bool) error
|
OnKeyEvent func(loop *Loop, event *KeyEvent) error
|
||||||
|
OnText func(loop *Loop, text string, from_key_event bool, in_bracketed_paste bool) error
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *Loop) handle_csi(raw []byte) error {
|
func (self *Loop) handle_csi(raw []byte) error {
|
||||||
@ -60,6 +61,7 @@ func (self *Loop) handle_csi(raw []byte) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (self *Loop) handle_key_event(ev *KeyEvent) error {
|
func (self *Loop) handle_key_event(ev *KeyEvent) error {
|
||||||
|
// self.controlling_term.DebugPrintln(ev)
|
||||||
if self.OnKeyEvent != nil {
|
if self.OnKeyEvent != nil {
|
||||||
err := self.OnKeyEvent(self, ev)
|
err := self.OnKeyEvent(self, ev)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -163,11 +165,11 @@ func (self *Loop) DeathSignalName() string {
|
|||||||
func (self *Loop) KillIfSignalled() {
|
func (self *Loop) KillIfSignalled() {
|
||||||
switch self.death_signal {
|
switch self.death_signal {
|
||||||
case SIGINT:
|
case SIGINT:
|
||||||
syscall.Kill(-1, syscall.SIGINT)
|
syscall.Kill(os.Getpid(), syscall.SIGINT)
|
||||||
case SIGTERM:
|
case SIGTERM:
|
||||||
syscall.Kill(-1, syscall.SIGTERM)
|
syscall.Kill(os.Getpid(), syscall.SIGTERM)
|
||||||
case SIGHUP:
|
case SIGHUP:
|
||||||
syscall.Kill(-1, syscall.SIGHUP)
|
syscall.Kill(os.Getpid(), syscall.SIGHUP)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -216,12 +218,19 @@ func (self *Loop) Run() (err error) {
|
|||||||
self.keep_going = true
|
self.keep_going = true
|
||||||
self.flush_write_buf = true
|
self.flush_write_buf = true
|
||||||
self.queue_write_to_tty(self.terminal_options.SetStateEscapeCodes())
|
self.queue_write_to_tty(self.terminal_options.SetStateEscapeCodes())
|
||||||
|
finalizer := ""
|
||||||
|
if self.OnInitialize != nil {
|
||||||
|
finalizer = self.OnInitialize(self)
|
||||||
|
}
|
||||||
|
|
||||||
defer func() {
|
defer func() {
|
||||||
if self.flush_write_buf {
|
if self.flush_write_buf {
|
||||||
self.flush()
|
self.flush()
|
||||||
}
|
}
|
||||||
self.write_buf = self.write_buf[:]
|
self.write_buf = self.write_buf[:0]
|
||||||
|
if finalizer != "" {
|
||||||
|
self.queue_write_to_tty([]byte(finalizer))
|
||||||
|
}
|
||||||
self.queue_write_to_tty(self.terminal_options.ResetStateEscapeCodes())
|
self.queue_write_to_tty(self.terminal_options.ResetStateEscapeCodes())
|
||||||
self.flush()
|
self.flush()
|
||||||
}()
|
}()
|
||||||
|
|||||||
@ -22,6 +22,8 @@ func ReadPassword(prompt string, kill_if_signaled bool) (password string, err er
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
loop.OnInitialize = func(loop *Loop) string { return "\r\n" }
|
||||||
|
|
||||||
loop.OnText = func(loop *Loop, text string, from_key_event bool, in_bracketed_paste bool) error {
|
loop.OnText = func(loop *Loop, text string, from_key_event bool, in_bracketed_paste bool) error {
|
||||||
old_width := Wcswidth(password)
|
old_width := Wcswidth(password)
|
||||||
password += text
|
password += text
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user