summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuca Bruno <lucabru@src.gnome.org>2014-01-28 23:47:24 +0100
committerLuca Bruno <lucabru@src.gnome.org>2014-01-28 23:48:55 +0100
commit8f9979da7a75cb91a46e47e61bf35a41c8ff8083 (patch)
tree2d5288d3ea96cdd48d493dc2d1ebc14ee67e6156
parentdb462e6f919da758fbb2f4e7b3cbbf2897ec852b (diff)
downloadvala-8f9979da7a75cb91a46e47e61bf35a41c8ff8083.tar.gz
gtkmodule: Ensure child gtypes are initialized before creating the template
Fixes bug 720282
-rw-r--r--codegen/valagtkmodule.vala18
-rw-r--r--codegen/valagtypemodule.vala8
2 files changed, 21 insertions, 5 deletions
diff --git a/codegen/valagtkmodule.vala b/codegen/valagtkmodule.vala
index 603ec6076..b6c9c300e 100644
--- a/codegen/valagtkmodule.vala
+++ b/codegen/valagtkmodule.vala
@@ -1,4 +1,3 @@
-
/* valagtkmodule.vala
*
* Copyright (C) 2013 Jürg Billeter
@@ -32,6 +31,8 @@ public class Vala.GtkModule : GSignalModule {
private HashMap<string, Signal> current_handler_to_signal_map = new HashMap<string, Signal>(str_hash, str_equal);
/* GtkBuilder xml child to Vala class mapping */
private HashMap<string, Class> current_child_to_class_map = new HashMap<string, Class>(str_hash, str_equal);
+ /* Required custom application-specific gtype classes to be ref'd before initializing the template */
+ private HashSet<Class> current_required_app_classes = new HashSet<Class>();
private void ensure_cclass_to_vala_map () {
// map C name of gtypeinstance classes to Vala classes
@@ -199,6 +200,8 @@ public class Vala.GtkModule : GSignalModule {
call.add_argument (new CCodeIdentifier ("GTK_WIDGET_CLASS (klass)"));
call.add_argument (new CCodeConstant ("\""+cl.get_attribute_string ("GtkTemplate", "ui")+"\""));
ccode.add_expression (call);
+
+ current_required_app_classes.clear ();
}
public override void visit_field (Field f) {
@@ -261,6 +264,10 @@ public class Vala.GtkModule : GSignalModule {
ccode.add_expression (call);
pop_context ();
+
+ if (!field_class.external && !field_class.external_package) {
+ current_required_app_classes.add (field_class);
+ }
}
public override void visit_method (Method m) {
@@ -307,11 +314,18 @@ public class Vala.GtkModule : GSignalModule {
}
- public override void generate_instance_init (Class cl) {
+ public override void end_instance_init (Class cl) {
if (cl == null || cl.error || !is_gtk_template (cl)) {
return;
}
+ foreach (var req in current_required_app_classes) {
+ /* ensure custom application widgets are initialized */
+ var call = new CCodeFunctionCall (new CCodeIdentifier ("g_type_ensure"));
+ call.add_argument (get_type_id_expression (SemanticAnalyzer.get_data_type_for_symbol (req)));
+ ccode.add_expression (call);
+ }
+
var call = new CCodeFunctionCall (new CCodeIdentifier ("gtk_widget_init_template"));
call.add_argument (new CCodeIdentifier ("GTK_WIDGET (self)"));
ccode.add_expression (call);
diff --git a/codegen/valagtypemodule.vala b/codegen/valagtypemodule.vala
index 5fd74a05a..26778eba4 100644
--- a/codegen/valagtypemodule.vala
+++ b/codegen/valagtypemodule.vala
@@ -1166,7 +1166,7 @@ public class Vala.GTypeModule : GErrorModule {
public virtual void generate_class_init (Class cl) {
}
- public virtual void generate_instance_init (Class cl) {
+ public virtual void end_instance_init (Class cl) {
}
private void begin_class_init_function (Class cl) {
@@ -1573,12 +1573,14 @@ public class Vala.GTypeModule : GErrorModule {
func.add_assignment (new CCodeMemberAccess.pointer (new CCodeIdentifier ("self"), "priv"), ccall);
}
- generate_instance_init (cl);
-
pop_context ();
}
private void add_instance_init_function (Class cl) {
+ push_context (instance_init_context);
+ end_instance_init (cl);
+ pop_context ();
+
cfile.add_function (instance_init_context.ccode);
}