[gnome-shell] [runDialog] Support opening files and folders



commit 62ca7fb2684e757abaacd3f19c2ff847b017be96
Author: Florian Müllner <fmuellner src gnome org>
Date:   Fri Feb 26 20:07:44 2010 +0100

    [runDialog] Support opening files and folders
    
    Support completion on files and folders in the run dialog and launch
    the default application when activated. Assume a path relative to the
    home directory if execution as command fails and the input doesn't start
    with a slash.
    Removed workaround for relayout of error messages.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=611209

 js/ui/runDialog.js |   51 +++++++++++++++++++++++++++++++++------------------
 1 files changed, 33 insertions(+), 18 deletions(-)
---
diff --git a/js/ui/runDialog.js b/js/ui/runDialog.js
index 11008a7..e1c26eb 100644
--- a/js/ui/runDialog.js
+++ b/js/ui/runDialog.js
@@ -26,6 +26,7 @@ CommandCompleter.prototype = {
     _init : function() {
         this._changedCount = 0;
         this._paths = GLib.getenv('PATH').split(':');
+        this._paths.push(GLib.get_home_dir());
         this._valid = false;
         this._updateInProgress = false;
         this._childs = new Array(this._paths.length);
@@ -300,37 +301,51 @@ RunDialog.prototype = {
         }
     },
 
-    _run : function(command, inTerminal) {
+    _run : function(input, inTerminal) {
+        let command = input;
         this._commandError = false;
         let f;
         if (this._enableInternalCommands)
-            f = this._internalCommands[command];
+            f = this._internalCommands[input];
         else
             f = null;
         if (f) {
             f();
-        } else if (command) {
+        } else if (input) {
             try {
                 if (inTerminal)
-                    command = 'gnome-terminal -x ' + command;
+                    command = 'gnome-terminal -x ' + input;
                 let [ok, len, args] = GLib.shell_parse_argv(command);
                 let p = new Shell.Process({ 'args' : args });
                 p.run();
             } catch (e) {
-                this._commandError = true;
-                /*
-                 * The exception contains an error string like:
-                 * Error invoking Shell.run: Failed to execute child process "foo"
-                 * (No such file or directory)
-                 * We are only interested in the actual error, so parse that out.
-                 */
-                let m = /.+\((.+)\)/.exec(e);
-                let errorStr = _("Execution of '%s' failed:").format(command) + "\n" + m[1];
-                this._errorMessage.set_text(errorStr);
-
-                this._errorBox.show();
-                // preferred_size change. Without this, message will show with delay
-                this._errorBox.get_parent().queue_relayout();
+                // Mmmh, that failed - see if @input matches an existing file
+                let path = null;
+                if (input.charAt(0) == '/') {
+                    path = input;
+                } else {
+                    if (input.charAt(0) == '~')
+                        input = input.slice(1);
+                    path = GLib.get_home_dir() + '/' + input;
+                }
+
+                if (GLib.file_test(path, GLib.FileTest.EXISTS)) {
+                    let file = Gio.file_new_for_path(path);
+                    Gio.app_info_launch_default_for_uri(file.get_uri(),
+                                                        global.create_app_launch_context());
+                } else {
+                    this._commandError = true;
+                    // The exception contains an error string like:
+                    // Error invoking Shell.run: Failed to execute child
+                    // process "foo" (No such file or directory)
+                    // We are only interested in the actual error, so parse
+                    //that out.
+                    let m = /.+\((.+)\)/.exec(e);
+                    let errorStr = _("Execution of '%s' failed:").format(command) + "\n" + m[1];
+                    this._errorMessage.set_text(errorStr);
+
+                    this._errorBox.show();
+                }
             }
         }
     },



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