(Possibly) fix a memory leak related to Gtk::Menu.

This commit is contained in:
Alexander Shaduri
2022-01-25 15:53:56 +04:00
parent 3fc29efd2f
commit 351c8b23cb
3 changed files with 16 additions and 8 deletions
+9 -4
View File
@@ -897,14 +897,19 @@ void GscMainWindow::on_action_reread_device_data()
Gtk::Menu* GscMainWindow::get_popup_menu(const StorageDevicePtr& drive)
std::unique_ptr<Gtk::Menu> GscMainWindow::get_popup_menu(const StorageDevicePtr& drive)
{
if (!ui_manager_)
if (!ui_builder_)
return nullptr;
Gtk::Menu* menu = nullptr;
if (drive) {
return dynamic_cast<Gtk::Menu*>(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<Gtk::Menu*>(ui_manager_->get_widget("/empty_area_popup"));
std::unique_ptr<Gtk::Menu> umenu(menu);
return umenu;
}
+1 -1
View File
@@ -103,7 +103,7 @@ class GscMainWindow : public AppBuilderWidget<GscMainWindow, false, Gtk::Applica
void set_drive_menu_status(const StorageDevicePtr& drive);
/// Get popup menu for a drive
Gtk::Menu* get_popup_menu(const StorageDevicePtr& drive);
std::unique_ptr<Gtk::Menu> get_popup_menu(const StorageDevicePtr& drive);
/// Update status widgets (status area, etc...)
void update_status_widgets();
+6 -3
View File
@@ -18,6 +18,7 @@ Copyright:
#include <cmath> // std::floor
#include <unordered_map>
#include <cairomm/cairomm.h>
#include <memory>
#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<const GdkEvent *>(event_button));
return true; // stop handling
}
@@ -585,6 +586,8 @@ class GscMainWindowIconView : public Gtk::IconView {
Glib::RefPtr<Gdk::Pixbuf> hd_icon; ///< Icon pixbuf
Glib::RefPtr<Gdk::Pixbuf> cddvd_icon; ///< Icon pixbuf
std::unique_ptr<Gtk::Menu> 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