LAview.Desktop/src/Utils.vala

73 lines
2.2 KiB
Vala
Raw Normal View History

2015-12-27 19:06:08 +03:00
namespace LAview.Desktop {
namespace Utils {
using Gtk;
/**
* Resolve a path beginning with "~"
* Look at: https://github.com/ssokolow/gvrun/blob/master/process_runner.vala#L86
*/
#if (linux || UNIX || __unix__)
static string expand_tilde (string path) {
if (!path.has_prefix ("~")) return path; // Just pass paths through if they don't start with ~
// Split the ~user portion from the path (Use / for the path if not present)
string parts[2];
if (!(Path.DIR_SEPARATOR_S in path)) {
parts = { path.substring(1), Path.DIR_SEPARATOR_S };
} else {
string trimmed = path.substring(1);
parts = trimmed.split(Path.DIR_SEPARATOR_S, 2);
}
warn_if_fail(parts.length == 2);
// Handle both "~" and "~user" forms
string home_path;
if (parts[0] == "") {
home_path = Environment.get_variable("HOME") ?? Environment.get_home_dir();
} else {
unowned Posix.Passwd _pw = Posix.getpwnam(parts[0]);
home_path = (_pw == null) ? null : _pw.pw_dir;
}
// Fail safely if we couldn't look up a homedir
if (home_path == null) {
warning("Could not get homedir for user: %s", parts[0].length > 0 ? parts[0] : "<current user>");
return path;
} else {
return home_path + Path.DIR_SEPARATOR_S + parts[1];
}
}
#endif
/**
* Open document.
* Idea borrowed from: https://github.com/ssokolow/gvrun/blob/master/process_runner.vala
*/
void open_document (string path, Window? parent_window = null) {
#if (UNIX)
const string[] OPENERS = {"xdg-open", "mimeopen", "open"};
foreach (var opener in OPENERS) {
if (Environment.find_program_in_path (opener) != null) {
try {
string[] argv = { opener, expand_tilde (path) };
Process.spawn_async(null, argv, null, SpawnFlags.SEARCH_PATH, null, null);
} catch (SpawnError err) {
var msg = new MessageDialog (parent_window, DialogFlags.MODAL, MessageType.ERROR,
ButtonsType.CLOSE, @"Error: $(err.message).");
msg.response.connect ((response_id) => { msg.destroy (); } );
msg.show ();
}
break;
}
}
#elif (WINDOWS)
Posix.system (@"start $path");
#else
assert_not_reached ();
#endif
}
}
}