[Xfce4-commits] [xfce/xfce4-power-manager] 26/64: Menu adds/removes devices when they change
noreply at xfce.org
noreply at xfce.org
Mon May 26 06:00:21 CEST 2014
This is an automated email from the git hooks/post-receive script.
eric pushed a commit to branch master
in repository xfce/xfce4-power-manager.
commit 67f49d64b96716ef2f817d11813e9e45683100a4
Author: Eric Koegel <eric.koegel at gmail.com>
Date: Sun May 4 07:23:58 2014 +0300
Menu adds/removes devices when they change
---
panel-plugins/battery/battery-button.c | 115 ++++++++++++++++++++++++++------
1 file changed, 95 insertions(+), 20 deletions(-)
diff --git a/panel-plugins/battery/battery-button.c b/panel-plugins/battery/battery-button.c
index 055b4be..5169526 100644
--- a/panel-plugins/battery/battery-button.c
+++ b/panel-plugins/battery/battery-button.c
@@ -38,13 +38,6 @@
#include "battery-button.h"
-static void battery_button_finalize (GObject *object);
-static gchar* get_device_description (UpClient *upower, UpDevice *device);
-static GList* find_device_in_list (BatteryButton *button, const gchar *object_path);
-static gboolean battery_button_set_icon (BatteryButton *button);
-static void battery_button_clicked (GtkButton *b);
-static void battery_button_show_menu (BatteryButton *button);
-
#define BATTERY_BUTTON_GET_PRIVATE(o) \
(G_TYPE_INSTANCE_GET_PRIVATE ((o), BATTERY_TYPE_BUTTON, BatteryButtonPrivate))
@@ -57,6 +50,9 @@ struct BatteryButtonPrivate
/* A list of BatteryDevices */
GList *devices;
+ /* The left-click popup menu, if one is being displayed */
+ GtkWidget *menu;
+
/* The actual panel icon image */
GtkWidget *panel_icon_image;
/* Keep track of icon name to redisplay during size changes */
@@ -78,10 +74,20 @@ typedef struct
gchar *object_path; /* UpDevice object path */
UpDevice *device; /* Pointer to the UpDevice */
gulong signal_id; /* device changed callback id */
+ GtkWidget *menu_item; /* The device's item on the menu (if shown) */
} BatteryDevice;
G_DEFINE_TYPE (BatteryButton, battery_button, GTK_TYPE_BUTTON)
+static void battery_button_finalize (GObject *object);
+static gchar* get_device_description (UpClient *upower, UpDevice *device);
+static GList* find_device_in_list (BatteryButton *button, const gchar *object_path);
+static gboolean battery_button_set_icon (BatteryButton *button);
+static void battery_button_clicked (GtkButton *b);
+static void battery_button_show_menu (BatteryButton *button);
+static void battery_button_menu_add_device (BatteryButton *button, BatteryDevice *battery_device, gboolean append);
+
+
static void
battery_button_set_property (GObject *object,
guint prop_id,
@@ -301,6 +307,18 @@ device_changed_cb (UpDevice *device, BatteryButton *button)
button->priv->panel_icon_name = icon_name;
battery_button_set_icon (button);
}
+
+ /* If the menu is being displayed, update it */
+ if (button->priv->menu && battery_device->menu_item)
+ {
+ GtkWidget *img;
+
+ gtk_menu_item_set_label (GTK_MENU_ITEM (battery_device->menu_item), details);
+
+ /* update the image */
+ img = gtk_image_new_from_pixbuf(battery_device->pix);
+ gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(battery_device->menu_item), img);
+ }
}
static void
@@ -365,6 +383,12 @@ battery_button_add_device (UpDevice *device, BatteryButton *button)
{
button->priv->devices = g_list_append (button->priv->devices, battery_device);
}
+
+ /* If the menu is being shown, add this new device to it */
+ if (button->priv->menu)
+ {
+ battery_button_menu_add_device (button, battery_device, FALSE);
+ }
}
static void
@@ -382,6 +406,10 @@ battery_button_remove_device (BatteryButton *button, const gchar *object_path)
battery_device = item->data;
+ /* If it is being shown in the menu, remove it */
+ if(battery_device->menu_item && button->priv->menu)
+ gtk_container_remove(GTK_CONTAINER(button->priv->menu), battery_device->menu_item);
+
if (battery_device->pix)
g_object_unref (battery_device->pix);
@@ -597,9 +625,64 @@ battery_button_show (BatteryButton *button)
}
static void
+menu_destroyed_cb(GtkWidget *object, gpointer user_data)
+{
+ BatteryButton *button = BATTERY_BUTTON (user_data);
+
+ button->priv->menu = NULL;
+}
+
+static void
+menu_item_destroyed_cb(GtkWidget *object, gpointer user_data)
+{
+ BatteryButton *button = BATTERY_BUTTON (user_data);
+ GList *item;
+
+ for (item = g_list_first (button->priv->devices); item != NULL; item = g_list_next (item))
+ {
+ BatteryDevice *battery_device = item->data;
+
+ if (battery_device->menu_item == object)
+ {
+ battery_device->menu_item = NULL;
+ return;
+ }
+ }
+}
+
+static void
+battery_button_menu_add_device (BatteryButton *button, BatteryDevice *battery_device, gboolean append)
+{
+ GtkWidget *mi, *label, *img;
+
+ /* We need a menu to attach it to */
+ g_return_if_fail (button->priv->menu);
+
+ mi = gtk_image_menu_item_new_with_label(battery_device->details);
+ /* Make the menu item be bold and multi-line */
+ label = gtk_bin_get_child(GTK_BIN(mi));
+ gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
+
+ /* add the image */
+ img = gtk_image_new_from_pixbuf(battery_device->pix);
+ gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(mi), img);
+
+ /* keep track of the menu item in the battery_device so we can update it */
+ battery_device->menu_item = mi;
+ g_signal_connect(G_OBJECT(mi), "destroy", G_CALLBACK(menu_item_destroyed_cb), button);
+
+ /* Add it to the menu */
+ gtk_widget_show(mi);
+ if (append)
+ gtk_menu_shell_append(GTK_MENU_SHELL(button->priv->menu), mi);
+ else
+ gtk_menu_shell_prepend(GTK_MENU_SHELL(button->priv->menu), mi);
+}
+
+static void
battery_button_show_menu (BatteryButton *button)
{
- GtkWidget *menu, *mi, *label, *img;
+ GtkWidget *menu, *mi;
GdkScreen *gscreen;
GList *item;
@@ -610,23 +693,15 @@ battery_button_show_menu (BatteryButton *button)
menu = gtk_menu_new ();
gtk_menu_set_screen(GTK_MENU(menu), gscreen);
+ /* keep track of the menu while it's being displayed */
+ button->priv->menu = menu;
+ g_signal_connect(G_OBJECT(menu), "destroy", G_CALLBACK(menu_destroyed_cb), button);
for (item = g_list_first (button->priv->devices); item != NULL; item = g_list_next (item))
{
BatteryDevice *battery_device = item->data;
- mi = gtk_image_menu_item_new_with_label(battery_device->details);
- /* Make the menu item be bold and multi-line */
- label = gtk_bin_get_child(GTK_BIN(mi));
- gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
-
- /* add the image */
- img = gtk_image_new_from_pixbuf(battery_device->pix);
- gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(mi), img);
-
- /* Add it to the menu */
- gtk_widget_show(mi);
- gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
+ battery_button_menu_add_device (button, battery_device, TRUE);
}
/* separator */
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the Xfce4-commits
mailing list