[Xfce4-commits] <xfce4-battery-plugin:master> Add AC color state and allow user-configurable colors (bug #6757)

Landry Breuil noreply at xfce.org
Wed Apr 18 11:40:01 CEST 2012


Updating branch refs/heads/master
         to 4baa0b34bbdca852ed608cfd0d8042985f1e777d (commit)
       from 5fdc701440f97cee111a2a47c85f7d838aab7e13 (commit)

commit 4baa0b34bbdca852ed608cfd0d8042985f1e777d
Author: Landry Breuil <landry at xfce.org>
Date:   Tue Apr 17 23:12:21 2012 +0200

    Add AC color state and allow user-configurable colors (bug #6757)
    
    Adapted from Jarrad Whitaker's patch, thanks! Options dialog needs
    a bit of reworking, but the feature is nice and seems to work just
    fine.

 panel-plugin/battery.c |  189 ++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 176 insertions(+), 13 deletions(-)

diff --git a/panel-plugin/battery.c b/panel-plugin/battery.c
index 943b379..7b02740 100644
--- a/panel-plugin/battery.c
+++ b/panel-plugin/battery.c
@@ -58,6 +58,7 @@
 #include <time.h>
 
 #define BORDER          8
+#define AC_COLOR        "#8888FF"
 #define HIGH_COLOR      "#00ff00"
 #define LOW_COLOR       "#ffff00"
 #define CRITICAL_COLOR  "#ff0000"
@@ -81,6 +82,10 @@ typedef struct
     char        *command_on_low;    char        *command_on_critical;
     float        hsize;
     float        vsize;
+    GdkColor        colorA;
+    GdkColor        colorH;
+    GdkColor        colorL;
+    GdkColor        colorC;
 } t_battmon_options;
 
 typedef struct
@@ -97,9 +102,6 @@ typedef struct
     gboolean        low;
     gboolean        critical;
     t_battmon_options    options;
-    GdkColor        colorH;
-    GdkColor        colorL;
-    GdkColor        colorC;
     GtkLabel        *label;
     GtkLabel        *charge;
     GtkLabel        *rtime;
@@ -107,6 +109,7 @@ typedef struct
     GtkLabel        *acfan;
     GtkLabel        *temp;
     GtkWidget        *image;
+    GtkRcStyle        *battstatus_style;
 } t_battmon;
 
 typedef struct
@@ -125,6 +128,14 @@ typedef struct
     GtkWidget        *om_action_critical;
     GtkWidget        *en_command_low;
     GtkWidget        *en_command_critical;
+    GtkWidget        *ac_color_button;
+    GtkWidget        *high_color_button;
+    GtkWidget        *low_color_button;
+    GtkWidget        *critical_color_button;
+    GtkWidget        *ac_color_background;
+    GtkWidget        *high_color_background;
+    GtkWidget        *low_color_background;
+    GtkWidget        *critical_color_background;
     t_battmon        *battmon;
 } t_battmon_dialog;
 
@@ -150,6 +161,10 @@ init_options(t_battmon_options *options)
     options->command_on_critical = NULL;
     options->hsize = 1.75;
     options->vsize = 0.5;
+    gdk_color_parse(AC_COLOR, &(options->colorA));
+    gdk_color_parse(HIGH_COLOR, &(options->colorH));
+    gdk_color_parse(LOW_COLOR, &(options->colorL));
+    gdk_color_parse(CRITICAL_COLOR, &(options->colorC));
 }
 
 gboolean
