summaryrefslogtreecommitdiff
path: root/gi/pygi-struct-marshal.c
diff options
context:
space:
mode:
authorJean Felder <jfelder@src.gnome.org>2020-04-25 02:23:51 +0200
committerJean Felder <jfelder@src.gnome.org>2020-12-06 15:04:09 +0100
commita4880dbc4575fadc0e3a494ca1c3d5374818deb9 (patch)
tree82bf92f05eb03caf5d880be77ef98915de54cc17 /gi/pygi-struct-marshal.c
parent9215e3a1327b63e9036c6a45def9654e1e5d58d6 (diff)
downloadpygobject-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.c36
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) {