#ifndef UI_LINUX_LINUX_UI_H_
#define UI_LINUX_LINUX_UI_H_
#include <memory>
#include <optional>
#include <string>
#include <vector>
#include "base/command_line.h"
#include "base/component_export.h"
#include "base/containers/flat_map.h"
#include "base/observer_list.h"
#include "base/scoped_observation_traits.h"
#include "build/buildflag.h"
#include "build/chromecast_buildflags.h"
#include "printing/buildflags/buildflags.h"
#include "ui/display/types/display_config.h"
#if BUILDFLAG(ENABLE_PRINTING)
#include "printing/printing_context_linux.h"
#endif
using SkColor = uint32_t;
class Profile;
namespace aura {
class Window;
}
namespace gfx {
struct FontRenderParams;
class Image;
class Size;
}
namespace printing {
class PrintingContextLinux;
class PrintDialogLinuxInterface;
}
namespace ui {
class CursorThemeManagerObserver;
class DeviceScaleFactorObserver;
class Event;
class LinuxInputMethodContext;
class LinuxInputMethodContextDelegate;
class LinuxUiTheme;
class NativeTheme;
class NavButtonProvider;
class PrimaryPastePrefObserver;
class SelectFileDialog;
class SelectFilePolicy;
class WindowButtonOrderObserver;
class WindowFrameProvider;
enum class TextEditCommand;
class COMPONENT_EXPORT(LINUX_UI) PrintingContextLinuxDelegate {
public:
virtual ~PrintingContextLinuxDelegate() = default;
virtual printing::PrintDialogLinuxInterface* CreatePrintDialog(
printing::PrintingContextLinux* context) = 0;
virtual gfx::Size GetPdfPaperSize(printing::PrintingContextLinux* context) = 0;
static PrintingContextLinuxDelegate* SetInstance(
PrintingContextLinuxDelegate* delegate);
static PrintingContextLinuxDelegate* instance();
};
class COMPONENT_EXPORT(LINUX_UI) LinuxUi
#if BUILDFLAG(ENABLE_PRINTING)
: public PrintingContextLinuxDelegate
#endif
{
public:
enum class WindowFrameAction {
kNone,
kLower,
kMinimize,
kToggleMaximize,
kMenu,
};
enum class WindowFrameActionSource {
kDoubleClick,
kMiddleClick,
kRightClick,
};
struct FontSettings {
std::string family;
int size_pixels = 0;
int style = 0;
int weight = 0;
};
LinuxUi(const LinuxUi&) = delete;
LinuxUi& operator=(const LinuxUi&) = delete;
virtual ~LinuxUi();
static LinuxUi* SetInstance(LinuxUi* instance);
static LinuxUi* instance();
void AddDeviceScaleFactorObserver(DeviceScaleFactorObserver* observer);
void RemoveDeviceScaleFactorObserver(DeviceScaleFactorObserver* observer);
void AddCursorThemeObserver(CursorThemeManagerObserver* observer);
void RemoveCursorThemeObserver(CursorThemeManagerObserver* observer);
void AddPrimaryPastePrefObserver(PrimaryPastePrefObserver* observer);
void RemovePrimaryPastePrefObserver(PrimaryPastePrefObserver* observer);
FontSettings GetDefaultFontDescription();
const display::DisplayConfig& display_config() const {
return display_config_;
}
[[nodiscard]] virtual bool Initialize() = 0;
virtual void InitializeFontSettings() = 0;
virtual gfx::Image GetIconForContentType(const std::string& content_type,
int size,
float scale) const = 0;
virtual base::flat_map<std::string, std::string> GetKeyboardLayoutMap() = 0;
virtual SelectFileDialog* CreateSelectFileDialog(
void* listener,
std::unique_ptr<SelectFilePolicy> policy) const = 0;
virtual std::string GetCursorThemeName() = 0;
virtual int GetCursorThemeSize() = 0;
virtual std::unique_ptr<LinuxInputMethodContext> CreateInputMethodContext(
LinuxInputMethodContextDelegate* delegate) const = 0;
virtual TextEditCommand GetTextEditCommandForEvent(const Event& event,
int text_flags) = 0;
virtual gfx::FontRenderParams GetDefaultFontRenderParams() = 0;
virtual bool AnimationsEnabled() const = 0;
virtual void AddWindowButtonOrderObserver(
WindowButtonOrderObserver* observer) = 0;
virtual void RemoveWindowButtonOrderObserver(
WindowButtonOrderObserver* observer) = 0;
virtual WindowFrameAction GetWindowFrameAction(
WindowFrameActionSource source) = 0;
virtual bool PrimaryPasteEnabled() const = 0;
virtual std::vector<std::string> GetCmdLineFlagsForCopy() const = 0;
protected:
struct CmdLineArgs {
CmdLineArgs();
CmdLineArgs(CmdLineArgs&&);
CmdLineArgs& operator=(CmdLineArgs&&);
~CmdLineArgs();
int argc = 0;
std::vector<char*> argv;
std::vector<char> args;
};
LinuxUi();
static CmdLineArgs CopyCmdLine(const base::CommandLine& command_line);
base::ObserverList<DeviceScaleFactorObserver>::Unchecked&
device_scale_factor_observer_list() {
return device_scale_factor_observer_list_;
}
base::ObserverList<CursorThemeManagerObserver>& cursor_theme_observers() {
return cursor_theme_observer_list_;
}
base::ObserverList<PrimaryPastePrefObserver>& primary_paste_observers() {
return primary_paste_observer_list_;
}
display::DisplayConfig& display_config() { return display_config_; }
void set_default_font_settings(
const std::optional<FontSettings>& default_font_settings) {
default_font_settings_ = default_font_settings;
}
private:
base::ObserverList<DeviceScaleFactorObserver>::Unchecked
device_scale_factor_observer_list_;
base::ObserverList<CursorThemeManagerObserver> cursor_theme_observer_list_;
base::ObserverList<PrimaryPastePrefObserver> primary_paste_observer_list_;
display::DisplayConfig display_config_;
std::optional<FontSettings> default_font_settings_;
};
class COMPONENT_EXPORT(LINUX_UI) LinuxUiTheme {
public:
LinuxUiTheme(const LinuxUiTheme&) = delete;
LinuxUiTheme& operator=(const LinuxUiTheme&) = delete;
virtual ~LinuxUiTheme();
static LinuxUiTheme* GetForWindow(aura::Window* window);
static LinuxUiTheme* GetForProfile(Profile* profile);
virtual ui::NativeTheme* GetNativeTheme() const = 0;
virtual bool GetColor(int id,
SkColor* color,
bool use_custom_frame) const = 0;
virtual bool GetDisplayProperty(int id, int* result) const = 0;
virtual void GetFocusRingColor(SkColor* color) const = 0;
virtual void GetActiveSelectionBgColor(SkColor* color) const = 0;
virtual void GetActiveSelectionFgColor(SkColor* color) const = 0;
virtual void GetInactiveSelectionBgColor(SkColor* color) const = 0;
virtual void GetInactiveSelectionFgColor(SkColor* color) const = 0;
virtual bool PreferDarkTheme() const = 0;
virtual void SetDarkTheme(bool dark) = 0;
virtual void SetAccentColor(std::optional<SkColor> accent_color) = 0;
virtual std::unique_ptr<NavButtonProvider> CreateNavButtonProvider() = 0;
virtual WindowFrameProvider* GetWindowFrameProvider(bool solid_frame,
bool tiled,
bool maximized) = 0;
protected:
LinuxUiTheme();
};
class LinuxUiAndTheme : public LinuxUi, public LinuxUiTheme {
public:
~LinuxUiAndTheme() override = default;
};
}
namespace base {
template <>
struct ScopedObservationTraits<ui::LinuxUi, ui::CursorThemeManagerObserver> {
static void AddObserver(ui::LinuxUi* source,
ui::CursorThemeManagerObserver* observer) {
source->AddCursorThemeObserver(observer);
}
static void RemoveObserver(ui::LinuxUi* source,
ui::CursorThemeManagerObserver* observer) {
source->RemoveCursorThemeObserver(observer);
}
};
template <>
struct ScopedObservationTraits<ui::LinuxUi, ui::DeviceScaleFactorObserver> {
static void AddObserver(ui::LinuxUi* source,
ui::DeviceScaleFactorObserver* observer) {
source->AddDeviceScaleFactorObserver(observer);
}
static void RemoveObserver(ui::LinuxUi* source,
ui::DeviceScaleFactorObserver* observer) {
source->RemoveDeviceScaleFactorObserver(observer);
}
};
template <>
struct ScopedObservationTraits<ui::LinuxUi, ui::WindowButtonOrderObserver> {
static void AddObserver(ui::LinuxUi* source,
ui::WindowButtonOrderObserver* observer) {
source->AddWindowButtonOrderObserver(observer);
}
static void RemoveObserver(ui::LinuxUi* source,
ui::WindowButtonOrderObserver* observer) {
source->RemoveWindowButtonOrderObserver(observer);
}
};
template <>
struct ScopedObservationTraits<ui::LinuxUi, ui::PrimaryPastePrefObserver> {
static void AddObserver(ui::LinuxUi* source,
ui::PrimaryPastePrefObserver* observer) {
source->AddPrimaryPastePrefObserver(observer);
}
static void RemoveObserver(ui::LinuxUi* source,
ui::PrimaryPastePrefObserver* observer) {
source->RemovePrimaryPastePrefObserver(observer);
}
};
}
#endif