Skip to content

Commit d6691b2

Browse files
committed
extension-row: Make row binding more robust
1 parent b04736a commit d6691b2

File tree

1 file changed

+26
-19
lines changed

1 file changed

+26
-19
lines changed

src/exm-extension-row.c

Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ struct _ExmExtensionRow
2525
GtkImage *update_icon;
2626
GtkImage *error_icon;
2727
GtkImage *out_of_date_icon;
28+
29+
guint signal_handler;
2830
};
2931

3032
G_DEFINE_FINAL_TYPE (ExmExtensionRow, exm_extension_row, ADW_TYPE_EXPANDER_ROW)
@@ -37,6 +39,10 @@ enum {
3739

3840
static GParamSpec *properties [N_PROPS];
3941

42+
static void
43+
bind_extension (ExmExtensionRow *self,
44+
ExmExtension *extension);
45+
4046
ExmExtensionRow *
4147
exm_extension_row_new (ExmExtension *extension)
4248
{
@@ -82,14 +88,7 @@ exm_extension_row_set_property (GObject *object,
8288
switch (prop_id)
8389
{
8490
case PROP_EXTENSION:
85-
self->extension = g_value_get_object (value);
86-
if (self->extension)
87-
{
88-
// TODO: Bind here, rather than in constructed()
89-
g_object_get (self->extension,
90-
"uuid", &self->uuid,
91-
NULL);
92-
}
91+
bind_extension (self, g_value_get_object (value));
9392
break;
9493
default:
9594
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -168,17 +167,26 @@ set_error_label_visible (ExmExtensionRow *self,
168167
}
169168

170169
static void
171-
exm_extension_row_bind_extension (GObject *object,
172-
GParamSpec *pspec)
170+
bind_extension (ExmExtensionRow *self,
171+
ExmExtension *extension)
173172
{
174173
// TODO: This big block of property assignments is currently copy/pasted
175174
// from ExmExtension. We can replace this with GtkExpression lookups
176175
// once blueprint-compiler supports expressions.
177176
// (See https://gitlab.gnome.org/jwestman/blueprint-compiler/-/issues/5)
178177

179-
ExmExtensionRow *self = EXM_EXTENSION_ROW (object);
178+
g_return_if_fail (EXM_IS_EXTENSION_ROW (self));
179+
180+
// 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+
}
180187

181-
g_return_if_fail (pspec == properties [PROP_EXTENSION]);
188+
// Now, bind the new one
189+
self->extension = extension;
182190

183191
if (self->extension == NULL)
184192
return;
@@ -198,6 +206,8 @@ exm_extension_row_bind_extension (GObject *object,
198206
"error-msg", &error_msg,
199207
NULL);
200208

209+
self->uuid = g_strdup (uuid);
210+
201211
g_object_set (self, "title", name, "subtitle", uuid, NULL);
202212
g_object_set (self->prefs_btn, "visible", has_prefs, NULL);
203213
g_object_set (self->remove_btn, "visible", is_user, NULL);
@@ -214,11 +224,13 @@ exm_extension_row_bind_extension (GObject *object,
214224
gboolean has_error = (error_msg != NULL) && (strlen(error_msg) != 0);
215225
set_error_label_visible (self, has_error);
216226

217-
218227
gtk_actionable_set_action_target (GTK_ACTIONABLE (self->details_btn), "s", uuid);
219228

220229
// One way binding from extension ("source of truth") to switch
221-
g_signal_connect (self->extension, "notify::state", G_CALLBACK (update_state), self);
230+
self->signal_handler = g_signal_connect (self->extension,
231+
"notify::state",
232+
G_CALLBACK (update_state),
233+
self);
222234

223235
GAction *action;
224236

@@ -323,11 +335,6 @@ exm_extension_row_init (ExmExtensionRow *self)
323335

324336
gtk_widget_init_template (GTK_WIDGET (self));
325337

326-
g_signal_connect (self,
327-
"notify::extension",
328-
G_CALLBACK (exm_extension_row_bind_extension),
329-
NULL);
330-
331338
// Define Actions
332339
self->action_group = g_simple_action_group_new ();
333340

0 commit comments

Comments
 (0)