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



commit 6baf9f02593c36ef27f9a1520bdd89594c322e74
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 7ee01cf..f7a8cf7 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;
@@ -203,15 +204,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) {
@@ -239,14 +237,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();
         }));
     },
 
@@ -292,6 +303,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]