#pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "services/tray.hpp" #include "components/base/button.hpp" class TrayIconWidget : public Button { public: TrayIconWidget(std::string id); void update(const TrayService::Item &item); private: TrayService &service = *TrayService::getInstance(); std::string id; Gtk::Box container; Gtk::Picture picture; Gtk::Image image; Glib::RefPtr primaryGesture; Glib::RefPtr secondaryGesture; Glib::RefPtr menuPopover; Glib::RefPtr menuActions; Glib::RefPtr menuModel; bool menuPopupPending = false; bool menuRequestInFlight = false; bool hasRemoteMenu = false; double pendingX = 0.0; double pendingY = 0.0; void on_primary_released(int n_press, double x, double y); void on_secondary_released(int n_press, double x, double y); void on_menu_layout_ready(std::optional layout); void populate_menu_items(const std::vector &nodes, const Glib::RefPtr &menu, const Glib::RefPtr &actions); void on_menu_action(const Glib::VariantBase ¶meter, int itemId); }; class TrayWidget : public Gtk::Box { public: explicit TrayWidget(); ~TrayWidget() override; private: TrayService *service = TrayService::getInstance(); std::map> icons; sigc::connection addConnection; sigc::connection removeConnection; sigc::connection updateConnection; void on_item_added(const TrayService::Item &item); void on_item_removed(const std::string &id); void on_item_updated(const TrayService::Item &item); void rebuild_existing(); };