← Back to team overview

ayatana-commits team mailing list archive

[Merge] lp:~ted/indicator-datetime/service-based into lp:indicator-datetime

 

Ted Gould has proposed merging lp:~ted/indicator-datetime/service-based into lp:indicator-datetime.

Requested reviews:
  Indicator Applet Developers (indicator-applet-developers)


This migrates the currently limited functionality of the datetime indicator to being a service based limited functionality solution.  Which sounds silly, but provides a platform for further expansion.
-- 
https://code.launchpad.net/~ted/indicator-datetime/service-based/+merge/29743
Your team ayatana-commits is subscribed to branch lp:indicator-datetime.
=== modified file '.bzrignore'
--- .bzrignore	2010-02-22 15:40:26 +0000
+++ .bzrignore	2010-07-12 20:36:44 +0000
@@ -5,3 +5,4 @@
 src/indicator-datetime-service
 po/indicator-datetime.pot
 indicator-datetime-[0-9].[0-9].[0-9].tar.gz
+data/indicator-datetime.service

=== modified file 'configure.ac'
--- configure.ac	2010-06-03 17:28:15 +0000
+++ configure.ac	2010-07-12 20:36:44 +0000
@@ -34,9 +34,11 @@
 
 INDICATOR_REQUIRED_VERSION=0.3.0
 DBUSMENUGLIB_REQUIRED_VERSION=0.1.1
+DBUSMENUGTK_REQUIRED_VERSION=0.1.1
 
 PKG_CHECK_MODULES(INDICATOR, indicator >= $INDICATOR_REQUIRED_VERSION
-                             dbusmenu-glib >= $DBUSMENUGLIB_REQUIRED_VERSION)
+                             dbusmenu-glib >= $DBUSMENUGLIB_REQUIRED_VERSION
+                             dbusmenu-gtk >= $DBUSMENUGTK_REQUIRED_VERSION)
 
 AC_SUBST(INDICATOR_CFLAGS)
 AC_SUBST(INDICATOR_LIBS)

=== modified file 'data/Makefile.am'
--- data/Makefile.am	2010-01-05 04:32:37 +0000
+++ data/Makefile.am	2010-07-12 20:36:44 +0000
@@ -0,0 +1,11 @@
+#SUBDIRS = icons
+
+dbus_servicesdir = $(DBUSSERVICEDIR)
+dbus_services_DATA = indicator-datetime.service
+
+%.service: %.service.in
+	sed -e "s|\@libexecdir\@|$(libexecdir)|" $< > $@
+
+EXTRA_DIST = indicator-datetime.service.in
+
+CLEANFILES = indicator-datetime.service

=== added file 'data/indicator-datetime.service.in'
--- data/indicator-datetime.service.in	1970-01-01 00:00:00 +0000
+++ data/indicator-datetime.service.in	2010-07-12 20:36:44 +0000
@@ -0,0 +1,3 @@
+[D-BUS Service]
+Name=org.ayatana.indicator.datetime
+Exec=@libexecdir@/indicator-datetime-service

=== modified file 'src/Makefile.am'
--- src/Makefile.am	2010-02-22 15:40:26 +0000
+++ src/Makefile.am	2010-07-12 20:36:44 +0000
@@ -2,7 +2,8 @@
 libexec_PROGRAMS = indicator-datetime-service
 
 indicator_datetime_service_SOURCES = \
-	datetime-service.c
+	datetime-service.c \
+	dbus-shared.h
 indicator_datetime_service_CFLAGS = \
 	-Wall \
 	-Werror \
@@ -13,6 +14,7 @@
 datetimelibdir = $(INDICATORDIR)
 datetimelib_LTLIBRARIES = libdatetime.la
 libdatetime_la_SOURCES = \
+	dbus-shared.h \
 	indicator-datetime.c
 libdatetime_la_CFLAGS = \
 	$(INDICATOR_CFLAGS) \

