Add Python >= v3 support to SuperKaramba

pull/1/head
David C. Rankin 10 years ago committed by Timothy Pearson
parent a594faa652
commit 36230c0b5d

@ -47,6 +47,24 @@
#include "misc_python.h" #include "misc_python.h"
#include "input_python.h" #include "input_python.h"
struct module_state {
PyObject *error;
};
#if PY_MAJOR_VERSION >= 3
#define GETSTATE(m) ((struct module_state*)PyModule_GetState(m))
#else
#define GETSTATE(m) (&_state)
static struct module_state _state;
#endif
static PyObject *
error_out(PyObject *m) {
struct module_state *st = GETSTATE(m);
PyErr_SetString(st->error, "something bad happened in karamba_python.cpp");
return NULL;
}
/******************************************* /*******************************************
* Python methods are defined here. * Python methods are defined here.
* Each method accessible from python should have: * Each method accessible from python should have:
@ -338,6 +356,38 @@ static PyMethodDef karamba_methods[] = {
{NULL, NULL, 0 ,NULL} {NULL, NULL, 0 ,NULL}
}; };
#if PY_MAJOR_VERSION >= 3
static int karamba_traverse(PyObject *m, visitproc visit, void *arg) {
Py_VISIT(GETSTATE(m)->error);
return 0;
}
static int karamba_clear(PyObject *m) {
Py_CLEAR(GETSTATE(m)->error);
return 0;
}
static struct PyModuleDef karambadef = {
PyModuleDef_HEAD_INIT,
"karamba",
NULL,
sizeof(struct module_state),
karamba_methods,
NULL,
karamba_traverse,
karamba_clear,
NULL
};
#define INITERROR return NULL
#else
#define INITERROR return
#endif
PyThreadState* KarambaPython::mainThreadState = 0; PyThreadState* KarambaPython::mainThreadState = 0;
KarambaPython::KarambaPython(const ThemeFile& theme, bool reloading): KarambaPython::KarambaPython(const ThemeFile& theme, bool reloading):
@ -356,9 +406,12 @@ KarambaPython::KarambaPython(const ThemeFile& theme, bool reloading):
PyRun_SimpleString((char*)"sys.path.insert(0, '')"); PyRun_SimpleString((char*)"sys.path.insert(0, '')");
PyImport_AddModule((char*)"karamba"); PyImport_AddModule((char*)"karamba");
#if PY_MAJOR_VERSION >= 3
PyModule_Create(&karambadef);
#else
Py_InitModule((char*)"karamba", karamba_methods); Py_InitModule((char*)"karamba", karamba_methods);
#endif
pName = PyString_FromString(theme.pythonModule().ascii()); pName = PyBytes_FromString(theme.pythonModule().ascii());
pModule = PyImport_Import(pName); pModule = PyImport_Import(pName);
fprintf(stderr, "%s\n", pypath); fprintf(stderr, "%s\n", pypath);

@ -93,9 +93,9 @@ TQString fromUcs4(TQ_UINT32* ucs4)
TQString PyString2TQString(PyObject* text) TQString PyString2TQString(PyObject* text)
{ {
TQString qtext; TQString qtext;
if (PyString_CheckExact(text)) if (PyBytes_CheckExact(text))
{ {
char* t = PyString_AsString(text); char* t = PyBytes_AsString(text);
qtext.setAscii(t); qtext.setAscii(t);
} }
else if (PyUnicode_CheckExact(text)) else if (PyUnicode_CheckExact(text))
@ -148,7 +148,7 @@ PyObject* TQString2PyString(TQString string)
} }
else else
pyString = PyString_FromString(""); pyString = PyBytes_FromString("");
return pyString; return pyString;
} }

@ -343,7 +343,7 @@ PyObject* py_read_theme_file(PyObject *, PyObject *args)
return NULL; return NULL;
karamba* k = (karamba*)widget; karamba* k = (karamba*)widget;
TQByteArray ba = k->theme().readThemeFile(file); TQByteArray ba = k->theme().readThemeFile(file);
return PyString_FromStringAndSize(ba.data(), ba.size()); return PyBytes_FromStringAndSize(ba.data(), ba.size());
} }
/* now a method we need to expose to Python */ /* now a method we need to expose to Python */

