From f1e5569348a935def97ed99708864aa6b8096d5e Mon Sep 17 00:00:00 2001 From: David Barth Date: Thu, 22 Jul 2010 21:13:36 +0200 Subject: add a calendar widget to the menu --- src/Makefile.am | 2 + src/calendar-menu-item.c | 100 +++++++++++++++++++++++++++++++++++++++++++++++ src/calendar-menu-item.h | 59 ++++++++++++++++++++++++++++ src/datetime-service.c | 3 +- src/dbus-shared.h | 2 + src/indicator-datetime.c | 34 ++++++++++++++++ 6 files changed, 199 insertions(+), 1 deletion(-) create mode 100644 src/calendar-menu-item.c create mode 100644 src/calendar-menu-item.h 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 + +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 . +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include "calendar-menu-item.h" + +#include "dbus-shared.h" + +#include +#include +#include + +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 + +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 . +*/ + +#ifndef __CALENDAR_MENU_ITEM_H__ +#define __CALENDAR_MENU_ITEM_H__ + +#include +#include + +#include + +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..5c7b76f 100644 --- a/src/datetime-service.c +++ b/src/datetime-service.c @@ -141,7 +141,8 @@ 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_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, 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 . #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 . /* DBusMenu */ #include +#include #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); } -- cgit v1.2.3