[Python-Dev] Adding support to curses library

Heracles steve at integrityintegrators.net
Wed Feb 25 15:24:51 CET 2009


Ulrich,

Thanks for the input.  That is helpful to know.

H


Ulrich Berning-2 wrote:
> 
> Heracles wrote:
> 
>>Hello,
>>
>>I am working on a patch to add to the _cursesmodule.c file of the Python
>>core libraries.  I figured I would take on one of the implemented
functions
>>to try to get my feet wet contributing to the project.  At any rate, I
have
>>the following function defined in the 2.7.a version updated from SVN this
>>morning:
>>
>>------------- Snippet ---------------------------
>>// Insert new method color_set Steve Owens 2/24/2009
>>//   The curses library color_set function has the following signature:
>>//       int color_set(short color_pair_number, void* opts); 
>>static PyObject *
>>PyCurses_color_set(PyObject *self, PyObject *args)
>>{
>>   short color_pair_number;
>>   void * opts;
>>   int erg;
>>
>>   // These macros ought to be documented in the API docs
>>   // but they aren't yet.
>>   PyCursesInitialised
>>   PyCursesInitialisedColor
>>
>>   // Per ncurses Man Page: 
>>   //   The routine color_set sets the current color of the given window
>> to
>>   // the foreground/background combination described by the
>>color_pair_number. 
>>   // The parameter opts is reserved for future use, applications must
>>supply a 
>>   // null pointer. 
>>   switch(PyTuple_Size(args))
>>   {
>>   case 1:
>>	   // Dont make them pass a useless null pointer.
>>	   if (!PyArg_ParseTuple(args, "h", &color_pair_number)) return NULL;
>>	   break;
>>   case 2:
>>	   // Allow them to pass the opts pointer so that when ncurses is later
>>updated.
>>	   // This method will still work.
>>	   if (!PyArg_ParseTuple(args, "hO&", &color_pair_number, &opts)) return
>>NULL;	
>>	   break;
>>   default:
>>      PyErr_SetString(PyExc_TypeError, "color_set requires 1 or 2
>> arguments
>>(color_pair_number[, opts]?)");
>>	  return NULL;
>>   }
>>
>>   erg = color_set(color_pair_number, opts); // Debating on forcing null
>>here.
>>   
>>   if (erg == ERR) 
>>	  return PyCursesCheckERR(erg, "color_set");
>>   else
>>      PyInt_FromLong((long) 1L); 
>>}
>>-------------End  Snippet ---------------------------
>>
>>I also have the following added in (see last line of the snippet):
>>
>>------------- Snippet ---------------------------
>>static PyMethodDef PyCurses_methods[] = {
>>  {"baudrate",            (PyCFunction)PyCurses_baudrate, METH_NOARGS},
>>  {"beep",                (PyCFunction)PyCurses_beep, METH_NOARGS},
>>  {"can_change_color",    (PyCFunction)PyCurses_can_change_color,
>>METH_NOARGS},
>>  {"cbreak",              (PyCFunction)PyCurses_cbreak, METH_VARARGS},
>>  {"color_content",       (PyCFunction)PyCurses_Color_Content,
>>METH_VARARGS},
>>  {"color_pair",          (PyCFunction)PyCurses_color_pair, METH_VARARGS},
>>  {"color_set",           (PyCFunction)PyCurses_color_set, METH_VARARGS},
>>-------------End  Snippet ---------------------------
>>
>>The code compiles and installs fine, but when I run the following unit
test,
>>I get a segmentation fault:
>>
>>------------- Snippet ---------------------------
>>import unittest, curses
>>from test import test_support
>>
>>def testCursesColorSet(stdscrn):
>>   curses.init_pair(1, curses.COLOR_RED, curses.COLOR_WHITE)
>>   curses.init_pair(2, curses.COLOR_WHITE, curses.COLOR_BLUE);
>>   i = curses.color_set(1, NULL);
>>   stdscrn.addstr("RED/BLACK (%0)\n".format(i))
>>   i = curses.color_set(2, NULL);
>>   stdscrn.print("WHITE/BLUE (%0)\n".format(i))
>>   i = curses.color_set(0, NULL);
>>   stdscrn.print("Default (%0)\n".format(i))
>>
>>
>>def test_main(stdscrn):
>>   curses.savetty()
>>   if curses.has_color():
>>      testCursesColorSet(stdscrn)
>>   else
>>      stdscr.addstr( "Test Aborted: Color not supported on this
>> terminal.")
>>
>>
>>if __name__ == '__main__':
>>    curses.wrapper(test_main)
>>-------------End  Snippet ---------------------------
>>
>>It turns out that by commenting out this line in the _cursesmodule.c code,
>>allows the unit test to run 
>>obviously reporting the error as expected:
>>
>>------------- Snippet ---------------------------
>>//erg = color_set(color_pair_number, opts); // Debating on forcing null
>>here.
>>-------------End  Snippet ---------------------------
>>
>>At any rate I am stuck.  I am still trying to build just a plain C file
>>which will test the color_set function 
>>outside of python, but that is another task.
>>
>>Any suggestions?
>>
>>
>>  
>>
> As long as Python is written in C, please don't use C++ comments, some C 
> compilers don't like them.
> 
> Ulli
> _______________________________________________
> Python-Dev mailing list
> Python-Dev at python.org
> http://mail.python.org/mailman/listinfo/python-dev
> Unsubscribe:
> http://mail.python.org/mailman/options/python-dev/lists%40nabble.com
> 
> 

-- 
View this message in context: http://www.nabble.com/Adding-support-to-curses-library-tp22191916p22203820.html
Sent from the Python - python-dev mailing list archive at Nabble.com.



More information about the Python-Dev mailing list