diff options
author | Gerald Combs <gerald@wireshark.org> | 2015-11-12 08:35:34 -0800 |
---|---|---|
committer | Anders Broman <a.broman58@gmail.com> | 2015-11-13 09:43:24 +0000 |
commit | 661c9771f6ffeeda4b2ba278a9f15d1d14dbe525 (patch) | |
tree | f3e22b8769e86885332ccf3ad6d5078f5a2036d7 | |
parent | acbf7d57253f4dc4206e3d67c0c56f6e28da6796 (diff) |
Qt: Add go to next + previous packet in conversation.
Add "Go→Next Packet in Conversation" and "Go→Previous Packet in
Conversation" menu items. Make sure the shortucts ("Ctrl+." and
"Ctrl+,") don't get switched to "Cmd+." and "Cmd+," on OS X. "Cmd+," is
already taken by the preferences dialog.
Change-Id: Iab9c7f60fdcf55f12c055b4d0948019bf667ebc9
Reviewed-on: https://code.wireshark.org/review/11771
Reviewed-by: Gerald Combs <gerald@wireshark.org>
Petri-Dish: Gerald Combs <gerald@wireshark.org>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Anders Broman <a.broman58@gmail.com>
-rw-r--r-- | ui/qt/main_window.cpp | 6 | ||||
-rw-r--r-- | ui/qt/main_window.h | 3 | ||||
-rw-r--r-- | ui/qt/main_window.ui | 24 | ||||
-rw-r--r-- | ui/qt/main_window_slots.cpp | 60 |
4 files changed, 92 insertions, 1 deletions
diff --git a/ui/qt/main_window.cpp b/ui/qt/main_window.cpp index e39a7acbcb..f0bacdd7e3 100644 --- a/ui/qt/main_window.cpp +++ b/ui/qt/main_window.cpp @@ -1684,6 +1684,12 @@ void MainWindow::initMainToolbarIcons() main_ui_->actionGoGoToPacket->setIcon(StockIcon("go-jump")); main_ui_->actionGoFirstPacket->setIcon(StockIcon("go-first")); main_ui_->actionGoLastPacket->setIcon(StockIcon("go-last")); + main_ui_->actionGoPreviousConversationPacket->setIcon(StockIcon("go-previous")); + main_ui_->actionGoNextConversationPacket->setIcon(StockIcon("go-next")); +#if defined(Q_OS_MAC) + main_ui_->actionGoPreviousConversationPacket->setShortcut(QKeySequence(Qt::META | Qt::Key_Comma)); + main_ui_->actionGoNextConversationPacket->setShortcut(QKeySequence(Qt::META | Qt::Key_Period)); +#endif main_ui_->actionGoAutoScroll->setIcon(StockIcon("x-stay-last")); main_ui_->actionViewColorizePacketList->setIcon(StockIcon("x-colorize-packets")); diff --git a/ui/qt/main_window.h b/ui/qt/main_window.h index 9c0a161247..d463edcf9d 100644 --- a/ui/qt/main_window.h +++ b/ui/qt/main_window.h @@ -203,6 +203,7 @@ private: void addMenuActions(QList<QAction *> &actions, int menu_group); void removeMenuActions(QList<QAction *> &actions, int menu_group); + void goToConversationFrame(bool go_next); signals: void setCaptureFile(capture_file *cf); @@ -415,6 +416,8 @@ private slots: void on_actionGoGoToPacket_triggered(); void on_actionGoGoToLinkedPacket_triggered(); + void on_actionGoNextConversationPacket_triggered(); + void on_actionGoPreviousConversationPacket_triggered(); void on_actionGoAutoScroll_toggled(bool checked); void resetPreviousFocus(); diff --git a/ui/qt/main_window.ui b/ui/qt/main_window.ui index 3ee4ffadbd..8946cb86be 100644 --- a/ui/qt/main_window.ui +++ b/ui/qt/main_window.ui @@ -238,6 +238,8 @@ <addaction name="actionGoPreviousPacket"/> <addaction name="actionGoFirstPacket"/> <addaction name="actionGoLastPacket"/> + <addaction name="actionGoNextConversationPacket"/> + <addaction name="actionGoPreviousConversationPacket"/> <addaction name="separator"/> <addaction name="actionGoAutoScroll"/> </widget> @@ -938,6 +940,28 @@ <string>Ctrl+Up</string> </property> </action> + <action name="actionGoNextConversationPacket"> + <property name="text"> + <string>Next Packet in Conversation</string> + </property> + <property name="toolTip"> + <string>Go to the next packet in this conversation</string> + </property> + <property name="shortcut"> + <string>Ctrl+.</string> + </property> + </action> + <action name="actionGoPreviousConversationPacket"> + <property name="text"> + <string>Previous Packet in Conversation</string> + </property> + <property name="toolTip"> + <string>Go to the previous packet in this conversation</string> + </property> + <property name="shortcut"> + <string>Ctrl+,</string> + </property> + </action> <action name="actionGoFirstPacket"> <property name="text"> <string>First Packet</string> diff --git a/ui/qt/main_window_slots.cpp b/ui/qt/main_window_slots.cpp index 419b46829a..9c5d386759 100644 --- a/ui/qt/main_window_slots.cpp +++ b/ui/qt/main_window_slots.cpp @@ -42,7 +42,7 @@ #include "wsutil/file_util.h" #include "wsutil/filesystem.h" -#include <wsutil/str_util.h> +#include "wsutil/str_util.h" #include "epan/addr_resolv.h" #include "epan/dissector_filters.h" @@ -3277,6 +3277,64 @@ void MainWindow::on_actionGoGoToLinkedPacket_triggered() packet_list_->goToPacket(packet_num); } +// gtk/main_menubar.c:goto_conversation_frame +void MainWindow::goToConversationFrame(bool go_next) { + gchar *filter = NULL; + dfilter_t *dfcode = NULL; + gboolean found_packet = FALSE; + packet_info *pi = &(capture_file_.capFile()->edt->pi); + conversation_filter_t* conv_filter; + + /* Try to build a conversation + * filter in the order TCP, UDP, IP, Ethernet and apply the + * coloring */ + conv_filter = find_conversation_filter("tcp"); + if ((conv_filter != NULL) && (conv_filter->is_filter_valid(pi))) + filter = conv_filter->build_filter_string(pi); + conv_filter = find_conversation_filter("udp"); + if ((conv_filter != NULL) && (conv_filter->is_filter_valid(pi))) + filter = conv_filter->build_filter_string(pi); + conv_filter = find_conversation_filter("ip"); + if ((conv_filter != NULL) && (conv_filter->is_filter_valid(pi))) + filter = conv_filter->build_filter_string(pi); + conv_filter = find_conversation_filter("ipv6"); + if ((conv_filter != NULL) && (conv_filter->is_filter_valid(pi))) + filter = conv_filter->build_filter_string(pi); + + if( filter == NULL ) { + main_ui_->statusBar->pushTemporaryStatus(tr("Unable to build conversation filter.")); + g_free(filter); + return; + } + + if (!dfilter_compile(filter, &dfcode, NULL)) { + /* The attempt failed; report an error. */ + main_ui_->statusBar->pushTemporaryStatus(tr("Error compiling filter for this conversation.")); + g_free(filter); + return; + } + + found_packet = cf_find_packet_dfilter(capture_file_.capFile(), dfcode, go_next ? SD_FORWARD : SD_BACKWARD); + + if (!found_packet) { + /* We didn't find a packet */ + main_ui_->statusBar->pushTemporaryStatus(tr("No previous/next packet in conversation.")); + } + + dfilter_free(dfcode); + g_free(filter); +} + +void MainWindow::on_actionGoNextConversationPacket_triggered() +{ + goToConversationFrame(true); +} + +void MainWindow::on_actionGoPreviousConversationPacket_triggered() +{ + goToConversationFrame(false); +} + void MainWindow::on_actionGoAutoScroll_toggled(bool checked) { packet_list_->setAutoScroll(checked); |