aboutsummaryrefslogtreecommitdiffstats
path: root/ui/gtk
diff options
context:
space:
mode:
Diffstat (limited to 'ui/gtk')
-rw-r--r--ui/gtk/main_menubar.c12
-rw-r--r--ui/gtk/packet_list.c2
-rw-r--r--ui/gtk/packet_win.c54
-rw-r--r--ui/gtk/packet_win.h3
4 files changed, 62 insertions, 9 deletions
diff --git a/ui/gtk/main_menubar.c b/ui/gtk/main_menubar.c
index 51e76b9aef..5fb97a97b4 100644
--- a/ui/gtk/main_menubar.c
+++ b/ui/gtk/main_menubar.c
@@ -349,7 +349,13 @@ build_conversation_filter(int action, gboolean show_dialog)
static void
new_window_cb(GtkWidget *widget)
{
- new_packet_window(widget, FALSE);
+ new_packet_window(widget, FALSE, FALSE);
+}
+
+static void
+new_window_cb_ref(GtkWidget *widget)
+{
+ new_packet_window(widget, TRUE, FALSE);
}
static void
@@ -2996,6 +3002,7 @@ static const char *ui_desc_tree_view_menu_popup =
" <menuitem name='DisableProtocol' action='/DisableProtocol'/>\n"
" <menuitem name='ResolveName' action='/ResolveName'/>\n"
" <menuitem name='GotoCorrespondingPacket' action='/GotoCorrespondingPacket'/>\n"
+" <menuitem name='ShowPacketRefinNewWindow' action='/ShowPacketRefinNewWindow'/>\n"
" </popup>\n"
"</ui>\n";
@@ -3047,6 +3054,7 @@ static const GtkActionEntry tree_view_menu_popup_action_entries[] = {
{ "/DisableProtocol", WIRESHARK_STOCK_CHECKBOX, "Disable Protocol...", NULL, NULL, G_CALLBACK(proto_disable_cb) },
{ "/ResolveName", NULL, "_Resolve Name", NULL, NULL, G_CALLBACK(resolve_name_cb) },
{ "/GotoCorrespondingPacket", NULL, "_Go to Corresponding Packet", NULL, NULL, G_CALLBACK(goto_framenum_cb) },
+ { "/ShowPacketRefinNewWindow", NULL, "Show Packet Reference in New Window", NULL, NULL, G_CALLBACK(new_window_cb_ref) },
};
static const char *ui_desc_bytes_menu_popup =
@@ -5640,6 +5648,8 @@ set_menus_for_selected_tree_row(capture_file *cf)
properties = prefs_is_registered_protocol(abbrev);
set_menu_sensitivity(ui_manager_tree_view_menu,
"/TreeViewPopup/GotoCorrespondingPacket", hfinfo->type == FT_FRAMENUM);
+ set_menu_sensitivity(ui_manager_tree_view_menu,
+ "/TreeViewPopup/ShowPacketRefinNewWindow", hfinfo->type == FT_FRAMENUM);
set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/Copy",
TRUE);
set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/Copy/AsFilter",
diff --git a/ui/gtk/packet_list.c b/ui/gtk/packet_list.c
index 2d0fe48292..29e68b9ed5 100644
--- a/ui/gtk/packet_list.c
+++ b/ui/gtk/packet_list.c
@@ -1253,7 +1253,7 @@ static void
packet_list_double_click_cb(GtkTreeView *treeview, GtkTreePath *path _U_,
GtkTreeViewColumn *col _U_, gpointer userdata _U_)
{
- new_packet_window(GTK_WIDGET(treeview), FALSE);
+ new_packet_window(GTK_WIDGET(treeview), FALSE, FALSE);
}
gboolean
diff --git a/ui/gtk/packet_win.c b/ui/gtk/packet_win.c
index 9ed999311d..74b95a1567 100644
--- a/ui/gtk/packet_win.c
+++ b/ui/gtk/packet_win.c
@@ -866,24 +866,53 @@ static void modifed_frame_data_free(gpointer data) {
#endif /* WANT_PACKET_EDITOR */
-void new_packet_window(GtkWidget *w _U_, gboolean editable _U_)
+void new_packet_window(GtkWidget *w _U_, gboolean reference, gboolean editable _U_)
{
#define NewWinTitleLen 1000
char Title[NewWinTitleLen] = "";
const char *TextPtr;
GtkWidget *main_w, *main_vbox, *pane,
- *tree_view, *tv_scrollw,
- *bv_nb_ptr;
+ *tree_view, *tv_scrollw,
+ *bv_nb_ptr;
struct PacketWinData *DataPtr;
int i;
+ frame_data *fd;
+
+ if(reference) {
+ guint32 framenum;
+ header_field_info *hfinfo;
- if (!cfile.current_frame) {
+ if (! cfile.finfo_selected) {
+ return;
+ }
+
+ hfinfo = cfile.finfo_selected->hfinfo;
+
+ g_assert(hfinfo);
+
+ if (hfinfo->type != FT_FRAMENUM) {
+ return;
+ }
+
+ framenum = fvalue_get_uinteger(&cfile.finfo_selected->value);
+
+ if (framenum == 0) {
+ return;
+ }
+
+ fd = frame_data_sequence_find(cfile.frames, framenum);
+ }
+ else {
+ fd = cfile.current_frame;
+ }
+
+ if (!fd) {
/* nothing has been captured so far */
return;
}
/* With the new packetlists "lazy columns" it's neccesary to reread the frame */
- if (!cf_read_frame(&cfile, cfile.current_frame)) {
+ if (!cf_read_frame(&cfile, fd)) {
/* error reading the frame */
return;
}
@@ -891,7 +920,7 @@ void new_packet_window(GtkWidget *w _U_, gboolean editable _U_)
/* Allocate data structure to represent this window. */
DataPtr = (struct PacketWinData *) g_malloc(sizeof(struct PacketWinData));
- DataPtr->frame = cfile.current_frame;
+ DataPtr->frame = fd;
DataPtr->phdr = cfile.phdr;
DataPtr->pd = (guint8 *)g_malloc(DataPtr->frame->cap_len);
memcpy(DataPtr->pd, cfile.pd, DataPtr->frame->cap_len);
@@ -1110,3 +1139,16 @@ redraw_packet_bytes_packet_wins(void)
{
g_list_foreach(detail_windows, redraw_packet_bytes_cb, NULL);
}
+
+/*
+ * Editor modelines - http://www.wireshark.org/tools/modelines.html
+ *
+ * Local variables:
+ * c-basic-offset: 8
+ * tab-width: 8
+ * indent-tabs-mode: t
+ * End:
+ *
+ * vi: set shiftwidth=8 tabstop=8 noexpandtab:
+ * :indentSize=8:tabSize=8:noTabs=false:
+ */
diff --git a/ui/gtk/packet_win.h b/ui/gtk/packet_win.h
index 9464d83c6e..94b694869c 100644
--- a/ui/gtk/packet_win.h
+++ b/ui/gtk/packet_win.h
@@ -34,8 +34,9 @@
/** Create a new packet window.
*
* @param widget parent widget (unused)
+ * @param reference open current packet or reference packet
*/
-extern void new_packet_window(GtkWidget *widget, gboolean editable);
+extern void new_packet_window(GtkWidget *widget, gboolean reference, gboolean editable);
/** Destroy all popup packet windows.
*/