aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoland Knall <rknall@gmail.com>2015-08-09 14:36:53 +0200
committerAlexis La Goutte <alexis.lagoutte@gmail.com>2015-09-08 11:03:35 +0000
commit6f1c9fd4320804958a8731afc45a1cc6f9ee3b16 (patch)
tree88733bb1ae91072d9c6dac9404074e5afa59cd55
parent28128ca41c299ea859fd59583a12cd767b1af33f (diff)
PluginIF: Parent menu and goto frame
The developer may provide a given menu as parent menu for the sub menu. If the menu does not exist, the main menu will be used. Has been implemented for Qt as well as GTK. Change-Id: I3f26684862fd0b08f59eeb4d6f4a24ce7dc3d428 Reviewed-on: https://code.wireshark.org/review/9939 Reviewed-by: Roland Knall <rknall@gmail.com> Reviewed-by: Alexis La Goutte <alexis.lagoutte@gmail.com> Petri-Dish: Alexis La Goutte <alexis.lagoutte@gmail.com> Reviewed-by: Anders Broman <a.broman58@gmail.com> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
-rw-r--r--epan/plugin_if.c24
-rw-r--r--epan/plugin_if.h23
-rw-r--r--ui/gtk/main_toolbar.c17
-rw-r--r--ui/qt/main_window.cpp45
-rw-r--r--ui/qt/main_window.h3
-rw-r--r--ui/qt/main_window_slots.cpp13
6 files changed, 118 insertions, 7 deletions
diff --git a/epan/plugin_if.c b/epan/plugin_if.c
index b5e5bf5ee9..11f9d85a5e 100644
--- a/epan/plugin_if.c
+++ b/epan/plugin_if.c
@@ -66,6 +66,8 @@ extern ext_menu_t * ext_menubar_register_menu(int proto_id, const gchar * menula
entry->proto = proto_id;
entry->is_plugin = is_plugin;
+ entry->parent_menu = 0;
+
/* Create a name for this submenu */
entry->name = name;
entry->label = g_strdup(menulabel);
@@ -80,6 +82,17 @@ extern ext_menu_t * ext_menubar_register_menu(int proto_id, const gchar * menula
return entry;
}
+extern ext_menu_t * ext_menubar_set_parentmenu(ext_menu_t * menu, const gchar * parentmenu)
+{
+ g_assert(menu != NULL && menu->parent == NULL);
+
+ g_assert(parentmenu != 0);
+
+ menu->parent_menu = g_strdup(parentmenu);
+
+ return menu;
+}
+
extern ext_menu_t * ext_menubar_add_submenu(ext_menu_t * parent, const gchar *menulabel)
{
ext_menubar_t * entry = NULL;
@@ -212,6 +225,17 @@ extern void plugin_if_apply_filter(const char * filter_string, gboolean force)
plugin_if_call_gui_cb(actionType, dataSet);
}
+extern void plugin_if_goto_frame(guint32 framenr)
+{
+ GHashTable * dataSet = NULL;
+
+ dataSet = g_hash_table_new(g_str_hash, g_str_equal);
+
+ g_hash_table_insert( dataSet, g_strdup("frame_nr"), GUINT_TO_POINTER(framenr) );
+
+ plugin_if_call_gui_cb(PLUGIN_IF_GOTO_FRAME, dataSet);
+}
+
extern void plugin_if_save_preference(const char * pref_module, const char * pref_key, const char * pref_value)
{
GHashTable * dataSet = NULL;
diff --git a/epan/plugin_if.h b/epan/plugin_if.h
index df9ea6e846..3d14a268f9 100644
--- a/epan/plugin_if.h
+++ b/epan/plugin_if.h
@@ -81,7 +81,7 @@ struct _ext_menubar_t
ext_menubar_action_cb callback;
-
+ gchar * parent_menu;
};
/* Registers a new main menu.
@@ -97,6 +97,18 @@ struct _ext_menubar_t
WS_DLL_PUBLIC ext_menu_t * ext_menubar_register_menu(
int proto_id, const gchar * menulabel, gboolean is_plugin);
+/* Sets a parent menu for the user menu.
+ *
+ * This will set a parent menu, which allows this menu to be filtered underneath
+ * the given menu as a submenu. If the parent menu does not exist, the main menu
+ * will be used
+ *
+ * @param menu the menu for which to add the entry
+ * @param parentmenu a valid menu name for the parent menu
+ */
+WS_DLL_PUBLIC ext_menu_t * ext_menubar_set_parentmenu(
+ ext_menu_t * menu, const gchar * parentmenu);
+
/* Registers a new main menu.
*
* This will register a new sub menu entry, underneath the parent menu
@@ -162,7 +174,10 @@ typedef enum
PLUGIN_IF_FILTER_ACTION_PREPARE,
/* Saves a preference entry */
- PLUGIN_IF_PREFERENCE_SAVE
+ PLUGIN_IF_PREFERENCE_SAVE,
+
+ /* Jumps to the provided frame number */
+ PLUGIN_IF_GOTO_FRAME
} plugin_if_callback_t;
@@ -176,6 +191,10 @@ WS_DLL_PUBLIC void plugin_if_apply_filter(const char * filter_string, gboolean f
/* Saves the given preference to the main preference storage */
WS_DLL_PUBLIC void plugin_if_save_preference(const char * pref_module, const char * pref_key, const char * pref_value);
+/* Jumps to the given frame number */
+WS_DLL_PUBLIC void plugin_if_goto_frame(guint32 framenr);
+
+
/* Private Method for retrieving the menubar entries
*
* Is only to be used by the UI interfaces to retrieve the menu entries
diff --git a/ui/gtk/main_toolbar.c b/ui/gtk/main_toolbar.c
index c94606b928..2002314ec5 100644
--- a/ui/gtk/main_toolbar.c
+++ b/ui/gtk/main_toolbar.c
@@ -55,6 +55,8 @@
#include "ui/gtk/packet_list.h"
#include "ui/capture_globals.h"
+#include <epan/plugin_if.h>
+
#include "ui/gtk/old-gtk-compat.h"
static gboolean toolbar_init = FALSE;
@@ -263,6 +265,19 @@ toolbar_auto_scroll_live_changed(gboolean auto_scroll_live_lcl) {
}
#endif
+void plugin_if_maintoolbar_goto_frame(gconstpointer user_data)
+{
+ if ( user_data != NULL )
+ {
+ GHashTable * dataSet = (GHashTable *) user_data;
+ gpointer framenr;
+ if ( g_hash_table_lookup_extended(dataSet, "frame_nr", NULL, &framenr ) )
+ {
+ if ( GPOINTER_TO_UINT(framenr) != 0 )
+ cf_goto_frame(&cfile, GPOINTER_TO_UINT(framenr));
+ }
+ }
+}
/*
* Create all toolbars (currently only the main toolbar)
@@ -398,6 +413,8 @@ toolbar_new(void)
/* make current preferences effective */
toolbar_redraw_all();
+ plugin_if_register_gui_cb(PLUGIN_IF_GOTO_FRAME, plugin_if_maintoolbar_goto_frame);
+
return main_tb;
}
diff --git a/ui/qt/main_window.cpp b/ui/qt/main_window.cpp
index a1b25ee61a..f3bdc81509 100644
--- a/ui/qt/main_window.cpp
+++ b/ui/qt/main_window.cpp
@@ -121,6 +121,21 @@ static void plugin_if_mainwindow_preference(gconstpointer user_data)
}
}
+void plugin_if_mainwindow_gotoframe(gconstpointer user_data)
+{
+ if ( gbl_cur_main_window_ != NULL && user_data != NULL )
+ {
+ GHashTable * dataSet = (GHashTable *) user_data;
+ gpointer framenr;
+
+ if ( g_hash_table_lookup_extended(dataSet, "frame_nr", NULL, &framenr ) )
+ {
+ if ( GPOINTER_TO_UINT(framenr) != 0 )
+ gbl_cur_main_window_->gotoFrame(GPOINTER_TO_UINT(framenr));
+ }
+ }
+}
+
gpointer
simple_dialog(ESD_TYPE_E type, gint btn_mask, const gchar *msg_format, ...)
{
@@ -568,6 +583,7 @@ MainWindow::MainWindow(QWidget *parent) :
plugin_if_register_gui_cb(PLUGIN_IF_FILTER_ACTION_APPLY, plugin_if_mainwindow_apply_filter );
plugin_if_register_gui_cb(PLUGIN_IF_FILTER_ACTION_PREPARE, plugin_if_mainwindow_apply_filter );
plugin_if_register_gui_cb(PLUGIN_IF_PREFERENCE_SAVE, plugin_if_mainwindow_preference);
+ plugin_if_register_gui_cb(PLUGIN_IF_GOTO_FRAME, plugin_if_mainwindow_gotoframe);
main_ui_->mainStack->setCurrentWidget(main_welcome_);
}
@@ -2203,6 +2219,25 @@ void MainWindow::externalMenuHelper(ext_menu_t * menu, QMenu * subMenu, gint de
}
}
+QMenu * MainWindow::searchSubMenu(QString objectName)
+{
+ QList<QMenu*> lst;
+
+ if ( objectName.length() > 0 )
+ {
+ QString searchName = QString("menu") + objectName;
+
+ lst = main_ui_->menuBar->findChildren<QMenu*>();
+ foreach (QMenu* m, lst)
+ {
+ if ( QString::compare( m->objectName(), searchName ) == 0 )
+ return m;
+ }
+ }
+
+ return 0;
+}
+
void MainWindow::addExternalMenus()
{
QMenu * subMenu = NULL;
@@ -2224,7 +2259,15 @@ void MainWindow::addExternalMenus()
}
/* Create main submenu and add it to the menubar */
- subMenu = main_ui_->menuBar->addMenu(menu->label);
+ if ( menu->parent_menu != NULL )
+ {
+ QMenu * sortUnderneath = searchSubMenu(QString(menu->parent_menu));
+ if ( sortUnderneath != NULL)
+ subMenu = sortUnderneath->addMenu(menu->label);
+ }
+
+ if ( subMenu == NULL )
+ subMenu = main_ui_->menuBar->addMenu(menu->label);
/* This will generate the action structure for each menu. It is recursive,
* therefore a sub-routine, and we have a depth counter to prevent endless loops. */
diff --git a/ui/qt/main_window.h b/ui/qt/main_window.h
index 5bc0084449..f1cf8b541c 100644
--- a/ui/qt/main_window.h
+++ b/ui/qt/main_window.h
@@ -90,6 +90,8 @@ public:
virtual QMenu *createPopupMenu();
+ void gotoFrame(int packet_num);
+
protected:
bool eventFilter(QObject *obj, QEvent *event);
void keyPressEvent(QKeyEvent *event);
@@ -273,6 +275,7 @@ private slots:
void addDynamicMenus();
void reloadDynamicMenus();
void addExternalMenus();
+ QMenu * searchSubMenu(QString objectName);
void startInterfaceCapture(bool valid);
diff --git a/ui/qt/main_window_slots.cpp b/ui/qt/main_window_slots.cpp
index f6a5a5e573..fd86f4a9c6 100644
--- a/ui/qt/main_window_slots.cpp
+++ b/ui/qt/main_window_slots.cpp
@@ -3185,11 +3185,8 @@ void MainWindow::on_goToCancel_clicked()
void MainWindow::on_goToGo_clicked()
{
- int packet_num = main_ui_->goToLineEdit->text().toInt();
+ gotoFrame(main_ui_->goToLineEdit->text().toInt());
- if (packet_num > 0) {
- packet_list_->goToPacket(packet_num);
- }
on_goToCancel_clicked();
}
@@ -3343,6 +3340,14 @@ void MainWindow::externalMenuItem_triggered()
}
}
+void MainWindow::gotoFrame(int packet_num)
+{
+ if ( packet_num > 0 )
+ {
+ packet_list_->goToPacket(packet_num);
+ }
+}
+
#ifdef HAVE_EXTCAP
void MainWindow::extcap_options_finished(int result)
{