@@ -554,24 +569,26 @@ battmon.c:241: for each function it appears in.)
     /* bar colors and state flags */
     if (acline) {
       battmon->low = battmon->critical = FALSE;
-      gtk_widget_modify_bg(battmon->battstatus, GTK_STATE_PRELIGHT, NULL);
+      battmon->battstatus_style->bg[GTK_STATE_PRELIGHT] = (battmon->options.colorA);
+      battmon->battstatus_style->bg[GTK_STATE_SELECTED] = (battmon->options.colorA);
     }
     else {
       if(charge <= battmon->options.critical_percentage) {
-        gtk_widget_modify_bg(battmon->battstatus, GTK_STATE_PRELIGHT, &(battmon->colorC));
-        gtk_widget_modify_bg(battmon->battstatus, GTK_STATE_SELECTED, &(battmon->colorC));
+        battmon->battstatus_style->bg[GTK_STATE_PRELIGHT] = (battmon->options.colorC);
+        battmon->battstatus_style->bg[GTK_STATE_SELECTED] = (battmon->options.colorC);
       }
       else if(charge <= battmon->options.low_percentage) {
-        gtk_widget_modify_bg(battmon->battstatus, GTK_STATE_PRELIGHT, &(battmon->colorL));
-        gtk_widget_modify_bg(battmon->battstatus, GTK_STATE_SELECTED, &(battmon->colorL));
+        battmon->battstatus_style->bg[GTK_STATE_PRELIGHT] = (battmon->options.colorL);
+        battmon->battstatus_style->bg[GTK_STATE_SELECTED] = (battmon->options.colorL);
         battmon->critical = FALSE;
       }
       else {
             battmon->low = battmon->critical = FALSE;
-        gtk_widget_modify_bg(battmon->battstatus, GTK_STATE_PRELIGHT, &(battmon->colorH));
-        gtk_widget_modify_bg(battmon->battstatus, GTK_STATE_SELECTED, &(battmon->colorH));
+        battmon->battstatus_style->bg[GTK_STATE_PRELIGHT] = (battmon->options.colorH);
+        battmon->battstatus_style->bg[GTK_STATE_SELECTED] = (battmon->options.colorH);
       }
     }
+    gtk_widget_modify_style(GTK_WIDGET(battmon->battstatus),battmon->battstatus_style);
 
     /* alarms */
     if (!acline && charge <= battmon->options.low_percentage){
@@ -804,10 +821,17 @@ static void setup_battmon(t_battmon      *battmon,
     gtk_container_add(GTK_CONTAINER(battmon->ebox),GTK_WIDGET(battmon->vbox));
     gtk_widget_show(battmon->ebox);
 
+    battmon->battstatus_style = gtk_widget_get_modifier_style(battmon->battstatus);
+    if (!battmon->battstatus_style) {
+      battmon->battstatus_style = gtk_rc_style_new();
+    } else {
+            /* to free the style safely in any case */
+      gtk_rc_style_ref(battmon->battstatus_style);
+    }
+
+    battmon->battstatus_style->color_flags[GTK_STATE_PRELIGHT] |= GTK_RC_BG;
+    battmon->battstatus_style->color_flags[GTK_STATE_SELECTED] |= GTK_RC_BG;
 
-    gdk_color_parse(HIGH_COLOR, &(battmon->colorH));
-    gdk_color_parse(LOW_COLOR, &(battmon->colorL));
-    gdk_color_parse(CRITICAL_COLOR, &(battmon->colorC));
     gtk_widget_set_size_request(battmon->ebox, -1, -1);
 }
 
@@ -906,6 +930,7 @@ battmon_free(XfcePanelPlugin *plugin, t_battmon *battmon)
     /* free tooltip */
     gtk_tooltips_set_tip (battmon->tips, battmon->ebox, NULL, NULL);
     g_object_unref (G_OBJECT (battmon->tips));
+    gtk_rc_style_unref(battmon->battstatus_style);
 
     g_free(battmon);
 }
@@ -950,6 +975,15 @@ battmon_read_config(XfcePanelPlugin *plugin, t_battmon *battmon)
 
     battmon->options.hide_when_full = xfce_rc_read_int_entry (rc, "hide_when_full", 0);
 
