Skip to content
API Documentation
BastionGuard™
TrayIcon.hpp
Go to the documentation of this file.
1/*
2 * BastionGuard™
3 * Copyright (C) 2025–2026 Calogero Scarnà
4 *
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, version 3.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <https://www.gnu.org/licenses/>.
16 *
17 * BastionGuard™ is a trademark of Calogero Scarnà.
18 * The BastionGuard™ name and branding are not licensed under the GPL.
19 */
20
21#pragma once
22
23#ifndef BSC_HAS_SDBUS
24#define BSC_HAS_SDBUS 0
25#endif
26
27#if BSC_HAS_SDBUS
28#include <systemd/sd-bus.h>
29#endif
30#include <glib.h>
31#include <atomic>
32#include <functional>
33#include <string>
34#include <thread>
35#include <vector>
36
37class TrayIcon {
38public:
41
42 bool start();
43 void stop();
44
45
46 void set_icon(const std::string& icon_name);
47
48
49 void set_icon_file(const std::string& png_path, int target_px = 22);
50
51 void set_tooltip(const std::string& text);
52 void set_title(const std::string& title);
53
54 void set_on_activate(std::function<void()> cb) { on_activate_cb_ = std::move(cb); }
55 void set_on_make_startup_persistent(std::function<void()> cb) { on_make_startup_persistent_cb_ = std::move(cb); }
56 void set_on_quit(std::function<void()> cb) { on_quit_cb_ = std::move(cb); }
58
59#if BSC_HAS_SDBUS
60 static int sni_method_activate(sd_bus_message* m, void* userdata, sd_bus_error* ret_error);
61 static int sni_method_context_menu(sd_bus_message* m, void* userdata, sd_bus_error* ret_error);
62 static int sni_method_secondary_activate(sd_bus_message* m, void* userdata, sd_bus_error* ret_error);
63
64 static int sni_prop_get(sd_bus* bus,
65 const char* path,
66 const char* interface,
67 const char* property,
68 sd_bus_message* reply,
69 void* userdata,
70 sd_bus_error* ret_error);
71 static int dbusmenu_method_event_group(sd_bus_message* m, void* userdata, sd_bus_error* ret_error);
72 static int dbusmenu_method_about_to_show_group(sd_bus_message* m, void* userdata, sd_bus_error* ret_error);
73 static int dbusmenu_method_get_layout(sd_bus_message* m, void* userdata, sd_bus_error* ret_error);
74 static int dbusmenu_method_get_children(sd_bus_message* m, void* userdata, sd_bus_error* ret_error);
75 static int dbusmenu_method_get_group_properties(sd_bus_message* m, void* userdata, sd_bus_error* ret_error);
76 static int dbusmenu_method_get_property(sd_bus_message* m, void* userdata, sd_bus_error* ret_error);
77 static int dbusmenu_method_get_status(sd_bus_message* m, void* userdata, sd_bus_error* ret_error);
78
79 static int dbusmenu_method_event(sd_bus_message* m, void* userdata, sd_bus_error* ret_error);
80 static int dbusmenu_method_about_to_show(sd_bus_message* m, void* userdata, sd_bus_error* ret_error);
81
82 static int dbusmenu_prop_get(sd_bus* bus,
83 const char* path,
84 const char* interface,
85 const char* property,
86 sd_bus_message* reply,
87 void* userdata,
88 sd_bus_error* ret_error);
89#endif
90
91private:
92
93 std::string service_name_;
94 std::string id_ = "bastionguard-sc";
95 std::string title_ = "BastionGuard™ Secure Connection";
96 std::string icon_name_ = "security-high";
97 std::string tooltip_ = "BastionGuard™ Secure Connection";
98 std::string status_ = "Active";
99 GMainContext* ui_ctx_ = nullptr;
100
101 bool have_pixmap_ = false;
102 int pix_w_ = 0;
103 int pix_h_ = 0;
104 std::vector<uint8_t> pix_rgba_;
105
106
107 std::function<void()> on_activate_cb_;
108 std::function<void()> on_make_startup_persistent_cb_;
109 std::function<void()> on_quit_cb_;
110
111#if BSC_HAS_SDBUS
112 sd_bus* bus_ = nullptr;
113 sd_bus_slot* sni_slot_ = nullptr;
114 sd_bus_slot* menu_slot_ = nullptr;
115#endif
116
117 std::thread bus_thread_;
118 std::atomic_bool running_{false};
119
120 static constexpr int MENU_ROOT = 0;
121 static constexpr int MENU_SHOW = 1;
122 static constexpr int MENU_PERSIST_STARTUP = 2;
123 static constexpr int MENU_QUIT = 3;
124
125private:
126#if BSC_HAS_SDBUS
127 static std::string make_service_name();
128
129 bool acquire_bus();
130 bool request_name();
131 void release_bus();
132
133 bool export_objects();
134 void unexport_objects();
135 bool register_to_watcher();
136
137 void bus_loop();
138
139 void emit_sni_signal(const char* signal_name);
140 void emit_dbusmenu_layout_updated();
141#endif
142};
static constexpr int MENU_ROOT
Definition TrayIcon.hpp:120
std::function< void()> on_activate_cb_
Definition TrayIcon.hpp:107
std::function< void()> on_quit_cb_
Definition TrayIcon.hpp:109
void set_on_quit(std::function< void()> cb)
Definition TrayIcon.hpp:56
void bind_ui_context()
bool have_pixmap_
Definition TrayIcon.hpp:101
void set_title(const std::string &title)
static constexpr int MENU_PERSIST_STARTUP
Definition TrayIcon.hpp:122
void set_icon(const std::string &icon_name)
std::vector< uint8_t > pix_rgba_
Definition TrayIcon.hpp:104
std::thread bus_thread_
Definition TrayIcon.hpp:117
bool start()
std::function< void()> on_make_startup_persistent_cb_
Definition TrayIcon.hpp:108
void set_on_make_startup_persistent(std::function< void()> cb)
Definition TrayIcon.hpp:55
void stop()
std::string tooltip_
Definition TrayIcon.hpp:97
std::string service_name_
Definition TrayIcon.hpp:93
GMainContext * ui_ctx_
Definition TrayIcon.hpp:99
std::atomic_bool running_
Definition TrayIcon.hpp:118
std::string status_
Definition TrayIcon.hpp:98
void set_icon_file(const std::string &png_path, int target_px=22)
std::string title_
Definition TrayIcon.hpp:95
void set_tooltip(const std::string &text)
static constexpr int MENU_QUIT
Definition TrayIcon.hpp:123
void set_on_activate(std::function< void()> cb)
Definition TrayIcon.hpp:54
static constexpr int MENU_SHOW
Definition TrayIcon.hpp:121
std::string id_
Definition TrayIcon.hpp:94
std::string icon_name_
Definition TrayIcon.hpp:96