summaryrefslogtreecommitdiff
path: root/abaddon.cpp
diff options
context:
space:
mode:
authorouwou <26526779+ouwou@users.noreply.github.com>2021-03-15 00:28:42 -0500
committerouwou <26526779+ouwou@users.noreply.github.com>2021-03-15 00:28:42 -0500
commit818aacb49c3b610f45e5d94f3c5b90c82114136d (patch)
tree7c760e25996ec938a88b123e8686e0cdb3398dc3 /abaddon.cpp
parentb68b292c2ce8b85cd571931c3d97f9acc97f4cfa (diff)
downloadabaddon-portaudio-818aacb49c3b610f45e5d94f3c5b90c82114136d.tar.gz
abaddon-portaudio-818aacb49c3b610f45e5d94f3c5b90c82114136d.zip
fix errors with user menu and window management
Diffstat (limited to 'abaddon.cpp')
-rw-r--r--abaddon.cpp93
1 files changed, 55 insertions, 38 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();
}