linux_ui.cc 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. // Copyright 2013 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 "ui/linux/linux_ui.h"
  5. #include <cstdio>
  6. #include <utility>
  7. #include "base/command_line.h"
  8. #include "base/environment.h"
  9. #include "base/nix/xdg_util.h"
  10. #include "base/no_destructor.h"
  11. #include "build/build_config.h"
  12. #include "ui/linux/cursor_theme_manager_observer.h"
  13. namespace {
  14. std::unique_ptr<ui::LinuxUi>& GetLinuxUiInstance() {
  15. static base::NoDestructor<std::unique_ptr<ui::LinuxUi>> linux_ui;
  16. return *linux_ui;
  17. }
  18. } // namespace
  19. namespace ui {
  20. // static
  21. std::unique_ptr<LinuxUi> LinuxUi::SetInstance(
  22. std::unique_ptr<LinuxUi> instance) {
  23. return std::exchange(GetLinuxUiInstance(), std::move(instance));
  24. }
  25. // static
  26. LinuxUi* LinuxUi::instance() {
  27. return GetLinuxUiInstance().get();
  28. }
  29. LinuxUi::LinuxUi() = default;
  30. LinuxUi::~LinuxUi() = default;
  31. LinuxUi::CmdLineArgs::CmdLineArgs() = default;
  32. LinuxUi::CmdLineArgs::CmdLineArgs(CmdLineArgs&&) = default;
  33. LinuxUi::CmdLineArgs& LinuxUi::CmdLineArgs::operator=(CmdLineArgs&&) = default;
  34. LinuxUi::CmdLineArgs::~CmdLineArgs() = default;
  35. void LinuxUi::AddWindowButtonOrderObserver(
  36. WindowButtonOrderObserver* observer) {
  37. window_button_order_observer_list_.AddObserver(observer);
  38. }
  39. void LinuxUi::RemoveWindowButtonOrderObserver(
  40. WindowButtonOrderObserver* observer) {
  41. window_button_order_observer_list_.RemoveObserver(observer);
  42. }
  43. void LinuxUi::AddDeviceScaleFactorObserver(
  44. DeviceScaleFactorObserver* observer) {
  45. device_scale_factor_observer_list_.AddObserver(observer);
  46. }
  47. void LinuxUi::RemoveDeviceScaleFactorObserver(
  48. DeviceScaleFactorObserver* observer) {
  49. device_scale_factor_observer_list_.RemoveObserver(observer);
  50. }
  51. void LinuxUi::AddCursorThemeObserver(CursorThemeManagerObserver* observer) {
  52. cursor_theme_observer_list_.AddObserver(observer);
  53. std::string name = GetCursorThemeName();
  54. if (!name.empty())
  55. observer->OnCursorThemeNameChanged(name);
  56. int size = GetCursorThemeSize();
  57. if (size)
  58. observer->OnCursorThemeSizeChanged(size);
  59. }
  60. void LinuxUi::RemoveCursorThemeObserver(CursorThemeManagerObserver* observer) {
  61. cursor_theme_observer_list_.RemoveObserver(observer);
  62. }
  63. ui::NativeTheme* LinuxUi::GetNativeTheme(aura::Window* window) const {
  64. return GetNativeTheme(use_system_theme_callback_.is_null() ||
  65. use_system_theme_callback_.Run(window));
  66. }
  67. void LinuxUi::SetUseSystemThemeCallback(UseSystemThemeCallback callback) {
  68. use_system_theme_callback_ = std::move(callback);
  69. }
  70. bool LinuxUi::GetDefaultUsesSystemTheme() const {
  71. std::unique_ptr<base::Environment> env = base::Environment::Create();
  72. // TODO(https://crbug.com/1317782): This logic won't be necessary after
  73. // the GTK/QT backend is chosen based on the environment.
  74. switch (base::nix::GetDesktopEnvironment(env.get())) {
  75. case base::nix::DESKTOP_ENVIRONMENT_CINNAMON:
  76. case base::nix::DESKTOP_ENVIRONMENT_DEEPIN:
  77. case base::nix::DESKTOP_ENVIRONMENT_GNOME:
  78. case base::nix::DESKTOP_ENVIRONMENT_PANTHEON:
  79. case base::nix::DESKTOP_ENVIRONMENT_UKUI:
  80. case base::nix::DESKTOP_ENVIRONMENT_UNITY:
  81. case base::nix::DESKTOP_ENVIRONMENT_XFCE:
  82. return true;
  83. case base::nix::DESKTOP_ENVIRONMENT_KDE3:
  84. case base::nix::DESKTOP_ENVIRONMENT_KDE4:
  85. case base::nix::DESKTOP_ENVIRONMENT_KDE5:
  86. case base::nix::DESKTOP_ENVIRONMENT_OTHER:
  87. return false;
  88. }
  89. }
  90. // static
  91. LinuxUi::CmdLineArgs LinuxUi::CopyCmdLine(
  92. const base::CommandLine& command_line) {
  93. const auto& argv = command_line.argv();
  94. size_t args_chars = 0;
  95. for (const auto& arg : argv)
  96. args_chars += arg.size() + 1;
  97. CmdLineArgs cmd_line;
  98. cmd_line.args = std::vector<char>(args_chars);
  99. char* dst = cmd_line.args.data();
  100. for (const auto& arg : argv) {
  101. cmd_line.argv.push_back(dst);
  102. snprintf(dst, &cmd_line.args.back() + 1 - dst, "%s", arg.c_str());
  103. dst += arg.size() + 1;
  104. }
  105. cmd_line.argc = cmd_line.argv.size();
  106. return cmd_line;
  107. }
  108. } // namespace ui