| 
									
										
										
										
											2014-10-31 11:17:05 -07:00
										 |  |  | // Copyright (c) 2014 GitHub, Inc.
 | 
					
						
							| 
									
										
										
										
											2014-07-16 15:33:40 +08:00
										 |  |  | // Use of this source code is governed by the MIT license that can be
 | 
					
						
							|  |  |  | // found in the LICENSE file.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "atom/browser/ui/views/frameless_view.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "atom/browser/native_window_views.h"
 | 
					
						
							|  |  |  | #include "ui/aura/window.h"
 | 
					
						
							| 
									
										
										
										
											2014-07-16 16:00:08 +08:00
										 |  |  | #include "ui/base/hit_test.h"
 | 
					
						
							| 
									
										
										
										
											2014-07-16 15:33:40 +08:00
										 |  |  | #include "ui/views/widget/widget.h"
 | 
					
						
							|  |  |  | #include "ui/views/widget/widget_delegate.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace atom { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const int kResizeInsideBoundsSize = 5; | 
					
						
							|  |  |  | const int kResizeAreaCornerSize = 16; | 
					
						
							| 
									
										
										
										
											2014-07-16 15:40:22 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-16 15:33:40 +08:00
										 |  |  | }  // namespace
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-15 11:49:27 -07:00
										 |  |  | // static
 | 
					
						
							|  |  |  | const char FramelessView::kViewClassName[] = "FramelessView"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-22 00:18:38 +02:00
										 |  |  | FramelessView::FramelessView() {} | 
					
						
							| 
									
										
										
										
											2014-07-16 15:33:40 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-17 21:55:30 -04:00
										 |  |  | FramelessView::~FramelessView() {} | 
					
						
							| 
									
										
										
										
											2014-07-16 15:33:40 +08: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-17 21:55:30 -04:00
										 |  |  |   bool can_ever_resize = frame_->widget_delegate() | 
					
						
							|  |  |  |                              ? frame_->widget_delegate()->CanResize() | 
					
						
							|  |  |  |                              : false; | 
					
						
							| 
									
										
										
										
											2014-07-16 15:33:40 +08: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-17 21:55:30 -04:00
										 |  |  |   int resize_border = frame_->IsMaximized() || frame_->IsFullscreen() | 
					
						
							|  |  |  |                           ? 0 | 
					
						
							|  |  |  |                           : kResizeInsideBoundsSize; | 
					
						
							| 
									
										
										
										
											2014-07-16 15:33:40 +08:00
										 |  |  |   return GetHTComponentForFrame(point, resize_border, resize_border, | 
					
						
							| 
									
										
										
										
											2018-04-17 21:55:30 -04:00
										 |  |  |                                 kResizeAreaCornerSize, kResizeAreaCornerSize, | 
					
						
							|  |  |  |                                 can_ever_resize); | 
					
						
							| 
									
										
										
										
											2014-07-16 15:33:40 +08: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 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, | 
					
						
							| 
									
										
										
										
											2018-04-17 21:55:30 -04:00
										 |  |  |                                   gfx::Path* window_mask) {} | 
					
						
							| 
									
										
										
										
											2014-07-16 15:33:40 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-17 21:55:30 -04:00
										 |  |  | void FramelessView::ResetWindowControls() {} | 
					
						
							| 
									
										
										
										
											2014-07-16 15:33:40 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-17 21:55:30 -04:00
										 |  |  | void FramelessView::UpdateWindowIcon() {} | 
					
						
							| 
									
										
										
										
											2014-07-16 15:33:40 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-17 21:55:30 -04:00
										 |  |  | void FramelessView::UpdateWindowTitle() {} | 
					
						
							| 
									
										
										
										
											2014-07-16 15:33:40 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-17 21:55:30 -04:00
										 |  |  | void FramelessView::SizeConstraintsChanged() {} | 
					
						
							| 
									
										
										
										
											2014-12-09 16:52:11 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-12 15:32:11 +00:00
										 |  |  | gfx::Size FramelessView::CalculatePreferredSize() const { | 
					
						
							| 
									
										
										
										
											2018-04-17 21:55:30 -04:00
										 |  |  |   return frame_->non_client_view() | 
					
						
							|  |  |  |       ->GetWindowBoundsForClientBounds( | 
					
						
							|  |  |  |           gfx::Rect(frame_->client_view()->GetPreferredSize())) | 
					
						
							|  |  |  |       .size(); | 
					
						
							| 
									
										
										
										
											2014-07-16 15:33:40 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-01 20:10:14 +08:00
										 |  |  | gfx::Size FramelessView::GetMinimumSize() const { | 
					
						
							| 
									
										
										
										
											2018-05-12 17:37:31 +02:00
										 |  |  |   return window_->GetContentMinimumSize(); | 
					
						
							| 
									
										
										
										
											2014-07-16 15:33:40 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-01 20:10:14 +08:00
										 |  |  | gfx::Size FramelessView::GetMaximumSize() const { | 
					
						
							| 
									
										
										
										
											2018-05-12 17:37:31 +02:00
										 |  |  |   return window_->GetContentMaximumSize(); | 
					
						
							| 
									
										
										
										
											2014-07-16 15:33:40 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const char* FramelessView::GetClassName() const { | 
					
						
							|  |  |  |   return kViewClassName; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | }  // namespace atom
 |