void gis_page_apply_begin (GisPage *page, GisPageApplyCallback callback, gpointer user_data) { GisPageClass *klass; GisPagePrivate *priv = gis_page_get_instance_private (page); g_return_if_fail (GIS_IS_PAGE (page)); g_return_if_fail (priv->applying == FALSE); klass = GIS_PAGE_GET_CLASS (page); priv->apply_cb = callback; priv->apply_data = user_data; priv->apply_cancel = g_cancellable_new (); priv->applying = TRUE; if (!klass->apply (page, priv->apply_cancel)) { /* Shortcut case where we don't want apply, to avoid flicker */ gis_page_apply_complete (page, TRUE); } g_object_notify_by_pspec (G_OBJECT (page), obj_props[PROP_APPLYING]); }
void gis_page_apply_complete (GisPage *page, gboolean valid) { GisPageApplyCallback callback; gpointer user_data; GisPagePrivate *priv = gis_page_get_instance_private (page); g_return_if_fail (GIS_IS_PAGE (page)); g_return_if_fail (priv->applying == TRUE); callback = priv->apply_cb; priv->apply_cb = NULL; user_data = priv->apply_data; priv->apply_data = NULL; g_clear_object (&priv->apply_cancel); priv->applying = FALSE; g_object_notify_by_pspec (G_OBJECT (page), obj_props[PROP_APPLYING]); if (callback) (callback) (page, valid, user_data); /* Matches ref in gis_page_apply_begin() */ g_object_unref (page); }