From b4b7cc42aa295bcc53cde24b1644b62c692f50d0 Mon Sep 17 00:00:00 2001 From: insaner Date: Fri, 19 Sep 2025 00:10:35 -0400 Subject: [PATCH] Allow user selection of decimal places for cpu freq --- cpufreq/data/cpufreq-preferences.ui | 43 ++++- ...g.mate.panel.applet.cpufreq.gschema.xml.in | 9 +- cpufreq/src/cpufreq-applet.c | 21 ++- cpufreq/src/cpufreq-monitor.c | 44 ++++- cpufreq/src/cpufreq-monitor.h | 2 + cpufreq/src/cpufreq-popup.c | 5 +- cpufreq/src/cpufreq-prefs.c | 151 +++++++++++++++++- cpufreq/src/cpufreq-prefs.h | 1 + cpufreq/src/cpufreq-utils.c | 10 +- cpufreq/src/cpufreq-utils.h | 5 +- 10 files changed, 279 insertions(+), 12 deletions(-) diff --git a/cpufreq/data/cpufreq-preferences.ui b/cpufreq/data/cpufreq-preferences.ui index f155f73ed..ed3430af8 100644 --- a/cpufreq/data/cpufreq-preferences.ui +++ b/cpufreq/data/cpufreq-preferences.ui @@ -228,6 +228,47 @@ 2 + + + True + False + 6 + 12 + + + True + False + start + 18 + _Decimal places: + True + prefs_decimal_places + 0 + + + False + True + 0 + + + + + True + False + + + True + True + 1 + + + + + False + True + 3 + + Show CPU frequency as _percentage @@ -242,7 +283,7 @@ False True - 3 + 4 diff --git a/cpufreq/data/org.mate.panel.applet.cpufreq.gschema.xml.in b/cpufreq/data/org.mate.panel.applet.cpufreq.gschema.xml.in index 694a75f7d..a25ca2259 100644 --- a/cpufreq/data/org.mate.panel.applet.cpufreq.gschema.xml.in +++ b/cpufreq/data/org.mate.panel.applet.cpufreq.gschema.xml.in @@ -1,6 +1,6 @@ - + 0 CPU to Monitor @@ -16,5 +16,12 @@ The type of text to display (if the text is enabled). A 0 value means to show CPU frequency, 1 to show frequency and units, and 2 to show percentage instead of frequency. + + 2 + Decimal places for frequency display + + How many decimal digits to display for the CPU frequency. + + diff --git a/cpufreq/src/cpufreq-applet.c b/cpufreq/src/cpufreq-applet.c index b1509eaab..d731dab82 100644 --- a/cpufreq/src/cpufreq-applet.c +++ b/cpufreq/src/cpufreq-applet.c @@ -630,6 +630,7 @@ cpufreq_applet_update (CPUFreqApplet *applet, gint freq; gint perc; guint cpu; + guint decimal_places; GtkRequisition req; const gchar *governor; @@ -637,8 +638,8 @@ cpufreq_applet_update (CPUFreqApplet *applet, freq = cpufreq_monitor_get_frequency (monitor); perc = cpufreq_monitor_get_percentage (monitor); governor = cpufreq_monitor_get_governor (monitor); - - freq_label = cpufreq_utils_get_frequency_label (freq); + decimal_places = cpufreq_monitor_get_decimal_places (monitor); + freq_label = cpufreq_utils_get_frequency_label (freq, decimal_places); unit_label = cpufreq_utils_get_frequency_unit (freq); if (applet->show_freq) { @@ -678,6 +679,7 @@ cpufreq_applet_update (CPUFreqApplet *applet, gov_text = g_strdup (governor); gov_text[0] = g_ascii_toupper (gov_text[0]); + freq_label = cpufreq_utils_get_frequency_label (freq, MAX_DECIMAL_PLACES); // show max decimals in tooltip text_mode = g_strdup_printf ("%s\n%s %s (%d%%)", gov_text, freq_label, unit_label, perc); @@ -780,6 +782,15 @@ cpufreq_applet_prefs_show_mode_changed (CPUFreqPrefs *prefs, cpufreq_applet_update_visibility (applet); } +static void +cpufreq_applet_prefs_decimal_places_changed (CPUFreqPrefs *prefs, + GParamSpec *arg1, + CPUFreqApplet *applet) +{ + cpufreq_monitor_set_decimal_places (applet->monitor, + cpufreq_prefs_get_decimal_places (applet->prefs)); +} + static void cpufreq_applet_setup (CPUFreqApplet *applet) { @@ -812,10 +823,16 @@ cpufreq_applet_setup (CPUFreqApplet *applet) G_CALLBACK (cpufreq_applet_prefs_show_mode_changed), applet); + g_signal_connect (applet->prefs, "notify::decimal-places", + G_CALLBACK (cpufreq_applet_prefs_decimal_places_changed), + applet); + /* Monitor */ applet->monitor = cpufreq_monitor_factory_create_monitor (cpufreq_prefs_get_cpu (applet->prefs)); + cpufreq_monitor_set_decimal_places (applet->monitor, + cpufreq_prefs_get_decimal_places (applet->prefs)); cpufreq_monitor_run (applet->monitor); g_signal_connect_swapped (applet->monitor, "changed", diff --git a/cpufreq/src/cpufreq-monitor.c b/cpufreq/src/cpufreq-monitor.c index a0a2510f7..6f1b91e48 100644 --- a/cpufreq/src/cpufreq-monitor.c +++ b/cpufreq/src/cpufreq-monitor.c @@ -19,6 +19,7 @@ * Authors : Carlos GarcĂ­a Campos */ +#include "cpufreq-utils.h" #include "cpufreq-monitor.h" #define CPUFREQ_MONITOR_INTERVAL 1 @@ -30,7 +31,8 @@ enum { PROP_ONLINE, PROP_FREQUENCY, PROP_MAX_FREQUENCY, - PROP_GOVERNOR + PROP_GOVERNOR, + PROP_DECIMAL_PLACES }; /* Signals */ @@ -44,6 +46,7 @@ struct _CPUFreqMonitorPrivate { gboolean online; gint cur_freq; gint max_freq; + gint decimal_places; gchar *governor; GList *available_freqs; GList *available_govs; @@ -129,6 +132,16 @@ cpufreq_monitor_class_init (CPUFreqMonitorClass *klass) G_MAXINT, 0, G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + PROP_DECIMAL_PLACES, + g_param_spec_int ("decimal-places", + "Decimal Places", + "The number of decimal places to show for the cpu frequency", + 0, + MAX_DECIMAL_PLACES, + MAX_DECIMAL_PLACES, + G_PARAM_CONSTRUCT | + G_PARAM_READWRITE)); g_object_class_install_property (object_class, PROP_GOVERNOR, g_param_spec_string ("governor", @@ -222,6 +235,15 @@ cpufreq_monitor_set_property (GObject *object, } break; } + case PROP_DECIMAL_PLACES: { + gint decimal_places = g_value_get_int (value); + + if (decimal_places != monitor->priv->decimal_places) { + monitor->priv->decimal_places = decimal_places; + monitor->priv->changed = TRUE; + } + break; + } case PROP_GOVERNOR: { const gchar *gov = g_value_get_string (value); @@ -265,6 +287,9 @@ cpufreq_monitor_get_property (GObject *object, case PROP_MAX_FREQUENCY: g_value_set_int (value, monitor->priv->max_freq); break; + case PROP_DECIMAL_PLACES: + g_value_set_int (value, monitor->priv->decimal_places); + break; case PROP_GOVERNOR: g_value_set_string (value, monitor->priv->governor); break; @@ -393,3 +418,20 @@ cpufreq_monitor_get_percentage (CPUFreqMonitor *monitor) return -1; } + +gint +cpufreq_monitor_get_decimal_places (CPUFreqMonitor *monitor) +{ + g_return_val_if_fail (CPUFREQ_IS_MONITOR (monitor), -1); + + return monitor->priv->decimal_places; +} + +void +cpufreq_monitor_set_decimal_places (CPUFreqMonitor *monitor, gint decimal_places) +{ + g_return_if_fail (CPUFREQ_IS_MONITOR (monitor)); + + g_object_set (G_OBJECT (monitor), + "decimal-places", decimal_places, NULL); +} diff --git a/cpufreq/src/cpufreq-monitor.h b/cpufreq/src/cpufreq-monitor.h index 9499707fa..0c7f312da 100644 --- a/cpufreq/src/cpufreq-monitor.h +++ b/cpufreq/src/cpufreq-monitor.h @@ -66,6 +66,8 @@ void cpufreq_monitor_set_cpu (CPUFreqMonitor *monitor, const gchar *cpufreq_monitor_get_governor (CPUFreqMonitor *monitor); gint cpufreq_monitor_get_frequency (CPUFreqMonitor *monitor); gint cpufreq_monitor_get_percentage (CPUFreqMonitor *monitor); +gint cpufreq_monitor_get_decimal_places (CPUFreqMonitor *monitor); +void cpufreq_monitor_set_decimal_places (CPUFreqMonitor *monitor, gint decimal_places); G_END_DECLS diff --git a/cpufreq/src/cpufreq-popup.c b/cpufreq/src/cpufreq-popup.c index 456a60a6b..71b893d01 100644 --- a/cpufreq/src/cpufreq-popup.c +++ b/cpufreq/src/cpufreq-popup.c @@ -273,11 +273,14 @@ frequencies_menu_create_actions (CPUFreqPopup *popup) gchar *label; gchar *unit; gint freq; + gint decimal_places = 2; text = (const gchar *) available_freqs->data; freq = atoi (text); - freq_text = cpufreq_utils_get_frequency_label (freq); + // decimal_places = cpufreq_monitor_get_decimal_places (popup->priv->monitor); + // ^^^ if you want the freq selector to also use the same number of decimal places as for display + freq_text = cpufreq_utils_get_frequency_label (freq, decimal_places); unit = cpufreq_utils_get_frequency_unit (freq); label = g_strdup_printf ("%s %s", freq_text, unit); diff --git a/cpufreq/src/cpufreq-prefs.c b/cpufreq/src/cpufreq-prefs.c index c767861ed..0f41b49b1 100644 --- a/cpufreq/src/cpufreq-prefs.c +++ b/cpufreq/src/cpufreq-prefs.c @@ -35,6 +35,7 @@ enum { PROP_CPU, PROP_SHOW_MODE, PROP_SHOW_TEXT_MODE, + PROP_DECIMAL_PLACES, }; struct _CPUFreqPrefsPrivate { @@ -43,6 +44,7 @@ struct _CPUFreqPrefsPrivate { guint cpu; CPUFreqShowMode show_mode; CPUFreqShowTextMode show_text_mode; + guint decimal_places; /* Preferences dialog */ GtkWidget *dialog; @@ -52,6 +54,8 @@ struct _CPUFreqPrefsPrivate { GtkWidget *cpu_combo; GtkWidget *monitor_settings_frame; GtkWidget *show_mode_combo; + GtkWidget *decimal_places_combo; + GtkWidget *decimal_places_label; }; static void cpufreq_prefs_finalize (GObject *object); @@ -114,6 +118,15 @@ cpufreq_prefs_class_init (CPUFreqPrefsClass *klass) CPUFREQ_TYPE_SHOW_TEXT_MODE, CPUFREQ_MODE_TEXT_FREQUENCY_UNIT, G_PARAM_READWRITE)); + g_object_class_install_property (g_object_class, + PROP_DECIMAL_PLACES, + g_param_spec_uint ("decimal-places", + "DecimalPlaces", + "The monitored cpu", + 0, + MAX_DECIMAL_PLACES, + MAX_DECIMAL_PLACES, + G_PARAM_READWRITE)); g_object_class->finalize = cpufreq_prefs_finalize; } @@ -181,6 +194,17 @@ cpufreq_prefs_set_property (GObject *object, } break; } + case PROP_DECIMAL_PLACES: { + guint decimal_places; + + decimal_places = g_value_get_uint (value); + if (prefs->priv->decimal_places != decimal_places) { + prefs->priv->decimal_places = decimal_places; + g_settings_set_int (prefs->priv->settings, + "decimal-places", decimal_places); + } + break; + } default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } @@ -207,6 +231,9 @@ cpufreq_prefs_get_property (GObject *object, case PROP_SHOW_TEXT_MODE: g_value_set_enum (value, prefs->priv->show_text_mode); break; + case PROP_DECIMAL_PLACES: + g_value_set_uint (value, prefs->priv->decimal_places); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } @@ -220,6 +247,7 @@ cpufreq_prefs_setup (CPUFreqPrefs *prefs) prefs->priv->cpu = g_settings_get_int (prefs->priv->settings, "cpu"); prefs->priv->show_mode = g_settings_get_int (prefs->priv->settings, "show-mode"); prefs->priv->show_text_mode = g_settings_get_int (prefs->priv->settings, "show-text-mode"); + prefs->priv->decimal_places = g_settings_get_int (prefs->priv->settings, "decimal-places"); } CPUFreqPrefs * @@ -264,6 +292,14 @@ cpufreq_prefs_get_show_text_mode (CPUFreqPrefs *prefs) return prefs->priv->show_text_mode; } +guint +cpufreq_prefs_get_decimal_places (CPUFreqPrefs *prefs) +{ + g_return_val_if_fail (CPUFREQ_IS_PREFS (prefs), 0); + + return MIN (prefs->priv->decimal_places, MAX_DECIMAL_PLACES); +} + /* Preferences Dialog */ static void cpufreq_prefs_dialog_show_freq_toggled (GtkWidget *show_freq, @@ -334,6 +370,21 @@ cpufreq_prefs_dialog_cpu_number_changed (GtkWidget *cpu_combo, } } +static void +cpufreq_prefs_dialog_decimal_places_changed (GtkWidget *decimal_places_combo, + CPUFreqPrefs *prefs) +{ + gint decimal_places; + + decimal_places = gtk_combo_box_get_active (GTK_COMBO_BOX (prefs->priv->decimal_places_combo)); + + if (decimal_places >= 0) { + g_object_set (G_OBJECT (prefs), + "decimal-places", decimal_places, + NULL); + } +} + static void cpufreq_prefs_dialog_show_mode_changed (GtkWidget *show_mode_combo, CPUFreqPrefs *prefs) @@ -396,17 +447,33 @@ cpufreq_prefs_dialog_update_sensitivity (CPUFreqPrefs *prefs) (TRUE && key_writable)); gtk_widget_set_sensitive (prefs->priv->show_perc, (TRUE && key_writable)); + gtk_widget_set_sensitive (prefs->priv->decimal_places_combo, + (TRUE && key_writable)); + gtk_widget_set_sensitive (prefs->priv->decimal_places_label, + (TRUE && key_writable)); - if (prefs->priv->show_text_mode == CPUFREQ_MODE_TEXT_PERCENTAGE) + if (prefs->priv->show_text_mode == CPUFREQ_MODE_TEXT_PERCENTAGE) { gtk_widget_set_sensitive (prefs->priv->show_unit, FALSE); - else + gtk_widget_set_sensitive (prefs->priv->decimal_places_combo, + FALSE); + gtk_widget_set_sensitive (prefs->priv->decimal_places_label, + FALSE); + } + else { gtk_widget_set_sensitive (prefs->priv->show_unit, (TRUE && key_writable)); + gtk_widget_set_sensitive (prefs->priv->decimal_places_combo, + (TRUE && key_writable)); + gtk_widget_set_sensitive (prefs->priv->decimal_places_label, + (TRUE && key_writable)); + } } else { gtk_widget_set_sensitive (prefs->priv->show_freq, FALSE); gtk_widget_set_sensitive (prefs->priv->show_unit, FALSE); gtk_widget_set_sensitive (prefs->priv->show_perc, FALSE); + gtk_widget_set_sensitive (prefs->priv->decimal_places_combo, FALSE); + gtk_widget_set_sensitive (prefs->priv->decimal_places_label, FALSE); } } @@ -428,6 +495,8 @@ cpufreq_prefs_dialog_update (CPUFreqPrefs *prefs) TRUE); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (prefs->priv->show_unit), FALSE); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (prefs->priv->decimal_places_combo), + FALSE); break; case CPUFREQ_MODE_TEXT_FREQUENCY_UNIT: @@ -435,6 +504,8 @@ cpufreq_prefs_dialog_update (CPUFreqPrefs *prefs) TRUE); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (prefs->priv->show_unit), TRUE); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (prefs->priv->decimal_places_combo), + TRUE); break; case CPUFREQ_MODE_TEXT_PERCENTAGE: @@ -487,6 +558,74 @@ cpufreq_prefs_dialog_cpu_combo_setup (CPUFreqPrefs *prefs) NULL); } +static void +decimal_places_combo_changed_cb (GtkComboBox *combo, CPUFreqPrefs *prefs) +{ + GtkTreeIter iter; + GtkTreeModel *model; + + if (gtk_combo_box_get_active_iter (combo, &iter)) { + gint value; + model = gtk_combo_box_get_model (combo); + gtk_tree_model_get (model, &iter, 0, &value, -1); + g_settings_set_int (prefs->priv->settings, "decimal-places", value); + } +} + +static void +cpufreq_prefs_dialog_decimal_places_combo_setup (CPUFreqPrefs *prefs) +{ + GtkListStore *model; + GtkTreeIter iter; + GtkCellRenderer *renderer; + gint i; + gint current_decimal_places; + + model = gtk_list_store_new (1, G_TYPE_INT); + gtk_combo_box_set_model (GTK_COMBO_BOX (prefs->priv->decimal_places_combo), + GTK_TREE_MODEL (model)); + + // Populate with 0, 1, 2... + for (i = 0; i <= MAX_DECIMAL_PLACES; i++) { + gtk_list_store_append (model, &iter); + gtk_list_store_set (model, &iter, + 0, i, + -1); + } + + g_object_unref (model); + + // Render numbers + renderer = gtk_cell_renderer_text_new (); + gtk_cell_layout_clear (GTK_CELL_LAYOUT (prefs->priv->decimal_places_combo)); + gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (prefs->priv->decimal_places_combo), + renderer, TRUE); + gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (prefs->priv->decimal_places_combo), + renderer, + "text", 0, + NULL); + + // Load current value from settings + current_decimal_places = g_settings_get_int (prefs->priv->settings, "decimal-places"); + + // Select the right row + GtkTreeModel *tree_model = gtk_combo_box_get_model (GTK_COMBO_BOX (prefs->priv->decimal_places_combo)); + if (gtk_tree_model_get_iter_first (tree_model, &iter)) { + do { + gint value; + gtk_tree_model_get (tree_model, &iter, 0, &value, -1); + if (value == current_decimal_places) { + gtk_combo_box_set_active_iter (GTK_COMBO_BOX (prefs->priv->decimal_places_combo), &iter); + break; + } + } while (gtk_tree_model_iter_next (tree_model, &iter)); + } + + // Keep settings updated when user changes selection + g_signal_connect (prefs->priv->decimal_places_combo, "changed", + G_CALLBACK (decimal_places_combo_changed_cb), prefs); +} + static void cpufreq_prefs_dialog_show_mode_combo_setup (CPUFreqPrefs *prefs) { @@ -540,6 +679,8 @@ cpufreq_prefs_dialog_create (CPUFreqPrefs *prefs) prefs->priv->show_freq = GTK_WIDGET (gtk_builder_get_object (builder, "prefs_show_freq")); prefs->priv->show_unit = GTK_WIDGET (gtk_builder_get_object (builder, "prefs_show_unit")); + prefs->priv->decimal_places_combo = GTK_WIDGET (gtk_builder_get_object (builder, "prefs_decimal_places")); + prefs->priv->decimal_places_label = GTK_WIDGET (gtk_builder_get_object (builder, "prefs_decimal_places_label")); prefs->priv->show_perc = GTK_WIDGET (gtk_builder_get_object (builder, "prefs_show_perc")); prefs->priv->monitor_settings_frame = GTK_WIDGET (gtk_builder_get_object (builder, @@ -552,6 +693,8 @@ cpufreq_prefs_dialog_create (CPUFreqPrefs *prefs) if (cpufreq_utils_get_n_cpus () > 1) cpufreq_prefs_dialog_cpu_combo_setup (prefs); + cpufreq_prefs_dialog_decimal_places_combo_setup (prefs); + g_signal_connect_swapped (prefs->priv->dialog, "response", G_CALLBACK (cpufreq_prefs_dialog_response_cb), prefs); @@ -575,6 +718,10 @@ cpufreq_prefs_dialog_create (CPUFreqPrefs *prefs) g_signal_connect (prefs->priv->show_mode_combo, "changed", G_CALLBACK (cpufreq_prefs_dialog_show_mode_changed), prefs); + + g_signal_connect (prefs->priv->decimal_places_combo, "changed", + G_CALLBACK (cpufreq_prefs_dialog_decimal_places_changed), + prefs); } void diff --git a/cpufreq/src/cpufreq-prefs.h b/cpufreq/src/cpufreq-prefs.h index 1a938f820..aab017c35 100644 --- a/cpufreq/src/cpufreq-prefs.h +++ b/cpufreq/src/cpufreq-prefs.h @@ -57,6 +57,7 @@ CPUFreqPrefs *cpufreq_prefs_new (GSettings *settings); guint cpufreq_prefs_get_cpu (CPUFreqPrefs *prefs); CPUFreqShowMode cpufreq_prefs_get_show_mode (CPUFreqPrefs *prefs); CPUFreqShowTextMode cpufreq_prefs_get_show_text_mode (CPUFreqPrefs *prefs); +guint cpufreq_prefs_get_decimal_places (CPUFreqPrefs *prefs); /* Properties dialog */ void cpufreq_preferences_dialog_run (CPUFreqPrefs *prefs, diff --git a/cpufreq/src/cpufreq-utils.c b/cpufreq/src/cpufreq-utils.c index 736806e81..7d2394143 100644 --- a/cpufreq/src/cpufreq-utils.c +++ b/cpufreq/src/cpufreq-utils.c @@ -215,7 +215,7 @@ cpufreq_utils_selector_is_available (void) #endif /* HAVE_POLKIT_MATE */ gchar * -cpufreq_utils_get_frequency_label (guint freq) +cpufreq_utils_get_frequency_label (guint freq, gint decimal_places) { gint divisor; @@ -226,8 +226,12 @@ cpufreq_utils_get_frequency_label (guint freq) if (((freq % divisor) == 0) || divisor == 1000) /* integer */ return g_strdup_printf ("%d", freq / divisor); - else /* float */ - return g_strdup_printf ("%3.2f", ((gfloat)freq / divisor)); + else { /* float */ + gchar format[16]; + g_snprintf (format, sizeof (format), "%%3.%df", decimal_places); + + return g_strdup_printf (format, ((gfloat)freq / divisor)); + } } gchar * diff --git a/cpufreq/src/cpufreq-utils.h b/cpufreq/src/cpufreq-utils.h index 7187b7a6f..67f22e1a6 100644 --- a/cpufreq/src/cpufreq-utils.h +++ b/cpufreq/src/cpufreq-utils.h @@ -24,6 +24,8 @@ #include +#define MAX_DECIMAL_PLACES 2 + G_BEGIN_DECLS /* Useful global methods */ @@ -31,7 +33,8 @@ guint cpufreq_utils_get_n_cpus (void); void cpufreq_utils_display_error (const gchar *message, const gchar *secondary); gboolean cpufreq_utils_selector_is_available (void); -gchar *cpufreq_utils_get_frequency_label (guint freq); +gchar *cpufreq_utils_get_frequency_label (guint freq, + gint decimal_places); gchar *cpufreq_utils_get_frequency_unit (guint freq); gboolean cpufreq_utils_governor_is_automatic (const gchar *governor); gboolean cpufreq_file_get_contents (const gchar *filename,