Allow custom ChooseBackend hook in RpWindow.
This commit is contained in:
parent
30dba7a215
commit
8e6811aef0
2 changed files with 30 additions and 27 deletions
|
|
@ -24,11 +24,24 @@ namespace {
|
||||||
|
|
||||||
constexpr auto kUseNativeChild = false;// ::Platform::IsWindows();
|
constexpr auto kUseNativeChild = false;// ::Platform::IsWindows();
|
||||||
|
|
||||||
|
[[nodiscard]] Backend DefaultChooseBackend(Capabilities capabilities) {
|
||||||
|
const auto use = ::Platform::IsMac()
|
||||||
|
? true
|
||||||
|
: ::Platform::IsWindows()
|
||||||
|
? capabilities.supported
|
||||||
|
: capabilities.transparency;
|
||||||
|
LOG(("OpenGL: %1 (Window)").arg(use ? "[TRUE]" : "[FALSE]"));
|
||||||
|
return use ? Backend::OpenGL : Backend::Raster;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
Window::Window()
|
Window::Window() : Window(DefaultChooseBackend) {
|
||||||
: _window(createWindow())
|
}
|
||||||
, _bodyNativeWrap(createNativeBodyWrap())
|
|
||||||
|
Window::Window(Fn<Backend(Capabilities)> chooseBackend)
|
||||||
|
: _window(createWindow(chooseBackend))
|
||||||
|
, _bodyNativeWrap(createNativeBodyWrap(chooseBackend))
|
||||||
, _body(_bodyNativeWrap ? _bodyNativeWrap.get() : _window->body().get()) {
|
, _body(_bodyNativeWrap ? _bodyNativeWrap.get() : _window->body().get()) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -46,19 +59,12 @@ not_null<RpWidget*> Window::widget() const {
|
||||||
return _body.get();
|
return _body.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<RpWindow> Window::createWindow() {
|
std::unique_ptr<RpWindow> Window::createWindow(
|
||||||
|
const Fn<Backend(Capabilities)> &chooseBackend) {
|
||||||
auto result = std::make_unique<RpWindow>();
|
auto result = std::make_unique<RpWindow>();
|
||||||
if constexpr (!kUseNativeChild) {
|
if constexpr (!kUseNativeChild) {
|
||||||
const auto capabilities = CheckCapabilities(result.get());
|
_backend = chooseBackend(CheckCapabilities(result.get()));
|
||||||
const auto use = ::Platform::IsMac()
|
if (_backend != Backend::OpenGL) {
|
||||||
? true
|
|
||||||
: ::Platform::IsWindows()
|
|
||||||
? capabilities.supported
|
|
||||||
: capabilities.transparency;
|
|
||||||
LOG(("OpenGL: %1 (Window)").arg(use ? "[TRUE]" : "[FALSE]"));
|
|
||||||
_backend = use ? Backend::OpenGL : Backend::Raster;
|
|
||||||
|
|
||||||
if (!use) {
|
|
||||||
// We have to create a new window, if OpenGL initialization failed.
|
// We have to create a new window, if OpenGL initialization failed.
|
||||||
result = std::make_unique<RpWindow>();
|
result = std::make_unique<RpWindow>();
|
||||||
}
|
}
|
||||||
|
|
@ -66,7 +72,8 @@ std::unique_ptr<RpWindow> Window::createWindow() {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<RpWidget> Window::createNativeBodyWrap() {
|
std::unique_ptr<RpWidget> Window::createNativeBodyWrap(
|
||||||
|
const Fn<Backend(Capabilities)> &chooseBackend) {
|
||||||
if constexpr (!kUseNativeChild) {
|
if constexpr (!kUseNativeChild) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
@ -81,16 +88,8 @@ std::unique_ptr<RpWidget> Window::createNativeBodyWrap() {
|
||||||
};
|
};
|
||||||
|
|
||||||
auto result = create();
|
auto result = create();
|
||||||
const auto capabilities = CheckCapabilities(result.get());
|
_backend = chooseBackend(CheckCapabilities(result.get()));
|
||||||
const auto use = ::Platform::IsMac()
|
if (_backend != Backend::OpenGL) {
|
||||||
? true
|
|
||||||
: ::Platform::IsWindows()
|
|
||||||
? capabilities.supported
|
|
||||||
: capabilities.transparency;
|
|
||||||
LOG(("OpenGL: %1 (WindowBody)").arg(use ? "[TRUE]" : "[FALSE]"));
|
|
||||||
_backend = use ? Backend::OpenGL : Backend::Raster;
|
|
||||||
|
|
||||||
if (!use) {
|
|
||||||
// We have to create a new window, if OpenGL initialization failed.
|
// We have to create a new window, if OpenGL initialization failed.
|
||||||
result = create();
|
result = create();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -15,10 +15,12 @@ class RpWidget;
|
||||||
namespace Ui::GL {
|
namespace Ui::GL {
|
||||||
|
|
||||||
enum class Backend;
|
enum class Backend;
|
||||||
|
struct Capabilities;
|
||||||
|
|
||||||
class Window final {
|
class Window final {
|
||||||
public:
|
public:
|
||||||
Window();
|
Window();
|
||||||
|
explicit Window(Fn<Backend(Capabilities)> chooseBackend);
|
||||||
~Window();
|
~Window();
|
||||||
|
|
||||||
[[nodiscard]] Backend backend() const;
|
[[nodiscard]] Backend backend() const;
|
||||||
|
|
@ -26,8 +28,10 @@ public:
|
||||||
[[nodiscard]] not_null<RpWidget*> widget() const;
|
[[nodiscard]] not_null<RpWidget*> widget() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
[[nodiscard]] std::unique_ptr<RpWindow> createWindow();
|
[[nodiscard]] std::unique_ptr<RpWindow> createWindow(
|
||||||
[[nodiscard]] std::unique_ptr<RpWidget> createNativeBodyWrap();
|
const Fn<Backend(Capabilities)> &chooseBackend);
|
||||||
|
[[nodiscard]] std::unique_ptr<RpWidget> createNativeBodyWrap(
|
||||||
|
const Fn<Backend(Capabilities)> &chooseBackend);
|
||||||
|
|
||||||
Backend _backend = Backend();
|
Backend _backend = Backend();
|
||||||
const std::unique_ptr<RpWindow> _window;
|
const std::unique_ptr<RpWindow> _window;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue