aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/datetime-service.c80
-rw-r--r--src/dbus-shared.h13
-rw-r--r--src/indicator-datetime.c1
3 files changed, 48 insertions, 46 deletions
diff --git a/src/datetime-service.c b/src/datetime-service.c
index e06b76d..020371f 100644
--- a/src/datetime-service.c
+++ b/src/datetime-service.c
@@ -23,6 +23,7 @@ with this program. If not, see <http://www.gnu.org/licenses/>.
#include <libindicator/indicator-service.h>
#include <locale.h>
+#include <gtk/gtk.h>
#include <glib/gi18n.h>
#include <gio/gio.h>
@@ -36,11 +37,9 @@ with this program. If not, see <http://www.gnu.org/licenses/>.
#include <time.h>
#include <libecal/e-cal.h>
#include <libical/ical.h>
-#include <e-util/e-time-utils.h>
#include <libecal/e-cal-time-util.h>
#include <libedataserver/e-source.h>
// Other users of ecal seem to also include these, not sure why they should be included by the above
-#include <libecal/e-cal-time-util.h>
#include <libical/icaltime.h>
@@ -66,7 +65,7 @@ static DbusmenuMenuitem * settings = NULL;
static DbusmenuMenuitem * tzchange = NULL;
static GList * appointments = NULL;
static ECal * ecal = NULL;
-static gchar * ecal_timezone = NULL;
+static const gchar * ecal_timezone = NULL;
/* Geoclue trackers */
static GeoclueMasterClient * geo_master = NULL;
@@ -240,14 +239,8 @@ check_for_calendar (gpointer user_data)
}
static gboolean
-timezone_clicked_cb() {
-
- return FALSE;
-}
-
-static gboolean
update_timezone_menu_items(gpointer user_data) {
-
+ // Get the location preferences and the current location, highlight the current location somehow
return FALSE;
}
@@ -261,6 +254,7 @@ update_appointment_menu_items (gpointer user_data) {
// 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;
+ icaltimezone *tzone;
gchar *query, *is, *ie;
GList *objects = NULL, *l;
GError *gerror = NULL;
@@ -268,7 +262,8 @@ update_appointment_menu_items (gpointer user_data) {
gint i;
gint width, height;
- ecal = e_cal_new_system_calendar();
+ if (!ecal)
+ ecal = e_cal_new_system_calendar();
if (!ecal) {
g_debug("e_cal_new_system_calendar failed");
@@ -282,7 +277,7 @@ update_appointment_menu_items (gpointer user_data) {
return FALSE;
}
- if (!e_cal_get_timezone(ecal, "UTC", &tzone, &gerror) {
+ if (!e_cal_get_timezone(ecal, "UTC", &tzone, &gerror)) {
g_debug("failed to get time zone\n");
g_free(ecal);
ecal = NULL;
@@ -305,22 +300,20 @@ update_appointment_menu_items (gpointer user_data) {
// FIXME can we put a limit on the number of results? Or if not complete, or is event/todo?
query = g_strdup_printf("(occur-in-time-range? (make-time\"%s\") (make-time\"%s\"))", is, ie);
- if (!e_cal_get_object_list_as_comp(ecal, query, &objects, &gerror);) {
+ 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;
}
gtk_icon_size_lookup(GTK_ICON_SIZE_MENU, &width, &height);
-
if (appointments != NULL) {
for (l = appointments; l; l = l->next) {
item = l->data;
- // TODO: Remove all the existing menu items which are in appointments.
-
- // pop it out of the dbus menu
- // remove it from the appointments glist
- // free it
+ // Remove all the existing menu items which are in appointments.
+ dbusmenu_menuitem_child_delete(root, DBUSMENU_MENUITEM(item));
+ appointments = g_list_remove(appointments, item);
+ g_free(item);
}
appointments = NULL;
}
@@ -330,14 +323,13 @@ update_appointment_menu_items (gpointer user_data) {
ECalComponent *ecalcomp = l->data;
ECalComponentText valuetext;
ECalComponentDateTime datetime;
- icaltimezone *appointment_zone;
- time_t appointment_time, ti;
+ icaltimezone *appointment_zone = NULL;
icalproperty_status status;
gchar *summary, right[20], *cmd;
const gchar *uri;
- struct tm *tmp_tm, *tm_today;
-
- vtype = e_cal_component_get_vtype (comp);
+ struct tm tmp_tm;
+
+ ECalComponentVType vtype = e_cal_component_get_vtype (ecalcomp);
// See above FIXME regarding query result
// If it's not an event or todo, continue no-increment
@@ -352,15 +344,16 @@ update_appointment_menu_items (gpointer user_data) {
// INPROGRESS: Create a menu item for each of them, try to include helpful metadata e.g. colours, due time
item = dbusmenu_menuitem_new();
- dbusmenu_menuitem_property_set (item, "type", INDICATOR_MENUITEM_TYPE);
+ dbusmenu_menuitem_property_set (item, "type", APPOINTMENT_MENUITEM_TYPE);
dbusmenu_menuitem_property_set_bool (item, DBUSMENU_MENUITEM_PROP_ENABLED, TRUE);
dbusmenu_menuitem_property_set_bool (item, DBUSMENU_MENUITEM_PROP_VISIBLE, TRUE);
// Label text
e_cal_component_get_summary (ecalcomp, &valuetext);
summary = g_strdup (valuetext.value);
- e_cal_component_free_text (&valuetext);
+
dbusmenu_menuitem_property_set (item, APPOINTMENT_MENUITEM_PROP_LABEL, summary);
+
g_free (summary);
// Due text
@@ -369,23 +362,26 @@ update_appointment_menu_items (gpointer user_data) {
else
e_cal_component_get_due (ecalcomp, &datetime);
- if (datetime.value) {
- appointment_zone = get_zone_from_tzid (client, datetime.tzid);
- if (!appointment_zone || datetime.value->is_date)
- appointment_zone = ecal_timezone;
- appointment_time = icaltime_as_timet_with_zone (*datetime.value, appointment_zone);
+ // FIXME need to get the timezone of the above datetime,
+ // and get the icaltimezone of the geoclue timezone/selected timezone (whichever is preferred)
+ if (!datetime.value) {
+ g_free(item);
+ continue;
}
+
+ if (!appointment_zone || datetime.value->is_date) { // If it's today put in the current timezone?
+ appointment_zone = tzone;
+ }
+ tmp_tm = icaltimetype_to_tm_with_zone (datetime.value, appointment_zone, tzone);
+
e_cal_component_free_datetime (&datetime);
- tmp_tm = convert_timet_to_struct_tm (appointment_time, appointment_zone);
// Get today
- time(&ti);
- tm_today = convert_timet_to_struct_tm (ti, appointment_zone);
- if (tm_today->mday == tmp_tm->mday && tm_today->mon == tmp_tm->mon && tm_today->year == tmp_tm->year)
- strftime(&right, sizeof(right), "%X", tmp_tm);
+ if (datetime.value->is_date)
+ strftime(right, sizeof(right), "%X", &tmp_tm);
else
- strftime(&right, sizeof(right), "%a %X", tmp_tm);
- dbusmenu_menuitem_property_set (item, APPOINTMENT_MENUITEM_PROP_RIGHT, &right);
+ strftime(right, sizeof(right), "%a %X", &tmp_tm);
+ dbusmenu_menuitem_property_set (item, APPOINTMENT_MENUITEM_PROP_RIGHT, right);
// Now we pull out the URI for the calendar event and try to create a URI that'll work when we execute evolution
e_cal_component_get_url(ecalcomp, &uri);
@@ -395,12 +391,13 @@ update_appointment_menu_items (gpointer user_data) {
// Get the colour E_CAL_COMPONENT_FIELD_COLOR
// Get the icon, either EVENT or MEMO or TODO?
- gdouble red, blue, green;
+ /*gdouble red, blue, green;
ECalSource *source = e_cal_get_source (ecalcomp->client);
if (!ecalcomp->color && e_source_get_color (source, &source_color)) {
g_free (comp_data->color);
ecalcomp->color = g_strdup_printf ("#%06x", source_color & 0xffffff);
- }
+ }*/
+
//cairo_surface_t *cs = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height);
//cairo_t *cr = cairo_create(cs);
@@ -412,7 +409,7 @@ update_appointment_menu_items (gpointer user_data) {
//dbusmenu_menuitem_property_set_image (item, APPOINTMENT_MENUITEM_PROP_ICON, pixbuf);
dbusmenu_menuitem_child_append (root, item);
- appointments = g_list_append(appointments, item); // Keep track of the items here to make them east to remove
+ appointments = g_list_append (appointments, item); // Keep track of the items here to make them east to remove
if (i == 4) break; // See above FIXME regarding query result limit
i++;
@@ -487,7 +484,6 @@ build_menus (DbusmenuMenuitem * root)
dbusmenu_menuitem_child_append(root, separator);
update_timezone_menu_items(NULL);
- // TODO Create "detected location" menu item? (defaults to the geoclue location)
// TODO Create "Add location" menu item
separator = dbusmenu_menuitem_new();
diff --git a/src/dbus-shared.h b/src/dbus-shared.h
index 4ecd64b..1f90ca7 100644
--- a/src/dbus-shared.h
+++ b/src/dbus-shared.h
@@ -29,7 +29,12 @@ with this program. If not, see <http://www.gnu.org/licenses/>.
#define DBUSMENU_CALENDAR_MENUITEM_TYPE "x-canonical-calendar-item"
-#define APPOINTMENT_MENUITEM_TYPE "indicator-item"
-#define APPOINTMENT_MENUITEM_PROP_LABEL "indicator-label"
-#define APPOINTMENT_MENUITEM_PROP_ICON "indicator-icon"
-#define APPOINTMENT_MENUITEM_PROP_RIGHT "right-side-text"
+#define APPOINTMENT_MENUITEM_TYPE "appointment-item"
+#define APPOINTMENT_MENUITEM_PROP_LABEL "appointment-label"
+#define APPOINTMENT_MENUITEM_PROP_ICON "appointment-icon"
+#define APPOINTMENT_MENUITEM_PROP_RIGHT "appointment-time"
+
+#define TIMEZONE_MENUITEM_TYPE "timezone-item"
+#define TIMEZONE_MENUITEM_PROP_LABEL "timezone-label"
+#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 5d92296..a07e667 100644
--- a/src/indicator-datetime.c
+++ b/src/indicator-datetime.c
@@ -1263,6 +1263,7 @@ get_menu (IndicatorObject * io)
dbusmenu_client_add_type_handler(DBUSMENU_CLIENT(client), DBUSMENU_CALENDAR_MENUITEM_TYPE, new_calendar_item);
dbusmenu_client_add_type_handler(DBUSMENU_CLIENT(client), APPOINTMENT_MENUITEM_TYPE, new_appointment_item);
+ dbusmenu_client_add_type_handler(DBUSMENU_CLIENT(client), TIMEZONE_MENUITEM_TYPE, new_timezone_item);
return GTK_MENU(self->priv->menu);
}