bpo-36982: Add support for extended color functions in ncurses 6.1 (GH-17536)

Co-authored-by: Jeffrey Kintscher <websurfer@surf2c.net>
This commit is contained in:
Hans Petter Jansson 2020-08-03 22:51:33 -05:00 committed by GitHub
parent db6d9a50ce
commit da4e09fff6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 258 additions and 224 deletions

View file

@ -242,6 +242,15 @@ The module :mod:`curses` defines the following functions:
Return ``True`` if the terminal can display colors; otherwise, return ``False``. Return ``True`` if the terminal can display colors; otherwise, return ``False``.
.. function:: has_extended_color_support()
Return ``True`` if the module supports extended colors; otherwise, return
``False``. Extended color support allows more than 256 color pairs for
terminals that support more than 16 colors (e.g. xterm-256color).
Extended color support requires ncurses version 6.1 or later.
.. versionadded:: 3.10
.. function:: has_ic() .. function:: has_ic()

View file

@ -103,6 +103,16 @@ New Modules
Improved Modules Improved Modules
================ ================
curses
------
The extended color functions added in ncurses 6.1 will be used transparently
by :func:`curses.color_content`, :func:`curses.init_color`,
:func:`curses.init_pair`, and :func:`curses.pair_content`. A new function,
:func:`curses.has_extended_color_support`, indicates whether extended color
support is provided by the underlying ncurses library.
(Contributed by Jeffrey Kintscher and Hans Petter Jansson in :issue:`36982`.)
glob glob
---- ----

View file

@ -232,7 +232,8 @@ class TestCurses(unittest.TestCase):
curses.nocbreak, curses.noecho, curses.nonl, curses.nocbreak, curses.noecho, curses.nonl,
curses.noqiflush, curses.noraw, curses.noqiflush, curses.noraw,
curses.reset_prog_mode, curses.termattrs, curses.reset_prog_mode, curses.termattrs,
curses.termname, curses.erasechar]: curses.termname, curses.erasechar,
curses.has_extended_color_support]:
with self.subTest(func=func.__qualname__): with self.subTest(func=func.__qualname__):
func() func()
if hasattr(curses, 'filter'): if hasattr(curses, 'filter'):
@ -293,6 +294,19 @@ class TestCurses(unittest.TestCase):
if hasattr(curses, 'use_default_colors'): if hasattr(curses, 'use_default_colors'):
curses.use_default_colors() curses.use_default_colors()
self.assertRaises(ValueError, curses.color_content, -1)
self.assertRaises(ValueError, curses.color_content, curses.COLORS + 1)
self.assertRaises(ValueError, curses.color_content, -2**31 - 1)
self.assertRaises(ValueError, curses.color_content, 2**31)
self.assertRaises(ValueError, curses.color_content, -2**63 - 1)
self.assertRaises(ValueError, curses.color_content, 2**63 - 1)
self.assertRaises(ValueError, curses.pair_content, -1)
self.assertRaises(ValueError, curses.pair_content, curses.COLOR_PAIRS)
self.assertRaises(ValueError, curses.pair_content, -2**31 - 1)
self.assertRaises(ValueError, curses.pair_content, 2**31)
self.assertRaises(ValueError, curses.pair_content, -2**63 - 1)
self.assertRaises(ValueError, curses.pair_content, 2**63 - 1)
@requires_curses_func('keyname') @requires_curses_func('keyname')
def test_keyname(self): def test_keyname(self):
curses.keyname(13) curses.keyname(13)

View file

@ -798,6 +798,7 @@ Geert Jansen
Jack Jansen Jack Jansen
Hans-Peter Jansen Hans-Peter Jansen
Bill Janssen Bill Janssen
Hans Petter Jansson
Jon Janzen Jon Janzen
Thomas Jarosch Thomas Jarosch
Juhana Jauhiainen Juhana Jauhiainen
@ -882,6 +883,7 @@ Sam Kimbrel
Tomohiko Kinebuchi Tomohiko Kinebuchi
James King James King
W. Trevor King W. Trevor King
Jeffrey Kintscher
Paul Kippes Paul Kippes
Steve Kirsch Steve Kirsch
Sebastian Kirsche Sebastian Kirsche

View file

@ -0,0 +1 @@
Use ncurses extended color functions when available to support terminals with 256 colors, and add the new function :func:`curses.has_extended_color_support` to indicate whether extended color support is provided by the underlying ncurses library.

