forked from osmocom/wireshark
From Michail Koreshkov via https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=8371
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:
parent
1f083fd654
commit
4836f13ac0
|
@ -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",
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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:
|
||||
*/
|
||||
|
|
|
@ -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.
|
||||
*/
|
||||
|
|
Loading…
Reference in New Issue