region: Cancel any async operations with callbacks on finalize
Otherwise we may end up using a finalized "object" in the callbacks. https://bugzilla.gnome.org/show_bug.cgi?id=695534
This commit is contained in:
parent
e2163ea9ed
commit
3efb71bab7
1 changed files with 16 additions and 5 deletions
|
@ -83,6 +83,7 @@ struct _CcRegionPanelPrivate {
|
||||||
GPermission *permission;
|
GPermission *permission;
|
||||||
SystemOp op;
|
SystemOp op;
|
||||||
GDBusProxy *localed;
|
GDBusProxy *localed;
|
||||||
|
GCancellable *cancellable;
|
||||||
|
|
||||||
GtkWidget *overlay;
|
GtkWidget *overlay;
|
||||||
GtkWidget *notification;
|
GtkWidget *notification;
|
||||||
|
@ -127,6 +128,9 @@ cc_region_panel_finalize (GObject *object)
|
||||||
CcRegionPanel *self = CC_REGION_PANEL (object);
|
CcRegionPanel *self = CC_REGION_PANEL (object);
|
||||||
CcRegionPanelPrivate *priv = self->priv;
|
CcRegionPanelPrivate *priv = self->priv;
|
||||||
|
|
||||||
|
g_cancellable_cancel (priv->cancellable);
|
||||||
|
g_clear_object (&priv->cancellable);
|
||||||
|
|
||||||
if (priv->user_manager) {
|
if (priv->user_manager) {
|
||||||
g_signal_handlers_disconnect_by_data (priv->user_manager, self);
|
g_signal_handlers_disconnect_by_data (priv->user_manager, self);
|
||||||
priv->user_manager = NULL;
|
priv->user_manager = NULL;
|
||||||
|
@ -1510,17 +1514,22 @@ localed_proxy_ready (GObject *source,
|
||||||
gpointer data)
|
gpointer data)
|
||||||
{
|
{
|
||||||
CcRegionPanel *self = data;
|
CcRegionPanel *self = data;
|
||||||
CcRegionPanelPrivate *priv = self->priv;
|
CcRegionPanelPrivate *priv;
|
||||||
|
GDBusProxy *proxy;
|
||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
|
|
||||||
priv->localed = g_dbus_proxy_new_finish (res, &error);
|
proxy = g_dbus_proxy_new_finish (res, &error);
|
||||||
|
|
||||||
if (!priv->localed) {
|
if (!proxy) {
|
||||||
g_warning ("Failed to contact localed: %s\n", error->message);
|
if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
|
||||||
|
g_warning ("Failed to contact localed: %s\n", error->message);
|
||||||
g_error_free (error);
|
g_error_free (error);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
priv = self->priv;
|
||||||
|
priv->localed = proxy;
|
||||||
|
|
||||||
gtk_widget_set_sensitive (priv->login_button, TRUE);
|
gtk_widget_set_sensitive (priv->login_button, TRUE);
|
||||||
|
|
||||||
g_signal_connect (priv->localed, "g-properties-changed",
|
g_signal_connect (priv->localed, "g-properties-changed",
|
||||||
|
@ -1569,7 +1578,7 @@ setup_login_button (CcRegionPanel *self)
|
||||||
"org.freedesktop.locale1",
|
"org.freedesktop.locale1",
|
||||||
"/org/freedesktop/locale1",
|
"/org/freedesktop/locale1",
|
||||||
"org.freedesktop.locale1",
|
"org.freedesktop.locale1",
|
||||||
NULL,
|
priv->cancellable,
|
||||||
(GAsyncReadyCallback) localed_proxy_ready,
|
(GAsyncReadyCallback) localed_proxy_ready,
|
||||||
self);
|
self);
|
||||||
g_object_unref (bus);
|
g_object_unref (bus);
|
||||||
|
@ -1609,6 +1618,8 @@ cc_region_panel_init (CcRegionPanel *self)
|
||||||
|
|
||||||
priv->user_manager = act_user_manager_get_default ();
|
priv->user_manager = act_user_manager_get_default ();
|
||||||
|
|
||||||
|
priv->cancellable = g_cancellable_new ();
|
||||||
|
|
||||||
setup_login_button (self);
|
setup_login_button (self);
|
||||||
setup_language_section (self);
|
setup_language_section (self);
|
||||||
setup_input_section (self);
|
setup_input_section (self);
|
||||||
|
|
Loading…
Add table
Reference in a new issue