Index: PCbuild/pcbuild.sln =================================================================== --- PCbuild/pcbuild.sln (revision 70260) +++ PCbuild/pcbuild.sln (working copy) @@ -1,5 +1,5 @@ Microsoft Visual Studio Solution File, Format Version 10.00 -# Visual Studio 2008 +# Visual C++ Express 2008 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "python", "python.vcproj", "{B11D750F-CD1F-4A96-85CE-E69A5C5259F9}" ProjectSection(ProjectDependencies) = postProject {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} @@ -132,6 +132,16 @@ EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "kill_python", "kill_python.vcproj", "{6DE10744-E396-40A5-B4E2-1B69AA7C8D31}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_curses", "_curses.vcproj", "{551D15AA-89FF-4096-B355-B91A52217D3E}" + ProjectSection(ProjectDependencies) = postProject + {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_curses_panel", "_curses_panel.vcproj", "{551D15AA-89FF-4096-B355-B91A52217D3F}" + ProjectSection(ProjectDependencies) = postProject + {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 @@ -552,6 +562,30 @@ {6DE10744-E396-40A5-B4E2-1B69AA7C8D31}.Release|Win32.Build.0 = Release|Win32 {6DE10744-E396-40A5-B4E2-1B69AA7C8D31}.Release|x64.ActiveCfg = Release|x64 {6DE10744-E396-40A5-B4E2-1B69AA7C8D31}.Release|x64.Build.0 = Release|x64 + {551D15AA-89FF-4096-B355-B91A52217D3E}.Debug|Win32.ActiveCfg = Debug|Win32 + {551D15AA-89FF-4096-B355-B91A52217D3E}.Debug|Win32.Build.0 = Debug|Win32 + {551D15AA-89FF-4096-B355-B91A52217D3E}.Debug|x64.ActiveCfg = Debug|Win32 + {551D15AA-89FF-4096-B355-B91A52217D3E}.PGInstrument|Win32.ActiveCfg = Release|Win32 + {551D15AA-89FF-4096-B355-B91A52217D3E}.PGInstrument|Win32.Build.0 = Release|Win32 + {551D15AA-89FF-4096-B355-B91A52217D3E}.PGInstrument|x64.ActiveCfg = Release|Win32 + {551D15AA-89FF-4096-B355-B91A52217D3E}.PGUpdate|Win32.ActiveCfg = Release|Win32 + {551D15AA-89FF-4096-B355-B91A52217D3E}.PGUpdate|Win32.Build.0 = Release|Win32 + {551D15AA-89FF-4096-B355-B91A52217D3E}.PGUpdate|x64.ActiveCfg = Release|Win32 + {551D15AA-89FF-4096-B355-B91A52217D3E}.Release|Win32.ActiveCfg = Release|Win32 + {551D15AA-89FF-4096-B355-B91A52217D3E}.Release|Win32.Build.0 = Release|Win32 + {551D15AA-89FF-4096-B355-B91A52217D3E}.Release|x64.ActiveCfg = Release|Win32 + {551D15AA-89FF-4096-B355-B91A52217D3F}.Debug|Win32.ActiveCfg = Debug|Win32 + {551D15AA-89FF-4096-B355-B91A52217D3F}.Debug|Win32.Build.0 = Debug|Win32 + {551D15AA-89FF-4096-B355-B91A52217D3F}.Debug|x64.ActiveCfg = Debug|Win32 + {551D15AA-89FF-4096-B355-B91A52217D3F}.PGInstrument|Win32.ActiveCfg = Release|Win32 + {551D15AA-89FF-4096-B355-B91A52217D3F}.PGInstrument|Win32.Build.0 = Release|Win32 + {551D15AA-89FF-4096-B355-B91A52217D3F}.PGInstrument|x64.ActiveCfg = Release|Win32 + {551D15AA-89FF-4096-B355-B91A52217D3F}.PGUpdate|Win32.ActiveCfg = Release|Win32 + {551D15AA-89FF-4096-B355-B91A52217D3F}.PGUpdate|Win32.Build.0 = Release|Win32 + {551D15AA-89FF-4096-B355-B91A52217D3F}.PGUpdate|x64.ActiveCfg = Release|Win32 + {551D15AA-89FF-4096-B355-B91A52217D3F}.Release|Win32.ActiveCfg = Release|Win32 + {551D15AA-89FF-4096-B355-B91A52217D3F}.Release|Win32.Build.0 = Release|Win32 + {551D15AA-89FF-4096-B355-B91A52217D3F}.Release|x64.ActiveCfg = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE Index: PCbuild/readme.txt =================================================================== --- PCbuild/readme.txt (revision 70260) +++ PCbuild/readme.txt (working copy) @@ -182,7 +182,21 @@ build_ssl.py/MSVC isn't clever enough to clean OpenSSL - you must do this by hand. +_curses and _curses_panel + Python wrapper for the pdcurses library. Homepage + http://pdcurses.sourceforge.net/ + Download the source from the pdcurses homepage and extract it into a + a directory named pdcurses in the directory above the Python sources + (..\..\pdcurses relative to the PCbuild directory). + + A pre-build event should compile the pdcurses sources for all + platforms and configurations. The pre-build event should also make + sure that the different platform and configuration combinations wind + up in different output directories, so you should be able to rebuild + without cleaning first (although incremental builds of pdcurses are + not possible). + The subprojects above wrap external projects Python doesn't control, and as such, a little more work is required in order to download the relevant source files for each project before they can be built. The buildbots do this each Index: Lib/test/regrtest.py =================================================================== --- Lib/test/regrtest.py (revision 70260) +++ Lib/test/regrtest.py (working copy) @@ -783,7 +783,6 @@ test_bsddb3 test_commands test_crypt - test_curses test_dbm test_dl test_fcntl Index: Lib/test/test_curses.py =================================================================== --- Lib/test/test_curses.py (revision 70260) +++ Lib/test/test_curses.py (working copy) @@ -21,7 +21,7 @@ # XXX: if newterm was supported we could use it instead of initscr and not exit term = os.environ.get('TERM') -if not term or term == 'unknown': +if sys.platform != 'win32' and (not term or term == 'unknown'): raise TestSkipped, "$TERM=%r, calling initscr() may cause exit" % term if sys.platform == "cygwin": @@ -165,9 +165,13 @@ curses.echo() ; curses.echo(1) f = tempfile.TemporaryFile() - stdscr.putwin(f) + if sys.platform == 'win32': + realf = f.file + else: + realf = f + stdscr.putwin(realf) f.seek(0) - curses.getwin(f) + curses.getwin(realf) f.close() curses.halfdelay(1) @@ -178,14 +182,16 @@ win = curses.newwin(5,5) win = curses.newwin(5,5, 1,1) curses.nl() ; curses.nl(1) - curses.putp('abc') + if sys.platform != 'win32': + curses.putp('abc') curses.qiflush() curses.raw() ; curses.raw(1) curses.setsyx(5,5) curses.tigetflag('hc') curses.tigetnum('co') curses.tigetstr('cr') - curses.tparm('cr') + if sys.platform != 'win32': + curses.tparm('cr') curses.typeahead(sys.__stdin__.fileno()) curses.unctrl('a') curses.ungetch('a') Index: Modules/_cursesmodule.c =================================================================== --- Modules/_cursesmodule.c (revision 70260) +++ Modules/_cursesmodule.c (working copy) @@ -115,14 +115,7 @@ #define CURSES_MODULE #include "py_curses.h" -/* These prototypes are in , but including this header - #defines many common symbols (such as "lines") which breaks the - curses module in other ways. So the code will just specify - explicit prototypes here. */ -extern int setupterm(char *,int,int *); -#ifdef __sgi #include -#endif #if !defined(HAVE_NCURSES_H) && (defined(sgi) || defined(__sun) || defined(SCO5)) #define STRICT_SYSV_CURSES /* Don't use ncurses extensions */ @@ -2007,7 +2000,9 @@ PyCurses_setupterm(PyObject* self, PyObject *args, PyObject* keywds) { int fd = -1; +#ifndef _WIN32 int err; +#endif char* termstr = NULL; static char *kwlist[] = {"term", "fd", NULL}; @@ -2036,6 +2031,7 @@ } } +#ifndef _WIN32 if (setupterm(termstr,fd,&err) == ERR) { char* s = "setupterm: unknown error"; @@ -2048,6 +2044,7 @@ PyErr_SetString(PyCursesError,s); return NULL; } +#endif initialised_setupterm = TRUE; @@ -2078,15 +2075,15 @@ static PyObject * PyCurses_Is_Term_Resized(PyObject *self, PyObject *args) { - int lines; - int columns; + int lines_; + int columns_; int result; PyCursesInitialised - if (!PyArg_ParseTuple(args,"ii:is_term_resized", &lines, &columns)) + if (!PyArg_ParseTuple(args,"ii:is_term_resized", &lines_, &columns_)) return NULL; - result = is_term_resized(lines, columns); + result = is_term_resized(lines_, columns_); if (result == TRUE) { Py_INCREF(Py_True); return Py_True; @@ -2370,16 +2367,16 @@ static PyObject * PyCurses_ResizeTerm(PyObject *self, PyObject *args) { - int lines; - int columns; + int lines_; + int columns_; PyObject *result; PyCursesInitialised - if (!PyArg_ParseTuple(args,"ii:resizeterm", &lines, &columns)) + if (!PyArg_ParseTuple(args,"ii:resizeterm", &lines_, &columns_)) return NULL; - result = PyCursesCheckERR(resizeterm(lines, columns), "resizeterm"); + result = PyCursesCheckERR(resizeterm(lines_, columns_), "resizeterm"); if (!result) return NULL; if (!update_lines_cols()) @@ -2393,17 +2390,17 @@ static PyObject * PyCurses_Resize_Term(PyObject *self, PyObject *args) { - int lines; - int columns; + int lines_; + int columns_; PyObject *result; PyCursesInitialised - if (!PyArg_ParseTuple(args,"ii:resize_term", &lines, &columns)) + if (!PyArg_ParseTuple(args,"ii:resize_term", &lines_, &columns_)) return NULL; - result = PyCursesCheckERR(resize_term(lines, columns), "resize_term"); + result = PyCursesCheckERR(resize_term(lines_, columns_), "resize_term"); if (!result) return NULL; if (!update_lines_cols())