View file

@ -134,6 +134,31 @@ typedef chtype attr_t; /* No attr_t type is available */
#define STRICT_SYSV_CURSES #define STRICT_SYSV_CURSES
#endif #endif
#if defined(NCURSES_EXT_COLORS) && defined(NCURSES_EXT_FUNCS)
#define _NCURSES_EXTENDED_COLOR_FUNCS 1
#else
#define _NCURSES_EXTENDED_COLOR_FUNCS 0
#endif /* defined(NCURSES_EXT_COLORS) && defined(NCURSES_EXT_FUNCS) */
#if _NCURSES_EXTENDED_COLOR_FUNCS
#define _NCURSES_COLOR_VAL_TYPE int
#define _CURSES_INIT_COLOR_FUNC init_extended_color
#define _CURSES_INIT_PAIR_FUNC init_extended_pair
#define _COLOR_CONTENT_FUNC extended_color_content
#define _CURSES_PAIR_NUMBER_FUNC extended_pair_content
#else
#define _NCURSES_COLOR_VAL_TYPE short
#define _CURSES_INIT_COLOR_FUNC init_color
#define _CURSES_INIT_PAIR_FUNC init_pair
#define _COLOR_CONTENT_FUNC color_content
#define _CURSES_PAIR_NUMBER_FUNC pair_content
#endif /* _NCURSES_EXTENDED_COLOR_FUNCS */
#define _CURSES_FUNC_NAME_STR(s) #s
#define _CURSES_INIT_COLOR_FUNC_NAME _CURSES_FUNC_NAME_STR(_CURSES_INIT_COLOR_FUNC)
#define _CURSES_INIT_PAIR_FUNC_NAME _CURSES_FUNC_NAME_STR(_CURSES_INIT_PAIR_FUNC)
/*[clinic input] /*[clinic input]
module _curses module _curses
class _curses.window "PyCursesWindowObject *" "&PyCursesWindow_Type" class _curses.window "PyCursesWindowObject *" "&PyCursesWindow_Type"
@ -387,6 +412,104 @@ PyCurses_ConvertToString(PyCursesWindowObject *win, PyObject *obj,
return 0; return 0;
} }
static int
color_converter(PyObject *arg, void *ptr)
{
long color_number;
int overflow;
color_number = PyLong_AsLongAndOverflow(arg, &overflow);
if (color_number == -1 && PyErr_Occurred())
return 0;
if (overflow > 0 || color_number > COLORS) {
PyErr_Format(PyExc_ValueError,
"Color number is greater than COLORS (%d).",
COLORS);
return 0;
}
else if (overflow < 0 || color_number < 0) {
PyErr_SetString(PyExc_ValueError,
"Color number is less than 0.");
return 0;
}
*(int *)ptr = (int)color_number;
return 1;
}
/*[python input]
class color_converter(CConverter):
type = 'int'
converter = 'color_converter'
[python start generated code]*/
/*[python end generated code: output=da39a3ee5e6b4b0d input=4260d2b6e66b3709]*/
static int
pair_converter(PyObject *arg, void *ptr)
{
long pair_number;
int overflow;
pair_number = PyLong_AsLongAndOverflow(arg, &overflow);
if (pair_number == -1 && PyErr_Occurred())
return 0;
if (overflow > 0 || pair_number > COLOR_PAIRS - 1) {
PyErr_Format(PyExc_ValueError,
"Color pair is greater than COLOR_PAIRS-1 (%d).",
COLOR_PAIRS - 1);
return 0;
}
else if (overflow < 0 || pair_number < 1) {
PyErr_SetString(PyExc_ValueError,
"Color pair is less than 1.");
return 0;
}
*(int *)ptr = (int)pair_number;
return 1;
}
/*[python input]
class pair_converter(CConverter):
type = 'int'
converter = 'pair_converter'
[python start generated code]*/
/*[python end generated code: output=da39a3ee5e6b4b0d input=1a918ae6a1b32af7]*/
static int
component_converter(PyObject *arg, void *ptr)
{
long component;
int overflow;
component = PyLong_AsLongAndOverflow(arg, &overflow);
if (component == -1 && PyErr_Occurred())
return 0;
if (overflow > 0 || component > 1000) {
PyErr_SetString(PyExc_ValueError,
"Color component is greater than 1000");
return 0;
}
else if (overflow < 0 || component < 0) {
PyErr_SetString(PyExc_ValueError,
"Color component is less than 0");
return 0;
}
*(short *)ptr = (short)component;
return 1;
}
/*[python input]
class component_converter(CConverter):
type = 'short'
converter = 'component_converter'
[python start generated code]*/
/*[python end generated code: output=da39a3ee5e6b4b0d input=38e9be01d33927fb]*/
/* Function versions of the 3 functions for testing whether curses has been /* Function versions of the 3 functions for testing whether curses has been
initialised or not. */ initialised or not. */
@ -2585,7 +2708,7 @@ NoArgOrFlagNoReturnFunctionBody(cbreak, flag)
/*[clinic input] /*[clinic input]
_curses.color_content _curses.color_content
color_number: short color_number: color
The number of the color (0 - COLORS). The number of the color (0 - COLORS).
/ /
@ -2596,15 +2719,15 @@ which will be between 0 (no component) and 1000 (maximum amount of component).
[clinic start generated code]*/ [clinic start generated code]*/
static PyObject * static PyObject *
_curses_color_content_impl(PyObject *module, short color_number) _curses_color_content_impl(PyObject *module, int color_number)
/*[clinic end generated code: output=cb15cf3120d4bfc1 input=5555abb1c11e11b7]*/ /*[clinic end generated code: output=17b466df7054e0de input=c10ef58f694b13ee]*/
{ {
short r,g,b; _NCURSES_COLOR_VAL_TYPE r,g,b;
PyCursesInitialised; PyCursesInitialised;
PyCursesInitialisedColor; PyCursesInitialisedColor;
if (color_content(color_number, &r, &g, &b) != ERR) if (_COLOR_CONTENT_FUNC(color_number, &r, &g, &b) != ERR)
return Py_BuildValue("(iii)", r, g, b); return Py_BuildValue("(iii)", r, g, b);
else { else {
PyErr_SetString(PyCursesError, PyErr_SetString(PyCursesError,
@ -2616,7 +2739,7 @@ _curses_color_content_impl(PyObject *module, short color_number)
/*[clinic input] /*[clinic input]
_curses.color_pair _curses.color_pair
color_number: short color_number: color
The number of the color (0 - COLORS). The number of the color (0 - COLORS).
/ /
@ -2627,8 +2750,8 @@ other A_* attributes. pair_number() is the counterpart to this function.
[clinic start generated code]*/ [clinic start generated code]*/
static PyObject * static PyObject *
_curses_color_pair_impl(PyObject *module, short color_number) _curses_color_pair_impl(PyObject *module, int color_number)
/*[clinic end generated code: output=6a84cb6b29ecaf9a input=a9d3eb6f50e4dc12]*/ /*[clinic end generated code: output=3fd752e8e24c93fb input=b049033819ab4ef5]*/
{ {
PyCursesInitialised; PyCursesInitialised;
PyCursesInitialisedColor; PyCursesInitialisedColor;
@ -3027,13 +3150,13 @@ _curses_has_key_impl(PyObject *module, int key)
/*[clinic input] /*[clinic input]
_curses.init_color _curses.init_color
color_number: short color_number: color
The number of the color to be changed (0 - COLORS). The number of the color to be changed (0 - COLORS).
r: short r: component
Red component (0 - 1000). Red component (0 - 1000).
g: short g: component
Green component (0 - 1000). Green component (0 - 1000).
b: short b: component
Blue component (0 - 1000). Blue component (0 - 1000).
/ /
@ -3045,24 +3168,24 @@ most terminals; it is active only if can_change_color() returns 1.
[clinic start generated code]*/ [clinic start generated code]*/
static PyObject * static PyObject *
_curses_init_color_impl(PyObject *module, short color_number, short r, _curses_init_color_impl(PyObject *module, int color_number, short r, short g,
short g, short b) short b)
/*[clinic end generated code: output=280236f5efe9776a input=f3a05bd38f619175]*/ /*[clinic end generated code: output=d7ed71b2d818cdf2 input=8a2fe94ca9204aa5]*/
{ {
PyCursesInitialised; PyCursesInitialised;
PyCursesInitialisedColor; PyCursesInitialisedColor;
return PyCursesCheckERR(init_color(color_number, r, g, b), "init_color"); return PyCursesCheckERR(_CURSES_INIT_COLOR_FUNC(color_number, r, g, b), _CURSES_INIT_COLOR_FUNC_NAME);
} }
/*[clinic input] /*[clinic input]
_curses.init_pair _curses.init_pair
pair_number: short pair_number: pair
The number of the color-pair to be changed (1 - (COLOR_PAIRS-1)). The number of the color-pair to be changed (1 - (COLOR_PAIRS-1)).
fg: short fg: color
Foreground color number (0 - COLORS). Foreground color number (0 - COLORS).
bg: short bg: color
Background color number (0 - COLORS). Background color number (0 - COLORS).
/ /
@ -3073,14 +3196,13 @@ all occurrences of that color-pair are changed to the new definition.
[clinic start generated code]*/ [clinic start generated code]*/
static PyObject * static PyObject *
_curses_init_pair_impl(PyObject *module, short pair_number, short fg, _curses_init_pair_impl(PyObject *module, int pair_number, int fg, int bg)
short bg) /*[clinic end generated code: output=a0bba03d2bbc3ee6 input=b865583a18061c1f]*/
/*[clinic end generated code: output=9c2ce39c22f376b6 input=c9f0b11b17a2ac6d]*/
{ {
PyCursesInitialised; PyCursesInitialised;
PyCursesInitialisedColor; PyCursesInitialisedColor;
return PyCursesCheckERR(init_pair(pair_number, fg, bg), "init_pair"); return PyCursesCheckERR(_CURSES_INIT_PAIR_FUNC(pair_number, fg, bg), _CURSES_INIT_PAIR_FUNC_NAME);
} }
static PyObject *ModDict; static PyObject *ModDict;
@ -3697,7 +3819,7 @@ NoArgNoReturnFunctionBody(noraw)
/*[clinic input] /*[clinic input]
_curses.pair_content _curses.pair_content
pair_number: short pair_number: pair
The number of the color pair (1 - (COLOR_PAIRS-1)). The number of the color pair (1 - (COLOR_PAIRS-1)).
/ /
@ -3705,15 +3827,15 @@ Return a tuple (fg, bg) containing the colors for the requested color pair.
[clinic start generated code]*/ [clinic start generated code]*/
static PyObject * static PyObject *
_curses_pair_content_impl(PyObject *module, short pair_number) _curses_pair_content_impl(PyObject *module, int pair_number)
/*[clinic end generated code: output=5a72aa1a28bbacf3 input=f4d7fec5643b976b]*/ /*[clinic end generated code: output=4a726dd0e6885f3f input=b42eacf8a4103852]*/
{ {
short f, b; _NCURSES_COLOR_VAL_TYPE f, b;
PyCursesInitialised; PyCursesInitialised;
PyCursesInitialisedColor; PyCursesInitialisedColor;
if (pair_content(pair_number, &f, &b)==ERR) { if (_CURSES_PAIR_NUMBER_FUNC(pair_number, &f, &b)==ERR) {
PyErr_SetString(PyCursesError, PyErr_SetString(PyCursesError,
"Argument 1 was out of range. (1..COLOR_PAIRS-1)"); "Argument 1 was out of range. (1..COLOR_PAIRS-1)");
return NULL; return NULL;
@ -4450,6 +4572,21 @@ make_ncurses_version(void)
#endif /* NCURSES_VERSION */ #endif /* NCURSES_VERSION */
/*[clinic input]
_curses.has_extended_color_support
Return True if the module supports extended colors; otherwise, return False.
Extended color support allows more than 256 color-pairs for terminals
that support more than 16 colors (e.g. xterm-256color).
[clinic start generated code]*/
static PyObject *
_curses_has_extended_color_support_impl(PyObject *module)
/*[clinic end generated code: output=68f1be2b57d92e22 input=4b905f046e35ee9f]*/
{
return PyBool_FromLong(_NCURSES_EXTENDED_COLOR_FUNCS);
}
/* List of functions defined in the module */ /* List of functions defined in the module */
@ -4476,6 +4613,7 @@ static PyMethodDef PyCurses_methods[] = {
_CURSES_GETSYX_METHODDEF _CURSES_GETSYX_METHODDEF
_CURSES_GETWIN_METHODDEF _CURSES_GETWIN_METHODDEF
_CURSES_HAS_COLORS_METHODDEF _CURSES_HAS_COLORS_METHODDEF
_CURSES_HAS_EXTENDED_COLOR_SUPPORT_METHODDEF
_CURSES_HAS_IC_METHODDEF _CURSES_HAS_IC_METHODDEF
_CURSES_HAS_IL_METHODDEF _CURSES_HAS_IL_METHODDEF
_CURSES_HAS_KEY_METHODDEF _CURSES_HAS_KEY_METHODDEF

View file

@ -1967,33 +1967,17 @@ PyDoc_STRVAR(_curses_color_content__doc__,
{"color_content", (PyCFunction)_curses_color_content, METH_O, _curses_color_content__doc__}, {"color_content", (PyCFunction)_curses_color_content, METH_O, _curses_color_content__doc__},
static PyObject * static PyObject *
_curses_color_content_impl(PyObject *module, short color_number); _curses_color_content_impl(PyObject *module, int color_number);
static PyObject * static PyObject *
_curses_color_content(PyObject *module, PyObject *arg) _curses_color_content(PyObject *module, PyObject *arg)
{ {
PyObject *return_value = NULL; PyObject *return_value = NULL;
short color_number; int color_number;
{ if (!color_converter(arg, &color_number)) {
long ival = PyLong_AsLong(arg);
if (ival == -1 && PyErr_Occurred()) {
goto exit; goto exit;
} }
else if (ival < SHRT_MIN) {
PyErr_SetString(PyExc_OverflowError,
"signed short integer is less than minimum");
goto exit;
}
else if (ival > SHRT_MAX) {
PyErr_SetString(PyExc_OverflowError,
"signed short integer is greater than maximum");
goto exit;
}
else {
color_number = (short) ival;
}
}
return_value = _curses_color_content_impl(module, color_number); return_value = _curses_color_content_impl(module, color_number);
exit: exit:
@ -2016,33 +2000,17 @@ PyDoc_STRVAR(_curses_color_pair__doc__,
{"color_pair", (PyCFunction)_curses_color_pair, METH_O, _curses_color_pair__doc__}, {"color_pair", (PyCFunction)_curses_color_pair, METH_O, _curses_color_pair__doc__},
static PyObject * static PyObject *
_curses_color_pair_impl(PyObject *module, short color_number); _curses_color_pair_impl(PyObject *module, int color_number);
static PyObject * static PyObject *
_curses_color_pair(PyObject *module, PyObject *arg) _curses_color_pair(PyObject *module, PyObject *arg)
{ {
PyObject *return_value = NULL; PyObject *return_value = NULL;
short color_number; int color_number;
{ if (!color_converter(arg, &color_number)) {
long ival = PyLong_AsLong(arg);
if (ival == -1 && PyErr_Occurred()) {
goto exit; goto exit;
} }
else if (ival < SHRT_MIN) {
PyErr_SetString(PyExc_OverflowError,
"signed short integer is less than minimum");
goto exit;
}
else if (ival > SHRT_MAX) {
PyErr_SetString(PyExc_OverflowError,
"signed short integer is greater than maximum");
goto exit;
}
else {
color_number = (short) ival;
}
}
return_value = _curses_color_pair_impl(module, color_number); return_value = _curses_color_pair_impl(module, color_number);
exit: exit:
@ -2590,14 +2558,14 @@ PyDoc_STRVAR(_curses_init_color__doc__,
{"init_color", (PyCFunction)(void(*)(void))_curses_init_color, METH_FASTCALL, _curses_init_color__doc__}, {"init_color", (PyCFunction)(void(*)(void))_curses_init_color, METH_FASTCALL, _curses_init_color__doc__},
static PyObject * static PyObject *
_curses_init_color_impl(PyObject *module, short color_number, short r, _curses_init_color_impl(PyObject *module, int color_number, short r, short g,
short g, short b); short b);
static PyObject * static PyObject *
_curses_init_color(PyObject *module, PyObject *const *args, Py_ssize_t nargs) _curses_init_color(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
{ {
PyObject *return_value = NULL; PyObject *return_value = NULL;
short color_number; int color_number;
short r; short r;
short g; short g;
short b; short b;
@ -2605,82 +2573,18 @@ _curses_init_color(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
if (!_PyArg_CheckPositional("init_color", nargs, 4, 4)) { if (!_PyArg_CheckPositional("init_color", nargs, 4, 4)) {
goto exit; goto exit;
} }
{ if (!color_converter(args[0], &color_number)) {
long ival = PyLong_AsLong(args[0]);
if (ival == -1 && PyErr_Occurred()) {
goto exit; goto exit;
} }
else if (ival < SHRT_MIN) { if (!component_converter(args[1], &r)) {
PyErr_SetString(PyExc_OverflowError,
"signed short integer is less than minimum");
goto exit; goto exit;
} }
else if (ival > SHRT_MAX) { if (!component_converter(args[2], &g)) {
PyErr_SetString(PyExc_OverflowError,
"signed short integer is greater than maximum");
goto exit; goto exit;
} }
else { if (!component_converter(args[3], &b)) {
color_number = (short) ival;
}
}
{
long ival = PyLong_AsLong(args[1]);
if (ival == -1 && PyErr_Occurred()) {
goto exit; goto exit;
} }
else if (ival < SHRT_MIN) {
PyErr_SetString(PyExc_OverflowError,
"signed short integer is less than minimum");
goto exit;
}
else if (ival > SHRT_MAX) {
PyErr_SetString(PyExc_OverflowError,
"signed short integer is greater than maximum");
goto exit;
}
else {
r = (short) ival;
}
}
{
long ival = PyLong_AsLong(args[2]);
if (ival == -1 && PyErr_Occurred()) {
goto exit;
}
else if (ival < SHRT_MIN) {
PyErr_SetString(PyExc_OverflowError,
"signed short integer is less than minimum");
goto exit;
}
else if (ival > SHRT_MAX) {
PyErr_SetString(PyExc_OverflowError,
"signed short integer is greater than maximum");
goto exit;
}
else {
g = (short) ival;
}
}
{
long ival = PyLong_AsLong(args[3]);
if (ival == -1 && PyErr_Occurred()) {
goto exit;
}
else if (ival < SHRT_MIN) {
PyErr_SetString(PyExc_OverflowError,
"signed short integer is less than minimum");
goto exit;
}
else if (ival > SHRT_MAX) {
PyErr_SetString(PyExc_OverflowError,
"signed short integer is greater than maximum");
goto exit;
}
else {
b = (short) ival;
}
}
return_value = _curses_init_color_impl(module, color_number, r, g, b); return_value = _curses_init_color_impl(module, color_number, r, g, b);
exit: exit:
@ -2707,77 +2611,28 @@ PyDoc_STRVAR(_curses_init_pair__doc__,
{"init_pair", (PyCFunction)(void(*)(void))_curses_init_pair, METH_FASTCALL, _curses_init_pair__doc__}, {"init_pair", (PyCFunction)(void(*)(void))_curses_init_pair, METH_FASTCALL, _curses_init_pair__doc__},
static PyObject * static PyObject *
_curses_init_pair_impl(PyObject *module, short pair_number, short fg, _curses_init_pair_impl(PyObject *module, int pair_number, int fg, int bg);
short bg);
static PyObject * static PyObject *
_curses_init_pair(PyObject *module, PyObject *const *args, Py_ssize_t nargs) _curses_init_pair(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
{ {
PyObject *return_value = NULL; PyObject *return_value = NULL;
short pair_number; int pair_number;
short fg; int fg;
short bg; int bg;
if (!_PyArg_CheckPositional("init_pair", nargs, 3, 3)) { if (!_PyArg_CheckPositional("init_pair", nargs, 3, 3)) {
goto exit; goto exit;
} }
{ if (!pair_converter(args[0], &pair_number)) {
long ival = PyLong_AsLong(args[0]);
if (ival == -1 && PyErr_Occurred()) {
goto exit; goto exit;
} }
else if (ival < SHRT_MIN) { if (!color_converter(args[1], &fg)) {
PyErr_SetString(PyExc_OverflowError,
"signed short integer is less than minimum");
goto exit; goto exit;
} }
else if (ival > SHRT_MAX) { if (!color_converter(args[2], &bg)) {
PyErr_SetString(PyExc_OverflowError,
"signed short integer is greater than maximum");
goto exit; goto exit;
} }
else {
pair_number = (short) ival;
}
}
{
long ival = PyLong_AsLong(args[1]);
if (ival == -1 && PyErr_Occurred()) {
goto exit;
}
else if (ival < SHRT_MIN) {
PyErr_SetString(PyExc_OverflowError,
"signed short integer is less than minimum");
goto exit;
}
else if (ival > SHRT_MAX) {
PyErr_SetString(PyExc_OverflowError,
"signed short integer is greater than maximum");
goto exit;
}
else {
fg = (short) ival;
}
}
{
long ival = PyLong_AsLong(args[2]);
if (ival == -1 && PyErr_Occurred()) {
goto exit;
}
else if (ival < SHRT_MIN) {
PyErr_SetString(PyExc_OverflowError,
"signed short integer is less than minimum");
goto exit;
}
else if (ival > SHRT_MAX) {
PyErr_SetString(PyExc_OverflowError,
"signed short integer is greater than maximum");
goto exit;
}
else {
bg = (short) ival;
}
}
return_value = _curses_init_pair_impl(module, pair_number, fg, bg); return_value = _curses_init_pair_impl(module, pair_number, fg, bg);
exit: exit:
@ -3554,33 +3409,17 @@ PyDoc_STRVAR(_curses_pair_content__doc__,
{"pair_content", (PyCFunction)_curses_pair_content, METH_O, _curses_pair_content__doc__}, {"pair_content", (PyCFunction)_curses_pair_content, METH_O, _curses_pair_content__doc__},
static PyObject * static PyObject *
_curses_pair_content_impl(PyObject *module, short pair_number); _curses_pair_content_impl(PyObject *module, int pair_number);
static PyObject * static PyObject *
_curses_pair_content(PyObject *module, PyObject *arg) _curses_pair_content(PyObject *module, PyObject *arg)
{ {
PyObject *return_value = NULL; PyObject *return_value = NULL;
short pair_number; int pair_number;
{ if (!pair_converter(arg, &pair_number)) {
long ival = PyLong_AsLong(arg);
if (ival == -1 && PyErr_Occurred()) {
goto exit; goto exit;
} }
else if (ival < SHRT_MIN) {
PyErr_SetString(PyExc_OverflowError,
"signed short integer is less than minimum");
goto exit;
}
else if (ival > SHRT_MAX) {
PyErr_SetString(PyExc_OverflowError,
"signed short integer is greater than maximum");
goto exit;
}
else {
pair_number = (short) ival;
}
}
return_value = _curses_pair_content_impl(module, pair_number); return_value = _curses_pair_content_impl(module, pair_number);
exit: exit:
@ -4337,6 +4176,27 @@ _curses_use_default_colors(PyObject *module, PyObject *Py_UNUSED(ignored))
#endif /* !defined(STRICT_SYSV_CURSES) */ #endif /* !defined(STRICT_SYSV_CURSES) */
PyDoc_STRVAR(_curses_has_extended_color_support__doc__,
"has_extended_color_support($module, /)\n"
"--\n"
"\n"
"Return True if the module supports extended colors; otherwise, return False.\n"
"\n"
"Extended color support allows more than 256 color-pairs for terminals\n"
"that support more than 16 colors (e.g. xterm-256color).");
#define _CURSES_HAS_EXTENDED_COLOR_SUPPORT_METHODDEF \
{"has_extended_color_support", (PyCFunction)_curses_has_extended_color_support, METH_NOARGS, _curses_has_extended_color_support__doc__},
static PyObject *
_curses_has_extended_color_support_impl(PyObject *module);
static PyObject *
_curses_has_extended_color_support(PyObject *module, PyObject *Py_UNUSED(ignored))
{
return _curses_has_extended_color_support_impl(module);
}
#ifndef _CURSES_WINDOW_ENCLOSE_METHODDEF #ifndef _CURSES_WINDOW_ENCLOSE_METHODDEF
#define _CURSES_WINDOW_ENCLOSE_METHODDEF #define _CURSES_WINDOW_ENCLOSE_METHODDEF
#endif /* !defined(_CURSES_WINDOW_ENCLOSE_METHODDEF) */ #endif /* !defined(_CURSES_WINDOW_ENCLOSE_METHODDEF) */
@ -4428,4 +4288,4 @@ _curses_use_default_colors(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=478d93f7692385eb input=a9049054013a1b77]*/ /*[clinic end generated code: output=38b2531d17f119e1 input=a9049054013a1b77]*/