summaryrefslogtreecommitdiff
path: root/ui/gtk/expert_comp_dlg.c
diff options
context:
space:
mode:
authorMichael Mann <mmann78@netscape.net>2014-06-20 02:47:03 -0400
committerMichael Mann <mmann78@netscape.net>2014-07-16 01:57:01 +0000
commitd8cff57ef342b909f128244f3ab5e5debcec4988 (patch)
tree20edd507d6f654c15f0a49ddda2bc2aa329878a0 /ui/gtk/expert_comp_dlg.c
parentfae3615ce07bb5ced41486cf97844f271118e893 (diff)
downloadwireshark-d8cff57ef342b909f128244f3ab5e5debcec4988.tar.gz
Allow expert info to show only items in the display filter.
This was started by Chris Maynard before Qt was announced and I just polished it off for inclusion in GTK version of Wireshark. This also can be used as input into the Qt version of the Expert Info "dialog" since it hasn't been written yet. Personally I like the "template" the Qt statistics dialog has with the display filter built it. I think that would work well for the Expert Info dialog as well. bug:1860 Change-Id: Icaada6e7900f22b0a3d97c2a5656edfd8d8c8b7f Reviewed-on: https://code.wireshark.org/review/3035 Reviewed-by: Christopher Maynard <Christopher.Maynard@gtech.com> Reviewed-by: Michael Mann <mmann78@netscape.net>
Diffstat (limited to 'ui/gtk/expert_comp_dlg.c')
-rw-r--r--ui/gtk/expert_comp_dlg.c76
1 files changed, 59 insertions, 17 deletions
diff --git a/ui/gtk/expert_comp_dlg.c b/ui/gtk/expert_comp_dlg.c
index 311018e550..c882eb4a88 100644
--- a/ui/gtk/expert_comp_dlg.c
+++ b/ui/gtk/expert_comp_dlg.c
@@ -48,6 +48,7 @@
#include "ui/gtk/old-gtk-compat.h"
#include "ui/gtk/edit_packet_comment_dlg.h"
#include "ui/gtk/capture_comment_icons.h"
+#include "ui/gtk/gtkglobals.h"
void register_tap_listener_expert_comp(void);
@@ -85,12 +86,14 @@ typedef struct _expert_comp_dlg_t {
error_equiv_table note_table;
error_equiv_table warn_table;
error_equiv_table error_table;
+ expert_tapdata_t *etd; /* details tab info similar to error_equiv_table for others */
guint32 pkt_comments_events;
guint32 disp_events;
guint32 chat_events;
guint32 note_events;
guint32 warn_events;
guint32 error_events;
+ gboolean use_dfilter;
} expert_comp_dlg_t;
struct expert_tapdata_s {
@@ -137,6 +140,35 @@ select_row_cb(GtkTreeSelection *selection, gpointer *user_data _U_)
}
+static void
+expert_comp_select_filter_cb(GtkWidget *widget, gpointer callback_data, guint callback_action)
+{
+ expert_comp_dlg_t *ss = (expert_comp_dlg_t *)callback_data;
+ const char *filter;
+ GString *error_string;
+
+ ss->use_dfilter = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (widget));
+ if (ss->use_dfilter) {
+ filter = gtk_entry_get_text(GTK_ENTRY(main_display_filter_widget));
+ } else {
+ filter = NULL;
+ }
+ error_string = set_tap_dfilter (ss, filter);
+ if (error_string) {
+ simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", error_string->str);
+ g_string_free(error_string, TRUE);
+ return;
+ }
+ error_string = set_tap_dfilter (ss->etd, filter);
+ if (error_string) {
+ simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", error_string->str);
+ g_string_free(error_string, TRUE);
+ return;
+ }
+
+ cf_retap_packets(&cfile);
+}
+
/* reset of display only, e.g. for filtering */
static void expert_dlg_display_reset(expert_tapdata_t * etd)
{
@@ -225,6 +257,7 @@ error_reset(void *pss)
ss->note_events = 0;
ss->chat_events = 0;
ss->disp_events = 0;
+ ss->use_dfilter = FALSE;
ss->pkt_comments_events = 0;
reset_error_table_data(&ss->error_table);
@@ -760,7 +793,6 @@ static void
expert_comp_init(const char *opt_arg _U_, void* userdata _U_)
{
expert_comp_dlg_t *ss;
- const char *filter=NULL;
GString *error_string;
GtkWidget *temp_page, *details_page, *comments_page;
GtkWidget *main_nb;
@@ -770,9 +802,9 @@ expert_comp_init(const char *opt_arg _U_, void* userdata _U_)
GtkWidget *bbox;
GtkWidget *close_bt;
GtkWidget *help_bt;
- expert_tapdata_t *etd;
+ GtkWidget *filter_cb;
- ss=(expert_comp_dlg_t *)g_malloc(sizeof(expert_comp_dlg_t));
+ ss = (expert_comp_dlg_t *)g_malloc(sizeof(expert_comp_dlg_t));
ss->pkt_comments_events = 0;
ss->disp_events = 0;
@@ -788,7 +820,7 @@ expert_comp_init(const char *opt_arg _U_, void* userdata _U_)
error_set_title(ss);
- vbox=ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
+ vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
gtk_container_add(GTK_CONTAINER(ss->win), vbox);
gtk_container_set_border_width(GTK_CONTAINER(vbox), 12);
@@ -799,7 +831,7 @@ expert_comp_init(const char *opt_arg _U_, void* userdata _U_)
gtk_widget_show_all(ss->win);
/* Errors */
- temp_page =ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 6, FALSE);
+ temp_page = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 6, FALSE);
ss->error_label = gtk_label_new("Errors: 0/y");
gtk_widget_show(ss->error_label);
hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
@@ -881,33 +913,34 @@ expert_comp_init(const char *opt_arg _U_, void* userdata _U_)
gtk_box_pack_start(GTK_BOX(hbox), ss->pkt_comments_label, TRUE, TRUE, 0);
gtk_notebook_append_page(GTK_NOTEBOOK(main_nb), comments_page, hbox);
- etd = expert_dlg_new_table();
- etd->label=gtk_label_new("Please wait ...");
- gtk_misc_set_alignment(GTK_MISC(etd->label), 0.0f, 0.5f);
+ ss->etd = expert_dlg_new_table();
+ ss->etd->label=gtk_label_new("Please wait ...");
+ gtk_misc_set_alignment(GTK_MISC(ss->etd->label), 0.0f, 0.5f);
- etd->win=ss->win;
- expert_dlg_init_table(etd, details_page);
- expert_dlg_init_comments_table(etd, comments_page);
+ ss->etd->win=ss->win;
+ expert_dlg_init_table(ss->etd, details_page);
+ expert_dlg_init_comments_table(ss->etd, comments_page);
/* Add tap listener functions for expert details, From expert_dlg.c*/
- error_string=register_tap_listener("expert", etd, NULL /* fstring */,
- TL_REQUIRES_PROTO_TREE,
+ error_string=register_tap_listener("expert", ss->etd, NULL,
+ TL_REQUIRES_NOTHING,
expert_dlg_reset,
expert_dlg_packet,
expert_dlg_draw);
if(error_string){
simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", error_string->str);
g_string_free(error_string, TRUE);
- g_free(etd);
+ g_free(ss->etd);
return;
}
- g_signal_connect(etd->win, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(etd->win, "destroy", G_CALLBACK(expert_dlg_destroy_cb), etd);
+ g_signal_connect(ss->etd->win, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
+ g_signal_connect(ss->etd->win, "destroy", G_CALLBACK(expert_dlg_destroy_cb), ss->etd);
/* Register the tap listener */
- error_string=register_tap_listener("expert", ss, filter, 0, error_reset, error_packet, expert_comp_draw);
+ error_string=register_tap_listener("expert", ss, NULL,
+ TL_REQUIRES_NOTHING, error_reset, error_packet, expert_comp_draw);
if(error_string){
simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", error_string->str);
g_string_free(error_string, TRUE);
@@ -915,6 +948,15 @@ expert_comp_init(const char *opt_arg _U_, void* userdata _U_)
return;
}
+ hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, DLG_UNRELATED_SPACING, FALSE);
+ gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
+
+ filter_cb = gtk_check_button_new_with_mnemonic("Limit to display filter");
+ gtk_box_pack_start(GTK_BOX(hbox), filter_cb, FALSE, FALSE, 0);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(filter_cb), FALSE);
+ gtk_widget_set_tooltip_text(filter_cb, "Limit the expert infos to packets matching the current display filter.");
+ g_signal_connect(filter_cb, "toggled", G_CALLBACK(expert_comp_select_filter_cb), ss);
+
/* Button row. */
bbox = dlg_button_row_new(GTK_STOCK_CLOSE, GTK_STOCK_HELP, NULL);
gtk_box_pack_end(GTK_BOX(vbox), bbox, FALSE, FALSE, 0);