From 5a651b01f8fdd46ad9002763fced8e923261cab4 Mon Sep 17 00:00:00 2001 From: Georges Basile Stavracas Neto Date: Sat, 27 Jan 2018 21:46:15 -0200 Subject: [PATCH] window: Rework property initialization There is a clear chain of properties that must be respected in order to make Calendar initialize properly: 1. GcalManager, since it provider access to the settings 2. The initial date 3. GcalWeatherService, that depends on settings and the initial date --- src/gcal-application.c | 76 +++++++++++++++++++++++++++++++++++++----- src/gcal-window.c | 64 ++++++++++++++++++++++++----------- 2 files changed, 112 insertions(+), 28 deletions(-) diff --git a/src/gcal-application.c b/src/gcal-application.c index 4c8edbd2..772864a2 100644 --- a/src/gcal-application.c +++ b/src/gcal-application.c @@ -114,6 +114,16 @@ static const GActionEntry gcal_app_entries[] = { { "quit", gcal_application_quit }, }; +enum +{ + PROP_0, + PROP_MANAGER, + PROP_WEATHER_SERVICE, + N_PROPS +}; + +static GParamSpec* properties[N_PROPS] = { NULL, }; + static void process_sources (GcalApplication *self) { @@ -207,6 +217,33 @@ gcal_application_finalize (GObject *object) GCAL_EXIT; } +static void +gcal_application_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + GcalApplication *self = GCAL_APPLICATION (object); + + switch (property_id) + { + case PROP_MANAGER: + g_value_set_object (value, self->manager); + break; + + case PROP_WEATHER_SERVICE: + g_value_set_object (value, self->weather_service); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + } +} + +/* + * GApplication overrides + */ + static void gcal_application_activate (GApplication *application) { @@ -230,13 +267,22 @@ gcal_application_activate (GApplication *application) { if (!self->initial_date) { + icaltimezone *tz; + + tz = gcal_manager_get_system_timezone (self->manager); + self->initial_date = g_new0 (icaltimetype, 1); - *(self->initial_date) = icaltime_current_time_with_zone (gcal_manager_get_system_timezone (self->manager)); - *(self->initial_date) = icaltime_set_timezone (self->initial_date, - gcal_manager_get_system_timezone (self->manager)); + *self->initial_date = icaltime_current_time_with_zone (tz); + *self->initial_date = icaltime_set_timezone (self->initial_date, tz); } - self->window = gcal_window_new_with_date (GCAL_APPLICATION (application), self->initial_date); + self->window = g_object_new (GCAL_TYPE_WINDOW, + "application", self, + "manager", self->manager, + "active-date", self->initial_date, + "weather-service", self->weather_service, + NULL); + g_signal_connect (self->window, "destroy", G_CALLBACK (gtk_widget_destroyed), &self->window); gtk_widget_show (self->window); } @@ -251,7 +297,7 @@ gcal_application_activate (GApplication *application) if (self->uuid != NULL) { gcal_window_open_event_by_uuid (GCAL_WINDOW (self->window), self->uuid); - g_clear_pointer (&(self->uuid), g_free); + g_clear_pointer (&self->uuid, g_free); } GCAL_EXIT; @@ -370,9 +416,9 @@ gcal_application_dbus_register (GApplication *application, } static void -gcal_application_dbus_unregister (GApplication *application, +gcal_application_dbus_unregister (GApplication *application, GDBusConnection *connection, - const gchar *object_path) + const gchar *object_path) { GcalApplication *self; g_autofree gchar *search_provider_path = NULL; @@ -393,15 +439,29 @@ gcal_application_class_init (GcalApplicationClass *klass) object_class = G_OBJECT_CLASS (klass); object_class->finalize = gcal_application_finalize; + object_class->get_property = gcal_application_get_property; application_class = G_APPLICATION_CLASS (klass); application_class->activate = gcal_application_activate; application_class->startup = gcal_application_startup; application_class->command_line = gcal_application_command_line; application_class->handle_local_options = gcal_application_handle_local_options; - application_class->dbus_register = gcal_application_dbus_register; application_class->dbus_unregister = gcal_application_dbus_unregister; + + properties[PROP_MANAGER] = g_param_spec_object ("manager", + "The manager object", + "The manager object", + GCAL_TYPE_MANAGER, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + + properties[PROP_WEATHER_SERVICE] = g_param_spec_object ("weather-service", + "The weather service object", + "The weather service object", + GCAL_TYPE_WEATHER_SERVICE, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (object_class, N_PROPS, properties); } static void diff --git a/src/gcal-window.c b/src/gcal-window.c index f1efd5db..8b6e2ebf 100644 --- a/src/gcal-window.c +++ b/src/gcal-window.c @@ -1223,6 +1223,11 @@ schedule_open_edit_dialog_by_uuid (OpenEditDialogData *edit_dialog_data) return G_SOURCE_CONTINUE; } + +/* + * GObject overrides + */ + static void gcal_window_finalize (GObject *object) { @@ -1261,6 +1266,23 @@ gcal_window_finalize (GObject *object) GCAL_EXIT; } +static void +gcal_window_constructed (GObject *object) +{ + GcalWindow *self; + + GCAL_ENTRY; + + self = GCAL_WINDOW (object); + + G_OBJECT_CLASS (gcal_window_parent_class)->constructed (object); + + /* Load saved geometry *after* the construct-time properties are set */ + load_geometry (self); + + GCAL_EXIT; +} + static void gcal_window_set_property (GObject *object, guint property_id, @@ -1319,6 +1341,11 @@ gcal_window_set_property (GObject *object, } break; + case PROP_WEATHER_SERVICE: + if (g_set_object (&self->weather_service, g_value_get_object (value))) + g_object_notify_by_pspec (object, properties[PROP_WEATHER_SERVICE]); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); } @@ -1361,6 +1388,11 @@ gcal_window_get_property (GObject *object, } } + +/* + * GtkWidget overrides + */ + static gboolean gcal_window_configure_event (GtkWidget *widget, GdkEventConfigure *event) @@ -1397,6 +1429,7 @@ gcal_window_class_init (GcalWindowClass *klass) object_class = G_OBJECT_CLASS (klass); object_class->finalize = gcal_window_finalize; + object_class->constructed = gcal_window_constructed; object_class->set_property = gcal_window_set_property; object_class->get_property = gcal_window_get_property; @@ -1421,7 +1454,7 @@ gcal_window_class_init (GcalWindowClass *klass) "The manager object", "The manager object", GCAL_TYPE_MANAGER, - G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); properties[PROP_NEW_EVENT_MODE] = g_param_spec_boolean ("new-event-mode", "New Event mode", @@ -1433,7 +1466,7 @@ gcal_window_class_init (GcalWindowClass *klass) "The weather service object", "The weather service object", GCAL_TYPE_WEATHER_SERVICE, - G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); g_object_class_install_properties (object_class, N_PROPS, properties); @@ -1572,10 +1605,10 @@ gcal_window_init (GcalWindow *self) g_object_bind_property (self, "manager", self->month_view, "manager", G_BINDING_DEFAULT); g_object_bind_property (self, "manager", self->year_view, "manager", G_BINDING_DEFAULT); g_object_bind_property (self, "manager", self->quick_add_popover, "manager", G_BINDING_DEFAULT); - g_object_bind_property (self, "weather-service", self->weather_settings, "weather-service", G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE); - g_object_bind_property (self, "weather-service", self->month_view, "weather-service", G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE); - g_object_bind_property (self, "weather-service", self->week_view, "weather-service", G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE); - g_object_bind_property (self, "weather-service", self->year_view, "weather-service", G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE); + g_object_bind_property (self, "weather-service", self->weather_settings, "weather-service", G_BINDING_DEFAULT); + g_object_bind_property (self, "weather-service", self->month_view, "weather-service", G_BINDING_DEFAULT); + g_object_bind_property (self, "weather-service", self->week_view, "weather-service", G_BINDING_DEFAULT); + g_object_bind_property (self, "weather-service", self->year_view, "weather-service", G_BINDING_DEFAULT); /* setup accels */ gcal_window_add_accelerator (app, "win.change-view(-1)", "Page_Down"); @@ -1599,20 +1632,11 @@ GtkWidget* gcal_window_new_with_date (GcalApplication *app, icaltimetype *date) { - GcalManager *manager; - GcalWindow *win; - - manager = gcal_application_get_manager (GCAL_APPLICATION (app)); - win = g_object_new (GCAL_TYPE_WINDOW, - "application", GTK_APPLICATION (app), - "manager", manager, - "active-date", date, - NULL); - - /* loading size */ - load_geometry (win); - - return GTK_WIDGET (win); + return g_object_new (GCAL_TYPE_WINDOW, + "application", GTK_APPLICATION (app), + "manager", gcal_application_get_manager (GCAL_APPLICATION (app)), + "active-date", date, + NULL); } /* new-event interaction: first variant */