forked from osmocom/wireshark
From Michal Labedzki:
Add Preferences submenu to packet list menu Preferences point to protocol which is on top expect "malformed", "text" and "expert" fields. https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=7754 svn path=/trunk/; revision=45914
This commit is contained in:
parent
120dab634e
commit
217c746d83
|
@ -155,6 +155,8 @@ static void set_menu_visible(GtkUIManager *ui_manager, const gchar *path, gint v
|
|||
static void menu_name_resolution_update_cb(GtkAction *action, gpointer data);
|
||||
static void name_resolution_cb(GtkWidget *w, gpointer d, gboolean* res_flag);
|
||||
static void colorize_cb(GtkWidget *w, gpointer d);
|
||||
static void rebuild_protocol_prefs_menu (module_t *prefs_module_p, gboolean preferences,
|
||||
GtkUIManager *ui_menu, char *path);
|
||||
|
||||
|
||||
/* As a general GUI guideline, we try to follow the Gnome Human Interface Guidelines, which can be found at:
|
||||
|
@ -2753,6 +2755,7 @@ static const char *ui_desc_packet_list_menu_popup =
|
|||
" </menu>\n"
|
||||
" </menu>\n"
|
||||
" <separator/>\n"
|
||||
" <menuitem name='ProtocolPreferences' action='/ProtocolPreferences'/>\n"
|
||||
" <menuitem name='DecodeAs' action='/DecodeAs'/>\n"
|
||||
" <menuitem name='Print' action='/Print'/>\n"
|
||||
" <menuitem name='ShowPacketinNewWindow' action='/ShowPacketinNewWindow'/>\n"
|
||||
|
@ -2889,6 +2892,7 @@ static const GtkActionEntry packet_list_menu_popup_action_entries[] = {
|
|||
{ "/Copy/Bytes/HexStream", NULL, "Hex Stream", NULL, NULL, G_CALLBACK(packet_list_menu_copy_bytes_hex_strm_cb) },
|
||||
{ "/Copy/Bytes/BinaryStream", NULL, "Binary Stream", NULL, NULL, G_CALLBACK(packet_list_menu_copy_bytes_bin_strm_cb) },
|
||||
|
||||
{ "/ProtocolPreferences", NULL, "Protocol Preferences", NULL, NULL, NULL },
|
||||
{ "/DecodeAs", WIRESHARK_STOCK_DECODE_AS, "Decode As...", NULL, NULL, G_CALLBACK(decode_as_cb) },
|
||||
{ "/Print", GTK_STOCK_PRINT, "Print...", NULL, NULL, G_CALLBACK(file_print_selected_cmd_cb) },
|
||||
{ "/ShowPacketinNewWindow", NULL, "Show Packet in New Window", NULL, NULL, G_CALLBACK(new_window_cb) },
|
||||
|
@ -4878,8 +4882,12 @@ packet_is_ssl(epan_dissect_t* edt)
|
|||
void
|
||||
set_menus_for_selected_packet(capture_file *cf)
|
||||
{
|
||||
GList *list_entry = dissector_filter_list;
|
||||
guint i = 0;
|
||||
GList *list_entry = dissector_filter_list;
|
||||
guint i = 0;
|
||||
gboolean properties = FALSE;
|
||||
const char *abbrev = NULL;
|
||||
char *prev_abbrev;
|
||||
|
||||
/* Making the menu context-sensitive allows for easier selection of the
|
||||
desired item and has the added benefit, with large captures, of
|
||||
avoiding needless looping through huge lists for marked, ignored,
|
||||
|
@ -4902,6 +4910,36 @@ set_menus_for_selected_packet(capture_file *cf)
|
|||
than one time reference frame or the current frame isn't a
|
||||
time reference frame). (XXX - why check frame_selected?) */
|
||||
|
||||
if (cfile.edt && cfile.edt->tree) {
|
||||
GPtrArray *ga;
|
||||
header_field_info *hfinfo;
|
||||
field_info *v;
|
||||
guint i;
|
||||
gint id;
|
||||
|
||||
ga = proto_all_finfos(cfile.edt->tree);
|
||||
|
||||
for (i = ga->len - 1; i > 0 ; i -= 1) {
|
||||
|
||||
v = g_ptr_array_index (ga, i);
|
||||
hfinfo = v->hfinfo;
|
||||
|
||||
if (!g_str_has_prefix(hfinfo->abbrev, "text") &&
|
||||
!g_str_has_prefix(hfinfo->abbrev, "expert") &&
|
||||
!g_str_has_prefix(hfinfo->abbrev, "malformed")) {
|
||||
if (hfinfo->parent == -1) {
|
||||
abbrev = hfinfo->abbrev;
|
||||
id = (hfinfo->type == FT_PROTOCOL) ? proto_get_id((protocol_t *)hfinfo->strings) : -1;
|
||||
} else {
|
||||
abbrev = proto_registrar_get_abbrev(hfinfo->parent);
|
||||
id = hfinfo->parent;
|
||||
}
|
||||
properties = prefs_is_registered_protocol(abbrev);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/EditMenu/MarkPacket",
|
||||
frame_selected);
|
||||
set_menu_sensitivity(ui_manager_packet_list_menu, "/PacketListMenuPopup/MarkPacket",
|
||||
|
@ -5005,6 +5043,21 @@ set_menus_for_selected_packet(capture_file *cf)
|
|||
frame_selected ? (cf->edt->pi.profinet_type != 0 && cf->edt->pi.profinet_type < 10) : FALSE);
|
||||
set_menu_sensitivity(ui_manager_packet_list_menu, "/PacketListMenuPopup/DecodeAs",
|
||||
frame_selected && decode_as_ok());
|
||||
|
||||
if (properties) {
|
||||
prev_abbrev = g_object_get_data(G_OBJECT(ui_manager_packet_list_menu), "menu_abbrev");
|
||||
if (!prev_abbrev || (strcmp(prev_abbrev, abbrev) != 0)) {
|
||||
/*No previous protocol or protocol changed - update Protocol Preferences menu*/
|
||||
module_t *prefs_module_p = prefs_find_module(abbrev);
|
||||
rebuild_protocol_prefs_menu(prefs_module_p, properties, ui_manager_packet_list_menu, "/PacketListMenuPopup/ProtocolPreferences");
|
||||
|
||||
g_object_set_data(G_OBJECT(ui_manager_packet_list_menu), "menu_abbrev", g_strdup(abbrev));
|
||||
g_free (prev_abbrev);
|
||||
}
|
||||
}
|
||||
|
||||
set_menu_sensitivity(ui_manager_packet_list_menu, "/PacketListMenuPopup/ProtocolPreferences",
|
||||
properties);
|
||||
set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/DecodeAs",
|
||||
frame_selected && decode_as_ok());
|
||||
set_menu_sensitivity(ui_manager_packet_list_menu, "/PacketListMenuPopup/Copy",
|
||||
|
@ -5248,7 +5301,7 @@ menu_prefs_edit_dlg (GtkWidget *w, gpointer data)
|
|||
}
|
||||
|
||||
static guint
|
||||
add_protocol_prefs_menu (pref_t *pref, gpointer data)
|
||||
add_protocol_prefs_generic_menu(pref_t *pref, gpointer data, GtkUIManager *ui_menu, char *path)
|
||||
{
|
||||
GtkWidget *menu_preferences;
|
||||
GtkWidget *menu_item, *menu_sub_item, *sub_menu;
|
||||
|
@ -5335,9 +5388,9 @@ add_protocol_prefs_menu (pref_t *pref, gpointer data)
|
|||
return 0;
|
||||
}
|
||||
|
||||
menu_preferences = gtk_ui_manager_get_widget(ui_manager_tree_view_menu, "/TreeViewPopup/ProtocolPreferences");
|
||||
menu_preferences = gtk_ui_manager_get_widget(ui_menu, path);
|
||||
if(!menu_preferences)
|
||||
g_warning("menu_preferences Not found path:TreeViewPopup/ProtocolPreferences");
|
||||
g_warning("menu_preferences Not found path");
|
||||
sub_menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM(menu_preferences));
|
||||
gtk_menu_shell_append (GTK_MENU_SHELL(sub_menu), menu_item);
|
||||
gtk_widget_show (menu_item);
|
||||
|
@ -5345,33 +5398,49 @@ add_protocol_prefs_menu (pref_t *pref, gpointer data)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static guint
|
||||
add_protocol_prefs_menu(pref_t *pref, gpointer data) {
|
||||
return add_protocol_prefs_generic_menu(pref, data, ui_manager_tree_view_menu, "/TreeViewPopup/ProtocolPreferences");
|
||||
}
|
||||
|
||||
static guint
|
||||
add_protocol_prefs_packet_list_menu(pref_t *pref, gpointer data) {
|
||||
return add_protocol_prefs_generic_menu(pref, data, ui_manager_packet_list_menu, "/PacketListMenuPopup/ProtocolPreferences");
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
rebuild_protocol_prefs_menu (module_t *prefs_module_p, gboolean preferences)
|
||||
rebuild_protocol_prefs_menu(module_t *prefs_module_p, gboolean preferences,
|
||||
GtkUIManager *ui_menu, char *path)
|
||||
{
|
||||
GtkWidget *menu_preferences, *menu_item;
|
||||
GtkWidget *sub_menu;
|
||||
gchar *label;
|
||||
|
||||
menu_preferences = gtk_ui_manager_get_widget(ui_manager_tree_view_menu, "/TreeViewPopup/ProtocolPreferences");
|
||||
menu_preferences = gtk_ui_manager_get_widget(ui_menu, path);
|
||||
if (prefs_module_p && preferences) {
|
||||
sub_menu = gtk_menu_new();
|
||||
gtk_menu_item_set_submenu (GTK_MENU_ITEM(menu_preferences), sub_menu);
|
||||
|
||||
label = g_strdup_printf ("%s Preferences...", prefs_module_p->description);
|
||||
menu_item = gtk_image_menu_item_new_with_label (label);
|
||||
menu_item = gtk_image_menu_item_new_with_label(label);
|
||||
gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM(menu_item),
|
||||
gtk_image_new_from_stock(GTK_STOCK_PREFERENCES, GTK_ICON_SIZE_MENU));
|
||||
gtk_menu_shell_append (GTK_MENU_SHELL(sub_menu), menu_item);
|
||||
gtk_menu_shell_append(GTK_MENU_SHELL(sub_menu), menu_item);
|
||||
g_signal_connect_swapped(G_OBJECT(menu_item), "activate",
|
||||
G_CALLBACK(properties_cb), (GObject *) menu_item);
|
||||
gtk_widget_show (menu_item);
|
||||
g_free (label);
|
||||
gtk_widget_show(menu_item);
|
||||
g_free(label);
|
||||
|
||||
menu_item = gtk_menu_item_new();
|
||||
gtk_menu_shell_append (GTK_MENU_SHELL(sub_menu), menu_item);
|
||||
gtk_widget_show (menu_item);
|
||||
gtk_menu_shell_append(GTK_MENU_SHELL(sub_menu), menu_item);
|
||||
gtk_widget_show(menu_item);
|
||||
|
||||
prefs_pref_foreach(prefs_module_p, add_protocol_prefs_menu, prefs_module_p);
|
||||
if (ui_menu == ui_manager_tree_view_menu) {
|
||||
prefs_pref_foreach(prefs_module_p, add_protocol_prefs_menu, prefs_module_p);
|
||||
} else {
|
||||
prefs_pref_foreach(prefs_module_p, add_protocol_prefs_packet_list_menu, prefs_module_p);
|
||||
}
|
||||
} else {
|
||||
/* No preferences, remove sub menu */
|
||||
gtk_menu_item_set_submenu (GTK_MENU_ITEM(menu_preferences), NULL);
|
||||
|
@ -5569,7 +5638,7 @@ set_menus_for_selected_tree_row(capture_file *cf)
|
|||
if (!prev_abbrev || (strcmp (prev_abbrev, abbrev) != 0)) {
|
||||
/* No previous protocol or protocol changed - update Protocol Preferences menu */
|
||||
module_t *prefs_module_p = prefs_find_module(abbrev);
|
||||
rebuild_protocol_prefs_menu (prefs_module_p, properties);
|
||||
rebuild_protocol_prefs_menu(prefs_module_p, properties, ui_manager_tree_view_menu, "/TreeViewPopup/ProtocolPreferences");
|
||||
|
||||
g_object_set_data(G_OBJECT(ui_manager_tree_view_menu), "menu_abbrev", g_strdup(abbrev));
|
||||
g_free (prev_abbrev);
|
||||
|
|
|
@ -33,6 +33,7 @@
|
|||
#include <epan/prefs.h>
|
||||
#include <epan/strutil.h>
|
||||
#include <epan/prefs-int.h>
|
||||
#include <epan/epan_dissect.h>
|
||||
|
||||
#include "../file.h"
|
||||
#include "../print.h"
|
||||
|
@ -1810,16 +1811,47 @@ properties_cb(GtkWidget *w, gpointer dummy)
|
|||
module_t *page_module;
|
||||
|
||||
if (cfile.finfo_selected == NULL) {
|
||||
/* There is no field selected */
|
||||
return;
|
||||
const gchar *abbrev;
|
||||
|
||||
/* There is no field selected, try use on top protocol */
|
||||
if (cfile.edt && cfile.edt->tree) {
|
||||
GPtrArray *ga;
|
||||
header_field_info *hfinfo;
|
||||
field_info *v;
|
||||
guint i;
|
||||
|
||||
ga = proto_all_finfos(cfile.edt->tree);
|
||||
|
||||
for (i = ga->len - 1; i > 0 ; i -= 1) {
|
||||
|
||||
v = g_ptr_array_index (ga, i);
|
||||
hfinfo = v->hfinfo;
|
||||
|
||||
if (!g_str_has_prefix(hfinfo->abbrev, "text") &&
|
||||
!g_str_has_prefix(hfinfo->abbrev, "expert") &&
|
||||
!g_str_has_prefix(hfinfo->abbrev, "malformed")) {
|
||||
if (hfinfo->parent == -1) {
|
||||
abbrev = hfinfo->abbrev;
|
||||
} else {
|
||||
abbrev = proto_registrar_get_abbrev(hfinfo->parent);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
title = prefs_get_title_by_name(abbrev);
|
||||
} else {
|
||||
title = NULL;
|
||||
}
|
||||
} else {
|
||||
/* Find the title for the protocol for the selected field. */
|
||||
hfinfo = cfile.finfo_selected->hfinfo;
|
||||
if (hfinfo->parent == -1)
|
||||
title = prefs_get_title_by_name(hfinfo->abbrev);
|
||||
else
|
||||
title = prefs_get_title_by_name(proto_registrar_get_abbrev(hfinfo->parent));
|
||||
}
|
||||
|
||||
/* Find the title for the protocol for the selected field. */
|
||||
hfinfo = cfile.finfo_selected->hfinfo;
|
||||
if (hfinfo->parent == -1)
|
||||
title = prefs_get_title_by_name(hfinfo->abbrev);
|
||||
else
|
||||
title = prefs_get_title_by_name(proto_registrar_get_abbrev(hfinfo->parent));
|
||||
if (!title)
|
||||
return; /* Couldn't find it. XXX - just crash? "Can't happen"? */
|
||||
|
||||
|
|
Loading…
Reference in New Issue