diff options
| author | Justin Moore <DrChat@users.noreply.github.com> | 2017-08-03 21:36:22 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-08-03 21:36:22 -0500 |
| commit | d081cf5f5c834fdf6e339563a8508025a498b2ca (patch) | |
| tree | d3e8662fc4818bed1b13498a1276878439160e9c | |
| parent | b3b7acb7ca84f2035c6d01dd82e3bf5a8ebda97b (diff) | |
| parent | aae82430f21c810b5817d0aa25c1860357de0819 (diff) | |
Merge pull request #743 from parkerlamb/startup_race
Prevent race condition during emulator startup (issue #702)
| -rw-r--r-- | src/xenia/app/emulator_window.cc | 2 | ||||
| -rw-r--r-- | src/xenia/app/xenia_main.cc | 3 | ||||
| -rw-r--r-- | src/xenia/emulator.cc | 2 | ||||
| -rw-r--r-- | src/xenia/ui/menu_item.h | 5 | ||||
| -rw-r--r-- | src/xenia/ui/window.h | 3 | ||||
| -rw-r--r-- | src/xenia/ui/window_win.cc | 28 | ||||
| -rw-r--r-- | src/xenia/ui/window_win.h | 6 |
7 files changed, 48 insertions, 1 deletions
diff --git a/src/xenia/app/emulator_window.cc b/src/xenia/app/emulator_window.cc index ca50864b1..634c65803 100644 --- a/src/xenia/app/emulator_window.cc +++ b/src/xenia/app/emulator_window.cc @@ -266,6 +266,8 @@ bool EmulatorWindow::Initialize() { window_->Resize(1280, 720); + window_->DisableMainMenu(); + return true; } diff --git a/src/xenia/app/xenia_main.cc b/src/xenia/app/xenia_main.cc index 03664f4a9..b2cf33c9b 100644 --- a/src/xenia/app/xenia_main.cc +++ b/src/xenia/app/xenia_main.cc @@ -178,6 +178,9 @@ int xenia_main(const std::vector<std::wstring>& args) { evt->Set(); }); + // Enable the main menu now that the emulator is properly loaded + emulator_window->window()->EnableMainMenu(); + // Grab path from the flag or unnamed argument. std::wstring path; if (!FLAGS_target.empty() || args.size() >= 2) { diff --git a/src/xenia/emulator.cc b/src/xenia/emulator.cc index d90530cdb..a7d6d9281 100644 --- a/src/xenia/emulator.cc +++ b/src/xenia/emulator.cc @@ -641,8 +641,8 @@ X_STATUS Emulator::CompleteLaunch(const std::wstring& path, return X_STATUS_UNSUCCESSFUL; } - on_launch(); main_thread_ = main_xthread->thread(); + on_launch(); return X_STATUS_SUCCESS; } diff --git a/src/xenia/ui/menu_item.h b/src/xenia/ui/menu_item.h index e1364d6b6..4cdc5cca2 100644 --- a/src/xenia/ui/menu_item.h +++ b/src/xenia/ui/menu_item.h @@ -19,6 +19,8 @@ namespace xe { namespace ui { +class Window; + class MenuItem { public: typedef std::unique_ptr<MenuItem, void (*)(MenuItem*)> MenuItemPtr; @@ -51,6 +53,9 @@ class MenuItem { void RemoveChild(MenuItem* child_item); MenuItem* child(size_t index); + virtual void EnableMenuItem(Window& window) = 0; + virtual void DisableMenuItem(Window& window) = 0; + protected: MenuItem(Type type, const std::wstring& text, const std::wstring& hotkey, std::function<void()> callback); diff --git a/src/xenia/ui/window.h b/src/xenia/ui/window.h index 1fd53fe10..a9021538d 100644 --- a/src/xenia/ui/window.h +++ b/src/xenia/ui/window.h @@ -44,6 +44,9 @@ class Window { OnMainMenuChange(); } + virtual void EnableMainMenu() = 0; + virtual void DisableMainMenu() = 0; + const std::wstring& title() const { return title_; } virtual bool set_title(const std::wstring& title) { if (title == title_) { diff --git a/src/xenia/ui/window_win.cc b/src/xenia/ui/window_win.cc index 1863dbb6e..65745145e 100644 --- a/src/xenia/ui/window_win.cc +++ b/src/xenia/ui/window_win.cc @@ -174,6 +174,18 @@ void Win32Window::OnClose() { super::OnClose(); } +void Win32Window::EnableMainMenu() { + if (main_menu_) { + main_menu_->EnableMenuItem(*this); + } +} + +void Win32Window::DisableMainMenu() { + if (main_menu_) { + main_menu_->DisableMenuItem(*this); + } +} + bool Win32Window::set_title(const std::wstring& title) { if (!super::set_title(title)) { return false; @@ -698,6 +710,22 @@ Win32MenuItem::~Win32MenuItem() { } } +void Win32MenuItem::EnableMenuItem(Window& window) { + int i = 0; + for (auto iter = children_.begin(); iter != children_.end(); ++iter, i++) { + ::EnableMenuItem(handle_, i, MF_BYPOSITION | MF_ENABLED); + } + DrawMenuBar((HWND)window.native_handle()); +} + +void Win32MenuItem::DisableMenuItem(Window& window) { + int i = 0; + for (auto iter = children_.begin(); iter != children_.end(); ++iter, i++) { + ::EnableMenuItem(handle_, i, MF_BYPOSITION | MF_GRAYED); + } + DrawMenuBar((HWND)window.native_handle()); +} + void Win32MenuItem::OnChildAdded(MenuItem* generic_child_item) { auto child_item = static_cast<Win32MenuItem*>(generic_child_item); diff --git a/src/xenia/ui/window_win.h b/src/xenia/ui/window_win.h index fcef2a764..1c6373124 100644 --- a/src/xenia/ui/window_win.h +++ b/src/xenia/ui/window_win.h @@ -30,6 +30,9 @@ class Win32Window : public Window { NativeWindowHandle native_handle() const override { return hwnd_; } HWND hwnd() const { return hwnd_; } + void EnableMainMenu() override; + void DisableMainMenu() override; + bool set_title(const std::wstring& title) override; bool SetIcon(const void* buffer, size_t size) override; @@ -92,6 +95,9 @@ class Win32MenuItem : public MenuItem { HMENU handle() { return handle_; } + void EnableMenuItem(Window& window) override; + void DisableMenuItem(Window& window) override; + using MenuItem::OnSelected; protected: |
