aboutsummaryrefslogtreecommitdiffstats
path: root/gtk
diff options
context:
space:
mode:
authorstig <stig@f5534014-38df-0310-8fa8-9805f1628bb7>2009-05-26 21:13:16 +0000
committerstig <stig@f5534014-38df-0310-8fa8-9805f1628bb7>2009-05-26 21:13:16 +0000
commit0bce791b66fbca7753029ccfda3b530df78bb5e3 (patch)
tree01de06f98509187da9b1d4977cbbc069acdbf591 /gtk
parent5575fd26c0b279179487182f04bfab85525e946e (diff)
Make it possible to toggle the displayed IP address in the capture interfacs
dialog if more than one IP address exists for the selected device. git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@28498 f5534014-38df-0310-8fa8-9805f1628bb7
Diffstat (limited to 'gtk')
-rw-r--r--gtk/capture_if_dlg.c115
1 files changed, 92 insertions, 23 deletions
diff --git a/gtk/capture_if_dlg.c b/gtk/capture_if_dlg.c
index 62ef5b52d9..a75c7ad15f 100644
--- a/gtk/capture_if_dlg.c
+++ b/gtk/capture_if_dlg.c
@@ -98,6 +98,9 @@
#include "airpcap_dlg.h"
#endif
+#define CAPTURE_IF_IP_ADDR_LABEL "capture_if_ip_addr_label"
+#define CAPTURE_IF_SELECTED_IP_ADDR "capture_if_selected_ip_addr"
+
/*
* Keep a static pointer to the current "Capture Interfaces" window, if
* any, so that if somebody tries to do "Capture:Start" while there's
@@ -433,6 +436,80 @@ GtkWidget * capture_get_if_icon(const if_info_t* if_info _U_)
}
+static const gchar *
+set_ip_addr_label(GSList *ip_addr_list, GtkWidget *ip_lb, guint selected_ip_addr)
+{
+ GSList *curr_ip;
+ if_addr_t *ip_addr;
+ const gchar *addr_str = NULL;
+
+ curr_ip = g_slist_nth(ip_addr_list, selected_ip_addr);
+ if (curr_ip) {
+ ip_addr = (if_addr_t *)curr_ip->data;
+ switch (ip_addr->type) {
+
+ case AT_IPv4:
+ addr_str = ip_to_str((guint8 *)&ip_addr->ip_addr.ip4_addr);
+ break;
+
+ case AT_IPv6:
+ addr_str = ip6_to_str((struct e_in6_addr *)&ip_addr->ip_addr.ip6_addr);
+ break;
+
+ default:
+ g_assert_not_reached();
+ }
+ }
+
+ if (addr_str) {
+ gtk_label_set_text(GTK_LABEL(ip_lb), addr_str);
+ } else {
+ gtk_label_set_text(GTK_LABEL(ip_lb), "unknown");
+ }
+ g_object_set_data(G_OBJECT(ip_lb), CAPTURE_IF_SELECTED_IP_ADDR, GINT_TO_POINTER(selected_ip_addr));
+
+ return addr_str;
+}
+
+
+static gboolean
+ip_label_enter_cb(GtkWidget *eb, GdkEventCrossing *event _U_, gpointer user_data _U_)
+{
+ gtk_widget_set_state(eb, GTK_STATE_PRELIGHT);
+
+ return FALSE;
+}
+
+
+static gboolean
+ip_label_leave_cb(GtkWidget *eb, GdkEvent *event _U_, gpointer user_data _U_)
+{
+ gtk_widget_set_state(eb, GTK_STATE_NORMAL);
+
+ return FALSE;
+}
+
+
+static gboolean
+ip_label_press_cb(GtkWidget *widget, GdkEvent *event _U_, gpointer data)
+{
+ GtkWidget *ip_lb = g_object_get_data(G_OBJECT(widget), CAPTURE_IF_IP_ADDR_LABEL);
+ GSList *ip_addr_list = data;
+ guint selected_ip_addr = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(ip_lb), CAPTURE_IF_SELECTED_IP_ADDR));
+
+ /* Select next IP address */
+ selected_ip_addr++;
+ if (g_slist_length(ip_addr_list) <= selected_ip_addr) {
+ /* Probably have the last one, start over again */
+ selected_ip_addr = 0;
+ }
+
+ set_ip_addr_label(ip_addr_list, ip_lb, selected_ip_addr);
+
+ return FALSE;
+}
+
+
/* start getting capture stats from all interfaces */
void
@@ -451,6 +528,7 @@ capture_if_cb(GtkWidget *w _U_, gpointer d _U_)
GtkWidget *if_tb;
GtkWidget *if_lb;
+ GtkWidget *eb;
GtkTooltips *tooltips;
int err;
gchar *err_str;
@@ -460,8 +538,6 @@ capture_if_cb(GtkWidget *w _U_, gpointer d _U_)
int ifs;
GList *curr;
if_info_t *if_info;
- GSList *curr_ip;
- if_addr_t *ip_addr;
GString *if_tool_str = g_string_new("");
const gchar *addr_str;
gchar *tmp_str;
@@ -648,34 +724,27 @@ capture_if_cb(GtkWidget *w _U_, gpointer d _U_)
}
/* IP address */
- /* only the first IP address will be shown */
+ /* Only one IP address will be shown, start with the first */
g_string_append(if_tool_str, "IP: ");
- curr_ip = g_slist_nth(if_info->ip_addr, 0);
- if(curr_ip) {
- ip_addr = (if_addr_t *)curr_ip->data;
- switch (ip_addr->type) {
-
- case AT_IPv4:
- addr_str = ip_to_str((guint8 *)&ip_addr->ip_addr.ip4_addr);
- break;
-
- case AT_IPv6:
- addr_str = ip6_to_str((struct e_in6_addr *)&ip_addr->ip_addr.ip6_addr);
- break;
-
- default:
- g_assert_not_reached();
- addr_str = NULL;
- }
- if_dlg_data->ip_lb = gtk_label_new(addr_str);
+ if_dlg_data->ip_lb = gtk_label_new("");
+ addr_str = set_ip_addr_label (if_info->ip_addr, if_dlg_data->ip_lb, 0);
+ if (addr_str) {
gtk_widget_set_sensitive(if_dlg_data->ip_lb, TRUE);
g_string_append(if_tool_str, addr_str);
} else {
- if_dlg_data->ip_lb = gtk_label_new("unknown");
gtk_widget_set_sensitive(if_dlg_data->ip_lb, FALSE);
g_string_append(if_tool_str, "unknown");
}
- gtk_table_attach_defaults(GTK_TABLE(if_tb), if_dlg_data->ip_lb, 3, 4, row, row+1);
+ eb = gtk_event_box_new ();
+ gtk_container_add(GTK_CONTAINER(eb), if_dlg_data->ip_lb);
+ gtk_table_attach_defaults(GTK_TABLE(if_tb), eb, 3, 4, row, row+1);
+ if (g_slist_length(if_info->ip_addr) > 1) {
+ /* More than one IP address, make it possible to toggle */
+ g_object_set_data(G_OBJECT(eb), CAPTURE_IF_IP_ADDR_LABEL, if_dlg_data->ip_lb);
+ g_signal_connect(eb, "enter-notify-event", G_CALLBACK(ip_label_enter_cb), NULL);
+ g_signal_connect(eb, "leave-notify-event", G_CALLBACK(ip_label_leave_cb), NULL);
+ g_signal_connect(eb, "button-press-event", G_CALLBACK(ip_label_press_cb), if_info->ip_addr);
+ }
g_string_append(if_tool_str, "\n");
/* packets */