aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--epan/dissectors/file-file.c11
-rw-r--r--epan/dissectors/packet-frame.c12
-rw-r--r--epan/frame_data.h1
-rw-r--r--file.c9
-rw-r--r--ui/gtk/packet_list_store.c4
-rw-r--r--ui/qt/packet_list_record.cpp5
6 files changed, 33 insertions, 9 deletions
diff --git a/epan/dissectors/file-file.c b/epan/dissectors/file-file.c
index e61d4310bf..0c092edbda 100644
--- a/epan/dissectors/file-file.c
+++ b/epan/dissectors/file-file.c
@@ -298,9 +298,14 @@ dissect_file_record(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree,
ENDTRY;
}
- /* XXX optimize this so it doesn't need to scan the second time */
- color_filter = color_filters_colorize_packet(file_data->color_edt);
-
+ /* Attempt to (re-)calculate color filters (if any). */
+ if (pinfo->fd->flags.need_colorize) {
+ color_filter = color_filters_colorize_packet(file_data->color_edt);
+ pinfo->fd->color_filter = color_filter;
+ pinfo->fd->flags.need_colorize = 0;
+ } else {
+ color_filter = pinfo->fd->color_filter;
+ }
if (color_filter) {
pinfo->fd->color_filter = color_filter;
item = proto_tree_add_string(fh_tree, hf_file_color_filter_name, tvb,
diff --git a/epan/dissectors/packet-frame.c b/epan/dissectors/packet-frame.c
index 2cec2d50fa..83e6c963f9 100644
--- a/epan/dissectors/packet-frame.c
+++ b/epan/dissectors/packet-frame.c
@@ -616,11 +616,15 @@ dissect_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, void*
ENDTRY;
}
- /* XXX optimize this so it doesn't need to scan the second time */
- color_filter = color_filters_colorize_packet(fr_data->color_edt);
-
- if (color_filter) {
+ /* Attempt to (re-)calculate color filters (if any). */
+ if (pinfo->fd->flags.need_colorize) {
+ color_filter = color_filters_colorize_packet(fr_data->color_edt);
pinfo->fd->color_filter = color_filter;
+ pinfo->fd->flags.need_colorize = 0;
+ } else {
+ color_filter = pinfo->fd->color_filter;
+ }
+ if (color_filter) {
item = proto_tree_add_string(fh_tree, hf_frame_color_filter_name, tvb,
0, 0, color_filter->filter_name);
PROTO_ITEM_SET_GENERATED(item);
diff --git a/epan/frame_data.h b/epan/frame_data.h
index ef859d9818..6dec802645 100644
--- a/epan/frame_data.h
+++ b/epan/frame_data.h
@@ -84,6 +84,7 @@ typedef struct _frame_data {
unsigned int has_ts : 1; /**< 1 = has time stamp, 0 = no time stamp */
unsigned int has_phdr_comment : 1; /** 1 = there's comment for this packet */
unsigned int has_user_comment : 1; /** 1 = user set (also deleted) comment for this packet */
+ unsigned int need_colorize : 1; /**< 1 = need to (re-)calculate packet color */
} flags;
gint16 tsprec; /**< Time stamp precision */
diff --git a/file.c b/file.c
index 44ff87b142..125976f778 100644
--- a/file.c
+++ b/file.c
@@ -1099,6 +1099,15 @@ add_packet_to_packet_list(frame_data *fdata, capture_file *cf,
if (dfcode != NULL) {
epan_dissect_prime_dfilter(edt, dfcode);
}
+#if 0
+ /* Prepare coloring rules, this ensures that display filter rules containing
+ * frame.color_rule references are still processed.
+ * TODO: actually detect that situation or maybe apply other optimizations? */
+ if (edt->tree && color_filters_used()) {
+ color_filters_prime_edt(edt);
+ fdata->flags.need_colorize = 1;
+ }
+#endif
/* Dissect the frame. */
epan_dissect_run_with_taps(edt, cf->cd_t, phdr, frame_tvbuff_new(fdata, buf), fdata, cinfo);
diff --git a/ui/gtk/packet_list_store.c b/ui/gtk/packet_list_store.c
index 5be13931a8..bbfe866f2e 100644
--- a/ui/gtk/packet_list_store.c
+++ b/ui/gtk/packet_list_store.c
@@ -1152,8 +1152,10 @@ packet_list_dissect_and_cache_record(PacketList *packet_list, PacketListRecord *
create_proto_tree,
FALSE /* proto_tree_visible */);
- if (dissect_color)
+ if (dissect_color) {
color_filters_prime_edt(&edt);
+ fdata->flags.need_colorize = 1;
+ }
if (dissect_columns)
col_custom_prime_edt(&edt, cinfo);
diff --git a/ui/qt/packet_list_record.cpp b/ui/qt/packet_list_record.cpp
index b6659db550..bdd17905a6 100644
--- a/ui/qt/packet_list_record.cpp
+++ b/ui/qt/packet_list_record.cpp
@@ -140,8 +140,11 @@ void PacketListRecord::dissect(capture_file *cap_file, bool dissect_color)
create_proto_tree,
FALSE /* proto_tree_visible */);
- if (dissect_color)
+ /* Re-color when the coloring rules are changed via the UI. */
+ if (dissect_color) {
color_filters_prime_edt(&edt);
+ fdata_->flags.need_colorize = 1;
+ }
if (dissect_columns)
col_custom_prime_edt(&edt, cinfo);