diff options
-rw-r--r-- | configure.ac | 5 | ||||
-rw-r--r-- | src/Makefile.am | 2 | ||||
-rw-r--r-- | src/calendar-menu-item.c | 100 | ||||
-rw-r--r-- | src/calendar-menu-item.h | 59 | ||||
-rw-r--r-- | src/datetime-service.c | 4 | ||||
-rw-r--r-- | src/dbus-shared.h | 2 | ||||
-rw-r--r-- | src/indicator-datetime.c | 34 |
7 files changed, 203 insertions, 3 deletions
diff --git a/configure.ac b/configure.ac index f8997bf..2300d7f 100644 --- a/configure.ac +++ b/configure.ac @@ -35,11 +35,14 @@ PKG_PROG_PKG_CONFIG INDICATOR_REQUIRED_VERSION=0.3.0 DBUSMENUGLIB_REQUIRED_VERSION=0.1.1 DBUSMENUGTK_REQUIRED_VERSION=0.1.1 -GIO_REQUIRED_VERSION=2.25.0 +GIO_REQUIRED_VERSION=2.25.11 +# Note: the GIO check below also ensures the proper glib with gsettings support is present +INDICATOR_DISPLAY_OBJECTS=0.1.10 PKG_CHECK_MODULES(INDICATOR, indicator >= $INDICATOR_REQUIRED_VERSION dbusmenu-glib >= $DBUSMENUGLIB_REQUIRED_VERSION dbusmenu-gtk >= $DBUSMENUGTK_REQUIRED_VERSION + libido-0.1 >= $INDICATOR_DISPLAY_OBJECTS gio-2.0 >= $GIO_REQUIRED_VERSION) AC_SUBST(INDICATOR_CFLAGS) diff --git a/src/Makefile.am b/src/Makefile.am index fe3db2e..330f09d 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -2,6 +2,8 @@ libexec_PROGRAMS = indicator-datetime-service indicator_datetime_service_SOURCES = \ + calendar-menu-item.c \ + calendar-menu-item.h \ datetime-service.c \ dbus-shared.h indicator_datetime_service_CFLAGS = \ diff --git a/src/calendar-menu-item.c b/src/calendar-menu-item.c new file mode 100644 index 0000000..c2ceec3 --- /dev/null +++ b/src/calendar-menu-item.c @@ -0,0 +1,100 @@ +/* +Calendar menu item dbusmenu "transport" for the corresponding IDO widget. + +Copyright 2010 Canonical Ltd. + +Authors: + David Barth <david.barth@canonical.com> + +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/>. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <gdk/gdk.h> +#include <glib/gi18n.h> +#include "calendar-menu-item.h" + +#include "dbus-shared.h" + +#include <libdbusmenu-glib/client.h> +#include <libdbusmenu-glib/server.h> +#include <libdbusmenu-glib/menuitem.h> + +enum { + LAST_SIGNAL +}; + +/* static guint signals[LAST_SIGNAL] = { }; */ + +typedef struct _CalendarMenuItemPrivate CalendarMenuItemPrivate; +struct _CalendarMenuItemPrivate +{ + void * placeholder; +}; + +#define CALENDAR_MENU_ITEM_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), CALENDAR_MENU_ITEM_TYPE, CalendarMenuItemPrivate)) + +/* Prototypes */ +static void calendar_menu_item_class_init (CalendarMenuItemClass *klass); +static void calendar_menu_item_init (CalendarMenuItem *self); +static void calendar_menu_item_dispose (GObject *object); +static void calendar_menu_item_finalize (GObject *object); + +G_DEFINE_TYPE (CalendarMenuItem, calendar_menu_item, DBUSMENU_TYPE_MENUITEM); + +static void +calendar_menu_item_class_init (CalendarMenuItemClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + g_type_class_add_private (klass, sizeof (CalendarMenuItemPrivate)); + + object_class->dispose = calendar_menu_item_dispose; + object_class->finalize = calendar_menu_item_finalize; + + return; +} + +static void +calendar_menu_item_init (CalendarMenuItem *self) +{ + return; +} + +static void +calendar_menu_item_dispose (GObject *object) +{ + G_OBJECT_CLASS (calendar_menu_item_parent_class)->dispose (object); +} + +static void +calendar_menu_item_finalize (GObject *object) +{ + G_OBJECT_CLASS (calendar_menu_item_parent_class)->finalize (object); + + return; +} + +CalendarMenuItem * +calendar_menu_item_new () +{ + CalendarMenuItem * self = g_object_new(CALENDAR_MENU_ITEM_TYPE, NULL); + + dbusmenu_menuitem_property_set(DBUSMENU_MENUITEM(self), DBUSMENU_MENUITEM_PROP_TYPE, DBUSMENU_CALENDAR_MENUITEM_TYPE); + + return self; +} + diff --git a/src/calendar-menu-item.h b/src/calendar-menu-item.h new file mode 100644 index 0000000..7a56f96 --- /dev/null +++ b/src/calendar-menu-item.h @@ -0,0 +1,59 @@ +/* +Calendar menu item dbusmenu "transport" for the corresponding IDO widget. + +Copyright 2010 Canonical Ltd. + +Authors: + David Barth <david.barth@canonical.com> + +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/>. +*/ + +#ifndef __CALENDAR_MENU_ITEM_H__ +#define __CALENDAR_MENU_ITEM_H__ + +#include <glib.h> +#include <glib-object.h> + +#include <libdbusmenu-glib/menuitem.h> + +G_BEGIN_DECLS + +#define CALENDAR_MENU_ITEM_TYPE (calendar_menu_item_get_type ()) +#define CALENDAR_MENU_ITEM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CALENDAR_MENU_ITEM_TYPE, CalendarMenuItem)) +#define CALENDAR_MENU_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CALENDAR_MENU_ITEM_TYPE, CalendarMenuItemClass)) +#define IS_CALENDAR_MENU_ITEM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CALENDAR_MENU_ITEM_TYPE)) +#define IS_CALENDAR_MENU_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CALENDAR_MENU_ITEM_TYPE)) +#define CALENDAR_MENU_ITEM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CALENDAR_MENU_ITEM_TYPE, CalendarMenuItemClass)) + +#define CALENDAR_MENU_ITEM_SIGNAL_ACTIVATE "activate" +#define CALENDAR_MENUITEM_PROP_TEXT "text" + +typedef struct _CalendarMenuItem CalendarMenuItem; +typedef struct _CalendarMenuItemClass CalendarMenuItemClass; + +struct _CalendarMenuItemClass { + DbusmenuMenuitemClass parent_class; +}; + +struct _CalendarMenuItem { + DbusmenuMenuitem parent; +}; + +GType calendar_menu_item_get_type (void); +CalendarMenuItem * calendar_menu_item_new (); + +G_END_DECLS + +#endif /* __CALENDAR_MENU_ITEM_H__ */ + diff --git a/src/datetime-service.c b/src/datetime-service.c index 2137065..57dcc5e 100644 --- a/src/datetime-service.c +++ b/src/datetime-service.c @@ -141,7 +141,7 @@ build_menus (DbusmenuMenuitem * root) if (calendar == NULL) { calendar = dbusmenu_menuitem_new(); - dbusmenu_menuitem_property_set (calendar, DBUSMENU_MENUITEM_PROP_LABEL, _("Open Calendar")); + dbusmenu_menuitem_property_set (calendar, DBUSMENU_MENUITEM_PROP_TYPE, DBUSMENU_CALENDAR_MENUITEM_TYPE); /* 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, @@ -156,7 +156,7 @@ build_menus (DbusmenuMenuitem * root) dbusmenu_menuitem_child_append(root, separator); settings = dbusmenu_menuitem_new(); - dbusmenu_menuitem_property_set (settings, DBUSMENU_MENUITEM_PROP_LABEL, _("Set Time and Date...")); + dbusmenu_menuitem_property_set (settings, DBUSMENU_MENUITEM_PROP_LABEL, _("Time & Date Settings...")); /* 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"); diff --git a/src/dbus-shared.h b/src/dbus-shared.h index aa6d933..d943cb0 100644 --- a/src/dbus-shared.h +++ b/src/dbus-shared.h @@ -27,3 +27,5 @@ with this program. If not, see <http://www.gnu.org/licenses/>. #define MENU_OBJ "/org/ayatana/indicator/datetime/menu" +#define DBUSMENU_CALENDAR_MENUITEM_TYPE "x-canonical-calendar-item" + diff --git a/src/indicator-datetime.c b/src/indicator-datetime.c index 7034fb8..e1f6571 100644 --- a/src/indicator-datetime.c +++ b/src/indicator-datetime.c @@ -36,6 +36,7 @@ with this program. If not, see <http://www.gnu.org/licenses/>. /* DBusMenu */ #include <libdbusmenu-gtk/menu.h> +#include <libido/idocalendarmenuitem.h> #include "dbus-shared.h" @@ -78,6 +79,8 @@ struct _IndicatorDatetimePrivate { IndicatorServiceManager * sm; DbusmenuGtkMenu * menu; + IdoCalendarMenuItem *ido_calendar; + GSettings * settings; }; @@ -882,6 +885,32 @@ generate_format_string (IndicatorDatetime * self) return g_strdup_printf(_("%s, %s"), date_string, time_string); } +static gboolean +new_calendar_item (DbusmenuMenuitem * newitem, + DbusmenuMenuitem * parent, + DbusmenuClient * client) +{ + g_return_val_if_fail(DBUSMENU_IS_MENUITEM(newitem), FALSE); + 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 caledar to"); + return FALSE; + } + + IndicatorDatetime *self = INDICATOR_DATETIME(io); + self->priv = INDICATOR_DATETIME_GET_PRIVATE(self); + + IdoCalendarMenuItem *ido = IDO_CALENDAR_MENU_ITEM (ido_calendar_menu_item_new ()); + self->priv->ido_calendar = ido; + + dbusmenu_gtkclient_newitem_base(DBUSMENU_GTKCLIENT(client), newitem, GTK_MENU_ITEM(ido), parent); + + return TRUE; +} + /* Grabs the label. Creates it if it doesn't exist already */ static GtkLabel * @@ -915,5 +944,10 @@ get_menu (IndicatorObject * io) self->priv->menu = dbusmenu_gtkmenu_new(SERVICE_NAME, MENU_OBJ); } + DbusmenuGtkClient *client = dbusmenu_gtkmenu_get_client(self->priv->menu); + g_object_set_data (G_OBJECT (client), "indicator", io); + + dbusmenu_client_add_type_handler(DBUSMENU_CLIENT(client), DBUSMENU_CALENDAR_MENUITEM_TYPE, new_calendar_item); + return GTK_MENU(self->priv->menu); } |