#pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "services/tray.hpp" class TrayIconWidget : public Gtk::Button { public: TrayIconWidget(TrayService &service, std::string id); void update(const TrayService::Item &item); private: TrayService &service; 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; sigc::connection menuChangedConnection; bool menuPopupPending = 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); bool ensure_menu(); void on_menu_items_changed(guint position, guint removed, guint added); void try_popup(); 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(TrayService &service); ~TrayWidget() override; private: TrayService &service; 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(); };