diff options
author | Colomban Wendling <[email protected]> | 2022-06-07 19:19:44 +0200 |
---|---|---|
committer | Luke from DC <[email protected]> | 2022-06-08 00:42:02 +0000 |
commit | 764395ea7d56c79920fa5c75956096a713675848 (patch) | |
tree | 5daaeb02ffade174387dfdee193ea3eeb1c4266b | |
parent | 7e110ff93a2d6c89f87a4bbb79adf4d9a33c19d0 (diff) | |
download | caja-764395ea7d56c79920fa5c75956096a713675848.tar.bz2 caja-764395ea7d56c79920fa5c75956096a713675848.tar.xz |
caja-file-conflict-dialog: Move to automatic signal disconnection
Instead of manually keeping tabs on the signals so we can disconnect
them before the data parameter gets destroyed, let GObject
automatically track lifetime of the data, which it can do as that data
is a GObject itself.
This does not change behavior in the normal case, but makes sure the
callback simply cannot get called with invalid/freed parameters, even
if we did screw anything up (which we used to).
This actually would have solved #1630 as well with using the target
widgets as data parameters as the signal would have been disconnected
as soon as the widget got destroyed, no matter whether we got finalized
ourselves or not.
The signal IDs were also use as guards to whether the monitor was set
up for the related files, but we can just as well use the state of the
file list ready handle which should only be NULL when we actually have
monitors set up. Even if it wasn't the case, worse case scenario would
be removing a non-existent monitor, which is perfectly OK anyway.
-rw-r--r-- | libcaja-private/caja-file-conflict-dialog.c | 31 |
1 files changed, 11 insertions, 20 deletions
diff --git a/libcaja-private/caja-file-conflict-dialog.c b/libcaja-private/caja-file-conflict-dialog.c index b58fda13..52be122f 100644 --- a/libcaja-private/caja-file-conflict-dialog.c +++ b/libcaja-private/caja-file-conflict-dialog.c @@ -46,8 +46,6 @@ struct _CajaFileConflictDialogPrivate gchar *conflict_name; CajaFileListHandle *handle; - gulong src_handler_id; - gulong dest_handler_id; /* UI objects */ GtkWidget *titles_vbox; @@ -361,12 +359,12 @@ file_list_ready_cb (GList *files, caja_file_monitor_add (src, fcd, CAJA_FILE_ATTRIBUTES_FOR_ICON); caja_file_monitor_add (dest, fcd, CAJA_FILE_ATTRIBUTES_FOR_ICON); - details->src_handler_id = g_signal_connect (src, "changed", - G_CALLBACK (file_icons_changed), - fcd->details->src_image); - details->dest_handler_id = g_signal_connect (dest, "changed", - G_CALLBACK (file_icons_changed), - fcd->details->dest_image); + g_signal_connect_object (src, "changed", + G_CALLBACK (file_icons_changed), + fcd->details->src_image, 0); + g_signal_connect_object (dest, "changed", + G_CALLBACK (file_icons_changed), + fcd->details->dest_image, 0); } static void @@ -682,19 +680,12 @@ do_dispose (GObject *self) caja_file_list_cancel_call_when_ready (details->handle); details->handle = NULL; } - - if (details->src_handler_id) - { - g_signal_handler_disconnect (details->source, details->src_handler_id); - caja_file_monitor_remove (details->source, self); - details->src_handler_id = 0; - } - - if (details->dest_handler_id) + else { - g_signal_handler_disconnect (details->destination, details->dest_handler_id); - caja_file_monitor_remove (details->destination, self); - details->dest_handler_id = 0; + if (details->source) + caja_file_monitor_remove (details->source, self); + if (details->destination) + caja_file_monitor_remove (details->destination, self); } g_clear_pointer (&details->source, caja_file_unref); |