mirror of
https://github.com/ashaduri/gsmartcontrol.git
synced 2026-09-25 05:15:33 +00:00
(Possibly) fix a memory leak related to Gtk::Menu.
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user