xref: /aosp_15_r20/external/cronet/base/nix/xdg_util.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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