aa23198ad8
* chore: in shell/renderer/renderer_client_base.h, remove include media/base/key_systems_support_registration.h
last use removed in c670e38b
(##41610)
* chore: iwyu electron/fuses.h
* chore: iwyu media/base/video_frame.h
* chore: iwyu base/functional/callback.h
* chore: iwyu base/task/cancelable_task_tracker.h
* chore: iwyu shell/browser/draggable_region_provider.h
* chore: iwyu shell/browser/ui/inspectable_web_contents_view.h
* chore: iwyu ui/aura/window.h
* chore: iwyu ui/base/win/shell.h
* chore: iwyu ui/display/win/screen_win.h
* chore: iwyu ui/gfx/geometry/insets.h
* chore: iwyu ui/display/display.h
* chore: iwyu ui/gfx/geometry/skia_conversions.h
* chore: iwyu ui/gfx/geometry/rect_conversions.h
* chore: iwyu ui/gfx/geometry/point.h
* chore: iwyu ui/gfx/scoped_canvas.h
* chore: iwyu ui/gfx/image/image.h
* chore: iwyu ui/accessibility/ax_node_data.h
* chore: iwyu ui/views/animation/ink_drop_highlight.h
* chore: iwyu ui/gfx/font_list.h
* chore: iwyu ui/linux/nav_button_provider.h
* chore: iwyu shell/browser/ui/views/frameless_view.h
* chore: iwyu services/metrics/public/cpp/ukm_source_id.h
* chore: iwyu net/http/http_util.h
* chore: iwyu net/base/mime_util.h
* chore: iwyu content/public/common/content_client.h
* chore: iwyu <list>
* chore: iwyu <optional>
* chore: iwyu <memory>
* chore: iwyu base/files/file_path.h
* chore: iwyu ui/base/cursor/cursor.h
* chore: iwyu build/build_config.h
* chore: iwyu content/public/browser/web_contents.h
* chore: iwyu shell/browser/hid/hid_chooser_context.h
* chore: iwyu shell/common/platform_util.h
* chore: iwyu base/task/single_thread_task_runner.h
* chore: iwyu content/browser/renderer_host/render_widget_host_impl.h
* chore: iwyu content/public/browser/render_widget_host.h
* chore: iwyu shell/browser/electron_browser_context.h
* chore: iwyu content/public/browser/web_contents_observer.h
* chore: iwyu content/public/browser/render_frame_host.h
* chore: iwyu content/public/browser/media_stream_request.h
* chore: iwyu chrome/common/chrome_paths.h
* chore: iwyu chrome/browser/icon_manager.h
* chore: iwyu printing/print_settings.h
* chore: iwyu renderer/pepper_helper.h
* chore: iwyu shell/browser/api/process_metric.h
* chore: iwyu shell/browser/electron_browser_client.h
* chore: iwyu shell/browser/electron_browser_context.h
* chore: iwyu shell/browser/api/electron_api_session.h
* chore: iwyu shell/browser/api/electron_api_app.h
* chore: iwyu shell/browser/ui/views/client_frame_view_linux.h
* chore: iwyu shell/browser/native_window_views.h
* chore: iwyu base/win/windows_version.h
* chore: iwyu shell/common/electron_paths.h
* chore: iwyu content/public/common/content_switches.h
* chore: iwyu third_party/skia/include/core/SkRRect.h
* chore: iwyu third_party/skia/include/core/SkBitmap.h
* chore: iwyu third_party/skia
* chore: iwyu shell/browser/osr/osr_host_display_client.h
* chore: iwyu shell/browser/login_handler.h
* chore: iwyu shell/browser/javascript_environment.h
* chore: iwyu shell/browser/event_emitter_mixin.h
* fix: mac
* fix: mac
* chore: iwyu base/nix/xdg_util.h
* fix: win
* fix: win
* fix: win
* fix: win
134 lines
4.1 KiB
C++
134 lines
4.1 KiB
C++
// Copyright (c) 2014 GitHub, Inc.
|
|
// 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"
|
|
|
|
#include "shell/browser/native_window_views.h"
|
|
#include "ui/base/hit_test.h"
|
|
#include "ui/base/metadata/metadata_impl_macros.h"
|
|
#include "ui/views/widget/widget.h"
|
|
#include "ui/views/widget/widget_delegate.h"
|
|
|
|
namespace electron {
|
|
|
|
namespace {
|
|
|
|
const int kResizeInsideBoundsSize = 5;
|
|
const int kResizeAreaCornerSize = 16;
|
|
|
|
} // namespace
|
|
|
|
FramelessView::FramelessView() = default;
|
|
|
|
FramelessView::~FramelessView() = default;
|
|
|
|
void FramelessView::Init(NativeWindowViews* window, views::Widget* frame) {
|
|
window_ = window;
|
|
frame_ = frame;
|
|
}
|
|
|
|
int FramelessView::ResizingBorderHitTest(const gfx::Point& point) {
|
|
return ResizingBorderHitTestImpl(point, gfx::Insets(kResizeInsideBoundsSize));
|
|
}
|
|
|
|
int FramelessView::ResizingBorderHitTestImpl(const gfx::Point& point,
|
|
const gfx::Insets& resize_border) {
|
|
// to be used for resize handles.
|
|
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 HTNOWHERE, otherwise the
|
|
// hover state of DOM will not be cleared probably.
|
|
if (!can_ever_resize)
|
|
return HTNOWHERE;
|
|
|
|
// Don't allow overlapping resize handles when the window is maximized or
|
|
// fullscreen, as it can't be resized in those states.
|
|
bool allow_overlapping_handles =
|
|
!frame_->IsMaximized() && !frame_->IsFullscreen();
|
|
return GetHTComponentForFrame(
|
|
point, allow_overlapping_handles ? resize_border : gfx::Insets(),
|
|
kResizeAreaCornerSize, kResizeAreaCornerSize, can_ever_resize);
|
|
}
|
|
|
|
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& point) {
|
|
if (frame_->IsFullscreen())
|
|
return HTCLIENT;
|
|
|
|
int contents_hit_test = window_->NonClientHitTest(point);
|
|
if (contents_hit_test != HTNOWHERE)
|
|
return contents_hit_test;
|
|
|
|
// Support resizing frameless window by dragging the border.
|
|
int frame_component = ResizingBorderHitTest(point);
|
|
if (frame_component != HTNOWHERE)
|
|
return frame_component;
|
|
|
|
return HTCLIENT;
|
|
}
|
|
|
|
void FramelessView::GetWindowMask(const gfx::Size& size, SkPath* window_mask) {}
|
|
|
|
void FramelessView::ResetWindowControls() {}
|
|
|
|
void FramelessView::UpdateWindowIcon() {}
|
|
|
|
void FramelessView::InvalidateCaptionButtons() {}
|
|
|
|
void FramelessView::UpdateWindowTitle() {}
|
|
|
|
void FramelessView::SizeConstraintsChanged() {}
|
|
|
|
views::View* FramelessView::TargetForRect(views::View* root,
|
|
const gfx::Rect& rect) {
|
|
CHECK_EQ(root, this);
|
|
|
|
if (NonClientHitTest(rect.origin()) != HTCLIENT)
|
|
return this;
|
|
|
|
return NonClientFrameView::TargetForRect(root, rect);
|
|
}
|
|
|
|
gfx::Size FramelessView::CalculatePreferredSize(
|
|
const views::SizeBounds& available_size) const {
|
|
return frame_->non_client_view()
|
|
->GetWindowBoundsForClientBounds(gfx::Rect(
|
|
frame_->client_view()->CalculatePreferredSize(available_size)))
|
|
.size();
|
|
}
|
|
|
|
gfx::Size FramelessView::GetMinimumSize() const {
|
|
return window_->GetContentMinimumSize();
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
BEGIN_METADATA(FramelessView)
|
|
END_METADATA
|
|
|
|
} // namespace electron
|