=== modified file 'src/datetime-service.c'
--- src/datetime-service.c	2010-06-03 16:04:43 +0000
+++ src/datetime-service.c	2010-07-12 20:36:44 +0000
@@ -1,3 +1,4 @@
+<<<<<<< TREE
 /*
 An indicator to time and date related information in the menubar.
 
@@ -19,9 +20,214 @@
 with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
+=======
+/*
+An indicator to show date and time information.
+
+Copyright 2010 Canonical Ltd.
+
+Authors:
+    Ted Gould <ted@xxxxxxxxxxxxx>
+
+This program is free software: you can redistribute it and/or modify it 
+under the terms of the GNU General Public License version 3, as published 
+by the Free Software Foundation.
+
+This program is distributed in the hope that it will be useful, but 
+WITHOUT ANY WARRANTY; without even the implied warranties of 
+MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR 
+PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along 
+with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <config.h>
+#include <libindicator/indicator-service.h>
+
+#include <glib/gi18n.h>
+
+#include <libdbusmenu-glib/server.h>
+#include <libdbusmenu-glib/client.h>
+#include <libdbusmenu-glib/menuitem.h>
+
+#include "dbus-shared.h"
+
+static IndicatorService * service = NULL;
+static GMainLoop * mainloop = NULL;
+static DbusmenuServer * server = NULL;
+static DbusmenuMenuitem * root = NULL;
+
+/* Global Items */
+static DbusmenuMenuitem * date = NULL;
+static DbusmenuMenuitem * calendar = NULL;
+static DbusmenuMenuitem * settings = NULL;
+
+/* Updates the label in the date menuitem */
+static gboolean
+update_datetime (gpointer user_data)
+{
+	g_debug("Updating Date/Time");
+
+	gchar longstr[128];
+	time_t t;
+	struct tm *ltime;
+
+	t = time(NULL);
+	ltime = localtime(&t);
+	if (ltime == NULL) {
+		g_warning("Error getting local time");
+		dbusmenu_menuitem_property_set(date, DBUSMENU_MENUITEM_PROP_LABEL, _("Error getting time"));
+		return FALSE;
+	}
+
+	/* Note: may require some localization tweaks */
+	strftime(longstr, 128, "%A, %e %B %Y", ltime);
+	
+	gchar * utf8 = g_locale_to_utf8(longstr, -1, NULL, NULL, NULL);
+	dbusmenu_menuitem_property_set(date, DBUSMENU_MENUITEM_PROP_LABEL, utf8);
+	g_free(utf8);
+
+	return FALSE;
+}
+
+/* Run a particular program based on an activation */
+static void
+activate_cb (DbusmenuMenuitem * menuitem, guint timestamp, const gchar *command)
+{
+	GError * error = NULL;
+
+	g_debug("Issuing command '%s'", command);
+	if (!g_spawn_command_line_async(command, &error)) {
+		g_warning("Unable to start %s: %s", (char *)command, error->message);
+		g_error_free(error);
+	}
+}
+
+/* Looks for the calendar application and enables the item if
+   we have one */
+static gboolean
+check_for_calendar (gpointer user_data)
+{
+	g_return_val_if_fail (calendar != NULL, FALSE);
+
+	gchar *evo = g_find_program_in_path("evolution");
+	if (evo != NULL) {
+		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);
+		g_free(evo);
+	} else {
+		g_debug("Unable to find calendar app.");
+		dbusmenu_menuitem_property_set_bool(calendar, DBUSMENU_MENUITEM_PROP_VISIBLE, FALSE);
+	}
+
+	return FALSE;
+}
+
+/* Looks for the time and date admin application and enables the
+   item we have one */
+static gboolean
+check_for_timeadmin (gpointer user_data)
+{
+	g_return_val_if_fail (settings != NULL, FALSE);
+
+	gchar * timeadmin = g_find_program_in_path("time-admin");
+	if (timeadmin != NULL) {
+		g_debug("Found the time-admin application: %s", timeadmin);
+		dbusmenu_menuitem_property_set_bool(settings, DBUSMENU_MENUITEM_PROP_ENABLED, TRUE);
+		g_free(timeadmin);
+	} else {
+		g_debug("Unable to find time-admin app.");
+		dbusmenu_menuitem_property_set_bool(settings, DBUSMENU_MENUITEM_PROP_ENABLED, FALSE);
+	}
+
+	return FALSE;
+}
+
+/* Does the work to build the default menu, really calls out
+   to other functions but this is the core to clean up the
+   main function. */
+static void
+build_menus (DbusmenuMenuitem * root)
+{
+	g_debug("Building Menus.");
+	if (date == NULL) {
+		date = dbusmenu_menuitem_new();
+		dbusmenu_menuitem_property_set     (date, DBUSMENU_MENUITEM_PROP_LABEL, _("No date yet..."));
+		dbusmenu_menuitem_property_set_bool(date, DBUSMENU_MENUITEM_PROP_ENABLED, FALSE);
+		dbusmenu_menuitem_child_append(root, date);
+
+		g_idle_add(update_datetime, NULL);
+		/* TODO: Set up updating daily */
+	}
+
+	if (calendar == NULL) {
+		calendar = dbusmenu_menuitem_new();
+		dbusmenu_menuitem_property_set     (calendar, DBUSMENU_MENUITEM_PROP_LABEL, _("Open Calendar"));
+		/* insensitive until we check for available apps */
+		dbusmenu_menuitem_property_set_bool(calendar, DBUSMENU_MENUITEM_PROP_ENABLED, FALSE);
+		g_signal_connect (G_OBJECT(calendar), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED,
+						  G_CALLBACK (activate_cb), "evolution -c calendar");
+		dbusmenu_menuitem_child_append(root, calendar);
+
+		g_idle_add(check_for_calendar, NULL);
+	}
+
+	DbusmenuMenuitem * separator = dbusmenu_menuitem_new();
+	dbusmenu_menuitem_property_set(separator, DBUSMENU_MENUITEM_PROP_TYPE, DBUSMENU_CLIENT_TYPES_SEPARATOR);
+	dbusmenu_menuitem_child_append(root, separator);
+
+	settings = dbusmenu_menuitem_new();
+	dbusmenu_menuitem_property_set     (settings, DBUSMENU_MENUITEM_PROP_LABEL, _("Set Time and Date..."));
+	/* insensitive until we check for available apps */
+	dbusmenu_menuitem_property_set_bool(settings, DBUSMENU_MENUITEM_PROP_ENABLED, FALSE);
+	g_signal_connect(G_OBJECT(settings), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(activate_cb), "time-admin");
+	dbusmenu_menuitem_child_append(root, settings);
+	g_idle_add(check_for_timeadmin, NULL);
+
+	return;
+}
+
+/* Repsonds to the service object saying it's time to shutdown.
+   It stops the mainloop. */
+static void 
+service_shutdown (IndicatorService * service, gpointer user_data)
+{
+	g_warning("Shutting down service!");
+	g_main_loop_quit(mainloop);
+	return;
+}
+
+/* Function to build everything up.  Entry point from asm. */
+>>>>>>> MERGE-SOURCE
 int
 main (int argc, char ** argv)
 {
+	g_type_init();
+
+	/* Acknowledging the service init and setting up the interface */
+	service = indicator_service_new_version(SERVICE_NAME, SERVICE_VERSION);
+	g_signal_connect(service, INDICATOR_SERVICE_SIGNAL_SHUTDOWN, G_CALLBACK(service_shutdown), NULL);
+
+	/* Setting up i18n and gettext.  Apparently, we need
+	   all of these. */
+	setlocale (LC_ALL, "");
+	bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR);
+	textdomain (GETTEXT_PACKAGE);
+
+	/* Building the base menu */
+	server = dbusmenu_server_new(MENU_OBJ);
+	root = dbusmenu_menuitem_new();
+	dbusmenu_server_set_root(server, root);
+	build_menus(root);
+
+	mainloop = g_main_loop_new(NULL, FALSE);
+	g_main_loop_run(mainloop);
+
+	g_object_unref(G_OBJECT(service));
+	g_object_unref(G_OBJECT(server));
+	g_object_unref(G_OBJECT(root));
 
 	return 0;
 }