+    if ((value = xfce_rc_read_entry (rc, "colorA", NULL)) != NULL)
+      gdk_color_parse(value, &battmon->options.colorA);
+    if ((value = xfce_rc_read_entry (rc, "colorH", NULL)) != NULL)
+      gdk_color_parse(value, &battmon->options.colorH);
+    if ((value = xfce_rc_read_entry (rc, "colorL", NULL)) != NULL)
+      gdk_color_parse(value, &battmon->options.colorL);
+    if ((value = xfce_rc_read_entry (rc, "colorC", NULL)) != NULL)
+      gdk_color_parse(value, &battmon->options.colorC);
+
     if ((value =  xfce_rc_read_entry (rc, "command_on_low", NULL)) && *value)
         battmon->options.command_on_low = g_strdup (value);
 
@@ -998,6 +1032,34 @@ battmon_write_config(XfcePanelPlugin *plugin, t_battmon *battmon)
 
     xfce_rc_write_int_entry (rc, "hide_when_full", battmon->options.hide_when_full );
 
+    char colorA_str[8];
+    g_snprintf(colorA_str, 8, "#%02X%02X%02X",
+      (guint)battmon->options.colorA.red >> 8,
+      (guint)battmon->options.colorA.green >> 8,
+      (guint)battmon->options.colorA.blue >> 8);
+    xfce_rc_write_entry (rc, "colorA", colorA_str);
+
+    char colorH_str[8];
+    g_snprintf(colorH_str, 8, "#%02X%02X%02X",
+      (guint)battmon->options.colorH.red >> 8,
+      (guint)battmon->options.colorH.green >> 8,
+      (guint)battmon->options.colorH.blue >> 8);
+    xfce_rc_write_entry (rc, "colorH", colorH_str);
+
+    char colorL_str[8];
+    g_snprintf(colorL_str, 8, "#%02X%02X%02X",
+      (guint)battmon->options.colorL.red >> 8,
+      (guint)battmon->options.colorL.green >> 8,
+      (guint)battmon->options.colorL.blue >> 8);
+    xfce_rc_write_entry (rc, "colorL", colorL_str);
+
+    char colorC_str[8];
+    g_snprintf(colorC_str, 8, "#%02X%02X%02X",
+      (guint)battmon->options.colorC.red >> 8,
+      (guint)battmon->options.colorC.green >> 8,
+      (guint)battmon->options.colorC.blue >> 8);
+    xfce_rc_write_entry (rc, "colorC", colorC_str);
+
     xfce_rc_write_entry (rc, "command_on_low", battmon->options.command_on_low ? battmon->options.command_on_low : "");
 
     xfce_rc_write_entry (rc, "command_on_critical", battmon->options.command_on_critical ? battmon->options.command_on_critical : "");
@@ -1048,6 +1110,10 @@ static void refresh_dialog(t_battmon_dialog *dialog)
 
     gtk_spin_button_set_value(GTK_SPIN_BUTTON(dialog->sb_low_percentage), battmon->options.low_percentage);
     gtk_spin_button_set_value(GTK_SPIN_BUTTON(dialog->sb_critical_percentage), battmon->options.critical_percentage);
+    gtk_widget_modify_bg(GTK_WIDGET(dialog->ac_color_background), GTK_STATE_NORMAL, &battmon->options.colorA);
+    gtk_widget_modify_bg(GTK_WIDGET(dialog->high_color_background), GTK_STATE_NORMAL, &battmon->options.colorH);
+    gtk_widget_modify_bg(GTK_WIDGET(dialog->low_color_background), GTK_STATE_NORMAL, &battmon->options.colorL);
+    gtk_widget_modify_bg(GTK_WIDGET(dialog->critical_color_background), GTK_STATE_NORMAL, &battmon->options.colorC);
     gtk_option_menu_set_history(GTK_OPTION_MENU(dialog->om_action_low), battmon->options.action_on_low);
     if(battmon->options.command_on_low)
         gtk_entry_set_text(GTK_ENTRY(dialog->en_command_low), battmon->options.command_on_low);
