Add item to context menu of frame references to open the referenced frame in a
new window. Very useful when the referenced frame is hidden by a filter.

From me:
- modelines
- simplify some of the logic

svn path=/trunk/; revision=48451
This commit is contained in:
Evan Huus 2013-03-21 15:27:38 +00:00
parent 1f083fd654
commit 4836f13ac0
4 changed files with 62 additions and 9 deletions

View File

@ -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",

View File

@ -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

View File

@ -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:
*/

View File

@ -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.
*/