1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "chrome/browser/printing/printer_manager_dialog.h" 6 7 #include "base/bind.h" 8 #include "base/environment.h" 9 #include "base/memory/scoped_ptr.h" 10 #include "base/message_loop/message_loop.h" 11 #include "base/nix/xdg_util.h" 12 #include "base/process/kill.h" 13 #include "base/process/launch.h" 14 #include "content/public/browser/browser_thread.h" 15 16 using base::Environment; 17 using content::BrowserThread; 18 19 namespace { 20 21 // KDE printer config command ("system-config-printer-kde") causes the 22 // OptionWidget to crash (https://bugs.kde.org/show_bug.cgi?id=271957). 23 // Therefore, use GNOME printer config command for KDE. 24 const char kGNOMEPrinterConfigCommand[] = "system-config-printer"; 25 26 // Detect the command based on the deskop environment and open the printer 27 // manager dialog. 28 void DetectAndOpenPrinterConfigDialog() { 29 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); 30 scoped_ptr<Environment> env(Environment::Create()); 31 32 const char* command = NULL; 33 switch (base::nix::GetDesktopEnvironment(env.get())) { 34 case base::nix::DESKTOP_ENVIRONMENT_GNOME: 35 case base::nix::DESKTOP_ENVIRONMENT_KDE3: 36 case base::nix::DESKTOP_ENVIRONMENT_KDE4: 37 case base::nix::DESKTOP_ENVIRONMENT_UNITY: 38 command = kGNOMEPrinterConfigCommand; 39 break; 40 case base::nix::DESKTOP_ENVIRONMENT_XFCE: 41 case base::nix::DESKTOP_ENVIRONMENT_OTHER: 42 break; 43 } 44 45 if (!command) { 46 LOG(ERROR) << "Failed to detect the command to open printer config dialog"; 47 return; 48 } 49 50 std::vector<std::string> argv; 51 argv.push_back(command); 52 base::ProcessHandle handle; 53 if (!base::LaunchProcess(argv, base::LaunchOptions(), &handle)) { 54 LOG(ERROR) << "Failed to open printer manager dialog "; 55 return; 56 } 57 base::EnsureProcessGetsReaped(handle); 58 } 59 60 } // anonymous namespace 61 62 namespace printing { 63 64 void PrinterManagerDialog::ShowPrinterManagerDialog() { 65 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, 66 base::Bind(&DetectAndOpenPrinterConfigDialog)); 67 } 68 69 } // namespace printing 70