@@ -1264,6 +1330,44 @@ command_browse_cb (GtkWidget *b, GtkEntry *entry)
     }
 }
 
+
+static void change_color(GtkWidget *button, t_battmon_dialog *dialog, GdkColor *color)
+{
+    GtkWidget *color_dialog;
+    GtkColorSelection *colorsel;
+    gint response;
+
+    color_dialog = gtk_color_selection_dialog_new(_("Select color"));
+    gtk_window_set_transient_for(GTK_WINDOW(color_dialog), GTK_WINDOW(gtk_widget_get_toplevel(button)));
+    colorsel = GTK_COLOR_SELECTION(GTK_COLOR_SELECTION_DIALOG(color_dialog)->colorsel);
+    gtk_color_selection_set_previous_color(colorsel, color);
+    gtk_color_selection_set_current_color(colorsel, color);
+    gtk_color_selection_set_has_palette(colorsel, TRUE);
+
+    response = gtk_dialog_run(GTK_DIALOG(color_dialog));
+    if (response == GTK_RESPONSE_OK) {
+        gtk_color_selection_get_current_color(colorsel, color);
+        refresh_dialog(dialog);
+        update_apm_status(dialog->battmon);
+    }
+
+    DBG("change_color");
+    gtk_widget_destroy(GTK_WIDGET(color_dialog));
+}
+
+static void change_color_ac(GtkWidget *button, t_battmon_dialog *dialog) {
+  change_color(button,dialog,&dialog->battmon->options.colorA);
+}
+static void change_color_high(GtkWidget *button, t_battmon_dialog *dialog) {
+  change_color(button,dialog,&dialog->battmon->options.colorH);
+}
+static void change_color_low(GtkWidget *button, t_battmon_dialog *dialog){
+  change_color(button,dialog,&dialog->battmon->options.colorL);
+}
+static void change_color_critical(GtkWidget *button, t_battmon_dialog *dialog){
+  change_color(button,dialog,&dialog->battmon->options.colorC);
+}
+
 static void
 battmon_dialog_response (GtkWidget *dlg, int response, t_battmon *battmon)
 {
@@ -1328,6 +1432,42 @@ battmon_create_options(XfcePanelPlugin *plugin, t_battmon *battmon)
     hbox = gtk_hbox_new(FALSE, BORDER);
     gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
 
+    label = gtk_label_new(_("AC Color:"));
+    gtk_size_group_add_widget(sg,label);
+    gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
+    gtk_box_pack_start(GTK_BOX(hbox),label,FALSE,FALSE,0);
+
+    dialog->ac_color_button = gtk_button_new();
+    dialog->ac_color_background = gtk_drawing_area_new();
+    gtk_widget_modify_bg(dialog->ac_color_background, GTK_STATE_NORMAL, &battmon->options.colorA);
+    gtk_widget_set_size_request(dialog->ac_color_background, 64, 12);
+    gtk_container_add(GTK_CONTAINER(dialog->ac_color_button), dialog->ac_color_background);
+    gtk_widget_show(GTK_WIDGET(dialog->ac_color_button));
+    gtk_widget_show(GTK_WIDGET(dialog->ac_color_background));
+    gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(dialog->ac_color_button), FALSE, FALSE, 0);
+
+
+    hbox = gtk_hbox_new(FALSE, BORDER);
+    gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
+
+    label = gtk_label_new(_("High Color:"));
+    gtk_size_group_add_widget(sg,label);
+    gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
+    gtk_box_pack_start(GTK_BOX(hbox),label,FALSE,FALSE,0);
+
+    dialog->high_color_button = gtk_button_new();
+    dialog->high_color_background = gtk_drawing_area_new();
+    gtk_widget_modify_bg(dialog->high_color_background, GTK_STATE_NORMAL, &battmon->options.colorH);
+    gtk_widget_set_size_request(dialog->high_color_background, 64, 12);
+    gtk_container_add(GTK_CONTAINER(dialog->high_color_button), dialog->high_color_background);
+    gtk_widget_show(GTK_WIDGET(dialog->high_color_button));
+    gtk_widget_show(GTK_WIDGET(dialog->high_color_background));
+    gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(dialog->high_color_button), FALSE, FALSE, 0);
+
+
+    hbox = gtk_hbox_new(FALSE, BORDER);
+    gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
+
     label = gtk_label_new(_("Low percentage:"));
     gtk_size_group_add_widget(sg, label);
     gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
