summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRui Matos <tiagomatos@gmail.com>2017-08-29 17:52:52 +0200
committerRui Matos <tiagomatos@gmail.com>2017-08-29 19:26:58 +0200
commitf959b9127b1ac7889bd528c69b1f1663554fd8c3 (patch)
tree00b44bf85fa8fe7414fafcfd5cf753ef24335a93
parent58bad723ee1979870034b73a754f1328bc598ab9 (diff)
downloadgnome-control-center-f959b9127b1ac7889bd528c69b1f1663554fd8c3.tar.gz
sharing: Make panel initialization asynchronous
https://bugzilla.gnome.org/show_bug.cgi?id=786984
-rw-r--r--panels/sharing/cc-sharing-panel.c163
1 files changed, 88 insertions, 75 deletions
diff --git a/panels/sharing/cc-sharing-panel.c b/panels/sharing/cc-sharing-panel.c
index 8b6e77616..2fb8796ef 100644
--- a/panels/sharing/cc-sharing-panel.c
+++ b/panels/sharing/cc-sharing-panel.c
@@ -74,6 +74,7 @@ struct _CcSharingPanelPrivate
GtkWidget *master_switch;
GtkWidget *hostname_entry;
+ GCancellable *sharing_proxy_cancellable;
GDBusProxy *sharing_proxy;
GtkWidget *media_sharing_switch;
@@ -88,6 +89,7 @@ struct _CcSharingPanelPrivate
GtkWidget *screen_sharing_dialog;
GDBusProxy *rfkill;
+ guint remote_desktop_name_watch;
};
#define OFF_IF_VISIBLE(x) { if (gtk_widget_is_visible(x) && gtk_widget_is_sensitive(x)) gtk_switch_set_active (GTK_SWITCH(x), FALSE); }
@@ -132,6 +134,10 @@ cc_sharing_panel_dispose (GObject *object)
{
CcSharingPanelPrivate *priv = CC_SHARING_PANEL (object)->priv;
+ if (priv->remote_desktop_name_watch)
+ g_bus_unwatch_name (priv->remote_desktop_name_watch);
+ priv->remote_desktop_name_watch = 0;
+
g_clear_object (&priv->rfkill);
g_clear_object (&priv->builder);
@@ -171,6 +177,8 @@ cc_sharing_panel_dispose (GObject *object)
priv->screen_sharing_dialog = NULL;
}
+ g_cancellable_cancel (priv->sharing_proxy_cancellable);
+ g_clear_object (&priv->sharing_proxy_cancellable);
g_clear_object (&priv->sharing_proxy);
G_OBJECT_CLASS (cc_sharing_panel_parent_class)->dispose (object);
@@ -1080,52 +1088,88 @@ cc_sharing_panel_setup_screen_sharing_dialog_gnome_remote_desktop (CcSharingPane
cc_sharing_panel_bind_networks_to_label (self, networks,
WID ("screen-sharing-status-label"));
+}
- gtk_widget_hide (WID ("remote-control-box"));
+static void
+remote_desktop_name_appeared (GDBusConnection *connection,
+ const gchar *name,
+ const gchar *name_owner,
+ gpointer user_data)
+{
+ CcSharingPanel *self = CC_SHARING_PANEL (user_data);
+ CcSharingPanelPrivate *priv = self->priv;
+
+ g_bus_unwatch_name (priv->remote_desktop_name_watch);
+ priv->remote_desktop_name_watch = 0;
+
+ cc_sharing_panel_setup_screen_sharing_dialog_gnome_remote_desktop (self);
+ gtk_widget_show (WID ("screen-sharing-button"));
}
-static gboolean
-is_remote_desktop_available (CcSharingPanel *self)
+static void
+check_remote_desktop_available (CcSharingPanel *self)
{
- GError *error = NULL;
- g_autoptr (GDBusProxy) proxy = NULL;
- g_autoptr (GVariant) v = NULL;
- gboolean has_owner;
+ CcSharingPanelPrivate *priv = self->priv;
if (!cc_sharing_panel_check_schema_available (self, GNOME_REMOTE_DESKTOP_SCHEMA_ID))
- return FALSE;
+ return;
- proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
- G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START,
- NULL,
- "org.freedesktop.DBus",
- "/",
- "org.freedesktop.DBus",
- NULL,
- &error);
- if (!proxy)
- {
- g_error_free (error);
- return FALSE;
- }
+ priv->remote_desktop_name_watch = g_bus_watch_name (G_BUS_TYPE_SESSION,
+ "org.gnome.Mutter.RemoteDesktop",
+ G_BUS_NAME_WATCHER_FLAGS_NONE,
+ remote_desktop_name_appeared,
+ NULL,
+ self,
+ NULL);
+}
- v = g_dbus_proxy_call_sync (proxy,
- "org.freedesktop.DBus.NameHasOwner",
- g_variant_new ("(s)",
- "org.gnome.Mutter.RemoteDesktop"),
- G_DBUS_CALL_FLAGS_NONE,
- -1,
- NULL,
- &error);
- if (!v)
- {
- g_error_free (error);
- return FALSE;
- }
+static void
+sharing_proxy_ready (GObject *source,
+ GAsyncResult *res,
+ gpointer user_data)
+{
+ CcSharingPanel *self;
+ CcSharingPanelPrivate *priv;
+ GDBusProxy *proxy;
+ GError *error = NULL;
+
+ proxy = G_DBUS_PROXY (gsd_sharing_proxy_new_for_bus_finish (res, &error));
+ if (!proxy) {
+ if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+ g_warning ("Failed to get sharing proxy: %s", error->message);
+ g_error_free (error);
+ return;
+ }
- g_variant_get (v, "(b)", &has_owner);
+ self = CC_SHARING_PANEL (user_data);
+ priv = self->priv;
+ priv->sharing_proxy = proxy;
+
+ /* media sharing */
+ cc_sharing_panel_setup_media_sharing_dialog (self);
+
+ /* personal file sharing */
+ if (cc_sharing_panel_check_schema_available (self, FILE_SHARING_SCHEMA_ID))
+ cc_sharing_panel_setup_personal_file_sharing_dialog (self);
+ else
+ gtk_widget_hide (WID ("personal-file-sharing-button"));
+
+ /* remote login */
+ cc_sharing_panel_setup_remote_login_dialog (self);
- return has_owner;
+ /* screen sharing */
+#ifdef GDK_WINDOWING_WAYLAND
+ if (GDK_IS_WAYLAND_DISPLAY (gdk_display_get_default ()))
+ {
+ check_remote_desktop_available (self);
+ gtk_widget_hide (WID ("screen-sharing-button"));
+ }
+ else
+#endif
+ if (cc_sharing_panel_check_schema_available (self, VINO_SCHEMA_ID))
+ cc_sharing_panel_setup_screen_sharing_dialog_vino (self);
+ else
+ gtk_widget_hide (WID ("screen-sharing-button"));
}
static void
@@ -1141,7 +1185,6 @@ cc_sharing_panel_init (CcSharingPanel *self)
"remote-login-dialog",
"screen-sharing-dialog",
NULL };
- GError *error = NULL;
g_resources_register (cc_sharing_get_resource ());
@@ -1199,44 +1242,14 @@ cc_sharing_panel_init (CcSharingPanel *self)
g_signal_connect (priv->master_switch, "notify::active",
G_CALLBACK (cc_sharing_panel_master_switch_notify), self);
- self->priv->sharing_proxy = G_DBUS_PROXY (gsd_sharing_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
- G_DBUS_PROXY_FLAGS_NONE,
- "org.gnome.SettingsDaemon.Sharing",
- "/org/gnome/SettingsDaemon/Sharing",
- NULL,
- &error));
- if (!self->priv->sharing_proxy) {
- g_warning ("Failed to get sharing proxy: %s", error->message);
- g_error_free (error);
- }
-
- /* media sharing */
- cc_sharing_panel_setup_media_sharing_dialog (self);
-
- /* personal file sharing */
- if (cc_sharing_panel_check_schema_available (self, FILE_SHARING_SCHEMA_ID))
- cc_sharing_panel_setup_personal_file_sharing_dialog (self);
- else
- gtk_widget_hide (WID ("personal-file-sharing-button"));
-
- /* remote login */
- cc_sharing_panel_setup_remote_login_dialog (self);
-
- /* screen sharing */
-#ifdef GDK_WINDOWING_WAYLAND
- if (GDK_IS_WAYLAND_DISPLAY (gdk_display_get_default ()))
- {
- if (is_remote_desktop_available (self))
- cc_sharing_panel_setup_screen_sharing_dialog_gnome_remote_desktop (self);
- else
- gtk_widget_hide (WID ("screen-sharing-button"));
- }
- else
-#endif
- if (cc_sharing_panel_check_schema_available (self, VINO_SCHEMA_ID))
- cc_sharing_panel_setup_screen_sharing_dialog_vino (self);
- else
- gtk_widget_hide (WID ("screen-sharing-button"));
+ priv->sharing_proxy_cancellable = g_cancellable_new ();
+ gsd_sharing_proxy_new_for_bus (G_BUS_TYPE_SESSION,
+ G_DBUS_PROXY_FLAGS_NONE,
+ "org.gnome.SettingsDaemon.Sharing",
+ "/org/gnome/SettingsDaemon/Sharing",
+ priv->sharing_proxy_cancellable,
+ sharing_proxy_ready,
+ self);
/* make sure the hostname entry isn't focused by default */
g_signal_connect_swapped (self, "map", G_CALLBACK (gtk_widget_grab_focus),