39 #include <glib/gi18n.h> 51 #ifdef HAVE_LIBAPPINDICATOR 52 #ifdef HAVE_AYATANA_LIBAPPINDICATOR 53 #include <libayatana-appindicator/app-indicator.h> 55 #include <libappindicator/app-indicator.h> 60 #ifdef HAVE_LIBAPPINDICATOR 77 if (remmina_icon.
icon) {
78 #ifdef HAVE_LIBAPPINDICATOR 79 app_indicator_set_status(remmina_icon.
icon, APP_INDICATOR_STATUS_PASSIVE);
81 gtk_status_icon_set_visible(remmina_icon.
icon, FALSE);
83 remmina_icon.
icon = NULL;
85 if (remmina_icon.
avahi) {
87 remmina_icon.
avahi = NULL;
101 TRACE_CALL(__func__);
107 TRACE_CALL(__func__);
113 TRACE_CALL(__func__);
119 TRACE_CALL(__func__);
120 if (!remmina_icon.
avahi)
123 if (gtk_check_menu_item_get_active(checkmenuitem)) {
136 TRACE_CALL(__func__);
139 menuitem = gtk_menu_item_new_with_label(_(
"Open Main Window"));
140 gtk_widget_show(menuitem);
141 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
142 g_signal_connect(G_OBJECT(menuitem),
"activate", G_CALLBACK(
remmina_icon_main), NULL);
144 menuitem = gtk_menu_item_new_with_mnemonic(_(
"_Preferences"));
145 gtk_widget_show(menuitem);
146 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
149 menuitem = gtk_menu_item_new_with_mnemonic(_(
"_About"));
150 gtk_widget_show(menuitem);
151 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
152 g_signal_connect(G_OBJECT(menuitem),
"activate", G_CALLBACK(
remmina_icon_about), NULL);
154 menuitem = gtk_separator_menu_item_new();
155 gtk_widget_show(menuitem);
156 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
158 #ifdef HAVE_LIBAVAHI_CLIENT 159 menuitem = gtk_check_menu_item_new_with_label(_(
"Enable Service Discovery"));
161 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), TRUE);
163 gtk_widget_show(menuitem);
165 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
167 menuitem = gtk_separator_menu_item_new();
168 gtk_widget_show(menuitem);
169 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
172 menuitem = gtk_menu_item_new_with_mnemonic(_(
"_Quit"));
173 gtk_widget_show(menuitem);
174 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
180 TRACE_CALL(__func__);
191 s = g_strdup_printf(
"%s,%s", menuitem->
protocol, menuitem->
name);
200 TRACE_CALL(__func__);
211 s = g_strdup_printf(
"%s,%s", menuitem->
protocol, menuitem->
name);
220 TRACE_CALL(__func__);
229 if (remmina_icon.
avahi) {
231 while (g_hash_table_iter_next(&iter, NULL, (gpointer*)&tmp)) {
233 gtk_widget_show(menuitem);
239 menuitem = gtk_separator_menu_item_new();
240 gtk_widget_show(menuitem);
242 gtk_menu_shell_prepend(GTK_MENU_SHELL(menu), menuitem);
244 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
249 gtk_widget_show(menuitem);
252 gtk_menu_shell_prepend(GTK_MENU_SHELL(menu), menuitem);
254 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
261 #ifdef HAVE_LIBAPPINDICATOR 266 TRACE_CALL(__func__);
272 app_indicator_set_menu(remmina_icon.
icon, GTK_MENU(menu));
278 menuitem = gtk_separator_menu_item_new();
279 gtk_widget_show(menuitem);
280 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
290 TRACE_CALL(__func__);
295 TRACE_CALL(__func__);
296 if (gtk_get_current_event_time() - remmina_icon.
popup_time <= 500) {
303 TRACE_CALL(__func__);
305 gint button, event_time;
307 remmina_icon.
popup_time = gtk_get_current_event_time();
315 event_time = gtk_get_current_event_time();
319 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, gtk_status_icon_position_menu, remmina_icon.
icon, button, event_time);
324 TRACE_CALL(__func__);
327 menu = gtk_menu_new();
331 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, gtk_status_icon_position_menu, remmina_icon.
icon, button, activate_time);
338 TRACE_CALL(__func__);
342 content = g_key_file_to_data(gkeyfile, &length, NULL);
343 g_file_set_contents(remmina_icon.
autostart_file, content, length, NULL);
349 TRACE_CALL(__func__);
355 gkeyfile = g_key_file_new();
356 g_key_file_set_string(gkeyfile,
"Desktop Entry",
"Version",
"1.0");
357 g_key_file_set_string(gkeyfile,
"Desktop Entry",
"Name", _(
"Remmina Applet"));
358 g_key_file_set_string(gkeyfile,
"Desktop Entry",
"Comment",
359 _(
"Connect to remote desktops through the applet menu"));
360 g_key_file_set_string(gkeyfile,
"Desktop Entry",
"Icon", REMMINA_APP_ID);
361 g_key_file_set_string(gkeyfile,
"Desktop Entry",
"Exec",
"remmina -i");
362 g_key_file_set_boolean(gkeyfile,
"Desktop Entry",
"Terminal", FALSE);
363 g_key_file_set_string(gkeyfile,
"Desktop Entry",
"Type",
"Application");
364 g_key_file_set_boolean(gkeyfile,
"Desktop Entry",
"Hidden", TRUE);
366 g_key_file_free(gkeyfile);
378 TRACE_CALL(__func__);
380 unsigned int gsv_maj, gsv_min, gsv_seq;
381 gboolean gshell_has_legacyTray;
383 if (!remmina_icon.
icon)
390 if (sscanf(gsversion,
"%u.%u", &gsv_maj, &gsv_min) == 2)
391 gsv_seq = gsv_maj << 16 | gsv_min << 8;
396 gshell_has_legacyTray = FALSE;
397 if (gsv_seq >= 0x031000 && gsv_seq <= 0x031800) {
400 gshell_has_legacyTray = TRUE;
404 #ifdef HAVE_LIBAPPINDICATOR 411 }
else if (gshell_has_legacyTray) {
418 if (gshell_has_legacyTray) {
431 TRACE_CALL(__func__);
433 gchar remmina_panel[23];
434 gboolean sni_supported;
438 g_stpcpy(remmina_panel,
"remmina-panel-inverted");
440 g_stpcpy(remmina_panel,
"remmina-panel");
446 strcpy(msg,
"StatusNotifier/Appindicator support: ");
448 strcat(msg,
"your desktop does support it");
449 #ifdef HAVE_LIBAPPINDICATOR 450 strcat(msg,
" and libappindicator is compiled in remmina. Good!");
452 strcat(msg,
", but you did not compile remmina with cmake’s -DWITH_APPINDICATOR=on");
455 #ifdef HAVE_LIBAPPINDICATOR 456 strcat(msg,
"not supported by desktop. libappindicator will try to fallback to GtkStatusIcon/xembed");
458 strcat(msg,
"not supported by desktop. Remmina will try to fallback to GtkStatusIcon/xembed");
466 printf(
"Running under Gnome Shell version %s\n", remmina_icon.
gsversion);
470 #ifdef HAVE_LIBAPPINDICATOR 471 remmina_icon.
icon = app_indicator_new(
"remmina-icon", remmina_panel, APP_INDICATOR_CATEGORY_APPLICATION_STATUS);
472 app_indicator_set_icon_theme_path(remmina_icon.
icon, REMMINA_RUNTIME_DATADIR G_DIR_SEPARATOR_S
"icons");
474 app_indicator_set_status(remmina_icon.
icon, APP_INDICATOR_STATUS_ACTIVE);
475 app_indicator_set_title(remmina_icon.
icon,
"Remmina");
478 remmina_icon.
icon = gtk_status_icon_new_from_icon_name(remmina_panel);
480 gtk_status_icon_set_title(remmina_icon.
icon, _(
"Remmina Remote Desktop Client"));
481 gtk_status_icon_set_tooltip_text(remmina_icon.
icon, _(
"Remmina Remote Desktop Client"));
486 }
else if (remmina_icon.
icon) {
487 #ifdef HAVE_LIBAPPINDICATOR 489 APP_INDICATOR_STATUS_PASSIVE : APP_INDICATOR_STATUS_ACTIVE);
491 app_indicator_set_icon(remmina_icon.
icon, remmina_panel);
497 if (!remmina_icon.
avahi) {
500 if (remmina_icon.
avahi) {
509 remmina_icon.
autostart_file = g_strdup_printf(
"%s/.config/autostart/remmina-applet.desktop", g_get_home_dir());
516 TRACE_CALL(__func__);
520 gkeyfile = g_key_file_new();
521 g_key_file_load_from_file(gkeyfile, remmina_icon.
autostart_file, G_KEY_FILE_NONE, NULL);
522 b = !g_key_file_get_boolean(gkeyfile,
"Desktop Entry",
"Hidden", NULL);
523 g_key_file_free(gkeyfile);
529 TRACE_CALL(__func__);
533 gkeyfile = g_key_file_new();
534 g_key_file_load_from_file(gkeyfile, remmina_icon.
autostart_file, G_KEY_FILE_NONE, NULL);
535 b = !g_key_file_get_boolean(gkeyfile,
"Desktop Entry",
"Hidden", NULL);
536 if (b != autostart) {
537 g_key_file_set_boolean(gkeyfile,
"Desktop Entry",
"Hidden", !autostart);
539 g_key_file_set_string(gkeyfile,
"Desktop Entry",
"Name", _(
"Remmina Applet"));
540 g_key_file_set_string(gkeyfile,
"Desktop Entry",
"Comment",
541 _(
"Connect to remote desktops through the applet menu"));
544 g_key_file_free(gkeyfile);
static void remmina_icon_main(void)
RemminaAvahi * remmina_avahi_new(void)
static void remmina_icon_preferences(void)
static void remmina_icon_on_launch_item(RemminaAppletMenu *menu, RemminaAppletMenuItem *menuitem, gpointer data)
void remmina_icon_populate_menu(void)
gboolean remmina_icon_is_available(void)
Determine whenever the Remmina icon is available.
gboolean disable_tray_icon
void remmina_icon_init(void)
void remmina_icon_destroy(void)
static void remmina_icon_on_popup_menu(GtkStatusIcon *icon, guint button, guint activate_time, gpointer user_data)
static void remmina_icon_populate_additional_menu_item(GtkWidget *menu)
static void remmina_icon_enable_avahi(GtkCheckMenuItem *checkmenuitem, gpointer data)
static void remmina_icon_on_edit_item(RemminaAppletMenu *menu, RemminaAppletMenuItem *menuitem, gpointer data)
static RemminaIcon remmina_icon
gchar * remmina_sysinfo_get_gnome_shell_version()
Query DBUS to get gnome shell version.
struct _RemminaIcon RemminaIcon
void remmina_exec_command(RemminaCommandType command, const gchar *data)
void remmina_avahi_stop(RemminaAvahi *ga)
gboolean remmina_icon_is_autostart(void)
static void remmina_icon_populate_extra_menu_item(GtkWidget *menu)
void remmina_exec_exitremmina()
void remmina_avahi_free(RemminaAvahi *ga)
GHashTable * discovered_services
gboolean applet_hide_count
gboolean applet_enable_avahi
void remmina_avahi_start(RemminaAvahi *ga)
static void remmina_icon_on_activate(GtkStatusIcon *icon, gpointer user_data)
static void remmina_icon_popdown_menu(GtkWidget *widget, gpointer data)
gboolean remmina_pref_save(void)
gboolean remmina_sysinfo_is_appindicator_available()
gboolean applet_new_ontop
static void remmina_icon_about(void)
static void remmina_icon_create_autostart_file(void)
void remmina_icon_set_autostart(gboolean autostart)
static void remmina_icon_save_autostart_file(GKeyFile *gkeyfile)