@@ -1336,6 +1476,16 @@ battmon_create_options(XfcePanelPlugin *plugin, t_battmon *battmon)
     dialog->sb_low_percentage = gtk_spin_button_new_with_range(1, 100, 1);
     gtk_box_pack_start(GTK_BOX(hbox), dialog->sb_low_percentage, FALSE, FALSE, 0);
 
+    dialog->low_color_button = gtk_button_new();
+    dialog->low_color_background = gtk_drawing_area_new();
+    gtk_widget_modify_bg(dialog->low_color_background, GTK_STATE_NORMAL, &battmon->options.colorL);
+    gtk_widget_set_size_request(dialog->low_color_background, 64, 12);
+    gtk_container_add(GTK_CONTAINER(dialog->low_color_button), dialog->low_color_background);
+    gtk_widget_show(GTK_WIDGET(dialog->low_color_button));
+    gtk_widget_show(GTK_WIDGET(dialog->low_color_background));
+    gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(dialog->low_color_button), FALSE, FALSE, 0);
+
+
     hbox = gtk_hbox_new(FALSE, BORDER);
     gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
 
@@ -1347,6 +1497,15 @@ battmon_create_options(XfcePanelPlugin *plugin, t_battmon *battmon)
     dialog->sb_critical_percentage = gtk_spin_button_new_with_range(1, 100, 1);
     gtk_box_pack_start(GTK_BOX(hbox), dialog->sb_critical_percentage, FALSE, FALSE, 0);
 
+    dialog->critical_color_button = gtk_button_new();
+    dialog->critical_color_background = gtk_drawing_area_new();
+    gtk_widget_modify_bg(dialog->critical_color_background, GTK_STATE_NORMAL, &battmon->options.colorC);
+    gtk_widget_set_size_request(dialog->critical_color_background, 64, 12);
+    gtk_container_add(GTK_CONTAINER(dialog->critical_color_button), dialog->critical_color_background);
+    gtk_widget_show(GTK_WIDGET(dialog->critical_color_button));
+    gtk_widget_show(GTK_WIDGET(dialog->critical_color_background));
+    gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(dialog->critical_color_button), FALSE, FALSE, 0);
+
     /* Low battery action settings */
 
     hbox = gtk_hbox_new(FALSE, BORDER);
@@ -1467,6 +1626,10 @@ battmon_create_options(XfcePanelPlugin *plugin, t_battmon *battmon)
     /* Signal connections should be set after setting tate of toggle buttons...*/
     refresh_dialog(dialog);
 
+    g_signal_connect(dialog->ac_color_button, "clicked", G_CALLBACK(change_color_ac), dialog);
+    g_signal_connect(dialog->high_color_button, "clicked", G_CALLBACK(change_color_high), dialog);
+    g_signal_connect(dialog->low_color_button, "clicked", G_CALLBACK(change_color_low), dialog);
+    g_signal_connect(dialog->critical_color_button, "clicked", G_CALLBACK(change_color_critical), dialog);
     g_signal_connect(button, "clicked", G_CALLBACK(command_browse_cb), dialog->en_command_low);
     g_signal_connect(button2, "clicked", G_CALLBACK(command_browse_cb), dialog->en_command_critical);
     g_signal_connect(dialog->cb_disp_percentage, "toggled", G_CALLBACK(set_disp_percentage), dialog);


More information about the Xfce4-commits mailing list