blob: 1ca7efb4ab599d1cf5b25e934f4d315b0a1faeba [file] [log] [blame]
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef UI_LINUX_LINUX_UI_H_
#define UI_LINUX_LINUX_UI_H_
#include <memory>
#include <string>
#include <vector>
#include "base/callback.h"
#include "base/command_line.h"
#include "base/component_export.h"
#include "base/containers/flat_map.h"
#include "base/observer_list.h"
#include "build/buildflag.h"
#include "build/chromecast_buildflags.h"
#include "printing/buildflags/buildflags.h"
#include "third_party/skia/include/core/SkColor.h"
#include "ui/base/ime/linux/text_edit_key_bindings_delegate_auralinux.h" // nogncheck
#include "ui/gfx/animation/animation_settings_provider_linux.h"
#include "ui/gfx/geometry/insets.h"
#include "ui/gfx/geometry/size.h"
#include "ui/gfx/skia_font_delegate.h"
// The main entrypoint into Linux toolkit specific code. GTK/QT code should only
// be executed behind this interface.
namespace aura {
class Window;
}
namespace base {
class TimeDelta;
}
namespace gfx {
class Image;
}
namespace printing {
class PrintingContextLinux;
class PrintDialogLinuxInterface;
} // namespace printing
namespace ui {
class CursorThemeManagerObserver;
class DeviceScaleFactorObserver;
class LinuxInputMethodContext;
class LinuxInputMethodContextDelegate;
class NativeTheme;
class NavButtonProvider;
class SelectFileDialog;
class SelectFilePolicy;
class WindowButtonOrderObserver;
class WindowFrameProvider;
// Adapter class with targets to render like different toolkits. Set by any
// project that wants to do linux desktop native rendering.
class COMPONENT_EXPORT(LINUX_UI) LinuxUi
: public gfx::SkiaFontDelegate,
public ui::TextEditKeyBindingsDelegateAuraLinux,
public gfx::AnimationSettingsProviderLinux {
public:
using UseSystemThemeCallback =
base::RepeatingCallback<bool(aura::Window* window)>;
// Describes the window management actions that could be taken in response to
// a middle click in the non client area.
enum class WindowFrameAction {
kNone,
kLower,
kMinimize,
kToggleMaximize,
kMenu,
};
// The types of clicks that might invoke a WindowFrameAction.
enum class WindowFrameActionSource {
kDoubleClick,
kMiddleClick,
kRightClick,
};
LinuxUi(const LinuxUi&) = delete;
LinuxUi& operator=(const LinuxUi&) = delete;
~LinuxUi() override;
// Sets the dynamically loaded singleton that draws the desktop native UI.
static void SetInstance(std::unique_ptr<LinuxUi> instance);
// Returns a LinuxUI instance for the toolkit used in the user's desktop
// environment.
//
// Can return NULL, in case no toolkit has been set. (For example, if we're
// running with the "--ash" flag.)
static LinuxUi* instance();
// Notifies the observer about changes about how window buttons should be
// laid out.
void AddWindowButtonOrderObserver(WindowButtonOrderObserver* observer);
// Removes the observer from the LinuxUI's list.
void RemoveWindowButtonOrderObserver(WindowButtonOrderObserver* observer);
// Registers |observer| to be notified about changes to the device
// scale factor.
void AddDeviceScaleFactorObserver(DeviceScaleFactorObserver* observer);
// Unregisters |observer| from receiving changes to the device scale
// factor.
void RemoveDeviceScaleFactorObserver(DeviceScaleFactorObserver* observer);
// Adds |observer| and makes initial OnCursorThemNameChanged() and/or
// OnCursorThemeSizeChanged() calls if the respective settings were set.
void AddCursorThemeObserver(CursorThemeManagerObserver* observer);
void RemoveCursorThemeObserver(CursorThemeManagerObserver* observer);
// Returns the NativeTheme that reflects the theme used by `window`.
ui::NativeTheme* GetNativeTheme(aura::Window* window) const;
// Returns the classic or system NativeTheme depending on `use_system_theme`.
ui::NativeTheme* GetNativeTheme(bool use_system_theme) const;
// Sets a callback that determines whether to use the system theme.
void SetUseSystemThemeCallback(UseSystemThemeCallback callback);
// Returns whether we should be using the native theme provided by this
// object by default.
bool GetDefaultUsesSystemTheme() const;
// Returns true on success. If false is returned, this instance shouldn't
// be used and the behavior of all functions is undefined.
[[nodiscard]] virtual bool Initialize() = 0;
virtual bool GetColor(int id,
SkColor* color,
bool use_custom_frame) const = 0;
virtual bool GetDisplayProperty(int id, int* result) const = 0;
// Returns the preferences that we pass to Blink.
virtual SkColor GetFocusRingColor() const = 0;
virtual SkColor GetActiveSelectionBgColor() const = 0;
virtual SkColor GetActiveSelectionFgColor() const = 0;
virtual SkColor GetInactiveSelectionBgColor() const = 0;
virtual SkColor GetInactiveSelectionFgColor() const = 0;
virtual base::TimeDelta GetCursorBlinkInterval() const = 0;
// Returns the icon for a given content type from the icon theme.
// TODO(davidben): Add an observer for the theme changing, so we can drop the
// caches.
virtual gfx::Image GetIconForContentType(const std::string& content_type,
int size,
float scale) const = 0;
// What action we should take when the user clicks on the non-client area.
// |source| describes the type of click.
virtual WindowFrameAction GetWindowFrameAction(
WindowFrameActionSource source) = 0;
// Determines the device scale factor of the primary screen.
virtual float GetDeviceScaleFactor() const = 0;
// Only used on GTK to indicate if the dark GTK theme variant is
// preferred.
virtual bool PreferDarkTheme() const = 0;
// Returns a new NavButtonProvider, or nullptr if the underlying
// toolkit does not support drawing client-side navigation buttons.
virtual std::unique_ptr<NavButtonProvider> CreateNavButtonProvider() = 0;
// Returns a WindowFrameProvider, or nullptr if the underlying toolkit does
// not support drawing client-side window decorations. |solid_frame| indicates
// if transparency is unsupported and the frame should be rendered opaque.
// The returned object is not owned by the caller and will remain alive until
// the process ends.
virtual WindowFrameProvider* GetWindowFrameProvider(bool solid_frame) = 0;
// Returns a map of KeyboardEvent code to KeyboardEvent key values.
virtual base::flat_map<std::string, std::string> GetKeyboardLayoutMap() = 0;
#if BUILDFLAG(ENABLE_PRINTING)
virtual printing::PrintDialogLinuxInterface* CreatePrintDialog(
printing::PrintingContextLinux* context) = 0;
virtual gfx::Size GetPdfPaperSize(
printing::PrintingContextLinux* context) = 0;
#endif
// Returns a native file selection dialog. `listener` is of type
// SelectFileDialog::Listener. TODO(thomasanderson): Move
// SelectFileDialog::Listener to SelectFileDialogListener so that it can be
// forward declared.
virtual SelectFileDialog* CreateSelectFileDialog(
void* listener,
std::unique_ptr<SelectFilePolicy> policy) const = 0;
// Returns the prefererd theme name for cursor loading.
virtual std::string GetCursorThemeName() = 0;
// Returns the preferred size for cursor bitmaps. A value of 64 indicates
// that 64x64 px bitmaps are preferred.
virtual int GetCursorThemeSize() = 0;
// Returns a platform specific input method context.
virtual std::unique_ptr<LinuxInputMethodContext> CreateInputMethodContext(
LinuxInputMethodContextDelegate* delegate) const = 0;
protected:
struct CmdLineArgs {
CmdLineArgs();
CmdLineArgs(CmdLineArgs&&);
CmdLineArgs& operator=(CmdLineArgs&&);
~CmdLineArgs();
// `argc` is modified by toolkits, so store it explicitly.
int argc = 0;
// Contains C-strings that point into `args`. `argv.size()` >= `argc`.
std::vector<char*> argv;
// `argv` concatenated with NUL characters.
std::vector<char> args;
};
LinuxUi();
static CmdLineArgs CopyCmdLine(const base::CommandLine& command_line);
const base::ObserverList<WindowButtonOrderObserver>::Unchecked&
window_button_order_observer_list() const {
return window_button_order_observer_list_;
}
const base::ObserverList<DeviceScaleFactorObserver>::Unchecked&
device_scale_factor_observer_list() const {
return device_scale_factor_observer_list_;
}
const base::ObserverList<CursorThemeManagerObserver>&
cursor_theme_observers() {
return cursor_theme_observer_list_;
}
virtual ui::NativeTheme* GetNativeTheme() const = 0;
private:
// Used to determine whether the system theme should be used for a window. If
// no override is provided or the callback returns true, LinuxUI will default
// to GetNativeTheme().
UseSystemThemeCallback use_system_theme_callback_;
// Objects to notify when the window frame button order changes.
base::ObserverList<WindowButtonOrderObserver>::Unchecked
window_button_order_observer_list_;
// Objects to notify when the device scale factor changes.
base::ObserverList<DeviceScaleFactorObserver>::Unchecked
device_scale_factor_observer_list_;
// Objects to notify when the cursor theme or size changes.
base::ObserverList<CursorThemeManagerObserver> cursor_theme_observer_list_;
};
} // namespace ui
#endif // UI_LINUX_LINUX_UI_H_