--- a/common/org.gnome.Vino.gschema.xml +++ b/common/org.gnome.Vino.gschema.xml @@ -1,5 +1,16 @@ + + Enable remote access to the desktop + + If true, allows remote access to the desktop via the RFB + protocol. Users on remote machines may then connect to the + desktop using a VNC viewer. This key will function only + under unity session. + + false + + Prompt the user before completing a connection --- a/server/vino-main.c +++ b/server/vino-main.c @@ -75,15 +75,95 @@ RUN_MODE_EXIT, } RunMode; +static gboolean +in_desktop (const gchar *name) +{ + const gchar *desktop_name_list; + gchar **names; + gboolean in_list = FALSE; + gint i; + + desktop_name_list = g_getenv ("XDG_CURRENT_DESKTOP"); + if (!desktop_name_list) + return FALSE; + + names = g_strsplit (desktop_name_list, ":", -1); + for (i = 0; names[i] && !in_list; i++) + if (strcmp (names[i], name) == 0) { + in_list = TRUE; + break; + } + g_strfreev (names); + + return in_list; +} + static RunMode get_run_mode (VinoApplication *vino) { + #ifdef VINO_HAVE_TELEPATHY_GLIB if (tube) return RUN_MODE_TUBE; #endif - return RUN_MODE_ALL; + if (in_desktop("Unity")) { + if (g_settings_get_boolean (vino->settings, "enabled")) { + return RUN_MODE_ALL; + } + else { + return RUN_MODE_EXIT; + } + } + else { + return RUN_MODE_ALL; + } +} + +static void +set_all_servers_reject(VinoApplication *vino, + gboolean reject) +{ + guint i; + + for (i = 0; i < vino->n_screens; i++) + { + VinoServer *server; + + server = vino_dbus_listener_get_server (vino->listeners[i]); + + vino_server_set_reject_incoming (server, reject); + } +} + +static void +enabled_changed (VinoApplication *vino) +{ + RunMode mode; + gboolean reject; + + mode = get_run_mode (vino); + if (mode == RUN_MODE_EXIT) + { + g_message ("The desktop sharing service has been disabled, exiting."); + g_main_loop_quit (vino->main_loop); + return; + } + + if (mode == RUN_MODE_TUBE) + { + g_message ("The desktop sharing service has been disabled, " + "reject network connections"); + reject = TRUE; + } + else + { + g_message ("The desktop sharing service has been enabled, " + "accept network connections"); + reject = FALSE; + } + + set_all_servers_reject (vino, reject); } #ifdef VINO_HAVE_TELEPATHY_GLIB @@ -202,7 +282,14 @@ vino_server_set_on_hold (server, FALSE); vino_server_set_reject_incoming (server, reject); - vino_mdns_start(vino_server_get_network_interface (server)); + if (in_desktop("Unity")) { + if (g_settings_get_boolean (vino->settings, "enabled")) { + vino_mdns_start(vino_server_get_network_interface (server)); + } + } + else { + vino_mdns_start(vino_server_get_network_interface (server)); + } g_object_unref (server); } @@ -276,6 +363,18 @@ /* GSettings */ vino.settings = g_settings_new ("org.gnome.Vino"); + if (in_desktop("Unity")) { + g_signal_connect_swapped (vino.settings, "changed::enabled", + G_CALLBACK (enabled_changed), &vino); + + if (get_run_mode (&vino) == RUN_MODE_EXIT) + { + g_warning ("The desktop sharing service is not " + "enabled, so it should not be run."); + return 1; + } + } + gtk_window_set_default_icon_name ("preferences-desktop-remote-desktop"); g_set_application_name (_("GNOME Desktop Sharing")); vino.main_loop = g_main_loop_new (NULL, FALSE);