From 014bcfddc57958357cf6a4bd51c7ef8197cb2704 Mon Sep 17 00:00:00 2001 From: Georges Basile Stavracas Neto Date: Sat, 18 Mar 2017 12:05:34 -0300 Subject: [PATCH 1/5] doc: add skeleton documentation This adds API documentation, generated at compile time. --- .gitignore | 8 +- Makefile.am | 8 +- autogen.sh | 1 + configure.ac | 16 + doc/Makefile.am | 1 + doc/reference/Makefile.am | 101 + doc/reference/gnome-calendar-decl-list.txt | 555 ++++ doc/reference/gnome-calendar-decl.txt | 2389 +++++++++++++++++ doc/reference/gnome-calendar-docs.sgml | 69 + doc/reference/gnome-calendar-overrides.txt | 0 doc/reference/gnome-calendar-sections.txt | 581 ++++ doc/reference/gnome-calendar-undeclared.txt | 0 doc/reference/gnome-calendar-undocumented.txt | 351 +++ doc/reference/gnome-calendar-unused.txt | 10 + doc/reference/gnome-calendar.args | 470 ++++ doc/reference/gnome-calendar.hierarchy | 156 ++ doc/reference/gnome-calendar.interfaces | 56 + doc/reference/gnome-calendar.prerequisites | 19 + doc/reference/gnome-calendar.signals | 213 ++ doc/reference/gnome-calendar.types | 31 + doc/reference/version.xml.in | 1 + src/Makefile.am | 17 + 22 files changed, 5048 insertions(+), 5 deletions(-) create mode 100644 doc/Makefile.am create mode 100644 doc/reference/Makefile.am create mode 100644 doc/reference/gnome-calendar-decl-list.txt create mode 100644 doc/reference/gnome-calendar-decl.txt create mode 100644 doc/reference/gnome-calendar-docs.sgml create mode 100644 doc/reference/gnome-calendar-overrides.txt create mode 100644 doc/reference/gnome-calendar-sections.txt create mode 100644 doc/reference/gnome-calendar-undeclared.txt create mode 100644 doc/reference/gnome-calendar-undocumented.txt create mode 100644 doc/reference/gnome-calendar-unused.txt create mode 100644 doc/reference/gnome-calendar.args create mode 100644 doc/reference/gnome-calendar.hierarchy create mode 100644 doc/reference/gnome-calendar.interfaces create mode 100644 doc/reference/gnome-calendar.prerequisites create mode 100644 doc/reference/gnome-calendar.signals create mode 100644 doc/reference/gnome-calendar.types create mode 100644 doc/reference/version.xml.in diff --git a/.gitignore b/.gitignore index 10efba54..01c53e23 100644 --- a/.gitignore +++ b/.gitignore @@ -87,9 +87,13 @@ data/org.gnome.Calendar.search-provider.ini.in data/org.gnome.Calendar.service data/appdata/org.gnome.Calendar.appdata.xml src/gcal-debug.h -tags +tags* src/tags src/views/tags src/views/.dirstamp *.goutputstream* -tags* +gtk-doc.make +doc/reference/xml +doc/reference/html +doc/reference/*.stamp +doc/reference/*.xml diff --git a/Makefile.am b/Makefile.am index f99b9829..17cbfd7d 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,5 +1,5 @@ -SUBDIRS = src data po -DIST_SUBDIRS = src data po +SUBDIRS = src data po doc +DIST_SUBDIRS = src data po doc INTLTOOL_FILES = \ intltool-extract.in \ @@ -21,7 +21,9 @@ DISTCLEANFILES = \ intltool-update \ po/.intltool-merge-cache -DISTCHECK_CONFIGURE_FLAGS = --enable-appstream-util +DISTCHECK_CONFIGURE_FLAGS = \ + --enable-appstream-util \ + --disable-gtk-doc # Remove doc directory on uninstall uninstall-local: diff --git a/autogen.sh b/autogen.sh index 96b5d8d5..b56d2225 100755 --- a/autogen.sh +++ b/autogen.sh @@ -11,6 +11,7 @@ cd $srcdir mkdir -p m4 autoreconf --verbose --force --install || exit $? intltoolize --force --copy --automake || exit $? +gtkdocize || exit 1 if test -z "$NOCONFIGURE"; then run_configure=true diff --git a/configure.ac b/configure.ac index cb8ad351..92dc0c80 100644 --- a/configure.ac +++ b/configure.ac @@ -123,6 +123,18 @@ AC_SUBST(DEBUG_CFLAGS) BUGREPORT_URL=calendar_bugreport_url AC_SUBST(BUGREPORT_URL) +dnl ================================================================ +dnl Documentation +dnl ================================================================ +GTK_DOC_CHECK([1.14],[--flavour no-tmpl]) +AM_CONDITIONAL(ENABLE_GTK_DOC, test "x$enable_gtk_doc" = "xyes") +AC_ARG_ENABLE(doc-cross-references, + AS_HELP_STRING([--disable-doc-cross-references], + [cross reference symbols from other libraries @<:@default=yes@:>@]), + enable_doc_cross_references=$enableval, + enable_doc_cross_references=yes) +AM_CONDITIONAL(ENABLE_DOC_CROSS_REFERENCES, test x$enable_doc_cross_references != xno) + dnl ================================================================ dnl Misc dnl ================================================================ @@ -163,6 +175,9 @@ AC_CONFIG_FILES([ data/org.gnome.Calendar.desktop.in data/org.gnome.Calendar.search-provider.ini.in data/icons/Makefile + doc/Makefile + doc/reference/Makefile + doc/reference/version.xml po/Makefile.in ]) @@ -181,6 +196,7 @@ echo " Development options Enable Debug ..................... ${enable_debug} Enable Tracing ................... ${enable_tracing} + Enable Documentation ............. ${enable_gtk_doc} Now type 'make' to build $PACKAGE " diff --git a/doc/Makefile.am b/doc/Makefile.am new file mode 100644 index 00000000..f3ddc22d --- /dev/null +++ b/doc/Makefile.am @@ -0,0 +1 @@ +SUBDIRS = reference diff --git a/doc/reference/Makefile.am b/doc/reference/Makefile.am new file mode 100644 index 00000000..a1e6351a --- /dev/null +++ b/doc/reference/Makefile.am @@ -0,0 +1,101 @@ +## Process this file with automake to produce Makefile.in + +# see /gtk-doc/examples/Makefile.am + +# We require automake 1.6 at least. +AUTOMAKE_OPTIONS = 1.6 + +# The name of the module, e.g. 'glib'. +DOC_MODULE=gnome-calendar + +# The top-level SGML file. You can change this if you want to. +DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.sgml + +# The directory containing the source code. Relative to $(srcdir). +# gtk-doc will search all .c & .h files beneath here for inline comments +# documenting the functions and macros. +DOC_SOURCE_DIR=$(top_srcdir)/src + +# Extra options to pass to gtkdoc-scangobj. Not normally needed. +SCANGOBJ_OPTIONS= + +# Extra options to supply to gtkdoc-scan. +# e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED" +SCAN_OPTIONS=--rebuild-types + +# Extra options to supply to gtkdoc-mkdb. +MKDB_OPTIONS=--sgml-mode --output-format=xml + +# Extra options to supply to gtkdoc-mktmpl +# e.g. MKTMPL_OPTIONS=--only-section-tmpl +MKTMPL_OPTIONS= + +if ENABLE_DOC_CROSS_REFERENCES +# Extra options to supply to gtkdoc-fixref. Not normally needed. +# e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html +FIXXREF_OPTIONS = \ + --extra-dir=$(GLIB_PREFIX)/share/gtk-doc/html/glib \ + --extra-dir=$(GLIB_PREFIX)/share/gtk-doc/html/gobject \ + --extra-dir=$(GLIB_PREFIX)/share/gtk-doc/html/gio \ + --extra-dir=$(GTK_PREFIX)/share/gtk-doc/html/gdk \ + --extra-dir=$(GTK_PREFIX)/share/gtk-doc/html/gtk +endif + +# Used for dependencies. The docs will be rebuilt if any of these change. +HFILE_GLOB = \ + $(top_srcdir)/src/gcal*.h \ + $(top_srcdir)/src/*/gcal-*.h \ + $(NULL) +CFILE_GLOB = \ + $(top_srcdir)/src/gcal*.c \ + $(top_srcdir)/src/*/gcal-*.c \ + $(NULL) + +# Header files to ignore when scanning. +IGNORE_HFILES = $(NULL) + +# Images to copy into HTML directory. +HTML_IMAGES = $(NULL) + +# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE). +# e.g. content_files=running.sgml building.sgml changes-2.0.sgml +content_files = version.xml + +# SGML files where gtk-doc abbrevations (#GtkWidget) are expanded +# These files must be listed here *and* in content_files +# e.g. expand_content_files=running.sgml +expand_content_files= + +# CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library. +# Only needed if you are using gtkdoc-scangobj to dynamically query widget +# signals and properties. +GTKDOC_CFLAGS = \ + -I$(top_srcdir)/src \ + -I$(top_builddir)/src \ + $(CALENDAR_CFLAGS) + +GTKDOC_LIBS = \ + $(CALENDAR_LIBS) \ + $(top_builddir)/src/libgcal.la + +# This includes the standard gtk-doc make rules, copied by gtkdocize. +include $(top_srcdir)/gtk-doc.make + +# Other files to distribute +EXTRA_DIST += version.xml.in + + +if ENABLE_GTK_DOC + +TESTS_ENVIRONMENT = \ + SRCDIR=$(abs_srcdir) \ + BUILDDIR=$(abs_builddir) \ + DOC_MODULE=$(DOC_MODULE) \ + DOC_MAIN_SGML_FILE=$(DOC_MAIN_SGML_FILE) + +check-local: $(GTKDOC_CHECK) + @$(TESTS_ENVIRONMENT) ./$(GTKDOC_CHECK) + +endif + +-include $(top_srcdir)/git.mk diff --git a/doc/reference/gnome-calendar-decl-list.txt b/doc/reference/gnome-calendar-decl-list.txt new file mode 100644 index 00000000..d9c201e3 --- /dev/null +++ b/doc/reference/gnome-calendar-decl-list.txt @@ -0,0 +1,555 @@ +
+css-code +CSS_TEMPLATE +
+ +
+e-cal-data-model +ECalDataModel +ECalDataModelViewState +EThreadJobFunc +e_cal_data_model_new +e_cal_data_model_new_clone +e_cal_data_model_submit_thread_job +e_cal_data_model_get_disposing +e_cal_data_model_set_disposing +e_cal_data_model_get_expand_recurrences +e_cal_data_model_set_expand_recurrences +e_cal_data_model_get_timezone +e_cal_data_model_set_timezone +e_cal_data_model_set_filter +e_cal_data_model_dup_filter +e_cal_data_model_add_client +e_cal_data_model_remove_client +e_cal_data_model_ref_client +e_cal_data_model_get_clients +e_cal_data_model_get_components +ECalDataModelForeachFunc +e_cal_data_model_foreach_component +e_cal_data_model_subscribe +e_cal_data_model_unsubscribe +e_cal_data_model_get_subscriber_range +e_cal_data_model_freeze_views_update +e_cal_data_model_thaw_views_update +e_cal_data_model_is_views_update_frozen + +ECalDataModel +ECalDataModelClass +ECalDataModelPrivate +E_CAL_DATA_MODEL +E_CAL_DATA_MODEL_CLASS +E_CAL_DATA_MODEL_GET_CLASS +E_IS_CAL_DATA_MODEL +E_IS_CAL_DATA_MODEL_CLASS +E_TYPE_CAL_DATA_MODEL +e_cal_data_model_get_type +
+ +
+e-cal-data-model-subscriber +ECalDataModelSubscriber +e_cal_data_model_subscriber_component_added +e_cal_data_model_subscriber_component_modified +e_cal_data_model_subscriber_component_removed +e_cal_data_model_subscriber_freeze +e_cal_data_model_subscriber_thaw + +ECalDataModelSubscriber +ECalDataModelSubscriberInterface +E_CAL_DATA_MODEL_SUBSCRIBER +E_CAL_DATA_MODEL_SUBSCRIBER_GET_INTERFACE +E_CAL_DATA_MODEL_SUBSCRIBER_INTERFACE +E_IS_CAL_DATA_MODEL_SUBSCRIBER +E_IS_CAL_DATA_MODEL_SUBSCRIBER_INTERFACE +E_TYPE_CAL_DATA_MODEL_SUBSCRIBER +e_cal_data_model_subscriber_get_type +
+ +
+gcal-application +GCAL_TYPE_APPLICATION +gcal_application_new +gcal_application_get_manager +gcal_application_get_settings +gcal_application_set_uuid +gcal_application_set_initial_date +GcalApplication +
+ +
+gcal-date-chooser +GcalDateChooserDayOptions +GCAL_TYPE_DATE_CHOOSER +GcalDateChooserDayOptionsCallback +gcal_date_chooser_new +gcal_date_chooser_get_date +gcal_date_chooser_set_date +gcal_date_chooser_set_day_options_callback +gcal_date_chooser_invalidate_day_options +gcal_date_chooser_get_no_month_change +gcal_date_chooser_set_no_month_change +gcal_date_chooser_get_show_heading +gcal_date_chooser_set_show_heading +gcal_date_chooser_get_show_day_names +gcal_date_chooser_set_show_day_names +gcal_date_chooser_get_show_week_numbers +gcal_date_chooser_set_show_week_numbers +GcalDateChooser +
+ +
+gcal-date-chooser-day +GCAL_TYPE_DATE_CHOOSER_DAY +gcal_date_chooser_day_new +gcal_date_chooser_day_get_date +gcal_date_chooser_day_set_date +gcal_date_chooser_day_set_other_month +gcal_date_chooser_day_set_selected +gcal_date_chooser_day_set_options +GcalDateChooserDay +
+ +
+gcal-date-selector +GCAL_TYPE_DATE_SELECTOR +gcal_date_selector_new +gcal_date_selector_get_date +gcal_date_selector_set_date +GcalDateSelector +
+ +
+gcal-debug +GCAL_ENABLE_TRACE +GCAL_LOG_LEVEL_TRACE +GCAL_TRACE_MSG +GCAL_PROBE +GCAL_TODO +GCAL_ENTRY +GCAL_EXIT +GCAL_GOTO +GCAL_RETURN +GCAL_BUG +
+ +
+gcal-edit-dialog +GCAL_RESPONSE_DELETE_EVENT +GCAL_RESPONSE_SAVE_EVENT +GCAL_RESPONSE_CREATE_EVENT +GCAL_TYPE_EDIT_DIALOG +gcal_edit_dialog_new +gcal_edit_dialog_set_event_is_new +gcal_edit_dialog_get_event +gcal_edit_dialog_set_event +gcal_edit_dialog_set_manager +gcal_edit_dialog_set_time_format +gcal_edit_dialog_get_date_end +gcal_edit_dialog_get_date_start +GcalEditDialog +
+ +
+gcal-enum-types + +GCAL_EDITABLE_PROPERTY +GCAL_WINDOW_VIEW_TYPE +event_editable_property_get_type +gcal_window_view_type_get_type +
+ +
+gcal-event +GcalEventError +GCAL_EVENT_ERROR +GCAL_TYPE_EVENT +gcal_event_error_quark +gcal_event_new +gcal_event_get_all_day +gcal_event_set_all_day +gcal_event_get_color +gcal_event_set_color +gcal_event_get_component +gcal_event_get_date_end +gcal_event_set_date_end +gcal_event_get_date_start +gcal_event_set_date_start +gcal_event_get_description +gcal_event_set_description +gcal_event_has_alarms +gcal_event_get_alarms +gcal_event_add_alarm +gcal_event_remove_alarm +gcal_event_get_location +gcal_event_set_location +gcal_event_get_source +gcal_event_set_source +gcal_event_get_summary +gcal_event_set_summary +gcal_event_get_timezone +gcal_event_set_timezone +gcal_event_get_uid +gcal_event_is_multiday +gcal_event_compare +gcal_event_compare_with_current +GcalEvent +
+ +
+gcal-event-widget +GCAL_TYPE_EVENT_WIDGET +gcal_event_widget_new +gcal_event_widget_get_event +gcal_event_widget_get_date_start +gcal_event_widget_set_date_start +gcal_event_widget_get_date_end +gcal_event_widget_set_date_end +gcal_event_widget_set_read_only +gcal_event_widget_get_read_only +gcal_event_widget_set_has_reminders +gcal_event_widget_get_has_reminders +gcal_event_widget_clone +gcal_event_widget_equal +gcal_event_widget_compare_by_length +gcal_event_widget_compare_by_start_date +GcalEventWidget +
+ +
+gcal-log +gcal_log_init +
+ +
+gcal-manager +GCAL_TYPE_MANAGER +gcal_manager_new_with_settings +gcal_manager_get_source +gcal_manager_get_sources +gcal_manager_get_sources_connected +gcal_manager_get_default_source +gcal_manager_set_default_source +gcal_manager_get_system_timezone +gcal_manager_set_subscriber +gcal_manager_set_search_subscriber +gcal_manager_set_query +gcal_manager_query_client_data +gcal_manager_refresh +gcal_manager_is_client_writable +gcal_manager_create_event +gcal_manager_update_event +gcal_manager_remove_event +gcal_manager_move_event_to_source +gcal_manager_add_source +gcal_manager_enable_source +gcal_manager_disable_source +gcal_manager_save_source +gcal_manager_get_events +gcal_manager_get_loading +gcal_manager_get_goa_client +gcal_manager_get_event_from_shell_search +gcal_manager_setup_shell_search +gcal_manager_set_shell_search_query +gcal_manager_set_shell_search_subscriber +gcal_manager_shell_search_done +gcal_manager_get_shell_search_events +GcalManager +
+ +
+gcal-month-view +GCAL_TYPE_MONTH_VIEW +gcal_month_view_set_first_weekday +gcal_month_view_set_use_24h_format +gcal_month_view_set_manager +GcalMonthView +
+ +
+gcal-multi-choice +GCAL_TYPE_MULTI_CHOICE +gcal_multi_choice_new +gcal_multi_choice_get_value +gcal_multi_choice_set_value +gcal_multi_choice_set_choices +GcalMultiChoiceFormatCallback +gcal_multi_choice_set_format_callback +GcalMultiChoice +
+ +
+gcal-quick-add-popover +GCAL_TYPE_QUICK_ADD_POPOVER +gcal_quick_add_popover_new +gcal_quick_add_popover_set_manager +gcal_quick_add_popover_get_date_start +gcal_quick_add_popover_set_date_start +gcal_quick_add_popover_get_date_end +gcal_quick_add_popover_set_date_end +GcalQuickAddPopover +
+ +
+gcal-range-tree +GcalRangeTraverseFunc +gcal_range_tree_new +gcal_range_tree_copy +gcal_range_tree_ref +gcal_range_tree_unref +gcal_range_tree_add_range +gcal_range_tree_remove_range +gcal_range_tree_traverse +gcal_range_tree_get_data_at_range +gcal_range_tree_count_entries_at_range + +GCAL_TYPE_RANGE_TREE +GcalRangeTree +gcal_range_tree_get_type +
+ +
+gcal-resources +calendar_get_resource +
+ +
+gcal-search-view +GCAL_TYPE_SEARCH_VIEW +gcal_search_view_set_time_format +gcal_search_view_search +gcal_search_view_new +gcal_search_view_connect +GcalSearchView +
+ +
+gcal-shell-search-provider +GcalShellSearchProvider +GCAL_TYPE_SHELL_SEARCH_PROVIDER +GcalShellSearchProviderClass +gcal_shell_search_provider_new +gcal_shell_search_provider_dbus_export +gcal_shell_search_provider_dbus_unexport +gcal_shell_search_provider_connect +GcalShellSearchProvider +
+ +
+gcal-shell-search-provider-generated +GcalShellSearchProvider2Skeleton +gcal_shell_search_provider2_interface_info +gcal_shell_search_provider2_override_properties +gcal_shell_search_provider2_complete_get_initial_result_set +gcal_shell_search_provider2_complete_get_subsearch_result_set +gcal_shell_search_provider2_complete_get_result_metas +gcal_shell_search_provider2_complete_activate_result +gcal_shell_search_provider2_complete_launch_search +gcal_shell_search_provider2_call_get_initial_result_set +gcal_shell_search_provider2_call_get_initial_result_set_finish +gcal_shell_search_provider2_call_get_initial_result_set_sync +gcal_shell_search_provider2_call_get_subsearch_result_set +gcal_shell_search_provider2_call_get_subsearch_result_set_finish +gcal_shell_search_provider2_call_get_subsearch_result_set_sync +gcal_shell_search_provider2_call_get_result_metas +gcal_shell_search_provider2_call_get_result_metas_finish +gcal_shell_search_provider2_call_get_result_metas_sync +gcal_shell_search_provider2_call_activate_result +gcal_shell_search_provider2_call_activate_result_finish +gcal_shell_search_provider2_call_activate_result_sync +gcal_shell_search_provider2_call_launch_search +gcal_shell_search_provider2_call_launch_search_finish +gcal_shell_search_provider2_call_launch_search_sync +gcal_shell_search_provider2_proxy_new +gcal_shell_search_provider2_proxy_new_finish +gcal_shell_search_provider2_proxy_new_sync +gcal_shell_search_provider2_proxy_new_for_bus +gcal_shell_search_provider2_proxy_new_for_bus_finish +gcal_shell_search_provider2_proxy_new_for_bus_sync +gcal_shell_search_provider2_skeleton_new + +GCAL_IS_SHELL_SEARCH_PROVIDER2 +GCAL_IS_SHELL_SEARCH_PROVIDER2_PROXY +GCAL_IS_SHELL_SEARCH_PROVIDER2_PROXY_CLASS +GCAL_IS_SHELL_SEARCH_PROVIDER2_SKELETON +GCAL_IS_SHELL_SEARCH_PROVIDER2_SKELETON_CLASS +GCAL_SHELL_SEARCH_PROVIDER2 +GCAL_SHELL_SEARCH_PROVIDER2_GET_IFACE +GCAL_SHELL_SEARCH_PROVIDER2_PROXY +GCAL_SHELL_SEARCH_PROVIDER2_PROXY_CLASS +GCAL_SHELL_SEARCH_PROVIDER2_PROXY_GET_CLASS +GCAL_SHELL_SEARCH_PROVIDER2_SKELETON +GCAL_SHELL_SEARCH_PROVIDER2_SKELETON_CLASS +GCAL_SHELL_SEARCH_PROVIDER2_SKELETON_GET_CLASS +GCAL_TYPE_SHELL_SEARCH_PROVIDER2 +GCAL_TYPE_SHELL_SEARCH_PROVIDER2_PROXY +GCAL_TYPE_SHELL_SEARCH_PROVIDER2_SKELETON +GcalShellSearchProvider2 +GcalShellSearchProvider2Iface +GcalShellSearchProvider2Proxy +GcalShellSearchProvider2ProxyClass +GcalShellSearchProvider2ProxyPrivate +GcalShellSearchProvider2Skeleton +GcalShellSearchProvider2SkeletonClass +GcalShellSearchProvider2SkeletonPrivate +gcal_shell_search_provider2_get_type +gcal_shell_search_provider2_proxy_get_type +gcal_shell_search_provider2_skeleton_get_type +
+ +
+gcal-source-dialog +GCAL_RESPONSE_REMOVE_SOURCE +GCAL_TYPE_SOURCE_DIALOG +GcalSourceDialogMode +gcal_source_dialog_new +gcal_source_dialog_set_manager +gcal_source_dialog_set_mode +gcal_source_dialog_set_source +GcalSourceDialog +
+ +
+gcal-subscriber-view +GcalSubscriberView +gcal_subscriber_view_get_child_by_uuid + +GCAL_IS_SUBSCRIBER_VIEW +GCAL_IS_SUBSCRIBER_VIEW_CLASS +GCAL_SUBSCRIBER_VIEW +GCAL_SUBSCRIBER_VIEW_CLASS +GCAL_SUBSCRIBER_VIEW_GET_CLASS +GCAL_TYPE_SUBSCRIBER_VIEW +GcalSubscriberView +GcalSubscriberViewClass +GcalSubscriberViewPrivate +gcal_subscriber_view_get_type +
+ +
+gcal-subscriber-view-private +GcalSubscriberViewPrivate +
+ +
+gcal-time-selector +GCAL_TYPE_TIME_SELECTOR +gcal_time_selector_new +gcal_time_selector_set_time_format +gcal_time_selector_get_time +gcal_time_selector_set_time +GcalTimeSelector +
+ +
+gcal-utils +ICAL_TIME_TYPE +ALIGNED +MINUTES_PER_DAY +MAX_MINUTES +gcal_clear_datetime +GcalWindowViewType +EventEditableProperty +GcalTranslateFunc +icaltime_get_type +datetime_compare_date +datetime_to_icaltime +datetime_is_date +icaltime_to_datetime +gcal_dup_icaltime +gcal_get_weekday +gcal_get_month_name +gcal_get_surface_from_color +get_circle_surface_from_color +get_color_name_from_source +get_desc_from_component +get_uuid_from_component +get_first_weekday +build_component_from_details +icaltime_compare_date +icaltime_compare_with_current +get_start_of_week +get_end_of_week +is_clock_format_24h +e_strftime_fix_am_pm +e_utf8_strftime_fix_am_pm +fix_popover_menu_icons +uri_get_fields +get_source_parent_name_color +format_utc_offset +get_alarm_trigger_minutes +should_change_date_for_scroll +is_source_enabled +
+ +
+gcal-view +GcalView +GCAL_TYPE_VIEW +GcalViewInterface +gcal_view_set_date +gcal_view_get_date +gcal_view_get_initial_date +gcal_view_get_final_date +gcal_view_clear_marks +gcal_view_get_children_by_uuid +GcalView +
+ +
+gcal-week-grid +GCAL_TYPE_WEEK_GRID +gcal_week_grid_set_manager +gcal_week_grid_set_first_weekday +gcal_week_grid_set_use_24h_format +gcal_week_grid_add_event +gcal_week_grid_remove_event +gcal_week_grid_get_children_by_uuid +gcal_week_grid_clear_marks +GcalWeekGrid +
+ +
+gcal-week-header +GCAL_TYPE_WEEK_HEADER +gcal_week_header_set_manager +gcal_week_header_set_first_weekday +gcal_week_header_set_use_24h_format +gcal_week_header_add_event +gcal_week_header_remove_event +gcal_week_header_get_children_by_uuid +gcal_week_header_get_sidebar_size_group +gcal_week_header_clear_marks +GcalWeekHeader +
+ +
+gcal-week-view +GCAL_TYPE_WEEK_VIEW +gcal_week_view_new +gcal_week_view_set_manager +gcal_week_view_set_first_weekday +gcal_week_view_set_use_24h_format +GcalWeekView +
+ +
+gcal-window +GCAL_TYPE_WINDOW +gcal_window_new_with_view_and_date +gcal_window_new_event +gcal_window_set_search_mode +gcal_window_set_search_query +gcal_window_open_event_by_uuid +GcalWindow +
+ +
+gcal-year-view +GCAL_TYPE_YEAR_VIEW +gcal_year_view_set_manager +gcal_year_view_set_first_weekday +gcal_year_view_set_use_24h_format +gcal_year_view_set_current_date +GcalYearView +
+ diff --git a/doc/reference/gnome-calendar-decl.txt b/doc/reference/gnome-calendar-decl.txt new file mode 100644 index 00000000..1f795415 --- /dev/null +++ b/doc/reference/gnome-calendar-decl.txt @@ -0,0 +1,2389 @@ + +GCAL_TYPE_QUICK_ADD_POPOVER +#define GCAL_TYPE_QUICK_ADD_POPOVER (gcal_quick_add_popover_get_type()) + + +gcal_quick_add_popover_new +GtkWidget * +void + + +gcal_quick_add_popover_set_manager +void +GcalQuickAddPopover *self, GcalManager *manager + + +gcal_quick_add_popover_get_date_start +GDateTime * +GcalQuickAddPopover *self + + +gcal_quick_add_popover_set_date_start +void +GcalQuickAddPopover *self, GDateTime *dt + + +gcal_quick_add_popover_get_date_end +GDateTime * +GcalQuickAddPopover *self + + +gcal_quick_add_popover_set_date_end +void +GcalQuickAddPopover *self, GDateTime *dt + + +GcalQuickAddPopover + + +CSS_TEMPLATE +#define CSS_TEMPLATE \ +".color-%1$d {"\ +" background-color: %2$s"\ +"}"\ +".color-%1$d.slanted {"\ +" background-color: transparent;"\ +" background-image: linear-gradient(100deg, /* left edge */"\ +" alpha(%2$s, 0) 5px,"\ +" %2$s 6px,"\ +" %2$s 9px,"\ +" alpha(%2$s, 0) 10px,"\ +" alpha(%2$s, 0) 16px,"\ +" %2$s 17px),"\ +" linear-gradient(280deg, /* right edge */"\ +" alpha(%2$s, 0) 5px,"\ +" %2$s 6px,"\ +" %2$s 9px,"\ +" alpha(%2$s, 0) 10px,"\ +" alpha(%2$s, 0) 16px,"\ +" %2$s 17px),"\ +" linear-gradient(100deg, /* left edge shadow */"\ +" transparent 5px,"\ +" @event_shadow_color 6px,"\ +" @event_shadow_color 9px,"\ +" transparent 10px,"\ +" transparent 16px,"\ +" @event_shadow_color 17px),"\ +" linear-gradient(280deg, /* right edge shadow*/"\ +" transparent 5px,"\ +" @event_shadow_color 6px,"\ +" @event_shadow_color 9px,"\ +" transparent 10px,"\ +" transparent 16px,"\ +" @event_shadow_color 17px);"\ +" border-bottom: 1px solid transparent; /* for the shadow displacement */"\ +" background-size: 50%% 100%%, 50%% 100%%, 50%% 100%%, 50%% 100%%;"\ +" background-position: left bottom, right bottom, left bottom, right bottom;"\ +" background-repeat: no-repeat;"\ +" background-origin: padding-box, padding-box, border-box, border-box;"\ +" background-clip: padding-box, padding-box, border-box, border-box;"\ +" padding-left: 24px;"\ +" padding-right: 24px;"\ +" padding-top: 3px;"\ +" padding-bottom: 4px;"\ +" border-radius: 0;"\ +"}"\ +".color-%1$d.slanted:backdrop {"\ +" background-image: linear-gradient(100deg, /* left edge */"\ +" alpha(%2$s, 0) 5px,"\ +" %2$s 6px,"\ +" %2$s 9px,"\ +" alpha(%2$s, 0) 10px,"\ +" alpha(%2$s, 0) 16px,"\ +" %2$s 17px),"\ +" linear-gradient(280deg, /* right edge */"\ +" alpha(%2$s, 0) 5px,"\ +" %2$s 6px,"\ +" %2$s 9px,"\ +" alpha(%2$s, 0) 10px,"\ +" alpha(%2$s, 0) 16px,"\ +" %2$s 17px);"\ +"}"\ +".color-%1$d.slanted:dir(rtl) {"\ +" background-image: linear-gradient(80deg, /* left edge */"\ +" alpha(%2$s, 0) 5px,"\ +" %2$s 6px,"\ +" %2$s 9px,"\ +" alpha(%2$s, 0) 10px,"\ +" alpha(%2$s, 0) 16px,"\ +" %2$s 17px),"\ +" linear-gradient(260deg, /* right edge */"\ +" alpha(%2$s, 0) 5px,"\ +" %2$s 6px,"\ +" %2$s 9px,"\ +" alpha(%2$s, 0) 10px,"\ +" alpha(%2$s, 0) 16px,"\ +" %2$s 17px),"\ +" linear-gradient(80deg, /* left edge shadow */"\ +" transparent 5px,"\ +" @event_shadow_color 6px,"\ +" @event_shadow_color 9px,"\ +" transparent 10px,"\ +" transparent 16px,"\ +" @event_shadow_color 17px),"\ +" linear-gradient(260deg, /* right edge shadow*/"\ +" transparent 5px,"\ +" @event_shadow_color 6px,"\ +" @event_shadow_color 9px,"\ +" transparent 10px,"\ +" transparent 16px,"\ +" @event_shadow_color 17px);"\ +"}"\ +".color-%1$d.slanted:dir(rtl):backdrop {"\ +" background-image: linear-gradient(80deg, /* left edge */"\ +" alpha(%2$s, 0) 5px,"\ +" %2$s 6px,"\ +" %2$s 9px,"\ +" alpha(%2$s, 0) 10px,"\ +" alpha(%2$s, 0) 16px,"\ +" %2$s 17px),"\ +" linear-gradient(260deg, /* right edge */"\ +" alpha(%2$s, 0) 5px,"\ +" %2$s 6px,"\ +" %2$s 9px,"\ +" alpha(%2$s, 0) 10px,"\ +" alpha(%2$s, 0) 16px,"\ +" %2$s 17px);"\ +"}"\ +".color-%1$d.slanted-start {"\ +" background-color: transparent;"\ +" background-image: linear-gradient(100deg, /* left edge */"\ +" alpha(%2$s, 0) 5px,"\ +" %2$s 6px,"\ +" %2$s 9px,"\ +" alpha(%2$s, 0) 10px,"\ +" alpha(%2$s, 0) 16px,"\ +" %2$s 17px),"\ +" linear-gradient(100deg, /* left edge shadow */"\ +" transparent 5px,"\ +" @event_shadow_color 6px,"\ +" @event_shadow_color 9px,"\ +" transparent 10px,"\ +" transparent 16px,"\ +" @event_shadow_color 17px);"\ +" border-bottom: 1px solid transparent; /* for the shadow displacement */"\ +" background-position: left bottom, left bottom;"\ +" background-size: 100%% 100%%, 100%% 100%%;"\ +" background-origin: padding-box, border-box;"\ +" background-clip: padding-box, border-box;"\ +" border-radius: 0 2px 2px 0;"\ +" padding-right: 4px;"\ +" padding-left: 24px;"\ +" padding-top: 3px;"\ +" padding-bottom: 4px;"\ +"}"\ +".color-%1$d.slanted-start:backdrop {"\ +" background-image: linear-gradient(100deg, /* left edge */"\ +" alpha(%2$s, 0) 5px,"\ +" %2$s 6px,"\ +" %2$s 9px,"\ +" alpha(%2$s, 0) 10px,"\ +" alpha(%2$s, 0) 16px,"\ +" %2$s 17px);"\ +"}"\ +".color-%1$d.slanted-start:dir(rtl) {"\ +" background-image: linear-gradient(260deg, /* right edge */"\ +" alpha(%2$s, 0) 5px,"\ +" %2$s 6px,"\ +" %2$s 9px,"\ +" alpha(%2$s, 0) 10px,"\ +" alpha(%2$s, 0) 16px,"\ +" %2$s 17px),"\ +" linear-gradient(260deg, /* right edge shadow */"\ +" transparent 5px,"\ +" @event_shadow_color 6px,"\ +" @event_shadow_color 9px,"\ +" transparent 10px,"\ +" transparent 16px,"\ +" @event_shadow_color 17px);"\ +" border-bottom: 1px solid transparent; /* for the shadow displacement */"\ +" background-position: right bottom, right bottom;"\ +" border-radius: 2px 0 0 2px;"\ +" padding-right: 24px;"\ +" padding-left: 4px;"\ +"}"\ +".color-%1$d.slanted-start:dir(rtl):backdrop {"\ +" background-image: linear-gradient(260deg, /* right edge */"\ +" alpha(%2$s, 0) 5px,"\ +" %2$s 6px,"\ +" %2$s 9px,"\ +" alpha(%2$s, 0) 10px,"\ +" alpha(%2$s, 0) 16px,"\ +" %2$s 17px);"\ +"}"\ +".color-%1$d.slanted-end {"\ +" background-color: transparent;"\ +" background-image: linear-gradient(280deg, /* right edge */"\ +" alpha(%2$s, 0) 5px,"\ +" %2$s 6px,"\ +" %2$s 9px,"\ +" alpha(%2$s, 0) 10px,"\ +" alpha(%2$s, 0) 16px,"\ +" %2$s 17px),"\ +" linear-gradient(280deg, /* right edge shadow */"\ +" transparent 5px,"\ +" @event_shadow_color 6px,"\ +" @event_shadow_color 9px,"\ +" transparent 10px,"\ +" transparent 16px,"\ +" @event_shadow_color 17px);"\ +" border-bottom: 1px solid transparent; /* for the shadow displacement */"\ +" background-position: right bottom, right bottom;"\ +" background-size: 100%% 100%%, 100%% 100%%;"\ +" background-origin: padding-box, border-box;"\ +" background-clip: padding-box, border-box;"\ +" border-radius: 2px 0 0 2px;"\ +" padding-right: 24px;"\ +" padding-left: 4px;"\ +" padding-top: 3px;"\ +" padding-bottom: 4px;"\ +"}"\ +".color-%1$d.slanted-end:backdrop {"\ +" background-image: linear-gradient(280deg, /* right edge */"\ +" alpha(%2$s, 0) 5px,"\ +" %2$s 6px,"\ +" %2$s 9px,"\ +" alpha(%2$s, 0) 10px,"\ +" alpha(%2$s, 0) 16px,"\ +" %2$s 17px);"\ +"}"\ +".color-%1$d.slanted-end:dir(rtl) {"\ +" background-image: linear-gradient(80deg, /* left edge */"\ +" alpha(%2$s, 0) 5px,"\ +" %2$s 6px,"\ +" %2$s 9px,"\ +" alpha(%2$s, 0) 10px,"\ +" alpha(%2$s, 0) 16px,"\ +" %2$s 17px),"\ +" linear-gradient(80deg, /* left edge shadow */"\ +" transparent 5px,"\ +" @event_shadow_color 6px,"\ +" @event_shadow_color 9px,"\ +" transparent 10px,"\ +" transparent 16px,"\ +" @event_shadow_color 17px);"\ +" background-position: left bottom, left bottom;"\ +" border-radius: 0 2px 2px 0;"\ +" padding-right: 4px;"\ +" padding-left: 24px;"\ +"}"\ +".color-%1$d.slanted-end:dir(rtl):backdrop {"\ +" background-image: linear-gradient(80deg, /* left edge */"\ +" alpha(%2$s, 0) 5px,"\ +" %2$s 6px,"\ +" %2$s 9px,"\ +" alpha(%2$s, 0) 10px,"\ +" alpha(%2$s, 0) 16px,"\ +" %2$s 17px);"\ +"}" + + +GcalEventError +typedef enum +{ + GCAL_EVENT_ERROR_INVALID_START_DATE +} GcalEventError; + + +GCAL_EVENT_ERROR +#define GCAL_EVENT_ERROR gcal_event_error_quark () + + +GCAL_TYPE_EVENT +#define GCAL_TYPE_EVENT (gcal_event_get_type()) + + +gcal_event_error_quark +GQuark +void + + +gcal_event_new +GcalEvent * +ESource *source, ECalComponent *component, GError **error + + +gcal_event_get_all_day +gboolean +GcalEvent *self + + +gcal_event_set_all_day +void +GcalEvent *self, gboolean all_day + + +gcal_event_get_color +GdkRGBA * +GcalEvent *self + + +gcal_event_set_color +void +GcalEvent *self, GdkRGBA *color + + +gcal_event_get_component +ECalComponent * +GcalEvent *self + + +gcal_event_get_date_end +GDateTime * +GcalEvent *self + + +gcal_event_set_date_end +void +GcalEvent *self, GDateTime *dt + + +gcal_event_get_date_start +GDateTime * +GcalEvent *self + + +gcal_event_set_date_start +void +GcalEvent *self, GDateTime *dt + + +gcal_event_get_description +const gchar * +GcalEvent *self + + +gcal_event_set_description +void +GcalEvent *self, const gchar *description + + +gcal_event_has_alarms +gboolean +GcalEvent *self + + +gcal_event_get_alarms +GList * +GcalEvent *self + + +gcal_event_add_alarm +void +GcalEvent *self, guint type, gboolean has_sound + + +gcal_event_remove_alarm +void +GcalEvent *self, guint type + + +gcal_event_get_location +const gchar * +GcalEvent *self + + +gcal_event_set_location +void +GcalEvent *self, const gchar *location + + +gcal_event_get_source +ESource * +GcalEvent *self + + +gcal_event_set_source +void +GcalEvent *self, ESource *source + + +gcal_event_get_summary +const gchar * +GcalEvent *self + + +gcal_event_set_summary +void +GcalEvent *self, const gchar *summary + + +gcal_event_get_timezone +GTimeZone * +GcalEvent *self + + +gcal_event_set_timezone +void +GcalEvent *self, GTimeZone *timezone + + +gcal_event_get_uid +const gchar * +GcalEvent *self + + +gcal_event_is_multiday +gboolean +GcalEvent *self + + +gcal_event_compare +gint +GcalEvent *event1, GcalEvent *event2 + + +gcal_event_compare_with_current +gint +GcalEvent *event1, GcalEvent *event2, time_t *current_time + + +GcalEvent + + +GCAL_TYPE_DATE_SELECTOR +#define GCAL_TYPE_DATE_SELECTOR (gcal_date_selector_get_type ()) + + +gcal_date_selector_new +GtkWidget * +void + + +gcal_date_selector_get_date +GDateTime * +GcalDateSelector *selector + + +gcal_date_selector_set_date +void +GcalDateSelector *selector, GDateTime *date + + +GcalDateSelector + + +GCAL_TYPE_TIME_SELECTOR +#define GCAL_TYPE_TIME_SELECTOR (gcal_time_selector_get_type ()) + + +gcal_time_selector_new +GtkWidget * +void + + +gcal_time_selector_set_time_format +void +GcalTimeSelector *selector, gboolean format_24h + + +gcal_time_selector_get_time +GDateTime * +GcalTimeSelector *selector + + +gcal_time_selector_set_time +void +GcalTimeSelector *selector, GDateTime *time + + +GcalTimeSelector + + +GcalDateChooserDayOptions +typedef enum +{ + GCAL_DATE_CHOOSER_DAY_NONE = 1 << 0, + GCAL_DATE_CHOOSER_DAY_WEEKEND = 1 << 1, + GCAL_DATE_CHOOSER_DAY_HOLIDAY = 1 << 2, + GCAL_DATE_CHOOSER_DAY_MARKED = 1 << 3 +} GcalDateChooserDayOptions; + + +GCAL_TYPE_DATE_CHOOSER +#define GCAL_TYPE_DATE_CHOOSER (gcal_date_chooser_get_type ()) + + +GcalDateChooserDayOptionsCallback +GcalDateChooserDayOptions +GcalDateChooser *self, + GDateTime *date, + gpointer user_data + + +gcal_date_chooser_new +GtkWidget * +void + + +gcal_date_chooser_get_date +GDateTime * +GcalDateChooser *self + + +gcal_date_chooser_set_date +void +GcalDateChooser *self, GDateTime *date + + +gcal_date_chooser_set_day_options_callback +void +GcalDateChooser *self, GcalDateChooserDayOptionsCallback callback, gpointer data, GDestroyNotify destroy + + +gcal_date_chooser_invalidate_day_options +void +GcalDateChooser *self + + +gcal_date_chooser_get_no_month_change +gboolean +GcalDateChooser *self + + +gcal_date_chooser_set_no_month_change +void +GcalDateChooser *self, gboolean setting + + +gcal_date_chooser_get_show_heading +gboolean +GcalDateChooser *self + + +gcal_date_chooser_set_show_heading +void +GcalDateChooser *self, gboolean setting + + +gcal_date_chooser_get_show_day_names +gboolean +GcalDateChooser *self + + +gcal_date_chooser_set_show_day_names +void +GcalDateChooser *self, gboolean setting + + +gcal_date_chooser_get_show_week_numbers +gboolean +GcalDateChooser *self + + +gcal_date_chooser_set_show_week_numbers +void +GcalDateChooser *self, gboolean setting + + +GcalDateChooser + + +GCAL_TYPE_SUBSCRIBER_VIEW +#define GCAL_TYPE_SUBSCRIBER_VIEW (gcal_subscriber_view_get_type ()) + + +GCAL_SUBSCRIBER_VIEW +#define GCAL_SUBSCRIBER_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GCAL_TYPE_SUBSCRIBER_VIEW, GcalSubscriberView)) + + +GCAL_SUBSCRIBER_VIEW_CLASS +#define GCAL_SUBSCRIBER_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GCAL_TYPE_SUBSCRIBER_VIEW, GcalSubscriberViewClass)) + + +GCAL_IS_SUBSCRIBER_VIEW +#define GCAL_IS_SUBSCRIBER_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GCAL_TYPE_SUBSCRIBER_VIEW)) + + +GCAL_IS_SUBSCRIBER_VIEW_CLASS +#define GCAL_IS_SUBSCRIBER_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GCAL_TYPE_SUBSCRIBER_VIEW)) + + +GCAL_SUBSCRIBER_VIEW_GET_CLASS +#define GCAL_SUBSCRIBER_VIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GCAL_TYPE_SUBSCRIBER_VIEW, GcalSubscriberViewClass)) + + +GcalSubscriberView +struct _GcalSubscriberView +{ + GtkContainer parent; + + GcalSubscriberViewPrivate *priv; +}; + + +GcalSubscriberViewClass +struct _GcalSubscriberViewClass +{ + GtkContainerClass parent_class; + + /*< signals >*/ + void (*event_activated) (GcalSubscriberView *subscriber_view, GcalEventWidget *event_widget); + + /*< public >*/ + guint (*get_child_cell) (GcalSubscriberView *subscriber_view, GcalEventWidget *child); + void (*clear_state) (GcalSubscriberView *subscriber_view); + + /* gcal-view replacements */ + GtkWidget* (*get_child_by_uuid) (GcalSubscriberView *subscriber_view, const gchar *uuid); +}; + + +gcal_subscriber_view_get_type +GType +void + + +gcal_subscriber_view_get_child_by_uuid +GtkWidget * +GcalSubscriberView *subscriber_view, const gchar *uuid + + +GcalSubscriberViewPrivate + + +GCAL_TYPE_APPLICATION +#define GCAL_TYPE_APPLICATION (gcal_application_get_type ()) + + +gcal_application_new +GcalApplication * +void + + +gcal_application_get_manager +GcalManager * +GcalApplication *self + + +gcal_application_get_settings +GSettings * +GcalApplication *self + + +gcal_application_set_uuid +void +GcalApplication *self, const gchar *app_uuid + + +gcal_application_set_initial_date +void +GcalApplication *self, GDateTime *initial_date + + +GcalApplication + + +GCAL_TYPE_SHELL_SEARCH_PROVIDER +#define GCAL_TYPE_SHELL_SEARCH_PROVIDER (gcal_shell_search_provider_get_type()) + + +GcalShellSearchProviderClass +struct _GcalShellSearchProviderClass +{ + GObjectClass parent; +}; + + +gcal_shell_search_provider_new +GcalShellSearchProvider * +void + + +gcal_shell_search_provider_dbus_export +gboolean +GcalShellSearchProvider *search_provider, GDBusConnection *connection, const gchar *object_path, GError **error + + +gcal_shell_search_provider_dbus_unexport +void +GcalShellSearchProvider *search_provider, GDBusConnection *connection, const gchar *object_path + + +gcal_shell_search_provider_connect +void +GcalShellSearchProvider *search_provider, GcalManager *manager + + +GcalShellSearchProvider + + +GCAL_TYPE_WINDOW +#define GCAL_TYPE_WINDOW (gcal_window_get_type ()) + + +gcal_window_new_with_view_and_date +GtkWidget * +GcalApplication *app, GcalWindowViewType view_type, icaltimetype *date + + +gcal_window_new_event +void +GcalWindow *self + + +gcal_window_set_search_mode +void +GcalWindow *self, gboolean enabled + + +gcal_window_set_search_query +void +GcalWindow *self, const gchar *query + + +gcal_window_open_event_by_uuid +void +GcalWindow *self, const gchar *uuid + + +GcalWindow + + +calendar_get_resource +GResource * +void + + +GCAL_TYPE_VIEW +#define GCAL_TYPE_VIEW (gcal_view_get_type ()) + + +GcalViewInterface +struct _GcalViewInterface +{ + GTypeInterface parent; + + /* signals */ + void (*create_event) (GcalView *view, + icaltimetype *start_span, + icaltimetype *end_span, + gdouble x, + gdouble y); + void (*create_event_detailed) (GcalView *view, + icaltimetype *start_span, + icaltimetype *end_span); + + /* Time handling related API */ + icaltimetype* (*get_initial_date) (GcalView *view); + icaltimetype* (*get_final_date) (GcalView *view); + + /* Marks related API */ + void (*clear_marks) (GcalView *view); + + GList* (*get_children_by_uuid) (GcalView *view, + const gchar *uuid); +}; + + +gcal_view_set_date +void +GcalView *view, icaltimetype *date + + +gcal_view_get_date +icaltimetype * +GcalView *view + + +gcal_view_get_initial_date +icaltimetype * +GcalView *view + + +gcal_view_get_final_date +icaltimetype * +GcalView *view + + +gcal_view_clear_marks +void +GcalView *view + + +gcal_view_get_children_by_uuid +GList * +GcalView *view, const gchar *uuid + + +GcalView + + +E_TYPE_CAL_DATA_MODEL +#define E_TYPE_CAL_DATA_MODEL \ + (e_cal_data_model_get_type ()) + + +E_CAL_DATA_MODEL +#define E_CAL_DATA_MODEL(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST \ + ((obj), E_TYPE_CAL_DATA_MODEL, ECalDataModel)) + + +E_CAL_DATA_MODEL_CLASS +#define E_CAL_DATA_MODEL_CLASS(cls) \ + (G_TYPE_CHECK_CLASS_CAST \ + ((cls), E_TYPE_CAL_DATA_MODEL, ECalDataModelClass)) + + +E_IS_CAL_DATA_MODEL +#define E_IS_CAL_DATA_MODEL(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE \ + ((obj), E_TYPE_CAL_DATA_MODEL)) + + +E_IS_CAL_DATA_MODEL_CLASS +#define E_IS_CAL_DATA_MODEL_CLASS(cls) \ + (G_TYPE_CHECK_CLASS_TYPE \ + ((cls), E_TYPE_CAL_DATA_MODEL)) + + +E_CAL_DATA_MODEL_GET_CLASS +#define E_CAL_DATA_MODEL_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS \ + ((obj), E_TYPE_CAL_DATA_MODEL, ECalDataModelClass)) + + +ECalDataModelViewState +typedef enum { + E_CAL_DATA_MODEL_VIEW_STATE_START, + E_CAL_DATA_MODEL_VIEW_STATE_PROGRESS, + E_CAL_DATA_MODEL_VIEW_STATE_COMPLETE, + E_CAL_DATA_MODEL_VIEW_STATE_STOP +} ECalDataModelViewState; + + +ECalDataModel +struct _ECalDataModel { + GObject parent; + ECalDataModelPrivate *priv; +}; + + +ECalDataModelClass +struct _ECalDataModelClass { + GObjectClass parent_class; + + /* Signals */ + void (* view_state_changed) (ECalDataModel *data_model, + ECalClientView *view, + ECalDataModelViewState state, + guint percent, + const gchar *message, + const GError *error); +}; + + +EThreadJobFunc +void +gpointer user_data, + GCancellable *cancellable, + GError **error + + +e_cal_data_model_get_type +GType +void + + +e_cal_data_model_new +ECalDataModel * +ECalDataModelSubmitThreadJobFunc func + + +e_cal_data_model_new_clone +ECalDataModel * +ECalDataModel *src_data_model + + +e_cal_data_model_submit_thread_job +GCancellable * +ECalDataModel *data_model, EThreadJobFunc func, gpointer user_data, GDestroyNotify free_user_data + + +e_cal_data_model_get_disposing +gboolean +ECalDataModel *data_model + + +e_cal_data_model_set_disposing +void +ECalDataModel *data_model, gboolean disposing + + +e_cal_data_model_get_expand_recurrences +gboolean +ECalDataModel *data_model + + +e_cal_data_model_set_expand_recurrences +void +ECalDataModel *data_model, gboolean expand_recurrences + + +e_cal_data_model_get_timezone +icaltimezone * +ECalDataModel *data_model + + +e_cal_data_model_set_timezone +void +ECalDataModel *data_model, icaltimezone *zone + + +e_cal_data_model_set_filter +void +ECalDataModel *data_model, const gchar *sexp + + +e_cal_data_model_dup_filter +gchar * +ECalDataModel *data_model + + +e_cal_data_model_add_client +void +ECalDataModel *data_model, ECalClient *client + + +e_cal_data_model_remove_client +void +ECalDataModel *data_model, const gchar *uid + + +e_cal_data_model_ref_client +ECalClient * +ECalDataModel *data_model, const gchar *uid + + +e_cal_data_model_get_clients +GList * +ECalDataModel *data_model + + +e_cal_data_model_get_components +GSList * +ECalDataModel *data_model, time_t in_range_start, time_t in_range_end + + +ECalDataModelForeachFunc +gboolean +ECalDataModel *data_model, + ECalClient *client, + const ECalComponentId *id, + ECalComponent *comp, + time_t instance_start, + time_t instance_end, + gpointer user_data + + +e_cal_data_model_foreach_component +gboolean +ECalDataModel *data_model, time_t in_range_start, time_t in_range_end, ECalDataModelForeachFunc func, gpointer user_data + + +e_cal_data_model_subscribe +void +ECalDataModel *data_model, ECalDataModelSubscriber *subscriber, time_t range_start, time_t range_end + + +e_cal_data_model_unsubscribe +void +ECalDataModel *data_model, ECalDataModelSubscriber *subscriber + + +e_cal_data_model_get_subscriber_range +gboolean +ECalDataModel *data_model, ECalDataModelSubscriber *subscriber, time_t *range_start, time_t *range_end + + +e_cal_data_model_freeze_views_update +void +ECalDataModel *data_model + + +e_cal_data_model_thaw_views_update +void +ECalDataModel *data_model + + +e_cal_data_model_is_views_update_frozen +gboolean +ECalDataModel *data_model + + +ECalDataModelPrivate + + +GCAL_WINDOW_VIEW_TYPE +#define GCAL_WINDOW_VIEW_TYPE (gcal_window_view_type_get_type()) + + +gcal_window_view_type_get_type +GType +void + + +GCAL_EDITABLE_PROPERTY +#define GCAL_EDITABLE_PROPERTY (event_editable_property_get_type()) + + +event_editable_property_get_type +GType +void + + +gcal_log_init +void +void + + +ICAL_TIME_TYPE +#define ICAL_TIME_TYPE (icaltime_get_type ()) + + +ALIGNED +#define ALIGNED(x) (round (x) + 0.5) + + +MINUTES_PER_DAY +#define MINUTES_PER_DAY 1440 + + +MAX_MINUTES +#define MAX_MINUTES (7 * MINUTES_PER_DAY) + + +gcal_clear_datetime +#define gcal_clear_datetime(dt) g_clear_pointer (dt, g_date_time_unref) + + +GcalWindowViewType +typedef enum +{ + GCAL_WINDOW_VIEW_DAY, + GCAL_WINDOW_VIEW_WEEK, + GCAL_WINDOW_VIEW_MONTH, + GCAL_WINDOW_VIEW_YEAR, + GCAL_WINDOW_VIEW_LIST, + GCAL_WINDOW_VIEW_SEARCH, +} GcalWindowViewType; + + +EventEditableProperty +typedef enum +{ + EVENT_SUMMARY = 0, + EVENT_START_DATE, + EVENT_END_DATE, + EVENT_LOCATION, + EVENT_DESCRIPTION, + EVENT_SOURCE, +} EventEditableProperty; + + +GcalTranslateFunc +const gchar * +GtkWidget *source_widget + + +icaltime_get_type +GType +void + + +datetime_compare_date +gint +GDateTime *dt1, GDateTime *dt2 + + +datetime_to_icaltime +icaltimetype * +GDateTime *dt + + +datetime_is_date +gboolean +GDateTime *dt + + +icaltime_to_datetime +GDateTime * +const icaltimetype *date + + +gcal_dup_icaltime +icaltimetype * +const icaltimetype *date + + +gcal_get_weekday +gchar * +gint i + + +gcal_get_month_name +gchar * +gint i + + +gcal_get_surface_from_color +cairo_surface_t * +GdkRGBA *color, gint size + + +get_circle_surface_from_color +cairo_surface_t * +GdkRGBA *color, gint size + + +get_color_name_from_source +void +ESource *source, GdkRGBA *out_color + + +get_desc_from_component +gchar * +ECalComponent *component, const gchar *joint_char + + +get_uuid_from_component +gchar * +ESource *source, ECalComponent *component + + +get_first_weekday +gint +void + + +build_component_from_details +ECalComponent * +const gchar *summary, GDateTime *initial_date, GDateTime *final_date + + +icaltime_compare_date +gint +const icaltimetype *date1, const icaltimetype *date2 + + +icaltime_compare_with_current +gint +const icaltimetype *date1, const icaltimetype *date2, time_t *current_time_t + + +get_start_of_week +GDateTime * +icaltimetype *date + + +get_end_of_week +GDateTime * +icaltimetype *date + + +is_clock_format_24h +gboolean +void + + +e_strftime_fix_am_pm +gsize +gchar *str, gsize max, const gchar *fmt, const struct tm *tm + + +e_utf8_strftime_fix_am_pm +gsize +gchar *str, gsize max, const gchar *fmt, const struct tm *tm + + +fix_popover_menu_icons +void +GtkPopover *popover + + +uri_get_fields +gboolean +const gchar *uri, gchar **schema, gchar **host, gchar **path + + +get_source_parent_name_color +void +GcalManager *manager, ESource *source, gchar **name, gchar **color + + +format_utc_offset +gchar * +gint64 offset + + +get_alarm_trigger_minutes +gint +GcalEvent *event, ECalComponentAlarm *alarm + + +should_change_date_for_scroll +gboolean +gdouble *scroll_value, GdkEventScroll *scroll_event + + +is_source_enabled +gboolean +ESource *source + + +E_TYPE_CAL_DATA_MODEL_SUBSCRIBER +#define E_TYPE_CAL_DATA_MODEL_SUBSCRIBER \ + (e_cal_data_model_subscriber_get_type ()) + + +E_CAL_DATA_MODEL_SUBSCRIBER +#define E_CAL_DATA_MODEL_SUBSCRIBER(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST \ + ((obj), E_TYPE_CAL_DATA_MODEL_SUBSCRIBER, ECalDataModelSubscriber)) + + +E_CAL_DATA_MODEL_SUBSCRIBER_INTERFACE +#define E_CAL_DATA_MODEL_SUBSCRIBER_INTERFACE(cls) \ + (G_TYPE_CHECK_CLASS_CAST \ + ((cls), E_TYPE_CAL_DATA_MODEL_SUBSCRIBER, ECalDataModelSubscriberInterface)) + + +E_IS_CAL_DATA_MODEL_SUBSCRIBER +#define E_IS_CAL_DATA_MODEL_SUBSCRIBER(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE \ + ((obj), E_TYPE_CAL_DATA_MODEL_SUBSCRIBER)) + + +E_IS_CAL_DATA_MODEL_SUBSCRIBER_INTERFACE +#define E_IS_CAL_DATA_MODEL_SUBSCRIBER_INTERFACE(cls) \ + (G_TYPE_CHECK_CLASS_TYPE \ + ((cls), E_TYPE_CAL_DATA_MODEL_SUBSCRIBER)) + + +E_CAL_DATA_MODEL_SUBSCRIBER_GET_INTERFACE +#define E_CAL_DATA_MODEL_SUBSCRIBER_GET_INTERFACE(obj) \ + (G_TYPE_INSTANCE_GET_INTERFACE \ + ((obj), E_TYPE_CAL_DATA_MODEL_SUBSCRIBER, ECalDataModelSubscriberInterface)) + + +ECalDataModelSubscriberInterface +struct _ECalDataModelSubscriberInterface { + GTypeInterface parent_interface; + + void (*component_added) (ECalDataModelSubscriber *subscriber, + ECalClient *client, + ECalComponent *comp); + void (*component_modified) (ECalDataModelSubscriber *subscriber, + ECalClient *client, + ECalComponent *comp); + void (*component_removed) (ECalDataModelSubscriber *subscriber, + ECalClient *client, + const gchar *uid, + const gchar *rid); + void (*freeze) (ECalDataModelSubscriber *subscriber); + void (*thaw) (ECalDataModelSubscriber *subscriber); +}; + + +e_cal_data_model_subscriber_get_type +GType +void + + +e_cal_data_model_subscriber_component_added +void +ECalDataModelSubscriber *subscriber, ECalClient *client, ECalComponent *comp + + +e_cal_data_model_subscriber_component_modified +void +ECalDataModelSubscriber *subscriber, ECalClient *client, ECalComponent *comp + + +e_cal_data_model_subscriber_component_removed +void +ECalDataModelSubscriber *subscriber, ECalClient *client, const gchar *uid, const gchar *rid + + +e_cal_data_model_subscriber_freeze +void +ECalDataModelSubscriber *subscriber + + +e_cal_data_model_subscriber_thaw +void +ECalDataModelSubscriber *subscriber + + +ECalDataModelSubscriber + + +GCAL_TYPE_MANAGER +#define GCAL_TYPE_MANAGER (gcal_manager_get_type ()) + + +gcal_manager_new_with_settings +GcalManager * +GSettings *settings + + +gcal_manager_get_source +ESource * +GcalManager *manager, const gchar *uid + + +gcal_manager_get_sources +GList * +GcalManager *manager + + +gcal_manager_get_sources_connected +GList * +GcalManager *manager + + +gcal_manager_get_default_source +ESource * +GcalManager *manager + + +gcal_manager_set_default_source +void +GcalManager *manager, ESource *source + + +gcal_manager_get_system_timezone +icaltimezone * +GcalManager *manager + + +gcal_manager_set_subscriber +void +GcalManager *manager, ECalDataModelSubscriber *subscriber, time_t range_start, time_t range_end + + +gcal_manager_set_search_subscriber +void +GcalManager *manager, ECalDataModelSubscriber *subscriber, time_t range_start, time_t range_end + + +gcal_manager_set_query +void +GcalManager *self, const gchar *query + + +gcal_manager_query_client_data +gchar * +GcalManager *manager, ESource *source, const gchar *field + + +gcal_manager_refresh +void +GcalManager *manager + + +gcal_manager_is_client_writable +gboolean +GcalManager *manager, ESource *source + + +gcal_manager_create_event +void +GcalManager *manager, GcalEvent *event + + +gcal_manager_update_event +void +GcalManager *manager, GcalEvent *event + + +gcal_manager_remove_event +void +GcalManager *manager, GcalEvent *event + + +gcal_manager_move_event_to_source +void +GcalManager *manager, GcalEvent *event, ESource *dest + + +gcal_manager_add_source +gchar * +GcalManager *manager, const gchar *name, const gchar *backend, const gchar *color + + +gcal_manager_enable_source +void +GcalManager *manager, ESource *source + + +gcal_manager_disable_source +void +GcalManager *manager, ESource *source + + +gcal_manager_save_source +void +GcalManager *manager, ESource *source + + +gcal_manager_get_events +GList * +GcalManager *manager, icaltimetype *range_start, icaltimetype *range_end + + +gcal_manager_get_loading +gboolean +GcalManager *self + + +gcal_manager_get_goa_client +GoaClient * +GcalManager *manager + + +gcal_manager_get_event_from_shell_search +GcalEvent * +GcalManager *manager, const gchar *uuid + + +gcal_manager_setup_shell_search +void +GcalManager *self, ECalDataModelSubscriber *subscriber + + +gcal_manager_set_shell_search_query +void +GcalManager *manager, const gchar *query + + +gcal_manager_set_shell_search_subscriber +void +GcalManager *manager, ECalDataModelSubscriber *subscriber, time_t range_start, time_t range_end + + +gcal_manager_shell_search_done +gboolean +GcalManager *manager + + +gcal_manager_get_shell_search_events +GList * +GcalManager *manager + + +GcalManager + + +GCAL_TYPE_SHELL_SEARCH_PROVIDER2 +#define GCAL_TYPE_SHELL_SEARCH_PROVIDER2 (gcal_shell_search_provider2_get_type ()) + + +GCAL_SHELL_SEARCH_PROVIDER2 +#define GCAL_SHELL_SEARCH_PROVIDER2(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GCAL_TYPE_SHELL_SEARCH_PROVIDER2, GcalShellSearchProvider2)) + + +GCAL_IS_SHELL_SEARCH_PROVIDER2 +#define GCAL_IS_SHELL_SEARCH_PROVIDER2(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GCAL_TYPE_SHELL_SEARCH_PROVIDER2)) + + +GCAL_SHELL_SEARCH_PROVIDER2_GET_IFACE +#define GCAL_SHELL_SEARCH_PROVIDER2_GET_IFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE ((o), GCAL_TYPE_SHELL_SEARCH_PROVIDER2, GcalShellSearchProvider2Iface)) + + +GcalShellSearchProvider2Iface +struct _GcalShellSearchProvider2Iface +{ + GTypeInterface parent_iface; + + gboolean (*handle_activate_result) ( + GcalShellSearchProvider2 *object, + GDBusMethodInvocation *invocation, + const gchar *arg_Result, + const gchar *const *arg_Terms, + guint arg_Timestamp); + + gboolean (*handle_get_initial_result_set) ( + GcalShellSearchProvider2 *object, + GDBusMethodInvocation *invocation, + const gchar *const *arg_Terms); + + gboolean (*handle_get_result_metas) ( + GcalShellSearchProvider2 *object, + GDBusMethodInvocation *invocation, + const gchar *const *arg_Results); + + gboolean (*handle_get_subsearch_result_set) ( + GcalShellSearchProvider2 *object, + GDBusMethodInvocation *invocation, + const gchar *const *arg_PreviousResults, + const gchar *const *arg_Terms); + + gboolean (*handle_launch_search) ( + GcalShellSearchProvider2 *object, + GDBusMethodInvocation *invocation, + const gchar *const *arg_Terms, + guint arg_Timestamp); + +}; + + +gcal_shell_search_provider2_get_type +GType +void + + +gcal_shell_search_provider2_interface_info +GDBusInterfaceInfo * +void + + +gcal_shell_search_provider2_override_properties +guint +GObjectClass *klass, guint property_id_begin + + +gcal_shell_search_provider2_complete_get_initial_result_set +void + GcalShellSearchProvider2 *object, GDBusMethodInvocation *invocation, const gchar *const *Results + + +gcal_shell_search_provider2_complete_get_subsearch_result_set +void + GcalShellSearchProvider2 *object, GDBusMethodInvocation *invocation, const gchar *const *Results + + +gcal_shell_search_provider2_complete_get_result_metas +void + GcalShellSearchProvider2 *object, GDBusMethodInvocation *invocation, GVariant *Metas + + +gcal_shell_search_provider2_complete_activate_result +void + GcalShellSearchProvider2 *object, GDBusMethodInvocation *invocation + + +gcal_shell_search_provider2_complete_launch_search +void + GcalShellSearchProvider2 *object, GDBusMethodInvocation *invocation + + +gcal_shell_search_provider2_call_get_initial_result_set +void + GcalShellSearchProvider2 *proxy, const gchar *const *arg_Terms, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data + + +gcal_shell_search_provider2_call_get_initial_result_set_finish +gboolean + GcalShellSearchProvider2 *proxy, gchar ***out_Results, GAsyncResult *res, GError **error + + +gcal_shell_search_provider2_call_get_initial_result_set_sync +gboolean + GcalShellSearchProvider2 *proxy, const gchar *const *arg_Terms, gchar ***out_Results, GCancellable *cancellable, GError **error + + +gcal_shell_search_provider2_call_get_subsearch_result_set +void + GcalShellSearchProvider2 *proxy, const gchar *const *arg_PreviousResults, const gchar *const *arg_Terms, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data + + +gcal_shell_search_provider2_call_get_subsearch_result_set_finish +gboolean + GcalShellSearchProvider2 *proxy, gchar ***out_Results, GAsyncResult *res, GError **error + + +gcal_shell_search_provider2_call_get_subsearch_result_set_sync +gboolean + GcalShellSearchProvider2 *proxy, const gchar *const *arg_PreviousResults, const gchar *const *arg_Terms, gchar ***out_Results, GCancellable *cancellable, GError **error + + +gcal_shell_search_provider2_call_get_result_metas +void + GcalShellSearchProvider2 *proxy, const gchar *const *arg_Results, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data + + +gcal_shell_search_provider2_call_get_result_metas_finish +gboolean + GcalShellSearchProvider2 *proxy, GVariant **out_Metas, GAsyncResult *res, GError **error + + +gcal_shell_search_provider2_call_get_result_metas_sync +gboolean + GcalShellSearchProvider2 *proxy, const gchar *const *arg_Results, GVariant **out_Metas, GCancellable *cancellable, GError **error + + +gcal_shell_search_provider2_call_activate_result +void + GcalShellSearchProvider2 *proxy, const gchar *arg_Result, const gchar *const *arg_Terms, guint arg_Timestamp, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data + + +gcal_shell_search_provider2_call_activate_result_finish +gboolean + GcalShellSearchProvider2 *proxy, GAsyncResult *res, GError **error + + +gcal_shell_search_provider2_call_activate_result_sync +gboolean + GcalShellSearchProvider2 *proxy, const gchar *arg_Result, const gchar *const *arg_Terms, guint arg_Timestamp, GCancellable *cancellable, GError **error + + +gcal_shell_search_provider2_call_launch_search +void + GcalShellSearchProvider2 *proxy, const gchar *const *arg_Terms, guint arg_Timestamp, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data + + +gcal_shell_search_provider2_call_launch_search_finish +gboolean + GcalShellSearchProvider2 *proxy, GAsyncResult *res, GError **error + + +gcal_shell_search_provider2_call_launch_search_sync +gboolean + GcalShellSearchProvider2 *proxy, const gchar *const *arg_Terms, guint arg_Timestamp, GCancellable *cancellable, GError **error + + +GCAL_TYPE_SHELL_SEARCH_PROVIDER2_PROXY +#define GCAL_TYPE_SHELL_SEARCH_PROVIDER2_PROXY (gcal_shell_search_provider2_proxy_get_type ()) + + +GCAL_SHELL_SEARCH_PROVIDER2_PROXY +#define GCAL_SHELL_SEARCH_PROVIDER2_PROXY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GCAL_TYPE_SHELL_SEARCH_PROVIDER2_PROXY, GcalShellSearchProvider2Proxy)) + + +GCAL_SHELL_SEARCH_PROVIDER2_PROXY_CLASS +#define GCAL_SHELL_SEARCH_PROVIDER2_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), GCAL_TYPE_SHELL_SEARCH_PROVIDER2_PROXY, GcalShellSearchProvider2ProxyClass)) + + +GCAL_SHELL_SEARCH_PROVIDER2_PROXY_GET_CLASS +#define GCAL_SHELL_SEARCH_PROVIDER2_PROXY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GCAL_TYPE_SHELL_SEARCH_PROVIDER2_PROXY, GcalShellSearchProvider2ProxyClass)) + + +GCAL_IS_SHELL_SEARCH_PROVIDER2_PROXY +#define GCAL_IS_SHELL_SEARCH_PROVIDER2_PROXY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GCAL_TYPE_SHELL_SEARCH_PROVIDER2_PROXY)) + + +GCAL_IS_SHELL_SEARCH_PROVIDER2_PROXY_CLASS +#define GCAL_IS_SHELL_SEARCH_PROVIDER2_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GCAL_TYPE_SHELL_SEARCH_PROVIDER2_PROXY)) + + +GcalShellSearchProvider2Proxy +struct _GcalShellSearchProvider2Proxy +{ + /*< private >*/ + GDBusProxy parent_instance; + GcalShellSearchProvider2ProxyPrivate *priv; +}; + + +GcalShellSearchProvider2ProxyClass +struct _GcalShellSearchProvider2ProxyClass +{ + GDBusProxyClass parent_class; +}; + + +gcal_shell_search_provider2_proxy_get_type +GType +void + + +gcal_shell_search_provider2_proxy_new +void + GDBusConnection *connection, GDBusProxyFlags flags, const gchar *name, const gchar *object_path, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data + + +gcal_shell_search_provider2_proxy_new_finish +GcalShellSearchProvider2 * + GAsyncResult *res, GError **error + + +gcal_shell_search_provider2_proxy_new_sync +GcalShellSearchProvider2 * + GDBusConnection *connection, GDBusProxyFlags flags, const gchar *name, const gchar *object_path, GCancellable *cancellable, GError **error + + +gcal_shell_search_provider2_proxy_new_for_bus +void + GBusType bus_type, GDBusProxyFlags flags, const gchar *name, const gchar *object_path, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data + + +gcal_shell_search_provider2_proxy_new_for_bus_finish +GcalShellSearchProvider2 * + GAsyncResult *res, GError **error + + +gcal_shell_search_provider2_proxy_new_for_bus_sync +GcalShellSearchProvider2 * + GBusType bus_type, GDBusProxyFlags flags, const gchar *name, const gchar *object_path, GCancellable *cancellable, GError **error + + +GCAL_TYPE_SHELL_SEARCH_PROVIDER2_SKELETON +#define GCAL_TYPE_SHELL_SEARCH_PROVIDER2_SKELETON (gcal_shell_search_provider2_skeleton_get_type ()) + + +GCAL_SHELL_SEARCH_PROVIDER2_SKELETON +#define GCAL_SHELL_SEARCH_PROVIDER2_SKELETON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GCAL_TYPE_SHELL_SEARCH_PROVIDER2_SKELETON, GcalShellSearchProvider2Skeleton)) + + +GCAL_SHELL_SEARCH_PROVIDER2_SKELETON_CLASS +#define GCAL_SHELL_SEARCH_PROVIDER2_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), GCAL_TYPE_SHELL_SEARCH_PROVIDER2_SKELETON, GcalShellSearchProvider2SkeletonClass)) + + +GCAL_SHELL_SEARCH_PROVIDER2_SKELETON_GET_CLASS +#define GCAL_SHELL_SEARCH_PROVIDER2_SKELETON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GCAL_TYPE_SHELL_SEARCH_PROVIDER2_SKELETON, GcalShellSearchProvider2SkeletonClass)) + + +GCAL_IS_SHELL_SEARCH_PROVIDER2_SKELETON +#define GCAL_IS_SHELL_SEARCH_PROVIDER2_SKELETON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GCAL_TYPE_SHELL_SEARCH_PROVIDER2_SKELETON)) + + +GCAL_IS_SHELL_SEARCH_PROVIDER2_SKELETON_CLASS +#define GCAL_IS_SHELL_SEARCH_PROVIDER2_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GCAL_TYPE_SHELL_SEARCH_PROVIDER2_SKELETON)) + + +GcalShellSearchProvider2Skeleton +struct _GcalShellSearchProvider2Skeleton +{ + /*< private >*/ + GDBusInterfaceSkeleton parent_instance; + GcalShellSearchProvider2SkeletonPrivate *priv; +}; + + +GcalShellSearchProvider2SkeletonClass +struct _GcalShellSearchProvider2SkeletonClass +{ + GDBusInterfaceSkeletonClass parent_class; +}; + + +gcal_shell_search_provider2_skeleton_get_type +GType +void + + +gcal_shell_search_provider2_skeleton_new +GcalShellSearchProvider2 * +void + + +GcalShellSearchProvider2 + + +GcalShellSearchProvider2ProxyPrivate + + +GcalShellSearchProvider2SkeletonPrivate + + +GCAL_ENABLE_TRACE +# define GCAL_ENABLE_TRACE 1 + + +GCAL_LOG_LEVEL_TRACE +# define GCAL_LOG_LEVEL_TRACE ((GLogLevelFlags)(1 << G_LOG_LEVEL_USER_SHIFT)) + + +GCAL_TRACE_MSG +# define GCAL_TRACE_MSG(fmt, ...) \ + g_log(G_LOG_DOMAIN, GCAL_LOG_LEVEL_TRACE, " MSG: %s():%d: " fmt, \ + G_STRFUNC, __LINE__, ##__VA_ARGS__) + + +GCAL_PROBE +# define GCAL_PROBE \ + g_log(G_LOG_DOMAIN, GCAL_LOG_LEVEL_TRACE, "PROBE: %s():%d", \ + G_STRFUNC, __LINE__) + + +GCAL_TODO +# define GCAL_TODO(_msg) \ + g_log(G_LOG_DOMAIN, GCAL_LOG_LEVEL_TRACE, " TODO: %s():%d: %s", \ + G_STRFUNC, __LINE__, _msg) + + +GCAL_ENTRY +# define GCAL_ENTRY \ + g_log(G_LOG_DOMAIN, GCAL_LOG_LEVEL_TRACE, "ENTRY: %s():%d", \ + G_STRFUNC, __LINE__) + + +GCAL_EXIT +# define GCAL_EXIT \ + G_STMT_START { \ + g_log(G_LOG_DOMAIN, GCAL_LOG_LEVEL_TRACE, " EXIT: %s():%d", \ + G_STRFUNC, __LINE__); \ + return; \ + } G_STMT_END + + +GCAL_GOTO +# define GCAL_GOTO(_l) \ + G_STMT_START { \ + g_log(G_LOG_DOMAIN, GCAL_LOG_LEVEL_TRACE, " GOTO: %s():%d ("#_l")",\ + G_STRFUNC, __LINE__); \ + goto _l; \ + } G_STMT_END + + +GCAL_RETURN +# define GCAL_RETURN(_r) \ + G_STMT_START { \ + g_log(G_LOG_DOMAIN, GCAL_LOG_LEVEL_TRACE, " EXIT: %s():%d ", \ + G_STRFUNC, __LINE__); \ + return _r; \ + } G_STMT_END + + +GCAL_BUG +#define GCAL_BUG(Component, Description, ...) \ + _GCAL_BUG(Component, Description, __FILE__, __LINE__, G_STRFUNC, ##__VA_ARGS__) + + +GCAL_RESPONSE_DELETE_EVENT +#define GCAL_RESPONSE_DELETE_EVENT 2 + + +GCAL_RESPONSE_SAVE_EVENT +#define GCAL_RESPONSE_SAVE_EVENT 4 + + +GCAL_RESPONSE_CREATE_EVENT +#define GCAL_RESPONSE_CREATE_EVENT 6 + + +GCAL_TYPE_EDIT_DIALOG +#define GCAL_TYPE_EDIT_DIALOG (gcal_edit_dialog_get_type ()) + + +gcal_edit_dialog_new +GtkWidget * +void + + +gcal_edit_dialog_set_event_is_new +void +GcalEditDialog *dialog, gboolean event_is_new + + +gcal_edit_dialog_get_event +GcalEvent * +GcalEditDialog *dialog + + +gcal_edit_dialog_set_event +void +GcalEditDialog *dialog, GcalEvent *event + + +gcal_edit_dialog_set_manager +void +GcalEditDialog *dialog, GcalManager *manager + + +gcal_edit_dialog_set_time_format +void +GcalEditDialog *dialog, gboolean use_24h_format + + +gcal_edit_dialog_get_date_end +GDateTime * +GcalEditDialog *dialog + + +gcal_edit_dialog_get_date_start +GDateTime * +GcalEditDialog *dialog + + +GcalEditDialog + + +GCAL_TYPE_MULTI_CHOICE +#define GCAL_TYPE_MULTI_CHOICE (gcal_multi_choice_get_type()) + + +gcal_multi_choice_new +GtkWidget * +void + + +gcal_multi_choice_get_value +gint +GcalMultiChoice *self + + +gcal_multi_choice_set_value +void +GcalMultiChoice *self, gint value + + +gcal_multi_choice_set_choices +void +GcalMultiChoice *self, const gchar **selfs + + +GcalMultiChoiceFormatCallback +gchar * +GcalMultiChoice *self, + gint value, + gpointer user_data + + +gcal_multi_choice_set_format_callback +void +GcalMultiChoice *self, GcalMultiChoiceFormatCallback callback, gpointer user_data, GDestroyNotify notify + + +GcalMultiChoice + + +GCAL_TYPE_DATE_CHOOSER_DAY +#define GCAL_TYPE_DATE_CHOOSER_DAY (gcal_date_chooser_day_get_type()) + + +gcal_date_chooser_day_new +GtkWidget * +void + + +gcal_date_chooser_day_get_date +GDateTime * +GcalDateChooserDay *day + + +gcal_date_chooser_day_set_date +void +GcalDateChooserDay *day, GDateTime *date + + +gcal_date_chooser_day_set_other_month +void +GcalDateChooserDay *day, gboolean other_month + + +gcal_date_chooser_day_set_selected +void +GcalDateChooserDay *day, gboolean selected + + +gcal_date_chooser_day_set_options +void +GcalDateChooserDay *day, GcalDateChooserDayOptions options + + +GcalDateChooserDay + + +GCAL_TYPE_EVENT_WIDGET +#define GCAL_TYPE_EVENT_WIDGET (gcal_event_widget_get_type ()) + + +gcal_event_widget_new +GtkWidget * +GcalEvent *event + + +gcal_event_widget_get_event +GcalEvent * +GcalEventWidget *self + + +gcal_event_widget_get_date_start +GDateTime * +GcalEventWidget *self + + +gcal_event_widget_set_date_start +void +GcalEventWidget *self, GDateTime *date_start + + +gcal_event_widget_get_date_end +GDateTime * +GcalEventWidget *self + + +gcal_event_widget_set_date_end +void +GcalEventWidget *self, GDateTime *date_end + + +gcal_event_widget_set_read_only +void +GcalEventWidget *event, gboolean read_only + + +gcal_event_widget_get_read_only +gboolean +GcalEventWidget *event + + +gcal_event_widget_set_has_reminders +void +GcalEventWidget *event, gboolean has_reminders + + +gcal_event_widget_get_has_reminders +gboolean +GcalEventWidget *event + + +gcal_event_widget_clone +GtkWidget * +GcalEventWidget *widget + + +gcal_event_widget_equal +gboolean +GcalEventWidget *widget1, GcalEventWidget *widget2 + + +gcal_event_widget_compare_by_length +gint +GcalEventWidget *widget1, GcalEventWidget *widget2 + + +gcal_event_widget_compare_by_start_date +gint +GcalEventWidget *widget1, GcalEventWidget *widget2 + + +GcalEventWidget + + +GcalSubscriberViewPrivate +struct _GcalSubscriberViewPrivate +{ + /** + * Hash to keep children widgets (all of them, parent widgets and its parts if there's any), + * uuid as key and a list of all the instances of the event as value. Here, the first widget on the list is + * the master, and the rest are the parts. Note: that the master is a part itself, the first one + */ + GHashTable *children; + + /** + * Hash containig single-cell events, day of the month, on month-view, month of the year on year-view as key and + * a list of the events that belongs to this cell + */ + GHashTable *single_cell_children; + + /** + * An organizaed list containig multiday events + * This one contains only parents events, to find out its parts @children will be used + */ + GList *multi_cell_children; + + /** + * Hash containing cells that who has overflow per list of hidden widgets. + */ + GHashTable *overflow_cells; + /** + * Set containing the master widgets hidden for delete; + */ + GHashTable *hidden_as_overflow; + + /* state flags */ + gboolean children_changed; +}; + + +GCAL_TYPE_SEARCH_VIEW +#define GCAL_TYPE_SEARCH_VIEW (gcal_search_view_get_type ()) + + +gcal_search_view_set_time_format +void +GcalSearchView *view, gboolean format_24h + + +gcal_search_view_search +void +GcalSearchView *view, const gchar *field, const gchar *query + + +gcal_search_view_new +GtkWidget * +void + + +gcal_search_view_connect +void +GcalSearchView *search_view, GcalManager *manager + + +GcalSearchView + + +GCAL_RESPONSE_REMOVE_SOURCE +#define GCAL_RESPONSE_REMOVE_SOURCE 2 + + +GCAL_TYPE_SOURCE_DIALOG +#define GCAL_TYPE_SOURCE_DIALOG (gcal_source_dialog_get_type()) + + +GcalSourceDialogMode +typedef enum +{ + GCAL_SOURCE_DIALOG_MODE_CREATE, + GCAL_SOURCE_DIALOG_MODE_CREATE_WEB, + GCAL_SOURCE_DIALOG_MODE_EDIT, + GCAL_SOURCE_DIALOG_MODE_NORMAL +} GcalSourceDialogMode; + + +gcal_source_dialog_new +GtkWidget * +void + + +gcal_source_dialog_set_manager +void +GcalSourceDialog *dialog, GcalManager *manager + + +gcal_source_dialog_set_mode +void +GcalSourceDialog *dialog, GcalSourceDialogMode mode + + +gcal_source_dialog_set_source +void +GcalSourceDialog *dialog, ESource *source + + +GcalSourceDialog + + +GCAL_TYPE_YEAR_VIEW +#define GCAL_TYPE_YEAR_VIEW (gcal_year_view_get_type()) + + +gcal_year_view_set_manager +void +GcalYearView *year_view, GcalManager *manager + + +gcal_year_view_set_first_weekday +void +GcalYearView *year_view, gint nr_day + + +gcal_year_view_set_use_24h_format +void +GcalYearView *year_view, gboolean use_24h_format + + +gcal_year_view_set_current_date +void +GcalYearView *year_view, icaltimetype *current_date + + +GcalYearView + + +GCAL_TYPE_WEEK_VIEW +#define GCAL_TYPE_WEEK_VIEW (gcal_week_view_get_type ()) + + +gcal_week_view_new +GtkWidget * +void + + +gcal_week_view_set_manager +void +GcalWeekView *self, GcalManager *manager + + +gcal_week_view_set_first_weekday +void +GcalWeekView *self, gint day_nr + + +gcal_week_view_set_use_24h_format +void +GcalWeekView *self, gboolean use_24h + + +GcalWeekView + + +GCAL_TYPE_WEEK_GRID +#define GCAL_TYPE_WEEK_GRID (gcal_week_grid_get_type()) + + +gcal_week_grid_set_manager +void +GcalWeekGrid *week_grid, GcalManager *manager + + +gcal_week_grid_set_first_weekday +void +GcalWeekGrid *week_grid, gint nr_day + + +gcal_week_grid_set_use_24h_format +void +GcalWeekGrid *week_grid, gboolean use_24h_format + + +gcal_week_grid_add_event +void +GcalWeekGrid *self, GcalEvent *event + + +gcal_week_grid_remove_event +void +GcalWeekGrid *self, const gchar *uid + + +gcal_week_grid_get_children_by_uuid +GList * +GcalWeekGrid *self, const gchar *uid + + +gcal_week_grid_clear_marks +void +GcalWeekGrid *self + + +GcalWeekGrid + + +GCAL_TYPE_MONTH_VIEW +#define GCAL_TYPE_MONTH_VIEW (gcal_month_view_get_type ()) + + +gcal_month_view_set_first_weekday +void +GcalMonthView *self, gint day_nr + + +gcal_month_view_set_use_24h_format +void +GcalMonthView *self, gboolean use_24h + + +gcal_month_view_set_manager +void +GcalMonthView *self , GcalManager *manager + + +GcalMonthView + + +GCAL_TYPE_WEEK_HEADER +#define GCAL_TYPE_WEEK_HEADER (gcal_week_header_get_type()) + + +gcal_week_header_set_manager +void +GcalWeekHeader *self, GcalManager *manager + + +gcal_week_header_set_first_weekday +void +GcalWeekHeader *self, gint nr_day + + +gcal_week_header_set_use_24h_format +void +GcalWeekHeader *self, gboolean use_24h_format + + +gcal_week_header_add_event +void +GcalWeekHeader *self, GcalEvent *event + + +gcal_week_header_remove_event +void +GcalWeekHeader *self, const gchar *uuid + + +gcal_week_header_get_children_by_uuid +GList * +GcalWeekHeader *self, const gchar *uuid + + +gcal_week_header_get_sidebar_size_group +GtkSizeGroup * +GcalWeekHeader *self + + +gcal_week_header_clear_marks +void +GcalWeekHeader *self + + +GcalWeekHeader + + +GCAL_TYPE_RANGE_TREE +#define GCAL_TYPE_RANGE_TREE (gcal_range_tree_get_type()) + + +GcalRangeTraverseFunc +gboolean +guint16 start, + guint16 end, + gpointer data, + gpointer user_data + + +gcal_range_tree_get_type +GType +void + + +gcal_range_tree_new +GcalRangeTree * +void + + +gcal_range_tree_copy +GcalRangeTree * +GcalRangeTree *self + + +gcal_range_tree_ref +GcalRangeTree * +GcalRangeTree *self + + +gcal_range_tree_unref +void +GcalRangeTree *self + + +gcal_range_tree_add_range +void +GcalRangeTree *self, guint16 start, guint16 end, gpointer data + + +gcal_range_tree_remove_range +void +GcalRangeTree *self, guint16 start, guint16 end, gpointer data + + +gcal_range_tree_traverse +void +GcalRangeTree *self, GTraverseType type, GcalRangeTraverseFunc func, gpointer user_data + + +gcal_range_tree_get_data_at_range +GPtrArray * +GcalRangeTree *self, guint16 start, guint16 end + + +gcal_range_tree_count_entries_at_range +guint64 +GcalRangeTree *self, guint16 start, guint16 end + + +GcalRangeTree + diff --git a/doc/reference/gnome-calendar-docs.sgml b/doc/reference/gnome-calendar-docs.sgml new file mode 100644 index 00000000..f88cbf26 --- /dev/null +++ b/doc/reference/gnome-calendar-docs.sgml @@ -0,0 +1,69 @@ + + + + %gtkdocentities; +]> + + + &package_name; Reference Manual + + for &package_string;. + The latest version of this documentation can be found on-line at + http://[SERVER]/&package_name;/. + + + + + [Insert title here] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Object Hierarchy + + + + API Index + + + + Index of deprecated API + + + + diff --git a/doc/reference/gnome-calendar-overrides.txt b/doc/reference/gnome-calendar-overrides.txt new file mode 100644 index 00000000..e69de29b diff --git a/doc/reference/gnome-calendar-sections.txt b/doc/reference/gnome-calendar-sections.txt new file mode 100644 index 00000000..ed99d871 --- /dev/null +++ b/doc/reference/gnome-calendar-sections.txt @@ -0,0 +1,581 @@ +
+css-code +CSS Code +CSS_TEMPLATE +
+ +
+e-cal-data-model +ECalDataModel +ECalDataModelViewState +EThreadJobFunc +e_cal_data_model_new +e_cal_data_model_new_clone +e_cal_data_model_submit_thread_job +e_cal_data_model_get_disposing +e_cal_data_model_set_disposing +e_cal_data_model_get_expand_recurrences +e_cal_data_model_set_expand_recurrences +e_cal_data_model_get_timezone +e_cal_data_model_set_timezone +e_cal_data_model_set_filter +e_cal_data_model_dup_filter +e_cal_data_model_add_client +e_cal_data_model_remove_client +e_cal_data_model_ref_client +e_cal_data_model_get_clients +e_cal_data_model_get_components +ECalDataModelForeachFunc +e_cal_data_model_foreach_component +e_cal_data_model_subscribe +e_cal_data_model_unsubscribe +e_cal_data_model_get_subscriber_range +e_cal_data_model_freeze_views_update +e_cal_data_model_thaw_views_update +e_cal_data_model_is_views_update_frozen + +ECalDataModel +ECalDataModelClass +ECalDataModelPrivate +E_CAL_DATA_MODEL +E_CAL_DATA_MODEL_CLASS +E_CAL_DATA_MODEL_GET_CLASS +E_IS_CAL_DATA_MODEL +E_IS_CAL_DATA_MODEL_CLASS +E_TYPE_CAL_DATA_MODEL +e_cal_data_model_get_type +
+ +
+e-cal-data-model-subscriber +ECalDataModelSubscriber +e_cal_data_model_subscriber_component_added +e_cal_data_model_subscriber_component_modified +e_cal_data_model_subscriber_component_removed +e_cal_data_model_subscriber_freeze +e_cal_data_model_subscriber_thaw + +ECalDataModelSubscriber +ECalDataModelSubscriberInterface +E_CAL_DATA_MODEL_SUBSCRIBER +E_CAL_DATA_MODEL_SUBSCRIBER_GET_INTERFACE +E_CAL_DATA_MODEL_SUBSCRIBER_INTERFACE +E_IS_CAL_DATA_MODEL_SUBSCRIBER +E_IS_CAL_DATA_MODEL_SUBSCRIBER_INTERFACE +E_TYPE_CAL_DATA_MODEL_SUBSCRIBER +e_cal_data_model_subscriber_get_type +
+ +
+gcal-application +GcalApplication +GCAL_TYPE_APPLICATION +gcal_application_new +gcal_application_get_manager +gcal_application_get_settings +gcal_application_set_uuid +gcal_application_set_initial_date +GcalApplication +
+ +
+gcal-date-chooser +GcalDateChooser +GcalDateChooserDayOptions +GCAL_TYPE_DATE_CHOOSER +GcalDateChooserDayOptionsCallback +gcal_date_chooser_new +gcal_date_chooser_get_date +gcal_date_chooser_set_date +gcal_date_chooser_set_day_options_callback +gcal_date_chooser_invalidate_day_options +gcal_date_chooser_get_no_month_change +gcal_date_chooser_set_no_month_change +gcal_date_chooser_get_show_heading +gcal_date_chooser_set_show_heading +gcal_date_chooser_get_show_day_names +gcal_date_chooser_set_show_day_names +gcal_date_chooser_get_show_week_numbers +gcal_date_chooser_set_show_week_numbers +GcalDateChooser +
+ +
+gcal-date-chooser-day +GcalDateChooserDay +GCAL_TYPE_DATE_CHOOSER_DAY +gcal_date_chooser_day_new +gcal_date_chooser_day_get_date +gcal_date_chooser_day_set_date +gcal_date_chooser_day_set_other_month +gcal_date_chooser_day_set_selected +gcal_date_chooser_day_set_options +GcalDateChooserDay +
+ +
+gcal-date-selector +GcalDateSelector +GCAL_TYPE_DATE_SELECTOR +gcal_date_selector_new +gcal_date_selector_get_date +gcal_date_selector_set_date +GcalDateSelector +
+ +
+gcal-debug +Debugging +GCAL_ENABLE_TRACE +GCAL_LOG_LEVEL_TRACE +GCAL_TRACE_MSG +GCAL_PROBE +GCAL_TODO +GCAL_ENTRY +GCAL_EXIT +GCAL_GOTO +GCAL_RETURN +GCAL_BUG +
+ +
+gcal-edit-dialog +GcalEditDialog +GCAL_RESPONSE_DELETE_EVENT +GCAL_RESPONSE_SAVE_EVENT +GCAL_RESPONSE_CREATE_EVENT +GCAL_TYPE_EDIT_DIALOG +gcal_edit_dialog_new +gcal_edit_dialog_set_event_is_new +gcal_edit_dialog_get_event +gcal_edit_dialog_set_event +gcal_edit_dialog_set_manager +gcal_edit_dialog_set_time_format +gcal_edit_dialog_get_date_end +gcal_edit_dialog_get_date_start +GcalEditDialog +
+ +
+gcal-enum-types +Enums + +GCAL_EDITABLE_PROPERTY +GCAL_WINDOW_VIEW_TYPE +event_editable_property_get_type +gcal_window_view_type_get_type +
+ +
+gcal-event +GcalEvent +GcalEventError +GCAL_EVENT_ERROR +GCAL_TYPE_EVENT +gcal_event_error_quark +gcal_event_new +gcal_event_get_all_day +gcal_event_set_all_day +gcal_event_get_color +gcal_event_set_color +gcal_event_get_component +gcal_event_get_date_end +gcal_event_set_date_end +gcal_event_get_date_start +gcal_event_set_date_start +gcal_event_get_description +gcal_event_set_description +gcal_event_has_alarms +gcal_event_get_alarms +gcal_event_add_alarm +gcal_event_remove_alarm +gcal_event_get_location +gcal_event_set_location +gcal_event_get_source +gcal_event_set_source +gcal_event_get_summary +gcal_event_set_summary +gcal_event_get_timezone +gcal_event_set_timezone +gcal_event_get_uid +gcal_event_is_multiday +gcal_event_compare +gcal_event_compare_with_current +GcalEvent +
+ +
+gcal-event-widget +GcalEventWidget +GCAL_TYPE_EVENT_WIDGET +gcal_event_widget_new +gcal_event_widget_get_event +gcal_event_widget_get_date_start +gcal_event_widget_set_date_start +gcal_event_widget_get_date_end +gcal_event_widget_set_date_end +gcal_event_widget_set_read_only +gcal_event_widget_get_read_only +gcal_event_widget_set_has_reminders +gcal_event_widget_get_has_reminders +gcal_event_widget_clone +gcal_event_widget_equal +gcal_event_widget_compare_by_length +gcal_event_widget_compare_by_start_date +GcalEventWidget +
+ +
+gcal-log +Logging +gcal_log_init +
+ +
+gcal-manager +GcalManager +GCAL_TYPE_MANAGER +gcal_manager_new_with_settings +gcal_manager_get_source +gcal_manager_get_sources +gcal_manager_get_sources_connected +gcal_manager_get_default_source +gcal_manager_set_default_source +gcal_manager_get_system_timezone +gcal_manager_set_subscriber +gcal_manager_set_search_subscriber +gcal_manager_set_query +gcal_manager_query_client_data +gcal_manager_refresh +gcal_manager_is_client_writable +gcal_manager_create_event +gcal_manager_update_event +gcal_manager_remove_event +gcal_manager_move_event_to_source +gcal_manager_add_source +gcal_manager_enable_source +gcal_manager_disable_source +gcal_manager_save_source +gcal_manager_get_events +gcal_manager_get_loading +gcal_manager_get_goa_client +gcal_manager_get_event_from_shell_search +gcal_manager_setup_shell_search +gcal_manager_set_shell_search_query +gcal_manager_set_shell_search_subscriber +gcal_manager_shell_search_done +gcal_manager_get_shell_search_events +GcalManager +
+ +
+gcal-month-view +GcalMonthView +GCAL_TYPE_MONTH_VIEW +gcal_month_view_set_first_weekday +gcal_month_view_set_use_24h_format +gcal_month_view_set_manager +GcalMonthView +
+ +
+gcal-multi-choice +GcalMultiChoice +GCAL_TYPE_MULTI_CHOICE +gcal_multi_choice_new +gcal_multi_choice_get_value +gcal_multi_choice_set_value +gcal_multi_choice_set_choices +GcalMultiChoiceFormatCallback +gcal_multi_choice_set_format_callback +GcalMultiChoice +
+ +
+gcal-quick-add-popover +GcalQuickAddPopover +GCAL_TYPE_QUICK_ADD_POPOVER +gcal_quick_add_popover_new +gcal_quick_add_popover_set_manager +gcal_quick_add_popover_get_date_start +gcal_quick_add_popover_set_date_start +gcal_quick_add_popover_get_date_end +gcal_quick_add_popover_set_date_end +GcalQuickAddPopover +
+ +
+gcal-range-tree +GcalRangeTree +GcalRangeTraverseFunc +gcal_range_tree_new +gcal_range_tree_copy +gcal_range_tree_ref +gcal_range_tree_unref +gcal_range_tree_add_range +gcal_range_tree_remove_range +gcal_range_tree_traverse +gcal_range_tree_get_data_at_range +gcal_range_tree_count_entries_at_range + +GCAL_TYPE_RANGE_TREE +GcalRangeTree +gcal_range_tree_get_type +
+ +
+gcal-resources +calendar_get_resource +
+ +
+gcal-search-view +GcalSearchView +GCAL_TYPE_SEARCH_VIEW +gcal_search_view_set_time_format +gcal_search_view_search +gcal_search_view_new +gcal_search_view_connect +GcalSearchView +
+ +
+gcal-shell-search-provider +GcalShellSearchProvider +GCAL_TYPE_SHELL_SEARCH_PROVIDER +GcalShellSearchProviderClass +gcal_shell_search_provider_new +gcal_shell_search_provider_dbus_export +gcal_shell_search_provider_dbus_unexport +gcal_shell_search_provider_connect +GcalShellSearchProvider +
+ +
+gcal-shell-search-provider-generated +GcalShellSearchProvider2Skeleton +gcal_shell_search_provider2_interface_info +gcal_shell_search_provider2_override_properties +gcal_shell_search_provider2_complete_get_initial_result_set +gcal_shell_search_provider2_complete_get_subsearch_result_set +gcal_shell_search_provider2_complete_get_result_metas +gcal_shell_search_provider2_complete_activate_result +gcal_shell_search_provider2_complete_launch_search +gcal_shell_search_provider2_call_get_initial_result_set +gcal_shell_search_provider2_call_get_initial_result_set_finish +gcal_shell_search_provider2_call_get_initial_result_set_sync +gcal_shell_search_provider2_call_get_subsearch_result_set +gcal_shell_search_provider2_call_get_subsearch_result_set_finish +gcal_shell_search_provider2_call_get_subsearch_result_set_sync +gcal_shell_search_provider2_call_get_result_metas +gcal_shell_search_provider2_call_get_result_metas_finish +gcal_shell_search_provider2_call_get_result_metas_sync +gcal_shell_search_provider2_call_activate_result +gcal_shell_search_provider2_call_activate_result_finish +gcal_shell_search_provider2_call_activate_result_sync +gcal_shell_search_provider2_call_launch_search +gcal_shell_search_provider2_call_launch_search_finish +gcal_shell_search_provider2_call_launch_search_sync +gcal_shell_search_provider2_proxy_new +gcal_shell_search_provider2_proxy_new_finish +gcal_shell_search_provider2_proxy_new_sync +gcal_shell_search_provider2_proxy_new_for_bus +gcal_shell_search_provider2_proxy_new_for_bus_finish +gcal_shell_search_provider2_proxy_new_for_bus_sync +gcal_shell_search_provider2_skeleton_new + +GCAL_IS_SHELL_SEARCH_PROVIDER2 +GCAL_IS_SHELL_SEARCH_PROVIDER2_PROXY +GCAL_IS_SHELL_SEARCH_PROVIDER2_PROXY_CLASS +GCAL_IS_SHELL_SEARCH_PROVIDER2_SKELETON +GCAL_IS_SHELL_SEARCH_PROVIDER2_SKELETON_CLASS +GCAL_SHELL_SEARCH_PROVIDER2 +GCAL_SHELL_SEARCH_PROVIDER2_GET_IFACE +GCAL_SHELL_SEARCH_PROVIDER2_PROXY +GCAL_SHELL_SEARCH_PROVIDER2_PROXY_CLASS +GCAL_SHELL_SEARCH_PROVIDER2_PROXY_GET_CLASS +GCAL_SHELL_SEARCH_PROVIDER2_SKELETON +GCAL_SHELL_SEARCH_PROVIDER2_SKELETON_CLASS +GCAL_SHELL_SEARCH_PROVIDER2_SKELETON_GET_CLASS +GCAL_TYPE_SHELL_SEARCH_PROVIDER2 +GCAL_TYPE_SHELL_SEARCH_PROVIDER2_PROXY +GCAL_TYPE_SHELL_SEARCH_PROVIDER2_SKELETON +GcalShellSearchProvider2 +GcalShellSearchProvider2Iface +GcalShellSearchProvider2Proxy +GcalShellSearchProvider2ProxyClass +GcalShellSearchProvider2ProxyPrivate +GcalShellSearchProvider2Skeleton +GcalShellSearchProvider2SkeletonClass +GcalShellSearchProvider2SkeletonPrivate +gcal_shell_search_provider2_get_type +gcal_shell_search_provider2_proxy_get_type +gcal_shell_search_provider2_skeleton_get_type +
+ +
+gcal-source-dialog +GcalSourceDialog +GCAL_RESPONSE_REMOVE_SOURCE +GCAL_TYPE_SOURCE_DIALOG +GcalSourceDialogMode +gcal_source_dialog_new +gcal_source_dialog_set_manager +gcal_source_dialog_set_mode +gcal_source_dialog_set_source +GcalSourceDialog +
+ +
+gcal-subscriber-view +GcalSubscriberView +gcal_subscriber_view_get_child_by_uuid + +GCAL_IS_SUBSCRIBER_VIEW +GCAL_IS_SUBSCRIBER_VIEW_CLASS +GCAL_SUBSCRIBER_VIEW +GCAL_SUBSCRIBER_VIEW_CLASS +GCAL_SUBSCRIBER_VIEW_GET_CLASS +GCAL_TYPE_SUBSCRIBER_VIEW +GcalSubscriberView +GcalSubscriberViewClass +GcalSubscriberViewPrivate +gcal_subscriber_view_get_type +
+ +
+gcal-subscriber-view-private +GcalSubscriberViewPrivate +GcalSubscriberViewPrivate +
+ +
+gcal-time-selector +GcalTimeSelector +GCAL_TYPE_TIME_SELECTOR +gcal_time_selector_new +gcal_time_selector_set_time_format +gcal_time_selector_get_time +gcal_time_selector_set_time +GcalTimeSelector +
+ +
+gcal-utils +Utility functions +ICAL_TIME_TYPE +ALIGNED +MINUTES_PER_DAY +MAX_MINUTES +gcal_clear_datetime +GcalWindowViewType +EventEditableProperty +GcalTranslateFunc +icaltime_get_type +datetime_compare_date +datetime_to_icaltime +datetime_is_date +icaltime_to_datetime +gcal_dup_icaltime +gcal_get_weekday +gcal_get_month_name +gcal_get_surface_from_color +get_circle_surface_from_color +get_color_name_from_source +get_desc_from_component +get_uuid_from_component +get_first_weekday +build_component_from_details +icaltime_compare_date +icaltime_compare_with_current +get_start_of_week +get_end_of_week +is_clock_format_24h +e_strftime_fix_am_pm +e_utf8_strftime_fix_am_pm +fix_popover_menu_icons +uri_get_fields +get_source_parent_name_color +format_utc_offset +get_alarm_trigger_minutes +should_change_date_for_scroll +is_source_enabled +
+ +
+gcal-view +GcalView +GCAL_TYPE_VIEW +GcalViewInterface +gcal_view_set_date +gcal_view_get_date +gcal_view_get_initial_date +gcal_view_get_final_date +gcal_view_clear_marks +gcal_view_get_children_by_uuid +GcalView +
+ +
+gcal-week-grid +GcalWeekGrid +GCAL_TYPE_WEEK_GRID +gcal_week_grid_set_manager +gcal_week_grid_set_first_weekday +gcal_week_grid_set_use_24h_format +gcal_week_grid_add_event +gcal_week_grid_remove_event +gcal_week_grid_get_children_by_uuid +gcal_week_grid_clear_marks +GcalWeekGrid +
+ +
+gcal-week-header +GcalWeekHeader +GCAL_TYPE_WEEK_HEADER +gcal_week_header_set_manager +gcal_week_header_set_first_weekday +gcal_week_header_set_use_24h_format +gcal_week_header_add_event +gcal_week_header_remove_event +gcal_week_header_get_children_by_uuid +gcal_week_header_get_sidebar_size_group +gcal_week_header_clear_marks +GcalWeekHeader +
+ +
+gcal-week-view +GcalWeekView +GCAL_TYPE_WEEK_VIEW +gcal_week_view_new +gcal_week_view_set_manager +gcal_week_view_set_first_weekday +gcal_week_view_set_use_24h_format +GcalWeekView +
+ +
+gcal-window +GcalWindow +GCAL_TYPE_WINDOW +gcal_window_new_with_view_and_date +gcal_window_new_event +gcal_window_set_search_mode +gcal_window_set_search_query +gcal_window_open_event_by_uuid +GcalWindow +
+ +
+gcal-year-view +GcalYearView +GCAL_TYPE_YEAR_VIEW +gcal_year_view_set_manager +gcal_year_view_set_first_weekday +gcal_year_view_set_use_24h_format +gcal_year_view_set_current_date +GcalYearView +
+ diff --git a/doc/reference/gnome-calendar-undeclared.txt b/doc/reference/gnome-calendar-undeclared.txt new file mode 100644 index 00000000..e69de29b diff --git a/doc/reference/gnome-calendar-undocumented.txt b/doc/reference/gnome-calendar-undocumented.txt new file mode 100644 index 00000000..8dce38c2 --- /dev/null +++ b/doc/reference/gnome-calendar-undocumented.txt @@ -0,0 +1,351 @@ +47% symbol docs coverage. +264 symbols documented. +182 symbols incomplete. +296 not documented. + + +ALIGNED () +CSS_TEMPLATE +ECalDataModel::view-state-changed +ECalDataModel:expand-recurrences +ECalDataModel:timezone +ECalDataModelForeachFunc () +ECalDataModelViewState () +EThreadJobFunc () +EventEditableProperty () +GCAL_BUG () +GCAL_ENABLE_TRACE +GCAL_ENTRY +GCAL_EVENT_ERROR +GCAL_EXIT +GCAL_GOTO () +GCAL_LOG_LEVEL_TRACE +GCAL_PROBE +GCAL_RESPONSE_CREATE_EVENT +GCAL_RESPONSE_DELETE_EVENT +GCAL_RESPONSE_REMOVE_SOURCE +GCAL_RESPONSE_SAVE_EVENT +GCAL_RETURN () +GCAL_TODO () +GCAL_TRACE_MSG () +GCAL_TYPE_APPLICATION +GCAL_TYPE_DATE_CHOOSER +GCAL_TYPE_DATE_CHOOSER_DAY +GCAL_TYPE_DATE_SELECTOR +GCAL_TYPE_EDIT_DIALOG +GCAL_TYPE_EVENT +GCAL_TYPE_EVENT_WIDGET +GCAL_TYPE_MANAGER +GCAL_TYPE_MONTH_VIEW +GCAL_TYPE_MULTI_CHOICE +GCAL_TYPE_QUICK_ADD_POPOVER +GCAL_TYPE_SEARCH_VIEW +GCAL_TYPE_SHELL_SEARCH_PROVIDER +GCAL_TYPE_SOURCE_DIALOG +GCAL_TYPE_TIME_SELECTOR +GCAL_TYPE_VIEW +GCAL_TYPE_WEEK_GRID +GCAL_TYPE_WEEK_HEADER +GCAL_TYPE_WEEK_VIEW +GCAL_TYPE_WINDOW +GCAL_TYPE_YEAR_VIEW +GcalApplication +GcalDateChooser +GcalDateChooser::day-selected +GcalDateChooser::month-changed +GcalDateChooserDay +GcalDateChooserDay::selected +GcalDateChooserDayOptions () +GcalDateChooserDayOptionsCallback () +GcalDateSelector +GcalEditDialog +GcalEvent +GcalEventError () +GcalEventWidget +GcalEventWidget::activate +GcalManager +GcalManager::query-completed +GcalManager::source-added +GcalManager::source-changed +GcalManager::source-enabled +GcalManager::source-removed +GcalMonthView +GcalMultiChoice +GcalMultiChoice::wrapped +GcalMultiChoiceFormatCallback () +GcalQuickAddPopover +GcalRangeTraverseFunc () +GcalSearchView +GcalShellSearchProvider +GcalShellSearchProviderClass () +GcalSourceDialog +GcalSourceDialogMode () +GcalSubscriberView::event-activated +GcalSubscriberViewPrivate () +GcalTimeSelector +GcalTranslateFunc () +GcalView +GcalViewInterface () +GcalWeekGrid +GcalWeekGrid::event-activated +GcalWeekHeader +GcalWeekHeader::event-activated +GcalWeekView +GcalWeekView::event-activated +GcalWindow +GcalWindowViewType () +GcalYearView +GcalYearView::event-activated +ICAL_TIME_TYPE +MAX_MINUTES +MINUTES_PER_DAY +action_widget_activated (Returns) +back_button_clicked (Returns) +build_component_from_details (summary, initial_date, final_date) +calendar_file_selected (Returns) +calendar_get_resource +calendar_listbox_row_activated (Returns) +clear_pages (Returns) +datetime_compare_date () +datetime_is_date () +datetime_to_icaltime () +description_label_link_activated (Returns) +e_cal_data_model_remove_client (data_model) +e_cal_data_model_subscriber_component_added (comp) +e_strftime_fix_am_pm () +e_utf8_strftime_fix_am_pm () +fix_popover_menu_icons (popover) +format_utc_offset () +free_row_data (Returns) +gcal_application_get_manager () +gcal_application_get_settings () +gcal_application_new +gcal_application_set_initial_date () +gcal_application_set_uuid () +gcal_clear_datetime () +gcal_date_chooser_day_get_date () +gcal_date_chooser_day_new +gcal_date_chooser_day_set_date () +gcal_date_chooser_day_set_options () +gcal_date_chooser_day_set_other_month () +gcal_date_chooser_day_set_selected () +gcal_date_chooser_get_date () +gcal_date_chooser_get_no_month_change () +gcal_date_chooser_get_show_day_names () +gcal_date_chooser_get_show_heading () +gcal_date_chooser_get_show_week_numbers () +gcal_date_chooser_invalidate_day_options () +gcal_date_chooser_new +gcal_date_chooser_set_date () +gcal_date_chooser_set_day_options_callback () +gcal_date_chooser_set_no_month_change () +gcal_date_chooser_set_show_day_names () +gcal_date_chooser_set_show_heading () +gcal_date_chooser_set_show_week_numbers () +gcal_date_selector_new +gcal_dup_icaltime () +gcal_edit_dialog_get_date_end () +gcal_edit_dialog_get_date_start () +gcal_edit_dialog_get_event () +gcal_edit_dialog_new +gcal_edit_dialog_set_event () +gcal_edit_dialog_set_event_is_new () +gcal_edit_dialog_set_manager () +gcal_edit_dialog_set_time_format () +gcal_event_get_description (self) +gcal_event_set_summary (self) +gcal_event_widget_clone () +gcal_event_widget_compare_by_length (widget1, widget2) +gcal_event_widget_compare_by_start_date () +gcal_event_widget_get_has_reminders () +gcal_event_widget_get_read_only () +gcal_event_widget_new () +gcal_event_widget_set_date_start (date_start) +gcal_event_widget_set_has_reminders () +gcal_event_widget_set_read_only () +gcal_get_month_name () +gcal_get_pixbuf_from_color (color, size) +gcal_get_surface_from_color () +gcal_get_weekday () +gcal_log_init +gcal_manager_add_source (backend, name) +gcal_manager_create_event () +gcal_manager_get_default_source +gcal_manager_get_event_from_shell_search () +gcal_manager_get_events (manager, range_start, range_end) +gcal_manager_get_goa_client () +gcal_manager_get_loading () +gcal_manager_get_shell_search_events () +gcal_manager_get_source (manager) +gcal_manager_get_sources (manager) +gcal_manager_get_sources_connected (manager) +gcal_manager_get_system_timezone () +gcal_manager_is_client_writable () +gcal_manager_move_event_to_source () +gcal_manager_new_with_settings +gcal_manager_query_client_data (source, manager, field) +gcal_manager_refresh () +gcal_manager_remove_event () +gcal_manager_set_default_source +gcal_manager_set_search_subscriber () +gcal_manager_set_shell_search_subscriber () +gcal_manager_set_subscriber () +gcal_manager_setup_shell_search () +gcal_manager_shell_search_done () +gcal_manager_update_event () +gcal_month_view_get_final_date +gcal_month_view_motion_notify_event (widget, event, Returns) +gcal_month_view_set_first_weekday (self) +gcal_month_view_set_manager () +gcal_month_view_set_use_24h_format (view, use_24h) +gcal_multi_choice_get_value () +gcal_multi_choice_new +gcal_multi_choice_set_choices () +gcal_multi_choice_set_format_callback () +gcal_multi_choice_set_value () +gcal_quick_add_popover_new +gcal_range_tree_count_entries_at_range () +gcal_search_view_new +gcal_search_view_search () +gcal_search_view_set_search +gcal_shell_search_provider_connect () +gcal_shell_search_provider_dbus_export () +gcal_shell_search_provider_dbus_unexport () +gcal_shell_search_provider_new +gcal_source_dialog_new +gcal_source_dialog_set_manager (Returns) +gcal_source_dialog_set_mode (Returns) +gcal_source_dialog_set_source (Returns) +gcal_subscriber_view_get_child_by_uuid () +gcal_time_selector_get_time () +gcal_time_selector_new +gcal_time_selector_set_time () +gcal_time_selector_set_time_format () +gcal_view_get_date () +gcal_view_set_date () +gcal_week_grid_add_event () +gcal_week_grid_clear_marks () +gcal_week_grid_get_children_by_uuid () +gcal_week_grid_remove_event () +gcal_week_grid_set_first_weekday () +gcal_week_grid_set_manager () +gcal_week_grid_set_use_24h_format () +gcal_week_header_add_event () +gcal_week_header_clear_marks () +gcal_week_header_get_children_by_uuid () +gcal_week_header_get_sidebar_size_group () +gcal_week_header_remove_event () +gcal_week_header_set_first_weekday () +gcal_week_header_set_manager () +gcal_week_header_set_use_24h_format () +gcal_week_view_get_final_date +gcal_week_view_get_initial_date +gcal_week_view_set_first_weekday (view, day_nr) +gcal_week_view_set_manager () +gcal_week_view_set_use_24h_format (view, use_24h) +gcal_window_new_event () +gcal_window_new_with_view_and_date () +gcal_window_open_event_by_uuid () +gcal_window_set_search_mode () +gcal_window_set_search_query () +gcal_year_view_set_current_date () +gcal_year_view_set_first_weekday () +gcal_year_view_set_manager () +gcal_year_view_set_use_24h_format () +get_alarm_trigger_minutes () +get_circle_surface_from_color () +get_color_name_from_source () +get_desc_from_component (component) +get_end_of_week () +get_source_parent_name_color () +get_start_of_week () +hide_notification (Returns) +icaltime_compare_date (date1, date2) +icaltime_compare_with_current () +icaltime_get_type +icaltime_to_datetime () +is_clock_format_24h +is_source_enabled () +name_entry_text_changed (Returns) +notification_child_revealed_changed (Returns) +on_local_activated (Returns) +on_web_activated (Returns) +online_accounts_listbox_row_activated (Returns) +online_accounts_settings_button_clicked (Returns) +open_event (Returns) +remove_button_clicked (Returns) +remove_source (Returns) +response_signal (Returns) +should_change_date_for_scroll () +undo_remove_action (Returns) +update_view (Returns) +uri_get_fields (host, schema, path, uri) +url_entry_text_changed (Returns) +view_changed (object, pspec, user_data) + +css-code:Long_Description +css-code:Short_Description +e-cal-data-model-subscriber:Long_Description +e-cal-data-model-subscriber:Short_Description +e-cal-data-model:Long_Description +e-cal-data-model:Short_Description +gcal-application:Long_Description +gcal-application:Short_Description +gcal-date-chooser-day:Long_Description +gcal-date-chooser-day:Short_Description +gcal-date-chooser:Long_Description +gcal-date-chooser:Short_Description +gcal-date-selector:Long_Description +gcal-date-selector:Short_Description +gcal-debug:Long_Description +gcal-debug:Short_Description +gcal-edit-dialog:Long_Description +gcal-edit-dialog:Short_Description +gcal-enum-types:Long_Description +gcal-enum-types:Short_Description +gcal-event-widget:Long_Description +gcal-event-widget:Short_Description +gcal-event:Long_Description +gcal-event:Short_Description +gcal-log:Long_Description +gcal-log:Short_Description +gcal-manager:Long_Description +gcal-manager:Short_Description +gcal-month-view:Long_Description +gcal-month-view:Short_Description +gcal-multi-choice:Long_Description +gcal-multi-choice:Short_Description +gcal-quick-add-popover:Long_Description +gcal-quick-add-popover:Short_Description +gcal-range-tree:Long_Description +gcal-range-tree:Short_Description +gcal-resources:Long_Description +gcal-resources:Short_Description +gcal-search-view:Long_Description +gcal-search-view:Short_Description +gcal-shell-search-provider-generated:Long_Description +gcal-shell-search-provider-generated:Short_Description +gcal-shell-search-provider:Long_Description +gcal-shell-search-provider:Short_Description +gcal-source-dialog:Long_Description +gcal-source-dialog:Short_Description +gcal-subscriber-view-private:Long_Description +gcal-subscriber-view-private:Short_Description +gcal-subscriber-view:Long_Description +gcal-subscriber-view:Short_Description +gcal-time-selector:Long_Description +gcal-time-selector:Short_Description +gcal-utils:Long_Description +gcal-utils:Short_Description +gcal-view:Long_Description +gcal-view:Short_Description +gcal-week-grid:Long_Description +gcal-week-grid:Short_Description +gcal-week-header:Long_Description +gcal-week-header:Short_Description +gcal-week-view:Long_Description +gcal-week-view:Short_Description +gcal-window:Long_Description +gcal-window:Short_Description +gcal-year-view:Long_Description +gcal-year-view:Short_Description diff --git a/doc/reference/gnome-calendar-unused.txt b/doc/reference/gnome-calendar-unused.txt new file mode 100644 index 00000000..8b2221ea --- /dev/null +++ b/doc/reference/gnome-calendar-unused.txt @@ -0,0 +1,10 @@ +e_cal_data_model_submit_thread_job(description, alert_ident, alert_arg_0) +e_cal_data_model_subscriber_component_added(icalcomp) +fix_popover_menu_icons(window) +gcal_event_set_summary(event) +gcal_event_widget_set_date_start(date_end) +gcal_manager_add_source(base_uri, relative_uri) +gcal_month_view_set_first_weekday(view) +gcal_month_view_set_use_24h_format(view) +gcal_week_view_set_first_weekday(view) +gcal_week_view_set_use_24h_format(view) diff --git a/doc/reference/gnome-calendar.args b/doc/reference/gnome-calendar.args new file mode 100644 index 00000000..b1128cf0 --- /dev/null +++ b/doc/reference/gnome-calendar.args @@ -0,0 +1,470 @@ + +ECalDataModel::expand-recurrences +gboolean + +rw +Expand Recurrences +(null) +FALSE + + + +ECalDataModel::timezone +gpointer + +rw +Time Zone +(null) + + + + +GcalDateChooser::date +GDateTime* + +rw +Date +The selected date. + + + + +GcalDateChooser::no-month-change +gboolean + +rw +No Month Change +If TRUE, the selected month cannot be changed. +FALSE + + + +GcalDateChooser::show-day-names +gboolean + +rw +Show Day Names +If TRUE, day names are displayed. +TRUE + + + +GcalDateChooser::show-heading +gboolean + +rw +Show Heading +If TRUE, a heading is displayed. +TRUE + + + +GcalDateChooser::show-week-numbers +gboolean + +rw +Show Week Numbers +If TRUE, week numbers are displayed. +TRUE + + + +GcalDateSelector::date +GDateTime* + +rw +Date of the selector +The current date of the selector. + + + + +GcalEditDialog::event +GcalEvent* + +rw +event of the dialog +The event being edited. + + + + +GcalEditDialog::manager +GcalManager* + +rw +Manager of the dialog +The manager of the dialog. + + + + +GcalEditDialog::writable +gboolean + +rw +Whether the current event can be edited +Whether the current event can be edited or not. +TRUE + + + +GcalEvent::all-day +gboolean + +rw +If event is all day +Whether the event is all day or not. +FALSE + + + +GcalEvent::color +GdkRGBA* + +rw +Color of the event +The color of the event. + + + + +GcalEvent::component +ECalComponent* + +rwX +Component +The ECalComponent of the event. + + + + +GcalEvent::date-end +GDateTime* + +rw +End date of the event +The end date of the event. + + + + +GcalEvent::date-start +GDateTime* + +rw +Start date of the event +The start date of the event. + + + + +GcalEvent::description +gchar* + +rw +Description of the event +The description of the event. +"" + + + +GcalEvent::location +gchar* + +rw +Location of the event +The location of the event. +"" + + + +GcalEvent::source +ESource* + +rwx +ESource +The ESource this event belongs to. + + + + +GcalEvent::summary +gchar* + +rw +Summary of the event +The summary of the event. +"" + + + +GcalEvent::timezone +GTimeZone* + +rw +Timezone of the event +The timezone of the event. + + + + +GcalEvent::uid +gchar* + +r +Identifier of the event +The unique identifier of the event. +"" + + + +GcalEventWidget::date-end +GDateTime* + +rw +End date +The end date of the widget. + + + + +GcalEventWidget::date-start +GDateTime* + +rw +Start date +The start date of the widget. + + + + +GcalEventWidget::event +GcalEvent* + +rwX +Event +The event this widget represents. + + + + +GcalManager::default-calendar +ESource* + +rw +Default calendar +The default calendar. + + + + +GcalManager::loading +gboolean + +r +Loading +Whether it's still loading or not. +TRUE + + + +GcalManager::settings +GSettings* + +rwX +Application settings +The settings of the application passed down from GcalApplication. + + + + +GcalMultiChoice::animate +gboolean + +rw +Animate +Animate. +FALSE + + + +GcalMultiChoice::choices +GStrv + +w +Choices +Choices. + + + + +GcalMultiChoice::max-value +gint + +rw +Maximum Value +Maximum Value. +0 + + + +GcalMultiChoice::min-value +gint + +rw +Minimum Value +Minimum Value. +0 + + + +GcalMultiChoice::value +gint + +rw +Value +Value. +0 + + + +GcalMultiChoice::wrap +gboolean + +rw +Wrap +Wrap. +FALSE + + + +GcalQuickAddPopover::date-end +GDateTime* + +rw +End date of the event +The end date of the new event. + + + + +GcalQuickAddPopover::date-start +GDateTime* + +rw +Start date of the event +The start date of the new event. + + + + +GcalQuickAddPopover::manager +GcalManager* + +rw +Manager of the application +The singleton manager of the application. + + + + +GcalSearchView::active-date +icaltimetype* + +rw +The active date +The active/selected date in the view. + + + + +GcalTimeSelector::time +GDateTime* + +rw +Time of the selector +The current time of the selector. + + + + +GcalView::active-date +icaltimetype* + +rw +The active date +The active/selecetd date in the view. + + + + +GcalWeekGrid::active-date +icaltimetype* + +rwx +Date +The active selected date. + + + + +GcalWeekHeader::active-date +icaltimetype* + +rwx +Date +The active selected date. + + + + +GcalWindow::active-date +icaltimetype* + +rwx +Date +The active/selected date. + + + + +GcalWindow::active-view +GcalWindowViewType + +rw +Active View +The active view, eg: month, week, etc. +GCAL_WINDOW_VIEW_MONTH + + + +GcalWindow::manager +GcalManager* + +rwX +The manager object +A weak reference to the app manager object. + + + + +GcalWindow::new-event-mode +gboolean + +rw +New Event mode +Whether the window is in new-event-mode or not. +FALSE + + + +GcalYearView::show-week-numbers +gboolean + +rw +Show Week Numbers +Show Week Numbers Column. +FALSE + + diff --git a/doc/reference/gnome-calendar.hierarchy b/doc/reference/gnome-calendar.hierarchy new file mode 100644 index 00000000..7e24ac9d --- /dev/null +++ b/doc/reference/gnome-calendar.hierarchy @@ -0,0 +1,156 @@ +GObject + ECalDataModel + GApplication + GtkApplication + GcalApplication + GInitiallyUnowned + GtkWidget + GtkContainer + GtkBin + GcalDateChooserDay + GcalDateChooser + GtkWindow + GtkDialog + GcalEditDialog + GcalSourceDialog + GtkApplicationWindow + GcalWindow + GtkPopover + GcalQuickAddPopover + GcalSearchView + GtkButton + GtkToggleButton + GtkMenuButton + GcalTimeSelector + GcalSubscriberView + GcalMonthView + GtkBox + GcalMultiChoice + GcalWeekView + GcalYearView + GcalWeekGrid + GtkGrid + GcalWeekHeader + GtkMenuShell + GtkMenu + GtkEntry + GcalDateSelector + GcalEventWidget + GcalEvent + GcalManager + GDBusProxy + GcalShellSearchProvider2Proxy + GDBusInterfaceSkeleton + GcalShellSearchProvider2Skeleton + GcalShellSearchProvider + ECalClientView + GApplicationCommandLine + GMenuModel + AtkObject + GtkAccessible + GtkWidgetAccessible + GtkContainerAccessible + GtkWindowAccessible + GtkPopoverAccessible + GtkButtonAccessible + GtkToggleButtonAccessible + GtkMenuButtonAccessible + GtkEntryAccessible + GtkStyle + GdkWindow + GdkDragContext + GtkTooltip + GdkScreen + GdkDisplayManager + GdkDisplay + GtkEntryBuffer + GdkPixbuf + GtkEntryCompletion + GZlibDecompressor + GFileInfo + ECalComponent + ESource + GSettings + GDBusMethodInvocation + GDBusConnection + ESourceExtension + ESourceLocal + GtkAction +GInterface + GTypePlugin + ECalDataModelSubscriber + GActionGroup + GActionMap + AtkImplementorIface + GtkBuildable + GtkEditable + GtkCellEditable + GInitable + GtkOrientable + GcalView + GcalShellSearchProvider2 + GDBusInterface + GAsyncInitable + GtkActionable + GtkActivatable + AtkComponent + GIcon + GLoadableIcon + GtkCellLayout + AtkEditableText + AtkText + AtkAction + AtkWindow + GConverter + GProxyResolver + AtkImage +GEnum + EventEditableProperty + GcalWindowViewType + GtkAlign + GtkStateType + GtkTextDirection + GtkDirectionType + GtkDragResult + GtkWidgetHelpType + GtkResizeMode + GtkShadowType + GtkImageType + GtkInputPurpose + GtkMovementStep + GtkDeleteType + GtkEntryIconPosition + GtkWindowType + GtkWindowPosition + GdkWindowTypeHint + GdkGravity + GZlibCompressorFormat + GtkOrientation + GtkBaselinePosition + GtkPackType + GtkPositionType + GtkPopoverConstraint + GBusType + GtkReliefStyle + GtkArrowType +GBoxed + GValueArray + GcalRangeTree + icaltimetype + GError + GVariantDict + GdkRectangle + CairoRectangleInt + CairoContext + GdkEvent + GtkSelectionData + GtkRequisition + GtkBorder + GdkColor + GDateTime + PangoAttrList + PangoTabArray + GdkRGBA + GTimeZone + GStrv + GDBusInterfaceInfo diff --git a/doc/reference/gnome-calendar.interfaces b/doc/reference/gnome-calendar.interfaces new file mode 100644 index 00000000..c36201ea --- /dev/null +++ b/doc/reference/gnome-calendar.interfaces @@ -0,0 +1,56 @@ +GApplication GActionGroup GActionMap +GtkApplication GActionGroup GActionMap +GcalApplication GActionGroup GActionMap +GtkWidget AtkImplementorIface GtkBuildable +GtkContainer AtkImplementorIface GtkBuildable +GtkBin AtkImplementorIface GtkBuildable +GcalDateChooserDay AtkImplementorIface GtkBuildable +GcalDateChooser AtkImplementorIface GtkBuildable +GtkWindow AtkImplementorIface GtkBuildable +GtkDialog AtkImplementorIface GtkBuildable +GcalEditDialog AtkImplementorIface GtkBuildable +GcalSourceDialog AtkImplementorIface GtkBuildable +GtkApplicationWindow AtkImplementorIface GtkBuildable GActionGroup GActionMap +GcalWindow AtkImplementorIface GtkBuildable GActionGroup GActionMap +GtkPopover AtkImplementorIface GtkBuildable +GcalQuickAddPopover AtkImplementorIface GtkBuildable +GcalSearchView AtkImplementorIface GtkBuildable ECalDataModelSubscriber +GtkButton AtkImplementorIface GtkBuildable GtkActionable GtkActivatable +GtkToggleButton AtkImplementorIface GtkBuildable GtkActionable GtkActivatable +GtkMenuButton AtkImplementorIface GtkBuildable GtkActionable GtkActivatable +GcalTimeSelector AtkImplementorIface GtkBuildable GtkActionable GtkActivatable +GcalSubscriberView AtkImplementorIface GtkBuildable ECalDataModelSubscriber +GcalMonthView AtkImplementorIface GtkBuildable ECalDataModelSubscriber GcalView +GtkBox AtkImplementorIface GtkBuildable GtkOrientable +GcalMultiChoice AtkImplementorIface GtkBuildable GtkOrientable +GcalWeekView AtkImplementorIface GtkBuildable GtkOrientable GcalView ECalDataModelSubscriber +GcalYearView AtkImplementorIface GtkBuildable GtkOrientable GcalView ECalDataModelSubscriber +GcalWeekGrid AtkImplementorIface GtkBuildable +GtkGrid AtkImplementorIface GtkBuildable GtkOrientable +GcalWeekHeader AtkImplementorIface GtkBuildable GtkOrientable +GtkMenuShell AtkImplementorIface GtkBuildable +GtkMenu AtkImplementorIface GtkBuildable +GtkEntry AtkImplementorIface GtkBuildable GtkEditable GtkCellEditable +GcalDateSelector AtkImplementorIface GtkBuildable GtkEditable GtkCellEditable +GcalEventWidget AtkImplementorIface GtkBuildable GtkOrientable +GcalEvent GInitable +GDBusProxy GDBusInterface GInitable GAsyncInitable +GcalShellSearchProvider2Proxy GDBusInterface GInitable GAsyncInitable GcalShellSearchProvider2 +GDBusInterfaceSkeleton GDBusInterface +GcalShellSearchProvider2Skeleton GDBusInterface GcalShellSearchProvider2 +GcalShellSearchProvider ECalDataModelSubscriber +ECalClientView GInitable +GtkWidgetAccessible AtkComponent +GtkContainerAccessible AtkComponent +GtkWindowAccessible AtkComponent AtkWindow +GtkPopoverAccessible AtkComponent +GtkButtonAccessible AtkComponent AtkAction AtkImage +GtkToggleButtonAccessible AtkComponent AtkAction AtkImage +GtkMenuButtonAccessible AtkComponent AtkAction AtkImage +GtkEntryAccessible AtkComponent AtkEditableText AtkText AtkAction +GdkPixbuf GIcon GLoadableIcon +GtkEntryCompletion GtkCellLayout GtkBuildable +GZlibDecompressor GConverter +ESource GInitable GProxyResolver +GDBusConnection GInitable GAsyncInitable +GtkAction GtkBuildable diff --git a/doc/reference/gnome-calendar.prerequisites b/doc/reference/gnome-calendar.prerequisites new file mode 100644 index 00000000..c2795797 --- /dev/null +++ b/doc/reference/gnome-calendar.prerequisites @@ -0,0 +1,19 @@ +ECalDataModelSubscriber GObject +GActionGroup GObject +GActionMap GObject +GtkBuildable GObject +GtkCellEditable GtkWidget +GInitable GObject +GtkOrientable GObject +GcalView GtkWidget +GcalShellSearchProvider2 GObject +GDBusInterface GObject +GAsyncInitable GObject +GtkActionable GtkWidget +GtkActivatable GObject +GIcon GObject +GLoadableIcon GIcon GObject +GtkCellLayout GObject +AtkWindow AtkObject +GConverter GObject +GProxyResolver GObject diff --git a/doc/reference/gnome-calendar.signals b/doc/reference/gnome-calendar.signals new file mode 100644 index 00000000..4626300f --- /dev/null +++ b/doc/reference/gnome-calendar.signals @@ -0,0 +1,213 @@ + +ECalDataModel::view-state-changed +void +l +ECalDataModel *ecaldatamodel +ECalClientView *arg1 +guint arg2 +guint arg3 +gchar *arg4 +GError *arg5 + + + +GcalDateChooserDay::selected +void +f +GcalDateChooserDay *gcaldatechooserday + + + +GcalDateChooser::day-selected +void +f +GcalDateChooser *gcaldatechooser + + + +GcalDateChooser::month-changed +void +f +GcalDateChooser *gcaldatechooser + + + +GcalEventWidget::activate +void +l +GcalEventWidget *gcaleventwidget + + + +GcalManager::query-completed +void +l +GcalManager *gcalmanager + + + +GcalManager::source-added +void +l +GcalManager *gcalmanager +gpointer arg1 +gboolean arg2 + + + +GcalManager::source-changed +void +l +GcalManager *gcalmanager +ESource *arg1 + + + +GcalManager::source-enabled +void +l +GcalManager *gcalmanager +ESource *arg1 +gboolean arg2 + + + +GcalManager::source-removed +void +l +GcalManager *gcalmanager +gpointer arg1 + + + +GcalMultiChoice::wrapped +void +l +GcalMultiChoice *gcalmultichoice + + + +GcalQuickAddPopover::edit-event +void +l +GcalQuickAddPopover *gcalquickaddpopover +GcalEvent *arg1 + + + +GcalSearchView::event-activated +void +l +GcalSearchView *gcalsearchview +icaltimetype *arg1 + + + +GcalShellSearchProvider2::handle-activate-result +gboolean +l +GcalShellSearchProvider2 *gcalshellsearchprovider2 +GDBusMethodInvocation *arg1 +gchar *arg2 +GStrv arg3 +guint arg4 + + + +GcalShellSearchProvider2::handle-get-initial-result-set +gboolean +l +GcalShellSearchProvider2 *gcalshellsearchprovider2 +GDBusMethodInvocation *arg1 +GStrv arg2 + + + +GcalShellSearchProvider2::handle-get-result-metas +gboolean +l +GcalShellSearchProvider2 *gcalshellsearchprovider2 +GDBusMethodInvocation *arg1 +GStrv arg2 + + + +GcalShellSearchProvider2::handle-get-subsearch-result-set +gboolean +l +GcalShellSearchProvider2 *gcalshellsearchprovider2 +GDBusMethodInvocation *arg1 +GStrv arg2 +GStrv arg3 + + + +GcalShellSearchProvider2::handle-launch-search +gboolean +l +GcalShellSearchProvider2 *gcalshellsearchprovider2 +GDBusMethodInvocation *arg1 +GStrv arg2 +guint arg3 + + + +GcalSubscriberView::event-activated +void +l +GcalSubscriberView *gcalsubscriberview +GcalEventWidget *arg1 + + + +GcalView::create-event +void +l +GcalView *gcalview +gpointer arg1 +gpointer arg2 +gdouble arg3 +gdouble arg4 + + + +GcalView::create-event-detailed +void +l +GcalView *gcalview +gpointer arg1 +gpointer arg2 + + + +GcalWeekGrid::event-activated +void +f +GcalWeekGrid *gcalweekgrid +GcalEventWidget *arg1 + + + +GcalWeekHeader::event-activated +void +f +GcalWeekHeader *gcalweekheader +GcalEventWidget *arg1 + + + +GcalWeekView::event-activated +void +f +GcalWeekView *gcalweekview +GcalEventWidget *arg1 + + + +GcalYearView::event-activated +void +l +GcalYearView *gcalyearview +GcalEventWidget *arg1 + + diff --git a/doc/reference/gnome-calendar.types b/doc/reference/gnome-calendar.types new file mode 100644 index 00000000..833da847 --- /dev/null +++ b/doc/reference/gnome-calendar.types @@ -0,0 +1,31 @@ +e_cal_data_model_get_type +e_cal_data_model_subscriber_get_type +event_editable_property_get_type +gcal_application_get_type +gcal_date_chooser_day_get_type +gcal_date_chooser_get_type +gcal_date_selector_get_type +gcal_edit_dialog_get_type +gcal_event_get_type +gcal_event_widget_get_type +gcal_manager_get_type +gcal_month_view_get_type +gcal_multi_choice_get_type +gcal_quick_add_popover_get_type +gcal_range_tree_get_type +gcal_search_view_get_type +gcal_shell_search_provider2_get_type +gcal_shell_search_provider2_proxy_get_type +gcal_shell_search_provider2_skeleton_get_type +gcal_shell_search_provider_get_type +gcal_source_dialog_get_type +gcal_subscriber_view_get_type +gcal_time_selector_get_type +gcal_view_get_type +gcal_week_grid_get_type +gcal_week_header_get_type +gcal_week_view_get_type +gcal_window_get_type +gcal_window_view_type_get_type +gcal_year_view_get_type +icaltime_get_type diff --git a/doc/reference/version.xml.in b/doc/reference/version.xml.in new file mode 100644 index 00000000..d78bda93 --- /dev/null +++ b/doc/reference/version.xml.in @@ -0,0 +1 @@ +@VERSION@ diff --git a/src/Makefile.am b/src/Makefile.am index 270e7035..567aec65 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -125,5 +125,22 @@ EXTRA_DIST = \ gcal-enum-types.h.template \ gcal-enum-types.c.template + +#--------------------------------------------- +# Library for GTK-Doc +#--------------------------------------------- +noinst_LTLIBRARIES = libgcal.la + +libgcal_la_SOURCES = $(gnome_calendar_SOURCES) + +libgcal_la_CFLAGS = \ + $(CALENDAR_CFLAGS) \ + $(CALENDAR_WARN_CFLAGS) + +libgcal_la_LDFLAGS = \ + -Wl,--export-dynamic \ + -lm + + dist-hook: cd $(distdir); rm -f $(BUILT_SOURCES) From e3ef063e00e20a1d0caa7ec3b46242ea1ae97a09 Mon Sep 17 00:00:00 2001 From: Georges Basile Stavracas Neto Date: Sat, 18 Mar 2017 12:06:41 -0300 Subject: [PATCH 2/5] event: fix documentation --- src/gcal-event.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gcal-event.c b/src/gcal-event.c index b6dfb9d2..a9d0a7d7 100644 --- a/src/gcal-event.c +++ b/src/gcal-event.c @@ -1337,7 +1337,7 @@ gcal_event_set_timezone (GcalEvent *self, * @self: a #GcalEvent * * Retrieves the unique identifier of the event. The UID - * consists of '::'. + * consists of '[source id]:[event id]:[recurrency id]'. * If there's no recurrency assigned, the last field is * ignored. * From f9469f79eeaa514379d021b8ff852ddb22e381af Mon Sep 17 00:00:00 2001 From: Georges Basile Stavracas Neto Date: Sat, 18 Mar 2017 12:23:08 -0300 Subject: [PATCH 3/5] doc: group sections --- doc/reference/gnome-calendar-docs.sgml | 57 ++++++++++++------- doc/reference/gnome-calendar-undocumented.txt | 6 +- 2 files changed, 39 insertions(+), 24 deletions(-) diff --git a/doc/reference/gnome-calendar-docs.sgml b/doc/reference/gnome-calendar-docs.sgml index f88cbf26..672815aa 100644 --- a/doc/reference/gnome-calendar-docs.sgml +++ b/doc/reference/gnome-calendar-docs.sgml @@ -8,51 +8,66 @@ ]> - &package_name; Reference Manual + GNOME Calendar Reference Manual - for &package_string;. + For &package_string;. The latest version of this documentation can be found on-line at http://[SERVER]/&package_name;/. - [Insert title here] - + Logging and Debugging + + + + + + Backend - - - - - - - - - - - - - - + + + + + Views + + - - - + + + Edit dialog + + + + + + + + + + Main + + + + + + + Object Hierarchy diff --git a/doc/reference/gnome-calendar-undocumented.txt b/doc/reference/gnome-calendar-undocumented.txt index 8dce38c2..a222a9da 100644 --- a/doc/reference/gnome-calendar-undocumented.txt +++ b/doc/reference/gnome-calendar-undocumented.txt @@ -168,11 +168,11 @@ gcal_get_pixbuf_from_color (color, size) gcal_get_surface_from_color () gcal_get_weekday () gcal_log_init -gcal_manager_add_source (backend, name) +gcal_manager_add_source (name, backend) gcal_manager_create_event () gcal_manager_get_default_source gcal_manager_get_event_from_shell_search () -gcal_manager_get_events (manager, range_start, range_end) +gcal_manager_get_events (manager, range_end, range_start) gcal_manager_get_goa_client () gcal_manager_get_loading () gcal_manager_get_shell_search_events () @@ -279,7 +279,7 @@ response_signal (Returns) should_change_date_for_scroll () undo_remove_action (Returns) update_view (Returns) -uri_get_fields (host, schema, path, uri) +uri_get_fields (uri, schema, host, path) url_entry_text_changed (Returns) view_changed (object, pspec, user_data) From 8ad65d311b1b71974fce7a5508c6963ff461c584 Mon Sep 17 00:00:00 2001 From: Georges Basile Stavracas Neto Date: Tue, 28 Mar 2017 00:29:45 -0300 Subject: [PATCH 4/5] project: run gtkdocize before autoreconf --- autogen.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/autogen.sh b/autogen.sh index b56d2225..5d7e02fd 100755 --- a/autogen.sh +++ b/autogen.sh @@ -9,9 +9,9 @@ olddir=`pwd` cd $srcdir mkdir -p m4 +gtkdocize || exit 1 autoreconf --verbose --force --install || exit $? intltoolize --force --copy --automake || exit $? -gtkdocize || exit 1 if test -z "$NOCONFIGURE"; then run_configure=true From 7681b7a2da8d9ad9c6faaf2bb157746808b8b184 Mon Sep 17 00:00:00 2001 From: Georges Basile Stavracas Neto Date: Mon, 20 Mar 2017 17:55:09 -0300 Subject: [PATCH 5/5] project: document classes --- .gitignore | 2 +- doc/reference/Makefile.am | 9 +- doc/reference/gnome-calendar-decl-list.txt | 6 - doc/reference/gnome-calendar-decl.txt | 40 --- doc/reference/gnome-calendar-undeclared.txt | 4 + doc/reference/gnome-calendar-undocumented.txt | 136 ++------ doc/reference/gnome-calendar-unused.txt | 8 + doc/reference/gnome-calendar.hierarchy | 43 ++- doc/reference/gnome-calendar.types | 1 - doc/reference/images/gcal-edit-dialog.png | Bin 0 -> 17629 bytes doc/reference/images/gcal-event-widget.png | Bin 0 -> 3782 bytes doc/reference/images/gcal-source-dialog.png | Bin 0 -> 22993 bytes doc/reference/images/gcal-window.png | Bin 0 -> 35329 bytes doc/reference/images/gcal-window_agendas.png | Bin 0 -> 33195 bytes src/gcal-debug.h.in | 133 ++++++++ src/gcal-edit-dialog.c | 74 +++++ src/gcal-event.c | 58 +++- src/gcal-event.h | 6 + src/gcal-manager.c | 308 +++++++++++++++--- src/gcal-source-dialog.c | 308 ++++++------------ src/gcal-source-dialog.h | 9 + src/gcal-utils.c | 238 ++++++++++++-- src/gcal-utils.h | 24 +- src/gcal-window.c | 85 +++++ src/views/gcal-range-tree.c | 33 ++ src/views/gcal-range-tree.h | 11 + 26 files changed, 1050 insertions(+), 486 deletions(-) create mode 100644 doc/reference/images/gcal-edit-dialog.png create mode 100644 doc/reference/images/gcal-event-widget.png create mode 100644 doc/reference/images/gcal-source-dialog.png create mode 100644 doc/reference/images/gcal-window.png create mode 100644 doc/reference/images/gcal-window_agendas.png diff --git a/.gitignore b/.gitignore index 01c53e23..62bc73a8 100644 --- a/.gitignore +++ b/.gitignore @@ -96,4 +96,4 @@ gtk-doc.make doc/reference/xml doc/reference/html doc/reference/*.stamp -doc/reference/*.xml +doc/reference/version.xml diff --git a/doc/reference/Makefile.am b/doc/reference/Makefile.am index a1e6351a..74373178 100644 --- a/doc/reference/Makefile.am +++ b/doc/reference/Makefile.am @@ -34,6 +34,7 @@ if ENABLE_DOC_CROSS_REFERENCES # Extra options to supply to gtkdoc-fixref. Not normally needed. # e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html FIXXREF_OPTIONS = \ + --extra-dir=$(GTK_PREFIX)/share/gtk-doc/html/evolution-data-server \ --extra-dir=$(GLIB_PREFIX)/share/gtk-doc/html/glib \ --extra-dir=$(GLIB_PREFIX)/share/gtk-doc/html/gobject \ --extra-dir=$(GLIB_PREFIX)/share/gtk-doc/html/gio \ @@ -55,7 +56,13 @@ CFILE_GLOB = \ IGNORE_HFILES = $(NULL) # Images to copy into HTML directory. -HTML_IMAGES = $(NULL) +HTML_IMAGES = \ + images/gcal-edit-dialog.png \ + images/gcal-event-widget.png \ + images/gcal-source-dialog.png \ + images/gcal-window.png \ + images/gcal-window_agendas.png \ + $(NULL) # Extra SGML files that are included by $(DOC_MAIN_SGML_FILE). # e.g. content_files=running.sgml building.sgml changes-2.0.sgml diff --git a/doc/reference/gnome-calendar-decl-list.txt b/doc/reference/gnome-calendar-decl-list.txt index d9c201e3..bdf45148 100644 --- a/doc/reference/gnome-calendar-decl-list.txt +++ b/doc/reference/gnome-calendar-decl-list.txt @@ -152,9 +152,7 @@ GcalEditDialog
gcal-enum-types -GCAL_EDITABLE_PROPERTY GCAL_WINDOW_VIEW_TYPE -event_editable_property_get_type gcal_window_view_type_get_type
@@ -448,8 +446,6 @@ MINUTES_PER_DAY MAX_MINUTES gcal_clear_datetime GcalWindowViewType -EventEditableProperty -GcalTranslateFunc icaltime_get_type datetime_compare_date datetime_to_icaltime @@ -488,8 +484,6 @@ GCAL_TYPE_VIEW GcalViewInterface gcal_view_set_date gcal_view_get_date -gcal_view_get_initial_date -gcal_view_get_final_date gcal_view_clear_marks gcal_view_get_children_by_uuid GcalView diff --git a/doc/reference/gnome-calendar-decl.txt b/doc/reference/gnome-calendar-decl.txt index 1f795415..17db1202 100644 --- a/doc/reference/gnome-calendar-decl.txt +++ b/doc/reference/gnome-calendar-decl.txt @@ -764,10 +764,6 @@ struct _GcalViewInterface icaltimetype *start_span, icaltimetype *end_span); - /* Time handling related API */ - icaltimetype* (*get_initial_date) (GcalView *view); - icaltimetype* (*get_final_date) (GcalView *view); - /* Marks related API */ void (*clear_marks) (GcalView *view); @@ -786,16 +782,6 @@ GcalView *view, icaltimetype *date GcalView *view -gcal_view_get_initial_date -icaltimetype * -GcalView *view - - -gcal_view_get_final_date -icaltimetype * -GcalView *view - - gcal_view_clear_marks void GcalView *view @@ -1023,15 +1009,6 @@ ECalDataModel *data_model GType void - -GCAL_EDITABLE_PROPERTY -#define GCAL_EDITABLE_PROPERTY (event_editable_property_get_type()) - - -event_editable_property_get_type -GType -void - gcal_log_init void @@ -1069,23 +1046,6 @@ typedef enum GCAL_WINDOW_VIEW_SEARCH, } GcalWindowViewType; - -EventEditableProperty -typedef enum -{ - EVENT_SUMMARY = 0, - EVENT_START_DATE, - EVENT_END_DATE, - EVENT_LOCATION, - EVENT_DESCRIPTION, - EVENT_SOURCE, -} EventEditableProperty; - - -GcalTranslateFunc -const gchar * -GtkWidget *source_widget - icaltime_get_type GType diff --git a/doc/reference/gnome-calendar-undeclared.txt b/doc/reference/gnome-calendar-undeclared.txt index e69de29b..2b4034e9 100644 --- a/doc/reference/gnome-calendar-undeclared.txt +++ b/doc/reference/gnome-calendar-undeclared.txt @@ -0,0 +1,4 @@ +EventEditableProperty +GcalTranslateFunc +gcal_view_get_final_date +gcal_view_get_initial_date diff --git a/doc/reference/gnome-calendar-undocumented.txt b/doc/reference/gnome-calendar-undocumented.txt index a222a9da..e6ad0f52 100644 --- a/doc/reference/gnome-calendar-undocumented.txt +++ b/doc/reference/gnome-calendar-undocumented.txt @@ -1,7 +1,7 @@ -47% symbol docs coverage. -264 symbols documented. -182 symbols incomplete. -296 not documented. +60% symbol docs coverage. +324 symbols documented. +108 symbols incomplete. +216 not documented. ALIGNED () @@ -12,22 +12,14 @@ ECalDataModel:timezone ECalDataModelForeachFunc () ECalDataModelViewState () EThreadJobFunc () -EventEditableProperty () -GCAL_BUG () +EventEditableProperty GCAL_ENABLE_TRACE -GCAL_ENTRY GCAL_EVENT_ERROR -GCAL_EXIT -GCAL_GOTO () GCAL_LOG_LEVEL_TRACE -GCAL_PROBE GCAL_RESPONSE_CREATE_EVENT GCAL_RESPONSE_DELETE_EVENT GCAL_RESPONSE_REMOVE_SOURCE GCAL_RESPONSE_SAVE_EVENT -GCAL_RETURN () -GCAL_TODO () -GCAL_TRACE_MSG () GCAL_TYPE_APPLICATION GCAL_TYPE_DATE_CHOOSER GCAL_TYPE_DATE_CHOOSER_DAY @@ -60,7 +52,6 @@ GcalDateChooserDayOptionsCallback () GcalDateSelector GcalEditDialog GcalEvent -GcalEventError () GcalEventWidget GcalEventWidget::activate GcalManager @@ -74,16 +65,14 @@ GcalMultiChoice GcalMultiChoice::wrapped GcalMultiChoiceFormatCallback () GcalQuickAddPopover -GcalRangeTraverseFunc () GcalSearchView GcalShellSearchProvider GcalShellSearchProviderClass () GcalSourceDialog -GcalSourceDialogMode () GcalSubscriberView::event-activated GcalSubscriberViewPrivate () GcalTimeSelector -GcalTranslateFunc () +GcalTranslateFunc GcalView GcalViewInterface () GcalWeekGrid @@ -93,29 +82,19 @@ GcalWeekHeader::event-activated GcalWeekView GcalWeekView::event-activated GcalWindow -GcalWindowViewType () GcalYearView GcalYearView::event-activated ICAL_TIME_TYPE MAX_MINUTES MINUTES_PER_DAY -action_widget_activated (Returns) -back_button_clicked (Returns) +_GCAL_BUG build_component_from_details (summary, initial_date, final_date) -calendar_file_selected (Returns) calendar_get_resource -calendar_listbox_row_activated (Returns) -clear_pages (Returns) -datetime_compare_date () -datetime_is_date () -datetime_to_icaltime () -description_label_link_activated (Returns) e_cal_data_model_remove_client (data_model) e_cal_data_model_subscriber_component_added (comp) -e_strftime_fix_am_pm () -e_utf8_strftime_fix_am_pm () +e_strftime_fix_am_pm (str, tm, fmt, max) +e_utf8_strftime_fix_am_pm (fmt, max, str, tm) fix_popover_menu_icons (popover) -format_utc_offset () free_row_data (Returns) gcal_application_get_manager () gcal_application_get_settings () @@ -143,15 +122,6 @@ gcal_date_chooser_set_show_day_names () gcal_date_chooser_set_show_heading () gcal_date_chooser_set_show_week_numbers () gcal_date_selector_new -gcal_dup_icaltime () -gcal_edit_dialog_get_date_end () -gcal_edit_dialog_get_date_start () -gcal_edit_dialog_get_event () -gcal_edit_dialog_new -gcal_edit_dialog_set_event () -gcal_edit_dialog_set_event_is_new () -gcal_edit_dialog_set_manager () -gcal_edit_dialog_set_time_format () gcal_event_get_description (self) gcal_event_set_summary (self) gcal_event_widget_clone () @@ -163,37 +133,18 @@ gcal_event_widget_new () gcal_event_widget_set_date_start (date_start) gcal_event_widget_set_has_reminders () gcal_event_widget_set_read_only () -gcal_get_month_name () -gcal_get_pixbuf_from_color (color, size) -gcal_get_surface_from_color () -gcal_get_weekday () gcal_log_init -gcal_manager_add_source (name, backend) -gcal_manager_create_event () +gcal_manager_add_source (backend, name) gcal_manager_get_default_source -gcal_manager_get_event_from_shell_search () -gcal_manager_get_events (manager, range_end, range_start) -gcal_manager_get_goa_client () -gcal_manager_get_loading () -gcal_manager_get_shell_search_events () -gcal_manager_get_source (manager) -gcal_manager_get_sources (manager) -gcal_manager_get_sources_connected (manager) -gcal_manager_get_system_timezone () -gcal_manager_is_client_writable () -gcal_manager_move_event_to_source () -gcal_manager_new_with_settings -gcal_manager_query_client_data (source, manager, field) -gcal_manager_refresh () -gcal_manager_remove_event () -gcal_manager_set_default_source -gcal_manager_set_search_subscriber () -gcal_manager_set_shell_search_subscriber () -gcal_manager_set_subscriber () -gcal_manager_setup_shell_search () -gcal_manager_shell_search_done () -gcal_manager_update_event () -gcal_month_view_get_final_date +gcal_manager_get_events (range_end, range_start) +gcal_manager_get_goa_client (manager) +gcal_manager_get_shell_search_events (manager) +gcal_manager_query_client_data (field, source, manager) +gcal_manager_set_search_subscriber (manager) +gcal_manager_set_shell_search_subscriber (manager) +gcal_manager_set_subscriber (manager) +gcal_manager_setup_shell_search (self) +gcal_manager_shell_search_done (manager) gcal_month_view_motion_notify_event (widget, event, Returns) gcal_month_view_set_first_weekday (self) gcal_month_view_set_manager () @@ -204,7 +155,6 @@ gcal_multi_choice_set_choices () gcal_multi_choice_set_format_callback () gcal_multi_choice_set_value () gcal_quick_add_popover_new -gcal_range_tree_count_entries_at_range () gcal_search_view_new gcal_search_view_search () gcal_search_view_set_search @@ -213,15 +163,14 @@ gcal_shell_search_provider_dbus_export () gcal_shell_search_provider_dbus_unexport () gcal_shell_search_provider_new gcal_source_dialog_new -gcal_source_dialog_set_manager (Returns) -gcal_source_dialog_set_mode (Returns) -gcal_source_dialog_set_source (Returns) gcal_subscriber_view_get_child_by_uuid () gcal_time_selector_get_time () gcal_time_selector_new gcal_time_selector_set_time () gcal_time_selector_set_time_format () gcal_view_get_date () +gcal_view_get_final_date +gcal_view_get_initial_date gcal_view_set_date () gcal_week_grid_add_event () gcal_week_grid_clear_marks () @@ -238,49 +187,21 @@ gcal_week_header_remove_event () gcal_week_header_set_first_weekday () gcal_week_header_set_manager () gcal_week_header_set_use_24h_format () -gcal_week_view_get_final_date -gcal_week_view_get_initial_date gcal_week_view_set_first_weekday (view, day_nr) gcal_week_view_set_manager () gcal_week_view_set_use_24h_format (view, use_24h) -gcal_window_new_event () -gcal_window_new_with_view_and_date () -gcal_window_open_event_by_uuid () -gcal_window_set_search_mode () -gcal_window_set_search_query () gcal_year_view_set_current_date () gcal_year_view_set_first_weekday () gcal_year_view_set_manager () gcal_year_view_set_use_24h_format () -get_alarm_trigger_minutes () -get_circle_surface_from_color () -get_color_name_from_source () -get_desc_from_component (component) -get_end_of_week () -get_source_parent_name_color () -get_start_of_week () hide_notification (Returns) -icaltime_compare_date (date1, date2) -icaltime_compare_with_current () icaltime_get_type -icaltime_to_datetime () -is_clock_format_24h -is_source_enabled () -name_entry_text_changed (Returns) notification_child_revealed_changed (Returns) -on_local_activated (Returns) -on_web_activated (Returns) -online_accounts_listbox_row_activated (Returns) -online_accounts_settings_button_clicked (Returns) open_event (Returns) remove_button_clicked (Returns) remove_source (Returns) -response_signal (Returns) -should_change_date_for_scroll () undo_remove_action (Returns) update_view (Returns) -uri_get_fields (uri, schema, host, path) -url_entry_text_changed (Returns) view_changed (object, pspec, user_data) css-code:Long_Description @@ -297,28 +218,18 @@ gcal-date-chooser:Long_Description gcal-date-chooser:Short_Description gcal-date-selector:Long_Description gcal-date-selector:Short_Description -gcal-debug:Long_Description -gcal-debug:Short_Description -gcal-edit-dialog:Long_Description -gcal-edit-dialog:Short_Description gcal-enum-types:Long_Description gcal-enum-types:Short_Description gcal-event-widget:Long_Description gcal-event-widget:Short_Description -gcal-event:Long_Description -gcal-event:Short_Description gcal-log:Long_Description gcal-log:Short_Description -gcal-manager:Long_Description -gcal-manager:Short_Description gcal-month-view:Long_Description gcal-month-view:Short_Description gcal-multi-choice:Long_Description gcal-multi-choice:Short_Description gcal-quick-add-popover:Long_Description gcal-quick-add-popover:Short_Description -gcal-range-tree:Long_Description -gcal-range-tree:Short_Description gcal-resources:Long_Description gcal-resources:Short_Description gcal-search-view:Long_Description @@ -327,8 +238,6 @@ gcal-shell-search-provider-generated:Long_Description gcal-shell-search-provider-generated:Short_Description gcal-shell-search-provider:Long_Description gcal-shell-search-provider:Short_Description -gcal-source-dialog:Long_Description -gcal-source-dialog:Short_Description gcal-subscriber-view-private:Long_Description gcal-subscriber-view-private:Short_Description gcal-subscriber-view:Long_Description @@ -336,7 +245,6 @@ gcal-subscriber-view:Short_Description gcal-time-selector:Long_Description gcal-time-selector:Short_Description gcal-utils:Long_Description -gcal-utils:Short_Description gcal-view:Long_Description gcal-view:Short_Description gcal-week-grid:Long_Description @@ -345,7 +253,5 @@ gcal-week-header:Long_Description gcal-week-header:Short_Description gcal-week-view:Long_Description gcal-week-view:Short_Description -gcal-window:Long_Description -gcal-window:Short_Description gcal-year-view:Long_Description gcal-year-view:Short_Description diff --git a/doc/reference/gnome-calendar-unused.txt b/doc/reference/gnome-calendar-unused.txt index 8b2221ea..b3ac4899 100644 --- a/doc/reference/gnome-calendar-unused.txt +++ b/doc/reference/gnome-calendar-unused.txt @@ -4,6 +4,14 @@ fix_popover_menu_icons(window) gcal_event_set_summary(event) gcal_event_widget_set_date_start(date_end) gcal_manager_add_source(base_uri, relative_uri) +gcal_manager_get_events(start_date, end_date) +gcal_manager_get_goa_client(self) +gcal_manager_get_shell_search_events(self) +gcal_manager_set_search_subscriber(self) +gcal_manager_set_shell_search_subscriber(self) +gcal_manager_set_subscriber(self) +gcal_manager_setup_shell_search(manager) +gcal_manager_shell_search_done(self) gcal_month_view_set_first_weekday(view) gcal_month_view_set_use_24h_format(view) gcal_week_view_set_first_weekday(view) diff --git a/doc/reference/gnome-calendar.hierarchy b/doc/reference/gnome-calendar.hierarchy index 7e24ac9d..bc548aba 100644 --- a/doc/reference/gnome-calendar.hierarchy +++ b/doc/reference/gnome-calendar.hierarchy @@ -104,8 +104,28 @@ GInterface GConverter GProxyResolver AtkImage +GBoxed + GValueArray + GcalRangeTree + icaltimetype + GError + GVariantDict + GdkRectangle + CairoRectangleInt + CairoContext + GdkEvent + GtkSelectionData + GtkRequisition + GtkBorder + GdkColor + GDateTime + PangoAttrList + PangoTabArray + GdkRGBA + GTimeZone + GStrv + GDBusInterfaceInfo GEnum - EventEditableProperty GcalWindowViewType GtkAlign GtkStateType @@ -133,24 +153,3 @@ GEnum GBusType GtkReliefStyle GtkArrowType -GBoxed - GValueArray - GcalRangeTree - icaltimetype - GError - GVariantDict - GdkRectangle - CairoRectangleInt - CairoContext - GdkEvent - GtkSelectionData - GtkRequisition - GtkBorder - GdkColor - GDateTime - PangoAttrList - PangoTabArray - GdkRGBA - GTimeZone - GStrv - GDBusInterfaceInfo diff --git a/doc/reference/gnome-calendar.types b/doc/reference/gnome-calendar.types index 833da847..954780f2 100644 --- a/doc/reference/gnome-calendar.types +++ b/doc/reference/gnome-calendar.types @@ -1,6 +1,5 @@ e_cal_data_model_get_type e_cal_data_model_subscriber_get_type -event_editable_property_get_type gcal_application_get_type gcal_date_chooser_day_get_type gcal_date_chooser_get_type diff --git a/doc/reference/images/gcal-edit-dialog.png b/doc/reference/images/gcal-edit-dialog.png new file mode 100644 index 0000000000000000000000000000000000000000..ea40de20de610a4f8c9968db2953bfdc3cfc1ec1 GIT binary patch literal 17629 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 literal 0 HcmV?d00001 diff --git a/doc/reference/images/gcal-event-widget.png b/doc/reference/images/gcal-event-widget.png new file mode 100644 index 0000000000000000000000000000000000000000..431ed87a7b93b5dafa26bf089c4fba0a4d5bf07a GIT binary patch literal 3782 zcmb_fX*3jU8=lfj$Wqp1EJY%bmn><9MwSU9*+#O*B-_Mf8D=O+vQxIP6B=7gWS4bp z5n?QvL>S8qW8Zz#kN3y>?>pc5o^zi2InO!wv)#{quIs+S@4<9A*o4>s000M6@6LV3 z_?yu^Pct*@ftXt&V>smvftsFXw7}DkUNh$BQQB~niKjEl*WSwsfbj5ice>{7=;h?( z;r-YXwZhZ{1^_tW&^xzH{nDtD{>TJhERnvQ+nVTPxfbdfLg)L)p*otT|AI$PZ1Sa( zNv%YkVe6ygu1{krumY;j&2*pqgax-_%8fC%c$i8G)gwVtpv&18dYWC9)#77waLmrh zGou}!C3`9!0gaBi`Ol74K(Fn7IK&(}L2ZLFbyouqgwa?HX*?d^8#kB8Z%+38`LL1) zLddBsS(>ZQ<(_s;&}7RNKc^?Ibmye>%U610q2IV!^SFgBKIesKNyI`Pzdm*UG)LV3 z==A=5rF)-q`i1fdXw}#pKAk(2uf*Lt&P6P=+IL`lgu|OmPfYB?atgb&{X*%wo`tkU z4m(VDx%0i1GmKgE%JJdcZ8m1jg{um~R9K>w?qJl6+4C@_Em!yx;ci1-@61kfgpaG` zaX-kWOsU5d=jW)hr{`Q(1~*%=EY%Ex4D3B*jHnN_93a9c%x3RT7?RZj&)&GMu_P0q zS3ZTAj~gzQ{(8G?NMSK`>L6*d`W6`QP(*&-3XP05$|5Zk*2{-!j5ngmBR8A_^di)v z!$^E46-vM&$qd?&F&0xFUJ7Oboc|EMjF*;@0);O%_;3olKWbCJT4d@yBT&Wplip0r zo;>l6NmnR&b#JVy{H395Vm3*7he;;nlB4jBHIsQnxb+PuQ(gppD?4JnqEul*OXf`r z<}dx~@7RP^#CUn~jNcqxW&<6nnwzn*Vq=uk)j2TEIhepR_PIz%+qeaN2aj{-D&HwQ z;kQdQDZbi2zd)4f(u1~Tk+QF_F*ii_ev&x)9WG-2z{LCM@Ef+(<}rxg@QSaeP!5U5aH1xg>YAgLAdaz;(}F2+0}S`XF;;S`XIQE{-&BehLexoar^Eb7A4o@Fa;)WdxD zQFGgsNi_oqmZf$Qc!HA zbk>J6Hb+Z`@|0?@V2xahtHV?M%G498<`ZYjX?~M@fWdg4+(y_?_`-ZFx*>W6Yz~Fg z$7N!X{69+?EG;sb(qZC?!w}!5kY!18K&>ax2lmEve$5XttR)Lh5ZLngQJZrd6SQ}Q z@q_9_GXt9VX6a`~YqFtE#<*qI00DS*DH5~gV#^bO!{e{Kf%u@$0ZA;o`s z<|H8*Sn+_z(6pqNX{xz0ba}$;Yoqn>Z)bSQ>Yo2$2%#DTuJXKM-$|QBhz{rAWuEGQ z&P#{Gd!L?Ny4Y};|MOYIDuGgB7J7E6>PM4su=xG~#s^qQj}6)%Bzg~a=abn<^h*hL3S_i8u;qQ&A)Jx;v3bf8d1{?xPoHCO355bEUqW?HNSR2 z7D?I7b#)O0S(VeP>Tp70rCyytJN+o4?a3a$nXDY#ZDZu$%C0M(Z=JyJm>) zZQ)RPcPJk84+J`3J8K>MnYn)0YNmcQ&@@{BqSlV$n01J^>UUZ=Q*WaE*X=NcV3nb6 zS}L0jIq2_=hnB{d|G2*y?xiG$DJGQ~PoOSs>_x~gPeJs#Rsw~<`P2c!_uowg*7`k# zTWP5EX?AsF?X7GQ6{b>F55yK6Cw8BdvG~pHsq{@l0q>?EKo;wH$-# zC}tfUq8c(UPCU$Y1OzbWm9?LEbuN+_7~&(a0&INQLrpIalFgIE`ESu>jy44{+uc$k zj18D9tuu&wYk_2qLCqCAq^XXvjf|sh%}CN+aMl$>JrEq<>?b)O`IQO}Ql zDHQYb1XPu@I7H9Dsk8U2Z^PL1@1I)`<+PzG<06Z#QzG_9^yp9x^dY?M8BO%*+M;>^ zYoUyhN0D96_(?EmnBP1XFN4v7{mE4^z|z&Voe?dkdb&NeI3N$sGg{}!p>Z?|eI+c{ zSe_s3IsA5ggt)1=CBUxR%V{|iiDo3*To5)O1ILtGh<}5}f3g)lb0Kk)-o-BxgmfBB z-$^*b42*G;o&6fJxxo>Yjc-o*LcRs>&mZpjnCuy|tcs<1QRISxSw`dvN_Uxgz(1`q zmt1OY2KS4Kao?*M2SrMIEH>Fk0ULG>o43DzBkOy-qGq5U6-W(?DYj%yhT>bs@-GxW z%y@27);nq|E6jjr=e!4k6)}#P_N622B_KC=W#nQ-eI2c^Q?LB`%{k{z5p1C{jXvn_ z{qmsqQEJ)7iF>5)?IU zPYI!nZB?sHNnD+Tc*Tdu8T%s9tT%$kc!`u`sbU}e5r7eYf43gC%k^Ndq|u%J?fzJt zz2p8X2UETuBJvvhg>op9V^ot#tsAQqNshR*9R`!8nVKc~T14SnwtdT5c@bjb*Wa|Ba>I{$hEx{A5uG|OZEWq(DQMrOJM*!jzd4fAeA!Lg|taZqm z6|m<%ZvF{GgQWcI=?-eb`Ud0A-s5Ej!iGY8UqxvbnD{-?V%2T(+PQ@j(c%=yOnWlB z3%Zc9y8BdhlEP>GIB?$JQ0iJg^jGC}AJW_IE#t^KQJMKlUn9k3L1GpuH1sL{XO~{( zM+` zwi$r8-_Anvz!7G>C)F4mJ_+XnVHZlKv{M<;dEGR_U0T$Cdwm!zVq<#;PxA0g&*Yd#H2!laB~iA2J^Ap2R{~vhDwTMy5?#ohYu*5jzi>6N0j_? zwR_8f{;ozCc~GBr8&Kd*Q{yO6e8h$OITXEMt=G)Un|4 zJ}#5sqs?iwQk=)2_FRN|K9!K%zMK_BiLGa|J!ED@!;1 zP>wF}7)C|3OY7_Yb_E%smeHU-f~;ETcpFAYpKSf)!x>oe%$zsWX{_rr_SN(Os$&w| z0kUBLMA6-f9`E zkb$wy14`jVxxOz339HsrA;z1dzLy<{wiC~f1v4fa$H@ITr?EZF8 zI;A2XayyJIt=2Ef7U=5m4C>S7bj?`-vu&&N5bSXViPWWTBln?w{ZnjbV zqF)q$&90_YolmNSclqgw({6tvY6(4<7+*nGe9H5CbH6(2LEQ|k#?8&V==)vji=y;Ju< z_xFF_&-3(z`*vODb)3iXUFYq8L+R?l{fzrbNJtLKU6WSDpZ|#e>?Om$pZ?X6#2;iv z@>iuvwu%3LU6vY#uk5qCrtL^Va)5^T&kmC4SO$D?kCU9D%$_0AeI#diT-wk0;!DRY zZ)!PRvAuiO)W!*aB_X-uV0zoh)P%*=(#eA5s+{5t6K>NzBqS^(a?+P>y8ZlH=I+L1 z9+mCw>bg|!dPnn4o^W=qb%Un z+mU@@eL?z#qWjq2A34S`UrJ2w80g-~=&;K3$owPa`$aFr*uBY!eWAbWt^7IlvW_K< z4z-zOiHfTWzmtQ_zD)>5DLfI`YUW=jTx2P9YPAq#_wJl5%GyF!dBX^+VE3(I!@xpNOUq?YFiJ>oCv=jqLj+VK%Q=IPWfU} zm!a&Uon_uA;h^N5zik$@VfE5%VV6?dL+VY;$R)$CCw5q+WoFh)I0d}A#o`vhSfP|^ zY-o5dKA!oRY;v(;sA-gwxZ;&7yAIHEORLb{9^F}0^5X|5C+CjefBt+j%4vMoW~$8= zeqBXV^XkbED$VOGZj>LKCRC%Nqj?#F1oS+#U&*nB{a*60cP4$Xve%<5-c3Tug+eK2 zlZ9$;zwVdZ_Y^gc6AzHisO09yDW$dr99fnR>{g<%l|Em$t>pSlWI>V;VbeSw`9MDK zy|RLMoNSEqvqQJM_@l^^jg6Vaeky3XiujwTI{REpZFh2VPV>E!mz^E+=c7&s1EKDz zZ1SJ-N`L;JVHK%GQStr#QGC7rQ&?&{xBYUVk}j87{lh~u4h5J zak=D_!L4oGGGvhf(r$n2Q{6V|Q$>IFUKWo_NiB$|Tov7_y0kUpy}~Cb(YU~4GxnIi zfI3Kat-8I1is5)_c11!};t5tcBMF8#86`1>b`MO>%6OWyU#YJC^kcx`R2RRfU}JpQ zdaG65Mv>)(yHm%0JN*<8W+as9p1wUAL9uI>k09e}UAET|85IU*=0xvz59{K+0=AdB zTMTowX4f|*{;kr`j*e&aKf`rob(cm>$1`s{eE8Xz4{J}8xKID*GQY3=WZl|??>Ai;9P*=fn!-2bT`3<>R7XUNvd9wRQU|rHfnVa-Nfla%}Xm?%DPln^iQ{R7lIX7pIYLriSg6)hp?EKhPh4+{h#@9D+czvWn^T?S2vxUTyh+{xRcsd$jCNs<@g+9tQ@kN zt-6zCw)8cexBwEXv(?Xb@8r17Na%jnqS=`Hgp7$|Pei7+;`1(fUC;B?r%ut*(3#%AagQOk&W&0iBNx53l^$K%S%CIyM$wc z+$5S!?`STxCu|%1bveI#_nMRQ3NIZ4`xP=l#!`LCw3m%vzU-yknqF~oUAdvJ|FxEL zpk;x_x@Kf}vvZdXx=dW#mk$4qlIdd3uxqTV zKfB6hx#(y#mrjN$u*tfZc%u|P56?yUO9VZ^)z(|E zhFoiuzBIA)Mp>c%NRVv2uRSLX4UKjG$9;0qV&;TyE)Rd(D;e>jrc3(2oy46Trkz^a z3Mw}5o;`b(mw`Mpn;7k3hm`>7Uv?7c(Q-YfL6A`?#08>JHEvlUW) zN*Sl!jZ|;gO`Igxv%6%%e?&En_Kf|R{=-jqE8oA!P<)ZaP1(7RVDoI}{lUJLqj$Bx zJ})r)e4^%2z{Od8mN=yZlfTp#PaZNKZ=PZeJHz5=l&BXdyHMO>oqxk+;N$e?(ZL!V*L0s>@ioKPF(SJnyJ}yAx+7F!j`{= zFQP6|#OcTetw`31m#SDVSUbCo*mHlRFz+9qDx;*&ZHXz;v@NH2w?itz>X@1Iapj8O zq&LbAw?fVK%hA%(VwTvK^f3gl(t5^A=6bf%~qam7@JaQ5b>a)?5Y}|RD#EftxqTw-y znuW#QAlZj~Htb9k1kV+ll+;wb^p^WrIBtn-&z?4`JkdC%Ml*pSyU4V(w6H&|Jv|Mr ztyKEi^bf1<^-Qr*`^Vn&8ydR3=po4+ao}OqMHVWSCNg z6h}Z(e@1)94zpf^ObyQV_I3pY1@u+BqFVy@X~u8(;qF=GK210o@kd2QMzSyl84gK=({RNNF9n@*8Q8bz2 zj0YK6c42w4bP4zUD%`tb^#ZrHe8|Yiuvp(aI~{(vp7`3(U@yw_@#DwAIk$K3-;cH? zUIFgGSH;|BS$6NPAk`1*+V-^{mS9bzWXL zehh`1%Z0A@E;G~A&hEwZv<)4Pe&g&cFV@}`7$EHn3q96!P(ci@K5(A&F!Ji7Q3de4LJ;oUjh`w!%l=L zo#NcDBgmBz-_mEW@iW$xP+R1+=HTJsvD%)nC5>C3nwoNQbyd50Q`*&4q|M@`aouwj z1A~_4xbwIrc4~jS(JzNe^?A;nJ0~b4lw&t^Ij`o(@#A$i1!_7v*YWxTbX=9z!UT)9 zlP=S}^;j`fE|a7OEp|-LR7!e!fRlJr!uE!FXg#aCx;pLQ!$S^57B)6!PEIe2i^Z{p zI`l8u*kt`lT;5n{Y5(!#UH(msDGNd3dtZIdbSb-wfD6vI9e9q4JfpPnyDj;>UI|^K z%GCRejO4U5|N444JZMW>TXQ_Y()q8P!xMCN!k&_GP333&qSnioZ8s9?j*kX=y6_5% zVKj(l3Tu4l9-XoMM=B%co+{*&(Q%!Z;ik7sFtg-!A0H{;%WJF;SmjVa9rw=B9Z0;f zS4QQ9X;kvnU{zh+h9sH5A9;7^^|K@JltRM7s-Qx;@9RYNrAl4W6JO@0ai2X=`d~aO3Gb&#-r_g?r?R zGHGQJQ&Py#rw3-(nS)Vxk7|rggw-1g$E3Y~4|>2Vm-OKSRd!ckht+8&isTNfGhAFZ zD|p!1{cfI>ad#KX&>gb2J=GIPwU=AwQFh5i7M;be`sSYpRCe4S9CkRt$@{J7i2D=i zla~OFcJA6)b=vT^`L}?WvV>osZO<^qu|+Aw&7BMBpcbgOK2m{yNGa!J%!@c zy|O8-?8Dbkl4H`s&j}wVhyUy+jo52`^m3}e5&g+&LzW{oCiyI5zkVGGl9h=7dkYQ; zbz*fA7YtqgrkKmYwn_RxMBv39Ii3>}Z@UEYO50aAeSGEu4Q4}vy&j#PDGi&On-d$~ z?X#GC{6s@;q2A-G4+C?r{{U!1rc8`CF_CmI5c*f@-;Ke;%;m*G#!qBPdq+z2LQf)e6*zDDPKK# z|Kh!Ky7_~4qM!R{_cq@b=}5Y;6qvdeXqs?)(so}Xim3EH{)2|E>uZPDs`+TVa z8{^hapPx(Zu)^TOIMnx9Gi79CTwTicZIb6HlLj@#H1Jx885oVelXZf2|6GH?R%m&- zR94BfxKPx6psu3_H^VPX|Ee?CYzZ^U*deHM&@3iuU~@Zob~gC9c9 zviChFQ!Y^!=D*ut>aL)uX#e*IpRo0hdvznX*O#X-oTcXcmF>1SSK9mgn=xIKB$!i+ zi~l{d^e5d}Re$S69@D@;?dKn)NBAw2B9gUtIjEWqbg~H#{JSs4wx7S(zV4V6{g%AJ zztG~Tpxf^V)gmIc{an-07iX0|{vI-1jeV1tCw^|^RF%N<_T4D3pGoH(V}HLPRGj*D zJ-Rn3cBNNla%#%d%PV$%etu!Ua-7_Kt}yYCm$N}bS@`jeq%Q8vTHQf05j#%*<<{pF>Z}|Ni~k5ce6*sX71iPPU4ko+4XVVo_0)dWJ@h?SRz& z{re*?_(~-wCxf&ttd0Z|rxOuHu!X7kMudmkV_d46_fEN}-MXcKiRv%CGonGp$EW`BKPXn}3r>3nvbUG zR3qbb`1PSB4@(P+*O{3?ce2aqFym}(@gSZwH!C^sv&pB3tuab`{hB19rEX(w0XT&t z;4%x<#q2H`3P1n45iW!BSfCC-W^lZbx?nXdgQDU=3co9d+gnWd-6WWagZp$d>*^;5@tc&CC>ma! zGq$!S53Kow`S+pQ+G}vv@yeN%z*Kd+tynFFu;!EjAGWOZ(Y)^l<&OroR#l!?bjqHM zPkNIQnPEHd*)*mr_G7u!(ZHI^XTw#UzXb*cY8N}5!GL=HoZ@ogi|BHWjH+LAZVX3` z>@fSx0BZsAwcDY`&DUfz3L4PSB_F~;4u*9Th4z1P1_JKnyX z_|M(Q=s`^&JW-M$jU@mlDkZtGe@US4tW>%hj| zB)L4Ipd%=>!awO549AYC7bq$z4KJ(#CMzf_CwEOo#m0iFyi@J!{%6jA1QXlMV)yuC zmDFkuIf0h;3h(jrQ6?v=2DUc`4h1$%)eCE;yb_V;pf!S|hDWhL?7S%{Y^WBggy8&q zVeH5+_4T(cES`S)beY=!k<~jQB%4_oS@PJyz{r@Cpa1F_tHZYeV0$zcAeJjYv!_p= zj%+gP;A7`p>+S7*26D~A6MT_{q;WJqKsFg8n;+}aVO2A}kmEX|-)mD~^<@EKL=>m5@tg0LwWI@;alBVI{KuDNCY4UW@1e{C&}xwvcswE&Oc?v!>`+SQTkl7)IKBo@K95q>p&a? z2QN$;7Utjz<0s7IWY7W0$;o5ee+W?f6RBJh2fg};m$mgXY;90N{5HshLcX0qM-34? z7w#&{vbeDy+>G~}e*6ACd2*X*yK@Bx;a;e;C{s#e;!x~z*Mt*zse=Rew1b|F&Geb# zS&uS(#a}GXZrRn7x0suHlv((^q3|0iO=@X0BZzl9r=5`dCN|lAfRz5>f`!i`_Lz%y zX?ErDZ^z&7L@|E()3A^9LExQHf9d&55hu{7Zmye#yC2B!emJ!8O1GvlF-)W^{?ZR>Yik$w?`kUk`Zc!^TXb&CYj}d{DV?|Q z+-JeN$Ie??di&2A4v2-jFL#?y%*_KW2z?IT&?#Ea4^p1J1Opm!%tRF+a^_mY$7@aPeF&q0DzOmNgn}SMRTNo!c zRA$e=d^Q!EF0?YYXZp*y^hc$EHM4Lgm4VexOg6a@NoUy>I2Eid`2eTU9j!y zHGcJIIQB}{uB5MY z@tZv8C?3$>$CsU4TvXN7cQ>w%UfAAPkeL5+>b*{00Cr+=Ny*wm!uGRJdi>5sVztRUQhr7o!u&N>QJ)P_ z$Pk&j1>h1hzT4|^tke)epez8JE3iGpKzU_)GGs4zL|{nBp_G)AAEoXB25Vn6S8GMe z6B#Gbl~?B@DxR^*eaz2y*j(y@BnLx4i;M0J&23K%9n_eLuI_=x)%_*{H*J1=xStyD z5%A!_PIUgF&E+2V)geDn5(aXzr9Eb`{yxiugdF2KiW8U46`Hi^mD}`*gw?Y~=;bee zoCr2E>TDNf60qW%b9*!(F@O4#nsKUgO}mxQ;#!Y(yBiIK=k%GLt}H!yH8mQv-jM*# ztkEGyB5<{OY3Q$%{b~C>qj&X7>^$9;Lc0p*q96U9TiAeBUehL$5)Hd6Kr`;WIr{~79go&+N6UeTy8QT`Cb{Y6?>iQ(6XJmjU z(aLhWDThtj8??Unv}u-Ljk~Wv)=VpXigS=telZ^v12@c?+FQMUvG1gDdNxy0mn3 z-+ulKXc@0Y<8N<&ST|BNm%)58*0~9Ca?2nyPBjpP!~JErz`B&gS76qK>VFkIuO*83o*%_0) z?HapmG%CiQZ$c>SU2fZc*lnFa*toxI4-_&c3AYzr`kn_tq#Yg6KqcWOiRb_AFFT6r z0u+D&1;ztOCqN@(>`Tb0jR|GnlRP|>aY{r@h&gyqaNWatlTTv~ScvMa&2?OQ>Bf8m zIVB}caNQ9mrZ;J6`%3z<0(g}a6j}!cltr1~LL`8@4la4PuZ>02x3u6dt$lq>pFfjU z8NLANU}In_F*`eW*B%PPJe}?WcudrGIXAsYKee{ReA+l$zEMN} zE<;CIB1HC;xzF&NAh-DmgN?;xL9QaR=3MQfar7bhf_;5`%E&1bs+4R94l7#LnxR2(ny{`D4Ef{0qe>Vdga zn~VJ}pFn$yijGbyFOLV&Z%e+aony2cf*7Qv&f#@~X!ZGRl&tuNqzI{SG?m6f? zWH%xTQBn#G3wx-Ps^)9n02k7!OHy8L&a3>NCQoZypS1j>{F_j|uh%1TJ}mENqL{Ia z=!Y^Hkn{oV1E^Cw*JPibp5D!yHz65x6U>8)f5qt~@NjaDQ2MU!f-D2vdO4BGj1YB^ z1;`F^X0HuV*8+5+36kBh+Uh6u<~pBenLeOklmb~qLk++JPsIj5W-i)SZCxGEFopoW z?Js?KYPlg-frAz*YkC+{_dgVFAf%gk-z|3#fiEWf5=-CJh`k*(sx3vv7~-g8XU{e^ zT|Akkz(wa-r*24)*j#M4?#>;HU5<;5eS?Sj=g%LpE~-6bWJD=wvNKaHjB_vPj7+n$ zduC}V)59vexuh;}ad9Ga%gvpCzi!5V1az3lSb(ZhooQ#+y#8oaynnBt_>G0?Y1X<- zQhNIJC6xdQ|ZAA`AKE8yEFk=k5ae)+ETkNiJi*>Q;P@=jpKsKOF}tb$ zq`~1erI{lQk}JKAz>k<(6n+n(MC0jbe=yu(Y;3%^xcC8D6Of(QGucx|MQldV`-$q} zl7|>ZA2yHQai7Rw2opq6x3g1LUA@Eotufu+M~MlKmxrW$%BNQTPD%v$8quE49Ly_< zG`LmI-sSz2lRhh&5Szq-_n!qOVFr{(TU+UKJx=5cOcVmBXAFn8Zy$rY3jN_c>i-IZ zF-n0;=i^hLavQ_#KFa@}1t=UMV|E+dfz4HO?C{=SgAeL{KTK5FnkZPA{gGf`#6f%U zn_T3gY|5~TOCIy!WW_pPNe^X{ws6MIn7E0R_032HHWUj8Dey0pQ6eUJ`}Qrd+-`74 zV-|vvVL0bnck_S!`t{wrcZSdozISxkZ>-uUem+Z88vewmt9`}s`+)zYZ^`Xe>J?&{ zvJX{k4JD|D4UTUHw`Y}PYZIP$&Xh$El^ir-v_NI4HCB)Vpm$jOuS|jYR?+gV-?@`< zRw}X0qHv~s-2zbvfJ}M=uMjP+l-g$pNFNlup6tIM)i|^z%x}^fTPvjTP0s20;(}G( z3GNI_QPcH*OOqXgG;mozJwBlRHUjtq7Ouh8m;q|xy*7ai-w8O(`5m@8@jsP)=4m?I z4M%E&jN%Mf+%m|^Y`r42`0YD4F-z*mN`47CVU)L7+}w`e6q6U0yQ~p*ZrxMZ{98WV zUQ*jntwDm$U?l)cIXQgq*>C+r`?430!^Shw zt~JUbPCJ;bhYugdR}gl994m?Th~9%ShX25b#PWkL?R=e)aR4ae!R`Zq*??d~_tT9D z+?PKJiYW{yNXLkASmoi3PzvxTVU&S%VHZGs$7Dh0z*k@<;${D(HxeNLOSnIfA86en z!^6=m zFQL@L#KbUqaP^_AhXQNBl!+V-4^|_?)Xgn&s;3|SAMk6W5VNd2=9afV@&Apio45h^dVBq< z!J^TJL2CZ|vBGVG-U0Cew7^t={s~M#gfu{hz;ocZ^$;vfOh}=O85kU2TU$#v@Bw@V z1q*-FX(5Pr2ShIfj>3GW1ZaUC0mOM7^id~s`OUP4zJ9#cPTJB_921L^MO}?-G|@DZ z-{>Fce^ZOry=G}Mv=+4B=m^FPtzgil1kmJh@$>%H*4Hkn^yhR)@3l|70o8;8;U#q( zmt=JsvmA2&4UW%QdL`G`!Wt7UBz*mP9WV(V$eVV{j>_CI$So5z^j9)E;zxUv+bq7n zI(j2az+@rMykXZ5Yhj_BD=yop!2jInE17;88E=!4E;AGl9=jwmDHbzPZ189f{XPi} zA!kEWph?5i3)3sv`xW}^>iQ1Pa6B}cY z1C$ZR)!EzVvo0liLGfy|yHneV-X*v(a3bMuk1)h{mIpUTw;c~|zP-XTmrc3JSrR-| z`!3xid#su&7-+WjUDwsf)>q`9 zRrMa){lL|^YxDB)VaZI-)m~+(x}oXn!n-zHvIoo_9*O9vF>wmb-dyQ&Gwj)wdM*L! zCgMBXE$DmFZOulzKL?)fD;@(Syj8XI!zvbFYhBy2a6{hz(Xt%0vv}`iZFp^~m3yQr z)73Merti$9*u5W@rR@8!9sSvmjiMaNyRFyAQHY=IU0rqO3VMmAA^beBTLCGl=2z!* z3jvtHv>>X?z1-U$-q@Uy9#k{(Mm250Ca-+^%gR2b-EH!zE-k0y9=!=$?W`U!GV(BL zo(CdREBi~wed}q9PJ9MDk+f->c~UHRQb}BeNSy3iOUP z%oRx2F~WC;5il4|J5)Le9RVVj(VS?ge&`L8sP28;&9aUL0>`S4nfG2z?cfs@t6e_T zQ{=O>lxkh^EBem&SWA%sF98_ClUXItfrGjx$I>&hPKIB<%^y{`)Tyg}XdmK^tkh_l z0L<_?+35mdxSrwQAbAaG4ZPFFh8t`u#$ac#Y2R3mrlnNoz5ta?s(GhRq#vz zv3RKcTVW^(GRh>ky}+pQ_AX;2ece9seWZ!*iQBM0`v)y9>z^Ox^a@(y)in6edir!b zYWi^yKA-J(^U;=xww5IP5xnemc{YpJDXi*q=24rm0iSK#&(t|;IvomZSFX$1_x$U5 z$MG(5fdSkZTMiQqO`3>;;8$aOWM&>L=~Duo1^9s|9tJ0BZln$t19}d0i)$F3X*UBP zDnSi{x(mN#eqjNr8O$7Fvx#$&pT4WWeb{H21S{9^yq;Wsa7b5Dj{JKbvOY<(*?#CBkLO03~)t^&Xd^sVZd z6#^*s{sRXlCMKXdD0hSg){Q{l%taqqp6-)}O$r{37z6@K6Mz0B5eQ+hL@@HItEl1mLO+srWV@xJD%I^7jA-`PMGeXnpTu8(ixz&l zOOK_Hlzh|6oA1rdvu}$%;{C0ksNTP5H^;}&EY%$w-|;u0jzRKNR@Oy3f4hE%mTrc> z2NYwt5ZF-s$QblfB2e4){$QCze9QB;0r~Lg$jHI_dze{h_Y=c3EqM?aulFyA%qwp% zDi`+Il+TA}KmAW?RXqA{==OyRKbP3`rzTIbHE?}7H~9SUogb@w2 z%-)MCo!JI0a2SB3!M+kX_M=9P=Z0$lkCDs$dQhad62KSK@|I(h5QYZ0D4sezbZB78 z7dAgKexJt)164J(hb`kHKrJSl|CXLTf6gx@^}O5K%*rZ&D6>HDgX~tZ)?}+y?j@#? z5w5B4{`jbEX$ZO?#c`=;)kBCn4$rv}UD3~B>~7{IbG9k7zJJ}LRyK$A%oau<}^&R&<5$FFrP-HnE2K+(r!Ys?37^ulaX-FvWd{i7B_~qH#Cqr^FoxEM*SI zzK+@RS+MtC<6a=DUbm4T@`DHGzMKl?MRtkVcf;NXZj)WRq6jgv1+r7$&`^zDEhJO} zTZyQ|u1(qcHsGS`;ZErx>jdb}B2~aZqkk9I<-7c8>srI$jhz}zH z^8~I6t;|qP9W&B_WZ?5$bZ9xms1yPPVfF87W0X?;rB4#gD2zdWT)w~Obdev_O(9tc zq`8pd6l8q+?%h++NaE6W-V& zJwN6(biiN`vKyqv;}E~QCe;t$g`6?7f&eJ!Jy9GW=4|BDD|5Q7t+f5BFX2o_`RW5# z+CJD=ON!dBw2K_ZEa`_pMxqoL{fuQ_^Mz}y_LwuDrizowG>MhVHXpdib6hu@p z&?wP;Jv~d#uD|K9Dgwkp^JEqBD^rUzF_ThINgFhUvN5JYtA zn+t-So{(L!_3ucCT=1TPo*=G<(i!iW^YvBiM+rm|mxGpQrz4A~qM<=nc~xpYM6AUY ztyJdj-OPXP6W`vZTDQbIVjh#=YX0OS#*((w*tyFPdwBTF;nMTP(?il5v0nXoj8m3% z6T&eEVSIoBxO9$~ETlsJfS{^8Sp%qC*(5U1I5;?XCbVhiecr_d))u2H-~Nck^b z%e1s3*{PNnRaqkQZ*j4!leik0_>*gO{zT1AeJqN^qSp-9bumzUSr3m%P{$Xq(xk^ZWm^s)Gh*#)&TulEqyeVPrHymwWPr z3|r!+Y1dzeZenZ<&<4^T&YGypivO2nl*WudyTY{paUoDS@`oSu^4dB&Wd7$cf+A~V z>b&LdTHEwN@_{I}crSGf*VEkkcTT+WXMk0?>lj_B8RtK1qh0*J1sTc3{VR0K?km67 zI&a=>AsA3)NEAc?l9p!%kZfnA+Dipls?0-(?BRV_E0-?q0ESD3zyKSh8hPgpp9^LL zZM{x@26Frjtr^KkU<61z!3|>oMG4Ta;n9_qm4RwFcAG||H5d|OF?4~Cp&0@t!BIox zkUt6;`eBz67+Zf_F}(gvP7-61z+!--yX=TDHQWC8DYnH!PmU6CEyOw~96N*Ss*zHA z-ZP~UZUh$kUPklV1WlB5bH(h^QiJvc=ZNN>Wjhn=$VW*xrkxx|Haxf!G^-~lq7N%D zLBfhsP}SD1M+ozSP9{;3-Af8d7OI%K%~=>6fS53~aQX&V1baR(i38fEzW0*4gQFvs z6&fh!R>-wSxLbJN2M-=Z>?MtY8x8`VmC#`VPzd`5F_$17#};z!1A_dWnYve@Eh1_F znev^yYxlj^KJNvZ!E28v?4Gf`}J+JxULn0mEE+l@m^ue1r!mA;w6Xss^pS4@r$F*n zB4eiP;;aVp`SmyV2WbSF2uFR1{c?3#DO7AP{XPS17p9cjS92K-fjIy#gge&6bx1sI-TVHPxEn*0)>0cZ* z7GylkBV6TK-D;djRhMrw_C=tDx3k+_$&^^4XaP0eD}8=k4N!Q}cK;8;tRXKVvX+Gtc z8S}cI?_ed3^6M}Ba8U5{Z0o6QiYK`pzBaU2kPyu)Y;%(T@IYU2I1Eyksh=`;?r?(Q z5Z#}wEbj94zM1)l$2abQ{$iklcVXYb>uQX1?XR!cUa!ayw}I}VDsv8758!eT$@N*e zfdmCMz!3x|5!MRA0U0FbGP28~4L1L1qDXm#g=Ik+Ls?Z+RH~MzdX5}9avK&EPE{2b z7ZY)y+wVlbcj@WFuXJsOkbU5TQ~~%2c`Pg}%xiPfVEp{R8U?C{c<@3;2hp2b&K>IP zMT5{U^#kMUXGhNI{#eQ|;FILLaf`XTNUXN>b?XO8ov z29(k>knH>@kEbLjU-5P)E)FOflqFPuOp`301sc|5b_Fv`9W;Ov*BLhEU;^U$HjQ9c(FBTUA+%pox#Ipsy>jf~TAH!`6gQrB4^71D2aKZr!-6wE@ z*KA6n9*Z2u*MHQx&DGGmLomAbbo(T zmM0f8d$>YeguI?0?eK5Mmc%dfmJM=byRex|fB)bMFqcU&CH}&d0pAP2G}gU^hd}3D zjA7zCh@U^NjZ+Qjf??t2(-RXz3D`L}=cTcoP;XNBH@AVv8*nn3_?mk#m2e;f?0#gh z>LKhaHE=aRgq!0DO)(-FvSpAUU;%`(hFpL9rJ>0L2*t^er;NY;eOFT^o^-$? z1&tlpS}q_8&*N<(eLV3>kD(WO&J=2$OMjjK{a$G(t~SSNABmc)CX>(kWER zZ?B!@=MWck9q@LADm`Dr<8w(}-u={ec9{U>^9+fVMaTSp-ON`e+NyVQSmozW9#9XUuJ2e`)6Q=Y$^Fh6PEOyb_%@XM2)92E?R|SKCKf7= z;oUNq2W0|Hb#qU5TWN>pWpuTV$F5!ZGxDl0cWgKB{K`$sG{SP%c^ zIyw}UZG9!(TT`|ILZV;RXgO8=Nhvq~ntRQ~3`k^j*f!~2inTT9^n9bb@k^v)sO{=; zJ;UIU#wDI*{hd`EpW2fB_K`Y_$F<3^hHa$QZE?!HJ#o{|#qxG~%55&|uh&9(bD!xX zv=nl8&SJNN5Y0XaZYeG2b*M6`$>kzTVdrHlaP?!+GC!Q9w=@VCIN3xi*niotm3Hr5O*TnDN7eiTZ zB2uTg`+>FIGJCw+r+^wGdZ98ls=ZRW+=69v%4~((B?D%b?-*n{q$P0Z_22)G%xXD3 z;noP*N2+-sA+py|g1O>k04I*Z&KDWV>fd22$q`z2t#W8V)UTlDoJk1jgN(|URGMe; zGm#Pn5j(Sw(;g9`4oYGVqqpAw#x?LF)&0Rgb-7$h%8DlypS6(Yt(NL1g|bTIUHtH_ zcdK##O+_`8n?jkqr>OSQ#c8&zZbq4^#YIMbNbUfm!z`;Bvcn0aI)55=Ywvs$et*ko zA~!Z1DE9^~Qv-m7TT+8jfM=N;w_S>Ze88WOLKHy0lad~Qew38(@$pqbnSq2wzv-?V zCoY5LkHtfZW5`K-#}C9^yIN=h4gl(_(AG3(Gymtco-88_s*UB2wHNE9vJv>ReAgO?v@@Tb1}lTUdfyd9}f22I7O6$aL6$D!d4`@=78`I8g`}G+M~9! z!+|{W{hl*?f`Xr+uHX>=ua$~z$$OGVadcH4A>L5dx%mbjV+OJkm#N|JX=)HvasZfd zj)fRger4L$+pB<5B|-Fy=o?>S#d9_?GWxVtN{rbfrz235q8^S7i%jhokfzTiGvy74 z`0e=p_wO45p?%92S`;ya2bGAcAqkmF059U(SX-NTc<7Wqevr}Ax^kRiA^3t<)b?72 ztK0BOiJQZ^jnBMq|Ja3Xw>{f4*_jLRsgvUPWw(4cmx%F0tTQBYgbROxv$BFRpuY`Y?PK_{D8~s$gx>VEa0TIHc}aDeq`xG2^bW?yRg0Iy!;VGU!yG zD%j?C-7P_?iH9I{kGUYlZyxXd#7>l`h|vYk{fe>0{klzN79iL~&~w@?LdPwJL#uAI_t=@1M8?uY(B9EdF! zwk2S{3Ekou3{())7Wjq#QyGb;S!-)$bsy6iwx=js z170Gj4LED;ibPCGc{wxgyzaO!u}JWMkg6g|Hs0QnPi}*9KTolQS`1|!r#Dk`atGxgU-H9tuH za-onNU>t&x{R*$A-kU`mL7U=H>iZ~rGnigXOw?WKkk+t2?e`8UN%35+mU=SB6jP&Hc5AOMe)v(y8mzAw65KMP)tV#n zp4_xgN>ua<^4i1{IYP18!Ne>m4naZ0fHc}SUjIEBdlbHipdwC0<2-OG1O5t6xjbq^8fW931Hx|63M zxx#D1Q-ST7T2K&y!!1e)QcabWBmmC&j&F5e$p|uf1xz_>0(e7d; z+(Vx~e;)WXhnwnFn4;^wt6SAUu}rapl(tNjiD~ZwNJAf4Mk>@f+32f%_1&&JA2R0H zvzlTF=N;!XEuv+??ZBfUisIOTn;Szyi}}$Hw;3=mq3H@Lg5&`P;En|qN6Ocyt0$aP zH8g5*01c`q9wk;h#WEL%WjsxFco`7OQi_-GZy6_O7VaYr{MpLmT=`|ves1&XwAsiX zs+O|y;N_82xj$#VM*R9Pwk)3CPk5dVd=_&k7r{~RsGSu9M9H30GYj5s1U9bjilp8d zljZh6d@u-#QiWFd?oYw-XjB@&3r;g4m50+hn7v|RV!h5?da`5Kj*ri`E;By{%ZKx;^b`bw3 zW||UOM9jb9%rGeg-}H3!KX4@IFGODgDJPIjj&@{svMRQSxeQ1Qr(j1TnFQ{K6P(Cj z;Xw2yL>K_pKgArN%e$|eVp!2{_pS~$9)G8%?P!miV%GJ%S$3@&mJ09V4 zfQXruD)nyuZPuHHJDemj13&SS&z(C!nvfHcnrp&We)0*o9Caw`sfNoQ*IBeaGV7@y zrj?Om=fd{(`uCP|TtWBkHch-sHM~{wlXd3)?yrsI@{PP*4c#((@pDCKyE6BHtg^KH0L#K1_ zbWh!4mY(#5e|rT&D%EuZXF7G~`dp6YHVDnQS8Oe1!+twJDKSfe>{qoPWzX465M+lU zV!)*%T^%$9YM8Zm9{6cbh&f0j)&g4)3eLym?>Gy3n13||9Xk5APgjk1ZPrV1@Fz2;Y)f0AekqpU}PCYa8*jKUpTsy1snx9#={3u`ws=20rIr2|h!WONu z(F1F9IfCqk+2rFPUtc(U9mQl8hkZ8KZJvN*fB4-ver<-Ol~`=OQmL^2G{zE;E3aZ0 z@-xT~wDj0kD8jXe=y{RlA`}n+Txw+vmO+K~pVyAOQ6)Q5ebHGwPKz*1ap3fP+f`Oi zPae0}#7PCn3!}bMcgFu7czl`YJpC@l=M5 z9KaBXb|%P?m&Vn=DIJ6V`t9_&?jvh=I(e;Al1P4cgrexx{m-5U>CHSQd-uCrKP| zFHN-RGWS&ti#VyP*Kaqw?)6*EVYoD#k}2Vv>SNHPkRE*W za1SLu+y#{nE&PMaln!~d;oAHdvK9cel0LH zynDbALk2RU(>95A{PKsn?YydL5X@~jX;ac+x%qrezc zNDcYBd6Fh1Z2fy1U$}UD>;41ZE%VW&lL}_PS~9hF72FK3?96<*`TJ@&=Y8#{UyCG$ z;`NCQW4Y?L+Zmo*Ix9qTU}k0g%$YN{;V)pSVcbDsjBSr?VY+FJ56K{YCJ7F}z@)`3 z;B!nk0*nS6p)~>gv_jOvr-eMZjZeQibM~y!|106l;BE?#U%ka1i^c+jq2*LL;ozaCW*FZ@DsaljOyVFDu|#%ND*C_Gwl zsE}k@J3H&jUx3C&D_GIhtLk{6F8X*5gEl4LRDgjHKqFySP!?moN>ygg-X#se;S7dW z3=C0zb#-J{y%SH<>193sLW6}Piw#)~qf+ZxvG>%T>@p7@8mtnkGdBC%4KiDQbDOeI zn$zdB^t>-!x8~j*mV&tUpGIA-`g@~xc~RwnR*9ssi@1Np zM0=j;*adfzY?SaB@U$V`K+12Bh`>>fEaY9#s3Oq(D7JZlZy}~{MXp~?C?uSM0DlF7Lug(g zR46{d+=GzQ;KtQy#pK?=Y0_;cSFJUThHeVMdwG6^Q)H>?pXOdu-rk39RL0WS%9);i zH!P3$t%;qn$1VynJLts(+kMF}HcgxnYBvP=10Fi?A3F}5S)K#`|E zgQ^i;YxR5#24&TkS2ZOmYq&KWqwJTOU7)4pa2|tCs3t#oU!wno&$lpa7eA2bp3C+` zA{mew!~=MWu-OkEsEf19Xc@L<^67msWTQm)L{U*lMr*Q@p52t|+2=9OSi#mALB4v9 zPdgjmetI{AwkJ}RL#%*_Y@&i5ZX#U-5T9X)J)Ztr12&@lGZp}BrP!`I($)+?>wpLU zZ2rRFrX`CFcp5JwD-Np1=ig{#1O}MRFJw^1&u&RHGc*KD;RiPw+ets15m*?ov@cpz zFQ=*jPa^$4q`Uz79sU7Cc;I8?4TArswone3%l~Dwxej2@fD8~W0hHX;K9|1GcsxKNbnD=XXKf6=!1Dd-%)rtxtd%kSD#sIy`}i;da`9(dM#yp;2OkU zdU(%@n0i0zktxL3Nlgewdlv{nAXg#D`9ovEr~(QC7g!X)5mH%DY>2g_Pqqw&4+uX) z#6&IuI|0N+QX%2C^8Lr3#{-O0LbT6w6Ds)T3vTwc^@JyfQ&Jd-{#kAECL^UOHvfZ+ z4fX*GU2Yi=Q_zbq#--x=kI}hT6@;c8^%79~XuUzsGO0=iFS`Z=A3`O-^>uAnC-I$_ z55F2Dw>OIbwB?o!=!9Sm0xS!t4=ciOBo1ddr&x>qP#|Hh4b66YtG$YY<2LDds3wO| zl&h6Po!Iwr$Et+OTH@@nuC(Igtl?CW^v0-&xqu|R@jHRNj8?Oq1teoIJrrScc*haRLghG24kPj>uvxEHhT4C}~E? z{+x;LT-2D&)CyKPd3|%@Q+Yq-W^1!tF-GVmCZjOkX+;Vq-vukWIapb3);rtuw5Co` zr%@mX2r&JB;~^|G8}LP^auc&BJ>ne%bz5wDN4ilu#IY2+-{jtc$ki_TlmbK?1GxUOe2 zSakQk3E_%uy`DE`L_7D^N9YYqTTFjuE>KE%I7n#;UBwEn-|cXTB6<=#^Y&l4PpZkJ zZrCw;f{sw}*!cpQPMAaKM4RWr*MGTy(v}qpK{hWEOn7Yk%azxiMGMT^9@n0{LAxX3A?`r*XeAx)gQ)c~llwyuQcbZpKx8l z8P&jhS4;|6DHQ)xBCBqOPGHU_wuU-w+2z7nfjssy52C25(%m@>Tb?bQZ7A4d(j%!< zcQZ~A2el%g?PBTL#t2@<#sA;r^(025JUXI@Q21_fq$|(s8!;r`GLrX%`pj zxB1P@eqhQC)p;$XKo62F7i~@DR#`}Ws8jZM4H3Ec>0xVa2J2beO4Du^e&9Ayc410! zMeD26^VTxm27GnD=M?L;Q69qhooBMYP?}VJkYl!m&M_#yva?Jwxbsa#g^Ph2qTuN{ znI`0;5jlP0lJ($;xsoM|-PkKTQ-!BvJvd=OdKSMP@JKsUHsBx|{_I%EoTIa7+TM{g OD^p!JyHsu1mGmEM|B|u* literal 0 HcmV?d00001 diff --git a/doc/reference/images/gcal-window.png b/doc/reference/images/gcal-window.png new file mode 100644 index 0000000000000000000000000000000000000000..d7d2c53564833e31079514be75f239c0db67fbe8 GIT binary patch literal 35329 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

Qv~@7=B)_* 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

    _eR-I#UhBGmpz#J|B+@wmheZGLyL%QDq} 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 +/** + * SECTION:gcal-debug + * @short_description: Debugging macros + * @title:Debugging + * @stability:stable + * + * Macros used for tracing and debugging code. These + * are only valid when Calendar is compiled with tracing + * suppoer (pass `--enable-tracing` to the configure + * script to do that). + */ + G_BEGIN_DECLS #ifndef GCAL_ENABLE_TRACE @@ -38,46 +50,158 @@ G_BEGIN_DECLS #endif #ifdef GCAL_ENABLE_TRACE + +/** + * GCAL_TRACE_MSG: + * @fmt: printf-like format of the message + * @...: arguments for @fmt + * + * Prints a trace message. + */ # define GCAL_TRACE_MSG(fmt, ...) \ g_log(G_LOG_DOMAIN, GCAL_LOG_LEVEL_TRACE, " MSG: %s():%d: " fmt, \ G_STRFUNC, __LINE__, ##__VA_ARGS__) + +/** + * GCAL_PROBE: + * + * Prints a probing message. Put this macro in the code when + * you want to check the program reaches a certain section + * of code. + */ # define GCAL_PROBE \ g_log(G_LOG_DOMAIN, GCAL_LOG_LEVEL_TRACE, "PROBE: %s():%d", \ G_STRFUNC, __LINE__) + +/** + * GCAL_TODO: + * @_msg: the message to print + * + * Prints a TODO message. + */ # define GCAL_TODO(_msg) \ g_log(G_LOG_DOMAIN, GCAL_LOG_LEVEL_TRACE, " TODO: %s():%d: %s", \ G_STRFUNC, __LINE__, _msg) + +/** + * GCAL_ENTRY: + * + * Prints an entry message. This shouldn't be used in + * critical functions. Place this at the beggining of + * the function, before any assertion. + */ # define GCAL_ENTRY \ g_log(G_LOG_DOMAIN, GCAL_LOG_LEVEL_TRACE, "ENTRY: %s():%d", \ G_STRFUNC, __LINE__) + +/** + * GCAL_EXIT: + * + * Prints an exit message. This shouldn't be used in + * critical functions. Place this at the end of + * the function, after any relevant code. If the + * function returns something, use GCAL_RETURN() + * instead. + */ # define GCAL_EXIT \ G_STMT_START { \ g_log(G_LOG_DOMAIN, GCAL_LOG_LEVEL_TRACE, " EXIT: %s():%d", \ G_STRFUNC, __LINE__); \ return; \ } G_STMT_END + +/** + * GCAL_GOTO: + * @_l: goto tag + * + * Logs a goto jump. + */ # define GCAL_GOTO(_l) \ G_STMT_START { \ g_log(G_LOG_DOMAIN, GCAL_LOG_LEVEL_TRACE, " GOTO: %s():%d ("#_l")",\ G_STRFUNC, __LINE__); \ goto _l; \ } G_STMT_END + +/** + * GCAL_RETURN: + * @_r: the return value. + * + * Prints an exit message, and returns @_r. See #GCAL_EXIT. + */ # define GCAL_RETURN(_r) \ G_STMT_START { \ g_log(G_LOG_DOMAIN, GCAL_LOG_LEVEL_TRACE, " EXIT: %s():%d ", \ G_STRFUNC, __LINE__); \ return _r; \ } G_STMT_END + #else + +/** + * GCAL_TODO: + * @_msg: the message to print + * + * Prints a TODO message. + */ # define GCAL_TODO(_msg) + +/** + * GCAL_PROBE: + * + * Prints a probing message. + */ # define GCAL_PROBE + +/** + * GCAL_TRACE_MSG: + * @fmt: printf-like format of the message + * @...: arguments for @fmt + * + * Prints a trace message. + */ # define GCAL_TRACE_MSG(fmt, ...) + +/** + * GCAL_ENTRY: + * + * Prints a probing message. This shouldn't be used in + * critical functions. Place this at the beggining of + * the function, before any assertion. + */ # define GCAL_ENTRY + +/** + * GCAL_GOTO: + * @_l: goto tag + * + * Logs a goto jump. + */ # define GCAL_GOTO(_l) goto _l + +/** + * GCAL_EXIT: + * + * Prints an exit message. This shouldn't be used in + * critical functions. Place this at the end of + * the function, after any relevant code. If the + * function returns somethin, use GCAL_RETURN() + * instead. + */ # define GCAL_EXIT return + +/** + * GCAL_RETURN: + * @_r: the return value. + * + * Prints an exit message, and returns @_r. See #GCAL_EXIT. + */ # define GCAL_RETURN(_r) return _r #endif +/** + * _GCAL_BUG: (skip) + */ #define _GCAL_BUG(Component, Description, File, Line, Func, ...) \ G_STMT_START { \ g_printerr ("-----------------------------------------------------------------\n"); \ @@ -91,6 +215,15 @@ G_BEGIN_DECLS g_printerr (Description"\n", ##__VA_ARGS__); \ g_printerr ("-----------------------------------------------------------------\n"); \ } G_STMT_END + +/** + * GCAL_BUG: + * @Component: the component + * @Description: the description + * @...: extra arguments + * + * Logs a bug-friendly message. + */ #define GCAL_BUG(Component, Description, ...) \ _GCAL_BUG(Component, Description, __FILE__, __LINE__, G_STRFUNC, ##__VA_ARGS__) diff --git a/src/gcal-edit-dialog.c b/src/gcal-edit-dialog.c index 59fc74a4..f54ebf1a 100644 --- a/src/gcal-edit-dialog.c +++ b/src/gcal-edit-dialog.c @@ -29,6 +29,17 @@ #include #include +/** + * SECTION:gcal-edit-dialog + * @short_description: Event editor dialog + * @title:GcalEditDialog + * @image:gcal-edit-dialog.png + * + * #GcalEditDialog is the event editor dialog of GNOME Calendar. It + * allows the user to change the various aspects of the events, as + * well as managing alarms. + */ + struct _GcalEditDialog { GtkDialog parent; @@ -766,6 +777,7 @@ get_row_for_alarm_trigger_minutes (GcalEditDialog *self, return NULL; } + static void remove_button_clicked (GtkButton *button, GtkWidget *row) @@ -1019,12 +1031,27 @@ add_alarm_button_clicked (GtkWidget *button, } /* Public API */ + +/** + * gcal_edit_dialog_new: + * + * Creates a new #GcalEditDialog + * + * Returns: (transfer full): a #GcalEditDialog + */ GtkWidget* gcal_edit_dialog_new (void) { return g_object_new (GCAL_TYPE_EDIT_DIALOG, NULL); } +/** + * gcal_edit_dialog_set_time_format: + * @dialog: a #GcalDialog + * @use_24h_format: %TRUE to use 24h format, %FALSE otherwise + * + * Sets the time format to be used by @dialog. + */ void gcal_edit_dialog_set_time_format (GcalEditDialog *dialog, gboolean use_24h_format) @@ -1037,6 +1064,14 @@ gcal_edit_dialog_set_time_format (GcalEditDialog *dialog, gcal_time_selector_set_time_format (GCAL_TIME_SELECTOR (dialog->end_time_selector), dialog->format_24h); } +/** + * gcal_edit_dialog_set_event_is_new: + * @dialog: a #GcalDialog + * @event_is_new: %TRUE if the event is new, %FALSE otherwise + * + * Sets whether the currently edited event is a new event, or not. + * The @dialog will adapt it's UI elements to reflect that. + */ void gcal_edit_dialog_set_event_is_new (GcalEditDialog *dialog, gboolean event_is_new) @@ -1046,6 +1081,14 @@ gcal_edit_dialog_set_event_is_new (GcalEditDialog *dialog, gtk_widget_set_visible (dialog->delete_button, !event_is_new); } +/** + * gcal_edit_dialog_get_event: + * @dialog: a #GcalDialog + * + * Retrieves the current event being edited by the @dialog. + * + * Returns: (transfer none)(nullable): a #GcalEvent + */ GcalEvent* gcal_edit_dialog_get_event (GcalEditDialog *dialog) { @@ -1054,6 +1097,14 @@ gcal_edit_dialog_get_event (GcalEditDialog *dialog) return dialog->event; } +/** + * gcal_edit_dialog_set_event: + * @dialog: a #GcalDialog + * @event: (nullable): a #GcalEvent + * + * Sets the event of the @dialog. When @event is + * %NULL, the current event information is unset. + */ void gcal_edit_dialog_set_event (GcalEditDialog *dialog, GcalEvent *event) @@ -1164,6 +1215,13 @@ out: GCAL_EXIT; } +/** + * gcal_edit_dialog_set_manager: + * @dialog: a #GcalEditDialog + * @manager: a #GcalManager + * + * Sets the #GcalManager instance of the @dialog. + */ void gcal_edit_dialog_set_manager (GcalEditDialog *dialog, GcalManager *manager) @@ -1220,6 +1278,14 @@ return_datetime_for_widgets (GcalEditDialog *dialog, return retval; } +/** + * gcal_edit_dialog_get_date_start: + * @dialog: a #GcalEditDialog + * + * Retrieves the start date of the edit dialog. + * + * Returns: (transfer full): a #GDateTime + */ GDateTime* gcal_edit_dialog_get_date_start (GcalEditDialog *dialog) { @@ -1231,6 +1297,14 @@ gcal_edit_dialog_get_date_start (GcalEditDialog *dialog) GCAL_TIME_SELECTOR (dialog->start_time_selector)); } +/** + * gcal_edit_dialog_get_date_end: + * @dialog: a #GcalEditDialog + * + * Retrieves the end date of the edit dialog. + * + * Returns: (transfer full): a #GDateTime + */ GDateTime* gcal_edit_dialog_get_date_end (GcalEditDialog *dialog) { diff --git a/src/gcal-event.c b/src/gcal-event.c index a9d0a7d7..907bb96c 100644 --- a/src/gcal-event.c +++ b/src/gcal-event.c @@ -23,6 +23,58 @@ #define LIBICAL_TZID_PREFIX "/freeassociation.sourceforge.net/" +/** + * SECTION:gcal-event + * @short_description: A class that represents an event + * @title:GcalEvent + * @stability:unstable + * @see_also:GcalEventWidget,GcalManager + * + * The #GcalEvent class represents an appointment, with + * various functions to modify it. All the changes are + * transient. To persistently store the changes, you + * need to call gcal_manager_update_event(). + * + * Although the #ECalComponent may have no end date. In this + * case, gcal_event_get_date_end() returns the same date that + * gcal_event_get_date_start(). + * + * #GcalEvent implements #GInitable, and creating it possibly + * can generate an error. At the moment, the only error that + * can be generate is #GCAL_EVENT_ERROR_INVALID_START_DATE. + * + * ## Timezones + * + * When a #GcalEvent is created, the timezone is parsed from + * the #ECalComponent. The start and end dates can possibly + * have different timezones, e.g. when the user is traveling + * across timezones and the departure time is in a different + * timezone of the arrival time. + * + * For the sake of sanity, gcal_event_get_timezone() returns + * the timezone of the start date. If you need to precisely + * check the timezones of the start and end dates, you have + * to use g_date_time_get_timezone_identifier(). + * + * ## Example: + * |[ + * GcalEvent *event; + * GError *error; + * + * error = NULL; + * event = gcal_event_new (source, component, &error); + * + * if (error) + * { + * g_warning ("Error creating event: %s", error->message); + * g_clear_error (&error); + * return; + * } + * + * ... + * ]| + */ + struct _GcalEvent { GObject parent; @@ -739,7 +791,7 @@ gcal_event_get_color (GcalEvent *self) * @color: a #GdkRGBA * * Sets the color of the event, which is passed to the - * parent @ESource. + * parent #ESource. */ void gcal_event_set_color (GcalEvent *self, @@ -797,7 +849,9 @@ gcal_event_set_all_day (GcalEvent *self, * gcal_event_get_date_end: * @self: a #GcalEvent * - * Retrieves the end date of @self. + * Retrieves the end date of @self. If the component doesn't + * have an end date, then the returned date is the same of + * gcal_event_get_date_start(). * * Returns: (transfer none): a #GDateTime. */ diff --git a/src/gcal-event.h b/src/gcal-event.h index ce21b22d..3fe6d96d 100644 --- a/src/gcal-event.h +++ b/src/gcal-event.h @@ -26,6 +26,12 @@ G_BEGIN_DECLS +/** + * GcalEventError: + * @GCAL_EVENT_ERROR_INVALID_START_DATE: indicated an invalid start date + * + * Errors that #GcalEvent can generate. + */ typedef enum { GCAL_EVENT_ERROR_INVALID_START_DATE diff --git a/src/gcal-manager.c b/src/gcal-manager.c index f63235b7..91587b1d 100644 --- a/src/gcal-manager.c +++ b/src/gcal-manager.c @@ -25,6 +25,17 @@ #include +/** + * SECTION:gcal-manager + * @short_description: The backend of GNOME Calendar + * @title:GcalManager + * @stability:unstable + * + * #GcalManager is the backend of GNOME Calendar. It sets everything + * up, connects to the Online Accounts daemon, and manages the events + * and calendars. + */ + typedef struct { GcalEvent *event; @@ -479,7 +490,7 @@ on_event_created (GObject *source_object, /** * on_component_updated: - * @source_object: {@link ECalClient} source + * @source_object: #ECalClient source * @result: result of the operation * @user_data: manager instance * @@ -510,9 +521,9 @@ on_event_updated (GObject *source_object, /** * on_event_removed: - * @source_object: {@link ECalClient} source + * @source_object: #ECalClient source * @result: result of the operation - * @user_data: an {@link ECalComponent} + * @user_data: an #ECalComponent * * Called when an component is removed. Currently, it only checks for * error, but a more sophisticated implementation will come in no time.* @@ -1076,12 +1087,12 @@ gcal_manager_init (GcalManager *self) /* Public API */ /** * gcal_manager_new_with_settings: - * @settings: + * @settings: a #GSettings * - * Since: 0.0.1 - * Return value: the new #GcalManager - * Returns: (transfer full): - **/ + * Creates a new #GcalManager with @settings. + * + * Returns: (transfer full): a newly created #GcalManager + */ GcalManager* gcal_manager_new_with_settings (GSettings *settings) { @@ -1092,29 +1103,32 @@ gcal_manager_new_with_settings (GSettings *settings) /** * gcal_manager_get_source: - * @manager: + * @manager: a #GcalManager + * @uid: the unique identifier of the source * * Retrieve a source according to it's UID. The source * is referenced for thread-safety and must be unreferenced * after user. * - * Returns: (Transfer full) an {@link ESource}, or NULL. - **/ + * Returns: (nullable)(transfer full): an #ESource, or %NULL. + */ ESource* gcal_manager_get_source (GcalManager *manager, const gchar *uid) { + g_return_val_if_fail (GCAL_IS_MANAGER (manager), NULL); + return e_source_registry_ref_source (manager->source_registry, uid); } /** * gcal_manager_get_sources: - * @manager: + * @manager: a #GcalManager * * Retrieve a list of the enabled sources used in the application. * - * Returns: (Transfer full) a {@link GList} object to be freed with g_list_free() - **/ + * Returns: (nullable)(transfer container)(content-type ESource): a #GList + */ GList* gcal_manager_get_sources (GcalManager *manager) { @@ -1124,6 +1138,8 @@ gcal_manager_get_sources (GcalManager *manager) GCAL_ENTRY; + g_return_val_if_fail (GCAL_IS_MANAGER (manager), NULL); + g_hash_table_iter_init (&iter, manager->clients); while (g_hash_table_iter_next (&iter, &key, &value)) @@ -1141,50 +1157,75 @@ gcal_manager_get_sources (GcalManager *manager) /** * gcal_manager_get_sources_connected: - * @manager: + * @manager: a #GcalManager * - * Returns a {@link GList} with every source connected on the app, whether they are enabled or not. + * Returns a #GList with every source connected on the app, + * whether they are enabled or not. * - * Returns: (Transfer full) a {@link GList} object to be freed with g_list_free() - **/ + * Returns: (nullable)(transfer container)(content-type ESource): a #GList + */ GList* gcal_manager_get_sources_connected (GcalManager *manager) { + g_return_val_if_fail (GCAL_IS_MANAGER (manager), NULL); + return g_hash_table_get_keys (manager->clients); } /** * gcal_manager_get_default_source: - * @manager: App singleton {@link GcalManager} instance + * @manager: a #GcalManager * - * Returns: (Transfer full): an {@link ESource} object. Free with g_object_unref(). - **/ + * Returns: (transfer full): an #ESource object. Free + * with g_object_unref(). + */ ESource* gcal_manager_get_default_source (GcalManager *manager) { + g_return_val_if_fail (GCAL_IS_MANAGER (manager), NULL); + return e_source_registry_ref_default_calendar (manager->source_registry); } /** * gcal_manager_set_default_source: - * @manager: App singleton {@link GcalManager} instance + * @manager: a #GcalManager * @source: the new default source. * - * Returns: - **/ + * Sets the default calendar. + */ void gcal_manager_set_default_source (GcalManager *manager, ESource *source) { + g_return_if_fail (GCAL_IS_MANAGER (manager)); + e_source_registry_set_default_calendar (manager->source_registry, source); } +/** + * gcal_manager_get_system_timezone: + * @manager: a #GcalManager + * + * Retireves the default timezone. + * + * Returns: (transfer none): the default timezone + */ icaltimezone* gcal_manager_get_system_timezone (GcalManager *manager) { + g_return_val_if_fail (GCAL_IS_MANAGER (manager), NULL); + return manager->system_timezone; } +/** + * gcal_manager_setup_shell_search: + * @manager: a #GcalManager + * @subscriber: an #ECalDataModelSubscriber + * + * Sets up the GNOME Shell search subscriber. + */ void gcal_manager_setup_shell_search (GcalManager *self, ECalDataModelSubscriber *subscriber) @@ -1213,13 +1254,15 @@ gcal_manager_setup_shell_search (GcalManager *self, * @query: query string (an s-exp) * * Set the query terms of the #ECalDataModel used in the shell search - **/ + */ void gcal_manager_set_shell_search_query (GcalManager *manager, const gchar *query) { GCAL_ENTRY; + g_return_if_fail (GCAL_IS_MANAGER (manager)); + manager->search_view_data->passed_start = FALSE; manager->search_view_data->search_done = FALSE; manager->search_view_data->sources_left = g_hash_table_size (manager->clients); @@ -1231,6 +1274,15 @@ gcal_manager_set_shell_search_query (GcalManager *manager, e_cal_data_model_set_filter (manager->shell_search_data_model, query); } +/** + * gcal_manager_set_shell_search_subscriber: + * @self: a #GcalManager + * @subscriber: the #ECalDataModelSubscriber to subscribe + * @range_start: the start of the range + * @range_end: the end of the range + * + * Subscribe @subscriber to the shell data modal at the given range. + */ void gcal_manager_set_shell_search_subscriber (GcalManager *manager, ECalDataModelSubscriber *subscriber, @@ -1244,12 +1296,30 @@ gcal_manager_set_shell_search_subscriber (GcalManager *manager, GCAL_EXIT; } +/** + * gcal_manager_shell_search_done: + * @self: a #GcalManager + * + * Retrieves whether the search at @manager is done or not. + * + * Returns: %TRUE if the search is finished. + */ gboolean gcal_manager_shell_search_done (GcalManager *manager) { + g_return_val_if_fail (GCAL_IS_MANAGER (manager), FALSE); + return manager->search_view_data->search_done; } +/** + * gcal_manager_get_shell_search_events: + * @self: a #GcalManager + * + * Retrieves all the events available for GNOME Shell search. + * + * Returns: (nullable)(transfer full)(content-type GcalEvent): a #GList + */ GList* gcal_manager_get_shell_search_events (GcalManager *manager) { @@ -1272,6 +1342,16 @@ gcal_manager_get_shell_search_events (GcalManager *manager) GCAL_RETURN (list); } +/** + * gcal_manager_set_subscriber: + * @self: a #GcalManager + * @subscriber: a #ECalDataModelSubscriber + * @range_start: the start of the range + * @range_end: the end of the range + * + * Sets the @subscriber to show events between @range_start + * and @range_end. + */ void gcal_manager_set_subscriber (GcalManager *manager, ECalDataModelSubscriber *subscriber, @@ -1280,6 +1360,8 @@ gcal_manager_set_subscriber (GcalManager *manager, { GCAL_ENTRY; + g_return_if_fail (GCAL_IS_MANAGER (manager)); + e_cal_data_model_subscribe (manager->e_data_model, subscriber, range_start, @@ -1288,6 +1370,16 @@ gcal_manager_set_subscriber (GcalManager *manager, GCAL_EXIT; } +/** + * gcal_manager_set_search_subscriber: + * @self: a #GcalManager + * @subscriber: a #ECalDataModelSubscriber + * @range_start: the start of the range + * @range_end: the end of the range + * + * Sets the @subscriber to show events between @range_start + * and @range_end. + */ void gcal_manager_set_search_subscriber (GcalManager *manager, ECalDataModelSubscriber *subscriber, @@ -1296,6 +1388,8 @@ gcal_manager_set_search_subscriber (GcalManager *manager, { GCAL_ENTRY; + g_return_if_fail (GCAL_IS_MANAGER (manager)); + e_cal_data_model_subscribe (manager->search_data_model, subscriber, range_start, @@ -1311,8 +1405,7 @@ gcal_manager_set_search_subscriber (GcalManager *manager, * * Set the query terms of the #ECalDataModel or clear it if %NULL is * passed - * - **/ + */ void gcal_manager_set_query (GcalManager *self, const gchar *query) @@ -1330,10 +1423,10 @@ gcal_manager_set_query (GcalManager *self, /** * gcal_manager_query_client_data: * - * Queries for a specific data field of - * the {@link ECalClient}. + * Queries for a specific data field of the #ECalClient * - * Returns: (Transfer none) a string representing the retrieved value, or NULL. + * Returns: (nullable)(transfer none): a string representing + * the retrieved value. */ gchar* gcal_manager_query_client_data (GcalManager *manager, @@ -1345,6 +1438,8 @@ gcal_manager_query_client_data (GcalManager *manager, GCAL_ENTRY; + g_return_val_if_fail (GCAL_IS_MANAGER (manager), NULL); + unit = g_hash_table_lookup (manager->clients, source); if (!unit) @@ -1365,10 +1460,8 @@ gcal_manager_query_client_data (GcalManager *manager, * Add a new calendar by its URI. * The calendar is enabled by default * - * Return value: The UID of calendar's source, NULL in other case - * Returns: (transfer full): - * - * Since: 0.0.1 + * Returns: (nullable)(transfer full): unique identifier of calendar's source, or + * %NULL. */ gchar* gcal_manager_add_source (GcalManager *manager, @@ -1382,6 +1475,8 @@ gcal_manager_add_source (GcalManager *manager, GCAL_ENTRY; + g_return_val_if_fail (GCAL_IS_MANAGER (manager), NULL); + source = e_source_new (NULL, NULL, NULL); extension = E_SOURCE_CALENDAR (e_source_get_extension (source, E_SOURCE_EXTENSION_CALENDAR)); @@ -1427,6 +1522,9 @@ gcal_manager_enable_source (GcalManager *manager, GCAL_ENTRY; + g_return_if_fail (GCAL_IS_MANAGER (manager)); + g_return_if_fail (E_IS_SOURCE (source)); + unit = g_hash_table_lookup (manager->clients, source); selectable = e_source_get_extension (source, E_SOURCE_EXTENSION_CALENDAR); @@ -1469,6 +1567,9 @@ gcal_manager_disable_source (GcalManager *manager, GCAL_ENTRY; + g_return_if_fail (GCAL_IS_MANAGER (manager)); + g_return_if_fail (E_IS_SOURCE (source)); + unit = g_hash_table_lookup (manager->clients, source); selectable = e_source_get_extension (source, E_SOURCE_EXTENSION_CALENDAR); @@ -1511,6 +1612,9 @@ gcal_manager_save_source (GcalManager *manager, GCAL_ENTRY; + g_return_if_fail (GCAL_IS_MANAGER (manager)); + g_return_if_fail (E_IS_SOURCE (source)); + e_source_registry_commit_source_sync (manager->source_registry, source, NULL, &error); if (error) @@ -1523,6 +1627,13 @@ gcal_manager_save_source (GcalManager *manager, GCAL_EXIT; } +/** + * gcal_manager_refresh: + * @manager: a #GcalManager + * + * Forces a full refresh and synchronization of all available + * calendars. + */ void gcal_manager_refresh (GcalManager *manager) { @@ -1531,6 +1642,8 @@ gcal_manager_refresh (GcalManager *manager) GCAL_ENTRY; + g_return_if_fail (GCAL_IS_MANAGER (manager)); + clients = g_hash_table_get_values (manager->clients); /* refresh clients */ @@ -1552,6 +1665,15 @@ gcal_manager_refresh (GcalManager *manager) GCAL_EXIT; } +/** + * gcal_manager_is_client_writable: + * @manager: a #GcalManager + * @source: an #ESource + * + * Retrieves whether @source is writable. + * + * Returns: %TRUE if @source is writable, %FALSE otherwise. + */ gboolean gcal_manager_is_client_writable (GcalManager *manager, ESource *source) @@ -1568,9 +1690,16 @@ gcal_manager_is_client_writable (GcalManager *manager, GCAL_RETURN (unit->connected && !e_client_is_readonly (E_CLIENT (unit->client))); } +/** + * gcal_manager_create_event: + * @manager: a #GcalManager + * @event: a #GcalEvent + * + * Creates @event. + */ void -gcal_manager_create_event (GcalManager *manager, - GcalEvent *event) +gcal_manager_create_event (GcalManager *manager, + GcalEvent *event) { GcalManagerUnit *unit; icalcomponent *new_event_icalcomp; @@ -1580,6 +1709,9 @@ gcal_manager_create_event (GcalManager *manager, GCAL_ENTRY; + g_return_if_fail (GCAL_IS_MANAGER (manager)); + g_return_if_fail (GCAL_IS_EVENT (event)); + source = gcal_event_get_source (event); component = gcal_event_get_component (event); unit = g_hash_table_lookup (manager->clients, source); @@ -1599,6 +1731,13 @@ gcal_manager_create_event (GcalManager *manager, GCAL_EXIT; } +/** + * gcal_manager_update_event: + * @manager: a #GcalManager + * @event: a #GcalEvent + * + * Saves all changes made to @event persistently. + */ void gcal_manager_update_event (GcalManager *manager, GcalEvent *event) @@ -1608,6 +1747,9 @@ gcal_manager_update_event (GcalManager *manager, GCAL_ENTRY; + g_return_if_fail (GCAL_IS_MANAGER (manager)); + g_return_if_fail (GCAL_IS_EVENT (event)); + unit = g_hash_table_lookup (manager->clients, gcal_event_get_source (event)); component = gcal_event_get_component (event); @@ -1628,9 +1770,16 @@ gcal_manager_update_event (GcalManager *manager, GCAL_EXIT; } +/** + * gcal_manager_remove_event: + * @manager: a #GcalManager + * @event: a #GcalEvent + * + * Deletes @event. + */ void -gcal_manager_remove_event (GcalManager *manager, - GcalEvent *event) +gcal_manager_remove_event (GcalManager *manager, + GcalEvent *event) { GcalManagerUnit *unit; ECalComponentId *id; @@ -1638,6 +1787,9 @@ gcal_manager_remove_event (GcalManager *manager, GCAL_ENTRY; + g_return_if_fail (GCAL_IS_MANAGER (manager)); + g_return_if_fail (GCAL_IS_EVENT (event)); + component = gcal_event_get_component (event); unit = g_hash_table_lookup (manager->clients, gcal_event_get_source (event)); id = e_cal_component_get_id (component); @@ -1662,6 +1814,16 @@ gcal_manager_remove_event (GcalManager *manager, GCAL_EXIT; } +/** + * gcal_manager_move_event_to_source: + * @manager: a #GcalManager + * @event: a #GcalEvent + * @dest: the destination calendar + * + * Moves @event to @dest calendar. This is a fail-safe operation: + * worst case, the user will have two duplicated events, and we + * guarantee to never loose any data. + */ void gcal_manager_move_event_to_source (GcalManager *manager, GcalEvent *event, @@ -1677,6 +1839,8 @@ gcal_manager_move_event_to_source (GcalManager *manager, GCAL_ENTRY; g_return_if_fail (GCAL_IS_MANAGER (manager)); + g_return_if_fail (GCAL_IS_EVENT (event)); + g_return_if_fail (E_IS_SOURCE (dest)); error = NULL; @@ -1732,11 +1896,15 @@ gcal_manager_move_event_to_source (GcalManager *manager, /** * gcal_manager_get_events: + * @manager: a #GcalManager + * @start_date: the start of the dete range + * @end_date: the end of the dete range * - * Returns a list with {@link GcalEvent} objects owned by the caller, the list and the objects. - * The components inside the list are owned by the caller as well. So, don't ref the component. + * Returns a list with #GcalEvent objects owned by the caller, + * the list and the objects. The components inside the list are + * owned by the caller as well. * - * Returns: An {@link GList} object + * Returns: (nullable)(transfer full)(content-type GcalEvent):a #GList */ GList* gcal_manager_get_events (GcalManager *manager, @@ -1748,14 +1916,30 @@ gcal_manager_get_events (GcalManager *manager, GCAL_ENTRY; + g_return_val_if_fail (GCAL_IS_MANAGER (manager), NULL); + range_start = icaltime_as_timet_with_zone (*start_date, manager->system_timezone); range_end = icaltime_as_timet_with_zone (*end_date, manager->system_timezone); - e_cal_data_model_foreach_component (manager->e_data_model, range_start, range_end, gather_events, &list); + e_cal_data_model_foreach_component (manager->e_data_model, + range_start, + range_end, + gather_events, + &list); GCAL_RETURN (list); } +/** + * gcal_manager_get_loading: + * @self: a #GcalManager + * + * Retrieves whether @self is still loading or not. Loading is + * complete when the Online Accounts client is retrieved, and all + * the calendars are loaded. + * + * Returns: %TRUE if manager is still loading; %FALSE otherwise + */ gboolean gcal_manager_get_loading (GcalManager *self) { @@ -1764,6 +1948,15 @@ gcal_manager_get_loading (GcalManager *self) return !self->goa_client_ready || self->sources_at_launch > 0; } +/** + * gcal_manager_get_event_from_shell_search: + * @manager: a #GcalManager + * @uuid: the unique identier of the event + * + * Retrieves the #GcalEvent with @uuid. + * + * Returns: (nullable)(transfer full): a #GcalEvent + */ GcalEvent* gcal_manager_get_event_from_shell_search (GcalManager *manager, const gchar *uuid) @@ -1774,12 +1967,21 @@ gcal_manager_get_event_from_shell_search (GcalManager *manager, GCAL_ENTRY; + g_return_val_if_fail (GCAL_IS_MANAGER (manager), NULL); + list = NULL; new_event = NULL; - e_cal_data_model_get_subscriber_range (manager->shell_search_data_model, manager->search_view_data->subscriber, - &range_start, &range_end); - e_cal_data_model_foreach_component (manager->shell_search_data_model, range_start, range_end, gather_events, &list); + e_cal_data_model_get_subscriber_range (manager->shell_search_data_model, + manager->search_view_data->subscriber, + &range_start, + &range_end); + + e_cal_data_model_foreach_component (manager->shell_search_data_model, + range_start, + range_end, + gather_events, + &list); for (l = list; l != NULL; l = g_list_next (l)) { @@ -1799,12 +2001,20 @@ gcal_manager_get_event_from_shell_search (GcalManager *manager, GCAL_RETURN (new_event); } +/** + * gcal_manager_get_goa_client: + * @self: a #GcalManager + * + * Retrieves the #GoaClient connected by @self. + * + * Returns: (transfer none): a #GoaClient + */ GoaClient* -gcal_manager_get_goa_client (GcalManager *manager) +gcal_manager_get_goa_client (GcalManager *self) { - g_return_val_if_fail (GCAL_IS_MANAGER (manager), FALSE); - GCAL_ENTRY; - GCAL_RETURN (manager->goa_client); + g_return_val_if_fail (GCAL_IS_MANAGER (self), NULL); + + GCAL_RETURN (self->goa_client); } diff --git a/src/gcal-source-dialog.c b/src/gcal-source-dialog.c index 42759e51..dfd30a44 100644 --- a/src/gcal-source-dialog.c +++ b/src/gcal-source-dialog.c @@ -26,6 +26,19 @@ #include #include +/** + * SECTION:gcal-source-dialog + * @short_description: Dialog to manage calendars + * @title:GcalSourceDialog + * @stability:unstable + * @image:gcal-source-dialog.png + * + * #GcalSourceDialog is the calendar management widget of GNOME + * Calendar. With it, users can create calendars from local files, + * local calendars or even import calendars from the Web or their + * online accounts. + */ + struct _GcalSourceDialog { GtkDialog parent; @@ -239,7 +252,7 @@ add_button_clicked (GtkWidget *button, if (self->source != NULL) { - // Commit the new source + /* Commit the new source */ gcal_manager_save_source (self->manager, self->source); self->source = NULL; @@ -251,14 +264,14 @@ add_button_clicked (GtkWidget *button, { GList *l; - // Commit each new remote source + /* Commit each new remote source */ for (l = self->remote_sources; l != NULL; l = l->next) gcal_manager_save_source (self->manager, l->data); g_list_free (self->remote_sources); self->remote_sources = NULL; - // Go back to overview + /* Go back to overview */ gcal_source_dialog_set_mode (GCAL_SOURCE_DIALOG (user_data), GCAL_SOURCE_DIALOG_MODE_NORMAL); } } @@ -311,16 +324,6 @@ add_source (GcalManager *manager, g_list_free (children); } -/** - * action_widget_activated: - * @widget: the button which emited the signal. - * @user_data: a {@link GcalSourceDialog} instance. - * - * Emit a response when action buttons - * are clicked. - * - * Returns: - */ static void action_widget_activated (GtkWidget *widget, gpointer user_data) @@ -333,13 +336,6 @@ action_widget_activated (GtkWidget *widget, gtk_dialog_response (GTK_DIALOG (user_data), response); } -/** - * back_button_clicked: - * - * Returns to the previous page. - * - * Returns: - */ static void back_button_clicked (GtkButton *button, gpointer user_data) @@ -348,10 +344,10 @@ back_button_clicked (GtkButton *button, if (gtk_stack_get_visible_child (GTK_STACK (self->stack)) == self->edit_grid) { - // Save the source before leaving + /* Save the source before leaving */ gcal_manager_save_source (self->manager, self->source); - // Release the source ref we acquired + /* Release the source ref we acquired */ g_clear_object (&self->source); } @@ -370,11 +366,11 @@ calendar_listbox_sort_func (GtkListBoxRow *row1, self = GCAL_SOURCE_DIALOG (user_data); - // first source + /* first source */ source1 = g_object_get_data (G_OBJECT (row1), "source"); is_goa1 = is_goa_source (GCAL_SOURCE_DIALOG (user_data), source1); - // second source + /* second source */ source2 = g_object_get_data (G_OBJECT (row2), "source"); is_goa2 = is_goa_source (GCAL_SOURCE_DIALOG (user_data), source2); @@ -383,13 +379,13 @@ calendar_listbox_sort_func (GtkListBoxRow *row1, gchar *parent_name1 = NULL; gchar *parent_name2 = NULL; - // Retrieve parent names + /* Retrieve parent names */ get_source_parent_name_color (self->manager, source1, &parent_name1, NULL); get_source_parent_name_color (self->manager, source2, &parent_name2, NULL); retval = g_strcmp0 (parent_name1, parent_name2); - // If they have the same parent names, compare by the source display names + /* If they have the same parent names, compare by the source display names */ if (retval == 0) retval = g_strcmp0 (e_source_get_display_name (source1), e_source_get_display_name (source2)); @@ -398,7 +394,7 @@ calendar_listbox_sort_func (GtkListBoxRow *row1, } else { - // If one is a GOA account and the other isn't, make the GOA one go first + /* If one is a GOA account and the other isn't, make the GOA one go first */ retval = is_goa1 ? -1 : 1; } @@ -424,10 +420,10 @@ cancel_button_clicked (GtkWidget *button, { GcalSourceDialog *self = GCAL_SOURCE_DIALOG (user_data); - // Destroy the ongoing created source + /* Destroy the ongoing created source */ g_clear_object (&self->source); - // Cleanup detected remote sources that weren't added + /* Cleanup detected remote sources that weren't added */ if (self->remote_sources != NULL) { g_list_free_full (self->remote_sources, g_object_unref); @@ -437,13 +433,6 @@ cancel_button_clicked (GtkWidget *button, gcal_source_dialog_set_mode (GCAL_SOURCE_DIALOG (user_data), GCAL_SOURCE_DIALOG_MODE_NORMAL); } -/** - * clear_pages: - * - * Clear local and web pages. - * - * Returns: - */ static void clear_pages (GcalSourceDialog *dialog) { @@ -452,7 +441,7 @@ clear_pages (GcalSourceDialog *dialog) gtk_entry_set_text (GTK_ENTRY (dialog->calendar_address_entry), ""); gtk_widget_set_sensitive (dialog->add_button, FALSE); - // Remove discovered web sources (if any) + /* Remove discovered web sources (if any) */ list = gtk_container_get_children (GTK_CONTAINER (dialog->web_sources_listbox)); g_list_free_full (list, (GDestroyNotify) gtk_widget_destroy); @@ -500,15 +489,6 @@ default_check_toggled (GObject *object, gcal_manager_set_default_source (self->manager, self->old_default_source); } - -/** - * description_label_link_activated: - * - * Show GNOME Control Center when - * the label's link is pressed. - * - * Returns: - */ static gboolean description_label_link_activated (GtkWidget *widget, gchar *uri, @@ -520,12 +500,6 @@ description_label_link_activated (GtkWidget *widget, return TRUE; } -/** - * display_header_func: - * - * Shows a separator before each row. - * - */ static void display_header_func (GtkListBoxRow *row, GtkListBoxRow *before, @@ -540,14 +514,6 @@ display_header_func (GtkListBoxRow *row, } } -/** - * is_goa_source: - * - * Checks whether the source comes from - * a online account. - * - * Returns: %TRUE if the source came from a GOA account - */ static gboolean is_goa_source (GcalSourceDialog *dialog, ESource *source) @@ -599,14 +565,6 @@ invalidate_calendar_listbox_sort (GObject *source, gtk_list_box_invalidate_sort (GTK_LIST_BOX (user_data)); } -/** - * make_row_from_source: - * - * Create a GtkListBoxRow for a given - * ESource. - * - * Returns: (transfer full) the new row - */ static GtkWidget* make_row_from_source (GcalSourceDialog *dialog, ESource *source) @@ -658,17 +616,6 @@ make_row_from_source (GcalSourceDialog *dialog, return row; } -/** - * name_entry_text_changed: - * - * Callend when the name entry's text - * is edited. It changes the source's - * display name, but wait's for the - * calendar's ::response signal to - * commit these changes. - * - * Returns: - */ static void name_entry_text_changed (GObject *object, GParamSpec *pspec, @@ -677,6 +624,14 @@ name_entry_text_changed (GObject *object, GcalSourceDialog *self = GCAL_SOURCE_DIALOG (user_data); gboolean valid = gtk_entry_get_text_length (GTK_ENTRY (object)) > 0; + /* + * Callend when the name entry's text + * is edited. It changes the source's + * display name, but wait's for the + * calendar's ::response signal to + * commit these changes. + */ + gtk_widget_set_sensitive (self->back_button, valid); gtk_widget_set_sensitive (self->add_button, valid); @@ -695,13 +650,6 @@ spawn_goa_with_args (const gchar *action, NULL, NULL, NULL, NULL); } -/** - * online_accounts_listbox_row_activated: - * - * Selects the online account, or add one. - * - * Returns: - */ static void online_accounts_listbox_row_activated (GtkListBox *box, GtkListBoxRow *row, @@ -736,14 +684,6 @@ online_accounts_listbox_row_activated (GtkListBox *box, } } -/** - * response_signal: - * - * Save the source when the dialog - * is close. - * - * Returns: - */ static void response_signal (GtkDialog *dialog, gint response_id, @@ -751,19 +691,19 @@ response_signal (GtkDialog *dialog, { GcalSourceDialog *self = GCAL_SOURCE_DIALOG (dialog); - /* save the source */ + /* Save the source */ if (self->mode == GCAL_SOURCE_DIALOG_MODE_EDIT && self->source != NULL) { gcal_manager_save_source (self->manager, self->source); g_clear_object (&self->source); } - /* commit the new source; save the current page's source */ + /* Commit the new source; save the current page's source */ if (self->mode == GCAL_SOURCE_DIALOG_MODE_NORMAL && response_id == GTK_RESPONSE_APPLY && self->remote_sources != NULL) { GList *l; - // Commit each new remote source + /* Commit each new remote source */ for (l = self->remote_sources; l != NULL; l = l->next) gcal_manager_save_source (self->manager, l->data); @@ -800,7 +740,7 @@ is_remote_source (ESource *source) auth = e_source_get_extension (source, E_SOURCE_EXTENSION_AUTHENTICATION); - // No host is set, it's not a remote source + /* No host is set, it's not a remote source */ if (e_source_authentication_get_host (auth) == NULL) return FALSE; } @@ -811,7 +751,7 @@ is_remote_source (ESource *source) webdav = e_source_get_extension (source, E_SOURCE_EXTENSION_WEBDAV_BACKEND); - // No resource path specified, not a remote source + /* No resource path specified, not a remote source */ if (e_source_webdav_get_resource_path (webdav) == NULL) return FALSE; } @@ -876,7 +816,7 @@ stack_visible_child_name_changed (GObject *object, get_source_parent_name_color (self->manager, self->source, &parent_name, NULL); - // update headerbar buttons + /* update headerbar buttons */ gtk_header_bar_set_show_close_button (GTK_HEADER_BAR (self->headerbar), !creation_mode); gtk_widget_set_visible (self->calendar_visible_check, !creation_mode); gtk_widget_set_visible (self->back_button, !creation_mode); @@ -885,7 +825,7 @@ stack_visible_child_name_changed (GObject *object, gtk_widget_set_visible (self->account_box, is_goa); gtk_widget_set_visible (self->calendar_url_button, !is_goa && (is_file || is_remote)); - // If it's a file, set the file path + /* If it's a file, set the file path */ if (is_file) { ESourceLocal *local; @@ -902,7 +842,7 @@ stack_visible_child_name_changed (GObject *object, g_free (uri); } - // If it's remote, build the uri + /* If it's remote, build the uri */ if (is_remote) { ESourceAuthentication *auth; @@ -940,7 +880,7 @@ stack_visible_child_name_changed (GObject *object, /* entry */ gtk_entry_set_text (GTK_ENTRY (self->name_entry), e_source_get_display_name (self->source)); - // enabled check + /* enabled check */ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (self->calendar_visible_check), is_source_enabled (self->source)); @@ -968,14 +908,6 @@ stack_visible_child_name_changed (GObject *object, } } -/** - * calendar_file_selected: - * - * Opens a file selector dialog and - * parse the resulting selection. - * - * Returns: - */ static void calendar_file_selected (GtkFileChooser *button, gpointer user_data) @@ -1007,23 +939,13 @@ calendar_file_selected (GtkFileChooser *button, /* update the source properties */ e_source_set_display_name (source, g_file_get_basename (file)); - // Jump to the edit page + /* Jump to the edit page */ gcal_source_dialog_set_source (GCAL_SOURCE_DIALOG (user_data), source); gcal_source_dialog_set_mode (GCAL_SOURCE_DIALOG (user_data), GCAL_SOURCE_DIALOG_MODE_CREATE); gtk_widget_set_sensitive (self->add_button, TRUE); } -/** - * calendar_listbox_row_activated: - * - * Edits the selected calendar for the - * 'Calendars' listbox or goes to the - * calendar selection for the Online - * Accounts listbox. - * - * Returns: - */ static void calendar_listbox_row_activated (GtkListBox *box, GtkListBoxRow *row, @@ -1046,13 +968,6 @@ calendar_listbox_row_activated (GtkListBox *box, } } -/** - * pulse_web_entry: - * - * Update the url's entry with a pulse fraction. - * - * Returns: FALSE - */ static gboolean pulse_web_entry (GcalSourceDialog *dialog) { @@ -1063,14 +978,6 @@ pulse_web_entry (GcalSourceDialog *dialog) return FALSE; } -/** - * url_entry_text_changed: - * - * Performs a validation of the URL - * 1 second after the user inputs. - * - * Returns: - */ static void url_entry_text_changed (GObject *object, GParamSpec *pspec, @@ -1098,7 +1005,7 @@ url_entry_text_changed (GObject *object, if (g_utf8_strlen (text, -1) != 0) { - // Remove any previous unreleased resource + /* Remove any previous unreleased resource */ if (self->validate_url_resource_id != 0) g_source_remove (self->validate_url_resource_id); @@ -1117,14 +1024,6 @@ url_entry_text_changed (GObject *object, } } -/** - * online_accounts_settings_button_clicked: - * - * Spawns the GNOME Control Center app - * with Online Accounts openned. - * - * Returns: - */ static void online_accounts_settings_button_clicked (GtkWidget *button, gpointer user_data) @@ -1141,7 +1040,7 @@ on_file_activated (GSimpleAction *action, GtkFileFilter *filter; gint response; - // Dialog + /* Dialog */ dialog = gtk_file_chooser_dialog_new (_("Select a calendar file"), GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (user_data))), GTK_FILE_CHOOSER_ACTION_SAVE, @@ -1151,7 +1050,7 @@ on_file_activated (GSimpleAction *action, g_signal_connect (dialog, "file-activated", G_CALLBACK (calendar_file_selected), user_data); - // File filter + /* File filter */ filter = gtk_file_filter_new (); gtk_file_filter_set_name (filter, _("Calendar files")); gtk_file_filter_add_mime_type (filter, "text/calendar"); @@ -1166,14 +1065,6 @@ on_file_activated (GSimpleAction *action, gtk_widget_destroy (dialog); } -/** - * on_local_activated: - * - * Creates a new local calendar, and let - * the user adjust the settings after. - * - * Returns: - */ static void on_local_activated (GSimpleAction *action, GVariant *param, @@ -1197,21 +1088,13 @@ on_local_activated (GSimpleAction *action, /* update the source properties */ e_source_set_display_name (source, _("Unnamed Calendar")); - // Jump to the edit page + /* Jump to the edit page */ gcal_source_dialog_set_source (GCAL_SOURCE_DIALOG (user_data), source); gcal_source_dialog_set_mode (GCAL_SOURCE_DIALOG (user_data), GCAL_SOURCE_DIALOG_MODE_CREATE); gtk_widget_set_sensitive (self->add_button, TRUE); } -/** - * on_web_activated: - * - * Redirect to the web calendar creation - * page - * - * Returns: - */ static void on_web_activated (GSimpleAction *action, GVariant *param, @@ -1229,14 +1112,6 @@ calendar_address_activated (GtkEntry *entry, validate_url_cb (GCAL_SOURCE_DIALOG (user_data)); } -/** - * validate_url_cb: - * - * Query the given URL for possible - * calendar data. - * - * Returns:FALSE - */ static gboolean validate_url_cb (GcalSourceDialog *dialog) { @@ -1260,15 +1135,15 @@ validate_url_cb (GcalSourceDialog *dialog) dialog->remote_sources = NULL; } - // Remove previous results + /* Remove previous results */ g_list_free_full (gtk_container_get_children (GTK_CONTAINER (dialog->web_sources_listbox)), (GDestroyNotify) gtk_widget_destroy); gtk_revealer_set_reveal_child (GTK_REVEALER (dialog->web_sources_revealer), FALSE); - // Clear the entry icon + /* Clear the entry icon */ gtk_entry_set_icon_from_icon_name (GTK_ENTRY (dialog->calendar_address_entry), GTK_ENTRY_ICON_SECONDARY, NULL); - // Get the hostname and file path from the server + /* Get the hostname and file path from the server */ uri_valid = uri_get_fields (gtk_entry_get_text (GTK_ENTRY (dialog->calendar_address_entry)), NULL, &host, &path); g_debug ("[source-dialog] host: '%s', path: '%s'", host, path); @@ -1286,11 +1161,11 @@ validate_url_cb (GcalSourceDialog *dialog) ext = e_source_get_extension (source, E_SOURCE_EXTENSION_CALENDAR); e_source_backend_set_backend_name (E_SOURCE_BACKEND (ext), "webcal"); - // Authentication + /* Authentication */ auth = e_source_get_extension (source, E_SOURCE_EXTENSION_AUTHENTICATION); e_source_authentication_set_host (auth, host); - // Webdav + /* Webdav */ webdav = e_source_get_extension (source, E_SOURCE_EXTENSION_WEBDAV_BACKEND); e_source_webdav_set_resource_path (webdav, path); @@ -1301,17 +1176,17 @@ validate_url_cb (GcalSourceDialog *dialog) */ if (g_str_has_suffix (path, ".ics")) { - // Set the private source so it saves at closing + /* Set the private source so it saves at closing */ dialog->remote_sources = g_list_append (dialog->remote_sources, source); - // Update buttons + /* Update buttons */ gtk_widget_set_sensitive (dialog->add_button, source != NULL); } else { ENamedParameters *credentials; - // Pulse the entry while it performs the check + /* Pulse the entry while it performs the check */ dialog->calendar_address_id = g_timeout_add (ENTRY_PROGRESS_TIMEOUT, (GSourceFunc) pulse_web_entry, dialog); /* @@ -1325,7 +1200,7 @@ validate_url_cb (GcalSourceDialog *dialog) { g_debug ("[source-dialog] Trying to connect without credentials..."); - // NULL credentials + /* NULL credentials */ e_named_parameters_set (credentials, E_SOURCE_CREDENTIAL_USERNAME, NULL); e_named_parameters_set (credentials, E_SOURCE_CREDENTIAL_PASSWORD, NULL); @@ -1349,7 +1224,7 @@ validate_url_cb (GcalSourceDialog *dialog) */ if (response == GTK_RESPONSE_OK) { - // User inputted credentials + /* User inputted credentials */ e_named_parameters_set (credentials, E_SOURCE_CREDENTIAL_USERNAME, user); e_named_parameters_set (credentials, E_SOURCE_CREDENTIAL_PASSWORD, password); @@ -1398,13 +1273,13 @@ prompt_credentials (GcalSourceDialog *dialog, { gint response; - // Cleanup last credentials + /* Cleanup last credentials */ gtk_entry_set_text (GTK_ENTRY (dialog->credentials_password_entry), ""); gtk_entry_set_text (GTK_ENTRY (dialog->credentials_user_entry), ""); gtk_widget_grab_focus (dialog->credentials_user_entry); - // Show the dialog, then destroy it + /* Show the dialog, then destroy it */ response = gtk_dialog_run (GTK_DIALOG (dialog->credentials_dialog)); if (response == GTK_RESPONSE_OK) @@ -1435,7 +1310,7 @@ duplicate_source (ESource *source) ext = e_source_get_extension (new_source, E_SOURCE_EXTENSION_CALENDAR); e_source_backend_set_backend_name (E_SOURCE_BACKEND (ext), "local"); - // Copy Authentication data + /* Copy Authentication data */ if (e_source_has_extension (source, E_SOURCE_EXTENSION_AUTHENTICATION)) { ESourceAuthentication *new_auth, *parent_auth; @@ -1450,7 +1325,7 @@ duplicate_source (ESource *source) e_source_authentication_set_proxy_uid (new_auth, e_source_authentication_get_proxy_uid (parent_auth)); } - // Copy Webdav data + /* Copy Webdav data */ if (e_source_has_extension (source, E_SOURCE_EXTENSION_WEBDAV_BACKEND)) { ESourceWebdav *new_webdav, *parent_webdav; @@ -1507,7 +1382,7 @@ discover_sources_cb (GObject *source, self = GCAL_SOURCE_DIALOG (user_data); error = NULL; - // Stop the pulsing entry + /* Stop the pulsing entry */ if (self->calendar_address_id != 0) { gtk_entry_set_progress_fraction (GTK_ENTRY (self->calendar_address_entry), 0); @@ -1518,7 +1393,7 @@ discover_sources_cb (GObject *source, if (!e_webdav_discover_sources_finish (E_SOURCE (source), result, NULL, NULL, &discovered_sources, &user_addresses, &error)) { - // Don't add an source with errors + /* Don't add an source with errors */ gtk_widget_set_sensitive (self->add_button, FALSE); /* @@ -1543,15 +1418,15 @@ discover_sources_cb (GObject *source, return; } - // Add a success icon to the entry + /* Add a success icon to the entry */ gtk_entry_set_icon_from_icon_name (GTK_ENTRY (self->calendar_address_entry), GTK_ENTRY_ICON_SECONDARY, "emblem-ok-symbolic"); - // Remove previous results + /* Remove previous results */ g_list_free_full (gtk_container_get_children (GTK_CONTAINER (self->web_sources_listbox)), (GDestroyNotify) gtk_widget_destroy); - // Show the list of calendars + /* Show the list of calendars */ gtk_revealer_set_reveal_child (GTK_REVEALER (self->web_sources_revealer), TRUE); gtk_widget_show (self->web_sources_revealer); @@ -1563,7 +1438,7 @@ discover_sources_cb (GObject *source, src = aux->data; - // Get the new resource path from the uri + /* Get the new resource path from the uri */ uri_valid = uri_get_fields (src->href, NULL, NULL, &resource_path); if (uri_valid) @@ -1606,7 +1481,7 @@ discover_sources_cb (GObject *source, g_free (resource_path); } - // Free things up + /* Free things up */ e_webdav_discover_free_discovered_sources (discovered_sources); g_slist_free_full (user_addresses, g_free); } @@ -1671,7 +1546,7 @@ notification_child_revealed_changed (GtkWidget *notification, if (!e_source_get_removable (self->removed_source)) return; - // Enable the source again to remove it's name from disabled list + /* Enable the source again to remove it's name from disabled list */ gcal_manager_enable_source (self->manager, self->removed_source); e_source_remove_sync (self->removed_source, NULL, &error); @@ -1712,7 +1587,7 @@ undo_remove_action (GtkButton *button, /* if there's any set source, unremove it */ if (self->removed_source != NULL) { - // Enable the source before adding it again + /* Enable the source before adding it again */ gcal_manager_enable_source (self->manager, self->removed_source); add_source (self->manager, @@ -1726,7 +1601,7 @@ undo_remove_action (GtkButton *button, */ self->removed_source = NULL; - // Hide notification + /* Hide notification */ gtk_revealer_set_reveal_child (GTK_REVEALER (self->notification), FALSE); } } @@ -1788,7 +1663,7 @@ remove_button_clicked (GtkWidget *button, gtk_revealer_set_reveal_child (GTK_REVEALER (self->notification), TRUE); - // Remove the listbox entry (if any) + /* Remove the listbox entry (if any) */ for (l = children; l != NULL; l = l->next) { if (g_object_get_data (l->data, "source") == self->removed_source) @@ -1798,17 +1673,17 @@ remove_button_clicked (GtkWidget *button, } } - // Update notification label + /* Update notification label */ str = g_markup_printf_escaped (_("Calendar %s removed"), e_source_get_display_name (self->removed_source)); gtk_label_set_markup (GTK_LABEL (self->notification_label), str); - // Remove old notifications + /* Remove old notifications */ if (self->notification_timeout_id != 0) g_source_remove (self->notification_timeout_id); self->notification_timeout_id = g_timeout_add_seconds (5, hide_notification_scheduled, user_data); - // Disable the source, so it gets hidden + /* Disable the source, so it gets hidden */ gcal_manager_disable_source (self->manager, self->removed_source); g_list_free (children); @@ -1840,7 +1715,7 @@ gcal_source_dialog_constructed (GObject *object) g_object_set_data (G_OBJECT (self->remove_button), "response", GINT_TO_POINTER (GCAL_RESPONSE_REMOVE_SOURCE)); - // Setup listbox header functions + /* Setup listbox header functions */ gtk_list_box_set_header_func (GTK_LIST_BOX (self->calendars_listbox), display_header_func, NULL, NULL); gtk_list_box_set_sort_func (GTK_LIST_BOX (self->calendars_listbox), (GtkListBoxSortFunc) calendar_listbox_sort_func, object, NULL); @@ -1849,13 +1724,13 @@ gcal_source_dialog_constructed (GObject *object) gtk_list_box_set_sort_func (GTK_LIST_BOX (self->online_accounts_listbox), (GtkListBoxSortFunc) online_accounts_listbox_sort_func, object, NULL); - // Action group + /* Action group */ self->action_group = g_simple_action_group_new (); gtk_widget_insert_action_group (GTK_WIDGET (object), "source", G_ACTION_GROUP (self->action_group)); g_action_map_add_action_entries (G_ACTION_MAP (self->action_group), actions, G_N_ELEMENTS (actions), object); - // Load the "Add" button menu + /* Load the "Add" button menu */ builder = gtk_builder_new_from_resource ("/org/gnome/calendar/gtk/menus.ui"); menu = G_MENU_MODEL (gtk_builder_get_object (builder, "add-source-menu")); @@ -2186,11 +2061,11 @@ loading_changed_cb (GcalSourceDialog *dialog) /** * gcal_source_dialog_set_manager: + * @dialog: a #GcalSourceDialog + * @manager: a #GcalManager * - * Setup the {@link GcalManager} singleton + * Setup the #GcalManager singleton * instance of the application. - * - * Returns: */ void gcal_source_dialog_set_manager (GcalSourceDialog *dialog, @@ -2221,13 +2096,12 @@ gcal_source_dialog_set_manager (GcalSourceDialog *dialog, /** * gcal_source_dialog_set_mode: + * @dialog: a #GcalSourceDialog + * @mode: a #GcalSourceDialogMode * - * Set the source dialog mode. Creation - * mode means that a new calendar will - * be created, while edit mode means a - * calendar will be edited. - * - * Returns: + * Set the source dialog mode. Creation mode means that a new + * calendar will be created, while edit mode means a calendar + * will be edited. */ void gcal_source_dialog_set_mode (GcalSourceDialog *dialog, @@ -2237,7 +2111,7 @@ gcal_source_dialog_set_mode (GcalSourceDialog *dialog, dialog->mode = mode; - // Cleanup old data + /* Cleanup old data */ clear_pages (dialog); switch (mode) @@ -2258,7 +2132,7 @@ gcal_source_dialog_set_mode (GcalSourceDialog *dialog, break; case GCAL_SOURCE_DIALOG_MODE_EDIT: - // Bind title + /* Bind title */ if (dialog->title_bind == NULL) { dialog->title_bind = g_object_bind_property (dialog->name_entry, "text", dialog->headerbar, "title", @@ -2287,10 +2161,10 @@ gcal_source_dialog_set_mode (GcalSourceDialog *dialog, /** * gcal_source_dialog_set_source: + * @dialog: a #GcalSourceDialog + * @source: an #ESource * * Sets the source to be edited by the user. - * - * Returns: */ void gcal_source_dialog_set_source (GcalSourceDialog *dialog, diff --git a/src/gcal-source-dialog.h b/src/gcal-source-dialog.h index 4daf640f..11aec38f 100644 --- a/src/gcal-source-dialog.h +++ b/src/gcal-source-dialog.h @@ -35,6 +35,15 @@ G_BEGIN_DECLS G_DECLARE_FINAL_TYPE (GcalSourceDialog, gcal_source_dialog, GCAL, SOURCE_DIALOG, GtkDialog) +/** + * GcalSourceDialogMode: + * @GCAL_SOURCE_DIALOG_MODE_CREATE: creating a new calendar + * @GCAL_SOURCE_DIALOG_MODE_CREATE_WEB: creating a new web-based calendar + * @GCAL_SOURCE_DIALOG_MODE_EDIT: editing an existing calendar + * @GCAL_SOURCE_DIALOG_MODE_NORMAL: showing the list of calendars and online accounts + * + * The current action of the #GcalSourceDialog + */ typedef enum { GCAL_SOURCE_DIALOG_MODE_CREATE, diff --git a/src/gcal-utils.c b/src/gcal-utils.c index 5a9dfb36..d0646b11 100644 --- a/src/gcal-utils.c +++ b/src/gcal-utils.c @@ -36,6 +36,12 @@ #include #include +/** + * SECTION:gcal-utils + * @short_description: Utility functions + * @title:Utility functions + */ + static const gint ab_day[7] = { @@ -69,6 +75,16 @@ month_item[12] = G_DEFINE_BOXED_TYPE (icaltimetype, icaltime, gcal_dup_icaltime, g_free) +/** + * datetime_compare_date: + * @dt1: (nullable): a #GDateTime + * @dt2: (nullable): a #GDateTime + * + * Compares the dates of @dt1 and @dt2. The times are + * ignored. + * + * Returns: negative, 0 or positive + */ gint datetime_compare_date (GDateTime *dt1, GDateTime *dt2) @@ -92,6 +108,14 @@ datetime_compare_date (GDateTime *dt1, return 0; } +/** + * datetime_to_icaltime: + * @dt: a #GDateTime + * + * Converts the #GDateTime's @dt to an #icaltimetype. + * + * Returns: (transfer full): a #icaltimetype. + */ icaltimetype* datetime_to_icaltime (GDateTime *dt) { @@ -115,6 +139,15 @@ datetime_to_icaltime (GDateTime *dt) return idt; } +/** + * icaltime_to_datetime: + * @date: an #icaltimetype + * + * Converts the #icaltimetype's @date to a #GDateTime. The + * timezone is preserved. + * + * Returns: (transfer full): a #GDateTime. + */ GDateTime* icaltime_to_datetime (const icaltimetype *date) { @@ -135,6 +168,17 @@ icaltime_to_datetime (const icaltimetype *date) return dt; } +/** + * datetime_is_date: + * @dt: a #GDateTime + * + * Checks if @dt represents a date. A pure date + * has the values of hour, minutes and seconds set + * to 0. + * + * Returns: %TRUE if @dt is a date, %FALSE if it's a + * timed datetime. + */ gboolean datetime_is_date (GDateTime *dt) { @@ -143,6 +187,14 @@ datetime_is_date (GDateTime *dt) g_date_time_get_seconds (dt) == 0; } +/** + * gcal_dup_icaltime: + * @date: an #icaltimetype + * + * Creates an exact copy of @date. + * + * Returns: (transfer full): an #icaltimetype + */ icaltimetype* gcal_dup_icaltime (const icaltimetype *date) { @@ -166,12 +218,28 @@ gcal_dup_icaltime (const icaltimetype *date) return new_date; } +/** + * gcal_get_weekday: + * @i: the weekday index + * + * Retrieves the weekday name. + * + * Returns: (transfer full): the weekday name + */ gchar* gcal_get_weekday (gint i) { return nl_langinfo (ab_day[i]); } +/** + * gcal_get_month_name: + * @i: the month index + * + * Retrieves the month name. + * + * Returns: (transfer full): the month name + */ gchar* gcal_get_month_name (gint i) { @@ -179,14 +247,15 @@ gcal_get_month_name (gint i) } /** - * gcal_get_pixbuf_from_color: - * @color: - * @size: + * gcal_get_surface_from_color: + * @color: a #GdkRGBA + * @size: the size of the surface * - * Create a pixbuf of a simple {@link GdkRGBA} color. + * Creates a squared surface filled with @color. The + * surface is always @size x @size. * - * Returns: (Transfer full): An instance of {@link GdkPixbuf} to be freed with g_object_unref() - **/ + * Returns: (transfer full): a #cairo_surface_t + */ cairo_surface_t* gcal_get_surface_from_color (GdkRGBA *color, gint size) @@ -210,6 +279,16 @@ gcal_get_surface_from_color (GdkRGBA *color, return surface; } +/** + * get_circle_surface_from_color: + * @color: a #GdkRGBA + * @size: the size of the surface + * + * Creates a circular surface filled with @color. The + * surface is always @size x @size. + * + * Returns: (transfer full): a #cairo_surface_t + */ cairo_surface_t* get_circle_surface_from_color (GdkRGBA *color, gint size) @@ -232,8 +311,16 @@ get_circle_surface_from_color (GdkRGBA *color, return surface; } +/** + * get_color_name_from_source: + * @source: an #ESource + * @out_color: return value for the color + * + * Utility function to retrieve the color from @source. + */ void -get_color_name_from_source (ESource *source, GdkRGBA *out_color) +get_color_name_from_source (ESource *source, + GdkRGBA *out_color) { ESourceSelectable *extension = E_SOURCE_SELECTABLE (e_source_get_extension (source, E_SOURCE_EXTENSION_CALENDAR)); @@ -244,13 +331,15 @@ get_color_name_from_source (ESource *source, GdkRGBA *out_color) /** * get_desc_from_component: - * @component: + * @component: an #ECalComponent + * @joint_char: the character to use when merging event comments * * Utility method to handle the extraction of the description from an * #ECalComponent. This cycle through the list of #ECalComponentText * and concatenate each string into one. * - * Returns: (Transfer full) a new allocated string with the description + * Returns: (nullable)(transfer full) a new allocated string with the + * description **/ gchar* get_desc_from_component (ECalComponent *component, @@ -387,7 +476,7 @@ get_first_weekday (void) * * Create a component with the provided details * - * Returns: (Transfer full): an {@link ECalComponent} object + * Returns: (transfer full): an {@link ECalComponent} object **/ ECalComponent* build_component_from_details (const gchar *summary, @@ -459,12 +548,15 @@ build_component_from_details (const gchar *summary, /** * icaltime_compare_date: - * @date1: - * @date2: + * @date1: an #icaltimetype + * @date2: an #icaltimetype * - * Compare date parts of {@link icaltimetype} objects. Return negative value, 0 or positive value - * accordingly if date1 is before, same day of after date2. - * As a bonus it returns the amount of days passed between two days on the same year. + * Compare date parts of #icaltimetype objects. Returns negative value, + * 0 or positive value accordingly if @date1 is before, same day of + * after date2. + * + * As a bonus it returns the amount of days passed between two days on the + * same year. * * Returns: negative, 0 or positive **/ @@ -484,6 +576,18 @@ icaltime_compare_date (const icaltimetype *date1, time_day_of_year (date2->day, date2->month - 1, date2->year); } +/** + * icaltime_compare_with_current: + * @date1: an #icaltimetype + * @date2: an #icaltimetype + * @current_time_t: the current time + * + * Compares @date1 and @date2 against the current time. Dates + * closer to the current date are sorted before. + * + * Returns: negative if @date1 comes after @date2, 0 if they're + * equal, positive otherwise + */ gint icaltime_compare_with_current (const icaltimetype *date1, const icaltimetype *date2, @@ -517,6 +621,17 @@ icaltime_compare_with_current (const icaltimetype *date1, return result; } +/** + * get_start_of_week: + * @date: an #icaltimetype + * + * Retrieves the start of the week that @date + * falls in. This function already takes the + * first weekday into account. + * + * Returns: (transfer full): a #GDateTime with + * the start of the week. + */ GDateTime* get_start_of_week (icaltimetype *date) { @@ -541,6 +656,17 @@ get_start_of_week (icaltimetype *date) return dt; } +/** + * get_end_of_week: + * @date: an #icaltimetype + * + * Retrieves the end of the week that @date + * falls in. This function already takes the + * first weekday into account. + * + * Returns: (transfer full): a #GDateTime with + * the end of the week. + */ GDateTime* get_end_of_week (icaltimetype *date) { @@ -554,6 +680,15 @@ get_end_of_week (icaltimetype *date) return week_end; } +/** + * is_clock_format_24h: + * + * Retrieves whether the current clock format is + * 12h or 24h based. + * + * Returns: %TRUE if the clock format is 24h, %FALSE + * otherwise. + */ gboolean is_clock_format_24h (void) { @@ -568,7 +703,10 @@ is_clock_format_24h (void) return g_strcmp0 (clock_format, "24h") == 0; } -/* Function to do a last minute fixup of the AM/PM stuff if the locale +/** + * e_strftime_fix_am_pm: + * + * Function to do a last minute fixup of the AM/PM stuff if the locale * and gettext haven't done it right. Most English speaking countries * except the USA use the 24 hour clock (UK, Australia etc). However * since they are English nobody bothers to write a language @@ -584,7 +722,6 @@ is_clock_format_24h (void) * TODO: Actually remove the '%p' from the fixed up string so that * there isn't a stray space. */ - gsize e_strftime_fix_am_pm (gchar *str, gsize max, @@ -627,6 +764,14 @@ e_strftime_fix_am_pm (gchar *str, return (ret); } +/** + * e_utf8_strftime_fix_am_pm: + * + * Stolen from Evolution codebase. Selects the + * correct time format. + * + * Returns: the size of the string + */ gsize e_utf8_strftime_fix_am_pm (gchar *str, gsize max, @@ -748,9 +893,12 @@ fix_popover_menu_icons (GtkPopover *popover) /** * uri_get_fields: + * @uri: the URI + * @schema: (nullable): return location for the schema of the URI + * @host: (nullable): return location for the host of the URI + * @path: (nullable): return location for the resource path * - * Split the given URI into the - * fields. + * Split the given URI into the fields. * * Returns: #TRUE if @uri could be parsed, #FALSE otherwise */ @@ -809,6 +957,16 @@ uri_get_fields (const gchar *uri, return valid; } +/** + * get_source_parent_name_color: + * @manager: a #GcalManager + * @source: an #ESource + * @name: (nullable): return location for the name + * @color: (nullable): return location for the color + * + * Retrieves the name and the color of the #ESource that is + * parent of @source. + */ void get_source_parent_name_color (GcalManager *manager, ESource *source, @@ -834,6 +992,16 @@ get_source_parent_name_color (GcalManager *manager, } } +/** + * format_utc_offset: + * @offset: an UTC offset + * + * Formats the UTC offset to a string that GTimeZone can + * parse. E.g. "-0300" or "+0530". + * + * Returns: (transfer full): a string representing the + * offset + */ gchar* format_utc_offset (gint64 offset) { @@ -859,6 +1027,17 @@ format_utc_offset (gint64 offset) return g_strdup_printf ("%s%02i%02i", sign, hours, minutes); } +/** + * get_alarm_trigger_minutes: + * @event: a #GcalEvent + * @alarm: a #ECalComponentAlarm + * + * Calculates the number of minutes before @event's + * start time that the alarm should be triggered. + * + * Returns: the number of minutes before the event + * start that @alarm will be triggered. + */ gint get_alarm_trigger_minutes (GcalEvent *event, ECalComponentAlarm *alarm) @@ -891,6 +1070,18 @@ get_alarm_trigger_minutes (GcalEvent *event, return diff; } +/** + * should_change_date_for_scroll: + * @scroll_value: the current scroll value + * @scroll_event: the #GdkEventScroll that is being parsed + * + * Utility function to check if the date should change based + * on the scroll. The date is changed when the user scrolls + * too much on touchpad, or performs a rotation of the scroll + * button in a mouse. + * + * Returns: %TRUE if the date should change, %FALSE otherwise. + */ gboolean should_change_date_for_scroll (gdouble *scroll_value, GdkEventScroll *scroll_event) @@ -925,6 +1116,15 @@ should_change_date_for_scroll (gdouble *scroll_value, return FALSE; } +/** + * is_source_enabled: + * @source: an #ESource + * + * Retrieves whether the @source is enabled or not. + * Disabled sources don't show their events. + * + * Returns: %TRUE if @source is enabled, %FALSE otherwise. + */ gboolean is_source_enabled (ESource *source) { diff --git a/src/gcal-utils.h b/src/gcal-utils.h index 2f65a8b6..90345ace 100644 --- a/src/gcal-utils.h +++ b/src/gcal-utils.h @@ -33,6 +33,17 @@ #define gcal_clear_datetime(dt) g_clear_pointer (dt, g_date_time_unref) +/** + * GcalWindowViewType: + * @GCAL_WINDOW_VIEW_DAY: Day view (not implemented) + * @GCAL_WINDOW_VIEW_WEEK: Week view + * @GCAL_WINDOW_VIEW_MONTH: Month view + * @GCAL_WINDOW_VIEW_YEAR: Year view + * @GCAL_WINDOW_VIEW_LIST: List (not implemented) + * @GCAL_WINDOW_VIEW_SEARCH: Search view (partially implemented) + * + * Enum with the available views. + */ typedef enum { GCAL_WINDOW_VIEW_DAY, @@ -43,19 +54,6 @@ typedef enum GCAL_WINDOW_VIEW_SEARCH, } GcalWindowViewType; -typedef enum -{ - EVENT_SUMMARY = 0, - EVENT_START_DATE, - EVENT_END_DATE, - EVENT_LOCATION, - EVENT_DESCRIPTION, - EVENT_SOURCE, -} EventEditableProperty; - -typedef -const gchar* (*GcalTranslateFunc) (GtkWidget *source_widget); - GType icaltime_get_type (void) G_GNUC_CONST; gint datetime_compare_date (GDateTime *dt1, diff --git a/src/gcal-window.c b/src/gcal-window.c index 066f742c..662d3d8e 100644 --- a/src/gcal-window.c +++ b/src/gcal-window.c @@ -39,6 +39,48 @@ #include #include +/** + * SECTION:gcal-window + * @short_description: Main window of GNOME Calendar + * @title:GcalWindow + * @stability:unstable + * @image:gcal-window.png + * + * #GcalWindow is the main window of GNOME Calendar, and contains + * the views, the source dialog, the edit dialog, and manages the + * calendar toggler popover menu. + * + * Besides that, #GcalWindow is also responsible for #GcalQuickAddPopover, + * and it responds to the #GcalView:create-event signal by positioning + * the quick add popover at the requested position. + * + * ## Calendar popover + * + * ![The popover](gcal-window_agendas.png) + * + * The calendar popover enables/disables the selected calendars. + * This is simply an UI for gcal_manager_enable_source() and + * gcal_manager_disable_source(). + * + * The calendar popover also contains a button to open the source + * dialog. + * + * ## Edit dialog + * + * When an event is clicked, the views send the `event-activated` + * signal. #GcalWindow responds to this signal opening #GcalEditDialog + * with the clicked event. + * + * When #GcalEditDialog sends a response, #GcalWindow reacts by + * either propagating to gcal_manager_update_event(), or hiding + * the delete event widgets from the views. + * + * ## Source dialog + * + * The interaction with the source dialog is almost none. #GcalWindow + * just shows and hides it. + */ + typedef struct { gint x; @@ -1572,6 +1614,17 @@ gcal_window_init (GcalWindow *self) } /* Public API */ +/** + * gcal_window_new_with_view_and_date: + * @app: a #GcalApplication + * @view_type: a #GcalWindowViewType + * @date: the active date + * + * Creates a #GcalWindow, positions it at @date and shows + * @view_type view by default. + * + * Returns: (transfer full): a #GcalWindow + */ GtkWidget* gcal_window_new_with_view_and_date (GcalApplication *app, GcalWindowViewType view_type, @@ -1609,6 +1662,12 @@ gcal_window_new_with_view_and_date (GcalApplication *app, } /* new-event interaction: first variant */ +/** + * gcal_window_new_event: + * @self: a #GcalWindow + * + * Makes #GcalWindow create a new event. + */ void gcal_window_new_event (GcalWindow *self) { @@ -1640,6 +1699,15 @@ gcal_window_new_event (GcalWindow *self) create_event_detailed_cb (NULL, start_date, end_date, self); } +/** + * gcal_window_set_search_mode: + * @self: a #GcalWindow + * @enabled: whether the search mode is enabled or not + * + * Sets whether #GcalWindow is in search mode. This is used by + * #GcalShellSearchProvider to respond to the user clicking on + * GNOME Calendar icon at the search. + */ void gcal_window_set_search_mode (GcalWindow *self, gboolean enabled) @@ -1650,6 +1718,15 @@ gcal_window_set_search_mode (GcalWindow *self, gtk_search_bar_set_search_mode (GTK_SEARCH_BAR (self->search_bar), enabled); } +/** + * gcal_window_set_search_query: + * @self: a #GcalWindow + * @query: sets the search query of @self + * + * Sets the search query of the search. #GcalWindow only + * propagates this to the search bar, which ends up + * triggering the search. + */ void gcal_window_set_search_query (GcalWindow *self, const gchar *query) @@ -1659,6 +1736,14 @@ gcal_window_set_search_query (GcalWindow *self, gtk_entry_set_text (GTK_ENTRY (self->search_entry), query); } +/** + * gcal_window_open_event_by_uuid: + * @self: a #GcalWindow + * @uuid: the unique identifier of the event to be opened + * + * Tells @self to open the event with @uuid. When it fails to + * open the event, it waits for 2 seconds before trying again. + */ void gcal_window_open_event_by_uuid (GcalWindow *self, const gchar *uuid) diff --git a/src/views/gcal-range-tree.c b/src/views/gcal-range-tree.c index 7fb5b9c7..7bab24c5 100644 --- a/src/views/gcal-range-tree.c +++ b/src/views/gcal-range-tree.c @@ -20,6 +20,28 @@ #include "gcal-range-tree.h" +/** + * SECTION:gcal-range-tree + * @short_description: Augmented AVL tree to handle ranges + * @title:GcalRangeTree + * @stability:stable + * + * #GcalRangeTree is an augmented AVL tree implemented to be + * able to handle ranges rather than point values. This tree + * is used by @GcalWeekGrid to store events according to their + * start and end minutes, and thus all the data structure was + * optimized to handle a limited subset of values. + * + * In the future, we may need to extend support for broader + * range values, and move away from guint16 in function params. + * + * # Ranges + * + * Conforming to the overall standard of iCal and Calendar, + * the start of a range is inclusive but the end of the range + * is always exclusive. + */ + typedef struct _Node { struct _Node *left; @@ -587,6 +609,17 @@ gcal_range_tree_get_data_at_range (GcalRangeTree *self, return data; } +/** + * gcal_range_tree_count_entries_at_range: + * @self: a #GcalRangeTree + * @start: start of the range + * @end: end of the range + * + * Counts the number of entries available in the given + * range. + * + * Returns: the number of entries in the given range + */ guint64 gcal_range_tree_count_entries_at_range (GcalRangeTree *self, guint16 start, diff --git a/src/views/gcal-range-tree.h b/src/views/gcal-range-tree.h index 3f8b75d5..a9b2d473 100644 --- a/src/views/gcal-range-tree.h +++ b/src/views/gcal-range-tree.h @@ -27,6 +27,17 @@ G_BEGIN_DECLS typedef struct _GcalRangeTree GcalRangeTree; +/** + * GcalRangeTraverseFunc: + * @start: start of range of the entry + * @end: end of range of the entry + * @data: (nullable): the data of the entry + * @user_data: (closure): user data passed to the function + * + * Function type to be called when traversing a #GcalRangeTree. + * + * Returns: %TRUE to stop traversing, %FALSE to continue traversing + */ typedef gboolean (*GcalRangeTraverseFunc) (guint16 start, guint16 end, gpointer data,