mirror of
https://bitbucket.org/chromiumembedded/cef
synced 2025-06-05 21:39:12 +02:00
win/linux: Use CursorLoader for loading cursor resources (see issue #3270)
Switch to using aura::CursorLoader which knows how to load system, non-system and pak cursor resources. On Windows, cursors will be loaded via LoadCursor first if available with a fallback to pak file if necessary (like with component builds). On Linux, all non-system cursor resources will be loaded from pak file. Cursors may be loaded asynchronously resulting in the default (pointer) cursor being returned on the first request.
This commit is contained in:
@@ -7,12 +7,67 @@
|
||||
#include "libcef/browser/browser_host_base.h"
|
||||
|
||||
#include "content/common/cursors/webcursor.h"
|
||||
#include "content/public/browser/render_widget_host_view.h"
|
||||
#include "ui/base/cursor/cursor_factory.h"
|
||||
#include "ui/base/cursor/mojom/cursor_type.mojom.h"
|
||||
|
||||
#if defined(USE_AURA)
|
||||
#include "ui/aura/cursor/cursor_loader.h"
|
||||
#include "ui/display/display_util.h"
|
||||
#endif
|
||||
|
||||
namespace cursor_util {
|
||||
|
||||
bool OnCursorChange(CefRefPtr<CefBrowser> browser, const ui::Cursor& ui_cursor) {
|
||||
namespace {
|
||||
|
||||
#if defined(USE_AURA)
|
||||
|
||||
display::ScreenInfo GetScreenInfo(CefRefPtr<CefBrowser> browser) {
|
||||
display::ScreenInfo screen_info;
|
||||
|
||||
bool screen_info_set = false;
|
||||
if (auto web_contents =
|
||||
static_cast<CefBrowserHostBase*>(browser.get())->GetWebContents()) {
|
||||
if (auto view = web_contents->GetRenderWidgetHostView()) {
|
||||
const auto screen_infos = view->GetScreenInfos();
|
||||
if (!screen_infos.screen_infos.empty()) {
|
||||
screen_info = screen_infos.current();
|
||||
screen_info_set = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!screen_info_set) {
|
||||
display::DisplayUtil::GetDefaultScreenInfo(&screen_info);
|
||||
}
|
||||
|
||||
return screen_info;
|
||||
}
|
||||
|
||||
display::Display::Rotation OrientationAngleToRotation(
|
||||
uint16_t orientation_angle) {
|
||||
// The Display rotation and the ScreenInfo orientation are not the same
|
||||
// angle. The former is the physical display rotation while the later is the
|
||||
// rotation required by the content to be shown properly on the screen, in
|
||||
// other words, relative to the physical display.
|
||||
if (orientation_angle == 0)
|
||||
return display::Display::ROTATE_0;
|
||||
if (orientation_angle == 90)
|
||||
return display::Display::ROTATE_270;
|
||||
if (orientation_angle == 180)
|
||||
return display::Display::ROTATE_180;
|
||||
if (orientation_angle == 270)
|
||||
return display::Display::ROTATE_90;
|
||||
NOTREACHED();
|
||||
return display::Display::ROTATE_0;
|
||||
}
|
||||
|
||||
#endif // defined(USE_AURA)
|
||||
|
||||
} // namespace
|
||||
|
||||
bool OnCursorChange(CefRefPtr<CefBrowser> browser,
|
||||
const ui::Cursor& ui_cursor) {
|
||||
auto client = browser->GetHost()->GetClient();
|
||||
if (!client)
|
||||
return false;
|
||||
@@ -35,19 +90,32 @@ bool OnCursorChange(CefRefPtr<CefBrowser> browser, const ui::Cursor& ui_cursor)
|
||||
bool handled = false;
|
||||
|
||||
#if defined(USE_AURA)
|
||||
CefCursorHandle platform_cursor;
|
||||
scoped_refptr<ui::PlatformCursor> image_cursor;
|
||||
aura::CursorLoader cursor_loader;
|
||||
scoped_refptr<ui::PlatformCursor> platform_cursor;
|
||||
CefCursorHandle native_cursor = kNullCursorHandle;
|
||||
|
||||
ui::Cursor loaded_cursor = ui_cursor;
|
||||
|
||||
if (ui_cursor.type() == ui::mojom::CursorType::kCustom) {
|
||||
image_cursor = ui::CursorFactory::GetInstance()->CreateImageCursor(
|
||||
platform_cursor = ui::CursorFactory::GetInstance()->CreateImageCursor(
|
||||
ui::mojom::CursorType::kCustom, ui_cursor.custom_bitmap(),
|
||||
ui_cursor.custom_hotspot());
|
||||
platform_cursor = cursor_util::ToCursorHandle(image_cursor);
|
||||
} else {
|
||||
platform_cursor = cursor_util::GetPlatformCursor(ui_cursor.type());
|
||||
const auto& screen_info = GetScreenInfo(browser);
|
||||
cursor_loader.SetDisplayData(
|
||||
OrientationAngleToRotation(screen_info.orientation_angle),
|
||||
screen_info.device_scale_factor);
|
||||
|
||||
// Attempts to load the cursor via the platform or from pak resources.
|
||||
cursor_loader.SetPlatformCursor(&loaded_cursor);
|
||||
platform_cursor = loaded_cursor.platform();
|
||||
}
|
||||
|
||||
handled = handler->OnCursorChange(browser, platform_cursor, cursor_type,
|
||||
if (platform_cursor) {
|
||||
native_cursor = cursor_util::ToCursorHandle(platform_cursor);
|
||||
}
|
||||
|
||||
handled = handler->OnCursorChange(browser, native_cursor, cursor_type,
|
||||
custom_cursor_info);
|
||||
#elif BUILDFLAG(IS_MAC)
|
||||
// |web_cursor| owns the resulting |native_cursor|.
|
||||
|
Reference in New Issue
Block a user