diff options
Diffstat (limited to 'init.go')
| -rw-r--r-- | init.go | 179 |
1 files changed, 179 insertions, 0 deletions
@@ -0,0 +1,179 @@ +//gjcarro:pjcarrlugin + +// Copyright 2014 The gocui Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import ( + "errors" + "os" + "runtime/debug" + + "github.com/awesome-gocui/gocui" + "go.wit.com/log" + "go.wit.com/toolkits/tree" +) + +// sent via -ldflags +var VERSION string +var BUILDTIME string + +func queueToolkitClose() { + me.baseGui.Close() +} + +func queueSetChecked(n *tree.Node, b bool) { + setChecked(n, b) +} + +// sets defaults and establishes communication +// to this toolkit from the wit/gui golang package +func init() { + log.Log(INFO, "Init() of awesome-gocui") + + // init the config struct default values + Set(&me, "default") + + // Set(&me, "dense") + + me.myTree = tree.New() + me.myTree.PluginName = "gocui" + + me.myTree.NodeAction = newaction + me.myTree.Add = newAdd + me.myTree.SetTitle = newSetTitle + me.myTree.SetLabel = newSetLabel + me.myTree.SetText = newSetText + me.myTree.AddText = newAddText + me.myTree.SetChecked = queueSetChecked + me.myTree.ToolkitClose = queueToolkitClose + + log.Log(NOW, "Init() start pluginChan") + log.Sleep(.1) // probably not needed, but in here for now under development + go mainGogui() + log.Sleep(.1) // probably not needed, but in here for now under development +} + +func standardExit() { + log.Log(NOW, "standardExit() doing baseGui.Close()") + me.baseGui.Close() + log.Log(NOW, "standardExit() doing outf.Close()") + outf.Close() + // log(true, "standardExit() setOutput(os.Stdout)") + // setOutput(os.Stdout) + log.Log(NOW, "standardExit() send back Quit()") + // go sendBackQuit() // don't stall here in case the + // induces a delay in case the callback channel is broken + log.Sleep(1) + log.Log(NOW, "standardExit() exit()") + os.Exit(0) +} + +func standardClose() { + log.Log(NOW, "standardExit() doing baseGui.Close()") + me.baseGui.Close() + log.Log(NOW, "standardExit() doing outf.Close()") + outf.Close() + os.Stdin = os.Stdin + os.Stdout = os.Stdout + os.Stderr = os.Stderr + log.Log(NOW, "standardExit() send back Quit()") +} + +var outf *os.File + +func main() { +} + +var origStdout *os.File +var origStderr *os.File + +func mainGogui() { + defer func() { + if r := recover(); r != nil { + log.Warn("YAHOOOO Recovered in guiMain application:", r) + log.Warn("Recovered from panic:", r) + me.baseGui.Close() + log.CaptureMode(nil) + log.Warn("YAHOOOO Recovered in guiMain application:", r) + log.Warn("Recovered from panic:", r) + me.myTree.SendToolkitPanic() + + return + } + }() + + var err error + + outf, err = os.OpenFile("/tmp/captureMode.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) + if err != nil { + log.Error(err, "error opening file: %v") + os.Exit(0) + } + origStdout = os.Stdout + os.Stdout = outf + defer outf.Close() + + log.CaptureMode(outf) + + gocuiMain() +} + +// This initializes the gocui package +// it runs SetManagerFunc which passes every input +// event (keyboard, mouse, etc) to the function "gocuiEvent()" +func gocuiMain() { + defer func() { + if r := recover(); r != nil { + log.Warn("YAHOOOO Recovered in gocuiMain()", r) + log.Warn("Recovered from panic:", r) + me.baseGui.Close() + + // allow gocui to close if possible, then print stack + log.Sleep(1) + os.Stdout = origStdout + os.Stderr = origStderr + me.myTree.SendToolkitPanic() + log.Warn("Stack trace:") + debug.PrintStack() + // panic("BUMMER 2") + + // attempt to switch to the nocui toolkit + log.Sleep(1) + me.myTree.SendToolkitLoad("nocui") + log.Sleep(3) + me.myTree.SendToolkitLoad("nocui") + // panic("BUMMER") + return + } + }() + g, err := gocui.NewGui(gocui.OutputNormal, true) + if err != nil { + return + } + defer g.Close() + + me.baseGui = g + + g.Cursor = true + g.Mouse = true + + // this sets the function that is run on every event. For example: + // When you click the mouse, move the mouse, or press a key on the keyboard + // This is equivalent to xev or similar to cat /dev/input on linux + g.SetManagerFunc(gocuiEvent) + + if err := defaultKeybindings(g); err != nil { + // normally panic here + log.Log(NOW, "defaultKeybindings(g) panic err =", err) + panic("gocuiTKdefaultkeybindings OOPS") + } + + if err := g.MainLoop(); err != nil && !errors.Is(err, gocui.ErrQuit) { + log.Log(NOW, "g.MainLoop() panic err =", err) + // normally panic here + panic("gocuiTKmainloop OOPS") + } +} |
