OLD | NEW |
---|---|
(Empty) | |
1 // Copyright (c) 2017 The Chromium Authors. All rights reserved. | |
sadrul
2017/06/28 04:41:58
No (c)
msisov
2017/06/28 20:55:04
Done.
| |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "ui/views/widget/desktop_aura/window_event_filter.h" | |
6 | |
7 #include "services/ui/public/interfaces/window_manager_constants.mojom.h" | |
8 #include "ui/aura/client/aura_constants.h" | |
9 #include "ui/aura/window.h" | |
10 #include "ui/aura/window_delegate.h" | |
11 #include "ui/aura/window_tree_host.h" | |
12 #include "ui/base/hit_test.h" | |
13 #include "ui/display/display.h" | |
14 #include "ui/display/screen.h" | |
15 #include "ui/events/event.h" | |
16 #include "ui/events/event_utils.h" | |
17 #include "ui/views/linux_ui/linux_ui.h" | |
18 #include "ui/views/widget/desktop_aura/desktop_window_tree_host.h" | |
19 #include "ui/views/widget/native_widget_aura.h" | |
20 #include "ui/views/widget/widget.h" | |
21 | |
22 namespace views { | |
23 | |
24 WindowEventFilter::WindowEventFilter(DesktopWindowTreeHost* window_tree_host) | |
25 : window_tree_host_(window_tree_host), click_component_(HTNOWHERE) {} | |
26 | |
27 WindowEventFilter::~WindowEventFilter() {} | |
28 | |
29 void WindowEventFilter::OnMouseEvent(ui::MouseEvent* event) { | |
30 if (event->type() != ui::ET_MOUSE_PRESSED) | |
31 return; | |
32 | |
33 aura::Window* target = static_cast<aura::Window*>(event->target()); | |
34 if (!target->delegate()) | |
35 return; | |
36 | |
37 int previous_click_component = HTNOWHERE; | |
38 int component = target->delegate()->GetNonClientComponent(event->location()); | |
39 if (event->IsLeftMouseButton()) { | |
40 previous_click_component = click_component_; | |
41 click_component_ = component; | |
42 } | |
43 | |
44 if (component == HTCAPTION) { | |
45 OnClickedCaption(event, previous_click_component); | |
46 } else if (component == HTMAXBUTTON) { | |
47 OnClickedMaximizeButton(event); | |
48 } else { | |
49 if (target->GetProperty(aura::client::kResizeBehaviorKey) & | |
50 ui::mojom::kResizeBehaviorCanResize) { | |
51 MaybeDispatchHostWindowDragMovement(component, event); | |
52 } | |
53 } | |
54 } | |
55 | |
56 void WindowEventFilter::OnClickedCaption(ui::MouseEvent* event, | |
57 int previous_click_component) { | |
58 aura::Window* target = static_cast<aura::Window*>(event->target()); | |
59 | |
60 if (event->IsMiddleMouseButton()) { | |
61 LinuxUI::NonClientMiddleClickAction action = | |
62 LinuxUI::MIDDLE_CLICK_ACTION_LOWER; | |
63 LinuxUI* linux_ui = LinuxUI::instance(); | |
64 if (linux_ui) | |
65 action = linux_ui->GetNonClientMiddleClickAction(); | |
66 | |
67 switch (action) { | |
68 case LinuxUI::MIDDLE_CLICK_ACTION_NONE: | |
69 break; | |
70 case LinuxUI::MIDDLE_CLICK_ACTION_LOWER: | |
71 LowerWindow(); | |
72 break; | |
73 case LinuxUI::MIDDLE_CLICK_ACTION_MINIMIZE: | |
74 window_tree_host_->Minimize(); | |
75 break; | |
76 case LinuxUI::MIDDLE_CLICK_ACTION_TOGGLE_MAXIMIZE: | |
77 if (target->GetProperty(aura::client::kResizeBehaviorKey) & | |
78 ui::mojom::kResizeBehaviorCanMaximize) | |
79 ToggleMaximizedState(); | |
80 break; | |
81 } | |
82 | |
83 event->SetHandled(); | |
84 return; | |
85 } | |
86 | |
87 if (event->IsLeftMouseButton() && event->flags() & ui::EF_IS_DOUBLE_CLICK) { | |
88 click_component_ = HTNOWHERE; | |
89 if ((target->GetProperty(aura::client::kResizeBehaviorKey) & | |
90 ui::mojom::kResizeBehaviorCanMaximize) && | |
91 previous_click_component == HTCAPTION) { | |
92 // Our event is a double click in the caption area in a window that can be | |
93 // maximized. We are responsible for dispatching this as a minimize/ | |
94 // maximize on X11 (Windows converts this to min/max events for us). | |
95 ToggleMaximizedState(); | |
96 event->SetHandled(); | |
97 return; | |
98 } | |
99 } | |
100 | |
101 MaybeDispatchHostWindowDragMovement(HTCAPTION, event); | |
102 } | |
103 | |
104 void WindowEventFilter::OnClickedMaximizeButton(ui::MouseEvent* event) { | |
105 aura::Window* target = static_cast<aura::Window*>(event->target()); | |
106 views::Widget* widget = views::Widget::GetWidgetForNativeView(target); | |
107 if (!widget) | |
108 return; | |
109 | |
110 gfx::Rect display_work_area = | |
111 display::Screen::GetScreen()->GetDisplayNearestWindow(target).work_area(); | |
112 gfx::Rect bounds = widget->GetWindowBoundsInScreen(); | |
113 if (event->IsMiddleMouseButton()) { | |
114 bounds.set_y(display_work_area.y()); | |
115 bounds.set_height(display_work_area.height()); | |
116 widget->SetBounds(bounds); | |
117 event->StopPropagation(); | |
118 } else if (event->IsRightMouseButton()) { | |
119 bounds.set_x(display_work_area.x()); | |
120 bounds.set_width(display_work_area.width()); | |
121 widget->SetBounds(bounds); | |
122 event->StopPropagation(); | |
123 } | |
124 } | |
125 | |
126 void WindowEventFilter::ToggleMaximizedState() { | |
127 if (window_tree_host_->IsMaximized()) | |
128 window_tree_host_->Restore(); | |
129 else | |
130 window_tree_host_->Maximize(); | |
131 } | |
132 | |
133 void WindowEventFilter::MaybeDispatchHostWindowDragMovement( | |
134 int hittest, | |
135 ui::MouseEvent* event) {} | |
136 | |
137 void WindowEventFilter::LowerWindow() {} | |
138 | |
139 } // namespace views | |
OLD | NEW |