diff options
-rw-r--r-- | Makefile | 3 | ||||
-rw-r--r-- | bat_tray.c | 60 | ||||
-rw-r--r-- | defaults.c | 4 | ||||
-rw-r--r-- | defaults.h | 2 | ||||
-rw-r--r-- | getcore.c | 11 | ||||
-rw-r--r-- | getfreq.c | 38 | ||||
-rw-r--r-- | getfreq.h | 2 | ||||
-rw-r--r-- | tray.c | 50 |
8 files changed, 97 insertions, 73 deletions
@@ -31,7 +31,8 @@ EXTRA_CFLAGS+= -DPREFIX=\"$(PREFIX)\" \ -DTRAYFREQ_CONF=\"$(TRAYFREQ_CONF)\" \ -DLOCALEDIR=\"$(LOCALEDIR)\" \ -DSHAREDIR=\"$(SHAREDIR)\" \ - -DROOT_UID=$(ROOT_UID) + -DROOT_UID=$(ROOT_UID) \ + -D_GNU_SOURCE DEPS = bat_tray.h \ @@ -21,6 +21,7 @@ #include <gtk/gtk.h> #include <libintl.h> +#include <stdio.h> #include "common.h" #include "defaults.h" @@ -28,8 +29,7 @@ static GtkStatusIcon* tray; int bat_num; // Shortcoming: we only detect one battery -char CHARGE_VALUE_PATH[FILE_PATH_SIZE]; -char CHARGE_STATE_PATH[FILE_PATH_SIZE]; +char *CHARGE_VALUE_PATH, *CHARGE_STATE_PATH; /*********************************************************************** * Return the battery level percentage @@ -40,43 +40,41 @@ int get_bat_percent() } -#define TOOLTIP_TEXT_SIZE 128 -char tooltip_text[TOOLTIP_TEXT_SIZE]; - - /*********************************************************************** * Updates the battery tray tooltip text **********************************************************************/ static gboolean update_tooltip(GtkStatusIcon* status_icon,gint x,gint y,gboolean keyboard_mode,GtkTooltip* tooltip,gpointer data) { - char msg[TOOLTIP_TEXT_SIZE]; + char* msg; switch(get_battery_state()) { case STATE_DISCHARGING: debug("Discharging\n"); - sprintf(msg, _("Discharging (%d%%)"), get_bat_percent()); + asprintf(&msg, _("Discharging (%d%%)"), get_bat_percent()); break; case STATE_CHARGING: debug("Charging\n"); - sprintf(msg, _("Charging (%d%%)"), get_bat_percent()); + asprintf(&msg, _("Charging (%d%%)"), get_bat_percent()); break; case STATE_CHARGED: debug("Charged\n"); - sprintf(msg, _("Fully charged") ); + asprintf(&msg, _("Fully charged") ); break; default: debug("Unknown\n"); - sprintf(msg, _("Unknown status") ); + asprintf(&msg, _("Unknown status") ); break; } debug("Setting tooltip text to '%s'\n",msg); gtk_tooltip_set_text(tooltip, msg); + free(msg); + return true; } @@ -87,52 +85,55 @@ static gboolean update_tooltip(GtkStatusIcon* status_icon,gint x,gint y,gboolean gboolean update_icon(gpointer user_data) { char *icon_file; - char percent_string[4]; // worst case scenario 100 + \0 unsigned int rounded; rounded = 20* (int)((get_bat_percent()+10)/20); // Round percentage to 0, 20, 40, 60, 80 or 100 debug("Rounded/adjusted percentage: %d\n",rounded); - sprintf(percent_string, "%d", rounded); switch ( get_battery_state() ) { case STATE_DISCHARGING: - icon_file = g_strconcat(_DEFAULT_THEME, "/traybat-", percent_string, ".png", NULL); + asprintf(&icon_file,"%s/traybat-%d.png",_DEFAULT_THEME,rounded); break; case STATE_CHARGING: - icon_file = g_strconcat(_DEFAULT_THEME, "/traybat-", percent_string, "-charging.png", NULL); + asprintf(&icon_file,"%s/traybat-%d-charging.png",_DEFAULT_THEME,rounded); break; default: - icon_file = g_strconcat(_DEFAULT_THEME, "/traybat-charged.png", NULL); + asprintf(&icon_file,"%s/traybat-charged.png",_DEFAULT_THEME); break; } debug("Setting tray icon to '%s'\n",icon_file); gtk_status_icon_set_from_file(tray, icon_file); + + free(icon_file); + return true; } - /*********************************************************************** * Initialise the tray and related variables **********************************************************************/ void bat_tray_init() { + char *icon_file; + // Get the battery number, store it for later bat_num = get_bat_num(); // Set up battery info filenames/paths - sprintf(CHARGE_VALUE_PATH, "/sys/class/power_supply/BAT%d/capacity", bat_num); - sprintf(CHARGE_STATE_PATH, "/sys/class/power_supply/BAT%d/status", bat_num); + asprintf(&CHARGE_VALUE_PATH, "/sys/class/power_supply/BAT%d/capacity", bat_num); + asprintf(&CHARGE_STATE_PATH, "/sys/class/power_supply/BAT%d/status", bat_num); debug("Spawning new status icon\n"); tray = gtk_status_icon_new(); - char* icon_file = g_strconcat(_DEFAULT_THEME, "/traybat-charged.png", NULL); + asprintf(&icon_file,"%s/traybat-charged.png",_DEFAULT_THEME); gtk_status_icon_set_from_file(tray, icon_file); + free(icon_file); gtk_status_icon_set_has_tooltip (tray, TRUE); g_signal_connect(G_OBJECT(tray), "query-tooltip", GTK_SIGNAL_FUNC(update_tooltip), NULL); g_timeout_add(5000, update_icon, NULL); @@ -140,6 +141,16 @@ void bat_tray_init() /*********************************************************************** + * Free memory allocated in bat_tray_init() + **********************************************************************/ +void bat_tray_end() +{ + free(CHARGE_VALUE_PATH); + free(CHARGE_STATE_PATH); +} + + +/*********************************************************************** * Show the battery tray **********************************************************************/ void bat_tray_show() @@ -185,6 +196,7 @@ int get_battery_state() return STATE_UNKNOWN; } + /*********************************************************************** * Get the number of the first (who has more than one?) battery * Returns -1 if no battery present @@ -192,11 +204,11 @@ int get_battery_state() int get_bat_num() { FILE* fd; - gchar file[40]; + char* file; unsigned int i; - for(i = 0; i < 3; i++) + for(i = 0; i < 10; i++) { - sprintf(file, "/sys/class/power_supply/BAT%d/present", i); + asprintf(&file, "/sys/class/power_supply/BAT%d/present", i); debug("Attempting to open '%s'\n",file); if( (fd = fopen(file, "r")) ) { @@ -205,10 +217,12 @@ int get_bat_num() { debug("Battery %d is present\n",i); fclose(fd); + free(file); return i; } } } debug("Fallthrough: couldn't find battery\n"); + free(file); return -1; } @@ -26,7 +26,7 @@ char* _DEFAULT_PROG; char* _DEFAULT_BAT_GOV; char* _DEFAULT_AC_GOV; bool _DEFAULT_SHOW_BATTERY = true; -char _DEFAULT_THEME[2048]; // to do : make dynamic with malloc +char* _DEFAULT_THEME; void defaults_init() { @@ -36,5 +36,5 @@ void defaults_init() _DEFAULT_BAT_GOV = NULL; _DEFAULT_AC_GOV = NULL; _DEFAULT_SHOW_BATTERY = true; - sprintf (_DEFAULT_THEME, SHAREDIR"/trayfreq/themes/default"); + asprintf(&_DEFAULT_THEME, SHAREDIR"/trayfreq/themes/default"); } @@ -28,7 +28,7 @@ char* _DEFAULT_PROG; char* _DEFAULT_BAT_GOV; char* _DEFAULT_AC_GOV; bool _DEFAULT_SHOW_BATTERY; -char _DEFAULT_THEME[2048]; +char* _DEFAULT_THEME; void defaults_init(); @@ -33,12 +33,13 @@ unsigned int cores; **********************************************************************/ bool core_exists(unsigned int core) { - FILE* fd; - char path[128]; - - sprintf(path, "/sys/devices/system/cpu/cpu%d/cpufreq", core); + char* path; + int result; + asprintf(&path, "/sys/devices/system/cpu/cpu%d/cpufreq", core); debug("Checking if core %d exists by opening '%s'\n",core,path); - return (access(path, F_OK) != -1); + result = access(path, F_OK); + free (path); + return (result != -1); } @@ -35,9 +35,9 @@ int total_freqs; **********************************************************************/ void gf_init() { - gchar freq_string[500]; + char freq_string[500]; + unsigned int i; - int i = 0; for(i = 0; i < gc_number(); i++) { memset(freq_string, '\0', sizeof(freq_string) ); @@ -51,8 +51,8 @@ void gf_init() // freq_string is a space separated list of freqs so // iterate over each frequency in freq_string - gchar* curr = &freq_string[0]; - gchar* end_of_curr = g_strstr_len(curr, strlen(curr), " "); + char* curr = &freq_string[0]; + char* end_of_curr = g_strstr_len(curr, strlen(curr), " "); while(end_of_curr) { // TO DO : get rid of magic constants @@ -73,15 +73,16 @@ void gf_init() int gf_current(int core) { FILE* fd; - char buff[13]; - char path[80]; + char buff[13]; // TO DO : magic constant + char* path; int freq; - sprintf(path, "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_cur_freq", core); + asprintf(&path, "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_cur_freq", core); if(!(fd = fopen(path, "r"))) { debug("Couldn't open '%s'\n",path); + free(path); return -1; } @@ -90,43 +91,50 @@ int gf_current(int core) freq = atoi(buff); fclose(fd); debug("Found freq %d on core %d\n",freq,core); + + free(path); return freq; } /*********************************************************************** - * Populate out with available frequencies for core + * Populate `out` with available frequencies for core **********************************************************************/ int gf_available(int core, char* out, int size) { FILE* fd; - char path[80]; + char* path; - sprintf(path, "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_available_frequencies", core); + asprintf(&path, "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_available_frequencies", core); if(!(fd = fopen(path, "r"))) { debug("Couldn't open '%s'\n",path); + free(path); return -1; } fgets(out, size, fd); fclose(fd); + free(path); return 0; } /*********************************************************************** - * Populate out with a formatted, units-added freq label for freq + * Populate `out` with a formatted, units-added freq label for freq **********************************************************************/ -void gf_get_frequency_label(int freq, char* out) +char* gf_get_frequency_label(int freq) { + char *string; if(freq >= 1000000) // >= 1 million KHz (1GHz) - sprintf(out, "%.2f GHz", ((float)freq/1000000) ); + asprintf(&string, "%.2f GHz", ((float)freq/1000000) ); else - sprintf(out, "%.2d MHz", freq/1000); + asprintf(&string, "%.2d MHz", freq/1000); + + debug("Prepared freq label '%s' for freq %d\n",string,freq); - debug("Prepared freq label '%s' for freq %d\n",out,freq); + return string; } /*********************************************************************** @@ -22,7 +22,7 @@ void gf_init(); int gf_current(int core); int gf_available(int core, char* out, int size); -void gf_get_frequency_label(int freq, char* out); +char* gf_get_frequency_label(int freq); char* gf_freqa(int core, int index); int gf_freqi(int core, int index); int gf_number(); @@ -34,10 +34,10 @@ #include <libintl.h> -#define TOOLTIP_TEXT_SIZE 500 +//#define TOOLTIP_TEXT_SIZE 500 GtkStatusIcon* tray; -char tooltip_text[TOOLTIP_TEXT_SIZE]; +//char tooltip_text[TOOLTIP_TEXT_SIZE]; GtkWidget* menu; GSList* menu_items; @@ -128,7 +128,7 @@ static void tray_generate_menu() tray_clear_menu(); gg_init(); - char label[20]; + char *label; int i = 0; char current_governor[20]; @@ -140,11 +140,13 @@ static void tray_generate_menu() // Add available frequencies for(i = 0; i < gf_number(); ++i) { - memset(label, '\0', 20); - gf_get_frequency_label(gf_freqi(0, i), label); + label = gf_get_frequency_label(gf_freqi(0, i)); debug("Got freq label '%s', i=%d\n",label,i); GtkWidget* item = gtk_radio_menu_item_new_with_label(menu_items, label); + + free(label); + menu_items = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM (item)); if(g_strcmp0(current_governor, "userspace") == 0 && gf_freqi(0, i) == current_frequency) @@ -198,28 +200,28 @@ static void tray_generate_menu() **********************************************************************/ static gboolean update_tooltip(GtkStatusIcon* status_icon,gint x,gint y,gboolean keyboard_mode,GtkTooltip* tooltip,gpointer data) { - char msg[TOOLTIP_TEXT_SIZE]; - char current_governor[20]; - char label[20]; + char *msg, *label; + char current_governor[20]; // TO DO int i = 0; - memset(msg, '\0', sizeof(msg)); memset(current_governor, '\0', sizeof(current_governor) ); gg_current(0, current_governor, sizeof(current_governor) ); - sprintf(msg+strlen(msg), _("Governor: %s\n"), current_governor); + + asprintf(&msg, _("Governor: %s\n"), current_governor); for(i = 0; i < gc_number(); ++i) { - debug("Adding CPU%i's frequency\n",i); - memset(label, '\0', sizeof(label)); - gf_get_frequency_label(gf_current(i), label); - sprintf(msg+strlen(msg), _("CPU%i: %s%s"), i, label, i == gc_number()-1 ? "" : "\n"); + debug("Adding CPU%d's frequency\n",i); + label = gf_get_frequency_label(gf_current(i)); + asprintf(&msg, _("%sCPU%d: %s%s"), msg, i, label, i == gc_number()-1 ? "" : "\n"); + free(label); } debug("Setting tooltip text\n"); - tray_set_tooltip(msg); - gtk_tooltip_set_text(tooltip, tooltip_text); + gtk_tooltip_set_text(tooltip, msg); + + free(msg); return TRUE; } @@ -326,8 +328,8 @@ void tray_init() void tray_set_tooltip(const char* msg) { debug("Setting up toolip var with text '%s'\n",msg); - memset(tooltip_text, '\0', TOOLTIP_TEXT_SIZE); - memmove(tooltip_text, msg, strlen(msg)); + //memset(tooltip_text, '\0', TOOLTIP_TEXT_SIZE); + //memmove(tooltip_text, msg, strlen(msg)); } /********************************************************************** @@ -335,6 +337,7 @@ void tray_set_tooltip(const char* msg) **********************************************************************/ void tray_update_icon_percent() { + char* file; gulong max_frequency = gf_freqi(0, 0); gint adjusted_percent = 0; // If no governor, set percentage to 0. This if statement fixes an FPE a few lines down @@ -358,16 +361,13 @@ void tray_update_icon_percent() } } - debug("Rounded/adjusted bat percentage: %d\n",adjusted_percent); - /* convert the int to a string */ - char adjusted_percent_string[] = {'\0', '\0', '\0', '\0'}; - sprintf(adjusted_percent_string, "%i", adjusted_percent); - - char* file = g_strconcat(_DEFAULT_THEME, "/cpufreq-", adjusted_percent_string, ".png", NULL); + debug("Rounded/adjusted CPU percentage: %d\n",adjusted_percent); + asprintf(&file, "%s/cpufreq-%d.png", _DEFAULT_THEME,adjusted_percent); debug("Setting tray icon to '%s'\n",file); gtk_status_icon_set_from_file(tray, file); - g_free(file); + + free(file); } |