[gnome-shell] Calendar: don't initialize the event source synchronously



commit 0aa26e91341b667ce23fadce033a4ac4ef0053bc
Author: Giovanni Campagna <gcampagna src gnome org>
Date:   Sun Feb 17 15:52:53 2013 +0100

    Calendar: don't initialize the event source synchronously
    
    We don't want to block the shell start to load evolution-data-server
    and open all calendars (which can involve network connections)
    
    https://bugzilla.gnome.org/show_bug.cgi?id=694030

 js/ui/calendar.js |   45 ++++++++++++++++++++++++++++++---------------
 1 files changed, 30 insertions(+), 15 deletions(-)
---
diff --git a/js/ui/calendar.js b/js/ui/calendar.js
index 313171d..5effe26 100644
--- a/js/ui/calendar.js
+++ b/js/ui/calendar.js
@@ -2,6 +2,7 @@
 
 const Clutter = imports.gi.Clutter;
 const Gio = imports.gi.Gio;
+const GLib = imports.gi.GLib;
 const Lang = imports.lang;
 const St = imports.gi.St;
 const Signals = imports.signals;
@@ -196,15 +197,12 @@ const CalendarServerIface = <interface name="org.gnome.Shell.CalendarServer">
 const CalendarServerInfo  = Gio.DBusInterfaceInfo.new_for_xml(CalendarServerIface);
 
 function CalendarServer() {
-    var self = new Gio.DBusProxy({ g_connection: Gio.DBus.session,
-                                   g_interface_name: CalendarServerInfo.name,
-                                   g_interface_info: CalendarServerInfo,
-                                   g_name: 'org.gnome.Shell.CalendarServer',
-                                   g_object_path: '/org/gnome/Shell/CalendarServer',
-                                   g_flags: Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES });
-
-    self.init(null);
-    return self;
+    return new Gio.DBusProxy({ g_connection: Gio.DBus.session,
+                               g_interface_name: CalendarServerInfo.name,
+                               g_interface_info: CalendarServerInfo,
+                               g_name: 'org.gnome.Shell.CalendarServer',
+                               g_object_path: '/org/gnome/Shell/CalendarServer',
+                               g_flags: Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES });
 }
 
 function _datesEqual(a, b) {
@@ -232,14 +230,27 @@ const DBusEventSource = new Lang.Class({
     _init: function() {
         this._resetCache();
 
+        this._initialized = false;
         this._dbusProxy = new CalendarServer();
-        this._dbusProxy.connectSignal('Changed', Lang.bind(this, this._onChanged));
+        this._dbusProxy.init_async(GLib.PRIORITY_DEFAULT, null, Lang.bind(this, function(object, result) {
+            try {
+                this._dbusProxy.init_finish(result);
+            } catch(e) {
+                log('Error loading calendars: ' + e.message);
+                return;
+            }
 
-        this._dbusProxy.connect('notify::g-name-owner', Lang.bind(this, function() {
-            if (this._dbusProxy.g_name_owner)
-                this._onNameAppeared();
-            else
-                this._onNameVanished();
+            this._dbusProxy.connectSignal('Changed', Lang.bind(this, this._onChanged));
+
+            this._dbusProxy.connect('notify::g-name-owner', Lang.bind(this, function() {
+                if (this._dbusProxy.g_name_owner)
+                    this._onNameAppeared();
+                else
+                    this._onNameVanished();
+            }));
+
+            this._initialized = true;
+            this._onNameAppeared();
         }));
     },
 
@@ -286,6 +297,10 @@ const DBusEventSource = new Lang.Class({
     },
 
     _loadEvents: function(forceReload) {
+        // Ignore while loading
+        if (!this._initialized)
+            return;
+
         if (this._curRequestBegin && this._curRequestEnd){
             let callFlags = Gio.DBusCallFlags.NO_AUTO_START;
             if (forceReload)


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]