summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--panel-plugins/power-manager-plugin/power-manager-button.c99
-rw-r--r--src/xfpm-inhibit.c16
-rw-r--r--src/xfpm-inhibit.h5
3 files changed, 118 insertions, 2 deletions
diff --git a/panel-plugins/power-manager-plugin/power-manager-button.c b/panel-plugins/power-manager-plugin/power-manager-button.c
index 5135ba45..4fea515e 100644
--- a/panel-plugins/power-manager-plugin/power-manager-button.c
+++ b/panel-plugins/power-manager-plugin/power-manager-button.c
@@ -61,6 +61,8 @@ struct PowerManagerButtonPrivate
UpClient *upower;
+ GDBusProxy *inhibit_proxy;
+
/* A list of BatteryDevices */
GList *devices;
@@ -936,6 +938,23 @@ power_manager_button_init (PowerManagerButton *button)
button->priv->channel = xfconf_channel_get ("xfce4-power-manager");
}
+ button->priv->inhibit_proxy = g_dbus_proxy_new_sync (g_bus_get_sync (G_BUS_TYPE_SESSION,
+ NULL,
+ NULL),
+ G_DBUS_PROXY_FLAGS_NONE,
+ NULL,
+ "org.freedesktop.PowerManagement",
+ "/org/freedesktop/PowerManagement/Inhibit",
+ "org.freedesktop.PowerManagement.Inhibit",
+ NULL,
+ &error);
+
+ if (error != NULL)
+ {
+ g_warning ("error getting inhibit proxy: %s", error->message);
+ g_clear_error (&error);
+ }
+
/* Sane defaults for the systray and panel icon */
#ifdef XFCE_PLUGIN
button->priv->panel_icon_name = g_strdup (PANEL_DEFAULT_ICON_SYMBOLIC);
@@ -1303,6 +1322,83 @@ G_GNUC_END_IGNORE_DEPRECATIONS
}
static void
+display_inhibitors (PowerManagerButton *button, GtkWidget *menu)
+{
+ gboolean needs_seperator = FALSE;
+
+ g_return_if_fail (POWER_MANAGER_IS_BUTTON (button));
+ g_return_if_fail (GTK_IS_MENU (menu));
+
+ if (button->priv->inhibit_proxy)
+ {
+ GVariant *reply;
+ GError *error = NULL;
+
+ reply = g_dbus_proxy_call_sync (button->priv->inhibit_proxy,
+ "GetInhibitors",
+ g_variant_new ("()"),
+ G_DBUS_CALL_FLAGS_NONE,
+ 1000,
+ NULL,
+ &error);
+
+ if (reply != NULL)
+ {
+ GVariantIter *iter;
+ gchar *value;
+ GtkWidget *inhibit_mi;
+
+ g_variant_get (reply, "(as)", &iter);
+
+ if (g_variant_iter_n_children (iter) > 0)
+ {
+ needs_seperator = TRUE;
+ }
+
+ /* Add the list of programs to the menu */
+ while (g_variant_iter_next (iter, "s", &value))
+ {
+ GtkWidget *mi, *img;
+
+ /* Translators this is to display which app is inhibiting
+ * power in the plugin menu. Example:
+ * VLC is currently inhibiting power management
+ */
+ gchar *label = g_strdup_printf (_("%s is currently inhibiting power management"), value);
+
+G_GNUC_BEGIN_IGNORE_DEPRECATIONS
+ mi = gtk_image_menu_item_new_with_label(label);
+G_GNUC_END_IGNORE_DEPRECATIONS
+ /* add the image */
+ img = gtk_image_new_from_icon_name ("gtk-info", GTK_ICON_SIZE_MENU);
+G_GNUC_BEGIN_IGNORE_DEPRECATIONS
+ gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(mi), img);
+G_GNUC_END_IGNORE_DEPRECATIONS
+
+ gtk_widget_set_can_focus (mi, FALSE);
+ gtk_widget_show (mi);
+ gtk_menu_shell_append (GTK_MENU_SHELL(button->priv->menu), mi);
+ g_free (label);
+ }
+ g_variant_iter_free (iter);
+ g_variant_unref (reply);
+
+ } else {
+ g_warning ("failed calling GetInhibitors: %s", error->message);
+ g_clear_error (&error);
+ }
+
+ if (needs_seperator)
+ {
+ /* add a separator */
+ GtkWidget * separator_mi = gtk_separator_menu_item_new ();
+ gtk_widget_show (separator_mi);
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), separator_mi);
+ }
+
+ }
+}
+static void
decrease_brightness (PowerManagerButton *button)
{
gint32 level;
@@ -1492,6 +1588,9 @@ G_GNUC_END_IGNORE_DEPRECATIONS
PROPERTIES_PREFIX PRESENTATION_MODE,
G_TYPE_BOOLEAN, G_OBJECT(mi), "active");
+ /* Show any applications currently inhibiting now */
+ display_inhibitors (button, menu);
+
/* Power manager settings */
mi = gtk_menu_item_new_with_mnemonic (_("_Power manager settings..."));
gtk_widget_show (mi);
diff --git a/src/xfpm-inhibit.c b/src/xfpm-inhibit.c
index b8440411..a4ef3863 100644
--- a/src/xfpm-inhibit.c
+++ b/src/xfpm-inhibit.c
@@ -65,6 +65,7 @@ typedef struct
enum
{
HAS_INHIBIT_CHANGED,
+ INHIBIT_LIST_CHANGED,
LAST_SIGNAL
};
@@ -99,7 +100,11 @@ xfpm_inhibit_has_inhibit_changed (XfpmInhibit *inhibit)
inhibit->priv->inhibited = TRUE;
g_signal_emit (G_OBJECT(inhibit), signals[HAS_INHIBIT_CHANGED], 0, inhibit->priv->inhibited);
}
-
+
+ /* Always emite the INHIBIT_LIST_CHANGED for any change so the panel plugin
+ * stays in sync */
+ g_signal_emit (G_OBJECT(inhibit), signals[INHIBIT_LIST_CHANGED], 0, inhibit->priv->inhibited);
+
return inhibit->priv->inhibited;
}
@@ -218,6 +223,15 @@ xfpm_inhibit_class_init(XfpmInhibitClass *klass)
g_cclosure_marshal_VOID__BOOLEAN,
G_TYPE_NONE, 1, G_TYPE_BOOLEAN);
+ signals[INHIBIT_LIST_CHANGED] =
+ g_signal_new ("inhibitors-list-changed",
+ XFPM_TYPE_INHIBIT,
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET(XfpmInhibitClass, inhibitors_list_changed),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__BOOLEAN,
+ G_TYPE_NONE, 1, G_TYPE_BOOLEAN);
+
object_class->finalize = xfpm_inhibit_finalize;
g_type_class_add_private (klass, sizeof (XfpmInhibitPrivate));
diff --git a/src/xfpm-inhibit.h b/src/xfpm-inhibit.h
index 5b66fc04..7ad5f9e0 100644
--- a/src/xfpm-inhibit.h
+++ b/src/xfpm-inhibit.h
@@ -41,9 +41,12 @@ typedef struct
typedef struct
{
GObjectClass parent_class;
-
+
+ /* signals */
void (*has_inhibit_changed) (XfpmInhibit *inhibit,
gboolean is_inhibit);
+ void (*inhibitors_list_changed) (XfpmInhibit *inhibit,
+ gboolean is_inhibit);
} XfpmInhibitClass;