=== added file 'src/dbus-shared.h'
--- src/dbus-shared.h	1970-01-01 00:00:00 +0000
+++ src/dbus-shared.h	2010-07-12 20:36:44 +0000
@@ -0,0 +1,29 @@
+/*
+An indicator to show date and time information.
+
+Copyright 2010 Canonical Ltd.
+
+Authors:
+    Ted Gould <ted@xxxxxxxxxxxxx>
+
+This program is free software: you can redistribute it and/or modify it 
+under the terms of the GNU General Public License version 3, as published 
+by the Free Software Foundation.
+
+This program is distributed in the hope that it will be useful, but 
+WITHOUT ANY WARRANTY; without even the implied warranties of 
+MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR 
+PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along 
+with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+
+#define  SERVICE_NAME   "org.ayatana.indicator.datetime"
+#define  SERVICE_IFACE  "org.ayatana.indicator.datetime.service"
+#define  SERVICE_OBJ   "/org/ayatana/indicator/datetime/service"
+#define  SERVICE_VERSION  1
+
+#define  MENU_OBJ      "/org/ayatana/indicator/datetime/menu"
+

=== modified file 'src/indicator-datetime.c'
--- src/indicator-datetime.c	2010-06-03 16:04:43 +0000
+++ src/indicator-datetime.c	2010-07-12 20:36:44 +0000
@@ -1,3 +1,4 @@
+<<<<<<< TREE
 /*
 An indicator to time and date related information in the menubar.
 
@@ -19,6 +20,29 @@
 with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
+=======
+/*
+An indicator to show date and time information.
+
+Copyright 2010 Canonical Ltd.
+
+Authors:
+    Ted Gould <ted@xxxxxxxxxxxxx>
+
+This program is free software: you can redistribute it and/or modify it 
+under the terms of the GNU General Public License version 3, as published 
+by the Free Software Foundation.
+
+This program is distributed in the hope that it will be useful, but 
+WITHOUT ANY WARRANTY; without even the implied warranties of 
+MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR 
+PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along 
+with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+>>>>>>> MERGE-SOURCE
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
@@ -31,6 +55,12 @@
 /* Indicator Stuff */
 #include <libindicator/indicator.h>
 #include <libindicator/indicator-object.h>
