From 351c8b23cb309762d673fe5bdf00220e7e5d3a01 Mon Sep 17 00:00:00 2001 From: Alexander Shaduri Date: Tue, 25 Jan 2022 15:53:56 +0400 Subject: [PATCH] (Possibly) fix a memory leak related to Gtk::Menu. --- src/gsc_main_window.cpp | 13 +++++++++---- src/gsc_main_window.h | 2 +- src/gsc_main_window_iconview.h | 9 ++++++--- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/gsc_main_window.cpp b/src/gsc_main_window.cpp index f3cfabf..2e3b6fb 100644 --- a/src/gsc_main_window.cpp +++ b/src/gsc_main_window.cpp @@ -897,14 +897,19 @@ void GscMainWindow::on_action_reread_device_data() -Gtk::Menu* GscMainWindow::get_popup_menu(const StorageDevicePtr& drive) +std::unique_ptr GscMainWindow::get_popup_menu(const StorageDevicePtr& drive) { - if (!ui_manager_) + if (!ui_builder_) return nullptr; + + Gtk::Menu* menu = nullptr; if (drive) { - return dynamic_cast(ui_manager_->get_widget("/device_popup")); + ui_builder_->get_widget("/device_popup", menu); + } else { + ui_builder_->get_widget("/empty_area_popup", menu); } - return dynamic_cast(ui_manager_->get_widget("/empty_area_popup")); + std::unique_ptr umenu(menu); + return umenu; } diff --git a/src/gsc_main_window.h b/src/gsc_main_window.h index 8e7ce80..4c91f39 100644 --- a/src/gsc_main_window.h +++ b/src/gsc_main_window.h @@ -103,7 +103,7 @@ class GscMainWindow : public AppBuilderWidget get_popup_menu(const StorageDevicePtr& drive); /// Update status widgets (status area, etc...) void update_status_widgets(); diff --git a/src/gsc_main_window_iconview.h b/src/gsc_main_window_iconview.h index 06a08a5..84d6a07 100644 --- a/src/gsc_main_window_iconview.h +++ b/src/gsc_main_window_iconview.h @@ -18,6 +18,7 @@ Copyright: #include // std::floor #include #include +#include #include "hz/string_algo.h" // string_join #include "hz/debug.h" @@ -544,9 +545,9 @@ class GscMainWindowIconView : public Gtk::IconView { this->unselect_all(); // unselect on empty area right-click } - Gtk::Menu* menu = main_window->get_popup_menu(drive); - if (menu) - menu->popup(event_button->button, event_button->time); + current_popup_ = main_window->get_popup_menu(drive); + if (current_popup_) + current_popup_->popup_at_pointer(reinterpret_cast(event_button)); return true; // stop handling } @@ -585,6 +586,8 @@ class GscMainWindowIconView : public Gtk::IconView { Glib::RefPtr hd_icon; ///< Icon pixbuf Glib::RefPtr cddvd_icon; ///< Icon pixbuf + std::unique_ptr current_popup_; ///< Currently popped up menu + GscMainWindow* main_window = nullptr; ///< The main window, our parent Message empty_view_message = Message::none; ///< Message type to display when not showing any icons