# HG changeset patch # User Sadrul Habib Chowdhury # Date 1185621365 0 # Node ID 6b16fca71f8b2aed4efd92a66bcfcb87d139d3fb # Parent c5bf7a32968c4d08b9269be788dcf1b82be4310d Add some more functions for GntTree. One point to note is that the key for each row in a tree needs to be a GObject, which, really is quite simple to do in python (examples coming up shortly). There is a wrapper for gpointer, which I am going to remove shortly. I also need to fix the install location. The way to go, I think, is to change the configure script in libgnt/configure.ac. This involves checking for python and doing things of that sort. diff -r c5bf7a32968c -r 6b16fca71f8b finch/libgnt/pygnt/Makefile.am --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/finch/libgnt/pygnt/Makefile.am Sat Jul 28 11:16:05 2007 +0000 @@ -0,0 +1,38 @@ +EXTRA_DIST = gendef.sh + +pg_LTLIBRARIES = gnt.la + +pgdir = $(libdir) + +sources = \ + gnt.def \ + gnt.override \ + gntfilesel.override \ + gnttree.override + +gnt_la_SOURCES = gnt.c common.c common.h gntmodule.c + +gnt_la_LDFLAGS = -module -avoid-version \ + `pkg-config --libs pygobject-2.0` + +gnt_la_LIBADD = \ + $(GLIB_LIBS) \ + ../libgnt.la + +AM_CPPFLAGS = \ + -I../ \ + $(GLIB_CFLAGS) \ + $(GNT_CFLAGS) \ + -I/usr/include/python2.4 \ + `pkg-config --cflags pygobject-2.0` + +CLEANFILES = gnt.def gnt.c gnt.defe + +gnt.def: $(srcdir)/../*.h + $(srcdir)/gendef.sh + +gnt.c: $(sources) + pygtk-codegen-2.0 --prefix gnt \ + --override gnt.override \ + gnt.def > $@ + diff -r c5bf7a32968c -r 6b16fca71f8b finch/libgnt/pygnt/Makefile.make --- a/finch/libgnt/pygnt/Makefile.make Fri Jul 27 16:13:34 2007 +0000 +++ b/finch/libgnt/pygnt/Makefile.make Sat Jul 28 11:16:05 2007 +0000 @@ -10,5 +10,7 @@ --override gnt.override \ gnt.def > $@ +#python codegen/codegen.py --prefix gnt \ + clean: @rm *.so *.o gnt.c diff -r c5bf7a32968c -r 6b16fca71f8b finch/libgnt/pygnt/common.h --- a/finch/libgnt/pygnt/common.h Fri Jul 27 16:13:34 2007 +0000 +++ b/finch/libgnt/pygnt/common.h Sat Jul 28 11:16:05 2007 +0000 @@ -3,3 +3,5 @@ PyObject *create_pyobject_from_string_list(GList *list); +PyObject *create_mygpointer(gpointer data); + diff -r c5bf7a32968c -r 6b16fca71f8b finch/libgnt/pygnt/dbus-gnt --- a/finch/libgnt/pygnt/dbus-gnt Fri Jul 27 16:13:34 2007 +0000 +++ b/finch/libgnt/pygnt/dbus-gnt Sat Jul 28 11:16:05 2007 +0000 @@ -24,6 +24,7 @@ key = get_dict_key(conv) stuff = convwins[key] stuff[0].destroy() + # if a conv window is closed, then reopened, this thing crashes convwins[key] = None def wrote_msg(account, who, msg, conv, flags): @@ -34,7 +35,8 @@ tv.append_text_with_flags(who + ": ", 1) tv.append_text_with_flags(msg, 0) tv.scroll(0) - stuff[0].set_urgent() + if flags & 3: + stuff[0].set_urgent() bus = dbus.SessionBus() obj = bus.get_object("im.pidgin.purple.PurpleService", "/im/pidgin/purple/PurpleObject") @@ -91,6 +93,7 @@ tv.clear() win.show() convwins[key] = [win, tv, entry] + # XXX: listen to "destroy" for the window, and reset the key return convwins[key] def show_buddylist(): diff -r c5bf7a32968c -r 6b16fca71f8b finch/libgnt/pygnt/gendef.sh --- a/finch/libgnt/pygnt/gendef.sh Fri Jul 27 16:13:34 2007 +0000 +++ b/finch/libgnt/pygnt/gendef.sh Sat Jul 28 11:16:05 2007 +0000 @@ -28,7 +28,7 @@ gnt.h" # Generate the def file -rm gnt.def +rm -f gnt.def for file in $FILES do python /usr/share/pygtk/2.0/codegen/h2def.py ../$file >> gnt.def diff -r c5bf7a32968c -r 6b16fca71f8b finch/libgnt/pygnt/gntmodule.c --- a/finch/libgnt/pygnt/gntmodule.c Fri Jul 27 16:13:34 2007 +0000 +++ b/finch/libgnt/pygnt/gntmodule.c Sat Jul 28 11:16:05 2007 +0000 @@ -1,5 +1,62 @@ #include +/* {{{ Wrapper for gpointer */ + +typedef struct { + PyObject_HEAD + PyGPointer *data; +} mygpointer; + +static PyObject * +mygpointer_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +{ + mygpointer *self = (mygpointer*)type->tp_alloc(type, 0); + self->data = NULL; + return (PyObject*)self; +} + +static const PyMethodDef mygpointer_methods[] = { + /*{"value", (PyCFunction)get_value, METH_NOARGS, NULL},*/ + {NULL, NULL, 0, NULL} +}; + +static int +mygpointer_init(mygpointer *self, PyObject *args, PyObject *kwds) +{ + static char *kwlist[] = {"data", NULL}; + PyObject *data = NULL; + + if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O", kwlist, + &data)) + return -1; + + Py_INCREF(data); + Py_DECREF(self->data); + self->data = data; + + return 0; +} + +static PyTypeObject mygpointer_type = { + PyObject_HEAD_INIT(&PyType_Type) + .tp_name = "gpointer", + .tp_basicsize = sizeof(mygpointer), + .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, + .tp_doc = "gpointer stuff", + .tp_members = NULL, + .tp_init = mygpointer_init, + .tp_new = mygpointer_new, + .tp_methods = mygpointer_methods +}; + +PyObject *create_mygpointer(gpointer data) +{ + mygpointer *p = mygpointer_new(&mygpointer_type, NULL, NULL); + p->data = data; + return (PyObject *)p; +} +/* }}} Wrapper for gpointer */ + void gnt_register_classes (PyObject *d); extern PyMethodDef gnt_functions[]; @@ -9,11 +66,15 @@ PyObject *m, *d; init_pygobject (); - + + if (PyType_Ready(&mygpointer_type) < 0) + return; + m = Py_InitModule ("gnt", gnt_functions); d = PyModule_GetDict (m); gnt_register_classes (d); + gnt_add_constants(m, "GNT_"); if (PyErr_Occurred ()) { Py_FatalError ("can't initialise module sad"); diff -r c5bf7a32968c -r 6b16fca71f8b finch/libgnt/pygnt/gnttree.override --- a/finch/libgnt/pygnt/gnttree.override Fri Jul 27 16:13:34 2007 +0000 +++ b/finch/libgnt/pygnt/gnttree.override Sat Jul 28 11:16:05 2007 +0000 @@ -49,7 +49,7 @@ return NULL; } while (list) { - PyObject *obj = pyg_pointer_new(G_TYPE_POINTER, list->data); + PyObject *obj = list->data; PyList_Append(py_list, obj); Py_DECREF(obj); list = list->next; @@ -63,7 +63,7 @@ { static char *kwlist[] = {"key", "row", "parent", "bigbro", NULL}; PyObject *py_list; - gpointer key, parent, bigbro; + PyGObject *key, *parent, *bigbro; int len, i; GList *list = NULL; GntTreeRow *row; @@ -100,4 +100,65 @@ Py_INCREF(Py_None); return Py_None; } +%% +override gnt_tree_get_selection_data noargs +static PyObject * +_wrap_gnt_tree_get_selection_data(PyGObject *self) +{ + PyObject *ret = gnt_tree_get_selection_data(GNT_TREE(self->obj)); + if (!ret) + ret = Py_None; + Py_INCREF(ret); + return ret; +} +%% +override gnt_tree_change_text +static PyObject * +_wrap_gnt_tree_change_text(PyGObject *self, PyObject *args, PyObject *kwargs) +{ + static char *kwlist[] = { "key", "colno", "text", NULL }; + char *text; + int colno; + gpointer key; + if (!PyArg_ParseTupleAndKeywords(args, kwargs,"Ois:GntTree.change_text", kwlist, &key, &colno, &text)) + return NULL; + + gnt_tree_change_text(GNT_TREE(self->obj), key, colno, text); + + Py_INCREF(Py_None); + return Py_None; +} +%% +override gnt_tree_set_row_flags +static PyObject * +_wrap_gnt_tree_set_row_flags(PyGObject *self, PyObject *args, PyObject *kwargs) +{ + static char *kwlist[] = { "key", "flag", NULL }; + int flag; + gpointer key; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs,"Oi:GntTree.set_row_flags", kwlist, &key, &flag)) + return NULL; + + gnt_tree_set_row_flags(GNT_TREE(self->obj), key, flag); + + Py_INCREF(Py_None); + return Py_None; +} +%% +override gnt_tree_remove +static PyObject * +_wrap_gnt_tree_remove(PyGObject *self, PyObject *args, PyObject *kwargs) +{ + static char *kwlist[] = { "key", NULL }; + gpointer key; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs,"O:GntTree.remove", kwlist, &key)) + return NULL; + + gnt_tree_remove(GNT_TREE(self->obj), key); + + Py_INCREF(Py_None); + return Py_None; +} diff -r c5bf7a32968c -r 6b16fca71f8b finch/libgnt/pygnt/test.py --- a/finch/libgnt/pygnt/test.py Fri Jul 27 16:13:34 2007 +0000 +++ b/finch/libgnt/pygnt/test.py Sat Jul 28 11:16:05 2007 +0000 @@ -1,18 +1,59 @@ #!/usr/bin/python +import gobject import gnt +class MyObject(gobject.GObject): + __gproperties__ = { + 'mytype': (gobject.TYPE_INT, 'mytype', 'the type of the object', + 0, 10000, 0, gobject.PARAM_READWRITE), + 'string': (gobject.TYPE_STRING, 'string property', 'the string', + None, gobject.PARAM_READWRITE), + 'gobject': (gobject.TYPE_OBJECT, 'object property', 'the object', + gobject.PARAM_READWRITE), + } + + def __init__(self, type = 'string', value = None): + self.__gobject_init__() + self.set_property(type, value) + + def do_set_property(self, pspec, value): + if pspec.name == 'string': + self.string = value + self.type = gobject.TYPE_STRING + elif pspec.name == 'gobject': + self.gobject = value + self.type = gobject.TYPE_OBJECT + else: + raise AttributeError, 'unknown property %s' % pspec.name + def do_get_property(self, pspec): + if pspec.name == 'string': + return self.string + elif pspec.name == 'gobject': + return self.gobject + elif pspec.name == 'mytype': + return self.type + else: + raise AttributeError, 'unknown property %s' % pspec.name +gobject.type_register(MyObject) + def button_activate(button, tree): - list = tree.get_selection_text_list() - str = "" - for i in list: - str = str + i - entry.set_text("clicked!!!" + str) + list = tree.get_selection_text_list() + ent = tree.get_selection_data() + if ent.type == gobject.TYPE_STRING: + str = "" + for i in list: + str = str + i + entry.set_text("clicked!!!" + str) + elif ent.type == gobject.TYPE_OBJECT: + ent.gobject.set_text("mwhahaha!!!") gnt.gnt_init() win = gnt.Window() entry = gnt.Entry("") +obj = MyObject() +obj.set_property('gobject', entry) win.add_widget(entry) win.set_title("Entry") @@ -27,12 +68,20 @@ # so random non-string values can be used as the key for a row in a GntTree! last = None for i in range(1, 100): - tree.add_row_after(i, [str(i), ""], None, i-1) -tree.add_row_after(entry, ["asd"], None, None) -tree.add_row_after("b", ["123", ""], entry, None) + key = MyObject('string', str(i)) + tree.add_row_after(key, [str(i)], None, last) + last = key + +tree.add_row_after(MyObject('gobject', entry), ["asd"], None, None) +tree.add_row_after(MyObject('string', "b"), ["123"], MyObject('gobject', entry), None) button.connect("activate", button_activate, tree) +tv = gnt.TextView() + +win.add_widget(tv) +tv.append_text_with_flags("What up!!", gnt.TEXT_FLAG_BOLD) + win.show() gnt.gnt_main()