@@ -43,6 +43,9 @@ static void
43
43
bind_extension (ExmExtensionRow * self ,
44
44
ExmExtension * extension );
45
45
46
+ static void
47
+ unbind_extension (ExmExtensionRow * self );
48
+
46
49
ExmExtensionRow *
47
50
exm_extension_row_new (ExmExtension * extension )
48
51
{
@@ -59,6 +62,16 @@ exm_extension_row_finalize (GObject *object)
59
62
G_OBJECT_CLASS (exm_extension_row_parent_class )-> finalize (object );
60
63
}
61
64
65
+ static void
66
+ exm_extension_row_dispose (GObject * object )
67
+ {
68
+ ExmExtensionRow * self = (ExmExtensionRow * )object ;
69
+
70
+ unbind_extension (self );
71
+
72
+ G_OBJECT_CLASS (exm_extension_row_parent_class )-> dispose (object );
73
+ }
74
+
62
75
static void
63
76
exm_extension_row_get_property (GObject * object ,
64
77
guint prop_id ,
@@ -105,6 +118,11 @@ update_state (ExmExtension *extension,
105
118
// the extension. We do not want this behaviour as it messes with the global
106
119
// extension toggle.
107
120
121
+ g_return_if_fail (EXM_IS_EXTENSION (extension ));
122
+ g_return_if_fail (EXM_IS_EXTENSION_ROW (row ));
123
+
124
+ g_assert (row -> extension == extension );
125
+
108
126
const gchar * uuid ;
109
127
ExmExtensionState new_state ;
110
128
GAction * action ;
@@ -166,6 +184,17 @@ set_error_label_visible (ExmExtensionRow *self,
166
184
gtk_widget_set_visible (GTK_WIDGET (self -> error_label_tag ), visible );
167
185
}
168
186
187
+ static void
188
+ unbind_extension (ExmExtensionRow * self )
189
+ {
190
+ if (self -> extension != NULL )
191
+ {
192
+ g_signal_handler_disconnect (self -> extension , self -> signal_handler );
193
+ g_clear_object (& self -> extension );
194
+ g_clear_pointer (& self -> uuid , g_free );
195
+ }
196
+ }
197
+
169
198
static void
170
199
bind_extension (ExmExtensionRow * self ,
171
200
ExmExtension * extension )
@@ -178,15 +207,10 @@ bind_extension (ExmExtensionRow *self,
178
207
g_return_if_fail (EXM_IS_EXTENSION_ROW (self ));
179
208
180
209
// First, remove traces of the old extension
181
- if (self -> extension != NULL )
182
- {
183
- g_signal_handler_disconnect (self -> extension , self -> signal_handler );
184
- g_clear_object (& self -> extension );
185
- g_clear_pointer (& self -> uuid , g_free );
186
- }
210
+ unbind_extension (self );
187
211
188
212
// Now, bind the new one
189
- self -> extension = extension ;
213
+ self -> extension = g_object_ref ( extension ) ;
190
214
191
215
if (self -> extension == NULL )
192
216
return ;
@@ -252,6 +276,7 @@ exm_extension_row_class_init (ExmExtensionRowClass *klass)
252
276
GObjectClass * object_class = G_OBJECT_CLASS (klass );
253
277
254
278
object_class -> finalize = exm_extension_row_finalize ;
279
+ object_class -> dispose = exm_extension_row_dispose ;
255
280
object_class -> get_property = exm_extension_row_get_property ;
256
281
object_class -> set_property = exm_extension_row_set_property ;
257
282
0 commit comments