From 06d596e780031331302ac7b8b4a85a74f1e668f4 Mon Sep 17 00:00:00 2001 From: Zachary Yedidia Date: Tue, 28 Aug 2018 14:24:59 -0400 Subject: [PATCH] Synchronize screen --- cmd/micro/action/actions_posix.go | 11 ++--------- cmd/micro/micro.go | 3 ++- cmd/micro/screen/screen.go | 31 +++++++++++++++++++++++++++++-- cmd/micro/util/message.go | 10 ++-------- 4 files changed, 35 insertions(+), 20 deletions(-) diff --git a/cmd/micro/action/actions_posix.go b/cmd/micro/action/actions_posix.go index 8981685f..46eac8af 100644 --- a/cmd/micro/action/actions_posix.go +++ b/cmd/micro/action/actions_posix.go @@ -13,12 +13,7 @@ import ( // This only works on linux and has no default binding. // This code was adapted from the suspend code in nsf/godit func (*BufHandler) Suspend() bool { - screenWasNil := screen.Screen == nil - - if !screenWasNil { - screen.Screen.Fini() - screen.Screen = nil - } + screen.TempFini() // suspend the process pid := syscall.Getpid() @@ -27,9 +22,7 @@ func (*BufHandler) Suspend() bool { util.TermMessage(err) } - if !screenWasNil { - screen.Init() - } + screen.TempStart() return false } diff --git a/cmd/micro/micro.go b/cmd/micro/micro.go index 070c860d..05d720ce 100644 --- a/cmd/micro/micro.go +++ b/cmd/micro/micro.go @@ -144,8 +144,9 @@ func main() { go func() { events = make(chan tcell.Event) for { - // TODO: fix race condition with screen.Screen = nil + screen.Lock() events <- screen.Screen.PollEvent() + screen.Unlock() } }() diff --git a/cmd/micro/screen/screen.go b/cmd/micro/screen/screen.go index 3653da32..3cba43f5 100644 --- a/cmd/micro/screen/screen.go +++ b/cmd/micro/screen/screen.go @@ -3,6 +3,7 @@ package screen import ( "fmt" "os" + "sync" "github.com/zyedidia/micro/cmd/micro/config" "github.com/zyedidia/micro/cmd/micro/terminfo" @@ -10,6 +11,34 @@ import ( ) var Screen tcell.Screen +var lock sync.Mutex + +func Lock() { + lock.Lock() +} + +func Unlock() { + lock.Unlock() +} + +var screenWasNil bool + +func TempFini() { + screenWasNil := Screen == nil + + if !screenWasNil { + Lock() + Screen.Fini() + Screen = nil + } +} + +func TempStart() { + if !screenWasNil { + Init() + Unlock() + } +} // Init creates and initializes the tcell screen func Init() { @@ -64,6 +93,4 @@ func Init() { } os.Setenv("TCELLDB", tcelldb) - - // Screen.SetStyle(defStyle) } diff --git a/cmd/micro/util/message.go b/cmd/micro/util/message.go index 589dbbcd..2a1ddce1 100644 --- a/cmd/micro/util/message.go +++ b/cmd/micro/util/message.go @@ -16,11 +16,7 @@ import ( // This will write the message, and wait for the user // to press and key to continue func TermMessage(msg ...interface{}) { - screenWasNil := screen.Screen == nil - if !screenWasNil { - screen.Screen.Fini() - screen.Screen = nil - } + screen.TempFini() fmt.Println(msg...) fmt.Print("\nPress enter to continue") @@ -28,9 +24,7 @@ func TermMessage(msg ...interface{}) { reader := bufio.NewReader(os.Stdin) reader.ReadString('\n') - if !screenWasNil { - screen.Init() - } + screen.TempStart() } // TermError sends an error to the user in the terminal. Like TermMessage except formatted