diff --git a/panel-plugin/netload.c b/panel-plugin/netload.c index 7f883d8..cad0021 100644 --- a/panel-plugin/netload.c +++ b/panel-plugin/netload.c @@ -51,6 +51,8 @@ static gchar* DEFAULT_COLOR[] = { "#FF4F00", "#FFE500" }; #define UPDATE_TIMEOUT 250 #define MAX_LENGTH 10 +#define MAX_COMMAND_LENGTH 128 +#define MAX_COMMAND_OUTPUT_LENGTH 10 /* enough? */ #define IN 0 #define OUT 1 @@ -69,6 +71,7 @@ typedef struct { gboolean use_label; gboolean show_margin; + gboolean run_command; gboolean show_bars; gboolean show_values; gboolean colorize_values; @@ -78,6 +81,7 @@ typedef struct GdkColor color[SUM]; gchar *label_text; gchar *network_device; + gchar *command; gchar *old_network_device; } t_monitor_options; @@ -108,6 +112,8 @@ typedef struct /* Network device */ GtkWidget *net_entry; + GtkWidget *opt_run_command; + GtkWidget *opt_command; /* Maximum */ GtkWidget *max_use_label; @@ -124,6 +130,7 @@ typedef struct GtkWidget *opt_button[SUM]; GtkWidget *opt_da[SUM]; GtkWidget *opt_colorize_values; + GtkWidget *opt_show_margin; } t_monitor; @@ -375,6 +382,8 @@ static t_global_monitor * monitor_new(XfcePanelPlugin *plugin) global->monitor->options.label_text = g_strdup(DEFAULT_TEXT); global->monitor->options.network_device = g_strdup(""); global->monitor->options.old_network_device = g_strdup(""); + global->monitor->options.run_command = FALSE; + global->monitor->options.command = g_strdup(""); global->monitor->options.use_label = TRUE; global->monitor->options.show_values = FALSE; global->monitor->options.show_margin = TRUE; @@ -442,6 +451,41 @@ static t_global_monitor * monitor_new(XfcePanelPlugin *plugin) /* ---------------------------------------------------------------------------------------------- */ +static void run_piped_command(gchar *command, + gchar **out_device) +{ + gchar output[MAX_COMMAND_OUTPUT_LENGTH + 1]; + gchar *i = output; + FILE *file; + + if(!command || !out_device) + return; /* What is the XFCE way of dealing with null pointers? */ + + if(!(file = popen(command, "r"))) + return; /* What about if command fails to run? */ + + /* read only one line */ + fgets(output, sizeof(output) - 1, file); + + /* sanitize output by removing new line, which is presumably at the end (given the nature + of fgets */ + while(*i) { + if(*i == '\n') { + *i = NULL; + break; + } + + i++; + } + + if(*out_device) + g_free(*out_device); + + *out_device = g_strdup(output); +} + + +/* ---------------------------------------------------------------------------------------------- */ static void setup_monitor(t_global_monitor *global, gboolean supress_warnings) { gint i; @@ -515,8 +559,13 @@ static void setup_monitor(t_global_monitor *global, gboolean supress_warnings) } } + if(global->monitor->options.run_command) { + run_piped_command(global->monitor->options.command, + &global->monitor->options.network_device); + } + if (!init_netload( &(global->monitor->data), global->monitor->options.network_device) - && !supress_warnings) + && !supress_warnings) { xfce_dialog_show_error (NULL, NULL, _("%s: Error in initializing:\n%s"), @@ -583,7 +632,17 @@ static void monitor_read_config(XfcePanelPlugin *plugin, t_global_monitor *globa if (global->monitor->options.network_device) g_free(global->monitor->options.network_device); global->monitor->options.network_device = g_strdup(value); - } + } + + global->monitor->options.run_command = xfce_rc_read_bool_entry (rc, "Run_Command", FALSE); + + if ((value = xfce_rc_read_entry (rc, "Command", NULL)) && *value) + { + if (global->monitor->options.command) + g_free(global->monitor->options.command); + global->monitor->options.command = g_strdup(value); + } + if ((value = xfce_rc_read_entry (rc, "Max_In", NULL)) != NULL) { global->monitor->options.max[IN] = strtol (value, NULL, 0); @@ -644,6 +703,9 @@ static void monitor_write_config(XfcePanelPlugin *plugin, t_global_monitor *glob xfce_rc_write_entry (rc, "Network_Device", global->monitor->options.network_device ? global->monitor->options.network_device : ""); + + xfce_rc_write_bool_entry (rc, "Run_Command", global->monitor->options.run_command); + xfce_rc_write_entry( rc, "Command", global->monitor->options.command); g_snprintf(value, 20, "%lu", global->monitor->options.max[IN]); xfce_rc_write_entry (rc, "Max_In", value); @@ -703,6 +765,13 @@ static void monitor_apply_options(t_global_monitor *global) } global->monitor->options.network_device = g_strdup(gtk_entry_get_text(GTK_ENTRY(global->monitor->net_entry))); + + if (global->monitor->options.command) + g_free(global->monitor->options.command); + + global->monitor->options.command = + g_strdup(gtk_entry_get_text(GTK_ENTRY(global->monitor->opt_command))); + setup_monitor(global, FALSE); for( i = 0; i < SUM; i++ ) @@ -826,9 +895,8 @@ static void max_label_toggled(GtkWidget *check_button, t_global_monitor *global) /* ---------------------------------------------------------------------------------------------- */ static void colorize_values_toggled(GtkWidget *check_button, t_global_monitor *global) { - global->monitor->options.colorize_values = !global->monitor->options.colorize_values; - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(global->monitor->opt_colorize_values), - global->monitor->options.colorize_values); + global->monitor->options.colorize_values = + gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(global->monitor->opt_colorize_values)); setup_monitor(global, FALSE); PRINT_DBG("colorize_values_toggled"); } @@ -837,15 +905,28 @@ static void colorize_values_toggled(GtkWidget *check_button, t_global_monitor *g /* ---------------------------------------------------------------------------------------------- */ static void show_margin_toggled(GtkWidget *check_button, t_global_monitor *global) { - global->monitor->options.show_margin = !global->monitor->options.show_margin; - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(global->monitor->opt_show_margin), - global->monitor->options.show_margin); + global->monitor->options.show_margin = + gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(global->monitor->opt_show_margin)); setup_monitor(global, FALSE); PRINT_DBG("show_margin_toggled"); } /* ---------------------------------------------------------------------------------------------- */ +static void run_command_toggled(GtkWidget *check_button, t_global_monitor *global) +{ + global->monitor->options.run_command = + gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(global->monitor->opt_run_command)); + gtk_widget_set_sensitive(GTK_WIDGET(global->monitor->net_entry), + !global->monitor->options.run_command); + gtk_widget_set_sensitive(GTK_WIDGET(global->monitor->opt_command), + global->monitor->options.run_command); + setup_monitor(global, FALSE); + PRINT_DBG("run_command_toggled"); +} + + +/* ---------------------------------------------------------------------------------------------- */ static gboolean expose_event_cb(GtkWidget *widget, GdkEventExpose *event) { if (widget->window) @@ -1021,7 +1102,7 @@ static void monitor_create_options(XfcePanelPlugin *plugin, t_global_monitor *gl MAX_LENGTH); gtk_entry_set_text(GTK_ENTRY(global->monitor->net_entry), global->monitor->options.network_device); - gtk_widget_show(global->monitor->opt_entry); + gtk_widget_show(global->monitor->net_entry); gtk_box_pack_start(GTK_BOX(net_hbox), GTK_WIDGET(global->monitor->net_entry), FALSE, FALSE, 0); @@ -1029,7 +1110,37 @@ static void monitor_create_options(XfcePanelPlugin *plugin, t_global_monitor *gl gtk_size_group_add_widget(sg, device_label); gtk_widget_show_all(GTK_WIDGET(net_hbox)); + + /* Run command */ + net_hbox = GTK_BOX(gtk_hbox_new(FALSE, 5)); + gtk_box_pack_start(GTK_BOX(global->monitor->opt_vbox), + GTK_WIDGET(net_hbox), FALSE, FALSE, 0); + + global->monitor->opt_run_command = + gtk_check_button_new_with_mnemonic(_("Run comm_and:")); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(global->monitor->opt_run_command), + global->monitor->options.run_command); + + gtk_box_pack_start(GTK_BOX(net_hbox), GTK_WIDGET(global->monitor->opt_run_command), + FALSE, FALSE, 0); + + global->monitor->opt_command = gtk_entry_new(); + gtk_entry_set_max_length(GTK_ENTRY(global->monitor->opt_command), + MAX_COMMAND_LENGTH); + gtk_entry_set_text(GTK_ENTRY(global->monitor->opt_command), + global->monitor->options.command); + gtk_widget_show(global->monitor->opt_command); + gtk_widget_set_sensitive(GTK_WIDGET(global->monitor->opt_command), + global->monitor->options.run_command); + gtk_widget_set_sensitive(GTK_WIDGET(global->monitor->net_entry), + !global->monitor->options.run_command); + + gtk_box_pack_start(GTK_BOX(net_hbox), GTK_WIDGET(global->monitor->opt_command), + FALSE, FALSE, 0); + gtk_size_group_add_widget(sg, global->monitor->opt_run_command); + + gtk_widget_show_all(GTK_WIDGET(net_hbox)); /* Update timevalue */ update_hbox = GTK_BOX(gtk_hbox_new(FALSE, 5)); @@ -1219,6 +1330,8 @@ static void monitor_create_options(XfcePanelPlugin *plugin, t_global_monitor *gl G_CALLBACK(colorize_values_toggled), global); g_signal_connect(GTK_WIDGET(global->monitor->opt_show_margin), "toggled", G_CALLBACK(show_margin_toggled), global); + g_signal_connect(GTK_WIDGET(global->monitor->opt_run_command), "toggled", + G_CALLBACK(run_command_toggled), global); g_signal_connect(GTK_WIDGET(global->monitor->opt_da[0]), "expose_event", G_CALLBACK(expose_event_cb), NULL); g_signal_connect(GTK_WIDGET(global->monitor->opt_da[1]), "expose_event",