|  | // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "base/nix/xdg_util.h" | 
|  |  | 
|  | #include <string> | 
|  |  | 
|  | #include "base/base_paths.h" | 
|  | #include "base/environment.h" | 
|  | #include "base/files/file_path.h" | 
|  | #include "base/files/file_util.h" | 
|  | #include "base/path_service.h" | 
|  | #include "base/strings/string_util.h" | 
|  | #include "base/third_party/xdg_user_dirs/xdg_user_dir_lookup.h" | 
|  |  | 
|  | namespace { | 
|  |  | 
|  | // The KDE session version environment variable introduced in KDE 4. | 
|  | const char kKDESessionEnvVar[] = "KDE_SESSION_VERSION"; | 
|  |  | 
|  | }  // namespace | 
|  |  | 
|  | namespace base { | 
|  | namespace nix { | 
|  |  | 
|  | const char kDotConfigDir[] = ".config"; | 
|  | const char kXdgConfigHomeEnvVar[] = "XDG_CONFIG_HOME"; | 
|  |  | 
|  | FilePath GetXDGDirectory(Environment* env, const char* env_name, | 
|  | const char* fallback_dir) { | 
|  | FilePath path; | 
|  | std::string env_value; | 
|  | if (env->GetVar(env_name, &env_value) && !env_value.empty()) { | 
|  | path = FilePath(env_value); | 
|  | } else { | 
|  | PathService::Get(DIR_HOME, &path); | 
|  | path = path.Append(fallback_dir); | 
|  | } | 
|  | return path.StripTrailingSeparators(); | 
|  | } | 
|  |  | 
|  | FilePath GetXDGUserDirectory(const char* dir_name, const char* fallback_dir) { | 
|  | FilePath path; | 
|  | char* xdg_dir = xdg_user_dir_lookup(dir_name); | 
|  | if (xdg_dir) { | 
|  | path = FilePath(xdg_dir); | 
|  | free(xdg_dir); | 
|  | } else { | 
|  | PathService::Get(DIR_HOME, &path); | 
|  | path = path.Append(fallback_dir); | 
|  | } | 
|  | return path.StripTrailingSeparators(); | 
|  | } | 
|  |  | 
|  | DesktopEnvironment GetDesktopEnvironment(Environment* env) { | 
|  | // XDG_CURRENT_DESKTOP is the newest standard circa 2012. | 
|  | std::string xdg_current_desktop; | 
|  | if (env->GetVar("XDG_CURRENT_DESKTOP", &xdg_current_desktop)) { | 
|  | // Not all desktop environments set this env var as of this writing. | 
|  | if (base::StartsWith(xdg_current_desktop, "Unity", | 
|  | base::CompareCase::SENSITIVE)) { | 
|  | // gnome-fallback sessions set XDG_CURRENT_DESKTOP to Unity | 
|  | // DESKTOP_SESSION can be gnome-fallback or gnome-fallback-compiz | 
|  | std::string desktop_session; | 
|  | if (env->GetVar("DESKTOP_SESSION", &desktop_session) && | 
|  | desktop_session.find("gnome-fallback") != std::string::npos) { | 
|  | return DESKTOP_ENVIRONMENT_GNOME; | 
|  | } | 
|  | return DESKTOP_ENVIRONMENT_UNITY; | 
|  | } | 
|  | if (xdg_current_desktop == "GNOME") | 
|  | return DESKTOP_ENVIRONMENT_GNOME; | 
|  | if (xdg_current_desktop == "X-Cinnamon") | 
|  | return DESKTOP_ENVIRONMENT_CINNAMON; | 
|  | if (xdg_current_desktop == "KDE") { | 
|  | std::string kde_session; | 
|  | if (env->GetVar(kKDESessionEnvVar, &kde_session)) { | 
|  | if (kde_session == "5") { | 
|  | return DESKTOP_ENVIRONMENT_KDE5; | 
|  | } | 
|  | } | 
|  | return DESKTOP_ENVIRONMENT_KDE4; | 
|  | } | 
|  | if (xdg_current_desktop == "Pantheon") | 
|  | return DESKTOP_ENVIRONMENT_PANTHEON; | 
|  | } | 
|  |  | 
|  | // DESKTOP_SESSION was what everyone used in 2010. | 
|  | std::string desktop_session; | 
|  | if (env->GetVar("DESKTOP_SESSION", &desktop_session)) { | 
|  | if (desktop_session == "gnome" || desktop_session == "mate") | 
|  | return DESKTOP_ENVIRONMENT_GNOME; | 
|  | if (desktop_session == "kde4" || desktop_session == "kde-plasma") | 
|  | return DESKTOP_ENVIRONMENT_KDE4; | 
|  | if (desktop_session == "kde") { | 
|  | // This may mean KDE4 on newer systems, so we have to check. | 
|  | if (env->HasVar(kKDESessionEnvVar)) | 
|  | return DESKTOP_ENVIRONMENT_KDE4; | 
|  | return DESKTOP_ENVIRONMENT_KDE3; | 
|  | } | 
|  | if (desktop_session.find("xfce") != std::string::npos || | 
|  | desktop_session == "xubuntu") { | 
|  | return DESKTOP_ENVIRONMENT_XFCE; | 
|  | } | 
|  | } | 
|  |  | 
|  | // Fall back on some older environment variables. | 
|  | // Useful particularly in the DESKTOP_SESSION=default case. | 
|  | if (env->HasVar("GNOME_DESKTOP_SESSION_ID")) | 
|  | return DESKTOP_ENVIRONMENT_GNOME; | 
|  | if (env->HasVar("KDE_FULL_SESSION")) { | 
|  | if (env->HasVar(kKDESessionEnvVar)) | 
|  | return DESKTOP_ENVIRONMENT_KDE4; | 
|  | return DESKTOP_ENVIRONMENT_KDE3; | 
|  | } | 
|  |  | 
|  | return DESKTOP_ENVIRONMENT_OTHER; | 
|  | } | 
|  |  | 
|  | const char* GetDesktopEnvironmentName(DesktopEnvironment env) { | 
|  | switch (env) { | 
|  | case DESKTOP_ENVIRONMENT_OTHER: | 
|  | return nullptr; | 
|  | case DESKTOP_ENVIRONMENT_CINNAMON: | 
|  | return "CINNAMON"; | 
|  | case DESKTOP_ENVIRONMENT_GNOME: | 
|  | return "GNOME"; | 
|  | case DESKTOP_ENVIRONMENT_KDE3: | 
|  | return "KDE3"; | 
|  | case DESKTOP_ENVIRONMENT_KDE4: | 
|  | return "KDE4"; | 
|  | case DESKTOP_ENVIRONMENT_KDE5: | 
|  | return "KDE5"; | 
|  | case DESKTOP_ENVIRONMENT_PANTHEON: | 
|  | return "PANTHEON"; | 
|  | case DESKTOP_ENVIRONMENT_UNITY: | 
|  | return "UNITY"; | 
|  | case DESKTOP_ENVIRONMENT_XFCE: | 
|  | return "XFCE"; | 
|  | } | 
|  | return nullptr; | 
|  | } | 
|  |  | 
|  | const char* GetDesktopEnvironmentName(Environment* env) { | 
|  | return GetDesktopEnvironmentName(GetDesktopEnvironment(env)); | 
|  | } | 
|  |  | 
|  | }  // namespace nix | 
|  | }  // namespace base |