Skip to content

Commit 604f835

Browse files
authored
gh-134210: refactor signal handling in _curses.window.{get_wch,getkey} (#134646)
1 parent 51762b6 commit 604f835

File tree

1 file changed

+20
-15
lines changed

1 file changed

+20
-15
lines changed

Modules/_cursesmodule.c

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1655,6 +1655,21 @@ _curses_window_getbkgd_impl(PyCursesWindowObject *self)
16551655
return (long) getbkgd(self->win);
16561656
}
16571657

1658+
static PyObject *
1659+
curses_check_signals_on_input_error(PyCursesWindowObject *self,
1660+
const char *curses_funcname,
1661+
const char *python_funcname)
1662+
{
1663+
assert(!PyErr_Occurred());
1664+
if (PyErr_CheckSignals()) {
1665+
return NULL;
1666+
}
1667+
cursesmodule_state *state = get_cursesmodule_state_by_win(self);
1668+
PyErr_Format(state->error, "%s() (called by %s()): no input",
1669+
curses_funcname, python_funcname);
1670+
return NULL;
1671+
}
1672+
16581673
/*[clinic input]
16591674
_curses.window.getch
16601675
@@ -1737,14 +1752,9 @@ _curses_window_getkey_impl(PyCursesWindowObject *self, int group_right_1,
17371752
Py_END_ALLOW_THREADS
17381753

17391754
if (rtn == ERR) {
1740-
/* getch() returns ERR in nodelay mode */
1741-
PyErr_CheckSignals();
1742-
if (!PyErr_Occurred()) {
1743-
cursesmodule_state *state = get_cursesmodule_state_by_win(self);
1744-
const char *funcname = group_right_1 ? "mvwgetch" : "wgetch";
1745-
PyErr_Format(state->error, "getkey(): %s(): no input", funcname);
1746-
}
1747-
return NULL;
1755+
/* wgetch() returns ERR in nodelay mode */
1756+
const char *funcname = group_right_1 ? "mvwgetch" : "wgetch";
1757+
return curses_check_signals_on_input_error(self, funcname, "getkey");
17481758
} else if (rtn <= 255) {
17491759
#ifdef NCURSES_VERSION_MAJOR
17501760
#if NCURSES_VERSION_MAJOR*100+NCURSES_VERSION_MINOR <= 507
@@ -1797,14 +1807,9 @@ _curses_window_get_wch_impl(PyCursesWindowObject *self, int group_right_1,
17971807
Py_END_ALLOW_THREADS
17981808

17991809
if (ct == ERR) {
1800-
if (PyErr_CheckSignals())
1801-
return NULL;
1802-
1803-
/* get_wch() returns ERR in nodelay mode */
1804-
cursesmodule_state *state = get_cursesmodule_state_by_win(self);
1810+
/* wget_wch() returns ERR in nodelay mode */
18051811
const char *funcname = group_right_1 ? "mvwget_wch" : "wget_wch";
1806-
PyErr_Format(state->error, "get_wch(): %s(): no input", funcname);
1807-
return NULL;
1812+
return curses_check_signals_on_input_error(self, funcname, "get_wch");
18081813
}
18091814
if (ct == KEY_CODE_YES)
18101815
return PyLong_FromLong(rtn);

0 commit comments

Comments
 (0)