From c6c11566d4b2424163b2996dbec64aea572ec73c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Jard=C3=B3n?= Date: Mon, 27 Jun 2011 03:32:11 +0100 Subject: Implement skeleton of indicator-power --- src/dbus-shared-names.h | 35 +++++++++ src/indicator-power.c | 203 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 238 insertions(+) create mode 100644 src/dbus-shared-names.h (limited to 'src') diff --git a/src/dbus-shared-names.h b/src/dbus-shared-names.h new file mode 100644 index 0000000..8401083 --- /dev/null +++ b/src/dbus-shared-names.h @@ -0,0 +1,35 @@ +/* +A small wrapper utility to load indicators and put them as menu items +into the gnome-panel using it's applet interface. + +Copyright 2010 Codethink Ltd. + +Authors: + Javier Jardon + +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 __DBUS_SHARED_NAMES_H__ +#define __DBUS_SHARED_NAMES_H__ 1 + +#define INDICATOR_POWER_DBUS_NAME "com.canonical.indicator.power" +#define INDICATOR_POWER_DBUS_VERSION 1 +#define INDICATOR_POWER_DBUS_OBJECT "/com/canonical/indicator/power/menu" +#define INDICATOR_POWER_SERVICE_DBUS_OBJECT "/com/canonical/indicator/power/service" +#define INDICATOR_POWER_SERVICE_DBUS_INTERFACE "com.canonical.indicator.power.service" + + +#endif /* __DBUS_SHARED_NAMES_H__ */ + diff --git a/src/indicator-power.c b/src/indicator-power.c index 2d18827..0ff2ad9 100644 --- a/src/indicator-power.c +++ b/src/indicator-power.c @@ -33,6 +33,7 @@ with this program. If not, see . #include #include #include +#include /* DBusMenu */ #include @@ -43,3 +44,205 @@ with this program. If not, see . #include #include #endif + +#include "dbus-shared-names.h" + +#define DEFAULT_ICON "battery" + +#define INDICATOR_POWER_TYPE (indicator_power_get_type ()) +#define INDICATOR_POWER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), INDICATOR_POWER_TYPE, IndicatorPower)) +#define INDICATOR_POWER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), INDICATOR_POWER_TYPE, IndicatorPowerClass)) +#define IS_INDICATOR_POWER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), INDICATOR_POWER_TYPE)) +#define IS_INDICATOR_POWER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), INDICATOR_POWER_TYPE)) +#define INDICATOR_POWER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), INDICATOR_POWER_TYPE, IndicatorPowerClass)) + +typedef struct _IndicatorPower IndicatorPower; +typedef struct _IndicatorPowerClass IndicatorPowerClass; +typedef struct _IndicatorPowerPrivate IndicatorPowerPrivate; + +struct _IndicatorPower +{ + IndicatorObject parent_instance; + + IndicatorPowerPrivate *priv; +}; + +struct _IndicatorPowerClass +{ + IndicatorObjectClass parent_class; +}; + +GType indicator_power_get_type (void) G_GNUC_CONST; + + +struct _IndicatorPowerPrivate +{ + IndicatorServiceManager *service; + + DbusmenuGtkMenu *menu; + DbusmenuGtkClient *client; + + GtkLabel *label; + GtkImage *status_image; + + GCancellable *status_proxy_cancel; + GDBusProxy *status_proxy; + IdoCalendarMenuItem *ido_entry; +}; + +/* Prototypes */ +static void indicator_power_class_init (IndicatorPowerClass *klass); +static void indicator_power_init (IndicatorPower *self); +static void indicator_power_dispose (GObject *object); +static void indicator_power_finalize (GObject *object); + +static GtkLabel* get_label (IndicatorObject * io); +static GtkImage* get_image (IndicatorObject * io); +static GtkMenu* get_menu (IndicatorObject * io); +static const gchar* get_accessible_desc (IndicatorObject * io); + + +G_DEFINE_TYPE (IndicatorPower, indicator_power, INDICATOR_OBJECT_TYPE); + + +/* Indicator stuff */ +INDICATOR_SET_VERSION +INDICATOR_SET_TYPE (INDICATOR_POWER_TYPE) + + +static void +indicator_power_class_init (IndicatorPowerClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + IndicatorObjectClass *io_class = INDICATOR_OBJECT_CLASS (klass); + + object_class->dispose = indicator_power_dispose; + object_class->finalize = indicator_power_finalize; + + io_class->get_label = get_label; + io_class->get_image = get_image; + io_class->get_menu = get_menu; + io_class->get_accessible_desc = get_accessible_desc; + + g_type_class_add_private (klass, sizeof (IndicatorPowerPrivate)); +} + +static void +indicator_power_init (IndicatorPower *self) +{ + IndicatorPowerPrivate *priv; + + self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, + INDICATOR_POWER_TYPE, + IndicatorPowerPrivate); + priv = self->priv; + + /* Init variables */ + priv->service = NULL; + priv->menu = NULL; + priv->client = NULL; + + /* Do stuff with them */ + priv->service = indicator_service_manager_new_version (INDICATOR_POWER_DBUS_NAME, + INDICATOR_POWER_DBUS_VERSION); +/* + g_signal_connect (G_OBJECT (priv->service), + INDICATOR_SERVICE_MANAGER_SIGNAL_CONNECTION_CHANGE, + G_CALLBACK (connection_changed), + self); +*/ + + /* Builds the dbusmenu for the service. */ + priv->menu = dbusmenu_gtkmenu_new (INDICATOR_POWER_DBUS_NAME, + INDICATOR_POWER_DBUS_OBJECT); + priv->client = dbusmenu_gtkmenu_get_client (priv->menu); + +/* + dbusmenu_client_add_type_handler (DBUSMENU_CLIENT (client), + DBUSMENU_ENTRY_MENUITEM_TYPE, + new_entry_item); +*/ +} + +static void +indicator_power_dispose (GObject *object) +{ + IndicatorPower *self = INDICATOR_POWER (object); + IndicatorPowerPrivate *priv = self->priv; + + if (priv->service != NULL) + { + g_object_unref (G_OBJECT (priv->service)); + priv->service = NULL; + } + + G_OBJECT_CLASS (indicator_power_parent_class)->dispose (object); +} + +static void +indicator_power_finalize (GObject *object) +{ + G_OBJECT_CLASS (indicator_power_parent_class)->finalize (object); +} + + + + +/* Grabs the label. Creates it if it doesn't + exist already */ +static GtkLabel * +get_label (IndicatorObject *io) +{ + IndicatorPower *self = INDICATOR_POWER (io); + IndicatorPowerPrivate *priv = self->priv; + + if (priv->label == NULL) + { + /* Create the label if it doesn't exist already */ + priv->label = GTK_LABEL (gtk_label_new ("Power")); + } + + return priv->label; +} + +static GtkImage * +get_image (IndicatorObject *io) +{ + IndicatorPower *self = INDICATOR_POWER (io); + IndicatorPowerPrivate *priv = self->priv; + + if (priv->status_image == NULL) + { + /* Will create the status icon if it doesn't exist already */ + priv->status_image = indicator_image_helper (DEFAULT_ICON "-panel"); + gtk_widget_show (GTK_WIDGET (priv->status_image)); + } + + return priv->status_image; +} + +static GtkMenu * +get_menu (IndicatorObject *io) +{ + IndicatorPower *self = INDICATOR_POWER (io); + IndicatorPowerPrivate *priv = self->priv; + + return GTK_MENU (priv->menu); +} + +static const gchar * +get_accessible_desc (IndicatorObject *io) +{ + IndicatorPower *self = INDICATOR_POWER (io); + IndicatorPowerPrivate *priv = self->priv; + const gchar *name; + + if (priv->label == NULL) + { + name = gtk_label_get_text (priv->label); + + return name; + } + + return NULL; +} -- cgit v1.2.3