diff options
author | Jean Felder <jfelder@src.gnome.org> | 2020-04-25 02:23:51 +0200 |
---|---|---|
committer | Jean Felder <jfelder@src.gnome.org> | 2020-12-06 15:04:09 +0100 |
commit | a4880dbc4575fadc0e3a494ca1c3d5374818deb9 (patch) | |
tree | 82bf92f05eb03caf5d880be77ef98915de54cc17 /gi/pygi-struct-marshal.c | |
parent | 9215e3a1327b63e9036c6a45def9654e1e5d58d6 (diff) | |
download | pygobject-a4880dbc4575fadc0e3a494ca1c3d5374818deb9.tar.gz |
Gtk.Template: Fix template support for GTK4
Gtk.Widget.set_connect_func() does not exist anymore and signals are
automatically connected. Instead, a GtkBuilderScope needs to be used
to create GtkBuilder's closure functions.
pygobject closure support is extended to support
functools.partial. This is used to create a GtkBuilder closure
function with an object different from the current object.
See MR https://gitlab.gnome.org/GNOME/gtk/-/merge_requests/1204 and
https://gitlab.gnome.org/GNOME/gtk/-/merge_requests/1230
Closes: #380
Diffstat (limited to 'gi/pygi-struct-marshal.c')
-rw-r--r-- | gi/pygi-struct-marshal.c | 36 |
1 files changed, 33 insertions, 3 deletions
diff --git a/gi/pygi-struct-marshal.c b/gi/pygi-struct-marshal.c index 6daf317c..13715888 100644 --- a/gi/pygi-struct-marshal.c +++ b/gi/pygi-struct-marshal.c @@ -182,9 +182,39 @@ pygi_arg_gclosure_from_py_marshal (PyObject *py_arg, g_closure_ref (closure); } } else { - closure = pyg_closure_new (py_arg, NULL, NULL); - g_closure_ref (closure); - g_closure_sink (closure); + PyObject *functools; + PyObject *partial = NULL; + + functools = PyImport_ImportModule ("functools"); + if (functools) { + partial = PyObject_GetAttrString (functools, "partial"); + Py_DECREF (functools); + } + + if (partial && PyObject_IsInstance (py_arg, partial) > 0) { + PyObject *partial_func; + PyObject *partial_keywords; + PyObject *swap_data; + + partial_func = PyObject_GetAttrString (py_arg, "func"); + partial_keywords = PyObject_GetAttrString (py_arg, "keywords"); + swap_data = PyDict_GetItemString (partial_keywords, "swap_data"); + + closure = pyg_closure_new (partial_func, NULL, swap_data); + + Py_DECREF (partial_func); + Py_DECREF (partial_keywords); + g_closure_ref (closure); + g_closure_sink (closure); + } else { + closure = pyg_closure_new (py_arg, NULL, NULL); + g_closure_ref (closure); + g_closure_sink (closure); + } + + if (partial) { + Py_DECREF (partial); + } } if (closure == NULL) { |