From 21d86ca486a88c936a1fe71f78d76c78df36a7eb Mon Sep 17 00:00:00 2001
From: zelig <viktor.tron@gmail.com>
Date: Thu, 26 Jun 2014 16:26:14 +0100
Subject: [PATCH] gui stop - introduce gui.Stop() - remember state with open -
 stopping ethereum stack is not gui concern, moved to main - stopping mining,
 gui and ethereum handled via interrupt callbacks - ^C triggers exactly the
 same behaviour as quit via menu

---
 ethereal/main.go   | 27 ++++++++++++++++++++++-----
 ethereal/ui/gui.go | 16 +++++++++++++---
 ethereum/main.go   |  4 ++++
 utils/cmd.go       | 13 ++++++++-----
 4 files changed, 47 insertions(+), 13 deletions(-)

diff --git a/ethereal/main.go b/ethereal/main.go
index 5dfab4c45..cfd85afe7 100644
--- a/ethereal/main.go
+++ b/ethereal/main.go
@@ -3,17 +3,24 @@ package main
 import (
 	"github.com/ethereum/go-ethereum/ethereal/ui"
 	"github.com/ethereum/go-ethereum/utils"
+  "github.com/ethereum/eth-go/ethlog"
 	"github.com/go-qml/qml"
 	"runtime"
+	"os"
 )
 
 func main() {
 	runtime.GOMAXPROCS(runtime.NumCPU())
 
-	utils.HandleInterrupt()
-
 	qml.Init(nil)
 
+	var interrupted = false
+	utils.RegisterInterrupt(func(os.Signal) {
+		interrupted = true
+	})
+
+	utils.HandleInterrupt()
+
 	// precedence: code-internal flag default < config file < environment variables < command line
 	Init() // parsing command line
 	utils.InitConfig(ConfigFile, Datadir, Identifier, "ETH")
@@ -36,9 +43,19 @@ func main() {
 	}
 
 	gui := ethui.New(ethereum, LogLevel)
-	gui.Start(AssetPath)
 
+	utils.RegisterInterrupt(func(os.Signal) {
+    gui.Stop()
+  })
 	utils.StartEthereum(ethereum, UseSeed)
-
-
+  // gui blocks the main thread
+  gui.Start(AssetPath)
+  // we need to run the interrupt callbacks in case gui is closed
+  // this skips if we got here by actual interrupt stopping the GUI
+	if !interrupted {
+		utils.RunInterruptCallbacks(os.Interrupt)
+  }
+  // this blocks the thread
+  ethereum.WaitForShutdown()
+  ethlog.Flush()
 }
diff --git a/ethereal/ui/gui.go b/ethereal/ui/gui.go
index 8845f6af3..938037b90 100644
--- a/ethereal/ui/gui.go
+++ b/ethereal/ui/gui.go
@@ -37,6 +37,7 @@ type Gui struct {
 
 	pub *ethpub.PEthereum
 	logLevel ethlog.LogLevel
+	open bool
 }
 
 // Create GUI, but doesn't start it
@@ -56,7 +57,7 @@ func New(ethereum *eth.Ethereum, logLevel int) *Gui {
 
 	pub := ethpub.NewPEthereum(ethereum)
 
-	return &Gui{eth: ethereum, lib: lib, txDb: db, addr: addr, pub: pub, logLevel: ethlog.LogLevel(logLevel)}
+	return &Gui{eth: ethereum, lib: lib, txDb: db, addr: addr, pub: pub, logLevel: ethlog.LogLevel(logLevel), open: false}
 }
 
 func (gui *Gui) Start(assetPath string) {
@@ -104,7 +105,7 @@ func (gui *Gui) Start(assetPath string) {
 	}
 
 	logger.Infoln("Starting GUI")
-
+	gui.open = true
 	win.Show()
 	// only add the gui logger after window is shown otherwise slider wont be shown
 	if addlog {
@@ -113,7 +114,16 @@ func (gui *Gui) Start(assetPath string) {
 	win.Wait()
 	// need to silence gui logger after window closed otherwise logsystem hangs
 	gui.SetLogLevel(ethlog.Silence)
-	gui.eth.Stop()
+	gui.open = false
+}
+
+func (gui *Gui) Stop() {
+	if gui.open {
+		gui.SetLogLevel(ethlog.Silence)
+		gui.open = false
+		gui.win.Hide()
+	}
+	logger.Infoln("Stopped")
 }
 
 func (gui *Gui) ToggleMining() {
diff --git a/ethereum/main.go b/ethereum/main.go
index 800486e56..93b2b47d3 100644
--- a/ethereum/main.go
+++ b/ethereum/main.go
@@ -46,4 +46,8 @@ func main() {
 	}
 
 	utils.StartEthereum(ethereum, UseSeed)
+
+	// this blocks the thread
+  ethereum.WaitForShutdown()
+  ethlog.Flush()
 }
diff --git a/utils/cmd.go b/utils/cmd.go
index da05c6d83..db5ec5b48 100644
--- a/utils/cmd.go
+++ b/utils/cmd.go
@@ -32,13 +32,17 @@ func HandleInterrupt() {
     signal.Notify(c, os.Interrupt)
     for sig := range c {
       logger.Errorf("Shutting down (%v) ... \n", sig)
-      for _, cb := range interruptCallbacks {
-        cb(sig)
-      }
+      RunInterruptCallbacks(sig)
     }
   }()
 }
 
+func RunInterruptCallbacks(sig os.Signal) {
+  for _, cb := range interruptCallbacks {
+    cb(sig)
+  }
+}
+
 func AbsolutePath(Datadir string, filename string) string {
   if path.IsAbs(filename) {
     return filename
@@ -94,6 +98,7 @@ func InitLogging (Datadir string, LogFile string, LogLevel int, DebugFile string
 }
 
 func InitConfig(ConfigFile string, Datadir string, Identifier string, EnvPrefix string) {
+  InitDataDir(Datadir)
   ethutil.ReadConfig(ConfigFile, Datadir, Identifier, EnvPrefix)
   ethutil.Config.Set("rpcport", "700")
 }
@@ -120,8 +125,6 @@ func StartEthereum(ethereum *eth.Ethereum, UseSeed bool) {
     ethereum.Stop()
     ethlog.Flush()
   })
-  // this blocks the thread
-  ethereum.WaitForShutdown()
 }
 
 func ShowGenesis(ethereum *eth.Ethereum) {
-- 
GitLab