widget: Change templates to use closure functions

... instead of connect functions.
This commit is contained in:
Benjamin Otte 2019-11-22 06:54:52 +01:00
parent 0627bba5a0
commit b7ff017f8d
3 changed files with 52 additions and 60 deletions

View File

@ -4669,7 +4669,7 @@ gtk_widget_class_bind_template_child_internal_private
gtk_widget_class_bind_template_child_full
gtk_widget_class_bind_template_callback
gtk_widget_class_bind_template_callback_full
gtk_widget_class_set_connect_func
gtk_widget_class_set_closure_func
<SUBSECTION>
gtk_widget_observe_children

View File

@ -490,9 +490,9 @@ typedef struct {
GBytes *data;
GSList *children;
GSList *callbacks;
GtkBuilderConnectFunc connect_func;
gpointer connect_data;
GDestroyNotify destroy_notify;
GtkBuilderClosureFunc closure_func;
gpointer closure_data;
GDestroyNotify closure_destroy;
} GtkWidgetTemplate;
struct _GtkWidgetClassPrivate
@ -12027,9 +12027,9 @@ template_data_free (GtkWidgetTemplate *template_data)
g_slist_free_full (template_data->children, (GDestroyNotify)template_child_class_free);
g_slist_free_full (template_data->callbacks, (GDestroyNotify)callback_symbol_free);
if (template_data->connect_data &&
template_data->destroy_notify)
template_data->destroy_notify (template_data->connect_data);
if (template_data->closure_data &&
template_data->closure_destroy)
template_data->closure_destroy (template_data->closure_data);
g_slice_free (GtkWidgetTemplate, template_data);
}
@ -12113,32 +12113,22 @@ setup_template_child (GtkWidgetTemplate *template_data,
return TRUE;
}
static void
gtk_widget_template_connect_func (GtkBuilder *builder,
GObject *object,
const gchar *signal_name,
const gchar *handler_name,
GObject *connect_object,
GConnectFlags flags,
gpointer user_data)
static GClosure *
gtk_widget_template_closure_func (GtkBuilder *builder,
const char *function_name,
gboolean swapped,
GObject *object,
gpointer user_data,
GError **error)
{
GClosure *closure;
GError *error = NULL;
if (object == NULL)
object = user_data;
closure = gtk_builder_create_closure (builder,
handler_name,
flags & G_CONNECT_SWAPPED ? TRUE : FALSE,
connect_object ? connect_object : user_data,
&error);
if (error)
{
g_warning ("%s", error->message);
g_error_free (error);
return;
}
g_signal_connect_closure (object, signal_name, closure, flags & G_CONNECT_AFTER ? TRUE : FALSE);
return gtk_builder_create_cclosure (builder,
function_name,
swapped,
object,
error);
}
/**
@ -12182,6 +12172,17 @@ gtk_widget_init_template (GtkWidget *widget)
builder = gtk_builder_new ();
/* Setup closure handling. All signal data from a template receive the
* template instance as user data automatically.
*
* A GtkBuilderClosureFunc can be provided to gtk_widget_class_set_signal_closure_func()
* in order for templates to be usable by bindings.
*/
if (template->closure_func)
gtk_builder_set_closure_func (builder, template->closure_func, template->closure_data, NULL);
else
gtk_builder_set_closure_func (builder, gtk_widget_template_closure_func, widget, NULL);
/* Add any callback symbols declared for this GType to the GtkBuilder namespace */
for (l = template->callbacks; l; l = l->next)
{
@ -12231,16 +12232,7 @@ gtk_widget_init_template (GtkWidget *widget)
}
}
/* Connect signals. All signal data from a template receive the
* template instance as user data automatically.
*
* A GtkBuilderConnectFunc can be provided to gtk_widget_class_set_signal_connect_func()
* in order for templates to be usable by bindings.
*/
if (template->connect_func)
gtk_builder_connect_signals_full (builder, template->connect_func, template->connect_data);
else
gtk_builder_connect_signals_full (builder, gtk_widget_template_connect_func, widget);
gtk_builder_connect_signals (builder);
g_object_unref (builder);
}
@ -12360,36 +12352,36 @@ gtk_widget_class_bind_template_callback_full (GtkWidgetClass *widget_class,
}
/**
* gtk_widget_class_set_connect_func:
* gtk_widget_class_set_closure_func:
* @widget_class: A #GtkWidgetClass
* @connect_func: The #GtkBuilderConnectFunc to use when connecting signals in the class template
* @connect_data: The data to pass to @connect_func
* @connect_data_destroy: The #GDestroyNotify to free @connect_data, this will only be used at
* @closure_func: The #GtkBuilderClosureFunc to use when creating closure in the class template
* @closure_data: The data to pass to @closure_func
* @closure_data_destroy: The #GDestroyNotify to free @closure_data, this will only be used at
* class finalization time, when no classes of type @widget_type are in use anymore.
*
* For use in language bindings, this will override the default #GtkBuilderConnectFunc to be
* For use in language bindings, this will override the default #GtkBuilderClosureFunc to be
* used when parsing GtkBuilder XML from this classs template data.
*
* Note that this must be called from a composite widget classes class
* initializer after calling gtk_widget_class_set_template().
*/
void
gtk_widget_class_set_connect_func (GtkWidgetClass *widget_class,
GtkBuilderConnectFunc connect_func,
gpointer connect_data,
GDestroyNotify connect_data_destroy)
gtk_widget_class_set_closure_func (GtkWidgetClass *widget_class,
GtkBuilderClosureFunc closure_func,
gpointer closure_data,
GDestroyNotify closure_data_destroy)
{
g_return_if_fail (GTK_IS_WIDGET_CLASS (widget_class));
g_return_if_fail (widget_class->priv->template != NULL);
/* Defensive, destroy any previously set data */
if (widget_class->priv->template->connect_data &&
widget_class->priv->template->destroy_notify)
widget_class->priv->template->destroy_notify (widget_class->priv->template->connect_data);
if (widget_class->priv->template->closure_data &&
widget_class->priv->template->closure_destroy)
widget_class->priv->template->closure_destroy (widget_class->priv->template->closure_data);
widget_class->priv->template->connect_func = connect_func;
widget_class->priv->template->connect_data = connect_data;
widget_class->priv->template->destroy_notify = connect_data_destroy;
widget_class->priv->template->closure_func = closure_func;
widget_class->priv->template->closure_data = closure_data;
widget_class->priv->template->closure_destroy = closure_data_destroy;
}
/**

View File

@ -956,10 +956,10 @@ void gtk_widget_class_bind_template_callback_full (GtkWidgetClass *
const gchar *callback_name,
GCallback callback_symbol);
GDK_AVAILABLE_IN_ALL
void gtk_widget_class_set_connect_func (GtkWidgetClass *widget_class,
GtkBuilderConnectFunc connect_func,
gpointer connect_data,
GDestroyNotify connect_data_destroy);
void gtk_widget_class_set_closure_func (GtkWidgetClass *widget_class,
GtkBuilderClosureFunc closure_func,
gpointer closure_data,
GDestroyNotify closure_destroy);
GDK_AVAILABLE_IN_ALL
void gtk_widget_class_bind_template_child_full (GtkWidgetClass *widget_class,
const gchar *name,