15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/nix/xdg_util.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/environment.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/third_party/xdg_user_dirs/xdg_user_dir_lookup.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The KDE session version environment variable used in KDE 4.
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kKDE4SessionEnvVar[] = "KDE_SESSION_VERSION";
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace nix {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kDotConfigDir[] = ".config";
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kXdgConfigHomeEnvVar[] = "XDG_CONFIG_HOME";
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FilePath GetXDGDirectory(Environment* env, const char* env_name,
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const char* fallback_dir) {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilePath path;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string env_value;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (env->GetVar(env_name, &env_value) && !env_value.empty())
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    path = FilePath(env_value);
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
34a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    path = GetHomeDir().Append(fallback_dir);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return path.StripTrailingSeparators();
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FilePath GetXDGUserDirectory(const char* dir_name, const char* fallback_dir) {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilePath path;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char* xdg_dir = xdg_user_dir_lookup(dir_name);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (xdg_dir) {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    path = FilePath(xdg_dir);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    free(xdg_dir);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
45a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    path = GetHomeDir().Append(fallback_dir);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return path.StripTrailingSeparators();
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DesktopEnvironment GetDesktopEnvironment(Environment* env) {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // XDG_CURRENT_DESKTOP is the newest standard circa 2012.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string xdg_current_desktop;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (env->GetVar("XDG_CURRENT_DESKTOP", &xdg_current_desktop)) {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Not all desktop environments set this env var as of this writing.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xdg_current_desktop == "Unity")
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return DESKTOP_ENVIRONMENT_UNITY;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (xdg_current_desktop == "GNOME")
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return DESKTOP_ENVIRONMENT_GNOME;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // DESKTOP_SESSION was what everyone used in 2010.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string desktop_session;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (env->GetVar("DESKTOP_SESSION", &desktop_session)) {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (desktop_session == "gnome") {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return DESKTOP_ENVIRONMENT_GNOME;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (desktop_session == "kde4") {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return DESKTOP_ENVIRONMENT_KDE4;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (desktop_session == "kde") {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // This may mean KDE4 on newer systems, so we have to check.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (env->HasVar(kKDE4SessionEnvVar))
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return DESKTOP_ENVIRONMENT_KDE4;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return DESKTOP_ENVIRONMENT_KDE3;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (desktop_session.find("xfce") != std::string::npos ||
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               desktop_session == "xubuntu") {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return DESKTOP_ENVIRONMENT_XFCE;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fall back on some older environment variables.
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Useful particularly in the DESKTOP_SESSION=default case.
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (env->HasVar("GNOME_DESKTOP_SESSION_ID")) {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return DESKTOP_ENVIRONMENT_GNOME;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (env->HasVar("KDE_FULL_SESSION")) {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (env->HasVar(kKDE4SessionEnvVar))
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return DESKTOP_ENVIRONMENT_KDE4;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return DESKTOP_ENVIRONMENT_KDE3;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return DESKTOP_ENVIRONMENT_OTHER;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* GetDesktopEnvironmentName(DesktopEnvironment env) {
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (env) {
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case DESKTOP_ENVIRONMENT_OTHER:
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return NULL;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case DESKTOP_ENVIRONMENT_GNOME:
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "GNOME";
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case DESKTOP_ENVIRONMENT_KDE3:
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "KDE3";
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case DESKTOP_ENVIRONMENT_KDE4:
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "KDE4";
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case DESKTOP_ENVIRONMENT_UNITY:
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "UNITY";
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case DESKTOP_ENVIRONMENT_XFCE:
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "XFCE";
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* GetDesktopEnvironmentName(Environment* env) {
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetDesktopEnvironmentName(GetDesktopEnvironment(env));
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace nix
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace base
116