diff --git a/src/Makefile b/src/Makefile index 34f986d6b..6ac8ac2aa 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1,14 +1,16 @@ # Set the C flags to include the GTK+ and Python libraries PYTHONVER = `python -V 2>&1 | awk '{print $$2}' | cut -f1,2 -d.` -CFLAGS = `pkg-config --cflags gtk+-2.0 pygtk-2.0` -fpic -I/usr/include/python$(PYTHONVER) -I. -LDFLAGS = `pkg-config --libs gtk+-2.0 pygtk-2.0` +CFLAGS = `pkg-config --cflags gtk+-2.0 pygtk-2.0 gtkspell-2.0` -fpic -I/usr/include/python$(PYTHONVER) -I. +LDFLAGS = `pkg-config --libs gtk+-2.0 pygtk-2.0 gtkspell-2.0` -all: trayicon.so +all: trayicon.so gtkspell.so -# Build the shared object +# Build the shared objects trayicon.so: trayicon.o eggtrayicon.o trayiconmodule.o $(CC) $(LDFLAGS) -shared $^ -o $@ +gtkspell.so: + $(CC) $(CFLAGS) $(LDFLAGS) -shared gtkspellmodule.c $^ -o $@ # The path to the GTK+ python types DEFS=`pkg-config --variable=defsdir pygtk-2.0` @@ -21,8 +23,9 @@ trayicon.c: trayicon.defs trayicon.override --override trayicon.override \ trayicon.defs > $@ + # A rule to clean the generated files clean: - rm -f trayicon.so *.o trayicon.c *~ + rm -f trayicon.so *.o trayicon.c gtkspell.so *~ .PHONY: clean diff --git a/src/gtkspellmodule.c b/src/gtkspellmodule.c new file mode 100644 index 000000000..c2da2a5ce --- /dev/null +++ b/src/gtkspellmodule.c @@ -0,0 +1,204 @@ +#include +#include +#include +#include "pygobject.h" + +typedef struct { + PyObject_HEAD + GtkSpell *spell; +} gtkspell_SpellObject; + +extern PyTypeObject gtkspell_SpellType; + +static PyTypeObject *_PyGtkTextView_Type; +#define PyGtkTextView_Type (*_PyGtkTextView_Type) + + +static PyObject * +_wrap_gtkspell_new_attach (PyTypeObject *type, PyObject *args, PyObject *kwds) +{ + gtkspell_SpellObject *self; + PyObject *pytextview; + GtkTextView *textview; + GtkSpell *spell; + char *language = NULL; + GError *error = NULL; + + if (!PyArg_ParseTuple(args, "O!|z:gtkspell.Spell.__new__", + &PyGtkTextView_Type, &pytextview, &language)) + return NULL; + + textview = GTK_TEXT_VIEW(((PyGObject *)pytextview)->obj); + spell = gtkspell_new_attach(textview, language, &error); + + if (pyg_error_check(&error)) + return NULL; + if (!spell) { + PyErr_SetString(PyExc_RuntimeError, "unable to create and attach a Spell object"); + return NULL; + } + + self = (gtkspell_SpellObject *)type->tp_alloc(type, 0); + self->spell = spell; + return (PyObject *)self; +} + +static PyObject * +_wrap_gtkspell_set_language (gtkspell_SpellObject *self, PyObject *args, PyObject *kwds) +{ + gchar *lang; + gboolean result; + + char *argnames[] = {"language", NULL}; + PyArg_ParseTupleAndKeywords (args, kwds, "s", argnames, &lang); + + result = gtkspell_set_language (self->spell, lang, NULL); + + if (!result) { + /*there are no specific errors in GtkSpell yet*/ + PyErr_SetString(PyExc_RuntimeError, "Error setting language"); + return NULL; + } + + Py_INCREF(Py_None); + return Py_None; +} + +static PyObject * +_wrap_gtkspell_recheck_all (gtkspell_SpellObject *self) +{ + gtkspell_recheck_all ((GtkSpell *)self->spell); + + Py_INCREF(Py_None); + return Py_None; + +} + +static PyObject * +_wrap_gtkspell_get_from_text_view (PyObject *junk, PyObject *args, PyObject *kwds) +{ + PyObject *pytextview; + GtkTextView *textview; + gtkspell_SpellObject *self; + + char *argnames[] = {"textview", NULL}; + PyArg_ParseTupleAndKeywords (args, kwds, "O", argnames, &pytextview); + + textview = GTK_TEXT_VIEW(((PyGObject *)pytextview)->obj); + + self = (gtkspell_SpellObject *)PyType_GenericAlloc((PyTypeObject *)>kspell_SpellType, 1); + if (self != NULL) { + self->spell = gtkspell_get_from_text_view(textview); + if (self->spell == NULL) { + Py_DECREF(self); + return NULL; + } + } + return (PyObject *)self; +} + +static PyObject * +_wrap_gtkspell_detach (gtkspell_SpellObject *self) +{ + gtkspell_detach(self->spell); + self->spell = NULL; + Py_INCREF(Py_None); + return Py_None; +} + + +static PyMethodDef gtkspell_methods[] = { + {"set_language", (PyCFunction)_wrap_gtkspell_set_language, + METH_KEYWORDS, "Set the language"}, + {"recheck_all", (PyCFunction)_wrap_gtkspell_recheck_all, + METH_NOARGS, "Recheck the spelling in the entire buffer"}, + {"detach", (PyCFunction)_wrap_gtkspell_detach, + METH_NOARGS, "Detaches a Spell object from a TextView"}, + { NULL, NULL, 0 } +}; + + +PyTypeObject gtkspell_SpellType = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "gtkspell.Spell", /*tp_name*/ + sizeof(gtkspell_SpellObject), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + 0, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash */ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT, /*tp_flags*/ + "GtkSpell object", /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + gtkspell_methods, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + _wrap_gtkspell_new_attach, /* tp_new */ +}; + +static PyMethodDef gtkspell_functions[] = { + {"get_from_text_view", (PyCFunction)_wrap_gtkspell_get_from_text_view, + METH_KEYWORDS, "Retrieves the Spell object attach"}, + { NULL, NULL, 0, NULL } +}; + +DL_EXPORT(void) +initgtkspell(void) +{ + PyObject *m, *module; + + init_pygobject(); + + if ((module = PyImport_ImportModule("gtk")) != NULL) { + PyObject *moddict = PyModule_GetDict(module); + + _PyGtkTextView_Type = (PyTypeObject *)PyDict_GetItemString(moddict, "TextView"); + if (_PyGtkTextView_Type == NULL) { + PyErr_SetString(PyExc_ImportError, + "cannot import name TextView from gtk"); + return; + } + } else { + PyErr_SetString(PyExc_ImportError, + "could not import gtk"); + return; + } + + + m = Py_InitModule3 ("gtkspell", gtkspell_functions, "GtkSpell bindings"); + + if (PyType_Ready(>kspell_SpellType) < 0) + return; + + Py_INCREF(>kspell_SpellType); + PyModule_AddObject(m, "Spell", (PyObject *)>kspell_SpellType); + + if (PyErr_Occurred ()) { + PyErr_Print(); + Py_FatalError ("can't initialise module gtkspell"); + } +}