electron/shell/browser/ui/views/frameless_view.cc

135 lines
4.3 KiB
C++
Raw Normal View History

// Copyright (c) 2014 GitHub, Inc.
2014-07-16 07:33:40 +00:00
// Use of this source code is governed by the MIT license that can be
// found in the LICENSE file.
#include "shell/browser/ui/views/frameless_view.h"
2014-07-16 07:33:40 +00:00
#include "shell/browser/native_browser_view_views.h"
#include "shell/browser/native_window_views.h"
2014-07-16 07:33:40 +00:00
#include "ui/aura/window.h"
#include "ui/base/hit_test.h"
2014-07-16 07:33:40 +00:00
#include "ui/views/widget/widget.h"
#include "ui/views/widget/widget_delegate.h"
namespace electron {
2014-07-16 07:33:40 +00:00
namespace {
const int kResizeInsideBoundsSize = 5;
const int kResizeAreaCornerSize = 16;
2014-07-16 07:33:40 +00:00
} // namespace
// static
const char FramelessView::kViewClassName[] = "FramelessView";
FramelessView::FramelessView() = default;
2014-07-16 07:33:40 +00:00
FramelessView::~FramelessView() = default;
2014-07-16 07:33:40 +00:00
void FramelessView::Init(NativeWindowViews* window, views::Widget* frame) {
window_ = window;
frame_ = frame;
}
int FramelessView::ResizingBorderHitTest(const gfx::Point& point) {
// Check the frame first, as we allow a small area overlapping the contents
// to be used for resize handles.
2018-04-18 01:55:30 +00:00
bool can_ever_resize = frame_->widget_delegate()
? frame_->widget_delegate()->CanResize()
: false;
// https://github.com/electron/electron/issues/611
// If window isn't resizable, we should always return HTCLIENT, otherwise the
// hover state of DOM will not be cleared probably.
if (!can_ever_resize)
return HTCLIENT;
2014-07-16 07:33:40 +00:00
// Don't allow overlapping resize handles when the window is maximized or
// fullscreen, as it can't be resized in those states.
2018-04-18 01:55:30 +00:00
int resize_border = frame_->IsMaximized() || frame_->IsFullscreen()
? 0
: kResizeInsideBoundsSize;
chore: bump chromium to 93.0.4566.0 (main) (#29980) * chore: bump chromium in DEPS to 93.0.4562.0 * chore: update patches * [base] Made Value::Take{Dict,List}() rvalue ref-qualified. https://chromium-review.googlesource.com/c/chromium/src/+/2988105 * Revert "Reland "Roll src/buildtools/third_party/libc++/trunk/ 8fa879467..79a2e924d (426 commits)"" https://chromium-review.googlesource.com/c/chromium/src/+/2995482 This reverts commit 9691d6c265f010791c37d374248559969980ec65 and 797723ec838709ddeba0c104e30727ee0b7ac8ca * Pass gfx::Insets to GetHTComponentForFrame https://chromium-review.googlesource.com/c/chromium/src/+/2984243 * chore: bump chromium in DEPS to 93.0.4563.0 * [Clipboard API] Clipboard Custom Formats implementation Part 2. https://chromium-review.googlesource.com/c/chromium/src/+/2967649 * chore: update patches * chore: bump chromium in DEPS to 93.0.4564.0 * chore: bump chromium in DEPS to 93.0.4565.0 * chore: update patches * Prevent use of base::NoDestructor for trivially-destructible types https://chromium-review.googlesource.com/c/chromium/src/+/2998672 * chore: update patches * fixup! [Clipboard API] Clipboard Custom Formats implementation Part 2. * chore: bump chromium in DEPS to 93.0.4566.0 * chore: update patches * chore: add missing header * ci: do not run clipboard tests on WOA Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com> Co-authored-by: PatchUp <73610968+patchup[bot]@users.noreply.github.com> Co-authored-by: deepak1556 <hop2deep@gmail.com> Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org>
2021-07-06 12:17:13 +00:00
return GetHTComponentForFrame(point, gfx::Insets(resize_border),
2018-04-18 01:55:30 +00:00
kResizeAreaCornerSize, kResizeAreaCornerSize,
can_ever_resize);
2014-07-16 07:33:40 +00:00
}
gfx::Rect FramelessView::GetBoundsForClientView() const {
return bounds();
}
gfx::Rect FramelessView::GetWindowBoundsForClientBounds(
const gfx::Rect& client_bounds) const {
gfx::Rect window_bounds = client_bounds;
// Enforce minimum size (1, 1) in case that client_bounds is passed with
// empty size. This could occur when the frameless window is being
// initialized.
if (window_bounds.IsEmpty()) {
window_bounds.set_width(1);
window_bounds.set_height(1);
}
return window_bounds;
}
int FramelessView::NonClientHitTest(const gfx::Point& cursor) {
if (frame_->IsFullscreen())
return HTCLIENT;
// Check attached BrowserViews for potential draggable areas.
for (auto* view : window_->browser_views()) {
auto* native_view = static_cast<NativeBrowserViewViews*>(view);
auto* view_draggable_region = native_view->draggable_region();
if (view_draggable_region &&
view_draggable_region->contains(cursor.x(), cursor.y()))
return HTCAPTION;
}
2014-07-16 07:33:40 +00:00
// Check for possible draggable region in the client area for the frameless
// window.
SkRegion* draggable_region = window_->draggable_region();
if (draggable_region && draggable_region->contains(cursor.x(), cursor.y()))
return HTCAPTION;
// Support resizing frameless window by dragging the border.
int frame_component = ResizingBorderHitTest(cursor);
if (frame_component != HTNOWHERE)
return frame_component;
return HTCLIENT;
}
void FramelessView::GetWindowMask(const gfx::Size& size, SkPath* window_mask) {}
2014-07-16 07:33:40 +00:00
2018-04-18 01:55:30 +00:00
void FramelessView::ResetWindowControls() {}
2014-07-16 07:33:40 +00:00
2018-04-18 01:55:30 +00:00
void FramelessView::UpdateWindowIcon() {}
2014-07-16 07:33:40 +00:00
2018-04-18 01:55:30 +00:00
void FramelessView::UpdateWindowTitle() {}
2014-07-16 07:33:40 +00:00
2018-04-18 01:55:30 +00:00
void FramelessView::SizeConstraintsChanged() {}
gfx::Size FramelessView::CalculatePreferredSize() const {
2018-04-18 01:55:30 +00:00
return frame_->non_client_view()
->GetWindowBoundsForClientBounds(
gfx::Rect(frame_->client_view()->GetPreferredSize()))
.size();
2014-07-16 07:33:40 +00:00
}
2014-09-01 12:10:14 +00:00
gfx::Size FramelessView::GetMinimumSize() const {
return window_->GetContentMinimumSize();
2014-07-16 07:33:40 +00:00
}
2014-09-01 12:10:14 +00:00
gfx::Size FramelessView::GetMaximumSize() const {
gfx::Size size = window_->GetContentMaximumSize();
// Electron public APIs returns (0, 0) when maximum size is not set, but it
// would break internal window APIs like HWNDMessageHandler::SetAspectRatio.
return size.IsEmpty() ? gfx::Size(INT_MAX, INT_MAX) : size;
2014-07-16 07:33:40 +00:00
}
const char* FramelessView::GetClassName() const {
return kViewClassName;
}
} // namespace electron