+#include <libindicator/indicator-service-manager.h>
+
+/* DBusMenu */
+#include <libdbusmenu-gtk/menu.h>
+
+#include "dbus-shared.h"
 
 
 #define INDICATOR_DATETIME_TYPE            (indicator_datetime_get_type ())
@@ -55,12 +85,13 @@
 
 struct _IndicatorDatetimePrivate {
 	GtkLabel * label;
-	GtkMenuItem * date;
-	GtkMenuItem * calendar;
 	guint timer;
 
 	guint idle_measure;
 	gint  max_width;
+
+	IndicatorServiceManager * sm;
+	DbusmenuGtkMenu * menu;
 };
 
 #define INDICATOR_DATETIME_GET_PRIVATE(o) \
@@ -105,13 +136,16 @@
 	self->priv = INDICATOR_DATETIME_GET_PRIVATE(self);
 
 	self->priv->label = NULL;
-	self->priv->date = NULL;
-	self->priv->calendar = NULL;
 	self->priv->timer = 0;
 
 	self->priv->idle_measure = 0;
 	self->priv->max_width = 0;
 
+	self->priv->sm = NULL;
+	self->priv->menu = NULL;
+
+	self->priv->sm = indicator_service_manager_new_version(SERVICE_NAME, SERVICE_VERSION);
+
 	return;
 }
 
@@ -125,16 +159,6 @@
 		self->priv->label = NULL;
 	}
 
-	if (self->priv->date != NULL) {
-		g_object_unref(self->priv->date);
-		self->priv->date = NULL;
-	}
-
-	if (self->priv->calendar != NULL) {
-		g_object_unref(self->priv->calendar);
-		self->priv->calendar = NULL;
-	}
-
 	if (self->priv->timer != 0) {
 		g_source_remove(self->priv->timer);
 		self->priv->timer = 0;
@@ -145,6 +169,16 @@
 		self->priv->idle_measure = 0;
 	}
 
