diff --git a/Lib/test/test_curses.py b/Lib/test/test_curses.py index 514ed83167d..8bb6630284d 100644 --- a/Lib/test/test_curses.py +++ b/Lib/test/test_curses.py @@ -359,6 +359,9 @@ class TestCurses(unittest.TestCase): self.stdscr.getkey() @requires_curses_func('unget_wch') + # XXX Remove the decorator when ncurses on OpenBSD be updated + @unittest.skipIf(sys.platform.startswith("openbsd"), + "OpenBSD's curses (v.5.7) has bugs") def test_unget_wch(self): stdscr = self.stdscr encoding = stdscr.encoding diff --git a/Misc/NEWS.d/next/Library/2017-09-29-19-19-36.bpo-15037.ykimLK.rst b/Misc/NEWS.d/next/Library/2017-09-29-19-19-36.bpo-15037.ykimLK.rst new file mode 100644 index 00000000000..a1e90ac3739 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2017-09-29-19-19-36.bpo-15037.ykimLK.rst @@ -0,0 +1 @@ +Added a workaround for getkey() in curses for ncurses 5.7 and earlier. diff --git a/Modules/_cursesmodule.c b/Modules/_cursesmodule.c index 79629369669..1f6897a5701 100644 --- a/Modules/_cursesmodule.c +++ b/Modules/_cursesmodule.c @@ -1163,8 +1163,16 @@ PyCursesWindow_GetKey(PyCursesWindowObject *self, PyObject *args) if (!PyErr_Occurred()) PyErr_SetString(PyCursesError, "no input"); return NULL; - } else if (rtn<=255) { - return Py_BuildValue("C", rtn); + } else if (rtn <= 255) { +#ifdef NCURSES_VERSION_MAJOR +#if NCURSES_VERSION_MAJOR*100+NCURSES_VERSION_MINOR <= 507 + /* Work around a bug in ncurses 5.7 and earlier */ + if (rtn < 0) { + rtn += 256; + } +#endif +#endif + return PyUnicode_FromOrdinal(rtn); } else { const char *knp = keyname(rtn); return PyUnicode_FromString((knp == NULL) ? "" : knp);