summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2017-11-01 16:03:40 +0200
committerGitHub <noreply@github.com>2017-11-01 16:03:40 +0200
commit7e68790f3db75a893d5dd336e6201a63bc70212b (patch)
tree9b1e903a89d10dd46e60017332408da4f80e1871
parentd1e34031f68a3c7523a5376575c87cd0fea2425c (diff)
downloadcpython-git-7e68790f3db75a893d5dd336e6201a63bc70212b.tar.gz
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.
-rw-r--r--Lib/test/test_curses.py3
-rw-r--r--Misc/NEWS.d/next/Library/2017-09-29-19-19-36.bpo-15037.ykimLK.rst1
-rw-r--r--Modules/_cursesmodule.c12
3 files changed, 14 insertions, 2 deletions
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);