]> granicus.if.org Git - python/commitdiff
Issue #15785: Modify window.get_wch() API of the curses module: return a
authorVictor Stinner <victor.stinner@gmail.com>
Tue, 28 Aug 2012 23:40:57 +0000 (01:40 +0200)
committerVictor Stinner <victor.stinner@gmail.com>
Tue, 28 Aug 2012 23:40:57 +0000 (01:40 +0200)
character for most keys, and an integer for special keys, instead of always
returning an integer. So it is now possible to distinguish special keys like
keypad keys.

Doc/library/curses.rst
Lib/test/test_curses.py
Misc/NEWS
Modules/_cursesmodule.c

index ff3a7938d697aaed218d38946f1a3e9cc06fccd1..c4241483b5841d7d04ae7a55b3c90c2889531ee7 100644 (file)
@@ -869,8 +869,8 @@ the following methods and attributes:
 
 .. method:: window.get_wch([y, x])
 
-   Get a wide character. Like :meth:`getch`, but the integer returned is the
-   Unicode code point for the key pressed, so it can be passed to :func:`chr`.
+   Get a wide character. Return a character for most keys, or an integer for
+   function keys, keypad keys, and other special keys.
 
    .. versionadded:: 3.3
 
@@ -878,8 +878,9 @@ the following methods and attributes:
 .. method:: window.getkey([y, x])
 
    Get a character, returning a string instead of an integer, as :meth:`getch`
-   does. Function keys, keypad keys and so on return a multibyte string containing
-   the key name.  In no-delay mode, an exception is raised if there is no input.
+   does. Function keys, keypad keys and other special keys return a multibyte
+   string containing the key name.  In no-delay mode, an exception is raised if
+   there is no input.
 
 
 .. method:: window.getmaxyx()
index 21ac6089fc6c68d4776c746c897eaf5482864024..e959622c7332feef9e8ca5b8c553ce0cd8aef4f5 100644 (file)
@@ -267,8 +267,7 @@ def test_issue6243(stdscr):
 def test_unget_wch(stdscr):
     if not hasattr(curses, 'unget_wch'):
         return
-    import locale
-    encoding = locale.getpreferredencoding()
+    encoding = stdscr.encoding
     for ch in ('a', '\xe9', '\u20ac', '\U0010FFFF'):
         try:
             ch.encode(encoding)
@@ -277,18 +276,17 @@ def test_unget_wch(stdscr):
         try:
             curses.unget_wch(ch)
         except Exception as err:
-            raise Exception("unget_wch(%a) failed with locale encoding %s: %s"
-                            % (ch, encoding, err))
+            raise Exception("unget_wch(%a) failed with encoding %s: %s"
+                            % (ch, stdscr.encoding, err))
         read = stdscr.get_wch()
-        read = chr(read)
         if read != ch:
             raise AssertionError("%r != %r" % (read, ch))
 
         code = ord(ch)
         curses.unget_wch(code)
         read = stdscr.get_wch()
-        if read != code:
-            raise AssertionError("%r != %r" % (read, code))
+        if read != ch:
+            raise AssertionError("%r != %r" % (read, ch))
 
 def test_issue10570():
     b = curses.tparm(curses.tigetstr("cup"), 5, 3)
index 2d46263099db07c52de51b67ae50ae15f5a94577..5bae2486c6f2e14897edf9e930b5777f1e4df43c 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -48,6 +48,11 @@ Core and Builtins
 Library
 -------
 
+- Issue #15785: Modify window.get_wch() API of the curses module: return
+  a character for most keys, and an integer for special keys, instead of
+  always returning an integer. So it is now possible to distinguish special
+  keys like keypad keys.
+
 
 What's New in Python 3.3.0 Release Candidate 1?
 ===============================================
@@ -58,7 +63,7 @@ Core and Builtins
 -----------------
 
 - Issue #15573: memoryview comparisons are now performed by value with full
-  support for any valid struct module format definition.  
+  support for any valid struct module format definition.
 
 - Issue #15316: When an item in the fromlist for __import__ doesn't exist,
   don't raise an error, but if an exception is raised as part of an import do
index de45f5189cbefb1dbc96eed4176ebf4a4406e662..0436e7fec8ee6babcd5cb08452e907e4adda078e 100644 (file)
@@ -1203,7 +1203,10 @@ PyCursesWindow_Get_WCh(PyCursesWindowObject *self, PyObject *args)
         PyErr_SetString(PyCursesError, "no input");
         return NULL;
     }
-    return PyLong_FromLong(rtn);
+    if (ct == KEY_CODE_YES)
+        return PyLong_FromLong(rtn);
+    else
+        return PyUnicode_FromOrdinal(rtn);
 }
 #endif