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

Unified Diff: ash/wm/window_state.cc

Issue 99303006: Do not send the OnWindowShowTypeChanged() notification if the show type has not changed (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years 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 | « ash/wm/window_state.h ('k') | ash/wm/window_util.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ash/wm/window_state.cc
diff --git a/ash/wm/window_state.cc b/ash/wm/window_state.cc
index 284a2ee095306b04155653d14f7c772a66d7169a..4bc1484f9b81e794f389f5daa5aa4ca381247462 100644
--- a/ash/wm/window_state.cc
+++ b/ash/wm/window_state.cc
@@ -13,6 +13,7 @@
#include "ash/wm/window_state_observer.h"
#include "ash/wm/window_util.h"
#include "ash/wm/wm_types.h"
+#include "base/auto_reset.h"
#include "base/command_line.h"
#include "ui/aura/client/aura_constants.h"
#include "ui/aura/window.h"
@@ -43,6 +44,7 @@ WindowState::WindowState(aura::Window* window)
hide_shelf_when_fullscreen_(true),
animate_to_fullscreen_(true),
minimum_visibility_(false),
+ in_set_window_show_type_(false),
window_show_type_(ToWindowShowType(GetShowState())) {
window_->AddObserver(this);
@@ -179,9 +181,6 @@ void WindowState::Deactivate() {
}
void WindowState::Restore() {
- // Set |window_show_type_| to SHOW_TYPE_NORMAL now so that an observer
- // observing kShowStateKey gets the correct value when querying IsSnapped().
- window_show_type_ = SHOW_TYPE_NORMAL;
window_->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_NORMAL);
}
@@ -262,19 +261,17 @@ void WindowState::OnWindowPropertyChanged(aura::Window* window,
const void* key,
intptr_t old) {
DCHECK_EQ(window, window_);
- if (key == aura::client::kShowStateKey) {
- window_show_type_ = ToWindowShowType(GetShowState());
- ui::WindowShowState old_state = static_cast<ui::WindowShowState>(old);
- // TODO(oshima): Notify only when the state has changed.
- // Doing so break a few tests now.
- FOR_EACH_OBSERVER(
- WindowStateObserver, observer_list_,
- OnWindowShowTypeChanged(this, ToWindowShowType(old_state)));
- }
+ if (key == aura::client::kShowStateKey)
+ SetWindowShowType(ToWindowShowType(GetShowState()));
}
void WindowState::SnapWindow(WindowShowType left_or_right,
const gfx::Rect& bounds) {
+ if (window_show_type_ == left_or_right) {
+ window_->SetBounds(bounds);
+ return;
+ }
+
// Compute the bounds that the window will restore to. If the window does not
// already have restore bounds, it will be restored (when un-snapped) to the
// last bounds that it had before getting snapped.
@@ -293,11 +290,7 @@ void WindowState::SnapWindow(WindowShowType left_or_right,
Restore();
DCHECK(left_or_right == SHOW_TYPE_LEFT_SNAPPED ||
left_or_right == SHOW_TYPE_RIGHT_SNAPPED);
- WindowShowType old_type = window_show_type_;
- window_show_type_ = left_or_right;
- FOR_EACH_OBSERVER(
- WindowStateObserver, observer_list_,
- OnWindowShowTypeChanged(this, old_type));
+ SetWindowShowType(left_or_right);
// TODO(varkha): Ideally the bounds should be changed in a LayoutManager upon
// observing the WindowShowType change.
// If the window is a child of kShellWindowId_DockedContainer such as during
@@ -310,6 +303,23 @@ void WindowState::SnapWindow(WindowShowType left_or_right,
SetRestoreBoundsInScreen(restore_bounds_in_screen);
}
+void WindowState::SetWindowShowType(WindowShowType new_window_show_type) {
+ if (in_set_window_show_type_)
+ return;
+ base::AutoReset<bool> resetter(&in_set_window_show_type_, true);
+
+ ui::WindowShowState new_window_state =
+ ToWindowShowState(new_window_show_type);
+ if (new_window_state != GetShowState())
+ window_->SetProperty(aura::client::kShowStateKey, new_window_state);
+ WindowShowType old_window_show_type = window_show_type_;
+ window_show_type_ = new_window_show_type;
+ if (old_window_show_type != window_show_type_) {
+ FOR_EACH_OBSERVER(WindowStateObserver, observer_list_,
+ OnWindowShowTypeChanged(this, old_window_show_type));
+ }
+}
+
WindowState* GetActiveWindowState() {
aura::Window* active = GetActiveWindow();
return active ? GetWindowState(active) : NULL;
« no previous file with comments | « ash/wm/window_state.h ('k') | ash/wm/window_util.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698