/* * Copyright (c) 2003 Benedikt Meurer * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #include "net.h" /* for xml: */ #define MONITOR_ROOT "Netload" static GtkTooltips *tooltips = NULL; extern xmlDocPtr xmlconfig; #define MYDATA(node) xmlNodeListGetString(xmlconfig, node->children, 1) /* Defaults */ #define DEFAULT_TEXT "Net" #define DEFAULT_DEVICE "eth0" static gchar* DEFAULT_COLOR[] = { "#FF4F00", "#FFE500" }; #define UPDATE_TIMEOUT 250 #define MAX_LENGTH 10 #define IN 0 #define OUT 1 #define SUM 2 #define TOT 2 typedef struct { gboolean use_label; GdkColor color[SUM]; gchar *label_text; gchar *network_device; } t_monitor_options; typedef struct { GtkWidget *box; GtkWidget *label; GtkWidget *status[SUM]; GtkWidget *ebox; gulong history[SUM][4]; gulong value_read[SUM]; t_monitor_options options; /*options*/ GtkBox *opt_vbox; GtkWidget *opt_entry; GtkBox *opt_hbox; GtkWidget *net_entry; GtkWidget *opt_use_label; GtkWidget *opt_button[SUM]; GtkWidget *opt_da[SUM]; } t_monitor; typedef struct { GtkWidget *ebox; GtkWidget *box; guint timeout_id; t_monitor *monitor; /* options dialog */ GtkWidget *opt_dialog; } t_global_monitor; static gint update_monitors(t_global_monitor *global) { static guint64 net_max[SUM] = { 2000, 2000 }; gchar caption[BUFSIZ]; guint64 net[SUM+1]; gint i; get_current_netload( global->monitor->options.network_device, &(net[IN]), &(net[OUT]), &(net[TOT]) ); for (i = 0; i < SUM; i++) { /* correct value to be from 1 ... 100 */ global->monitor->history[i][0] = (int)((double)net[i] / net_max[i] * 100); if (global->monitor->history[i][0] > 100) { global->monitor->history[i][0] = 100; } else if (global->monitor->history[i][0] < 0) { global->monitor->history[i][0] = 0; } global->monitor->value_read[i] = (global->monitor->history[i][0] + global->monitor->history[i][1] + global->monitor->history[i][2] + global->monitor->history[i][3]) / 4; global->monitor->history[i][3] = global->monitor->history[i][2]; global->monitor->history[i][2] = global->monitor->history[i][1]; global->monitor->history[i][1] = global->monitor->history[i][0]; gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(global->monitor->status[i]), global->monitor->value_read[i] / 100.0); /* update maximum */ if (global->monitor->value_read[i] > net_max[i]) { net_max[i] = net[i]; } } g_snprintf(caption, sizeof(caption), _("Incoming: %lld bit/s\nOutgoing: %lld bit/s\nTotal: %lld bit/s"), net[IN], net[OUT], net[TOT]); gtk_tooltips_set_tip(tooltips, GTK_WIDGET(global->monitor->ebox), caption, NULL); return TRUE; } static t_global_monitor * monitor_new(void) { t_global_monitor *global; GtkRcStyle *rc; gint i; global = g_new(t_global_monitor, 1); global->timeout_id = 0; global->ebox = gtk_event_box_new(); gtk_widget_show(global->ebox); global->box = gtk_hbox_new(FALSE, 0); gtk_widget_show(global->box); if (!tooltips) { tooltips = gtk_tooltips_new(); } global->monitor = g_new(t_monitor, 1); global->monitor->options.label_text = g_strdup(DEFAULT_TEXT); global->monitor->options.network_device = g_strdup(DEFAULT_DEVICE); global->monitor->options.use_label = TRUE; for (i = 0; i < SUM; i++) { gdk_color_parse(DEFAULT_COLOR[i], &global->monitor->options.color[i]); global->monitor->history[i][0] = 0; global->monitor->history[i][1] = 0; global->monitor->history[i][2] = 0; global->monitor->history[i][3] = 0; } global->monitor->ebox = gtk_event_box_new(); gtk_widget_show(global->monitor->ebox); global->monitor->box = GTK_WIDGET(gtk_hbox_new(FALSE, 0)); gtk_container_set_border_width(GTK_CONTAINER(global->monitor->box), border_width); gtk_widget_show(GTK_WIDGET(global->monitor->box)); gtk_container_add(GTK_CONTAINER(global->monitor->ebox), GTK_WIDGET(global->monitor->box)); global->monitor->label = gtk_label_new(global->monitor->options.label_text); gtk_widget_show(global->monitor->label); gtk_box_pack_start(GTK_BOX(global->monitor->box), GTK_WIDGET(global->monitor->label), FALSE, FALSE, 0); for (i = 0; i < SUM; i++) { global->monitor->status[i] = GTK_WIDGET(gtk_progress_bar_new()); gtk_progress_bar_set_orientation(GTK_PROGRESS_BAR(global->monitor->status[i]), GTK_PROGRESS_BOTTOM_TO_TOP); rc = gtk_widget_get_modifier_style(GTK_WIDGET(global->monitor->status[i])); if (!rc) { rc = gtk_rc_style_new(); } else { rc->color_flags[GTK_STATE_PRELIGHT] |= GTK_RC_BG; rc->bg[GTK_STATE_PRELIGHT] = global->monitor->options.color[i]; } gtk_widget_modify_style(GTK_WIDGET(global->monitor->status[i]), rc); gtk_widget_show(GTK_WIDGET(global->monitor->status[i])); gtk_box_pack_start(GTK_BOX(global->monitor->box), GTK_WIDGET(global->monitor->status[i]), FALSE, FALSE, 0); } gtk_box_pack_start(GTK_BOX(global->box), GTK_WIDGET(global->monitor->ebox), FALSE, FALSE, 0); gtk_container_add(GTK_CONTAINER(global->ebox), GTK_WIDGET(global->box)); return global; } static void monitor_set_orientation (Control * ctrl, int orientation) { t_global_monitor *global = ctrl->data; GtkRcStyle *rc; gint i; if (global->timeout_id) { g_source_remove(global->timeout_id); } gtk_widget_hide(GTK_WIDGET(global->ebox)); gtk_container_remove(GTK_CONTAINER(global->ebox), GTK_WIDGET(global->box)); if (orientation == HORIZONTAL) { global->box = gtk_hbox_new(FALSE, 0); } else { global->box = gtk_vbox_new(FALSE, 0); } gtk_widget_show(global->box); global->monitor->label = gtk_label_new(global->monitor->options.label_text); gtk_widget_show(global->monitor->label); for (i = 0; i < SUM; i++) { global->monitor->status[i] = GTK_WIDGET(gtk_progress_bar_new()); } if (orientation == HORIZONTAL) { global->monitor->box = GTK_WIDGET(gtk_hbox_new(FALSE, 0)); for (i = 0; i < SUM; i++) { gtk_progress_bar_set_orientation(GTK_PROGRESS_BAR(global->monitor->status[i]), GTK_PROGRESS_BOTTOM_TO_TOP); } } else { global->monitor->box = GTK_WIDGET(gtk_vbox_new(FALSE, 0)); for (i = 0; i < SUM; i++) { gtk_progress_bar_set_orientation(GTK_PROGRESS_BAR(global->monitor->status[i]), GTK_PROGRESS_LEFT_TO_RIGHT); } } gtk_box_pack_start(GTK_BOX(global->monitor->box), GTK_WIDGET(global->monitor->label), FALSE, FALSE, 0); gtk_container_set_border_width(GTK_CONTAINER(global->monitor->box), border_width); gtk_widget_show(GTK_WIDGET(global->monitor->box)); global->monitor->ebox = gtk_event_box_new(); gtk_widget_show(global->monitor->ebox); gtk_container_add(GTK_CONTAINER(global->monitor->ebox), GTK_WIDGET(global->monitor->box)); for (i = 0; i < SUM; i++) { rc = gtk_widget_get_modifier_style(GTK_WIDGET(global->monitor->status[i])); if (!rc) { rc = gtk_rc_style_new(); } if (rc) { rc->color_flags[GTK_STATE_PRELIGHT] |= GTK_RC_BG; rc->bg[GTK_STATE_PRELIGHT] = global->monitor->options.color[i]; } gtk_widget_modify_style(GTK_WIDGET(global->monitor->status[i]), rc); gtk_widget_show(GTK_WIDGET(global->monitor->status[i])); gtk_box_pack_start(GTK_BOX(global->monitor->box), GTK_WIDGET(global->monitor->status[i]), FALSE, FALSE, 0); } gtk_box_pack_start(GTK_BOX(global->box), GTK_WIDGET(global->monitor->ebox), FALSE, FALSE, 0); gtk_container_add(GTK_CONTAINER(global->ebox), GTK_WIDGET(global->box)); gtk_widget_show(GTK_WIDGET(global->ebox)); global->timeout_id = g_timeout_add(UPDATE_TIMEOUT, (GtkFunction)update_monitors, global); } static gboolean monitor_control_new(Control *ctrl) { t_global_monitor *global; global = monitor_new(); gtk_container_add(GTK_CONTAINER(ctrl->base), GTK_WIDGET(global->ebox)); if (!global->timeout_id) { global->timeout_id = g_timeout_add(UPDATE_TIMEOUT, (GtkFunction)update_monitors, global); } ctrl->data = (gpointer)global; ctrl->with_popup = FALSE; gtk_widget_set_size_request(ctrl->base, -1, -1); return TRUE; } static void monitor_free(Control *ctrl) { t_global_monitor *global; g_return_if_fail(ctrl != NULL); g_return_if_fail(ctrl->data != NULL); global = (t_global_monitor *)ctrl->data; if (global->timeout_id) { g_source_remove(global->timeout_id); } if (global->monitor->options.label_text) { g_free(global->monitor->options.label_text); } g_free(global); } static void setup_monitor(t_global_monitor *global) { GtkRcStyle *rc; gint i; gtk_widget_hide(GTK_WIDGET(global->monitor->ebox)); gtk_widget_hide(global->monitor->label); gtk_label_set_text(GTK_LABEL(global->monitor->label), global->monitor->options.label_text); for (i = 0; i < SUM; i++) { gtk_widget_hide(GTK_WIDGET(global->monitor->status[i])); rc = gtk_widget_get_modifier_style(GTK_WIDGET(global->monitor->status[i])); if (!rc) { rc = gtk_rc_style_new(); } else { rc->color_flags[GTK_STATE_PRELIGHT] |= GTK_RC_BG; rc->bg[GTK_STATE_PRELIGHT] = global->monitor->options.color[i]; } gtk_widget_modify_style(GTK_WIDGET(global->monitor->status[i]), rc); gtk_widget_show(GTK_WIDGET(global->monitor->status[i])); } gtk_widget_show(GTK_WIDGET(global->monitor->ebox)); if (global->monitor->options.use_label) { gtk_widget_show(global->monitor->label); } } static void monitor_read_config(Control *ctrl, xmlNodePtr node) { xmlChar *value; t_global_monitor *global; global = (t_global_monitor *)ctrl->data; if (node == NULL || node->children == NULL) { return; } for (node = node->children; node; node = node->next) { if (xmlStrEqual(node->name, (const xmlChar *)MONITOR_ROOT)) { if ((value = xmlGetProp(node, (const xmlChar *)"Use_Label"))) { global->monitor->options.use_label = atoi(value); g_free(value); } if ((value = xmlGetProp(node, (const xmlChar *)"Color_In"))) { gdk_color_parse(value, &global->monitor->options.color[IN]); g_free(value); } if ((value = xmlGetProp(node, (const xmlChar *)"Color_Out"))) { gdk_color_parse(value, &global->monitor->options.color[OUT]); g_free(value); } if ((value = xmlGetProp(node, (const xmlChar *) "Text"))) { if (global->monitor->options.label_text) g_free(global->monitor->options.label_text); global->monitor->options.label_text = g_strdup((gchar *)value); g_free(value); } if ((value = xmlGetProp(node, (const xmlChar *) "Network_Device"))) { if (global->monitor->options.network_device) g_free(global->monitor->options.network_device); global->monitor->options.network_device = g_strdup((gchar *)value); g_free(value); } break; } } setup_monitor(global); } static void monitor_write_config(Control *ctrl, xmlNodePtr parent) { xmlNodePtr root; char value[10]; t_global_monitor *global; global = (t_global_monitor *)ctrl->data; root = xmlNewTextChild(parent, NULL, MONITOR_ROOT, NULL); g_snprintf(value, 2, "%d", global->monitor->options.use_label); xmlSetProp(root, "Use_Label", value); g_snprintf(value, 8, "#%02X%02X%02X", (guint)global->monitor->options.color[IN].red >> 8, (guint)global->monitor->options.color[IN].green >> 8, (guint)global->monitor->options.color[IN].blue >> 8); xmlSetProp(root, "Color_In", value); g_snprintf(value, 8, "#%02X%02X%02X", (guint)global->monitor->options.color[OUT].red >> 8, (guint)global->monitor->options.color[OUT].green >> 8, (guint)global->monitor->options.color[OUT].blue >> 8); xmlSetProp(root, "Color_Out", value); if (global->monitor->options.label_text) { xmlSetProp(root, "Text", global->monitor->options.label_text); } else { xmlSetProp(root, "Text", DEFAULT_TEXT); } if (global->monitor->options.network_device) { xmlSetProp(root, "Network_Device", global->monitor->options.network_device); } else { xmlSetProp(root, "Network_Device", DEFAULT_DEVICE); } root = xmlNewTextChild(parent, NULL, MONITOR_ROOT, NULL); } static void monitor_attach_callback(Control *ctrl, const gchar *signal, GCallback cb, gpointer data) { t_global_monitor *global; global = (t_global_monitor *)ctrl->data; g_signal_connect(global->ebox, signal, cb, data); } static void monitor_set_size(Control *ctrl, int size) { /* do the resize */ t_global_monitor *global; gint i; global = (t_global_monitor *)ctrl->data; for (i = 0; i < SUM; i++) { if (settings.orientation == HORIZONTAL) { gtk_widget_set_size_request(GTK_WIDGET(global->monitor->status[i]), 6 + 2 * size, icon_size[size]); } else { gtk_widget_set_size_request(GTK_WIDGET(global->monitor->status[i]), icon_size[size], 6 + 2 * size); } gtk_widget_queue_resize(GTK_WIDGET(global->monitor->status[i])); } setup_monitor(global); } static void monitor_apply_options_cb(GtkWidget *button, t_global_monitor *global) { if (global->monitor->options.label_text) { g_free(global->monitor->options.label_text); } global->monitor->options.label_text = g_strdup(gtk_entry_get_text(GTK_ENTRY(global->monitor->opt_entry))); setup_monitor(global); if (global->monitor->options.network_device) { g_free(global->monitor->options.network_device); } global->monitor->options.network_device = g_strdup(gtk_entry_get_text(GTK_ENTRY(global->monitor->net_entry))); setup_monitor(global); } static void label_changed(GtkWidget *button, t_global_monitor *global) { if (global->monitor->options.label_text) { g_free(global->monitor->options.label_text); } global->monitor->options.label_text = g_strdup(gtk_entry_get_text(GTK_ENTRY(global->monitor->opt_entry))); setup_monitor(global); } static void network_changed(GtkWidget *button, t_global_monitor *global) { if (global->monitor->options.network_device) { g_free(global->monitor->options.network_device); } global->monitor->options.network_device = g_strdup(gtk_entry_get_text(GTK_ENTRY(global->monitor->net_entry))); setup_monitor(global); } static void label_toggled(GtkWidget *check_button, t_global_monitor *global) { global->monitor->options.use_label = !global->monitor->options.use_label; gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(global->monitor->opt_use_label), global->monitor->options.use_label); gtk_widget_set_sensitive(GTK_WIDGET(global->monitor->opt_entry), global->monitor->options.use_label); setup_monitor(global); } static gboolean expose_event_cb(GtkWidget *widget, GdkEventExpose *event) { if (widget->window) { GtkStyle *style; style = gtk_widget_get_style(widget); gdk_draw_rectangle(widget->window, style->bg_gc[GTK_STATE_NORMAL], TRUE, event->area.x, event->area.y, event->area.width, event->area.height); } return TRUE; } static void change_color(GtkWidget *button, t_global_monitor *global, gint type) { GtkWidget *dialog; GtkColorSelection *colorsel; gint response; dialog = gtk_color_selection_dialog_new(_("Select color")); gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(global->opt_dialog)); colorsel = GTK_COLOR_SELECTION(GTK_COLOR_SELECTION_DIALOG(dialog)->colorsel); gtk_color_selection_set_previous_color(colorsel, &global->monitor->options.color[type]); gtk_color_selection_set_current_color(colorsel, &global->monitor->options.color[type]); gtk_color_selection_set_has_palette(colorsel, TRUE); response = gtk_dialog_run(GTK_DIALOG(dialog)); if (response == GTK_RESPONSE_OK) { gtk_color_selection_get_current_color(colorsel, &global->monitor->options.color[type]); gtk_widget_modify_bg(global->monitor->opt_da[type], GTK_STATE_NORMAL, &global->monitor->options.color[type]); setup_monitor(global); } gtk_widget_destroy(dialog); } static void change_color_in(GtkWidget *button, t_global_monitor *global) { change_color(button, global, IN); } static void change_color_out(GtkWidget *button, t_global_monitor *global) { change_color(button, global, OUT); } static void monitor_create_options(Control *control, GtkContainer *container, GtkWidget *done) { t_global_monitor *global; GtkBox *vbox, *global_vbox; GtkBox *hbox[SUM+1]; GtkWidget *device_label; GtkWidget *color_label[SUM]; GtkWidget *align; GtkSizeGroup *sg; gint i; gchar *color_text[] = { N_("Bar color (incoming):"), N_("Bar color (outgoing):") }; global = (t_global_monitor *)control->data; global->opt_dialog = gtk_widget_get_toplevel(done); global_vbox = GTK_BOX(gtk_vbox_new(FALSE, 5)); gtk_container_add(GTK_CONTAINER(container), GTK_WIDGET(global_vbox)); gtk_widget_show_all(GTK_WIDGET(global_vbox)); vbox = GTK_BOX(gtk_vbox_new(FALSE, 5)); gtk_widget_show(GTK_WIDGET(vbox)); global->monitor->opt_vbox = GTK_BOX(gtk_vbox_new(FALSE, 5)); gtk_widget_show(GTK_WIDGET(global->monitor->opt_vbox)); global->monitor->opt_hbox = GTK_BOX(gtk_hbox_new(FALSE, 5)); gtk_widget_show(GTK_WIDGET(global->monitor->opt_hbox)); global->monitor->opt_use_label = gtk_check_button_new_with_mnemonic(_("Text to display:")); gtk_widget_show(global->monitor->opt_use_label); gtk_box_pack_start(GTK_BOX(global->monitor->opt_hbox), GTK_WIDGET(global->monitor->opt_use_label), FALSE, FALSE, 0); global->monitor->opt_entry = gtk_entry_new(); gtk_entry_set_max_length(GTK_ENTRY(global->monitor->opt_entry), MAX_LENGTH); gtk_entry_set_text(GTK_ENTRY(global->monitor->opt_entry), global->monitor->options.label_text); gtk_widget_show(global->monitor->opt_entry); gtk_box_pack_start(GTK_BOX(global->monitor->opt_hbox), GTK_WIDGET(global->monitor->opt_entry), FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(global->monitor->opt_vbox), GTK_WIDGET(global->monitor->opt_hbox), FALSE, FALSE, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(global->monitor->opt_use_label), global->monitor->options.use_label); gtk_widget_set_sensitive(GTK_WIDGET(global->monitor->opt_entry), global->monitor->options.use_label); /* Network device */ hbox[0] = GTK_BOX(gtk_hbox_new(FALSE, 5)); gtk_box_pack_start(GTK_BOX(global->monitor->opt_vbox), GTK_WIDGET(hbox[0]), FALSE, FALSE, 0); device_label = gtk_label_new(_("Network device:")); gtk_misc_set_alignment(GTK_MISC(device_label), 0, 0.5); gtk_widget_show(GTK_WIDGET(device_label)); gtk_box_pack_start(GTK_BOX(hbox[0]), GTK_WIDGET(device_label), FALSE, FALSE, 0); global->monitor->net_entry = gtk_entry_new(); gtk_entry_set_max_length(GTK_ENTRY(global->monitor->net_entry), 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_box_pack_start(GTK_BOX(hbox[0]), GTK_WIDGET(global->monitor->net_entry), FALSE, FALSE, 0); sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); gtk_size_group_add_widget(sg, global->monitor->opt_use_label); gtk_size_group_add_widget(sg, device_label); gtk_widget_show_all(GTK_WIDGET(hbox[0])); /* Color 1 */ for (i = 0; i < SUM; i++) { hbox[i+1] = GTK_BOX(gtk_hbox_new(FALSE, 5)); gtk_widget_show(GTK_WIDGET(hbox[i+1])); gtk_box_pack_start(GTK_BOX(global->monitor->opt_vbox), GTK_WIDGET(hbox[i+1]), FALSE, FALSE, 0); color_label[i] = gtk_label_new(_(color_text[i])); gtk_misc_set_alignment(GTK_MISC(color_label[i]), 0, 0.5); gtk_widget_show(GTK_WIDGET(color_label[i])); gtk_box_pack_start(GTK_BOX(hbox[i+1]), GTK_WIDGET(color_label[i]), FALSE, FALSE, 0); global->monitor->opt_button[i] = gtk_button_new(); global->monitor->opt_da[i] = gtk_drawing_area_new(); gtk_widget_modify_bg(global->monitor->opt_da[i], GTK_STATE_NORMAL, &global->monitor->options.color[i]); gtk_widget_set_size_request(global->monitor->opt_da[i], 64, 12); gtk_container_add(GTK_CONTAINER(global->monitor->opt_button[i]), global->monitor->opt_da[i]); gtk_widget_show(GTK_WIDGET(global->monitor->opt_button[i])); gtk_widget_show(GTK_WIDGET(global->monitor->opt_da[i])); gtk_box_pack_start(GTK_BOX(hbox[i+1]), GTK_WIDGET(global->monitor->opt_button[i]), FALSE, FALSE, 0); gtk_size_group_add_widget(sg, color_label[i]); gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(global->monitor->opt_vbox), FALSE, FALSE, 0); } align = gtk_alignment_new(0, 0, 0, 0); gtk_widget_set_size_request(align, 5, 5); gtk_widget_show(GTK_WIDGET(align)); gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(align), FALSE, FALSE, 0); gtk_box_pack_start( GTK_BOX(global_vbox), GTK_WIDGET(vbox), FALSE, FALSE, 0); g_signal_connect(GTK_WIDGET(global->monitor->opt_da), "expose_event", G_CALLBACK(expose_event_cb), NULL); g_signal_connect(GTK_WIDGET(global->monitor->opt_button[IN]), "clicked", G_CALLBACK(change_color_in), global); g_signal_connect(GTK_WIDGET(global->monitor->opt_button[OUT]), "clicked", G_CALLBACK(change_color_out), global); g_signal_connect(GTK_WIDGET(global->monitor->opt_use_label), "toggled", G_CALLBACK(label_toggled), global); g_signal_connect(GTK_WIDGET(global->monitor->opt_entry), "activate", G_CALLBACK(label_changed), global); g_signal_connect(GTK_WIDGET(global->monitor->net_entry), "activate", G_CALLBACK(network_changed), global); g_signal_connect(GTK_WIDGET(done), "clicked", G_CALLBACK(monitor_apply_options_cb), global); } G_MODULE_EXPORT void xfce_control_class_init(ControlClass *cc) { xfce_textdomain(GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR, "UTF-8"); cc->name = "netload"; cc->caption = _("Netload"); cc->create_control = (CreateControlFunc)monitor_control_new; cc->free = monitor_free; cc->read_config = monitor_read_config; cc->write_config = monitor_write_config; cc->attach_callback = monitor_attach_callback; cc->create_options = monitor_create_options; cc->set_size = monitor_set_size; cc->set_orientation = monitor_set_orientation; }