| Index: views/widget/widget_win.cc
|
| ===================================================================
|
| --- views/widget/widget_win.cc (revision 22547)
|
| +++ views/widget/widget_win.cc (working copy)
|
| @@ -22,11 +22,6 @@
|
|
|
| namespace views {
|
|
|
| -static const DWORD kWindowDefaultChildStyle =
|
| - WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
|
| -static const DWORD kWindowDefaultStyle = WS_OVERLAPPEDWINDOW;
|
| -static const DWORD kWindowDefaultExStyle = 0;
|
| -
|
| // Property used to link the HWND to its RootView.
|
| static const wchar_t* const kRootViewWindowProperty = L"__ROOT_VIEW__";
|
|
|
| @@ -44,110 +39,19 @@
|
| }
|
|
|
| ///////////////////////////////////////////////////////////////////////////////
|
| -// Window class tracking.
|
| -
|
| -// static
|
| -const wchar_t* const WidgetWin::kBaseClassName =
|
| - L"Chrome_WidgetWin_";
|
| -
|
| -// Window class information used for registering unique windows.
|
| -struct ClassInfo {
|
| - UINT style;
|
| - HBRUSH background;
|
| -
|
| - explicit ClassInfo(int style)
|
| - : style(style),
|
| - background(NULL) {}
|
| -
|
| - // Compares two ClassInfos. Returns true if all members match.
|
| - bool Equals(const ClassInfo& other) const {
|
| - return (other.style == style && other.background == background);
|
| - }
|
| -};
|
| -
|
| -class ClassRegistrar {
|
| - public:
|
| - ~ClassRegistrar() {
|
| - for (RegisteredClasses::iterator i = registered_classes_.begin();
|
| - i != registered_classes_.end(); ++i) {
|
| - UnregisterClass(i->name.c_str(), NULL);
|
| - }
|
| - }
|
| -
|
| - // Puts the name for the class matching |class_info| in |class_name|, creating
|
| - // a new name if the class is not yet known.
|
| - // Returns true if this class was already known, false otherwise.
|
| - bool RetrieveClassName(const ClassInfo& class_info, std::wstring* name) {
|
| - for (RegisteredClasses::const_iterator i = registered_classes_.begin();
|
| - i != registered_classes_.end(); ++i) {
|
| - if (class_info.Equals(i->info)) {
|
| - name->assign(i->name);
|
| - return true;
|
| - }
|
| - }
|
| -
|
| - name->assign(std::wstring(WidgetWin::kBaseClassName) +
|
| - IntToWString(registered_count_++));
|
| - return false;
|
| - }
|
| -
|
| - void RegisterClass(const ClassInfo& class_info,
|
| - const std::wstring& name,
|
| - ATOM atom) {
|
| - registered_classes_.push_back(RegisteredClass(class_info, name, atom));
|
| - }
|
| -
|
| - private:
|
| - // Represents a registered window class.
|
| - struct RegisteredClass {
|
| - RegisteredClass(const ClassInfo& info,
|
| - const std::wstring& name,
|
| - ATOM atom)
|
| - : info(info),
|
| - name(name),
|
| - atom(atom) {
|
| - }
|
| -
|
| - // Info used to create the class.
|
| - ClassInfo info;
|
| -
|
| - // The name given to the window.
|
| - std::wstring name;
|
| -
|
| - // The ATOM returned from creating the window.
|
| - ATOM atom;
|
| - };
|
| -
|
| - ClassRegistrar() : registered_count_(0) { }
|
| - friend struct DefaultSingletonTraits<ClassRegistrar>;
|
| -
|
| - typedef std::list<RegisteredClass> RegisteredClasses;
|
| - RegisteredClasses registered_classes_;
|
| -
|
| - // Counter of how many classes have ben registered so far.
|
| - int registered_count_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(ClassRegistrar);
|
| -};
|
| -
|
| -///////////////////////////////////////////////////////////////////////////////
|
| // WidgetWin, public
|
|
|
| WidgetWin::WidgetWin()
|
| : close_widget_factory_(this),
|
| active_mouse_tracking_flags_(0),
|
| has_capture_(false),
|
| - window_style_(0),
|
| - window_ex_style_(kWindowDefaultExStyle),
|
| use_layered_buffer_(true),
|
| layered_alpha_(255),
|
| delete_on_destroy_(true),
|
| can_update_layered_window_(true),
|
| last_mouse_event_was_move_(false),
|
| is_mouse_down_(false),
|
| - is_window_(false),
|
| - class_style_(CS_DBLCLKS),
|
| - hwnd_(NULL) {
|
| + is_window_(false) {
|
| }
|
|
|
| WidgetWin::~WidgetWin() {
|
| @@ -158,44 +62,31 @@
|
| // Widget implementation:
|
|
|
| void WidgetWin::Init(gfx::NativeView parent, const gfx::Rect& bounds) {
|
| - if (window_style_ == 0)
|
| - window_style_ = parent ? kWindowDefaultChildStyle : kWindowDefaultStyle;
|
| + // Force creation of the RootView; otherwise, we may get a WM_SIZE after the
|
| + // window is created and before the root view is set up.
|
| + GetRootView();
|
|
|
| + // Create the window.
|
| + WindowImpl::Init(parent, bounds);
|
| +
|
| // See if the style has been overridden.
|
| - opaque_ = !(window_ex_style_ & WS_EX_TRANSPARENT);
|
| + opaque_ = !(window_ex_style() & WS_EX_TRANSPARENT);
|
| use_layered_buffer_ = (use_layered_buffer_ &&
|
| - !!(window_ex_style_ & WS_EX_LAYERED));
|
| + !!(window_ex_style() & WS_EX_LAYERED));
|
|
|
| - // Force creation of the RootView if it hasn't been created yet.
|
| - GetRootView();
|
| -
|
| default_theme_provider_.reset(new DefaultThemeProvider());
|
|
|
| - // Ensures the parent we have been passed is valid, otherwise CreateWindowEx
|
| - // will fail.
|
| - if (parent && !::IsWindow(parent)) {
|
| - NOTREACHED() << "invalid parent window specified.";
|
| - parent = NULL;
|
| - }
|
| + SetWindowSupportsRerouteMouseWheel(GetNativeView());
|
|
|
| - hwnd_ = CreateWindowEx(window_ex_style_, GetWindowClassName().c_str(), L"",
|
| - window_style_, bounds.x(), bounds.y(), bounds.width(),
|
| - bounds.height(), parent, NULL, NULL, this);
|
| - DCHECK(hwnd_);
|
| - SetWindowSupportsRerouteMouseWheel(hwnd_);
|
| -
|
| - // The window procedure should have set the data for us.
|
| - DCHECK(win_util::GetWindowUserData(hwnd_) == this);
|
| -
|
| root_view_->OnWidgetCreated();
|
|
|
| - if ((window_style_ & WS_CHILD) == 0) {
|
| + if ((window_style() & WS_CHILD) == 0) {
|
| // Top-level widgets get a FocusManager.
|
| focus_manager_.reset(new FocusManager(this));
|
| }
|
|
|
| // Sets the RootView as a property, so the automation can introspect windows.
|
| - SetRootViewForHWND(hwnd_, root_view_.get());
|
| + SetRootViewForHWND(GetNativeView(), root_view_.get());
|
|
|
| MessageLoopForUI::current()->AddObserver(this);
|
|
|
| @@ -234,7 +125,7 @@
|
|
|
| GetClientRect(&crect);
|
| POINT p = {0, 0};
|
| - ::ClientToScreen(hwnd_, &p);
|
| + ::ClientToScreen(GetNativeView(), &p);
|
| out->SetRect(crect.left + p.x, crect.top + p.y,
|
| crect.Width(), crect.Height());
|
| }
|
| @@ -293,7 +184,7 @@
|
| }
|
|
|
| gfx::NativeView WidgetWin::GetNativeView() const {
|
| - return hwnd_;
|
| + return WindowImpl::GetNativeView();
|
| }
|
|
|
| static BOOL CALLBACK EnumChildProcForRedraw(HWND hwnd, LPARAM lparam) {
|
| @@ -320,7 +211,7 @@
|
| // We're transparent. Need to force painting to occur from our parent.
|
| CRect parent_update_rect = update_rect.ToRECT();
|
| POINT location_in_parent = { 0, 0 };
|
| - ClientToScreen(hwnd_, &location_in_parent);
|
| + ClientToScreen(GetNativeView(), &location_in_parent);
|
| ::ScreenToClient(GetParent(), &location_in_parent);
|
| parent_update_rect.OffsetRect(location_in_parent);
|
| ::RedrawWindow(GetParent(), parent_update_rect, NULL,
|
| @@ -338,11 +229,11 @@
|
| gfx::Rect invalid_screen_rect = update_rect;
|
| invalid_screen_rect.Offset(screen_rect.x(), screen_rect.y());
|
|
|
| - ::RedrawWindow(hwnd_, &update_rect.ToRECT(), NULL,
|
| + ::RedrawWindow(GetNativeView(), &update_rect.ToRECT(), NULL,
|
| RDW_INVALIDATE | RDW_UPDATENOW | RDW_NOCHILDREN);
|
|
|
| LPARAM lparam = reinterpret_cast<LPARAM>(&invalid_screen_rect);
|
| - EnumChildWindows(hwnd_, EnumChildProcForRedraw, lparam);
|
| + EnumChildWindows(GetNativeView(), EnumChildProcForRedraw, lparam);
|
| }
|
| // As we were created with a style of WS_CLIPCHILDREN redraw requests may
|
| // result in an empty paint rect in WM_PAINT (this'll happen if a
|
| @@ -369,7 +260,7 @@
|
|
|
| Widget* WidgetWin::GetRootWidget() const {
|
| return reinterpret_cast<WidgetWin*>(
|
| - win_util::GetWindowUserData(GetAncestor(hwnd_, GA_ROOT)));
|
| + win_util::GetWindowUserData(GetAncestor(GetNativeView(), GA_ROOT)));
|
| }
|
|
|
| bool WidgetWin::IsVisible() const {
|
| @@ -409,11 +300,11 @@
|
| }
|
|
|
| Window* WidgetWin::GetWindow() {
|
| - return GetWindowImpl(hwnd_);
|
| + return GetWindowImpl(GetNativeView());
|
| }
|
|
|
| const Window* WidgetWin::GetWindow() const {
|
| - return GetWindowImpl(hwnd_);
|
| + return GetWindowImpl(GetNativeView());
|
| }
|
|
|
| FocusManager* WidgetWin::GetFocusManager() {
|
| @@ -434,7 +325,7 @@
|
| return;
|
|
|
| use_layered_buffer_ = use_layered_buffer;
|
| - if (!hwnd_)
|
| + if (!GetNativeView())
|
| return;
|
|
|
| if (use_layered_buffer_) {
|
| @@ -543,7 +434,7 @@
|
| void WidgetWin::OnDestroy() {
|
| root_view_->OnWidgetDestroyed();
|
|
|
| - RemoveProp(hwnd_, kRootViewWindowProperty);
|
| + RemoveProp(GetNativeView(), kRootViewWindowProperty);
|
| }
|
|
|
| LRESULT WidgetWin::OnEraseBkgnd(HDC dc) {
|
| @@ -647,7 +538,7 @@
|
| // Reroute the mouse-wheel to the window under the mouse pointer if
|
| // applicable.
|
| if (message == WM_MOUSEWHEEL &&
|
| - views::RerouteMouseWheel(hwnd_, w_param, l_param)) {
|
| + views::RerouteMouseWheel(GetNativeView(), w_param, l_param)) {
|
| return 0;
|
| }
|
|
|
| @@ -948,41 +839,11 @@
|
|
|
| BLENDFUNCTION blend = {AC_SRC_OVER, 0, layered_alpha_, AC_SRC_ALPHA};
|
| ::UpdateLayeredWindow(
|
| - hwnd_, NULL, &window_position, &size, dib_dc, &zero_origin,
|
| + GetNativeView(), NULL, &window_position, &size, dib_dc, &zero_origin,
|
| RGB(0xFF, 0xFF, 0xFF), &blend, ULW_ALPHA);
|
| }
|
| }
|
|
|
| -std::wstring WidgetWin::GetWindowClassName() {
|
| - ClassInfo class_info(initial_class_style());
|
| - std::wstring name;
|
| - if (Singleton<ClassRegistrar>()->RetrieveClassName(class_info, &name))
|
| - return name;
|
| -
|
| - // No class found, need to register one.
|
| - WNDCLASSEX class_ex;
|
| - class_ex.cbSize = sizeof(WNDCLASSEX);
|
| - class_ex.style = class_info.style;
|
| - class_ex.lpfnWndProc = &WidgetWin::WndProc;
|
| - class_ex.cbClsExtra = 0;
|
| - class_ex.cbWndExtra = 0;
|
| - class_ex.hInstance = NULL;
|
| - class_ex.hIcon = NULL;
|
| - if (ViewsDelegate::views_delegate)
|
| - class_ex.hIcon = ViewsDelegate::views_delegate->GetDefaultWindowIcon();
|
| - class_ex.hCursor = LoadCursor(NULL, IDC_ARROW);
|
| - class_ex.hbrBackground = reinterpret_cast<HBRUSH>(class_info.background + 1);
|
| - class_ex.lpszMenuName = NULL;
|
| - class_ex.lpszClassName = name.c_str();
|
| - class_ex.hIconSm = class_ex.hIcon;
|
| - ATOM atom = RegisterClassEx(&class_ex);
|
| - DCHECK(atom);
|
| -
|
| - Singleton<ClassRegistrar>()->RegisterClass(class_info, name, atom);
|
| -
|
| - return name;
|
| -}
|
| -
|
| // Get the source HWND of the specified message. Depending on the message, the
|
| // source HWND is encoded in either the WPARAM or the LPARAM value.
|
| HWND GetControlHWNDForMessage(UINT message, WPARAM w_param, LPARAM l_param) {
|
| @@ -1002,6 +863,12 @@
|
| return NULL;
|
| }
|
|
|
| +HICON WidgetWin::GetDefaultWindowIcon() const {
|
| + if (ViewsDelegate::views_delegate)
|
| + return ViewsDelegate::views_delegate->GetDefaultWindowIcon();
|
| + return NULL;
|
| +}
|
| +
|
| // Some messages may be sent to us by a child HWND managed by
|
| // NativeControlWin. If this is the case, this function will forward those
|
| // messages on to the object associated with the source HWND and return true,
|
| @@ -1026,23 +893,8 @@
|
| return false;
|
| }
|
|
|
| -// static
|
| -LRESULT CALLBACK WidgetWin::WndProc(HWND window, UINT message,
|
| - WPARAM w_param, LPARAM l_param) {
|
| - if (message == WM_NCCREATE) {
|
| - CREATESTRUCT* cs = reinterpret_cast<CREATESTRUCT*>(l_param);
|
| - WidgetWin* widget = reinterpret_cast<WidgetWin*>(cs->lpCreateParams);
|
| - DCHECK(widget);
|
| - win_util::SetWindowUserData(window, widget);
|
| - widget->hwnd_ = window;
|
| - return TRUE;
|
| - }
|
| -
|
| - WidgetWin* widget = reinterpret_cast<WidgetWin*>(
|
| - win_util::GetWindowUserData(window));
|
| - if (!widget)
|
| - return 0;
|
| -
|
| +LRESULT WidgetWin::OnWndProc(UINT message, WPARAM w_param, LPARAM l_param) {
|
| + HWND window = GetNativeView();
|
| LRESULT result = 0;
|
|
|
| // First allow messages sent by child controls to be processed directly by
|
| @@ -1052,12 +904,12 @@
|
| return result;
|
|
|
| // Otherwise we handle everything else.
|
| - if (!widget->ProcessWindowMessage(window, message, w_param, l_param, result))
|
| + if (!ProcessWindowMessage(window, message, w_param, l_param, result))
|
| result = DefWindowProc(window, message, w_param, l_param);
|
| if (message == WM_NCDESTROY)
|
| - widget->OnFinalMessage(window);
|
| + OnFinalMessage(window);
|
| if (message == WM_ACTIVATE)
|
| - PostProcessActivateMessage(widget, LOWORD(w_param));
|
| + PostProcessActivateMessage(this, LOWORD(w_param));
|
| return result;
|
| }
|
|
|
| @@ -1092,4 +944,3 @@
|
| }
|
|
|
| } // namespace views
|
| -
|
|
|