diff --git a/atom.gyp b/atom.gyp index 935938f17bb1..0bf9983115c6 100644 --- a/atom.gyp +++ b/atom.gyp @@ -163,6 +163,7 @@ 'common/options_switches.cc', 'common/options_switches.h', 'common/platform_util.h', + 'common/platform_util_linux.cc', 'common/platform_util_mac.mm', 'common/platform_util_win.cc', 'common/swap_or_assign.h', diff --git a/common/platform_util_linux.cc b/common/platform_util_linux.cc new file mode 100644 index 000000000000..d2ac2f88f93a --- /dev/null +++ b/common/platform_util_linux.cc @@ -0,0 +1,80 @@ +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "common/platform_util.h" + +#include + +#include "base/file_util.h" +#include "base/process/kill.h" +#include "base/process/launch.h" +#include "url/gurl.h" + +namespace { + +void XDGUtil(const std::string& util, const std::string& arg) { + std::vector argv; + argv.push_back(util); + argv.push_back(arg); + + base::LaunchOptions options; + // xdg-open can fall back on mailcap which eventually might plumb through + // to a command that needs a terminal. Set the environment variable telling + // it that we definitely don't have a terminal available and that it should + // bring up a new terminal if necessary. See "man mailcap". + options.environ["MM_NOTTTY"] = "1"; + + base::ProcessHandle handle; + if (base::LaunchProcess(argv, options, &handle)) + base::EnsureProcessGetsReaped(handle); +} + +void XDGOpen(const std::string& path) { + XDGUtil("xdg-open", path); +} + +void XDGEmail(const std::string& email) { + XDGUtil("xdg-email", email); +} + +} // namespace + +namespace platform_util { + +// TODO(estade): It would be nice to be able to select the file in the file +// manager, but that probably requires extending xdg-open. For now just +// show the folder. +void ShowItemInFolder(const base::FilePath& full_path) { + base::FilePath dir = full_path.DirName(); + if (!base::DirectoryExists(dir)) + return; + + XDGOpen(dir.value()); +} + +void OpenItem(const base::FilePath& full_path) { + XDGOpen(full_path.value()); +} + +void OpenExternal(const GURL& url) { + if (url.SchemeIs("mailto")) + XDGEmail(url.spec()); + else + XDGOpen(url.spec()); +} + +void MoveItemToTrash(const base::FilePath& full_path) { + XDGUtil("gvfs-trash", full_path.value()); +} + +void Beep() { + // echo '\a' > /dev/console + FILE* console = fopen("/dev/console", "r"); + if (console == NULL) + return; + fprintf(console, "\a"); + fclose(console); +} + +} // namespace platform_util