diff options
| author | Victor Kareh <[email protected]> | 2025-09-22 22:23:09 +0000 |
|---|---|---|
| committer | GitHub <[email protected]> | 2025-09-22 22:23:09 +0000 |
| commit | cf2f458dd8b70450c3fdffb10d4a45c8c369b3e9 (patch) | |
| tree | 1bfd5fb81bf88684653315aaad11f37532ab4fa9 /applets/clock/calendar-window.c | |
| parent | d68c23bd8e07612f305dcc7825f3a8ee448544f5 (diff) | |
| download | mate-panel-cf2f458dd8b70450c3fdffb10d4a45c8c369b3e9.tar.bz2 mate-panel-cf2f458dd8b70450c3fdffb10d4a45c8c369b3e9.tar.xz | |
clock: Store calendar client in ClockData (#1516)
* clock: Store calendar client in ClockData
This simplifies the evolution calendar client architecture and makes the
popup show up faster, since we don't need to create a new one every time
we open it.
* clock: Fix calendar data refresh when opening popup
The calendar popup was not showing recently added Evolution
events/tasks. Added a refresh timeout call every time the calendar popup
opens. That way the popup opens immediately and the data is refresh
after a small delay.
Diffstat (limited to 'applets/clock/calendar-window.c')
| -rw-r--r-- | applets/clock/calendar-window.c | 107 |
1 files changed, 59 insertions, 48 deletions
diff --git a/applets/clock/calendar-window.c b/applets/clock/calendar-window.c index ae9f1d7c..9f794dce 100644 --- a/applets/clock/calendar-window.c +++ b/applets/clock/calendar-window.c @@ -447,10 +447,6 @@ calendar_window_fill (CalendarWindow *calwin) calwin->priv->calendar = calendar_window_create_calendar (calwin); gtk_widget_show (calwin->priv->calendar); -#ifdef HAVE_EDS - /* Calendar client will be initialized later in calendar_window_pack_pim */ -#endif - if (!calwin->priv->invert_order) { gtk_box_pack_start (GTK_BOX (vbox), calwin->priv->calendar, TRUE, FALSE, 0); @@ -597,7 +593,8 @@ calendar_window_dispose (GObject *object) calwin->priv->client_tasks_changed_id = 0; } g_signal_handlers_disconnect_by_data (calwin->priv->client, calwin); - g_object_unref (calwin->priv->client); + + /* Client is owned by ClockData, don't unref it */ calwin->priv->client = NULL; } #endif @@ -714,12 +711,32 @@ calendar_window_new (time_t *static_current_time, return GTK_WIDGET (calwin); } +#ifdef HAVE_EDS +static void +refresh_once (gpointer user_data) +{ + CalendarWindow *calwin = CALENDAR_WINDOW (user_data); + if (calwin->priv->client) { + calendar_client_update_appointments (calwin->priv->client); + calendar_client_update_tasks (calwin->priv->client); + + handle_appointments_changed (calwin); + handle_tasks_changed (calwin); + } +} +#endif + void calendar_window_refresh (CalendarWindow *calwin) { g_return_if_fail (CALENDAR_IS_WINDOW (calwin)); #ifdef HAVE_EDS + /* Reload evolution calendar data after a small delay to not slow down the UI */ + if (calwin->priv->client) { + g_timeout_add_once (100, refresh_once, calwin); + } + if (calwin->priv->appointments_filter && calwin->priv->appointment_list) gtk_tree_model_filter_refilter (calwin->priv->appointments_filter); @@ -1137,30 +1154,22 @@ calendar_window_pack_pim (CalendarWindow *calwin, return; } - /* Initialize calendar client if not already done */ - if (!calwin->priv->client && calwin->priv->settings) { - calwin->priv->client = calendar_client_new (calwin->priv->settings); - - if (calwin->priv->client) { - if (show_calendar_events) { - calwin->priv->client_appointments_changed_id = g_signal_connect_swapped (calwin->priv->client, - "appointments-changed", - G_CALLBACK (handle_appointments_changed), - calwin); - } - if (show_tasks) { - calwin->priv->client_tasks_changed_id = g_signal_connect_swapped (calwin->priv->client, - "tasks-changed", - G_CALLBACK (handle_tasks_changed), - calwin); - } + /* Connect signals if client is available */ + if (calwin->priv->client) { + if (show_calendar_events && calwin->priv->client_appointments_changed_id == 0) { + calwin->priv->client_appointments_changed_id = g_signal_connect_swapped (calwin->priv->client, + "appointments-changed", + G_CALLBACK (handle_appointments_changed), + calwin); + } + if (show_tasks && calwin->priv->client_tasks_changed_id == 0) { + calwin->priv->client_tasks_changed_id = g_signal_connect_swapped (calwin->priv->client, + "tasks-changed", + G_CALLBACK (handle_tasks_changed), + calwin); } } - if (!calwin->priv->client) { - g_warning ("Failed to create calendar client in calendar_window_pack_pim"); - return; - } /* Create and pack appointments list if enabled */ if (show_calendar_events) { @@ -1187,28 +1196,6 @@ calendar_window_pack_pim (CalendarWindow *calwin, calwin->priv->task_list, TRUE, TRUE, 0); } - - /* Initialize calendar client with current date now that client is ready */ - if (calwin->priv->client && calwin->priv->calendar) { - guint year, month, day; - gtk_calendar_get_date (GTK_CALENDAR (calwin->priv->calendar), &year, &month, &day); - /* Set a flag to indicate we're initializing to prevent redundant calls */ - g_object_set_data (G_OBJECT (calwin), "initializing", GINT_TO_POINTER (1)); - - calendar_client_select_month (calwin->priv->client, month, year); - calendar_client_select_day (calwin->priv->client, day); - - /* Clear the initialization flag and trigger initial load */ - g_object_set_data (G_OBJECT (calwin), "initializing", GINT_TO_POINTER (0)); - - /* Now trigger the initial appointments and tasks load */ - if (show_calendar_events) { - handle_appointments_changed (calwin); - } - if (show_tasks) { - handle_tasks_changed (calwin); - } - } } static gboolean @@ -1742,4 +1729,28 @@ task_entry_activate_cb (GtkEntry *entry, } } +void +calendar_window_set_client (CalendarWindow *calwin, CalendarClient *client) +{ + g_return_if_fail (CALENDAR_IS_WINDOW (calwin)); + calwin->priv->client = client; + + /* If we have a client, initialize the calendar data */ + if (client && calwin->priv->calendar) { + guint year, month, day; + gtk_calendar_get_date (GTK_CALENDAR (calwin->priv->calendar), &year, &month, &day); + + calendar_client_select_month (calwin->priv->client, month, year); + calendar_client_select_day (calwin->priv->client, day); + + /* Trigger initial data load if widgets exist */ + if (calwin->priv->appointment_list) { + handle_appointments_changed (calwin); + } + if (calwin->priv->task_list) { + handle_tasks_changed (calwin); + } + } +} + #endif /* HAVE_EDS */ |
