diff options
Diffstat (limited to 'chromium/ui/views/widget/native_widget_win.cc')
-rw-r--r-- | chromium/ui/views/widget/native_widget_win.cc | 1068 |
1 files changed, 0 insertions, 1068 deletions
diff --git a/chromium/ui/views/widget/native_widget_win.cc b/chromium/ui/views/widget/native_widget_win.cc deleted file mode 100644 index 3f992e8d894..00000000000 --- a/chromium/ui/views/widget/native_widget_win.cc +++ /dev/null @@ -1,1068 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ui/views/widget/native_widget_win.h" - -#include <dwmapi.h> -#include <shellapi.h> - -#include <algorithm> - -#include "base/bind.h" -#include "base/strings/string_util.h" -#include "base/win/scoped_gdi_object.h" -#include "base/win/win_util.h" -#include "base/win/windows_version.h" -#include "ui/base/dragdrop/drag_drop_types.h" -#include "ui/base/dragdrop/drag_source_win.h" -#include "ui/base/dragdrop/os_exchange_data.h" -#include "ui/base/dragdrop/os_exchange_data_provider_win.h" -#include "ui/base/ime/input_method_factory.h" -#include "ui/base/l10n/l10n_util_win.h" -#include "ui/base/theme_provider.h" -#include "ui/base/view_prop.h" -#include "ui/base/win/mouse_wheel_util.h" -#include "ui/base/win/shell.h" -#include "ui/events/event.h" -#include "ui/events/keycodes/keyboard_code_conversion_win.h" -#include "ui/gfx/canvas.h" -#include "ui/gfx/canvas_skia_paint.h" -#include "ui/gfx/path.h" -#include "ui/gfx/point_conversions.h" -#include "ui/gfx/screen.h" -#include "ui/gfx/size_conversions.h" -#include "ui/gfx/win/dpi.h" -#include "ui/gfx/win/hwnd_util.h" -#include "ui/native_theme/native_theme.h" -#include "ui/views/controls/native_control_win.h" -#include "ui/views/controls/textfield/textfield.h" -#include "ui/views/drag_utils.h" -#include "ui/views/focus/accelerator_handler.h" -#include "ui/views/focus/view_storage.h" -#include "ui/views/focus/widget_focus_manager.h" -#include "ui/views/ime/input_method_bridge.h" -#include "ui/views/widget/aero_tooltip_manager.h" -#include "ui/views/widget/drop_target_win.h" -#include "ui/views/widget/monitor_win.h" -#include "ui/views/widget/native_widget_delegate.h" -#include "ui/views/widget/root_view.h" -#include "ui/views/widget/widget_delegate.h" -#include "ui/views/widget/widget_hwnd_utils.h" -#include "ui/views/win/fullscreen_handler.h" -#include "ui/views/win/hwnd_message_handler.h" -#include "ui/views/window/native_frame_view.h" - -#pragma comment(lib, "dwmapi.lib") - -using ui::ViewProp; - -namespace views { - -namespace { - -// Enumeration callback for NativeWidget::GetAllChildWidgets() and -// NativeWidget::GetAllOwnedWidgets. Adds any HWNDs that correspond to -// Widgets to a set. -BOOL CALLBACK EnumerateNativeWidgets(HWND hwnd, LPARAM l_param) { - Widget* widget = Widget::GetWidgetForNativeView(hwnd); - if (widget) { - Widget::Widgets* widgets = reinterpret_cast<Widget::Widgets*>(l_param); - widgets->insert(widget); - } - return TRUE; -} - -// Links the HWND to its NativeWidget. -const char* const kNativeWidgetKey = "__VIEWS_NATIVE_WIDGET__"; - -const int kDragFrameWindowAlpha = 200; - -} // namespace - -//////////////////////////////////////////////////////////////////////////////// -// NativeWidgetWin, public: - -NativeWidgetWin::NativeWidgetWin(internal::NativeWidgetDelegate* delegate) - : delegate_(delegate), - ownership_(Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET), - drag_frame_saved_window_style_(0), - drag_frame_saved_window_ex_style_(0), - has_non_client_view_(false), - message_handler_(new HWNDMessageHandler(this)) { -} - -NativeWidgetWin::~NativeWidgetWin() { - if (ownership_ == Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET) - delete delegate_; - else - CloseNow(); - message_handler_.reset(); -} - -// static -gfx::Font NativeWidgetWin::GetWindowTitleFont() { - NONCLIENTMETRICS ncm; - base::win::GetNonClientMetrics(&ncm); - l10n_util::AdjustUIFont(&(ncm.lfCaptionFont)); - base::win::ScopedHFONT caption_font(CreateFontIndirect(&(ncm.lfCaptionFont))); - return gfx::Font(caption_font); -} - -void NativeWidgetWin::Show(int show_state) { - message_handler_->Show(show_state); -} - -//////////////////////////////////////////////////////////////////////////////// -// NativeWidgetWin, NativeWidget implementation: - -void NativeWidgetWin::InitNativeWidget(const Widget::InitParams& params) { - gfx::Rect pixel_bounds = gfx::win::DIPToScreenRect(params.bounds); - Widget::InitParams params_in_pixel(params); - params_in_pixel.bounds = pixel_bounds; - SetInitParams(params_in_pixel); - message_handler_->Init(params.parent, pixel_bounds); -} - -NonClientFrameView* NativeWidgetWin::CreateNonClientFrameView() { - return GetWidget()->ShouldUseNativeFrame() ? - new NativeFrameView(GetWidget()) : NULL; -} - -bool NativeWidgetWin::ShouldUseNativeFrame() const { - return ui::win::IsAeroGlassEnabled(); -} - -void NativeWidgetWin::FrameTypeChanged() { - message_handler_->FrameTypeChanged(); -} - -Widget* NativeWidgetWin::GetWidget() { - return delegate_->AsWidget(); -} - -const Widget* NativeWidgetWin::GetWidget() const { - return delegate_->AsWidget(); -} - -gfx::NativeView NativeWidgetWin::GetNativeView() const { - return message_handler_->hwnd(); -} - -gfx::NativeWindow NativeWidgetWin::GetNativeWindow() const { - return message_handler_->hwnd(); -} - -Widget* NativeWidgetWin::GetTopLevelWidget() { - NativeWidgetPrivate* native_widget = GetTopLevelNativeWidget(GetNativeView()); - return native_widget ? native_widget->GetWidget() : NULL; -} - -const ui::Compositor* NativeWidgetWin::GetCompositor() const { - return NULL; -} - -ui::Compositor* NativeWidgetWin::GetCompositor() { - return NULL; -} - -ui::Layer* NativeWidgetWin::GetLayer() { - return NULL; -} - -void NativeWidgetWin::ReorderNativeViews() { -} - -void NativeWidgetWin::ViewRemoved(View* view) { - if (drop_target_.get()) - drop_target_->ResetTargetViewIfEquals(view); -} - -void NativeWidgetWin::SetNativeWindowProperty(const char* name, void* value) { - // Remove the existing property (if any). - for (ViewProps::iterator i = props_.begin(); i != props_.end(); ++i) { - if ((*i)->Key() == name) { - props_.erase(i); - break; - } - } - - if (value) - props_.push_back(new ViewProp(GetNativeView(), name, value)); -} - -void* NativeWidgetWin::GetNativeWindowProperty(const char* name) const { - return ViewProp::GetValue(GetNativeView(), name); -} - -TooltipManager* NativeWidgetWin::GetTooltipManager() const { - return tooltip_manager_.get(); -} - -void NativeWidgetWin::SetCapture() { - message_handler_->SetCapture(); -} - -void NativeWidgetWin::ReleaseCapture() { - message_handler_->ReleaseCapture(); -} - -bool NativeWidgetWin::HasCapture() const { - return message_handler_->HasCapture(); -} - -InputMethod* NativeWidgetWin::CreateInputMethod() { - return new InputMethodBridge(GetMessageHandler(), ui::GetSharedInputMethod(), - true); -} - -internal::InputMethodDelegate* NativeWidgetWin::GetInputMethodDelegate() { - return message_handler_.get(); -} - -void NativeWidgetWin::CenterWindow(const gfx::Size& size) { - gfx::Size size_in_pixels = gfx::win::DIPToScreenSize(size); - message_handler_->CenterWindow(size_in_pixels); -} - -void NativeWidgetWin::GetWindowPlacement( - gfx::Rect* bounds, - ui::WindowShowState* show_state) const { - message_handler_->GetWindowPlacement(bounds, show_state); - *bounds = gfx::win::ScreenToDIPRect(*bounds); -} - -bool NativeWidgetWin::SetWindowTitle(const string16& title) { - return message_handler_->SetTitle(title); -} - -void NativeWidgetWin::SetWindowIcons(const gfx::ImageSkia& window_icon, - const gfx::ImageSkia& app_icon) { - message_handler_->SetWindowIcons(window_icon, app_icon); -} - -void NativeWidgetWin::InitModalType(ui::ModalType modal_type) { - message_handler_->InitModalType(modal_type); -} - -gfx::Rect NativeWidgetWin::GetWindowBoundsInScreen() const { - gfx::Rect bounds_in_pixels = message_handler_->GetWindowBoundsInScreen(); - return gfx::win::ScreenToDIPRect(bounds_in_pixels); -} - -gfx::Rect NativeWidgetWin::GetClientAreaBoundsInScreen() const { - gfx::Rect bounds_in_pixels = message_handler_->GetClientAreaBoundsInScreen(); - return gfx::win::ScreenToDIPRect(bounds_in_pixels); -} - -gfx::Rect NativeWidgetWin::GetRestoredBounds() const { - gfx::Rect bounds_in_pixels = message_handler_->GetRestoredBounds(); - return gfx::win::ScreenToDIPRect(bounds_in_pixels); -} - -void NativeWidgetWin::SetBounds(const gfx::Rect& bounds) { - float scale = gfx::win::GetDeviceScaleFactor(); - gfx::Rect bounds_in_pixels( - gfx::ToCeiledPoint(gfx::ScalePoint(bounds.origin(), scale)), - gfx::ToFlooredSize(gfx::ScaleSize(bounds.size(), scale))); - message_handler_->SetBounds(bounds_in_pixels); -} - -void NativeWidgetWin::SetSize(const gfx::Size& size) { - message_handler_->SetSize(size); -} - -void NativeWidgetWin::StackAbove(gfx::NativeView native_view) { - message_handler_->StackAbove(native_view); -} - -void NativeWidgetWin::StackAtTop() { - message_handler_->StackAtTop(); -} - -void NativeWidgetWin::StackBelow(gfx::NativeView native_view) { - NOTIMPLEMENTED(); -} - -void NativeWidgetWin::SetShape(gfx::NativeRegion region) { - message_handler_->SetRegion(region); -} - -void NativeWidgetWin::Close() { - message_handler_->Close(); -} - -void NativeWidgetWin::CloseNow() { - message_handler_->CloseNow(); -} - -void NativeWidgetWin::Show() { - message_handler_->Show(); -} - -void NativeWidgetWin::Hide() { - message_handler_->Hide(); -} - -void NativeWidgetWin::ShowMaximizedWithBounds( - const gfx::Rect& restored_bounds) { - gfx::Rect pixel_bounds = gfx::win::DIPToScreenRect(restored_bounds); - message_handler_->ShowMaximizedWithBounds(pixel_bounds); -} - -void NativeWidgetWin::ShowWithWindowState(ui::WindowShowState show_state) { - message_handler_->ShowWindowWithState(show_state); -} - -bool NativeWidgetWin::IsVisible() const { - return message_handler_->IsVisible(); -} - -void NativeWidgetWin::Activate() { - message_handler_->Activate(); -} - -void NativeWidgetWin::Deactivate() { - message_handler_->Deactivate(); -} - -bool NativeWidgetWin::IsActive() const { - return message_handler_->IsActive(); -} - -void NativeWidgetWin::SetAlwaysOnTop(bool on_top) { - message_handler_->SetAlwaysOnTop(on_top); -} - -bool NativeWidgetWin::IsAlwaysOnTop() const { - return message_handler_->IsAlwaysOnTop(); -} - -void NativeWidgetWin::Maximize() { - message_handler_->Maximize(); -} - -void NativeWidgetWin::Minimize() { - message_handler_->Minimize(); -} - -bool NativeWidgetWin::IsMaximized() const { - return message_handler_->IsMaximized(); -} - -bool NativeWidgetWin::IsMinimized() const { - return message_handler_->IsMinimized(); -} - -void NativeWidgetWin::Restore() { - message_handler_->Restore(); -} - -void NativeWidgetWin::SetFullscreen(bool fullscreen) { - message_handler_->fullscreen_handler()->SetFullscreen(fullscreen); -} - -void NativeWidgetWin::SetMetroSnapFullscreen(bool metro_snap) { - message_handler_->fullscreen_handler()->SetMetroSnap(metro_snap); -} - -bool NativeWidgetWin::IsFullscreen() const { - return message_handler_->fullscreen_handler()->fullscreen(); -} - -bool NativeWidgetWin::IsInMetroSnapMode() const { - return message_handler_->fullscreen_handler()->metro_snap(); -} - -void NativeWidgetWin::SetCanUpdateLayeredWindow(bool can_update) { - message_handler_->set_can_update_layered_window(can_update); -} - -void NativeWidgetWin::SetOpacity(unsigned char opacity) { - message_handler_->SetOpacity(static_cast<BYTE>(opacity)); - GetWidget()->GetRootView()->SchedulePaint(); -} - -void NativeWidgetWin::SetUseDragFrame(bool use_drag_frame) { - if (use_drag_frame) { - // Make the frame slightly transparent during the drag operation. - drag_frame_saved_window_style_ = GetWindowLong(GetNativeView(), GWL_STYLE); - drag_frame_saved_window_ex_style_ = - GetWindowLong(GetNativeView(), GWL_EXSTYLE); - SetWindowLong(GetNativeView(), GWL_EXSTYLE, - drag_frame_saved_window_ex_style_ | WS_EX_LAYERED); - // Remove the captions tyle so the window doesn't have window controls for a - // more "transparent" look. - SetWindowLong(GetNativeView(), GWL_STYLE, - drag_frame_saved_window_style_ & ~WS_CAPTION); - SetLayeredWindowAttributes(GetNativeView(), RGB(0xFF, 0xFF, 0xFF), - kDragFrameWindowAlpha, LWA_ALPHA); - } else { - SetWindowLong(GetNativeView(), GWL_STYLE, drag_frame_saved_window_style_); - SetWindowLong(GetNativeView(), GWL_EXSTYLE, - drag_frame_saved_window_ex_style_); - } -} - -void NativeWidgetWin::FlashFrame(bool flash) { - message_handler_->FlashFrame(flash); -} - -void NativeWidgetWin::RunShellDrag(View* view, - const ui::OSExchangeData& data, - const gfx::Point& location, - int operation, - ui::DragDropTypes::DragEventSource source) { - views::RunShellDrag(NULL, data, location, operation, source); -} - -void NativeWidgetWin::SchedulePaintInRect(const gfx::Rect& rect) { - gfx::Rect pixel_rect = gfx::win::DIPToScreenRect(rect); - message_handler_->SchedulePaintInRect(pixel_rect); -} - -void NativeWidgetWin::SetCursor(gfx::NativeCursor cursor) { - message_handler_->SetCursor(cursor); -} - -bool NativeWidgetWin::IsMouseEventsEnabled() const { - return true; -} - -void NativeWidgetWin::ClearNativeFocus() { - message_handler_->ClearNativeFocus(); -} - -gfx::Rect NativeWidgetWin::GetWorkAreaBoundsInScreen() const { - return gfx::win::ScreenToDIPRect( - gfx::Screen::GetNativeScreen()->GetDisplayNearestWindow( - GetNativeView()).work_area()); -} - -Widget::MoveLoopResult NativeWidgetWin::RunMoveLoop( - const gfx::Vector2d& drag_offset, - Widget::MoveLoopSource source, - Widget::MoveLoopEscapeBehavior escape_behavior) { - const bool hide_on_escape = - escape_behavior == Widget::MOVE_LOOP_ESCAPE_BEHAVIOR_HIDE; - return message_handler_->RunMoveLoop(drag_offset, hide_on_escape) ? - Widget::MOVE_LOOP_SUCCESSFUL : Widget::MOVE_LOOP_CANCELED; -} - -void NativeWidgetWin::EndMoveLoop() { - message_handler_->EndMoveLoop(); -} - -void NativeWidgetWin::SetVisibilityChangedAnimationsEnabled(bool value) { - message_handler_->SetVisibilityChangedAnimationsEnabled(value); -} - -ui::NativeTheme* NativeWidgetWin::GetNativeTheme() const { - return ui::NativeTheme::instance(); -} - -void NativeWidgetWin::OnRootViewLayout() const { -} - -//////////////////////////////////////////////////////////////////////////////// -// NativeWidgetWin, NativeWidget implementation: - -ui::EventHandler* NativeWidgetWin::GetEventHandler() { - NOTIMPLEMENTED(); - return NULL; -} - -//////////////////////////////////////////////////////////////////////////////// -// NativeWidgetWin, protected: - -void NativeWidgetWin::OnFinalMessage(HWND window) { - // We don't destroy props in WM_DESTROY as we may still get messages after - // WM_DESTROY that assume the properties are still valid (such as WM_CLOSE). - props_.clear(); - delegate_->OnNativeWidgetDestroyed(); - if (ownership_ == Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET) - delete this; -} - -//////////////////////////////////////////////////////////////////////////////// -// NativeWidgetWin, protected: - -HWNDMessageHandler* NativeWidgetWin::GetMessageHandler() { - return message_handler_.get(); -} - -//////////////////////////////////////////////////////////////////////////////// -// NativeWidgetWin, HWNDMessageHandlerDelegate implementation: - -bool NativeWidgetWin::IsWidgetWindow() const { - // We don't NULL check GetWidget()->non_client_view() here because this - // function can be called before the widget is fully constructed. - return has_non_client_view_; -} - -bool NativeWidgetWin::IsUsingCustomFrame() const { - return !GetWidget()->ShouldUseNativeFrame(); -} - -void NativeWidgetWin::SchedulePaint() { - GetWidget()->GetRootView()->SchedulePaint(); -} - -void NativeWidgetWin::EnableInactiveRendering() { - delegate_->EnableInactiveRendering(); -} - -bool NativeWidgetWin::IsInactiveRenderingDisabled() { - return delegate_->IsInactiveRenderingDisabled(); -} - -bool NativeWidgetWin::CanResize() const { - return GetWidget()->widget_delegate()->CanResize(); -} - -bool NativeWidgetWin::CanMaximize() const { - return GetWidget()->widget_delegate()->CanMaximize(); -} - -bool NativeWidgetWin::CanActivate() const { - return delegate_->CanActivate(); -} - -bool NativeWidgetWin::WidgetSizeIsClientSize() const { - const Widget* widget = GetWidget()->GetTopLevelWidget(); - return IsZoomed(GetNativeView()) || - (widget && widget->ShouldUseNativeFrame()); -} - -bool NativeWidgetWin::CanSaveFocus() const { - return GetWidget()->is_top_level(); -} - -void NativeWidgetWin::SaveFocusOnDeactivate() { - GetWidget()->GetFocusManager()->StoreFocusedView(true); -} - -void NativeWidgetWin::RestoreFocusOnActivate() { - // Mysteriously, this only appears to be needed support restoration of focus - // to a child hwnd when restoring its top level window from the minimized - // state. If we don't do this, then ::SetFocus() to that child HWND returns - // ERROR_INVALID_PARAMETER, despite both HWNDs being of the same thread. - // See http://crbug.com/125976 and - // chrome/browser/ui/views/native_widget_win_interactive_uitest.cc . - { - // Since this is a synthetic reset, we don't need to tell anyone about it. - AutoNativeNotificationDisabler disabler; - GetWidget()->GetFocusManager()->ClearFocus(); - } - RestoreFocusOnEnable(); -} - -void NativeWidgetWin::RestoreFocusOnEnable() { - GetWidget()->GetFocusManager()->RestoreFocusedView(); -} - -bool NativeWidgetWin::IsModal() const { - return delegate_->IsModal(); -} - -int NativeWidgetWin::GetInitialShowState() const { - return SW_SHOWNORMAL; -} - -bool NativeWidgetWin::WillProcessWorkAreaChange() const { - return GetWidget()->widget_delegate()->WillProcessWorkAreaChange(); -} - -int NativeWidgetWin::GetNonClientComponent(const gfx::Point& point) const { - gfx::Point point_in_dip = gfx::win::ScreenToDIPPoint(point); - return delegate_->GetNonClientComponent(point_in_dip); -} - -void NativeWidgetWin::GetWindowMask(const gfx::Size& size, gfx::Path* path) { - if (GetWidget()->non_client_view()) - GetWidget()->non_client_view()->GetWindowMask(size, path); -} - -bool NativeWidgetWin::GetClientAreaInsets(gfx::Insets* insets) const { - return false; -} - -void NativeWidgetWin::GetMinMaxSize(gfx::Size* min_size, - gfx::Size* max_size) const { - *min_size = gfx::win::ScreenToDIPSize(delegate_->GetMinimumSize()); - *max_size = gfx::win::ScreenToDIPSize(delegate_->GetMaximumSize()); -} - -gfx::Size NativeWidgetWin::GetRootViewSize() const { - gfx::Size pixel_size = GetWidget()->GetRootView()->size(); - return gfx::win::ScreenToDIPSize(pixel_size); -} - -void NativeWidgetWin::ResetWindowControls() { - GetWidget()->non_client_view()->ResetWindowControls(); -} - -void NativeWidgetWin::PaintLayeredWindow(gfx::Canvas* canvas) { - GetWidget()->GetRootView()->Paint(canvas); -} - -InputMethod* NativeWidgetWin::GetInputMethod() { - return GetWidget()->GetInputMethodDirect(); -} - -gfx::NativeViewAccessible NativeWidgetWin::GetNativeViewAccessible() { - return GetWidget()->GetRootView()->GetNativeViewAccessible(); -} - -bool NativeWidgetWin::ShouldHandleSystemCommands() const { - return GetWidget()->widget_delegate()->ShouldHandleSystemCommands(); -} - -void NativeWidgetWin::HandleAppDeactivated() { - if (IsInactiveRenderingDisabled()) { - delegate_->EnableInactiveRendering(); - } else { - // TODO(pkotwicz): Remove need for SchedulePaint(). crbug.com/165841 - View* non_client_view = GetWidget()->non_client_view(); - if (non_client_view) - non_client_view->SchedulePaint(); - } -} - -void NativeWidgetWin::HandleActivationChanged(bool active) { - delegate_->OnNativeWidgetActivationChanged(active); -} - -bool NativeWidgetWin::HandleAppCommand(short command) { - // We treat APPCOMMAND ids as an extension of our command namespace, and just - // let the delegate figure out what to do... - return GetWidget()->widget_delegate() && - GetWidget()->widget_delegate()->ExecuteWindowsCommand(command); -} - -void NativeWidgetWin::HandleCancelMode() { -} - -void NativeWidgetWin::HandleCaptureLost() { - delegate_->OnMouseCaptureLost(); -} - -void NativeWidgetWin::HandleClose() { - GetWidget()->Close(); -} - -bool NativeWidgetWin::HandleCommand(int command) { - return GetWidget()->widget_delegate()->ExecuteWindowsCommand(command); -} - -void NativeWidgetWin::HandleAccelerator(const ui::Accelerator& accelerator) { - GetWidget()->GetFocusManager()->ProcessAccelerator(accelerator); -} - -void NativeWidgetWin::HandleCreate() { - // TODO(beng): much of this could/should maybe move to HWNDMessageHandler. - - SetNativeWindowProperty(kNativeWidgetKey, this); - CHECK_EQ(this, GetNativeWidgetForNativeView(GetNativeView())); - - props_.push_back(ui::SetWindowSupportsRerouteMouseWheel(GetNativeView())); - - drop_target_ = new DropTargetWin( - static_cast<internal::RootView*>(GetWidget()->GetRootView())); - - // 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. - Widget* widget = GetWidget()->GetTopLevelWidget(); - if (widget && widget->ShouldUseNativeFrame()) { - tooltip_manager_.reset(new AeroTooltipManager(GetWidget())); - } else { - tooltip_manager_.reset(new TooltipManagerWin(GetWidget())); - } - if (!tooltip_manager_->Init()) { - // There was a problem creating the TooltipManager. Common error is 127. - // See 82193 for details. - LOG_GETLASTERROR(WARNING) << "tooltip creation failed, disabling tooltips"; - tooltip_manager_.reset(); - } - - delegate_->OnNativeWidgetCreated(true); -} - -void NativeWidgetWin::HandleDestroying() { - delegate_->OnNativeWidgetDestroying(); - if (drop_target_.get()) { - RevokeDragDrop(GetNativeView()); - drop_target_ = NULL; - } -} - -void NativeWidgetWin::HandleDestroyed() { - OnFinalMessage(GetNativeView()); -} - -bool NativeWidgetWin::HandleInitialFocus() { - return GetWidget()->SetInitialFocus(); -} - -void NativeWidgetWin::HandleDisplayChange() { - GetWidget()->widget_delegate()->OnDisplayChanged(); -} - -void NativeWidgetWin::HandleBeginWMSizeMove() { - delegate_->OnNativeWidgetBeginUserBoundsChange(); -} - -void NativeWidgetWin::HandleEndWMSizeMove() { - delegate_->OnNativeWidgetEndUserBoundsChange(); -} - -void NativeWidgetWin::HandleMove() { - delegate_->OnNativeWidgetMove(); -} - -void NativeWidgetWin::HandleWorkAreaChanged() { - GetWidget()->widget_delegate()->OnWorkAreaChanged(); -} - -void NativeWidgetWin::HandleVisibilityChanging(bool visible) { - delegate_->OnNativeWidgetVisibilityChanging(visible); -} - -void NativeWidgetWin::HandleVisibilityChanged(bool visible) { - delegate_->OnNativeWidgetVisibilityChanged(visible); -} - -void NativeWidgetWin::HandleClientSizeChanged(const gfx::Size& new_size) { - gfx::Size size_in_dip = gfx::win::ScreenToDIPSize(new_size); - delegate_->OnNativeWidgetSizeChanged(size_in_dip); -} - -void NativeWidgetWin::HandleFrameChanged() { - // Replace the frame and layout the contents. - GetWidget()->non_client_view()->UpdateFrame(); -} - -void NativeWidgetWin::HandleNativeFocus(HWND last_focused_window) { - delegate_->OnNativeFocus(last_focused_window); - InputMethod* input_method = GetInputMethod(); - if (input_method) - input_method->OnFocus(); -} - -void NativeWidgetWin::HandleNativeBlur(HWND focused_window) { - delegate_->OnNativeBlur(focused_window); - InputMethod* input_method = GetInputMethod(); - if (input_method) - input_method->OnBlur(); -} - -bool NativeWidgetWin::HandleMouseEvent(const ui::MouseEvent& event) { - static gfx::Transform scale_transform( - 1/gfx::win::GetDeviceScaleFactor(), 0.0, - 0.0, 1/gfx::win::GetDeviceScaleFactor(), - 0.0, 0.0); - if (event.IsMouseWheelEvent()) { - ui::MouseWheelEvent dpi_event( - static_cast<const ui::MouseWheelEvent&>(event)); - dpi_event.UpdateForRootTransform(scale_transform); - delegate_->OnMouseEvent(&dpi_event); - return dpi_event.handled(); - } else if (event.IsMouseEvent()) { - ui::MouseEvent dpi_event(event); - if (!(dpi_event.flags() & ui::EF_IS_NON_CLIENT)) - dpi_event.UpdateForRootTransform(scale_transform); - delegate_->OnMouseEvent(&dpi_event); - return dpi_event.handled(); - } - NOTREACHED(); - return false; -} - -bool NativeWidgetWin::HandleKeyEvent(const ui::KeyEvent& event) { - delegate_->OnKeyEvent(const_cast<ui::KeyEvent*>(&event)); - return event.handled(); -} - -bool NativeWidgetWin::HandleUntranslatedKeyEvent(const ui::KeyEvent& event) { - InputMethod* input_method = GetInputMethod(); - if (input_method) - input_method->DispatchKeyEvent(event); - return !!input_method; -} - -void NativeWidgetWin::HandleTouchEvent(const ui::TouchEvent& event) { - NOTREACHED() << "Touch events are not supported"; -} - -bool NativeWidgetWin::HandleIMEMessage(UINT message, - WPARAM w_param, - LPARAM l_param, - LRESULT* result) { - InputMethod* input_method = GetInputMethod(); - if (!input_method || input_method->IsMock()) { - *result = 0; - return false; - } - - MSG msg = {}; - msg.hwnd = message_handler_->hwnd(); - msg.message = message; - msg.wParam = w_param; - msg.lParam = l_param; - return input_method->OnUntranslatedIMEMessage(msg, result); -} - -void NativeWidgetWin::HandleInputLanguageChange(DWORD character_set, - HKL input_language_id) { - InputMethod* input_method = GetInputMethod(); - if (input_method && !input_method->IsMock()) { - input_method->OnInputLocaleChanged(); - } -} - -bool NativeWidgetWin::HandlePaintAccelerated(const gfx::Rect& invalid_rect) { - gfx::Rect dpi_rect = gfx::win::ScreenToDIPRect(invalid_rect); - return delegate_->OnNativeWidgetPaintAccelerated(dpi_rect); -} - -void NativeWidgetWin::HandlePaint(gfx::Canvas* canvas) { - delegate_->OnNativeWidgetPaint(canvas); -} - -bool NativeWidgetWin::HandleTooltipNotify(int w_param, - NMHDR* l_param, - LRESULT* l_result) { - // We can be sent this message before the tooltip manager is created, if a - // subclass overrides OnCreate and creates some kind of Windows control there - // that sends WM_NOTIFY messages. - if (tooltip_manager_.get()) { - bool handled; - *l_result = tooltip_manager_->OnNotify(w_param, l_param, &handled); - return handled; - } - return false; -} - -void NativeWidgetWin::HandleTooltipMouseMove(UINT message, - WPARAM w_param, - LPARAM l_param) { - if (tooltip_manager_.get()) - tooltip_manager_->OnMouse(message, w_param, l_param); -} - -bool NativeWidgetWin::PreHandleMSG(UINT message, - WPARAM w_param, - LPARAM l_param, - LRESULT* result) { - return false; -} - -void NativeWidgetWin::PostHandleMSG(UINT message, - WPARAM w_param, - LPARAM l_param) { -} - -bool NativeWidgetWin::HandleScrollEvent(const ui::ScrollEvent& event) { - delegate_->OnScrollEvent(const_cast<ui::ScrollEvent*>(&event)); - return event.handled(); -} - -//////////////////////////////////////////////////////////////////////////////// -// NativeWidgetWin, private: - -void NativeWidgetWin::SetInitParams(const Widget::InitParams& params) { - // Set non-style attributes. - ownership_ = params.ownership; - - ConfigureWindowStyles(message_handler_.get(), params, - GetWidget()->widget_delegate(), delegate_); - - has_non_client_view_ = Widget::RequiresNonClientView(params.type); - message_handler_->set_remove_standard_frame(params.remove_standard_frame); - message_handler_->set_use_system_default_icon(params.use_system_default_icon); -} - -//////////////////////////////////////////////////////////////////////////////// -// Widget, public: - -// static -void Widget::NotifyLocaleChanged() { - NOTIMPLEMENTED(); -} - -namespace { -BOOL CALLBACK WindowCallbackProc(HWND hwnd, LPARAM lParam) { - Widget* widget = Widget::GetWidgetForNativeView(hwnd); - if (widget && widget->is_secondary_widget()) - widget->Close(); - return TRUE; -} -} // namespace - -// static -void Widget::CloseAllSecondaryWidgets() { - EnumThreadWindows(GetCurrentThreadId(), WindowCallbackProc, 0); -} - -bool Widget::ConvertRect(const Widget* source, - const Widget* target, - gfx::Rect* rect) { - DCHECK(source); - DCHECK(target); - DCHECK(rect); - - HWND source_hwnd = source->GetNativeView(); - HWND target_hwnd = target->GetNativeView(); - if (source_hwnd == target_hwnd) - return true; - - RECT win_rect = gfx::win::DIPToScreenRect(*rect).ToRECT(); - if (::MapWindowPoints(source_hwnd, target_hwnd, - reinterpret_cast<LPPOINT>(&win_rect), - sizeof(RECT)/sizeof(POINT))) { - *rect = gfx::win::ScreenToDIPRect(gfx::Rect(win_rect)); - return true; - } - return false; -} - -namespace internal { - -//////////////////////////////////////////////////////////////////////////////// -// internal::NativeWidgetPrivate, public: - -// static -NativeWidgetPrivate* NativeWidgetPrivate::CreateNativeWidget( - internal::NativeWidgetDelegate* delegate) { - return new NativeWidgetWin(delegate); -} - -// static -NativeWidgetPrivate* NativeWidgetPrivate::GetNativeWidgetForNativeView( - gfx::NativeView native_view) { - return reinterpret_cast<NativeWidgetWin*>( - ViewProp::GetValue(native_view, kNativeWidgetKey)); -} - -// static -NativeWidgetPrivate* NativeWidgetPrivate::GetNativeWidgetForNativeWindow( - gfx::NativeWindow native_window) { - return GetNativeWidgetForNativeView(native_window); -} - -// static -NativeWidgetPrivate* NativeWidgetPrivate::GetTopLevelNativeWidget( - gfx::NativeView native_view) { - if (!native_view) - return NULL; - - // First, check if the top-level window is a Widget. - HWND root = ::GetAncestor(native_view, GA_ROOT); - if (!root) - return NULL; - - NativeWidgetPrivate* widget = GetNativeWidgetForNativeView(root); - if (widget) - return widget; - - // Second, try to locate the last Widget window in the parent hierarchy. - HWND parent_hwnd = native_view; - // If we fail to find the native widget pointer for the root then it probably - // means that the root belongs to a different process in which case we walk up - // the native view chain looking for a parent window which corresponds to a - // valid native widget. We only do this if we fail to find the native widget - // for the current native view which means it is being destroyed. - if (!widget && !GetNativeWidgetForNativeView(native_view)) { - parent_hwnd = ::GetAncestor(parent_hwnd, GA_PARENT); - if (!parent_hwnd) - return NULL; - } - NativeWidgetPrivate* parent_widget; - do { - parent_widget = GetNativeWidgetForNativeView(parent_hwnd); - if (parent_widget) { - widget = parent_widget; - parent_hwnd = ::GetAncestor(parent_hwnd, GA_PARENT); - } - } while (parent_hwnd != NULL && parent_widget != NULL); - - return widget; -} - -// static -void NativeWidgetPrivate::GetAllChildWidgets(gfx::NativeView native_view, - Widget::Widgets* children) { - if (!native_view) - return; - - Widget* widget = Widget::GetWidgetForNativeView(native_view); - if (widget) - children->insert(widget); - EnumChildWindows(native_view, EnumerateNativeWidgets, - reinterpret_cast<LPARAM>(children)); -} - -// static -void NativeWidgetPrivate::GetAllOwnedWidgets(gfx::NativeView native_view, - Widget::Widgets* owned) { - if (!native_view) - return; - - Widget::Widgets all; - EnumWindows(EnumerateNativeWidgets, reinterpret_cast<LPARAM>(&all)); - for (Widget::Widgets::const_iterator iter = all.begin(); - iter != all.end(); ++iter) { - if (native_view == GetWindow((*iter)->GetNativeView(), GW_OWNER)) - owned->insert(*iter); - } -} - -// static -void NativeWidgetPrivate::ReparentNativeView(gfx::NativeView native_view, - gfx::NativeView new_parent) { - if (!native_view) - return; - - HWND previous_parent = ::GetParent(native_view); - if (previous_parent == new_parent) - return; - - Widget::Widgets widgets; - GetAllChildWidgets(native_view, &widgets); - - // First notify all the widgets that they are being disassociated - // from their previous parent. - for (Widget::Widgets::iterator it = widgets.begin(); - it != widgets.end(); ++it) { - (*it)->NotifyNativeViewHierarchyWillChange(); - } - - ::SetParent(native_view, new_parent); - - // And now, notify them that they have a brand new parent. - for (Widget::Widgets::iterator it = widgets.begin(); - it != widgets.end(); ++it) { - (*it)->NotifyNativeViewHierarchyChanged(); - } -} - -// static -bool NativeWidgetPrivate::IsMouseButtonDown() { - return (GetKeyState(VK_LBUTTON) & 0x80) || - (GetKeyState(VK_RBUTTON) & 0x80) || - (GetKeyState(VK_MBUTTON) & 0x80) || - (GetKeyState(VK_XBUTTON1) & 0x80) || - (GetKeyState(VK_XBUTTON2) & 0x80); -} - -// static -bool NativeWidgetPrivate::IsTouchDown() { - // This currently isn't necessary because we're not generating touch events on - // windows. When we do, this will need to be updated. - return false; -} - -} // namespace internal - -} // namespace views |