root/gaphor/tags/gaphor-0.1.0/pygtk.patch

Revision 48, 6.6 kB (checked in by arjanmol, 7 years ago)

Added pygtk patch, removed gaphor/tree/treemodel stuff

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
  • gtk/pygtktreemodel.c

    old new  
    1111/* define this to print out debug messages */ 
    1212#undef DEBUG_TREE_MODEL 
    1313 
     14#ifndef _ 
     15# define _(s) (s) 
     16#endif 
     17 
     18enum { 
     19    PROP_LEAK_REFERENCES = 1 
     20}; 
     21 
    1422static void pygtk_generic_tree_model_class_init(PyGtkGenericTreeModelClass *klass); 
    1523static void pygtk_generic_tree_model_init(PyGtkGenericTreeModel *self); 
    1624static void pygtk_generic_tree_model_iface_init(GtkTreeModelIface *iface); 
    1725 
     26static void pygtk_generic_tree_model_set_property (GObject *object, 
     27                                                   guint property_id, 
     28                                                   const GValue *value, 
     29                                                   GParamSpec *pspec); 
     30static void pygtk_generic_tree_model_get_property (GObject *object, 
     31                                                   guint property_id, 
     32                                                   GValue *value, 
     33                                                   GParamSpec *pspec); 
     34 
    1835GType 
    1936pygtk_generic_tree_model_get_type(void) 
    2037{ 
     
    5168static void 
    5269pygtk_generic_tree_model_class_init(PyGtkGenericTreeModelClass *klass) 
    5370{ 
     71    GObjectClass *object_class = (GObjectClass*) klass; 
     72 
     73    object_class->get_property = pygtk_generic_tree_model_get_property; 
     74    object_class->set_property = pygtk_generic_tree_model_set_property; 
     75 
     76    g_object_class_install_property (object_class, 
     77                                     PROP_LEAK_REFERENCES, 
     78                                     g_param_spec_boolean ("leak_references", 
     79                                          _("Leak references"), 
     80                                          _("Enable referencing iterator " 
     81        "objects (this will cause a memory leak or at least a reference " 
     82        "counting leak). You might need it though, if you return newly " 
     83        "created objects."), 
     84                                          TRUE, 
     85                                          G_PARAM_READWRITE)); 
     86 
    5487} 
    5588 
    5689static guint pygtk_generic_tree_model_get_flags(GtkTreeModel *tree_model); 
     
    102135static void 
    103136pygtk_generic_tree_model_init(PyGtkGenericTreeModel *self) 
    104137{ 
     138    self->leak_references = TRUE; 
     139} 
     140 
     141static void 
     142pygtk_generic_tree_model_set_property (GObject *object, guint property_id, 
     143                                       const GValue *value, GParamSpec *pspec) 
     144{ 
     145    switch (property_id) { 
     146    case PROP_LEAK_REFERENCES: 
     147        PYGTK_GENERIC_TREE_MODEL (object)->leak_references = g_value_get_boolean (value); 
     148        break; 
     149    default: 
     150        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); 
     151        break; 
     152    } 
    105153} 
    106154 
     155static void 
     156pygtk_generic_tree_model_get_property (GObject *object, guint property_id, 
     157                                       GValue *value, GParamSpec *pspec) 
     158{ 
     159    switch (property_id) { 
     160    case PROP_LEAK_REFERENCES: 
     161        g_value_set_boolean (value, 
     162                            PYGTK_GENERIC_TREE_MODEL (object)->leak_references); 
     163        break; 
     164    default: 
     165        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); 
     166        break; 
     167    } 
     168} 
     169 
    107170PyGtkGenericTreeModel * 
    108171pygtk_generic_tree_model_new(void) 
    109172{ 
     
    224287    if (py_ret) { 
    225288        if (py_ret != Py_None) { 
    226289            iter->user_data = py_ret; 
     290            if (!((PyGtkGenericTreeModel*) tree_model)->leak_references) { 
     291                Py_DECREF (py_ret); 
     292            } 
    227293            return TRUE; 
    228294        } else { 
    229295            iter->user_data = NULL; 
     
    280346 
    281347#ifdef DEBUG_TREE_MODEL 
    282348    g_message("get_value(%p, %d)", iter, column); 
     349    _PyObject_Dump (iter->user_data); 
    283350#endif 
    284351    /* init value to column type */ 
    285352    g_value_init(value, pygtk_generic_tree_model_get_column_type(tree_model, column)); 
    286353 
     354 
    287355    py_value = PyObject_CallMethod(self, METHOD_PREFIX "get_value", 
    288                                    "(Oi)", (PyObject *)iter->user_data,column); 
     356                                   "(Oi)", (PyObject *)iter->user_data, column); 
    289357 
    290358    if (py_value) { 
    291359        pyg_value_from_pyobject(value, py_value); 
     
    315383    if (py_ret) { 
    316384        if (py_ret != Py_None) { 
    317385            /* XXXX handle reference counting here */ 
     386            if (iter->user_data 
     387                && ((PyGtkGenericTreeModel*) tree_model)->leak_references) { 
     388                Py_DECREF ((PyObject*) iter->user_data); 
     389            } 
    318390            iter->user_data = py_ret; 
     391            if (!((PyGtkGenericTreeModel*) tree_model)->leak_references) { 
     392                Py_DECREF(py_ret); 
     393            } 
    319394            return TRUE; 
    320395        } else { 
    321396            iter->user_data = NULL; 
     
    345420#ifdef DEBUG_TREE_MODEL 
    346421    g_message("iter_children(%p, %p)", iter, parent); 
    347422#endif 
    348     if (parent) py_parent = (PyObject *)parent->user_data; 
     423    if (parent && parent->user_data) 
     424        py_parent = (PyObject *)parent->user_data; 
    349425    py_ret = PyObject_CallMethod(self, METHOD_PREFIX "iter_children", 
    350426                                 "(O)", py_parent); 
    351427    if (py_ret) { 
    352428        if (py_ret != Py_None) { 
    353429            /* XXXX handle reference counting here */ 
    354430            iter->user_data = py_ret; 
     431            if (!((PyGtkGenericTreeModel*) tree_model)->leak_references) { 
     432                Py_DECREF(py_ret); 
     433            } 
    355434            return TRUE; 
    356435        } else { 
    357436            iter->user_data = NULL; 
     
    435514    self = pygobject_new((GObject *)tree_model); 
    436515 
    437516#ifdef DEBUG_TREE_MODEL 
    438     g_message("iter_nth_child(%p, %p, %d)", iter, parent, n); 
     517    g_message("iter_nth_child(%p, %p (%p), %d)", iter, parent, parent ? parent->user_data : NULL, n); 
    439518#endif 
    440     if (parent) py_parent = (PyObject *)parent->user_data; 
     519    if (parent && parent->user_data) 
     520        py_parent = (PyObject *)parent->user_data; 
    441521    py_ret = PyObject_CallMethod(self, METHOD_PREFIX "iter_nth_child", 
    442522                                 "(Oi)", py_parent, n); 
    443523    if (py_ret) { 
    444524        if (py_ret != Py_None) { 
    445525            /* XXXX handle reference counting here */ 
    446526            iter->user_data = py_ret; 
     527            if (!((PyGtkGenericTreeModel*) tree_model)->leak_references) { 
     528                Py_DECREF(py_ret); 
     529            } 
    447530            return TRUE; 
    448531        } else { 
    449532            iter->user_data = NULL; 
     
    473556#ifdef DEBUG_TREE_MODEL 
    474557    g_message("iter_parent(%p, %p)", iter, child); 
    475558#endif 
    476     if (child) py_child = (PyObject *)child->user_data; 
     559    if (child && child->user_data) 
     560        py_child = (PyObject *)child->user_data; 
    477561    py_ret = PyObject_CallMethod(self, METHOD_PREFIX "iter_parent", 
    478562                                 "(O)", py_child); 
    479563    if (py_ret) { 
    480564        if (py_ret != Py_None) { 
    481565            /* XXXX handle reference counting here */ 
     566            if (iter->user_data 
     567                && ((PyGtkGenericTreeModel*) tree_model)->leak_references) { 
     568                Py_DECREF ((PyObject*) iter->user_data); 
     569            } 
    482570            iter->user_data = py_ret; 
     571            if (!((PyGtkGenericTreeModel*) tree_model)->leak_references) { 
     572                Py_DECREF(py_ret); 
     573            } 
    483574            return TRUE; 
    484575        } else { 
    485576            iter->user_data = NULL; 
  • gtk/pygtktreemodel.h

    old new  
    1313 
    1414struct _PyGtkGenericTreeModel { 
    1515    GObject parent_instance; 
     16 
     17    gboolean leak_references; 
    1618}; 
    1719 
    1820struct _PyGtkGenericTreeModelClass { 
Note: See TracBrowser for help on using the browser.