From d34e4cf6984a139c12646d21771526e1e2a6f4f7 Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Fri, 28 Apr 2017 22:58:08 +0900 Subject: Support CTRL-Z (SIGSTOP) --- src/tui/dummy.go | 12 ++++++------ src/tui/light.go | 38 +++++++++++++++++++++++--------------- src/tui/ncurses.go | 5 ++--- src/tui/tcell.go | 9 +++------ src/tui/tui.go | 4 ++-- 5 files changed, 36 insertions(+), 32 deletions(-) (limited to 'src/tui') diff --git a/src/tui/dummy.go b/src/tui/dummy.go index 60a23fb6..c96ce8eb 100644 --- a/src/tui/dummy.go +++ b/src/tui/dummy.go @@ -25,13 +25,13 @@ const ( Reverse = Attr(1 << 6) ) -func (r *FullscreenRenderer) Init() {} -func (r *FullscreenRenderer) Pause() {} -func (r *FullscreenRenderer) Clear() {} -func (r *FullscreenRenderer) Refresh() {} -func (r *FullscreenRenderer) Close() {} +func (r *FullscreenRenderer) Init() {} +func (r *FullscreenRenderer) Pause(bool) {} +func (r *FullscreenRenderer) Resume(bool) {} +func (r *FullscreenRenderer) Clear() {} +func (r *FullscreenRenderer) Refresh() {} +func (r *FullscreenRenderer) Close() {} -func (r *FullscreenRenderer) Resume() bool { return false } func (r *FullscreenRenderer) DoesAutoWrap() bool { return false } func (r *FullscreenRenderer) IsOptimized() bool { return false } func (r *FullscreenRenderer) GetChar() Event { return Event{} } diff --git a/src/tui/light.go b/src/tui/light.go index 7819050c..be6950c8 100644 --- a/src/tui/light.go +++ b/src/tui/light.go @@ -522,27 +522,35 @@ func (r *LightRenderer) rmcup() { r.csi("?1049l") } -func (r *LightRenderer) Pause() { +func (r *LightRenderer) Pause(clear bool) { terminal.Restore(r.fd(), r.origState) - if r.fullscreen { - r.rmcup() - } else { - r.smcup() - r.csi("H") + if clear { + if r.fullscreen { + r.rmcup() + } else { + r.smcup() + r.csi("H") + } + r.flush() } - r.flush() } -func (r *LightRenderer) Resume() bool { +func (r *LightRenderer) Resume(clear bool) { terminal.MakeRaw(r.fd()) - if r.fullscreen { - r.smcup() - } else { - r.rmcup() + if clear { + if r.fullscreen { + r.smcup() + } else { + r.rmcup() + } + r.flush() + } else if !r.fullscreen && r.mouse { + // NOTE: Resume(false) is only called on SIGCONT after SIGSTOP. + // And It's highly likely that the offset we obtained at the beginning will + // no longer be correct, so we simply disable mouse input. + r.csi("?1000l") + r.mouse = false } - r.flush() - // Should redraw - return true } func (r *LightRenderer) Clear() { diff --git a/src/tui/ncurses.go b/src/tui/ncurses.go index ba3a1cfb..3263c397 100644 --- a/src/tui/ncurses.go +++ b/src/tui/ncurses.go @@ -176,12 +176,11 @@ func initPairs(theme *ColorTheme) { } } -func (r *FullscreenRenderer) Pause() { +func (r *FullscreenRenderer) Pause(bool) { C.endwin() } -func (r *FullscreenRenderer) Resume() bool { - return false +func (r *FullscreenRenderer) Resume(bool) { } func (r *FullscreenRenderer) Close() { diff --git a/src/tui/tcell.go b/src/tui/tcell.go index bda5d082..3a8c7655 100644 --- a/src/tui/tcell.go +++ b/src/tui/tcell.go @@ -282,7 +282,7 @@ func (r *FullscreenRenderer) GetChar() Event { return Event{keyfn('z'), 0, nil} case tcell.KeyCtrlSpace: return Event{CtrlSpace, 0, nil} - case tcell.KeyBackspace, tcell.KeyBackspace2: + case tcell.KeyBackspace2: if alt { return Event{AltBS, 0, nil} } @@ -308,8 +308,6 @@ func (r *FullscreenRenderer) GetChar() Event { case tcell.KeyPgDn: return Event{PgDn, 0, nil} - case tcell.KeyTab: - return Event{Tab, 0, nil} case tcell.KeyBacktab: return Event{BTab, 0, nil} @@ -366,13 +364,12 @@ func (r *FullscreenRenderer) GetChar() Event { return Event{Invalid, 0, nil} } -func (r *FullscreenRenderer) Pause() { +func (r *FullscreenRenderer) Pause(bool) { _screen.Fini() } -func (r *FullscreenRenderer) Resume() bool { +func (r *FullscreenRenderer) Resume(bool) { r.initScreen() - return true } func (r *FullscreenRenderer) Close() { diff --git a/src/tui/tui.go b/src/tui/tui.go index d360c4ec..c638b35a 100644 --- a/src/tui/tui.go +++ b/src/tui/tui.go @@ -206,8 +206,8 @@ const ( type Renderer interface { Init() - Pause() - Resume() bool + Pause(clear bool) + Resume(clear bool) Clear() RefreshWindows(windows []Window) Refresh() -- cgit v1.2.3