| Index: views/controls/menu/native_menu_win.cc
|
| ===================================================================
|
| --- views/controls/menu/native_menu_win.cc (revision 71495)
|
| +++ views/controls/menu/native_menu_win.cc (working copy)
|
| @@ -8,7 +8,9 @@
|
| #include "app/l10n_util_win.h"
|
| #include "app/win/hwnd_util.h"
|
| #include "base/logging.h"
|
| +#include "base/message_loop.h"
|
| #include "base/stl_util-inl.h"
|
| +#include "base/task.h"
|
| #include "gfx/canvas_skia.h"
|
| #include "gfx/font.h"
|
| #include "third_party/skia/include/core/SkBitmap.h"
|
| @@ -52,7 +54,9 @@
|
| // structure we have constructed in NativeMenuWin.
|
| class NativeMenuWin::MenuHostWindow {
|
| public:
|
| - MenuHostWindow() {
|
| + MenuHostWindow(NativeMenuWin* parent)
|
| + : parent_(parent),
|
| + ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)) {
|
| RegisterClass();
|
| hwnd_ = CreateWindowEx(l10n_util::GetExtendedStyles(), kWindowClassName,
|
| L"", 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, NULL, NULL);
|
| @@ -84,14 +88,6 @@
|
| registered = true;
|
| }
|
|
|
| - NativeMenuWin* GetNativeMenuWinFromHMENU(HMENU hmenu) const {
|
| - MENUINFO mi = {0};
|
| - mi.cbSize = sizeof(mi);
|
| - mi.fMask = MIM_MENUDATA | MIM_STYLE;
|
| - GetMenuInfo(hmenu, &mi);
|
| - return reinterpret_cast<NativeMenuWin*>(mi.dwMenuData);
|
| - }
|
| -
|
| // Converts the WPARAM value passed to WM_MENUSELECT into an index
|
| // corresponding to the menu item that was selected.
|
| int GetMenuItemIndexFromWPARAM(HMENU menu, WPARAM w_param) const {
|
| @@ -120,20 +116,15 @@
|
|
|
| // Called when the user selects a specific item.
|
| void OnMenuCommand(int position, HMENU menu) {
|
| - NativeMenuWin* intergoat = GetNativeMenuWinFromHMENU(menu);
|
| - ui::MenuModel* model = intergoat->model_;
|
| - model->ActivatedAt(position);
|
| + parent_->model_->ActivatedAt(position);
|
| }
|
|
|
| // Called as the user moves their mouse or arrows through the contents of the
|
| // menu.
|
| void OnMenuSelect(WPARAM w_param, HMENU menu) {
|
| - if (!menu)
|
| - return; // menu is null when closing on XP.
|
| -
|
| int position = GetMenuItemIndexFromWPARAM(menu, w_param);
|
| if (position >= 0)
|
| - GetNativeMenuWinFromHMENU(menu)->model_->HighlightChangedTo(position);
|
| + parent_->model_->HighlightChangedTo(position);
|
| }
|
|
|
| // Called by Windows to measure the size of an owner-drawn menu item.
|
| @@ -243,6 +234,10 @@
|
| SetTextColor(dc, prev_text_color);
|
| }
|
|
|
| + void OnMenuClosed() {
|
| + parent_->model_->MenuClosed();
|
| + }
|
| +
|
| bool ProcessWindowMessage(HWND window,
|
| UINT message,
|
| WPARAM w_param,
|
| @@ -265,6 +260,14 @@
|
| OnDrawItem(w_param, reinterpret_cast<DRAWITEMSTRUCT*>(l_param));
|
| *l_result = 0;
|
| return true;
|
| + case WM_EXITMENULOOP:
|
| + // WM_MENUCOMMAND comes after this message, but still in the same
|
| + // callstack. So use PostTask to guarantee that we'll tell the model
|
| + // that the menus is closed after any other notifications.
|
| + MessageLoop::current()->PostTask(
|
| + FROM_HERE,
|
| + method_factory_.NewRunnableMethod(&MenuHostWindow::OnMenuClosed));
|
| + return true;
|
| // TODO(beng): bring over owner draw from old menu system.
|
| }
|
| return false;
|
| @@ -286,6 +289,8 @@
|
| }
|
|
|
| HWND hwnd_;
|
| + NativeMenuWin* parent_;
|
| + ScopedRunnableMethodFactory<MenuHostWindow> method_factory_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(MenuHostWindow);
|
| };
|
| @@ -606,7 +611,7 @@
|
| // host window per menu hierarchy, no matter how many NativeMenuWin objects
|
| // exist wrapping submenus.
|
| if (!host_window_.get())
|
| - host_window_.reset(new MenuHostWindow());
|
| + host_window_.reset(new MenuHostWindow(this));
|
| }
|
|
|
| ////////////////////////////////////////////////////////////////////////////////
|
|
|