summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--abaddon.cpp93
-rw-r--r--abaddon.hpp4
-rw-r--r--windows/guildsettingswindow.cpp5
-rw-r--r--windows/guildsettingswindow.hpp3
-rw-r--r--windows/profilewindow.cpp5
-rw-r--r--windows/profilewindow.hpp2
6 files changed, 59 insertions, 53 deletions
diff --git a/abaddon.cpp b/abaddon.cpp
index bbe1080..9700546 100644
--- a/abaddon.cpp
+++ b/abaddon.cpp
@@ -79,44 +79,7 @@ int Abaddon::StartGTK() {
m_main_window->UpdateComponents();
// crashes for some stupid reason if i put it somewhere else
- m_user_menu = Gtk::manage(new Gtk::Menu);
- m_user_menu_insert_mention = Gtk::manage(new Gtk::MenuItem("Insert Mention"));
- m_user_menu_ban = Gtk::manage(new Gtk::MenuItem("Ban"));
- m_user_menu_kick = Gtk::manage(new Gtk::MenuItem("Kick"));
- m_user_menu_copy_id = Gtk::manage(new Gtk::MenuItem("Copy ID"));
- m_user_menu_open_dm = Gtk::manage(new Gtk::MenuItem("Open DM"));
- m_user_menu_roles = Gtk::manage(new Gtk::MenuItem("Roles"));
- m_user_menu_info = Gtk::manage(new Gtk::MenuItem("View Profile"));
- m_user_menu_remove_recipient = Gtk::manage(new Gtk::MenuItem("Remove From Group"));
- m_user_menu_roles_submenu = Gtk::manage(new Gtk::Menu);
- m_user_menu_roles->set_submenu(*m_user_menu_roles_submenu);
- m_user_menu_insert_mention->signal_activate().connect(sigc::mem_fun(*this, &Abaddon::on_user_menu_insert_mention));
- m_user_menu_ban->signal_activate().connect(sigc::mem_fun(*this, &Abaddon::on_user_menu_ban));
- m_user_menu_kick->signal_activate().connect(sigc::mem_fun(*this, &Abaddon::on_user_menu_kick));
- m_user_menu_copy_id->signal_activate().connect(sigc::mem_fun(*this, &Abaddon::on_user_menu_copy_id));
- m_user_menu_open_dm->signal_activate().connect(sigc::mem_fun(*this, &Abaddon::on_user_menu_open_dm));
- m_user_menu_remove_recipient->signal_activate().connect(sigc::mem_fun(*this, &Abaddon::on_user_menu_remove_recipient));
- m_user_menu_info->signal_activate().connect([this]() {
- auto *window = new ProfileWindow(m_shown_user_menu_id);
- window->show();
- });
-
- m_user_menu_remove_recipient->override_color(Gdk::RGBA("#BE3C3D"));
-
- m_user_menu->append(*m_user_menu_info);
- m_user_menu->append(*m_user_menu_insert_mention);
- m_user_menu->append(*Gtk::manage(new Gtk::SeparatorMenuItem));
- m_user_menu->append(*m_user_menu_ban);
- m_user_menu->append(*m_user_menu_kick);
- m_user_menu->append(*Gtk::manage(new Gtk::SeparatorMenuItem));
- m_user_menu->append(*m_user_menu_open_dm);
- m_user_menu->append(*m_user_menu_roles);
- m_user_menu->append(*Gtk::manage(new Gtk::SeparatorMenuItem));
- m_user_menu->append(*m_user_menu_remove_recipient);
- m_user_menu->append(*Gtk::manage(new Gtk::SeparatorMenuItem));
- m_user_menu->append(*m_user_menu_copy_id);
-
- m_user_menu->show_all();
+ SetupUserMenu();
m_main_window->signal_action_connect().connect(sigc::mem_fun(*this, &Abaddon::ActionConnect));
m_main_window->signal_action_disconnect().connect(sigc::mem_fun(*this, &Abaddon::ActionDisconnect));
@@ -324,6 +287,59 @@ void Abaddon::ShowUserMenu(const GdkEvent *event, Snowflake id, Snowflake guild_
m_user_menu->popup_at_pointer(event);
}
+void Abaddon::SetupUserMenu() {
+ m_user_menu = Gtk::manage(new Gtk::Menu);
+ m_user_menu_insert_mention = Gtk::manage(new Gtk::MenuItem("Insert Mention"));
+ m_user_menu_ban = Gtk::manage(new Gtk::MenuItem("Ban"));
+ m_user_menu_kick = Gtk::manage(new Gtk::MenuItem("Kick"));
+ m_user_menu_copy_id = Gtk::manage(new Gtk::MenuItem("Copy ID"));
+ m_user_menu_open_dm = Gtk::manage(new Gtk::MenuItem("Open DM"));
+ m_user_menu_roles = Gtk::manage(new Gtk::MenuItem("Roles"));
+ m_user_menu_info = Gtk::manage(new Gtk::MenuItem("View Profile"));
+ m_user_menu_remove_recipient = Gtk::manage(new Gtk::MenuItem("Remove From Group"));
+ m_user_menu_roles_submenu = Gtk::manage(new Gtk::Menu);
+ m_user_menu_roles->set_submenu(*m_user_menu_roles_submenu);
+ m_user_menu_insert_mention->signal_activate().connect(sigc::mem_fun(*this, &Abaddon::on_user_menu_insert_mention));
+ m_user_menu_ban->signal_activate().connect(sigc::mem_fun(*this, &Abaddon::on_user_menu_ban));
+ m_user_menu_kick->signal_activate().connect(sigc::mem_fun(*this, &Abaddon::on_user_menu_kick));
+ m_user_menu_copy_id->signal_activate().connect(sigc::mem_fun(*this, &Abaddon::on_user_menu_copy_id));
+ m_user_menu_open_dm->signal_activate().connect(sigc::mem_fun(*this, &Abaddon::on_user_menu_open_dm));
+ m_user_menu_remove_recipient->signal_activate().connect(sigc::mem_fun(*this, &Abaddon::on_user_menu_remove_recipient));
+ m_user_menu_info->signal_activate().connect([this]() {
+ auto *window = new ProfileWindow(m_shown_user_menu_id);
+ ManageHeapWindow(window);
+ window->show();
+ });
+
+ m_user_menu_remove_recipient->override_color(Gdk::RGBA("#BE3C3D"));
+
+ m_user_menu->append(*m_user_menu_info);
+ m_user_menu->append(*m_user_menu_insert_mention);
+ m_user_menu->append(*Gtk::manage(new Gtk::SeparatorMenuItem));
+ m_user_menu->append(*m_user_menu_ban);
+ m_user_menu->append(*m_user_menu_kick);
+ m_user_menu->append(*Gtk::manage(new Gtk::SeparatorMenuItem));
+ m_user_menu->append(*m_user_menu_open_dm);
+ m_user_menu->append(*m_user_menu_roles);
+ m_user_menu->append(*Gtk::manage(new Gtk::SeparatorMenuItem));
+ m_user_menu->append(*m_user_menu_remove_recipient);
+ m_user_menu->append(*Gtk::manage(new Gtk::SeparatorMenuItem));
+ m_user_menu->append(*m_user_menu_copy_id);
+
+ m_user_menu->show_all();
+}
+
+void Abaddon::ManageHeapWindow(Gtk::Window *window) {
+ window->signal_hide().connect([this, window]() {
+ delete window;
+ // for some reason if ShowUserMenu is called multiple times with events across windows
+ // and one of the windows is closed, then it throws errors when the menu is opened again
+ // i dont think this is my fault so this semi-hacky solution will have to do
+ delete m_user_menu;
+ SetupUserMenu();
+ });
+}
+
void Abaddon::on_user_menu_insert_mention() {
ActionInsertMention(m_shown_user_menu_id);
}
@@ -549,6 +565,7 @@ void Abaddon::ActionReactionRemove(Snowflake id, const Glib::ustring &param) {
void Abaddon::ActionGuildSettings(Snowflake id) {
auto window = new GuildSettingsWindow(id);
+ ManageHeapWindow(window);
window->show();
}
diff --git a/abaddon.hpp b/abaddon.hpp
index 54a8924..802f2b8 100644
--- a/abaddon.hpp
+++ b/abaddon.hpp
@@ -81,6 +81,10 @@ public:
void ShowUserMenu(const GdkEvent *event, Snowflake id, Snowflake guild_id);
protected:
+ void SetupUserMenu();
+
+ void ManageHeapWindow(Gtk::Window *window);
+
Snowflake m_shown_user_menu_id;
Snowflake m_shown_user_menu_guild_id;
diff --git a/windows/guildsettingswindow.cpp b/windows/guildsettingswindow.cpp
index e5491c9..9fd0d20 100644
--- a/windows/guildsettingswindow.cpp
+++ b/windows/guildsettingswindow.cpp
@@ -71,8 +71,3 @@ GuildSettingsWindow::GuildSettingsWindow(Snowflake id)
m_main.show();
add(m_main);
}
-
-void GuildSettingsWindow::on_hide() {
- Gtk::Window::on_hide();
- delete this; // :x
-}
diff --git a/windows/guildsettingswindow.hpp b/windows/guildsettingswindow.hpp
index 0260098..3d9d857 100644
--- a/windows/guildsettingswindow.hpp
+++ b/windows/guildsettingswindow.hpp
@@ -12,9 +12,6 @@ class GuildSettingsWindow : public Gtk::Window {
public:
GuildSettingsWindow(Snowflake id);
-protected:
- void on_hide() override;
-
private:
Gtk::Box m_main;
Gtk::Stack m_stack;
diff --git a/windows/profilewindow.cpp b/windows/profilewindow.cpp
index 9fada15..9e8c798 100644
--- a/windows/profilewindow.cpp
+++ b/windows/profilewindow.cpp
@@ -97,11 +97,6 @@ ProfileWindow::ProfileWindow(Snowflake user_id)
show_all_children();
}
-void ProfileWindow::on_hide() {
- Gtk::Window::on_hide();
- delete this;
-}
-
void ProfileWindow::OnFetchProfile(const UserProfileData &data) {
m_pane_info.SetConnections(data.ConnectedAccounts);
m_pane_guilds.SetMutualGuilds(data.MutualGuilds);
diff --git a/windows/profilewindow.hpp b/windows/profilewindow.hpp
index 7b22829..f234f10 100644
--- a/windows/profilewindow.hpp
+++ b/windows/profilewindow.hpp
@@ -9,8 +9,6 @@ class ProfileWindow : public Gtk::Window {
public:
ProfileWindow(Snowflake user_id);
- void on_hide() override;
-
Snowflake ID;
private: