diff options
Diffstat (limited to 'src/abaddon.cpp')
-rw-r--r-- | src/abaddon.cpp | 59 |
1 files changed, 56 insertions, 3 deletions
diff --git a/src/abaddon.cpp b/src/abaddon.cpp index a2d65e5..4ca1462 100644 --- a/src/abaddon.cpp +++ b/src/abaddon.cpp @@ -17,6 +17,10 @@ #include "windows/pinnedwindow.hpp" #include "windows/threadswindow.hpp" +#ifdef WITH_LIBHANDY + #include <handy.h> +#endif + #ifdef _WIN32 #pragma comment(lib, "crypt32.lib") #endif @@ -59,9 +63,48 @@ Abaddon &Abaddon::Get() { return instance; } +#ifdef WITH_LIBHANDY + #ifdef _WIN32 +constexpr static guint BUTTON_BACK = 4; +constexpr static guint BUTTON_FORWARD = 5; + #else +constexpr static guint BUTTON_BACK = 8; +constexpr static guint BUTTON_FORWARD = 9; + #endif + +static void HandleButtonEvents(GdkEvent *event, MainWindow *main_window) { + if (event->type != GDK_BUTTON_PRESS) return; + + auto *widget = gtk_get_event_widget(event); + if (widget == nullptr) return; + auto *window = gtk_widget_get_toplevel(widget); + if (static_cast<void *>(window) != static_cast<void *>(main_window->gobj())) return; // is this the right way??? + + switch (event->button.button) { + case BUTTON_BACK: + main_window->GoBack(); + break; + case BUTTON_FORWARD: + main_window->GoForward(); + break; + } +} + +static void MainEventHandler(GdkEvent *event, void *main_window) { + HandleButtonEvents(event, static_cast<MainWindow *>(main_window)); + gtk_main_do_event(event); +} +#endif + int Abaddon::StartGTK() { m_gtk_app = Gtk::Application::create("com.github.uowuo.abaddon"); +#ifdef WITH_LIBHANDY + m_gtk_app->signal_activate().connect([] { + hdy_init(); + }); +#endif + m_css_provider = Gtk::CssProvider::create(); m_css_provider->signal_parsing_error().connect([](const Glib::RefPtr<const Gtk::CssSection> §ion, const Glib::Error &error) { Gtk::MessageDialog dlg("css failed parsing (" + error.what() + ")", false, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true); @@ -103,6 +146,10 @@ int Abaddon::StartGTK() { m_main_window->set_title(APP_TITLE); m_main_window->set_position(Gtk::WIN_POS_CENTER); +#ifdef WITH_LIBHANDY + gdk_event_handler_set(&MainEventHandler, m_main_window.get(), nullptr); +#endif + if (!m_settings.IsValid()) { Gtk::MessageDialog dlg(*m_main_window, "The settings file could not be opened!", false, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true); dlg.set_position(Gtk::WIN_POS_CENTER); @@ -138,7 +185,7 @@ int Abaddon::StartGTK() { m_main_window->signal_action_view_pins().connect(sigc::mem_fun(*this, &Abaddon::ActionViewPins)); m_main_window->signal_action_view_threads().connect(sigc::mem_fun(*this, &Abaddon::ActionViewThreads)); - m_main_window->GetChannelList()->signal_action_channel_item_select().connect(sigc::mem_fun(*this, &Abaddon::ActionChannelOpened)); + m_main_window->GetChannelList()->signal_action_channel_item_select().connect(sigc::bind(sigc::mem_fun(*this, &Abaddon::ActionChannelOpened), true)); m_main_window->GetChannelList()->signal_action_guild_leave().connect(sigc::mem_fun(*this, &Abaddon::ActionLeaveGuild)); m_main_window->GetChannelList()->signal_action_guild_settings().connect(sigc::mem_fun(*this, &Abaddon::ActionGuildSettings)); @@ -414,6 +461,9 @@ void Abaddon::SaveState() { AbaddonApplicationState state; state.ActiveChannel = m_main_window->GetChatActiveChannel(); state.Expansion = m_main_window->GetChannelList()->GetExpansionState(); +#ifdef WITH_LIBHANDY + state.Tabs = m_main_window->GetChatWindow()->GetTabsState(); +#endif const auto path = GetStateCachePath(); if (!util::IsFolder(path)) { @@ -440,6 +490,9 @@ void Abaddon::LoadState() { try { AbaddonApplicationState state = nlohmann::json::parse(data.begin(), data.end()); m_main_window->GetChannelList()->UseExpansionState(state.Expansion); +#ifdef WITH_LIBHANDY + m_main_window->GetChatWindow()->UseTabsState(state.Tabs); +#endif ActionChannelOpened(state.ActiveChannel); } catch (const std::exception &e) { printf("failed to load application state: %s\n", e.what()); @@ -551,7 +604,7 @@ void Abaddon::ActionJoinGuildDialog() { } } -void Abaddon::ActionChannelOpened(Snowflake id) { +void Abaddon::ActionChannelOpened(Snowflake id, bool expand_to) { if (!id.IsValid() || id == m_main_window->GetChatActiveChannel()) return; m_main_window->GetChatWindow()->SetTopic(""); @@ -574,7 +627,7 @@ void Abaddon::ActionChannelOpened(Snowflake id) { display = "Empty group"; m_main_window->set_title(std::string(APP_TITLE) + " - " + display); } - m_main_window->UpdateChatActiveChannel(id); + m_main_window->UpdateChatActiveChannel(id, expand_to); if (m_channels_requested.find(id) == m_channels_requested.end()) { // dont fire requests we know will fail if (can_access) { |