diff options
-rw-r--r-- | AUTHORS | 1 | ||||
-rw-r--r-- | ChangeLog | 149 | ||||
-rwxr-xr-x | configure | 77 | ||||
-rw-r--r-- | configure.ac | 13 | ||||
-rw-r--r-- | data/com.canonical.indicator.datetime.gschema.xml | 8 | ||||
-rw-r--r-- | src/datetime-service.c | 379 | ||||
-rw-r--r-- | src/dbus-shared.h | 3 | ||||
-rw-r--r-- | src/indicator-datetime.c | 334 |
8 files changed, 788 insertions, 176 deletions
@@ -3,6 +3,7 @@ David Barth karl-qdh Kyle Nitzsche + Luke Yelavich Marco Trevisan (Treviño) Michael Terry Sebastien Bacher @@ -1,5 +1,154 @@ # Generated by Makefile. Do not edit. +2011-02-17 Ted Gould <ted@gould.cx> + + 0.1.94 + +2011-02-17 Ted Gould <ted@gould.cx> + + Adding in timezone support and more calendar support + +2011-02-17 karl-qdh <karl@qdh.org.uk> + + Rewrote auth_func at tedg's request. + +2011-02-17 karl-qdh <karl@qdh.org.uk> + + Testing eds signal (FAIL) seems when evolution changes an entry no signal is emitted to eds clients + +2011-02-17 karl-qdh <karl@qdh.org.uk> + + Merged in mterrys time updates + +2011-02-16 Michael Terry <mike@mterry.name> + + show current time in each timezone + +2011-02-16 karl-qdh <karl@qdh.org.uk> + + The last free -> unref + +2011-02-16 karl-qdh <karl@qdh.org.uk> + + Another probable cause of a segfault + +2011-02-16 karl-qdh <karl@qdh.org.uk> + + Probable cause of segfault identified, trying to get dates from types without dates most likely cause + +2011-02-16 karl-qdh <karl@qdh.org.uk> + + Added debugging to figure out a segfault on kenvandine's machine + +2011-02-16 karl-qdh <karl@qdh.org.uk> + + Added authentication function, and another minor fix to the sources iteration + +2011-02-16 karl-qdh <karl@qdh.org.uk> + + Minor changes to objects freeing and NULLing the gerror + +2011-02-16 karl-qdh <karl@qdh.org.uk> + + Missing g_error_free + +2011-02-16 karl-qdh <karl@qdh.org.uk> + + Minor change to continue if getting source fails (auth required is returned by ecal) + +2011-02-16 karl-qdh <karl@qdh.org.uk> + + Syncup + +2011-02-16 karl-qdh <karl@qdh.org.uk> + + Removed unnoticed conflict and fixed some issues + +2011-02-16 karl-qdh <karl@qdh.org.uk> + + Merged back with trunk + +2011-02-16 karl-qdh <karl@qdh.org.uk> + + Added myerrys branch + +2011-02-15 Michael Terry <mike@mterry.name> + + whoops, don't connect destroyed signal as swapped + +2011-02-15 Michael Terry <mike@mterry.name> + + make sure gmi-radio-active state is always in sync with the dbusmenu-radio-active state + +2011-02-15 Michael Terry <mike@mterry.name> + + ignore timezone switches if nothing to do + +2011-02-15 Michael Terry <mike@mterry.name> + + record which gmi goes with with dbusmenuitem and use that to properly watch radio-active property changes + +2011-02-15 Michael Terry <mike@mterry.name> + + in prop_cb, value is a GVariant, not a string, which explains why we sometimes get bogus strings in the menu + +2011-02-15 Michael Terry <mike@mterry.name> + + re-enable setting the timezone when clicking + +2011-02-15 Michael Terry <mike@mterry.name> + + start with current timezone selected + +2011-02-15 Michael Terry <mike@mterry.name> + + add preference zones in order, after current timezone + +2011-02-15 Michael Terry <mike@mterry.name> + + show current or geo location if we are going to use them + +2011-02-15 Michael Terry <mike@mterry.name> + + fix typo that prevented old locations from being deleted + +2011-02-15 Michael Terry <mike@mterry.name> + + use a GtkCheckMenuItem, not a GtkRadioButton, to render timezone items + +2011-02-15 Michael Terry <mike@mterry.name> + + fix typo so timezone labels show up + +2011-02-16 karl-qdh <karl@qdh.org.uk> + + Added ecal for all sources, untested as yet, need to merge in mterry's branch + +2011-02-15 karl-qdh <karl@qdh.org.uk> + + Added a partially working timezone menu items code, there are some difficulties in menu labels which aren't showing, and radio menu items. Also, it's incomplete as the time calculation is waiting until the labels work. + +2011-02-17 Ted Gould <ted@gould.cx> + + Adding in accessible description support + +2011-02-17 Ted Gould <ted@gould.cx> + + Bump to indicator 0.3.19 + +2011-02-17 Ted Gould <ted@gould.cx> + + Encapsulating the updating of the description into a function + +2011-02-17 Luke Yelavich <luke.yelavich@canonical.com> + + Get the indicator entry data into a separate variable, adn and free it after + we signal a change in the accessible description, to avoid a memory leak. + +2011-02-14 Luke Yelavich <luke.yelavich@canonical.com> + + Add accessible description support. + 2011-02-09 Ted Gould <ted@gould.cx> 0.1.93 @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.67 for indicator-datetime 0.1.93. +# Generated by GNU Autoconf 2.67 for indicator-datetime 0.1.94. # # Report bugs to <ted@canonical.com>. # @@ -703,8 +703,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='indicator-datetime' PACKAGE_TARNAME='indicator-datetime' -PACKAGE_VERSION='0.1.93' -PACKAGE_STRING='indicator-datetime 0.1.93' +PACKAGE_VERSION='0.1.94' +PACKAGE_STRING='indicator-datetime 0.1.94' PACKAGE_BUGREPORT='ted@canonical.com' PACKAGE_URL='' @@ -1493,7 +1493,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures indicator-datetime 0.1.93 to adapt to many kinds of systems. +\`configure' configures indicator-datetime 0.1.94 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1564,7 +1564,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of indicator-datetime 0.1.93:";; + short | recursive ) echo "Configuration of indicator-datetime 0.1.94:";; esac cat <<\_ACEOF @@ -1687,7 +1687,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -indicator-datetime configure 0.1.93 +indicator-datetime configure 0.1.94 generated by GNU Autoconf 2.67 Copyright (C) 2010 Free Software Foundation, Inc. @@ -2058,7 +2058,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by indicator-datetime $as_me 0.1.93, which was +It was created by indicator-datetime $as_me 0.1.94, which was generated by GNU Autoconf 2.67. Invocation command line was $ $0 $@ @@ -2879,7 +2879,7 @@ fi # Define the identity of the package. PACKAGE=indicator-datetime - VERSION=0.1.93 + VERSION=0.1.94 cat >>confdefs.h <<_ACEOF @@ -12202,7 +12202,7 @@ fi # Dependencies ########################### -INDICATOR_REQUIRED_VERSION=0.3.0 +INDICATOR_REQUIRED_VERSION=0.3.19 DBUSMENUGLIB_REQUIRED_VERSION=0.1.1 DBUSMENUGTK_REQUIRED_VERSION=0.3.94 GIO_REQUIRED_VERSION=2.25.11 @@ -12215,6 +12215,7 @@ EDS_REQUIRED_VERSION=2.30 ICAL_REQUIRED_VERSION=0.44 CAIRO_REQUIRED_VERSION=1.10 GDK_REQUIRED_VERSION=2.22 +GLIB_REQUIRED_VERSION=2.26 if test "x$with_gtk" = x3; then : @@ -12227,10 +12228,12 @@ if test -n "$INDICATOR_CFLAGS"; then elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"indicator3 >= \$INDICATOR_REQUIRED_VERSION + glib-2.0 >= \$GLIB_REQUIRED_VERSION dbusmenu-glib-0.4 >= \$DBUSMENUGLIB_REQUIRED_VERSION dbusmenu-gtk3-0.4 >= \$DBUSMENUGTK_REQUIRED_VERSION libido3-0.1 >= \$INDICATOR_DISPLAY_OBJECTS\""; } >&5 ($PKG_CONFIG --exists --print-errors "indicator3 >= $INDICATOR_REQUIRED_VERSION + glib-2.0 >= $GLIB_REQUIRED_VERSION dbusmenu-glib-0.4 >= $DBUSMENUGLIB_REQUIRED_VERSION dbusmenu-gtk3-0.4 >= $DBUSMENUGTK_REQUIRED_VERSION libido3-0.1 >= $INDICATOR_DISPLAY_OBJECTS") 2>&5 @@ -12238,6 +12241,7 @@ if test -n "$INDICATOR_CFLAGS"; then $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_INDICATOR_CFLAGS=`$PKG_CONFIG --cflags "indicator3 >= $INDICATOR_REQUIRED_VERSION + glib-2.0 >= $GLIB_REQUIRED_VERSION dbusmenu-glib-0.4 >= $DBUSMENUGLIB_REQUIRED_VERSION dbusmenu-gtk3-0.4 >= $DBUSMENUGTK_REQUIRED_VERSION libido3-0.1 >= $INDICATOR_DISPLAY_OBJECTS" 2>/dev/null` @@ -12252,10 +12256,12 @@ if test -n "$INDICATOR_LIBS"; then elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"indicator3 >= \$INDICATOR_REQUIRED_VERSION + glib-2.0 >= \$GLIB_REQUIRED_VERSION dbusmenu-glib-0.4 >= \$DBUSMENUGLIB_REQUIRED_VERSION dbusmenu-gtk3-0.4 >= \$DBUSMENUGTK_REQUIRED_VERSION libido3-0.1 >= \$INDICATOR_DISPLAY_OBJECTS\""; } >&5 ($PKG_CONFIG --exists --print-errors "indicator3 >= $INDICATOR_REQUIRED_VERSION + glib-2.0 >= $GLIB_REQUIRED_VERSION dbusmenu-glib-0.4 >= $DBUSMENUGLIB_REQUIRED_VERSION dbusmenu-gtk3-0.4 >= $DBUSMENUGTK_REQUIRED_VERSION libido3-0.1 >= $INDICATOR_DISPLAY_OBJECTS") 2>&5 @@ -12263,6 +12269,7 @@ if test -n "$INDICATOR_LIBS"; then $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_INDICATOR_LIBS=`$PKG_CONFIG --libs "indicator3 >= $INDICATOR_REQUIRED_VERSION + glib-2.0 >= $GLIB_REQUIRED_VERSION dbusmenu-glib-0.4 >= $DBUSMENUGLIB_REQUIRED_VERSION dbusmenu-gtk3-0.4 >= $DBUSMENUGTK_REQUIRED_VERSION libido3-0.1 >= $INDICATOR_DISPLAY_OBJECTS" 2>/dev/null` @@ -12286,11 +12293,13 @@ else fi if test $_pkg_short_errors_supported = yes; then INDICATOR_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "indicator3 >= $INDICATOR_REQUIRED_VERSION + glib-2.0 >= $GLIB_REQUIRED_VERSION dbusmenu-glib-0.4 >= $DBUSMENUGLIB_REQUIRED_VERSION dbusmenu-gtk3-0.4 >= $DBUSMENUGTK_REQUIRED_VERSION libido3-0.1 >= $INDICATOR_DISPLAY_OBJECTS" 2>&1` else INDICATOR_PKG_ERRORS=`$PKG_CONFIG --print-errors "indicator3 >= $INDICATOR_REQUIRED_VERSION + glib-2.0 >= $GLIB_REQUIRED_VERSION dbusmenu-glib-0.4 >= $DBUSMENUGLIB_REQUIRED_VERSION dbusmenu-gtk3-0.4 >= $DBUSMENUGTK_REQUIRED_VERSION libido3-0.1 >= $INDICATOR_DISPLAY_OBJECTS" 2>&1` @@ -12299,6 +12308,7 @@ fi echo "$INDICATOR_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (indicator3 >= $INDICATOR_REQUIRED_VERSION + glib-2.0 >= $GLIB_REQUIRED_VERSION dbusmenu-glib-0.4 >= $DBUSMENUGLIB_REQUIRED_VERSION dbusmenu-gtk3-0.4 >= $DBUSMENUGTK_REQUIRED_VERSION libido3-0.1 >= $INDICATOR_DISPLAY_OBJECTS) were not met: @@ -12345,10 +12355,12 @@ if test -n "$INDICATOR_CFLAGS"; then elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"indicator >= \$INDICATOR_REQUIRED_VERSION + glib-2.0 >= \$GLIB_REQUIRED_VERSION dbusmenu-glib-0.4 >= \$DBUSMENUGLIB_REQUIRED_VERSION dbusmenu-gtk-0.4 >= \$DBUSMENUGTK_REQUIRED_VERSION libido-0.1 >= \$INDICATOR_DISPLAY_OBJECTS\""; } >&5 ($PKG_CONFIG --exists --print-errors "indicator >= $INDICATOR_REQUIRED_VERSION + glib-2.0 >= $GLIB_REQUIRED_VERSION dbusmenu-glib-0.4 >= $DBUSMENUGLIB_REQUIRED_VERSION dbusmenu-gtk-0.4 >= $DBUSMENUGTK_REQUIRED_VERSION libido-0.1 >= $INDICATOR_DISPLAY_OBJECTS") 2>&5 @@ -12356,6 +12368,7 @@ if test -n "$INDICATOR_CFLAGS"; then $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_INDICATOR_CFLAGS=`$PKG_CONFIG --cflags "indicator >= $INDICATOR_REQUIRED_VERSION + glib-2.0 >= $GLIB_REQUIRED_VERSION dbusmenu-glib-0.4 >= $DBUSMENUGLIB_REQUIRED_VERSION dbusmenu-gtk-0.4 >= $DBUSMENUGTK_REQUIRED_VERSION libido-0.1 >= $INDICATOR_DISPLAY_OBJECTS" 2>/dev/null` @@ -12370,10 +12383,12 @@ if test -n "$INDICATOR_LIBS"; then elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"indicator >= \$INDICATOR_REQUIRED_VERSION + glib-2.0 >= \$GLIB_REQUIRED_VERSION dbusmenu-glib-0.4 >= \$DBUSMENUGLIB_REQUIRED_VERSION dbusmenu-gtk-0.4 >= \$DBUSMENUGTK_REQUIRED_VERSION libido-0.1 >= \$INDICATOR_DISPLAY_OBJECTS\""; } >&5 ($PKG_CONFIG --exists --print-errors "indicator >= $INDICATOR_REQUIRED_VERSION + glib-2.0 >= $GLIB_REQUIRED_VERSION dbusmenu-glib-0.4 >= $DBUSMENUGLIB_REQUIRED_VERSION dbusmenu-gtk-0.4 >= $DBUSMENUGTK_REQUIRED_VERSION libido-0.1 >= $INDICATOR_DISPLAY_OBJECTS") 2>&5 @@ -12381,6 +12396,7 @@ if test -n "$INDICATOR_LIBS"; then $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_INDICATOR_LIBS=`$PKG_CONFIG --libs "indicator >= $INDICATOR_REQUIRED_VERSION + glib-2.0 >= $GLIB_REQUIRED_VERSION dbusmenu-glib-0.4 >= $DBUSMENUGLIB_REQUIRED_VERSION dbusmenu-gtk-0.4 >= $DBUSMENUGTK_REQUIRED_VERSION libido-0.1 >= $INDICATOR_DISPLAY_OBJECTS" 2>/dev/null` @@ -12404,11 +12420,13 @@ else fi if test $_pkg_short_errors_supported = yes; then INDICATOR_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "indicator >= $INDICATOR_REQUIRED_VERSION + glib-2.0 >= $GLIB_REQUIRED_VERSION dbusmenu-glib-0.4 >= $DBUSMENUGLIB_REQUIRED_VERSION dbusmenu-gtk-0.4 >= $DBUSMENUGTK_REQUIRED_VERSION libido-0.1 >= $INDICATOR_DISPLAY_OBJECTS" 2>&1` else INDICATOR_PKG_ERRORS=`$PKG_CONFIG --print-errors "indicator >= $INDICATOR_REQUIRED_VERSION + glib-2.0 >= $GLIB_REQUIRED_VERSION dbusmenu-glib-0.4 >= $DBUSMENUGLIB_REQUIRED_VERSION dbusmenu-gtk-0.4 >= $DBUSMENUGTK_REQUIRED_VERSION libido-0.1 >= $INDICATOR_DISPLAY_OBJECTS" 2>&1` @@ -12417,6 +12435,7 @@ fi echo "$INDICATOR_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (indicator >= $INDICATOR_REQUIRED_VERSION + glib-2.0 >= $GLIB_REQUIRED_VERSION dbusmenu-glib-0.4 >= $DBUSMENUGLIB_REQUIRED_VERSION dbusmenu-gtk-0.4 >= $DBUSMENUGTK_REQUIRED_VERSION libido-0.1 >= $INDICATOR_DISPLAY_OBJECTS) were not met: @@ -12471,6 +12490,7 @@ if test -n "$SERVICE_CFLAGS"; then elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"indicator >= \$INDICATOR_REQUIRED_VERSION + glib-2.0 >= \$GLIB_REQUIRED_VERSION dbusmenu-glib-0.4 >= \$DBUSMENUGLIB_REQUIRED_VERSION dbusmenu-gtk3-0.4 >= \$DBUSMENUGTK_REQUIRED_VERSION libido-0.1 >= \$INDICATOR_DISPLAY_OBJECTS @@ -12480,9 +12500,11 @@ if test -n "$SERVICE_CFLAGS"; then libecal-1.2 >= \$ECAL_REQUIRED_VERSION libical >= \$ICAL_REQUIRED_VERSION libedataserver-1.2 >= EDS_REQUIRED_VERSION + libedataserverui-1.2 >= EDS_REQUIRED_VERSION cairo >= CAIRO_REQUIRED_VERSION gdk-2.0 >= GDK_REQUIRED_VERSION\""; } >&5 ($PKG_CONFIG --exists --print-errors "indicator >= $INDICATOR_REQUIRED_VERSION + glib-2.0 >= $GLIB_REQUIRED_VERSION dbusmenu-glib-0.4 >= $DBUSMENUGLIB_REQUIRED_VERSION dbusmenu-gtk3-0.4 >= $DBUSMENUGTK_REQUIRED_VERSION libido-0.1 >= $INDICATOR_DISPLAY_OBJECTS @@ -12492,12 +12514,14 @@ if test -n "$SERVICE_CFLAGS"; then libecal-1.2 >= $ECAL_REQUIRED_VERSION libical >= $ICAL_REQUIRED_VERSION libedataserver-1.2 >= EDS_REQUIRED_VERSION + libedataserverui-1.2 >= EDS_REQUIRED_VERSION cairo >= CAIRO_REQUIRED_VERSION gdk-2.0 >= GDK_REQUIRED_VERSION") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_SERVICE_CFLAGS=`$PKG_CONFIG --cflags "indicator >= $INDICATOR_REQUIRED_VERSION + glib-2.0 >= $GLIB_REQUIRED_VERSION dbusmenu-glib-0.4 >= $DBUSMENUGLIB_REQUIRED_VERSION dbusmenu-gtk3-0.4 >= $DBUSMENUGTK_REQUIRED_VERSION libido-0.1 >= $INDICATOR_DISPLAY_OBJECTS @@ -12507,6 +12531,7 @@ if test -n "$SERVICE_CFLAGS"; then libecal-1.2 >= $ECAL_REQUIRED_VERSION libical >= $ICAL_REQUIRED_VERSION libedataserver-1.2 >= EDS_REQUIRED_VERSION + libedataserverui-1.2 >= EDS_REQUIRED_VERSION cairo >= CAIRO_REQUIRED_VERSION gdk-2.0 >= GDK_REQUIRED_VERSION" 2>/dev/null` else @@ -12520,6 +12545,7 @@ if test -n "$SERVICE_LIBS"; then elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"indicator >= \$INDICATOR_REQUIRED_VERSION + glib-2.0 >= \$GLIB_REQUIRED_VERSION dbusmenu-glib-0.4 >= \$DBUSMENUGLIB_REQUIRED_VERSION dbusmenu-gtk3-0.4 >= \$DBUSMENUGTK_REQUIRED_VERSION libido-0.1 >= \$INDICATOR_DISPLAY_OBJECTS @@ -12529,9 +12555,11 @@ if test -n "$SERVICE_LIBS"; then libecal-1.2 >= \$ECAL_REQUIRED_VERSION libical >= \$ICAL_REQUIRED_VERSION libedataserver-1.2 >= EDS_REQUIRED_VERSION + libedataserverui-1.2 >= EDS_REQUIRED_VERSION cairo >= CAIRO_REQUIRED_VERSION gdk-2.0 >= GDK_REQUIRED_VERSION\""; } >&5 ($PKG_CONFIG --exists --print-errors "indicator >= $INDICATOR_REQUIRED_VERSION + glib-2.0 >= $GLIB_REQUIRED_VERSION dbusmenu-glib-0.4 >= $DBUSMENUGLIB_REQUIRED_VERSION dbusmenu-gtk3-0.4 >= $DBUSMENUGTK_REQUIRED_VERSION libido-0.1 >= $INDICATOR_DISPLAY_OBJECTS @@ -12541,12 +12569,14 @@ if test -n "$SERVICE_LIBS"; then libecal-1.2 >= $ECAL_REQUIRED_VERSION libical >= $ICAL_REQUIRED_VERSION libedataserver-1.2 >= EDS_REQUIRED_VERSION + libedataserverui-1.2 >= EDS_REQUIRED_VERSION cairo >= CAIRO_REQUIRED_VERSION gdk-2.0 >= GDK_REQUIRED_VERSION") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_SERVICE_LIBS=`$PKG_CONFIG --libs "indicator >= $INDICATOR_REQUIRED_VERSION + glib-2.0 >= $GLIB_REQUIRED_VERSION dbusmenu-glib-0.4 >= $DBUSMENUGLIB_REQUIRED_VERSION dbusmenu-gtk3-0.4 >= $DBUSMENUGTK_REQUIRED_VERSION libido-0.1 >= $INDICATOR_DISPLAY_OBJECTS @@ -12556,6 +12586,7 @@ if test -n "$SERVICE_LIBS"; then libecal-1.2 >= $ECAL_REQUIRED_VERSION libical >= $ICAL_REQUIRED_VERSION libedataserver-1.2 >= EDS_REQUIRED_VERSION + libedataserverui-1.2 >= EDS_REQUIRED_VERSION cairo >= CAIRO_REQUIRED_VERSION gdk-2.0 >= GDK_REQUIRED_VERSION" 2>/dev/null` else @@ -12578,6 +12609,7 @@ else fi if test $_pkg_short_errors_supported = yes; then SERVICE_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "indicator >= $INDICATOR_REQUIRED_VERSION + glib-2.0 >= $GLIB_REQUIRED_VERSION dbusmenu-glib-0.4 >= $DBUSMENUGLIB_REQUIRED_VERSION dbusmenu-gtk3-0.4 >= $DBUSMENUGTK_REQUIRED_VERSION libido-0.1 >= $INDICATOR_DISPLAY_OBJECTS @@ -12587,10 +12619,12 @@ fi libecal-1.2 >= $ECAL_REQUIRED_VERSION libical >= $ICAL_REQUIRED_VERSION libedataserver-1.2 >= EDS_REQUIRED_VERSION + libedataserverui-1.2 >= EDS_REQUIRED_VERSION cairo >= CAIRO_REQUIRED_VERSION gdk-2.0 >= GDK_REQUIRED_VERSION" 2>&1` else SERVICE_PKG_ERRORS=`$PKG_CONFIG --print-errors "indicator >= $INDICATOR_REQUIRED_VERSION + glib-2.0 >= $GLIB_REQUIRED_VERSION dbusmenu-glib-0.4 >= $DBUSMENUGLIB_REQUIRED_VERSION dbusmenu-gtk3-0.4 >= $DBUSMENUGTK_REQUIRED_VERSION libido-0.1 >= $INDICATOR_DISPLAY_OBJECTS @@ -12600,6 +12634,7 @@ fi libecal-1.2 >= $ECAL_REQUIRED_VERSION libical >= $ICAL_REQUIRED_VERSION libedataserver-1.2 >= EDS_REQUIRED_VERSION + libedataserverui-1.2 >= EDS_REQUIRED_VERSION cairo >= CAIRO_REQUIRED_VERSION gdk-2.0 >= GDK_REQUIRED_VERSION" 2>&1` fi @@ -12607,6 +12642,7 @@ fi echo "$SERVICE_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (indicator >= $INDICATOR_REQUIRED_VERSION + glib-2.0 >= $GLIB_REQUIRED_VERSION dbusmenu-glib-0.4 >= $DBUSMENUGLIB_REQUIRED_VERSION dbusmenu-gtk3-0.4 >= $DBUSMENUGTK_REQUIRED_VERSION libido-0.1 >= $INDICATOR_DISPLAY_OBJECTS @@ -12616,6 +12652,7 @@ fi libecal-1.2 >= $ECAL_REQUIRED_VERSION libical >= $ICAL_REQUIRED_VERSION libedataserver-1.2 >= EDS_REQUIRED_VERSION + libedataserverui-1.2 >= EDS_REQUIRED_VERSION cairo >= CAIRO_REQUIRED_VERSION gdk-2.0 >= GDK_REQUIRED_VERSION) were not met: @@ -12661,6 +12698,7 @@ if test -n "$SERVICE_CFLAGS"; then elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"indicator >= \$INDICATOR_REQUIRED_VERSION + glib-2.0 >= \$GLIB_REQUIRED_VERSION dbusmenu-glib-0.4 >= \$DBUSMENUGLIB_REQUIRED_VERSION dbusmenu-gtk-0.4 >= \$DBUSMENUGTK_REQUIRED_VERSION libido-0.1 >= \$INDICATOR_DISPLAY_OBJECTS @@ -12670,9 +12708,11 @@ if test -n "$SERVICE_CFLAGS"; then libecal-1.2 >= \$ECAL_REQUIRED_VERSION libical >= \$ICAL_REQUIRED_VERSION libedataserver-1.2 >= EDS_REQUIRED_VERSION + libedataserverui-1.2 >= EDS_REQUIRED_VERSION cairo >= CAIRO_REQUIRED_VERSION gdk-2.0 >= GDK_REQUIRED_VERSION\""; } >&5 ($PKG_CONFIG --exists --print-errors "indicator >= $INDICATOR_REQUIRED_VERSION + glib-2.0 >= $GLIB_REQUIRED_VERSION dbusmenu-glib-0.4 >= $DBUSMENUGLIB_REQUIRED_VERSION dbusmenu-gtk-0.4 >= $DBUSMENUGTK_REQUIRED_VERSION libido-0.1 >= $INDICATOR_DISPLAY_OBJECTS @@ -12682,12 +12722,14 @@ if test -n "$SERVICE_CFLAGS"; then libecal-1.2 >= $ECAL_REQUIRED_VERSION libical >= $ICAL_REQUIRED_VERSION libedataserver-1.2 >= EDS_REQUIRED_VERSION + libedataserverui-1.2 >= EDS_REQUIRED_VERSION cairo >= CAIRO_REQUIRED_VERSION gdk-2.0 >= GDK_REQUIRED_VERSION") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_SERVICE_CFLAGS=`$PKG_CONFIG --cflags "indicator >= $INDICATOR_REQUIRED_VERSION + glib-2.0 >= $GLIB_REQUIRED_VERSION dbusmenu-glib-0.4 >= $DBUSMENUGLIB_REQUIRED_VERSION dbusmenu-gtk-0.4 >= $DBUSMENUGTK_REQUIRED_VERSION libido-0.1 >= $INDICATOR_DISPLAY_OBJECTS @@ -12697,6 +12739,7 @@ if test -n "$SERVICE_CFLAGS"; then libecal-1.2 >= $ECAL_REQUIRED_VERSION libical >= $ICAL_REQUIRED_VERSION libedataserver-1.2 >= EDS_REQUIRED_VERSION + libedataserverui-1.2 >= EDS_REQUIRED_VERSION cairo >= CAIRO_REQUIRED_VERSION gdk-2.0 >= GDK_REQUIRED_VERSION" 2>/dev/null` else @@ -12710,6 +12753,7 @@ if test -n "$SERVICE_LIBS"; then elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"indicator >= \$INDICATOR_REQUIRED_VERSION + glib-2.0 >= \$GLIB_REQUIRED_VERSION dbusmenu-glib-0.4 >= \$DBUSMENUGLIB_REQUIRED_VERSION dbusmenu-gtk-0.4 >= \$DBUSMENUGTK_REQUIRED_VERSION libido-0.1 >= \$INDICATOR_DISPLAY_OBJECTS @@ -12719,9 +12763,11 @@ if test -n "$SERVICE_LIBS"; then libecal-1.2 >= \$ECAL_REQUIRED_VERSION libical >= \$ICAL_REQUIRED_VERSION libedataserver-1.2 >= EDS_REQUIRED_VERSION + libedataserverui-1.2 >= EDS_REQUIRED_VERSION cairo >= CAIRO_REQUIRED_VERSION gdk-2.0 >= GDK_REQUIRED_VERSION\""; } >&5 ($PKG_CONFIG --exists --print-errors "indicator >= $INDICATOR_REQUIRED_VERSION + glib-2.0 >= $GLIB_REQUIRED_VERSION dbusmenu-glib-0.4 >= $DBUSMENUGLIB_REQUIRED_VERSION dbusmenu-gtk-0.4 >= $DBUSMENUGTK_REQUIRED_VERSION libido-0.1 >= $INDICATOR_DISPLAY_OBJECTS @@ -12731,12 +12777,14 @@ if test -n "$SERVICE_LIBS"; then libecal-1.2 >= $ECAL_REQUIRED_VERSION libical >= $ICAL_REQUIRED_VERSION libedataserver-1.2 >= EDS_REQUIRED_VERSION + libedataserverui-1.2 >= EDS_REQUIRED_VERSION cairo >= CAIRO_REQUIRED_VERSION gdk-2.0 >= GDK_REQUIRED_VERSION") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_SERVICE_LIBS=`$PKG_CONFIG --libs "indicator >= $INDICATOR_REQUIRED_VERSION + glib-2.0 >= $GLIB_REQUIRED_VERSION dbusmenu-glib-0.4 >= $DBUSMENUGLIB_REQUIRED_VERSION dbusmenu-gtk-0.4 >= $DBUSMENUGTK_REQUIRED_VERSION libido-0.1 >= $INDICATOR_DISPLAY_OBJECTS @@ -12746,6 +12794,7 @@ if test -n "$SERVICE_LIBS"; then libecal-1.2 >= $ECAL_REQUIRED_VERSION libical >= $ICAL_REQUIRED_VERSION libedataserver-1.2 >= EDS_REQUIRED_VERSION + libedataserverui-1.2 >= EDS_REQUIRED_VERSION cairo >= CAIRO_REQUIRED_VERSION gdk-2.0 >= GDK_REQUIRED_VERSION" 2>/dev/null` else @@ -12768,6 +12817,7 @@ else fi if test $_pkg_short_errors_supported = yes; then SERVICE_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "indicator >= $INDICATOR_REQUIRED_VERSION + glib-2.0 >= $GLIB_REQUIRED_VERSION dbusmenu-glib-0.4 >= $DBUSMENUGLIB_REQUIRED_VERSION dbusmenu-gtk-0.4 >= $DBUSMENUGTK_REQUIRED_VERSION libido-0.1 >= $INDICATOR_DISPLAY_OBJECTS @@ -12777,10 +12827,12 @@ fi libecal-1.2 >= $ECAL_REQUIRED_VERSION libical >= $ICAL_REQUIRED_VERSION libedataserver-1.2 >= EDS_REQUIRED_VERSION + libedataserverui-1.2 >= EDS_REQUIRED_VERSION cairo >= CAIRO_REQUIRED_VERSION gdk-2.0 >= GDK_REQUIRED_VERSION" 2>&1` else SERVICE_PKG_ERRORS=`$PKG_CONFIG --print-errors "indicator >= $INDICATOR_REQUIRED_VERSION + glib-2.0 >= $GLIB_REQUIRED_VERSION dbusmenu-glib-0.4 >= $DBUSMENUGLIB_REQUIRED_VERSION dbusmenu-gtk-0.4 >= $DBUSMENUGTK_REQUIRED_VERSION libido-0.1 >= $INDICATOR_DISPLAY_OBJECTS @@ -12790,6 +12842,7 @@ fi libecal-1.2 >= $ECAL_REQUIRED_VERSION libical >= $ICAL_REQUIRED_VERSION libedataserver-1.2 >= EDS_REQUIRED_VERSION + libedataserverui-1.2 >= EDS_REQUIRED_VERSION cairo >= CAIRO_REQUIRED_VERSION gdk-2.0 >= GDK_REQUIRED_VERSION" 2>&1` fi @@ -12797,6 +12850,7 @@ fi echo "$SERVICE_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (indicator >= $INDICATOR_REQUIRED_VERSION + glib-2.0 >= $GLIB_REQUIRED_VERSION dbusmenu-glib-0.4 >= $DBUSMENUGLIB_REQUIRED_VERSION dbusmenu-gtk-0.4 >= $DBUSMENUGTK_REQUIRED_VERSION libido-0.1 >= $INDICATOR_DISPLAY_OBJECTS @@ -12806,6 +12860,7 @@ fi libecal-1.2 >= $ECAL_REQUIRED_VERSION libical >= $ICAL_REQUIRED_VERSION libedataserver-1.2 >= EDS_REQUIRED_VERSION + libedataserverui-1.2 >= EDS_REQUIRED_VERSION cairo >= CAIRO_REQUIRED_VERSION gdk-2.0 >= GDK_REQUIRED_VERSION) were not met: @@ -14415,7 +14470,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by indicator-datetime $as_me 0.1.93, which was +This file was extended by indicator-datetime $as_me 0.1.94, which was generated by GNU Autoconf 2.67. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -14481,7 +14536,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -indicator-datetime config.status 0.1.93 +indicator-datetime config.status 0.1.94 configured by $0, generated by GNU Autoconf 2.67, with options \\"\$ac_cs_config\\" diff --git a/configure.ac b/configure.ac index 9aedb49..d06aa6d 100644 --- a/configure.ac +++ b/configure.ac @@ -1,11 +1,11 @@ -AC_INIT(indicator-datetime, 0.1.93, ted@canonical.com) +AC_INIT(indicator-datetime, 0.1.94, ted@canonical.com) AC_COPYRIGHT([Copyright 2009,2010 Canonical]) AC_PREREQ(2.53) AM_CONFIG_HEADER(config.h) -AM_INIT_AUTOMAKE(indicator-datetime, 0.1.93) +AM_INIT_AUTOMAKE(indicator-datetime, 0.1.94) AM_MAINTAINER_MODE @@ -51,7 +51,7 @@ AC_ARG_WITH([gtk], # Dependencies ########################### -INDICATOR_REQUIRED_VERSION=0.3.0 +INDICATOR_REQUIRED_VERSION=0.3.19 DBUSMENUGLIB_REQUIRED_VERSION=0.1.1 DBUSMENUGTK_REQUIRED_VERSION=0.3.94 GIO_REQUIRED_VERSION=2.25.11 @@ -64,15 +64,18 @@ EDS_REQUIRED_VERSION=2.30 ICAL_REQUIRED_VERSION=0.44 CAIRO_REQUIRED_VERSION=1.10 GDK_REQUIRED_VERSION=2.22 +GLIB_REQUIRED_VERSION=2.26 AS_IF([test "x$with_gtk" = x3], [PKG_CHECK_MODULES(INDICATOR, indicator3 >= $INDICATOR_REQUIRED_VERSION + glib-2.0 >= $GLIB_REQUIRED_VERSION dbusmenu-glib-0.4 >= $DBUSMENUGLIB_REQUIRED_VERSION dbusmenu-gtk3-0.4 >= $DBUSMENUGTK_REQUIRED_VERSION libido3-0.1 >= $INDICATOR_DISPLAY_OBJECTS) ], [test "x$with_gtk" = x2], [PKG_CHECK_MODULES(INDICATOR, indicator >= $INDICATOR_REQUIRED_VERSION + glib-2.0 >= $GLIB_REQUIRED_VERSION dbusmenu-glib-0.4 >= $DBUSMENUGLIB_REQUIRED_VERSION dbusmenu-gtk-0.4 >= $DBUSMENUGTK_REQUIRED_VERSION libido-0.1 >= $INDICATOR_DISPLAY_OBJECTS) @@ -82,6 +85,7 @@ AS_IF([test "x$with_gtk" = x3], AS_IF([test "x$with_gtk" = x3], [PKG_CHECK_MODULES(SERVICE, indicator >= $INDICATOR_REQUIRED_VERSION + glib-2.0 >= $GLIB_REQUIRED_VERSION dbusmenu-glib-0.4 >= $DBUSMENUGLIB_REQUIRED_VERSION dbusmenu-gtk3-0.4 >= $DBUSMENUGTK_REQUIRED_VERSION libido-0.1 >= $INDICATOR_DISPLAY_OBJECTS @@ -91,11 +95,13 @@ AS_IF([test "x$with_gtk" = x3], libecal-1.2 >= $ECAL_REQUIRED_VERSION libical >= $ICAL_REQUIRED_VERSION libedataserver-1.2 >= EDS_REQUIRED_VERSION + libedataserverui-1.2 >= EDS_REQUIRED_VERSION cairo >= CAIRO_REQUIRED_VERSION gdk-2.0 >= GDK_REQUIRED_VERSION) ], [test "x$with_gtk" = x2], [PKG_CHECK_MODULES(SERVICE, indicator >= $INDICATOR_REQUIRED_VERSION + glib-2.0 >= $GLIB_REQUIRED_VERSION dbusmenu-glib-0.4 >= $DBUSMENUGLIB_REQUIRED_VERSION dbusmenu-gtk-0.4 >= $DBUSMENUGTK_REQUIRED_VERSION libido-0.1 >= $INDICATOR_DISPLAY_OBJECTS @@ -105,6 +111,7 @@ AS_IF([test "x$with_gtk" = x3], libecal-1.2 >= $ECAL_REQUIRED_VERSION libical >= $ICAL_REQUIRED_VERSION libedataserver-1.2 >= EDS_REQUIRED_VERSION + libedataserverui-1.2 >= EDS_REQUIRED_VERSION cairo >= CAIRO_REQUIRED_VERSION gdk-2.0 >= GDK_REQUIRED_VERSION) ], diff --git a/data/com.canonical.indicator.datetime.gschema.xml b/data/com.canonical.indicator.datetime.gschema.xml index fe493f7..117f965 100644 --- a/data/com.canonical.indicator.datetime.gschema.xml +++ b/data/com.canonical.indicator.datetime.gschema.xml @@ -57,5 +57,13 @@ more information. </description> </key> + <key name="locations" type="as"> + <default>[]</default> + <summary>A List of locations</summary> + <description> + Adds the list of locations the user has configured to display in the + indicator-datetime menu. + </description> + </key> </schema> </schemalist> diff --git a/src/datetime-service.c b/src/datetime-service.c index e373ae8..d16837c 100644 --- a/src/datetime-service.c +++ b/src/datetime-service.c @@ -42,6 +42,7 @@ with this program. If not, see <http://www.gnu.org/licenses/>. #include <libical/ical.h> #include <libecal/e-cal-time-util.h> #include <libedataserver/e-source.h> +#include <libedataserverui/e-passwords.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> @@ -52,8 +53,13 @@ with this program. If not, see <http://www.gnu.org/licenses/>. #include "datetime-interface.h" #include "dbus-shared.h" + +#define SETTINGS_INTERFACE "com.canonical.indicator.datetime" +#define SETTINGS_LOCATIONS "locations" + static void geo_create_client (GeoclueMaster * master, GeoclueMasterClient * client, gchar * path, GError * error, gpointer user_data); static gboolean update_appointment_menu_items (gpointer user_data); +static gboolean update_timezone_menu_items(gpointer user_data); static void setup_timer (void); static void geo_client_invalid (GeoclueMasterClient * client, gpointer user_data); static void geo_address_change (GeoclueMasterClient * client, gchar * a, gchar * b, gchar * c, gchar * d, gpointer user_data); @@ -63,30 +69,35 @@ static GMainLoop * mainloop = NULL; static DbusmenuServer * server = NULL; static DbusmenuMenuitem * root = NULL; static DatetimeInterface * dbus = NULL; -static gchar * current_timezone = NULL; /* Global Items */ static DbusmenuMenuitem * date = NULL; static DbusmenuMenuitem * calendar = NULL; static DbusmenuMenuitem * settings = NULL; -static DbusmenuMenuitem * tzchange = NULL; +static DbusmenuMenuitem * locations_separator = NULL; +static DbusmenuMenuitem * geo_location = NULL; +static DbusmenuMenuitem * current_location = NULL; +//static DbusmenuMenuitem * ecal_location = NULL; static DbusmenuMenuitem * add_appointment = NULL; -// static DbusmenuMenuitem * add_location = NULL; static GList * appointments = NULL; -static ECal * ecal = NULL; -static const gchar * ecal_timezone = NULL; -static icaltimezone *tzone; +static GList * dconflocations = NULL; +GSettings *conf; + /* Geoclue trackers */ static GeoclueMasterClient * geo_master = NULL; static GeoclueAddress * geo_address = NULL; -static gchar * geo_timezone = NULL; + +/* Our 2 important timezones */ +static gchar * current_timezone = NULL; +static gchar * geo_timezone = NULL; /* Check to see if our timezones are the same */ static void check_timezone_sync (void) { + gchar * label; gboolean in_sync = FALSE; - + if (geo_timezone == NULL) { in_sync = TRUE; } @@ -105,18 +116,63 @@ check_timezone_sync (void) { g_debug("Timezones are different"); } - if (tzchange != NULL) { + if (geo_location != NULL && current_location != NULL) { + g_debug("Got timezone %s", current_timezone); + g_debug("Got timezone %s", geo_timezone); + // Show neither current location nor geo location if both are the same + // however, we want to set their time and label accordingly if (in_sync) { - dbusmenu_menuitem_property_set_bool(tzchange, DBUSMENU_MENUITEM_PROP_VISIBLE, FALSE); + if (current_timezone == NULL && geo_timezone == NULL) { + dbusmenu_menuitem_property_set_bool(locations_separator, DBUSMENU_MENUITEM_PROP_VISIBLE, FALSE); + dbusmenu_menuitem_property_set_bool (current_location, DBUSMENU_MENUITEM_PROP_VISIBLE, FALSE); + dbusmenu_menuitem_property_set_bool (geo_location, DBUSMENU_MENUITEM_PROP_VISIBLE, FALSE); + update_timezone_menu_items(NULL); // Update the timezone menu items + return; + } + + dbusmenu_menuitem_property_set_bool (locations_separator, DBUSMENU_MENUITEM_PROP_VISIBLE, FALSE); + dbusmenu_menuitem_property_set_bool (current_location, DBUSMENU_MENUITEM_PROP_VISIBLE, FALSE); + dbusmenu_menuitem_property_set_bool (current_location, DBUSMENU_MENUITEM_PROP_ENABLED, TRUE); + dbusmenu_menuitem_property_set_bool (geo_location, DBUSMENU_MENUITEM_PROP_VISIBLE, FALSE); + dbusmenu_menuitem_property_set_bool (geo_location, DBUSMENU_MENUITEM_PROP_ENABLED, TRUE); + + if (current_timezone != NULL) { + label = current_timezone; + } else { + label = geo_timezone; + } + + if (label != NULL) { + // TODO work out the current location name in a nice way + dbusmenu_menuitem_property_set (current_location, TIMEZONE_MENUITEM_PROP_ZONE, label); + // TODO work out the current time at that location + dbusmenu_menuitem_property_set_bool (current_location, DBUSMENU_MENUITEM_PROP_VISIBLE, TRUE); + dbusmenu_menuitem_property_set_bool(current_location, TIMEZONE_MENUITEM_PROP_RADIO, TRUE); + } else { + g_debug("Label for current location is null, this shouldn't happen"); + } + if (geo_timezone != NULL) { + // TODO work out the geo location name in a nice way + dbusmenu_menuitem_property_set (geo_location, TIMEZONE_MENUITEM_PROP_ZONE, geo_timezone); + // TODO work out the current time at that location + dbusmenu_menuitem_property_set_bool (geo_location, DBUSMENU_MENUITEM_PROP_VISIBLE, TRUE); + } } else { - gchar * label = g_strdup_printf(_("Change timezone to: %s"), geo_timezone); - - dbusmenu_menuitem_property_set(tzchange, DBUSMENU_MENUITEM_PROP_LABEL, label); - dbusmenu_menuitem_property_set_bool(tzchange, DBUSMENU_MENUITEM_PROP_VISIBLE, TRUE); - - g_free(label); + // TODO work out the geo location name in a nice way + dbusmenu_menuitem_property_set (geo_location, TIMEZONE_MENUITEM_PROP_ZONE, geo_timezone); + // TODO work out the current time at that location + dbusmenu_menuitem_property_set_bool(geo_location, DBUSMENU_MENUITEM_PROP_VISIBLE, TRUE); + + // TODO work out the current location name in a nice way + dbusmenu_menuitem_property_set (current_location, TIMEZONE_MENUITEM_PROP_ZONE, current_timezone); + // TODO work out the current time at that location + dbusmenu_menuitem_property_set_bool(current_location, TIMEZONE_MENUITEM_PROP_RADIO, TRUE); + dbusmenu_menuitem_property_set_bool(current_location, DBUSMENU_MENUITEM_PROP_VISIBLE, TRUE); + dbusmenu_menuitem_property_set_bool(locations_separator, DBUSMENU_MENUITEM_PROP_VISIBLE, TRUE); } } + g_debug("Finished checking timezone sync"); + update_timezone_menu_items(NULL); // Update the timezone menu items return; } @@ -169,17 +225,22 @@ quick_set_tz_cb (OobsObject * obj, OobsResult result, gpointer user_data) /* Set the timezone to the Geoclue discovered one */ static void -quick_set_tz (DbusmenuMenuitem * menuitem, guint timestamp, const gchar *command) +quick_set_tz (DbusmenuMenuitem * menuitem, guint timestamp, gpointer user_data) { - g_debug("Quick setting timezone to: %s", geo_timezone); + const gchar * tz = dbusmenu_menuitem_property_get(menuitem, TIMEZONE_MENUITEM_PROP_ZONE); - g_return_if_fail(geo_timezone != NULL); + g_debug("Quick setting timezone to: %s", tz); + + g_return_if_fail(tz != NULL); + + if (g_strcmp0(tz, current_timezone) == 0) + return; OobsObject * obj = oobs_time_config_get(); g_return_if_fail(obj != NULL); OobsTimeConfig * timeconfig = OOBS_TIME_CONFIG(obj); - oobs_time_config_set_timezone(timeconfig, geo_timezone); + oobs_time_config_set_timezone(timeconfig, tz); oobs_object_commit_async(obj, quick_set_tz_cb, NULL); @@ -239,9 +300,7 @@ check_for_calendar (gpointer user_data) g_debug("Found the calendar application: %s", evo); dbusmenu_menuitem_property_set_bool(calendar, DBUSMENU_MENUITEM_PROP_ENABLED, TRUE); dbusmenu_menuitem_property_set_bool(calendar, DBUSMENU_MENUITEM_PROP_VISIBLE, TRUE); - dbusmenu_menuitem_property_set_bool(add_appointment, DBUSMENU_MENUITEM_PROP_ENABLED, TRUE); - dbusmenu_menuitem_property_set_bool(add_appointment, DBUSMENU_MENUITEM_PROP_VISIBLE, TRUE); - +/* GError *gerror = NULL; // TODO: In reality we should iterate sources of calendar, but getting the local one doens't lag for > a minute g_debug("Setting up ecal."); @@ -265,15 +324,26 @@ check_for_calendar (gpointer user_data) ecal = NULL; } - /* This timezone represents the timezone of the calendar, this might be different to the current UTC offset. + This timezone represents the timezone of the calendar, this might be different to the current UTC offset. * this means we'll have some geoclue interaction going on, and possibly the user will be involved in setting * their location manually, case in point: trains have satellite links which often geoclue to sweden, * this shouldn't automatically set the location and mess up all the appointments for the user. - */ + if (ecal) ecal_timezone = icaltimezone_get_tzid(tzone); - + */ + DbusmenuMenuitem * separator = dbusmenu_menuitem_new(); + dbusmenu_menuitem_property_set(separator, DBUSMENU_MENUITEM_PROP_TYPE, DBUSMENU_CLIENT_TYPES_SEPARATOR); + dbusmenu_menuitem_child_add_position(root, separator, 3); + + add_appointment = dbusmenu_menuitem_new(); + dbusmenu_menuitem_property_set (add_appointment, DBUSMENU_MENUITEM_PROP_LABEL, _("Add Appointment")); + dbusmenu_menuitem_property_set_bool(add_appointment, DBUSMENU_MENUITEM_PROP_ENABLED, TRUE); + dbusmenu_menuitem_property_set_bool(add_appointment, DBUSMENU_MENUITEM_PROP_VISIBLE, TRUE); + g_signal_connect(G_OBJECT(add_appointment), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(activate_cb), "evolution -c calendar"); + dbusmenu_menuitem_child_add_position (root, add_appointment, 3); + update_appointment_menu_items(NULL); - g_signal_connect(root, DBUSMENU_MENUITEM_SIGNAL_ABOUT_TO_SHOW, G_CALLBACK(update_appointment_menu_items), NULL); + g_signal_connect(root, DBUSMENU_MENUITEM_SIGNAL_ABOUT_TO_SHOW, G_CALLBACK(update_appointment_menu_items), NULL); g_free(evo); } else { @@ -285,18 +355,93 @@ check_for_calendar (gpointer user_data) return FALSE; } -/* + static gboolean update_timezone_menu_items(gpointer user_data) { - // Get the current location as specified by the user as a place name and time and add it, - // Get the location from geoclue as a place and time and add it, - // Get the evolution calendar timezone as a place and time and add it, - // Get the current timezone that the clock uses and select that - // Iterate over configured places and add any which aren't already listed - // Hook up each of these to setting the time/current timezone + g_debug("Updating timezone menu items"); + gchar ** locations = g_settings_get_strv(conf, SETTINGS_LOCATIONS); + if (locations == NULL) { + g_debug("No locations configured (NULL)"); + return FALSE; + } + guint len = g_strv_length(locations); + DbusmenuMenuitem *item; + gint i, offset; + + /* Remove all of the previous locations */ + if (dconflocations != NULL) { + g_debug("Freeing old locations"); + while (dconflocations != NULL) { + DbusmenuMenuitem * litem = DBUSMENU_MENUITEM(dconflocations->data); + g_debug("Freeing old location: %p", litem); + // Remove all the existing menu items which are in dconflocations. + dconflocations = g_list_remove(dconflocations, litem); + dbusmenu_menuitem_child_delete(root, DBUSMENU_MENUITEM(litem)); + g_object_unref(G_OBJECT(litem)); + } + } + + // TODO: Remove items from the dconflocations at the end of the iteration + // Make sure if there are multiple locations, our current location is shown + if (len > 0) { + dbusmenu_menuitem_property_set_bool (locations_separator, DBUSMENU_MENUITEM_PROP_VISIBLE, TRUE); + dbusmenu_menuitem_property_set_bool (current_location, DBUSMENU_MENUITEM_PROP_VISIBLE, TRUE); + dbusmenu_menuitem_property_set_bool (current_location, DBUSMENU_MENUITEM_PROP_ENABLED, TRUE); + } else { + g_debug("No locations configured (Empty List)"); + return FALSE; + } + + offset = dbusmenu_menuitem_get_position (current_location, root)+1; + for (i = 0; i < len; i++) { + // Iterate over configured places and add any which aren't already listed + if (g_strcmp0(locations[i], current_timezone) != 0 && + g_strcmp0(locations[i], geo_timezone) != 0) { + g_debug("Adding timezone in update_timezones %s", locations[i]); + item = dbusmenu_menuitem_new(); + dbusmenu_menuitem_property_set (item, DBUSMENU_MENUITEM_PROP_TYPE, TIMEZONE_MENUITEM_TYPE); + dbusmenu_menuitem_property_set (item, TIMEZONE_MENUITEM_PROP_ZONE, locations[i]); + 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, TRUE); + 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); + dconflocations = g_list_append(dconflocations, item); + } + } + g_strfreev (locations); + // Get the evolution calendar timezone as a place and time and add it return FALSE; } -*/ + +// Authentication function +static gchar * +auth_func (ECal *ecal, const gchar *prompt, const gchar *key, gpointer user_data) { + gboolean remember; // TODO: Is this useful? Should we be storing it somewhere? + 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); + + if (password == NULL) { + password = e_passwords_ask_password ( + _("Enter password"), + component_name, key, prompt, + E_PASSWORDS_REMEMBER_FOREVER | + E_PASSWORDS_SECRET | + E_PASSWORDS_ONLINE, + &remember, NULL); + } + + g_free (auth_domain); + + return password; +} + // Compare function for g_list_sort of ECalComponent objects static gint @@ -307,8 +452,13 @@ compare_appointment_items (ECalComponent *a, struct tm tm_a, tm_b; time_t t_a, t_b; gint retval = 0; - + + if (a == NULL || b == NULL) return retval; + ECalComponentVType vtype = e_cal_component_get_vtype (a); + + if (vtype != E_CAL_COMPONENT_EVENT && vtype != E_CAL_COMPONENT_TODO) return -1; + if (vtype == E_CAL_COMPONENT_EVENT) e_cal_component_get_dtstart (a, &datetime_a); else @@ -317,6 +467,8 @@ compare_appointment_items (ECalComponent *a, t_a = mktime(&tm_a); vtype = e_cal_component_get_vtype (b); + if (vtype != E_CAL_COMPONENT_EVENT && vtype != E_CAL_COMPONENT_TODO) return 1; + if (vtype == E_CAL_COMPONENT_EVENT) e_cal_component_get_dtstart (b, &datetime_b); else @@ -340,15 +492,17 @@ compare_appointment_items (ECalComponent *a, */ static gboolean update_appointment_menu_items (gpointer user_data) { - if (!ecal) return FALSE; // FFR: we should take into account short term timers, for instance // tea timers, pomodoro timers etc... that people may add, this is hinted to in the spec. time_t t1, t2; gchar *query, *is, *ie, *ad; GList *objects = NULL, *l; + GList *allobjects = NULL; + GSList *g; GError *gerror = NULL; gint i; gint width, height; + ESourceList * sources = NULL; time(&t1); time(&t2); @@ -357,16 +511,6 @@ update_appointment_menu_items (gpointer user_data) { is = isodate_from_time_t(t1); ie = isodate_from_time_t(t2); - // FIXME can we put a limit on the number of results? Or if not complete, or is event/todo? Or sort it by date? - query = g_strdup_printf("(occur-in-time-range? (make-time\"%s\") (make-time\"%s\"))", is, ie); - g_debug("Getting objects with query: %s", query); - if (!e_cal_get_object_list_as_comp(ecal, query, &objects, &gerror)) { - g_debug("Failed to get objects\n"); - g_free(ecal); - ecal = NULL; - return FALSE; - } - g_debug("Number of objects returned: %d", g_list_length(objects)); gtk_icon_size_lookup(GTK_ICON_SIZE_MENU, &width, &height); /* Remove all of the previous appointments */ @@ -382,14 +526,62 @@ update_appointment_menu_items (gpointer user_data) { } } + // TODO Remove all highlights from the calendar widget + + // FIXME can we put a limit on the number of results? Or if not complete, or is event/todo? Or sort it by date? + query = g_strdup_printf("(occur-in-time-range? (make-time\"%s\") (make-time\"%s\"))", is, ie); + + if (!e_cal_get_sources(&sources, E_CAL_SOURCE_TYPE_EVENT, &gerror)) { + g_debug("Failed to get ecal sources\n"); + return FALSE; + } + + // iterate the query 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 * tzone; + + if (!e_cal_open(ecal, FALSE, &gerror)) { + g_debug("Failed to get ecal sources %s", gerror->message); + g_error_free(gerror); + gerror = NULL; + continue; + } + + g_debug("Getting objects with query: %s", query); + if (!e_cal_get_object_list_as_comp(ecal, query, &objects, &gerror)) { + g_debug("Failed to get objects\n"); + g_free(ecal); + return FALSE; + } + g_debug("Number of objects returned: %d", g_list_length(objects)); + + if (allobjects == NULL) { + allobjects = objects; + } else if (objects != NULL) { + allobjects = g_list_concat(allobjects, objects); + g_object_unref(objects); + } + } + } + // Sort the list see above FIXME regarding queries - objects = g_list_sort(objects, (GCompareFunc) compare_appointment_items); + g_debug("Sorting objects list"); + allobjects = g_list_sort(allobjects, (GCompareFunc) compare_appointment_items); i = 0; - for (l = objects; l; l = l->next) { + for (l = allobjects; l; l = l->next) { ECalComponent *ecalcomp = l->data; ECalComponentText valuetext; ECalComponentDateTime datetime; icaltimezone *appointment_zone = NULL; + icaltimezone *current_zone = NULL; icalproperty_status status; gchar *summary, *cmd; char right[20]; @@ -397,6 +589,7 @@ update_appointment_menu_items (gpointer user_data) { struct tm tmp_tm; DbusmenuMenuitem * item; + g_debug("Start Object"); ECalComponentVType vtype = e_cal_component_get_vtype (ecalcomp); // See above FIXME regarding query result @@ -415,7 +608,6 @@ update_appointment_menu_items (gpointer user_data) { dbusmenu_menuitem_property_set_bool (item, DBUSMENU_MENUITEM_PROP_ENABLED, TRUE); dbusmenu_menuitem_property_set_bool (item, DBUSMENU_MENUITEM_PROP_VISIBLE, TRUE); - g_debug("Start Object"); // Label text e_cal_component_get_summary (ecalcomp, &valuetext); summary = g_strdup (valuetext.value); @@ -437,10 +629,15 @@ update_appointment_menu_items (gpointer user_data) { continue; } + 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 = tzone; + appointment_zone = current_zone; } - tmp_tm = icaltimetype_to_tm_with_zone (datetime.value, appointment_zone, tzone); + // TODO: Convert the timezone into a 3 letter abbreviation if it's different to current_timezone + // TODO: Add the appointment timezone to the list if it's not already there. + + tmp_tm = icaltimetype_to_tm_with_zone (datetime.value, appointment_zone, current_zone); g_debug("Generate time string"); // Get today @@ -454,11 +651,15 @@ update_appointment_menu_items (gpointer user_data) { strftime(right, 20, "%a %l:%M %P", &tmp_tm); g_debug("Appointment time: %s", right); + g_debug("Appointment timezone: %s", datetime.tzid); + g_debug("Appointment timezone: %s", icaltimezone_get_tzid(appointment_zone)); // These two should be the same + //g_debug("Calendar timezone: %s", ecal_timezone); + dbusmenu_menuitem_property_set (item, APPOINTMENT_MENUITEM_PROP_RIGHT, right); e_cal_component_free_datetime (&datetime); - ad = is = isodate_from_time_t(mktime(&tmp_tm)); + ad = isodate_from_time_t(mktime(&tmp_tm)); // Now we pull out the URI for the calendar event and try to create a URI that'll work when we execute evolution // FIXME Because the URI stuff is really broken, we're going to open the calendar at todays date instead @@ -470,15 +671,18 @@ update_appointment_menu_items (gpointer user_data) { g_debug("Command to Execute: %s", cmd); - ESource *source = e_cal_get_source (ecal); + // FIXME This is now more difficult to get right with more sources, as we need to keep track + // of which ecal or source goes with each ECalComponent :/ + + //ESource *source = e_cal_get_source (ecal); //e_source_get_color (source, &source_color); api has been changed - const gchar *color_spec = e_source_peek_color_spec(source); - GdkColor color; + const gchar *color_spec = NULL; //e_source_peek_color_spec(source); g_debug("Colour to use: %s", color_spec); // Draw the correct icon for the appointment type and then tint it using mask fill. // For now we'll create a circle if (color_spec != NULL) { + GdkColor color; gdk_color_parse (color_spec, &color); cairo_surface_t *cs = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height); @@ -493,14 +697,14 @@ update_appointment_menu_items (gpointer user_data) { dbusmenu_menuitem_property_set_image (item, APPOINTMENT_MENUITEM_PROP_ICON, pixbuf); } - dbusmenu_menuitem_child_add_position (root, item, 4+i); + dbusmenu_menuitem_child_add_position (root, item, 3+i); appointments = g_list_append (appointments, item); // Keep track of the items here to make them east to remove g_debug("Adding appointment: %p", item); if (i == 4) break; // See above FIXME regarding query result limit i++; } - g_list_free(objects); + g_object_unref(allobjects); g_debug("End of objects"); return TRUE; } @@ -552,31 +756,31 @@ build_menus (DbusmenuMenuitem * root) g_idle_add(check_for_calendar, NULL); } - DbusmenuMenuitem * separator; - separator = dbusmenu_menuitem_new(); - dbusmenu_menuitem_property_set(separator, DBUSMENU_MENUITEM_PROP_TYPE, DBUSMENU_CLIENT_TYPES_SEPARATOR); - dbusmenu_menuitem_child_append(root, separator); - - add_appointment = dbusmenu_menuitem_new(); - dbusmenu_menuitem_property_set (add_appointment, DBUSMENU_MENUITEM_PROP_LABEL, _("Add Appointment")); - dbusmenu_menuitem_property_set_bool(add_appointment, DBUSMENU_MENUITEM_PROP_ENABLED, FALSE); - dbusmenu_menuitem_property_set_bool(add_appointment, DBUSMENU_MENUITEM_PROP_VISIBLE, TRUE); - g_signal_connect(G_OBJECT(add_appointment), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(activate_cb), "evolution -c calendar"); - dbusmenu_menuitem_child_add_position (root, add_appointment, 4); + locations_separator = dbusmenu_menuitem_new(); + dbusmenu_menuitem_property_set(locations_separator, DBUSMENU_MENUITEM_PROP_TYPE, DBUSMENU_CLIENT_TYPES_SEPARATOR); + dbusmenu_menuitem_property_set_bool (locations_separator, DBUSMENU_MENUITEM_PROP_VISIBLE, TRUE); + dbusmenu_menuitem_child_append(root, locations_separator); + + geo_location = dbusmenu_menuitem_new(); + dbusmenu_menuitem_property_set (geo_location, DBUSMENU_MENUITEM_PROP_TYPE, TIMEZONE_MENUITEM_TYPE); + dbusmenu_menuitem_property_set (geo_location, TIMEZONE_MENUITEM_PROP_ZONE, ""); + dbusmenu_menuitem_property_set_bool (geo_location, DBUSMENU_MENUITEM_PROP_ENABLED, FALSE); + dbusmenu_menuitem_property_set_bool (geo_location, DBUSMENU_MENUITEM_PROP_VISIBLE, TRUE); + g_signal_connect(G_OBJECT(geo_location), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(quick_set_tz), NULL); + dbusmenu_menuitem_child_append(root, geo_location); + + current_location = dbusmenu_menuitem_new(); + dbusmenu_menuitem_property_set (current_location, DBUSMENU_MENUITEM_PROP_TYPE, TIMEZONE_MENUITEM_TYPE); + dbusmenu_menuitem_property_set (current_location, TIMEZONE_MENUITEM_PROP_ZONE, ""); + dbusmenu_menuitem_property_set_bool (current_location, DBUSMENU_MENUITEM_PROP_ENABLED, FALSE); + dbusmenu_menuitem_property_set_bool (current_location, DBUSMENU_MENUITEM_PROP_VISIBLE, FALSE); + g_signal_connect(G_OBJECT(current_location), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(quick_set_tz), NULL); + dbusmenu_menuitem_child_append(root, current_location); - separator = dbusmenu_menuitem_new(); - dbusmenu_menuitem_property_set(separator, DBUSMENU_MENUITEM_PROP_TYPE, DBUSMENU_CLIENT_TYPES_SEPARATOR); - dbusmenu_menuitem_child_append(root, separator); - - tzchange = dbusmenu_menuitem_new(); - dbusmenu_menuitem_property_set(tzchange, DBUSMENU_MENUITEM_PROP_LABEL, "Set specific timezone"); - dbusmenu_menuitem_property_set_bool(tzchange, DBUSMENU_MENUITEM_PROP_VISIBLE, FALSE); - g_signal_connect(G_OBJECT(tzchange), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(quick_set_tz), NULL); - dbusmenu_menuitem_child_append(root, tzchange); check_timezone_sync(); - - separator = dbusmenu_menuitem_new(); + + DbusmenuMenuitem * separator = dbusmenu_menuitem_new(); dbusmenu_menuitem_property_set(separator, DBUSMENU_MENUITEM_PROP_TYPE, DBUSMENU_CLIENT_TYPES_SEPARATOR); dbusmenu_menuitem_child_append(root, separator); @@ -859,8 +1063,9 @@ main (int argc, char ** argv) bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR); textdomain (GETTEXT_PACKAGE); - /* Cache the timezone */ - update_current_timezone(); + /* Set up GSettings */ + conf = g_settings_new(SETTINGS_INTERFACE); + // TODO Add a signal handler to catch gsettings changes and respond to them /* Building the base menu */ server = dbusmenu_server_new(MENU_OBJ); @@ -868,6 +1073,9 @@ main (int argc, char ** argv) dbusmenu_server_set_root(server, root); build_menus(root); + + /* Cache the timezone */ + update_current_timezone(); /* Setup geoclue */ GeoclueMaster * master = geoclue_master_get_default(); @@ -885,14 +1093,15 @@ main (int argc, char ** argv) mainloop = g_main_loop_new(NULL, FALSE); g_main_loop_run(mainloop); - geo_address_clean(); - geo_client_clean(); - + g_object_unref(G_OBJECT(conf)); g_object_unref(G_OBJECT(master)); g_object_unref(G_OBJECT(dbus)); g_object_unref(G_OBJECT(service)); g_object_unref(G_OBJECT(server)); g_object_unref(G_OBJECT(root)); + geo_address_clean(); + geo_client_clean(); + return 0; } diff --git a/src/dbus-shared.h b/src/dbus-shared.h index d13cb32..bad8354 100644 --- a/src/dbus-shared.h +++ b/src/dbus-shared.h @@ -35,6 +35,5 @@ with this program. If not, see <http://www.gnu.org/licenses/>. #define APPOINTMENT_MENUITEM_PROP_RIGHT "appointment-time" #define TIMEZONE_MENUITEM_TYPE "timezone-item" -#define TIMEZONE_MENUITEM_PROP_LABEL "timezone-label" +#define TIMEZONE_MENUITEM_PROP_ZONE "timezone-zone" #define TIMEZONE_MENUITEM_PROP_RADIO "timezone-radio" -#define TIMEZONE_MENUITEM_PROP_RIGHT "timezone-time" diff --git a/src/indicator-datetime.c b/src/indicator-datetime.c index 1f61864..045ab78 100644 --- a/src/indicator-datetime.c +++ b/src/indicator-datetime.c @@ -89,6 +89,8 @@ struct _IndicatorDatetimePrivate { GDBusProxy * service_proxy; IdoCalendarMenuItem *ido_calendar; + GList * timezone_items; + GSettings * settings; }; @@ -105,7 +107,9 @@ enum { typedef struct _indicator_item_t indicator_item_t; struct _indicator_item_t { - GtkWidget * radio; + IndicatorDatetime * self; + DbusmenuMenuitem * mi; + GtkWidget * gmi; GtkWidget * icon; GtkWidget * label; GtkWidget * right; @@ -166,17 +170,19 @@ static void indicator_datetime_dispose (GObject *object); static void indicator_datetime_finalize (GObject *object); static GtkLabel * get_label (IndicatorObject * io); static GtkMenu * get_menu (IndicatorObject * io); +static const gchar * get_accessible_desc (IndicatorObject * io); static GVariant * bind_enum_set (const GValue * value, const GVariantType * type, gpointer user_data); static gboolean bind_enum_get (GValue * value, GVariant * variant, gpointer user_data); -static gchar * generate_format_string (IndicatorDatetime * self); -static struct tm * update_label (IndicatorDatetime * io); +static gchar * generate_format_string_now (IndicatorDatetime * self); +static gchar * generate_format_string_at_time (IndicatorDatetime * self, GDateTime * time); +static void update_label (IndicatorDatetime * io, GDateTime ** datetime); static void guess_label_size (IndicatorDatetime * self); -static void setup_timer (IndicatorDatetime * self, struct tm * ltime); +static void setup_timer (IndicatorDatetime * self, GDateTime * datetime); static void update_time (IndicatorDatetime * self); static void receive_signal (GDBusProxy * proxy, gchar * sender_name, gchar * signal_name, GVariant * parameters, gpointer user_data); static void service_proxy_cb (GObject * object, GAsyncResult * res, gpointer user_data); static gint generate_strftime_bitmask (const char *time_str); -static GSList *location_group = NULL; +static void timezone_update_labels (indicator_item_t * mi_data); /* Indicator Module Config */ INDICATOR_SET_VERSION @@ -203,6 +209,7 @@ indicator_datetime_class_init (IndicatorDatetimeClass *klass) io_class->get_label = get_label; io_class->get_menu = get_menu; + io_class->get_accessible_desc = get_accessible_desc; g_object_class_install_property (object_class, PROP_TIME_FORMAT, @@ -263,7 +270,7 @@ indicator_datetime_init (IndicatorDatetime *self) self->priv->custom_string = g_strdup(DEFAULT_TIME_FORMAT); self->priv->custom_show_seconds = FALSE; - self->priv->time_string = generate_format_string(self); + self->priv->time_string = generate_format_string_now(self); self->priv->service_proxy = NULL; @@ -460,6 +467,13 @@ bind_enum_get (GValue * value, GVariant * variant, gpointer user_data) return TRUE; } +static void +timezone_update_all_labels (IndicatorDatetime * self) +{ + IndicatorDatetimePrivate *priv = INDICATOR_DATETIME_GET_PRIVATE(self); + g_list_foreach(priv->timezone_items, (GFunc)timezone_update_labels, NULL); +} + /* Sets a property on the object */ static void set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) @@ -529,7 +543,7 @@ set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec } /* Get the new format string */ - gchar * newformat = generate_format_string(self); + gchar * newformat = generate_format_string_now(self); /* check to ensure the format really changed */ if (g_strcmp0(self->priv->time_string, newformat) == 0) { @@ -545,7 +559,8 @@ set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec self->priv->time_string = newformat; /* And update everything */ - update_label(self); + update_label(self, NULL); + timezone_update_all_labels(self); guess_label_size(self); return; @@ -603,54 +618,95 @@ idle_measure (gpointer data) return FALSE; } -/* Updates the label to be the current time. */ -static struct tm * -update_label (IndicatorDatetime * io) +/* Updates the accessible description */ +static void +update_accessible_description (IndicatorDatetime * io) { - IndicatorDatetime * self = INDICATOR_DATETIME(io); + GList * entries = indicator_object_get_entries(INDICATOR_OBJECT(io)); + IndicatorObjectEntry * entry = (IndicatorObjectEntry *)entries->data; - if (self->priv->label == NULL) return NULL; + entry->accessible_desc = get_accessible_desc(INDICATOR_OBJECT(io)); - gchar longstr[256]; - time_t t; - struct tm *ltime; - gboolean use_markup; + g_signal_emit(G_OBJECT(io), + INDICATOR_OBJECT_SIGNAL_ACCESSIBLE_DESC_UPDATE_ID, + 0, + entry, + TRUE); - t = time(NULL); - ltime = localtime(&t); - if (ltime == NULL) { - g_debug("Error getting local time"); - gtk_label_set_label(self->priv->label, _("Error getting time")); - return NULL; - } + g_list_free(entries); - strftime(longstr, 256, self->priv->time_string, ltime); - - gchar * utf8 = g_locale_to_utf8(longstr, -1, NULL, NULL, NULL); + return; +} - if (pango_parse_markup(utf8, -1, 0, NULL, NULL, NULL, NULL)) +/* Updates the label to be the current time. */ +static void +set_label_to_time_in_zone (IndicatorDatetime * self, GtkLabel * label, + GTimeZone * tz, const gchar * format, + GDateTime ** datetime) +{ + GDateTime * datetime_now; + if (tz == NULL) + datetime_now = g_date_time_new_now_local(); + else + datetime_now = g_date_time_new_now(tz); + + gchar * timestr; + if (format == NULL) { + gchar * format_for_time = generate_format_string_at_time(self, datetime_now); + timestr = g_date_time_format(datetime_now, format_for_time); + g_free(format_for_time); + } + else { + timestr = g_date_time_format(datetime_now, format); + } + + gboolean use_markup = FALSE; + if (pango_parse_markup(timestr, -1, 0, NULL, NULL, NULL, NULL)) use_markup = TRUE; if (use_markup) - gtk_label_set_markup(self->priv->label, utf8); + gtk_label_set_markup(label, timestr); else - gtk_label_set_text(self->priv->label, utf8); + gtk_label_set_text(label, timestr); + + g_free(timestr); - g_free(utf8); + if (datetime) + *datetime = datetime_now; + else + g_date_time_unref(datetime_now); + + return; +} + +/* Updates the label to be the current time. */ +static void +update_label (IndicatorDatetime * io, GDateTime ** datetime) +{ + IndicatorDatetime * self = INDICATOR_DATETIME(io); + + if (self->priv->label == NULL) return; + + set_label_to_time_in_zone(self, self->priv->label, NULL, self->priv->time_string, datetime); if (self->priv->idle_measure == 0) { self->priv->idle_measure = g_idle_add(idle_measure, io); } - return ltime; + update_accessible_description(io); + + return; } /* Update the time right now. Usually the result of a timezone switch. */ static void update_time (IndicatorDatetime * self) { - struct tm * ltime = update_label(self); - setup_timer(self, ltime); + GDateTime * dt; + update_label(self, &dt); + timezone_update_all_labels(self); + setup_timer(self, dt); + g_date_time_unref(dt); return; } @@ -674,15 +730,20 @@ timer_func (gpointer user_data) { IndicatorDatetime * self = INDICATOR_DATETIME(user_data); self->priv->timer = 0; - struct tm * ltime = update_label(self); - setup_timer(self, ltime); + GDateTime * dt; + update_label(self, &dt); + timezone_update_all_labels(self); + setup_timer(self, dt); + g_date_time_unref(dt); return FALSE; } /* Configure the timer to run the next time through */ static void -setup_timer (IndicatorDatetime * self, struct tm * ltime) +setup_timer (IndicatorDatetime * self, GDateTime * datetime) { + gboolean unref = FALSE; + if (self->priv->timer != 0) { g_source_remove(self->priv->timer); self->priv->timer = 0; @@ -692,14 +753,18 @@ setup_timer (IndicatorDatetime * self, struct tm * ltime) (self->priv->time_mode == SETTINGS_TIME_CUSTOM && self->priv->custom_show_seconds)) { self->priv->timer = g_timeout_add_seconds(1, timer_func, self); } else { - if (ltime == NULL) { - time_t t; - t = time(NULL); - ltime = localtime(&t); + if (datetime == NULL) { + datetime = g_date_time_new_now_local(); + unref = TRUE; } /* Plus 2 so we're just after the minute, don't want to be early. */ - self->priv->timer = g_timeout_add_seconds(60 - ltime->tm_sec + 2, timer_func, self); + gint seconds = (gint)g_date_time_get_seconds(datetime); + self->priv->timer = g_timeout_add_seconds(60 - seconds + 2, timer_func, self); + + if (unref) { + g_date_time_unref(datetime); + } } return; @@ -926,7 +991,8 @@ style_changed (GtkWidget * widget, GtkStyle * oldstyle, gpointer data) g_debug("New style for time label"); IndicatorDatetime * self = INDICATOR_DATETIME(data); guess_label_size(self); - update_label(self); + update_label(self, NULL); + timezone_update_all_labels(self); return; } @@ -1001,12 +1067,8 @@ update_text_gravity (GtkWidget *widget, GdkScreen *previous_screen, gpointer dat /* Tries to figure out what our format string should be. Lots of translator comments in here. */ static gchar * -generate_format_string (IndicatorDatetime * self) +generate_format_string_full (IndicatorDatetime * self, gboolean show_day, gboolean show_date) { - if (self->priv->time_mode == SETTINGS_TIME_CUSTOM) { - return g_strdup(self->priv->custom_string); - } - gboolean twelvehour = TRUE; if (self->priv->time_mode == SETTINGS_TIME_LOCALE) { @@ -1039,20 +1101,20 @@ generate_format_string (IndicatorDatetime * self) /* If there's no date or day let's just leave now and not worry about the rest of this code */ - if (!self->priv->show_date && !self->priv->show_day) { + if (!show_date && !show_day) { return g_strdup(time_string); } const gchar * date_string = NULL; - if (self->priv->show_date && self->priv->show_day) { + if (show_date && show_day) { /* TRANSLATORS: This is a format string passed to strftime to represent the day of the week, the month and the day of the month. */ date_string = T_("%a %b %e"); - } else if (self->priv->show_date) { + } else if (show_date) { /* TRANSLATORS: This is a format string passed to strftime to represent the month and the day of the month. */ date_string = T_("%b %e"); - } else if (self->priv->show_day) { + } else if (show_day) { /* TRANSLATORS: This is a format string passed to strftime to represent the day of the week. */ date_string = T_("%a"); @@ -1067,17 +1129,94 @@ generate_format_string (IndicatorDatetime * self) return g_strdup_printf(T_("%s, %s"), date_string, time_string); } +static gchar * +generate_format_string_now (IndicatorDatetime * self) +{ + if (self->priv->time_mode == SETTINGS_TIME_CUSTOM) { + return g_strdup(self->priv->custom_string); + } + else { + return generate_format_string_full(self, + self->priv->show_day, + self->priv->show_date); + } +} + +static gchar * +generate_format_string_at_time (IndicatorDatetime * self, GDateTime * time) +{ + /* This is a bit less free-form than for the main "now" time label. */ + /* If it is today, just the time should be shown (e.g. “3:55 PM”) + If it is a different day this week, the day and time should be shown (e.g. “Wed 3:55 PM”) + If it is after this week, the day, date, and time should be shown (e.g. “Wed 21 Apr 3:55 PM”). + In addition, when presenting the times of upcoming events, the time should be followed by the timezone if it is different from the one the computer is currently set to. For example, “Wed 3:55 PM UTC−5”. */ + gboolean show_day = FALSE; + gboolean show_date = FALSE; + + GDateTime * now = g_date_time_new_now_local(); + + /* First, are we same day? */ + gint time_year, time_month, time_day; + gint now_year, now_month, now_day; + g_date_time_get_ymd(time, &time_year, &time_month, &time_day); + g_date_time_get_ymd(now, &now_year, &now_month, &now_day); + + if (time_year != now_year || + time_month != now_month || + time_day != now_day) { + /* OK, different days so we must at least show the day. */ + show_day = TRUE; + + /* Is it this week? */ + /* Here, we define "is this week" as yesterday, today, or the next five days */ + GDateTime * past = g_date_time_add_days(now, -1); + GDateTime * future = g_date_time_add_days(now, 5); + GDateTime * past_bound = g_date_time_new_local(g_date_time_get_year(past), + g_date_time_get_month(past), + g_date_time_get_day_of_month(past), + 0, 0, 0.0); + GDateTime * future_bound = g_date_time_new_local(g_date_time_get_year(future), + g_date_time_get_month(future), + g_date_time_get_day_of_month(future), + 23, 59, 59.9); + if (g_date_time_compare(time, past_bound) < 0 || + g_date_time_compare(time, future_bound) > 0) { + show_date = TRUE; + } + g_date_time_unref(past); + g_date_time_unref(future); + g_date_time_unref(past_bound); + g_date_time_unref(future_bound); + } + + return generate_format_string_full(self, show_day, show_date); +} + +static void +timezone_update_labels (indicator_item_t * mi_data) +{ + const gchar * zone_name = dbusmenu_menuitem_property_get(mi_data->mi, TIMEZONE_MENUITEM_PROP_ZONE); + + /* TODO: Make zone name a little more user friendly */ + gtk_label_set_text(GTK_LABEL(mi_data->label), zone_name); + + /* Show current time in that zone on the right */ + GTimeZone * tz = g_time_zone_new(zone_name); + set_label_to_time_in_zone(mi_data->self, GTK_LABEL(mi_data->right), tz, NULL, NULL); + g_time_zone_unref(tz); +} + /* Whenever we have a property change on a DbusmenuMenuitem we need to be responsive to that. */ static void -indicator_prop_change_cb (DbusmenuMenuitem * mi, gchar * prop, gchar * value, indicator_item_t * mi_data) +indicator_prop_change_cb (DbusmenuMenuitem * mi, gchar * prop, GVariant *value, indicator_item_t * mi_data) { if (!g_strcmp0(prop, APPOINTMENT_MENUITEM_PROP_LABEL)) { /* Set the main label */ - gtk_label_set_text(GTK_LABEL(mi_data->label), value); + gtk_label_set_text(GTK_LABEL(mi_data->label), g_variant_get_string(value, NULL)); } else if (!g_strcmp0(prop, APPOINTMENT_MENUITEM_PROP_RIGHT)) { /* Set the right label */ - gtk_label_set_text(GTK_LABEL(mi_data->right), value); + gtk_label_set_text(GTK_LABEL(mi_data->right), g_variant_get_string(value, NULL)); } else if (!g_strcmp0(prop, APPOINTMENT_MENUITEM_PROP_ICON)) { /* We don't use the value here, which is probably less efficient, but it's easier to use the easy function. And since th value @@ -1106,6 +1245,10 @@ indicator_prop_change_cb (DbusmenuMenuitem * mi, gchar * prop, gchar * value, in g_object_unref(resized_pixbuf); } } + } else if (!g_strcmp0(prop, TIMEZONE_MENUITEM_PROP_ZONE)) { + timezone_update_labels(mi_data); + } else if (!g_strcmp0(prop, TIMEZONE_MENUITEM_PROP_RADIO)) { + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(mi_data->gmi), g_variant_get_boolean(value)); } else { g_warning("Indicator Item property '%s' unknown", prop); } @@ -1127,7 +1270,7 @@ new_appointment_item (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, Dbu indicator_item_t * mi_data = g_new0(indicator_item_t, 1); - GtkMenuItem * gmi = GTK_MENU_ITEM(gtk_menu_item_new()); + mi_data->gmi = gtk_menu_item_new(); GtkWidget * hbox = gtk_hbox_new(FALSE, 4); @@ -1178,10 +1321,10 @@ new_appointment_item (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, Dbu gtk_box_pack_start(GTK_BOX(hbox), mi_data->right, FALSE, FALSE, 0); gtk_widget_show(mi_data->right); - gtk_container_add(GTK_CONTAINER(gmi), hbox); + gtk_container_add(GTK_CONTAINER(mi_data->gmi), hbox); gtk_widget_show(hbox); - dbusmenu_gtkclient_newitem_base(DBUSMENU_GTKCLIENT(client), newitem, gmi, parent); + dbusmenu_gtkclient_newitem_base(DBUSMENU_GTKCLIENT(client), newitem, GTK_MENU_ITEM(mi_data->gmi), parent); g_signal_connect(G_OBJECT(newitem), DBUSMENU_MENUITEM_SIGNAL_PROPERTY_CHANGED, G_CALLBACK(indicator_prop_change_cb), mi_data); g_signal_connect_swapped(G_OBJECT(newitem), "destroyed", G_CALLBACK(g_free), mi_data); @@ -1217,6 +1360,24 @@ new_calendar_item (DbusmenuMenuitem * newitem, return TRUE; } +static void +timezone_toggled_cb (GtkCheckMenuItem *checkmenuitem, DbusmenuMenuitem * dbusitem) +{ + /* Make sure that the displayed radio-active setting is always + consistent with the dbus menuitem */ + gtk_check_menu_item_set_active(checkmenuitem, + dbusmenu_menuitem_property_get_bool(dbusitem, TIMEZONE_MENUITEM_PROP_RADIO)); +} + +static void +timezone_destroyed_cb (DbusmenuMenuitem * dbusitem, indicator_item_t * mi_data) +{ + IndicatorDatetimePrivate *priv = INDICATOR_DATETIME_GET_PRIVATE(mi_data->self); + priv->timezone_items = g_list_remove(priv->timezone_items, mi_data); + g_signal_handlers_disconnect_by_func(G_OBJECT(mi_data->gmi), G_CALLBACK(timezone_toggled_cb), dbusitem); + g_free(mi_data); +} + static gboolean new_timezone_item(DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, @@ -1227,44 +1388,54 @@ new_timezone_item(DbusmenuMenuitem * newitem, g_return_val_if_fail(DBUSMENU_IS_GTKCLIENT(client), FALSE); /* Note: not checking parent, it's reasonable for it to be NULL */ + IndicatorObject *io = g_object_get_data (G_OBJECT (client), "indicator"); + if (io == NULL) { + g_warning ("found no indicator to attach the timezone to"); + return FALSE; + } + + IndicatorDatetime *self = INDICATOR_DATETIME(io); + IndicatorDatetimePrivate *priv = INDICATOR_DATETIME_GET_PRIVATE(self); + // Menu item with a radio button and a right aligned time indicator_item_t * mi_data = g_new0(indicator_item_t, 1); - GtkMenuItem * gmi = GTK_MENU_ITEM(gtk_menu_item_new()); + priv->timezone_items = g_list_prepend(priv->timezone_items, mi_data); - GtkWidget * hbox = gtk_hbox_new(FALSE, 4); + mi_data->self = self; + mi_data->mi = newitem; + mi_data->gmi = gtk_check_menu_item_new(); - mi_data->radio = gtk_radio_button_new(location_group); - if (location_group == NULL) - location_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(mi_data->radio)); - - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(mi_data->radio), + gtk_check_menu_item_set_draw_as_radio(GTK_CHECK_MENU_ITEM(mi_data->gmi), TRUE); + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(mi_data->gmi), dbusmenu_menuitem_property_get_bool(newitem, TIMEZONE_MENUITEM_PROP_RADIO)); - - gtk_box_pack_start(GTK_BOX(hbox), mi_data->radio, FALSE, FALSE, 0); - gtk_widget_show(mi_data->radio); - + + GtkWidget * hbox = gtk_hbox_new(FALSE, 4); + /* Label, probably a username, chat room or mailbox name */ - mi_data->label = gtk_label_new(dbusmenu_menuitem_property_get(newitem, APPOINTMENT_MENUITEM_PROP_LABEL)); + mi_data->label = gtk_label_new(""); gtk_misc_set_alignment(GTK_MISC(mi_data->label), 0.0, 0.5); gtk_box_pack_start(GTK_BOX(hbox), mi_data->label, TRUE, TRUE, 0); gtk_widget_show(mi_data->label); /* Usually either the time or the count on the individual item. */ - mi_data->right = gtk_label_new(dbusmenu_menuitem_property_get(newitem, APPOINTMENT_MENUITEM_PROP_RIGHT)); + mi_data->right = gtk_label_new(""); gtk_size_group_add_widget(indicator_right_group, mi_data->right); gtk_misc_set_alignment(GTK_MISC(mi_data->right), 1.0, 0.5); gtk_box_pack_start(GTK_BOX(hbox), mi_data->right, FALSE, FALSE, 0); gtk_widget_show(mi_data->right); - gtk_container_add(GTK_CONTAINER(gmi), hbox); + timezone_update_labels(mi_data); + + gtk_container_add(GTK_CONTAINER(mi_data->gmi), hbox); gtk_widget_show(hbox); - dbusmenu_gtkclient_newitem_base(DBUSMENU_GTKCLIENT(client), newitem, gmi, parent); + dbusmenu_gtkclient_newitem_base(DBUSMENU_GTKCLIENT(client), newitem, GTK_MENU_ITEM(mi_data->gmi), parent); + g_signal_connect(G_OBJECT(mi_data->gmi), "toggled", G_CALLBACK(timezone_toggled_cb), newitem); g_signal_connect(G_OBJECT(newitem), DBUSMENU_MENUITEM_SIGNAL_PROPERTY_CHANGED, G_CALLBACK(indicator_prop_change_cb), mi_data); - g_signal_connect_swapped(G_OBJECT(newitem), "destroyed", G_CALLBACK(g_free), mi_data); + g_signal_connect(G_OBJECT(newitem), "destroyed", G_CALLBACK(timezone_destroyed_cb), mi_data); return TRUE; } @@ -1284,7 +1455,7 @@ get_label (IndicatorObject * io) g_signal_connect(G_OBJECT(self->priv->label), "style-set", G_CALLBACK(style_changed), self); g_signal_connect(G_OBJECT(self->priv->label), "screen-changed", G_CALLBACK(update_text_gravity), self); guess_label_size(self); - update_label(self); + update_label(self, NULL); gtk_widget_show(GTK_WIDGET(self->priv->label)); } @@ -1313,3 +1484,16 @@ get_menu (IndicatorObject * io) return GTK_MENU(self->priv->menu); } + +static const gchar * +get_accessible_desc (IndicatorObject * io) +{ + IndicatorDatetime * self = INDICATOR_DATETIME(io); + const gchar * name; + + if (self->priv->label != NULL) { + name = gtk_label_get_text(self->priv->label); + return name; + } + return NULL; +} |