1561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes// Use of this source code is governed by a BSD-style license that can be 3561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes// found in the LICENSE file. 4561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 5561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes#include "base/nix/xdg_util.h" 6561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 7561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes#include <string> 8561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 9561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes#include "base/base_paths.h" 10561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes#include "base/environment.h" 11561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes#include "base/files/file_path.h" 12561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes#include "base/files/file_util.h" 13561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes#include "base/path_service.h" 14561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes#include "base/third_party/xdg_user_dirs/xdg_user_dir_lookup.h" 15561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 16561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesnamespace { 17561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 18561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes// The KDE session version environment variable used in KDE 4. 198d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamathconst char kKDE4SessionEnvVar[] = "KDE_SESSION_VERSION"; 208d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath 21561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes} // namespace 22561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 23561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesnamespace base { 24561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesnamespace nix { 25561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 26561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesconst char kDotConfigDir[] = ".config"; 27561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesconst char kXdgConfigHomeEnvVar[] = "XDG_CONFIG_HOME"; 28561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 29561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott HughesFilePath GetXDGDirectory(Environment* env, const char* env_name, 30561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes const char* fallback_dir) { 31561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes FilePath path; 32561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes std::string env_value; 33561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (env->GetVar(env_name, &env_value) && !env_value.empty()) { 34561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes path = FilePath(env_value); 358d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } else { 36561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes PathService::Get(base::DIR_HOME, &path); 37561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes path = path.Append(fallback_dir); 38561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 39561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes return path.StripTrailingSeparators(); 40561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes} 41561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 42561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott HughesFilePath GetXDGUserDirectory(const char* dir_name, const char* fallback_dir) { 43561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes FilePath path; 44561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes char* xdg_dir = xdg_user_dir_lookup(dir_name); 45561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (xdg_dir) { 46561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes path = FilePath(xdg_dir); 47561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes free(xdg_dir); 48561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } else { 49561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes PathService::Get(base::DIR_HOME, &path); 508d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath path = path.Append(fallback_dir); 51561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 52561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes return path.StripTrailingSeparators(); 53561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes} 54561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 55561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott HughesDesktopEnvironment GetDesktopEnvironment(Environment* env) { 56561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // XDG_CURRENT_DESKTOP is the newest standard circa 2012. 57561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes std::string xdg_current_desktop; 58561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (env->GetVar("XDG_CURRENT_DESKTOP", &xdg_current_desktop)) { 59561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // Not all desktop environments set this env var as of this writing. 60561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (xdg_current_desktop == "Unity") { 61561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // gnome-fallback sessions set XDG_CURRENT_DESKTOP to Unity 62561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // DESKTOP_SESSION can be gnome-fallback or gnome-fallback-compiz 63561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes std::string desktop_session; 64561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (env->GetVar("DESKTOP_SESSION", &desktop_session) && 65561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes desktop_session.find("gnome-fallback") != std::string::npos) { 66561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes return DESKTOP_ENVIRONMENT_GNOME; 67561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 68561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes return DESKTOP_ENVIRONMENT_UNITY; 69561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } else if (xdg_current_desktop == "GNOME") { 70561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes return DESKTOP_ENVIRONMENT_GNOME; 71561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 72561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 73561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 74561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // DESKTOP_SESSION was what everyone used in 2010. 75561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes std::string desktop_session; 76561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (env->GetVar("DESKTOP_SESSION", &desktop_session)) { 77561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (desktop_session == "gnome") { 78561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes return DESKTOP_ENVIRONMENT_GNOME; 79561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } else if (desktop_session == "kde4") { 808d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath return DESKTOP_ENVIRONMENT_KDE4; 81561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } else if (desktop_session == "kde") { 82561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // This may mean KDE4 on newer systems, so we have to check. 83561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (env->HasVar(kKDE4SessionEnvVar)) 84561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes return DESKTOP_ENVIRONMENT_KDE4; 85561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes return DESKTOP_ENVIRONMENT_KDE3; 86561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } else if (desktop_session.find("xfce") != std::string::npos || 87561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes desktop_session == "xubuntu") { 88561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes return DESKTOP_ENVIRONMENT_XFCE; 89561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 90561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 91561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 92561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // Fall back on some older environment variables. 93561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // Useful particularly in the DESKTOP_SESSION=default case. 94561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (env->HasVar("GNOME_DESKTOP_SESSION_ID")) { 95561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes return DESKTOP_ENVIRONMENT_GNOME; 968d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } else if (env->HasVar("KDE_FULL_SESSION")) { 97561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (env->HasVar(kKDE4SessionEnvVar)) 98561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes return DESKTOP_ENVIRONMENT_KDE4; 99561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes return DESKTOP_ENVIRONMENT_KDE3; 1008d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 101561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 102561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes return DESKTOP_ENVIRONMENT_OTHER; 1038d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath} 104561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 1058d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamathconst char* GetDesktopEnvironmentName(DesktopEnvironment env) { 106561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes switch (env) { 107561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes case DESKTOP_ENVIRONMENT_OTHER: 1088d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath return NULL; 109561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes case DESKTOP_ENVIRONMENT_GNOME: 1108d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath return "GNOME"; 111561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes case DESKTOP_ENVIRONMENT_KDE3: 112561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes return "KDE3"; 1138d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath case DESKTOP_ENVIRONMENT_KDE4: 114561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes return "KDE4"; 1158d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath case DESKTOP_ENVIRONMENT_UNITY: 116561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes return "UNITY"; 117561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes case DESKTOP_ENVIRONMENT_XFCE: 118561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes return "XFCE"; 119561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 1208d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath return NULL; 121561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes} 1228d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath 1238d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamathconst char* GetDesktopEnvironmentName(Environment* env) { 1248d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath return GetDesktopEnvironmentName(GetDesktopEnvironment(env)); 125561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes} 1268d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath 1278d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath} // namespace nix 1288d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath} // namespace base 129561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes