diff options
Diffstat (limited to 'netspeed/src/netspeed.c')
-rw-r--r-- | netspeed/src/netspeed.c | 2004 |
1 files changed, 1016 insertions, 988 deletions
diff --git a/netspeed/src/netspeed.c b/netspeed/src/netspeed.c index e692d7da..73185abd 100644 --- a/netspeed/src/netspeed.c +++ b/netspeed/src/netspeed.c @@ -32,9 +32,11 @@ #include <gio/gio.h> #include "backend.h" +#include "netspeed-preferences.h" + +#include "netspeed.h" #define GET_COLOR_CHOOSER(x) (GTK_COLOR_CHOOSER (gtk_builder_get_object (builder, (x)))) -#define GET_DIALOG(x) (GTK_DIALOG (gtk_builder_get_object (builder, (x)))) #define GET_DRAWING_AREA(x) (GTK_DRAWING_AREA (gtk_builder_get_object (builder, (x)))) #define GET_WIDGET(x) (GTK_WIDGET (gtk_builder_get_object (builder, (x)))) @@ -76,9 +78,10 @@ static const char LOGO_ICON[] = "mate-netspeed-applet"; /* A struct containing all the "global" data of the * applet */ -typedef struct +struct _NetspeedApplet { - MatePanelApplet *applet; + MatePanelApplet parent; + GtkWidget *box; GtkWidget *pix_box; GtkWidget *speed_box; @@ -99,6 +102,7 @@ typedef struct guint timeout_id; char *up_cmd; char *down_cmd; + gboolean show_all_addresses; gboolean show_sum; gboolean show_bits; gboolean change_icon; @@ -109,7 +113,7 @@ typedef struct GdkRGBA out_color; int width; /* details dialog */ - GtkDialog *details; + GtkWidget *details; GtkDrawingArea *drawingarea; GtkWidget *ip_text; GtkWidget *netmask_text; @@ -129,8 +133,7 @@ typedef struct GtkWidget *netlink_box; GtkWidget *wireless_box; /* settings dialog */ - GtkDialog *settings; - GtkWidget *network_device_combo; + GtkWidget *preferences; guint index_old; guint64 in_old [OLD_VALUES]; @@ -142,14 +145,25 @@ typedef struct GtkWidget *connect_dialog; gboolean show_tooltip; GtkIconTheme *icon_theme; - GSettings *gsettings; -} MateNetspeedApplet; + GSettings *settings; +}; -static void -update_tooltip(MateNetspeedApplet* applet); +G_DEFINE_TYPE (NetspeedApplet, netspeed_applet, PANEL_TYPE_APPLET) static void -device_change_cb(GtkComboBox *combo, MateNetspeedApplet *applet); +update_tooltip (NetspeedApplet *netspeed); + +GSettings * +netspeed_applet_get_settings (NetspeedApplet *netspeed) +{ + return netspeed->settings; +} + +const gchar * +netspeed_applet_get_current_device_name (NetspeedApplet *netspeed) +{ + return netspeed->devinfo->name; +} /* Adds a Pango markup "foreground" to a bytestring */ @@ -166,62 +180,62 @@ add_markup_fgcolor (char **string, /* Change the icons according to the selected device */ static void -change_icons (MateNetspeedApplet *applet) +change_icons (NetspeedApplet *netspeed) { cairo_surface_t *dev, *down; cairo_surface_t *in_arrow, *out_arrow; gint icon_scale; - gint icon_size = mate_panel_applet_get_size (MATE_PANEL_APPLET (applet->applet)) - 8; + gint icon_size = mate_panel_applet_get_size (MATE_PANEL_APPLET (netspeed)) - 8; /* FIXME: Not all network icons include a high enough resolution, so to make them all * consistent, we cap them at 48px.*/ icon_size = CLAMP (icon_size, 16, 48); - icon_scale = gtk_widget_get_scale_factor (GTK_WIDGET (applet->applet)); + icon_scale = gtk_widget_get_scale_factor (GTK_WIDGET (netspeed)); /* If the user wants a different icon than current, we load it */ - if (applet->show_icon && applet->change_icon && applet->devinfo) { - dev = gtk_icon_theme_load_surface (applet->icon_theme, - dev_type_icon [applet->devinfo->type], + if (netspeed->show_icon && netspeed->change_icon && netspeed->devinfo) { + dev = gtk_icon_theme_load_surface (netspeed->icon_theme, + dev_type_icon [netspeed->devinfo->type], icon_size, icon_scale, NULL, 0, NULL); } else { - dev = gtk_icon_theme_load_surface (applet->icon_theme, + dev = gtk_icon_theme_load_surface (netspeed->icon_theme, dev_type_icon [DEV_UNKNOWN], icon_size, icon_scale, NULL, 0, NULL); } /* We need a fallback */ if (dev == NULL) - dev = gtk_icon_theme_load_surface (applet->icon_theme, + dev = gtk_icon_theme_load_surface (netspeed->icon_theme, dev_type_icon [DEV_UNKNOWN], icon_size, icon_scale, NULL, 0, NULL); - in_arrow = gtk_icon_theme_load_surface (applet->icon_theme, + in_arrow = gtk_icon_theme_load_surface (netspeed->icon_theme, IN_ICON, 16, icon_scale, NULL, 0, NULL); - out_arrow = gtk_icon_theme_load_surface (applet->icon_theme, + out_arrow = gtk_icon_theme_load_surface (netspeed->icon_theme, OUT_ICON, 16, icon_scale, NULL, 0, NULL); /* Set the windowmanager icon for the applet */ gtk_window_set_default_icon_name (LOGO_ICON); - gtk_image_set_from_surface (GTK_IMAGE (applet->out_pix), out_arrow); - gtk_image_set_from_surface (GTK_IMAGE (applet->in_pix), in_arrow); + gtk_image_set_from_surface (GTK_IMAGE (netspeed->out_pix), out_arrow); + gtk_image_set_from_surface (GTK_IMAGE (netspeed->in_pix), in_arrow); cairo_surface_destroy (in_arrow); cairo_surface_destroy (out_arrow); - if (applet->devinfo && applet->devinfo->running) { - gtk_widget_show (applet->in_box); - gtk_widget_show (applet->out_box); + if (netspeed->devinfo && netspeed->devinfo->running) { + gtk_widget_show (netspeed->in_box); + gtk_widget_show (netspeed->out_box); } else { cairo_t *cr; cairo_surface_t *copy; gint down_coords; - gtk_widget_hide (applet->in_box); - gtk_widget_hide (applet->out_box); + gtk_widget_hide (netspeed->in_box); + gtk_widget_hide (netspeed->out_box); /* We're not allowed to modify "dev" */ copy = cairo_surface_create_similar (dev, @@ -232,7 +246,7 @@ change_icons (MateNetspeedApplet *applet) cairo_set_source_surface (cr, dev, 0, 0); cairo_paint (cr); - down = gtk_icon_theme_load_surface (applet->icon_theme, + down = gtk_icon_theme_load_surface (netspeed->icon_theme, ERROR_ICON, icon_size, icon_scale, NULL, 0, NULL); @@ -247,14 +261,14 @@ change_icons (MateNetspeedApplet *applet) dev = copy; } - if (applet->show_icon) { - gtk_widget_show (applet->dev_pix); - gtk_image_set_from_surface (GTK_IMAGE (applet->dev_pix), dev); + if (netspeed->show_icon) { + gtk_widget_show (netspeed->dev_pix); + gtk_image_set_from_surface (GTK_IMAGE (netspeed->dev_pix), dev); } else { - gtk_widget_hide (applet->dev_pix); + gtk_widget_hide (netspeed->dev_pix); } - cairo_surface_destroy(dev); + cairo_surface_destroy (dev); } /* Here some rearangement of the icons and the labels occurs @@ -262,130 +276,132 @@ change_icons (MateNetspeedApplet *applet) * or just the sum */ static void -applet_change_size_or_orient(MatePanelApplet *applet_widget, int arg1, MateNetspeedApplet *applet) +applet_change_size_or_orient (MatePanelApplet *applet, + int arg1, + NetspeedApplet *netspeed) { - int size; - MatePanelAppletOrient orient; - - g_assert(applet); - - size = mate_panel_applet_get_size(applet_widget); - orient = mate_panel_applet_get_orient(applet_widget); - - g_object_ref(applet->pix_box); - g_object_ref(applet->in_pix); - g_object_ref(applet->in_label); - g_object_ref(applet->out_pix); - g_object_ref(applet->out_label); - g_object_ref(applet->sum_label); - - if (applet->in_box) { - gtk_container_remove(GTK_CONTAINER(applet->in_box), applet->in_label); - gtk_container_remove(GTK_CONTAINER(applet->in_box), applet->in_pix); - gtk_widget_destroy(applet->in_box); - } - if (applet->out_box) { - gtk_container_remove(GTK_CONTAINER(applet->out_box), applet->out_label); - gtk_container_remove(GTK_CONTAINER(applet->out_box), applet->out_pix); - gtk_widget_destroy(applet->out_box); - } - if (applet->sum_box) { - gtk_container_remove(GTK_CONTAINER(applet->sum_box), applet->sum_label); - gtk_widget_destroy(applet->sum_box); - } - if (applet->box) { - gtk_container_remove(GTK_CONTAINER(applet->box), applet->pix_box); - gtk_widget_destroy(applet->box); - } - - if (orient == MATE_PANEL_APPLET_ORIENT_LEFT || orient == MATE_PANEL_APPLET_ORIENT_RIGHT) { - applet->box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); - applet->speed_box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); - if (size > 64) { - applet->sum_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2); - applet->in_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 1); - applet->out_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 1); - } else { - applet->sum_box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); - applet->in_box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); - applet->out_box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); - } - applet->labels_dont_shrink = FALSE; - } else { - applet->in_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 1); - applet->out_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 1); - applet->box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 1); - applet->sum_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2); - if (size < 48) { - applet->speed_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 1); - applet->labels_dont_shrink = TRUE; - } else { - applet->speed_box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); - applet->labels_dont_shrink = !applet->show_sum; - } - } - - gtk_box_pack_start(GTK_BOX(applet->in_box), applet->in_pix, FALSE, FALSE, 0); - gtk_box_pack_start(GTK_BOX(applet->in_box), applet->in_label, TRUE, TRUE, 0); - gtk_box_pack_start(GTK_BOX(applet->out_box), applet->out_pix, FALSE, FALSE, 0); - gtk_box_pack_start(GTK_BOX(applet->out_box), applet->out_label, TRUE, TRUE, 0); - gtk_box_pack_start(GTK_BOX(applet->sum_box), applet->sum_label, TRUE, TRUE, 0); - gtk_box_pack_start(GTK_BOX(applet->box), applet->pix_box, FALSE, FALSE, 0); - - g_object_unref(applet->pix_box); - g_object_unref(applet->in_pix); - g_object_unref(applet->in_label); - g_object_unref(applet->out_pix); - g_object_unref(applet->out_label); - g_object_unref(applet->sum_label); - - if (applet->show_sum) { - gtk_box_pack_start(GTK_BOX(applet->speed_box), applet->sum_box, TRUE, TRUE, 0); - } else { - gtk_box_pack_start(GTK_BOX(applet->speed_box), applet->in_box, TRUE, TRUE, 0); - gtk_box_pack_start(GTK_BOX(applet->speed_box), applet->out_box, TRUE, TRUE, 0); - } - gtk_box_pack_start(GTK_BOX(applet->box), applet->speed_box, TRUE, TRUE, 0); - - gtk_widget_show_all(applet->box); - if (!applet->show_icon) { - gtk_widget_hide(applet->dev_pix); - } - gtk_container_add(GTK_CONTAINER(applet->applet), applet->box); - - change_icons (applet); + int size; + MatePanelAppletOrient orient; + + g_assert (netspeed); + + size = mate_panel_applet_get_size (applet); + orient = mate_panel_applet_get_orient (applet); + + g_object_ref (netspeed->pix_box); + g_object_ref (netspeed->in_pix); + g_object_ref (netspeed->in_label); + g_object_ref (netspeed->out_pix); + g_object_ref (netspeed->out_label); + g_object_ref (netspeed->sum_label); + + if (netspeed->in_box) { + gtk_container_remove (GTK_CONTAINER (netspeed->in_box), netspeed->in_label); + gtk_container_remove (GTK_CONTAINER (netspeed->in_box), netspeed->in_pix); + gtk_widget_destroy (netspeed->in_box); + } + if (netspeed->out_box) { + gtk_container_remove (GTK_CONTAINER (netspeed->out_box), netspeed->out_label); + gtk_container_remove (GTK_CONTAINER (netspeed->out_box), netspeed->out_pix); + gtk_widget_destroy (netspeed->out_box); + } + if (netspeed->sum_box) { + gtk_container_remove (GTK_CONTAINER (netspeed->sum_box), netspeed->sum_label); + gtk_widget_destroy (netspeed->sum_box); + } + if (netspeed->box) { + gtk_container_remove (GTK_CONTAINER (netspeed->box), netspeed->pix_box); + gtk_widget_destroy (netspeed->box); + } + + if (orient == MATE_PANEL_APPLET_ORIENT_LEFT || orient == MATE_PANEL_APPLET_ORIENT_RIGHT) { + netspeed->box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); + netspeed->speed_box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); + if (size > 64) { + netspeed->sum_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2); + netspeed->in_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 1); + netspeed->out_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 1); + } else { + netspeed->sum_box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); + netspeed->in_box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); + netspeed->out_box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); + } + netspeed->labels_dont_shrink = FALSE; + } else { + netspeed->in_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 1); + netspeed->out_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 1); + netspeed->box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 1); + netspeed->sum_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2); + if (size < 48) { + netspeed->speed_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 1); + netspeed->labels_dont_shrink = TRUE; + } else { + netspeed->speed_box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); + netspeed->labels_dont_shrink = !netspeed->show_sum; + } + } + + gtk_box_pack_start (GTK_BOX (netspeed->in_box), netspeed->in_pix, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (netspeed->in_box), netspeed->in_label, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (netspeed->out_box), netspeed->out_pix, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (netspeed->out_box), netspeed->out_label, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (netspeed->sum_box), netspeed->sum_label, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (netspeed->box), netspeed->pix_box, FALSE, FALSE, 0); + + g_object_unref (netspeed->pix_box); + g_object_unref (netspeed->in_pix); + g_object_unref (netspeed->in_label); + g_object_unref (netspeed->out_pix); + g_object_unref (netspeed->out_label); + g_object_unref (netspeed->sum_label); + + if (netspeed->show_sum) { + gtk_box_pack_start (GTK_BOX (netspeed->speed_box), netspeed->sum_box, TRUE, TRUE, 0); + } else { + gtk_box_pack_start (GTK_BOX (netspeed->speed_box), netspeed->in_box, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (netspeed->speed_box), netspeed->out_box, TRUE, TRUE, 0); + } + gtk_box_pack_start (GTK_BOX (netspeed->box), netspeed->speed_box, TRUE, TRUE, 0); + + gtk_widget_show_all (netspeed->box); + if (!netspeed->show_icon) { + gtk_widget_hide (netspeed->dev_pix); + } + gtk_container_add (GTK_CONTAINER (netspeed), netspeed->box); + + change_icons (netspeed); } /* Change visibility of signal quality icon for wireless devices */ static void -change_quality_icon(MateNetspeedApplet *applet) +change_quality_icon (NetspeedApplet *netspeed) { - if (applet->devinfo->type == DEV_WIRELESS && - applet->devinfo->up && applet->show_quality_icon) { - gtk_widget_show(applet->qual_pix); - } else { - gtk_widget_hide(applet->qual_pix); - } + if (netspeed->devinfo->type == DEV_WIRELESS && + netspeed->devinfo->up && netspeed->show_quality_icon) { + gtk_widget_show (netspeed->qual_pix); + } else { + gtk_widget_hide (netspeed->qual_pix); + } } static void -update_quality_icon(MateNetspeedApplet *applet) +update_quality_icon (NetspeedApplet *netspeed) { - if (!applet->show_quality_icon) { - return; - } + if (!netspeed->show_quality_icon) { + return; + } - unsigned int q; + unsigned int q; - q = (applet->devinfo->qual); - q /= 25; - q = MIN (q, 3); /* q out of range would crash when accessing qual_surfaces[q] */ - gtk_image_set_from_surface (GTK_IMAGE(applet->qual_pix), applet->qual_surfaces[q]); + q = (netspeed->devinfo->qual); + q /= 25; + q = MIN (q, 3); /* q out of range would crash when accessing qual_surfaces[q] */ + gtk_image_set_from_surface (GTK_IMAGE (netspeed->qual_pix), netspeed->qual_surfaces[q]); } static void -init_quality_surfaces (MateNetspeedApplet *applet) +init_quality_surfaces (NetspeedApplet *netspeed) { int i; cairo_surface_t *surface; @@ -394,45 +410,43 @@ init_quality_surfaces (MateNetspeedApplet *applet) /* FIXME: Add larger icon files. */ gint icon_size = 24; - icon_scale = gtk_widget_get_scale_factor (GTK_WIDGET (applet->applet)); + icon_scale = gtk_widget_get_scale_factor (GTK_WIDGET (netspeed)); for (i = 0; i < 4; i++) { - if (applet->qual_surfaces[i]) - cairo_surface_destroy (applet->qual_surfaces[i]); + if (netspeed->qual_surfaces[i]) + cairo_surface_destroy (netspeed->qual_surfaces[i]); - surface = gtk_icon_theme_load_surface (applet->icon_theme, + surface = gtk_icon_theme_load_surface (netspeed->icon_theme, wireless_quality_icon[i], icon_size, icon_scale, NULL, 0, NULL); if (surface) { cairo_t *cr; - applet->qual_surfaces[i] = cairo_surface_create_similar (surface, + netspeed->qual_surfaces[i] = cairo_surface_create_similar (surface, cairo_surface_get_content (surface), cairo_image_surface_get_width (surface) / icon_scale, cairo_image_surface_get_height (surface) / icon_scale); - cr = cairo_create (applet->qual_surfaces[i]); + cr = cairo_create (netspeed->qual_surfaces[i]); cairo_set_source_surface (cr, surface, 0, 0); cairo_paint (cr); cairo_surface_destroy (surface); } else { - applet->qual_surfaces[i] = NULL; + netspeed->qual_surfaces[i] = NULL; } } } static void -icon_theme_changed_cb (GtkIconTheme *icon_theme, - gpointer user_data) +icon_theme_changed_cb (GtkIconTheme *icon_theme, + NetspeedApplet *netspeed) { - MateNetspeedApplet *applet = (MateNetspeedApplet*)user_data; - - init_quality_surfaces(user_data); - if (applet->devinfo->type == DEV_WIRELESS && applet->devinfo->up) - update_quality_icon(user_data); - change_icons(user_data); + init_quality_surfaces (netspeed); + if (netspeed->devinfo->type == DEV_WIRELESS && netspeed->devinfo->up) + update_quality_icon (netspeed); + change_icons (netspeed); } #define IEC_KIBI_DBL 1024.0 @@ -467,7 +481,7 @@ format_transfer_rate (gchar *out, unit = bits ? /* translators: Gibibit (short) */ N_("Gibit/s") : /* translators: Gibibyte (short) */ N_("GiB/s"); } - g_snprintf (out, MAX_FORMAT_SIZE, format, bytes, gettext(unit)); + g_snprintf (out, MAX_FORMAT_SIZE, format, bytes, gettext (unit)); } /* Converts a number of bytes into a human @@ -475,7 +489,8 @@ format_transfer_rate (gchar *out, * The string has to be freed */ static char* -bps_to_string(double bytes, gboolean bits) +bps_to_string (double bytes, + gboolean bits) { char res[MAX_FORMAT_SIZE]; format_transfer_rate (res, bytes, bits); @@ -486,134 +501,136 @@ bps_to_string(double bytes, gboolean bits) * Some really black magic is going on in here ;-) */ static void -redraw_graph(MateNetspeedApplet *applet, cairo_t *cr) +redraw_graph (NetspeedApplet *netspeed, + cairo_t *cr) { - GtkWidget *da = GTK_WIDGET(applet->drawingarea); - GtkStyleContext *stylecontext = gtk_widget_get_style_context (da); - GdkWindow *real_window = gtk_widget_get_window (da); - GdkPoint in_points[GRAPH_VALUES], out_points[GRAPH_VALUES]; - PangoLayout *layout; - PangoRectangle logical_rect; - char *text; - int i, offset, w, h; - double max_val; - double dash[2] = { 1.0, 2.0 }; - - w = gdk_window_get_width (real_window); - h = gdk_window_get_height (real_window); - - /* the graph hight should be: hight/2 <= applet->max_graph < hight */ - for (max_val = 1; max_val < applet->max_graph; max_val *= 2) ; - - /* calculate the polygons (GdkPoint[]) for the graphs */ - offset = 0; - for (i = (applet->index_graph + 1) % GRAPH_VALUES; applet->in_graph[i] < 0; i = (i + 1) % GRAPH_VALUES) - offset++; - for (i = offset + 1; i < GRAPH_VALUES; i++) - { - int index = (applet->index_graph + i) % GRAPH_VALUES; - out_points[i].x = in_points[i].x = ((w - 6) * i) / GRAPH_VALUES + 4; - in_points[i].y = h - 6 - (int)((h - 8) * applet->in_graph[index] / max_val); - out_points[i].y = h - 6 - (int)((h - 8) * applet->out_graph[index] / max_val); - } - in_points[offset].x = out_points[offset].x = ((w - 6) * offset) / GRAPH_VALUES + 4; - in_points[offset].y = in_points[(offset + 1) % GRAPH_VALUES].y; - out_points[offset].y = out_points[(offset + 1) % GRAPH_VALUES].y; - - /* draw the background */ - cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); - cairo_rectangle (cr, 02, 2, w - 6, h - 6); - cairo_fill (cr); - - cairo_set_line_width(cr, 1.0); - cairo_set_dash (cr, dash, 2, 0); - - cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); - cairo_rectangle (cr, 2, 2, w - 6, h - 6); - cairo_stroke (cr); - - for (i = 0; i < GRAPH_LINES; i++) { - int y = 2 + ((h - 6) * i) / GRAPH_LINES; - cairo_move_to (cr, 2, y); - cairo_line_to (cr, w - 4, y); - } - cairo_stroke (cr); - - /* draw the polygons */ - cairo_set_dash (cr, dash, 0, 1); - cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND); - cairo_set_line_join (cr, CAIRO_LINE_JOIN_ROUND); - - gdk_cairo_set_source_rgba (cr, &applet->in_color); - for (i = offset; i < GRAPH_VALUES; i++) { - cairo_line_to (cr, in_points[i].x, in_points[i].y); - } - cairo_stroke (cr); - - gdk_cairo_set_source_rgba (cr, &applet->out_color); - for (i = offset; i < GRAPH_VALUES; i++) { - cairo_line_to (cr, out_points[i].x, out_points[i].y); - } - cairo_stroke (cr); - - text = bps_to_string (max_val, applet->show_bits); - add_markup_fgcolor(&text, "black"); - layout = gtk_widget_create_pango_layout (da, NULL); - pango_layout_set_markup(layout, text, -1); - g_free (text); - gtk_render_layout(stylecontext, cr, 3, 2, layout); - g_object_unref(G_OBJECT(layout)); - - text = bps_to_string (0.0, applet->show_bits); - add_markup_fgcolor(&text, "black"); - layout = gtk_widget_create_pango_layout (da, NULL); - pango_layout_set_markup(layout, text, -1); - pango_layout_get_pixel_extents (layout, NULL, &logical_rect); - g_free (text); - gtk_render_layout(stylecontext, cr, 3, h - 4 - logical_rect.height, layout); - g_object_unref(G_OBJECT(layout)); + GtkWidget *da = GTK_WIDGET (netspeed->drawingarea); + GtkStyleContext *stylecontext = gtk_widget_get_style_context (da); + GdkWindow *real_window = gtk_widget_get_window (da); + GdkPoint in_points[GRAPH_VALUES], out_points[GRAPH_VALUES]; + PangoLayout *layout; + PangoRectangle logical_rect; + char *text; + int i, offset, w, h; + double max_val; + double dash[2] = { 1.0, 2.0 }; + + w = gdk_window_get_width (real_window); + h = gdk_window_get_height (real_window); + + /* the graph hight should be: hight/2 <= netspeed->max_graph < hight */ + for (max_val = 1; max_val < netspeed->max_graph; max_val *= 2) ; + + /* calculate the polygons (GdkPoint[]) for the graphs */ + offset = 0; + for (i = (netspeed->index_graph + 1) % GRAPH_VALUES; netspeed->in_graph[i] < 0; i = (i + 1) % GRAPH_VALUES) + offset++; + for (i = offset + 1; i < GRAPH_VALUES; i++) + { + int index = (netspeed->index_graph + i) % GRAPH_VALUES; + out_points[i].x = in_points[i].x = ((w - 6) * i) / GRAPH_VALUES + 4; + in_points[i].y = h - 6 - (int)((h - 8) * netspeed->in_graph[index] / max_val); + out_points[i].y = h - 6 - (int)((h - 8) * netspeed->out_graph[index] / max_val); + } + in_points[offset].x = out_points[offset].x = ((w - 6) * offset) / GRAPH_VALUES + 4; + in_points[offset].y = in_points[(offset + 1) % GRAPH_VALUES].y; + out_points[offset].y = out_points[(offset + 1) % GRAPH_VALUES].y; + + /* draw the background */ + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); + cairo_rectangle (cr, 02, 2, w - 6, h - 6); + cairo_fill (cr); + + cairo_set_line_width (cr, 1.0); + cairo_set_dash (cr, dash, 2, 0); + + cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); + cairo_rectangle (cr, 2, 2, w - 6, h - 6); + cairo_stroke (cr); + + for (i = 0; i < GRAPH_LINES; i++) { + int y = 2 + ((h - 6) * i) / GRAPH_LINES; + cairo_move_to (cr, 2, y); + cairo_line_to (cr, w - 4, y); + } + cairo_stroke (cr); + + /* draw the polygons */ + cairo_set_dash (cr, dash, 0, 1); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND); + cairo_set_line_join (cr, CAIRO_LINE_JOIN_ROUND); + + gdk_cairo_set_source_rgba (cr, &netspeed->in_color); + for (i = offset; i < GRAPH_VALUES; i++) { + cairo_line_to (cr, in_points[i].x, in_points[i].y); + } + cairo_stroke (cr); + + gdk_cairo_set_source_rgba (cr, &netspeed->out_color); + for (i = offset; i < GRAPH_VALUES; i++) { + cairo_line_to (cr, out_points[i].x, out_points[i].y); + } + cairo_stroke (cr); + + text = bps_to_string (max_val, netspeed->show_bits); + add_markup_fgcolor (&text, "black"); + layout = gtk_widget_create_pango_layout (da, NULL); + pango_layout_set_markup (layout, text, -1); + g_free (text); + gtk_render_layout (stylecontext, cr, 3, 2, layout); + g_object_unref (G_OBJECT (layout)); + + text = bps_to_string (0.0, netspeed->show_bits); + add_markup_fgcolor (&text, "black"); + layout = gtk_widget_create_pango_layout (da, NULL); + pango_layout_set_markup (layout, text, -1); + pango_layout_get_pixel_extents (layout, NULL, &logical_rect); + g_free (text); + gtk_render_layout (stylecontext, cr, 3, h - 4 - logical_rect.height, layout); + g_object_unref (G_OBJECT (layout)); } static gboolean -set_applet_devinfo(MateNetspeedApplet* applet, const char* iface) +set_applet_devinfo (NetspeedApplet *netspeed, + const char *iface) { - DevInfo *info; + DevInfo *info; - get_device_info (iface, &info); + get_device_info (iface, &info); - if (info->running) { - free_device_info(applet->devinfo); - applet->devinfo = info; - applet->device_has_changed = TRUE; - return TRUE; - } + if (info->running) { + free_device_info (netspeed->devinfo); + netspeed->devinfo = info; + netspeed->device_has_changed = TRUE; + return TRUE; + } - free_device_info (info); - return FALSE; + free_device_info (info); + return FALSE; } /* Find the first available device, that is running and != lo */ static void -search_for_up_if(MateNetspeedApplet *applet) +search_for_up_if (NetspeedApplet *netspeed) { - const gchar *default_route; - GList *devices, *tmp; - - default_route = get_default_route(); - - if (default_route != NULL) { - if (set_applet_devinfo(applet, default_route)) - return; - } - - devices = get_available_devices(); - for (tmp = devices; tmp; tmp = g_list_next(tmp)) { - if (is_dummy_device(tmp->data)) - continue; - if (set_applet_devinfo(applet, tmp->data)) - break; - } - free_devices_list(devices); + const gchar *default_route; + GList *devices, *tmp; + + default_route = get_default_route (); + + if (default_route != NULL) { + if (set_applet_devinfo (netspeed, default_route)) + return; + } + + devices = get_available_devices (); + for (tmp = devices; tmp; tmp = g_list_next (tmp)) { + if (is_dummy_device (tmp->data)) + continue; + if (set_applet_devinfo (netspeed, tmp->data)) + break; + } + g_list_free_full (devices, g_free); } static char * @@ -670,107 +687,112 @@ format_ipv4 (guint32 ip, } static void -format_ipv6 (const guint8 ip[16], - char *dest) -{ - inet_ntop (AF_INET6, ip, dest, INET6_ADDRSTRLEN); -} - -static void -fill_details_dialog (MateNetspeedApplet *applet) +fill_details_dialog (NetspeedApplet *netspeed) { char *text; char ipv4_text [INET_ADDRSTRLEN]; - char ipv6_text [INET6_ADDRSTRLEN]; - if (applet->devinfo->ip) { - format_ipv4 (applet->devinfo->ip, ipv4_text); + if (netspeed->devinfo->ip) { + format_ipv4 (netspeed->devinfo->ip, ipv4_text); text = ipv4_text; } else { text = _("none"); } - gtk_label_set_text (GTK_LABEL (applet->ip_text), text); + gtk_label_set_text (GTK_LABEL (netspeed->ip_text), text); - if (applet->devinfo->netmask) { - format_ipv4 (applet->devinfo->netmask, ipv4_text); + if (netspeed->devinfo->netmask) { + format_ipv4 (netspeed->devinfo->netmask, ipv4_text); text = ipv4_text; } else { text = _("none"); } - gtk_label_set_text (GTK_LABEL (applet->netmask_text), text); + gtk_label_set_text (GTK_LABEL (netspeed->netmask_text), text); - if (applet->devinfo->type != DEV_LO) { - text = mac_addr_n2a (applet->devinfo->hwaddr); - gtk_label_set_text (GTK_LABEL (applet->hwaddr_text), text); + if (netspeed->devinfo->type != DEV_LO) { + text = mac_addr_n2a (netspeed->devinfo->hwaddr); + gtk_label_set_text (GTK_LABEL (netspeed->hwaddr_text), text); g_free (text); } else { - gtk_label_set_text (GTK_LABEL (applet->hwaddr_text), _("none")); + gtk_label_set_text (GTK_LABEL (netspeed->hwaddr_text), _("none")); } - if (applet->devinfo->ptpip) { - format_ipv4 (applet->devinfo->ptpip, ipv4_text); + if (netspeed->devinfo->ptpip) { + format_ipv4 (netspeed->devinfo->ptpip, ipv4_text); text = ipv4_text; } else { text = _("none"); } - gtk_label_set_text (GTK_LABEL (applet->ptpip_text), text); + gtk_label_set_text (GTK_LABEL (netspeed->ptpip_text), text); /* check if we got an ipv6 address */ - format_ipv6 (applet->devinfo->ipv6, ipv6_text); - if (strlen (ipv6_text) > 2) { - gtk_label_set_text (GTK_LABEL (applet->ipv6_text), ipv6_text); - gtk_widget_show (applet->ipv6_box); + GSList *ipv6_address_list = get_ip_address_list (netspeed->devinfo->name, FALSE); + if (ipv6_address_list != NULL) { + GSList *iterator; + GString *string = NULL; + + for (iterator = ipv6_address_list; iterator; iterator = iterator->next) { + if (string == NULL) + string = g_string_new ((char*) iterator->data); + else + g_string_append_printf (string, "\n%s", (char*) iterator->data); + } + if (string != NULL) { + gtk_label_set_text (GTK_LABEL (netspeed->ipv6_text), string->str); + gtk_widget_show (netspeed->ipv6_box); + } + g_string_free (string, TRUE); + g_slist_free_full (ipv6_address_list, g_free); } else { - gtk_widget_hide (applet->ipv6_box); + gtk_widget_hide (netspeed->ipv6_box); } - if (applet->devinfo->type == DEV_WIRELESS) { + if (netspeed->devinfo->type == DEV_WIRELESS) { float quality; /* _maybe_ we can add the encrypted icon between the essid and the signal bar. */ - quality = applet->devinfo->qual / 100.0f; + quality = netspeed->devinfo->qual / 100.0f; if (quality > 1.0) quality = 1.0; - text = g_strdup_printf ("%d %%", applet->devinfo->qual); - gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (applet->signalbar), quality); - gtk_progress_bar_set_text (GTK_PROGRESS_BAR (applet->signalbar), text); - g_free(text); + text = g_strdup_printf ("%d %%", netspeed->devinfo->qual); + gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (netspeed->signalbar), quality); + gtk_progress_bar_set_text (GTK_PROGRESS_BAR (netspeed->signalbar), text); + g_free (text); - gtk_label_set_text (GTK_LABEL (applet->essid_text), - applet->devinfo->essid); + gtk_label_set_text (GTK_LABEL (netspeed->essid_text), + netspeed->devinfo->essid); #ifdef HAVE_NL - if (applet->devinfo->running) { - text = mac_addr_n2a (applet->devinfo->station_mac_addr); - gtk_label_set_text (GTK_LABEL (applet->station_text), text); + if (netspeed->devinfo->running) { + text = mac_addr_n2a (netspeed->devinfo->station_mac_addr); + gtk_label_set_text (GTK_LABEL (netspeed->station_text), text); g_free (text); } else { - gtk_label_set_text (GTK_LABEL (applet->station_text), _("unknown")); + gtk_label_set_text (GTK_LABEL (netspeed->station_text), _("unknown")); } - gtk_label_set_text (GTK_LABEL (applet->channel_text), - applet->devinfo->channel ? applet->devinfo->channel : _("unknown")); + gtk_label_set_text (GTK_LABEL (netspeed->channel_text), + netspeed->devinfo->channel ? netspeed->devinfo->channel : _("unknown")); - text = format_time (applet->devinfo->connected_time); - gtk_label_set_text (GTK_LABEL (applet->connected_time_text), - applet->devinfo->connected_time > 0 ? text : _("na")); + text = format_time (netspeed->devinfo->connected_time); + gtk_label_set_text (GTK_LABEL (netspeed->connected_time_text), + netspeed->devinfo->connected_time > 0 ? text : _("na")); g_free (text); - gtk_widget_show (applet->netlink_box); + gtk_widget_show (netspeed->netlink_box); #else - gtk_widget_hide (applet->netlink_box); + gtk_widget_hide (netspeed->netlink_box); #endif /* HAVE_NL */ - gtk_widget_show (applet->wireless_box); + gtk_widget_show (netspeed->wireless_box); } else { - gtk_widget_hide (applet->wireless_box); + gtk_widget_hide (netspeed->wireless_box); } } /* Here happens the really interesting stuff */ static void -update_applet (MateNetspeedApplet *applet) +update_applet (NetspeedApplet *netspeed) { guint64 indiff, outdiff; double inrate, outrate; @@ -778,363 +800,276 @@ update_applet (MateNetspeedApplet *applet) int i; DevInfo *oldinfo; - if (!applet) return; + if (!netspeed) return; /* First we try to figure out if the device has changed */ - oldinfo = applet->devinfo; - get_device_info (oldinfo->name, &applet->devinfo); - if (compare_device_info (applet->devinfo, oldinfo)) - applet->device_has_changed = TRUE; + oldinfo = netspeed->devinfo; + get_device_info (oldinfo->name, &netspeed->devinfo); + if (compare_device_info (netspeed->devinfo, oldinfo)) + netspeed->device_has_changed = TRUE; free_device_info (oldinfo); /* If the device has changed, reintialize stuff */ - if (applet->device_has_changed) { - change_icons (applet); - change_quality_icon (applet); + if (netspeed->device_has_changed) { + change_icons (netspeed); + change_quality_icon (netspeed); for (i = 0; i < OLD_VALUES; i++) { - applet->in_old[i] = applet->devinfo->rx; - applet->out_old[i] = applet->devinfo->tx; + netspeed->in_old[i] = netspeed->devinfo->rx; + netspeed->out_old[i] = netspeed->devinfo->tx; } for (i = 0; i < GRAPH_VALUES; i++) { - applet->in_graph[i] = -1; - applet->out_graph[i] = -1; + netspeed->in_graph[i] = -1; + netspeed->out_graph[i] = -1; } - applet->max_graph = 0; - applet->index_graph = 0; + netspeed->max_graph = 0; + netspeed->index_graph = 0; - if (applet->details) { - fill_details_dialog (applet); + if (netspeed->details) { + fill_details_dialog (netspeed); } - applet->device_has_changed = FALSE; + netspeed->device_has_changed = FALSE; } /* create the strings for the labels and tooltips */ - if (applet->devinfo->running) { - if (applet->devinfo->rx < applet->in_old[applet->index_old]) + if (netspeed->devinfo->running) { + if (netspeed->devinfo->rx < netspeed->in_old[netspeed->index_old]) indiff = 0; else - indiff = applet->devinfo->rx - applet->in_old[applet->index_old]; + indiff = netspeed->devinfo->rx - netspeed->in_old[netspeed->index_old]; - if (applet->devinfo->tx < applet->out_old[applet->index_old]) + if (netspeed->devinfo->tx < netspeed->out_old[netspeed->index_old]) outdiff = 0; else - outdiff = applet->devinfo->tx - applet->out_old[applet->index_old]; + outdiff = netspeed->devinfo->tx - netspeed->out_old[netspeed->index_old]; inrate = (double)indiff / OLD_VALUES_DBL; outrate = (double)outdiff / OLD_VALUES_DBL; - applet->in_graph[applet->index_graph] = inrate; - applet->out_graph[applet->index_graph] = outrate; - applet->max_graph = MAX(inrate, applet->max_graph); - applet->max_graph = MAX(outrate, applet->max_graph); + netspeed->in_graph[netspeed->index_graph] = inrate; + netspeed->out_graph[netspeed->index_graph] = outrate; + netspeed->max_graph = MAX (inrate, netspeed->max_graph); + netspeed->max_graph = MAX (outrate, netspeed->max_graph); - format_transfer_rate (applet->devinfo->rx_rate, inrate, applet->show_bits); - format_transfer_rate (applet->devinfo->tx_rate, outrate, applet->show_bits); - format_transfer_rate (applet->devinfo->sum_rate, inrate + outrate, applet->show_bits); + format_transfer_rate (netspeed->devinfo->rx_rate, inrate, netspeed->show_bits); + format_transfer_rate (netspeed->devinfo->tx_rate, outrate, netspeed->show_bits); + format_transfer_rate (netspeed->devinfo->sum_rate, inrate + outrate, netspeed->show_bits); } else { - applet->devinfo->rx_rate[0] = '\0'; - applet->devinfo->tx_rate[0] = '\0'; - applet->devinfo->sum_rate[0] = '\0'; - applet->in_graph[applet->index_graph] = 0; - applet->out_graph[applet->index_graph] = 0; + netspeed->devinfo->rx_rate[0] = '\0'; + netspeed->devinfo->tx_rate[0] = '\0'; + netspeed->devinfo->sum_rate[0] = '\0'; + netspeed->in_graph[netspeed->index_graph] = 0; + netspeed->out_graph[netspeed->index_graph] = 0; } - if (applet->devinfo->type == DEV_WIRELESS) { - if (applet->devinfo->up) - update_quality_icon(applet); + if (netspeed->devinfo->type == DEV_WIRELESS) { + if (netspeed->devinfo->up) + update_quality_icon (netspeed); - if (applet->signalbar) { + if (netspeed->signalbar) { float quality; char *text; - quality = applet->devinfo->qual / 100.0f; + quality = netspeed->devinfo->qual / 100.0f; if (quality > 1.0) quality = 1.0; - text = g_strdup_printf ("%d %%", applet->devinfo->qual); - gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (applet->signalbar), quality); - gtk_progress_bar_set_text (GTK_PROGRESS_BAR (applet->signalbar), text); - g_free(text); + text = g_strdup_printf ("%d %%", netspeed->devinfo->qual); + gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (netspeed->signalbar), quality); + gtk_progress_bar_set_text (GTK_PROGRESS_BAR (netspeed->signalbar), text); + g_free (text); } #ifdef HAVE_NL /* Refresh the value of Connected Time */ - if (applet->connected_time_text) { + if (netspeed->connected_time_text) { char *text; - text = format_time (applet->devinfo->connected_time); - gtk_label_set_text (GTK_LABEL (applet->connected_time_text), - applet->devinfo->connected_time > 0 ? text : _("na")); + text = format_time (netspeed->devinfo->connected_time); + gtk_label_set_text (GTK_LABEL (netspeed->connected_time_text), + netspeed->devinfo->connected_time > 0 ? text : _("na")); g_free (text); } #endif } - update_tooltip(applet); + update_tooltip (netspeed); - /* Refresh the text of the labels and tooltip */ - if (applet->show_sum) { - gtk_label_set_text (GTK_LABEL (applet->sum_label), - applet->devinfo->sum_rate); + /* Refresh the text of the labels */ + if (netspeed->show_sum) { + gtk_label_set_text (GTK_LABEL (netspeed->sum_label), + netspeed->devinfo->sum_rate); } else { - gtk_label_set_text (GTK_LABEL (applet->in_label), - applet->devinfo->rx_rate); - gtk_label_set_text (GTK_LABEL (applet->out_label), - applet->devinfo->tx_rate); + gtk_label_set_text (GTK_LABEL (netspeed->in_label), + netspeed->devinfo->rx_rate); + gtk_label_set_text (GTK_LABEL (netspeed->out_label), + netspeed->devinfo->tx_rate); } /* Refresh the values of the Infodialog */ - if (applet->inbytes_text) { - if (applet->show_bits) - inbytes = g_format_size_full (applet->devinfo->rx*8, + if (netspeed->inbytes_text) { + if (netspeed->show_bits) + inbytes = g_format_size_full (netspeed->devinfo->rx*8, G_FORMAT_SIZE_IEC_UNITS | G_FORMAT_SIZE_BITS); else - inbytes = g_format_size_full (applet->devinfo->rx, + inbytes = g_format_size_full (netspeed->devinfo->rx, G_FORMAT_SIZE_IEC_UNITS); - gtk_label_set_text (GTK_LABEL (applet->inbytes_text), inbytes); + gtk_label_set_text (GTK_LABEL (netspeed->inbytes_text), inbytes); g_free (inbytes); } - if (applet->outbytes_text) { - if (applet->show_bits) - outbytes = g_format_size_full (applet->devinfo->tx*8, + if (netspeed->outbytes_text) { + if (netspeed->show_bits) + outbytes = g_format_size_full (netspeed->devinfo->tx*8, G_FORMAT_SIZE_IEC_UNITS | G_FORMAT_SIZE_BITS); else - outbytes = g_format_size_full (applet->devinfo->tx, + outbytes = g_format_size_full (netspeed->devinfo->tx, G_FORMAT_SIZE_IEC_UNITS); - gtk_label_set_text (GTK_LABEL (applet->outbytes_text), outbytes); - g_free (outbytes); + gtk_label_set_text (GTK_LABEL (netspeed->outbytes_text), outbytes); + g_free (outbytes); } /* Redraw the graph of the Infodialog */ - if (applet->drawingarea) - gtk_widget_queue_draw (GTK_WIDGET (applet->drawingarea)); + if (netspeed->drawingarea) + gtk_widget_queue_draw (GTK_WIDGET (netspeed->drawingarea)); /* Save old values... */ - applet->in_old [applet->index_old] = applet->devinfo->rx; - applet->out_old [applet->index_old] = applet->devinfo->tx; - applet->index_old = (applet->index_old + 1) % OLD_VALUES; + netspeed->in_old [netspeed->index_old] = netspeed->devinfo->rx; + netspeed->out_old [netspeed->index_old] = netspeed->devinfo->tx; + netspeed->index_old = (netspeed->index_old + 1) % OLD_VALUES; /* Move the graphindex. Check if we can scale down again */ - applet->index_graph = (applet->index_graph + 1) % GRAPH_VALUES; - if (applet->index_graph % 20 == 0) { + netspeed->index_graph = (netspeed->index_graph + 1) % GRAPH_VALUES; + if (netspeed->index_graph % 20 == 0) { double max = 0; for (i = 0; i < GRAPH_VALUES; i++) { - max = MAX (max, applet->in_graph[i]); - max = MAX (max, applet->out_graph[i]); + max = MAX (max, netspeed->in_graph[i]); + max = MAX (max, netspeed->out_graph[i]); } - applet->max_graph = max; + netspeed->max_graph = max; } /* Always follow the default route */ - if (applet->auto_change_device) { - gboolean change_device_now = !applet->devinfo->running; + if (netspeed->auto_change_device) { + gboolean change_device_now = !netspeed->devinfo->running; if (!change_device_now) { const gchar *default_route; - default_route = get_default_route(); + default_route = get_default_route (); change_device_now = (default_route != NULL && - strcmp (default_route, applet->devinfo->name)); + strcmp (default_route, netspeed->devinfo->name)); } if (change_device_now) { - search_for_up_if(applet); + search_for_up_if (netspeed); } } } static gboolean -timeout_function(MateNetspeedApplet *applet) +timeout_function (NetspeedApplet *netspeed) { - if (!applet) - return FALSE; - if (!applet->timeout_id) - return FALSE; + if (!netspeed) + return FALSE; + if (!netspeed->timeout_id) + return FALSE; - update_applet(applet); - return TRUE; + update_applet (netspeed); + return TRUE; } /* Display a section of netspeed help */ -static void -display_help (GtkWidget *dialog, const gchar *section) +void +netspeed_applet_display_help (GtkWidget *dialog, + const gchar *section) { - GError *error = NULL; - gboolean ret; - char *uri; - - if (section) - uri = g_strdup_printf ("help:mate-netspeed-applet/%s", section); - else - uri = g_strdup ("help:mate-netspeed-applet"); - - ret = gtk_show_uri_on_window (NULL, - uri, - gtk_get_current_event_time (), - &error); - g_free (uri); - - if (ret == FALSE) { - GtkWidget *error_dialog = gtk_message_dialog_new (NULL, - GTK_DIALOG_MODAL, - GTK_MESSAGE_ERROR, - GTK_BUTTONS_OK, - _("There was an error displaying help:\n%s"), - error->message); - g_signal_connect (error_dialog, "response", - G_CALLBACK (gtk_widget_destroy), NULL); - - gtk_window_set_resizable (GTK_WINDOW (error_dialog), FALSE); - gtk_window_set_screen (GTK_WINDOW (error_dialog), gtk_widget_get_screen (dialog)); - gtk_widget_show (error_dialog); - g_error_free (error); - } + GError *error = NULL; + gboolean ret; + char *uri; + + if (section) + uri = g_strdup_printf ("help:mate-netspeed-applet/%s", section); + else + uri = g_strdup ("help:mate-netspeed-applet"); + + ret = gtk_show_uri_on_window (NULL, + uri, + gtk_get_current_event_time (), + &error); + g_free (uri); + + if (ret == FALSE) { + GtkWidget *error_dialog = gtk_message_dialog_new (NULL, + GTK_DIALOG_MODAL, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_OK, + _("There was an error displaying help:\n%s"), + error->message); + g_signal_connect (error_dialog, "response", + G_CALLBACK (gtk_widget_destroy), NULL); + + gtk_window_set_resizable (GTK_WINDOW (error_dialog), FALSE); + gtk_window_set_screen (GTK_WINDOW (error_dialog), gtk_widget_get_screen (dialog)); + gtk_widget_show (error_dialog); + g_error_free (error); + } } /* Opens gnome help application */ static void -help_cb (GtkAction *action, - MateNetspeedApplet *ap) +help_cb (GtkAction *action, + NetspeedApplet *netspeed) { - display_help (GTK_WIDGET (ap->applet), NULL); + netspeed_applet_display_help (GTK_WIDGET (netspeed), NULL); } /* Just the about window... If it's already open, just fokus it */ static void -about_cb(GtkAction *action, gpointer data) +about_cb (GtkAction *action, + gpointer data) { - const char *authors[] = - { - "Jörgen Scheibengruber <[email protected]>", - "Dennis Cranston <[email protected]>", - "Pedro Villavicencio Garrido <[email protected]>", - "Benoît Dejean <[email protected]>", - "Stefano Karapetsas <[email protected]>", - "Perberos <[email protected]>", - NULL - }; - - gtk_show_about_dialog (NULL, - "title", _("About MATE Netspeed"), - "version", VERSION, - "copyright", _("Copyright \xc2\xa9 2002-2003 Jörgen Scheibengruber\n" - "Copyright \xc2\xa9 2011-2014 Stefano Karapetsas\n" - "Copyright \xc2\xa9 2015-2020 MATE developers"), - "comments", _("A little applet that displays some information on the traffic on the specified network device"), - "authors", authors, - "documenters", NULL, - "translator-credits", _("translator-credits"), - "website", "http://www.mate-desktop.org/", - "logo-icon-name", LOGO_ICON, - NULL); - + const char *authors[] = + { + "Jörgen Scheibengruber <[email protected]>", + "Dennis Cranston <[email protected]>", + "Pedro Villavicencio Garrido <[email protected]>", + "Benoît Dejean <[email protected]>", + "Stefano Karapetsas <[email protected]>", + "Perberos <[email protected]>", + NULL + }; + + gtk_show_about_dialog (NULL, + "title", _("About MATE Netspeed"), + "version", VERSION, + "copyright", _("Copyright \xc2\xa9 2002-2003 Jörgen Scheibengruber\n" + "Copyright \xc2\xa9 2011-2014 Stefano Karapetsas\n" + "Copyright \xc2\xa9 2015-2021 MATE developers"), + "comments", _("A little applet that displays some information on the traffic on the specified network device"), + "authors", authors, + "documenters", NULL, + "translator-credits", _("translator-credits"), + "website", PACKAGE_URL, + "logo-icon-name", LOGO_ICON, + NULL); } -/* this basically just retrieves the new devicestring - * and then calls applet_device_change() and change_icons() - */ -static void -device_change_cb(GtkComboBox *combo, MateNetspeedApplet *applet) -{ - GList *devices; - int i, active; - - g_assert(combo); - devices = g_object_get_data(G_OBJECT(combo), "devices"); - active = gtk_combo_box_get_active(combo); - g_assert(active > -1); - - if (0 == active) { - if (applet->auto_change_device) - return; - applet->auto_change_device = TRUE; - } else { - applet->auto_change_device = FALSE; - for (i = 1; i < active; i++) { - devices = g_list_next(devices); - } - if (g_str_equal(devices->data, applet->devinfo->name)) - return; - free_device_info (applet->devinfo); - get_device_info (devices->data, &applet->devinfo); - } - - applet->device_has_changed = TRUE; - update_applet(applet); -} - - -/* Handle preference dialog response event - */ static void -pref_response_cb (GtkDialog *dialog, gint id, gpointer data) +netspeed_applet_destroy_preferences (GtkWidget *widget, + gpointer user_data) { - MateNetspeedApplet *applet = data; - - if(id == GTK_RESPONSE_HELP){ - display_help (GTK_WIDGET (dialog), "netspeed_applet-settings"); - return; - } - g_settings_delay (applet->gsettings); - g_settings_set_string (applet->gsettings, "device", applet->devinfo->name); - g_settings_set_boolean (applet->gsettings, "auto-change-device", applet->auto_change_device); - g_settings_apply (applet->gsettings); + NetspeedApplet *netspeed; + (void) widget; - gtk_widget_destroy(GTK_WIDGET(applet->settings)); - applet->settings = NULL; -} - -/* Called when the showsum checkbutton is toggled... - */ -static void -showsum_change_cb(GtkToggleButton *togglebutton, MateNetspeedApplet *applet) -{ - applet->show_sum = gtk_toggle_button_get_active(togglebutton); - applet_change_size_or_orient(applet->applet, -1, (gpointer)applet); - change_icons(applet); -} - -/* Called when the showbits checkbutton is toggled... - */ -static void -showbits_change_cb(GtkToggleButton *togglebutton, MateNetspeedApplet *applet) -{ - applet->show_bits = gtk_toggle_button_get_active(togglebutton); -} - -/* Called when the showicon checkbutton is toggled... - */ -static void -showicon_change_cb(GtkToggleButton *togglebutton, MateNetspeedApplet *applet) -{ - applet->show_icon = gtk_toggle_button_get_active(togglebutton); - change_icons(applet); -} - -/* Called when the showqualityicon checkbutton is toggled... - */ -static void -showqualityicon_change_cb(GtkToggleButton *togglebutton, MateNetspeedApplet *applet) -{ - applet->show_quality_icon = gtk_toggle_button_get_active(togglebutton); - change_quality_icon(applet); -} - -/* Called when the changeicon checkbutton is toggled... - */ -static void -changeicon_change_cb(GtkToggleButton *togglebutton, MateNetspeedApplet *applet) -{ - applet->change_icon = gtk_toggle_button_get_active(togglebutton); - change_icons(applet); + netspeed = NETSPEED_APPLET (user_data); + netspeed->preferences = NULL; } /* Creates the settings dialog @@ -1142,189 +1077,142 @@ changeicon_change_cb(GtkToggleButton *togglebutton, MateNetspeedApplet *applet) * them in the gsettings database */ static void -settings_cb (GtkAction *action, - gpointer data) +settings_cb (GtkAction *action, + NetspeedApplet *netspeed) { - GtkBuilder *builder; - MateNetspeedApplet *applet = (MateNetspeedApplet*)data; - GList *ptr, *devices; - int i, active = -1; - - g_assert(applet); - - if (applet->settings) - { - gtk_window_present(GTK_WINDOW(applet->settings)); - return; - } - - builder = gtk_builder_new_from_resource (NETSPEED_RESOURCE_PATH "netspeed-preferences.ui"); - - applet->settings = GET_DIALOG ("preferences_dialog"); - applet->network_device_combo = GET_WIDGET ("network_device_combo"); - - gtk_window_set_screen(GTK_WINDOW(applet->settings), - gtk_widget_get_screen(GTK_WIDGET(applet->settings))); - - gtk_dialog_set_default_response(GTK_DIALOG(applet->settings), GTK_RESPONSE_CLOSE); - - g_settings_bind (applet->gsettings, "show-sum", gtk_builder_get_object (builder, "show_sum_checkbutton"), "active", G_SETTINGS_BIND_DEFAULT); - g_settings_bind (applet->gsettings, "show-bits", gtk_builder_get_object (builder, "show_bits_checkbutton"), "active", G_SETTINGS_BIND_DEFAULT); - g_settings_bind (applet->gsettings, "show-icon", gtk_builder_get_object (builder, "show_icon_checkbutton"), "active", G_SETTINGS_BIND_DEFAULT); - g_settings_bind (applet->gsettings, "show-quality-icon", gtk_builder_get_object (builder, "show_quality_icon_checkbutton"), "active", G_SETTINGS_BIND_DEFAULT); - g_settings_bind (applet->gsettings, "change-icon", gtk_builder_get_object (builder, "change_icon_checkbutton"), "active", G_SETTINGS_BIND_DEFAULT); - - /* Default means device with default route set */ - gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(applet->network_device_combo), _("Default")); - ptr = devices = get_available_devices(); - for (i = 0; ptr; ptr = g_list_next(ptr)) { - gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(applet->network_device_combo), ptr->data); - if (g_str_equal(ptr->data, applet->devinfo->name)) active = (i + 1); - ++i; - } - if (active < 0 || applet->auto_change_device) { - active = 0; - } - gtk_combo_box_set_active(GTK_COMBO_BOX(applet->network_device_combo), active); - g_object_set_data_full(G_OBJECT(applet->network_device_combo), "devices", devices, (GDestroyNotify)free_devices_list); - - /* signals */ - gtk_builder_add_callback_symbols (builder, - "on_network_device_combo_changed", G_CALLBACK (device_change_cb), - "on_show_sum_checkbutton_toggled", G_CALLBACK (showsum_change_cb), - "on_show_bits_checkbutton_toggled", G_CALLBACK(showbits_change_cb), - "on_change_icon_checkbutton_toggled", G_CALLBACK (changeicon_change_cb), - "on_show_icon_checkbutton_toggled", G_CALLBACK (showicon_change_cb), - "on_show_quality_icon_checkbutton_toggled", G_CALLBACK (showqualityicon_change_cb), - "on_preferences_dialog_response", G_CALLBACK(pref_response_cb), - NULL); - gtk_builder_connect_signals (builder, applet); - - g_object_unref (builder); - - gtk_widget_show_all(GTK_WIDGET(applet->settings)); + g_assert (netspeed); + + if (netspeed->preferences) + { + gtk_window_present (GTK_WINDOW (netspeed->preferences)); + return; + } + + netspeed->preferences = netspeed_preferences_new (netspeed); + g_signal_connect (netspeed->preferences, "destroy", + G_CALLBACK (netspeed_applet_destroy_preferences), netspeed); + gtk_widget_show_all (netspeed->preferences); } static gboolean -da_draw(GtkWidget *widget, cairo_t *cr, gpointer data) +da_draw (GtkWidget *widget, + cairo_t *cr, + NetspeedApplet *netspeed) { - MateNetspeedApplet *applet = (MateNetspeedApplet*)data; + redraw_graph (netspeed, cr); - redraw_graph(applet, cr); - - return FALSE; + return FALSE; } static void -incolor_changed_cb (GtkColorChooser *button, gpointer data) +incolor_changed_cb (GtkColorChooser *button, + NetspeedApplet *netspeed) { - MateNetspeedApplet *applet = (MateNetspeedApplet*)data; - GdkRGBA color; - gchar *string; + GdkRGBA color; + gchar *string; - gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER (button), &color); - applet->in_color = color; + gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER (button), &color); + netspeed->in_color = color; - string = gdk_rgba_to_string (&color); - g_settings_set_string (applet->gsettings, "in-color", string); - g_free (string); + string = gdk_rgba_to_string (&color); + g_settings_set_string (netspeed->settings, "in-color", string); + g_free (string); } static void -outcolor_changed_cb (GtkColorChooser *button, gpointer data) +outcolor_changed_cb (GtkColorChooser *button, + NetspeedApplet *netspeed) { - MateNetspeedApplet *applet = (MateNetspeedApplet*)data; - GdkRGBA color; - gchar *string; + GdkRGBA color; + gchar *string; - gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER (button), &color); - applet->out_color = color; + gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER (button), &color); + netspeed->out_color = color; - string = gdk_rgba_to_string (&color); - g_settings_set_string (applet->gsettings, "out-color", string); - g_free (string); + string = gdk_rgba_to_string (&color); + g_settings_set_string (netspeed->settings, "out-color", string); + g_free (string); } /* Handle info dialog response event */ static void -info_response_cb (GtkDialog *dialog, - gint id, - MateNetspeedApplet *applet) +info_response_cb (GtkDialog *dialog, + gint id, + NetspeedApplet *netspeed) { if (id == GTK_RESPONSE_HELP) { - display_help (GTK_WIDGET (dialog), "netspeed_applet-details"); + netspeed_applet_display_help (GTK_WIDGET (dialog), "netspeed_applet-details"); return; } - gtk_widget_destroy(GTK_WIDGET(applet->details)); - - applet->details = NULL; - applet->drawingarea = NULL; - applet->ip_text = NULL; - applet->netmask_text = NULL; - applet->ptpip_text = NULL; - applet->ipv6_text = NULL; - applet->hwaddr_text = NULL; - applet->inbytes_text = NULL; - applet->outbytes_text = NULL; - applet->essid_text = NULL; - applet->signalbar = NULL; + gtk_widget_destroy (netspeed->details); + + netspeed->details = NULL; + netspeed->drawingarea = NULL; + netspeed->ip_text = NULL; + netspeed->netmask_text = NULL; + netspeed->ptpip_text = NULL; + netspeed->ipv6_text = NULL; + netspeed->hwaddr_text = NULL; + netspeed->inbytes_text = NULL; + netspeed->outbytes_text = NULL; + netspeed->essid_text = NULL; + netspeed->signalbar = NULL; #ifdef HAVE_NL - applet->station_text = NULL; - applet->channel_text = NULL; - applet->connected_time_text = NULL; + netspeed->station_text = NULL; + netspeed->channel_text = NULL; + netspeed->connected_time_text = NULL; #endif /* HAVE_NL */ - applet->ipv6_box = NULL; - applet->netlink_box = NULL; - applet->wireless_box = NULL; + netspeed->ipv6_box = NULL; + netspeed->netlink_box = NULL; + netspeed->wireless_box = NULL; } /* Creates the details dialog */ static void -showinfo_cb (GtkAction *action, - gpointer data) +showinfo_cb (GtkAction *action, + NetspeedApplet *netspeed) { GtkBuilder *builder; - MateNetspeedApplet *applet = (MateNetspeedApplet*)data; - g_assert(applet); + g_assert (netspeed); - if (applet->details) { - gtk_window_present(GTK_WINDOW(applet->details)); + if (netspeed->details) { + gtk_window_present (GTK_WINDOW (netspeed->details)); return; } builder = gtk_builder_new_from_resource (NETSPEED_RESOURCE_PATH "netspeed-details.ui"); - applet->details = GET_DIALOG ("dialog"); - applet->drawingarea = GET_DRAWING_AREA ("drawingarea"); - - applet->ip_text = GET_WIDGET ("ip_text"); - applet->netmask_text = GET_WIDGET ("netmask_text"); - applet->ptpip_text = GET_WIDGET ("ptpip_text"); - applet->ipv6_text = GET_WIDGET ("ipv6_text"); - applet->hwaddr_text = GET_WIDGET ("hwaddr_text"); - applet->inbytes_text = GET_WIDGET ("inbytes_text"); - applet->outbytes_text = GET_WIDGET ("outbytes_text"); - applet->essid_text = GET_WIDGET ("essid_text"); - applet->signalbar = GET_WIDGET ("signalbar"); + netspeed->details = GET_WIDGET ("dialog"); + netspeed->drawingarea = GET_DRAWING_AREA ("drawingarea"); + + netspeed->ip_text = GET_WIDGET ("ip_text"); + netspeed->netmask_text = GET_WIDGET ("netmask_text"); + netspeed->ptpip_text = GET_WIDGET ("ptpip_text"); + netspeed->ipv6_text = GET_WIDGET ("ipv6_text"); + netspeed->hwaddr_text = GET_WIDGET ("hwaddr_text"); + netspeed->inbytes_text = GET_WIDGET ("inbytes_text"); + netspeed->outbytes_text = GET_WIDGET ("outbytes_text"); + netspeed->essid_text = GET_WIDGET ("essid_text"); + netspeed->signalbar = GET_WIDGET ("signalbar"); #ifdef HAVE_NL - applet->station_text = GET_WIDGET ("station_text"); - applet->channel_text = GET_WIDGET ("channel_text"); + netspeed->station_text = GET_WIDGET ("station_text"); + netspeed->channel_text = GET_WIDGET ("channel_text"); - applet->connected_time_text = GET_WIDGET ("connected_time_text"); + netspeed->connected_time_text = GET_WIDGET ("connected_time_text"); #endif /* HAVE_NL */ - applet->ipv6_box = GET_WIDGET ("ipv6_box"); - applet->netlink_box = GET_WIDGET ("netlink_box"); - applet->wireless_box = GET_WIDGET ("wireless_box"); + netspeed->ipv6_box = GET_WIDGET ("ipv6_box"); + netspeed->netlink_box = GET_WIDGET ("netlink_box"); + netspeed->wireless_box = GET_WIDGET ("wireless_box"); - gtk_color_chooser_set_rgba (GET_COLOR_CHOOSER ("incolor_sel"), &applet->in_color); - gtk_color_chooser_set_rgba (GET_COLOR_CHOOSER ("outcolor_sel"), &applet->out_color); + gtk_color_chooser_set_rgba (GET_COLOR_CHOOSER ("incolor_sel"), &netspeed->in_color); + gtk_color_chooser_set_rgba (GET_COLOR_CHOOSER ("outcolor_sel"), &netspeed->out_color); - fill_details_dialog (applet); + fill_details_dialog (netspeed); gtk_builder_add_callback_symbols (builder, "on_drawingarea_draw", G_CALLBACK (da_draw), @@ -1332,22 +1220,22 @@ showinfo_cb (GtkAction *action, "on_outcolor_sel_color_set", G_CALLBACK (outcolor_changed_cb), "on_dialog_response", G_CALLBACK (info_response_cb), NULL); - gtk_builder_connect_signals (builder, applet); + gtk_builder_connect_signals (builder, netspeed); g_object_unref (builder); - gtk_window_present (GTK_WINDOW (applet->details)); + gtk_window_present (GTK_WINDOW (netspeed->details)); } -static const GtkActionEntry mate_netspeed_applet_menu_actions [] = { - { "MateNetspeedAppletDetails", "dialog-information", N_("Device _Details"), - NULL, NULL, G_CALLBACK (showinfo_cb) }, - { "MateNetspeedAppletProperties", "document-properties", N_("Preferences..."), - NULL, NULL, G_CALLBACK (settings_cb) }, - { "MateNetspeedAppletHelp", "help-browser", N_("Help"), - NULL, NULL, G_CALLBACK (help_cb) }, - { "MateNetspeedAppletAbout", "help-about", N_("About..."), - NULL, NULL, G_CALLBACK (about_cb) } +static const GtkActionEntry netspeed_applet_menu_actions [] = { + { "NetspeedAppletDetails", "dialog-information", N_("Device _Details"), + NULL, NULL, G_CALLBACK (showinfo_cb) }, + { "NetspeedAppletProperties", "document-properties", N_("Preferences..."), + NULL, NULL, G_CALLBACK (settings_cb) }, + { "NetspeedAppletHelp", "help-browser", N_("Help"), + NULL, NULL, G_CALLBACK (help_cb) }, + { "NetspeedAppletAbout", "help-about", N_("About..."), + NULL, NULL, G_CALLBACK (about_cb) } }; /* Block the size_request signal emit by the label if the @@ -1357,49 +1245,51 @@ static const GtkActionEntry mate_netspeed_applet_menu_actions [] = { * "jumping around" in the mate_panel which looks uggly */ static void -label_size_allocate_cb(GtkWidget *widget, GtkAllocation *allocation, MateNetspeedApplet *applet) +label_size_allocate_cb (GtkWidget *widget, + GtkAllocation *allocation, + NetspeedApplet *netspeed) { - if (applet->labels_dont_shrink) { - if (allocation->width <= applet->width) - allocation->width = applet->width; - else - applet->width = allocation->width; - } + if (netspeed->labels_dont_shrink) { + if (allocation->width <= netspeed->width) + allocation->width = netspeed->width; + else + netspeed->width = allocation->width; + } } static gboolean -applet_button_press (GtkWidget *widget, - GdkEventButton *event, - MateNetspeedApplet *applet) +netspeed_applet_button_press_event (GtkWidget *widget, + GdkEventButton *event) { if (event->button == 1) { + NetspeedApplet *netspeed = NETSPEED_APPLET (widget); GError *error = NULL; - if (applet->connect_dialog) { - gtk_window_present (GTK_WINDOW (applet->connect_dialog)); + if (netspeed->connect_dialog) { + gtk_window_present (GTK_WINDOW (netspeed->connect_dialog)); return FALSE; } - if (applet->up_cmd && applet->down_cmd) { + if (netspeed->up_cmd && netspeed->down_cmd) { char *question; int response; - if (applet->devinfo->up) + if (netspeed->devinfo->up) question = g_strdup_printf (_("Do you want to disconnect %s now?"), - applet->devinfo->name); + netspeed->devinfo->name); else question = g_strdup_printf (_("Do you want to connect %s now?"), - applet->devinfo->name); + netspeed->devinfo->name); - applet->connect_dialog = + netspeed->connect_dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, "%s", question); - response = gtk_dialog_run (GTK_DIALOG (applet->connect_dialog)); - gtk_widget_destroy (applet->connect_dialog); - applet->connect_dialog = NULL; + response = gtk_dialog_run (GTK_DIALOG (netspeed->connect_dialog)); + gtk_widget_destroy (netspeed->connect_dialog); + netspeed->connect_dialog = NULL; g_free (question); if (response == GTK_RESPONSE_YES) { @@ -1407,8 +1297,8 @@ applet_button_press (GtkWidget *widget, char *command; command = g_strdup_printf ("%s %s", - applet->devinfo->up ? applet->down_cmd : applet->up_cmd, - applet->devinfo->name); + netspeed->devinfo->up ? netspeed->down_cmd : netspeed->up_cmd, + netspeed->devinfo->name); if (!g_spawn_command_line_async (command, &error)) { dialog = gtk_message_dialog_new_with_markup (NULL, @@ -1421,322 +1311,460 @@ applet_button_press (GtkWidget *widget, g_error_free (error); } - g_free(command); + g_free (command); } } } - return FALSE; + return GTK_WIDGET_CLASS (netspeed_applet_parent_class)->button_press_event (widget, event); } /* Frees the applet and all the data it contains * Removes the timeout_cb */ static void -applet_destroy (MatePanelApplet *applet_widget, - MateNetspeedApplet *applet) +netspeed_applet_finalize (GObject *object) { - g_assert(applet); + NetspeedApplet *netspeed = NETSPEED_APPLET (object); - if (applet->icon_theme != NULL) { - g_signal_handlers_disconnect_by_func (applet->icon_theme, + if (netspeed->icon_theme != NULL) { + g_signal_handlers_disconnect_by_func (netspeed->icon_theme, icon_theme_changed_cb, - applet); - applet->icon_theme = NULL; + netspeed); + netspeed->icon_theme = NULL; } - g_source_remove (applet->timeout_id); - applet->timeout_id = 0; + if (netspeed->timeout_id > 0) { + g_source_remove (netspeed->timeout_id); + netspeed->timeout_id = 0; + } + + g_clear_object (&netspeed->settings); + + g_clear_pointer (&netspeed->details, gtk_widget_destroy); + g_clear_pointer (&netspeed->preferences, gtk_widget_destroy); - if (applet->up_cmd) - g_free (applet->up_cmd); - if (applet->down_cmd) - g_free (applet->down_cmd); - if (applet->gsettings) - g_object_unref (applet->gsettings); + g_free (netspeed->up_cmd); + g_free (netspeed->down_cmd); /* Should never be NULL */ - free_device_info (applet->devinfo); - g_free (applet); - return; + free_device_info (netspeed->devinfo); } static void -update_tooltip (MateNetspeedApplet* applet) +update_tooltip (NetspeedApplet *netspeed) { GString* tooltip; - if (!applet->show_tooltip) + if (!netspeed->show_tooltip) return; - tooltip = g_string_new(""); + tooltip = g_string_new (""); - if (!applet->devinfo->running) - g_string_printf(tooltip, _("%s is down"), applet->devinfo->name); + if (!netspeed->devinfo->running) + g_string_printf (tooltip, _("%s is down"), netspeed->devinfo->name); else { + GSList *iterator; + GString *string = NULL; char ipv4_text [INET_ADDRSTRLEN]; - char *ip; - if (applet->devinfo->ip) { - format_ipv4 (applet->devinfo->ip, ipv4_text); - ip = ipv4_text; - } else { - ip = _("has no ip"); + g_string_printf (tooltip, "%s: ", netspeed->devinfo->name); + + if (netspeed->show_all_addresses || !netspeed->devinfo->ip) { + GSList *ip6_address_list = get_ip6_address_list (netspeed->devinfo->name); + + /* check if we got IPv6 addresses */ + if (ip6_address_list != NULL) { + for (iterator = ip6_address_list; iterator; iterator = iterator->next) { + if (string == NULL) + string = g_string_new ((char*) iterator->data); + else + g_string_append_printf (string, + _("\n%s"), + (char*) iterator->data); + } + } + + g_slist_free_full (ip6_address_list, g_free); + } + + if (!netspeed->devinfo->ip && !string) { + g_string_append (tooltip, "has no ip"); + } + + if (netspeed->devinfo->ip) { + format_ipv4 (netspeed->devinfo->ip, ipv4_text); + g_string_append (tooltip, ipv4_text); + } + + if (string != NULL) { + g_string_append_printf (tooltip, + _("\n%s"), + string->str); + g_string_free (string, TRUE); } - if (applet->show_sum) { - g_string_printf(tooltip, - _("%s: %s\nin: %s out: %s"), - applet->devinfo->name, - ip, - applet->devinfo->rx_rate, - applet->devinfo->tx_rate); + if (netspeed->show_sum) { + g_string_append_printf (tooltip, + _("\nin: %s out: %s"), + netspeed->devinfo->rx_rate, + netspeed->devinfo->tx_rate); } else { - g_string_printf(tooltip, - _("%s: %s\nsum: %s"), - applet->devinfo->name, - ip, - applet->devinfo->sum_rate); + g_string_append_printf (tooltip, + _("\nsum: %s"), + netspeed->devinfo->sum_rate); } + #ifdef HAVE_NL - if (applet->devinfo->type == DEV_WIRELESS) + if (netspeed->devinfo->type == DEV_WIRELESS) g_string_append_printf (tooltip, _("\nESSID: %s\nRSSI: %d dBm\nRX Bitrate: %s\nTX Bitrate: %s"), - applet->devinfo->essid ? applet->devinfo->essid : _("unknown"), - applet->devinfo->rssi, - applet->devinfo->rx_bitrate, - applet->devinfo->tx_bitrate); + netspeed->devinfo->essid ? netspeed->devinfo->essid : _("unknown"), + netspeed->devinfo->rssi, + netspeed->devinfo->rx_bitrate, + netspeed->devinfo->tx_bitrate); #endif /* HAVE_NL */ #ifdef HAVE_IW - if (applet->devinfo->type == DEV_WIRELESS) + if (netspeed->devinfo->type == DEV_WIRELESS) g_string_append_printf (tooltip, _("\nESSID: %s\nStrength: %d %%"), - applet->devinfo->essid ? applet->devinfo->essid : _("unknown"), - applet->devinfo->qual); + netspeed->devinfo->essid ? netspeed->devinfo->essid : _("unknown"), + netspeed->devinfo->qual); #endif /* HAVE_IW */ } - gtk_widget_set_tooltip_text (GTK_WIDGET (applet->applet), tooltip->str); - gtk_widget_trigger_tooltip_query (GTK_WIDGET (applet->applet)); + gtk_widget_set_tooltip_text (GTK_WIDGET (netspeed), tooltip->str); + gtk_widget_trigger_tooltip_query (GTK_WIDGET (netspeed)); g_string_free (tooltip, TRUE); } +static gboolean +netspeed_applet_enter_notify_event (GtkWidget *widget, + GdkEventCrossing *event) +{ + NetspeedApplet *netspeed = NETSPEED_APPLET (widget); + + netspeed->show_tooltip = TRUE; + update_tooltip (netspeed); + return TRUE; +} static gboolean -mate_netspeed_enter_cb(GtkWidget *widget, GdkEventCrossing *event, gpointer data) +netspeed_applet_leave_notify_event (GtkWidget *widget, + GdkEventCrossing *event) +{ + NetspeedApplet *netspeed = NETSPEED_APPLET (widget); + + netspeed->show_tooltip = FALSE; + return TRUE; +} + +static void +netspeed_applet_class_init (NetspeedAppletClass *klass) { - MateNetspeedApplet *applet = data; + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); - applet->show_tooltip = TRUE; - update_tooltip(applet); + object_class->finalize = netspeed_applet_finalize; - return TRUE; + widget_class->button_press_event = netspeed_applet_button_press_event; + widget_class->leave_notify_event = netspeed_applet_leave_notify_event; + widget_class->enter_notify_event = netspeed_applet_enter_notify_event; } -static gboolean -mate_netspeed_leave_cb(GtkWidget *widget, GdkEventCrossing *event, gpointer data) +static void +netspeed_applet_init (NetspeedApplet *netspeed) +{ +} + +static void +changeicon_settings_changed (GSettings *settings, + const gchar *key, + NetspeedApplet *netspeed) +{ + netspeed->change_icon = g_settings_get_boolean (settings, key); + change_icons (netspeed); +} + +static void +showalladdresses_settings_changed (GSettings *settings, + const gchar *key, + NetspeedApplet *netspeed) +{ + netspeed->show_all_addresses = g_settings_get_boolean (settings, key); +} + +static void +showsum_settings_changed (GSettings *settings, + const gchar *key, + NetspeedApplet *netspeed) { - MateNetspeedApplet *applet = data; + netspeed->show_sum = g_settings_get_boolean (settings, key); + applet_change_size_or_orient (MATE_PANEL_APPLET (netspeed), -1, netspeed); + change_icons (netspeed); +} - applet->show_tooltip = FALSE; - return TRUE; +static void +showbits_settings_changed (GSettings *settings, + const gchar *key, + NetspeedApplet *netspeed) +{ + netspeed->show_bits = g_settings_get_boolean (settings, key); +} + +static void +showicon_settings_changed (GSettings *settings, + const gchar *key, + NetspeedApplet *netspeed) +{ + netspeed->show_icon = g_settings_get_boolean (settings, key); + change_icons (netspeed); +} + +static void +showqualityicon_settings_changed (GSettings *settings, + const gchar *key, + NetspeedApplet *netspeed) +{ + netspeed->show_quality_icon = g_settings_get_boolean (settings, key); + change_quality_icon (netspeed); +} + +static void +auto_change_device_settings_changed (GSettings *settings, + const gchar *key, + NetspeedApplet *netspeed) +{ + netspeed->auto_change_device = g_settings_get_boolean (settings, key); + netspeed->device_has_changed = TRUE; + update_applet (netspeed); +} + +static void +device_settings_changed (GSettings *settings, + const gchar *key, + NetspeedApplet *netspeed) +{ + char *device; + + device = g_settings_get_string (settings, key); + if (device && *device != '\0') { + free_device_info (netspeed->devinfo); + get_device_info (device, &netspeed->devinfo); + netspeed->device_has_changed = TRUE; + } + g_free (device); } /* The "main" function of the applet */ static gboolean -mate_netspeed_applet_factory(MatePanelApplet *applet_widget, const gchar *iid, gpointer data) +netspeed_applet_factory (MatePanelApplet *applet, + const gchar *iid, + gpointer data) { - MateNetspeedApplet *applet; - int i; - GtkWidget *spacer, *spacer_box; - GtkActionGroup *action_group; - - /* Have our background automatically painted. */ - mate_panel_applet_set_background_widget(MATE_PANEL_APPLET(applet_widget), - GTK_WIDGET(applet_widget)); - - if (strcmp (iid, "NetspeedApplet")) - return FALSE; - - glibtop_init(); - g_set_application_name (_("MATE Netspeed")); - - /* Alloc the applet. The "NULL-setting" is really redudant - * but aren't we paranoid? - */ - applet = g_new0 (MateNetspeedApplet, 1); - applet->applet = applet_widget; - applet->icon_theme = gtk_icon_theme_get_default (); - - /* Set the default colors of the graph - */ - applet->in_color.red = 0xdf00; - applet->in_color.green = 0x2800; - applet->in_color.blue = 0x4700; - applet->out_color.red = 0x3700; - applet->out_color.green = 0x2800; - applet->out_color.blue = 0xdf00; - - for (i = 0; i < GRAPH_VALUES; i++) - { - applet->in_graph[i] = -1; - applet->out_graph[i] = -1; - } - - applet->gsettings = mate_panel_applet_settings_new (applet_widget, "org.mate.panel.applet.netspeed"); - - /* Get stored settings from gsettings - */ - applet->show_sum = g_settings_get_boolean (applet->gsettings, "show-sum"); - applet->show_bits = g_settings_get_boolean (applet->gsettings, "show-bits"); - applet->show_icon = g_settings_get_boolean (applet->gsettings, "show-icon"); - applet->show_quality_icon = g_settings_get_boolean (applet->gsettings, "show-quality-icon"); - applet->change_icon = g_settings_get_boolean (applet->gsettings, "change-icon"); - applet->auto_change_device = g_settings_get_boolean (applet->gsettings, "auto-change-device"); - - char *tmp = NULL; - tmp = g_settings_get_string (applet->gsettings, "device"); - if (tmp && strcmp(tmp, "")) - { - get_device_info(tmp, &applet->devinfo); - g_free(tmp); - } - - tmp = g_settings_get_string (applet->gsettings, "up-command"); - if (tmp && strcmp(tmp, "")) - { - applet->up_cmd = g_strdup(tmp); - g_free(tmp); - } - - tmp = g_settings_get_string (applet->gsettings, "down-command"); - if (tmp && strcmp(tmp, "")) - { - applet->down_cmd = g_strdup(tmp); - g_free(tmp); - } - - tmp = g_settings_get_string (applet->gsettings, "in-color"); - if (tmp) - { - gdk_rgba_parse (&applet->in_color, tmp); - g_free(tmp); - } - - tmp = g_settings_get_string (applet->gsettings, "out-color"); - if (tmp) - { - gdk_rgba_parse (&applet->out_color, tmp); - g_free(tmp); - } - - if (!applet->devinfo) { - GList *ptr, *devices = get_available_devices(); - ptr = devices; - while (ptr) { - if (!g_str_equal(ptr->data, "lo")) { - get_device_info(ptr->data, &applet->devinfo); - break; - } - ptr = g_list_next(ptr); - } - free_devices_list(devices); - } - if (!applet->devinfo) - get_device_info("lo", &applet->devinfo); - applet->device_has_changed = TRUE; - - applet->in_label = gtk_label_new(""); - applet->out_label = gtk_label_new(""); - applet->sum_label = gtk_label_new(""); - - applet->in_pix = gtk_image_new(); - applet->out_pix = gtk_image_new(); - applet->dev_pix = gtk_image_new(); - applet->qual_pix = gtk_image_new(); - - applet->pix_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); - spacer = gtk_label_new(""); - gtk_box_pack_start(GTK_BOX(applet->pix_box), spacer, TRUE, TRUE, 0); - spacer = gtk_label_new(""); - gtk_box_pack_end(GTK_BOX(applet->pix_box), spacer, TRUE, TRUE, 0); - - spacer_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2); - gtk_box_pack_start(GTK_BOX(applet->pix_box), spacer_box, FALSE, FALSE, 0); - gtk_box_pack_start(GTK_BOX(spacer_box), applet->qual_pix, FALSE, FALSE, 0); - gtk_box_pack_start(GTK_BOX(spacer_box), applet->dev_pix, FALSE, FALSE, 0); - - init_quality_surfaces(applet); - - applet_change_size_or_orient(applet_widget, -1, (gpointer)applet); - gtk_widget_show_all(GTK_WIDGET(applet_widget)); - update_applet(applet); - - mate_panel_applet_set_flags(applet_widget, MATE_PANEL_APPLET_EXPAND_MINOR); - - applet->timeout_id = g_timeout_add (REFRESH_TIME, - (GSourceFunc)timeout_function, - (gpointer)applet); - - g_signal_connect(G_OBJECT(applet_widget), "change_size", - G_CALLBACK(applet_change_size_or_orient), - (gpointer)applet); - - g_signal_connect(G_OBJECT(applet->icon_theme), "changed", - G_CALLBACK(icon_theme_changed_cb), - (gpointer)applet); - - g_signal_connect(G_OBJECT(applet_widget), "change_orient", - G_CALLBACK(applet_change_size_or_orient), - (gpointer)applet); - - g_signal_connect(G_OBJECT(applet->in_label), "size_allocate", - G_CALLBACK(label_size_allocate_cb), - (gpointer)applet); - - g_signal_connect(G_OBJECT(applet->out_label), "size_allocate", - G_CALLBACK(label_size_allocate_cb), - (gpointer)applet); - - g_signal_connect(G_OBJECT(applet->sum_label), "size_allocate", - G_CALLBACK(label_size_allocate_cb), - (gpointer)applet); - - g_signal_connect(G_OBJECT(applet_widget), "destroy", - G_CALLBACK(applet_destroy), - (gpointer)applet); - - g_signal_connect(G_OBJECT(applet_widget), "button-press-event", - G_CALLBACK(applet_button_press), - (gpointer)applet); - - g_signal_connect(G_OBJECT(applet_widget), "leave_notify_event", - G_CALLBACK(mate_netspeed_leave_cb), - (gpointer)applet); - - g_signal_connect(G_OBJECT(applet_widget), "enter_notify_event", - G_CALLBACK(mate_netspeed_enter_cb), - (gpointer)applet); - - action_group = gtk_action_group_new ("Netspeed Applet Actions"); - gtk_action_group_set_translation_domain (action_group, GETTEXT_PACKAGE); - gtk_action_group_add_actions (action_group, - mate_netspeed_applet_menu_actions, - G_N_ELEMENTS (mate_netspeed_applet_menu_actions), - applet); - - mate_panel_applet_setup_menu_from_resource (MATE_PANEL_APPLET (applet->applet), - NETSPEED_RESOURCE_PATH "netspeed-menu.xml", - action_group); - - g_object_unref (action_group); - - return TRUE; + NetspeedApplet *netspeed; + int i; + GtkWidget *spacer, *spacer_box; + GtkActionGroup *action_group; + AtkObject *atk_obj; + char *tmp; + + if (strcmp (iid, "NetspeedApplet")) + return FALSE; + + glibtop_init (); + +#ifndef ENABLE_IN_PROCESS + g_set_application_name (_("MATE Netspeed")); +#endif + + netspeed = NETSPEED_APPLET (applet); + netspeed->icon_theme = gtk_icon_theme_get_default (); + + for (i = 0; i < GRAPH_VALUES; i++) + { + netspeed->in_graph[i] = -1; + netspeed->out_graph[i] = -1; + } + + netspeed->settings = mate_panel_applet_settings_new (applet, "org.mate.panel.applet.netspeed"); + + /* Get stored settings from gsettings + */ + netspeed->show_all_addresses = g_settings_get_boolean (netspeed->settings, "show-all-addresses"); + netspeed->show_sum = g_settings_get_boolean (netspeed->settings, "show-sum"); + netspeed->show_bits = g_settings_get_boolean (netspeed->settings, "show-bits"); + netspeed->show_icon = g_settings_get_boolean (netspeed->settings, "show-icon"); + netspeed->show_quality_icon = g_settings_get_boolean (netspeed->settings, "show-quality-icon"); + netspeed->change_icon = g_settings_get_boolean (netspeed->settings, "change-icon"); + netspeed->auto_change_device = g_settings_get_boolean (netspeed->settings, "auto-change-device"); + + tmp = g_settings_get_string (netspeed->settings, "device"); + if (tmp && *tmp != '\0') + get_device_info (tmp, &netspeed->devinfo); + else + netspeed->devinfo = NULL; + g_free (tmp); + + tmp = g_settings_get_string (netspeed->settings, "up-command"); + if (tmp && *tmp != '\0') + netspeed->up_cmd = g_strdup (tmp); + else + netspeed->up_cmd = NULL; + g_free (tmp); + + tmp = g_settings_get_string (netspeed->settings, "down-command"); + if (tmp && *tmp != '\0') + netspeed->down_cmd = g_strdup (tmp); + else + netspeed->down_cmd = NULL; + g_free (tmp); + + tmp = g_settings_get_string (netspeed->settings, "in-color"); + if (tmp && *tmp != '\0') + gdk_rgba_parse (&netspeed->in_color, tmp); + else + gdk_rgba_parse (&netspeed->in_color, "#df0028004700"); + g_free (tmp); + + tmp = g_settings_get_string (netspeed->settings, "out-color"); + if (tmp && *tmp != '\0') + gdk_rgba_parse (&netspeed->out_color, tmp); + else + gdk_rgba_parse (&netspeed->out_color, "#37002800df00"); + g_free (tmp); + + if (!netspeed->devinfo) { + GList *ptr, *devices = get_available_devices (); + ptr = devices; + while (ptr) { + if (!g_str_equal (ptr->data, "lo")) { + get_device_info (ptr->data, &netspeed->devinfo); + break; + } + ptr = g_list_next (ptr); + } + g_list_free_full (devices, g_free); + } + if (!netspeed->devinfo) + get_device_info ("lo", &netspeed->devinfo); + + netspeed->device_has_changed = TRUE; + + netspeed->in_label = gtk_label_new (""); + netspeed->out_label = gtk_label_new (""); + netspeed->sum_label = gtk_label_new (""); + + netspeed->in_pix = gtk_image_new (); + netspeed->out_pix = gtk_image_new (); + netspeed->dev_pix = gtk_image_new (); + netspeed->qual_pix = gtk_image_new (); + + netspeed->pix_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); + spacer = gtk_label_new (""); + gtk_box_pack_start (GTK_BOX (netspeed->pix_box), spacer, TRUE, TRUE, 0); + spacer = gtk_label_new (""); + gtk_box_pack_end (GTK_BOX (netspeed->pix_box), spacer, TRUE, TRUE, 0); + + spacer_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2); + gtk_box_pack_start (GTK_BOX (netspeed->pix_box), spacer_box, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (spacer_box), netspeed->qual_pix, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (spacer_box), netspeed->dev_pix, FALSE, FALSE, 0); + + init_quality_surfaces (netspeed); + + applet_change_size_or_orient (applet, -1, netspeed); + gtk_widget_show_all (GTK_WIDGET (applet)); + update_applet (netspeed); + + mate_panel_applet_set_flags (applet, MATE_PANEL_APPLET_EXPAND_MINOR); + + netspeed->timeout_id = g_timeout_add (REFRESH_TIME, + (GSourceFunc)timeout_function, + netspeed); + g_signal_connect_object (applet, "change-size", + G_CALLBACK (applet_change_size_or_orient), + netspeed, 0); + + g_signal_connect_object (netspeed->icon_theme, "changed", + G_CALLBACK (icon_theme_changed_cb), + netspeed, 0); + + g_signal_connect_object (applet, "change-orient", + G_CALLBACK (applet_change_size_or_orient), + netspeed, 0); + + g_signal_connect_object (netspeed->in_label, "size-allocate", + G_CALLBACK (label_size_allocate_cb), + netspeed, 0); + + g_signal_connect_object (netspeed->out_label, "size-allocate", + G_CALLBACK (label_size_allocate_cb), + netspeed, 0); + + g_signal_connect_object (netspeed->sum_label, "size-allocate", + G_CALLBACK (label_size_allocate_cb), + netspeed, 0); + + g_signal_connect_object (netspeed->settings, "changed::auto-change-device", + G_CALLBACK (auto_change_device_settings_changed), + netspeed, 0); + + g_signal_connect_object (netspeed->settings, "changed::device", + G_CALLBACK (device_settings_changed), + netspeed, 0); + + g_signal_connect_object (netspeed->settings, "changed::show-all-addresses", + G_CALLBACK (showalladdresses_settings_changed), + netspeed, 0); + + g_signal_connect_object (netspeed->settings, "changed::show-sum", + G_CALLBACK (showsum_settings_changed), + netspeed, 0); + + g_signal_connect_object (netspeed->settings, "changed::show-bits", + G_CALLBACK (showbits_settings_changed), + netspeed, 0); + + g_signal_connect_object (netspeed->settings, "changed::change-icon", + G_CALLBACK (changeicon_settings_changed), + netspeed, 0); + + g_signal_connect_object (netspeed->settings, "changed::show-icon", + G_CALLBACK (showicon_settings_changed), + netspeed, 0); + + g_signal_connect_object (netspeed->settings, "changed::show-quality-icon", + G_CALLBACK (showqualityicon_settings_changed), + netspeed, 0); + + action_group = gtk_action_group_new ("Netspeed Applet Actions"); + gtk_action_group_set_translation_domain (action_group, GETTEXT_PACKAGE); + gtk_action_group_add_actions (action_group, + netspeed_applet_menu_actions, + G_N_ELEMENTS (netspeed_applet_menu_actions), + netspeed); + + mate_panel_applet_setup_menu_from_resource (applet, + NETSPEED_RESOURCE_PATH "netspeed-menu.xml", + action_group); + + atk_obj = gtk_widget_get_accessible (GTK_WIDGET (applet)); + + if (GTK_IS_ACCESSIBLE (atk_obj)) { + atk_object_set_name (atk_obj, _("MATE Netspeed")); + atk_object_set_description (atk_obj, + _("A little applet that displays some information on the traffic on the specified network device")); + } + + g_object_unref (action_group); + + return TRUE; } -MATE_PANEL_APPLET_OUT_PROCESS_FACTORY("NetspeedAppletFactory", - PANEL_TYPE_APPLET, - "NetspeedApplet", - mate_netspeed_applet_factory, - NULL) +PANEL_APPLET_FACTORY ("NetspeedAppletFactory", + NETSPEED_TYPE_APPLET, + "NetspeedApplet", + netspeed_applet_factory, + NULL) |