blob: a531816f80c191ffbe77c9abdb9de6ecfbd41379 [file] [log] [blame]
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ui/linux/linux_ui_factory.h"
#include <memory>
#include <utility>
#include "base/command_line.h"
#include "base/environment.h"
#include "base/nix/xdg_util.h"
#include "base/strings/string_util.h"
#include "ui/base/buildflags.h"
#include "ui/color/system_theme.h"
#include "ui/linux/linux_ui.h"
#include "ui/linux/linux_ui_delegate.h"
#if BUILDFLAG(USE_GTK)
#include "ui/gtk/gtk_ui_factory.h"
#endif
#if BUILDFLAG(USE_QT)
#include "ui/qt/qt_ui.h"
#endif
namespace ui {
namespace {
const char kUiToolkitFlag[] = "ui-toolkit";
std::unique_ptr<LinuxUiAndTheme> CreateGtkUi() {
#if BUILDFLAG(USE_GTK)
auto gtk_ui = BuildGtkUi();
if (gtk_ui->Initialize())
return gtk_ui;
#endif
return nullptr;
}
LinuxUiAndTheme* GetGtkUi() {
// LinuxUi creation will fail without a delegate.
if (!ui::LinuxUiDelegate::GetInstance())
return nullptr;
static LinuxUiAndTheme* gtk_ui = CreateGtkUi().release();
return gtk_ui;
}
std::unique_ptr<LinuxUiAndTheme> CreateQtUi() {
if (!base::FeatureList::IsEnabled(kAllowQt))
return nullptr;
#if BUILDFLAG(USE_QT)
auto qt_ui = qt::CreateQtUi(GetGtkUi());
if (qt_ui->Initialize())
return qt_ui;
#endif
return nullptr;
}
LinuxUiAndTheme* GetQtUi() {
// LinuxUi creation will fail without a delegate.
if (!ui::LinuxUiDelegate::GetInstance())
return nullptr;
static LinuxUiAndTheme* qt_ui = CreateQtUi().release();
return qt_ui;
}
LinuxUiAndTheme* GetDefaultLinuxUiAndTheme() {
auto* cmd_line = base::CommandLine::ForCurrentProcess();
std::string ui_toolkit =
base::ToLowerASCII(cmd_line->GetSwitchValueASCII(kUiToolkitFlag));
if (ui_toolkit == "gtk") {
if (auto* gtk_ui = GetGtkUi())
return gtk_ui;
} else if (ui_toolkit == "qt") {
if (auto* qt_ui = GetQtUi())
return qt_ui;
}
std::unique_ptr<base::Environment> env = base::Environment::Create();
switch (GetDefaultSystemTheme()) {
case SystemTheme::kQt:
if (auto* qt_ui = GetQtUi())
return qt_ui;
return GetGtkUi();
case SystemTheme::kGtk:
case SystemTheme::kDefault:
if (auto* gtk_ui = GetGtkUi())
return gtk_ui;
return GetQtUi();
}
}
} // namespace
const base::Feature kAllowQt{"AllowQt", base::FEATURE_DISABLED_BY_DEFAULT};
LinuxUi* GetDefaultLinuxUi() {
return GetDefaultLinuxUiAndTheme();
}
LinuxUiTheme* GetDefaultLinuxUiTheme() {
return GetDefaultLinuxUiAndTheme();
}
LinuxUiTheme* GetLinuxUiTheme(SystemTheme system_theme) {
switch (system_theme) {
case SystemTheme::kQt:
return GetQtUi();
case SystemTheme::kGtk:
return GetGtkUi();
case SystemTheme::kDefault:
return nullptr;
}
}
SystemTheme GetDefaultSystemTheme() {
std::unique_ptr<base::Environment> env = base::Environment::Create();
switch (base::nix::GetDesktopEnvironment(env.get())) {
case base::nix::DESKTOP_ENVIRONMENT_CINNAMON:
case base::nix::DESKTOP_ENVIRONMENT_GNOME:
case base::nix::DESKTOP_ENVIRONMENT_PANTHEON:
case base::nix::DESKTOP_ENVIRONMENT_UNITY:
case base::nix::DESKTOP_ENVIRONMENT_XFCE:
return SystemTheme::kGtk;
case base::nix::DESKTOP_ENVIRONMENT_KDE3:
case base::nix::DESKTOP_ENVIRONMENT_KDE4:
case base::nix::DESKTOP_ENVIRONMENT_KDE5:
case base::nix::DESKTOP_ENVIRONMENT_UKUI:
case base::nix::DESKTOP_ENVIRONMENT_DEEPIN:
case base::nix::DESKTOP_ENVIRONMENT_LXQT:
return SystemTheme::kQt;
case base::nix::DESKTOP_ENVIRONMENT_OTHER:
return SystemTheme::kDefault;
}
}
} // namespace ui