bpo-25720: Fix the method for checking pad state of curses WINDOW (#4164)

Modify the code to use ncurses is_pad() instead of checking WINDOW
_flags field.  If your platform does not provide the is_pad(), the
existing way that checks the field will be enabled.

Note: This change does not drop support for platforms where do not
have both WINDOW _flags field and is_pad().
This commit is contained in:
Masayuki Yamamoto 2017-11-01 21:05:26 +09:00 committed by Serhiy Storchaka
parent 280c22a82a
commit 8bc7d63560
6 changed files with 90 additions and 17 deletions

View file

@ -934,6 +934,12 @@ int py_mvwdelch(WINDOW *w, int y, int x)
}
#endif
#if defined(HAVE_CURSES_IS_PAD)
#define py_is_pad(win) is_pad(win)
#elif defined(WINDOW_HAS_FLAGS)
#define py_is_pad(win) ((win) ? ((win)->_flags & _ISPAD) != 0 : FALSE)
#endif
/* chgat, added by Fabian Kreutz <fabian.kreutz at gmx.net> */
static PyObject *
@ -1073,10 +1079,11 @@ PyCursesWindow_EchoChar(PyCursesWindowObject *self, PyObject *args)
if (!PyCurses_ConvertToChtype(self, temp, &ch))
return NULL;
#ifdef WINDOW_HAS_FLAGS
if (self->win->_flags & _ISPAD)
#ifdef py_is_pad
if (py_is_pad(self->win)) {
return PyCursesCheckERR(pechochar(self->win, ch | attr),
"echochar");
}
else
#endif
return PyCursesCheckERR(wechochar(self->win, ch | attr),
@ -1603,10 +1610,10 @@ PyCursesWindow_NoOutRefresh(PyCursesWindowObject *self, PyObject *args)
int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
int rtn;
#ifndef WINDOW_HAS_FLAGS
#ifndef py_is_pad
if (0)
#else
if (self->win->_flags & _ISPAD)
if (py_is_pad(self->win))
#endif
{
switch(PyTuple_Size(args)) {
@ -1766,10 +1773,10 @@ PyCursesWindow_Refresh(PyCursesWindowObject *self, PyObject *args)
int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
int rtn;
#ifndef WINDOW_HAS_FLAGS
#ifndef py_is_pad
if (0)
#else
if (self->win->_flags & _ISPAD)
if (py_is_pad(self->win))
#endif
{
switch(PyTuple_Size(args)) {
@ -1835,9 +1842,10 @@ PyCursesWindow_SubWin(PyCursesWindowObject *self, PyObject *args)
}
/* printf("Subwin: %i %i %i %i \n", nlines, ncols, begin_y, begin_x); */
#ifdef WINDOW_HAS_FLAGS
if (self->win->_flags & _ISPAD)
#ifdef py_is_pad
if (py_is_pad(self->win)) {
win = subpad(self->win, nlines, ncols, begin_y, begin_x);
}
else
#endif
win = subwin(self->win, nlines, ncols, begin_y, begin_x);