Fix Ctrl+C handling in CLI

Ctrl+C was not being properly handled by the CLI, resulting in an  unclean
shutdown and other unexpected consequences -- e.g. a
"./start-mycroft.sh debug" would kill the background processes on exit.  The
KeyboardException was never being triggered.

Now the SIGINT is being captured and Ctrl+C behaves (as intended) just like
pressing Ctrl+X.
pull/1954/head
Steve Penrod 2019-01-16 23:49:15 -08:00 committed by Åke Forslund
parent cb891ecf2f
commit b38668a2ef
1 changed files with 37 additions and 16 deletions

View File

@ -14,6 +14,7 @@
#
import sys
import io
import signal
from math import ceil
from .gui_server import start_qml_gui
@ -100,11 +101,30 @@ CLR_LOG_CMDMESSAGE = 0
CLR_METER_CUR = 0
CLR_METER = 0
# Allow Ctrl+C catching...
ctrl_c_was_pressed = False
def ctrl_c_handler(signum, frame):
global ctrl_c_was_pressed
ctrl_c_was_pressed = True
def ctrl_c_pressed():
global ctrl_c_was_pressed
if ctrl_c_was_pressed:
ctrl_c_was_pressed = False
return True
else:
return False
signal.signal(signal.SIGINT, ctrl_c_handler)
##############################################################################
# Helper functions
def clamp(n, smallest, largest):
""" Force n to be between smallest and largest, inclusive """
return max(smallest, min(n, largest))
@ -1151,25 +1171,22 @@ def gui_main(stdscr):
try:
while True:
set_screen_dirty()
c = 0
code = 0
try:
# Don't block, this allows us to refresh the screen while
# waiting on initial messagebus connection, etc
scr.timeout(1)
c = scr.get_wch() # unicode char or int for special keys
if c == -1:
continue
except KeyboardInterrupt:
# User hit Ctrl+C to quit
if find_str:
# End the find session
find_str = None
rebuild_filtered_log()
continue # Consumed the Ctrl+C, get next character
if ctrl_c_pressed():
# User hit Ctrl+C. treat same as Ctrl+X
c = 24
else:
c = 24 # treat as Ctrl+X (Exit)
# Don't block, this allows us to refresh the screen while
# waiting on initial messagebus connection, etc
scr.timeout(1)
c = scr.get_wch() # unicode char or int for special keys
if c == -1:
continue
except curses.error:
# This happens in odd cases, such as when you Ctrl+Z suspend
# This happens in odd cases, such as when you Ctrl+Z
# the CLI and then resume. Curses fails on get_wch().
continue
@ -1319,7 +1336,11 @@ def gui_main(stdscr):
# End the find session
find_str = None
rebuild_filtered_log()
elif line.startswith(":"):
# cancel command mode
line = ""
else:
# exit CLI
break
elif code > 31 and isinstance(c, str):
# Accept typed character in the utterance