xdg_util.cc 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  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. #include "base/nix/xdg_util.h"
  5. #include <string>
  6. #include "base/base_paths.h"
  7. #include "base/environment.h"
  8. #include "base/files/file_path.h"
  9. #include "base/files/file_util.h"
  10. #include "base/path_service.h"
  11. #include "base/strings/string_split.h"
  12. #include "base/strings/string_util.h"
  13. #include "base/third_party/xdg_user_dirs/xdg_user_dir_lookup.h"
  14. namespace {
  15. // The KDE session version environment variable introduced in KDE 4.
  16. const char kKDESessionEnvVar[] = "KDE_SESSION_VERSION";
  17. } // namespace
  18. namespace base {
  19. namespace nix {
  20. const char kDotConfigDir[] = ".config";
  21. const char kXdgConfigHomeEnvVar[] = "XDG_CONFIG_HOME";
  22. const char kXdgCurrentDesktopEnvVar[] = "XDG_CURRENT_DESKTOP";
  23. const char kXdgSessionTypeEnvVar[] = "XDG_SESSION_TYPE";
  24. FilePath GetXDGDirectory(Environment* env, const char* env_name,
  25. const char* fallback_dir) {
  26. FilePath path;
  27. std::string env_value;
  28. if (env->GetVar(env_name, &env_value) && !env_value.empty()) {
  29. path = FilePath(env_value);
  30. } else {
  31. PathService::Get(DIR_HOME, &path);
  32. path = path.Append(fallback_dir);
  33. }
  34. return path.StripTrailingSeparators();
  35. }
  36. FilePath GetXDGUserDirectory(const char* dir_name, const char* fallback_dir) {
  37. FilePath path;
  38. char* xdg_dir = xdg_user_dir_lookup(dir_name);
  39. if (xdg_dir) {
  40. path = FilePath(xdg_dir);
  41. free(xdg_dir);
  42. } else {
  43. PathService::Get(DIR_HOME, &path);
  44. path = path.Append(fallback_dir);
  45. }
  46. return path.StripTrailingSeparators();
  47. }
  48. DesktopEnvironment GetDesktopEnvironment(Environment* env) {
  49. // kXdgCurrentDesktopEnvVar is the newest standard circa 2012.
  50. std::string xdg_current_desktop;
  51. if (env->GetVar(kXdgCurrentDesktopEnvVar, &xdg_current_desktop)) {
  52. // It could have multiple values separated by colon in priority order.
  53. for (const auto& value : SplitStringPiece(
  54. xdg_current_desktop, ":", TRIM_WHITESPACE, SPLIT_WANT_NONEMPTY)) {
  55. if (value == "Unity") {
  56. // gnome-fallback sessions set kXdgCurrentDesktopEnvVar to Unity
  57. // DESKTOP_SESSION can be gnome-fallback or gnome-fallback-compiz
  58. std::string desktop_session;
  59. if (env->GetVar("DESKTOP_SESSION", &desktop_session) &&
  60. desktop_session.find("gnome-fallback") != std::string::npos) {
  61. return DESKTOP_ENVIRONMENT_GNOME;
  62. }
  63. return DESKTOP_ENVIRONMENT_UNITY;
  64. }
  65. if (value == "Deepin")
  66. return DESKTOP_ENVIRONMENT_DEEPIN;
  67. if (value == "GNOME")
  68. return DESKTOP_ENVIRONMENT_GNOME;
  69. if (value == "X-Cinnamon")
  70. return DESKTOP_ENVIRONMENT_CINNAMON;
  71. if (value == "KDE") {
  72. std::string kde_session;
  73. if (env->GetVar(kKDESessionEnvVar, &kde_session)) {
  74. if (kde_session == "5") {
  75. return DESKTOP_ENVIRONMENT_KDE5;
  76. }
  77. }
  78. return DESKTOP_ENVIRONMENT_KDE4;
  79. }
  80. if (value == "Pantheon")
  81. return DESKTOP_ENVIRONMENT_PANTHEON;
  82. if (value == "XFCE")
  83. return DESKTOP_ENVIRONMENT_XFCE;
  84. if (value == "UKUI")
  85. return DESKTOP_ENVIRONMENT_UKUI;
  86. }
  87. }
  88. // DESKTOP_SESSION was what everyone used in 2010.
  89. std::string desktop_session;
  90. if (env->GetVar("DESKTOP_SESSION", &desktop_session)) {
  91. if (desktop_session == "deepin")
  92. return DESKTOP_ENVIRONMENT_DEEPIN;
  93. if (desktop_session == "gnome" || desktop_session == "mate")
  94. return DESKTOP_ENVIRONMENT_GNOME;
  95. if (desktop_session == "kde4" || desktop_session == "kde-plasma")
  96. return DESKTOP_ENVIRONMENT_KDE4;
  97. if (desktop_session == "kde") {
  98. // This may mean KDE4 on newer systems, so we have to check.
  99. if (env->HasVar(kKDESessionEnvVar))
  100. return DESKTOP_ENVIRONMENT_KDE4;
  101. return DESKTOP_ENVIRONMENT_KDE3;
  102. }
  103. if (desktop_session.find("xfce") != std::string::npos ||
  104. desktop_session == "xubuntu") {
  105. return DESKTOP_ENVIRONMENT_XFCE;
  106. }
  107. if (desktop_session == "ukui")
  108. return DESKTOP_ENVIRONMENT_UKUI;
  109. }
  110. // Fall back on some older environment variables.
  111. // Useful particularly in the DESKTOP_SESSION=default case.
  112. if (env->HasVar("GNOME_DESKTOP_SESSION_ID"))
  113. return DESKTOP_ENVIRONMENT_GNOME;
  114. if (env->HasVar("KDE_FULL_SESSION")) {
  115. if (env->HasVar(kKDESessionEnvVar))
  116. return DESKTOP_ENVIRONMENT_KDE4;
  117. return DESKTOP_ENVIRONMENT_KDE3;
  118. }
  119. return DESKTOP_ENVIRONMENT_OTHER;
  120. }
  121. const char* GetDesktopEnvironmentName(DesktopEnvironment env) {
  122. switch (env) {
  123. case DESKTOP_ENVIRONMENT_OTHER:
  124. return nullptr;
  125. case DESKTOP_ENVIRONMENT_CINNAMON:
  126. return "CINNAMON";
  127. case DESKTOP_ENVIRONMENT_DEEPIN:
  128. return "DEEPIN";
  129. case DESKTOP_ENVIRONMENT_GNOME:
  130. return "GNOME";
  131. case DESKTOP_ENVIRONMENT_KDE3:
  132. return "KDE3";
  133. case DESKTOP_ENVIRONMENT_KDE4:
  134. return "KDE4";
  135. case DESKTOP_ENVIRONMENT_KDE5:
  136. return "KDE5";
  137. case DESKTOP_ENVIRONMENT_PANTHEON:
  138. return "PANTHEON";
  139. case DESKTOP_ENVIRONMENT_UNITY:
  140. return "UNITY";
  141. case DESKTOP_ENVIRONMENT_XFCE:
  142. return "XFCE";
  143. case DESKTOP_ENVIRONMENT_UKUI:
  144. return "UKUI";
  145. }
  146. return nullptr;
  147. }
  148. const char* GetDesktopEnvironmentName(Environment* env) {
  149. return GetDesktopEnvironmentName(GetDesktopEnvironment(env));
  150. }
  151. } // namespace nix
  152. } // namespace base