1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_NIX_XDG_UTIL_H_ 6*6777b538SAndroid Build Coastguard Worker #define BASE_NIX_XDG_UTIL_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker // XDG refers to http://en.wikipedia.org/wiki/Freedesktop.org . 9*6777b538SAndroid Build Coastguard Worker // This file contains utilities found across free desktop environments. 10*6777b538SAndroid Build Coastguard Worker 11*6777b538SAndroid Build Coastguard Worker #include <optional> 12*6777b538SAndroid Build Coastguard Worker #include <string> 13*6777b538SAndroid Build Coastguard Worker #include <vector> 14*6777b538SAndroid Build Coastguard Worker 15*6777b538SAndroid Build Coastguard Worker #include "base/base_export.h" 16*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback.h" 17*6777b538SAndroid Build Coastguard Worker 18*6777b538SAndroid Build Coastguard Worker namespace base { 19*6777b538SAndroid Build Coastguard Worker 20*6777b538SAndroid Build Coastguard Worker class CommandLine; 21*6777b538SAndroid Build Coastguard Worker class Environment; 22*6777b538SAndroid Build Coastguard Worker class FilePath; 23*6777b538SAndroid Build Coastguard Worker struct LaunchOptions; 24*6777b538SAndroid Build Coastguard Worker 25*6777b538SAndroid Build Coastguard Worker namespace nix { 26*6777b538SAndroid Build Coastguard Worker 27*6777b538SAndroid Build Coastguard Worker enum DesktopEnvironment { 28*6777b538SAndroid Build Coastguard Worker DESKTOP_ENVIRONMENT_OTHER = 0, 29*6777b538SAndroid Build Coastguard Worker DESKTOP_ENVIRONMENT_CINNAMON = 1, 30*6777b538SAndroid Build Coastguard Worker DESKTOP_ENVIRONMENT_DEEPIN = 2, 31*6777b538SAndroid Build Coastguard Worker DESKTOP_ENVIRONMENT_GNOME = 3, 32*6777b538SAndroid Build Coastguard Worker // KDE{3,4,5,6} are sufficiently different that we count 33*6777b538SAndroid Build Coastguard Worker // them as different desktop environments here. 34*6777b538SAndroid Build Coastguard Worker DESKTOP_ENVIRONMENT_KDE3 = 4, 35*6777b538SAndroid Build Coastguard Worker DESKTOP_ENVIRONMENT_KDE4 = 5, 36*6777b538SAndroid Build Coastguard Worker DESKTOP_ENVIRONMENT_KDE5 = 6, 37*6777b538SAndroid Build Coastguard Worker DESKTOP_ENVIRONMENT_KDE6 = 12, 38*6777b538SAndroid Build Coastguard Worker DESKTOP_ENVIRONMENT_PANTHEON = 7, 39*6777b538SAndroid Build Coastguard Worker DESKTOP_ENVIRONMENT_UKUI = 8, 40*6777b538SAndroid Build Coastguard Worker DESKTOP_ENVIRONMENT_UNITY = 9, 41*6777b538SAndroid Build Coastguard Worker DESKTOP_ENVIRONMENT_XFCE = 10, 42*6777b538SAndroid Build Coastguard Worker DESKTOP_ENVIRONMENT_LXQT = 11, 43*6777b538SAndroid Build Coastguard Worker }; 44*6777b538SAndroid Build Coastguard Worker 45*6777b538SAndroid Build Coastguard Worker // Values based on valid types indicated in: 46*6777b538SAndroid Build Coastguard Worker // https://www.freedesktop.org/software/systemd/man/pam_systemd.html; though 47*6777b538SAndroid Build Coastguard Worker // "Unset" and "Other" are provided by us to distinguish between the potentially 48*6777b538SAndroid Build Coastguard Worker // valid "Unspecified" and other cases where we may not be able to find the 49*6777b538SAndroid Build Coastguard Worker // value. 50*6777b538SAndroid Build Coastguard Worker enum class SessionType { 51*6777b538SAndroid Build Coastguard Worker kUnset = 0, 52*6777b538SAndroid Build Coastguard Worker kOther = 1, 53*6777b538SAndroid Build Coastguard Worker kUnspecified = 2, 54*6777b538SAndroid Build Coastguard Worker kTty = 3, 55*6777b538SAndroid Build Coastguard Worker kX11 = 4, 56*6777b538SAndroid Build Coastguard Worker kWayland = 5, 57*6777b538SAndroid Build Coastguard Worker kMir = 6, 58*6777b538SAndroid Build Coastguard Worker }; 59*6777b538SAndroid Build Coastguard Worker 60*6777b538SAndroid Build Coastguard Worker using XdgActivationTokenCallback = base::OnceCallback<void(std::string token)>; 61*6777b538SAndroid Build Coastguard Worker using XdgActivationTokenCreator = 62*6777b538SAndroid Build Coastguard Worker base::RepeatingCallback<void(XdgActivationTokenCallback callback)>; 63*6777b538SAndroid Build Coastguard Worker using XdgActivationLaunchOptionsCallback = 64*6777b538SAndroid Build Coastguard Worker base::OnceCallback<void(LaunchOptions)>; 65*6777b538SAndroid Build Coastguard Worker 66*6777b538SAndroid Build Coastguard Worker // The default XDG config directory name. 67*6777b538SAndroid Build Coastguard Worker BASE_EXPORT extern const char kDotConfigDir[]; 68*6777b538SAndroid Build Coastguard Worker 69*6777b538SAndroid Build Coastguard Worker // The XDG config directory environment variable. 70*6777b538SAndroid Build Coastguard Worker BASE_EXPORT extern const char kXdgConfigHomeEnvVar[]; 71*6777b538SAndroid Build Coastguard Worker 72*6777b538SAndroid Build Coastguard Worker // The XDG current desktop environment variable. 73*6777b538SAndroid Build Coastguard Worker BASE_EXPORT extern const char kXdgCurrentDesktopEnvVar[]; 74*6777b538SAndroid Build Coastguard Worker 75*6777b538SAndroid Build Coastguard Worker // The XDG session type environment variable. 76*6777b538SAndroid Build Coastguard Worker BASE_EXPORT extern const char kXdgSessionTypeEnvVar[]; 77*6777b538SAndroid Build Coastguard Worker 78*6777b538SAndroid Build Coastguard Worker // The XDG activation token environment variable. 79*6777b538SAndroid Build Coastguard Worker BASE_EXPORT extern const char kXdgActivationTokenEnvVar[]; 80*6777b538SAndroid Build Coastguard Worker 81*6777b538SAndroid Build Coastguard Worker // Internally used to communicate the activation token between a newly launched 82*6777b538SAndroid Build Coastguard Worker // process and an existing browser process. 83*6777b538SAndroid Build Coastguard Worker BASE_EXPORT extern const char kXdgActivationTokenSwitch[]; 84*6777b538SAndroid Build Coastguard Worker 85*6777b538SAndroid Build Coastguard Worker // Utility function for getting XDG directories. 86*6777b538SAndroid Build Coastguard Worker // |env_name| is the name of an environment variable that we want to use to get 87*6777b538SAndroid Build Coastguard Worker // a directory path. |fallback_dir| is the directory relative to $HOME that we 88*6777b538SAndroid Build Coastguard Worker // use if |env_name| cannot be found or is empty. |fallback_dir| may be NULL. 89*6777b538SAndroid Build Coastguard Worker // Examples of |env_name| are XDG_CONFIG_HOME and XDG_DATA_HOME. 90*6777b538SAndroid Build Coastguard Worker BASE_EXPORT FilePath GetXDGDirectory(Environment* env, const char* env_name, 91*6777b538SAndroid Build Coastguard Worker const char* fallback_dir); 92*6777b538SAndroid Build Coastguard Worker 93*6777b538SAndroid Build Coastguard Worker // Wrapper around xdg_user_dir_lookup() from src/base/third_party/xdg-user-dirs 94*6777b538SAndroid Build Coastguard Worker // This looks up "well known" user directories like the desktop and music 95*6777b538SAndroid Build Coastguard Worker // folder. Examples of |dir_name| are DESKTOP and MUSIC. 96*6777b538SAndroid Build Coastguard Worker BASE_EXPORT FilePath GetXDGUserDirectory(const char* dir_name, 97*6777b538SAndroid Build Coastguard Worker const char* fallback_dir); 98*6777b538SAndroid Build Coastguard Worker 99*6777b538SAndroid Build Coastguard Worker // Get the path to write user-specific application data files to, as specified 100*6777b538SAndroid Build Coastguard Worker // in the XDG Base Directory Specification: 101*6777b538SAndroid Build Coastguard Worker // http://standards.freedesktop.org/basedir-spec/latest/ 102*6777b538SAndroid Build Coastguard Worker BASE_EXPORT FilePath GetXDGDataWriteLocation(Environment* env); 103*6777b538SAndroid Build Coastguard Worker 104*6777b538SAndroid Build Coastguard Worker // Get the list of paths to search for application data files, in order of 105*6777b538SAndroid Build Coastguard Worker // preference, as specified in the XDG Base Directory Specification: 106*6777b538SAndroid Build Coastguard Worker // http://standards.freedesktop.org/basedir-spec/latest/ 107*6777b538SAndroid Build Coastguard Worker // Called on the FILE thread. 108*6777b538SAndroid Build Coastguard Worker BASE_EXPORT std::vector<FilePath> GetXDGDataSearchLocations(Environment* env); 109*6777b538SAndroid Build Coastguard Worker 110*6777b538SAndroid Build Coastguard Worker // Return an entry from the DesktopEnvironment enum with a best guess 111*6777b538SAndroid Build Coastguard Worker // of which desktop environment we're using. We use this to know when 112*6777b538SAndroid Build Coastguard Worker // to attempt to use preferences from the desktop environment -- 113*6777b538SAndroid Build Coastguard Worker // proxy settings, password manager, etc. 114*6777b538SAndroid Build Coastguard Worker BASE_EXPORT DesktopEnvironment GetDesktopEnvironment(Environment* env); 115*6777b538SAndroid Build Coastguard Worker 116*6777b538SAndroid Build Coastguard Worker // Return a string representation of the given desktop environment. 117*6777b538SAndroid Build Coastguard Worker // May return NULL in the case of DESKTOP_ENVIRONMENT_OTHER. 118*6777b538SAndroid Build Coastguard Worker BASE_EXPORT const char* GetDesktopEnvironmentName(DesktopEnvironment env); 119*6777b538SAndroid Build Coastguard Worker // Convenience wrapper that calls GetDesktopEnvironment() first. 120*6777b538SAndroid Build Coastguard Worker BASE_EXPORT const char* GetDesktopEnvironmentName(Environment* env); 121*6777b538SAndroid Build Coastguard Worker 122*6777b538SAndroid Build Coastguard Worker // Return an entry from the SessionType enum with a best guess 123*6777b538SAndroid Build Coastguard Worker // of which session type we're using. 124*6777b538SAndroid Build Coastguard Worker BASE_EXPORT SessionType GetSessionType(Environment& env); 125*6777b538SAndroid Build Coastguard Worker 126*6777b538SAndroid Build Coastguard Worker // Sets the global activation token from the environment and returns it if it 127*6777b538SAndroid Build Coastguard Worker // exists, and removes it from the environment to prevent it from leaking into 128*6777b538SAndroid Build Coastguard Worker // child processes. 129*6777b538SAndroid Build Coastguard Worker BASE_EXPORT std::optional<std::string> ExtractXdgActivationTokenFromEnv( 130*6777b538SAndroid Build Coastguard Worker Environment& env); 131*6777b538SAndroid Build Coastguard Worker 132*6777b538SAndroid Build Coastguard Worker // Sets the global activation token from the command line if it exists and 133*6777b538SAndroid Build Coastguard Worker // removes it from the command line. 134*6777b538SAndroid Build Coastguard Worker BASE_EXPORT void ExtractXdgActivationTokenFromCmdLine( 135*6777b538SAndroid Build Coastguard Worker base::CommandLine& cmd_line); 136*6777b538SAndroid Build Coastguard Worker 137*6777b538SAndroid Build Coastguard Worker // Transfers ownership of the currently set global activation token if set. 138*6777b538SAndroid Build Coastguard Worker BASE_EXPORT std::optional<std::string> TakeXdgActivationToken(); 139*6777b538SAndroid Build Coastguard Worker 140*6777b538SAndroid Build Coastguard Worker // Sets the global token creator. 141*6777b538SAndroid Build Coastguard Worker BASE_EXPORT void SetXdgActivationTokenCreator( 142*6777b538SAndroid Build Coastguard Worker XdgActivationTokenCreator token_creator); 143*6777b538SAndroid Build Coastguard Worker 144*6777b538SAndroid Build Coastguard Worker // Tries to create an xdg-activation token and invokes the `callback` with 145*6777b538SAndroid Build Coastguard Worker // `LaunchOptions` containing the token if available, or empty `LaunchOptions`. 146*6777b538SAndroid Build Coastguard Worker BASE_EXPORT void CreateLaunchOptionsWithXdgActivation( 147*6777b538SAndroid Build Coastguard Worker XdgActivationLaunchOptionsCallback callback); 148*6777b538SAndroid Build Coastguard Worker 149*6777b538SAndroid Build Coastguard Worker } // namespace nix 150*6777b538SAndroid Build Coastguard Worker } // namespace base 151*6777b538SAndroid Build Coastguard Worker 152*6777b538SAndroid Build Coastguard Worker #endif // BASE_NIX_XDG_UTIL_H_ 153