aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSebastien Bacher <seb128@ubuntu.com>2012-07-13 17:09:25 +0200
committerSebastien Bacher <seb128@ubuntu.com>2012-07-13 17:09:25 +0200
commited02493a8c6534f1aaf76e005100ad7be7820891 (patch)
tree84597b1501fd36b6f2a3702e12fa35360a5db2e2 /src
parent75d3c8be473b6c2600f187f77ffb25b21700a373 (diff)
parente2e14906d2f574abf672862c2bf4dac1d044dd3c (diff)
downloadayatana-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.in35
-rw-r--r--src/datetime-prefs-locations.c180
-rw-r--r--src/datetime-prefs.c8
-rw-r--r--src/datetime-service.c228
-rw-r--r--src/indicator-datetime.c8
-rw-r--r--src/settings-shared.h1
-rw-r--r--src/utils.c7
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 *