Browse Source

linux: Implement platform_util.

Cheng Zhao 11 years ago
parent
commit
f24ccd3841
2 changed files with 81 additions and 0 deletions
  1. 1 0
      atom.gyp
  2. 80 0
      common/platform_util_linux.cc

+ 1 - 0
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',

+ 80 - 0
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 <stdio.h>
+
+#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<std::string> 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