X Tutup
Skip to content

Commit 68cf03b

Browse files
better signal handlering yet
--HG-- branch : scroll-frontend extra : amend_source : 4222dbd8a6e18ea77e7e8ba33dc82f9f85494a33
1 parent fe7f203 commit 68cf03b

File tree

2 files changed

+20
-10
lines changed

2 files changed

+20
-10
lines changed

bpython/scrollfrontend/coderunner.py

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -48,37 +48,39 @@ def run_code(self, for_code=None):
4848
self.code_thread = threading.Thread(target=self._blocking_run_code, name='codethread')
4949
self.code_thread.daemon = True
5050
self.orig_sigint_handler = signal.getsignal(signal.SIGINT)
51-
signal.signal(signal.SIGINT, signal.default_int_handler)
51+
signal.signal(signal.SIGINT, self.sigint_handler)
5252
self.code_thread.start()
5353
else:
5454
assert self.code_is_waiting
5555
self.code_is_waiting = False
56-
signal.signal(signal.SIGINT, signal.default_int_handler)
56+
signal.signal(signal.SIGINT, self.sigint_handler)
5757
if self.sigint_happened:
5858
self.sigint_happened = False
5959
self.responses_for_code_thread.put(SigintHappened)
6060
else:
6161
self.responses_for_code_thread.put(for_code)
6262

6363
request = self.requests_from_code_thread.get()
64-
signal.signal(signal.SIGINT, self.sigint_handler_while_fufilling_code_request)
6564
if request in ['wait', 'refresh']:
6665
self.code_is_waiting = True
6766
if request == 'refresh':
6867
self.stuff_a_refresh_request()
6968
return False
7069
elif request in ['done', 'unfinished']:
7170
self._unload_code()
72-
if self.orig_sigint_handler:
73-
signal.signal(signal.SIGINT, self.orig_sigint_handler)
71+
signal.signal(signal.SIGINT, self.orig_sigint_handler)
7472
self.orig_sigint_handler = None
7573
return request
7674
else:
7775
raise ValueError("Not a valid request_from_code_thread value: %r" % request)
7876

79-
def sigint_handler_while_fufilling_code_request(self, *args):
80-
logging.debug('while fufilling code request sigint handler running!')
81-
self.sigint_happened = True
77+
def sigint_handler(self, *args):
78+
if threading.current_thread() is self.code_thread:
79+
logging.debug('sigint while running user code!')
80+
raise KeyboardInterrupt()
81+
else:
82+
logging.debug('sigint while fufilling code request sigint handler running!')
83+
self.sigint_happened = True
8284

8385
def _blocking_run_code(self):
8486
unfinished = self.interp.runsource(self.source)

bpython/scrollfrontend/repl.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
from fmtstr.fmtstr import fmtstr, FmtStr
2222
from fmtstr.bpythonparse import parse as bpythonparse
2323
from fmtstr.bpythonparse import func_for_letter, color_for_letter
24-
from fmtstr.events import pp_event, SigIntEvent
2524

2625
from bpython.scrollfrontend.manual_readline import char_sequences as rl_char_sequences
2726
from bpython.scrollfrontend.manual_readline import get_updated_char_sequences
@@ -201,6 +200,7 @@ def process_event(self, e):
201200
if isinstance(e, events.SigIntEvent):
202201
logging.debug('received sigint event')
203202
self.keyboard_interrupt()
203+
self.update_completion()
204204
return
205205
if isinstance(e, events.WindowChangeEvent):
206206
logging.debug('window change to %d %d', e.width, e.height)
@@ -454,8 +454,16 @@ def run_code_and_maybe_finish(self, for_code=None):
454454
self.done = not unfinished
455455

456456
def keyboard_interrupt(self):
457+
#TODO factor out the common cleanup from running a line
458+
#TODO make rewind work properly with ctrl-c somehow
459+
self.cursor_offset_in_line = -1
460+
self.unhighlight_paren()
461+
self.display_lines.extend(self.display_buffer_lines)
457462
self.display_lines.extend(paint.display_linize(self.current_cursor_line, self.width))
458463
self.display_lines.extend(paint.display_linize("KeyboardInterrupt", self.width))
464+
self.display_buffer = []
465+
self.buffer = []
466+
self.cursor_offset_in_line = 0
459467
self.saved_indent = 0
460468
self._current_line = ''
461469
self.cursor_offset_in_line = len(self._current_line)
@@ -641,7 +649,7 @@ def paint(self, about_to_exit=False):
641649
if self.presentation_mode:
642650
rows = arr.height
643651
columns = arr.width
644-
last_key_box = paint.paint_last_events(rows, columns, [pp_event(x) for x in self.last_events if x])
652+
last_key_box = paint.paint_last_events(rows, columns, [events.pp_event(x) for x in self.last_events if x])
645653
arr[arr.height-last_key_box.height:arr.height, arr.width-last_key_box.width:arr.width] = last_key_box
646654
else:
647655
statusbar_row = min_height + 1 if arr.height == min_height else arr.height

0 commit comments

Comments
 (0)
X Tutup