Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(175)

Unified Diff: views/widget/widget_win.cc

Issue 7015051: Re-land: (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 9 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « views/widget/widget_win.h ('k') | views/widget/widget_win_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: views/widget/widget_win.cc
===================================================================
--- views/widget/widget_win.cc (revision 85284)
+++ views/widget/widget_win.cc (working copy)
@@ -132,8 +132,8 @@
////////////////////////////////////////////////////////////////////////////////
// WidgetWin, public:
-WidgetWin::WidgetWin()
- : ALLOW_THIS_IN_INITIALIZER_LIST(delegate_(this)),
+WidgetWin::WidgetWin(internal::NativeWidgetDelegate* delegate)
+ : delegate_(delegate),
close_widget_factory_(this),
active_mouse_tracking_flags_(0),
use_layered_buffer_(false),
@@ -147,14 +147,14 @@
accessibility_view_events_(kMaxAccessibilityViewEvents),
previous_cursor_(NULL),
is_input_method_win_(false) {
- set_native_widget(this);
}
WidgetWin::~WidgetWin() {
// We need to delete the input method before calling DestroyRootView(),
// because it'll set focus_manager_ to NULL.
input_method_.reset();
- DestroyRootView();
+ if (delete_on_destroy_)
+ delete delegate_;
}
// static
@@ -192,8 +192,25 @@
}
////////////////////////////////////////////////////////////////////////////////
-// WidgetWin, Widget implementation:
+// WidgetWin, NativeWidget implementation:
+void WidgetWin::InitNativeWidget(const Widget::InitParams& params) {
+ SetInitParams(params);
+
+ // Create the window.
+ gfx::NativeView parent = params.parent_widget ?
+ params.parent_widget->GetNativeView() : params.parent;
+ WindowImpl::Init(parent, params.bounds);
+}
+
+Widget* WidgetWin::GetWidget() {
+ return delegate_->AsWidget();
+}
+
+const Widget* WidgetWin::GetWidget() const {
+ return delegate_->AsWidget();
+}
+
gfx::NativeView WidgetWin::GetNativeView() const {
return WindowImpl::hwnd();
}
@@ -202,44 +219,21 @@
return WindowImpl::hwnd();
}
-bool WidgetWin::GetAccelerator(int cmd_id, ui::Accelerator* accelerator) {
- return false;
-}
-
-Window* WidgetWin::GetWindow() {
+Window* WidgetWin::GetContainingWindow() {
return GetWindowImpl(hwnd());
}
-const Window* WidgetWin::GetWindow() const {
+const Window* WidgetWin::GetContainingWindow() const {
return GetWindowImpl(hwnd());
}
-void WidgetWin::ViewHierarchyChanged(bool is_add, View* parent,
- View* child) {
- Widget::ViewHierarchyChanged(is_add, parent, child);
+void WidgetWin::ViewRemoved(View* view) {
if (drop_target_.get())
- drop_target_->ResetTargetViewIfEquals(child);
+ drop_target_->ResetTargetViewIfEquals(view);
- if (!is_add)
- ClearAccessibilityViewEvent(child);
+ ClearAccessibilityViewEvent(view);
}
-////////////////////////////////////////////////////////////////////////////////
-// WidgetWin, NativeWidget implementation:
-
-void WidgetWin::InitNativeWidget(const Widget::InitParams& params) {
- SetInitParams(params);
-
- // Create the window.
- gfx::NativeView parent = params.parent_widget ?
- params.parent_widget->GetNativeView() : params.parent;
- WindowImpl::Init(parent, params.bounds);
-}
-
-Widget* WidgetWin::GetWidget() {
- return this;
-}
-
void WidgetWin::SetNativeWindowProperty(const char* name, void* value) {
// Remove the existing property (if any).
for (ViewProps::iterator i = props_.begin(); i != props_.end(); ++i) {
@@ -265,6 +259,19 @@
return screen_reader_active_;
}
+void WidgetWin::SendNativeAccessibilityEvent(
+ View* view,
+ ui::AccessibilityTypes::Event event_type) {
+ // Now call the Windows-specific method to notify MSAA clients of this
+ // event. The widget gives us a temporary unique child ID to associate
+ // with this view so that clients can call get_accChild in
+ // NativeViewAccessibilityWin to retrieve the IAccessible associated
+ // with this view.
+ int child_id = AddAccessibilityViewEvent(view);
+ ::NotifyWinEvent(NativeViewAccessibilityWin::MSAAEvent(event_type),
+ GetNativeView(), OBJID_CLIENT, child_id);
+}
+
void WidgetWin::SetMouseCapture() {
DCHECK(!HasMouseCapture());
SetCapture(hwnd());
@@ -278,6 +285,14 @@
return GetCapture() == hwnd();
}
+bool WidgetWin::IsMouseButtonDown() const {
+ return (GetKeyState(VK_LBUTTON) & 0x80) ||
+ (GetKeyState(VK_RBUTTON) & 0x80) ||
+ (GetKeyState(VK_MBUTTON) & 0x80) ||
+ (GetKeyState(VK_XBUTTON1) & 0x80) ||
+ (GetKeyState(VK_XBUTTON2) & 0x80);
+}
+
InputMethod* WidgetWin::GetInputMethodNative() {
return input_method_.get();
}
@@ -447,26 +462,6 @@
}
}
-void WidgetWin::NotifyAccessibilityEvent(
- View* view,
- ui::AccessibilityTypes::Event event_type,
- bool send_native_event) {
- // Send the notification to the delegate.
- if (ViewsDelegate::views_delegate)
- ViewsDelegate::views_delegate->NotifyAccessibilityEvent(view, event_type);
-
- // Now call the Windows-specific method to notify MSAA clients of this
- // event. The widget gives us a temporary unique child ID to associate
- // with this view so that clients can call get_accChild in
- // NativeViewAccessibilityWin to retrieve the IAccessible associated
- // with this view.
- if (send_native_event) {
- int child_id = AddAccessibilityViewEvent(view);
- ::NotifyWinEvent(NativeViewAccessibilityWin::MSAAEvent(event_type),
- GetNativeView(), OBJID_CLIENT, child_id);
- }
-}
-
////////////////////////////////////////////////////////////////////////////////
// WidgetWin, MessageLoop::Observer implementation:
@@ -507,7 +502,7 @@
PostProcessActivateMessage(this, LOWORD(w_param));
if (message == WM_ENABLE && restore_focus_when_enabled_) {
restore_focus_when_enabled_ = false;
- GetFocusManager()->RestoreFocusedView();
+ GetWidget()->GetFocusManager()->RestoreFocusedView();
}
return result;
}
@@ -558,7 +553,7 @@
props_.push_back(SetWindowSupportsRerouteMouseWheel(hwnd()));
- drop_target_ = new DropTargetWin(GetRootView());
+ drop_target_ = new DropTargetWin(GetWidget()->GetRootView());
// We need to add ourselves as a message loop observer so that we can repaint
// aggressively if the contents of our window become invalid. Unfortunately
@@ -569,10 +564,10 @@
// Windows special DWM window frame requires a special tooltip manager so
// that window controls in Chrome windows don't flicker when you move your
// mouse over them. See comment in aero_tooltip_manager.h.
- if (GetThemeProvider()->ShouldUseNativeFrame()) {
- tooltip_manager_.reset(new AeroTooltipManager(this));
+ if (GetWidget()->GetThemeProvider()->ShouldUseNativeFrame()) {
+ tooltip_manager_.reset(new AeroTooltipManager(GetWidget()));
} else {
- tooltip_manager_.reset(new TooltipManagerWin(this));
+ tooltip_manager_.reset(new TooltipManagerWin(GetWidget()));
}
// This message initializes the window so that focus border are shown for
@@ -612,8 +607,8 @@
}
void WidgetWin::OnDisplayChange(UINT bits_per_pixel, CSize screen_size) {
- if (widget_delegate())
- widget_delegate()->OnDisplayChanged();
+ if (GetWidget()->widget_delegate())
+ GetWidget()->widget_delegate()->OnDisplayChanged();
}
LRESULT WidgetWin::OnDwmCompositionChanged(UINT msg,
@@ -651,7 +646,8 @@
if (OBJID_CLIENT == l_param) {
// Retrieve MSAA dispatch object for the root view.
base::win::ScopedComPtr<IAccessible> root(
- NativeViewAccessibilityWin::GetAccessibleForView(GetRootView()));
+ NativeViewAccessibilityWin::GetAccessibleForView(
+ GetWidget()->GetRootView()));
// Create a reference that MSAA will marshall to the client.
reference_result = LresultFromObject(IID_IAccessible, w_param,
@@ -789,14 +785,16 @@
}
void WidgetWin::OnMove(const CPoint& point) {
- if (widget_delegate())
- widget_delegate()->OnWidgetMove();
+ // TODO(beng): move to Widget.
+ if (GetWidget()->widget_delegate())
+ GetWidget()->widget_delegate()->OnWidgetMove();
SetMsgHandled(FALSE);
}
void WidgetWin::OnMoving(UINT param, const LPRECT new_bounds) {
- if (widget_delegate())
- widget_delegate()->OnWidgetMove();
+ // TODO(beng): move to Widget.
+ if (GetWidget()->widget_delegate())
+ GetWidget()->widget_delegate()->OnWidgetMove();
}
LRESULT WidgetWin::OnNCActivate(BOOL active) {
@@ -893,8 +891,9 @@
}
void WidgetWin::OnSettingChange(UINT flags, const wchar_t* section) {
- if (flags == SPI_SETWORKAREA && widget_delegate())
- widget_delegate()->OnWorkAreaChanged();
+ // TODO(beng): move to Widget.
+ if (flags == SPI_SETWORKAREA && GetWidget()->widget_delegate())
+ GetWidget()->widget_delegate()->OnWorkAreaChanged();
SetMsgHandled(FALSE);
}
@@ -961,8 +960,9 @@
}
void WidgetWin::SetInitialFocus() {
- View* v = widget_delegate() ?
- widget_delegate()->GetInitiallyFocusedView() : NULL;
+ // TODO(beng): move to Widget.
+ View* v = GetWidget()->widget_delegate() ?
+ GetWidget()->widget_delegate()->GetInitiallyFocusedView() : NULL;
if (v)
v->RequestFocus();
}
@@ -979,7 +979,7 @@
WidgetWin* widget =
reinterpret_cast<WidgetWin*>(ui::GetWindowUserData(parent));
if (widget && widget->is_window_)
- return static_cast<WindowWin*>(widget);
+ return static_cast<WindowWin*>(widget)->GetWindow();
parent = ::GetParent(parent);
}
return NULL;
@@ -1016,7 +1016,7 @@
}
}
-void WidgetWin::SetInitParams(const InitParams& params) {
+void WidgetWin::SetInitParams(const Widget::InitParams& params) {
// Set non-style attributes.
delete_on_destroy_ = params.delete_on_destroy;
@@ -1044,21 +1044,15 @@
// Set type-dependent style attributes.
switch (params.type) {
- case InitParams::TYPE_WINDOW:
- case InitParams::TYPE_CONTROL:
+ case Widget::InitParams::TYPE_WINDOW:
+ case Widget::InitParams::TYPE_CONTROL:
break;
- case InitParams::TYPE_POPUP:
+ case Widget::InitParams::TYPE_POPUP:
style |= WS_POPUP;
ex_style |= WS_EX_TOOLWINDOW;
break;
- case InitParams::TYPE_MENU:
+ case Widget::InitParams::TYPE_MENU:
style |= WS_POPUP;
- is_mouse_button_pressed_ =
- ((GetKeyState(VK_LBUTTON) & 0x80) ||
- (GetKeyState(VK_RBUTTON) & 0x80) ||
- (GetKeyState(VK_MBUTTON) & 0x80) ||
- (GetKeyState(VK_XBUTTON1) & 0x80) ||
- (GetKeyState(VK_XBUTTON2) & 0x80));
break;
default:
NOTREACHED();
@@ -1089,7 +1083,7 @@
layered_window_invalid_rect_.y(),
layered_window_invalid_rect_.width(),
layered_window_invalid_rect_.height());
- GetRootView()->Paint(layered_window_contents_.get());
+ GetWidget()->GetRootView()->Paint(layered_window_contents_.get());
layered_window_contents_->restore();
RECT wr;
@@ -1107,7 +1101,7 @@
void WidgetWin::ClientAreaSizeChanged() {
RECT r;
- if (GetThemeProvider()->ShouldUseNativeFrame() || IsZoomed())
+ if (GetWidget()->GetThemeProvider()->ShouldUseNativeFrame() || IsZoomed())
GetClientRect(&r);
else
GetWindowRect(&r);
@@ -1133,13 +1127,26 @@
// Widget, public:
// static
-Widget* Widget::CreateWidget() {
- return new WidgetWin;
+void Widget::NotifyLocaleChanged() {
+ NOTIMPLEMENTED();
}
+namespace {
+BOOL CALLBACK WindowCallbackProc(HWND hwnd, LPARAM lParam) {
+ NativeWidget* native_widget =
+ NativeWidget::GetNativeWidgetForNativeView(hwnd);
+ if (native_widget) {
+ Widget* widget = native_widget->GetWidget();
+ if (widget->is_secondary_widget())
+ widget->Close();
+ }
+ return TRUE;
+}
+} // namespace
+
// static
-void Widget::NotifyLocaleChanged() {
- NOTIMPLEMENTED();
+void Widget::CloseAllSecondaryWidgets() {
+ EnumThreadWindows(GetCurrentThreadId(), WindowCallbackProc, 0);
}
bool Widget::ConvertRect(const Widget* source,
@@ -1167,17 +1174,26 @@
////////////////////////////////////////////////////////////////////////////////
// NativeWidget, public:
+// static
+NativeWidget* NativeWidget::CreateNativeWidget(
+ internal::NativeWidgetDelegate* delegate) {
+ return new WidgetWin(delegate);
+}
+
+// static
NativeWidget* NativeWidget::GetNativeWidgetForNativeView(
gfx::NativeView native_view) {
return reinterpret_cast<WidgetWin*>(
ViewProp::GetValue(native_view, kNativeWidgetKey));
}
+// static
NativeWidget* NativeWidget::GetNativeWidgetForNativeWindow(
gfx::NativeWindow native_window) {
return GetNativeWidgetForNativeView(native_window);
}
+// static
NativeWidget* NativeWidget::GetTopLevelNativeWidget(
gfx::NativeView native_view) {
if (!native_view)
@@ -1206,6 +1222,7 @@
return widget;
}
+// static
void NativeWidget::GetAllNativeWidgets(gfx::NativeView native_view,
NativeWidgets* children) {
if (!native_view)
@@ -1218,6 +1235,7 @@
reinterpret_cast<LPARAM>(children));
}
+// static
void NativeWidget::ReparentNativeView(gfx::NativeView native_view,
gfx::NativeView new_parent) {
if (!native_view)
« no previous file with comments | « views/widget/widget_win.h ('k') | views/widget/widget_win_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698