+	if (self->priv->menu != NULL) {
+		g_object_unref(G_OBJECT(self->priv->menu));
+		self->priv->menu = NULL;
+	}
+
+	if (self->priv->sm != NULL) {
+		g_object_unref(G_OBJECT(self->priv->sm));
+		self->priv->sm = NULL;
+	}
+
 	G_OBJECT_CLASS (indicator_datetime_parent_class)->dispose (object);
 	return;
 }
@@ -209,15 +243,6 @@
 		self->priv->idle_measure = g_idle_add(idle_measure, io);
 	}
 
-	if (self->priv->date == NULL) return;
-
-	/* Note: may require some localization tweaks */
-	strftime(longstr, 128, "%A, %e %B %Y", ltime);
-	
-	utf8 = g_locale_to_utf8(longstr, -1, NULL, NULL, NULL);
-	gtk_menu_item_set_label(self->priv->date, utf8);
-	g_free(utf8);
-
 	return;
 }
 
@@ -238,17 +263,6 @@
 	return FALSE;
 }
 
-static void
-activate_cb (GtkWidget *widget, const gchar *command)
-{
-	GError * error = NULL;
-
-	if (!g_spawn_command_line_async(command, &error)) {
-		g_warning("Unable to start %s: %s", (char *)command, error->message);
-		g_error_free(error);
-	}
-}
-
 /* Does a quick meausre of how big the string is in
    pixels with a Pango layout */
 static gint
@@ -332,65 +346,14 @@
 	return self->priv->label;
 }
 
-static void
-check_for_calendar_application (IndicatorDatetime * self)
-{
-	GtkMenuItem * item = self->priv->calendar;
-	g_return_if_fail (item != NULL);
-
-	gchar *evo = g_find_program_in_path("evolution");
-	if (evo != NULL) {
-		g_signal_connect (GTK_MENU_ITEM (item), "activate",
-						  G_CALLBACK (activate_cb), "evolution -c calendar");
-		gtk_widget_set_sensitive (GTK_WIDGET (item), TRUE);
-		gtk_widget_show(GTK_WIDGET(item));
-		g_free(evo);
-	} else {
-		gtk_widget_hide(GTK_WIDGET(item));
-	}
-}
-
 static GtkMenu *
 get_menu (IndicatorObject * io)
 {
 	IndicatorDatetime * self = INDICATOR_DATETIME(io);
 
-	GtkWidget * menu = NULL;
-	GtkWidget * item = NULL;
-
-	menu = gtk_menu_new();
-	
-	if (self->priv->date == NULL) {
-		item = gtk_menu_item_new_with_label("No date yet...");
-		gtk_widget_set_sensitive (GTK_WIDGET (item), FALSE);
-		gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
-		self->priv->date = GTK_MENU_ITEM (item);
-		update_label(self);
-	}
-
-	if (self->priv->calendar == NULL) {
-		item = gtk_menu_item_new_with_label(_("Open Calendar"));
-		/* insensitive until we check for available apps */
-		gtk_widget_set_sensitive (GTK_WIDGET (item), FALSE);
-		gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
-		self->priv->calendar = GTK_MENU_ITEM (item);
-	}
- 
-	gtk_menu_shell_append (GTK_MENU_SHELL (menu),
-						   gtk_separator_menu_item_new ());
-
-	GtkWidget *settings_mi = gtk_menu_item_new_with_label (_("Set Time and Date..."));
-	g_signal_connect (GTK_MENU_ITEM (settings_mi), "activate",
-					  G_CALLBACK (activate_cb), "time-admin");
-	gtk_menu_shell_append (GTK_MENU_SHELL(menu), settings_mi);
-	gtk_widget_show(settings_mi);
-
-	/* show_all to reveal the separator */
-	gtk_widget_show_all(menu);
-
-	/* Note: maybe should move that to an idle loop if that helps with
-	   boot performance	*/
-	check_for_calendar_application (self);
-
-	return GTK_MENU(menu);
+	if (self->priv->menu == NULL) {
+		self->priv->menu = dbusmenu_gtkmenu_new(SERVICE_NAME, MENU_OBJ);
+	}
+
+	return GTK_MENU(self->priv->menu);
 }


Follow ups