better working tray

This commit is contained in:
2026-01-02 16:50:02 +01:00
parent 2d5b492da8
commit ab7b3b3092
5 changed files with 559 additions and 228 deletions

View File

@@ -50,7 +50,8 @@ class TrayService {
bool separator = false;
std::vector<MenuNode> children;
};
std::optional<MenuNode> get_menu_layout(const std::string &id);
using MenuLayoutCallback = sigc::slot<void(std::optional<MenuNode>)>;
void request_menu_layout(const std::string &id, MenuLayoutCallback callback);
bool activate_menu_item(const std::string &id, int itemId);
sigc::signal<void(const Item &)> &signal_item_added();
@@ -75,6 +76,11 @@ class TrayService {
guint ownerWatchId = 0;
Glib::RefPtr<Gio::MenuModel> menuModel;
Glib::RefPtr<Gio::ActionGroup> menuActions;
guint refreshSourceId = 0;
bool refreshInFlight = false;
bool refreshQueued = false;
bool addSignalPending = false;
};
Glib::RefPtr<Gio::DBus::Connection> connection;
@@ -124,7 +130,11 @@ class TrayService {
void register_item(const Glib::ustring &sender, const std::string &service);
void unregister_item(const std::string &id);
void refresh_item(TrackedItem &item);
void schedule_refresh(const std::string &id);
void begin_refresh(const std::string &id);
static gboolean refresh_timeout_cb(gpointer user_data);
static void on_refresh_finished_static(GObject *source, GAsyncResult *res,
gpointer user_data);
void emit_registered_items_changed();
Glib::Variant<std::vector<Glib::ustring>>

View File

@@ -13,7 +13,9 @@
#include <gtkmm/popovermenu.h>
#include <map>
#include <memory>
#include <optional>
#include <string>
#include <vector>
#include "services/tray.hpp"
#include "components/base/button.hpp"
@@ -35,16 +37,15 @@ class TrayIconWidget : public Button {
Glib::RefPtr<Gtk::PopoverMenu> menuPopover;
Glib::RefPtr<Gio::SimpleActionGroup> menuActions;
Glib::RefPtr<Gio::MenuModel> menuModel;
sigc::connection menuChangedConnection;
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);
bool ensure_menu();
void on_menu_items_changed(guint position, guint removed, guint added);
void try_popup();
void on_menu_layout_ready(std::optional<TrayService::MenuNode> layout);
void
populate_menu_items(const std::vector<TrayService::MenuNode> &nodes,
const Glib::RefPtr<Gio::Menu> &menu,