mirror of https://github.com/python/cpython.git
[3.13] gh-134210: handle signals in `_curses.window.getch` (GH-134326) (#134784)
(cherry picked from commit 51762b6cad
)
This commit is contained in:
parent
a5f281f4e4
commit
5fb05ea679
|
@ -0,0 +1,2 @@
|
||||||
|
:func:`curses.window.getch` now correctly handles signals. Patch by Bénédikt
|
||||||
|
Tran.
|
|
@ -1385,7 +1385,7 @@ _curses_window_getbkgd_impl(PyCursesWindowObject *self)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*[clinic input]
|
/*[clinic input]
|
||||||
_curses.window.getch -> int
|
_curses.window.getch
|
||||||
|
|
||||||
[
|
[
|
||||||
y: int
|
y: int
|
||||||
|
@ -1402,10 +1402,10 @@ keypad keys and so on return numbers higher than 256. In no-delay mode, -1
|
||||||
is returned if there is no input, else getch() waits until a key is pressed.
|
is returned if there is no input, else getch() waits until a key is pressed.
|
||||||
[clinic start generated code]*/
|
[clinic start generated code]*/
|
||||||
|
|
||||||
static int
|
static PyObject *
|
||||||
_curses_window_getch_impl(PyCursesWindowObject *self, int group_right_1,
|
_curses_window_getch_impl(PyCursesWindowObject *self, int group_right_1,
|
||||||
int y, int x)
|
int y, int x)
|
||||||
/*[clinic end generated code: output=980aa6af0c0ca387 input=bb24ebfb379f991f]*/
|
/*[clinic end generated code: output=e1639e87d545e676 input=73f350336b1ee8c8]*/
|
||||||
{
|
{
|
||||||
int rtn;
|
int rtn;
|
||||||
|
|
||||||
|
@ -1418,7 +1418,17 @@ _curses_window_getch_impl(PyCursesWindowObject *self, int group_right_1,
|
||||||
}
|
}
|
||||||
Py_END_ALLOW_THREADS
|
Py_END_ALLOW_THREADS
|
||||||
|
|
||||||
return rtn;
|
if (rtn == ERR) {
|
||||||
|
// We suppress ERR returned by wgetch() in nodelay mode
|
||||||
|
// after we handled possible interruption signals.
|
||||||
|
if (PyErr_CheckSignals()) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
// ERR is an implementation detail, so to be on the safe side,
|
||||||
|
// we forcibly set the return value to -1 as documented above.
|
||||||
|
rtn = -1;
|
||||||
|
}
|
||||||
|
return PyLong_FromLong(rtn);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*[clinic input]
|
/*[clinic input]
|
||||||
|
|
|
@ -768,7 +768,7 @@ PyDoc_STRVAR(_curses_window_getch__doc__,
|
||||||
#define _CURSES_WINDOW_GETCH_METHODDEF \
|
#define _CURSES_WINDOW_GETCH_METHODDEF \
|
||||||
{"getch", (PyCFunction)_curses_window_getch, METH_VARARGS, _curses_window_getch__doc__},
|
{"getch", (PyCFunction)_curses_window_getch, METH_VARARGS, _curses_window_getch__doc__},
|
||||||
|
|
||||||
static int
|
static PyObject *
|
||||||
_curses_window_getch_impl(PyCursesWindowObject *self, int group_right_1,
|
_curses_window_getch_impl(PyCursesWindowObject *self, int group_right_1,
|
||||||
int y, int x);
|
int y, int x);
|
||||||
|
|
||||||
|
@ -779,7 +779,6 @@ _curses_window_getch(PyCursesWindowObject *self, PyObject *args)
|
||||||
int group_right_1 = 0;
|
int group_right_1 = 0;
|
||||||
int y = 0;
|
int y = 0;
|
||||||
int x = 0;
|
int x = 0;
|
||||||
int _return_value;
|
|
||||||
|
|
||||||
switch (PyTuple_GET_SIZE(args)) {
|
switch (PyTuple_GET_SIZE(args)) {
|
||||||
case 0:
|
case 0:
|
||||||
|
@ -794,11 +793,7 @@ _curses_window_getch(PyCursesWindowObject *self, PyObject *args)
|
||||||
PyErr_SetString(PyExc_TypeError, "_curses.window.getch requires 0 to 2 arguments");
|
PyErr_SetString(PyExc_TypeError, "_curses.window.getch requires 0 to 2 arguments");
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
_return_value = _curses_window_getch_impl(self, group_right_1, y, x);
|
return_value = _curses_window_getch_impl(self, group_right_1, y, x);
|
||||||
if ((_return_value == -1) && PyErr_Occurred()) {
|
|
||||||
goto exit;
|
|
||||||
}
|
|
||||||
return_value = PyLong_FromLong((long)_return_value);
|
|
||||||
|
|
||||||
exit:
|
exit:
|
||||||
return return_value;
|
return return_value;
|
||||||
|
@ -4378,4 +4373,4 @@ _curses_has_extended_color_support(PyObject *module, PyObject *Py_UNUSED(ignored
|
||||||
#ifndef _CURSES_USE_DEFAULT_COLORS_METHODDEF
|
#ifndef _CURSES_USE_DEFAULT_COLORS_METHODDEF
|
||||||
#define _CURSES_USE_DEFAULT_COLORS_METHODDEF
|
#define _CURSES_USE_DEFAULT_COLORS_METHODDEF
|
||||||
#endif /* !defined(_CURSES_USE_DEFAULT_COLORS_METHODDEF) */
|
#endif /* !defined(_CURSES_USE_DEFAULT_COLORS_METHODDEF) */
|
||||||
/*[clinic end generated code: output=8745c1562b537fb4 input=a9049054013a1b77]*/
|
/*[clinic end generated code: output=39a35d730a47ea72 input=a9049054013a1b77]*/
|
||||||
|
|
Loading…
Reference in New Issue