123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 |
- // 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_split.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";
- const char kXdgCurrentDesktopEnvVar[] = "XDG_CURRENT_DESKTOP";
- const char kXdgSessionTypeEnvVar[] = "XDG_SESSION_TYPE";
- 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) {
- // kXdgCurrentDesktopEnvVar is the newest standard circa 2012.
- std::string xdg_current_desktop;
- if (env->GetVar(kXdgCurrentDesktopEnvVar, &xdg_current_desktop)) {
- // It could have multiple values separated by colon in priority order.
- for (const auto& value : SplitStringPiece(
- xdg_current_desktop, ":", TRIM_WHITESPACE, SPLIT_WANT_NONEMPTY)) {
- if (value == "Unity") {
- // gnome-fallback sessions set kXdgCurrentDesktopEnvVar 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 (value == "Deepin")
- return DESKTOP_ENVIRONMENT_DEEPIN;
- if (value == "GNOME")
- return DESKTOP_ENVIRONMENT_GNOME;
- if (value == "X-Cinnamon")
- return DESKTOP_ENVIRONMENT_CINNAMON;
- if (value == "KDE") {
- std::string kde_session;
- if (env->GetVar(kKDESessionEnvVar, &kde_session)) {
- if (kde_session == "5") {
- return DESKTOP_ENVIRONMENT_KDE5;
- }
- }
- return DESKTOP_ENVIRONMENT_KDE4;
- }
- if (value == "Pantheon")
- return DESKTOP_ENVIRONMENT_PANTHEON;
- if (value == "XFCE")
- return DESKTOP_ENVIRONMENT_XFCE;
- if (value == "UKUI")
- return DESKTOP_ENVIRONMENT_UKUI;
- }
- }
- // DESKTOP_SESSION was what everyone used in 2010.
- std::string desktop_session;
- if (env->GetVar("DESKTOP_SESSION", &desktop_session)) {
- if (desktop_session == "deepin")
- return DESKTOP_ENVIRONMENT_DEEPIN;
- 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;
- }
- if (desktop_session == "ukui")
- return DESKTOP_ENVIRONMENT_UKUI;
- }
- // 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_DEEPIN:
- return "DEEPIN";
- 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";
- case DESKTOP_ENVIRONMENT_UKUI:
- return "UKUI";
- }
- return nullptr;
- }
- const char* GetDesktopEnvironmentName(Environment* env) {
- return GetDesktopEnvironmentName(GetDesktopEnvironment(env));
- }
- } // namespace nix
- } // namespace base
|