diff options
author | Sebastien Bacher <seb128@ubuntu.com> | 2012-07-13 17:09:25 +0200 |
---|---|---|
committer | Sebastien Bacher <seb128@ubuntu.com> | 2012-07-13 17:09:25 +0200 |
commit | ed02493a8c6534f1aaf76e005100ad7be7820891 (patch) | |
tree | 84597b1501fd36b6f2a3702e12fa35360a5db2e2 /src | |
parent | 75d3c8be473b6c2600f187f77ffb25b21700a373 (diff) | |
parent | e2e14906d2f574abf672862c2bf4dac1d044dd3c (diff) | |
download | ayatana-indicator-datetime-ed02493a8c6534f1aaf76e005100ad7be7820891.tar.gz ayatana-indicator-datetime-ed02493a8c6534f1aaf76e005100ad7be7820891.tar.bz2 ayatana-indicator-datetime-ed02493a8c6534f1aaf76e005100ad7be7820891.zip |
Import upstream version 12.10.0
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile.in | 35 | ||||
-rw-r--r-- | src/datetime-prefs-locations.c | 180 | ||||
-rw-r--r-- | src/datetime-prefs.c | 8 | ||||
-rw-r--r-- | src/datetime-service.c | 228 | ||||
-rw-r--r-- | src/indicator-datetime.c | 8 | ||||
-rw-r--r-- | src/settings-shared.h | 1 | ||||
-rw-r--r-- | src/utils.c | 7 |
7 files changed, 324 insertions, 143 deletions
diff --git a/src/Makefile.in b/src/Makefile.in index f06faba..78a28dc 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.11.3 from Makefile.am. +# Makefile.in generated by automake 1.11.5 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, @@ -17,6 +17,23 @@ VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -153,6 +170,11 @@ SOURCES = $(libdatetime_la_SOURCES) \ DIST_SOURCES = $(libdatetime_la_SOURCES) \ $(am__libindicator_datetime_la_SOURCES_DIST) \ $(indicator_datetime_service_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) @@ -448,7 +470,6 @@ $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) $(am__aclocal_m4_deps): install-ccpanelLTLIBRARIES: $(ccpanel_LTLIBRARIES) @$(NORMAL_INSTALL) - test -z "$(ccpaneldir)" || $(MKDIR_P) "$(DESTDIR)$(ccpaneldir)" @list='$(ccpanel_LTLIBRARIES)'; test -n "$(ccpaneldir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ @@ -456,6 +477,8 @@ install-ccpanelLTLIBRARIES: $(ccpanel_LTLIBRARIES) else :; fi; \ done; \ test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(ccpaneldir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(ccpaneldir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(ccpaneldir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(ccpaneldir)"; \ } @@ -479,7 +502,6 @@ clean-ccpanelLTLIBRARIES: done install-datetimelibLTLIBRARIES: $(datetimelib_LTLIBRARIES) @$(NORMAL_INSTALL) - test -z "$(datetimelibdir)" || $(MKDIR_P) "$(DESTDIR)$(datetimelibdir)" @list='$(datetimelib_LTLIBRARIES)'; test -n "$(datetimelibdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ @@ -487,6 +509,8 @@ install-datetimelibLTLIBRARIES: $(datetimelib_LTLIBRARIES) else :; fi; \ done; \ test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(datetimelibdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(datetimelibdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(datetimelibdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(datetimelibdir)"; \ } @@ -514,8 +538,11 @@ libindicator-datetime.la: $(libindicator_datetime_la_OBJECTS) $(libindicator_dat $(AM_V_CCLD)$(libindicator_datetime_la_LINK) $(am_libindicator_datetime_la_rpath) $(libindicator_datetime_la_OBJECTS) $(libindicator_datetime_la_LIBADD) $(LIBS) install-libexecPROGRAMS: $(libexec_PROGRAMS) @$(NORMAL_INSTALL) - test -z "$(libexecdir)" || $(MKDIR_P) "$(DESTDIR)$(libexecdir)" @list='$(libexec_PROGRAMS)'; test -n "$(libexecdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(libexecdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libexecdir)" || exit 1; \ + fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p || test -f $$p1; \ diff --git a/src/datetime-prefs-locations.c b/src/datetime-prefs-locations.c index c0452d0..33fd660 100644 --- a/src/datetime-prefs-locations.c +++ b/src/datetime-prefs-locations.c @@ -44,6 +44,138 @@ with this program. If not, see <http://www.gnu.org/licenses/>. static gboolean update_times (GtkWidget * dlg); static void save_when_idle (GtkWidget * dlg); +/*** +**** Sorting +***/ + +/** + * A temporary struct used for sorting + */ +struct TimeLocation +{ + gchar * collated_name; + gint pos; + gint32 offset; +}; + +static struct TimeLocation* +time_location_new (const char * zone, const char * name, int pos, time_t now) +{ + struct TimeLocation * loc = g_new (struct TimeLocation, 1); + GTimeZone * tz = g_time_zone_new (zone); + const gint interval = g_time_zone_find_interval (tz, G_TIME_TYPE_UNIVERSAL, now); + loc->offset = g_time_zone_get_offset (tz, interval); + loc->collated_name = g_utf8_collate_key (name, -1); + loc->pos = pos; + g_time_zone_unref (tz); + return loc; +} + +static void +time_location_free (struct TimeLocation * loc) +{ + g_free (loc->collated_name); + g_free (loc); +} + +static GSList* +time_location_array_new_from_model (GtkTreeModel * model) +{ + int pos = 0; + GtkTreeIter iter; + GSList * list = NULL; + const time_t now = time (NULL); + + if (gtk_tree_model_get_iter_first (model, &iter)) do + { + gchar * zone = NULL; + gchar * name = NULL; + + gtk_tree_model_get (model, &iter, + COL_ZONE, &zone, + COL_VISIBLE_NAME, &name, + -1); + list = g_slist_prepend (list, time_location_new (zone, name, pos++, now)); + + g_free (name); + g_free (zone); + } + while (gtk_tree_model_iter_next (model, &iter)); + + return g_slist_reverse (list); +} + +static void +handle_sort(GtkWidget * button, GtkTreeView * tree_view, GCompareFunc compare) +{ + GtkTreeModel * model = gtk_tree_view_get_model (tree_view); + GSList * l; + GSList * list = g_slist_sort (time_location_array_new_from_model(model), compare); + + gint i; + gint * reorder = g_new (gint, g_slist_length(list)); + for (i=0, l=list; l!=NULL; l=l->next, i++) + reorder[i] = ((struct TimeLocation*)l->data)->pos; + gtk_list_store_reorder (GTK_LIST_STORE(model), reorder); + + g_free (reorder); + g_slist_free_full (list, (GDestroyNotify)time_location_free); +} + +static gint +time_location_compare_by_name (gconstpointer ga, gconstpointer gb) +{ + const struct TimeLocation * a = ga; + const struct TimeLocation * b = gb; + int ret = g_strcmp0 (a->collated_name, b->collated_name); /* primary key */ + if (!ret) + ret = a->offset - b->offset; /* secondary key */ + return ret; +} +static void +handle_sort_by_name (GtkWidget * button, GtkTreeView * tree_view) +{ + handle_sort (button, tree_view, time_location_compare_by_name); +} + +static gint +time_location_compare_by_time (gconstpointer ga, gconstpointer gb) +{ + const struct TimeLocation * a = ga; + const struct TimeLocation * b = gb; + int ret = a->offset - b->offset; /* primary key */ + if (!ret) + ret = g_strcmp0 (a->collated_name, b->collated_name); /* secondary key */ + return ret; +} +static void +handle_sort_by_time (GtkWidget * button, GtkTreeView * tree_view) +{ + handle_sort (button, tree_view, time_location_compare_by_time); +} + +static gboolean +time_location_list_test_sorted (GSList * list, GCompareFunc compare) +{ + GSList * l; + for (l=list; l!=NULL && l->next!=NULL; l=l->next) + if (compare(l->data, l->next->data) > 0) + return FALSE; + return TRUE; +} +static void +location_model_test_sorted (GtkTreeModel * model, gboolean * is_sorted_by_name, gboolean * is_sorted_by_time) +{ + GSList * list = time_location_array_new_from_model(model); + *is_sorted_by_name = time_location_list_test_sorted (list, time_location_compare_by_name); + *is_sorted_by_time = time_location_list_test_sorted (list, time_location_compare_by_time); + g_slist_free_full (list, (GDestroyNotify)time_location_free); +} + +/*** +**** +***/ + static void handle_add (GtkWidget * button, GtkTreeView * tree) { @@ -201,8 +333,8 @@ timezone_selected (GtkEntryCompletion * widget, GtkTreeModel * model, CC_TIMEZONE_COMPLETION_LONGITUDE, &strlon, -1); - if (strlat && *strlat) lat = atof(strlat); - if (strlon && *strlon) lon = atof(strlon); + if (strlat && *strlat) lat = g_ascii_strtod(strlat, NULL); + if (strlon && *strlon) lon = g_ascii_strtod(strlon, NULL); CcTimezoneMap * tzmap = CC_TIMEZONE_MAP (g_object_get_data (G_OBJECT (widget), "tzmap")); g_free (zone); @@ -298,9 +430,13 @@ update_times (GtkWidget * dlg) GDateTime * now_tz = g_date_time_to_timezone (now, tz); gchar * format = generate_format_string_at_time (now_tz); gchar * time_str = g_date_time_format (now_tz, format); + gchar * old_time_str; - gtk_list_store_set (store, &iter, COL_TIME, time_str, -1); + gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, COL_TIME, &old_time_str, -1); + if (g_strcmp0 (old_time_str, time_str)) + gtk_list_store_set (store, &iter, COL_TIME, time_str, -1); + g_free (old_time_str); g_free (time_str); g_free (format); g_date_time_unref (now_tz); @@ -426,6 +562,26 @@ selection_changed (GtkTreeSelection * selection, GtkWidget * remove_button) gtk_widget_set_sensitive (remove_button, count > 0); } +static void +update_button_sensitivity (GtkWidget * dlg) +{ + GObject * odlg = G_OBJECT(dlg); + GObject * completion = g_object_get_data(odlg, "completion"); + GtkTreeModel * model = GTK_TREE_MODEL (g_object_get_data (completion, "store")); + gboolean is_sorted_by_name; + gboolean is_sorted_by_time; + location_model_test_sorted (model, &is_sorted_by_name, &is_sorted_by_time); + gtk_widget_set_sensitive (GTK_WIDGET(g_object_get_data(odlg, "sortByNameButton")), !is_sorted_by_name); + gtk_widget_set_sensitive (GTK_WIDGET(g_object_get_data(odlg, "sortByTimeButton")), !is_sorted_by_time); +} + +static void +model_changed (GtkWidget * dlg) +{ + update_button_sensitivity (dlg); + save_when_idle (dlg); +} + GtkWidget * datetime_setup_locations_dialog (CcTimezoneMap * map) { @@ -473,6 +629,7 @@ datetime_setup_locations_dialog (CcTimezoneMap * map) g_signal_connect (tree, "query-tooltip", G_CALLBACK (query_tooltip), cell); cell = gtk_cell_renderer_text_new (); + gtk_cell_renderer_set_alignment (cell, 1.0f, 0.5f); gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree), -1, _("Time"), cell, "text", COL_TIME, NULL); @@ -485,12 +642,19 @@ datetime_setup_locations_dialog (CcTimezoneMap * map) g_signal_connect (WIG ("addButton"), "clicked", G_CALLBACK (handle_add), tree); g_signal_connect (WIG ("removeButton"), "clicked", G_CALLBACK (handle_remove), tree); - fill_from_settings (store, conf); - g_signal_connect_swapped (store, "row-deleted", G_CALLBACK (save_when_idle), dlg); - g_signal_connect_swapped (store, "row-inserted", G_CALLBACK (save_when_idle), dlg); - g_signal_connect_swapped (store, "row-changed", G_CALLBACK (save_when_idle), dlg); - g_signal_connect_swapped (store, "rows-reordered", G_CALLBACK (save_when_idle), dlg); + GtkWidget * w = WIG ("sortByNameButton"); + g_signal_connect (w, "clicked", G_CALLBACK (handle_sort_by_name), tree); + g_object_set_data (G_OBJECT(dlg), "sortByNameButton", w); + + w = WIG ("sortByTimeButton"); + g_signal_connect (w, "clicked", G_CALLBACK (handle_sort_by_time), tree); + g_object_set_data (G_OBJECT(dlg), "sortByTimeButton", w); + fill_from_settings (store, conf); + g_signal_connect_swapped (store, "row-deleted", G_CALLBACK (model_changed), dlg); + g_signal_connect_swapped (store, "row-inserted", G_CALLBACK (model_changed), dlg); + g_signal_connect_swapped (store, "row-changed", G_CALLBACK (model_changed), dlg); + g_signal_connect_swapped (store, "rows-reordered", G_CALLBACK (model_changed), dlg); g_object_set_data_full (G_OBJECT (dlg), "conf", g_object_ref (conf), g_object_unref); g_object_set_data_full (G_OBJECT (dlg), "completion", completion, g_object_unref); g_signal_connect (dlg, "destroy", G_CALLBACK (dialog_closed), store); diff --git a/src/datetime-prefs.c b/src/datetime-prefs.c index 0e2e99c..d80a59f 100644 --- a/src/datetime-prefs.c +++ b/src/datetime-prefs.c @@ -613,11 +613,11 @@ timezone_selected (GtkEntryCompletion * widget, GtkTreeModel * model, -1); if (strlon != NULL && strlon[0] != 0) { - lon = strtod(strlon, NULL); + lon = g_ascii_strtod(strlon, NULL); } if (strlat != NULL && strlat[0] != 0) { - lat = strtod(strlat, NULL); + lat = g_ascii_strtod(strlat, NULL); } zone = cc_timezone_map_get_timezone_at_coords (self->priv->tzmap, lon, lat); @@ -733,6 +733,8 @@ indicator_datetime_panel_init (IndicatorDatetimePanel * self) "active", G_SETTINGS_BIND_DEFAULT); g_settings_bind (conf, SETTINGS_SHOW_EVENTS_S, WIG ("showEventsCheck"), "active", G_SETTINGS_BIND_DEFAULT); + g_settings_bind (conf, SETTINGS_SHOW_DETECTED_S, WIG ("showDetectedCheck"), + "active", G_SETTINGS_BIND_DEFAULT); g_settings_bind (conf, SETTINGS_SHOW_LOCATIONS_S, WIG ("showLocationsCheck"), "active", G_SETTINGS_BIND_DEFAULT); @@ -829,6 +831,8 @@ indicator_datetime_panel_dispose (GObject * object) gtk_widget_destroy (priv->date_spin); priv->date_spin = NULL; } + + G_OBJECT_CLASS (indicator_datetime_panel_parent_class)->dispose (object); } static void diff --git a/src/datetime-service.c b/src/datetime-service.c index 8ecef1c..86c677a 100644 --- a/src/datetime-service.c +++ b/src/datetime-service.c @@ -40,11 +40,9 @@ with this program. If not, see <http://www.gnu.org/licenses/>. #include <geoclue/geoclue-master-client.h> #include <time.h> -#include <libecal/e-cal.h> +#include <libecal/libecal.h> #include <libical/ical.h> -#include <libecal/e-cal-time-util.h> -#include <libedataserver/e-source.h> -#include <libedataserverui/e-passwords.h> +#include <libedataserver/libedataserver.h> // Other users of ecal seem to also include these, not sure why they should be included by the above #include <libical/icaltime.h> #include <cairo/cairo.h> @@ -115,6 +113,7 @@ struct TimeLocation gint32 offset; gchar * zone; gchar * name; + gboolean visible; }; static void time_location_free (struct TimeLocation * loc) @@ -124,7 +123,7 @@ time_location_free (struct TimeLocation * loc) g_free (loc); } static struct TimeLocation* -time_location_new (const char * zone, const char * name, time_t now) +time_location_new (const char * zone, const char * name, gboolean visible, time_t now) { struct TimeLocation * loc = g_new (struct TimeLocation, 1); GTimeZone * tz = g_time_zone_new (zone); @@ -132,6 +131,7 @@ time_location_new (const char * zone, const char * name, time_t now) loc->offset = g_time_zone_get_offset (tz, interval); loc->zone = g_strdup (zone); loc->name = g_strdup (name); + loc->visible = visible; g_time_zone_unref (tz); g_debug ("%s zone '%s' name '%s' offset is %d", G_STRLOC, zone, name, (int)loc->offset); return loc; @@ -139,22 +139,22 @@ time_location_new (const char * zone, const char * name, time_t now) static int time_location_compare (const struct TimeLocation * a, const struct TimeLocation * b) { - int ret; - if (a->offset != b->offset) /* primary key s.t. we can sort by timezone order */ - ret = a->offset - b->offset; - else + int ret = a->offset - b->offset; /* primary key */ + if (!ret) ret = g_strcmp0 (a->name, b->name); /* secondary key */ + if (!ret) + ret = a->visible - b->visible; /* tertiary key */ g_debug ("%s comparing '%s' (%d) to '%s' (%d), returning %d", G_STRLOC, a->name, (int)a->offset, b->name, (int)b->offset, ret); return ret; } static GSList* -locations_add (GSList * locations, const char * zone, const char * name, time_t now) +locations_add (GSList * locations, const char * zone, const char * name, gboolean visible, time_t now) { - struct TimeLocation * loc = time_location_new (zone, name, now); + struct TimeLocation * loc = time_location_new (zone, name, visible, now); if (g_slist_find_custom (locations, loc, (GCompareFunc)time_location_compare) == NULL) { g_debug ("%s Adding zone '%s', name '%s'", G_STRLOC, zone, name); - locations = g_slist_prepend (locations, loc); + locations = g_slist_append (locations, loc); } else { g_debug("%s Skipping duplicate zone '%s' name '%s'", G_STRLOC, zone, name); time_location_free (loc); @@ -188,15 +188,17 @@ update_location_menu_items (void) /* maybe add geo_timezone */ if (geo_timezone != NULL) { + const gboolean visible = g_settings_get_boolean (conf, SETTINGS_SHOW_DETECTED_S); gchar * name = get_current_zone_name (geo_timezone); - locations = locations_add (locations, geo_timezone, name, now); + locations = locations_add (locations, geo_timezone, name, visible, now); g_free (name); } /* maybe add current_timezone */ if (current_timezone != NULL) { + const gboolean visible = g_settings_get_boolean (conf, SETTINGS_SHOW_DETECTED_S); gchar * name = get_current_zone_name (current_timezone); - locations = locations_add (locations, current_timezone, name, now); + locations = locations_add (locations, current_timezone, name, visible, now); g_free (name); } @@ -205,12 +207,13 @@ update_location_menu_items (void) if (user_locations != NULL) { gint i; const guint location_count = g_strv_length (user_locations); + const gboolean visible = g_settings_get_boolean (conf, SETTINGS_SHOW_LOCATIONS_S); g_debug ("%s Found %u user-specified locations", G_STRLOC, location_count); for (i=0; i<location_count; i++) { gchar * zone; gchar * name; split_settings_location (user_locations[i], &zone, &name); - locations = locations_add (locations, zone, name, now); + locations = locations_add (locations, zone, name, visible, now); g_free (name); g_free (zone); } @@ -218,13 +221,10 @@ update_location_menu_items (void) user_locations = NULL; } - /* sort the list by timezone offset */ - locations = g_slist_sort (locations, (GCompareFunc)time_location_compare); - /* finally create menuitems for each location */ gint offset = dbusmenu_menuitem_get_position (locations_separator, root)+1; - const gboolean show_locations = g_settings_get_boolean (conf, SETTINGS_SHOW_LOCATIONS_S); GSList * l; + gboolean have_visible_location = FALSE; for (l=locations; l!=NULL; l=l->next) { struct TimeLocation * loc = l->data; g_debug("%s Adding location: zone '%s', name '%s'", G_STRLOC, loc->zone, loc->name); @@ -234,17 +234,19 @@ update_location_menu_items (void) dbusmenu_menuitem_property_set (item, TIMEZONE_MENUITEM_PROP_ZONE, loc->zone); dbusmenu_menuitem_property_set_bool (item, TIMEZONE_MENUITEM_PROP_RADIO, FALSE); dbusmenu_menuitem_property_set_bool (item, DBUSMENU_MENUITEM_PROP_ENABLED, TRUE); - dbusmenu_menuitem_property_set_bool (item, DBUSMENU_MENUITEM_PROP_VISIBLE, show_locations); + dbusmenu_menuitem_property_set_bool (item, DBUSMENU_MENUITEM_PROP_VISIBLE, loc->visible); dbusmenu_menuitem_child_add_position (root, item, offset++); g_signal_connect(G_OBJECT(item), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(quick_set_tz), NULL); location_menu_items = g_slist_append (location_menu_items, item); + if (loc->visible) + have_visible_location = TRUE; time_location_free (loc); } g_slist_free (locations); locations = NULL; /* if there's at least one item being shown, show the separator too */ - dbusmenu_menuitem_property_set_bool (locations_separator, DBUSMENU_MENUITEM_PROP_VISIBLE, show_locations && (location_menu_items!=NULL)); + dbusmenu_menuitem_property_set_bool (locations_separator, DBUSMENU_MENUITEM_PROP_VISIBLE, have_visible_location); } /* Update the current timezone */ @@ -579,8 +581,10 @@ check_for_calendar (gpointer user_data) g_signal_connect(calendar, "event::day-selected-double-click", G_CALLBACK(day_selected_double_click_cb), NULL); } else { g_debug("Unable to find calendar app."); - dbusmenu_menuitem_property_set_bool(add_appointment, DBUSMENU_MENUITEM_PROP_VISIBLE, FALSE); - dbusmenu_menuitem_property_set_bool(events_separator, DBUSMENU_MENUITEM_PROP_VISIBLE, FALSE); + if (add_appointment != NULL) + dbusmenu_menuitem_property_set_bool(add_appointment, DBUSMENU_MENUITEM_PROP_VISIBLE, FALSE); + if (events_separator != NULL) + dbusmenu_menuitem_property_set_bool(events_separator, DBUSMENU_MENUITEM_PROP_VISIBLE, FALSE); } if (g_settings_get_boolean(conf, SETTINGS_SHOW_CALENDAR_S)) { @@ -594,27 +598,6 @@ check_for_calendar (gpointer user_data) return FALSE; } -// Authentication function -static gchar * -auth_func (ECal *ecal, - const gchar *prompt, - const gchar *key, - gpointer user_data) -{ - ESource *source = e_cal_get_source (ecal); - gchar *auth_domain = e_source_get_duped_property (source, "auth-domain"); - - const gchar *component_name; - if (auth_domain) component_name = auth_domain; - else component_name = "Calendar"; - - gchar *password = e_passwords_get_password (component_name, key); - - g_free (auth_domain); - - return password; -} - static gint compare_comp_instances (gconstpointer ga, gconstpointer gb) { @@ -649,23 +632,53 @@ comp_instance_free (struct comp_instance* ci) } static gboolean -populate_appointment_instances (ECalComponent * comp, +populate_appointment_instances (ECalClient * client, time_t start, time_t end, gpointer data) { - g_debug("Appending item %p", comp); - - ECalComponentVType vtype = e_cal_component_get_vtype (comp); - if (vtype != E_CAL_COMPONENT_EVENT && vtype != E_CAL_COMPONENT_TODO) return FALSE; - - icalproperty_status status; - e_cal_component_get_status (comp, &status); - if (status == ICAL_STATUS_COMPLETED || status == ICAL_STATUS_CANCELLED) return FALSE; + GSList *ecalcomps, *comp_item; - struct comp_instance *ci = comp_instance_new (comp, start, end, E_SOURCE(data)); - comp_instances = g_list_append (comp_instances, ci); - return TRUE; + if (e_cal_client_get_object_list_as_comps_sync (client, + NULL, + &ecalcomps, + NULL, NULL)) { + + for (comp_item = ecalcomps; comp_item; comp_item = g_slist_next(comp_item)) { + ECalComponent *comp = comp_item->data; + + g_debug("Appending item %p", e_cal_component_get_as_string(comp)); + + ECalComponentVType vtype = e_cal_component_get_vtype (comp); + if (vtype != E_CAL_COMPONENT_EVENT && vtype != E_CAL_COMPONENT_TODO) return FALSE; + + icalproperty_status status; + e_cal_component_get_status (comp, &status); + if (status == ICAL_STATUS_COMPLETED || status == ICAL_STATUS_CANCELLED) return FALSE; + + g_object_ref(comp); + + ECalComponentDateTime datetime; + icaltimezone *appointment_zone = NULL; + icaltimezone *current_zone = NULL; + + if (vtype == E_CAL_COMPONENT_EVENT) + e_cal_component_get_dtstart (comp, &datetime); + else + e_cal_component_get_due (comp, &datetime); + + appointment_zone = icaltimezone_get_builtin_timezone_from_tzid(datetime.tzid); + current_zone = icaltimezone_get_builtin_timezone_from_tzid(current_timezone); + if (!appointment_zone || datetime.value->is_date) { // If it's today put in the current timezone? + appointment_zone = current_zone; + } + + struct comp_instance *ci = comp_instance_new (comp, start, end, E_SOURCE(data)); + comp_instances = g_list_append (comp_instances, ci); + } + return TRUE; + } + return FALSE; } /* Populate the menu with todays, next 5 appointments. @@ -685,12 +698,12 @@ update_appointment_menu_items (gpointer user_data) updating_appointments = TRUE; time_t curtime = 0, t1 = 0, t2 = 0; - GList *l; - GSList *g; + GList *l, *s; GError *gerror = NULL; gint i; gint width = 0, height = 0; - ESourceList * sources = NULL; + ESourceRegistry * src_registry = NULL; + GList * sources = NULL; // Get today & work out query times time(&curtime); @@ -730,67 +743,52 @@ update_appointment_menu_items (gpointer user_data) highlightdays = highlightdays + 7; // Minimum of 7 days ahead t2 = t1 + (time_t) (highlightdays * 24 * 60 * 60); - if (!e_cal_get_sources(&sources, E_CAL_SOURCE_TYPE_EVENT, &gerror)) { - g_debug("Failed to get ecal sources\n"); - g_clear_error (&gerror); - return FALSE; - } - // clear any previous comp_instances g_list_free_full (comp_instances, (GDestroyNotify)comp_instance_free); comp_instances = NULL; - GSList *cal_list = gconf_client_get_list(gconf, "/apps/evolution/calendar/display/selected_calendars", GCONF_VALUE_STRING, &gerror); - if (gerror) { - g_debug("Failed to get evolution preference for enabled calendars"); - g_clear_error (&gerror); - cal_list = NULL; - } - + src_registry = e_source_registry_new_sync (NULL, &gerror); + if (!src_registry) { + g_debug("Failed to get access to source registry: %s\n", gerror->message); + return FALSE; + } + + sources = e_source_registry_list_sources(src_registry, E_SOURCE_EXTENSION_CALENDAR); + // Generate instances for all sources - for (g = e_source_list_peek_groups (sources); g; g = g->next) { - ESourceGroup *group = E_SOURCE_GROUP (g->data); - GSList *s; - - for (s = e_source_group_peek_sources (group); s; s = s->next) { - ESource *source = E_SOURCE (s->data); - g_signal_connect (G_OBJECT(source), "changed", G_CALLBACK (update_appointment_menu_items), NULL); - ECal *ecal = e_cal_new(source, E_CAL_SOURCE_TYPE_EVENT); - e_cal_set_auth_func (ecal, (ECalAuthFunc) auth_func, NULL); - - icaltimezone* current_zone = icaltimezone_get_builtin_timezone(current_timezone); - if (!current_zone) { - // current_timezone may be a TZID? - current_zone = icaltimezone_get_builtin_timezone_from_tzid(current_timezone); - } - if (current_zone && !e_cal_set_default_timezone(ecal, current_zone, &gerror)) { - g_debug("Failed to set ecal default timezone %s", gerror->message); - g_clear_error (&gerror); - g_object_unref(ecal); - continue; - } - - if (!e_cal_open(ecal, FALSE, &gerror)) { - g_debug("Failed to get ecal sources %s", gerror->message); - g_clear_error (&gerror); - g_object_unref(ecal); - continue; - } + for (s = g_list_first (sources); s; s = g_list_next (s)) { + + ESource *source = E_SOURCE (s->data); + g_signal_connect (G_OBJECT(source), "changed", G_CALLBACK (update_appointment_menu_items), NULL); + ECalClient *ecal = e_cal_client_new(source, E_CAL_CLIENT_SOURCE_TYPE_EVENTS, &gerror); + + icaltimezone* current_zone = icaltimezone_get_builtin_timezone(current_timezone); + if (!current_zone) { + // current_timezone may be a TZID? + current_zone = icaltimezone_get_builtin_timezone_from_tzid(current_timezone); + } + + e_cal_client_set_default_timezone (ecal, current_zone); + + g_debug("Checking if source %s is enabled", e_source_get_uid(source)); + if (e_source_get_enabled (source)) { + g_debug("source is enabled, generating instances"); - const gchar *ecal_uid = e_source_peek_uid(source); - g_debug("Checking ecal_uid is enabled: %s", ecal_uid); - const gboolean in_list = g_slist_find_custom (cal_list, ecal_uid, (GCompareFunc)g_strcmp0) != NULL; - if (!in_list) { + if (!e_client_open_sync (E_CLIENT (ecal), TRUE, NULL, &gerror)) { + g_debug("Failed to open source: %s", gerror->message); + g_clear_error (&gerror); g_object_unref(ecal); continue; } - g_debug("ecal_uid is enabled, generating instances"); - e_cal_generate_instances (ecal, t1, t2, (ECalRecurInstanceFn) populate_appointment_instances, source); - g_object_unref(ecal); - } - } - g_slist_free_full (cal_list, g_free); + e_cal_client_generate_instances (ecal, t1, t2, NULL, + (ECalRecurInstanceFn) populate_appointment_instances, + (gpointer) source, + NULL); + } + g_object_unref(ecal); + } + g_list_free_full (sources, g_object_unref); g_debug("Number of ECalComponents returned: %d", g_list_length(comp_instances)); GList *sorted_comp_instances = g_list_sort(comp_instances, compare_comp_instances); @@ -942,7 +940,7 @@ update_appointment_menu_items (gpointer user_data) G_CALLBACK(activate_cb), cmd, (GClosureNotify)g_free, 0); g_free (ad); - const gchar *color_spec = e_source_peek_color_spec(ci->source); + const gchar *color_spec = e_source_selectable_get_color (e_source_get_extension (ci->source, E_SOURCE_EXTENSION_CALENDAR)); g_debug("Colour to use: %s", color_spec); // Draw the correct icon for the appointment type and then tint it using mask fill. @@ -950,17 +948,10 @@ update_appointment_menu_items (gpointer user_data) if (color_spec != NULL) { g_debug("Creating a cairo surface: size, %d by %d", width, height); cairo_surface_t *surface = cairo_image_surface_create( CAIRO_FORMAT_ARGB32, width, height ); - cairo_t *cr = cairo_create(surface); -#if GTK_CHECK_VERSION(3,0,0) GdkRGBA rgba; if (gdk_rgba_parse (&rgba, color_spec)) gdk_cairo_set_source_rgba (cr, &rgba); -#else - GdkColor color; - if (gdk_color_parse (color_spec, &color)) - gdk_cairo_set_source_color (cr, &color); -#endif cairo_paint(cr); cairo_set_source_rgba(cr, 0,0,0,0.5); cairo_set_line_width(cr, 1); @@ -1095,6 +1086,7 @@ build_menus (DbusmenuMenuitem * root) update_location_menu_items(); g_signal_connect (conf, "changed::" SETTINGS_SHOW_LOCATIONS_S, G_CALLBACK (show_locations_changed), NULL); + g_signal_connect (conf, "changed::" SETTINGS_SHOW_DETECTED_S, G_CALLBACK (show_locations_changed), NULL); g_signal_connect (conf, "changed::" SETTINGS_LOCATIONS_S, G_CALLBACK (show_locations_changed), NULL); g_signal_connect (conf, "changed::" SETTINGS_SHOW_EVENTS_S, G_CALLBACK (show_events_changed), NULL); g_signal_connect (conf, "changed::" SETTINGS_TIME_FORMAT_S, G_CALLBACK (time_format_changed), NULL); diff --git a/src/indicator-datetime.c b/src/indicator-datetime.c index 77fdb40..9e34a65 100644 --- a/src/indicator-datetime.c +++ b/src/indicator-datetime.c @@ -1220,11 +1220,7 @@ new_appointment_item (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, Dbu mi_data->gmi = gtk_menu_item_new(); -#if GTK_CHECK_VERSION(3,0,0) GtkWidget * hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 4); -#else - GtkWidget * hbox = gtk_hbox_new(FALSE, 4); -#endif /* Icon, probably someone's face or avatar on an IM */ mi_data->icon = gtk_image_new(); @@ -1435,11 +1431,7 @@ new_timezone_item(DbusmenuMenuitem * newitem, gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(mi_data->gmi), dbusmenu_menuitem_property_get_bool(newitem, TIMEZONE_MENUITEM_PROP_RADIO)); -#if GTK_CHECK_VERSION(3,0,0) GtkWidget * hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 4); -#else - GtkWidget * hbox = gtk_hbox_new(FALSE, 4); -#endif /* Label, probably a username, chat room or mailbox name */ mi_data->label = gtk_label_new(""); diff --git a/src/settings-shared.h b/src/settings-shared.h index da66205..8c14f1e 100644 --- a/src/settings-shared.h +++ b/src/settings-shared.h @@ -33,6 +33,7 @@ with this program. If not, see <http://www.gnu.org/licenses/>. #define SETTINGS_SHOW_WEEK_NUMBERS_S "show-week-numbers" #define SETTINGS_SHOW_EVENTS_S "show-events" #define SETTINGS_SHOW_LOCATIONS_S "show-locations" +#define SETTINGS_SHOW_DETECTED_S "show-auto-detected-location" #define SETTINGS_LOCATIONS_S "locations" #define SETTINGS_TIMEZONE_NAME_S "timezone-name" diff --git a/src/utils.c b/src/utils.c index e6de92a..f5aecd6 100644 --- a/src/utils.c +++ b/src/utils.c @@ -243,9 +243,10 @@ generate_format_string_full (gboolean show_day, gboolean show_date) g_return_val_if_fail(date_string != NULL, g_strdup(time_string)); /* TRANSLATORS: This is a format string passed to strftime to combine the - date and the time. The value of "%s %s" would result in a string like - this in US English 12-hour time: 'Fri Jul 16 11:50 AM' */ - return g_strdup_printf(T_("%s %s"), date_string, time_string); + date and the time. The value of "%s\xE2\x80\x82%s" would result in a string like + this in US English 12-hour time: 'Fri Jul 16 11:50 AM'. + The space in between date and time is a Unicode en space (E28082 in UTF-8 hex). */ + return g_strdup_printf(T_("%s\xE2\x80\x82%s"), date_string, time_string); } gchar * |