mirror of
https://github.com/electron/electron.git
synced 2026-04-10 03:01:51 -04:00
feat: support screenToDipRect|dipToScreenRect on Linux
This commit is contained in:
@@ -20,6 +20,9 @@
|
||||
#include "ui/display/display.h"
|
||||
#include "ui/display/screen.h"
|
||||
#include "ui/gfx/geometry/point.h"
|
||||
#include "ui/gfx/geometry/point_conversions.h"
|
||||
#include "ui/gfx/geometry/point_f.h"
|
||||
#include "ui/gfx/geometry/rect.h"
|
||||
|
||||
#if BUILDFLAG(IS_WIN)
|
||||
#include "ui/display/win/screen_win.h"
|
||||
@@ -29,6 +32,11 @@
|
||||
#include "ui/ozone/public/ozone_platform.h"
|
||||
#endif
|
||||
|
||||
#if BUILDFLAG(IS_LINUX)
|
||||
#include "shell/browser/native_window.h"
|
||||
#include "ui/views/widget/desktop_aura/desktop_window_tree_host_linux.h"
|
||||
#endif
|
||||
|
||||
namespace electron::api {
|
||||
|
||||
gin::WrapperInfo Screen::kWrapperInfo = {gin::kEmbedderNativeGin};
|
||||
@@ -88,21 +96,41 @@ gfx::Point Screen::GetCursorScreenPoint(v8::Isolate* isolate) {
|
||||
return screen_->GetCursorScreenPoint();
|
||||
}
|
||||
|
||||
#if BUILDFLAG(IS_WIN)
|
||||
|
||||
static gfx::Rect ScreenToDIPRect(electron::NativeWindow* window,
|
||||
const gfx::Rect& rect) {
|
||||
const gfx::Rect& pixel_bounds) {
|
||||
#if BUILDFLAG(IS_WIN)
|
||||
HWND hwnd = window ? window->GetAcceleratedWidget() : nullptr;
|
||||
return display::win::ScreenWin::ScreenToDIPRect(hwnd, rect);
|
||||
return display::win::ScreenWin::ScreenToDIPRect(hwnd, pixel_bounds);
|
||||
#else
|
||||
auto* host = views::DesktopWindowTreeHostLinux::GetHostForWidget(
|
||||
window->GetAcceleratedWidget());
|
||||
gfx::Point dip_point = pixel_bounds.origin();
|
||||
host->ConvertScreenInPixelsToDIP(&dip_point);
|
||||
const float scale_factor =
|
||||
display::Screen::GetScreen()
|
||||
->GetPreferredScaleFactorForWindow(window->GetNativeWindow())
|
||||
.value_or(1.0f);
|
||||
return {dip_point, ScaleToEnclosingRect(pixel_bounds, scale_factor).size()};
|
||||
#endif
|
||||
}
|
||||
|
||||
static gfx::Rect DIPToScreenRect(electron::NativeWindow* window,
|
||||
const gfx::Rect& rect) {
|
||||
const gfx::Rect& dip_bounds) {
|
||||
#if BUILDFLAG(IS_WIN)
|
||||
HWND hwnd = window ? window->GetAcceleratedWidget() : nullptr;
|
||||
return display::win::ScreenWin::DIPToScreenRect(hwnd, rect);
|
||||
}
|
||||
|
||||
return display::win::ScreenWin::DIPToScreenRect(hwnd, dip_bounds);
|
||||
#else
|
||||
const float scale_factor =
|
||||
display::Screen::GetScreen()
|
||||
->GetPreferredScaleFactorForWindow(window->GetNativeWindow())
|
||||
.value_or(1.0f);
|
||||
auto* host = views::DesktopWindowTreeHostLinux::GetHostForWidget(
|
||||
window->GetAcceleratedWidget());
|
||||
gfx::Point px_point = dip_bounds.origin();
|
||||
host->ConvertDIPToScreenInPixels(&px_point);
|
||||
return {px_point, ScaleToEnclosingRect(dip_bounds, scale_factor).size()};
|
||||
#endif
|
||||
}
|
||||
|
||||
void Screen::OnDisplayAdded(const display::Display& new_display) {
|
||||
base::SingleThreadTaskRunner::GetCurrentDefault()->PostNonNestableTask(
|
||||
@@ -156,9 +184,9 @@ gin::ObjectTemplateBuilder Screen::GetObjectTemplateBuilder(
|
||||
#if BUILDFLAG(IS_WIN)
|
||||
.SetMethod("screenToDipPoint", &display::win::ScreenWin::ScreenToDIPPoint)
|
||||
.SetMethod("dipToScreenPoint", &display::win::ScreenWin::DIPToScreenPoint)
|
||||
#endif
|
||||
.SetMethod("screenToDipRect", &ScreenToDIPRect)
|
||||
.SetMethod("dipToScreenRect", &DIPToScreenRect)
|
||||
#endif
|
||||
.SetMethod("getDisplayMatching", &Screen::GetDisplayMatching);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user