@ -37,16 +37,16 @@ static PyObject *get_svc_grp(KServiceGroup::Ptr const& g)
PyObject *tuple = PyTuple_New(2); PyObject *tuple = PyTuple_New(2);
PyObject *dict = PyDict_New(); PyObject *dict = PyDict_New();
PyDict_SetItem(dict, PyString_FromString("caption"), PyDict_SetItem(dict, PyBytes_FromString("caption"),
PyString_FromString(g->caption().ascii())); PyBytes_FromString(g->caption().ascii()));
if (g->comment() != NULL) if (g->comment() != NULL)
PyDict_SetItem(dict, PyString_FromString("comment"), PyDict_SetItem(dict, PyBytes_FromString("comment"),
PyString_FromString(g->comment().ascii())); PyBytes_FromString(g->comment().ascii()));
if (g->icon() != NULL) if (g->icon() != NULL)
PyDict_SetItem(dict, PyString_FromString("icon"), PyDict_SetItem(dict, PyBytes_FromString("icon"),
PyString_FromString(g->icon().ascii())); PyBytes_FromString(g->icon().ascii()));
PyDict_SetItem(dict, PyString_FromString("relpath"), PyDict_SetItem(dict, PyBytes_FromString("relpath"),
PyString_FromString(g->relPath().ascii())); PyBytes_FromString(g->relPath().ascii()));
PyTuple_SET_ITEM(tuple, 0, Py_BuildValue((char*)"l", 0)); PyTuple_SET_ITEM(tuple, 0, Py_BuildValue((char*)"l", 0));
PyTuple_SET_ITEM(tuple, 1, dict); PyTuple_SET_ITEM(tuple, 1, dict);
@ -61,43 +61,43 @@ static PyObject *get_svc(KService::Ptr const& g)
PyObject *dict = PyDict_New(); PyObject *dict = PyDict_New();
if (g->exec() != NULL) if (g->exec() != NULL)
PyDict_SetItem(dict, PyString_FromString("exec"), PyDict_SetItem(dict, PyBytes_FromString("exec"),
PyString_FromString(g->exec().ascii())); PyBytes_FromString(g->exec().ascii()));
if (g->menuId() != NULL) if (g->menuId() != NULL)
PyDict_SetItem(dict, PyString_FromString("menuid"), PyDict_SetItem(dict, PyBytes_FromString("menuid"),
PyString_FromString(g->menuId().ascii())); PyBytes_FromString(g->menuId().ascii()));
if (g->name() != NULL) if (g->name() != NULL)
PyDict_SetItem(dict, PyString_FromString("name"), PyDict_SetItem(dict, PyBytes_FromString("name"),
PyString_FromString(g->name().ascii())); PyBytes_FromString(g->name().ascii()));
if (g->path() != NULL) if (g->path() != NULL)
PyDict_SetItem(dict, PyString_FromString("path"), PyDict_SetItem(dict, PyBytes_FromString("path"),
PyString_FromString(g->path().ascii())); PyBytes_FromString(g->path().ascii()));
if (g->icon() != NULL) if (g->icon() != NULL)
PyDict_SetItem(dict, PyString_FromString("icon"), PyDict_SetItem(dict, PyBytes_FromString("icon"),
PyString_FromString(g->icon().ascii())); PyBytes_FromString(g->icon().ascii()));
if (g->library() != NULL) if (g->library() != NULL)
PyDict_SetItem(dict, PyString_FromString("library"), PyDict_SetItem(dict, PyBytes_FromString("library"),
PyString_FromString(g->library().ascii())); PyBytes_FromString(g->library().ascii()));
if (g->comment() != NULL) if (g->comment() != NULL)
PyDict_SetItem(dict, PyString_FromString("comment"), PyDict_SetItem(dict, PyBytes_FromString("comment"),
PyString_FromString(g->comment().ascii())); PyBytes_FromString(g->comment().ascii()));
if (g->type() != NULL) if (g->type() != NULL)
PyDict_SetItem(dict, PyString_FromString("type"), PyDict_SetItem(dict, PyBytes_FromString("type"),
PyString_FromString(g->type().ascii())); PyBytes_FromString(g->type().ascii()));
if (g->genericName() != NULL) if (g->genericName() != NULL)
PyDict_SetItem(dict, PyString_FromString("genericname"), PyDict_SetItem(dict, PyBytes_FromString("genericname"),
PyString_FromString(g->genericName().ascii())); PyBytes_FromString(g->genericName().ascii()));
/* /*
PyDict_SetItem(dict, PyString_FromString("terminal"), PyDict_SetItem(dict, PyBytes_FromString("terminal"),
Py_BuildValue("l", g->terminal())); Py_BuildValue("l", g->terminal()));
PyDict_SetItem(dict, PyString_FromString("type"), PyDict_SetItem(dict, PyBytes_FromString("type"),
PyString_FromString(g->type().ascii())); PyBytes_FromString(g->type().ascii()));
PyDict_SetItem(dict, PyString_FromString("username"), PyDict_SetItem(dict, PyBytes_FromString("username"),
PyString_FromString(g->username().ascii())); PyBytes_FromString(g->username().ascii()));
PyDict_SetItem(dict, PyString_FromString("substuid"), PyDict_SetItem(dict, PyBytes_FromString("substuid"),
Py_BuildValue("l", g->substituteUid())); Py_BuildValue("l", g->substituteUid()));
PyDict_SetItem(dict, PyString_FromString("path"), PyDict_SetItem(dict, PyBytes_FromString("path"),
PyString_FromString(g->path().ascii())); PyBytes_FromString(g->path().ascii()));
*/ */
PyTuple_SET_ITEM(tuple, 0, Py_BuildValue((char*)"l", 1)); PyTuple_SET_ITEM(tuple, 0, Py_BuildValue((char*)"l", 1));

@ -143,50 +143,50 @@ PyObject* getTaskInfo(long widget, long ctask)
//Task Name //Task Name
if (currTask->name() != NULL) if (currTask->name() != NULL)
{ {
PyList_Append(pList, PyString_FromString(currTask->name().latin1())); PyList_Append(pList, PyBytes_FromString(currTask->name().latin1()));
} }
else else
{ {
PyList_Append(pList, PyString_FromString("")); PyList_Append(pList, PyBytes_FromString(""));
} }
//Icon Name //Icon Name
if (currTask->iconName() != NULL) if (currTask->iconName() != NULL)
{ {
PyList_Append(pList, PyString_FromString(currTask->iconName().latin1())); PyList_Append(pList, PyBytes_FromString(currTask->iconName().latin1()));
} }
else else
{ {
PyList_Append(pList, PyString_FromString("")); PyList_Append(pList, PyBytes_FromString(""));
} }
//Class Name //Class Name
if (currTask->className() != NULL) if (currTask->className() != NULL)
{ {
PyList_Append(pList, PyString_FromString(currTask->className().latin1())); PyList_Append(pList, PyBytes_FromString(currTask->className().latin1()));
} }
else else
{ {
PyList_Append(pList, PyString_FromString("")); PyList_Append(pList, PyBytes_FromString(""));
} }
// Desktop this task is on // Desktop this task is on
PyList_Append(pList, PyInt_FromLong(currTask->desktop())); PyList_Append(pList, PyLong_FromLong(currTask->desktop()));
// is it maximized? // is it maximized?
PyList_Append(pList, PyInt_FromLong(currTask->isMaximized())); PyList_Append(pList, PyLong_FromLong(currTask->isMaximized()));
// is it iconified? // is it iconified?
PyList_Append(pList, PyInt_FromLong(currTask->isIconified())); PyList_Append(pList, PyLong_FromLong(currTask->isIconified()));
// is it shaded? // is it shaded?
PyList_Append(pList, PyInt_FromLong(currTask->isShaded())); PyList_Append(pList, PyLong_FromLong(currTask->isShaded()));
// is it focused? // is it focused?
PyList_Append(pList, PyInt_FromLong(currTask->isActive())); PyList_Append(pList, PyLong_FromLong(currTask->isActive()));
// a reference back to itself // a reference back to itself
PyList_Append(pList, PyInt_FromLong((long)currTask)); PyList_Append(pList, PyLong_FromLong((long)currTask));
return pList; return pList;
@ -235,35 +235,35 @@ PyObject* getStartupInfo(long widget, long cstartup)
//Startup Name //Startup Name
if (startup -> text() != NULL) if (startup -> text() != NULL)
{ {
PyList_Append(pList, PyString_FromString(startup -> text().latin1())); PyList_Append(pList, PyBytes_FromString(startup -> text().latin1()));
} }
else else
{ {
PyList_Append(pList, PyString_FromString("")); PyList_Append(pList, PyBytes_FromString(""));
} }
//Icon Name //Icon Name
if (startup -> icon() != NULL) if (startup -> icon() != NULL)
{ {
PyList_Append(pList, PyString_FromString(startup -> icon().latin1())); PyList_Append(pList, PyBytes_FromString(startup -> icon().latin1()));
} }
else else
{ {
PyList_Append(pList, PyString_FromString("")); PyList_Append(pList, PyBytes_FromString(""));
} }
//Executable Name //Executable Name
if (startup -> bin() != NULL) if (startup -> bin() != NULL)
{ {
PyList_Append(pList, PyString_FromString(startup -> bin().latin1())); PyList_Append(pList, PyBytes_FromString(startup -> bin().latin1()));
} }
else else
{ {
PyList_Append(pList, PyString_FromString("")); PyList_Append(pList, PyBytes_FromString(""));
} }
// a reference back to itself // a reference back to itself
PyList_Append(pList, PyInt_FromLong((long) startup)); PyList_Append(pList, PyLong_FromLong((long) startup));
return pList; return pList;
@ -300,7 +300,7 @@ PyObject* getTaskNames(long widget)
const char* tmp = task->name().latin1(); const char* tmp = task->name().latin1();
if(tmp == 0) if(tmp == 0)
continue; continue;
pString = PyString_FromString(tmp); pString = PyBytes_FromString(tmp);
if(pString) if(pString)
PyList_Append(pList, pString); PyList_Append(pList, pString);
} }
@ -329,7 +329,7 @@ PyObject* getTaskList(long widget)
Task* task; Task* task;
for (task = taskList.first(); task; task = taskList.next()) for (task = taskList.first(); task; task = taskList.next())
{ {
pString = PyInt_FromLong((long)task); pString = PyLong_FromLong((long)task);
PyList_Append(pList, pString); PyList_Append(pList, pString);
} }
return pList; return pList;
@ -358,7 +358,7 @@ PyObject* getStartupList(long widget)
for (startup = startupList.first(); startup; startup = startupList.next()) for (startup = startupList.first(); startup; startup = startupList.next())
{ {
pString = PyInt_FromLong((long) startup); pString = PyLong_FromLong((long) startup);
PyList_Append(pList, pString); PyList_Append(pList, pString);
} }
return pList; return pList;

Loading…
Cancel
Save