39 #include <glib/gi18n.h>
43 #ifdef HAVE_LIBAPPINDICATOR
44 # ifdef HAVE_AYATANA_LIBAPPINDICATOR
45 # include <libayatana-appindicator/app-indicator.h>
47 # include <libappindicator/app-indicator.h>
52 #ifdef HAVE_LIBAVAHI_CLIENT
65 #ifdef HAVE_LIBAVAHI_CLIENT
82 #ifdef HAVE_LIBAVAHI_CLIENT
102 TRACE_CALL(__func__);
108 TRACE_CALL(__func__);
112 #ifdef HAVE_LIBAVAHI_CLIENT
115 TRACE_CALL(__func__);
119 if (gtk_check_menu_item_get_active(checkmenuitem)) {
133 TRACE_CALL(__func__);
137 #ifdef HAVE_LIBAVAHI_CLIENT
139 menuitem = gtk_separator_menu_item_new();
140 gtk_widget_show(menuitem);
141 gtk_menu_shell_prepend(GTK_MENU_SHELL(menu), menuitem);
143 menuitem = gtk_check_menu_item_new_with_label(_(
"Enable Service Discovery"));
145 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), TRUE);
146 gtk_widget_show(menuitem);
148 gtk_menu_shell_prepend(GTK_MENU_SHELL(menu), menuitem);
153 menuitem = gtk_separator_menu_item_new();
154 gtk_widget_show(menuitem);
155 gtk_menu_shell_prepend(GTK_MENU_SHELL(menu), menuitem);
157 menuitem = gtk_menu_item_new_with_mnemonic(_(
"_Quit"));
158 gtk_widget_show(menuitem);
159 gtk_menu_shell_prepend(GTK_MENU_SHELL(menu), menuitem);
162 menuitem = gtk_menu_item_new_with_mnemonic(_(
"_About"));
163 gtk_widget_show(menuitem);
164 gtk_menu_shell_prepend(GTK_MENU_SHELL(menu), menuitem);
165 g_signal_connect(G_OBJECT(menuitem),
"activate", G_CALLBACK(
remmina_icon_about), NULL);
167 menuitem = gtk_menu_item_new_with_mnemonic(_(
"_Preferences"));
168 gtk_widget_show(menuitem);
169 gtk_menu_shell_prepend(GTK_MENU_SHELL(menu), menuitem);
172 menuitem = gtk_menu_item_new_with_label(_(
"Open Main Window"));
173 gtk_widget_show(menuitem);
174 gtk_menu_shell_prepend(GTK_MENU_SHELL(menu), menuitem);
175 g_signal_connect(G_OBJECT(menuitem),
"activate", G_CALLBACK(
remmina_icon_main), NULL);
182 TRACE_CALL(__func__);
193 s = g_strdup_printf(
"%s,%s", menuitem->
protocol, menuitem->
name);
202 TRACE_CALL(__func__);
213 s = g_strdup_printf(
"%s,%s", menuitem->
protocol, menuitem->
name);
222 TRACE_CALL(__func__);
228 #ifdef HAVE_LIBAVAHI_CLIENT
234 while (g_hash_table_iter_next(&iter, NULL, (gpointer *)&tmp)) {
236 gtk_widget_show(menuitem);
244 gtk_widget_show(menuitem);
247 gtk_menu_shell_prepend(GTK_MENU_SHELL(menu), menuitem);
249 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
258 TRACE_CALL(__func__);
270 menuitem = gtk_separator_menu_item_new();
271 gtk_widget_show(menuitem);
272 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
281 TRACE_CALL(__func__);
285 content = g_key_file_to_data(gkeyfile, &length, NULL);
290 REMMINA_WARNING(
"Cannot save remmina icon autostart file. Uncheck Preferences -> Applet -> No Tray Icon to recreate it.");
297 TRACE_CALL(__func__);
303 gkeyfile = g_key_file_new();
304 g_key_file_set_string(gkeyfile,
"Desktop Entry",
"Version",
"1.0");
306 g_key_file_set_string(gkeyfile,
"Desktop Entry",
"Name", _(
"Remmina Applet"));
308 g_key_file_set_string(gkeyfile,
"Desktop Entry",
"Comment", _(
"Connect to remote desktops through the applet menu"));
309 g_key_file_set_string(gkeyfile,
"Desktop Entry",
"Icon", REMMINA_APP_ID);
310 if (getenv(
"FLATPAK_ID")){
311 g_key_file_set_string(gkeyfile,
"Desktop Entry",
"Exec",
"flatpak run org.remmina.Remmina -i");
314 g_key_file_set_string(gkeyfile,
"Desktop Entry",
"Exec",
"remmina -i");
316 g_key_file_set_boolean(gkeyfile,
"Desktop Entry",
"Terminal", FALSE);
317 g_key_file_set_string(gkeyfile,
"Desktop Entry",
"Type",
"Application");
318 g_key_file_set_boolean(gkeyfile,
"Desktop Entry",
"Hidden", FALSE);
320 g_key_file_free(gkeyfile);
332 TRACE_CALL(__func__);
340 REMMINA_DEBUG(
"Indicator is not connected to panel, thus it cannot be displayed.");
343 REMMINA_DEBUG(
"Indicator is connected to panel, thus it can be displayed.");
357 TRACE_CALL(__func__);
358 REMMINA_DEBUG(
"Indicator connection changed to: %d", connected);
364 TRACE_CALL(__func__);
366 gchar remmina_panel[29];
367 gboolean sni_supported;
369 g_stpcpy(remmina_panel,
"org.remmina.Remmina-status");
376 g_autofree gchar *msg = g_strconcat(
377 _(
"StatusNotifier/Appindicator support in “"),
384 REMMINA_INFO(_(
"%s your desktop does support it"), msg);
386 REMMINA_INFO(_(
"%s and Remmina has built-in (compiled) support for libappindicator."), msg);
389 REMMINA_INFO(_(
"%s not supported natively by your Desktop Environment. libappindicator will try to fallback to GtkStatusIcon/xembed"), msg);
391 if (g_strrstr(wmname,
"mate") != NULL)
393 REMMINA_INFO(_(
"%s You may need to install, and use XApp Status Applet"), msg);
394 if (g_strrstr(wmname,
"kde") != NULL)
396 REMMINA_INFO(_(
"%s You may need to install, and use KStatusNotifierItem"), msg);
397 if (g_strrstr(wmname,
"plasma") != NULL)
399 REMMINA_INFO(_(
"%s You may need to install, and use XEmbed SNI Proxy"), msg);
400 if (g_strrstr(wmname,
"gnome") != NULL)
402 REMMINA_INFO(_(
"%s You may need to install, and use Gnome Shell Extension Appindicator"), msg);
405 remmina_icon.
icon = app_indicator_new(
"remmina-icon", remmina_panel, APP_INDICATOR_CATEGORY_APPLICATION_STATUS);
411 APP_INDICATOR_STATUS_PASSIVE : APP_INDICATOR_STATUS_ACTIVE);
416 #ifdef HAVE_LIBAVAHI_CLIENT
440 TRACE_CALL(__func__);
444 gkeyfile = g_key_file_new();
450 REMMINA_WARNING(
"Cannot load remmina icon autostart file. Uncheck Preferences -> Applet -> No Tray Icon to recreate it.");
453 b = !g_key_file_get_boolean(gkeyfile,
"Desktop Entry",
"Hidden", NULL);
454 g_key_file_free(gkeyfile);
460 TRACE_CALL(__func__);
465 gkeyfile = g_key_file_new();
467 b = !g_key_file_get_boolean(gkeyfile,
"Desktop Entry",
"Hidden", NULL);
468 if (b != autostart) {
469 g_key_file_set_boolean(gkeyfile,
"Desktop Entry",
"Hidden", !autostart);
472 g_key_file_set_string(gkeyfile,
"Desktop Entry",
"Name", _(
"Remmina Applet"));
474 g_key_file_set_string(gkeyfile,
"Desktop Entry",
"Comment", _(
"Connect to remote desktops through the applet menu"));
476 g_key_file_free(gkeyfile);
480 REMMINA_WARNING(
"Cannot load remmina icon autostart file. Uncheck Preferences -> Applet -> No Tray Icon to recreate it.");
void remmina_avahi_start(RemminaAvahi *ga)
void remmina_avahi_free(RemminaAvahi *ga)
RemminaAvahi * remmina_avahi_new(void)
void remmina_avahi_stop(RemminaAvahi *ga)
void remmina_exec_command(RemminaCommandType command, const gchar *data)
void remmina_exec_exitremmina_one_confirm()
@ REMMINA_COMMAND_CONNECT
static void remmina_icon_save_autostart_file(GKeyFile *gkeyfile)
void remmina_icon_destroy(void)
static void remmina_icon_populate_extra_menu_item(GtkWidget *menu)
gboolean remmina_icon_is_available(void)
Determine whenever the Remmina icon is available.
static void remmina_icon_connection_changed_cb(AppIndicator *indicator, gboolean connected, gpointer data)
static void remmina_icon_create_autostart_file(void)
void remmina_icon_set_autostart(gboolean autostart)
static void remmina_icon_about(void)
static void remmina_icon_populate_additional_menu_item(GtkWidget *menu)
static RemminaIcon remmina_icon
static void remmina_icon_main(void)
static void remmina_icon_enable_avahi(GtkCheckMenuItem *checkmenuitem, gpointer data)
static void remmina_icon_on_launch_item(RemminaAppletMenu *menu, RemminaAppletMenuItem *menuitem, gpointer data)
static void remmina_icon_preferences(void)
gboolean remmina_icon_is_autostart(void)
struct _RemminaIcon RemminaIcon
void remmina_icon_populate_menu(void)
static void remmina_icon_on_edit_item(RemminaAppletMenu *menu, RemminaAppletMenuItem *menuitem, gpointer data)
void remmina_icon_init(void)
gboolean remmina_pref_save(void)
gchar * remmina_sysinfo_get_wm_name()
Query environment variables to get the Window manager name.
gboolean remmina_sysinfo_is_appindicator_available()
GHashTable * discovered_services
gboolean indicator_connected
gboolean applet_new_ontop
gboolean applet_enable_avahi
gboolean applet_hide_count
gboolean disable_tray_icon