[gnome-documents/wip/rishi/init-getting-started: 2/7] application: Make window creation complete asynchronously



commit afe89c223d541ddd6b3333edeb3f3a2feb25cad0
Author: Debarshi Ray <debarshir gnome org>
Date:   Thu Dec 7 20:53:10 2017 +0100

    application: Make window creation complete asynchronously
    
    Creating MainWindow starts the TrackerControllers. The getting started
    PDF needs to be located before that happens, to let the
    TrackerControllers include it in their queries. Since, locating the PDF
    is an asynchronous operation, the overall _createWindow method also
    needs to complete asynchronously.
    
    This doesn't make any user-visible changes, but sets the stage for the
    subsequent patches.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=791518

 src/application.js |   78 ++++++++++++++++++++++++++++++++++-----------------
 1 files changed, 52 insertions(+), 26 deletions(-)
---
diff --git a/src/application.js b/src/application.js
index 70dbfca..d1a9572 100644
--- a/src/application.js
+++ b/src/application.js
@@ -420,9 +420,16 @@ var Application = new Lang.Class({
         Utils.populateActionGroup(this, actionEntries, 'app');
     },
 
-    _createWindow: function() {
-        if (this._mainWindow)
+    _createWindow: function(callback) {
+        if (this._mainWindow) {
+            Mainloop.idle_add(Lang.bind(this,
+                function() {
+                    callback();
+                    return GLib.SOURCE_REMOVE;
+                }));
+
             return;
+        }
 
         if (!this.isBooks)
             this._initGettingStarted();
@@ -440,6 +447,20 @@ var Application = new Lang.Class({
 
         // start miners
         this._startMiners();
+
+        Mainloop.idle_add(Lang.bind(this,
+            function() {
+                callback();
+                return GLib.SOURCE_REMOVE;
+            }));
+    },
+
+    _presentWindow: function() {
+        if (!this._mainWindow)
+            throw(new Error('this._mainWindow == null'));
+
+        this._mainWindow.present_with_time(this._activationTimestamp);
+        this._activationTimestamp = Gdk.CURRENT_TIME;
     },
 
     vfunc_dbus_register: function(connection, path) {
@@ -482,12 +503,14 @@ var Application = new Lang.Class({
 
     vfunc_activate: function() {
         if (!this._mainWindow) {
-            this._createWindow();
-            modeController.setWindowMode(WindowMode.WindowMode.DOCUMENTS);
+            this._createWindow(Lang.bind(this,
+                function() {
+                    modeController.setWindowMode(WindowMode.WindowMode.DOCUMENTS);
+                    this._presentWindow();
+                }));
+        } else {
+            this._presentWindow();
         }
-
-        this._mainWindow.present_with_time(this._activationTimestamp);
-        this._activationTimestamp = Gdk.CURRENT_TIME;
     },
 
     _clearState: function() {
@@ -526,21 +549,22 @@ var Application = new Lang.Class({
     },
 
     _onActivateResult: function(provider, urn, terms, timestamp) {
-        this._createWindow();
-
-        let doc = documentManager.getItemById(urn);
-        if (doc) {
-            doActivate.apply(this, [doc]);
-        } else {
-            let job = new TrackerUtils.SingleItemJob(urn, queryBuilder);
-            job.run(Query.QueryFlags.UNFILTERED, Lang.bind(this,
-                function(cursor) {
-                    if (cursor)
-                        doc = documentManager.addDocumentFromCursor(cursor);
-
+        this._createWindow(Lang.bind(this,
+            function() {
+                let doc = documentManager.getItemById(urn);
+                if (doc) {
                     doActivate.apply(this, [doc]);
-                }));
-        }
+                } else {
+                    let job = new TrackerUtils.SingleItemJob(urn, queryBuilder);
+                    job.run(Query.QueryFlags.UNFILTERED, Lang.bind(this,
+                        function(cursor) {
+                            if (cursor)
+                                doc = documentManager.addDocumentFromCursor(cursor);
+
+                            doActivate.apply(this, [doc]);
+                        }));
+                }
+            }));
 
         function doActivate(doc) {
             documentManager.setActiveItem(doc);
@@ -560,12 +584,14 @@ var Application = new Lang.Class({
     },
 
     _onLaunchSearch: function(provider, terms, timestamp) {
-        this._createWindow();
-        modeController.setWindowMode(WindowMode.WindowMode.DOCUMENTS);
-        searchController.setString(terms.join(' '));
+        this._createWindow(Lang.bind(this,
+            function() {
+                modeController.setWindowMode(WindowMode.WindowMode.DOCUMENTS);
+                searchController.setString(terms.join(' '));
 
-        this._activationTimestamp = timestamp;
-        this.activate();
+                this._activationTimestamp = timestamp;
+                this.activate();
+            }));
     },
 
     getScaleFactor: function() {


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