From c6c2c1a59a134e5a41a0ad52b76c1193842267fe Mon Sep 17 00:00:00 2001 From: Simon Steinbeiss Date: Wed, 8 Apr 2015 11:16:42 +0200 Subject: [PATCH] Add hidden option to show percentage label in plugin --- common/xfpm-config.h | 1 + .../power-manager-plugin/power-manager-button.c | 137 +++++++++++++++------ 2 files changed, 97 insertions(+), 41 deletions(-) diff --git a/common/xfpm-config.h b/common/xfpm-config.h index 1a19194..60a128f 100644 --- a/common/xfpm-config.h +++ b/common/xfpm-config.h @@ -76,6 +76,7 @@ G_BEGIN_DECLS #define BRIGHTNESS_SWITCH_SAVE "brightness-switch-restore-on-exit" #define HANDLE_BRIGHTNESS_KEYS "handle-brightness-keys" #define SHOW_BRIGHTNESS_POPUP "show-brightness-popup" +#define SHOW_PERCENTAGE "show-percentage" G_END_DECLS diff --git a/panel-plugins/power-manager-plugin/power-manager-button.c b/panel-plugins/power-manager-plugin/power-manager-button.c index ef9b2ea..3aa3ace 100644 --- a/panel-plugins/power-manager-plugin/power-manager-button.c +++ b/panel-plugins/power-manager-plugin/power-manager-button.c @@ -68,6 +68,8 @@ struct PowerManagerButtonPrivate /* The actual panel icon image */ GtkWidget *panel_icon_image; + GtkWidget *panel_label; + GtkWidget *hbox; /* Keep track of icon name to redisplay during size changes */ gchar *panel_icon_name; /* Keep track of the last icon size for use during updates */ @@ -92,6 +94,8 @@ struct PowerManagerButtonPrivate */ gint32 brightness_min_level; + gboolean show_percentage; + /* filter range value changed events for snappier UI feedback */ guint set_level_timeout; }; @@ -112,6 +116,7 @@ typedef enum { PROP_0 = 0, PROP_BRIGHTNESS_MIN_LEVEL, + PROP_SHOW_PERCENTAGE, } POWER_MANAGER_BUTTON_PROPERTIES; enum { @@ -128,6 +133,7 @@ static void power_manager_button_finalize (GObject *object); static GList* find_device_in_list (PowerManagerButton *button, const gchar *object_path); static gboolean power_manager_button_device_icon_expose (GtkWidget *img, GdkEventExpose *event, gpointer userdata); static void power_manager_button_set_icon (PowerManagerButton *button); +static void power_manager_button_set_label (PowerManagerButton *button, gdouble percentage); static gboolean power_manager_button_press_event (GtkWidget *widget, GdkEventButton *event); static gboolean power_manager_button_menu_add_device (PowerManagerButton *button, BatteryDevice *battery_device, gboolean append); static void increase_brightness (PowerManagerButton *button); @@ -362,6 +368,7 @@ power_manager_button_update_device_icon_and_details (PowerManagerButton *button, BatteryDevice *battery_device, *display_device; const gchar *object_path = up_device_get_object_path(device); gchar *details, *icon_name, *upower_icon; + gdouble percentage; GdkPixbuf *pix = NULL; guint type = 0; @@ -381,6 +388,7 @@ power_manager_button_update_device_icon_and_details (PowerManagerButton *button, g_object_get (device, "kind", &type, "icon-name", &upower_icon, + "percentage", &percentage, NULL); icon_name = get_device_icon_name (button->priv->upower, device); @@ -414,6 +422,7 @@ power_manager_button_update_device_icon_and_details (PowerManagerButton *button, g_free (button->priv->panel_icon_name); button->priv->panel_icon_name = upower_icon; power_manager_button_set_icon (button); + power_manager_button_set_label (button, percentage); /* update tooltip */ power_manager_button_set_tooltip (button); } @@ -701,6 +710,48 @@ set_brightness_min_level (PowerManagerButton *button, gint32 new_brightness_leve } } +#ifdef XFCE_PLUGIN +static void +power_manager_button_size_changed_cb (XfcePanelPlugin *plugin, gint size, PowerManagerButton *button) +{ + GtkStyleContext *context; + GtkBorder padding, border; + gint width; + gint xthickness; + gint ythickness; + + g_return_val_if_fail (POWER_MANAGER_IS_BUTTON (button), FALSE); + g_return_val_if_fail (XFCE_IS_PANEL_PLUGIN (plugin), FALSE); + g_return_if_fail (size > 0); + + size /= xfce_panel_plugin_get_nrows (plugin); + + /* Calculate the size of the widget because the theme can override it */ + context = gtk_widget_get_style_context (GTK_WIDGET (button)); + gtk_style_context_get_padding (context, gtk_widget_get_state_flags (GTK_WIDGET (button)), &padding); + gtk_style_context_get_border (context, gtk_widget_get_state_flags (GTK_WIDGET (button)), &border); + xthickness = padding.left+padding.right+border.left+border.right; + ythickness = padding.top+padding.bottom+border.top+border.bottom; + + /* Calculate the size of the space left for the icon */ + width = size - 2* MAX (xthickness, ythickness); + + /* Since symbolic icons are usually only provided in 16px we + * try to be clever and use size steps */ + if (width <= 21) + button->priv->panel_icon_width = 16; + else if (width >=22 && width <= 29) + button->priv->panel_icon_width = 24; + else if (width >= 30 && width <= 40) + button->priv->panel_icon_width = 32; + else + button->priv->panel_icon_width = width; + + gtk_widget_set_size_request (GTK_WIDGET(plugin), size, size); + power_manager_button_set_icon (button); +} +#endif + static void power_manager_button_set_property (GObject *object, guint property_id, @@ -716,6 +767,18 @@ power_manager_button_set_property (GObject *object, case PROP_BRIGHTNESS_MIN_LEVEL: set_brightness_min_level (button, g_value_get_int (value)); break; +#ifdef XFCE_PLUGIN + case PROP_SHOW_PERCENTAGE: + button->priv->show_percentage = g_value_get_boolean (value); + if (button->priv->show_percentage) + gtk_widget_show (button->priv->panel_label); + else + gtk_widget_hide (button->priv->panel_label); + power_manager_button_size_changed_cb (button->priv->plugin, + xfce_panel_plugin_get_size (button->priv->plugin), + button); + break; +#endif default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; @@ -740,6 +803,11 @@ power_manager_button_get_property(GObject *object, default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; +#ifdef XFCE_PLUGIN + case PROP_SHOW_PERCENTAGE: + g_value_set_boolean (value, button->priv->show_percentage); + break; +#endif } } @@ -790,6 +858,13 @@ power_manager_button_class_init (PowerManagerButtonClass *klass) BRIGHTNESS_SLIDER_MIN_LEVEL, -1, G_MAXINT32, -1, XFPM_PARAM_FLAGS)); + + g_object_class_install_property (object_class, + PROP_SHOW_PERCENTAGE, + g_param_spec_boolean (SHOW_PERCENTAGE, + NULL, NULL, + TRUE, + G_PARAM_READWRITE)); #undef XFPM_PARAM_FLAGS } @@ -893,6 +968,9 @@ power_manager_button_new (void) PROPERTIES_PREFIX BRIGHTNESS_SLIDER_MIN_LEVEL, G_TYPE_INT, G_OBJECT (button), BRIGHTNESS_SLIDER_MIN_LEVEL); + xfconf_g_property_bind (button->priv->channel, PROPERTIES_PREFIX SHOW_PERCENTAGE, G_TYPE_BOOLEAN, + G_OBJECT (button), SHOW_PERCENTAGE); + return GTK_WIDGET (button); } @@ -907,6 +985,17 @@ power_manager_button_set_icon (PowerManagerButton *button) } +static void +power_manager_button_set_label (PowerManagerButton *button, gdouble percentage) +{ + gchar *percentage_string; + + percentage_string = g_strdup_printf ("%d%%", (int) percentage); + gtk_label_set_text (GTK_LABEL (button->priv->panel_label), percentage_string); + + g_free (percentage_string); +} + const gchar * power_manager_button_get_icon_name (PowerManagerButton *button) { @@ -931,46 +1020,6 @@ power_manager_button_press_event (GtkWidget *widget, GdkEventButton *event) #ifdef XFCE_PLUGIN static void -power_manager_button_size_changed_cb (XfcePanelPlugin *plugin, gint size, PowerManagerButton *button) -{ - GtkStyleContext *context; - GtkBorder padding, border; - gint width; - gint xthickness; - gint ythickness; - - g_return_if_fail (POWER_MANAGER_IS_BUTTON (button)); - g_return_if_fail (XFCE_IS_PANEL_PLUGIN (plugin)); - g_return_if_fail (size > 0); - - size /= xfce_panel_plugin_get_nrows (plugin); - - /* Calculate the size of the widget because the theme can override it */ - context = gtk_widget_get_style_context (GTK_WIDGET (button)); - gtk_style_context_get_padding (context, gtk_widget_get_state_flags (GTK_WIDGET (button)), &padding); - gtk_style_context_get_border (context, gtk_widget_get_state_flags (GTK_WIDGET (button)), &border); - xthickness = padding.left+padding.right+border.left+border.right; - ythickness = padding.top+padding.bottom+border.top+border.bottom; - - /* Calculate the size of the space left for the icon */ - width = size - 2* MAX (xthickness, ythickness); - - /* Since symbolic icons are usually only provided in 16px we - * try to be clever and use size steps */ - if (width <= 21) - button->priv->panel_icon_width = 16; - else if (width >=22 && width <= 29) - button->priv->panel_icon_width = 24; - else if (width >= 30 && width <= 40) - button->priv->panel_icon_width = 32; - else - button->priv->panel_icon_width = width; - - gtk_widget_set_size_request (GTK_WIDGET(plugin), size, size); - power_manager_button_set_icon (button); -} - -static void power_manager_button_style_update_cb (XfcePanelPlugin *plugin, PowerManagerButton *button) { gtk_widget_reset_style (GTK_WIDGET (plugin)); @@ -994,6 +1043,7 @@ void power_manager_button_show (PowerManagerButton *button) { GtkWidget *mi; + GtkWidget *hbox; g_return_if_fail (POWER_MANAGER_IS_BUTTON (button)); @@ -1003,7 +1053,12 @@ power_manager_button_show (PowerManagerButton *button) #endif button->priv->panel_icon_image = gtk_image_new (); - gtk_container_add (GTK_CONTAINER (button), button->priv->panel_icon_image); + button->priv->panel_label = gtk_label_new (""); + hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); + gtk_box_pack_start (GTK_BOX (hbox), GTK_WIDGET (button->priv->panel_icon_image), TRUE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (hbox), GTK_WIDGET (button->priv->panel_label), TRUE, FALSE, 0); + + gtk_container_add (GTK_CONTAINER (button), GTK_WIDGET (hbox)); /* help dialog */ mi = gtk_menu_item_new_with_mnemonic (_("_Help")); -- 2.1.4