Commit f6926402 authored by Alberts Muktupāvels's avatar Alberts Muktupāvels
Browse files

power-applet: add status icon

Thanks György Balló for initial version in javascript.

https://bugzilla.gnome.org/show_bug.cgi?id=753425
parent d3879669
......@@ -71,7 +71,7 @@ PKG_CHECK_MODULES(POLKIT, gtk+-3.0 >= $GTK_REQUIRED glib-2.0 >= $GLIB_REQUIRED p
AC_SUBST(POLKIT_CFLAGS)
AC_SUBST(POLKIT_LIBS)
PKG_CHECK_MODULES(POWER_APPLET, gtk+-3.0 >= $GTK_REQUIRED)
PKG_CHECK_MODULES(POWER_APPLET, gtk+-3.0 >= $GTK_REQUIRED upower-glib)
AC_SUBST(POWER_APPLET_CFLAGS)
AC_SUBST(POWER_APPLET_LIBS)
......
......@@ -17,23 +17,327 @@
#include "config.h"
#include <glib/gi18n.h>
#include <gtk/gtk.h>
#include <libupower-glib/upower.h>
#include <math.h>
#include "gf-power-applet.h"
#include "gf-upower-device.h"
#define UPOWER_DBUS_NAME "org.freedesktop.UPower"
#define UPOWER_DEVICE_DBUS_PATH "/org/freedesktop/UPower/devices/DisplayDevice"
struct _GfPowerApplet
{
GObject parent;
GObject parent;
GtkStatusIcon *status_icon;
GfUPowerDevice *device;
};
G_DEFINE_TYPE (GfPowerApplet, gf_power_applet, G_TYPE_OBJECT)
static void
statistics_cb (GtkMenuItem *item,
gpointer user_data)
{
GAppInfo *app_info;
GError *error;
error = NULL;
app_info = g_app_info_create_from_commandline ("gnome-power-statistics",
"Power Statistics",
G_APP_INFO_CREATE_NONE,
&error);
if (error != NULL)
{
g_warning ("Failed to crete GAppInfo from commandline - %s",
error->message);
g_error_free (error);
}
else
{
g_app_info_launch (app_info, NULL, NULL, &error);
if (error != NULL)
{
g_warning ("Failed to start Power Statistics - %s", error->message);
g_error_free (error);
}
}
g_clear_object (&app_info);
}
static void
settings_cb (GtkMenuItem *item,
gpointer user_data)
{
GAppInfo *app_info;
GError *error;
error = NULL;
app_info = g_app_info_create_from_commandline ("gnome-control-center power",
"Power Settings",
G_APP_INFO_CREATE_NONE,
&error);
if (error != NULL)
{
g_warning ("Failed to crete GAppInfo from commandline - %s",
error->message);
g_error_free (error);
}
else
{
g_app_info_launch (app_info, NULL, NULL, &error);
if (error != NULL)
{
g_warning ("Failed to start Power Settings - %s", error->message);
g_error_free (error);
}
}
g_clear_object (&app_info);
}
static void
popup_menu_cb (GtkStatusIcon *status_icon,
guint button,
guint activate_time,
gpointer user_data)
{
const gchar *title;
gchar *tooltip_text;
gchar *label;
GtkWidget *menu;
GtkWidget *item;
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
title = gtk_status_icon_get_title (status_icon);
tooltip_text = gtk_status_icon_get_tooltip_text (status_icon);
label = g_strdup_printf ("%s: %s", title, tooltip_text);
g_free (tooltip_text);
menu = gtk_menu_new ();
item = gtk_menu_item_new_with_label (label);
g_free (label);
gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
g_signal_connect (item, "activate", G_CALLBACK (statistics_cb), NULL);
item = gtk_menu_item_new_with_label (_("Power Settings"));
gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
g_signal_connect (item, "activate", G_CALLBACK (settings_cb), NULL);
gtk_widget_show_all (menu);
gtk_menu_popup (GTK_MENU (menu), NULL, NULL,
gtk_status_icon_position_menu, status_icon,
button, activate_time);
G_GNUC_END_IGNORE_DEPRECATIONS
}
static gchar *
get_icon_name (GfPowerApplet *applet)
{
gchar *icon_name;
gchar *symbolic;
icon_name = g_strdup (gf_upower_device_get_icon_name (applet->device));
if (icon_name == NULL || icon_name[0] == '\0')
{
g_free (icon_name);
return g_strdup ("battery");
}
symbolic = g_strrstr (icon_name, "-symbolic");
if (symbolic != NULL)
g_strlcpy (symbolic, "", sizeof (symbolic));
return icon_name;
}
static gchar *
get_tooltip_text (GfPowerApplet *applet)
{
UpDeviceState state;
gint64 seconds;
gdouble time;
gdouble minutes;
gdouble hours;
gdouble percentage;
state = gf_upower_device_get_state (applet->device);
if (state == UP_DEVICE_STATE_FULLY_CHARGED)
return g_strdup (_("Fully Charged"));
else if (state == UP_DEVICE_STATE_EMPTY)
return g_strdup (_("Empty"));
else if (state == UP_DEVICE_STATE_CHARGING)
seconds = gf_upower_device_get_time_to_full (applet->device);
else if (state == UP_DEVICE_STATE_DISCHARGING)
seconds = gf_upower_device_get_time_to_empty (applet->device);
else
return g_strdup (_("Estimating..."));
time = round (seconds / 60);
if (time == 0)
return g_strdup (_("Estimating..."));
minutes = fmod (time, 60);
hours = floor (time / 60);
percentage = gf_upower_device_get_percentage (applet->device);
if (state == UP_DEVICE_STATE_DISCHARGING)
{
/* Translators: this is <hours>:<minutes> Remaining (<percentage>) */
return g_strdup_printf (_("%.0f:%02.0f Remaining (%.0f%%)"),
hours, minutes, percentage);
}
if (state == UP_DEVICE_STATE_CHARGING)
{
/* Translators: this is <hours>:<minutes> Until Full (<percentage>) */
return g_strdup_printf (_("%.0f:%02.0f Remaining (%.0f%%)"),
hours, minutes, percentage);
}
return NULL;
}
static const gchar *
get_title (GfPowerApplet *applet)
{
UpDeviceKind type;
type = gf_upower_device_get_type_ (applet->device);
if (type == UP_DEVICE_KIND_UPS)
return _("UPS");
return _("Battery");
}
static void
gf_power_applet_sync (GfPowerApplet *applet)
{
gchar *icon_name;
gchar *tooltip_text;
const gchar *title;
gboolean is_present;
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
icon_name = get_icon_name (applet);
gtk_status_icon_set_from_icon_name (applet->status_icon, icon_name);
g_free (icon_name);
tooltip_text = get_tooltip_text (applet);
gtk_status_icon_set_tooltip_text (applet->status_icon, tooltip_text);
g_free (tooltip_text);
title = get_title (applet);
gtk_status_icon_set_title (applet->status_icon, title);
is_present = gf_upower_device_get_is_present (applet->device);
gtk_status_icon_set_visible (applet->status_icon, is_present);
G_GNUC_END_IGNORE_DEPRECATIONS
}
static void
properties_changed_cb (GDBusProxy *proxy,
GVariant *changed_properties,
GStrv invalidated_properties,
gpointer user_data)
{
GfPowerApplet *applet;
applet = GF_POWER_APPLET (user_data);
gf_power_applet_sync (applet);
}
static void
device_proxy_ready_cb (GObject *source_object,
GAsyncResult *res,
gpointer user_data)
{
GfPowerApplet *applet;
GError *error;
applet = GF_POWER_APPLET (user_data);
error = NULL;
applet->device = gf_upower_device_proxy_new_for_bus_finish (res, &error);
if (error != NULL)
{
g_warning ("Failed to get UPower device proxy - %s", error->message);
g_error_free (error);
return;
}
g_signal_connect (applet->device, "g-properties-changed",
G_CALLBACK (properties_changed_cb), applet);
gf_power_applet_sync (applet);
}
static void
gf_power_applet_dispose (GObject *object)
{
GfPowerApplet *applet;
applet = GF_POWER_APPLET (object);
g_clear_object (&applet->status_icon);
g_clear_object (&applet->device);
G_OBJECT_CLASS (gf_power_applet_parent_class)->dispose (object);
}
static void
gf_power_applet_class_init (GfPowerAppletClass *applet_class)
{
GObjectClass *object_class;
object_class = G_OBJECT_CLASS (applet_class);
object_class->dispose = gf_power_applet_dispose;
}
static void
gf_power_applet_init (GfPowerApplet *applet)
{
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
applet->status_icon = gtk_status_icon_new ();
gtk_status_icon_set_title (applet->status_icon, _("Power status"));
gtk_status_icon_set_tooltip_text (applet->status_icon, _("Power"));
G_GNUC_END_IGNORE_DEPRECATIONS
g_signal_connect (applet->status_icon, "popup-menu",
G_CALLBACK (popup_menu_cb), applet);
gf_upower_device_proxy_new_for_bus (G_BUS_TYPE_SYSTEM,
G_DBUS_PROXY_FLAGS_NONE,
UPOWER_DBUS_NAME,
UPOWER_DEVICE_DBUS_PATH,
NULL,
device_proxy_ready_cb,
applet);
}
GfPowerApplet *
......
......@@ -21,6 +21,7 @@ gnome-flashback/libpolkit/flashback-authenticator.c
gnome-flashback/libpolkit/flashback-listener.c
gnome-flashback/libpolkit/flashback-polkit-dialog.c
[type: gettext/glade]gnome-flashback/libpolkit/flashback-polkit-dialog.ui
gnome-flashback/libpower-applet/gf-power-applet.c
gnome-flashback/libsound-applet/gf-sound-applet.c
gnome-flashback/libsound-applet/gvc-channel-bar.c
gnome-flashback/libsound-applet/gvc/gvc-mixer-control.c
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment