1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
|
// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ui/base/win/hwnd_metrics.h"
#include "ui/display/screen.h"
#include "ui/display/win/screen_win.h"
#include "ui/display/win/screen_win_headless.h"
namespace ui {
namespace {
int GetFrameThicknessFromDisplayId(int64_t id) {
const int resize_frame_thickness =
display::win::GetScreenWinHeadless()->GetSystemMetricsForDisplayId(
id, SM_CXSIZEFRAME);
const int padding_thickness =
display::win::GetScreenWinHeadless()->GetSystemMetricsForDisplayId(
id, SM_CXPADDEDBORDER);
return resize_frame_thickness + padding_thickness;
}
} // namespace
int GetResizeFrameOnlyThickness(HMONITOR monitor) {
return display::win::GetScreenWin()->GetSystemMetricsForMonitor(
monitor, SM_CXSIZEFRAME);
}
int GetFrameThickness(HMONITOR monitor, bool has_caption) {
// On Windows 10 the visible frame border is one pixel thick, but there is
// some additional non-visible space: SM_CXSIZEFRAME (the resize handle)
// and SM_CXPADDEDBORDER (additional border space that isn't part of the
// resize handle).
const int resize_frame_thickness = GetResizeFrameOnlyThickness(monitor);
const int padding_thickness =
display::win::GetScreenWin()->GetSystemMetricsForMonitor(
monitor, SM_CXPADDEDBORDER);
return resize_frame_thickness + padding_thickness - (has_caption ? 0 : 1);
}
int GetFrameThicknessFromWindow(HWND hwnd, DWORD default_options) {
if (display::Screen::GetScreen()->IsHeadless()) {
return GetFrameThicknessFromDisplayId(
display::win::GetScreenWinHeadless()->GetDisplayIdFromWindow(
hwnd, default_options));
} else {
HMONITOR monitor = ::MonitorFromWindow(hwnd, default_options);
return GetFrameThickness(monitor,
GetWindowLong(hwnd, GWL_STYLE) & WS_CAPTION);
}
}
int GetFrameThicknessFromScreenRect(const gfx::Rect& screen_rect) {
if (display::Screen::GetScreen()->IsHeadless()) {
return GetFrameThicknessFromDisplayId(
display::win::GetScreenWinHeadless()->GetDisplayIdFromScreenRect(
screen_rect));
} else {
// This should never be used in headful mode due to the lack of support by
// display::win::ScreenWin.
NOTREACHED();
}
}
} // namespace ui
|