From 7e68790f3db75a893d5dd336e6201a63bc70212b Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Wed, 1 Nov 2017 16:03:40 +0200 Subject: [PATCH] bpo-15037: Add a workaround for getkey() in curses for ncurses 5.7 and earlier. (#3826) Skip a test for unget_wch()/get_wch() on OpenBSD since they are broken in ncurses 5.7. --- Lib/test/test_curses.py | 3 +++ .../Library/2017-09-29-19-19-36.bpo-15037.ykimLK.rst | 1 + Modules/_cursesmodule.c | 12 ++++++++++-- 3 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2017-09-29-19-19-36.bpo-15037.ykimLK.rst diff --git a/Lib/test/test_curses.py b/Lib/test/test_curses.py index 514ed83167..8bb6630284 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 0000000000..a1e90ac373 --- /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 7962936966..1f6897a570 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); -- 2.40.0